diff options
| author | kitty <nepeta@canaglie.net> | 2026-02-09 19:01:53 +1100 |
|---|---|---|
| committer | kitty <nepeta@canaglie.net> | 2026-02-09 19:01:53 +1100 |
| commit | be2502fee87aa67fa155beec51ec5bc1abbe7ac6 (patch) | |
| tree | 64f7681f0cf4b1cd1d84feb6ae8fd96c00cdaaa0 /jefs.s | |
| parent | ef01724c21c28037815a661a81cd8044f11c3944 (diff) | |
NUMBER and LIT (untested)
Diffstat (limited to 'jefs.s')
| -rw-r--r-- | jefs.s | 63 |
1 files changed, 63 insertions, 0 deletions
@@ -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 |
