MUSE - MUsic and Sound Enhancer
Foto: Ikon
MUSE - Schéma zapojenia
Zdroj: RomBor

MUSE - MUsic and Sound Enhancer

MUSE je zvukový interfejs založený na integrovanom obvode SAA1099P. Zároveň však poskytuje aj možnosť pripojenia bežného Atari Joysticku. Zvukový generátor SAA1099P poskytuje tieto možnosti:

  • 6 frekvenčných generátorov - 8 oktáv na každý generátor
  • 2 šumové generátory
  • oddelené riadenie hlasitosti pre ľavý a pravý kanál, pre každý generátor - 16 úrovní
  • 2 generátory hlasitostnej obálky
  • mixér šumu a tónov

Popis zapojenia

Základné zapojenie obvodu SAA1099P (IC1) je katalógové, ale v podstate bolo prevzaté zo zapojenia tohto obvodu v počítači SAM Coupé. Hodinový vstup SAA1099P je budený oscilátorom, ktorý je tvorený obvyklým zapojením pomocou troch hradiel 74LS04 (IC2), kryštálom 8 MHz (Q1) a R7, R8, C7 a C8.

Referencia pre analógové výstupy je vytvorená LC filtrom z napájacieho napätia (C14, L1, C15). Analógové výstupy ľavého a pravého kanála sú cez jednoduchý filter (R1 až R4, C1 až C6) vyvedené na 3,5 mm stereo jack (X3) a pinovú lištu (JP1).

Napájanie IC1 (VSAA) je riešené "vypínateľne" prostredníctvom T1 a dvoch hradiel IC2, ktorých vstup je pripojený na pin /CO1 paralelného portu (signál -PWR). Toto riešenie bolo zvolené preto, že SAA1009P nemá vstup Reset a dané zapojenie umožňuje po resete počítača odpojiť napájanie SAA1099P a tým ho "umlčať". Zároveň je na doske tlačidlo S1, ktorým je možné SAA1099P umlčať aj bez resetu počítača. Napájacie napätie je filtrované pomocou C11 a C13. Kondenzátor C13 má pomerne vysokú hodnotu z toho dôvodu, aby pri prepínaní portu/budiča na vstup<->výstup medzi SAA1099P a Joystickom vydržal "napájať" SAA1099P, kým sa port/budič opäť prepne zo vstupu na výstup. Viď ďalej.

Interface MUSE sa pripája k PP 01 prostredníctvom paralelného interfejsu na konektor K3 (FRB-F48) - X1. Toto neobvyklé riešenie so sebou nesie o čosi menej priamočiare ovládanie SAA1099P, ale nie je to nič neprekonateľné. Dátová zbernica SAA1099P je pripojená na port PA PIO 8255 - signály /DAT0/DAT7. Zostávajúce zbernicové signály sú pripojené na port PC PIO 8255. Zápisový signál -WR na /CO0, výberový signál -CS na /BC3 a adresový signál A0 na /BC2.

Konektor X2 (Cannon-M9) pre pripojenie bežného Atari Joysticku je pripojený cez oddeľovač/budič 742LS45 (IC3). Ten je aktivovaný signálom DIR (/CO4), ak je interný budč portu PA v PP 01 prepnutý na vstup. Okrem základných smerov F/U/D/L/R sú na bity 5 a 6 vyvedené aj signály X a Y pre prípadné ďalšie akčné tlačidlá. Kľudový stav vstupov IC3 je definovaný odporovou sieťou RN1.

Pinové lišty JP2, JP3 a JP4 umožňujú podľa potreby upraviť signály A0, -CS a -WR pull-up/down odpormi alebo kondenzátormi. Na niektorých PP 01 SAA1099P nereagovalo korektne na zmeny týchto signálov.

Na konektore X1 sú prepojené signály 2MHZ a CLK1, čo umožňuje využívať prerušenie od časovača 1.

Popis programového ovládania

Aby mohli byť posielané dáta do jednotlivých registrov SAA1099P, je potrebné, aby boli port PA PIO 8255 aj interný budič prepnuté na výstup. Zároveň je treba zapnúť napájanie pre SAA1099P. Po prvotnom zapnutí napájania je dobré počkať aspoň 20 ms, kým sa nabije filtračný kondenzátor C13.

; inicializácia PIO 8255 a portu PA na výstup mvi a,82h ; SK A: MOD 0, A-OUT, CH-OUT; SK B: MOD 0, B-IN, CL-OUT out 0C7h ; tým sa aj nastaví budič na porte PA pre výstup (CO4=0) mvi a,02h ; zapni napájanie SAA1099P (-PWR=0) out 0C6h lxi d,1000h ; malé zdržanie W1: dcr e jnz W1 dcr d jnz W1

