summaryrefslogtreecommitdiff
path: root/jefs.s
diff options
context:
space:
mode:
authorkitty <nepeta@canaglie.net>2026-02-15 15:07:02 +1100
committerkitty <nepeta@canaglie.net>2026-02-15 15:07:02 +1100
commit4747d865f744460e615a4a8d6edaa1c59631ce25 (patch)
treed39beef0c5d3017d19c2b5e4907c1f06282df48a /jefs.s
parent1e8811261e7b7a58ff4269c9b4ef16fbcc49e3d4 (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.s40
1 files changed, 37 insertions, 3 deletions
diff --git a/jefs.s b/jefs.s
index a6fa1b4..6f422ab 100644
--- a/jefs.s
+++ b/jefs.s
@@ -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: