about summary refs log tree commit diff stats
path: root/prototypes
diff options
context:
space:
mode:
authorKartik Agaram <vc@akkartik.com>2020-09-16 18:54:12 -0700
committerKartik Agaram <vc@akkartik.com>2020-09-16 18:54:12 -0700
commite403d15732e62fc9f1940ef14dc3b46bb11f5201 (patch)
tree81e8d387fe26be18f986fece6766c69c8ad57a2e /prototypes
parent797c93e054d210a6d595f0b57fd3d9adb9669d8c (diff)
downloadmu-e403d15732e62fc9f1940ef14dc3b46bb11f5201.tar.gz
6794 - cleaner interface for keyboard
So far I've been assuming that read-key only works for ascii, and that
I'd need to get more sophisticated both for multi-byte utf-8 and multi-byte
terminal escape codes like arrow keys. Rather to my surprise, both work
fine. We just need to adjust the types to reflect this fact.
Diffstat (limited to 'prototypes')
-rw-r--r--prototypes/browse/10.mu2
-rw-r--r--prototypes/browse/11.mu2
-rw-r--r--prototypes/browse/12.mu2
-rw-r--r--prototypes/browse/13.mu2
-rw-r--r--prototypes/browse/14.mu2
-rw-r--r--prototypes/browse/15-headers-broken.mu2
-rw-r--r--prototypes/browse/16-screen-state-broken.mu2
-rw-r--r--prototypes/browse/17-file-state-broken/main.mu2
-rw-r--r--prototypes/browse/19/main.mu2
-rw-r--r--prototypes/browse/20/main.mu2
-rw-r--r--prototypes/browse/21/main.mu2
-rw-r--r--prototypes/browse/22/main.mu2
-rw-r--r--prototypes/browse/23-multiple-pages/main.mu2
-rw-r--r--prototypes/browse/24-bold/main.mu2
-rw-r--r--prototypes/browse/25-soft-newlines/main.mu2
-rw-r--r--prototypes/browse/26-headers/main.mu2
-rw-r--r--prototypes/browse/27/main.mu2
-rw-r--r--prototypes/browse/28/main.mu2
-rw-r--r--prototypes/browse/29/main.mu2
-rw-r--r--prototypes/browse/4-render-page.mu4
-rw-r--r--prototypes/browse/5.mu4
-rw-r--r--prototypes/browse/6.mu2
-rw-r--r--prototypes/browse/7.mu2
-rw-r--r--prototypes/browse/8-multiple-pages.mu2
-rw-r--r--prototypes/browse/9-bold.mu2
-rw-r--r--prototypes/tile/1.mu4
-rw-r--r--prototypes/tile/10.mu6
-rw-r--r--prototypes/tile/11.mu4
-rw-r--r--prototypes/tile/2.mu2
-rw-r--r--prototypes/tile/4.mu4
-rw-r--r--prototypes/tile/5.mu4
-rw-r--r--prototypes/tile/6.mu4
-rw-r--r--prototypes/tile/7.mu4
-rw-r--r--prototypes/tile/8.mu4
-rw-r--r--prototypes/tile/9.mu9
35 files changed, 50 insertions, 49 deletions
diff --git a/prototypes/browse/10.mu b/prototypes/browse/10.mu
index e4f094fb..99e712c2 100644
--- a/prototypes/browse/10.mu
+++ b/prototypes/browse/10.mu
@@ -13,7 +13,7 @@ fn main args: (addr array addr array byte) -> exit-status/ebx: int {
   enable-keyboard-immediate-mode
   {
     render file, nrows, ncols
-    var key/eax: byte <- read-key
+    var key/eax: grapheme <- read-key-from-real-keyboard
     compare key, 0x71  # 'q'
     loop-if-!=
   }
diff --git a/prototypes/browse/11.mu b/prototypes/browse/11.mu
index e3083c09..b7d20597 100644
--- a/prototypes/browse/11.mu
+++ b/prototypes/browse/11.mu
@@ -11,7 +11,7 @@ fn main args: (addr array addr array byte) -> exit-status/ebx: int {
   enable-keyboard-immediate-mode
   {
     render file, nrows, ncols
-    var key/eax: byte <- read-key
+    var key/eax: grapheme <- read-key-from-real-keyboard
     compare key, 0x71  # 'q'
     loop-if-!=
   }
diff --git a/prototypes/browse/12.mu b/prototypes/browse/12.mu
index 1f72c36d..185849ad 100644
--- a/prototypes/browse/12.mu
+++ b/prototypes/browse/12.mu
@@ -10,7 +10,7 @@ fn main args: (addr array addr array byte) -> exit-status/ebx: int {
   enable-keyboard-immediate-mode
   {
     render file, nrows, ncols
-    var key/eax: byte <- read-key
+    var key/eax: grapheme <- read-key-from-real-keyboard
     compare key, 0x71  # 'q'
     loop-if-!=
   }
diff --git a/prototypes/browse/13.mu b/prototypes/browse/13.mu
index f9e76585..72cf523d 100644
--- a/prototypes/browse/13.mu
+++ b/prototypes/browse/13.mu
@@ -10,7 +10,7 @@ fn main args: (addr array addr array byte) -> exit-status/ebx: int {
   enable-keyboard-immediate-mode
   {
     render file, nrows, ncols
-    var key/eax: byte <- read-key
+    var key/eax: grapheme <- read-key-from-real-keyboard
     compare key, 0x71  # 'q'
     loop-if-!=
   }
diff --git a/prototypes/browse/14.mu b/prototypes/browse/14.mu
index dc7ac4f7..53f452a2 100644
--- a/prototypes/browse/14.mu
+++ b/prototypes/browse/14.mu
@@ -8,7 +8,7 @@ fn main args: (addr array addr array byte) -> exit-status/ebx: int {
   enable-keyboard-immediate-mode
   {
     render file, nrows, ncols
-    var key/eax: byte <- read-key
+    var key/eax: grapheme <- read-key-from-real-keyboard
     compare key, 0x71  # 'q'
     loop-if-!=
   }
diff --git a/prototypes/browse/15-headers-broken.mu b/prototypes/browse/15-headers-broken.mu
index d9209e4e..950fa6ed 100644
--- a/prototypes/browse/15-headers-broken.mu
+++ b/prototypes/browse/15-headers-broken.mu
@@ -13,7 +13,7 @@ fn main args: (addr array addr array byte) -> exit-status/ebx: int {
   enable-keyboard-immediate-mode
   {
     render file, nrows, ncols
-    var key/eax: byte <- read-key
+    var key/eax: grapheme <- read-key-from-real-keyboard
     compare key, 0x71  # 'q'
     loop-if-!=
   }
diff --git a/prototypes/browse/16-screen-state-broken.mu b/prototypes/browse/16-screen-state-broken.mu
index 544bb1ca..3e18f7f4 100644
--- a/prototypes/browse/16-screen-state-broken.mu
+++ b/prototypes/browse/16-screen-state-broken.mu
@@ -32,7 +32,7 @@ fn main args: (addr array addr array byte) -> exit-status/ebx: int {
   init-screen-position-state screen-position-state, nrows, ncols
   {
     render file, screen-position-state
-    var key/eax: byte <- read-key
+    var key/eax: grapheme <- read-key-from-real-keyboard
     compare key, 0x71  # 'q'
     loop-if-!=
   }
diff --git a/prototypes/browse/17-file-state-broken/main.mu b/prototypes/browse/17-file-state-broken/main.mu
index a7d41529..7ccd4b4b 100644
--- a/prototypes/browse/17-file-state-broken/main.mu
+++ b/prototypes/browse/17-file-state-broken/main.mu
@@ -19,7 +19,7 @@ fn main args: (addr array addr array byte) -> exit-status/ebx: int {
     compare done?, 0
     break-if-=
     render fs, screen-position-state
-    var key/eax: byte <- read-key
+    var key/eax: grapheme <- read-key-from-real-keyboard
     compare key, 0x71  # 'q'
     loop-if-!=
   }
diff --git a/prototypes/browse/19/main.mu b/prototypes/browse/19/main.mu
index 5470a7e2..62a603bc 100644
--- a/prototypes/browse/19/main.mu
+++ b/prototypes/browse/19/main.mu
@@ -13,7 +13,7 @@ fn main args: (addr array addr array byte) -> exit-status/ebx: int {
   init-screen-position-state screen-position-state
   {
     render fs, screen-position-state
-    var key/eax: byte <- read-key
+    var key/eax: grapheme <- read-key-from-real-keyboard
   }
   enable-keyboard-type-mode
   enable-screen-type-mode
diff --git a/prototypes/browse/20/main.mu b/prototypes/browse/20/main.mu
index 5470a7e2..62a603bc 100644
--- a/prototypes/browse/20/main.mu
+++ b/prototypes/browse/20/main.mu
@@ -13,7 +13,7 @@ fn main args: (addr array addr array byte) -> exit-status/ebx: int {
   init-screen-position-state screen-position-state
   {
     render fs, screen-position-state
-    var key/eax: byte <- read-key
+    var key/eax: grapheme <- read-key-from-real-keyboard
   }
   enable-keyboard-type-mode
   enable-screen-type-mode
diff --git a/prototypes/browse/21/main.mu b/prototypes/browse/21/main.mu
index 5470a7e2..62a603bc 100644
--- a/prototypes/browse/21/main.mu
+++ b/prototypes/browse/21/main.mu
@@ -13,7 +13,7 @@ fn main args: (addr array addr array byte) -> exit-status/ebx: int {
   init-screen-position-state screen-position-state
   {
     render fs, screen-position-state
-    var key/eax: byte <- read-key
+    var key/eax: grapheme <- read-key-from-real-keyboard
   }
   enable-keyboard-type-mode
   enable-screen-type-mode
diff --git a/prototypes/browse/22/main.mu b/prototypes/browse/22/main.mu
index 5470a7e2..62a603bc 100644
--- a/prototypes/browse/22/main.mu
+++ b/prototypes/browse/22/main.mu
@@ -13,7 +13,7 @@ fn main args: (addr array addr array byte) -> exit-status/ebx: int {
   init-screen-position-state screen-position-state
   {
     render fs, screen-position-state
-    var key/eax: byte <- read-key
+    var key/eax: grapheme <- read-key-from-real-keyboard
   }
   enable-keyboard-type-mode
   enable-screen-type-mode
diff --git a/prototypes/browse/23-multiple-pages/main.mu b/prototypes/browse/23-multiple-pages/main.mu
index c485a5c0..361e3654 100644
--- a/prototypes/browse/23-multiple-pages/main.mu
+++ b/prototypes/browse/23-multiple-pages/main.mu
@@ -13,7 +13,7 @@ fn main args: (addr array addr array byte) -> exit-status/ebx: int {
   init-screen-position-state screen-position-state
   {
     render fs, screen-position-state
-    var key/eax: byte <- read-key
+    var key/eax: grapheme <- read-key-from-real-keyboard
     compare key, 0x71  # 'q'
     loop-if-!=
   }
diff --git a/prototypes/browse/24-bold/main.mu b/prototypes/browse/24-bold/main.mu
index aa2c07a1..162080f9 100644
--- a/prototypes/browse/24-bold/main.mu
+++ b/prototypes/browse/24-bold/main.mu
@@ -14,7 +14,7 @@ fn main args: (addr array addr array byte) -> exit-status/ebx: int {
   normal-text
   {
     render fs, screen-position-state
-    var key/eax: byte <- read-key
+    var key/eax: grapheme <- read-key-from-real-keyboard
     compare key, 0x71  # 'q'
     loop-if-!=
   }
diff --git a/prototypes/browse/25-soft-newlines/main.mu b/prototypes/browse/25-soft-newlines/main.mu
index e19c2a64..279ef3fa 100644
--- a/prototypes/browse/25-soft-newlines/main.mu
+++ b/prototypes/browse/25-soft-newlines/main.mu
@@ -14,7 +14,7 @@ fn main args: (addr array addr array byte) -> exit-status/ebx: int {
   normal-text
   {
     render fs, screen-position-state
-    var key/eax: byte <- read-key
+    var key/eax: grapheme <- read-key-from-real-keyboard
     compare key, 0x71  # 'q'
     loop-if-!=
   }
diff --git a/prototypes/browse/26-headers/main.mu b/prototypes/browse/26-headers/main.mu
index 0ecd3469..51af6013 100644
--- a/prototypes/browse/26-headers/main.mu
+++ b/prototypes/browse/26-headers/main.mu
@@ -14,7 +14,7 @@ fn main args: (addr array addr array byte) -> exit-status/ebx: int {
   normal-text
   {
     render fs, screen-position-state
-    var key/eax: byte <- read-key
+    var key/eax: grapheme <- read-key-from-real-keyboard
     compare key, 0x71  # 'q'
     loop-if-!=
   }
diff --git a/prototypes/browse/27/main.mu b/prototypes/browse/27/main.mu
index c0d1dfd2..176c133e 100644
--- a/prototypes/browse/27/main.mu
+++ b/prototypes/browse/27/main.mu
@@ -14,7 +14,7 @@ fn main args: (addr array addr array byte) -> exit-status/ebx: int {
   normal-text
   {
     render fs, screen-position-state
-    var key/eax: byte <- read-key
+    var key/eax: grapheme <- read-key-from-real-keyboard
     compare key, 0x71  # 'q'
     loop-if-!=
   }
diff --git a/prototypes/browse/28/main.mu b/prototypes/browse/28/main.mu
index 96944d40..c9e78b2c 100644
--- a/prototypes/browse/28/main.mu
+++ b/prototypes/browse/28/main.mu
@@ -14,7 +14,7 @@ fn main args: (addr array addr array byte) -> exit-status/ebx: int {
   normal-text
   {
     render fs, screen-position-state
-    var key/eax: byte <- read-key
+    var key/eax: grapheme <- read-key-from-real-keyboard
     compare key, 0x71  # 'q'
     loop-if-!=
   }
diff --git a/prototypes/browse/29/main.mu b/prototypes/browse/29/main.mu
index ca7bcab1..08e4f3c6 100644
--- a/prototypes/browse/29/main.mu
+++ b/prototypes/browse/29/main.mu
@@ -14,7 +14,7 @@ fn main args: (addr array addr array byte) -> exit-status/ebx: int {
   normal-text
   {
     render fs, screen-position-state
-    var key/eax: byte <- read-key
+    var key/eax: grapheme <- read-key-from-real-keyboard
     compare key, 0x71  # 'q'
     loop-if-!=
   }
diff --git a/prototypes/browse/4-render-page.mu b/prototypes/browse/4-render-page.mu
index 6e78534f..0af47b40 100644
--- a/prototypes/browse/4-render-page.mu
+++ b/prototypes/browse/4-render-page.mu
@@ -4,8 +4,8 @@ fn main args: (addr array addr array byte) -> exit-status/ebx: int {
   enable-screen-grid-mode
   enable-keyboard-immediate-mode
   {
-    render file, 5, 5, 30, 30
-    var key/eax: byte <- read-key
+    render file, 5, 5, 0x30, 0x30
+    var key/eax: grapheme <- read-key-from-real-keyboard
     compare key, 0x71  # 'q'
     loop-if-!=
   }
diff --git a/prototypes/browse/5.mu b/prototypes/browse/5.mu
index 0384b96a..5952e8c9 100644
--- a/prototypes/browse/5.mu
+++ b/prototypes/browse/5.mu
@@ -4,8 +4,8 @@ fn main args: (addr array addr array byte) -> exit-status/ebx: int {
   enable-screen-grid-mode
   enable-keyboard-immediate-mode
   {
-    render file, 5, 5, 30, 30
-    var key/eax: byte <- read-key
+    render file, 5, 5, 0x30, 0x30
+    var key/eax: grapheme <- read-key-from-real-keyboard
     compare key, 0x71  # 'q'
     loop-if-!=
   }
diff --git a/prototypes/browse/6.mu b/prototypes/browse/6.mu
index 17fda312..489c6938 100644
--- a/prototypes/browse/6.mu
+++ b/prototypes/browse/6.mu
@@ -5,7 +5,7 @@ fn main args: (addr array addr array byte) -> exit-status/ebx: int {
   enable-keyboard-immediate-mode
   {
     render file, 0x20, 0x30  # nrows, ncols
-    var key/eax: byte <- read-key
+    var key/eax: grapheme <- read-key-from-real-keyboard
     compare key, 0x71  # 'q'
     loop-if-!=
   }
diff --git a/prototypes/browse/7.mu b/prototypes/browse/7.mu
index d6f31218..f306e9b5 100644
--- a/prototypes/browse/7.mu
+++ b/prototypes/browse/7.mu
@@ -8,7 +8,7 @@ fn main args: (addr array addr array byte) -> exit-status/ebx: int {
   enable-keyboard-immediate-mode
   {
     render file, nrows, ncols
-    var key/eax: byte <- read-key
+    var key/eax: grapheme <- read-key-from-real-keyboard
     compare key, 0x71  # 'q'
     loop-if-!=
   }
diff --git a/prototypes/browse/8-multiple-pages.mu b/prototypes/browse/8-multiple-pages.mu
index 2ae2fc66..b4156cd9 100644
--- a/prototypes/browse/8-multiple-pages.mu
+++ b/prototypes/browse/8-multiple-pages.mu
@@ -8,7 +8,7 @@ fn main args: (addr array addr array byte) -> exit-status/ebx: int {
   enable-keyboard-immediate-mode
   {
     render file, nrows, ncols
-    var key/eax: byte <- read-key
+    var key/eax: grapheme <- read-key-from-real-keyboard
     compare key, 0x71  # 'q'
     loop-if-!=
   }
diff --git a/prototypes/browse/9-bold.mu b/prototypes/browse/9-bold.mu
index 121cd0bf..f0b5fded 100644
--- a/prototypes/browse/9-bold.mu
+++ b/prototypes/browse/9-bold.mu
@@ -8,7 +8,7 @@ fn main args: (addr array addr array byte) -> exit-status/ebx: int {
   enable-keyboard-immediate-mode
   {
     render file, nrows, ncols
-    var key/eax: byte <- read-key
+    var key/eax: grapheme <- read-key-from-real-keyboard
     compare key, 0x71  # 'q'
     loop-if-!=
   }
diff --git a/prototypes/tile/1.mu b/prototypes/tile/1.mu
index 4c0f8a6d..4d0a7969 100644
--- a/prototypes/tile/1.mu
+++ b/prototypes/tile/1.mu
@@ -14,7 +14,7 @@ fn main -> exit-status/ebx: int {
   move-cursor 0, 5, 5
   print-string 0, "_________"
   enable-keyboard-immediate-mode
-  var dummy/eax: byte <- read-key
+  var dummy/eax: grapheme <- read-key-from-real-keyboard
   var row/eax: int <- copy 5
   {
     compare row, 0xe  # 15
@@ -24,7 +24,7 @@ fn main -> exit-status/ebx: int {
     sleep 0 0x5f5e100  # 100ms
     loop
   }
-  var dummy/eax: byte <- read-key
+  var dummy/eax: grapheme <- read-key-from-real-keyboard
   enable-keyboard-type-mode
   clear-screen 0
   exit-status <- copy 0
diff --git a/prototypes/tile/10.mu b/prototypes/tile/10.mu
index 73ce73ff..6f971b1c 100644
--- a/prototypes/tile/10.mu
+++ b/prototypes/tile/10.mu
@@ -63,14 +63,14 @@ fn interactive -> exit-status/ebx: int {
 $main:loop: {
     # process key
     {
-      var c/eax: byte <- read-key
+      var c/eax: grapheme <- read-key-from-real-keyboard
       compare c, 4  # ctrl-d
       break-if-= $main:loop
       process c, root, cursor
     }
     # render tree
     var _root-addr/eax: (addr cell) <- lookup root-handle
-    var root-addr/ecx: (addr cell) <- copy _root-addr
+    root-addr <- copy _root-addr
     var cursor-addr/eax: (addr cell) <- lookup *cursor
     render root-addr, cursor-addr
     loop
@@ -84,7 +84,7 @@ $main:loop: {
 # Tree mutations
 #######################################################
 
-fn process c: byte, root: (addr handle cell), cursor: (addr handle cell) {
+fn process c: grapheme, root: (addr handle cell), cursor: (addr handle cell) {
 $process:body: {
   # if c == 'h' move cursor to its parent if possible
   {
diff --git a/prototypes/tile/11.mu b/prototypes/tile/11.mu
index 8d3593e3..82de9fda 100644
--- a/prototypes/tile/11.mu
+++ b/prototypes/tile/11.mu
@@ -63,7 +63,7 @@ fn interactive -> exit-status/ebx: int {
 $main:loop: {
     # process key
     {
-      var c/eax: byte <- read-key
+      var c/eax: grapheme <- read-key-from-real-keyboard
       compare c, 4  # ctrl-d
       break-if-= $main:loop
       process c, root, cursor
@@ -84,7 +84,7 @@ $main:loop: {
 # Tree mutations
 #######################################################
 
-fn process c: byte, root: (addr handle cell), cursor: (addr handle cell) {
+fn process c: grapheme, root: (addr handle cell), cursor: (addr handle cell) {
 $process:body: {
   # if c == 'h' move cursor to its parent if possible
   {
diff --git a/prototypes/tile/2.mu b/prototypes/tile/2.mu
index 79b9ed99..6339d61e 100644
--- a/prototypes/tile/2.mu
+++ b/prototypes/tile/2.mu
@@ -32,7 +32,7 @@ fn main -> exit-status/ebx: int {
   # wait for a key
   {
     enable-keyboard-immediate-mode
-      var dummy/eax: byte <- read-key
+      var dummy/eax: grapheme <- read-key-from-real-keyboard
     enable-keyboard-type-mode
   }
   # clean up
diff --git a/prototypes/tile/4.mu b/prototypes/tile/4.mu
index bd2bd77c..6e2a57b7 100644
--- a/prototypes/tile/4.mu
+++ b/prototypes/tile/4.mu
@@ -9,7 +9,7 @@
 fn main -> exit-status/ebx: int {
   clear-screen 0
   enable-keyboard-immediate-mode
-  var dummy/eax: byte <- read-key
+  var dummy/eax: grapheme <- read-key-from-real-keyboard
   draw-box 5, 5, 0x23, 0x23  # 35, 35
   sleep 0 0x5f5e100  # 100ms
   sleep 0 0x5f5e100  # 100ms
@@ -17,7 +17,7 @@ fn main -> exit-status/ebx: int {
   sleep 0 0x5f5e100  # 100ms
   sleep 0 0x5f5e100  # 100ms
   draw-box 5, 5, 0x23, 0xaf  # 35, 175
-  var dummy/eax: byte <- read-key
+  var dummy/eax: grapheme <- read-key-from-real-keyboard
   enable-keyboard-type-mode
   clear-screen 0
   exit-status <- copy 0
diff --git a/prototypes/tile/5.mu b/prototypes/tile/5.mu
index a49c4922..58d94636 100644
--- a/prototypes/tile/5.mu
+++ b/prototypes/tile/5.mu
@@ -31,7 +31,7 @@ fn main -> exit-status/ebx: int {
 $main:loop: {
     # process key
     {
-      var c/eax: byte <- read-key
+      var c/eax: grapheme <- read-key-from-real-keyboard
       compare c, 4  # ctrl-d
       break-if-= $main:loop
       process c, root, cursor
@@ -50,7 +50,7 @@ $main:loop: {
 # Tree mutations
 #######################################################
 
-fn process c: byte, root: (addr handle cell), cursor: (addr handle cell) {
+fn process c: grapheme, root: (addr handle cell), cursor: (addr handle cell) {
   var c1/eax: (addr handle cell) <- copy cursor
   var c2/eax: (addr cell) <- lookup *c1
   create-child c2
diff --git a/prototypes/tile/6.mu b/prototypes/tile/6.mu
index ee7ef8c0..be95dead 100644
--- a/prototypes/tile/6.mu
+++ b/prototypes/tile/6.mu
@@ -58,7 +58,7 @@ fn interactive -> exit-status/ebx: int {
 $main:loop: {
     # process key
     {
-      var c/eax: byte <- read-key
+      var c/eax: grapheme <- read-key-from-real-keyboard
       compare c, 4  # ctrl-d
       break-if-= $main:loop
       process c, root, cursor
@@ -77,7 +77,7 @@ $main:loop: {
 # Tree mutations
 #######################################################
 
-fn process c: byte, root: (addr handle cell), cursor: (addr handle cell) {
+fn process c: grapheme, root: (addr handle cell), cursor: (addr handle cell) {
   # increase depth by 1
   var c1/ecx: (addr handle cell) <- copy cursor
   var c2/eax: (addr cell) <- lookup *c1
diff --git a/prototypes/tile/7.mu b/prototypes/tile/7.mu
index 92b92b34..e2e7aff0 100644
--- a/prototypes/tile/7.mu
+++ b/prototypes/tile/7.mu
@@ -62,7 +62,7 @@ fn interactive -> exit-status/ebx: int {
 $main:loop: {
     # process key
     {
-      var c/eax: byte <- read-key
+      var c/eax: grapheme <- read-key-from-real-keyboard
       compare c, 4  # ctrl-d
       break-if-= $main:loop
       process c, root, cursor
@@ -81,7 +81,7 @@ $main:loop: {
 # Tree mutations
 #######################################################
 
-fn process c: byte, root: (addr handle cell), cursor: (addr handle cell) {
+fn process c: grapheme, root: (addr handle cell), cursor: (addr handle cell) {
   var c1/ecx: (addr handle cell) <- copy cursor
   var c2/eax: (addr cell) <- lookup *c1
   create-child c2
diff --git a/prototypes/tile/8.mu b/prototypes/tile/8.mu
index c64a1577..526df803 100644
--- a/prototypes/tile/8.mu
+++ b/prototypes/tile/8.mu
@@ -62,7 +62,7 @@ fn interactive -> exit-status/ebx: int {
 $main:loop: {
     # process key
     {
-      var c/eax: byte <- read-key
+      var c/eax: grapheme <- read-key-from-real-keyboard
       compare c, 4  # ctrl-d
       break-if-= $main:loop
       process c, root, cursor
@@ -81,7 +81,7 @@ $main:loop: {
 # Tree mutations
 #######################################################
 
-fn process c: byte, root: (addr handle cell), cursor: (addr handle cell) {
+fn process c: grapheme, root: (addr handle cell), cursor: (addr handle cell) {
   var c1/ecx: (addr handle cell) <- copy cursor
   var c2/eax: (addr cell) <- lookup *c1
   create-child c2
diff --git a/prototypes/tile/9.mu b/prototypes/tile/9.mu
index 69360b2e..ab143e25 100644
--- a/prototypes/tile/9.mu
+++ b/prototypes/tile/9.mu
@@ -60,14 +60,15 @@ fn interactive -> exit-status/ebx: int {
 $main:loop: {
     # process key
     {
-      var c/eax: byte <- read-key
+      var c/eax: grapheme <- read-key-from-real-keyboard
       compare c, 4  # ctrl-d
       break-if-= $main:loop
       process c, root, cursor
     }
     # render tree
-    root-addr <- lookup root-handle
-    cursor-addr <- lookup *cursor
+    var _root-addr/eax: (addr cell) <- lookup root-handle
+    root-addr <- copy _root-addr
+    var cursor-addr/eax: (addr cell) <- lookup *cursor
     render root-addr, cursor-addr
     loop
   }
@@ -80,7 +81,7 @@ $main:loop: {
 # Tree mutations
 #######################################################
 
-fn process c: byte, root: (addr handle cell), cursor: (addr handle cell) {
+fn process c: grapheme, root: (addr handle cell), cursor: (addr handle cell) {
 $process:body: {
   # if c == 'h' move cursor to its parent if possible
   {