ASEMBLER 6502 (cz.VI)

ROZKAZ CMP ET CONSORTES


	Czy pamitacie jeszcze, jak w upalne lipco-
we dni wypisywalimy na ekranie jakie
dziwne stowa o maniakach i ptlach?
Tak? To dobrze. Nie? To nieszczeglnie dobrze
- powtrne przejrzenie tego odcinka nie zaszko-
dzi. Co my tu mamy... CPX - instrukcja, ktra
wtedy wtanie pierwszy raz si pojawia. A suy-
a... do porwnania zawartoci rejestru X z poda-
n liczb.
Tu wypada postawi pytanie: na jakiej zasa-
dzie rozkaz ten dziaa? Komputer odejmuje licz-
b podan jako argument (albo te zawarto
komrki podanej jako argument, ale to i tak na
jedno wychodzi) od zawartoci rejestru X. Tu
trzeba jeszcze zauway, e odejmowanie to
odbywa si bez przeniesienia, czyli stan flagi C
przed wykonaniem tego rozkazu nie ma wpy-
wu na wynik (czyli inaczej ni w SBC!). Sam
wynik nie jest nigdzie przechowywany, ale - e-
by cae nasze dziaanie nie poszo na marne -
komputer odpowiednio do wyniku wygasza lub
zapala znaczniki: Zera, Przeniesienia i Liczby
ujemnej.
Ale jak w praktyce wyglda ta "odpowie-
dnio"? Najpierw zbadajmy zachowanie znacz-
nika Zero. Wiemy, e jeli znacznik ten jest zapa-
lony, to oznacza to, e wynikiem ostatniej opera-
cji matematycznej byo zero. Jeeli za wynik by
rny od zera, to flaga C bdzie zgaszona. Wpi-
szmy wic, tak dla prby, ten oto program:

	*=10000
	LDA #"0"
	LDX #$17
	CPX #$17
	BEQ PISZ
	LDA #"1"
PISZ	STA $0400
	RTS

	Uruchamiamy nasz program i... co widzimy?
W lewym grnym rogu ekranu pojawio si zero.
Dlaczego tak si stato? Zanalizujmy program.
Najpierw do akumulatora wstawiamy liczb $30,
co odpowiada kodowi ekranowemu zera. Potem
do rejestru X wstawiamy liczb $17, zaraz za
potem porwnujemy zawarto X z liczb $17
(przy czym sama liczba nie jest tu a taka istot-
na; wane, by bya w obu rozkazach taka sama).
Po operacji porwnania nastpuje nowy rozkaz:
BEQ. BEO $adres to rozkaz, po wydaniu ktrego
komputer sprawdza stan flagi Zero. Jeli flaga ta
jest zgaszona, to ze spokojem przechodzi do na-
stpnego rozkazu. Jeeli za znacznik jest zapa-
lony, to program skacze do komrki o podanym
adresie. BEO to skrt angielskich stw "Branch if
EQual to zero", czyli (ttumaczenie wolne) "skocz,
jeli wynik rwny by zeru". Oznacza to, e jeli
wynikiem operacji CPX #$17 byo 0, to skoczy
trzeba do $271a (oznaczonego etykiet PISZ).
Tam znajduje si, znany nam ju, rozkaz STA
powodujcy wydrukowanie zera w lewym gr-
nym rogu ekranu.
	Dobrze. Wszystko dziaa wic zgodnie z prze-
widywaniami. Zrbmy teraz may eksperyment:
zmie liczb przy rozkazie CPX na - dajmy na to
- $47 albo $00 - byle nie byo to $17. Uruchom
teraz program. I co? Znowu jest zero? Nie! Tym
razem w rogu ekranu pojawia si jedynka. O
czym to wiadczy? Przejrzyjmy jeszcze raz pro-
gram... Najwyraniej rozkaz BEQ nie zostat wy-
konany, przez co do akumulatora wzita zostaa
liczba $31 (oznaczajca jedynk). Mamy wic
pierwsze konstruktywne wnioski: jeeli argument
przy rozkazie CPX rwny jest zawartoci rejestru
X, to zapala si wskanik Zero. Jeli liczby te b-
d rne, wskanik ten ganie.
	Sprawdmy teraz, jak - w zalenoci od argu-
mentw - zachowa si wskanik Przeniesienia,
czyli C. Zmodyfikujmy nasz program tak, by wy-
glda jak ten listing:

	*=$10000
	LDA #"0"
	LDX #$17
	CPX #$15
	BCC PISZ
	LDA #"1"
PISZ	STA $0400
	BRK

	Przed prb uruchomienia winien jestem je-
szcze wyjanienia na temat nieznanego dotd
rozkazu: BCC. BCC to kolejny skok warunkowy.
Jego wykonanie zalene jest od stanu znacznika
C, czyli Przeniesienia. Jeli C jest zgaszone, to
komputer skacze do miejsca pamici podanego
jako argument rozkazu. Jeli C jest zapalone, to
rozkaz jest ignorowany. Skrt BCC (bo wszystkie
mnemoniki asemblera procesora 6502 to TLS-y*,
po prostu) oznacza "Branch if Carry Clear", czyli
"skocz, jeli znacznik przeniesienia jest zgaszo-
ny". Wszystko jasne?
	To jadziem. Wynikiem dziaania programu jest
