summaryrefslogtreecommitdiff
path: root/jefs.s
diff options
context:
space:
mode:
authorkitty <nepeta@canaglie.net>2026-02-18 19:57:54 +1100
committerkitty <nepeta@canaglie.net>2026-02-18 19:57:54 +1100
commitbdaf2637c5b90469a84346d2d88e9c5b11d252b8 (patch)
tree43f503b12bc1074df345d6446ec3b8ca0a171743 /jefs.s
parente07cb5d13e6c7e61c21ddcf5aa86b03f56583e59 (diff)
add TIB
realising that my plan of just Rewriting everything in forth later was a little Silly, and i can just create a TIB variable and use initfile as its initial value. probably should also create a #TIB variable and make the interpreter (or parse?) use it. i think this makes an EVALUATE word (idk if that was what it was called?) possible too which means file reading and input from terminal would also be possible. wonderful!
Diffstat (limited to 'jefs.s')
-rw-r--r--jefs.s35
1 files changed, 26 insertions, 9 deletions
diff --git a/jefs.s b/jefs.s
index ae0a80c..e64a182 100644
--- a/jefs.s
+++ b/jefs.s
@@ -200,7 +200,7 @@ defword "sp", _sp, 0
; there won't be much error checking either.
defword "parse", parse, 0
mov r13, qword [to_in]
- add r13, initfile
+ add r13, qword [tib]
mov r12b, byte [r13]
.wsloop: ; skip initial ws
@@ -231,7 +231,7 @@ defword "parse", parse, 0
.wordloop_end:
dec r11
- sub r13, initfile
+ sub r13, qword [tib]
mov qword [to_in], r13
pop r13
pspush r13 ; c-addr
@@ -278,7 +278,6 @@ defword "find", find, 0
pspush r13
ret
-; stage 1 interpreter, just reads from initfile
defword "interpret", interpret, 0
.loop:
call parse
@@ -551,8 +550,25 @@ defword "lit", lit, immediate_mask ; C: ( n -- ) ( -- n )
mov qword [here], r12
ret
-defword "litstring", litstring, immediate_mask ; I: ( chr -- )
- pspop r11
+; what to compile:
+; ADDR ← IP + 16
+; JMP AFTER_STRING
+; S c, T c, R c, ...
+; [ fill AFTER_STRING ]
+; PUSH ADDR
+; PUSH CNT
+defword "litstring", litstring, immediate_mask ; I: ( delim -- )
+ pspop r11 ; delim
+ mov r12, [here]
+
+ mov byte [r12], 0xe9 ; JMP
+ inc r12
+ push r12
+ mov dword [r12], 0x00000000 ; filler value
+ ; hm,, is the relative value gonna be equivalent to strlen + 1?
+
+ pop r12
+ mov qword [here], r12
ret
defword "syscall0", syscall0, 0 ; ( id -- rax )
@@ -754,7 +770,7 @@ defword "]", rbrac, immediate_mask
defword "\", backslash, immediate_mask
mov r13, qword [to_in]
- add r13, initfile
+ add r13, qword [tib]
mov r12b, byte [r13]
.loop:
cmp r12b, 0x0a
@@ -766,13 +782,13 @@ defword "\", backslash, immediate_mask
.done:
inc r13
- sub r13, initfile
+ sub r13, qword [tib]
mov qword [to_in], r13
ret
defword "(", bracket, immediate_mask
mov r13, qword [to_in]
- add r13, initfile
+ add r13, qword [tib]
mov r12b, byte [r13]
.loop:
cmp r12b, 0x29
@@ -784,7 +800,7 @@ defword "(", bracket, immediate_mask
.done:
inc r13
- sub r13, initfile
+ sub r13, qword [tib]
mov qword [to_in], r13
ret
@@ -903,6 +919,7 @@ defword "HEREDUMP", heredump, 0
ret
; }}}
+defvar "tib", tib, 0, initfile
defvar ">in", to_in, 0, 0
defvar "state", state, 0, interpreting
defvar "here", here, 0, umem