about summary refs log tree commit diff stats
path: root/baremetal/shell
diff options
context:
space:
mode:
authorKartik K. Agaram <vc@akkartik.com>2021-02-22 23:59:35 -0800
committerKartik K. Agaram <vc@akkartik.com>2021-02-22 23:59:35 -0800
commit2812e206085e8de6e40d1af1fa2e41bb57a58021 (patch)
tree2c5b7f62e36fb6bd03236fc241d1c59aa0c1bf22 /baremetal/shell
parent9a96662dff9ec495442276ee1f40fea43183245b (diff)
downloadmu-2812e206085e8de6e40d1af1fa2e41bb57a58021.tar.gz
7793 - baremetal/shell: menu
Diffstat (limited to 'baremetal/shell')
-rw-r--r--baremetal/shell/gap-buffer.mu6
-rw-r--r--baremetal/shell/main.mu5
-rw-r--r--baremetal/shell/sandbox.mu130
3 files changed, 93 insertions, 48 deletions
diff --git a/baremetal/shell/gap-buffer.mu b/baremetal/shell/gap-buffer.mu
index 7fd961b2..0f389873 100644
--- a/baremetal/shell/gap-buffer.mu
+++ b/baremetal/shell/gap-buffer.mu
@@ -80,12 +80,12 @@ fn emit-stack-from-top _self: (addr grapheme-stack), out: (addr stream byte) {
 
 # We implicitly render everything editable in a single color, and assume the
 # cursor is a single other color.
-fn render-gap-buffer-wrapping-right-then-down screen: (addr screen), _gap: (addr gap-buffer), xmin: int, ymin: int, xmax: int, ymax: int, x: int, y: int, render-cursor?: boolean -> _/eax: int, _/ecx: int {
+fn render-gap-buffer-wrapping-right-then-down screen: (addr screen), _gap: (addr gap-buffer), xmin: int, ymin: int, xmax: int, ymax: int, render-cursor?: boolean -> _/eax: int, _/ecx: int {
   var gap/esi: (addr gap-buffer) <- copy _gap
   var left/edx: (addr grapheme-stack) <- get gap, left
   var x2/eax: int <- copy 0
   var y2/ecx: int <- copy 0
-  x2, y2 <- render-stack-from-bottom-wrapping-right-then-down screen, left, xmin, ymin, xmax, ymax, x, y
+  x2, y2 <- render-stack-from-bottom-wrapping-right-then-down screen, left, xmin, ymin, xmax, ymax, xmin, ymin
   var right/edx: (addr grapheme-stack) <- get gap, right
   x2, y2 <- render-stack-from-top-wrapping-right-then-down screen, right, xmin, ymin, xmax, ymax, x2, y2, render-cursor?
   # decide whether we still need to print a cursor
@@ -113,7 +113,7 @@ fn render-gap-buffer screen: (addr screen), gap: (addr gap-buffer), x: int, y: i
   var height/ebx: int <- copy _height
   var x2/eax: int <- copy 0
   var y2/ecx: int <- copy 0
-  x2, y2 <- render-gap-buffer-wrapping-right-then-down screen, gap, x, y, width, height, x, y, render-cursor?
+  x2, y2 <- render-gap-buffer-wrapping-right-then-down screen, gap, x, y, width, height, render-cursor?
   return x2  # y2? yolo
 }
 
diff --git a/baremetal/shell/main.mu b/baremetal/shell/main.mu
index 262b9829..eb437b67 100644
--- a/baremetal/shell/main.mu
+++ b/baremetal/shell/main.mu
@@ -5,8 +5,11 @@ fn main {
   var sandbox-storage: sandbox
   var sandbox/esi: (addr sandbox) <- address sandbox-storage
   initialize-sandbox sandbox
+  var width/eax: int <- copy 0
+  var height/ecx: int <- copy 0
+  width, height <- screen-size 0/screen
   {
-    render-sandbox 0/screen, sandbox, 2/x, 2/y
+    render-sandbox 0/screen, sandbox, 2/x, 2/y, width, height
     {
       var key/eax: byte <- read-key 0/keyboard
       compare key, 0
diff --git a/baremetal/shell/sandbox.mu b/baremetal/shell/sandbox.mu
index f67a7c0b..b69ac54a 100644
--- a/baremetal/shell/sandbox.mu
+++ b/baremetal/shell/sandbox.mu
@@ -38,15 +38,15 @@ fn allocate-sandbox-with _out: (addr handle sandbox), s: (addr array byte) {
 
 ##
 
-fn render-sandbox screen: (addr screen), _self: (addr sandbox), _x: int, _y: int {
+fn render-sandbox screen: (addr screen), _self: (addr sandbox), xmin: int, ymin: int, xmax: int, ymax: int {
   clear-screen screen
   var self/esi: (addr sandbox) <- copy _self
   # data
   var data-ah/eax: (addr handle gap-buffer) <- get self, data
   var _data/eax: (addr gap-buffer) <- lookup *data-ah
   var data/edx: (addr gap-buffer) <- copy _data
-  var x/eax: int <- copy _x
-  var y/ecx: int <- copy _y
+  var x/eax: int <- copy xmin
+  var y/ecx: int <- copy ymin
   var cursor-in-sandbox?/ebx: boolean <- copy 0/false
   {
     var cursor-in-trace?/eax: (addr boolean) <- get self, cursor-in-trace?
@@ -54,28 +54,70 @@ fn render-sandbox screen: (addr screen), _self: (addr sandbox), _x: int, _y: int
     break-if-!=
     cursor-in-sandbox? <- copy 1/true
   }
-  x, y <- render-gap-buffer-wrapping-right-then-down screen, data, x, y, 0x20/xmax, 0x20/ymax, x, y, cursor-in-sandbox?
+  x, y <- render-gap-buffer-wrapping-right-then-down screen, data, x, y, xmax, ymax, cursor-in-sandbox?
   y <- increment
   # trace
   var trace-ah/eax: (addr handle trace) <- get self, trace
   var _trace/eax: (addr trace) <- lookup *trace-ah
   var trace/edx: (addr trace) <- copy _trace
   var cursor-in-trace?/eax: (addr boolean) <- get self, cursor-in-trace?
-  y <- render-trace screen, trace, _x, y, 0x20/xmax, 0x20/ymax, *cursor-in-trace?
+  y <- render-trace screen, trace, xmin, y, xmax, ymax, *cursor-in-trace?
   # value
-  var value-ah/eax: (addr handle stream byte) <- get self, value
-  var _value/eax: (addr stream byte) <- lookup *value-ah
-  var value/esi: (addr stream byte) <- copy _value
-  var done?/eax: boolean <- stream-empty? value
-  compare done?, 0/false
+  $render-sandbox:value: {
+    var value-ah/eax: (addr handle stream byte) <- get self, value
+    var _value/eax: (addr stream byte) <- lookup *value-ah
+    var value/esi: (addr stream byte) <- copy _value
+    var done?/eax: boolean <- stream-empty? value
+    compare done?, 0/false
+    break-if-!=
+    var x/eax: int <- copy 0
+    x, y <- draw-text-wrapping-right-then-down screen, "=> ", xmin, y, xmax, ymax, xmin, y, 7/fg, 0/bg
+    var x2/edx: int <- copy x
+    var dummy/eax: int <- draw-stream-rightward screen, value, x2, xmax, y, 7/fg=grey, 0/bg
+  }
+  # render menu
+  var cursor-in-trace?/eax: (addr boolean) <- get self, cursor-in-trace?
+  compare *cursor-in-trace?, 0/false
   {
     break-if-=
+    render-trace-menu screen
     return
   }
-  var x/eax: int <- copy 0
-  x, y <- draw-text-wrapping-right-then-down screen, "=> ", _x, y, 0x20/xmax, 0x20/ymax, _x, y, 7/fg, 0/bg
-  var x2/edx: int <- copy x
-  var dummy/eax: int <- draw-stream-rightward screen, value, x2, 0x30/xmax, y, 7/fg=grey, 0/bg
+  render-sandbox-menu screen
+}
+
+fn render-sandbox-menu screen: (addr screen) {
+  var width/eax: int <- copy 0
+  var height/ecx: int <- copy 0
+  width, height <- screen-size screen
+  var y/ecx: int <- copy height
+  y <- decrement
+  set-cursor-position screen, 0/x, y
+  draw-text-rightward-from-cursor screen, " ctrl-s ", width, 0/fg, 7/bg=grey
+  draw-text-rightward-from-cursor screen, " run sandbox  ", width, 7/fg, 0/bg
+  draw-text-rightward-from-cursor screen, " ctrl-d ", width, 0/fg, 7/bg=grey
+  draw-text-rightward-from-cursor screen, " cursor down  ", width, 7/fg, 0/bg
+  draw-text-rightward-from-cursor screen, " ctrl-u ", width, 0/fg, 7/bg=grey
+  draw-text-rightward-from-cursor screen, " cursor up  ", width, 7/fg, 0/bg
+  draw-text-rightward-from-cursor screen, " tab ", width, 0/fg, 9/bg=blue
+  draw-text-rightward-from-cursor screen, " move to trace  ", width, 7/fg, 0/bg
+}
+
+fn render-trace-menu screen: (addr screen) {
+  var width/eax: int <- copy 0
+  var height/ecx: int <- copy 0
+  width, height <- screen-size screen
+  var y/ecx: int <- copy height
+  y <- decrement
+  set-cursor-position screen, 0/x, y
+  draw-text-rightward-from-cursor screen, " ctrl-s ", width, 0/fg, 7/bg=grey
+  draw-text-rightward-from-cursor screen, " run sandbox  ", width, 7/fg, 0/bg
+  draw-text-rightward-from-cursor screen, " ctrl-d ", width, 0/fg, 7/bg=grey
+  draw-text-rightward-from-cursor screen, " cursor down  ", width, 7/fg, 0/bg
+  draw-text-rightward-from-cursor screen, " ctrl-u ", width, 0/fg, 7/bg=grey
+  draw-text-rightward-from-cursor screen, " cursor up  ", width, 7/fg, 0/bg
+  draw-text-rightward-from-cursor screen, " tab ", width, 0/fg, 3/bg=cyan
+  draw-text-rightward-from-cursor screen, " move to sandbox  ", width, 7/fg, 0/bg
 }
 
 fn edit-sandbox _self: (addr sandbox), key: byte {
@@ -109,28 +151,18 @@ fn edit-sandbox _self: (addr sandbox), key: byte {
   # arrow keys
   var cursor-in-trace?/eax: (addr boolean) <- get self, cursor-in-trace?
   {
-    compare g, 0x4/ctrl-d
+    compare g, 9/tab
     break-if-!=
-    # ctrl-d: cursor down (into trace if it makes sense)
-    # if cursor in input, check if we need to switch to trace
+    # if cursor in input, switch to trace
     {
       compare *cursor-in-trace?, 0/false
       break-if-!=
-      var data-ah/eax: (addr handle gap-buffer) <- get self, data
-      var data/eax: (addr gap-buffer) <- lookup *data-ah
-      var at-bottom?/eax: boolean <- cursor-on-final-line? data
-      compare at-bottom?, 0/false
-      break-if-=
-      var cursor-in-trace?/eax: (addr boolean) <- get self, cursor-in-trace?
       copy-to *cursor-in-trace?, 1/true
       return
     }
-  }
-  {
-    compare g, 0x15/ctrl-u
-    break-if-!=
-    # ctrl-u: cursor up
-    # if cursor in trace, check if we need to switch to trace
+    # if cursor in trace, switch to input
+    copy-to *cursor-in-trace?, 0/false
+    return
   }
   # if cursor in trace, send cursor to trace
   {
@@ -173,9 +205,9 @@ fn test-run-integer {
   # setup: screen
   var screen-on-stack: screen
   var screen/edi: (addr screen) <- address screen-on-stack
-  initialize-screen screen, 0xa, 4
+  initialize-screen screen, 0x80/width, 0x10/height
   #
-  render-sandbox screen, sandbox, 0/x, 0/y
+  render-sandbox screen, sandbox, 0/x, 0/y, 0x80/width, 0x10/height
   check-screen-row screen, 0/y, "1    ", "F - test-run-integer/0"
   check-screen-row screen, 1/y, "...  ", "F - test-run-integer/1"
   check-screen-row screen, 2/y, "=> 1 ", "F - test-run-integer/2"
@@ -193,9 +225,9 @@ fn test-run-error-invalid-integer {
   # setup: screen
   var screen-on-stack: screen
   var screen/edi: (addr screen) <- address screen-on-stack
-  initialize-screen screen, 0x10, 4
+  initialize-screen screen, 0x80/width, 0x10/height
   #
-  render-sandbox screen, sandbox, 0/x, 0/y
+  render-sandbox screen, sandbox, 0/x, 0/y, 0x80/width, 0x10/height
   check-screen-row screen, 0/y, "1a             ", "F - test-run-error-invalid-integer/0"
   check-screen-row screen, 1/y, "...            ", "F - test-run-error-invalid-integer/0"
   check-screen-row screen, 2/y, "invalid number ", "F - test-run-error-invalid-integer/2"
@@ -213,23 +245,33 @@ fn test-run-move-cursor-into-trace {
   # setup: screen
   var screen-on-stack: screen
   var screen/edi: (addr screen) <- address screen-on-stack
-  initialize-screen screen, 0x10, 8
+  initialize-screen screen, 0x80/width, 0x10/height
   #
-  render-sandbox screen, sandbox, 0/x, 0/y
+  render-sandbox screen, sandbox, 0/x, 0/y, 0x80/width, 0x10/height
   check-screen-row screen,                                  0/y, "12    ", "F - test-run-move-cursor-into-trace/pre-0"
   check-background-color-in-screen-row screen, 7/bg=cursor, 0/y, "  |   ", "F - test-run-move-cursor-into-trace/pre-0/cursor"
   check-screen-row screen,                                  1/y, "...   ", "F - test-run-move-cursor-into-trace/pre-1"
   check-background-color-in-screen-row screen, 7/bg=cursor, 1/y, "      ", "F - test-run-move-cursor-into-trace/pre-1/cursor"
   check-screen-row screen,                                  2/y, "=> 12 ", "F - test-run-move-cursor-into-trace/pre-2"
   check-background-color-in-screen-row screen, 7/bg=cursor, 2/y, "      ", "F - test-run-move-cursor-into-trace/pre-2/cursor"
-  # move cursor down
-  edit-sandbox sandbox, 4/ctrl-d
+  # move cursor into trace
+  edit-sandbox sandbox, 9/tab
+  #
+  render-sandbox screen, sandbox, 0/x, 0/y, 0x80/width, 0x10/height
+  check-screen-row screen,                                  0/y, "12    ", "F - test-run-move-cursor-into-trace/trace-0"
+  check-background-color-in-screen-row screen, 7/bg=cursor, 0/y, "      ", "F - test-run-move-cursor-into-trace/trace-0/cursor"
+  check-screen-row screen,                                  1/y, "...   ", "F - test-run-move-cursor-into-trace/trace-1"
+  check-background-color-in-screen-row screen, 7/bg=cursor, 1/y, "|||   ", "F - test-run-move-cursor-into-trace/trace-1/cursor"
+  check-screen-row screen,                                  2/y, "      ", "F - test-run-move-cursor-into-trace/trace-2"
+  check-background-color-in-screen-row screen, 7/bg=cursor, 2/y, "      ", "F - test-run-move-cursor-into-trace/trace-2/cursor"
+  # move cursor into input
+  edit-sandbox sandbox, 9/tab
   #
-  render-sandbox screen, sandbox, 0/x, 0/y
-  check-screen-row screen,                                  0/y, "12    ", "F - test-run-move-cursor-into-trace/0"
-  check-background-color-in-screen-row screen, 7/bg=cursor, 0/y, "      ", "F - test-run-move-cursor-into-trace/0/cursor"
-  check-screen-row screen,                                  1/y, "...   ", "F - test-run-move-cursor-into-trace/1"
-  check-background-color-in-screen-row screen, 7/bg=cursor, 1/y, "|||   ", "F - test-run-move-cursor-into-trace/1/cursor"
-  check-screen-row screen,                                  2/y, "      ", "F - test-run-move-cursor-into-trace/2"
-  check-background-color-in-screen-row screen, 7/bg=cursor, 2/y, "      ", "F - test-run-move-cursor-into-trace/2/cursor"
+  render-sandbox screen, sandbox, 0/x, 0/y, 0x80/width, 0x10/height
+  check-screen-row screen,                                  0/y, "12    ", "F - test-run-move-cursor-into-trace/input-0"
+  check-background-color-in-screen-row screen, 7/bg=cursor, 0/y, "  |   ", "F - test-run-move-cursor-into-trace/input-0/cursor"
+  check-screen-row screen,                                  1/y, "...   ", "F - test-run-move-cursor-into-trace/input-1"
+  check-background-color-in-screen-row screen, 7/bg=cursor, 1/y, "      ", "F - test-run-move-cursor-into-trace/input-1/cursor"
+  check-screen-row screen,                                  2/y, "      ", "F - test-run-move-cursor-into-trace/input-2"
+  check-background-color-in-screen-row screen, 7/bg=cursor, 2/y, "      ", "F - test-run-move-cursor-into-trace/input-2/cursor"
 }