Výstupy PIO 8255 na paralelnom interfejse sú prostredníctvom budičov invertované a tak je potrebné aj posielané dáta i signály invertovať. Pôvodne zbernicové signály A0, -CS a -WR sú pripojené na port PC a tak je nutné zápis do SAA1099P "simulovať". V nasledujúcej tabuľke je prehľad nastavovaných signálov:

Signál Pin na K3 Význam
-WR /CO0 0->1->0 = zápisový impulz
-PWR /CO1 1 = pripojenie napájania SAA1099P
A0 /BC2 0 = voľba registra SAA1099P, 1 = zápis dát do zvoleného registra
-CS /BC3 0->1->0 = výberový impulz
; Rutina pre zápis do SAA1099P cez 8255. ; I: A=zapisovaný údaj - číslo registra alebo dáta ; O: - ; M: AF, C, DE ; T: 95T/105T WrSaaData: mvi c,0Eh ; -CS=0, A0=0, -PWR=0, -WR=1 db 11h ; LXI D,nn - preskoč nasledujúcu inštrukciu WrSaaReg: mvi c,0Ah ; -CS=0, A0=1, -PWR=0, -WR=1 cma ; invertuj zapisovanú hodnotu out 0C4h ; zapíš dáta na port mov a,c out 0C6h ; -CS=0, A0=0 alebo 1, -PWR=0, -WR=1 inr a out 0C6h ; -WR=0 mvi a,02h out 0C6h ; -CS=1, A0=1, -PWR=0, -WR=1 ret

Jednoduchý príklad výberu registra SAA1099P a zápis dát do vybraného registra.

mvi a,8 ; výber registra 8 - frekvencia tónu 0 call WrSaaReg mvi a,0E3h ; zápis do registra 8 - tón A call WrSaaData

Prehrávanie muziky alebo zvukov sa obvykle robí v tzv. prerušení. To znamená, že sa v pravidelných intervaloch preruší vykonávanie hlavného programu a skočí sa do rutiny (hovorí sa jej často hradlo), ktorá "obslúži" SAA1099P a opäť sa vráti do hlavného programu. V PP 01 sa môže využiť prerušenie INT 1 vyvolávané od časovača 1 a preto sú na konektore X1 prepojené signály 2MHZ a CLK1, čím sa k časovaču 1 pripoja "systémové hodiny". Najobvyklejšie je, že sa prerušenie vyvoláva 50x za sekundu, teda každých 20 ms.

Ďalej je nutné inicializovať samotné prerušenie a pripraviť rutinu obsluhy prerušenia. Pri vyvolaní prerušenia INT 1 mikroprocesor predá riadenie na adresu 0008h. Tam si uložíme iba skokovú inštrukciu do skutočnej rutiny pre obsluhu prerušenia. Prerušenie INT 1 je nutné "odblokovať" a to nastavením 6. bitu na porte C Systémového PIO. Nakoniec je treba radiču prerušenia povedať, aby akceptoval prerušenie INT 1 a povoliť prerušenie "globálne".

... lxi h,Int1 ; adresa rutiny pre obsluhu prerušenia call InitInt ; samotná inicializácia prerušenia ei ; povolenie prerušenia ... ; Inicializácia prerušenia. ; I: HL=adresa rutiny pre obsluhu prerušenia ; O: - ; M: AF InitInt: di ; zakázanie prerušenia počas inicializácie ; inicializácia časovača 1 mvi a,76h ; CT1, Mode 3, BOTH, BIN out 0D3h mvi a,40h ; 2 MHz / 50 = 40000 = 9C40h out 0D1h mvi a,9Ch out 0D1h ; nastavenie rutiny pre obsluhu prerušenia od CT1 mvi a,0C3h ; na adrese 0008h bude iba skok do obslužnej rutiny sta 0008h ; - jmp ADR shld 0009h ; ulož adresu obsluhy prerušenia ; prerušenie od CT1 musí byť povolené/odblokované na systémovom PIO mvi a,90h ; vynulovanie FF prerušenia od CT1 out 0C2h mvi a,0D0h ; povolenie prerušenia od CT1 out 0C2h ; nastavenie radiča prerušenia, aby akceptoval prerušenie od CT1 mvi a,02h ; povolené budú INT 0 a INT 1, avšak INT 0 bude out 0D4h ; zablokované na systémovom PIO ret

Rutina pre obsluhu prerušenia nesmie zmeniť žiadne registre, aby po návrate mohol hlavný program pokračovať, akoby ani k prerušeniu nedošlo. Okrem samotného prehratia (časti) muziky je dôležité re-inicializovať prerušenie INT 1.

