diff options
| -rw-r--r-- | jefs.fs | 2 | ||||
| -rw-r--r-- | jefs.s | 116 |
2 files changed, 112 insertions, 6 deletions
@@ -1 +1 @@ -: test bye ; test +bye @@ -211,14 +211,16 @@ defword "interpret", interpret, 0 je .compile .interp: - pspop r11 ; assume it exists its fine for now + pspop r11 cmp r11, false je .interp_n call to_cfa + pspop r15 + call twodrop + pspush r15 pspop r11 call r11 - call twodrop jmp .loop ret ; unreachable safety RET @@ -230,24 +232,35 @@ defword "interpret", interpret, 0 .compile: ; handle immediates - pspop r11 ; assume it exists its fine for now + pspop r11 cmp r11, false je .comp_n call twodrop call dup call immediate_q + call dots pspop r13 cmp r13, true - je .interp + je .immed_comp call to_cfa + ; call dots pspop r11 call compile_comma jmp .loop ret ; unreachable safety RET +.immed_comp: + call to_cfa + ; call dots + pspop r11 + call r11 + jmp .loop + ret + .comp_n: + call dots call number pspop r11 ; assume its a valid number for now call lit @@ -324,6 +337,7 @@ defword ":", colon, 0 mov qword [here], r12 pop r12 mov qword [latest], r12 + mov dword [state], compiling ret defword ";", semicolon, immediate_mask @@ -340,7 +354,7 @@ defword ";", semicolon, immediate_mask mov byte [r11], 0xc3 ; RET inc r11 mov qword [here], r11 - mov qword [state], interpreting + mov dword [state], interpreting ret defword "number", number, 0 ; ( c-addr u -- ?n flag ) @@ -406,6 +420,36 @@ defword "lit", lit, immediate_mask ; C: ( n -- ) ( -- n ) mov qword [here], r12 ret +defword "syscall0", syscall0, 0 ; ( id -- rax ) + pspop rax + syscall + pspush rax + ret + +defword "syscall1", syscall1, 0 ; ( rdi id -- rax ) + pspop rax + pspop rdi + syscall + pspush rax + ret + +defword "syscall2", syscall2, 0 ; ( rsi rdi id -- rax ) + pspop rax + pspop rdi + pspop rsi + syscall + pspush rax + ret + +defword "syscall3", syscall3, 0 ; ( rdx rsi rdi id -- rax ) + pspop rax + pspop rdi + pspop rsi + pspop rdx + syscall + pspush rax + ret + ; these stack wrangling words are dreadfully inefficient right now ; i will come back and make these less terrible later defword "dup", dup, 0 @@ -465,6 +509,68 @@ defword "rdrop", rdrop, 0 pop r11 ret +defword "[", lbrac, immediate_mask + mov dword [state], interpreting + ret + +defword "]", rbrac, immediate_mask + mov dword [state], compiling + ret + +; TEMPORARY HORRIBLE DEBUGGING BULLSHIT {{{ +; debugging word; outputs raw bytes so needs to be piped through `x(x)d` +; terrible and awful +; W = r14; W <= wstack_b; W+=8 +defword ".s", dots, 0 + mov r12, r14 +.loop: + cmp r12, wstack + jge .done + + mov [.space], r12 + mov rdx, 8 ; qword + mov rsi, .space + mov rdi, 1 + mov rax, __NR_write + syscall + + mov rdx, 8 ; qword + mov rsi, r12 + mov rdi, 1 + mov rax, __NR_write + syscall + lea r12, [r12+8] + jmp .loop + +.done: + mov rdx, 16 ; 2 qword + mov rsi, .dmsg + mov rdi, 1 + mov rax, __NR_write + syscall + ret +.space: resq 1 +.dmsg: db "DONEDONEYIPPEEEE" + +defword "TESTSTR", teststr, 0 + mov r11, .msg + pspush r11 + mov r11, 11 + pspush r11 + ret +.msg: db "test string" + +defword "HEREDUMP", heredump, 0 + mov rdx, [here] + mov r11, [h0] + sub rdx, r11 + mov rsi, [h0] + mov rdi, 1 + mov rax, __NR_write + syscall + ret +; }}} + defvar ">in", to_in, 0, 0 defvar "state", state, 0, interpreting defvar "here", here, 0, 0 |
