Thread View: pl.comp.programming
2 messages
2 total messages
Started by Krzysztof Jacewicz
Wed, 15 Nov 1995 00:00
Re: Windows Sound System
Author: Krzysztof Jacewicz
Date: Wed, 15 Nov 1995 00:00
Date: Wed, 15 Nov 1995 00:00
37 lines
2040 bytes
2040 bytes
On Tue, 14 Nov 1995, Rafal Posmyk wrote:
> Krzysztof Jacewicz <air...@cs-boglab.elka.pg.gda.pl> wrote:
> > Pod Windows tak, a w DOS-ie ?
>
> Za Microsoft Windows Sound System "Users Guide":
>
> "...
> Here's the good news: You can run run your MS-DOS-based games
> and applications with the Microsoft Sound System (MSS) sound
> board. Windows Sound System software now includes a special driver
> that enables the Windows Sound System sound board to
> emulate a Sound Blaster sound board.
^^^^^^^ ^^^^^^^^^^^^^
Ale mi zalezy na programowaniu WSS a nie Sound Blastera - dlaczego ?
WSS na ukladzie AD1848: DAC/ADC do 48 kHz,16 bitow,stereo
SB Pro: DAC/ADC max.22Khz,8 bitow,stereo
lub 44kHz mono.
Jest drobna roznica.
Poza tym warto posluchac efektow dzialania programu
zawartego w pakiecie effect10.zip.
( a jeszcze lepiej samemu cos takiego napisac ;-)
> Nie wiem jaka jest stabilnosc tej emulacji (porownywalna z Win3.1 ?).
> U mnie chodzi software od MS Windows Sound System z Sound Blasterem
> Pro. Poza okolicznosciowami klopotami z mikrofonem nie bylo wiekszaych
> problemow (oczywiscie wykozystuje tylko drivery do Windows).
>
Na szczescie jestem w nieco lepszej sytuacji, moja karta jest zgodna
zarowno z WSS jak i SBPro.
Wiec w Windows'ie WSS z pelnia mozliwosci a pod DOS-em smutne dzwieki SB.
( a i tak to wszystko sie chowa przy Gravisie :-[ )
-------------------------------------------------------------------------------
Krzysztof Jacewicz
air...@smokie.elka.pg.gda.pl
-------------------------------------------------------------------------------
Re: Windows Sound System
Author: now... stud
Date: Wed, 15 Nov 1995 00:00
Date: Wed, 15 Nov 1995 00:00
235 lines
11634 bytes
11634 bytes
Zobowiazalem sie do opisania WSS wiec czas sie z niego wywiazac.
Na poczatek pare uwag. Wszystkie informacje podane nizej pochodza z
doswiadczen wlasnych, oraz analizy kodu zrodlowego driverow/programow
a nie z danych od oficjalnych producentow (data scheets itp). Co to
oznacza - kazdy sie domysla.. Poza tym jak juz wczesniej pisalem ja
tylko 'przymierzalem sie' do programowania WSS, co oznacza, ze jest to
niejako synteza materialow pochodzacych z wielu zrodel, ktora nie zostala
sprawdzona w praktyce (dlaczego? - jakos tak wyszlo..). Tu prosba do tych
ktorzy maja dojscia do porzadnych i wiarygodnych informacji na ten temat
- odezwijcie sie.
Czas teraz na techniczny opis karty. Oryginalne karty WSS nie sa produko-
wane przez Microsoft juz od dawna, standard jednak pozostal, glownie
dlatego, ze 'serce' karty - uklad AD1848 ma niezle mozliwosci i jest tani.
Obecnie wiekszosc tanich 16-bitowych kart jest na nim oparta. Karty takie
maja najczesciej nastepujaca budowe:
- 4 interface do CD-ROM,
- port joystick/MIDI,
- we: MIC, LINE-IN,
- wy: SPK, LINE-OUT,
- brak pokretla do regulacji glosnosci (regulacja programowa),
- gniazdo do podlaczenia WaveBlastera (lub podobnego),
- programowe ostawianie IO, DMA, IRQ (prawie zadnych zworek),
- zgodnosc hadrware'owa z Adlib, Soundblaster Pro, WSS,
Na karcie takiej sa trzy glowne chip-y:
- 'serce' czyli AD1848 (lub z nim zgodny np. CS4248, CS4231) ktory jest
wlasciwym ukladem generujacym dzwiek (to ten duzy, kwadratowy),
- syntezator FM OPL3 (np. YMF262) wiadomo do czego (taki maly uklad),
- chip posredniczacy pomiedzy AD1848 a magistrala komputera, zarzadza on
przerwaniami, kanalami DMA, portem MIDI itd, czyli odwala brudna robote.
najczesciej w tej roli wystepuja uklady MAD16 (tzn.82C928), MAD16Pro
(82C929) lub Mozart (numeru nie pamietam) (wielkoscia plasuja sie
pomiedzy FM i AD1848)
Teraz slow pare o emulacji SBP. Zajmuje sie tym chip MAD16Pro (lub
podobny) ktory tlumaczy polecenia dla SBP na zrozumiale dla WSS. W
oryginalnym WSS byl chyba do tego TSR ktory w dodatku emulowal tylko SB.
W obecnych kartach nie trzeba TSRow, jest za to program, ktory ustawia
port, przerwanie, dma, volume, typ interface'u CD-ROM oraz jeden z dwu
trybow pracy WSS albo SBP. Pod Windows karta dziala zawsze jako WSS,
niezaleznie od tego jak ja ustawimy pod DOSem. Kompatybilnosc z SBP nie
jest calkowita (np. filtry dolnoprzepustowe ktore wystepuja w oryg. SBP
nie sa relizowane - bo i po co) jednak gierkom i innym programom to nie
przeszkadza.
Zanim przejde do WSS - garsc informacji o MAD16Pro (i o MAD16, Mozart
ktore roznia sie tylko detalami). Uklad ten umozliwia software'owe
ustawianie IRQ, DMA, IO, kompatybilnosc z SBP oraz obsluguje MIDI.
To wlasnie rejestry tego ukladu sa ustawiane przez programik dostarczany
z karta. Rejestrow tych jest 6 lub 7 (zaleznie od typu ukladu) i znajduja
sie one pod adresami F8D-F93. Oto krotkie opisy tych rejestrow:
F8D bit 0 - joystick enable/disable
bity 1-3 - typ uzywanego zlacza CD-Rom
bity 4-5 - I/O pod ktorym bedzie widoczny WSS
bit 7 - tryb pracy WSS/SBP
F8E bity 0-1 - DMA interf. CD-ROM
bity 2-4 - IRQ interf. CD-ROM
bit 5 - wybor OPL3/OPL4 (OPL4=WaveBlaster)
bity 6-7 - I/O interf. CD-ROM
F8F bity 7-0 - ??? cos zwiazanego z SBP
F90 bity 7-0 - ??? ma zawsze wartosc A2
F91 bity 7-0 - ??? chyba typ ukladu (AD1848, CS4231 ..)
F92 bity 3-4 - IRQ MIDI MPU
bity 5-6 - I/O MIDI MPU
bit 7 - MIDI MPU enable/disable
F93 bity 0-4 - master volume (sam WSS nie ma mozliwosci sterowania
glosnoscia calosci lecz tylko poszczegolnych kanalow)
Zapis i odczyt tych rejestrow jest troszke skomplikowany. Standardowo
bowiem sa one ukryte. Dopiero zapis do portu F8F hasla (wartosc E3 lub
E2 zaleznie od ukladu) umozliwia zapis/odczyt rejestru. Haslo trzeba
wpisywac przed _kazdym_ dostepem do rejestrow MAD16Pro.
Tu wtrace prosbe; jesli ktos posiada karte z chipem MAD16PRO (tzn 82C929)
i dostal razem z ta karta jakis zgrabny programik do przelaczania trybow
WSS/SBP to prosze o maila. Ja ze swoja karta dostalem 500kb krowe ktora
testuje i ustawia karte, ktorej uzywanie jest b. uciazliwe z powodu
zawartych w niej bledow. Dodam jeszcze, ze proba napisania takiego
programiku wykorzystujac w.w. informacje nie calkiem sie powiodla :(.
A teraz sedno sprawy, czyli opis wlasciwego WSS (czyli AD1848).
Standardowo bazowym adresem I/O jest 530 (inne mozliwe ustawienia to
E80,F40,604 choc nie ma potrzeby ich uzywac - 530 z niczym z reguly sie
nie kloci). Rejestry WSS to (numery oczywiscie szestnastkowo):
530 config register
bity 0-1 numer jednego z 8-bitowych kanalow DMA
bity 3-5 IRQ (do wyboru 7,9,10,11)
533 version register
bity 0-7 ??? chyba jakas wersja czegos
534 address (index) register
bity 0-3 numer wewnetrznego rejestru ktory ma byc
zapisany/odczytany poprzez port 535
bit 5 transfer disable - ??? chwilowe wstrzymanie play/record
bit 6 mode change enable (MCE) - musi byc ustawiony przy
zapisie rej. wewnetrznego nr.8 (moze nie tylko 8..)
bit 7 busy - gdy ustawiony to trzeba czekac... az spadnie
535 data register
bity 0-7 tu odczytujemy/zapisujemy rejestr wewnetrzny o numerze
poprzednio wpisanym do 534
536 status register (prawdopodobnie read only)
bit 0 interrupt status - czy karta zglosila przerwanie
bit 1 play ready !
bit 2 play left ! chyba uzywane, gdy
bit 3 play upper ! stosujemy polled I/O
bit 4 sample overrun ! a nie DMA
bit 5 record ready ! do przesylania pojedynczych
bit 6 record left ! bajtow sampli
bit 7 record upper !
537 direct data (polled I/O)
bity 0-7 chyba do przesylania danych bez uzycia DMA
(podejrzewam, ze programik 'effect10' o ktorym
wspominalem poprzednio z tego wlasnie korzysta)
A teraz rejestry wewnetrzne do ktorych mamy dostep za posrednictwem
portow 534 i 535:
00 record device & gain left
bity 0-3 input gain left - wzmocnienie samplowanego sygnalu
bit 5 mic gain left - dodatkowe przedwzmocnienie dla mikrof.
bity 6-7 record device (line, cd, mic, post-mixed DAC)
01 record device & gain right
jak wyzej lecz dla kanalu prawego
02 CD volume left
bity 0-4 CD volume left
bit 8 CD mute left
03 CD volume right
jak wyzej lecz dla kanalu prawego
04 FM volume left
bity 0-4 FM volume left
bit 8 FM mute left
05 FM volume right
jak wyzej lecz dla kanalu prawego
06 Wave volume left
bity 0-5 Wave volume left
bit 8 Wave mute left
07 Wave volume right
jak wyzej lecz dla kanalu prawego
08 Clock & data format
bity 0-3 czestotliwosc odtwarzania dzwieku
bit 4 mono/stereo
bity 5-6 8bit, m-Law, 16bit, a-Law (moze tez ADPCM ?)
09 Interface config
bit 0 disable/enable play
bit 1 disable/enable record
bit 2 dual DMA/sigle DMA (full duplex!!)
bit 3 disable/enable autoinit (czyli odtwarzanie w kolko)
bit 6 play via DMA/PIO (tzn. polled I/O)
bit 7 record via DMA/PIO (tzn. polled I/O)
0A Pin control
bit 1 interrupt enable/disable (??? blokada generacji przerw.)
bit 6 external mute (???)
0B Test & init
bity 0-1 overrange left (???)
bity 2-3 overrange right (???)
bit 4 data request (??? zwiazane z PIO)
bit 5 calibration in progress (po skasowaniu bitu MCE w rej. 534
trzeba czekac az ten bit wyzeruje sie)
bit 6 play underrun (??? zwiazane z PIO)
bit 7 record underrun (??? zwiazane z PIO)
0C Misc info
bity 0-3 chip id (jakis numer wersji)
0D Digital mix (ktos cos wie ta ten temat?)
bit 0 mute (???)
bity 2-7 input mix (???)
0E Size high
bity 0-7 starszy bajt dlugosci bloku
0F Size low
bity 0-7 mlodszy bajt dlugosci bloku
Ufff... wreszcie koniec (ciekawe ile zrobilem literowek..).
Teraz pare slow komentarza. WSS moze odtwarzac/nagrywac w jednej
z kilkunastu czestotliwosci (brak plynnej regulacji). Kody tych
czestotliwosci podaje nizej (w Hz):
0 - 8000 1 - 5513 2 - 16000 3 - 11025
4 - 27429 5 - 18900 6 - 32000 7 - 22050
8 - brak 9 - 37800 A - brak B - 44100
C - 48000 D - 33075 E - 9600 F - 6615
Natomiast formaty danych (sampli) uzywane przez WSS to
- 8bit - bez znaku (unsigned)
- m-Law, A-Law - sposob kompresji (wlasciwie to przekodowania)
ktory na 8 bitach daje lepsza jakosc (ok.10-11 bitow)
- 16bit - ze znakiem, maly indianin (tzn. mlodszy bajt drugi)
- nie jestem pewien czy WSS ze standardowym AD1848 ma (de)kompresje
ADPCM 16bit<->4bit (czyli 4:1), na pewno ma ja CS4231 i nowsze
Dostep do wewnetrznych rejestrow przebiega nastepujaco:
- czekamy az uklad bedzie gotow przyjmowac nasze polecenia
( tzn. az bit 7 rej. indeksowego = 0 )
- do rejestru indeksowego (czyli 534) wpisujemy numer rejestru
wewnetrznego nie zmieniajac czterech najstarszych bitow
- czytamy lub piszemy do rejestru danych (czyli 535)
Inaczej ma sie sprawa z rejestrem wewn. 'clock & data format'.
Aby zmienic jego zawartosc:
- czekamy az uklad bedzie gotow przyjmowac nasze polecenia
( tzn. az bit 7 rej. indeksowego = 0 )
- ustawic bit MCE rej. indeksowego
- teraz mozna zapisac wart. do rejestru 'clock & data format'
uzywajac w.w. algorytmu
- skasowac bit MCE (rozpoczyna sie rekalibracja)
- czekamy az chip skonczy sie rekalibrowac tzn. bit 5 rejestru
wewnetrznego 'test & init' = 0
Przypuszczam, ze przykladowe odtworzenie bufora moze przebiegac
nastepujaco:
- podpinamy wlasna procedure pod odpowiednie przerwanie
- programujemy sterownik przerwan i DMA
- ustawiamy glosnosc w rej. wewn. 'Wave volume'
- ustawiamy dlugosc bufora w rej. wewn. 'Size xxx'
- ustawiamy czestotliwosc i format sampli w rej. wewn.
'Clock & data format' (wg. odpowiedniago algorytmu)
- ustawiamy rej. wewn. 'Interface config' (DMA play & disAutoinit &
& single DMA & enable play), ustawienie bitu enable play powoduje
rozpoczecie odtwarzania
- po zakonczeniu odtwarzania zostanie wygenerowane przerwanie,
procedura jego obslugi powinna potwierdzic przerwanie odczytaniem
rejestru statusu (tzn. 536)
To wlasciwie bylo by na tyle. Jeszcze raz ostrzegam: wiekszosc tych
informacji nie byla przeze mnie sprawdzona wiec nie recze za skutki.
W razie niejasnosci (moze miejscami pisalem zbyt lakonicznie) sprobuje
pomoc (lecz nie liczcie na zbyt wiele - sam bym chcial wiedziec wiecej).
Gdyby ktos dotarl do solidniejszych materialow na temat WSS lub znalazl
bledy (na pewno takie sa) prosze o korekty. Bardzo mile widziane sa
rowniez ciekawe programy na te karte.
--
Janusz Nowicki
now...@infoserv.ii.uj.edu.pl
Thread Navigation
This is a paginated view of messages in the thread with full content displayed inline.
Messages are displayed in chronological order, with the original post highlighted in green.
Use pagination controls to navigate through all messages in large threads.
Back to All Threads