Ujemne indeksowanie
From Atariki
Wersja z dnia 09:28, 11 kwi 2009 KMK (Dyskusja | wkład) (merge) ← Previous diff |
Wersja z dnia 12:50, 5 wrz 2011 KMK (Dyskusja | wkład) (ujednolicenie zapisu z "inkrementacją i dekrementacją") Next diff → |
||
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 L. | + | przykład: szukamy wartości A w łańcuchu TAB o długości n. |
<pre> | <pre> | ||
- | LDY #$ff-L | + | LDY #-n |
- | _DO CMP TAB-($ff-L),Y | + | _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 #$fd ;$fd = $00 - (liczba bajtów w jednej zmiennej) | + | ldx #-n |
- | add lda aaa-$fd,x | + | add lda aaa-$0100+n,x |
- | adc bbb-$fd,x | + | adc bbb-$0100+n,x |
- | sta ccc-$fd,x | + | sta ccc-$0100+n,x |
inx | inx | ||
bne add | bne add | ||
Linia 40: | Linia 40: | ||
<pre> | <pre> | ||
clc | clc | ||
- | ldx #$fd ;$fd = $00 - (liczba bajtów w jednej zmiennej) | + | ldx #-n |
- | add lda zaaa+3,x | + | add lda zaaa+n,x |
- | adc zbbb+3,x | + | adc zbbb+n,x |
- | sta zccc+3,x | + | sta zccc+n,x |
inx | inx | ||
bne add | bne add |
Wersja z dnia 12:50, 5 wrz 2011
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).