🚀 go-pugleaf

RetroBBS NetNews Server

Inspired by RockSolid Light RIP Retro Guy

Thread View: pl.comp.programming
2 messages
2 total messages Started by Krzysztof Jacewicz Wed, 15 Nov 1995 00:00
Re: Windows Sound System
#39
Author: Krzysztof Jacewicz
Date: Wed, 15 Nov 1995 00:00
37 lines
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
#40
Author: now... stud
Date: Wed, 15 Nov 1995 00:00
235 lines
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