I tam, tak mi jechać po ambicji...
Ale wracajac do tematu.
Robimy takie cos:
A*B = 256*FA[Bhi+A] + 256*FB[Bhi-A] + FC[Blo+A] + FD[Blo-A]
FA/FB/FC/FD to rozne tablice podobne do f(x).
Teges polega ofkorz na tym, ze FB i FD traktujemy jako dodatnie.
Wtedy kod wyglada tak:
lda #:1 ; A-lo - signed
eor #$80
sta zal
sta zah
sta zcl
sta zch
eor #$ff
sta zbl
sta zbh
sta zdl
sta zdh
ldy #:2 ; B-lo - unsigned
clc
lda (zcl),y
adc (zdl),y
sta :4
lda (zch),y
adc (zdh),y
tax
; now X is a signed hi byte of A*Blo
lda #:3 ; B-hi - signed
eor #$80
tay
txa
ldx #0 ; we want X to start with 0 for positive and -1 for negative
cmp #0 ; this is ugly, perhaps can be done nicer, e.g. by bpl in the 2nd line
bpl *+3
dex ; lo byte negative
clc
adc (zal),y
bcc *+4
inx
clc
adc (zbl),y
sta :4+1
txa
adc (zah),y
clc
adc (zbh),y
sta :4+2
Dokladny kod, z tablicami opartymi o tablice pr0be (nie chcialo mi sie liczyc od nowa), jest tutaj: http://www.mimuw.edu.pl/~eru/math.asm
Da sie to jeszcze na pewno przyspieszyc, na przyklad wywalajac cmp #0, bo wartosc jest negatywna jesli nasze A bylo negatywne, wiec mozna zrobic 2 wersje (dla A negatywnego i pozytywnego) i w drugiej linicje zrobic bpl/bmi.
Inna sprawa, to nie jestem pewien, czy to na 100% dziala dla wszystkich przypadkow. Testowalem dla A/B z roznymi znakami i na oko dzialalo, ale milo by bylo jakby ktos to sprawdzil.
No i mysle, ze moze da sie ladniej rozwiazac problem liczenia res+1, bo odwalam tam rozne magie... Te zabawy z X bardzo mi sie nie podobaja. No ale czas spac...
Przy tej metodzie z kwadratami, inicjacja strony zerowej zajmuje ~30 cykli, odwolania do 8 komorek na stronie zerowej to 40+ cykli, wiec minimum 70 cykli na sam dostep do tablicy...
Anyway, kod ma ~110 cykli :)
Szybki update - jesli zalozymy ze Bhi mozemy czytac od razu zeorowane, to kawalek kodu przed tax wyglada tak:
...
lda (zch),y
ldx #0
adc (zdh),y
; now A is a signed hi byte of A*Blo
bpl *+3
dex
ldy #:3^$80 ; B-hi - signed
clc
adc (zal),y
...
I chyba jestesmy <100 cykli :D
: 404. Stopka not found