Emulace Sound Blasteru v DOSu - heuréka!

      21.7.2018 O nefunkční emulaci Sound Blasteru v DOSových ovladačích od Creative pro zvukovky SB Live! a Audigy jsem se zmiňoval již dříve. Problém je v tom, že ovladače pro odchytávání legacy I/O přístupů potřebují funkční routování PCI signálu SERR# na NMI procesoru, které se z nových základních desek někam vytratilo, protože si asi návrháři MB mysleli, že už to nebude nikdo k ničemu potřebovat. Buď chybí přímo fyzicky spoj na MB nebo není routování nakonfigurované v chipsetu. Pro druhý případ jsem napsal utilitu SERREN, která někdy aspoň zprovozní FM syntézu (cvrdlikání přes Adlib). V případě mé základní desky Gigabyte GA-P67-DS3-B3 mi to ale stejně nepomohlo, zvukovka je úplně němá, ani ji žádný program nedetekuje. Zkoušel jsem ještě SERREN upravit tak, aby zapnul SERR# routování i na onboard PCIe to PCI můstku ITE, avšak nebylo to nic platné. Stejně by to ale neřešilo nefunkční samplovaný zvuk, který vyžaduje funkční DMA, jehož emulace na nových deskách také nefunguje (ani nevím, jakým způsobem je to řešeno). Patrně poslední chipsety, kde ještě v těchto ovladačích emulace SB fungovala, byla řada intel 8xx, na novějších chipsetech s PCIe už prostě smůla...
      Již jsem nevěřil, že by se našlo nějaké funkční řešení SB emulace v DOSu na nových MB, ale kupodivu někdo na fóru VOGONS před 2 lety objevil funkční zvukové karty od Yamahy s chipy YMF72x a 74x na PCIe chipsetu intel 965 a později také Aureal Vortex (2) - chipy AU88xx. Dále byla ověřena funkčnost i na novějším PCIe chipsetu intel x58 pro Core 1. generace (Nehalem) a úspěšně otestována více než stovka DOSových her. Tento chipset má na rozdíl od P67 ještě nativní PCI sběrnici, takže jsem byl zvědavý, jestli to bude fungovat i u mě přes PCIe to PCI můstek. S Ruthanem jsme si již předtím vyměňovali nějaké informace ohledně zvuku pod DOSem a tak nebyl problém se zapůjčením karty na testování, kterou jsem si v pátek v noci přivezl domů.
      V sobotu jsem kartu s čipem YMF744B s napětím strčil do PCI slotu mé základní desky a nainstaloval ovladače. Pro úspěšné zprovoznění v DOSu je potřeba splnit pár podmínek. Inicializační program setupds.exe používá extender DOS/4GW, který má problém s 4 GB RAM. Zkoušel jsem jak původní dos4gw.exe verze 1.97, který vyhodil paradoxní chybu: "DOS/4GW fatal error (1307): not enough memory", tak novější dos4g.exe verze 2.61, který též zkolaboval s chybou: "DOS/4G fatal error (1010): can't initialize loader LINEXE_LOADER [1]". Bylo tedy třeba omezit velikost XMS paměti na 2,5 GB či méně. Záhy jsem zjistil, že další potřebný program dsdma.exe (rezidentní emulátor DMA pro novější chipsety) při zavedení ihned restartuje PC, pokud je XMS více než cca 704 MB, takže jsem nakonec velikost XMS omezil na 512 MB. Toho lze docílit např. použitím správce paměti himemx.exe s parametrem /MAX=512M, celý řádek do config.sys:
DEVICE=C:\DOS\HIMEMX.EXE /MAX=512M /METHOD:FAST /VERBOSE
      Další háček je v tom, že rezident dsdma.exe vyžaduje správce paměti s podporou VCPI, který přepne CPU do virtuálního režimu v86, jinak vyhodí chybu: "Program could not load. This program requires an expanded memory manager such as EMM386.EXE with VCPI support". Je možné použít EMM386 (i v kombinaci s UMBPCI) s podporou EMS:
