From a870fc533a845182abbf73d7c28cb30fbdb33019 Mon Sep 17 00:00:00 2001 From: d6 Date: Sun, 6 Nov 2022 22:01:45 -0500 Subject: [PATCH] clean up fix16 --- fix16.tal | 53 ++++++------------------------------------------- fixed.tal | 59 ------------------------------------------------------- 2 files changed, 6 insertions(+), 106 deletions(-) delete mode 100644 fixed.tal diff --git a/fix16.tal b/fix16.tal index 700d143..9c62849 100644 --- a/fix16.tal +++ b/fix16.tal @@ -48,14 +48,12 @@ ( MUL2. ) ( ) ( similarly with division we have: ) -( ) -( x divided by #0100 -> x ) -( x divided by #0001 -> x * 256, with likely overfow ) -( #abcd divided by #1000 -> #0abc, rounding with d ) -( x divided by #0200 -> x >> 1 ) -( x divided by #0080 -> x << 1 ) - -%xyz { ;x16-emit JSR2 #0a #18 DEO } +( ) +( x = x'/256 ) +( y = y'/256 ) +( x/y = z = z'/256 ) +( (x'/256)/(y'/256) = (x'*256 / y)/256 ) +( z' = (x' * 256 / y)/256 ) ( useful constants ) ( ) @@ -92,42 +90,6 @@ %x16-emit-dec { #30 ADD #18 DEO } -( |0100 - x16-zero xyz - x16-one xyz - x16-two xyz - x16-ten xyz - x16-hundred xyz - x16-pi/2 xyz - x16-pi xyz - x16-pi*2 xyz - x16-e xyz - x16-phi xyz - x16-sqrt-2 xyz - x16-sqrt-3 xyz - x16-epsilon xyz - #0002 xyz - #1234 xyz - #7fff xyz - #8000 xyz - #8001 xyz - #ffff xyz - #0200 xyz - #0834 #0000 ;x16-add JSR2 xyz - #0834 #0834 ;x16-add JSR2 xyz - #0834 #0834 ;x16-mul JSR2 xyz - #0834 #0200 ;x16-div JSR2 xyz - #0100 xyz - #0003 xyz - #0100 #0003 ;x16-div JSR2 xyz - #0834 xyz - #0080 xyz - #0834 #0080 ;x16-div JSR2 xyz - #0834 xyz - #0300 xyz - #0834 #0300 ;x16-div JSR2 xyz - BRK ) - @x16-emit ( x* -> ) DUP2 #8000 EQU2 ,&is-min JCN DUP2 #8000 GTH2 ,&is-neg JCN @@ -201,9 +163,6 @@ &rhs-whole #08 SFT2 MUL2 JMP2r @x16-div ( x* y* -> x/y* ) -( DUP ,¬-whole JCN - #08 SFT2 DIV2 JMP2r ( since y is whole, x/(y>>8) is correct ) - ¬-whole ) DIV2k STH2k ( x y x/y {x/y} ) LITr 80 SFT2r ( x y x/y {div=(x/y)<<8 ) OVR2 STH2 ( x y x/y {y div} ) diff --git a/fixed.tal b/fixed.tal deleted file mode 100644 index 21eb1ec..0000000 --- a/fixed.tal +++ /dev/null @@ -1,59 +0,0 @@ -( use short as a fixed point number 8.8 ) -( ) -( so #0001 is interpreted as 1/256 ) -( and #ffff is interpreted as 255+255/256 ) -( ) -( x = x0 + x1/256 ) -( y = y0 + y1/256 ) -( ) -( many 8.8 operations are equivalent to u16: ) -( * comparisons/equality ) -( * addition/subtraction ) -( ) -( but due to 16-bit truncation multiplication is different. ) -( ) -( x*y = x0*y0 + x0*y1/256 + x1*y0/256 + x1*y1/65536 ) -( ) -( since we only have 16-bits: ) -( 1. we need to drop the 8 high bits from x0*y0 ) -( 2. we need to drop the 8 low bits from x1*y1 ) -( 3. we need to use all the bits from x0*y1 and x1*y0 ) - -%EMIT { #18 DEO } -%DIGIT { #00 SWP ;digits ADD2 LDA EMIT } -%SPACE { #20 EMIT } -%NEWLINE { #0a EMIT } -%EMIT-BYTE { DUP #04 SFT DIGIT #0f AND DIGIT } - -( program ) -|0100 - #0100 #0100 ;mul-fix JSR2 ;emit-short JSR2 NEWLINE - #0999 #0100 ;mul-fix JSR2 ;emit-short JSR2 NEWLINE - #abcd #0100 ;mul-fix JSR2 ;emit-short JSR2 NEWLINE - #0200 #0200 ;mul-fix JSR2 ;emit-short JSR2 NEWLINE - #0400 #0200 ;mul-fix JSR2 ;emit-short JSR2 NEWLINE - BRK - -%LO { NIP #00 SWP } -%HI { POP #00 SWP } - -@mul-fix ( x* y* -> z* ) - OVR2 OVR2 LO SWP2 LO MUL2 ( x1*y1 ) - #08 SFT2 STH2 ( z = (x1*y1)>>8 ) - - OVR2 OVR2 HI SWP2 LO MUL2 ( x0*y1 ) - STH2 ADD2r ( z += x0*y1 ) - - OVR2 OVR2 LO SWP2 HI MUL2 ( x1*y0 ) - STH2 ADD2r ( z += x1*y0 ) - - HI SWP2 HI MUL2 ( x0*y0 ) - #80 SFT2 STH2r ADD2 ( z += (x0*y0)<<8 ) - JMP2r - -@emit-short SWP EMIT-BYTE EMIT-BYTE JMP2r - -( convenience for less branching when printing hex ) -@digits - 30 31 32 33 34 35 36 37 - 38 39 61 62 63 64 65 66