Code: Select all
tab44=$100 ; use a page of mem somewhere (may want to move this)
initmult ; set up 15x15 multiplication table
ldx #$f
im1 ldy #$f
im2 jsr mult44
sta $96
iny
txa
asl
asl
asl
asl
sta im3+1
lda $96
im3 sta tab44,y
dey
bne im2
dex
bne im1
rts
mult44 ; Mike's 4x4 multiplication code
DEY ; 2 To counteract carry add: %1111->%1110 + C
STY $96 ; 3
TXA ; 2
ASL ; 2
ASL ; 2
ASL ; 2
ASL ; 2 %XXXX0000
ASL ; 2 %XXX00000
BCC rm0 ; 3
ADC $96 ; 3 %XXX01111
rm0 ASL ; 2 %XX011110
BCC rm1 ; 3
ADC $96 ; 3 %XX011110+1110+c=%11101101
rm1 ASL ; 2 %X1011010
BCC rm2 ; 3
ADC $96 ; 3 %X1011010+1110+c=%X1101001
rm2 ASL ; 2 %11010010
BCC rm3 ; 3
ADC $96 ; 3 %11010010+1110+c=%11100001=225=15*15
rm3 RTS ; 2
mult44s ; a OR y is already shifted to top 4 bits
sta m4s+1
m4s lda tab44,y
rts
mult44u ; have to shift a
asl
asl
asl
asl
sta m4u+1
m4u lda tab44,y
rts
mult88f
txa
and #$f
sta $3 ;l4bx
stx $4 ;h4bx
tya
and #$f
sta $5 ;l4by
sty $6 ;h4by
ldy $3
lda $6
and #$f0 ;already shifted
jsr mult44s ;l4bx*h4by
sty $92 ;temp store
lda $4
and #$f0 ;already shifted
ldy $5
jsr mult44s ;h4bx*l4by
tya
clc
adc $92 ;add temp store, carry on overflow
sta $92
and #$f0 ;4 highest bits
ror ;shift right and put carry in bit7
lsr
lsr
lsr ;all bits in bit4-bit0
sta $93 ;high byte result (e.g. *16)
lda $92
and #$f
asl
asl
asl
asl ;*16
sta $92 ;low byte result
lda $3
ldy $5
jsr mult44u ;l4bx*l4by
tya
adc $92 ;add low byte
sta $92
lda $93
adc #0
sta $93
lda $6
and #$f0
tay
lda $4
lsr
lsr
lsr
lsr
jsr mult44s ;h4bx*h4by*16*16
tya
adc $93 ;result high byte
sta $93
rts