summaryrefslogtreecommitdiff
path: root/sanctuary.s
diff options
context:
space:
mode:
Diffstat (limited to 'sanctuary.s')
-rw-r--r--sanctuary.s29
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