ASEMBLER 6502 (cz.V)

ROLOWANIE BAJTW I NIE TYLKO


	Zawarto komrek moemy nie tylko doda-
wa lub odejmowa (co ju od dobrego mie-
sica umiemy). 6502 daje nam take bogate
moliwoci PRZESUWANIA bitw w obrbie jed-
nego bajtu. Wiemy, e bajt skada si z omiu bi-
tw, z ktrych kady moe mie warto 0 lub 1.
Jeeli uoymy je wszystkie w jednej linii, moemy
je potraktowa jako osiem dwjkowych rzdw
wielkoci. Wemy jakkolwiek liczb. Niech to b-
dzie dla przykadu 105. Po przeoeniu tego na
ukad dwjkowy dostaniemy liczb 01101001. Jeli
przesuniemy to co mamy o jeden bit w lewo (po
prawej stronie wstawiajc 0), dostaniemy liczb
11010010. Krtkie obliczenia (128+64+16+2)...
wynik: 210! Czyli dokadnie dwa razy wicej!
Oznacza to, e przesunicie bitw w lewo jest rw-
noznaczne z pomnoeniem danej liczby przez
dwa. Czy mona wycign z tego wniosek, e
przesunicie bitw w prawo to nic innego jak po-
dzielenie liczby przez dwa? Waciwie tak. Kady
bit przekae swoj zawarto ssiadowi po prawej.
A wiemy, e ssiad po prawej ma dwa razy mniej-
sz warto liczbow. Dlatego te moemy podej-
rzewa, e zaiste tak bdzie.
	Wemy wic znowu 105 (czyli %01101001, pro-
centem programici zwykli poprzedza liczby zapisa-
ne dwjkowo, podobnie jak dolarem - szesnastko-
so) i przesumy w prawo (po lewej wstawiajc 0).
Mamy wic %00110100, czyli (32+16+4) 52. A
przecie 105 na 2 to 52,5! Co stao si z brakujcymi
0,5? Przyjrzyjmy si naszym liczbom dwjkowym.
W pierwszej mamy cztery jedynki, w drugiej za ju
tylko 3. Wniosek z tego taki, e nie moemy ot tak,
po prostu wyrzuca na mietnik niepamici bitw,
ktre wypady nam poza bajt podczas przesuwania.
Trzeba je gdzie wstawia. Potrzebny jest nam cho
jeden bit, do ktrego atwo bdzie si dosta.
Jak znalaz jest tutaj flaga przeniesienia (bit C,
czyli Carry). Przeniesienie przecie po to wanie
istnieje, by wstawia do bity, ktre "wyskoczyy"
nam podczas jakich operacji arytmetycznych poza
przewidziane osiem bitw. Tak wanie dziaaj roz-
kazy ASL i LSR.
	ASL to przesunicie zawartoci bajtu w lewo
(Arithmetic Shift Left). Jeeli wykonamy je na ja-
kiej komrce, bity 0 - 6 przesun si o jedno
oczko w lewo. Jako nowy bit 0 wstawione bdzie 0.
Jeli stary bit 7 by jedynk, flaga C zostanie zapa-
lona, jeli za by zerem-zgaszona. Mam nadzie-
j, e klarownie objania to rys. 1.
	Sprawdmy, jak rozkaz ASL dziata w praktyce.
vlusimy napisa program, ktry wstawi do pamici
ak warto, nastpnie przesunie j w lewo i da
tam jako zna, jeli znacznik C zosta zapalony.


	*=$2710
	LDA #$40
	STA $2800
	ASL $2800
	LDA #$00
	BCC ZERO
	LDA #$01
ZERO	STA $2801
	BRK

	Uruchom program przez SYS 10000 albo
G2710. W komrce $2800 (dziesitnie 10240) znaj-
dzie si wynik przesunicia, w $2801 (10241) za
to, co znalazo si w znaczniku przeniesienia. Jeli
wpiszemy program tak, jak jest podany-w $2800
dostaniemy $80, a w $2801 - $00, czyli tak, jak to
byo do przewidzenia. Wpiszmy jednak w pierwszej
linii LDA #$ff, a potem uruchomimy program. $ff to
% 11111111. Po przesuniciu w lewo dostaniemy
wynik $fe, czyli %11111110. W komrce $2801
(czyli 10241) bdzie jedynka, ktra bierze si z
ostatniej jedynki bajtu poprzedniego. Powinna by
wic traktowana jako dodatkowy bit przesuwanego
przez nas bajtu. Proponuj troch si pobawi tym
programikiem-pomoe to dokadnie poj dziaa-
nie rozkazu ASL.
	Instrukcj odwrotn jest LSR. LSR to przesuni-
