about summary refs log tree commit diff stats
diff options
context:
space:
mode:
-rw-r--r--prototypes/tile/5.mu111
1 files changed, 111 insertions, 0 deletions
diff --git a/prototypes/tile/5.mu b/prototypes/tile/5.mu
new file mode 100644
index 00000000..a41589cb
--- /dev/null
+++ b/prototypes/tile/5.mu
@@ -0,0 +1,111 @@
+type cell {
+  val: int  # single chars only for now
+  parent: (handle cell)
+  first-child: (handle cell)
+  next-sibling: (handle cell)
+  prev-sibling: (handle cell)
+}
+
+fn main -> exit-status/ebx: int {
+  var root-handle: (handle cell)
+  var root/esi: (addr handle cell) <- address root-handle
+  allocate root
+  var cursor/edi: (addr handle cell) <- copy root
+  enable-keyboard-immediate-mode
+  var root-addr/eax: (addr cell) <- lookup *root
+  render root-addr
+$main:loop: {
+    # process key
+    {
+      var c/eax: byte <- read-key
+      compare c, 4  # ctrl-d
+      break-if-= $main:loop
+      process c, root, cursor
+    }
+    # render tree
+    root-addr <- lookup root-handle
+    render root-addr
+    loop
+  }
+  clear-screen
+  enable-keyboard-type-mode
+  exit-status <- copy 0
+}
+
+#######################################################
+# Tree mutations
+#######################################################
+
+fn process c: byte, root: (addr handle cell), cursor: (addr handle cell) {
+  create-child cursor
+}
+
+fn create-child cursor: (addr handle cell) {
+  
+}
+
+#######################################################
+# Tree drawing
+#######################################################
+
+fn render root: (addr cell) {
+  clear-screen
+  var depth/eax: int <- tree-depth root
+  draw-box 5, 5, 0x23, 0x23  # 35, 35
+  move-cursor-on-screen 0x10, 0x10
+  print-int32-hex-to-screen depth
+}
+
+fn tree-depth node-on-stack: (addr cell) -> result/eax: int {
+  var tmp-result/edi: int <- copy 0
+  var node/eax: (addr cell) <- copy node-on-stack
+  var child/ecx: (addr handle cell) <- get node, first-child
+  var child-addr/eax: (addr cell) <- lookup *child
+  {
+    compare child-addr, 0
+    break-if-=
+    {
+      var tmp/eax: int <- tree-depth child-addr
+      compare tmp, tmp-result
+      break-if-<=
+      tmp-result <- copy tmp
+    }
+    child <- get child-addr, next-sibling
+    child-addr <- lookup *child
+    loop
+  }
+  result <- copy tmp-result
+  result <- increment
+}
+
+fn draw-box row1: int, col1: int, row2: int, col2: int {
+  clear-screen
+  draw-horizontal-line row1, col1, col2
+  draw-vertical-line row1, row2, col1
+  draw-horizontal-line row2, col1, col2
+  draw-vertical-line row1, row2, col2
+}
+
+fn draw-horizontal-line row: int, col1: int, col2: int {
+  var col/eax: int <- copy col1
+  move-cursor-on-screen row, col
+  {
+    compare col, col2
+    break-if->=
+    print-string-to-screen "-"
+    col <- increment
+    loop
+  }
+}
+
+fn draw-vertical-line row1: int, row2: int, col: int {
+  var row/eax: int <- copy row1
+  {
+    compare row, row2
+    break-if->=
+    move-cursor-on-screen row, col
+    print-string-to-screen "|"
+    row <- increment
+    loop
+  }
+}