summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorkitty <nepeta@canaglie.net>2026-02-13 00:04:05 +1100
committerkitty <nepeta@canaglie.net>2026-02-13 00:04:05 +1100
commit7ff7495fc0574207b88987438f17105aa8b7df95 (patch)
tree63f11c0dcfa3a5970d8a4635a8541798f06b1029
parentd9ee6abfe7b13c121c7745022109685efc8807d0 (diff)
a shitload of temporary testing stuff+stack fix
compiling is fucked still interpreting is fixed (no longer leaves its debris on the stack)
-rw-r--r--jefs.fs2
-rw-r--r--jefs.s116
2 files changed, 112 insertions, 6 deletions
diff --git a/jefs.fs b/jefs.fs
index c5ec259..b023018 100644
--- a/jefs.fs
+++ b/jefs.fs
@@ -1 +1 @@
-: test bye ; test
+bye
diff --git a/jefs.s b/jefs.s
index bc10981..22e1a7e 100644
--- a/jefs.s
+++ b/jefs.s
@@ -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