Obroty bitowe
From Atariki
Wersja z dnia 20:14, 9 paź 2012 KMK (Dyskusja | wkład) (→Metoda nr 1) ← Previous diff |
Aktualna wersja 0xF (Dyskusja | wkład) (obrót w lewo o dwa bity, zamiana nibbli) |
||
Linia 1: | Linia 1: | ||
- | [[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. | + | [[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. | W poniższych przykładach dana wejściowa znajduje się w akumulatorze. | ||
Linia 35: | Linia 35: | ||
adc #$00 ;zlapanie C do bitu 0 | adc #$00 ;zlapanie C do bitu 0 | ||
- | Jak wyżej, 4 takty zegara i jeden bajt mniej niż w metodzie nr 1. | + | 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: metoda nr 2 == | ||
Linia 47: | Linia 47: | ||
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 [http://6502org.wikidot.com/software-8-bit-rotations stąd]. | 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 [http://6502org.wikidot.com/software-8-bit-rotations 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 | ||
[[Kategoria:Niezbędnik kodera]] | [[Kategoria:Niezbędnik kodera]] |
Aktualna wersja
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