mu/apps/tile/main.mu

79 lines
2.1 KiB
Forth
Raw Normal View History

2020-09-16 16:26:38 +00:00
fn main args-on-stack: (addr array addr array byte) -> exit-status/ebx: int {
var args/eax: (addr array addr array byte) <- copy args-on-stack
var len/ecx: int <- length args
$main-body: {
# if no args, run in interactive mode
compare len, 1
{
break-if->
exit-status <- interactive args-on-stack
break $main-body
}
# else if single arg is 'test', run tests
compare len, 2
{
break-if-!=
var tmp/ecx: (addr addr array byte) <- index args, 1
var tmp2/eax: boolean <- string-equal? *tmp, "test"
compare tmp2, 0
{
break-if-=
run-tests
exit-status <- copy 0 # TODO: get at Num-test-failures somehow
break $main-body
}
}
# otherwise error message
print-string-to-real-screen "usage: tile\n"
print-string-to-real-screen " or tile test\n"
exit-status <- copy 1
}
}
fn interactive args: (addr array addr array byte) -> exit-status/ebx: int {
enable-screen-grid-mode
enable-keyboard-immediate-mode
var buf-storage: gap-buffer
var buf/esi: (addr gap-buffer) <- address buf-storage
initialize-gap-buffer buf
#
{
render 0, buf
var key/eax: byte <- read-key-from-real-keyboard
compare key, 0x71 # 'q'
break-if-=
var g/ecx: grapheme <- copy key
add-grapheme buf, g
loop
}
enable-keyboard-type-mode
enable-screen-type-mode
exit-status <- copy 0
}
fn render screen: (addr screen), buf: (addr gap-buffer) {
clear-screen screen
var nrows/eax: int <- copy 0
var ncols/ecx: int <- copy 0
nrows, ncols <- screen-size screen
var midcol/edx: int <- copy ncols
midcol <- shift-right 1
draw-vertical-line screen, 1, nrows, midcol
var midrow/ebx: int <- copy 0
{
var tmp/eax: int <- try-divide nrows, 3
midrow <- copy tmp
}
var left-col/edx: int <- copy midcol
left-col <- increment
draw-horizontal-line screen, midrow, left-col, ncols
# initialize cursor
var start-row/ebx: int <- copy midrow
start-row <- subtract 3
var start-col/edx: int <- copy left-col
start-col <- increment
move-cursor screen, start-row, start-col
#
render-gap-buffer screen, buf
}