about summary refs log tree commit diff stats
diff options
context:
space:
mode:
authorKartik K. Agaram <vc@akkartik.com>2021-08-28 20:56:15 -0700
committerKartik K. Agaram <vc@akkartik.com>2021-08-28 21:11:45 -0700
commit79e2569f1a842370edb29de070da63d0d217396d (patch)
tree6b095502d692d72deeace4426fea113fa5a39ab5
parent2c87cd2f34ece94aae936e563bdbf360deef4e9b (diff)
downloadmu-79e2569f1a842370edb29de070da63d0d217396d.tar.gz
font data structure now supports 16-bit glyphs
We can't yet render the latter 8 bits.
-rw-r--r--103grapheme.subx7
-rw-r--r--font.subx392
-rw-r--r--vocabulary.md5
3 files changed, 266 insertions, 138 deletions
diff --git a/103grapheme.subx b/103grapheme.subx
index c5615430..fa3b17d4 100644
--- a/103grapheme.subx
+++ b/103grapheme.subx
@@ -2,10 +2,6 @@
 #
 # We need to do this in machine code because Mu doesn't have global variables
 # yet (for the start of the font).
-#
-# There are uncomfortable assumptions baked in here about english/latin
-# script. We convert the grid of pixels into a fixed-width grid of graphemes,
-# which may not work well with other language families.
 
 == code
 
@@ -90,8 +86,9 @@ draw-grapheme-on-screen-buffer:  # buffer: (addr byte), g: grapheme, x: int, y:
     81 7/subop/compare %esi 0x80/imm32
     0f 8d/jump-if->= $draw-grapheme-on-screen-buffer:end/disp32
     # var letter-bitmap/esi = font[g]
-    c1 4/subop/shift-left %esi 4/imm8
+    69/multiply %esi 0x21/imm32/glyph-size 6/r32/esi
     81 0/subop/add %esi Font/imm32
+    46/increment-esi  # skip size
     # var ycurr/edx: int = y*16
     8b/-> *(ebp+0x14) 2/r32/edx
     c1 4/subop/shift-left %edx 4/imm8
diff --git a/font.subx b/font.subx
index d853a41e..1440e0ab 100644
--- a/font.subx
+++ b/font.subx
@@ -5,234 +5,366 @@
 # See https://en.wikipedia.org/wiki/GNU_Unifont#The_.hex_font_format
 # Website: http://unifoundry.com/unifont/index.html
 # License: http://unifoundry.com/LICENSE.txt (GPL v2)
-# Each line below is a bitmap for a single character.
-#   Each byte within a line is a bitmap for a single row of 8 pixels.
+# Each glyph consists of a 1-byte size followed by a 16-byte bitmap.
+# The size can currently be only 8 or 16 (10).
+# * If it's 8, the glyph is 8 pixels wide, each row consists of one byte, and
+#   the last 8 bytes of the bitmap are ignored.
+# * If it's 16, the glyph is 16 pixels wide, and each row consists of two
+#   bytes.
 
 == data
 
 Font:
 # some unprintable ASCII chars
