Zvukové čipy v osmibitech

2. část

Zvukový čip POKEY

Pro čtenáře tohoto článku (a vlastně i celého FLOPu) pravděpodobně nebude žádným tajemstvím, že typickým zástupcem osmibitových domácích mikropočítačů, které využívaly pro syntézu zvuku i hudby speciální integrovaný obvod, jsou všechny osmibitové mikropočítače firmy Atari. Pro syntézu zvuku (a také několik dalších důležitých operací popsaných na konci této kapitoly) byl firmou Atari vyvinut integrovaný obvod nazvaný POKEY, jehož jméno je odvozeno od sousloví POtentiometer and KEYboard (což je zvláštní, protože mnohem větší význam má generátor zvuku a taktéž modul určený pro ovládání sériové komunikace).

Tento čip není využitý pouze v domácích mikropočítačích, ale také v některých herních konzolích firmy Atari a taktéž herních automatech (ostatně pro firmu Atari představovala výroba herních konzolí i automatových her v jednu chvíli převážnou část zisků). V případě čipu POKEY se jedná o hybridní integrovaný obvod, který obsahuje jak digitální část (právě ta je použita i pro zvukovou syntézu), tak i část analogovou – tento obvod je totiž vybaven mj. i funkcí určenou pro (relativně pomalý) převod analogového signálu na osmibitové vzorky, čehož firma Atari využívala pro připojení ovladačů typu paddle ke svým počítačům i herním konzolím.

V úvodním odstavci této kapitoly jsme jsme si řekli, že integrovaný obvod POKEY slouží mj. i ke zvukové syntéze. Zvuk je možné generovat s využitím čtyř zvukových kanálů (lze tedy vytvářet až čtyřhlasou polyfonii), přičemž vždy dva kanály je možné v případě potřeby spojit do kanálu jednoho, u něhož lze přesněji řídit frekvenci zvuku (v podstatě to znamená, že se dva osmibitové čítače/děliče spojí do jednoho čítače šestnáctibitového a popř. se změní zdroj vstupních hodinových signálů – viz další text). Pro ovládání zvukového subsystému se používá devět osmibitových řídicích registrů: AUDF1 až AUDF4, AUDC1 až AUDC4 a společný řídicí registr AUDCTL.

Každý zvukový kanál produkuje obdélníkový signál s amplitudou, kterou je možné nastavit do jedné ze šestnácti úrovní (pro specifikaci amplitudy každého kanálu jsou vyhrazeny v ovládacích registrech pouze čtyři bity). Nulová logická hodnota obdélníkového signálu na vstupu vždy vede k nulovému napětí na výstupu zvukového kanálu; logická jednička je převedena na jednu ze šestnácti úrovní napětí (podobně jako u TIA a ostatně i u prakticky všech dalších PSG).

Závislost mezi zvolenou úrovní a napětím není přesně lineární; taktéž generovaný signál není (například po připojení na osciloskop) zcela přesně obdélníkový, čehož se dodnes využívá při tvorbě trojúhelníkových a pilových průběhů (ovšem nutno říci, že za značné pomoci mikroprocesoru, přesného časování, popř. s využitím dále zmíněného hi-pass filtru).

Na vstup zvukového subsystému je přiváděn hodinový signál procesoru, který má frekvenci cca 1,79 MHz pro počítače s televizní normou NTSC a 1,77 Hz pro počítače s normou PAL. Tento signál je pro další účely dělen konstantami 28 a 114, takže vzniknou další dva signály, z nichž první má frekvenci přibližně 63 kHz a druhý necelých 16 kHz. S využitím řídicích registrů lze zvolit, který z těchto signálů se bude používat pro řízení zvukových kanálů (ovšem ne všechny možnosti je možné vybrat současně, viz dále).

Frekvence zvuku v každém zvukovém kanálu je řízena děličem 1:N, který je interně implementovaný jako čítač (ostatně právě na základě čítačů obvod POKEY detekuje stlačené klávesy, generuje pseudonáhodná čísla, provádí A/D převod z ovladačů paddle a komunikuje se SIO). Pokud nejsou zvukové kanály spojeny do dvojic, je funkce čítače vlastně velmi jednoduchá: na vstup čítače je přiveden jeden ze tří hodinových signálů zmíněných výše a při každém taktu se hodnota čítače sníží o jedničku.

Při podtečení hodnoty čítače se na jeho výstupu objeví logická jednička a současně je hodnota v čítači resetována na uživatelem zvolenou hodnotu (ta je uložena v příslušném řídicím registru AUDF1 až AUDF4). Výstup čítače je použit v dalších obvodech. Například při generování čistého tónu se jedničkou, která se objeví na výstupu čítače, pouze překlopí jeden klopný obvod (takže se vlastně vstupní frekvence navíc dělí dvěma).

Změnou obsahu řídicího registru obvodu POKEY je možné nakonfigurovat jednu ze tří základních kombinací zvukových kanálů:

