about summary refs log tree commit diff stats
path: root/apps/ex15.mu
blob: 51bfc1dbddaef64f24b02d2ba2e4a28479f2423a (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
# Demo of combining-character support in Mu, which can be summarized as, "the
# old typewriter-based approach of backing up one character and adding the
# accent or _matra_ in."
#   https://en.wikipedia.org/wiki/Combining_character
#
# Mu uses this approach for both accents in Latin languages and vowel
# diacritics in Abugida scripts.
#   https://en.wikipedia.org/wiki/Diacritic
#   https://en.wikipedia.org/wiki/Abugida
#
# Steps for trying it out:
#   1. Translate this example into a disk image code.img.
#       ./translate apps/ex15.mu
#   2. Run:
#       qemu-system-i386 -hda code.img -hdb data.img
#
# Expected output, showing off what this approach can and cannot do:
#   'à' in green in a few places near the top-left corner of screen, with
#   other letters nearby showing cases where characters blend to the eye.
#
#   A few Devanagari letter combinations. Devanagari works well except for
#   characters blending together.
#
#   A few Tamil letter combinations. Tamil often doesn't look right, and
#   requires ligatures for many letter combinations.
#
#   Others? (Patches welcome.) I suspect Tibetan in particular will not work
#   well with this approach. But I need native readers to assess quality.

fn main screen: (addr screen), keyboard: (addr keyboard), data-disk: (addr disk) {
  # at the top of screen, the accent is almost cropped
  var dummy/eax: int <-    draw-code-point-on-real-screen   0x61/a,                       0/x 0/y, 3/fg 0/bg
  var dummy/eax: int <- overlay-code-point-on-real-screen 0x0300/combining-grave-accent,  0/x 0/y, 3/fg 0/bg

  # below a grapheme with a descender, the accent uglily overlaps
  #   https://en.wikipedia.org/wiki/Descender
  var dummy/eax: int <-    draw-code-point-on-real-screen   0x67/g,                       4/x 3/y, 3/fg 0/bg
  var dummy/eax: int <-    draw-code-point-on-real-screen   0x61/a,                       4/x 4/y, 3/fg 0/bg
  var dummy/eax: int <- overlay-code-point-on-real-screen 0x0300/combining-grave-accent,  4/x 4/y, 3/fg 0/bg

  # beside a grapheme with a descender, it becomes more obvious that monowidth fonts can't make baselines line up
  #   https://en.wikipedia.org/wiki/Baseline_(typography)
  var dummy/eax: int <-    draw-code-point-on-real-screen   0x67/g,                       8/x 3/y, 3/fg 0/bg
  var dummy/eax: int <-    draw-code-point-on-real-screen   0x61/a,                       9/x 3/y, 3/fg 0/bg
  var dummy/eax: int <- overlay-code-point-on-real-screen 0x0300/combining-grave-accent,  9/x 3/y, 3/fg 0/bg

  # a single devanagari letter combined with different vowel _matras_
  # ka
  var dummy/eax: int <- draw-code-point-on-real-screen 0x0915/devanagari-letter-ka, 4/x 8/y, 3/fg 0/bg
  # kaa
  var dummy/eax: int <- draw-code-point-on-real-screen 0x0915/devanagari-letter-ka, 7/x 8/y, 3/fg 0/bg
  var dummy/eax: int <- overlay-code-point-on-real-screen 0x093e/devanagari-vowel-aa, 7/x 8/y, 3/fg 0/bg
  # ki
  var dummy/eax: int <- draw-code-point-on-real-screen 0x0915/devanagari-letter-ka, 0xa/x 8/y, 3/fg 0/bg
  var dummy/eax: int <- overlay-code-point-on-real-screen 0x093f/devanagari-vowel-i, 0xa/x 8/y, 3/fg 0/bg
  # kee
  var dummy/eax: int <- draw-code-point-on-real-screen 0x0915/devanagari-letter-ka, 0xd/x 8/y, 3/fg 0/bg
  var dummy/eax: int <- overlay-code-point-on-real-screen 0x0940/devanagari-vowel-ii, 0xd/x 8/y, 3/fg 0/bg
  # ku
  var dummy/eax: int <- draw-code-point-on-real-screen 0x0915/devanagari-letter-ka, 0x10/x 8/y, 3/fg 0/bg
  var dummy/eax: int <- overlay-code-point-on-real-screen 0x0941/devanagari-vowel-u, 0x10/x 8/y, 3/fg 0/bg
  # koo
  var dummy/eax: int <- draw-code-point-on-real-screen 0x0915/devanagari-letter-ka, 0x13/x 8/y, 3/fg 0/bg
  var dummy/eax: int <- overlay-code-point-on-real-screen 0x0942/devanagari-vowel-oo, 0x13/x 8/y, 3/fg 0/bg
  # kay
  var dummy/eax: int <- draw-code-point-on-real-screen 0x0915/devanagari-letter-ka, 4/x 9/y, 3/fg 0/bg
  var dummy/eax: int <- overlay-code-point-on-real-screen 0x0947/devanagari-vowel-E, 4/x 9/y, 3/fg 0/bg
  # kai
  var dummy/eax: int <- draw-code-point-on-real-screen 0x0915/devanagari-letter-ka, 7/x 9/y, 3/fg 0/bg
  var dummy/eax: int <- overlay-code-point-on-real-screen 0x0948/devanagari-vowel-ai, 7/x 9/y, 3/fg 0/bg
  # ko
  var dummy/eax: int <- draw-code-point-on-real-screen 0x0915/devanagari-letter-ka, 0xa/x 9/y, 3/fg 0/bg
  var dummy/eax: int <- overlay-code-point-on-real-screen 0x094b/devanagari-vowel-o, 0xa/x 9/y, 3/fg 0/bg
  # kow
  var dummy/eax: int <- draw-code-point-on-real-screen 0x0915/devanagari-letter-ka, 0xd/x 9/y, 3/fg 0/bg
  var dummy/eax: int <- overlay-code-point-on-real-screen 0x094f/devanagari-vowel-aw, 0xd/x 9/y, 3/fg 0/bg
  # kan
  # bump this letter down to show the letter without overlap; we've already established above that overlap is an issue
  var dummy/eax: int <- draw-code-point-on-real-screen 0x0915/devanagari-letter-ka, 0x10/x 0xa/y, 3/fg 0/bg
  var dummy/eax: int <- overlay-code-point-on-real-screen 0x0902/devanagari-anusvara, 0x10/x 0xa/y, 3/fg 0/bg
  # kaha
  var dummy/eax: int <- draw-code-point-on-real-screen 0x0915/devanagari-letter-ka, 0x13/x 9/y, 3/fg 0/bg
  var dummy/eax: int <- overlay-code-point-on-real-screen 0x0903/devanagari-visarga, 0x13/x 9/y, 3/fg 0/bg

  # render the same devanagari letters as a single stream of utf-8 graphemes rather than individual code-points.
  var text-storage: (stream byte 0x200)
  var text/esi: (addr stream byte) <- address text-storage
  var g/eax: grapheme <- to-grapheme 0x0915/devanagari-letter-ka
  var ka/ecx: grapheme <- copy g
  # ka
  write-grapheme text, ka
  # kaa
  write-grapheme text, ka
  g <- to-grapheme 0x093e/devanagari-vowel-aa
  write-grapheme text, g
  # ki
  write-grapheme text, ka
  g <- to-grapheme 0x093f/devanagari-vowel-i
  write-grapheme text, g
  # kee
  write-grapheme text, ka
  g <- to-grapheme 0x0940/devanagari-vowel-ii
  write-grapheme text, g
  # ku
  write-grapheme text, ka
  g <- to-grapheme 0x0941/devanagari-vowel-u
  write-grapheme text, g
  # koo
  write-grapheme text, ka
  g <- to-grapheme 0x0942/devanagari-vowel-oo
  write-grapheme text, g
  # kay
  write-grapheme text, ka
  g <- to-grapheme 0x0947/devanagari-vowel-E
  write-grapheme text, g
  # kai
  write-grapheme text, ka
  g <- to-grapheme 0x0948/devanagari-vowel-ai
  write-grapheme text, g
  # ko
  write-grapheme text, ka
  g <- to-grapheme 0x094b/devanagari-vowel-o
  write-grapheme text, g
  # kow
  write-grapheme text, ka
  g <- to-grapheme 0x094f/devanagari-vowel-aw
  write-grapheme text, g
  # kan
  write-grapheme text, ka
  g <- to-grapheme 0x0902/devanagari-anusvara
  write-grapheme text, g
  # kaha
  write-grapheme text, ka
  g <- to-grapheme 0x0903/devanagari-visarga
  write-grapheme text, g
  # render everything
  set-cursor-position screen, 4/x 0xe/y
  draw-stream-wrapping-right-then-down-from-cursor-over-full-screen screen, text, 3/fg 0/bg

  # a stream of tamil graphemes (with interspersed spaces for clarity) that don't look the same in Mu
  set-cursor-position 0, 4/x 0x12/y
  draw-text-wrapping-right-then-down-from-cursor-over-full-screen 0, "எ ஃ கு ", 3/fg 0/bg
  set-cursor-position 0, 4/x 0x13/y
  draw-text-wrapping-right-then-down-from-cursor-over-full-screen 0, "அ ன் று ", 3/fg 0/bg
  set-cursor-position 0, 4/x 0x14/y
  draw-text-wrapping-right-then-down-from-cursor-over-full-screen 0, "அ தா வ து " , 3/fg 0/bg
  set-cursor-position 0, 4/x 0x15/y
  draw-text-wrapping-right-then-down-from-cursor-over-full-screen 0, "அ ஃ தா ன் று ", 3/fg 0/bg
}