Powrót do spisu treści

Rozdział 9

DŹWIĘK

    Wszystkie komputery domowe są wyposażone w lepsze lub gorsze układy służące do tworzenia dźwięku. Komputery Atari XL/XE nie są tu wyjątkiem i posiadają cztery niezależne generatory dźwięku. Stanowią one integralną część specjalizowanego układu scalonego POKEY (POtentiometr and KEYboard chip). Do sterowania tymi generatorami POKEY posiada dziewięć rejestrów (tylko do zapisu). Oprócz tego generatory służą jako sprzętowe liczniki i mogą wywoływać przerwania IRQ.

9.1. Generowanie dźwięku

    Ponieważ POKEY jest wykorzystywany przede wszystkim do obsługi klawiatury i złącza szeregowego, to podczas każdej operacji wejścia/wyjścia zmieniane są stany rejestrów sterujących generatorami. Aby uzyskać prawidłowe efekty dźwiękowe należy go więc ponownie zainicjować po takiej operacji. Wykonuje się to przez wpisanie wartości zero do rejestru AUDCTL ($D208) i wartości 3 do rejestru SKCTL ($D20F).

    Każdy z czterech generatorów dźwięku posiada dwa odrębne rejestry. Jeden z nich (AUDF1-4 - AUDio Frequency 1-4) służy do ustalenia częstotliwości dźwięku, a drugi (AUDC1-4 - AUDio Control 1-4) steruje głośnością i zniekształceniami. Ponadto wszystkie generatory są sterowane poprzez wspólny rejestr AUDCTL (AUDio ConTroL).

    Rejestr częstotliwości AUDF jest wykorzystywany jako dzielnik impulsów. POKEY zlicza impulsy sygnału wejściowego doprowadzonego do generatora i przesyła impuls do wyjścia, gdy stan licznika jest zgodny z zawartością rejestru AUDF zwiększoną o jeden. Przy wartości zero w AUDF przepuszczany jest każdy impuls wejściowy, a przy wartości, np. 3 - co czwarty. Dzielnik ma więc zakres od 1 do 256. Ponieważ sygnał wyjściowy składa się z pojedynczych impulsów, to na końcu jest jeszcze dzielony przez dwa przy pomocy przerzutnika. Otrzymuje się wtedy sygnał o wypełnieniu 1:1 (stosunek czasu trwania impulsu do czasu trwania przerwy między impulsami). Ta ostatnia operacja jest konieczna dla uzyskania właściwej barwy dźwięku.

    Nieco bardziej skomplikowane jest działanie rejestrów sterujących generatorami - AUDC. Poszczególne bity tych rejestrów mają różne funkcje. Bity 0-3 określają natężenie dźwięku. Ponieważ w czterech bitach można zapisać wartości od 0 do 15, to taka właśnie jest skala uzyskiwanej siły głosu. Bit 4 wyłącza dzielnik częstotliwości. Powoduje to pojawienie się na wyjściu stałego napięcia o wartości określonej przez bity 0-3. Efektem akustycznym jest stuk w głośniku. Szerszy opis wykorzystania tego bitu znajduje się w dalszej części. Pozostałe bity AUDC kontrolują zniekształcenia dźwięku.

    Teraz trzeba przyjrzeć się nieco bliżej konstrukcji układu POKEY. Zawiera on trzy rejestry przesuwające pracujące z częstotliwością zegara systemu (1,79 MHz w systemie NTSC i 2,217 MHz w systemie PAL). Mają one długość 4, 5 i 17 bitów, przy czym rejestr 17-bitowy można przełączyć na 9-bitowy. Impulsy z generatora, po przejściu przez dzielnik częstotliwości, lecz przed podziałem przez dwa, są doprowadzane na wejście wybranego rejestru. Pojawiają się na wyjściu z rejestru w tej samej kolejności (rejestr przesuwający działa jak kolejka w sklepie). Nie byłoby w tym nic nadzwyczajnego, gdyby nie dodatkowa operacja. Bity pobierane są nie tylko z wyjścia, lecz także ze środka rejestru przesuwającego. Bity te poddawane są operacji logicznej NOR i ponownie przesyłane do wejścia rejestru. Powoduje to uzyskanie zakłóceń pseudolosowych, których powtarzalność zależy od długości rejestru.

    Po tym wyjaśnieniu łatwo będzie zrozumieć działanie trzech najstarszych bitów (5-7) rejestru AUDC. Służą one do wyboru rejestru przesuwającego, który będzie użyty do zniekształcenia dźwięku. Kolejne kombinacje tych bitów mają następujące znaczenie:
           bity 000 - rejestr 5-bitowy i 17-bitowy
           bity 001 - rejestr 5-bitowy
           bity 010 - rejestr 5-bitowy i 4-bitowy
           bity 011 - rejestr 5-bitowy
           bity 100 - rejestr 17-bitowy
           bity 101 - bez rejestru przesuwającego
           bity 110 - rejestr 4-bitowy
           bity 111 - bez rejestru przesuwającego
    Pomimo użycia trzech bitów kombinacji jest tylko sześć, gdyż pary 001 i 011 oraz 101 i 111 są identyczne. Poniższa tabela (zaczerpnięta z "De Re Atari") przedstawia rodzaje dźwięku uzyskiwane przy różnych częstotliwościach i różnych wartościach bitów 5-7 w AUDC.
