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 /jefs.s | |
| 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!
Diffstat (limited to 'jefs.s')
| -rw-r--r-- | jefs.s | 40 |
1 files changed, 37 insertions, 3 deletions
@@ -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: |