-  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
-  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
-  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
-  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
-  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
-  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
-  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
-  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
-  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
-  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
-  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
-  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
-  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
-  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
-  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
-  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
-  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
-  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
-  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
-  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
-  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
-  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
-  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
-  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
-  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
-  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
-  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
-  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
-  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
-  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
-  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
-  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+  08/size  # nul character hard-coded to 8 bits wide
+  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00  # nul character hard-coded to blank
+  10/size
+  aa aa 00 01 80 00 00 01 80 00 39 93 c2 52 32 5f 8a 52 71 93 80 00 00 01 80 00 00 01 80 00 55 55
+  10/size
+  aa aa 00 01 80 00 00 01 80 00 3b a5 c1 24 31 19 89 24 71 25 80 00 00 01 80 00 00 01 80 00 55 55
+  10/size
+  aa aa 00 01 80 00 00 01 80 00 7b a5 c1 24 79 19 c1 24 79 25 80 00 00 01 80 00 00 01 80 00 55 55
+  10/size
+  aa aa 00 01 80 00 00 01 80 00 79 bf c2 48 7a 49 c2 48 79 89 80 00 00 01 80 00 00 01 80 00 55 55
+  10/size
+  aa aa 00 01 80 00 00 01 80 00 7a 4d c2 52 7b 53 c2 d6 7a 4f 80 00 00 01 80 00 00 01 80 00 55 55
+  10/size
+  aa aa 00 01 80 00 00 01 80 00 31 a5 ca 28 7a 31 ca 28 49 a5 80 00 00 01 80 00 00 01 80 00 55 55
+  10/size
+  aa aa 00 01 80 00 00 01 80 00 73 d1 ca 10 73 d1 ca 10 73 df 80 00 00 01 80 00 00 01 80 00 55 55
+  10/size
+  aa aa 00 01 80 00 00 01 80 00 1e 39 91 40 1e 31 91 08 1e 71 80 00 00 01 80 00 00 01 80 00 55 55
+  10/size
+  aa aa 00 01 80 00 00 01 80 00 22 f9 a2 20 3e 21 a2 20 22 21 80 00 00 01 80 00 00 01 80 00 55 55
+  10/size
+  aa aa 00 01 80 00 00 01 80 00 20 f9 a0 80 20 f9 a0 80 3e 81 80 00 00 01 80 00 00 01 80 00 55 55
+  10/size
+  aa aa 00 01 80 00 00 01 80 00 22 f9 a2 20 22 21 94 20 08 21 80 00 00 01 80 00 00 01 80 00 55 55
+  10/size
+  aa aa 00 01 80 00 00 01 80 00 3e f9 a0 80 3e f9 a0 80 20 81 80 00 00 01 80 00 00 01 80 00 55 55
+  10/size
+  aa aa 00 01 80 00 00 01 80 00 1e f1 a0 88 20 f1 a0 90 1e 89 80 00 00 01 80 00 00 01 80 00 55 55
+  10/size
+  aa aa 00 01 80 00 00 01 80 00 1e 71 a0 88 1c 89 82 88 3c 71 80 00 00 01 80 00 00 01 80 00 55 55
+  10/size
+  aa aa 00 01 80 00 00 01 80 00 1e f9 a0 20 1c 21 82 20 3c f9 80 00 00 01 80 00 00 01 80 00 55 55
+  10/size
+  aa aa 00 01 80 00 00 01 80 00 39 1d a5 10 25 1d a5 10 39 dd 80 00 00 01 80 00 00 01 80 00 55 55
+  10/size
+  aa aa 00 01 80 00 00 01 80 00 71 89 ca 18 4a 09 ca 08 71 9d 80 00 00 01 80 00 00 01 80 00 55 55
+  10/size
+  aa aa 00 01 80 00 00 01 80 00 71 99 ca 04 4a 09 ca 10 71 9d 80 00 00 01 80 00 00 01 80 00 55 55
+  10/size
+  aa aa 00 01 80 00 00 01 80 00 71 99 ca 04 4a 19 ca 04 71 99 80 00 00 01 80 00 00 01 80 00 55 55
+  10/size
+  aa aa 00 01 80 00 00 01 80 00 71 85 ca 0c 4a 15 ca 1c 71 85 80 00 00 01 80 00 00 01 80 00 55 55
+  10/size
+  aa aa 00 01 80 00 00 01 80 00 49 93 ea 54 6a 59 db d4 4a 53 80 00 00 01 80 00 00 01 80 00 55 55
+  10/size
+  aa aa 00 01 80 00 00 01 80 00 34 53 c2 9a 31 17 89 12 71 13 80 00 00 01 80 00 00 01 80 00 55 55
+  10/size
+  aa aa 00 01 80 00 00 01 80 00 7b b9 c1 24 79 39 c1 24 79 39 80 00 00 01 80 00 00 01 80 00 55 55
+  10/size
+  aa aa 00 01 80 00 00 01 80 00 33 25 c4 b4 47 ad c4 a4 34 a5 80 00 00 01 80 00 00 01 80 00 55 55
+  10/size
+  aa aa 00 01 80 00 00 01 80 00 3e 89 a0 d8 3e a9 a0 88 3e 89 80 00 00 01 80 00 00 01 80 00 55 55
+  10/size
+  aa aa 00 01 80 00 00 01 80 00 3a 5d c2 52 32 5d 8a 52 71 9d 80 00 00 01 80 00 00 01 80 00 55 55
+  10/size
+  aa aa 00 01 80 00 00 01 80 00 79 cf c2 10 79 91 c0 50 7b 8f 80 00 00 01 80 00 00 01 80 00 55 55
+  10/size
+  aa aa 00 01 80 00 00 01 80 00 1e 71 90 80 1e 61 90 10 10 e1 80 00 00 01 80 00 00 01 80 00 55 55
+  10/size
+  aa aa 00 01 80 00 00 01 80 00 0e 71 90 80 16 61 92 10 0e e1 80 00 00 01 80 00 00 01 80 00 55 55
+  10/size
+  aa aa 00 01 80 00 00 01 80 00 1c 71 92 80 1c 61 94 10 12 e1 80 00 00 01 80 00 00 01 80 00 55 55
+  10/size
+  aa aa 00 01 80 00 00 01 80 00 12 71 92 80 12 61 92 10 0c e1 80 00 00 01 80 00 00 01 80 00 55 55
 # 0x20 = space
