diff options
Diffstat (limited to 'baremetal')
-rw-r--r-- | baremetal/shell/main.mu | 12 | ||||
-rw-r--r-- | baremetal/shell/sandbox.mu | 14 |
2 files changed, 21 insertions, 5 deletions
diff --git a/baremetal/shell/main.mu b/baremetal/shell/main.mu index ee2dda60..262b9829 100644 --- a/baremetal/shell/main.mu +++ b/baremetal/shell/main.mu @@ -7,11 +7,13 @@ fn main { initialize-sandbox sandbox { render-sandbox 0/screen, sandbox, 2/x, 2/y - var key/eax: byte <- read-key 0/keyboard - compare key, 0 - loop-if-= - # no way to quit right now; just reboot - edit-sandbox sandbox, key + { + var key/eax: byte <- read-key 0/keyboard + compare key, 0 + loop-if-= + # no way to quit right now; just reboot + edit-sandbox sandbox, key + } loop } } diff --git a/baremetal/shell/sandbox.mu b/baremetal/shell/sandbox.mu index e360b9e6..4ca1082c 100644 --- a/baremetal/shell/sandbox.mu +++ b/baremetal/shell/sandbox.mu @@ -34,7 +34,15 @@ fn add-grapheme-to-sandbox _self: (addr sandbox), c: grapheme { add-grapheme-at-gap data, c } +fn delete-grapheme-before-cursor _self: (addr sandbox) { + var self/esi: (addr sandbox) <- copy _self + var data-ah/eax: (addr handle gap-buffer) <- get self, data + var data/eax: (addr gap-buffer) <- lookup *data-ah + delete-before-gap data +} + fn render-sandbox screen: (addr screen), _self: (addr sandbox), x: int, y: int { + clear-screen screen var self/esi: (addr sandbox) <- copy _self var data-ah/eax: (addr handle gap-buffer) <- get self, data var data/eax: (addr gap-buffer) <- lookup *data-ah @@ -43,5 +51,11 @@ fn render-sandbox screen: (addr screen), _self: (addr sandbox), x: int, y: int { fn edit-sandbox self: (addr sandbox), key: byte { var g/edx: grapheme <- copy key + { + compare g, 8/backspace + break-if-!= + delete-grapheme-before-cursor self + return + } add-grapheme-to-sandbox self, g } |