about summary refs log tree commit diff stats
path: root/baremetal/shell/sandbox.mu
diff options
context:
space:
mode:
authorKartik K. Agaram <vc@akkartik.com>2021-02-20 22:37:44 -0800
committerKartik K. Agaram <vc@akkartik.com>2021-02-20 22:37:44 -0800
commit684c09620304457825981eaaaf7af8af2dc64d15 (patch)
treea89c5527329184811b429313fd7641b2e1a9f8b9 /baremetal/shell/sandbox.mu
parentc7c8eb0cb46bf7ec7f825bfd040fc94e8ddd4e83 (diff)
downloadmu-684c09620304457825981eaaaf7af8af2dc64d15.tar.gz
7761 - baremetal/shell: read input from keyboard
Diffstat (limited to 'baremetal/shell/sandbox.mu')
-rw-r--r--baremetal/shell/sandbox.mu47
1 files changed, 47 insertions, 0 deletions
diff --git a/baremetal/shell/sandbox.mu b/baremetal/shell/sandbox.mu
new file mode 100644
index 00000000..e360b9e6
--- /dev/null
+++ b/baremetal/shell/sandbox.mu
@@ -0,0 +1,47 @@
+type sandbox {
+  data: (handle gap-buffer)
+}
+
+fn initialize-sandbox _self: (addr sandbox) {
+  var self/esi: (addr sandbox) <- copy _self
+  var data-ah/eax: (addr handle gap-buffer) <- get self, data
+  allocate data-ah
+  var data/eax: (addr gap-buffer) <- lookup *data-ah
+  initialize-gap-buffer data, 0x1000/4KB
+}
+
+## some helpers for tests
+
+fn initialize-sandbox-with _self: (addr sandbox), s: (addr array byte) {
+  var self/esi: (addr sandbox) <- copy _self
+  var data-ah/eax: (addr handle gap-buffer) <- get self, data
+  allocate data-ah
+  var data/eax: (addr gap-buffer) <- lookup *data-ah
+  initialize-gap-buffer-with data, s
+}
+
+fn allocate-sandbox-with _out: (addr handle sandbox), s: (addr array byte) {
+  var out/eax: (addr handle sandbox) <- copy _out
+  allocate out
+  var out-addr/eax: (addr sandbox) <- lookup *out
+  initialize-sandbox-with out-addr, s
+}
+
+fn add-grapheme-to-sandbox _self: (addr sandbox), c: grapheme {
+  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
+  add-grapheme-at-gap data, c
+}
+
+fn render-sandbox screen: (addr screen), _self: (addr sandbox), x: int, y: int {
+  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
+  var dummy/eax: int <- render-gap-buffer screen, data, x, y, 1/true
+}
+
+fn edit-sandbox self: (addr sandbox), key: byte {
+  var g/edx: grapheme <- copy key
+  add-grapheme-to-sandbox self, g
+}