TITLE 'MULT16' * * THIS ROUTINE MULTIPLIES TWO 16 BIT 2'S * COMPLIMENT NUMBERS UNING BOOTH'S ALGORITHM * * THE MULTIPLIER = Y = Y(MSB),Y(LSB) = Y,Y+1 * THE MULTIPLICAND =XX=XX(MSB),XX(LSB) = XX,XX+1 * THE PRODUCT = U = U(MSB),U+1,U+2,U+3 * THE TEST BYTE FOR Y(LSB-1) = FF * THE MULTIPLIER AND THE MULTIPLICAND MUST BE * STORED IN THE Y AND XX RESPECTIVELY, THEN A JSR TO * MULT16 WILL GENERATE THE 2'S COMPLIMENT PRODUCT * OF Y AND XX IN U. * * THE MULTIPLICAND WILL BE UNCHANGED. THE * MULTIPLIER WILL BE DESTROYED. * ORG $0 LDS #$FF JSR MULT16 WAI ;WAIT HERE Y RMB 2 XX RMB 2 U RMB 4 FF RMB 1 * ORG $100 MULT16 LDX #5 ;CLEAR THE WORKING REGISTER CLR A LP1 STA A U-1,X DEX BNE LP1 LDX #16 ;INIT'L SHIFT COUNTER TO 16 LP2 LDA A Y+1 ;GET Y(LSBIT) AND A #1 TAB ;SAVE Y(LSBIT) IN ACCB EOR A FF ;DOES Y(LSBIT) = Y(LSB-1)? BEQ SHIFT ;YES: GOT TO THE SHIFT ROUTINE TST B ;NO: DOES Y(LSBIT) = 0? BEQ ADD ;YES: GO TO THE ADD ROUTINE LDA A U+1 ;NO: SUBTRAACT MULTIPLICAND LDA B U ;PRODUCT WITH THE MSBYTES SUB A XX+1 ;LINED UP SBC B XX STA A U+1 STA B U BRA SHIFT ;THEN GO TO THE SHIFT ROUTINE ADD LDA A U+1 ;ADD THE MULTIPLICAND TO THE LDA B U ;PRODUCT WITH THE MSBYTES ADD A XX+1 ;LINED UP ADC B XX STA A U+1 STA B U SHIFT CLR FF ;CLEAR THE TEST BYTE ROR Y ;SHIFT THE MULTIPLIER RIGHT ROR Y+1 ;ONE BIT WITH THE LSBIT ROL FF ;INTO THE LSBIT OF FF ASR U ;SHIFT THE PRODUCT RIGHT ONE ROR U+1 ;BIT, THE MSB REMAINING THE ROR U+2 ;SAME ROR U+3 DEX ;DECREMENT THE SHIFT COUNT BNE LP2 ;IF NOT 0 CNTINUE RTS * END