DEVICE=C:\DOS\UMBPCI.SYS
DEVICEHIGH=C:\DOS\EMM386.EXE FRAME=NONE RAM D=64 HIGHSCAN AUTO VERBOSE
nebo bez podpory EMS:
DEVICE=C:\DOS\UMBPCI.SYS
DEVICEHIGH=C:\DOS\EMM386.EXE NOEMS D=64 HIGHSCAN AUTO VERBOSE
A nebo Quarterdeck QEMM386, který sám neumí více jak 256 MB XMS, takže ho ani není třeba omezovat (parametry jsou specifické pro moji HW konfiguraci a nejsou tedy přenositelné):
DEVICE=C:\QEMM\QEMM386.SYS RAM ROM XBDA:N ARAM=B000-B7FF X=F000-FFFF X=C000-CFFF RF ST:M
Také jsem experimentoval moderním správcem paměti JEMMEX, ale při spuštění nějaké pmode hry jsem vždy dostal chybu: "DOS/16M error: [17] system software does not follow VCPI or DPMI specifications Spawn Error: Error 0" Později jsem přišel na to, že je třeba vypnout podporu rozšíření VME parametrem NOVME:
DEVICE=C:\DOS\JEMMEX.EXE A20METHOD:FAST XMSHANDLES=96 MAXEXT=512M MIN=32M MAX=64M NOVME VERBOSE
Bohužel některé hry či dema nejsou kompatabilní (nebo používají nesnášenlivé extendery) s režimem v86 a pak takový pokus o spuštění programu končí zátuhem nebo restartem PC.
      V souboru autoexec.bat jsem pak měl tyto řádky pro zavedení ovladače:
SET BLASTER=A220 I5 D1 T4
C:\DS-XG\setupds.exe /S
C:\DS-XG\dsdma.exe
Extender dos4gw.exe mám umístěný v systémové cestě PATH. Po spuštění setupds.exe bez parametru je možné ověřit funkčnost zvukové karty. Měl jsem tam aktivní akorát položky pro nativní zvuk a FM syntézu (oboje přehrálo čistě ukázkový zvuk), položka SB emulace byla zašedlá. Vyzkoušel jsem verze 3.14, 3.15 a 3.16 a všechny se chovaly stejně. Nastavení je uloženo v souboru ds.ini, ale když jsem tam manuálně zeditoval např. hodnotu parametru SBIRQ, tak ovladač změnu nereflektoval.
      Ve zbylém čase následovalo testování v několika hrách a demech, které mám trvale na disku. Výsledky jsou docela dobré, akorát jsem narazil na problém u her, které implicitně používají Sound Blaster Pro (např. Doom), kde se v samplovaném zvuku objevovalo jakési praskání. U her, kde šlo v nastavení změnit typ DSP na Sound Blaster 16 nebo Sound Blaster 2.x byl zvuk v pohodě. Také celkem nepřekvapivě nefungovala wavetable syntéza, protože karta nemá žádnou vlastní soundfont ROM či RAM, pouze fungovala FM syntéza Adlib či Sound Blaster. To se dá ale řešit přes externí DreamBlaster. Už se mi podařilo sehnat 2 čipy SAM2695 z Belgie a postavím si vlastní DreamBlaster přímo do gameportu. Při testování jsem zkusil natočit narychlo video: část 1., část 2. (zvuk je snímaný mikrofonem ve foťáku, takže za kvalitu se omlouvám). Zde jsou shrnuty výsledky testovaných her a demíček:

