Osmibitová herní konzole NES s čipem 2A03 nebo 2A07

Ústředním čipem, na němž je postavena slavná osmibitová herní konzole NES, je mikroprocesor Ricoh 2A03, popř. Ricoh 2A07 (tyto čipy se od sebe liší především odlišným časováním a jsou určeny pro různé televizní normy). Konstruktéři v případě mikroprocesoru 2A03/2A07 vsadili na osvědčenou jistotu, protože tento čip je založen na jádru oblíbeného osmibitového mikroprocesoru MOS 6502, který pravděpodobně není zapotřebí čtenářům FLOPu podrobněji představovat.

V případě čipů 2A03/2A07 však došlo k určitému zjednodušení jádra původního MOS 6502. Například byl odstraněn nepříliš často používaný režim pro práci s BCD čísly, kdy se do jednoho bajtu ukládají dvě dekadické číslice 0-9 (každá do čtyř bitů - nibblu), což znamená, že rozsah ukládaných hodnot byl 00 až 99 a nikoli 0 a 255. Původní mikroprocesor MOS 6502 a jeho varianty může být do tohoto režimu přepnut pomocí instrukce SED (set decimal), přepnutí zpět zajišťuje instrukce CLD (clear decimal).

Zatímco jádro mikroprocesoru bylo nepatrně zjednodušeno, byly na čip Ricoh 2A03/2A07 přidány další podpůrné moduly, díky jejichž existenci mohlo být redukováno celkové množství integrovaných obvodů, z nichž se herní konzole NES skládala. Jednalo se v první řadě o programovatelný "pomalý" časovač se základní frekvencí 240 Hz, z níž mohly být odvozeny další frekvence (48, 60, 96, 120 a 192 Hz). Dále byl na čip přidán modul pro přímý přístup do paměti a přenosy dat (DMA).

V kontextu tohoto článku je pro nás však mnohem zajímavější další část určená pro práci se zvukem: šlo o programovatelné generátory obdélníkového signálu, generátor trojúhelníkového signálu a taktéž o konfigurovatelný generátor šumu tvořený posuvným registrem se zpětnou vazbou. Zapomenout nesmíme ani na modul určený pro přehrávání samplů (napojený na D/A převodník). Celý zvukový subsystém se řídil pomocí devatenácti osmibitových registrů.

Zvuk či melodie mohly být tvořeny v pěti na sobě nezávislých kanálech. Jedná se o dva již zmíněné generátory obdélníkového signálu s volitelnou amplitudou, frekvencí a střídou, dále o (taktéž zmíněný) generátor trojúhelníkového signálu s volitelnou frekvencí a automaticky měněnou amplitudou, generátor šumu, u nějž bylo možné zvolit režim činnosti, amplitudu a frekvenci posunu a konečně o D/A převodník, který mohl být buď ovládán přímo programově, nebo bylo umožněno načítat zvukové vzorky (samply) uložené v paměti ROM či RAM. Zajímavé je, že zvukový subsystém neobsahoval žádné filtry, na rozdíl od (jednoduchých) filtrů nabízených čipem POKEY (Atari) či komplexnějších filtrů použitých v čipu SID (Commodore C64).

Taktéž podpora pro tvarování obálky generovaných signálů byla pouze dosti jednoduchá (tuto funkcionalitu však neměl ani POKEY, kde se musela řešit programovými cestami či trikem s high-pass filtry). Čip 2A03/2A07 obsahoval dva piny, na které byl přiváděn výstup ze všech pěti zvukových kanálů. Na pin číslo 1 (ROUT) byl přiváděn výstup z obou generátorů obdélníkových signálů, zatímco výstup z ostatních třech kanálů byl přiváděn na pin číslo 2 (COUT). V herní konzoli NES byl výstup z obou kanálů sloučen a analogově sečten s mikrofonním vstupem (ten se příliš často nepoužíval) a výsledný analogový signál byl zesílen a dále zpracován.