-  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+  08/size
+  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
 # !
-  00 00 00 00 08 08 08 08 08 08 08 00 08 08 00 00
+  08/size
+  00 00 00 00 08 08 08 08 08 08 08 00 08 08 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
 # "
-  00 00 22 22 22 22 00 00 00 00 00 00 00 00 00 00
+  08/size
+  00 00 22 22 22 22 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
 # 0x23 = '#'
-  00 00 00 00 12 12 12 7e 24 24 7e 48 48 48 00 00
+  08/size
+  00 00 00 00 12 12 12 7e 24 24 7e 48 48 48 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
 # $
-  00 00 00 00 08 3e 49 48 38 0e 09 49 3e 08 00 00
+  08/size
+  00 00 00 00 08 3e 49 48 38 0e 09 49 3e 08 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
 # %
-  00 00 00 00 31 4a 4a 34 08 08 16 29 29 46 00 00
+  08/size
+  00 00 00 00 31 4a 4a 34 08 08 16 29 29 46 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
 # &
-  00 00 00 00 1c 22 22 14 18 29 45 42 46 39 00 00
+  08/size
+  00 00 00 00 1c 22 22 14 18 29 45 42 46 39 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
 # '
-  00 00 08 08 08 08 00 00 00 00 00 00 00 00 00 00
+  08/size
+  00 00 08 08 08 08 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
 # (
-  00 00 00 04 08 08 10 10 10 10 10 10 08 08 04 00
+  08/size
+  00 00 00 04 08 08 10 10 10 10 10 10 08 08 04 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
 # )
-  00 00 00 20 10 10 08 08 08 08 08 08 10 10 20 00
+  08/size
+  00 00 00 20 10 10 08 08 08 08 08 08 10 10 20 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
 # *
-  00 00 00 00 00 00 08 49 2a 1c 2a 49 08 00 00 00
+  08/size
+  00 00 00 00 00 00 08 49 2a 1c 2a 49 08 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
 # +
-  00 00 00 00 00 00 08 08 08 7f 08 08 08 00 00 00
+  08/size
+  00 00 00 00 00 00 08 08 08 7f 08 08 08 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
 # ,
-  00 00 00 00 00 00 00 00 00 00 00 00 18 08 08 10
+  08/size
+  00 00 00 00 00 00 00 00 00 00 00 00 18 08 08 10 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
 # -
-  00 00 00 00 00 00 00 00 00 3c 00 00 00 00 00 00
+  08/size
+  00 00 00 00 00 00 00 00 00 3c 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
 # .
-  00 00 00 00 00 00 00 00 00 00 00 00 18 18 00 00
+  08/size
+  00 00 00 00 00 00 00 00 00 00 00 00 18 18 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
 # /
-  00 00 00 00 02 02 04 08 08 10 10 20 40 40 00 00
+  08/size
+  00 00 00 00 02 02 04 08 08 10 10 20 40 40 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
 # 0x30 = '0'