cie w prawo (Logical Shift Right). Ten rozkaz prze-
suwa bity w bajcie w prawo, przy czym skrajny pra-
wy bit jest wstawiany do C, za za skrajny lewy
komputer bierze 0. Dziaanie tego rozkazu objania
rys. 2 oraz ten oto niewielki programik:

	*=2710
	LDA #$40
	STA $2800
	LSR $2800
	LDA #$00
	BCC ZERO
	LDA #$01
ZERO	STA $2801
	BRK

	Po uruchomieniu programu -zgodnie z przewi-
dywaniami - w komrce $2800 znajdzie si $20
(32), czyli dwa razy mniej ni $40 (64). Wszystko
si wic zgadza.
	Para opisywanych rozkazw okazaa si jednak
niewystarczajc. Nie dla wszystkich bowiem za-
stosowa za nowy, skrajny bit mona byo przyj
0. Nie byoby te szczeglnie wygodne, gdyby za-
projektowa dwa rozkazy, ktre wstawiayby 1 za-
miast 0. Dla wikszej elastycznoci i wygody po-
wstaa wic dwjka ROL i ROR.
	ROL to ROtate Left, czyli obrcenie w lewo. Od
rozkazu ASL rni si tym, e jako skrajny prawy
bit wstawiane jest nie - 0, lecz to, co byo w C
PRZED wykonaniem rozkazu. Za to, co byo na le-
wym skraju, wchodzi do C (tak jak w ASL). Ilustruje
to rysunek 3 oraz ten oto program:

	*=$2710
	SEC
	LDA #$40
	STA $2800
	ROL $2800
	LDA #$00
	BCC ZERO
	LDA #$01
ZERO	STA $2801
	BRK

	W komrce $2800 znajdzie si $81, czyli
%10000001. $40 to 101000000. Jedynka, ktra
zostaa przeniesiona z szstego do sidmego bitu
a to, co byo w przeniesieniu, pojawio si po pra-
wej. Jeeli napiszemy CLC zamiast SEC, wynik
bdziemy mieli identyczny, jak w przypadku ASL
-jako bit zerowy bdzie 0.
Rozkazem, ktry dziaa w stron przeciwn jest
ROR. ROR to skrt od angielskich sw ROtate
Right, czyli obr w prawo. Jak wskazuje nazwa,
przesuwa on zawarto bajtu w prawo. Poza tym w
miejsce bitu sidmego wstawia zawarto Carry, a
to, co byo w bicie zerowym, do przeniesienia od-
sya. I bardzo dobrze (rys. 4).

	*=$2710
	SEC
	LDA #$40
	STA $2800
	ROR $2800
	LDA #$00
	BCC ZERO
	LDA #$01
ZERO	STA $2801
	BRK

	Po wykonaniu w $2800 dostaniemy z $40 (czyli
%00010000) liczb $a0 (%10001000). W $2801,
zgodnie z przewidywaniami bdzie 0 - bit zerowy
by zgaszony.
	Oczywicie, rozkazy te su nam nie tylko do
przesuwania jakich abstrakcyjnych bajtw w pra-
wo czy w lewo. Mog si nam przyda, jeli np. b-
dziemy chcieli sprawdzi po kolei bity danego baj-
tu, jeeli bdziemy chcieli zrobi procedur pyn-
nego przesuwania napisw na ekranie graficznym
albo mnoy/dzieli co przez wielokrotnoci 2.


					BARTOMIEJ KACHNIARZ

Rys. 1
		ASL
	C <- 7 6 5 4 3 2 1 0 <- 0	


Rys. 2
		LSR
	0 -> 7 6 5 4 3 2 1 0 -> C


Rys. 3
		ROL
	->---------->---------->-
	- 7 6 5 4 3 2 1 0 <- C <- 

Rys. 4
		ROR
	-<----------<----------<-
	-> C -> 7 6 5 4 3 2 1 0 -