Int1: push psw ; odpamätanie všetkých registrov push b push d push h call Muzika ; zavolanie prehratia časti muziky ; re-inicializácia prerušenia od CT1 in 0C2h ani 9Fh ; vynulovanie FF prerušenia od CT1 out 0C2h ori 40h ; povolenie prerušenia od CT1 out 0C2h mvi a,02h ; ICU bude akceptovať prerušenie od CT1 out 0D4h pop h ; obnovenie všetkých registrov pop d pop b pop psw ei ; povolenie prerušenia ret ; a návrat z prerušenia

Detekcia pripojenia MUSE

Samotný obvod SAA1099P neumožňuje spätné čítanie hodnôt jeho registrov, takže touto cestou nie je možné zistiť, či je MUSE pripojený. Rovnako tak nie je možné zistiť prítomnosť MUSE čítaním stavu portu Joysticku.

Keďže ale MUSE privádza hodiny k časovaču 1, je možné využiť prerušenie od časovača 1 na detekciu, či je MUSE pripojený. Ak prerušenie nastane, MUSE je pripojený, ak nenastane, nie je.

; Rutina pre test pripojenia MUSE ; I: - ; O: [MuseFlag]=0/1 - ne/pripojený MUSE ; M: AF, HL MuseDetect: di ; zakázanie prerušenia pred inicializáciou testu xra a ; vynuluj príznak pripojeného MUSE sta MuseFlag ; nastavenie rutiny pre obsluhu prerušenia od CT1 lxi h,MuseDetectInt call InitInt ei ; povolenie prerušenia lxi h,1000h MuseDetectL: dcx h mov a,h ora l jnz MuseDetectL di ret ; Obsluha prerušenia pri detekcii MUSE. Ak prerušenie nastane, MUSE je pripojený a na adrese ; MuseFlag bude hodnota 1. MuseDetectInt: push psw mvi a,1 sta MuseFlag pop psw ret MuseFlag: db 0

Súčasné použitie SAA1099P a Joysticku

Na port PA je súčasne pripojený aj SAA1099P a aj Joystick (ten je zámerne pripojený cez osobitný budič, aby bol oddelený od "zbernice", keď je port PA naprogramovaný na výstup). Z toho je jasné, že nemôžu byť "aktívne" oba naraz. SAA1099P potrebuje, aby bol port PA naprogramovaný na výstup, Joystick potrebuje, aby bol port PA naprogramovaný na vstup. Na prvý pohľad sa to možno nezdá ako problém, avšak kameňom úrazu je tu práve "vypínateľné" napájanie SAA1099P.

V okamihu, keď sa pošle do 8255 riadiace slovo pre zmenu smeru portu PA na vstup, tak sa vynulujú aj výstupy na porte PC a to nám odpojí napájanie od SAA1099P (-PWR=1). Aby nám ale SAA1099P v tomto okamihu "zostal pri živote", je v napájacej vetve kondenzátor C13 s vysokou kapacitou, ktorý na niekoľko milisekúnd udrží na SAA1099P napájacie napätie. Samozrejme to znamená, že po prečítaní stavu Joystiku je treba čo najskôr opäť prepnúť port PA na výstup a obnoviť napájanie SAA1099P. Tento mechanizmus zabezpečí, že môže počas hry hrať muzika a môže sa testovať aj Joystick.

; Rutina pre prečítanie stavu Joysticku ; I: - ; O: B=stav Joysticku - 000RLDUF ; M: AF, B JoyTest: di ; zákaz prerušenia pri zmene smeru PIO ; a čítaní stavu Joysticku mvi a,92h ; PIO8255 - SK A: MOD 0, A-IN, CH-OUT out 0C7h ; SK B: MOD 0, B-IN, CL-OUT mvi a,12h ; nastav smer budiča na vstup (CO4=1) out 0C6h ; a zároveň zapni napájanie SAA1099P (-PWR=0) in 0C4h ; prečítaj stav Joysticku - 000RLDUF mvi b,a ; ulož stav do B ; opätovná inicializácia PIO 8255 a portu PA na výstup mvi a,82h ; SK A: MOD 0, A-OUT, CH-OUT; SK B: MOD 0, B-IN, CL-OUT out 0C7h ; tým sa aj nastaví budič na porte PA pre výstup (CO4=0) mvi a,02h ; zapni napájanie SAA1099P (-PWR=0) out 0C6h ei ; povol prerušenie ret

Podpora pre programovanie SAA1099P

Pre tvorbu zvukov a muziky je samozrejme možné vytvoriť si vlastné rutiny, ako to už urobili zrejme mnohí. Stačí si iba naštudovať katalógový list SAA1099P. Pred pár rokmi ale vznikol SAA1099Tracker, ktorý síce nie je úplne dokončený (kompilácia sa robí "externe" a nie sú hotové všetky verzie hradla (prehrávacej rutiny)), ale editor je plne funkčný.