diff options
| author | kitty <nepeta@canaglie.net> | 2026-02-13 00:04:05 +1100 |
|---|---|---|
| committer | kitty <nepeta@canaglie.net> | 2026-02-13 00:04:05 +1100 |
| commit | 7ff7495fc0574207b88987438f17105aa8b7df95 (patch) | |
| tree | 63f11c0dcfa3a5970d8a4635a8541798f06b1029 /jefs.s | |
| parent | d9ee6abfe7b13c121c7745022109685efc8807d0 (diff) | |
a shitload of temporary testing stuff+stack fix
compiling is fucked still
interpreting is fixed (no longer leaves its debris on the stack)
Diffstat (limited to 'jefs.s')
| -rw-r--r-- | jefs.s | 116 |
1 files changed, 111 insertions, 5 deletions
@@ -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 |
