Rejestry POKEY-a

From Atariki

Revision as of 12:10, 22 maj 2009; view current revision
←Older revision | Newer revision→
Jump to: navigation, search

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.

Wiadomości wstępne

Główny zegar POKEY-a ma częstotliwość 1773447 Hz w systemie PAL oraz 1789772,5 Hz w systemie NTSC (albo wg niektórych źrodeł 1,7897885 MHz).

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 klawiatury: KBCODE, SKCTL, SKSTAT.
  • Rejestry wiosełek: POT0-7, POTST, POTGO.
  • Rejestry transmisji szeregowej: AUDF1-4, AUDC4, AUDCTL, SKSTRES, SKCTL, SKSTAT, SERIN, SEROUT.
  • Rejestry IRQ: IRQEN, IRQST, AUDF1-4, AUDCTL, STIMER.
  • Inne rejestry: RANDOM.

Lista rejestrów

AdresEtykietaOpis
$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:

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

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 IRQEN $D20E i STIMER $D209.

$D200 (R)POT0Rezystancja wiosełka nr 0.
$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:

Bity 7,6,5Znaczenie
000Rejestr 5-bitowy i 17-bitowy
001Rejestr 5-bitowy
010Rejestr 5-bitowy i 4-bitowy
011Rejestr 5-bitowy
100Rejestr 17-bitowy
101Bez rejestru przesuwającego (czysty ton)
110Rejestr 4-bitowy
111Bez rejestru przesuwającego (czysty ton)

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

$D201 (R)POT1Rezystancja 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)POT2Rezystancja 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)POT3Rezystancja 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)POT4Rezystancja wiosełka nr 4 (tylko w serii 400/800).
$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)POT5Rezystancja 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.

$D206 (R)POT6Rezystancja 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)POT7Rezystancja wiosełka nr 7 (tylko w serii 400/800).
$D208 (W)AUDCTL

Rejestr kontroli dźwięku (Audio Control register). Znaczenie bitów:

  • bit 7 - kontrola rejestru przesuwającego (0 = 17 bitów, 1 = 9 bitów)
  • bit 6 - zegar bazowy dla generatora 1 (0 - wg bitu 0, 1 = częstotliwość główna)
  • bit 5 - zegar bazowy dla generatora 3 (0 - wg bitu 0, 1 = częstotliwość główna)
  • bit 4 - łączenie generatorów 1 i 2 w parę (1 = połączone)
  • bit 3 - łączenie generatorów 3 i 4 w parę (1 = połączone)
  • 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 0 - wybór częstotliwości bazowej dla wszystkch generatorów (0 - 1/28 cz. głównej, 1 - 1/114 cz. głównej)

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)POTST (aka ALLPOT)

Rejestr stanu konwersji analogowo-cyfrowej dla ośmiu wiosełek (czyli rejestrów POT0-7). Znaczenie bitów:

  • bit 7 - POT7
  • bit 6 - POT6
  • bit 5 - POT5
  • bit 4 - POT4
  • bit 3 - POT3
  • bit 2 - POT2
  • bit 1 - POT1
  • bit 0 - POT0

Jeśli bit jest skasowany, to znaczy, że odpowiedni rejestr POT zawiera właściwy wynik pomiaru.

$D209 (W)STIMER

Zapis tego rejestru powoduje umieszczenie wartości rejestrów AUDF1, AUDF2 i AUDF4 w odpowiednich licznikach oraz zapoczątkowanie zliczania.

Dodatkowo zeruje przerzutniki odpowiedzialne za generowanie dźwięku.

$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:

  • bit 7 = 1, klawisz naciśnięto razem z CONTROL
  • bit 6 = 1, klawisz naciśnięto razem z SHIFT

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.

Klawisze konsoli patrz CONSOL ($D01F).

$D20A (W)SKSTRES

Zapis tego rejestru powoduje zresetowanie bitów 5-7 rejestru SKSTAT ($D20F).

$D20A (R)RANDOM

Liczba pseudolosowa z zakresu od 0 do 255.

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

$D20C-

Rejestr nieużywany.