tym razem jedynka. Oznacza to, e flaga C jest
zapalona. Proponuj teraz kilka prb ze zmian
liczby przy rozkazie CPX. (Teraz Ty dziaasz!)
No i co? Masz ju gotowe wnioski? Jeli tak, to
porwnajmy je z moimi. Mi wyszo, e:
1) Jeli zawarto rejestru jest wiksza ni liczba
przy rozkazie porwnania, to znacznik C bdzie
zapalony.
2) Jeli zawarto rejestru jest rwna liczbie przy
rozkazie porwnania, to znacznik C bdzie zapa-
lony.
3) Jeli zawarto rejestru jest mniejsza ni licz-
ba przy rozkazie porwnania, to znacznik C b-
dzie zgaszony.
Teraz zmie w linii BCC $271 a (czy te BCC
PISZ) mnemonik BCC na BCS. Rozkaz BCS
oznacza "Branch if Carry Set", czyli "skocz, jeli
znacznik przeniesienia jest zapalony", za jego
dziaanie jest dokadnie odwrotne ni BCC. Teraz
jeli uruchomimy program, wyniki bd dokadnie
odwrotne ni poprzednio. Wiadomo dlaczego?
Kolejnym znacznikiem, na ktry wpywa ma
rozkaz CPX, jest znacznik Liczby ujemnej. Po
zmianie rozkazu skoku program wyglda bdzie
tak:

	*=10000
	LDA #"+"
	LDX #$17
	CPX #$15
	BPL PISZ
	LDA #"-"
PISZ	STA $0400
	RTS

	Nowy rozkaz BPL oznacza "Branch if PLus",
czyli "skocz, jeli dodatnia". Tym razem skok za-
lee wic bdzie od faktu, czy wynik ostatniej
operacji bdzie ujemny czy dodatni. W artytmety-
ce dwjkowej przyjtej przez projektantw ukadu
6502 (czyli tego procesora, ktry siedzi w Twoim
C-64), liczby ujemne odrnia si od dodatnich
tym, e maj one zapalony sidmy, najstarszy
bit. I to wtanie jest najmieszniejsze. Jeeli
masz np. liczb %10010011, to nigdy nie wiesz,
czy dziesitnie jest to (128+16+2+1) 147, czy te
(-16-2-1) -19. Po prostu nie wiadomo. Dlatego
te korzystanie z liczb ujemnych w asemblerze
jest, delikatnie mwic, ograniczane w miar
moliwoci. Zwtaszcza, e w bajcie, ktrego
pierwszy bit jest stracony na znak liczby, mieci
si dokadnie dwa razy mniej informacji ni w
zwykym. Pomimo tego wszystkiego ze wskani-
ka Liczb ujemnych (Negative) przydaje si korzy-
sta w innych sytuacjach. Przy wsppracy z roz-
kazem CPX zastosowanie jego jest jednak do
ograniczone.
	Teoretycznie wskanik N zostaje zapalony,
gdy zawarto rejestru jest mniejsza od liczby,
do ktrej chcemy j porwna. W rzeczywistoci
napotykamy jednak kilka problemw. Na przy-
kad, gdybymy wzili liczb $ff (255) i porwnali
j z liczb $04 (4), to flaga N zostaaby zapalona.
Czyli 4 ma by wiksze od 255? Ale numer! A to
wynika po prostu z tego, e liczba 255 jest zbyt
dua, by mona do niej stosowa zasady ujem-
noci. Ujemne liczby musz si zawiera midzy
-127 a 127. Inaczej wychodz brednie. Podobne
brednie wychodz i w innych przypadkach. Czyli.
do wynikw rozkazu BPL powinnimy zachowa
do daleko idc rezerw i stara si nie nadu-
ywa tego skoku.
	Rozkazem przeciwnym BPL jest BMI ("Branch
if Mlnus", "skocz, jeti ujemna"). Stosowanie jego
napotyka podobne kopoty jak BPL.
	Cierpliwy i uwany Czytelnik zapewne zauwa-
y ju, e jako dziwnie tekst nie jest powizany
z tytuem. W nagwku jest bowiem mowa o ja-
kim CMP, za my - jak do tej pory - zajmujemy
si tylko tymi "consortes". Czas wreszcie przed-
stawi gtwnego bohatera: rozkaz CMP!
	CMP oznacza "CoMPare accumulator" czyli
"porwnaj akumulator". Dziaanie jego jest iden-
tyczne, dokadnie takie samo - prcz jednego
szczeglika - jak CPX. Szczeglikiem tym jest
fakt, e jako "miso armatnie" do porwnywania
nie idzie zawarto rejestru X, a samego akumu-
latora. W wiecie rozkazu CMP nie moe - skoro
jest rozkaz CPX odpowiedzialny za rejetr X - za-
brakn rozkazu porwnania dla rejestru Y. Roz-
kazem tym jest CPY ("ComPare Y", "porwnaj Y).
Analogicznie, wszystkie flagi ustawiane s doka-
dnie tak samo, jak po rozkazach CMP i CPX.

					BARTEK KACHNIARZ

' TLS to skrt od stw TrzyLiterowy Skrt. Zwrotu
tego uywamy, gdy chcemy zrobi na kim dobre
wraenie lub zaciemni nieco sytuacj.


Dzi poznalimy rozkazy:

CMP - porwnanie zawartoci akumulato-
ra z podan liczb

CPY - porwnanie zawartoci rejestru Y z
podan liczb

BEQ - skok do podanego adresu, pod wa-
runkiem, e wynikiem ostatniej ope-
racji matematycznej byo 0.

BCC - skok do podanego adresu, pod wa-
runkiem, e w wyniku osstatniej
operacji matematycznej znacznik
przeniesienia zosta zgaszony.

BCS - skok do podanego adresu, pod wa-
runkiem, e w wyniku ostatniej ope-
racji matematycznej znacznik prze-
niesienia zosta zapalony.

BPL - skok do podanego adresu, pod wa-
runkiem, e wynikiem ostatniej ope-
racji matematycznej bya liczba do-
datnia.

BMI - skok do podanego adresu, pod wa-
runkiem, e wynikiem ostatniej ope-
racji matematycznej bya liczba
ujemna.