program/karta YMF744B SFX
MS-DOS 6.22
YMF724F SFX
MS-DOS 6.22
AU8820B2 SFX
MS-DOS 6.22
AU8820B2 SFX
Win98 SE
music (FMS)
MS-DOS 6.22
Dyna Blaster OK OK OK nelze spustit OK
Commander Keen - OK OK OK OK
Wolfenstein 3D OK OK OK OK OK
Doom 1 praskání ve zvuku OK OK OK OK
Doom 2 praskání ve zvuku OK OK OK OK
Quake praskání ve zvuku OK OK OK n/a
Blood OK (SB16), praskání s SB Pro OK OK OK OK
Duke Nukem 3D OK (SB16), praskání s SB Pro OK OK OK OK
SandWarriors OK (SB 2.x), praskání s SB Pro OK OK OK OK
Second Reality OK (SB mono), praskání s SB Pro OK zatuhne nelze spustit n/a
Dream OK (SB16), praskání s SB Pro OK zatuhne OK n/a
Boost zatuhne zatuhne OK* OK n/a
* někdy se zvuk v průběhu přehrávání zasekne

      Tyto výsledky jsou pro mě rozhodně zajímavé a pokusím se nějakou takovou zvukovku získat. Bohužel ty nejlevnější se nabízí zrovna v Americe, kde poštovné přesahuje cenu samotné karty (a ještě k tomu clo). Na českých bazarech jsem neobjevil vůbec nic. Další zajímavá informace přišla od uživatele agent_x007 z VOGONS, který úspěšně otestoval demo Boost na zvukové kartě Aureal Vortex 2 a chipsetu intel x58. Tyto karty totiž používají ovladač, který řeší emulaci DMA nějakým jiným způsobem, jenž nevynucuje "problémový" režim v86. Tyto karty se také obecně prodávají za vyšší ceny než Yamahy. Z hlediska funkcionality pod DOSem by mělo být jedno, jestli je to starší Aureal Vortex (AU8810/AU8820) nebo novější Aureal Vortex 2 (AU8830).
      Ruthan také vyzkoušel svou Yamahu v novější základní desce Gigabyte s chipsetem intel Z97 bez nativních PCI slotů a fungovala mu jen FM syntéza. Taktéž byl problém, pokud se zvukovka připojila do PCIe slotu MB s chipsetem intel x58 přes externí PCIe to PCI můstek Pericom. Ve výpisu PCI konfiguračních registrů jsem si všiml, že externí můstek neměl zapnuté subtraktivní dekódování (v mém případě ho onboard můstek ITE zapnuté má), takže se domnívám, že pokud by se zapnulo, mohlo by to třeba fungovat. UPDATE: Ruthan už sehnal i Aureal Vortex a začal testovat. Další relevantní vlákna na VOGONS: Sound Blaster Emulator for Dos?, Is there PCI-E soundcard with working DOS SB driver?, PCI sound cards and Chipsets from various manufacturers... Which PCI Sound Card for DOS (SB, FM and General MIDI)?

      7.8.2018 Dnes mi dorazil balíček z Polska se zvukovou kartou Yamaha YMF724F, kterou jsem našel na Allegru. Nyní se tam zrovna nabízí Yamaha YMF744 XP za 15 Zlotých. Kartu jsem nadšeně strčil do druhého PCI slotu vedle SB Audigy místo TV tuneru. K žádné kolizi prostředků nedošlo, nechám si tedy v PC obě zvukovky. Audigy budu nadále používat ve Windows, Linuxu a pár DOSových programech s nativní podporou a Yamahu pro SB emulaci v DOSu. Ve Windows jsem jí zatím ve správci zařízení zakázal. Oba výstupy mám připojené k zesilovači přes přepínač. V DOSu jsem použil stejné ovladače a nastavení jako při předchozím testu YMF744B. Příjemně mě překvapilo, že u YMF724F se neobjevuje ve zvuku žádné praskání při nastavení SB Pro ve hrách. Zkoušel sem kartu v obou PCI slotech i bez SB Audigy a prostě nepraská, hraje čistě. Ze zvědavosti jsem kartu vyzkoušel ještě ve 3 dalších základních deskách. Zatím co v Gigabyte GA-H55M-S2 s nativními PCI sloty fungovala YMF724F správně, tak na platformě AMD Asus M4A79XTD EVO a Gigabyte GA-MA790GP-DS4H sice setupds.exe správně kartu rozpoznal a TSR dsdma.exe se bez chyby zavedl, ale zvukovka pak nevydala ani hlásku. Ani testovací zvuky v setupds.exe nešly přehrát (menu v programu bylo neaktivní).

Yamaha YMF724F-V PCI

      3.9.2018 Dostal jsem jednu Yamahu YMF744B s upadlým blokovacím kondenzátorem na napájení PVDD. Karta fungovala i bez něj, ale pro pořádek jsem tam připájel 1 µF keramiku 0603. Znovu jsem kartu přezkoušel a potvrdilo se, že YMF744B v Doomu 1 a 2 praská a také všude tam, kde se vybere typ karty SB Pro. Po výměně zvukovky zpět za mou YMF724F praskání zmizelo. Nevím, čím to je, ale na jiných (starších) základních deskách to nepraská.

