Fast Multiplication by Martin Arndt
[Up to Source Code Repository]
Fast Multiplication Using Tables
By Martin Arndt, 6 January 2004.
;Fast Multiplication ; ;The idea stems from Stephen Judd. ;You find it in The Fridge and in the C=Hacking magazine: ; ;Let f(x) = x^2 / 4. Then ; ; a*b = f(a+b) - f(a-b) ; ;You need 2 tables of squares with 9 bit input size and ;16 bit result size. ; ;You can save the building of the 2th complement ; ; EOR #$ff ; CLC ; ADC #1 ; ;by shifting the second table 1 byte down and ;using the 1th complement: ; ; EOR #$ff ; ;This algorithm is very useful when you want to multiply ;multiple bytes by the same factor. Then you can set the ;zp addresses once and just modify the y register. ;With the same trick you can easily extend this algorithm ;to 16 bit. But if you want to be fast you will need more ;than the 8 zp addresses. zp1=$20 ;8 bytes zp index addresses zp2=$22 zp3=$24 zp4=$26 tab1=$4000 ;2 kbytes square tables tab2=$4200 tab3=$4400 tab4=$4600 .org $c000 JSR init ;first build the tables tab1..tab4 ;and init zp1-zp4 LDY #$66 ;factor 1 in y LDA #$12 ;factor 2 in a STA zp1 ;set zp adresses STA zp2 EOR #$ff STA zp3 STA zp4 SEC LDA (zp1),y SBC (zp3),y TAX ;product lo in x LDA (zp2),y SBC (zp4),y ;product hi in a RTS init LDX #0 ;build square tables STX tab3+$fe STX tab4+$fe LDY #$ff .loop1 TXA LSR CLC ADC tab3+$fe,x STA tab1,x STA tab3+$ff,x STA tab3,y LDA #0 ADC tab4+$fe,x STA tab2,x STA tab4+$ff,x STA tab4,y DEY INX BNE .loop1 .loop2 TXA SEC ROR CLC ADC tab1+$ff,x STA tab1+$100,x LDA #0 ADC tab2+$ff,x STA tab2+$100,x INX BNE .loop2 LDA #>tab1 ;init zp addresses STA zp1+1 LDA #>tab2 STA zp2+1 LDA #>tab3 STA zp3+1 LDA #>tab4 STA zp4+1 RTSLast page update: March 20th, 2004.