Z hlediska programátora-hudebníka se nejjednodušeji ovládaly oba generátory obdélníkových signálů, u nichž bylo možné měnit zejména tři základní parametry: amplitudu (4 bity = 16 nastavitelných úrovní), frekvenci (přibližně 54,6 Hz až 12,4 kHz podle použité televizní normy, frekvenci bylo možné měnit plynule díky použití šestnáctibitových čítačů) a střídu (1:8, 1:4, 1:2, 3:4). Každý z této dvojice kanálů se ovládal čtyřmi řídicími registry: SQx_VOL (hlasitost), SQx_SWEEP (střída), SQx_LO a SQx_HI (počáteční hodnota čítače, ze které se odvozuje frekvence zvuku). Poznámka: za "x" si doplňte číslo kanálu, tedy 1 nebo 2.

U generátoru trojúhelníkového signálu se měnila jeho úroveň (4 bity = 16 úrovní) automaticky, ale programově bylo možné nastavit frekvenci změn signálu v rozsahu 27,3 Hz až 55,9 kHz (opět v závislosti na použité televizní normě). Vše se ovládalo třemi registry nazvanými TRI_LINEAR (aktuální hodnota čítače pro generování "schodů" tvořících vzestupnou i sestupnou hranu trojúhelníkového signálu, zvyšuje se automaticky), TRI_LO a TRI_HI (počáteční hodnota čítače, z něhož se odvozuje frekvence trojúhelníkového signálu).

Podobně jako další popsané zvukové čipy POKEY či AY-3-8910, obsahoval i zvukový subsystém herní konzole NES generátor šumu. Ten byl vytvořen pomocí patnáctibitového posuvného registru se zpětnou vazbou: vybrané dva bity posuvného registru byly přes hradlo XOR přesunuty na jeho začátek, přičemž se obsah registru mezitím posunul o jeden bit doleva. Zvukový výstup byl generován na základě aktuálního obsahu bitu s indexem 14.

Posuvný registr mohl pracovat ve dvou režimech činnosti: "krátkém" a "dlouhém". Ve "dlouhém režimu" se generovala sekvence pseudonáhodných bitů s periodou 32767 vzorků (zbývající 32768 stav nemohl být použit, protože se jednalo o nulovou hodnotu spadající mimo generovanou sekvenci; to již ostatně známe). V "krátkém režimu" byla perioda pseudonáhodného signálu kratší: 93 bitů/vzorků. Samozřejmě bylo taktéž možné měnit frekvenci posunu, a to přibližně v rozsahu 29,3 Hz až 447 kHz (opět v závislosti na tom, jaká televizní norma byla použita). Pro řízení generátoru šumu byly použity tři registry: NOISE_VOL (hlasitost, 4 bity), NOISE_LO a NOISE_HI (frekvence + výběr krátkého nebo dlouhého režimu).

Zbývá nám si popsat už jen pátý kanál, jímž je D/A převodník. Ten bylo možné ovládat programově změnou jednoho řídicího registru (sedmibitová hodnota), popř. byla podporována funkce automatického přehrávání vzorků (samplů) z paměti ROM, přičemž při načítání samplu došlo k pozastavení mikroprocesoru. Při přehrávání vzorků byla frekvence nastavitelná v rozsahu 4,2 kHz až 33,5 kHz (ovšem zvolit bylo možné jen šestnáct přednastavených frekvencí). D/A převodník se ovládal čtyřmi registry nazvanými DMC_FREQ (frekvence přehrávání samplů), DMC_RAW (přímý sedmibitový výstup, pokud se nepoužije automatické přehrávání), DMC_START (adresa se vzorky, resp. konstanta, z níž se adresa vypočte) a DMC_LEN (počet vzorků).

Devatenáctý a současně i poslední řídicí registr se jmenuje SND_CHN. Slouží pro povolení zvukových kanálů a pro přečtení stavu zvukového subsystému.

Tento čip již nabízí v porovnání s POKEY zajímavé možnosti. Týká se to zejména 16bitových čítačů použitých při generování obdélníkových signálů (v POKEY naproti tomu bylo nutné spojit dva kanály) a generátoru trojúhelníkového signálu, který mohl být použitý pro basové linky popř. pro perkusní nástroje. Naproti tomu jsou možnosti konfigurace poly čítače mnohem omezenější.

Pavel Tišnovský
2018