SORCIM 680x Assembler ver 3.1 0?/3>/01 =::77 Page 1 MULT16 B:BOOTH68 .ASM * * 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. * 0000 = 0000 ORG $0 0000 8E00FF LDS #$FF 0003 BD0100 JSR MULT16 0006 3E WAI ;WAIT HERE 0007 = 0002 Y RMB 2 0009 = 0002 XX RMB 2 000B = 0004 U RMB 4 000F = 0001 FF RMB 1 * 0010 = 0100 ORG $100 0100 CE0005 MULT16 LDX #5 ;CLEAR THE WORKING REGISTER 0103 4F CLR A 0104 A70A LP1 STA A U-1,X 0106 09 DEX 0107 26FB ^0104 BNE LP1 0109 CE0010 LDX #16 ;INIT'L SHIFT COUNTER TO 16 010C 9608 LP2 LDA A Y+1 ;GET Y(LSBIT) 010E 8401 AND A #1 0110 16 TAB ;SAVE Y(LSBIT) IN ACCB 0111 980F EOR A FF ;DOES Y(LSBIT) = Y(LSB-1)? 0113 271D ^0132 BEQ SHIFT ;YES: GOT TO THE SHIFT ROUTINE 0115 5D TST B ;NO: DOES Y(LSBIT) = 0? 0116 270E ^0126 BEQ ADD ;YES: GO TO THE ADD ROUTINE 0118 960C LDA A U+1 ;NO: SUBTRAACT MULTIPLICAND 011A D60B LDA B U ;PRODUCT WITH THE MSBYTES 011C 900A SUB A XX+1 ;LINED UP 011E D209 SBC B XX 0120 970C STA A U+1 0122 D70B STA B U 0124 200C ^0132 BRA SHIFT ;THEN GO TO THE SHIFT ROUTINE 0126 960C ADD LDA A U+1 ;ADD THE MULTIPLICAND TO THE 0128 D60B LDA B U ;PRODUCT WITH THE MSBYTES 012A 9B0A ADD A XX+1 ;LINED UP 012C D909 ADC B XX 012E 970C STA A U+1 0130 D70B STA B U 0132 7F000F SHIFT CLR FF ;CLEAR THE TEST BYTE 0135 760007 ROR Y ;SHIFT THE MULTIPLIER RIGHT SORCIM 680x Assembler ver 3.1 0?/3>/01 =::77 Page 2 MULT16 B:BOOTH68 .ASM 0138 760008 ROR Y+1 ;ONE BIT WITH THE LSBIT 013B 79000F ROL FF ;INTO THE LSBIT OF FF 013E 77000B ASR U ;SHIFT THE PRODUCT RIGHT ONE 0141 76000C ROR U+1 ;BIT, THE MSB REMAINING THE 0144 76000D ROR U+2 ;SAME 0147 76000E ROR U+3 014A 09 DEX ;DECREMENT THE SHIFT COUNT 014B 26BF ^010C BNE LP2 ;IF NOT 0 CNTINUE 014D 39 RTS * 014E END no ERRORs, 9 Labels, 9427h bytes not used. Program LWA = 014Eh.  ADD 0126 1/40 1#48 FF 000F 1#25 1/37 1/54 2/ 2 LP1 0104 1#30 1/32 LP2 010C 1#34 2/ 8 MULT16 0100 1/20 1#28 SHIFT 0132 1/38 1/47 1#54 U 000B 1#24 1/30 1/41 1/42 1/45 1/46 1/48 1/49 1/52 1/53 2/ 3 2/ 4 2/ 5 2/ 6 XX 0009 1#23 1/43 1/44 1/50 1/51 Y 0007 1#22 1/34 1/55 1/56 2/ 6 XX 0009 1#23 1/43 1/44 1/50 1/51