summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--jefs.fs22
-rw-r--r--jefs.s7
2 files changed, 26 insertions, 3 deletions
diff --git a/jefs.fs b/jefs.fs
index a806945..771c53c 100644
--- a/jefs.fs
+++ b/jefs.fs
@@ -1,6 +1,9 @@
\ i think something is going on with the stack. i dunno
\ things TODO:
+\ better error handling
+\ :noname
\ DO LOOP
+\ s\"
\ <builds does>
\ argc/argv
\ file io
@@ -8,7 +11,7 @@
: cell+ 8 + ;
: syswrite ( u c-addr fd -- n ) 1 syscall3 ;
-: say ( c-addr u -- ) swap 2 syswrite drop ;
+: say ( c-addr u -- ) swap 1 syswrite drop ;
: emit ( chr -- ) sp cell+ 1 swap 1 syswrite 2drop ;
: cr 10 emit ;
@@ -60,7 +63,6 @@ hex : ret, c3 c, ; decimal
\ }}}
\ TODO interpret mode strings?
-\ i think s" causes stack underflow
: s" 1 >in +! [ char " ] literal cparse branch >mark >r 2dup cmove, r> >resolve swap [compile] lit [compile] lit ; immediate
: ." [compile] s" ' say compile, ; immediate \ lol this word breaks the highlighting, here have another "
@@ -181,11 +183,22 @@ variable hld
: ? @ . ;
: .s sp cell+ ( skip sp itself ) begin dup s0 @ > while dup @ .qword cell+ repeat drop cr ;
+: .rs rp cell+ ( skip rsp itself ) begin dup rs0 @ > while dup @ .qword cell+ repeat drop cr ;
: bytes-allocated hend @ h0 @ - ;
: bytes-used here @ h0 @ - ;
: bytes-free bytes-allocated bytes-used - ;
: .free bytes-free u. ." of " bytes-allocated u. ." bytes free (used " bytes-used (.) say ." )" cr ;
+\ FUCK is BYE but it takes an error code. its called that because you call it when shit is fucked.
+: fuck ( code -- ) 60 syscall1 ;
+\ TODO broken as shit
+: (handler) error @ dup case
+ 1 of ." stack underflow" endof
+ 2 of ." word not found" endof
+ ." unknown error"
+ endcase cr fuck ;
+\ : _ ' (handler) handler ! ; _ \ so broken that it breaks Seer
+
: >ffa ( lfa -- ffa ) 8 + ;
: >nfa ( lfa -- nfa ) 9 + ;
: (words) ( lfa -- ) >nfa dup w@ swap 2 + swap say 2 spaces ;
@@ -194,7 +207,10 @@ variable hld
: (evaluate) ( c-addr u -- ) 0 >in ! ( u ) #tib ! ( c-addr ) tib ! interpret ;
: evaluate ( c-addr u -- ) tib @ >r #tib @ >r >in @ >r (evaluate) r> >in ! r> #tib ! r> tib ! ;
-: teststr3 s" 1 2 3 .s 2drop drop" ;
+: teststr3 s" 1 2 3 2drop drop" ;
teststr3 evaluate
+\ FILE I/O {{{
+\ }}}
+
.free bye
diff --git a/jefs.s b/jefs.s
index 7684069..5f27236 100644
--- a/jefs.s
+++ b/jefs.s
@@ -83,6 +83,7 @@ global _start
_start:
; init
mov r14, wstack ; point SP to top
+ mov qword [rs0], rsp
call interpret
mov rdi, 0
@@ -215,6 +216,10 @@ defword "sp", _sp, 0
pspush r14
ret
+defword "rp", _rp, 0 ; would be called 'rsp' but that is literally just the name of a register
+ pspush rsp
+ ret
+
defword "parse", parse, 0
mov r13, qword [to_in]
add r13, qword [tib]
@@ -1140,6 +1145,7 @@ defword "HEREDUMP", heredump, 0
ret
; }}}
+; maybe some of these should be constants?
defvar "tib", tib, 0, initfile
defvar "#tib", num_tib, 0, initlen
defvar ">in", to_in, 0, 0
@@ -1147,6 +1153,7 @@ defvar "state", state, 0, interpreting
defvar "here", here, 0, umem
defvar "s0", s0, 0, wstack
defvar "h0", h0, 0, umem ; beginning of user memory area
+defvar "rs0", rs0, 0, 0
defvar "hend", hend, 0, umem_e ; ending of user memory area
defvar "base", base, 0, 10
defvar "error", error, 0, 0