-  00 00 00 00 18 24 42 46 4a 52 62 42 24 18 00 00
+  08/size
+  00 00 00 00 18 24 42 46 4a 52 62 42 24 18 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
 # 1
-  00 00 00 00 08 18 28 08 08 08 08 08 08 3e 00 00
+  08/size
+  00 00 00 00 08 18 28 08 08 08 08 08 08 3e 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
 # 2
-  00 00 00 00 3c 42 42 02 0c 10 20 40 40 7e 00 00
+  08/size
+  00 00 00 00 3c 42 42 02 0c 10 20 40 40 7e 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
 # 3
-  00 00 00 00 3c 42 42 02 1c 02 02 42 42 3c 00 00
+  08/size
+  00 00 00 00 3c 42 42 02 1c 02 02 42 42 3c 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
 # 4
-  00 00 00 00 04 0c 14 24 44 44 7e 04 04 04 00 00
+  08/size
+  00 00 00 00 04 0c 14 24 44 44 7e 04 04 04 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
 # 5
-  00 00 00 00 7e 40 40 40 7c 02 02 02 42 3c 00 00
+  08/size
+  00 00 00 00 7e 40 40 40 7c 02 02 02 42 3c 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
 # 6
-  00 00 00 00 1c 20 40 40 7c 42 42 42 42 3c 00 00
+  08/size
+  00 00 00 00 1c 20 40 40 7c 42 42 42 42 3c 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
 # 7
-  00 00 00 00 7e 02 02 04 04 04 08 08 08 08 00 00
+  08/size
+  00 00 00 00 7e 02 02 04 04 04 08 08 08 08 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
 # 8
-  00 00 00 00 3c 42 42 42 3c 42 42 42 42 3c 00 00
+  08/size
+  00 00 00 00 3c 42 42 42 3c 42 42 42 42 3c 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
 # 9
-  00 00 00 00 3c 42 42 42 3e 02 02 02 04 38 00 00
+  08/size
+  00 00 00 00 3c 42 42 42 3e 02 02 02 04 38 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
 # :
-  00 00 00 00 00 00 18 18 00 00 00 18 18 00 00 00
+  08/size
+  00 00 00 00 00 00 18 18 00 00 00 18 18 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
 # ;
-  00 00 00 00 00 00 18 18 00 00 00 18 08 08 10 00
+  08/size
+  00 00 00 00 00 00 18 18 00 00 00 18 08 08 10 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
 # <
-  00 00 00 00 00 02 04 08 10 20 10 08 04 02 00 00
+  08/size
+  00 00 00 00 00 02 04 08 10 20 10 08 04 02 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
 # =
-  00 00 00 00 00 00 00 7e 00 00 00 7e 00 00 00 00
+  08/size
+  00 00 00 00 00 00 00 7e 00 00 00 7e 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
 # >
-  00 00 00 00 00 40 20 10 08 04 08 10 20 40 00 00
+  08/size
+  00 00 00 00 00 40 20 10 08 04 08 10 20 40 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
 # ?
-  00 00 00 00 3c 42 42 02 04 08 08 00 08 08 00 00
+  08/size
+  00 00 00 00 3c 42 42 02 04 08 08 00 08 08 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
 # 0x40 = @
-  00 00 00 00 1c 22 4a 56 52 52 52 4e 20 1e 00 00
+  08/size
+  00 00 00 00 1c 22 4a 56 52 52 52 4e 20 1e 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
 # A
-  00 00 00 00 18 24 24 42 42 7e 42 42 42 42 00 00
+  08/size
+  00 00 00 00 18 24 24 42 42 7e 42 42 42 42 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
 # B
-  00 00 00 00 7c 42 42 42 7c 42 42 42 42 7c 00 00
+  08/size
+  00 00 00 00 7c 42 42 42 7c 42 42 42 42 7c 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
 # C
-  00 00 00 00 3c 42 42 40 40 40 40 42 42 3c 00 00
+  08/size
+  00 00 00 00 3c 42 42 40 40 40 40 42 42 3c 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
 # D
-  00 00 00 00 78 44 42 42 42 42 42 42 44 78 00 00
+  08/size
+  00 00 00 00 78 44 42 42 42 42 42 42 44 78 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
 # E
-  00 00 00 00 7e 40 40 40 7c 40 40 40 40 7e 00 00
+  08/size
+  00 00 00 00 7e 40 40 40 7c 40 40 40 40 7e 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
 # F
-  00 00 00 00 7e 40 40 40 7c 40 40 40 40 40 00 00
+  08/size
+  00 00 00 00 7e 40 40 40 7c 40 40 40 40 40 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
 # G
-  00 00 00 00 3c 42 42 40 40 4e 42 42 46 3a 00 00
+  08/size
+  00 00 00 00 3c 42 42 40 40 4e 42 42 46 3a 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
 # H
-  00 00 00 00 42 42 42 42 7e 42 42 42 42 42 00 00
+  08/size
+  00 00 00 00 42 42 42 42 7e 42 42 42 42 42 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
 # I
-  00 00 00 00 3e 08 08 08 08 08 08 08 08 3e 00 00
+  08/size
+  00 00 00 00 3e 08 08 08 08 08 08 08 08 3e 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
 # J
-  00 00 00 00 1f 04 04 04 04 04 04 44 44 38 00 00
+  08/size
+  00 00 00 00 1f 04 04 04 04 04 04 44 44 38 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
 # K
-  00 00 00 00 42 44 48 50 60 60 50 48 44 42 00 00
+  08/size
+  00 00 00 00 42 44 48 50 60 60 50 48 44 42 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
 # L
-  00 00 00 00 40 40 40 40 40 40 40 40 40 7e 00 00
+  08/size
+  00 00 00 00 40 40 40 40 40 40 40 40 40 7e 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
 # M
-  00 00 00 00 42 42 66 66 5a 5a 42 42 42 42 00 00
+  08/size
+  00 00 00 00 42 42 66 66 5a 5a 42 42 42 42 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
 # N
-  00 00 00 00 42 62 62 52 52 4a 4a 46 46 42 00 00
+  08/size
+  00 00 00 00 42 62 62 52 52 4a 4a 46 46 42 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
 # O
-  00 00 00 00 3c 42 42 42 42 42 42 42 42 3c 00 00
+  08/size
+  00 00 00 00 3c 42 42 42 42 42 42 42 42 3c 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
 # 0x50 = P
-  00 00 00 00 7c 42 42 42 7c 40 40 40 40 40 00 00
+  08/size
+  00 00 00 00 7c 42 42 42 7c 40 40 40 40 40 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
 # Q
-  00 00 00 00 3c 42 42 42 42 42 42 5a 66 3c 03 00
+  08/size
+  00 00 00 00 3c 42 42 42 42 42 42 5a 66 3c 03 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
 # R
-  00 00 00 00 7c 42 42 42 7c 48 44 44 42 42 00 00
+  08/size
+  00 00 00 00 7c 42 42 42 7c 48 44 44 42 42 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
 # S
-  00 00 00 00 3c 42 42 40 30 0c 02 42 42 3c 00 00
+  08/size
+  00 00 00 00 3c 42 42 40 30 0c 02 42 42 3c 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
 # T
-  00 00 00 00 7f 08 08 08 08 08 08 08 08 08 00 00
+  08/size
+  00 00 00 00 7f 08 08 08 08 08 08 08 08 08 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
 # U
-  00 00 00 00 42 42 42 42 42 42 42 42 42 3c 00 00
+  08/size
+  00 00 00 00 42 42 42 42 42 42 42 42 42 3c 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
 # V
-  00 00 00 00 41 41 41 22 22 22 14 14 08 08 00 00
+  08/size
+  00 00 00 00 41 41 41 22 22 22 14 14 08 08 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
 # W
-  00 00 00 00 42 42 42 42 5a 5a 66 66 42 42 00 00
+  08/size
+  00 00 00 00 42 42 42 42 5a 5a 66 66 42 42 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
 # X
-  00 00 00 00 42 42 24 24 18 18 24 24 42 42 00 00
+  08/size
+  00 00 00 00 42 42 24 24 18 18 24 24 42 42 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
 # Y
