Programování zvuků v assembleru

Radek Štěrba, RASTER

Počítače Atari jsou všeobecně známy svými dobrými hudebními možnostmi. 4 zvukové generátory, 16 úrovní hlasitosti a různé další vymoženosti je dělají vhodnými pro časté používání zvuků a skládání hudby. Pravda, nedá se to srovnávat s možnostmi větších (16-bitových) počítačů, ale mnohdy nerozhoduje kvalita zvuku, ale nápad.

V BASICu je implementován příkaz SOUND, který má následující parametry:

SOUND A,B,C,D
A..číslo generátoru (0 až 3)
B..frekvence (0 až 255)
C..zkreslení výstupního signálu (0 až 14, sudá čísla)
D..hlasitost (0 až 15)

Tento příkaz je sice snadno použitelný, ale nevyužívá všechny možnosti hardwaru. Podívejme se tedy hlouběji na ovládání zvukového výstupu.

Pro generování akustického signálu je uvnitř Atari obvod POKEY (má na starost i jiné věci, ale těmi se teď nechci zabývat). Zvuk se ovládá pomocí 9 registrů, umístěných na adresách $D200 až $D208 (decimálně 53760 až 53768).

Seznam registrů:

$D200 53760 - AUDF1
$D201 53761 - AUDC1

$D202 53762 - AUDF2
$D203 53763 - AUDC2

$D204 53764 - AUDF3
$D205 53765 - AUDC3

$D206 53766 - AUDF4
$D207 53767 - AUDC4

$D208 53768 - AUDCTL

Pomocí těchto registrů můžete vyrobit stejné zvuky jako příkazem SOUND:

SOUND a,b,c,d

Nejprve inicializace (stačí provést jen jednou před započetím používání zvuků):

POKE 53775,3: POKE 53768,0

A vlastní příkazy:

POKE 53760+2*a,b: POKE 53761+2*a,c*16+d

Jak je tedy vidět, frekvence se zapíše do příslušného registru AUDFa (kde "a" je číslo zvukového generátoru) a zkreslení spolu s hlasitostí do registru AUDCa (zkreslení*16+hlasitost).

Pokud budete pracovat v assembleru, není nic jednoduššího, než místo POKE použít ukládací instrukce STA.. (STX.., STY..).

Př. Zvuk SOUND 1,100,10,15 vyloudíte v assembleru takto:

  
  LDA #3  ;inicializace
  STA 53775
  LDA #0
  STA 53768
  LDA #100  ;frekvence=100 
  STA 53762  ;registr AUDF2 (zvukové generátory jsou číslovány od 0, ale registry od 1) 
  LDA #175  ;10*16+15=175
  STA 53763  ;registr AUDC2
  ...
  RTS

Přímé používání registrů AUD.. umožňuje ale též vyluzovat zvuky, jaké SOUNDem nevytvoříte. Registr AUDCTL je řídícím registrem pro všechny zvukové kanály. Různým nastavením bitů lze velmi ovlivnit zvukový výstup.

AUDCTL:

BIT  POPIS
7   Nastavení 9-ti bitového čítače místo 17-bitového
6   Vstupní frekvence kanálu 1 bude 1.79MHz
5   Vstupní frekvence kanálu 3 bude 1.79MHz
4   Spojuje kanály 1 a 2 v jeden 16-ti bitový čítač
3   Spojuje kanály 3 a 4 v jeden 16-ti bitový čítač
2   Horní propust kanálu 1 taktovaná kanálem 3
1   Horní propust kanálu 2 taktovaná kanálem 4
0   Přepnutí hlavní taktovací frekvence ze 64KHz na 15KHz

Pozn. Standardní nastavení AUDCTL je na 0 (na tuto hodnotu se nastaví při každém (!!!) použití příkazu SOUND; Pokud se tedy rozhodnete tento hlavní řídící reg. nastavit na jinou hodnotu, musíte pak pro spouštění zvuků používat přímo registry AUD.. a ne příkaz SOUND).

Důležité:
Protože všechny registry AUD.. jsou hardwarové, nelze jejich nastavení zpětně číst (respektive jejich přečtením získáme úplně jinou informaci než tu, která tam byla zapsána). Proto je nutné někam si uchovávat příslušné hodnoty, pokud je chceme později nějak používat.
Př. Nelze použít: POKE 53760, PEEK(53760)-1 !!!