kombinacja                  częstotliwości
bitów 5-7      niskie           średnie          wysokie
   000     licznik Geigera   pęd powietrza      strumień
   0x1     karabin maszyn.   silnik elektr.   transformator
   010        ognisko           samochód      wizg silnika
   100     walący się dom   zakłócenia radiowe   wodospad  
   1x1               c z y s t e   d ź w i ę k i
   110         samolot         kosiarka          golarka
    Pozostało jeszcze do opisania znaczenie bitu 4. Ponieważ steruje on wyłącznie siłą głosu, to można przede wszystkim generować przy jego pomocy rytm. Częstotliwość tego rytmu jest dowolna - od ułamków Hertza aż do kilkuset kHz. Jednak zastosowanie tego bitu jest znacznie szersze. Po jego ustawieniu głośnik otrzymuje stałe napięcie określone przez bity 0-3. Można więc generować dowolny dźwięk przez zmianę tylko i wyłącznie głośności. Wymaga to oczywiście precyzyjnego odliczania czasu, lecz nie jest to żaden problem.

    Na przykład instrumenty dęte blaszane emitują falę dźwiękową o przebiegu trójkątnym. Normalnie dźwięk wytwarzany przez komputer ma przebieg prostokątny, różnica barwy jest więc bardzo wyraźna. Wygenerowanie przebiegu trójkątnego wymaga jedynie ustawienia bitu 4 i cyklicznego wpisywania do bitów 0-3 wartości rosnących liniowo od 0 do 15, a następnie malejących od 15 do 0 (razem 16-31 i 31-16). Jest to bardzo proste, lecz Atari Basic jest zbyt wolny i trzeba to wykonać w języku maszynowym (oczywiście procedurę maszynową można także dołączyć do programu w Basicu).

    Ostatni rejestr dźwięku POKEY-a - AUDCTL - steruje jednocześnie wszystkimi generatorami. Jego użycie znacznie zwiększa możliwości dźwiękowe Atari. Poszczególne bity tego rejestru mają następujące znaczenie:

    Bit 0 służy do wyboru zegara bazowego, czyli źródła impulsów dla wszystkich generatorów. Normalnie zegar bazowy ma częstotliwość 64 kHz, a po ustawieniu bitu 0 jest przełączany na 15 kHz. Jeśli pozostałe parametry pozostaną niezmienione, to spowoduje to czterokrotne zmniejszenie częstotliwości wszystkich dźwięków.

    Ustawienie bitu 1 włącza filtr górnoprzepustowy w generatorze 2. Filtr ten jest sterowany generatorem 4 i powoduje, że generator 2 emituje tylko dźwięki o częstotliwościach wyższych od częstotliwości generatora 4.

    Bit 2 włącza analogiczny filtr górnoprzepustowy dla generatora 1 sterowany generatorem 3.

    Bit 3, gdy jest ustawiony, łączy dzielniki generatorów 3 i 4 w jeden dzielnik 16-bitowy, który umożliwia bardziej precyzyjną regulację częstotliwości. Poszerza to również zakres uzyskiwanych częstotliwości ze 125 Hz - 32 kHz do 0,5 Hz - 32 kHz, a po zmianie zegara bazowego przy pomocy bitu 5 na 16 Hz - 1 MHz.

    Bit 4 łączy dzielniki 1 i 2 w jeden dzielnik 16-bitowy analogicznie jak bit 3.

    Bit 5 przełącza (gdy jest ustawiony) zegar bazowy dla generatora 3 na częstotliwość 2,217 MHz (wszystkie źródła podają tu częstotliwość 1,79 MHZ - jest to częstotliwość kwarcowego zegara systemu, ale w NTSC! - komputery w wersji PAL mają zegar 2,217 MHz). Przełączenie to powoduje zwiększenie częstotliwości ponad 30 razy. Tak wysokie dźwięki nie nadają się do słuchania - wykorzystuje się tą możliwość prawie zawsze jednocześnie z ustawieniem bitu 3.

    Bit 6 przełącza zegar bazowy dla generatora 1 na częstotliwość 2,217 MHz, podobnie jak bit 5 (wszystkie podane tam uwagi odnoszą się także do tego bitu).

    Bit 7 przełącza 17-bitowy rejestr przesuwający na rejestr 9-bitowy. Pozwala to na uzyskanie dwóch dodatkowych sposobów zniekształcenia dźwięku (dla bitów 5-7 w AUDC równych 000 lub 100).

    Ubocznym efektem działania generatorów dźwięku jest liczba pseudolosowa znajdująca się w rejestrze RANDOM ($D20A). Umieszczane jest tam osiem najstarszych bitów z 17-bitowego rejestru przesuwającego. Przez odczyt tego rejestru można otrzymać przypadkową wartość z zakresu od 0 do 255. Możliwość ta jest często wykorzystywana, szczególnie przez programy napisane w języku maszynowym.