Yamaha YMF744B-R PCI

      5.9.2018 Dnes mi dorazil balíček z Ruska se zvukovou kartou Diamond Aureal Vortex AU8820B2, kterou jsem koupil přes eBay. Ovladače jsou ke stažení zde. Pro DOS stačí zavést TSR asp4dos.com, který funguje i v reálném módu a nepotřebuje žádnou podporu EMS/XMS, ale nevylučuje se s nimi. Pokud není k dispozici UMB, tak TSR sežere 37 kB dolní paměti, což může být v některých případech problém. TSR načítá nastavení z textového souboru vortex.ini z adresáře Windows (dle systémové proměnné WINBOOTDIR), ale k dispozici je i patchnutá verze pro samotný DOS, jenž se řídí systémovou proměnnou VORTEXINI, kterou si lze libovolně nastavit. Nastavení v INI souboru lze upravit buď ručně (důležité jsou zejména proměnné PCIIRQ - skutečné IRQ PCI karty, SBFMIRQ - emulované IRQ SB, SBFMDMA, SBFMDMA2, SBFMBase, FMBase a MPU401Base) nebo pokud máte nainstalované i Windows 9x, tak nainstalovat windowsí ovladač a nechat nastavení na něm. Pod Windows navíc funguje wavetable syntéza (využívá 5MB banku samplů aurealgm).

nastavení SB Pro emulace ve Windows 98 SE

nastavení wavetable syntézy ve Windows 98 SE

      Otestoval jsem znovu hry a dema uvedená v tabulce výše. Všechny hry fungovaly, ale nepodařilo se mi rozběhnout demíčka Dream a Second Reality. Vyzkoušel jsem několik konfigurací správců paměti (JEMMEX, QEMM386, HIMEM + UMBPCI + EMM386 EMS/NOEMS, HIMEM + UMBPCI, HIMEM a bez) s minimem dalších driverů a TSR, ale vždy došlo k zatuhnutí při startu dema. Akorát demo Boost fungovalo se zvukem, ale občas se stalo, že se třeba po 30 s od spuštění zvuk zaseknul (neustále se opakoval dokola poslední obsah DMA bufferu) a obraz běžel dál. Paradoxně pod Windows 98 SE fungovala emulace SB lépe, povedlo se mi tam rozběhnout i demo Dream. Second Reality mi nešlo spustit zřejmě z důvodu nekompatability s Windows. Další poznatek je ten, že Aureal Vortex má opravdu hnusný zvuk FM syntézy, horší sem ještě neslyšel. Yamaha nebo ESS zní o dost lépe. U her podporujících General MIDI to naštěstí řeší DreamBlaster.

Diamond Aureal Vortex AU8820B2 PCI

DreamBlaster - wavetable syntéza do game portu

      28.8.2018 Problém ošklivé FM syntézy a chybějící wavetable syntézy se dá řešit pomocí externího MIDI syntezátoru jako např. Roland Sound Canvas, který se dá připojit přes rozhraní MPU-401 MIDI skoro ke každé zvukovce s game portem. Na 15-pinovém game portu je pin 12 využit jako výstup UARTu MIDI out a pin 15 jako vstup MIDI in. Na pinech 1, 8 a 9 je navíc k dispozici napájecí napětí 5 V. Rychlost je 31250 baudů a posílají se tam MIDI příkazy jako zapni notu x, vypni notu y atd. Napěťová úroveň na výstupu není přesně definovaná (důležitá je proudová budicí schopnost), záleží jakým napětím je napájen zvukový čip na kartě z kterého výstup jde. V případě YMF724 je to 3,3 V.

