diff options
37 files changed, 61 insertions, 53 deletions
diff --git a/305keyboard.subx b/305keyboard.subx index 7c9ce065..35a200b3 100644 --- a/305keyboard.subx +++ b/305keyboard.subx @@ -119,15 +119,22 @@ $enable-keyboard-type-mode:end: 5d/pop-to-ebp c3/return -read-key-from-real-keyboard: # -> result/eax: byte +# read keys or escapes up to 4 bytes +# +# fun fact: terminal escapes and graphemes in utf-8 don't conflict! +# - in graphemes all but the first/lowest byte will have a 1 in the MSB (be +# greater than 0x7f) +# - in escapes every byte will have a 0 in the MSB +# the two categories overlap only when the first/lowest byte is 0x1b or 'esc' +read-key-from-real-keyboard: # -> result/eax: grapheme # . prologue 55/push-ebp 89/<- %ebp 4/r32/esp # . save registers 51/push-ecx - # var buf/ecx: (stream byte 1) + # var buf/ecx: (stream byte 4) 68/push 0/imm32/data - 68/push 1/imm32/size # 3 bytes of data unused + 68/push 4/imm32/size 68/push 0/imm32/read 68/push 0/imm32/write 89/<- %ecx 4/r32/esp diff --git a/400.mu b/400.mu index 7b32f3cb..b97d149a 100644 --- a/400.mu +++ b/400.mu @@ -161,7 +161,7 @@ sig hide-cursor-on-real-screen sig show-cursor-on-real-screen sig enable-keyboard-immediate-mode sig enable-keyboard-type-mode -sig read-key-from-real-keyboard -> result/eax: byte +sig read-key-from-real-keyboard -> result/eax: grapheme sig read-line-from-real-keyboard in: (addr stream byte) sig open filename: (addr array byte), write?: boolean, out: (addr handle buffered-file) sig populate-buffered-file-containing contents: (addr array byte), out: (addr handle buffered-file) 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 { |