diff --git a/c64/basic/math/add_FAC2_FAC1_sub.s b/c64/basic/math/add_FAC2_FAC1_sub.s new file mode 100644 index 00000000..24d20618 --- /dev/null +++ b/c64/basic/math/add_FAC2_FAC1_sub.s @@ -0,0 +1,107 @@ +// #LAYOUT# STD * #TAKE +// #LAYOUT# X16 BASIC_0 #TAKE-OFFSET 2000 +// #LAYOUT# * BASIC_0 #TAKE +// #LAYOUT# * * #IGNORE + +// +// Math package - add FAC2 to FAC1, subtraction part +// + +// XXX test this + +add_FAC2_FAC1_sub: + + // First verify that |FAC1| > |FAC2|, branch to proper variant if it is not + // Note, that exponents are laready equalized + + lda FAC1_mantissa+0 + cmp FAC2_mantissa+0 + bcc add_FAC2_FAC1_sub_rev // if FAC1 < FAC2, branch + bne !+ // if FAC1 > FAC2, branch + + lda FAC1_mantissa+1 + cmp FAC2_mantissa+1 + bcc add_FAC2_FAC1_sub_rev // if FAC1 < FAC2, branch + bne !+ // if FAC1 > FAC2, branch + + lda FAC1_mantissa+2 + cmp FAC2_mantissa+2 + bcc add_FAC2_FAC1_sub_rev // if FAC1 < FAC2, branch + bne !+ // if FAC1 > FAC2, branch + + lda FAC1_mantissa+3 + cmp FAC2_mantissa+3 + bcc add_FAC2_FAC1_sub_rev // if FAC1 < FAC2, branch + bne !+ // if FAC1 > FAC2, branch + + // If we are here, than FAC1 is equal to FAC2 - so just set FAC1 to 0 + + lda #$00 + sta FAC1_exponent + rts +!: + // Perform the subtration, FAC1 = FAC1 - FAC2 + + sec + lda FAC1_mantissa+3 + sbc FAC2_mantissa+3 + sta FAC1_mantissa+3 + + lda FAC1_mantissa+2 + sbc FAC2_mantissa+2 + sta FAC1_mantissa+2 + + lda FAC1_mantissa+1 + sbc FAC2_mantissa+1 + sta FAC1_mantissa+1 + + lda FAC1_mantissa+0 + sbc FAC2_mantissa+0 + sta FAC1_mantissa+0 + + bcs add_FAC2_FAC1_sub_normalize // end if no need to adapt the exponent + + dec FAC1_exponent + + jmp normal_FAC1 + +add_FAC2_FAC1_sub_rev: + + // Since |FAC1| < |FAC2|, toggle FAC1 sign before subtraction + + jsr toggle_sign_FAC1_skipcheck + + // Perform the subtration, FAC1 = FAC2 - FAC1 + + sec + lda #$00 + sbc FACOV + sta FACOV + + lda FAC2_mantissa+3 + sbc FAC1_mantissa+3 + sta FAC1_mantissa+3 + + lda FAC2_mantissa+2 + sbc FAC1_mantissa+2 + sta FAC1_mantissa+2 + + lda FAC2_mantissa+1 + sbc FAC1_mantissa+1 + sta FAC1_mantissa+1 + + lda FAC2_mantissa+0 + sbc FAC1_mantissa+0 + sta FAC1_mantissa+0 + + bcs add_FAC2_FAC1_sub_normalize // end if no need to adapt the exponent + + lda FAC2_exponent + sta FAC1_exponent + dec FAC1_exponent + + // FALLTROUGH + +add_FAC2_FAC1_sub_normalize: + + jmp normal_FAC1 diff --git a/c64/basic/math/b86a.add_FAC2_FAC1.s b/c64/basic/math/b86a.add_FAC2_FAC1.s index 4565af0b..7ed3aa98 100644 --- a/c64/basic/math/b86a.add_FAC2_FAC1.s +++ b/c64/basic/math/b86a.add_FAC2_FAC1.s @@ -41,7 +41,7 @@ add_FAC2_FAC1: lda FAC1_sign eor FAC2_sign - bmi add_FAC2_FAC1_sub // branch if signs are opposite + bmi_16 add_FAC2_FAC1_sub // branch if signs are opposite // Perform the addition @@ -66,8 +66,6 @@ add_FAC2_FAC1: inc FAC1_exponent bne add_FAC2_FAC1_normalize // end if no overflow - - // Overflow - XXX shouldnt we mark it somewhere in memory? lda #$FF sta FAC1_exponent @@ -82,33 +80,6 @@ add_FAC2_FAC1_done: rts -add_FAC2_FAC1_sub: - - // Perform the subtration - - sec - lda FAC1_mantissa+3 - sbc FAC2_mantissa+3 - sta FAC1_mantissa+3 - - lda FAC1_mantissa+2 - sbc FAC2_mantissa+2 - sta FAC1_mantissa+2 - - lda FAC1_mantissa+1 - sbc FAC2_mantissa+1 - sta FAC1_mantissa+1 - - lda FAC1_mantissa+0 - sbc FAC2_mantissa+0 - sta FAC1_mantissa+0 - - bcs add_FAC2_FAC1_normalize // end if no need to adapt the exponent - - dec FAC1_exponent - - // FALLTROUGH - add_FAC2_FAC1_normalize: jmp normal_FAC1 diff --git a/c64/basic/math/bfb4.toggle_sign_FAC1.s b/c64/basic/math/bfb4.toggle_sign_FAC1.s index c73ed745..d3fa428a 100644 --- a/c64/basic/math/bfb4.toggle_sign_FAC1.s +++ b/c64/basic/math/bfb4.toggle_sign_FAC1.s @@ -16,6 +16,10 @@ toggle_sign_FAC1: lda FAC1_exponent beq !+ // do not toggle the sign if value is 0 + // FALLTROUGH + +toggle_sign_FAC1_skipcheck: // entry for other routines + lda FAC1_sign eor #$FF sta FAC1_sign