diff options
| author | kitty <nepeta@canaglie.net> | 2026-02-13 20:36:45 +1100 |
|---|---|---|
| committer | kitty <nepeta@canaglie.net> | 2026-02-13 20:36:45 +1100 |
| commit | 8a17e8947b43283208593a7f417308586560becf (patch) | |
| tree | 58ca327ae09988bfba1bfc6fa76cea84fdf0462c | |
| parent | 936906cdb6c84507d7f5c8418b275eab259cbccc (diff) | |
,,, *maybe* working?
| -rw-r--r-- | jefs.fs | 7 | ||||
| -rw-r--r-- | jefs.s | 59 |
2 files changed, 54 insertions, 12 deletions
@@ -1,3 +1,6 @@ -: test bye ; +: here@ here @ ; +here @ +here@ , +latest @ , 2 , 1 w, 58 , HEREDUMP -test +bye @@ -109,6 +109,30 @@ defword "c!", cstore, 0 mov [r11], r12b ret +defword ",", comma, 0 + pspop r11 + mov r12, [here] + mov qword [r12], r11 + add r12, 8 + mov qword [here], r12 + ret + +defword "w,", w_comma, 0 + pspop r11 + mov r12, [here] + mov word [r12], r11w + add r12, 2 + mov qword [here], r12 + ret + +defword "c,", c_comma, 0 + pspop r11 + mov r12, [here] + mov byte [r12], r11b + inc r12 + mov qword [here], r12 + ret + ; stage 1 parser. very rudimentary, ; since it will only parse a little bit of the init file ; there won't be much error checking either. @@ -208,9 +232,9 @@ defword "interpret", interpret, 0 call to_cfa pspop r15 call twodrop - pspush r15 - pspop r11 - call r11 + ; pspush r15 + ; pspop r11 + call r15 jmp .loop ret ; unreachable safety RET @@ -221,37 +245,38 @@ defword "interpret", interpret, 0 ret .compile: - call dots - ; handle immediates + ; call dots pspop r11 cmp r11, false je .comp_n + ; handle immediates + ; call dots + pspop r15 call twodrop + pspush r15 call dup + ; call dots call immediate_q - call dots + ; call dots pspop r13 cmp r13, true je .immed_comp call to_cfa - call dots - pspop r11 + ; call dots 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 @@ -262,6 +287,13 @@ defword "immediate?", immediate_q, 0 ; ( lfa -- flag ) pspop r11 add r11, 8 mov r12b, byte [r11] + pspush r11 + pspush r12 + mov r13b, immediate_mask + pspush r13 + ; call dots + call twodrop + pspop r11 test r12b, immediate_mask jnz .imm @@ -270,6 +302,7 @@ defword "immediate?", immediate_q, 0 ; ( lfa -- flag ) ret .imm: + ; call dots mov r11, true pspush r11 ret @@ -513,6 +546,9 @@ defword "]", rbrac, immediate_mask ; terrible and awful ; W = r14; W <= wstack_b; W+=8 defword ".s", dots, 0 + push r11 + push r12 + mov r12, r14 .loop: cmp r12, wstack @@ -539,6 +575,9 @@ defword ".s", dots, 0 mov rdi, 1 mov rax, __NR_write syscall + + pop r12 + pop r11 ret .space: resq 1 .dmsg: db "DONEDONEYIPPEEEE" |
