summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--jefs.fs2
-rw-r--r--jefs.s63
2 files changed, 64 insertions, 1 deletions
diff --git a/jefs.fs b/jefs.fs
index b023018..c5ec259 100644
--- a/jefs.fs
+++ b/jefs.fs
@@ -1 +1 @@
-bye
+: test bye ; test
diff --git a/jefs.s b/jefs.s
index 78ee14b..dce66a7 100644
--- a/jefs.s
+++ b/jefs.s
@@ -322,6 +322,69 @@ defword ";", semicolon, immediate_mask
mov qword [state], interpreting
ret
+defword "number", number, 0 ; ( c-addr u -- ?n flag )
+ pspop r11 ; u
+ pspop r12 ; c-addr
+ xor r13, r13 ; r13: result
+ xor r15, r15 ; r15b: current char
+
+ cmp r11, 0
+ je .no
+
+.loop:
+ mov r15b, byte [r12]
+
+ ; non numeral = goodbye
+ cmp r15b, 48
+ jl .no
+ cmp r15b, 57
+ jg .no
+
+ imul r13, 10
+ sub r15b, 48
+ add r13, r15
+
+ inc r12
+ dec r11
+
+ cmp r11, 0
+ jne .loop
+
+ pspush r13
+ mov r13, true
+ pspush r13
+ ret
+
+.no:
+ mov r13, false
+ pspush r13
+ ret
+
+defword "lit", lit, immediate_mask ; C: ( n -- ) ( -- n )
+ ; apparently u cant MOV a 64 bit immediate value to a 64 bit register?
+ ; what the fuck?
+ ; so we have to do something liike in COMPILE, where we
+ ; move to a register first:
+ ; lea r14, [r14-8] 4D 8D 76 F8
+ ; mov r11, 0xfefefefefefeffff 49 BB [LIT]
+ ; mov qword [r14], r11 4D 89 1E
+ pspop r11
+ mov r12, [here]
+
+ mov dword [r12], 0x4d8d76f8
+ add r12, 4
+ mov word [r12], 0x49bb
+ add r12, 2
+ mov qword [r12], r11
+ add r12, 8
+ mov word [r12], 0x4d89
+ add r12, 2
+ mov byte [r12], 0x1e
+ inc r12
+
+ mov qword [here], r12
+ ret
+
defword "dup", dup, 0
mov r11, [r14]
pspush r11