ASEMBLER 6502 (cz.10)

KIEDY DWA PLUS DWA RWNA SI DWA...


   Nielogiczny tytu? Wrcz przeciwnie! Tym
razem bdziemy mwi wanie o logice i
operacjach logicznych. Najpierw jednak
napiszemy program, ktry przedstawi nam
zawarto jednego bajtu, niech bdzie to bajt
zawarty w akumulatorze, w postaci zer i
jedynek (mog to by literki a i b, gwiazdki i
kropki, kka biae i kka czarne - co tylko
chcecie). Zera te i jedynki niech wywietli
gdziekolwiek na ekranie. Na ten przykad
w lewym grnym rogu. Albo na rodku. Jak
zrobimy taki program? Musimy po kolei
sprawdzi wszystkie bity bajtu i zalenie od
tego wydrukowa na ekranie odpowiednie
znaki. Mona to zrobi np. za pomoc instruk-
cji ROL lub ROR, przerolowujc cacy bajt w
jedn stron. Dziki temu za kadym razem w
C otrzymamy wiadomo, jaka bya zawarto
kolejnego bitu. Jeli nie pamitacie
szczegw, odsyam do numeru listopado-
wego, AD 1992. O przesuwaniu bajtw
powiedziaem tam wystarczajco duo.

BIT PO BICIE

   Tym razem jednak wykorzystamy inny
rozkaz, tak rzadko wydawany, e zrobio mi
si go al i postanowiem wykorzysta go we
waciwym dla niego celu. w nieszcznik
nazywa si BIT i zazwyczaj suy do cyklowa-
nia rastrw. Gwnie dlatego, e nic konkret-
nego nie robi, a zajmuje dwa lub trzy cykle (a
trzeba Wam wiedzie, e takie instrukcje to
nie lada gratka podczas intensywnego cyk-
lowania). Oczywicie jednak umieszczanie w
tak ascetycznym procesorze dwch instrukcji,
ktre nic nie robi (ta i NOP) byoby rozrzut-
noci. Co wic jednak BIT robi. Wykonuje
mianowicie operacj nazywan iloczynem
logicznym a suy do sprawdzania
poszczeglnych bitw (ang. Bit Testing). BIT
mona wykonywa jedynie na komrkach
pamici i to bez adnego indeksowania (nie
ma tu ani ,X ani ,Y). Sam wynik testowania nie
jest nigdzie zapisany, a do dyspozycji mamy
jedynie wskanik Zero (ktry - jak wiadomo -
ustawia si na 1, kiedy wynikiem ostatniej
operacji byo wanie zero), niemiertelne
Negative (liczby ujemne) i oVerflow
(przepenienie). Do N kopiowany jest sidmy
(najstarszy) bit sprawdzanej komrki pamici,
a do V - bit szsty. Rozkaz ten sprawdza
wynik iloczynu logicznego zawartoci akumu-
latora i komrki pamici.

ILOCZYN LOGICZNY

   Nie wiecie, co to jest iloczyn logiczny, tak?
To bardzo proste, a najatwiej wyjani to na
liczbach dwjkowych. Iloczyn logiczny 1 i 1
wynosi 1. Dla 1 i 0 wynikiem jest 0, dla 0 i 0 -
te zero. Zasadniczo wic przy jednej liczbie,
rwnej jeden lub zero, wynik iloczynu log-
icznego jest taki sam, jak zwykego iloczynu:

1 * 1 = 1
1 * 0 = 0
0 * 0 = 0

   Jasne? Przy sprawdzaniu iloczynu dwch
liczb duszych ni jednobitowe, operacji tej
ulegaj wszystkie bity po kolei. Na wyjciu za
jedynki mamy tylko tam, gdzie w dwch
poprzednich liczbach mielimy bity zapalone.
Na przykadzie:

00111111
11111000
--------
00111000
   
   W najniszym bajcie mamy wynik iloczynu
logicznego dwch poprzednich liczb. Jedynki,
czyli zapalone bity, s tylko na tych pozycjach,
na ktrych w OBU poprzednich mielimy po
jedynce. Jasne? Jasne? (Jak mawia jeden z
Vonnegutowskich bohaterw). W sumie jed-
nak cay ten wynik nie jest nigdzie prze-
chowywany. Komputer interesuje si tylko, czy
na wyjciu bya chocia jedna jedynka. Jeli
tak, Z pozostanie ciemne.
   Teraz wic napisz program, ktry po kolei
przetestuje wszystkie bity wchodzce w skad
bajtu przechowywanego w akumulatorze.
Wynik niech bdzie przedstawiony w jakikol-
wiek, byle czytelny, sposb. Wynik dziaania
swojego programu proponuj porwna z
moim, przykadowym. Program ten przyda si
nam na pniej, eby w praktyce przyjrze si
dziaaniu pozostaych dziaa logicznych.
Jeszcze jedna uwaga techniczna: przyjmijmy,
e program zacznie si od $2800.

	*=$2800
	STA $02
	LDA #$OD
	JSR $ffd2
	LDA #$80
TEST	TAX
	BIT $02
	BNE JEDEN
	LDA #"0"
	JSR $ffd2
	JMP DALEJ
