Obroty bitowe
From Atariki
Wersja z dnia 20:04, 9 paź 2012
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.
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łądów jest prostota (są łątwe 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ścieji 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.
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.