Ujemne indeksowanie: Różnice pomiędzy wersjami
merge |
ujednolicenie zapisu z "inkrementacją i dekrementacją" |
||
| Linia 1: | Linia 1: | ||
Ujemne indeksowanie używane przy wyszukiwaniu rosnącym, można zaoszczędzić w ten sposób porównanie w rejestrze indeksowym. | Ujemne indeksowanie używane przy wyszukiwaniu rosnącym, można zaoszczędzić w ten sposób porównanie w rejestrze indeksowym. | ||
przykład: szukamy wartości A w łańcuchu TAB o długości | przykład: szukamy wartości A w łańcuchu TAB o długości n. | ||
<pre> | <pre> | ||
LDY # | LDY #-n | ||
_DO CMP TAB- | _DO CMP TAB-$0100+n,Y | ||
BEQ _JEST | BEQ _JEST | ||
INY | INY | ||
| Linia 27: | Linia 27: | ||
sta ccc+2 | sta ccc+2 | ||
</pre> | </pre> | ||
piszemy (zakładając, że ''aaa'', ''bbb'', ''ccc'' to zmienne w głównej pamięci): | piszemy (zakładając, że ''aaa'', ''bbb'', ''ccc'' to zmienne w głównej pamięci, a 'n' - rozmiar takowej w bajtach): | ||
<pre> | <pre> | ||
clc | clc | ||
ldx # | ldx #-n | ||
add lda aaa-$ | add lda aaa-$0100+n,x | ||
adc bbb-$ | adc bbb-$0100+n,x | ||
sta ccc-$ | sta ccc-$0100+n,x | ||
inx | inx | ||
bne add | bne add | ||
| Linia 40: | Linia 40: | ||
<pre> | <pre> | ||
clc | clc | ||
ldx # | ldx #-n | ||
add lda zaaa+ | add lda zaaa+n,x | ||
adc zbbb+ | adc zbbb+n,x | ||
sta zccc+ | sta zccc+n,x | ||
inx | inx | ||
bne add | bne add | ||
Wersja z 5 wrz 2011, 14:50
Ujemne indeksowanie używane przy wyszukiwaniu rosnącym, można zaoszczędzić w ten sposób porównanie w rejestrze indeksowym.
przykład: szukamy wartości A w łańcuchu TAB o długości n.
LDY #-n
_DO CMP TAB-$0100+n,Y
BEQ _JEST
INY
BNE _DO
Operacje na wielu kolejnych bajtach, jak kopiowanie danych z miejsca na miejsce, dodawanie lub odejmowanie liczb wielobajtowych itd. dobrze jest w celu skrócenia programu zapętlić w podobny sposób.
Zwłaszcza arytmetyka jest często zapisywana w postaci "rozpętlonej", gdyż sterujący pętlą rozkaz CPX lub CPY zmienia znacznik C rejestru znaczników procesora kasując tym samym informację o przeniesieniu arytmetycznym. Łatwo się jednak tego problemu pozbyć. Zamiast:
clc
lda aaa
adc bbb
sta ccc
lda aaa+1
adc bbb+1
sta ccc+1
lda aaa+2
adc bbb+2
sta ccc+2
piszemy (zakładając, że aaa, bbb, ccc to zmienne w głównej pamięci, a 'n' - rozmiar takowej w bajtach):
clc
ldx #-n
add lda aaa-$0100+n,x
adc bbb-$0100+n,x
sta ccc-$0100+n,x
inx
bne add
oszczędzając 13 bajtów pamięci. Gdy zmienne są na stronie zerowej, adresy należy zwiększyć:
clc
ldx #-n
add lda zaaa+n,x
adc zbbb+n,x
sta zccc+n,x
inx
bne add
Ten ostatni przykład NIE będzie działał w trybie natywnym 65C816 (bo wygenerowany adres, zamiast "zawinąć" się przez koniec strony zerowej do jej początku, zyska wartość powyżej $00FF).