// Multiply Floating Point Accumulator by 10 // = 8x + 2x // Implement by shifting MAC left one bit, // and then keeping that value to add on after // shifting two more bits left. // This should be done using basic_fac1_overflow to // hold the overflow bits, so that the result can // be exponent adjusted after, if required. fac1_mul10: lda #$00 sta basic_fac1_overflow // Multiply mantissa by 2 jsr fac1_mantissa_mul2 // copy down to BASIC numeric work area at $57 // (basic_numeric_work_area) // (We copy all 7 bytes off the FAC1, so that we have // the overflow bits, and the copy is as small as possible) ldx #7 f1m10_l1: lda basic_fac1_mantissa,x sta basic_numeric_work_area,x dex bpl f1m10_l1 // Multiply mantissa by 4, so it is now 8x original jsr fac1_mantissa_mul2 jsr fac1_mantissa_mul2 // Now add stored value of 2x to it, to get the total x10 ldy #3 ldx #0 clc f1m10_l2: lda basic_fac1_mantissa,x adc basic_numeric_work_area,x sta basic_fac1_mantissa,x inx dey bpl f1m10_l2 lda basic_fac1_overflow adc basic_numeric_work_area+7 sta basic_fac1_overflow // Now shift right and increase exponent until overflow // bits = $00 f1m10_l3: lda basic_fac1_overflow bne !+ // All done, return clc rts !: // Divide mantissa by two, and increment exponent jsr fac1_mantissa_div2 inc basic_fac1_exponent lda basic_fac1_exponent bpl f1m10_l3 // Exponent has bit 7 set, so has wrapped. // = OVERFLOW ERROR jmp do_OVERFLOW_error fac1_mantissa_mul2: ldy #3 ldx #0 clc f1m1_l1: // Multiply mantissa by 2, and store overflow // in basic_fac1_bits lda basic_fac1_mantissa,x rol sta basic_fac1_mantissa,x inx dey bpl f1m1_l1 lda basic_fac1_overflow rol sta basic_fac1_overflow rts fac1_mantissa_div2: // Divide mantissa by 2, including using overflow bits clc lda basic_fac1_overflow ror sta basic_fac1_overflow ldy #3 f1md2_l1: lda basic_fac1_mantissa,y ror sta basic_fac1_mantissa,y dey bpl f1md2_l1 rts