JEDEN	LDA #"1"
	JSR $ffd2
DALEJ	TXA
	ROR
	BCC TEST
	RTS

BO W TYM CAY JEST AMBARAS...

   Majc teraz przygotowany dobrze grunt,
moemy zaczyna na dobre (no, i na ze te!)
zabawy z operacjami logicznymi. Pierwsz z
nich niech bdzie AND, czyli "i", czyli iloczyn
logiczny. Jak TO dziaa, z grubsza ju wiemy.
Najwaniejsz rnic midzy AND a BIT jest
to, e wynik AND nie ulatnia si w przestrze
kosmiczn (jak to si dzieje w przypadku
drugiego rozkazu), lecz jest uczciwie zapisy-
wany w akumulatorze, bymy mogli zrobi z
nim wszystko, co tylko przyjdzie nam do gw.
Odpowiednio do wyniku operacji zmienia si
wskanik Z, za sidmy bit wyniku lduje w N.
Zobaczmy wic, co NAPRAWD stanie si,
gdy wykonamy operacj %00111111 AND
%11111000.

	*=$2710
	LDA #%00111111
	AND #%11111000
	JMP $2800

   Jeli masz w pamici BIT - TESTER, uru-
chom ten krciutki programik przez SYS
10000 / G 2710. No i co widzimy? (Widzimy
oczywicie wynik 00111000, chyba, e
klniemy przed czarnym monitorem, bo elek-
trowni akurat zachciao si wyczy prd).
Mamy oto adny fakt na poparcie moich
wywodw o BIT i AND. Ale iloczyn to nie jedy-
na znana matematykom i 6502 operacja log-
iczna.

JEST JESZCZE SUMA

...czyli ta operacja, ktra ju niedugo pokae
nam, e tytu z tego miesica ma jakie takie
resztki sensu. Suma logiczna to operacja OR,
czyli LUB. W 6502 odpowiada jej rozkaz ORA
(OR Accumulator). LUB, podobnie jak I,
potrzebuje na wejciu dwch liczb, z ktrych
na wyjciu robi jedn. I tak:

1 lub 1 = 1
1 lub 0 = 1
O lub O = 0

   Czyli jeli jedna LUB druga liczba jest
jedynk, to wyjcie te si ni stanie. A jak
bdzie z caymi bajtami? Sprbujmy
wywietli sobie sum 2 i 2 (logiczn sum, of
course (jak mawiaj Anglicy)):

	*=$2710
	LDA #2
	ORA #2
	JMP $2800

   I co dostalimy jako wynik? %00000010,
czyli - po przeniesieniu na system dziesitny -
2. I bardzo dobrze.

W RNOCI SIA

   Trzecim rozkazem, jaki dzi poznamy bdzie
EOR, co tumaczy si jak Exclusive OR, za
po naszemu mwi na to suma modulo 2. Ma ona
to do siebie, e wstawia jedynki tam na wyjciu,
gdzie na wejciu bya dokadnie jedna jedynka.
Jeli oba wejcia byty takie same (dwa zera albo
dwie jedynki) to na wyjciu pojawi si zero.
Wyglda to tak:
1 eor 0 = 1
O eor 1 = 1
O eor O = 0
1 eor 1 = 0

	*=$2710
	LDA #%01010110
	EOR #%11000111
	JMP $2800

Zgodnie z moimi dowiadczeniami Wam te
powinno wyj %10010001.

NOT, CZYLI NEGACJA

   Asembler 6502 nie ma bezporednio rozkazu
NOT, ktry normalnie suy do zmiany bitw na ich
przeciwiestwa:
not 1 = 0
not 0 = 1
   Mona jednak zasymulowa NOT za pomoc
EOR, zwyczajnie wstawiajc $ff jako mask, ot
tak:

	*=$2710
	LDA #%00111110
	EOR #%11111111
	JMP $2800
   Teraz znajome SYS 10000 lub G 2710 i
wynikiem jest... %11000001. Czyli to, czego
spodziewalimy si po negacji: zgaszone zostao
to, co byo zapalone, a ogie przenis si na to,
co byo zimne.
I to ju wszystkie operacje logiczne i
jednoczenie wszystko, co przygotowaem dla
Was w tym miesicu. Trzymajta si!

	AND z ORem w klapie
	BARTOMIEJ I. KACHNIARZ

W tym miesicu poznalimy rozkazy:

AND - wykonanie iloczynu logicznego na
zawartoci akumulatora oraz liczbie lub
zawartoci dowolnej komrki. Wynik zapa-
mitany w akumulatorze

BIT - wykonanie iloczynu logicznego na
zawartoci akumulatora oraz zawartoci dowol-
nej komrki. Wynik nigdzie nie zapamitywany.

EOR - wykonanie sumy modulo 2 na zawartoci
akumulatora oraz liczbie lub zawartoci dowol-
nej komrki. Wynik zapamitywany w akumula-
torze.

ORA - wykonanie sumy logicznej na zawartoci
akumulatora oraz liczbie lub zawartoci dowol-
nej komrki. Wynik zapamitywany w akumula-
torze.
