diff options
Diffstat (limited to 'prototypes/tile/5.mu')
-rw-r--r-- | prototypes/tile/5.mu | 111 |
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 + } +} |