energy.scene.pl

Popularny magazyn na ośmiobitowe Atari

Wybierz muzykę:

Energy 1: 1 2 3 4 5
Energy 2: 1 2 3 4 5 6 7 8 9 10 11 12
"Słodka szestnastka"

kmk
autor: kmk

...................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 adresowania.

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

Wykonanie rozkazu RTS spowoduje powrót do miejsca znajdującego się bezpośrednio po BRL,6 cykli.

- 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...



Poprzednia strona: Packowanie danych
Następna strona: Znaczenie znaczników