hmm...
mnozenie przez 256 mozna latwiej i o wiele szybciej zrobic tak: powiedzmy ,ze chcesz pomnozyc liczbe 16bitowa przez 256 (wynik 24bit)
lda liczba
sta wynik+1
lda liczba+1
sta wynik+2
lda #$00
sta wynik
dzielenie liczby 16bitowej (ze znakiem) przez 512 mozna zrobic szybciej po przez pominiecie najmlodszego bajtu (czyli podzielenie przez 256) oraz podzielenie tego przez 2 (256*2=512):
lda liczba+1 ; starszy bajt liczby do podzielenia
bmi _ujemna
lsr @
sta wynik ; wynik 8bitowy
jmp _dalej
_ujemna eor #$ff
clc
adc #$01
lsr @
eor #$ff
clc
adc #$01
sta wynik
_dalej ...
jesli chodzi o szybkosc to dzielic przez 512 mozna tak :)
ldx liczba+1
lda div512tb,x
wystarczy miec teraz talibce 256 bajtowa, ktora tworzysz tak:
gendvtb ldx #$00
txa
bpl _neg
lsr @
sta div512tb,x
jmp _gendv
_neg eor #$ff
clc
adc #$01
lsr @
eor #$ff
clc
adc #$01
sta div512tb,x
_gendv inx
bne gendvtb+2
i masz dzielenie przez 512 liczby 16bitowej w 7-9cykli ;)
co do mnozenia liczby 8bitowej przez 8bitowa to jest bardzo dobry przyklad tutaj: http://www.6502.org/source/integers/fastmult.htm
korzysta on z zaleznosci, ze: a*b=f(a+b)-f(a-b), f(x)=x*x/4
chyba najlepszy i najszybszy sposob na mnozenie (pomijajac pamieciozerne tablice :>)
gorzej jesli chcesz pomnozyc WIEKSZE liczby ze znakiem, mialem ostatnio wlasnie taki problem...
ztablicowanie wynikow (8bit * 8bit) zajmie dokladnie cala pamiec atarynki, wiedz odpada...
mozna tak stworzyc tablice f(x) ,zeby dalo sie pomozyc liczby ze znakiem ale sa pewne ograniczenia:
jesli a+b>128 mamy przepelnienie
jesli a-b>128 mamy przepelnienie
wiedz np. nie pomnozymy liczby 124 razy 8 bo 124+8 daje nam -124 (w kodzie U2) wiedz mamy przepelnienie,
mozna zastosowac tutaj pewna wlasciwosc ,ze
a*b=(a_lo+256*a_hi)*b=(a_lo*b) + 256*(a_hi*b)
dzieki czemu mozna obliczyc mnozenie 16bit ze znakiem razy 8bit ze znakiem po przez 2 mnozenia 8bit*8bit ze znakiem, niestety takie cos zajmuje ~100cykli wiedz przy duzej ilosc mnozen to odpada...
ja ten problem rozwiazlem tak (mnozy 9bitowa liczbe ze znakiem razy 8bitowa liczbe ze znakiem):
; tmp,tmp+1 * Y
; bestcase: 10+mul+rts (unsigned by unsigned)
; worstcase: 37+mul+rts (unsigned by signed)
; worstcase: 35+mul+rts (signed by unsigned)
; worstcase: 26+mul+rts (signed by signed)
;
mul16 bmi neg0
lda tmp+1
bmi neg2
lda tmp
jsr mul
rts
neg2 lda tmp
eor #$ff
clc
adc #$01
jsr mul
tay
lda res
eor #$ff
clc
adc #$01
sta res
tya
eor #$ff
adc #$00
rts
neg0 lda tmp+1
bmi neg1
lda negtab,y
ldy tmp
jsr mul
tay
lda res
eor #$ff
clc
adc #$01
sta res
tya
eor #$ff
adc #$00
rts
neg1 lda negtab,y
sta tmp2
ldy tmp
lda negtab,y
ldy tmp2
jsr mul
rts
majac szybkie mnozenie 8bit*8bit=16bit res (takie jak w przykladzie z 6502.org) da to nam wynik w przyzwoitym czasie (oczywiscie jsr mul nalzy zastapic cala procedura mnozenia ,zeby nie tracic 12cykli na jsr+rts)
ale jesli to ma byc prosta scena 3d najlepszym i najszybszym sposobem jest zrobienie sobie tablicy sin(a)*x, i bez zadnego mnozenia mozemy obracac punkty w bardzo szybkim tepie (niestety bardzo pamieciozerne ;>, poniwaz przy 128katach i "gridzie" -64..64 tablica sinosow zajmuje nam 16384bajty...)
oczywiscie da sie ta tablice skrocic kosztem kilku(nastu) cykli np. wiedzadz ,ze -64*-43 to to samo co -(64*-43), dzieki czemu mozemy ztablicowac tylko wartosci dodatnie i przed mnozeniem sprawdzac znaki (a potem je zmieniac).
majac taka fajna tablice obrot punktu to poprostu pare linijek, cos w stylu tego:
ldy X
lda (costab),y
sec
ldy Y
sbc (sintab),y
sta newX
ldy X
lda (sintab),y
clc
ldy Y
adc (costab),y
sta newY
oczywiscie przed obrotem nalzy ustawic wskazniki sintab i costab tak aby wskazywaly do wartosci wynikow odpowiedniego dla danego kata:
lda katalfa
clc
adc #>sintab
sta sintab+1
lda katalfa
clc
adc #>costab
sta costab+1
lda #$00
sta sintab
sta costab
i robimy to tylko RAZ przed obrotem punktow.
jesli chodzi ogolnie o programowaniu 6502 to najlepsza strona jaka znalazlem jest: http://www.ffd2.com/fridge/chacking/
na niej praktycznie nauczylem sie programowac w asemblerze, co prawda przyklady sa dla c64 ale procesor jest ten sam, wiedz nie ma zadnego problemu, polecam nr 9 gdzie jest bardzo spory artykul o programowaniu 3d na 6502 (mnozenie, dzielenie, perspektywa, obroty, macierze itp)