diff --git a/STATUS.md b/STATUS.md index aeaabc42..b568ba51 100644 --- a/STATUS.md +++ b/STATUS.md @@ -199,7 +199,7 @@ Floating point mathematical routines - not official, but well known and broadly | `$B947` | `inv_FAC1_mantissa` | NOT DONE | | | `$B9EA` | `log_FAC1` | NOT DONE | | | `$BA28` | `mul_MEM_FAC1` | DONE | | -| `$BA2B` | `mul_FAC2_FAC1` | PARTIAL | sometime imprecise - like PI*PI | +| `$BA2B` | `mul_FAC2_FAC1` | DONE | | | `$BA8C` | `mov_MEM_FAC2` | DONE | | | `$BA90` | `get_FAC2_via_INDEX` | NOT DONE | | | `$BAE2` | `mul10_FAC1` | DONE | | diff --git a/c64/basic/math/mul_FAC2_FAC1.s b/c64/basic/math/mul_FAC2_FAC1.s index e97235bd..c42a213c 100644 --- a/c64/basic/math/mul_FAC2_FAC1.s +++ b/c64/basic/math/mul_FAC2_FAC1.s @@ -17,8 +17,6 @@ // - https://codebase64.org/doku.php?id=base:kernal_floating_point_mathematics // -// XXX the code here is very imprecise, find out why - mul_FAC2_FAC1_done: rts @@ -98,31 +96,31 @@ mul_FAC2_FAC1_sub_exp_bias: lda FACOV jsr mul_FAC2_FAC1_by_A - jsr mul_FAC2_FAC1_shift_RESHO + jsr mul_FAC2_FAC1_shift bcc !+ inc RESHO+0 !: lda FAC1_mantissa+3 jsr mul_FAC2_FAC1_by_A - jsr mul_FAC2_FAC1_shift_RESHO + jsr mul_FAC2_FAC1_shift bcc !+ inc RESHO+0 !: lda FAC1_mantissa+2 jsr mul_FAC2_FAC1_by_A - jsr mul_FAC2_FAC1_shift_RESHO + jsr mul_FAC2_FAC1_shift bcc !+ inc RESHO+0 !: lda FAC1_mantissa+1 jsr mul_FAC2_FAC1_by_A - jsr mul_FAC2_FAC1_shift_RESHO + jsr mul_FAC2_FAC1_shift bcc !+ inc RESHO+0 !: lda FAC1_mantissa+0 jsr mul_FAC2_FAC1_by_A - jsr mul_FAC2_FAC1_shift_RESHO + jsr mul_FAC2_FAC1_shift bcc !+ inc RESHO+0 !: @@ -214,23 +212,3 @@ mul_FAC2_FAC1_by_A: mul_FAC2_FAC1_by_A_done: rts - - - - -mul_FAC2_FAC1_shift_RESHO: // XXX we should probably move this subroutine to a separate file - - // Shift RESHO by one byte - - lda RESHO+3 - sta RESHO+4 - lda RESHO+2 - sta RESHO+3 - lda RESHO+1 - sta RESHO+2 - lda RESHO+0 - sta RESHO+1 - lda #$00 - sta RESHO+0 - - rts diff --git a/c64/basic/math/mul_FAC2_FAC1_shift.s b/c64/basic/math/mul_FAC2_FAC1_shift.s new file mode 100644 index 00000000..2f3c8acf --- /dev/null +++ b/c64/basic/math/mul_FAC2_FAC1_shift.s @@ -0,0 +1,22 @@ +// #LAYOUT# STD * #TAKE +// #LAYOUT# * BASIC_0 #TAKE +// #LAYOUT# * * #IGNORE + +// +// Shift RESHO by one byte - for multiplication +// + +mul_FAC2_FAC1_shift: + + lda RESHO+3 + sta RESHO+4 + lda RESHO+2 + sta RESHO+3 + lda RESHO+1 + sta RESHO+2 + lda RESHO+0 + sta RESHO+1 + lda #$00 + sta RESHO+0 + + rts