Rejestry POKEY-a
From Atariki
Wersja z dnia 13:54, 15 maj 2009 0xF (Dyskusja | wkład) (literówka) ← Previous diff |
Aktualna wersja Mono (Dyskusja | wkład) (0) |
||
Linia 1: | Linia 1: | ||
- | Układ [[POKEY]] ma 29 rejestrów, które zajmują 16 adresów od $D200 do $D20F. W komputerach z zamontowanym [[stereo]] drugi Pokey zajmuje następnych 16 adresów, czyli $D210-$D21F. | + | Układ [[POKEY]] ma 29 rejestrów, które zajmują 16 adresów od $D200 do $D20F (w komputerach [[Atari 8-bit]]) lub od $EB00 do $EB0F (w konsoli [[5200]])[http://www.atarimuseum.com/videogames/consoles/5200/conv_to_5200.html]. W komputerach z zamontowanym [[stereo]] drugi POKEY zajmuje następnych 16 adresów, czyli $D210-$D21F. |
== Wiadomości wstępne == | == Wiadomości wstępne == | ||
- | Główny zegar POKEY-a ma częstotliwość 1773447 Hz w systemie PAL oraz 1789772,5 Hz w systemie [http://pl.wikipedia.org/wiki/NTSC NTSC] (albo wg [http://homepage.ntlworld.com/kryten_droid/Atari/800XL/atari_hw/pokey.htm niektórych źrodeł] 1,7897885 MHz). | + | Główny zegar POKEY-a ma częstotliwość 1773447 Hz w systemie PAL oraz 1789790 lub 1789772,5 Hz w systemie [http://pl.wikipedia.org/wiki/NTSC NTSC] (zob. [[NTSC vs PAL]]). |
[[POKEY]] jest układem wielofunkcyjnym, rejestry można podzielić na sześć grup w zależności od zastosowania: | [[POKEY]] jest układem wielofunkcyjnym, rejestry można podzielić na sześć grup w zależności od zastosowania: | ||
- | * Rejestry dźwięku: AUDF1-4, AUDC1-4, AUDCTL, SKCTL. | + | * Rejestry dźwięku: AUDF1-4, AUDC1-4, AUDCTL, STIMER, SKCTL. |
* Rejestry klawiatury: KBCODE, SKCTL, SKSTAT. | * Rejestry klawiatury: KBCODE, SKCTL, SKSTAT. | ||
* Rejestry [[Atari Paddles|wiosełek]]: POT0-7, POTST, POTGO. | * Rejestry [[Atari Paddles|wiosełek]]: POT0-7, POTST, POTGO. | ||
Linia 23: | Linia 23: | ||
*dla zegara wejściowego o częstotliwości głównej (1,773447 MHz w systemie PAL): '''F = CLOCK/(2*(N+M))''', gdzie '''N''' to wartość rejestru AUDF, a '''M''' to wartość modyfikująca zależna od rozmiaru rejestru generatora. Dla pojedynczego generatora ośmiobitowego '''M = 4''', natomiast dla generatorów połączonych w parę '''M = 7'''. | *dla zegara wejściowego o częstotliwości głównej (1,773447 MHz w systemie PAL): '''F = CLOCK/(2*(N+M))''', gdzie '''N''' to wartość rejestru AUDF, a '''M''' to wartość modyfikująca zależna od rozmiaru rejestru generatora. Dla pojedynczego generatora ośmiobitowego '''M = 4''', natomiast dla generatorów połączonych w parę '''M = 7'''. | ||
*dla zegara wejściowego o częstotliwości 1/28 lub 1/114 częstotliwości głównej: '''F = CLOCK/(2*(N+1))'''. | *dla zegara wejściowego o częstotliwości 1/28 lub 1/114 częstotliwości głównej: '''F = CLOCK/(2*(N+1))'''. | ||
- | <p>Oprócz tego rejestry AUDF (za wyjątkiem AUDF3) mogą pełnić funkcję liczników generujących cyklicznie przerwania [[IRQ]]. Wartość wstawiana do licznika to ilość "cyknięć" wybranego zegara, jakie mają upłynąć zanim wygenerowane zostanie przewanie. Przerwanie zostanie wygenerowane w momencie, kiedy licznik osiągnie wartość -1. Osiągnięcie tej wartości przez licznik niestety nie powoduje jego automatycznego przeładowania do początkowej wartości, trzeba to zrobić programowo w procedurze obsługi przerwania przez zapis rejestru STIMER. Patrz [[Rejestry POKEY-a#IRQEN|IRQEN $D20E]] i [[Rejestry POKEY-a#STIMER|STIMER $D209]].</p> | + | <p>Oprócz tego rejestry AUDF (za wyjątkiem AUDF3) mogą pełnić funkcję liczników generujących cyklicznie przerwania [[IRQ]]. Wartość wstawiana do licznika to ilość "cyknięć" wybranego zegara, jakie mają upłynąć zanim wygenerowane zostanie przerwanie.</p> |
</td></tr> | </td></tr> | ||
- | <tr><td id="POT0">$D200 (R)</td><td>POT0</td><td>Rezystancja wiosełka nr 0.</td></tr> | + | <tr><td id="POT0">$D200 (R)</td><td>POT0</td><td> |
- | + | <p>Rezystancja wiosełka nr 0.</p> | |
+ | <p>Pomiar rezystancji możliwy jest w jednym z dwóch trybów:</p> | ||
+ | * zwykłym: pomiar rezystancji trwa do 229 linii skaningowych (jest to ok. 15 ms) | ||
+ | * szybkim: pomiar rezystancji trwa do 229 cykli maszynowych, czyli do ok. 2 linii skaningowych | ||
+ | <p>Tryb wybieramy w rejestrze [[Rejestry POKEY-a#SKCTL|SKCTL]]: ustawienie bitu 2 na 0 wybiera tryb zwykły, a ustawienie tegoż bitu na 1 - tryb szybki. Wybór trybu następuje dla wszystkich ośmiu rejestrów POTx.</p> | ||
+ | <p>Uruchomienie konwersji następuje przez zapis rejestru [[Rejestry POKEY-a#POTGO|POTGO]]. Zakończenie konwersji sygnalizowane jest stanami odpowiednich bitów rejestru [[Rejestry POKEY-a#POTST|ALLPOT]], ale jego użycie nie jest w zasadzie konieczne - wystarczy odczekać 229 cykli zegara 1,77 MHz lub 229 linii skaningowych (zależnie od wybranego trybu pomiaru). Można założyć, że po upływie tego czasu rejestry POT0-7 będą zawierać sensowne wyniki. Dokonanie ponownego pomiaru wymaga ponownego zapisu POTGO.</p> | ||
+ | <p>Tryb zwykły jest normalnie wykorzystywany przez system operacyjny: odczyt rejestrów POT0-7, przepisanie ich stanów do cieni PADDL0-7 ($0270-$0277) i ponowne uruchomienie konwersji następuje w II fazie procedury [[SYSVBL]].</p> | ||
+ | <p>Dokumentacja Atari twierdzi, że w rejestrach POT0-7 trzeba oczekiwać wartości z zakresu od 0 do 228 ($00-$E4). Tak faktycznie jest w trybie zwykłym. Ale w trybie szybkim, kiedy do gniazd wiosełek nic nie zostało podłączone, pomiar oporności da wynik 229 ($E5). W tym trybie można też oczekiwać, że wartości pojawiające się w rejestrach będą liczbami parzystymi - jedynym wyjątkiem jest tu wspomniana wartość $E5.</p> | ||
+ | <p>Pomiar odbywa się na zasadzie ustalenia czasu ładowania wewnętrznej pojemności układu prądem płynącym przez rezystancję wiosełka (im wyższa rezystancja, tym dłuższy czas ładowania - brak wiosełka podłączonego do portu jest równoważny nieskończonej rezystancji). Rejestr POTx pełni rolę licznika taktów zegara 1,77 MHz w trybie szybkim lub tegoż zegara podzielonego przez 114 w trybie zwykłym (co odpowiada długości linii skaningowej). Wartości odczytywane z rejestru POTx w trakcie trwania pomiaru są kolejnymi wskazaniami licznika (zliczanie odbywa się od wartości 0 do 228). Po zakończeniu ładowania układu lub po odliczeniu 229 taktów licznik jest zatrzymywany i jego wartość nie zmienia się aż do chwili ponownego uruchomienia pomiaru przez zapis do rejestru POTGO.</p> | ||
+ | <p>Odczyt rejestrów na pewno da sensowne wartości po zakończeniu konwersji (czyli po upływie jej maksymalnego czasu lub po zasygnalizowaniu zakończenia konwersji w rejestrze ALLPOT). Natomiast odczytywanie rejestrów POT0-7 podczas trwania pomiaru oporności nie musi, niestety, dać oczekiwanego wyniku, tj. monotonicznie rosnącego ciągu liczb, zwłaszcza w trybie szybkim.</p> | ||
+ | </td></tr> | ||
<tr><td id="AUDC1">$D201 (W)</td><td>AUDC1</td><td> | <tr><td id="AUDC1">$D201 (W)</td><td>AUDC1</td><td> | ||
<p>Rejestr kontroli generatora dźwięku nr 1. Trzy najstarsze bity sterują zniekształceniami dźwięku (szumem) przez wybór rejestru przesuwającego według następującego schematu:</p> | <p>Rejestr kontroli generatora dźwięku nr 1. Trzy najstarsze bity sterują zniekształceniami dźwięku (szumem) przez wybór rejestru przesuwającego według następującego schematu:</p> | ||
<table border=1 cellpadding=5> | <table border=1 cellpadding=5> | ||
<tr><td><b>Bity 7,6,5</b></td><td><b>Znaczenie</b></td></tr> | <tr><td><b>Bity 7,6,5</b></td><td><b>Znaczenie</b></td></tr> | ||
- | <tr><td>000</td><td>Rejestr 5-bitowy i 17-bitowy</td></tr> | + | <tr><td>000</td><td>Rejestr 5-bitowy i 17-bitowy/9-bitowy</td></tr> |
<tr><td>001</td><td>Rejestr 5-bitowy</td></tr> | <tr><td>001</td><td>Rejestr 5-bitowy</td></tr> | ||
<tr><td>010</td><td>Rejestr 5-bitowy i 4-bitowy</td></tr> | <tr><td>010</td><td>Rejestr 5-bitowy i 4-bitowy</td></tr> | ||
<tr><td>011</td><td>Rejestr 5-bitowy</td></tr> | <tr><td>011</td><td>Rejestr 5-bitowy</td></tr> | ||
- | <tr><td>100</td><td>Rejestr 17-bitowy</td></tr> | + | <tr><td>100</td><td>Rejestr 17-bitowy/9-bitowy</td></tr> |
<tr><td>101</td><td>Bez rejestru przesuwającego (czysty ton)</td></tr> | <tr><td>101</td><td>Bez rejestru przesuwającego (czysty ton)</td></tr> | ||
<tr><td>110</td><td>Rejestr 4-bitowy</td></tr> | <tr><td>110</td><td>Rejestr 4-bitowy</td></tr> | ||
Linia 42: | Linia 52: | ||
</table> | </table> | ||
<p>Cztery najmłodsze bity definiują głośność dźwięku wytwarzanego przez generator, w zakresie od $00 (cisza) do $0F (maksymalna głośność).</p> | <p>Cztery najmłodsze bity definiują głośność dźwięku wytwarzanego przez generator, w zakresie od $00 (cisza) do $0F (maksymalna głośność).</p> | ||
- | <p>Bit 4 jest normalnie skasowany. Ustawienie go powoduje wyłączenie generatora dźwięku, wartości ustawiane w odpowiednim rejestrze AUDF oraz wartości bitów 7-5 rejestru AUDC przestają mieć znaczenie. W tym trybie bity głośności sterują bezpośrednio napięciem podawanym z tego kanału dźwiękowego na wyjście audio, innymi słowy bezpośrednio sterują położeniem membrany glośnika. Pozwala to na odtwarzanie 4-bitowych sampli.</p> | + | <p>Bit 4 jest normalnie skasowany. Ustawienie go powoduje wyłączenie generatora dźwięku, wartości ustawiane w odpowiednim rejestrze AUDF oraz wartości bitów 7-5 rejestru AUDC przestają mieć znaczenie. W tym trybie bity głośności sterują bezpośrednio napięciem podawanym z tego kanału dźwiękowego na wyjście audio, innymi słowy bezpośrednio sterują położeniem membrany głośnika. Pozwala to na odtwarzanie 4-bitowych sampli.</p> |
- | <p>Jako że cztery generatory dźwięku są niezależne, a ich wyjścia połączone są razem, ustawiwszy bit 4 we wszystkich generatorach i odpowiednio manipulując wartościami bitów głośności można uzyskać teoretycznie do 61 położeń membrany gośnika, co odpowiada niemal 6-bitowej rozdzielczości samplowania. Podobnie przy użyciu trzech generatorów uzyskuje się 46 poziomów głośności, a przy użyciu dwóch - 31.</p> | + | <p>Jako że cztery generatory dźwięku są niezależne, a ich wyjścia połączone są razem, ustawiwszy bit 4 we wszystkich generatorach i odpowiednio manipulując wartościami bitów głośności można uzyskać teoretycznie do 61 położeń membrany głośnika, co odpowiada niemal 6-bitowej rozdzielczości samplowania. Podobnie przy użyciu trzech generatorów uzyskuje się 46 poziomów głośności, a przy użyciu dwóch - 31.</p> |
</td></tr> | </td></tr> | ||
Linia 64: | Linia 74: | ||
</td></tr> | </td></tr> | ||
- | <tr><td id="POT4">$D204 (R)</td><td>POT4</td><td>Rezystancja wiosełka nr 4 (tylko w serii 400/800).</td></tr> | + | <tr><td id="POT4">$D204 (R)</td><td>POT4</td><td>Rezystancja wiosełka nr 4. Gniazda dla wiosełek 4-7 istnieją tylko w serii 400/800, w XL/XE odpowiednie nóżki układu POKEY nie są do niczego podłączone.</td></tr> |
<tr><td id="AUDC3">$D205 (W)</td><td>AUDC3</td><td> | <tr><td id="AUDC3">$D205 (W)</td><td>AUDC3</td><td> | ||
Linia 73: | Linia 83: | ||
<tr><td id="AUDF4">$D206 (W)</td><td>AUDF4</td><td> | <tr><td id="AUDF4">$D206 (W)</td><td>AUDF4</td><td> | ||
- | <p>Rejestr częstotliwości generatora dźwięku nr 4. Może być połączony w parę (generator szesnastobitowy) z rejestrem AUDF3. Para generatorów 3 i 4 używana jest przez system operacyjny do zdefiniowania szybkości transmisji szeregowej [[SIO]].</p> | + | <p>Rejestr częstotliwości generatora dźwięku nr 4. Może być połączony w parę (generator szesnastobitowy) z rejestrem AUDF3. Para generatorów 3 i 4 używana jest przez system operacyjny do zdefiniowania szybkości transmisji szeregowej [[SIO]]. Tabela niektórych wartości dla połączonych liczników 3/4 i odpowiadającej tym wartościom szybkości transmisji jest [[Pokey#Szybko.C5.9B.C4.87_transmisji|tutaj]].</p> |
</td></tr> | </td></tr> | ||
Linia 93: | Linia 103: | ||
* bit 2 - filtr górnoprzepustowy w generatorze 1 sterowany przez generator 3 (1 = włączony) | * bit 2 - filtr górnoprzepustowy w generatorze 1 sterowany przez generator 3 (1 = włączony) | ||
* bit 1 - filtr górnoprzepustowy w generatorze 2 sterowany przez generator 4 (1 = włączony) | * bit 1 - filtr górnoprzepustowy w generatorze 2 sterowany przez generator 4 (1 = włączony) | ||
- | * bit 0 - wybór częstotliwości bazowej dla wszystkch generatorów (0 - 1/28 cz. głównej, 1 - 1/114 cz. głównej) | + | * bit 0 - wybór częstotliwości bazowej dla wszystkich generatorów (0 - 1/28 cz. głównej, 1 - 1/114 cz. głównej) |
<p>Główna częstotliwość 1,773447 MHz obowiązuje w wersji PAL, w wersji zaś NTSC to jest 1,7897725 MHz. Odpowiednio 1/114 częstotliwości głównej to tzw. "15 kHz", czyli 15556,55 Hz w wersji PAL oraz 15699,76 Hz w wersji NTSC, a 1/28 częstotliwości głównej to tzw. "64 kHz", czyli 63337,39 Hz w wersji PAL oraz 63920,4 Hz w wersji NTSC.</p> | <p>Główna częstotliwość 1,773447 MHz obowiązuje w wersji PAL, w wersji zaś NTSC to jest 1,7897725 MHz. Odpowiednio 1/114 częstotliwości głównej to tzw. "15 kHz", czyli 15556,55 Hz w wersji PAL oraz 15699,76 Hz w wersji NTSC, a 1/28 częstotliwości głównej to tzw. "64 kHz", czyli 63337,39 Hz w wersji PAL oraz 63920,4 Hz w wersji NTSC.</p> | ||
</td></tr> | </td></tr> | ||
- | <tr><td id="POTST">$D208 (R)</td><td>POTST (aka ALLPOT)</td> | + | <tr><td id="POTST">$D208 (R)</td><td>ALLPOT lub POTST</td> |
<td><p>Rejestr stanu konwersji analogowo-cyfrowej dla ośmiu wiosełek (czyli rejestrów [[Rejestry POKEY-a#POT0|POT0-7]]). Znaczenie bitów:</p> | <td><p>Rejestr stanu konwersji analogowo-cyfrowej dla ośmiu wiosełek (czyli rejestrów [[Rejestry POKEY-a#POT0|POT0-7]]). Znaczenie bitów:</p> | ||
* bit 7 - POT7 | * bit 7 - POT7 | ||
Linia 108: | Linia 118: | ||
* bit 0 - POT0 | * bit 0 - POT0 | ||
<p>Jeśli bit jest skasowany, to znaczy, że odpowiedni rejestr POT zawiera właściwy wynik pomiaru.</p> | <p>Jeśli bit jest skasowany, to znaczy, że odpowiedni rejestr POT zawiera właściwy wynik pomiaru.</p> | ||
+ | <p>Dokumentacja Atari zaleca odczekanie 4 cykli pomiędzy zapisem POTGO a pierwszym odczytem ALLPOT w trybie szybkiej konwersji A/C.</p> | ||
</td></tr> | </td></tr> | ||
<tr><td id="STIMER">$D209 (W)</td><td>STIMER</td><td> | <tr><td id="STIMER">$D209 (W)</td><td>STIMER</td><td> | ||
- | <p>Zapis tego rejestru powoduje umieszczenie wartości rejestrów AUDF1, AUDF2 i AUDF4 w odpowiednich licznikach oraz zapoczątkowanie zliczania.</p> | + | <p>Zapis tego rejestru powoduje umieszczenie wartości rejestrów AUDF1-4 w odpowiednich licznikach oraz zapoczątkowanie zliczania.</p> |
+ | |||
+ | <p>Dodatkowo zeruje przerzutniki odpowiedzialne za generowanie dźwięku. Fale generowane przez kanały 1 i 2 startują od poziomu wysokiego, natomiast 3 i 4 od niskiego. Powoduje to, że fale o tej samej częstotliwości i głośności ustawione np. w generatorach 1 i 3 po zapisie STIMER wygaszą się na wyjściu audio (dokładnie na wyjściu audio będzie utrzymywany poziom głośności ustawiony w AUDC1/3).</p> | ||
</td></tr> | </td></tr> | ||
- | <tr><td id="KBCODE">$D209 (R)</td><td>KBCODE</td><td><p>Sześć młodszych bitów tego rejestru to kod klawiaturowy ostatnio wciśniętego klawisza. Znaczenie dwóch pozostałych bitów jest następujące:</p> | + | <tr><td id="KBCODE">$D209 (R)</td><td>KBCODE</td><td><p>Sześć młodszych bitów tego rejestru to [[kody klawiszy|kod klawiaturowy]] ostatnio wciśniętego klawisza. Znaczenie dwóch pozostałych bitów jest następujące:</p> |
* bit 7 = 1, klawisz naciśnięto razem z CONTROL | * bit 7 = 1, klawisz naciśnięto razem z CONTROL | ||
* bit 6 = 1, klawisz naciśnięto razem z SHIFT | * bit 6 = 1, klawisz naciśnięto razem z SHIFT | ||
<p>Zawartość tego rejestru zmieniają tylko te klawisze, których naciśnięcie powoduje wygenerowanie przerwania [[IRQ]] klawiatury. Przerwania tego nie generują następujące klawisze: START, SELECT, OPTION, RESET, BREAK, SHIFT oraz CONTROL (generuje je natomiast klawisz HELP oraz klawisze funkcyjne F1-F4).</p> | <p>Zawartość tego rejestru zmieniają tylko te klawisze, których naciśnięcie powoduje wygenerowanie przerwania [[IRQ]] klawiatury. Przerwania tego nie generują następujące klawisze: START, SELECT, OPTION, RESET, BREAK, SHIFT oraz CONTROL (generuje je natomiast klawisz HELP oraz klawisze funkcyjne F1-F4).</p> | ||
<p>Klawisze BREAK i RESET wywołują oddzielne przerwania: BREAK przerwanie [[IRQ]], RESET przerwanie [[NMI]] w serii 400/800, albo [[RESET]] w serii XL/XE. Klawisz SHIFT nie wywołuje przerwania klawiatury, ale jego stan można odczytać w [[Rejestry POKEY-a#SKSTAT|SKSTAT ($D20F)]]. Wciśnięcie klawisza CONTROL daje się wykryć tylko wtedy, kiedy jest wciśnięty razem z jakimś innym klawiszem, którego kod klawiaturowy da się odczytać w tym rejestrze.</p> | <p>Klawisze BREAK i RESET wywołują oddzielne przerwania: BREAK przerwanie [[IRQ]], RESET przerwanie [[NMI]] w serii 400/800, albo [[RESET]] w serii XL/XE. Klawisz SHIFT nie wywołuje przerwania klawiatury, ale jego stan można odczytać w [[Rejestry POKEY-a#SKSTAT|SKSTAT ($D20F)]]. Wciśnięcie klawisza CONTROL daje się wykryć tylko wtedy, kiedy jest wciśnięty razem z jakimś innym klawiszem, którego kod klawiaturowy da się odczytać w tym rejestrze.</p> | ||
+ | <p>Rejestr cień KBCODES znajduje się w $02FC (764).</p> | ||
<p>Klawisze konsoli patrz [[Rejestry GTIA#CONSOL|CONSOL ($D01F)]].</p> | <p>Klawisze konsoli patrz [[Rejestry GTIA#CONSOL|CONSOL ($D01F)]].</p> | ||
</td></tr> | </td></tr> | ||
- | <tr><td id="SKSTRES">$D20A (W)</td><td>SKSTRES</td> | + | <tr><td id="SKSTRES">$D20A (W)</td><td>SKRES lub SKSTRES</td> |
<td><p>Zapis tego rejestru powoduje zresetowanie bitów 5-7 rejestru [[Rejestry POKEY-a#SKSTAT|SKSTAT ($D20F)]].</p> | <td><p>Zapis tego rejestru powoduje zresetowanie bitów 5-7 rejestru [[Rejestry POKEY-a#SKSTAT|SKSTAT ($D20F)]].</p> | ||
</td></tr> | </td></tr> | ||
- | <tr><td id="RANDOM">$D20A (R)</td><td>RANDOM</td><td><p>Liczba pseudolosowa z zakresu od 0 do 255.</p></td></tr> | + | <tr><td id="RANDOM">$D20A (R)</td><td>RANDOM</td><td> |
+ | <p>Liczba pseudolosowa z zakresu od 0 do 255.</p> | ||
+ | <p>Rejestr zawiera 8 najstarszych bitów 9- lub 17-bitowego rejestru [https://pl.wikipedia.org/wiki/LFSR LFSR] o wielomianie odpowiednio 1+x<sup>4</sup>+x<sup>9</sup> lub 1+x<sup>12</sup>+x<sup>17</sup> zależnie od stanu bitu 7 AUDCTL. Zawartość rejestru przesuwana jest w prawo co cykl zegara 1,77 MHz. Przy odczytywaniu serii wartości pseudolosowych dobrze jest więc zadbać, żeby pomiędzy kolejnymi odczytami upłynęło co najmniej 8 cykli pracy zegara 1,77 MHz; w przeciwnym wypadku kolejno odczytane wartości mogą okazać się między sobą zauważalnie skorelowane. Ten efekt da się zauważyć zwłaszcza na akceleratorach.</p> | ||
+ | <p>Podczas resetowania układu (za pomocą bitów 0 i 1 SKCTL) do rejestru LFSR wsuwane są jedynki.</p> | ||
+ | </td></tr> | ||
- | <tr><td id="POTGO">$D20B (W)</td><td>POTGO</td><td><p>Zapis tego rejestru powoduje wyzerowanie rejestrów położenia potencjometrów ([[Rejestry POKEY-a#POT0|POT0-7]]) i rozpoczęcie pomiaru oporności od nowa.</p></td></tr> | + | <tr><td id="POTGO">$D20B (W)</td><td>POTGO</td><td> |
+ | <p>Zapis tego rejestru powoduje wyzerowanie rejestrów położenia potencjometrów ([[Rejestry POKEY-a#POT0|POT0-7]]) i rozpoczęcie pomiaru oporności od nowa. Zerowanie rejestrów POT0-7 trwa 2 cykle zegara 1,77 MHz.</p> | ||
+ | <p>Dokumentacja Atari zaleca odczytanie wszystkich rejestrów POT0-7 przed zapisem do POTGO (prawdopodobnie dlatego, że wartość pomiaru nie jest buforowana i w chwili rozpoczęcia pomiaru jest bezpowrotnie tracona).</p> | ||
+ | </td></tr> | ||
- | <tr><td>$D20C</td><td>-</td><td><p>Rejestr nieużywany.</p></td></tr> | + | <tr><td id="D20C">$D20C</td><td>-</td><td> |
+ | <p>Rejestr nieużywany przez POKEY.</p> | ||
+ | <p>[[SIO FIFO]] wykorzystuje ten rejestr do konfiguracji (tylko zapis):</p> | ||
+ | * bit 7 - 0: zresetowanie FIFO, 1: konfiguracja, | ||
+ | * bit 6 - 0: w połączeniu z ustawionym bitem 7 określa graniczną wartość (bity 0-5) w AUDF3 dla której FIFO jest "przezroczyste", 1: wartość graniczna (bity 0-5) jest ustawiana jako domyślna, | ||
+ | * bity 0-5 - wartość graniczna | ||
+ | </td></tr> | ||
<tr><td id="SEROUT">$D20D (W)</td><td>SEROUT</td><td><p>Rejestr wyjściowy dla transmisji szeregowej. Wpisanie tu bajtu powoduje wyemitowanie go na złącze szeregowe.</p></td></tr> | <tr><td id="SEROUT">$D20D (W)</td><td>SEROUT</td><td><p>Rejestr wyjściowy dla transmisji szeregowej. Wpisanie tu bajtu powoduje wyemitowanie go na złącze szeregowe.</p></td></tr> | ||
- | <tr><td id="SERIN">$D20D (R)</td><td>SERIN</td><td><p>Rejestr wejściowy dla transmisji szeregowej. Wystąpienie przerwania odczytu z łącza szregowego sygnalizuje, że w SERIN znajduje się bajt do odebrania.</p></td></tr> | + | <tr><td id="SERIN">$D20D (R)</td><td>SERIN</td><td><p>Rejestr wejściowy dla transmisji szeregowej. Wystąpienie przerwania odczytu z łącza szeregowego sygnalizuje, że w SERIN znajduje się bajt do odebrania.</p></td></tr> |
<tr><td id="IRQEN">$D20E (W)</td><td>IRQEN</td> | <tr><td id="IRQEN">$D20E (W)</td><td>IRQEN</td> | ||
- | <td><p>Rejestr zezwoleń na wygenerowanie przerwań [[IRQ]]. Ma cień IRQENS pod adresem $0010. Przypisanie bitów jest w obydwu identyczne (0 - przerwanie zabronione):</p> | + | <td><p>Rejestr zezwoleń na wygenerowanie przerwań [[IRQ]]. Ma cień POKMSK/IRQENS pod adresem $0010. Przypisanie bitów jest w obydwu identyczne (0 - przerwanie zabronione):</p> |
* bit 7 - przerwanie klawisza BREAK | * bit 7 - przerwanie klawisza BREAK | ||
* bit 6 - przerwanie klawiatury | * bit 6 - przerwanie klawiatury | ||
Linia 146: | Linia 173: | ||
* bit 1 - licznik nr 2 | * bit 1 - licznik nr 2 | ||
* bit 0 - licznik nr 1 | * bit 0 - licznik nr 1 | ||
- | <p>Przy blokowaniu przerwań [[IRQ]] należy raczej korzystać z cienia. Np. zablokowanie klawisza BREAK uzyskuje się przez:</p> | + | <p>Jeśli używane są procedury systemu operacyjnego, przy blokowaniu przerwań należy korzystać z rejestru-cienia. Np. zablokowanie klawisza BREAK uzyskuje się przez:</p> |
<pre> | <pre> | ||
lda irqens | lda irqens | ||
and #$7f | and #$7f | ||
sta irqens | sta irqens | ||
+ | sta irqen | ||
</pre> | </pre> | ||
</td></tr> | </td></tr> | ||
<tr><td id="IRQST">$D20E (R)</td><td>IRQST</td> | <tr><td id="IRQST">$D20E (R)</td><td>IRQST</td> | ||
- | <td><p>Rejest statusu przerwań [[IRQ]]. Cień IRQSTAT pod adresem $0011. Przypisanie bitów (0 - przerwanie wystąpiło):</p> | + | <td><p>Rejestr statusu przerwań [[IRQ]]. Przypisanie bitów (0 - przerwanie wystąpiło):</p> |
* bit 7 - przerwanie klawisza BREAK | * bit 7 - przerwanie klawisza BREAK | ||
* bit 6 - przerwanie klawiatury | * bit 6 - przerwanie klawiatury | ||
Linia 173: | Linia 201: | ||
</pre> | </pre> | ||
<p>W większości wypadków nie ma potrzeby stosowania tego we własnych procedurach obsługi przerwań [[IRQ]], gdyż odnośną sekwencję rozkazów wykonuje główna procedura IRQ znajdująca się w pamięci [[ROM]] systemu operacyjnego.</p> | <p>W większości wypadków nie ma potrzeby stosowania tego we własnych procedurach obsługi przerwań [[IRQ]], gdyż odnośną sekwencję rozkazów wykonuje główna procedura IRQ znajdująca się w pamięci [[ROM]] systemu operacyjnego.</p> | ||
+ | Rejestr BRKKEY/IRQSTAT pod adresem $0011 (mylnie identyfikowany jako cień IRQST) jest ustawiany przez procedury systemowe SIO, CIO oraz przerwanie klawisza BREAK (patrz [[Kody klawiszy]]). | ||
</td></tr> | </td></tr> | ||
<tr><td id="SKCTL">$D20F (W)</td><td>SKCTL</td><td> | <tr><td id="SKCTL">$D20F (W)</td><td>SKCTL</td><td> | ||
- | <p>Rejestr kontroli transmisji szeregowej i klawiatury (Serial and Keyboard Control register). Znaczenie bitów:</p> | + | <p>Rejestr kontroli transmisji szeregowej i klawiatury (Serial and Keyboard Control register). Rejestr cień SKCTLS znajduje się pod adresem $0232. Znaczenie bitów:</p> |
- | * bit 7 - nadanie sygnału SPACE, czyli dziesięciu zer (1 = włączone) | + | * bit 7 - gdy ustawiony, wymusza nadawanie sygnału SPACE (logiczne 0) na linię DATA OUT gniazda SIO |
- | * bity 6-4 - źrodło sygnału zegarowego dla transmisji szeregowej (bit 6 od lewej): | + | * bity 6-4 - źródło sygnału zegarowego dla transmisji szeregowej (bit 6 od lewej): |
** 000 - zewnętrzne, wg linii CLOCK IN [[gniazdo SIO|gniazda SIO]] | ** 000 - zewnętrzne, wg linii CLOCK IN [[gniazdo SIO|gniazda SIO]] | ||
** 001 - odczyt wg [[Rejestry POKEY-a#AUDF4|AUDF4 $D206]], zapis wg CLOCK IN (default przy odczycie) | ** 001 - odczyt wg [[Rejestry POKEY-a#AUDF4|AUDF4 $D206]], zapis wg CLOCK IN (default przy odczycie) | ||
Linia 189: | Linia 218: | ||
* bit 3 - transmisja dwutonowa (1 = włączona) | * bit 3 - transmisja dwutonowa (1 = włączona) | ||
* bit 2 - częstotliwość konwersji analogowo-cyfrowej (0 - 20 ms, 1 - 128 us) | * bit 2 - częstotliwość konwersji analogowo-cyfrowej (0 - 20 ms, 1 - 128 us) | ||
- | * bit 1 - tryb pracy klawiatury (1 - standard, 0 - skanowanie matrycy) | + | * bit 1 - wł./wył. skanowania (czyli odczyt) klawiatury (1 - włączone) |
- | * bit 0 - ustawienie wartości 1 tu i w bicie 1 (czyli wpisanie $03 do SKCTL) resetuje POKEY | + | * bit 0 - wł./wył. funkcji niwelowania drgań styków klawiatury (ang. [http://en.wikipedia.org/wiki/Debounce ''debounce'']) (1 - włączone). ustawienie wartości 0 tu i w bicie 1 (np. wpisanie $00 do SKCTL) resetuje POKEY |
<p>W trybie dwutonowym częstotliwość ustawiona w [[Rejestry POKEY-a#AUDF1|AUDF1 $D200]] pełni funkcję logicznej jedynki, natomiast ta z AUDF2 - logicznego zera. AUDF2 musi być ustawiony na niższy ton niż AUDF1. System operacyjny wybiera tu częstotliwości 5278 Hz i 3958,56 Hz (w systemie PAL; odpowiednio są to wartości 5 i 7 dla rejestrów AUDF1 i 2). Transmisja dwutonowa jest używana podczas zapisu na magnetofon, poza tym jest normalnie wyłączona, a dane transmitowane są jako poziomy logiczne (+4 V = prawda, 0 V = fałsz).</p> | <p>W trybie dwutonowym częstotliwość ustawiona w [[Rejestry POKEY-a#AUDF1|AUDF1 $D200]] pełni funkcję logicznej jedynki, natomiast ta z AUDF2 - logicznego zera. AUDF2 musi być ustawiony na niższy ton niż AUDF1. System operacyjny wybiera tu częstotliwości 5278 Hz i 3958,56 Hz (w systemie PAL; odpowiednio są to wartości 5 i 7 dla rejestrów AUDF1 i 2). Transmisja dwutonowa jest używana podczas zapisu na magnetofon, poza tym jest normalnie wyłączona, a dane transmitowane są jako poziomy logiczne (+4 V = prawda, 0 V = fałsz).</p> | ||
</td></tr> | </td></tr> | ||
Linia 198: | Linia 227: | ||
* bit 7 - framing error - odebrano 0 zamiast 1 jako bit stopu (0 - wystąpił) | * bit 7 - framing error - odebrano 0 zamiast 1 jako bit stopu (0 - wystąpił) | ||
* bit 6 - przepełnienie bufora wejściowego klawiatury - w momencie zgłoszenia przerwania nie obsłużono jeszcze poprzedniego (0 - wystąpiło) | * bit 6 - przepełnienie bufora wejściowego klawiatury - w momencie zgłoszenia przerwania nie obsłużono jeszcze poprzedniego (0 - wystąpiło) | ||
- | * bit 5 - serial overrun - w momencie zgłoszenia przerwania odczytu szeregowego nie obsłużono jeszcze poprzedniego (0 - wystąpił) | + | * bit 5 - serial overrun - w momencie zgłoszenia przerwania odczytu szeregowego nie obsłużono jeszcze poprzedniego (0 - wystąpił) |
* bit 4 - kopia wejścia szeregowego | * bit 4 - kopia wejścia szeregowego | ||
- | * bit 3 - klawisz SHIFT (0 - wciśniety) | + | * bit 3 - klawisz SHIFT (0 - wciśnięty) |
- | * bit 2 - dowolny klawisz (0 - wciśnięty) | + | * bit 2 - dowolny klawisz oprócz SHIFT, CONTROL, BREAK, START, SELECT, OPTION, RESET (0 - wciśnięty) |
* bit 1 - odczyt danych (0 - w toku) | * bit 1 - odczyt danych (0 - w toku) | ||
* bit 0 - nieużywany, zawsze 1. | * bit 0 - nieużywany, zawsze 1. |
Aktualna wersja
Układ POKEY ma 29 rejestrów, które zajmują 16 adresów od $D200 do $D20F (w komputerach Atari 8-bit) lub od $EB00 do $EB0F (w konsoli 5200)[1]. W komputerach z zamontowanym stereo drugi POKEY zajmuje następnych 16 adresów, czyli $D210-$D21F.
Wiadomości wstępne
Główny zegar POKEY-a ma częstotliwość 1773447 Hz w systemie PAL oraz 1789790 lub 1789772,5 Hz w systemie NTSC (zob. NTSC vs PAL).
POKEY jest układem wielofunkcyjnym, rejestry można podzielić na sześć grup w zależności od zastosowania:
- Rejestry dźwięku: AUDF1-4, AUDC1-4, AUDCTL, STIMER, SKCTL.
- Rejestry klawiatury: KBCODE, SKCTL, SKSTAT.
- Rejestry wiosełek: POT0-7, POTST, POTGO.
- Rejestry transmisji szeregowej: AUDF1-4, AUDCTL, SKSTRES, SKCTL, SKSTAT, SERIN, SEROUT.
- Rejestry IRQ: IRQEN, IRQST, AUDF1-4, AUDCTL, STIMER.
- Inne rejestry: RANDOM.
Lista rejestrów
Adres | Etykieta | Opis | ||||||||||||||||||
$D200 (W) | AUDF1 |
Rejestr częstotliwości generatora dźwięku nr 1. Jest to w istocie dzielnik częstotliwości zdefiniowanej w rejestrze AUDCTL $D208. Wartość częstotliwości wyjściowej uzyskujemy ze wzorów:
Oprócz tego rejestry AUDF (za wyjątkiem AUDF3) mogą pełnić funkcję liczników generujących cyklicznie przerwania IRQ. Wartość wstawiana do licznika to ilość "cyknięć" wybranego zegara, jakie mają upłynąć zanim wygenerowane zostanie przerwanie. | ||||||||||||||||||
$D200 (R) | POT0 |
Rezystancja wiosełka nr 0. Pomiar rezystancji możliwy jest w jednym z dwóch trybów:
Tryb wybieramy w rejestrze SKCTL: ustawienie bitu 2 na 0 wybiera tryb zwykły, a ustawienie tegoż bitu na 1 - tryb szybki. Wybór trybu następuje dla wszystkich ośmiu rejestrów POTx. Uruchomienie konwersji następuje przez zapis rejestru POTGO. Zakończenie konwersji sygnalizowane jest stanami odpowiednich bitów rejestru ALLPOT, ale jego użycie nie jest w zasadzie konieczne - wystarczy odczekać 229 cykli zegara 1,77 MHz lub 229 linii skaningowych (zależnie od wybranego trybu pomiaru). Można założyć, że po upływie tego czasu rejestry POT0-7 będą zawierać sensowne wyniki. Dokonanie ponownego pomiaru wymaga ponownego zapisu POTGO. Tryb zwykły jest normalnie wykorzystywany przez system operacyjny: odczyt rejestrów POT0-7, przepisanie ich stanów do cieni PADDL0-7 ($0270-$0277) i ponowne uruchomienie konwersji następuje w II fazie procedury SYSVBL. Dokumentacja Atari twierdzi, że w rejestrach POT0-7 trzeba oczekiwać wartości z zakresu od 0 do 228 ($00-$E4). Tak faktycznie jest w trybie zwykłym. Ale w trybie szybkim, kiedy do gniazd wiosełek nic nie zostało podłączone, pomiar oporności da wynik 229 ($E5). W tym trybie można też oczekiwać, że wartości pojawiające się w rejestrach będą liczbami parzystymi - jedynym wyjątkiem jest tu wspomniana wartość $E5. Pomiar odbywa się na zasadzie ustalenia czasu ładowania wewnętrznej pojemności układu prądem płynącym przez rezystancję wiosełka (im wyższa rezystancja, tym dłuższy czas ładowania - brak wiosełka podłączonego do portu jest równoważny nieskończonej rezystancji). Rejestr POTx pełni rolę licznika taktów zegara 1,77 MHz w trybie szybkim lub tegoż zegara podzielonego przez 114 w trybie zwykłym (co odpowiada długości linii skaningowej). Wartości odczytywane z rejestru POTx w trakcie trwania pomiaru są kolejnymi wskazaniami licznika (zliczanie odbywa się od wartości 0 do 228). Po zakończeniu ładowania układu lub po odliczeniu 229 taktów licznik jest zatrzymywany i jego wartość nie zmienia się aż do chwili ponownego uruchomienia pomiaru przez zapis do rejestru POTGO. Odczyt rejestrów na pewno da sensowne wartości po zakończeniu konwersji (czyli po upływie jej maksymalnego czasu lub po zasygnalizowaniu zakończenia konwersji w rejestrze ALLPOT). Natomiast odczytywanie rejestrów POT0-7 podczas trwania pomiaru oporności nie musi, niestety, dać oczekiwanego wyniku, tj. monotonicznie rosnącego ciągu liczb, zwłaszcza w trybie szybkim. | ||||||||||||||||||
$D201 (W) | AUDC1 |
Rejestr kontroli generatora dźwięku nr 1. Trzy najstarsze bity sterują zniekształceniami dźwięku (szumem) przez wybór rejestru przesuwającego według następującego schematu:
Cztery najmłodsze bity definiują głośność dźwięku wytwarzanego przez generator, w zakresie od $00 (cisza) do $0F (maksymalna głośność). Bit 4 jest normalnie skasowany. Ustawienie go powoduje wyłączenie generatora dźwięku, wartości ustawiane w odpowiednim rejestrze AUDF oraz wartości bitów 7-5 rejestru AUDC przestają mieć znaczenie. W tym trybie bity głośności sterują bezpośrednio napięciem podawanym z tego kanału dźwiękowego na wyjście audio, innymi słowy bezpośrednio sterują położeniem membrany głośnika. Pozwala to na odtwarzanie 4-bitowych sampli. Jako że cztery generatory dźwięku są niezależne, a ich wyjścia połączone są razem, ustawiwszy bit 4 we wszystkich generatorach i odpowiednio manipulując wartościami bitów głośności można uzyskać teoretycznie do 61 położeń membrany głośnika, co odpowiada niemal 6-bitowej rozdzielczości samplowania. Podobnie przy użyciu trzech generatorów uzyskuje się 46 poziomów głośności, a przy użyciu dwóch - 31. | ||||||||||||||||||
$D201 (R) | POT1 | Rezystancja wiosełka nr 1. | ||||||||||||||||||
$D202 (W) | AUDF2 |
Rejestr częstotliwości generatora dźwięku nr 2. Może być połączony w parę (generator szesnastobitowy) z rejestrem AUDF1. | ||||||||||||||||||
$D202 (R) | POT2 | Rezystancja wiosełka nr 2. | ||||||||||||||||||
$D203 (W) | AUDC2 |
Rejestr kontroli generatora dźwięku nr 2. Ma dla generatora nr 2 takie samo znaczenie, jak rejestr AUDC1 $D201 dla generatora nr 1. Gdy generatory 1 i 2 połączone są w parę, rejestr AUDC2 odpowiada za regulację zniekształceń i głośności w obydwu, a rejestr AUDC1 jest wolny i może zostać użyty np. jako niezależny kanał sampli. | ||||||||||||||||||
$D203 (R) | POT3 | Rezystancja wiosełka nr 3. | ||||||||||||||||||
$D204 (W) | AUDF3 |
Rejestr częstotliwości generatora dźwięku nr 3. W odróżnieniu od pozostałych AUDF3 nie może być używany jako licznik generujący przerwania IRQ. | ||||||||||||||||||
$D204 (R) | POT4 | Rezystancja wiosełka nr 4. Gniazda dla wiosełek 4-7 istnieją tylko w serii 400/800, w XL/XE odpowiednie nóżki układu POKEY nie są do niczego podłączone. | ||||||||||||||||||
$D205 (W) | AUDC3 |
Rejestr kontroli generatora dźwięku nr 3. Ma dla generatora nr 3 takie samo znaczenie, jak rejestr AUDC1 $D201 dla generatora nr 1. | ||||||||||||||||||
$D205 (R) | POT5 | Rezystancja wiosełka nr 5 (tylko w serii 400/800). | ||||||||||||||||||
$D206 (W) | AUDF4 |
Rejestr częstotliwości generatora dźwięku nr 4. Może być połączony w parę (generator szesnastobitowy) z rejestrem AUDF3. Para generatorów 3 i 4 używana jest przez system operacyjny do zdefiniowania szybkości transmisji szeregowej SIO. Tabela niektórych wartości dla połączonych liczników 3/4 i odpowiadającej tym wartościom szybkości transmisji jest tutaj. | ||||||||||||||||||
$D206 (R) | POT6 | Rezystancja wiosełka nr 6 (tylko w serii 400/800). | ||||||||||||||||||
$D207 (W) | AUDC4 |
Rejestr kontroli generatora dźwięku nr 4. Ma dla generatora nr 4 takie samo znaczenie, jak rejestr AUDC1 $d201 dla generatora nr 1. Gdy generatory 3 i 4 połączone są w parę, rejestr AUDC4 odpowiada za regulację zniekształceń i głośności w obydwu, a rejestr AUDC3 jest wolny i może zostać użyty np. jako niezależny kanał sampli. | ||||||||||||||||||
$D207 (R) | POT7 | Rezystancja wiosełka nr 7 (tylko w serii 400/800). | ||||||||||||||||||
$D208 (W) | AUDCTL |
Rejestr kontroli dźwięku (Audio Control register). Znaczenie bitów:
Główna częstotliwość 1,773447 MHz obowiązuje w wersji PAL, w wersji zaś NTSC to jest 1,7897725 MHz. Odpowiednio 1/114 częstotliwości głównej to tzw. "15 kHz", czyli 15556,55 Hz w wersji PAL oraz 15699,76 Hz w wersji NTSC, a 1/28 częstotliwości głównej to tzw. "64 kHz", czyli 63337,39 Hz w wersji PAL oraz 63920,4 Hz w wersji NTSC. | ||||||||||||||||||
$D208 (R) | ALLPOT lub POTST | Rejestr stanu konwersji analogowo-cyfrowej dla ośmiu wiosełek (czyli rejestrów POT0-7). Znaczenie bitów:
Jeśli bit jest skasowany, to znaczy, że odpowiedni rejestr POT zawiera właściwy wynik pomiaru. Dokumentacja Atari zaleca odczekanie 4 cykli pomiędzy zapisem POTGO a pierwszym odczytem ALLPOT w trybie szybkiej konwersji A/C. | ||||||||||||||||||
$D209 (W) | STIMER |
Zapis tego rejestru powoduje umieszczenie wartości rejestrów AUDF1-4 w odpowiednich licznikach oraz zapoczątkowanie zliczania. Dodatkowo zeruje przerzutniki odpowiedzialne za generowanie dźwięku. Fale generowane przez kanały 1 i 2 startują od poziomu wysokiego, natomiast 3 i 4 od niskiego. Powoduje to, że fale o tej samej częstotliwości i głośności ustawione np. w generatorach 1 i 3 po zapisie STIMER wygaszą się na wyjściu audio (dokładnie na wyjściu audio będzie utrzymywany poziom głośności ustawiony w AUDC1/3). | ||||||||||||||||||
$D209 (R) | KBCODE | Sześć młodszych bitów tego rejestru to kod klawiaturowy ostatnio wciśniętego klawisza. Znaczenie dwóch pozostałych bitów jest następujące:
Zawartość tego rejestru zmieniają tylko te klawisze, których naciśnięcie powoduje wygenerowanie przerwania IRQ klawiatury. Przerwania tego nie generują następujące klawisze: START, SELECT, OPTION, RESET, BREAK, SHIFT oraz CONTROL (generuje je natomiast klawisz HELP oraz klawisze funkcyjne F1-F4). Klawisze BREAK i RESET wywołują oddzielne przerwania: BREAK przerwanie IRQ, RESET przerwanie NMI w serii 400/800, albo RESET w serii XL/XE. Klawisz SHIFT nie wywołuje przerwania klawiatury, ale jego stan można odczytać w SKSTAT ($D20F). Wciśnięcie klawisza CONTROL daje się wykryć tylko wtedy, kiedy jest wciśnięty razem z jakimś innym klawiszem, którego kod klawiaturowy da się odczytać w tym rejestrze. Rejestr cień KBCODES znajduje się w $02FC (764). Klawisze konsoli patrz CONSOL ($D01F). | ||||||||||||||||||
$D20A (W) | SKRES lub SKSTRES | Zapis tego rejestru powoduje zresetowanie bitów 5-7 rejestru SKSTAT ($D20F). | ||||||||||||||||||
$D20A (R) | RANDOM |
Liczba pseudolosowa z zakresu od 0 do 255. Rejestr zawiera 8 najstarszych bitów 9- lub 17-bitowego rejestru LFSR o wielomianie odpowiednio 1+x4+x9 lub 1+x12+x17 zależnie od stanu bitu 7 AUDCTL. Zawartość rejestru przesuwana jest w prawo co cykl zegara 1,77 MHz. Przy odczytywaniu serii wartości pseudolosowych dobrze jest więc zadbać, żeby pomiędzy kolejnymi odczytami upłynęło co najmniej 8 cykli pracy zegara 1,77 MHz; w przeciwnym wypadku kolejno odczytane wartości mogą okazać się między sobą zauważalnie skorelowane. Ten efekt da się zauważyć zwłaszcza na akceleratorach. Podczas resetowania układu (za pomocą bitów 0 i 1 SKCTL) do rejestru LFSR wsuwane są jedynki. | ||||||||||||||||||
$D20B (W) | POTGO |
Zapis tego rejestru powoduje wyzerowanie rejestrów położenia potencjometrów (POT0-7) i rozpoczęcie pomiaru oporności od nowa. Zerowanie rejestrów POT0-7 trwa 2 cykle zegara 1,77 MHz. Dokumentacja Atari zaleca odczytanie wszystkich rejestrów POT0-7 przed zapisem do POTGO (prawdopodobnie dlatego, że wartość pomiaru nie jest buforowana i w chwili rozpoczęcia pomiaru jest bezpowrotnie tracona). | ||||||||||||||||||
$D20C | - |
Rejestr nieużywany przez POKEY. SIO FIFO wykorzystuje ten rejestr do konfiguracji (tylko zapis):
| ||||||||||||||||||
$D20D (W) | SEROUT | Rejestr wyjściowy dla transmisji szeregowej. Wpisanie tu bajtu powoduje wyemitowanie go na złącze szeregowe. | ||||||||||||||||||
$D20D (R) | SERIN | Rejestr wejściowy dla transmisji szeregowej. Wystąpienie przerwania odczytu z łącza szeregowego sygnalizuje, że w SERIN znajduje się bajt do odebrania. | ||||||||||||||||||
$D20E (W) | IRQEN | Rejestr zezwoleń na wygenerowanie przerwań IRQ. Ma cień POKMSK/IRQENS pod adresem $0010. Przypisanie bitów jest w obydwu identyczne (0 - przerwanie zabronione):
Jeśli używane są procedury systemu operacyjnego, przy blokowaniu przerwań należy korzystać z rejestru-cienia. Np. zablokowanie klawisza BREAK uzyskuje się przez: lda irqens and #$7f sta irqens sta irqen | ||||||||||||||||||
$D20E (R) | IRQST | Rejestr statusu przerwań IRQ. Przypisanie bitów (0 - przerwanie wystąpiło):
POKEY generuje przerwanie przez uaktywnienie linii IRQ procesora. Sygnał ten pozostaje aktywny aż do momentu zasygnalizowania układowi POKEY, że przerwanie zostało obsłużone. Potwierdzenie przyjęcia przerwania - i tym samym "zdjęcie" sygnału IRQ z nóżki procesora - uzyskuje się przez skasowanie bitu odpowiadającego temu przerwaniu w rejestrze IRQEN, a następnie ustawieniu tego bitu z powrotem na jeden. Sekwencja rozkazów, która to robi, wygląda np. tak (przykład dla przerwania zegarowego licznika AUDF1): lda irqens and #$fe sta irqen lda irqens sta irqen W większości wypadków nie ma potrzeby stosowania tego we własnych procedurach obsługi przerwań IRQ, gdyż odnośną sekwencję rozkazów wykonuje główna procedura IRQ znajdująca się w pamięci ROM systemu operacyjnego. Rejestr BRKKEY/IRQSTAT pod adresem $0011 (mylnie identyfikowany jako cień IRQST) jest ustawiany przez procedury systemowe SIO, CIO oraz przerwanie klawisza BREAK (patrz Kody klawiszy). | ||||||||||||||||||
$D20F (W) | SKCTL |
Rejestr kontroli transmisji szeregowej i klawiatury (Serial and Keyboard Control register). Rejestr cień SKCTLS znajduje się pod adresem $0232. Znaczenie bitów:
W trybie dwutonowym częstotliwość ustawiona w AUDF1 $D200 pełni funkcję logicznej jedynki, natomiast ta z AUDF2 - logicznego zera. AUDF2 musi być ustawiony na niższy ton niż AUDF1. System operacyjny wybiera tu częstotliwości 5278 Hz i 3958,56 Hz (w systemie PAL; odpowiednio są to wartości 5 i 7 dla rejestrów AUDF1 i 2). Transmisja dwutonowa jest używana podczas zapisu na magnetofon, poza tym jest normalnie wyłączona, a dane transmitowane są jako poziomy logiczne (+4 V = prawda, 0 V = fałsz). | ||||||||||||||||||
$D20F (R) | SKSTAT | Rejestr statusu transmisji szeregowej i klawiatury (Serial and Keyboard Status register). Znaczenie bitów:
|