commit de37aeb059d84a3d1c7133e9c9cd87f4b9500ed4
parent 9ed028ebcb746633f76fc1d4d835523ec2c8d390
Author: Virgil Dupras <hsoft@hardcoded.net>
Date: Sun, 28 May 2023 09:13:42 -0400
rpi: add parse
Diffstat:
1 file changed, 82 insertions(+), 8 deletions(-)
diff --git a/fs/xcomp/arm/rpi/kernel.fs b/fs/xcomp/arm/rpi/kernel.fs
@@ -86,6 +86,83 @@ xcode abort
xcode bye 0 b) ,)
+pc to L1 \ fail
+ mov) rTOP rd) 0 i) ,)
+ lret,
+
+\ parse char
+pc to L2 \ rTOP=a-with-'-skipped r0=u
+ cmp) r0 rn) 3 i) ,)
+ L1 abs>rel b) ne) ,)
+ ldr) r0 rd) rTOP rn) ,)
+ and) r1 rd) r0 rn) $ff00 i) ,)
+ cmp) r1 rn) $2700 i) ,) \ ' char
+ L1 abs>rel b) ne) ,)
+ and) r0 rdn) $ff i) ,)
+ r0 ppush,
+ mov) rTOP rd) 1 i) ,)
+ lret,
+
+\ parse hexadecimal
+pc to L3 \ rTOP=a-with-$-skipped r0=u
+ cmp) r0 rn) 2 i) ,)
+ L1 abs>rel b) lo) ,)
+ sub) r0 rdn) 1 i) ,) \ skip $
+ mov) r2 rd) 0 i) ,) \ accumulated result
+pc \ loop
+ ldr) r1 rd) rTOP rn) 8b) 1 +i) post) ,)
+ orr) r1 rdn) $20 i) ,)
+ sub) r1 rdn) '0' i) f) ,)
+ L1 abs>rel b) lo) ,)
+ cmp) r1 rn) 10 i) ,)
+ forward b) lo) ,) to L4 \ parse ok, under 10
+ sub) r1 rdn) 'a' '0' - i) f) ,)
+ L1 abs>rel b) lo) ,)
+ add) r1 rdn) 10 i) ,)
+ cmp) r1 rn) 16 i) ,)
+ L1 abs>rel b) hs) ,)
+L4 forward! \ parse ok
+ add) r2 rd) r1 rn) r2 rm) 4 lsl) ,) \ r2 = r2*16 + r1
+ sub) r0 rdn) 1 i) f) ,)
+ ( loop ) abs>rel b) nz) ,)
+ r2 ppush,
+ mov) rTOP rd) 1 i) ,)
+ lret,
+
+\ parse unsigned decimal
+pc to L4 \ rTOP=a+1 r1=first-char r0=u
+ mov) r4 rd) r1 rm) ,) \ for '-' check
+ cmp) r1 rn) '-' i) ,)
+ ldr) z) r1 rd) rTOP rn) 8b) 1 +i) post) ,)
+ sub) z) r0 rdn) 1 i) f) ,)
+ L1 abs>rel b) z) ,) \ '-' only? can't parse
+ mov) r2 rd) 0 i) ,) \ accumulated result
+ mov) r3 rd) 10 i) ,) \ const for mul)
+pc \ loop
+ sub) r1 rdn) '0' i) f) ,)
+ L1 abs>rel b) lo) ,)
+ cmp) r1 rn) 10 i) ,)
+ L1 abs>rel b) hs) ,)
+ mul) r2 rd) r3 rm) r2 rs) r1 acc) ,)
+ ldr) r1 rd) rTOP rn) 8b) 1 +i) post) ,)
+ sub) r0 rdn) 1 i) f) ,)
+ ( loop ) abs>rel b) nz) ,)
+ cmp) r4 rn) '-' i) ,)
+ rsb) z) r2 rdn) 0 i) ,) \ negate
+ r2 ppush,
+ mov) rTOP rd) 1 i) ,)
+ lret,
+
+xcode parse ( str -- n? f )
+ ldr) r0 rd) rTOP rn) 8b) 1 +i) post) ,) \ rTOP=a r0=u
+ ldr) r1 rd) rTOP rn) 8b) 1 +i) post) ,)
+ cmp) r1 rn) ''' i) ,)
+ L2 abs>rel b) eq) ,)
+ cmp) r1 rn) '$' i) ,)
+ L3 abs>rel b) eq) ,)
+ mov) r2 rd) r1 rm) ,)
+ L4 abs>rel b) ,)
+
xcode emit ( c -- )
pc
ldr) r3 rd) r7 rn) UART0_FR +i) ,)
@@ -198,14 +275,6 @@ xcode bar
( pc ) rTOP pc>reg,
wjmp, stype
-xcode 42
- xdup, mov) rTOP rd) 42 i) ,)
- lret,
-
-xcode -12
- xdup, mov) rTOP rd) 0 i) ,) sub) rTOP rdn) 12 i) ,)
- lret,
-
8 allot0 pc to lblsysdict 0 le,
lblsysdict xaddr sysdict
@@ -397,6 +466,7 @@ xcode ; ximm
wjmp, [
pc to L2 ( str -- w ) \ find in sys dict
+ wcall, curword
wcall, sysdict
wcall, find
teq) rTOP rn) 0 i) ,)
@@ -416,6 +486,10 @@ xcode runword ( str -- )
cmp) rTOP rn) 0 i) ,)
xdrop,
xwordlbl compword abs>rel b) ne) ,)
+ wcall, parse
+ cmp) rTOP rn) 0 i) ,)
+ xdrop,
+ mov) ne) rPC rd) rLR rm) ,) \ literal: nothing to do
L2 abscall,
wjmp, execute