about summary refs log tree commit diff stats
diff options
context:
space:
mode:
-rw-r--r--304screen.subx48
-rwxr-xr-xapps/mubin369023 -> 369145 bytes
-rw-r--r--apps/mu.subx2
3 files changed, 48 insertions, 2 deletions
diff --git a/304screen.subx b/304screen.subx
index 2badb1eb..2e3635ee 100644
--- a/304screen.subx
+++ b/304screen.subx
@@ -131,19 +131,63 @@ $print-string-to-real-screen:end:
     5d/pop-to-ebp
     c3/return
 
-# currently only supports ascii
+# print a grapheme in utf-8 (only up to 4 bytes so far)
 print-grapheme-to-real-screen:  # c: grapheme
     # . prologue
     55/push-ebp
     89/<- %ebp 4/r32/esp
     # . save registers
+    50/push-eax
+    # var curr/eax: byte = 0
+    b8/copy-to-eax 0/imm32
+    # curr = *(ebp+8)
+    8a/byte-> *(ebp+8) 0/r32/al
+    # if (curr == 0) return
+    3d/compare-eax-and 0/imm32
+    74/jump-if-= $print-grapheme-to-real-screen:end/disp8
+    #
+    (print-byte-to-real-screen %eax)
+    # curr = *(ebp+9)
+    8a/byte-> *(ebp+9) 0/r32/al
+    # if (curr == 0) return
+    3d/compare-eax-and 0/imm32
+    74/jump-if-= $print-grapheme-to-real-screen:end/disp8
+    #
+    (print-byte-to-real-screen %eax)
+    # curr = *(ebp+10)
+    8a/byte-> *(ebp+0xa) 0/r32/al
+    # if (curr == 0) return
+    3d/compare-eax-and 0/imm32
+    74/jump-if-= $print-grapheme-to-real-screen:end/disp8
+    #
+    (print-byte-to-real-screen %eax)
+    # curr = *(ebp+11)
+    8a/byte-> *(ebp+0xb) 0/r32/al
+    # if (curr == 0) return
+    3d/compare-eax-and 0/imm32
+    74/jump-if-= $print-grapheme-to-real-screen:end/disp8
+    #
+    (print-byte-to-real-screen %eax)
+$print-grapheme-to-real-screen:end:
+    # . restore registers
+    58/pop-to-eax
+    # . epilogue
+    89/<- %esp 5/r32/ebp
+    5d/pop-to-ebp
+    c3/return
+
+print-byte-to-real-screen:  # c: byte
+    # . prologue
+    55/push-ebp
+    89/<- %ebp 4/r32/esp
+    # . save registers
     51/push-ecx
     # var s/ecx: (addr array byte)
     ff 6/subop/push *(ebp+8)
     68/push 1/imm32/size
     89/<- %ecx 4/r32/esp
     (write 1 %ecx)
-$print-grapheme-to-real-screen:end:
+$print-byte-to-real-screen:end:
     # . reclaim locals
     81 0/subop/add %esp 8/imm32
     # . restore registers
diff --git a/apps/mu b/apps/mu
index d53be2e7..04eefef8 100755
--- a/apps/mu
+++ b/apps/mu
Binary files differdiff --git a/apps/mu.subx b/apps/mu.subx
index 20f59336..912b2b1f 100644
--- a/apps/mu.subx
+++ b/apps/mu.subx
@@ -414,6 +414,8 @@ Type-id:  # (stream (addr array byte))
   "slice"/imm32  # 12
   "code-point"/imm32  # 13; smallest scannable unit from a text stream
   "grapheme"/imm32  # 14; smallest printable unit; will eventually be composed of multiple code-points, but currently corresponds 1:1
+                    # only 4-byte graphemes in utf-8 are currently supported;
+                    # unclear how we should deal with larger clusters.
   # Keep Primitive-type-ids in sync if you add types here.
                                                           0/imm32
   0/imm32 0/imm32 0/imm32 0/imm32 0/imm32 0/imm32 0/imm32 0/imm32