diff options
| -rw-r--r-- | jefs.fs | 22 | ||||
| -rw-r--r-- | jefs.s | 7 |
2 files changed, 26 insertions, 3 deletions
@@ -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 @@ -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 |
