summaryrefslogtreecommitdiff
path: root/jefs.s
diff options
context:
space:
mode:
Diffstat (limited to 'jefs.s')
-rw-r--r--jefs.s59
1 files changed, 49 insertions, 10 deletions
diff --git a/jefs.s b/jefs.s
index 3dea971..69d41a7 100644
--- a/jefs.s
+++ b/jefs.s
@@ -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"