Rejestry cienie, oraz... dwoista natura rejestrów sprzętowych


      O tym że Atari posiada tzw. rejestry cienie, wie (?) każdy! Np. komórka 710 ($2C6) określa kolor pola gry. Jest to komórka typu RAM, można do niej wpisać cokolwiek, byle z przedziału liczb od 0-255. W zależności co się wpisze, taki "dostanie" się kolor. Komórka ta wcale nie jest rejestrem sprzętowym specjalizowanego układu scalonego, odpowiedzialnego w Atari za tworzenie kolorów na ekranie.

      Ten sprzętowy rejestr koloru "siedzi" pod adresem 53272. Wpisanie do niego czegokolwiek powoduje właściwą zmianę koloru. Projektanci Atari rozszerzyli nieco jego możliwości i wprowadzili tzw. rejest cień, czyli właśnie w obszarze pamięci RAM wyznaczyli odpowiednią komórkę, w tym przypadku o adresie 710. Do niej wpisuje się kod koloru, a system operacyjny (OS) pięćdziesiąt razy na sekunę przepisuje (na zasadzie przerwań - chodzi o przer wanie synchronizacji pionowej), jej zawartość do właściwego rejestru sprzę towego. Zapytasz, po co takie utrudnienie? Wbrew pozorom, jest to ułatwienie, i to wręcz GENIALNE! A sprawa wiąże się ściśle z tzw. dwoistą naturą pewnych rejestrów sprzętowych. Na czym to polega?

      Na pewno zauważyłeś, że w Atari pod tymi samymi adresami, "siedzą"... dwie komórki, (dwa rejestry). Jeden TYLKO do odczytu, a drugi TYLKO do zapisu Jak to zrobione, że do jednego można tylko coś zapisać bez możliwości odczytania jego zawartości, a z drugiego można tylko coś odczytać, bez możliwości zapisywania! Przecież są to, z punktu widzenia procesora, zwykłe komórki RAM. Tak się zachowują, pomimo tego że nie są wbudowane w pamięć typu RAM, a w inny specjalizowany układ scalony.

      Zapytam, jak szeroka jest szyna adresowa w Atari? Na pewno odpowiesz że jest szesnastobitowa (A0-A15), i masz rację. Ale czy wiesz, że na szynie sterującej występuje sygnał R/W? Co to za sygnał? Gdy R/W przyjmuje wartość zera logicznego (0), to procesor chce coś zapisać do pamięci, (komórki), a jeżeli jest na niej sygnał jedynki logicznej (1), to procesor chce coś odczytać z pamięci (komórki). Czy stoi coś na przeszkodzie aby ten sygnał potraktować jako sidemnastą! linię adresową (A16)? Odpowiadam: NIC! Do takiego samego wniosku doszli konstruktorzy Atari, a przed nimi inni, którzy na to wpadli. Teraz staje się jesne, jeżeli dwa rejestry uaktywniane będą właśnie tym sygnałem, to pomimo tego, że znajdują się pod tym samym adresem, każdy może służyć do czegoś innego, jeden tylko do zapisu, drugi do odczytu. Odpowiednie połączenie ich wejść i wyjść nie spowoduje kolizji na szynie danych i szynie adresowej. Tu należy się drobna uwaga. Tak naprawdę, to te rejestry mają inne adresy, bo należy dla nich rozpatrywać przypadek, że są adresowane szyną SIEDEMNASTO-BITOWĄ, (A0-A15), jako siedemnasty bit służy sygnał R/W. Ale... używa się nazewnictwa, że Atari ma szynę szesnastobitową, więc wychodzi nam, że pod tymi samymi adresami są dwa rejestry!

Proszę spojrzeć na poniższy przykład, z konieczności ograniczony do trzech bitów:

      
R/W      
A1      
A0
0      
0      
0      
0
1      
0      
0      
1
2      
0      
1      
0
3      
0      
1      
1
4      
1      
0      
0
5      
1      
0      
1
6      
1      
1      
0
7      
1      
1      
1

Te trzy sygnały (R/W, A1, A0) wyznaczają nam osiem różnych adresów. Odrzućmy sygnał R/W. I co wyszło? Też dostaniemy osiem adresów, ale kombinacje adresów A0-A1 powtarzają się.

0-4      1-5      2-6      3-7

Czy już teraz rozumiesz na czym polega ta dwoista natura niektórych rejestrów sprzętowych? To taki trik znany w informatyce od lat! Jak dobrze pomyśleć, to wychodzi nam, że... Atari mógłby mieć nie 64kB a 128kB pamięci, a procesor i tak dobrze by to adresował. Jedno ale... Połowa tak utworzonej pamięci musiałaby być tylko do odczytu, a druga połowa tylko do zapisu! Projektanci Atari zrobili coś innego. Część całej przestrzeni adresowej pamięci przeznaczyli dla pamięci RAM i ROM, a tylko część na tzw. rejestry sprzętowe, z których część tylko ma tzw. dwoistą naturę. Po co to komu, jeszcze zapytasz? Otóż, przestrzeń adresowa strony $D5 jest zarezerwowana dla rejestrów sprzętowych cartridge'a i ma rozmiar 256 bajtów. Stosując technikę dwoistych rejestrów możemy ich tam mieć 512 Czy to nie GENIALNE?!

Schemat ideowy przybliża to zagadni enie elektronikom. Jest to tylko symbolicznie narysowane, by oddać iddeę tego pomysłu.

      Programiści muszą tylko wiedzieć, że coś takiego istnieje, i od czasu do czasu próba odczytu z rejestru przeznaczonego tylko do zapisu daje znane $FF (255). A właśnie, dlaczego odczyt daje $FF, a nie coś innego, np. $AA? To proste, kiedy procesor rząda odczytu, to sygnał R/W ma wartość zera logicznego. Jeżeli jest tylko jeden rejestr sprzętowy (tylko do zapisu), pod danym adresem, bo tego drugiego, (do odczytu), nie musi być, (i zazwyczaj go nie ma!), to jest oczywiste, że szyna danych przeszła w stan tzw. wysokiej impedancji co równoważne jest z występowaniem na niej logicznej jedynki. (Zasada układów TTL brzmi: jeżeli koncówka "wisi" w powietrzu, lub jest w stanie wysokiej impedancji, to jest to równoważne podaniu na to wejście jedynki logicznej).

Jeden przykład za potok słów...

Do czegoś tam budujemy sobie rejestr sprzętowy, np. na str. $D5. Mimo wszystko, będziemy chcieli zawsze wiedzieć co tam jest zapisane, najprościej zrobić to tak: w pamięci RAM wyznaczyć sobie jakąś komórkę np. o adresie $XX. Jeżeli coś wpisujemy do rejestru sprzętowego:

     lda #1
     sta $d5

to jednocześnie to samo wpisujemy pod adres:
     sta $xx

Próba odczytu spod $d5
     lda $d5

da nam liczbę ZAWSZE $ff! Odczyt spod $xx będzie prawidłowy! I tak oto, bez rozbudowywania i komplikowania układu elektronicznego działa nam to identyczne!

      Ktoś powie, rejestry cienie nieco inaczej działają. To prawda. Jak w każdym przypadku zastosowań jest wiele, a co się z czym zrobi, i jak, zależy od programistów i elektroników. Koniec, kropka...

Zenon/DIAL