1. Čtyři samostatné zvukové kanály, přičemž frekvence každého z nich je vytvořena pomocí osmibitového děliče, na který se přivádí jeden ze dvou vstupních hodinových signálů (cca 16 kHz, cca 63 kHz). Tato konfigurace čipu POKEY je použita při práci se zvukem z Atari BASICu (známý příkaz SOUND a,b,c,d). V tomto režimu lze při standardním nastavení generovat tóny v rozsahu zhruba čtyř oktáv, ovšem výběrem odlišného hodinového signálu je možné celou škálu 256 různých tónů posunout.

2. Dva zvukové kanály, přičemž frekvence každého z nich je vytvořena pomocí šestnáctibitového děliče, který vznikl spojením dvou děličů osmibitových. V takovém případě je možné na vstup děliče přivádět přímo hodinovou frekvenci procesoru, tj. vybírat mezi třemi vstupními signály cca 16 kHz, cca 63 kHz a 1,77 popř. 1,79 MHz podle televizní normy). Tónový rozsah z obou stran v tomto případě přesahuje limity lidského sluchu (infrazvuk, ultrazvuk) i možnosti zesilovačů.

3. Jeden zvukový kanál řízený šestnáctibitovým děličem a dva kanály řízené děličem osmibitovým (tuto konfiguraci využívalo mnoho hudebníků, kteří přesněji řízený zvukový kanál použili pro basový hudební nástroj a další dva kanály pro perkusní nástroj – někdy samplovaný – a hlavní melodii hranou většinou na vyšších frekvencích).

Poznámka: v případě, že se dva zvukové kanály spojí za sebe, dojde ke snížení současně přehrávaných zvuků na 3 nebo dokonce jen na 2, ale zvýší se přesnost čítače, protože vstupní frekvence může být dělena hodnotou 1 až 2^16. V tomto případě se však volí vyšší frekvence hodinových signálů na vstupu obvodu: z cca 16 kHz na 63 kHz nebo na CPU clock, jinak by po vydělení příliš velkou hodnotou byl na výstupu zvukových kanálů infrazvuk, který se v případě obdélníkového průběhu projevuje pouze "lupáním" membrány reproduktoru při skokové změně amplitudy.

Zastavme se na chvíli u popisu subsystému pro generování šumu popř. zkreslených periodických signálů. Ten je založen na již zmíněných LSFR, tedy posuvných registrech se zpětnovazební smyčkou (dva vybrané bity se přes XOR hradlo vrací zpět na vstup čítače). LSFR se někdy označují termínem poly čítače. Připomeňme si, že na výstupu děličů (tvořených osmibitovými čítači popř. dvěma spojenými osmibitovými čítači) získáme po každých N cyklech vstupního signálu logickou úroveň 1. Pokud potřebujeme generovat čistý tón, je tato úroveň použita pro změnu (toggle) výstupní úrovně v klopném obvodu typu D (opět se zpětnou vazbou). Výsledkem je obdélníkový signál.

Ovšem je možná i další kombinace využívající zmíněné poly čítače. Obvod POKEY obsahuje celkem tři poly čítače (čtyřbitový, pětibitový, sedmnáctibitový), jejichž výstup může řídit vybraný zvukový kanál. Všechny čtyři zvukové kanály se dělí o stejné poly čítače, ovšem každý zvukový kanál může mít nastavenou jinou frekvenci, tj. i výsledný zvuk bude odlišný. U sedmnáctibitového poly čítače (viz další odstavce) je vzdálenost mezi stejnými vzorky (perioda) tak velká, že ho lze považovat za generátor náhodných impulsů, který vytváří bílý šum.

Princip řízení zvukového kanálu poly čítačem je ve skutečnosti velmi jednoduchý – řízení je prováděno obyčejným logickým hradlem a klopným obvodem typu D. Poly čítače sice mění hodnotu na svém výstupu velmi rychle (jsou totiž řízeny přímo hodinovým signálem mikroprocesoru, tj. cca 1,79 MHz pro počítače pracující v normě NTSC a 1,77 MHz pro počítače s televizní normou PAL), ale maximální frekvence na výstupu zvukového kanálu je kvůli zapojenému logickému hradlu a klopnému obvodu omezena frekvencí získanou pomocí děliče 1:N (neboli hodnota na výstupu klopného obvodu se nemůže měnit s větší frekvencí, než je frekvence přivedená na jeho vstup CLK).

Je to vlastně velmi elegantní řešení, kdy si tvůrci čipu POKEY vystačili s pouhými třemi poly čítači sdílenými všemi čtyřmi zvukovými kanály (ostatně stejný minimalismus a eleganci nalezneme v high-pass filtru popsaného níže).

Samotný poly čítač, tj. generátor pseudonáhodného šumu, je tvořen posuvným registrem řízeným externím hodinovým signálem. S každým taktem hodin dojde k posunu obsahu registru (tj. čtyř, pěti, sedmnácti a ve speciálním případě devíti bitů) o jednu pozici. Na vstup posuvného registru je zpětnovazební smyčkou přivedena binární hodnota získaná pomocí hradla typu XOR připojeného svými vstupy na třetí a poslední bit posuvného registru – hodnota, na výstupu hradla je tedy zapsána do první pozice.

