diff options
Diffstat (limited to 'sanctuary.s')
| -rw-r--r-- | sanctuary.s | 29 |
1 files changed, 27 insertions, 2 deletions
diff --git a/sanctuary.s b/sanctuary.s index d37ca5a..02fb961 100644 --- a/sanctuary.s +++ b/sanctuary.s @@ -40,6 +40,14 @@ %2: %endmacro +%macro defdefer 3 + defcode %1, %2, %3 + mov r11, dodefer + call r11 + dq do_%2 + do_%2: +%endmacro + ; this is just taken from jewelforth, and does not correspond ; to how user variables are planned to work in sanctuary ; so todo make better later? i don't know if it really matters @@ -50,6 +58,17 @@ pspush qword %2 ret %endmacro + +%macro defdefervar 4 + %2: dq %4 + defdict %1, %2, %3 + mov r11, dodefer + call r11 + dq do_%2 + do_%2: + pspush qword %2 + ret +%endmacro ; }}} %assign smudge_mask 0x1 @@ -258,7 +277,7 @@ defcode "parse", parse, 0 ; r11: input addr ; r12: pointer into currently processing word ; r13: same as r12 but kept at xt -defcode "find", find, 0 +defdefer "find", find, 0 pspop r10 ; u pspop r11 ; a mov r12, qword [latest] @@ -1124,6 +1143,12 @@ defcode "(does>)", dodoes, 0 jmp r12 ; no RET +defcode "(defer)", dodefer, 0 + pop r11 + mov r12, [r11] + jmp r12 + ; also no RET + ; TEMPORARY WONKY DEBUGGING FUNCTIONS {{{ ; .s {{{ defcode ".s", dots, 0 @@ -1184,7 +1209,7 @@ defvar "tib", tib, 0, initfile defvar "#tib", n_tib, 0, initlen defvar ">in", to_in, 0, 0 defvar "handler", handler, 0, do_0handler -defvar "latest", latest, 0, lfa_latest +defdefervar "latest", latest, 0, lfa_latest initfile: incbin "sanctuary.fs" initlen equ $ - initfile |
