about summary refs log tree commit diff stats
path: root/baremetal
diff options
context:
space:
mode:
Diffstat (limited to 'baremetal')
-rw-r--r--baremetal/shell/main.mu12
-rw-r--r--baremetal/shell/sandbox.mu14
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
 }