2020-11-03 03:50:34 +00:00
|
|
|
fn main args-on-stack: (addr array addr array byte) -> _/ebx: int {
|
2020-09-16 16:26:38 +00:00
|
|
|
var args/eax: (addr array addr array byte) <- copy args-on-stack
|
|
|
|
var len/ecx: int <- length args
|
2020-11-03 23:42:58 +00:00
|
|
|
compare len, 2
|
|
|
|
{
|
|
|
|
break-if-!=
|
|
|
|
# if single arg is 'test', run tests
|
|
|
|
var tmp/ecx: (addr addr array byte) <- index args, 1
|
|
|
|
var tmp2/eax: boolean <- string-equal? *tmp, "test"
|
|
|
|
compare tmp2, 0 # false
|
|
|
|
{
|
|
|
|
break-if-=
|
|
|
|
run-tests
|
|
|
|
return 0 # TODO: get at Num-test-failures somehow
|
|
|
|
}
|
|
|
|
# if single arg is 'screen', run in full-screen mode
|
|
|
|
tmp2 <- string-equal? *tmp, "screen"
|
|
|
|
compare tmp2, 0 # false
|
|
|
|
{
|
|
|
|
break-if-=
|
|
|
|
interactive
|
|
|
|
return 0
|
|
|
|
}
|
|
|
|
# if single arg is 'type', run in typewriter mode
|
|
|
|
tmp2 <- string-equal? *tmp, "type"
|
|
|
|
compare tmp2, 0 # false
|
|
|
|
{
|
|
|
|
break-if-=
|
|
|
|
repl
|
|
|
|
return 0
|
|
|
|
}
|
|
|
|
# if single arg is 'test' ...
|
|
|
|
tmp2 <- string-equal? *tmp, "test2"
|
|
|
|
compare tmp2, 0 # false
|
2020-09-16 16:26:38 +00:00
|
|
|
{
|
2020-11-03 23:42:58 +00:00
|
|
|
break-if-=
|
|
|
|
test
|
|
|
|
return 0
|
2020-09-16 16:26:38 +00:00
|
|
|
}
|
|
|
|
}
|
2020-11-03 23:42:58 +00:00
|
|
|
# otherwise error message
|
|
|
|
print-string-to-real-screen "usage:\n"
|
|
|
|
print-string-to-real-screen " to run tests: tile test\n"
|
|
|
|
print-string-to-real-screen " full-screen mode: tile screen\n"
|
|
|
|
print-string-to-real-screen " regular REPL: tile type\n"
|
|
|
|
return 1
|
2020-09-16 16:26:38 +00:00
|
|
|
}
|
|
|
|
|
2020-09-27 02:15:04 +00:00
|
|
|
fn interactive {
|
2020-09-16 22:37:35 +00:00
|
|
|
enable-screen-grid-mode
|
|
|
|
enable-keyboard-immediate-mode
|
2020-09-17 06:46:25 +00:00
|
|
|
var env-storage: environment
|
|
|
|
var env/esi: (addr environment) <- address env-storage
|
|
|
|
initialize-environment env
|
2020-09-27 02:15:04 +00:00
|
|
|
draw-screen env
|
|
|
|
{
|
|
|
|
var key/eax: grapheme <- read-key-from-real-keyboard
|
2020-10-12 17:07:55 +00:00
|
|
|
compare key, 0x11 # 'ctrl-q'
|
2020-09-27 02:15:04 +00:00
|
|
|
break-if-=
|
|
|
|
process env, key
|
|
|
|
render env
|
|
|
|
loop
|
|
|
|
}
|
2020-09-16 22:37:35 +00:00
|
|
|
enable-keyboard-type-mode
|
|
|
|
enable-screen-type-mode
|
|
|
|
}
|
|
|
|
|
2020-10-10 04:25:32 +00:00
|
|
|
fn test {
|
2020-11-08 03:45:58 +00:00
|
|
|
var env-storage: environment
|
|
|
|
var env/esi: (addr environment) <- address env-storage
|
|
|
|
initialize-environment-with-fake-screen env, 0x20, 0xa0
|
|
|
|
process-all env, "3 3 fake-screen =s"
|
|
|
|
process env, 0xc # ctrl-l
|
2020-11-10 05:16:09 +00:00
|
|
|
process-all env, "s 1 down 1 right"
|
|
|
|
process env, 4 # ctrl-d: start defining function
|
|
|
|
process-all env, "foo"
|
|
|
|
process env, 0xa # newline: define function
|
|
|
|
process env, 0x435b1b # right-arrow
|
|
|
|
#? process env, 5 # ctrl-e: end of line
|
2020-11-12 06:58:29 +00:00
|
|
|
print-string 0, "==\n"
|
2020-11-10 05:16:09 +00:00
|
|
|
process env, 0xa # newline: expand
|
2020-11-08 03:45:58 +00:00
|
|
|
render env
|
|
|
|
}
|
|
|
|
|
|
|
|
fn process-all env: (addr environment), cmds: (addr array byte) {
|
|
|
|
var cmds-stream: (stream byte 0x100)
|
|
|
|
var cmds-stream-a/esi: (addr stream byte) <- address cmds-stream
|
|
|
|
write cmds-stream-a, cmds
|
|
|
|
{
|
|
|
|
var done?/eax: boolean <- stream-empty? cmds-stream-a
|
|
|
|
compare done?, 0 # false
|
|
|
|
break-if-!=
|
|
|
|
var g/eax: grapheme <- read-grapheme cmds-stream-a
|
|
|
|
process env, g
|
|
|
|
loop
|
|
|
|
}
|
2020-10-10 04:25:32 +00:00
|
|
|
}
|
|
|
|
|
2020-09-27 02:15:04 +00:00
|
|
|
fn repl {
|
2020-10-06 04:09:42 +00:00
|
|
|
{
|
|
|
|
# prompt
|
|
|
|
print-string-to-real-screen "> "
|
|
|
|
# read
|
2020-11-02 06:07:40 +00:00
|
|
|
var line-storage: (stream byte 0x100)
|
|
|
|
var line/ecx: (addr stream byte) <- address line-storage
|
2020-10-06 04:09:42 +00:00
|
|
|
clear-stream line
|
|
|
|
read-line-from-real-keyboard line
|
|
|
|
var done?/eax: boolean <- stream-empty? line
|
|
|
|
compare done?, 0 # false
|
|
|
|
break-if-!=
|
|
|
|
# parse
|
|
|
|
var env-storage: environment
|
|
|
|
var env/esi: (addr environment) <- address env-storage
|
|
|
|
initialize-environment env
|
2020-09-27 02:15:04 +00:00
|
|
|
{
|
2020-10-06 04:09:42 +00:00
|
|
|
var done?/eax: boolean <- stream-empty? line
|
|
|
|
compare done?, 0 # false
|
2020-09-27 02:15:04 +00:00
|
|
|
break-if-!=
|
2020-10-06 04:09:42 +00:00
|
|
|
var g/eax: grapheme <- read-grapheme line
|
|
|
|
process env, g
|
|
|
|
loop
|
2020-09-27 02:15:04 +00:00
|
|
|
}
|
2020-10-06 04:09:42 +00:00
|
|
|
# eval
|
|
|
|
var stack-storage: value-stack
|
|
|
|
var stack/edi: (addr value-stack) <- address stack-storage
|
|
|
|
initialize-value-stack stack, 0x10
|
|
|
|
evaluate-environment env, stack
|
|
|
|
# print
|
|
|
|
var empty?/eax: boolean <- value-stack-empty? stack
|
|
|
|
{
|
|
|
|
compare empty?, 0 # false
|
|
|
|
break-if-!=
|
2020-11-29 17:50:15 +00:00
|
|
|
var result/xmm0: float <- pop-number-from-value-stack stack
|
|
|
|
print-float-decimal-approximate 0, result, 3
|
|
|
|
print-string 0, "\n"
|
2020-11-29 21:26:48 +00:00
|
|
|
print-string 0, "width: "
|
|
|
|
var width/eax: int <- float-size result, 3
|
|
|
|
print-int32-decimal 0, width
|
|
|
|
print-string 0, "\n"
|
2020-10-06 04:09:42 +00:00
|
|
|
}
|
|
|
|
#
|
2020-09-27 02:15:04 +00:00
|
|
|
loop
|
|
|
|
}
|
2020-09-13 07:41:09 +00:00
|
|
|
}
|