-  00 00 00 00 41 41 22 22 14 08 08 08 08 08 00 00
+  08/size
+  00 00 00 00 41 41 22 22 14 08 08 08 08 08 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
 # Z
-  00 00 00 00 7e 02 02 04 08 10 20 40 40 7e 00 00
+  08/size
+  00 00 00 00 7e 02 02 04 08 10 20 40 40 7e 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
 # [
-  00 00 00 0e 08 08 08 08 08 08 08 08 08 08 0e 00
+  08/size
+  00 00 00 0e 08 08 08 08 08 08 08 08 08 08 0e 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
 # \
-  00 00 00 00 40 40 20 10 10 08 08 04 02 02 00 00
+  08/size
+  00 00 00 00 40 40 20 10 10 08 08 04 02 02 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
 # ]
-  00 00 00 70 10 10 10 10 10 10 10 10 10 10 70 00
+  08/size
+  00 00 00 70 10 10 10 10 10 10 10 10 10 10 70 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
 # ^
-  00 00 18 24 42 00 00 00 00 00 00 00 00 00 00 00
+  08/size
+  00 00 18 24 42 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
 # _
-  00 00 00 00 00 00 00 00 00 00 00 00 00 00 7f 00
+  08/size
+  00 00 00 00 00 00 00 00 00 00 00 00 00 00 7f 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
 # 0x60 = backtick
-  00 20 10 08 00 00 00 00 00 00 00 00 00 00 00 00
+  08/size
+  00 20 10 08 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
 # a
-  00 00 00 00 00 00 3c 42 02 3e 42 42 46 3a 00 00
+  08/size
+  00 00 00 00 00 00 3c 42 02 3e 42 42 46 3a 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
 # b
-  00 00 00 40 40 40 5c 62 42 42 42 42 62 5c 00 00
+  08/size
+  00 00 00 40 40 40 5c 62 42 42 42 42 62 5c 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
 # c
-  00 00 00 00 00 00 3c 42 40 40 40 40 42 3c 00 00
+  08/size
+  00 00 00 00 00 00 3c 42 40 40 40 40 42 3c 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
 # d
-  00 00 00 02 02 02 3a 46 42 42 42 42 46 3a 00 00
+  08/size
+  00 00 00 02 02 02 3a 46 42 42 42 42 46 3a 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
 # e
-  00 00 00 00 00 00 3c 42 42 7e 40 40 42 3c 00 00
+  08/size
+  00 00 00 00 00 00 3c 42 42 7e 40 40 42 3c 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
 # f
-  00 00 00 0c 10 10 10 7c 10 10 10 10 10 10 00 00
+  08/size
+  00 00 00 0c 10 10 10 7c 10 10 10 10 10 10 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
 # g
-  00 00 00 00 00 02 3a 44 44 44 38 20 3c 42 42 3c
+  08/size
+  00 00 00 00 00 02 3a 44 44 44 38 20 3c 42 42 3c 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
 # h
-  00 00 00 40 40 40 5c 62 42 42 42 42 42 42 00 00
+  08/size
+  00 00 00 40 40 40 5c 62 42 42 42 42 42 42 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
 # i
-  00 00 00 08 08 00 18 08 08 08 08 08 08 3e 00 00
+  08/size
+  00 00 00 08 08 00 18 08 08 08 08 08 08 3e 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
 # j
-  00 00 00 04 04 00 0c 04 04 04 04 04 04 04 48 30
+  08/size
+  00 00 00 04 04 00 0c 04 04 04 04 04 04 04 48 30 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
 # k
-  00 00 00 40 40 40 44 48 50 60 50 48 44 42 00 00
+  08/size
+  00 00 00 40 40 40 44 48 50 60 50 48 44 42 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
 # l
-  00 00 00 18 08 08 08 08 08 08 08 08 08 3e 00 00
+  08/size
+  00 00 00 18 08 08 08 08 08 08 08 08 08 3e 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
 # m
-  00 00 00 00 00 00 76 49 49 49 49 49 49 49 00 00
+  08/size
+  00 00 00 00 00 00 76 49 49 49 49 49 49 49 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
 # n
