From be2502fee87aa67fa155beec51ec5bc1abbe7ac6 Mon Sep 17 00:00:00 2001 From: kitty Date: Mon, 9 Feb 2026 19:01:53 +1100 Subject: NUMBER and LIT (untested) --- jefs.s | 63 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 63 insertions(+) (limited to 'jefs.s') 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 -- cgit v1.2.3