summaryrefslogtreecommitdiff
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
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!
-rw-r--r--jefs.fs3
-rw-r--r--jefs.s40
2 files changed, 40 insertions, 3 deletions
diff --git a/jefs.fs b/jefs.fs
index aa5d44c..2f262f6 100644
--- a/jefs.fs
+++ b/jefs.fs
@@ -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)
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: