Ujemne indeksowanie: Różnice pomiędzy wersjami

Z Atariki
Przejdź do nawigacji Przejdź do wyszukiwania
merge
mNie podano opisu zmian
 
(Nie pokazano 1 pośredniej wersji utworzonej przez tego samego użytkownika)
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 jest 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: w łańcuchu ''tab'' o długości ''n'' szukamy wartości przekazanej w akumulatorze:


<pre>
<pre>
       LDY #$ff-L
       LDY #-n
_DO  CMP TAB-($ff-L),Y
_DO  CMP tab-$0100+n,Y
       BEQ _JEST
       BEQ znaleziono
       INY
       INY
       BNE _DO
       BNE _DO
</pre>
</pre>


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.
Operacje na wielu kolejnych bajtach, jak kopiowanie danych z miejsca na miejsce, dodawanie, odejmowanie lub porównywanie 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:
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:
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

Aktualna wersja z 5 wrz 2011, 14:55

Ujemne indeksowanie używane jest przy wyszukiwaniu rosnącym, można zaoszczędzić w ten sposób porównanie w rejestrze indeksowym.

Przykład: w łańcuchu tab o długości n szukamy wartości przekazanej w akumulatorze:

      LDY #-n
_DO   CMP tab-$0100+n,Y
      BEQ znaleziono
      INY
      BNE _DO

Operacje na wielu kolejnych bajtach, jak kopiowanie danych z miejsca na miejsce, dodawanie, odejmowanie lub porównywanie 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).