Pokud vezmeme do úvahy logickou funkci, kterou hradlo typu XOR reprezentuje, dojdeme k závěru, že po inicializaci čipu POKEY může mít posuvný registr prakticky jakoukoli nenulovou hodnotu, protože i za této situace rychle dojde k jeho naplnění pseudonáhodnými daty, které se poté periodicky opakují s periodou, jejíž délka závisí na bitové délce samotného posuvného registru.

Pokud má registr délku n bitů, je perioda rovna 2^n-1 taktům, protože jeden zbývající stav – samé nulové bity – tvoří samostatný (nezajímavý) cyklus. Poslední bit posuvného registru představuje i jeho finální výstup, tj. sekvenci pseudonáhodných binárních hodnot, kterou po zpracování obvodem POKEY (zejména po nastavení amplitudy) slyšíme.

Zatímco čtyřbitové a pětibitové poly čítače produkují poměrně rychle se opakující pseudonáhodné sekvence (lze s nimi napodobit například zvuk leteckých motorů), sedmnáctibitový poly čítač již má délku sekvence tak dlouhou, že s ním lze generovat náhodný zvuk. Tento čítač lze také překonfigurovat tak, že se jeho délka sníží na devět bitů (což pravděpodobně souvisí se snahou přiblížit se zvukovým možnostem čipu TIA). Překonfigurování je snadné: zpětnovazební smyčka je přepojena do osmého bitu a nikoli do bitu prvního.

Poslední zajímavou funkcí čipu POKEY související s generováním zvuků, je možnost zařadit do řetězce zpracování i takzvaný high-pass filtr. Ovšem tento název nás nesmí zmást, protože se nejedná o skutečnou analogovou či digitální horní propust, ale o "pouhý" klopný obvod typu D doplněný o hradlo. Na vstup D (data) je přiváděn výstup z jednoho zvukového kanálu, na vstup CLK (hodiny, resp. přesněji zapamatování D) pak výstup z kanálu dalšího. Současně je výstup z prvního kanálu zkombinován hradlem XOR s výstupem Q z klopného obvodu D. Co to znamená v praxi? Každá hrana, která se objeví v kanálu 1 invertuje výstup z tohoto zapojení, zatímco hrana, která se objeví v kanálu 2 výstup vynuluje (na vstupu XOR se v daném okamžiku nachází dvě shodné hodnoty).

Výsledkem je tedy signál, jehož průběh vzdáleně připomíná výsledek PWM (pulsně-šířkovou modulaci) ve chvíli, kdy jsou si frekvence obou kanálů blízké. A právě k tomuto účelu je možné high-pass filtr použít, kromě dalších triků.

V případě potřeby (a také dostatečného výkonu mikroprocesoru) je možné generování obdélníkového signálu zcela vypnout a řídit pouze amplitudu na výstupu každého zvukového kanálu. Tímto způsobem lze přehrávat i nasamplované zvuky, ovšem kvůli výše uvedeným vlastnostem čipu POKEY je možné použít pouze šestnáct úrovní hlasitosti, tj. jedná se o čtyřbitový sampling s dynamickým rozsahem pouze 24 dB (naproti tomu CD-Audio využívá šestnáctibitový sampling s dynamickým rozsahem 96 dB a SID používá osmibitový sampling s dynamickým rozsahem cca 48 dB, což zhruba odpovídá magnetofonovému záznamu).

Ve skutečnosti je možné v případě, že je to nutné, digitalizovaný zvuk přehrávat současně na všech čtyřech zvukových kanálech, čímž se počet úrovní – a tím i dynamický rozsah – nepatrně zvyšuje (součet intenzit není lineární ale logaritmický). Nasamplovaná řeč byla na osmibitových počítačích Atari použita například ve hrách Ghostbusters či Berzerk, běžněji se setkáme s nasamplovanými bicími nástroji.

Kromě zvukové syntézy se integrovaný obvod POKEY používal i pro dat čtení klávesnice (přímá podpora pro maximálně 64 kláves + 3 speciálně zpracovávané klávesy Control, Shift a Break), komunikaci se zařízeními připojenými přes sériový port (jedná se o známé rozhraní SIO – Serial Input/Output), jako generátor pseudonáhodných čísel i ve funkci časovače (tři zvukové kanály bylo možné přepnout do funkce časovače, čehož se využívalo při práci s kazetovým magnetofonem).

Právě sloučení mnoha různých funkcí do jediného čtyřicetipinového integrovaného obvodu umožnilo snížit celkový počet obvodů ve všech osmibitových počítačích Atari, což samozřejmě – v mnohem větší míře než dnes – souvisí i s celkovou relativně nízkou výrobní cenou počítače či konzole, jeho nižší poruchovostí apod. Jen pro upřesnění: v klasických osmibitových Atari se nacházely čtyři "velké" obvody se čtyřiceti piny – mikroprocesor MOS 6502, grafický koprocesor ANTIC, grafický čip CTIA, později GTIA a taktéž v tomto článku popsaný multifunkční obvod POKEY.

Pavel Tišnovský
2018