From a059eda0ecd73cbb6277da3bf64a550097bc346d Mon Sep 17 00:00:00 2001 From: kitty Date: Sun, 29 Mar 2026 20:23:28 +1100 Subject: DEFER-ed words in core, file open/read/write/close --- sanctuary.s | 29 +++++++++++++++++++++++++++-- 1 file changed, 27 insertions(+), 2 deletions(-) (limited to 'sanctuary.s') 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 -- cgit v1.2.3