summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorkitty <nepeta@canaglie.net>2026-02-26 15:45:15 +1100
committerkitty <nepeta@canaglie.net>2026-02-26 15:45:15 +1100
commitccd001edb78f39e7ae3f2f29ea67cc4fae9cd1b4 (patch)
treea71440e16db97ab48ee595e07a1a1cabbd1a03e4
parent99b0d29d403a3f57db8760282be6acbb6c8fe532 (diff)
maybe this program is extremely broken. possible
-rw-r--r--jefs.fs20
-rw-r--r--jefs.s16
-rw-r--r--readme.md1
3 files changed, 28 insertions, 9 deletions
diff --git a/jefs.fs b/jefs.fs
index 3119591..b406e63 100644
--- a/jefs.fs
+++ b/jefs.fs
@@ -1,3 +1,12 @@
+\ i think something is going on with the stack. i dunno
+\ things TODO:
+\ EVALUATE
+\ DO LOOP
+\ <builds does>
+\ argc/argv
+\ file io
+\ interactive input
+
: cell+ 8 + ;
: syswrite ( u c-addr fd -- n ) 1 syscall3 ;
: say ( c-addr u -- ) swap 2 syswrite drop ;
@@ -33,7 +42,7 @@ hex : ret, c3 c, ; decimal
: >resolve dup here @ swap - 4 - swap d! ;
: begin <mark ; immediate
-: again branch <resolve ; immediate \ add 4 to get to beginning of the next instruction
+: again branch <resolve ; immediate
: until 0branch <resolve ; immediate
: if 0branch >mark ; immediate ( I: -- a )
: else branch >mark swap >resolve ; immediate
@@ -68,7 +77,6 @@ variable modrm
: rex.b rex @ 41 or rex ! ;
: rex, rex @ ?dup if c, then ;
-
\ REGISTERS {{{
: rax modrm @ 0 or modrm ! ; : rcx modrm @ 1 or modrm ! ;
: rdx modrm @ 2 or modrm ! ; : rbx modrm @ 3 or modrm ! ;
@@ -168,10 +176,16 @@ variable hld
: bytes-free bytes-allocated bytes-used - ;
: .free bytes-free u. ." of " bytes-allocated u. ." bytes free (used " bytes-used (.) say ." )" cr ;
-: >nfa ( lfa -- nfa ) 9 + ;
: >ffa ( lfa -- ffa ) 8 + ;
+: >nfa ( lfa -- nfa ) 9 + ;
: (words) ( lfa -- ) >nfa dup w@ swap 2 + swap say 2 spaces ;
: words latest @ begin ?dup 0<> while dup (words) @ repeat cr ;
+\ TODO fix/rewrite interpreter to respect #tib
+\ : (evaluate) ( c-addr u -- ) .s 0 >in ! ( u ) #tib ! ( c-addr ) tib ! interpret ;
+: (evaluate) ( c-addr u -- ) .s 2drop ;
+: evaluate ( c-addr u -- ) >r >r tib @ #tib @ >in @ r> r> (evaluate) >in ! #tib ! tib ! ;
+
+TESTSTR evaluate
.free
bye
diff --git a/jefs.s b/jefs.s
index 7820b78..b76eb11 100644
--- a/jefs.s
+++ b/jefs.s
@@ -6,15 +6,19 @@
mov qword [r14], %1
%endmacro
+; TODO
+; i'm worried that the reason the error handling
+; doesnt work without the +24
+; is that my code is bad and underflows the stack
%macro pspop 1
mov %1, qword [r14]
lea r14, [r14+8]
- ; cmp r14, wstack
- ; jle %%ok
- ; mov qword [error], 1
- ; mov r8, qword [handler]
- ; call r8
- ; %%ok:
+ cmp r14, wstack + 24
+ jle %%ok
+ mov qword [error], 1
+ mov r8, qword [handler]
+ call r8
+ %%ok:
%endmacro
;;; dictionary macros {{{
diff --git a/readme.md b/readme.md
index e7c84be..c72a595 100644
--- a/readme.md
+++ b/readme.md
@@ -83,3 +83,4 @@ the error codes are:
- 0: nothing.
- 1: stack underflow
+- 2: word not found