diff --git a/fix32.tal b/fix32.tal index 570f941..d58a6a6 100644 --- a/fix32.tal +++ b/fix32.tal @@ -197,13 +197,28 @@ #01 u32-rshift u32-add ( z** v=w+y-1/2** [ylo* yhi*] ) STH4r u32-div !u32-add ( z+v/y** ) +@x32-is-nan ( x/** -> x/** bool^ ) + DUP2 #0000 EQU2 STH + OVR2 #8000 EQU2 STHr AND JMP2r + +@x32-not-nan ( x/** -> x/** bool^ ) + DUP2 #0000 NEQ2 STH + OVR2 #8000 NEQ2 STHr ORA JMP2r + ( print an x32 number to stdout ) @x32-emit ( x/** -> ) ;x32-emit/draw-ch !x32-draw &draw-ch ( c^ -> ) #18 DEO JMP2r +@x32-draw-nan ( x/** draw-char* -> ) + STH2 POP2 POP2 + LIT "n STH2kr JSR2 + LIT "a STH2kr JSR2 + LIT "n STH2r JMP2 + @x32-draw ( x/** draw-char* -> ) - STH2 OVR2 #8000 LTH2 ?{ + STH2 x32-not-nan ?{ STH2r !x32-draw-nan } + OVR2 #8000 LTH2 ?{ LIT "- STH2kr JSR2 u32-negate } @@ -235,9 +250,10 @@ ( returns nan [8000 0000] on error ) @x32-parse ( pos* -> x/** ) ( negate leading - ; ignore leading + ) - LDAk LIT "- NEQ ?{ INC2 x32-parse !x32-negate } ( pos* ) - LDAk LIT "+ NEQ ?{ INC2 !x32-parse } ( pos* ) - + LDAk LIT "- NEQ ?{ INC2 x32-parse/run !x32-negate } ( pos* ) + LDAk LIT "+ NEQ ?{ INC2 !x32-parse/run } ( pos* ) + LDAk #00 EQU ?&error0 ( pos* ) +&run ( pos* ) ( accumulate on rst ; reverse shorts ) LIT2r 0000 LIT2r 0000 ( pos* [lo* hi*] ) @@ -274,10 +290,9 @@ STH2r STH2r x32-from-u32 ( s/** w/** ) !x32-add ( res/** ) &error2 ( limit* pos* [wlo* whi* s*] ) - #010e DEO POP2r POP2 ( limit* [wlo* whi*] ) &error1 ( pos* [wlo* whi*] ) - POP2r POP2r POP2 #8000 #0000 ( 8000 0000 ) - JMP2r ( 8000 0000 ) + POP2r POP2r ( pos* ) + &error0 POP2 #8000 #0000 JMP2r ( 8000 0000 ) ~math32.tal diff --git a/test-fix32.tal b/test-fix32.tal index 76d3f4f..7dca0a9 100644 --- a/test-fix32.tal +++ b/test-fix32.tal @@ -78,6 +78,11 @@ ;data/str5 x32-parse x32-emit #0a18 DEO ;data/str6 x32-parse x32-emit #0a18 DEO ;data/str7 x32-parse x32-emit #0a18 DEO + ;data/str8 x32-parse x32-emit #0a18 DEO + ;data/str9 x32-parse x32-emit #0a18 DEO + ;data/str10 x32-parse x32-emit #0a18 DEO + ;data/str11 x32-parse x32-emit #0a18 DEO + ;data/str12 x32-parse x32-emit #0a18 DEO #800f DEO BRK @@ -117,3 +122,8 @@ &str5 "-123 00 &str6 "123.456 00 &str7 "-123.456 00 + &str8 00 + &str9 "abc 00 + &str10 "123.abc 00 + &str11 "123.456abc 00 + &str12 "0.9999999999 00