Opět si vzpomenu na hru Brány Skeldalu a na dobu, kdy jsem do hry
dodělával ovladač GUSe. Bylo to v závěru vývoje, kdy si někteří
majitelé GUSe (spíš hudebníci) stěžovali, že jim nejde zvuk. Právě
protože GUS nebyl kompatibilní s (nepsaným) standardem SB.
Ovladač GUSe tedy vznikal jen aby vyhověl už existujícímu systému, tedy
již napsanému mixéru se všemi jeho možnostmi. Nakonec se zjednodušil tak,
že SW mixer zůstal a GUS se upravil tak, aby pouze simuloval DMA buffer.
I tak to nebylo jednoduché, protože GUS neměl žádnou možnost, jak
přehrávat streamované audio (výstup z mixážního modulu už byl vlastně
stream). Musel jsem to řešit tak, že v jednom okamžiku byly aktivní dva
kanály (a teď si nejsem jist, jestli náhodou nebyly čtyři, protože zvuk
byl stereo). Zatímco první se přehrával, do druhého se načítala data
DMAčkem. V okamžiku, kdy první kanál dohrál, ihned se při přerušení
přenul ten druhý a ten první se začal plnit DMAčkem. Teď už si
nepamatuji, jak se řešilo zpoždění v přerušení mezi dokončením
jednoho kanálu a spuštěním druhého, aby to necvakalo, musel bych se
podívat do zdrojáků. Ale fungovalo to pěkně.
Co mne zaujalo, byl programátorský model. Veškeré registry se musely
zapisovat dvakrát. V dokumentaci se psalo, že GUS jejich obsahy měnil stylem
„načti-změn-zapiš“, přitom, operace zápisu z CPU mohla přijít
kdykoliv mimo tento cyklus, nebo právě jednou mezi operacemi načti a zapiš
(dodatek: byl tam přesně definovaný čas čekání mezi oběmi zápisy,
myslím, že se čekalo na změnu nějakého stavového registru). Důvod byl
ten, že pokud se náhodou program trefil mezi obě operace, GUS nově zapsanou
hodnotu přepsal původní (upravenou podle svého programu) a změna se tedy
hned napoprvé vůbec neprojevila. Tím dvojím zápisem téhož došlo
ujištění, že data skutečně byla zapsaná.
Zajímavá škola zejména v dobách, kdy viceprocesorové systémy byly
doménou superpočítačových center. V dnešní době je to tak nějak
normální, a modifikace proměnných, do kterých zasahuje více procesoru se
řeší většinou nějakým exklusivním zámkem, případně protokolem
Acquire/Release na moderních procesorech.
PS: Ještě poznámka k SB PRO. SB Pro měl funkci „Output Filter“. Je
zajímavý, že byla pouze v této verzi. Nevím jak fungovala, ale díky tomu,
že v době vývoje BS jsem měl SB Pro, dostala se tato funkce i do
nastavení zvukového ovladače v BS. Bohužel, žádná další karta už
nikdy takovou funkci (ani podobnou) neměla.