SŁODKA SZESNASTKA
...................NiE!, tekst nie traktuje o zaletach
licealistek w pewnym wieku, jakkolwiek temat
ten także wart jest poruszenia. Ale może
innym razem... Dziś skupimy się na
komputerach...
................Gdybym poprosił o wymienienie kilku
procesorów z rodziny Intel 80x86,to wątpię,
by ktokolwiek miał wątpliwości : 8086/88,
80286, 80386, 80486, Pentium. Pytanie o
procesory Motorola również nie nastręczą
trudności : MC 68000 zna każdy, nikt też
nie będzie miał większych kłopotów z 68020,
68030, 68040, czy 68060...
A rodzina 6502?
Tu zwykle zapada kłopotliwe milczenie, po
czym ktoś przypomina sobie na pół mityczne
65C02, a taki, co przyjmuje do wiadomości
istnienie c64 wymienia procesor 6510. I na
tym na ogół koniec....
A przecież rodzina ta jest całkiem pokaźna,
szczególnie jeżeli pamiętasz, że firma MOS
Technology zbankrutowała w zamierzchłej
przeszłości. Nie szukając daleko można
wymienić chociażby procesor 6507
znajdujący się w każdej stacji 1050, oraz
dalszych 9 (!?!) mutacji 6502 oznaczonych
symbolami 6501,6503-6506, oraz 6512-6516
Są to jednak tylko odmiany, a nie wersje
rozwojowe zwykłego 6502, z tych
wymieniliśmy na razie tylko 65C02.
I tu dochodzimy do sedna sprawy, mało
bowiem kto wie, że rodzina procesorów
65xx obejmuje również chipy
szesnastobitowe, co jest wiadomością
abstrakcyjną do chwili, kiedy dowiadujemy
się, że tak jak Intel 8086 zgodny jest
z 8080, tak i MOS 65C816 jest kompatybilny
z 6502. Innymi słowy, włożywszy go do
atarynki nie tracimy możliwości używania
starych programów ( o ile nie zawierają
nielegalnych rozkazów ), a zyskujemy kilka
dodatkowych, a interesujących możliwości.
Co to może?
Spójrzmy może na listę nowych trybów
adresowania - jest ich dziewięć :
- (zp) zwykły, nieindeksowany tryb
pośredni strony zerowej. Dostępny dla
wszystkich rozkazów, które w 6502 mają
tryb (zp),Y. LDA (zp) - pięć cykli.
- (abs,X) - tryb pośredni preindeksowany,
dozwolony dla rozkazów JMP ( 6 cykli ),
oraz JSR ( 8 cykli ) .
- (zp,S) - indeksowany wskażnikiem stosu
(ang. stack relative), pozwala na
swobodny i bezkonfliktowy dostęp do
dowolnych danych zgromadzonych na
stosie bez konieczności zdejmowania
stamtąd czegokolwiek!!! LDA w tym trybie
4 cykle!
- (zp,S),Y - indeksowany wskażnikiem stosu
pośredni. Coś w rodzaju zwykłego trybu
pośredniego postindeksowanego, jednak
agrument znajduje się nie na stronie
zerowej, ale na stosie. Tryb niezbyt
szybki ( 7 cykli ) ale użyteczny, jeżeli nie
chcemy lub nie możemy użyć strony
zerowej. A możemy nie móc, co wynika z
pewnej jej dodatkowej właściwości..... Ale
o tym potem...
- >long - absolutnie "długi". Coż to
oznacza? Ano, proszę wycieczki,
24-bitowy adres! Innymi słowy, jest
dostęp do 16Mb pamięci bez konieczności
przerzucania jakichkolwiek banków! Tryb
dowolny jest dla większości rozkazów
transferu danych (LDA), arytmetycznych
(ADC), logicznych (ORA), tudzież skoków.
LDA - 5 cykli.
- >long,X - "długi" indeksowany, chyba
łatwo się domyślić - też pięć cykli!
- [abs] - pośredni długi. Argumentem jest
tu 16-bitowy wskażnik do 24-bitowego
adresu docelowego. Tylko rozkaz JMP ( 7
cykli ).
- [zp] - strony zerowej pośredni długi,
24-bit-owy adres efektwyny znajduje się
na stronie zerowej. 6 cykli na LDA.
- [zp],Y - jak wyżej tylko postindeksowany
rejestrem Y. Też 6 cykli.
Jak widać, pamięć dzieli się teraz nie na dwa
ale na trzy obszary o różnym czasie
dostępu :
stronę zerową, następnie coś, co można by
nazwać bankiem zerowym, czyli adresy
$0000-$ffff, oraz całą resztę, czyli
adresy $010000-$ffffff o ile takowe
istnieją. Dostęp do tej "reszty" jest
oczywiście dłuższy, o jeden cykl w trybach
"długich", nie oznacza to jednak, że nie da
się tego cyklu zaoszczędzić.
-NOWE REJESTRY:-
Istnieją oto dwa dodatkowe, ośmiobitowe
rejestry adresowe, tzw. DATA BANK
REGISTER (rejestr B), oraz PROGRAM BANK
REGISTER (rejestr K). Rejestr B wskazuje
64-kilobajtowy bank, dokąd kierowane
będą odwołania starych, "krótkich" trybów
adresowania. Konsekwencją zmiany
zawartości tego rejestru (początkowo $00)
- jest niestety wydłużenie dostępu do
zmiennych sprzętowych, które można
osiągnąć jedynie przy użyciu adresowania
długiego. Może to być jednak pożyteczne,
jeżeli mamy dopał funkcjonujący w ten
sposób,że dostępy do banku $00
wykonywane są ze starą częstotliwością -
1.77 MHz, a do reszty banków z nową
powiedzmy czterokrotnie większą, czyli
7.08 MHz. Tak powstały "FAST RAM" staje
się dość atrakcyjnym miejscem do
wykonywania różnych obliczeń. Rejestr B
jest dostępny za pośrednictwem stosu
poprzez rozkazy PHB i PLB.
Rejestr K jest najstarszym (trzecim)
bajtem rejestru PC, czyli, innymi słowy,
wskazuje numer banku w którym znajduję
się aktualnie wykonywany kod. Sam PC jest,
niestety, wciąż szesnastobitowy, przez co
kod programu nie może przekroczyć
granicy banków inaczej, jak tylko
wykonując długie skoki JML (jump long) i
JSL (jump to subroutine long). Instrukcje
te są jedynym sposobem na ingerencję w
rejestr K, nie jest on jednak całkowicie
przed nami ukryty, można bowiem, podobnie
jak w wypadku rejestru B, odłożyć jego
zawartość na stos. Służy do tego rozkaz
PHK.
Reasumując, dostęp do adresów ponad standardowe 64K , może być realizowany dwojako, albo przez nowe, długie tryby adresowania, albo przez przemieszczanie w pamięci 64-kilobajtowego "okienka" i używanie tradycyjnych trybów adresowa- nia.
Dysponując wiekszą ilością pamięci, w
dodatku nieco dopalonej, można by się
pokusić nawet o "prawdziwy" sterowany
VBL-ami, multitasking...
Lista nowych rejestrów nie kończy się
jednak na B i K. Istnieje mianowicie jeszcze
16-bitowy rejestr D, który jest uwaga,
uwaga, wskaźnikiem strony zerowej! Inaczej
mówiąc, strona zerowa jest RUCHOMA w
obrębie bieżącego, wskazanego, przez
rejestr B, banku! Konsekwencją tego faktu
jest możliwość dostępdu do CAŁEJ!!!! pamięci
z szybkością właściwą dotąd dla strony
zerowej. Ustawienie rejestru B na wartość
$00 i rejestru D na $d000 daje nam, na
przykład, szybszy dostęp do rejestrów
GTIA, a skopiowanie tam zawartości wektora
SAVMSC - do pamięci ekranu!!! Do grzebania
w rejestrze D służą rozkazy PHD i PLD,oraz
TDC i TCD (dwa ostatnie to transfery, a
skąd i dokąd o tym za chwilę...).
Niestety, ruchomość strony zerowej może
nam, atarowcom, przysporzyć kłopotów.
Wyobraźmy sobie bowiem co się stanie,jeżeli
przy D ustawionym na $d000 wystąpi
przerwanie VBL??? Procedura obsługi
zechce przede wszystkim zwiększyć wartość
RTCLOCK, co zaowocuję bezsensowną akcję
na adresach $d012 - $d014. Toteż program
dokonujący tego typu eksperymentów,
jeżeli chce korzystać z przerwań, musi
mieć nad nimi pełną kontrolę...
Ostatnią nowością w dziedzinie rejestrów
adresowych jest długość wskażnika stosu.
Jest on mianowicie 16-bitowy, dzięki czemu
stos może znależć się gdziekolwiek i mieć
wielkość do 64Kb!
-STARE REJESTRY:-
Tu, proszę wycieczki, widać tradycyjną
trójcę : akumulator tudzież dwa rejestry
indeksowe, X i Y, Ale na tym tradycja się
kończy, wszystkie trzy bowiem są
szesnastobitowe, tak więc jednym rozkazem
LDA, LDX, lub LDY można łyknąć z pamięci
dwa bajty, co trwa ledwie dwa cykle dłużej,
niż normalnie, dzięki zaś dłuższym
rejestrom indeksowym obsługa wszelakich
dużych tablic jest dużo prostsza i szybsza.
Może ktoś już sobie zadał pytanie, jak to
jest z tą kompatybilnością. Przecież
szesnastobitowość rejestrów musi
powodować róznorakie zakłócenia, choćby
w propagacji przeniesień. W 6502 dodanie
$01 do $ff, daje $00, C=1, Z=1, tu natomiast
dałoby $0100, C=0, Z=0. Żeby nie wspominać
już o konsekwencjach przewinięcia się
stosu, który, mając 16-bitowy wskażnik,
nałoży się na stronę zerową!!!
I tu dochodzimy do rejestru statusu. Do
czego służy bit C, wszyscy wiedzą, jednak w
65C816 ma on dodatkową funkcję,
umożliwia ona przełączanie CPU między
dwoma trybami pracy: naturalnym (tzw.
native mode), oraz trybem emulacji 6502.
Służy do tego rozkaz XCE (2 cykle)
zamieniający wartości bitu Carry, oraz
niedostępnego wprost "przełącznika"
zwanego bitem E. Sekwencja CLC/XCE
powoduje przejście w tryb naturalny, SEC/
XCE - powrót w tryb emulacji.
W trybie emulacji zachodzi 100%
kompatybilność z 6502 (ściślej z 65C02),
rejestry A, X, Y są ośmiobitowe, starszy
bajt wskażnika stosu jest ustawiony na
$01, przerwania odkładają na stos
16-bitowe adresy powrotne itd. Dla
zachowania kompatybilności z
oprogramowaniem systemowym, tryb
emulacji jest w tym, w którym procesor się
"budzi" po każdym resecie. Dzięki temu
włożenie go do atarynki bez wymiany
systemu operacyjnego nie powoduje
dzikich efektów.
Po przełączeniu w tryb naturalny
rejestr statusu, który w 6502 jak wiemy
wygląda tak :
NV*BDIZC
zaczyna wyglądać nieco inaczej :
NVMXDIZC
Dawniej nie używany bit 5 ma obecnie
oznaczenie M, natomiast bit B traci swoją
pierwotną funkcję i zaczyna być bitem X.
Odpowiadają one za rozmiar akumulatora i
odwołań do pamięci (bit M), oraz za rozmiar
rejestrów indeksowych - skasowanie
znacznika włącza 16, ustawienie 8 bitów.
Można zadać sobie pytanie, dlaczego
zostało to urządzone właśnie tak, zamiast,
na przykład, prostego rozszerzenia listy
rozkazów o instrukcje operujące na
słowach (jak to zrobiono np. w Motoroli
68000), ano może dlatego, że teraz lista
rozkazów procesora 65C816 liczy 255
pozycji, tak więc, gdyby chcieć ją
rozszerzyć, trzeba byłoby zwiększyć
długość rozkazu do 16-bitów, co z kolei
sprawiło by, że rozkazy operujące na
słowach wykonywały by się nie 1(jak teraz)
tylko 2 cykle dłużej, niż rozkazy
operujące na bajtach (szyna danych jest
wciąż ośmiobitowa). To zaś powodowałoby
mniejszą efektywność napisanych
16-bitowo programów.
Jak zmienia się znaczniki M i X? Otoż nie ma
specjalnie do tego celu przeznaczonych
rozkazów w rodzaju SEC, czy CLV. Problem
operacji na rejestrze statusu rozwiązano
radykalnie, wprowadziwszy dwa nowe
rozkazy : SEP (set processor status bits),
oraz REP (reset processor status bits),
oba mają po 3 cykle. SEP działa na rejestr
P tak jak ORA na akumulator
(SEP #$=01 = SEC), REP kasuje bity
wskazane wa rgumencie (REP #$=01 = CLC).
Nie ma oczywiście sensu zastępować SEC
przez SEP #$=01, bo nowy rozkaz zajmuje 1
bajt i jeden cykl więcej, ale przy
ustawianiu lub kasowaniu większej liczby
znaczników rzecz może się już opłacić:
SEC SED SEI
to trzy bajty i sześć cykli, a równoważne
SEP #$=0D, to dwa bajty i trzy cykle.
Czy zmiana długości akumulatora wpływa na
działanie wszystkich rozkazów? Oczywiście
nie, np. transfer pomiędzy akumulatorem a
rejestrem D jest zawsze szesnastobitowy,
niezależnie od bieżącego trybu pracy CPU.
W takich sytuacjach 16-bitowy akumulator
oznacza się literką C. Teraz znaczenie
mnemonika TCD jest chyba jasne...
-NOWE WEKTORY:-
Pozostaje jeszcze drobna kwestia zmiany
znaczenia bitu B w trybie naturalnym. W
6502 jedyną jego funkcją jest, jak
wiadomo, zasygnalizowanie systemowi
operacyjnemu faktu, że właśnie
wykonywane przerwanie IRQ wywołane
zostało przez rozkaz BRK. Jak to odróżnić
w 65C816?
Otóż procesor ten ma drugi zestaw
wektorów przerwań. Stare wektory, tj.
NMIVEC, RESETVEC,i IRQVEC ($fffa - $ffff),
ważne są w trybie emulacji. W trybie
naturalnym zaś procesor używa pięciu(?!?!)
nowych :
$ffe4 - COPVEC, wykonanie rozkazu COP.
$ffe6 - BRKVEC, wykonanie rozkazu BRK.
$ffe8 - ABORTV, nieużywany w Atari.
$ffea - NMIVEC, przrwanie NMI.
$ffec - zarezerwowane
$fffe - IRQVEC, przerwanie IRQ.
Od razu rzuca się w oczy, że wektory te
znajdują się w zdecydowanie innym miejscu.
Możecie nie sprawdzać w ATARI OS, niczego
sensownego tam nie ma. I to jest następny
powód, dla którego program mający
działać w trybie naturalnym musi przepisać
ROM do RAM-u i mieć własną obsługę
przerwań. (Albo całkowicie je wyłączyć!)
-NOWE ROZKAZY:-
Ok! Pora na skrótową listę nowych
rozkazów z jeszcze krótszymi
objaśnieniami:
- BRA , Branch Always
Bezwarunkowy skok względny, 3 cykle.
- BRL , Branch Long
Bezwarunkowy skok względny długi.
Zasięg do 32Kb, 4 cykle.
- COP , Coprocessor Call
Wywołanie przerwania przerz wektor
COPVEC,zarezerwowane dla ewentualnego
koprocesora artmetycznego.
- DEA , Decrement Accumulator
DEC w trybie akumulatora, 2 cykle (nawet
16 bit)
- INA , Increment Accumulator
INA w trybie akumulatora, 2 cykle.
- HLT, Halt
Zatrzymanie pracy CPU i oczekiwanie na
przerwanie RESET, 3 cykle.
- JML , Jump Long
Długi skok bezwzględny o zasięgu do
16Mb, 4 cykle.
- JSL, Jump to Subroutine, Long
Długi skok do podprogramu, zasięg do
16Mb, 8cykli.
- MVN , Move Next
Transfer bloku pamięci o długości do
64KB w obrębie całych 16MB. 7 cykli na
transferowany bajt.
- MVP , Move Previous
Jak MVN, tylko w odwrotnej kolejności
bajtów. Odpowiednik instrukcji MOVE z
Turbo Basic'a XL!
- PEA , Push Effective Address
Odkłada na stos szesnastobitowe słowo
stanowiące argument, 5 cykli.
- PEI , Push Effective Address Indirect
Odkłada na stos szesnastobitowe słowo
odczytane ze strony zerowej.
Bezsensowny mnemonik, gdyż jest to w
istocie PEA (zp), 6 cykli.
- PER, Push Effective Address, Relative
Adres względny będący argumentem
przetwarzany jest na szesnastobitowy
adres efektwyny,przez dodanie go do
dwóch młodszych słów rejestru PC, a
wynik tej operacji ląduje na stosie.
Można w ten sposób symulować nie
istniejące rozkazy względnych skoków do
podprogramu:
PER *+5 BRL podprogram
- PHB , Push B
Rejestr B na stos, 3 cykle.
- PHD , Push D
Rejestr D na stos, 4 cykle.
- PHK , Pusk K
Rejestr K na stos, 3 cykle.
- PHX , Push X
Rejestr X na stos, 3 cykle (+1/16bit)
- PHY , Push Y
Rejestr Y na stos, 3 cykle (+1/16bit)
- PLB , Pull B
Rejestr B ze stosu, 4 cykle.
- PLD , Pull D
Rejestr D ze stosu, 5 cykli.
- PLX , Pull X
Rejestr X ze stosu, 4 cykle (+1/16bit)
- PLY , Pull Y
Rejestr Y ze stosu, 4 cykle (+1/16bit)
- REP , Reset Processor Status Bits
Kasuje bity w rejestrzee P, 3 cykle.
- RTL , Return from Subroutine, Long
Powrót po JSL, 6 cykli.
- SEP , Set Processor Status Bits
Ustawianie bitów w rejestrze P, 3 cykle.
- STZ , Store Zero
Zwany też CLR. Zerowanie bajtu, lub
słowaw pamięci. 3, lub 4 cykle (+1/16bit)
- TCD , Transfer Accumulator to D
Kopiuje 16-bitowy akumulator do
rejestru D. 2 cykle
- TCS , Transfer Accum to Stack Pointer
Kopiuje 16-bitowy akumulator do
wskażnika stosu. 2 cykle.
- TDC , Transfer D to Accumulator
Kopiuje rejestr D do akumulatora, 2
cykle.
- TSC , Transfer Stack Pointer to Accum
Kopiuje wskażnik stosu (cały) do
akumulatora. 2 cykle.
- TRB , Test and Reset Bits
Ustawia znaczniki N i V tak jak BIT, potem
robi AND negacji akumulatora i komórki
pamięci,a wynik odkłada w pamięci. 5, 6
cykli. (+1/16bit)
- TSB , Test and Set Bits
Ustawia N i V tak jak BIT, potem robi OR
akumulatora i komórki pamięci, a wynik
odkłada w pamięci. 5, lub 6 cykli.
(+1/16bit).
- TXY , Transfer X do Y.
Kopiuje rejestr X do Y. 2 cykle.
- TYX , Transfer Y do X.
Kopiuje rejestr Y do X. 2 cykle.
- WAI , Wait for Interrupt.
Procesor zostaje zatrzymany, do chwili
występienia jakiegokolwiek przerwania.
3 cykle.
- XBA , Exchange Accumulator Halves
Zamienia miejscami starszy i młodszy bajt
akumulatora. Działa zawsze, nawet w
trybie emulacji. Mnemonik jest kretyński,
gdyż sugeruje możliwość zmiany
rejestrów A i B (Data Bank Register),
dlatego niektórzy proponują tu SWA, lub
SWC - 3 cykle.
- XCE , Exchange Carry, and Emulation Bits.
Kopiuje bit C do bitu E i odwrotnie. 2 cykle.
-PO CO TO WSZYSTKO???-
Komu przydał by się procesor 65C816? Myślę, że przede wszystkim ludziom, których hobby stanowi wyduszenie z atarynki wszystkich soków i uzyskiwanie coraz bardziej niewiarygodnych efektów w demach. Już po skrótowym (tak!) omówieniu cech 65C816 widać, że dzięki nowym trybom adresowania i nowym rozkazom, nawet przy używaniu standardowej częstotliwości pracy, pewne rzeczy można zrobić JESZCZE SZYBCIEJ!!! Co jednak ważniejsze procesor 65C816, daje wreszcie realną szansę na totalny DOPAŁ! przeciętny scalak z tej serii może pracować z częstotliwością 8 Mhz! Najkorzystniejsze z punktu widzenia małego Atari wydaje się być 7.08 MHz (4*1.77), co szesnastobitowemu programowi pracującemu w trybie "native", pozwalałoby rozwinąć moc obliczeniową zbliżoną do ATARI ST, lub AMIGI 500!!! , a w niektórych zadaniach nawet prześcignąć (!!!) te maszyny!!!
Obok wszystkich wyliczonych zalet procesor 65C816 ma jednak jedną, ale za to bardzo dużą wadę. Mianowicie cenę. Na pchlim targu w Warszawie, a trzeba Wam wiedzieć, że raczej trudno znależć miejsce, gdzie cokolwiek mogłoby być tańsze, za egzemplarz krzyczano 90 zł!, co przy cenie zwykłego 6502 oscylującej w okolicach kilku złotych, jest lekką przesadą. Wielka to szkoda, bo scalak jest naprawdę bardzo fajny i przydałoby się, by znalazł się w większej ilości krajowych atarynek. Niemniej jeśli ktoś ma wolne 90 złotych, to gorąco procesor 65C816 polecam. 90 złotych, lub $70 dolarów amerykańskich, bo za tyle można sobie sprowadzić ze stanów "gotowca", do wmontowania w płytę (goły procesor wymaga jednak pewnych zabiegów kosmetycznych w rodzaju symulowania sygnału HALT), wraz z dość wyczerpującą dokumentacją i niezłym asemblerem. Całość nazywa się "SWEET 16", skąd tytuł niniejszego artykułu...
" KMK "