potrzebuje szybkiej procedury do mnozenia liczb 16bitowych ze znakiem razy liczbe 8bitowa ze znakiem.
Aktualnie moja procka wyglada tak i korzysta z zaleznosci ,ze:
A*B = B*(A_LO + 256*A_HI) = A_LO*B + 256*A_HI*B
; 16bit signed by 8bit signed multiplication
;
; input: a=:1, b=:2,:3
; return: a*b=:4 (24bit result)
;
smul16 .macro ' '
lda :1
bpl pos
eor #$ff
clc
adc #1
pos sta sqr1l
sta sqr1h
eor #$80
sta ssqr1l
sta ssqr1h
eor #$ff
sta ssqr2l
sta ssqr2h
eor #$80
sta sqr2l
sta sqr2h
sec
lda :3 ; hi
eor #$80
tay
lda (ssqr1l),y
sbc (ssqr2l),y
sta :4+1
lda (ssqr1h),y
sbc (ssqr2h),y
sta :4+2
sec
ldy :2 ; lo
lda (sqr1l),y
sbc (sqr2l),y
sta :4
lda (sqr1h),y
sbc (sqr2h),y
clc
adc :4+1
bcc t0
inc :4+2
t0 sta :4+1
lda :1
bpl endmul
; fix sign
lda :4
eor #$ff
clc
adc #1
sta :4
lda :4+1
eor #$ff
adc #0
sta :4+1
lda :4+2
eor #$ff
adc #0
sta :4+2
endmul
.endm
sqrl1 to tablica funkcji f(x) = (x*x)/4 gdzie x jest liczba bez znaku
ssqrl2 to tablica funkcji f(x) = (x*x)/4 gdzie x jest liczba ze znakiem
(dla przypomnienia: a*b = f(a+b) - f(a-b) )
takie cos zajmuje srednio ~130cykli, w najgorszym wypadku 156...
problem polega na tym ,ze tracimy ~40cykli na zmiane znaku wyniku (i mnoznika)
czy da sie jakos sprytnie skonstruowac tablice, tak aby nie tracic czasu na te operacje?
gdzies kiedys czytalem na jakims forum c64 ,ze da sie pomnozyc 16bitsigned by 8bit signed w <100cykli, mysle ,ze ich procedura byla podobna tylko miala lepsze tablice, tak ,ze nie trzeba bylo odwracac wyniku, dzieki czemu mogli to zrobic w <100cykli...
pytanie tylko jak takie tablice maja wygladac...