9.2. Liczniki POKEY-a

    Wspomniane wcześniej liczniki POKEY-a są jedną z najrzadziej wykorzystywanych możliwości Atari, warto więc opisać bliżej ich działanie, choć odbiega to od głównego tematu rozdziału. Opis ten dotyczy liczników 1, 2 i 4 - licznik 3 nie jest używany w systemie operacyjnym (w taki sposób).

    Po ustawieniu i uruchomieniu liczniki zliczają wstecz, to znaczy od wartości ustawionej do zera. W chwili wyzerowania licznika POKEY generuje sygnał żądania przerwania maskowalnego IRQ. Każdemu z liczników odpowiada jeden bit (0, 1 i 2) w rejestrze zezwoleń przerwań IRQEN oraz w rejestrze sygnalizacji przerwań IRQST. Po rozpoznaniu źródła przerwania CPU wywołuje procedurę przerwania, której wektor jest umieszczony odpowiednio w rejestrze VTIMR1 ($0210), VTIMR2 ($0212) lub VTIMR4 ($0214). A oto kolejność postępowania, konieczna dla wykorzystania tych przerwań.

    Najpierw trzeba ustawić w rejestrze AUDCTL wymaganą częstotliwość zegara bazowego. Następnie w rejestrze AUDC odpowiadającym wykorzystywanemu licznikowi należy umieścić zero. Początkowy stan licznika wpisuje się do rejestru AUDF. Oczywiście w pamięci musi znajdować się procedura obsługi przerwania, a odpowiedni wektor VTIMR (Vector TIMeR) musi zawierać jej adres. Także właściwe bity w IRQEN i IRQENS muszą zezwalać na przerwanie.

    Teraz wpisanie dowolnej wartości do rejestru STIMER (Start TIMERs - $D209) powoduje umieszczenie zawartości rejestrów AUDF w licznikach i ich uruchomienie. Ponieważ liczniki POKEY-a zliczają z częstotliwością znacznie większą niż pozostałe zegary systemu, to w ten sposób można uzyskać odliczanie czasu krótszego od 1/50 sekundy. Dla czasów dłuższych wykorzystywane są przerwania synchronizacji pionowej VBLK oraz liczników TIMCNT1-5.
Zientara Wojciech: Mapa pamięci Atari XL/XE. Procedury wejścia-wyjścia, SOETO, Warszawa, 1988.