MIDI UART data out oscilogram

      Jelikož takový synťák od Rolandu je velká a drahá krabice, tak francouzská firma Dream vyvinula vlastní jednočipové řešení v podobě integrovaného obvodu SAM2695 (a dalších). Tento obvod obsahuje 0,5 MB banku samplů, efektový DSP (umožňující 64-hlasnou polyfonii, reverb, chorus, prostorový efekt a 4-pásmový ekvalizér), stereo DAC a pomocný analogový mikrofonní vstup. Čip je v poměrně mrňavém pouzdře QFN48 (6 x 6 mm; 0,4 mm pitch), napájený z 3,3 V (MIDI vstup je 5V-tolerantní) a s typickým odběrem 18 mA. Je použitý např. v daughterboardu WaveBlaster za 35 euro, který lze osadit na pin header karet Sound Blaster. Obě mé zvukové karty Yamaha 724 a 744 však takový header nemají a na Aureal Vortexu se s ním sice počítalo, ale zůstal neosazený (spolu s dalšími součástkami). Navíc se mi cena zdá poněkud vysoká, takže jsem se rozhodl navrhnout si vlastní univerzální DreamBlaster do game portu, který se vejde do krytky konektoru Cannon. Jeho výstup se jednoduše propojí jack-jack kablíkem do line-in vstupu zvukovky a v mixéru se nastaví vhodná hlasitost. U her se v setupu vybere místo Adlib či FM syntézy General MIDI nebo MPU-401 a jede se. Pokud by někdo chtěl zároveň používat gameport i pro joystick, dá se snadno vyrobit rozdvojka, kde se na druhý konektor pro DreamBlaster vytáhnou 3 dráty (5 V, GND a MIDI out).
      Sehnat čipy SAM2695 nebylo úplně jednoduché (v běžných obchodech se součástkama je vůbec nevedou a na eBay jsou předražené). Nakonec jsem ale sehnal pár kousků od jednoho maníka z Belgie, kterému jsem na oplátku poslal jeden osazený DreamBlaster. Schéma zapojení je celkem minimalistické, vycházející z datasheetu. Napájení je řešeno mým oblíbeným 3,3V LDO TLV70033 z 5V výstupu game portu. Pro analogovou část je napájení ještě lehce filtrováno RC článkem R1 - C9. Výstupní napětí vnitřního 1,2V regulátoru lze zkontrolovat na pinu 34, resp. C16 a C17. Po zapnutí je aktivní sériové rozhraní MIDI IN na pinu 16 a paralelní rozhraní je neaktivní.

schéma DreamBlasteru

      Vytvořil jsem layout 2-vrstvého plošného spoje, který jsem poslal do výroby čínskému AllPCB, neboť jsem se dozvěděl, že tam teď mají dopravu DHLkem zdarma při ceně 10 $ za 5 ks destiček do velikosti 5 x 5 cm. Abych využil možnou plochu, přifařil jsem k zakázce ještě druhý plošňák na spínaný snižující měnič s LM43603, takže výsledná velikost byla 75 x 33 mm, což pořád spadalo do 10$ kategorie. Za 3 dny už byla zakázka vyrobená a odeslaná. Za další 2 dny dorazila do ČR, ale jelikož jsem byl zrovna mimo, vyzvednul jsem ji později. Po rozbalení (dorazilo 6 ks PCB) můžu říct, že kvalita je na velmi slušné úrovni, pouhým okem jsem nepoznal rozdíl např. od Pragoboardu. Za ty prachy s takhle rychlou dopravou je to fakt paráda, to už asi nebudu doma nic osvětlovat přes fólii a leptat (vyjma jednoduchých PCB, které instantně načmárám lihovkou :).

DreamBlaster PCB layout panelizace 2 PCB pro zakázku v AllPCB vyrobené destičky z AllPCB vyrobené destičky z AllPCB osazený DreamBlaster - top osazený DreamBlaster - bottom
PCB layout GERBER panelizace vyrobené PCB vyrobené PCB osazený PCB osazený PCB

      Destičky jsem rozřezal, zapiloval okraje a hned jednu na zkoušku osadil. Obvod SAM2695 jsem připájel regulovanou horkovzdušnou pistolí, zbytek klasicky mikropájkou. Nenarazil jsem na žádné podstatné chyby a DreamBlaster fungoval na první zapnutí. Rozdíl proti FM syntéze je opravdu znát, viz ukázková videa: test s Doomem, test s Duke Nukem 3D.



Zpět

Aktualizováno 27.11.2018 v 00:26

„Nedostane-li žena koho chce, běda tomu, koho dostane.“ Mark Twain