Obroty bitowe
From Atariki
←Older revision | Newer revision→
6502 ma rozkazy obrotów w prawo ROR i w lewo ROL, są to jednak obroty dziewięciobitowe: w wyniku działania rozkazu skrajny bit bajtu trafia do znacznika C. Czasami zachodzi potrzeba zrobienia obrotu ośmiobitowego, w wyniku którego skrajny bit bajtu trafia na jego, by tak to określić, drugi koniec (i jednocześnie do C).
W poniższych przykładach dana wejściowa znajduje się w akumulatorze.
Spis treści |
Metoda nr 1
Obrót można zrealizować przy pomocy stosu. Obrót w prawo:
pha ;zapamietanie akumulatora: 000x000x lsr ;wysuniecie bitu 0 do C pla ;przywrocenie zawartosci akumlatora ror ;wsuniecie bitu C z lewej strony: x000x000
Analogicznie obrót w lewo:
pha ;zapamietanie akumulatora: x000x000 asl ;wysuniecie bitu 7 do C pla ;przywrocenie zawartosci akumlatora rol ;wsuniecie bitu C z prawej strony: 000x000x
Zaletą obu przykładów jest prostota (są łatwe do zapamiętania), poza tym jednak cztery rozkazy zajmują w sumie cztery bajty pamięci i 11 taktów zegara.
Obrót w lewo: metoda nr 2
Obrót w lewo można zrobić znacznie prościej i szybciej:
cmp #$80 ;ustawienie znacznika C wg stanu najstarszego bitu rol ;wsuniecie bitu C z prawej strony
4 takty zegara i 3 bajty kodu.
Obrót w lewo: metoda nr 3
asl ;wysuniecie bitu 7 do znacznika C adc #$00 ;zlapanie C do bitu 0
Jak wyżej, 4 takty zegara i jeden bajt mniej niż w metodzie nr 1. Różnica jest w stanie znacznika C: po wykonaniu tej sekwencji rozkazów będzie on skasowany.
Obrót w prawo: metoda nr 2
Obrót w prawo nie jest tak elegancki:
lsr bcc _skok ora #$80 _skok
5 lub 6 cykli i 5 bajtów: kod jest szybszy niż w metodzie nr 1, ale zajmuje więcej miejsca. To rozwiązanie zaczerpnięto stąd.
Obrót w lewo o dwa bity
asl adc #$80 rol
Powtarzając dwukrotnie uzyskujemy obrót o cztery bity, czyli zamianę nibbli. Źródło: http://6502.org/source/general/SWN.html