diff options
| author | kitty <nepeta@canaglie.net> | 2026-02-15 15:07:02 +1100 |
|---|---|---|
| committer | kitty <nepeta@canaglie.net> | 2026-02-15 15:07:02 +1100 |
| commit | 4747d865f744460e615a4a8d6edaa1c59631ce25 (patch) | |
| tree | d39beef0c5d3017d19c2b5e4907c1f06282df48a | |
| parent | 1e8811261e7b7a58ff4269c9b4ef16fbcc49e3d4 (diff) | |
improve number
i think that doing Everything in forth while possible
is kinda putting more effort in for no reason,
so we now have BASE and the ability to use hex digits. whee!
| -rw-r--r-- | jefs.fs | 3 | ||||
| -rw-r--r-- | jefs.s | 40 |
2 files changed, 40 insertions, 3 deletions
@@ -1,3 +1,6 @@ +: decimal 10 base ! ; +: hex 16 base ! ; + : [compile] parse find drop >cfa compile, ; immediate : ' parse find drop >cfa [compile] lit ; immediate \ note: no error handling (yet) @@ -412,21 +412,49 @@ defword "number", number, 0 ; ( c-addr u -- ?n flag ) pspop r12 ; c-addr xor r13, r13 ; r13: result xor r15, r15 ; r15b: current char + xor r10, r10 ; r10: negative flag + mov r9, qword [base] cmp r11, 0 je .no + mov r15b, byte [r12] + cmp r15b, '-' + jnz .enterloop + mov r10, true + inc r12 + dec r11 + .loop: mov r15b, byte [r12] +.enterloop: ; non numeral = goodbye cmp r15b, 48 jl .no - cmp r15b, 57 - jg .no - imul r13, 10 sub r15b, 48 + ; cmp r15b, 57 + ; jg .no + cmp r15b, 10 ; 48+10: < ':', <= '9' + jl .basecmp + cmp r15b, 17 ; ':' - '@' + jl .no + sub r15b, 7 ; keep 10 so 'A' = 10 + cmp r15b, 36 ; < '[' <= 'Z' + jl .basecmp + cmp r15b, 42 ; < 'a' + jl .no + sub r15b, 32 + cmp r15b, 36 ; < '{' <= 'z' + jl .basecmp + jmp .no + +.basecmp: + cmp r15, r9 + jge .no + + imul r13, r9 add r13, r15 inc r12 @@ -435,6 +463,11 @@ defword "number", number, 0 ; ( c-addr u -- ?n flag ) cmp r11, 0 jne .loop + test r10, r10 + jz .bye + neg r13 + +.bye: pspush r13 mov r13, true pspush r13 @@ -727,6 +760,7 @@ defvar "state", state, 0, interpreting defvar "here", here, 0, umem defvar "h0", h0, 0, umem ; beginning of user memory area defvar "hend", hend, 0, umem_e ; ending of user memory area +defvar "base", base, 0, 10 defvar "latest", latest, 0, lfa_latest initfile: |
