# HG changeset patch # User William Astle # Date 1703569075 25200 # Node ID 00c8df0b61f54b23209d62570a59221081ca524f # Parent 1a5da3594a9ee36b797e1d3c48105ce6a339e70e Fix some logic errors in floating point multiplication Floating point muliplication now yields correct results for a range of tests which is promising. Among the errors were not handling the overflow situation when an extra digit is needed and at least one inverted branch condition. diff -r 1a5da3594a9e -r 00c8df0b61f5 src/fps.s --- a/src/fps.s Sun Dec 24 23:08:20 2023 -0700 +++ b/src/fps.s Mon Dec 25 22:37:55 2023 -0700 @@ -486,7 +486,7 @@ std fpaextra+4 sta fpaextra+6 ldb fpa1+fpa.sig+4 ;* do each byte of multiplier significand in sequence - bsr fps_mul4 + bsr fps_mul5 ;* don't shift for first digit ldb fpa1+fpa.sig+3 bsr fps_mul4 ldb fpa1+fpa.sig+2 @@ -495,7 +495,12 @@ bsr fps_mul4 ldb fpa1+fpa.sig bsr fps_mul4 - ldd fpaextra+1 ; copy result into fpa0 significand (overflow byte will be zero) + ldb fpaextra ; did we have an overflow on the last digit? + beq fps_mul3a ; brif not + bsr fps_mul9 ; shift digits right one digit to move extra digit in + inc fpa0+fpa.exp ; bump exponent for result + bmi OVERROR ; brif we went out of range (went > 127) +fps_mul3a ldd fpaextra+1 ; copy result into fpa0 significand (overflow byte will be zero) std fpa0+fpa.sig ldd fpaextra+3 std fpa0+fpa.sig+2 @@ -506,29 +511,19 @@ ldd fpaextra+9 std fpa0+fpa.sig+8 jmp fps_normalize ; go normalize the result -fps_mul4 bne fps_mul6 ; brif at least one digit is nonzero - ldd fpaextra+8 ; shift right by 8 bits - std fpaextra+9 - ldd fpaextra+6 - std fpaextra+7 - ldd fpaextra+4 - std fpaextra+5 - ldd fpaextra+2 - sta fpaextra+3 - ldd fpaextra - std fpaextra+1 - clr fpaextra - rts -fps_mul5 bsr fps_mul11 ; add multiplicand to accumulator - decb ; account for iteration -fps_mul6 bitb #0x0f ; done everything for this digit? - bne fps_mul7 - bsr fps_mul9 ; shift accumulator - bra fps_mul8 -fps_mul7 bsr fps_mul11 ; add multiplicand to accumulator - subb #0x10 ; account for iteration -fps_mul8 bitb #0xf0 ; done all iterations? - bne fps_mul7 ; brif not +fps_mul4 bsr fps_mul9 ; shift result right +fps_mul5 bitb #0x0f ; are we finished this digit? + beq fps_mul6 ; brif so + bsr fps_mul11 ; add multiplicand to accumulator + decb ; adjust digit + bra fps_mul5 ; see if we're done yet +fps_mul6 bsr fps_mul9 ; shift the result right +fps_mul7 bitb #0xf0 ; done this digit? + bne fps_mul8 ; brif not + rts ; we're done now so return +fps_mul8 bsr fps_mul11 ; add multiplicand to accumulator + subb #0x010 ; adjust digit + bra fps_mul7 ; see if we're done yet fps_mul9 lsr fpaextra ; shift result ror fpaextra+1 ror fpaextra+2