-  00 00 00 00 00 00 5c 62 42 42 42 42 42 42 00 00
+  08/size
+  00 00 00 00 00 00 5c 62 42 42 42 42 42 42 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
 # o
-  00 00 00 00 00 00 3c 42 42 42 42 42 42 3c 00 00
+  08/size
+  00 00 00 00 00 00 3c 42 42 42 42 42 42 3c 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
 # 0x70 = p
-  00 00 00 00 00 00 5c 62 42 42 42 42 62 5c 40 40
+  08/size
+  00 00 00 00 00 00 5c 62 42 42 42 42 62 5c 40 40 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
 # q
-  00 00 00 00 00 00 3a 46 42 42 42 42 46 3a 02 02
+  08/size
+  00 00 00 00 00 00 3a 46 42 42 42 42 46 3a 02 02 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
 # r
-  00 00 00 00 00 00 5c 62 42 40 40 40 40 40 00 00
+  08/size
+  00 00 00 00 00 00 5c 62 42 40 40 40 40 40 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
 # s
-  00 00 00 00 00 00 3c 42 40 30 0c 02 42 3c 00 00
+  08/size
+  00 00 00 00 00 00 3c 42 40 30 0c 02 42 3c 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
 # t
-  00 00 00 00 10 10 10 7c 10 10 10 10 10 0c 00 00
+  08/size
+  00 00 00 00 10 10 10 7c 10 10 10 10 10 0c 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
 # u
-  00 00 00 00 00 00 42 42 42 42 42 42 46 3a 00 00
+  08/size
+  00 00 00 00 00 00 42 42 42 42 42 42 46 3a 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
 # v
-  00 00 00 00 00 00 42 42 42 24 24 24 18 18 00 00
+  08/size
+  00 00 00 00 00 00 42 42 42 24 24 24 18 18 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
 # w
-  00 00 00 00 00 00 41 49 49 49 49 49 49 36 00 00
+  08/size
+  00 00 00 00 00 00 41 49 49 49 49 49 49 36 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
 # x
-  00 00 00 00 00 00 42 42 24 18 18 24 42 42 00 00
+  08/size
+  00 00 00 00 00 00 42 42 24 18 18 24 42 42 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
 # y
-  00 00 00 00 00 00 42 42 42 42 42 26 1a 02 02 3c
+  08/size
+  00 00 00 00 00 00 42 42 42 42 42 26 1a 02 02 3c 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
 # z
-  00 00 00 00 00 00 7e 02 04 08 10 20 40 7e 00 00
+  08/size
+  00 00 00 00 00 00 7e 02 04 08 10 20 40 7e 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
 # {
-  00 00 00 0c 10 10 08 08 10 20 10 08 08 10 10 0c
+  08/size
+  00 00 00 0c 10 10 08 08 10 20 10 08 08 10 10 0c 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
 # |
-  00 00 08 08 08 08 08 08 08 08 08 08 08 08 08 08
+  08/size
+  00 00 08 08 08 08 08 08 08 08 08 08 08 08 08 08 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
 # }
-  00 00 00 30 08 08 10 10 08 04 08 10 10 08 08 30
+  08/size
+  00 00 00 30 08 08 10 10 08 04 08 10 10 08 08 30 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
 # ~
-  00 00 00 31 49 46 00 00 00 00 00 00 00 00 00 00
+  08/size
+  00 00 00 31 49 46 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
 # 0x7f = del (unused)
-  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+  08/size
+  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
diff --git a/vocabulary.md b/vocabulary.md
index a130b26b..ef41a243 100644
--- a/vocabulary.md
+++ b/vocabulary.md
@@ -141,9 +141,8 @@ All text-mode screen primitives require a screen object, which can be either
 the real screen on the computer or a fake screen for tests.
 
 The real screen on the Mu computer can currently display only ASCII characters,
-though it's easy to import more of the font. There is only one font. All
-graphemes are 8 pixels wide and 16 pixels tall. These constraints only apply
-to the real screen.
+though it's easy to import more of the font. There is only one font, and it's
+mostly fixed-width, with graphemes being either 8 or 16 pixels wide.
 
 - `draw-grapheme`: draws a single grapheme at a given coordinate, with given
   foreground and background colors.