$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 szregowego sygnalizuje, że w SERIN znajduje się bajt do odebrania.

$D20E (W)IRQEN

Rejestr zezwoleń na wygenerowanie przerwań IRQ. Ma cień IRQENS pod adresem $0010. Przypisanie bitów jest w obydwu identyczne (0 - przerwanie zabronione):

  • bit 7 - przerwanie klawisza BREAK
  • bit 6 - przerwanie klawiatury
  • bit 5 - odczyt z łącza szeregowego
  • bit 4 - zapis na łącze szeregowe
  • bit 3 - koniec transmisji szeregowej
  • bit 2 - licznik nr 4
  • bit 1 - licznik nr 2
  • bit 0 - licznik nr 1

Przy blokowaniu przerwań IRQ należy raczej korzystać z cienia. Np. zablokowanie klawisza BREAK uzyskuje się przez:

    lda irqens
    and #$7f
    sta irqens
    sta irqen
$D20E (R)IRQST

Rejest statusu przerwań IRQ. Cień IRQSTAT pod adresem $0011. Przypisanie bitów (0 - przerwanie wystąpiło):

  • bit 7 - przerwanie klawisza BREAK
  • bit 6 - przerwanie klawiatury
  • bit 5 - odczyt z łącza szeregowego
  • bit 4 - zapis na łącze szeregowe
  • bit 3 - koniec transmisji szeregowej
  • bit 2 - licznik nr 4
  • bit 1 - licznik nr 2
  • bit 0 - licznik nr 1

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.

$D20F (W)SKCTL

Rejestr kontroli transmisji szeregowej i klawiatury (Serial and Keyboard Control register). Znaczenie bitów:

  • bit 7 - nadanie sygnału SPACE, czyli dziesięciu zer (1 = włączone)
  • bity 6-4 - źrodło sygnału zegarowego dla transmisji szeregowej (bit 6 od lewej):
    • 000 - zewnętrzne, wg linii CLOCK IN gniazda SIO
    • 001 - odczyt wg AUDF4 $D206, zapis wg CLOCK IN (default przy odczycie)
    • 010 - odczyt i zapis wg AUDF4 (default przy zapisie)
    • 011 - kombinacja zabroniona
    • 100 - odczyt wg CLOCK IN, zapis wg AUDF4
    • 101 - kombinacja zabroniona
    • 110 - odczyt wg AUDF4, zapis wg AUDF2 $D202 (niedostępne w trybie dwutonowym)
    • 111 - jak wyżej, CLOCK IN i CLOCK OUT nieaktywne (niedostępne w trybie dwutonowym)
  • bit 3 - transmisja dwutonowa (1 = włączona)
  • bit 2 - częstotliwość konwersji analogowo-cyfrowej (0 - 20 ms, 1 - 128 us)
  • bit 1 - tryb pracy klawiatury (1 - standard, 0 - skanowanie matrycy)
  • bit 0 - ustawienie wartości 1 tu i w bicie 1 (czyli wpisanie $03 do SKCTL) resetuje POKEY

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:

  • 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 odebrano jeszcze poprzedniego bajtu (0 - wystąpiło)
  • bit 5 - serial overrun - w momencie zgłoszenia przerwania nie odebrano jeszcze poprzedniego bajtu (0 - wystąpił)
  • bit 4 - kopia wejścia szeregowego
  • bit 3 - klawisz SHIFT (0 - wciśniety)
  • bit 2 - dowolny klawisz (0 - wciśnięty)
  • bit 1 - odczyt danych (0 - w toku)
  • bit 0 - nieużywany, zawsze 1.

Wymieniony powyżej "bufor wejściowy klawiatury" to rejestr KBCODE $D209. Bit 6 SKSTAT ustawiany jest na zero, kiedy w KBCODE pojawi się nowa wartość zanim poprzednia została odczytana przez procesor.

Wymieniony powyżej "bufor wejściowy klawiatury" to rejestr KBCODE $D209. Bit 6 SKSTAT ustawiany jest na zero, kiedy w KBCODE pojawi się nowa wartość zanim poprzednia została odczytana przez procesor.

Personal tools