LA PROGRAMMATION DE LA SOUNDBLASTER

              ***********************************************
              * ecrit par PC-CODER pour PROGRAZINE le 09/97 *
              * E-mail :  pccoder@club-internet.fr          *
              ***********************************************
               Si vous avez des informations suplementaire
               ou si vous constater une erreur ecriver moi 
               ---------------------------------------------

La soundblaster (SB16) est composé entre autre d'une puce DSP (C'est
le coeur de la carte ,c'est elle qui s'occupe de gerer les sons )
et d'une puce MIXER (qui permet de gerer les volume)

L'adresse de base des ports du DSP se trouve au port 
2x0H avec (avec x variant de 1 à 8)
La plupart du temps c'est l'adresse 220H .

adresse de base
     2x0H       +    DESCRIPTION            +  R/W
----------------+---------------------------+-------
     + 04       | REGITRE D'INDEX DU MIXER  |  -/W
     + 05       |  DONNEES DU MIXER         |  R/W
----------------+---------------------------+-------
     + 06       |    RESET DSP              |  -/W
     + 0A       |    DONNEES DSP            |  R/-
     + 0C       | DONNEES / COMMANDE DSP    |  -/W
     + 0C       | ETAT DU BUFFER ECRITURE   |  R/-
     + 0E       | ETAT DU BUFFER LECTURE    |  R/-
----------------+---------------------------+-------
     + 0D       | DSP interrupt clear port  |  R/-  ???
     + 0E       | DSP 8 bit interrupt       |  R/-
     + 0F       | DSP 16 bit interrupt      |  R/-
----------------+---------------------------+-------
     + 10h      | CD-ROM DATA               |  R/-
     + 11h      | CD-ROM STATUT             |  R/-
  + 11h ou 10h ?| CD-ROM COMMAND            |  -/W
     + 12h      | CD-ROM RESET              |  -/W
     + 13h      | CD-ROM ENABLE             |  -/W
----------------+---------------------------+-------
JE RECHERCHE DES INFOS SUR LA PROGRAMMATION DU CD-ROM PAR
L'INTERMEDIAIRE DE LA CARTE SON ET NON PAS AVEC MSCDEX AINSI
QUE TOUTE LES COMMANDES .JE RECHERCHE AUSSI DES INFO SUR COMMENT
PROGRAMMER LA CARTE SON SANS UTILISER LE DMA (es-ce possible ?)
ET SUR LE BUS ISA ET PCI.
SI VOUS AVEZ DES INFO ECRIVER MOI :

                                  pccoder@club-internet.fr

--------------------------------------------------------------------
Je ne parlerais ici que de la version 4.xx + sans la synthese
FM ni la programmation MIDI .
Si vous etes interesser par les versions anterieur
(ou les autres commandes)ecriver moi et je vous enverrais
la DOC que j'ai (en anglais).

VOICI LES PRINCIPALES COMMANDES DU DSP :

  DSP  | 
COMMAND+               DESCRIPTION           
-------+----------------------------------------------------
  E1H  |  Indique la version du DSP
  D8H  |  Teste l'etat du haut-parleur
  D1H  |  Activation du haut-parleur
  D3H  |  Deactivation du haut-parleur
  41H  |  Indique la frequence d'echantillonage pour la sortie
  42H  |  Indique le frequence d'echantillonage pour l'entree
  E0H  |  DSP identification ??
  E3H  |  DSP copyright ?
  E4H  |  Write test register ??
  E8H  |  Read test register  ??
  F0H  |  Sine generator  ??
  F2H  |  8  bits ,IRQ REQUEST ??
  F3H  |  16 bits ,IRQ REQUEST ??
  FBH  |  ETAT DU DSP ?
  FCH  |  ETAT (auxiliere) DU DSP ?
  FDH  |  DSP COMMAND STATUT ?
-------+--------------------------------------------------------
  CxH  |  Entrée/sortie d'echantillon 8 bits
  D0H  |  Suspension du transfert d'echantillon 8 bits
  D4H  |  Reprise du trasnfert d'echantillon 8 bits
  DAH  |  Fin du trasnfert DMA 8 bits en mode auto init
  45H  |  Continu DMA auto init 8 bits
-------+--------------------------------------------------------
  BxH  |  Entrée/sortie d'echantillon 16 bits
  D5H  |  Suspension du transfert d'echantillon 16 bits
  D6H  |  Reprise du transfert d'echantillon 16 bits
  D9H  |  Fin du transfert DMA 16 bits en mode auto init
  47H  |  Continu DMA auto init 16 bits
-------+---------------------------------------------------------
Remarque : La sortie correspond à la lecture d'un son.
           L'entrée correspond à l'enregistrement d'un son.

DESCRIPTION DES COMMANDE :

La commande E1h :
Cette commande permet de savoir quel est la version du DSP.

Il faut envoyer cette commande au DSP et puis ,il faut lire
 2 fois le DSP :
Le premier octet indique le numero pricipale de la version.
Le deuxieme octet indique le numero secondaire de la version.

La commande D8h :
Teste le lien entre le DSP et le haut-parleur.

Il faut envoyer cette commande au DSP.
Il faut ensuite lire le DSP :
Si 0 ,le lien est rompu
Si FFh ,le lien est etablie
(C'est peut-être l'inverse ?)

La commande D1h :
Cette commande permet de connecter le DSP du haut-parleur.

La commande D3h :
Cette commande permet de deconnecter le DSP du haut-parleur.

La commande 41h :
Cette commande permet de selectionner la frequence
d'echantillonage pour la sortie (lecture).

Il faut envoyer cette commande au DSP
Il faut envoyer l'octet de poid fort puis l'octet de poid faible
de la frequence d'echantillonage.

La commande 42h :
Cette commande permet de selectionner la frequence
d'echantillonage pour l'entrée (erregistrement).

Il faut envoyer cette commande au DSP
Il faut envoyer l'octet de poid fort puis l'octet de poid faible
de la frequence d'echantillonage.

La commande E3h :
Cette commande permet de connaitre le nom de la carte(ou du fabricant).

Il faut envoyer cette commande au DSP , puis il faut lire
le DSP jusqu'a ce qu'on lit '0' zero .

La commande F2h :
Cette commande permet de generer une interruption 8 bits. ??

La commande F3h :
Cette commande permet de generer une interruption 16 bits. ??

La commande FBh :
Cette commande permet de connaitre l'etat du DSP pendant une operation.

Bit 0 = 1 : DMA DAC (Convertion numerique/analogique) 8 bits ACTIVE
Bit 1 = 1 : DMA ADC (Convertion analogique/numerique) 8 bits ACTIVE
Bit 2 = 1 : DMA DAC 16 bits ACTIVE
Bit 3 = 1 : DMA ADC 16 bits ACTIVE
Bit 4 = 1 : VIRTUAL SPEAKER ACTIVE
Bit 5 = x  ???
Bit 6 = x  DSPC 4Fh  ???
Bit 7 : TIME CONSTANT (1=MODIFIER) ?

La commande FCh :
Cette commande permet de connaitre l'etat du DMA pendant une operation.

Bit 0 : ???
Bit 1 = 1 : DAC/ADC DMA synchroniser
Bit 2 = 1 : Auto init DMA 8 bits ACTIVE
Bit 3 : ???
Bit 4 = 1 : Auto init DMA 16 bits ACTIVE
Bit 5 : ???
Bit 6 : ???
Bit 7 : ???

La commande FDh :
Cette commande permet de savoir quel est la dernier command
envoyer au DSP . ? (ne marche pas sur tout les DSP )

Les commandes Cxh :
Cette commande permet l'entrée ou la sortie d'échantillon 8 bits.

  7   6   5   4   3   2   1   0
+---+---+---+---+---+---+---+---+
| 1 | 1 | 0 | 0 |e/s| M | F | 0 |
+---+---+---+---+---+---+---+---+ 

Le bit 3 = 0 : Sortie ou lecture (convertion numerique/analogique)
         = 1 : Entrée ou erregistrement
               (convertion analogique/numerique)

Le bit 2 permet de choisir le mode DSP (DMA) :

Bit 2 = 0 : Mode single cycle :
            Dans ce mode le DSP transfert un seul bloc (64Ko max)
            et à la fin du transfert ,il declenche une interruption
            et s'arrete.

Bit 2 = 1 : Mode auto init :
            Ce mode permet de mettre à profit le mode auto init
            du DMA ,le DSP transfert un bloc(64Ko max) et à la fin
            du transfert il declenche une interruption et puis
            il continu à retransferer le bloc indefiniment .
            (voir commande DAh)

Le bit 1 = 0 : Deactive FIFO (de preference en mode single cycle)
           1 : Active FIFO   (de preference en mode auto init)

FIFO est un petite memoire temporaire interne.

voici toute les commande possible :

C0h : Sortie en mode single cycle sans fifo
C2h : Sortie en mode single cycle avec fifo
C4h : Sortie en mode auto init sans fifo
C6h : Sortie en mode auto init avec fifo
C8h : entrée en mode single cycle sans fifo
CAh : entrée en mode single cycle avec fifo
CCh : entrée en mode auto init sans fifo
CEh : entrée en mode auto init avec fifo

Aprés avoir envoyer l'une de ces commandes ,
il faut envoyer l'octet de mode:

  7   6   5   4   3   2   1   0
+---+---+---+---+---+---+---+---+
| 0 | 0 | x | x | 0 | 0 | 0 | 0 |
+---+---+---+---+---+---+---+---+ 

Le bit 5 = 0 : MONO
         = 1 : STEREO

Le bit 4 = 0 : NON SIGNE
         = 1 : SIGNE

00 = mono  - non signe
10 = mono  - signe
20 = stereo - non signe
30 = stereo - signe

Aprés il faut envoyer le nombre d'echantillon 8 bits moins 1.
D'abort l'octet de poid faible (LO)
puis l'octet de poid fort  (HI)

La commande D0h :
Cette commande permet d'interrompre le transfert d'echantillon 8 bits .

La commande D4h :
Cette commande permet reprendre le transfert d'echantillon 8 bits .

La commande DAh :
Cette commande permet d'arreter le transfert d'echantillon 8 bits
en mode auto init.Le bloc en cours est transfert jusqu'au bout .

La commande 45h : (ou 47h ?)
Cette commande permet de poursuivre un transfert(debuter par une
commande Cxh) sans devoir ré-utiliser une commande Cxh et donc on
ne doit pu envoyer l'octet de mode ,ni la taille du transfert .

--------------------------------------------------------------
Les commandes Bxh :
Cette commande permet l'entrée ou la sortie d'échantillon 16 bits.

  7   6   5   4   3   2   1   0
+---+---+---+---+---+---+---+---+
| 1 | 0 | 1 | 1 |e/s| M | F | 0 |
+---+---+---+---+---+---+---+---+ 

Le bit 3 = 0 : Sortie ou lecture (convertion numerique/analogique)
         = 1 : Entrée ou erregistrement
               (convertion analogique/numerique)

Le bit 2 permet de choisir le mode DSP (DMA) :

Bit 2 = 0 : Mode single cycle :
            Dans ce mode le DSP transfert un seul bloc (128Ko max)
            et à la fin du transfert ,il declenche une interruption
            et s'arrete.

Bit 2 = 1 : Mode auto init :
            Ce mode permet de mettre à profit le mode auto init
            du DMA ,le DSP transfert un bloc(128Ko max) et à la fin
            du transfert il declenche une interruption et puis
            il continu à retransferer le bloc indefiniment .
            (voir commande DAh)

Le bit 1 = 0 : Deactive FIFO (de preference en mode single cycle)
           1 : Active FIFO   (de preference en mode auto init)

FIFO est un petite memoire temporaire interne.

voici toute les commande possible :

B0h : Sortie en mode single cycle sans fifo
B2h : Sortie en mode single cycle avec fifo
B4h : Sortie en mode auto init sans fifo
B6h : Sortie en mode auto init avec fifo
B8h : entrée en mode single cycle sans fifo
BAh : entrée en mode single cycle avec fifo
BCh : entrée en mode auto init sans fifo
BEh : entrée en mode auto init avec fifo

Aprés avoir envoyer l'une de ces commandes ,
il faut envoyer l'octet de mode:

  7   6   5   4   3   2   1   0
+---+---+---+---+---+---+---+---+
| 0 | 0 | x | x | 0 | 0 | 0 | 0 |
+---+---+---+---+---+---+---+---+ 

Le bit 5 = 0 : MONO
         = 1 : STEREO

Le bit 4 = 0 : NON SIGNE
         = 1 : SIGNE

00 = mono  - non signe
10 = mono  - signe
20 = stereo - non signe
30 = stereo - signe

Aprés il faut envoyer le nombre d'echantillon 16 bits moins 1 .
D'abort l'octet de poid faible (LO)
puis l'octet de poid fort  (HI)

La commande D5h :
Cette commande permet d'interrompre le transfert d'echantillon 16 bits .

La commande D6h :
Cette commande permet reprendre le transfert d'echantillon 16 bits .

La commande D9h :
Cette commande permet d'arreter le transfert d'echantillon 16 bits
en mode auto init.Le bloc en cours est transfert jusqu'au bout .

La commande 47h : (ou 45h ?)
Cette commande permet de poursuivre un transfert(debuter par une
commande Bxh) sans devoir ré-utiliser une commande Bxh et donc on
ne doit pu envoyer l'octet de mode ,ni la taille du transfert .
---------------------------------------------------------------------
---------------------------------------------------------------------
VOICI L'ORDRE DANS LEQUEL DOIVENT ETRE LES OCTETS DANS
LA MEMOIRE SUIVANTS LE MODE CHOISIT :
(avec mode DMA : incrementation d'adresse)

POUR DES SONS 8 BITS MONO :

OCTET 1 >---> SAMPLE 1
OCTET 2 >---> SAMPLE 2
OCTET 3 >---> SAMPLE 3
OCTET 4 >---> SAMPLE 4
OCTET 5 >---> SAMPLE 5
ect...

POUR DES SONS 8 BITS STEREO :

OCTET 1 >---> SAMPLE 1 GAUCHE
OCTET 2 >---> SAMPLE 1 DROITE
OCTET 3 >---> SAMPLE 2 GAUCHE
OCTET 4 >---> SAMPLE 2 DROITE
OCTET 5 >---> SAMPLE 3 GAUCHE
ect...

POUR DES SONS 16 BITS MONO :

OCTET 1 >---> SAMPLE 1 Octet de poid FAIBLE (8 bit inferieur)
OCTET 2 >---> SAMPLE 1 Octet de poid FORT (8 bit superieur)
OCTET 3 >---> SAMPLE 2 Octet de poid FAIBLE
OCTET 4 >---> SAMPLE 2 Octet de poid FORT
OCTET 5 >---> SAMPLE 3 Octet de poid FAIBLE
ect...

POUR DES SONS 16 BITS STEREO :

OCTET 1 >---> SAMPLE 1G GAUCHE Octet de poid FAIBLE
OCTET 2 >---> SAMPLE 1G GAUCLE Octet de poid FORT
OCTET 3 >---> SAMPLE 1D DROITE Octet de poid FAIBLE
OCTET 4 >---> SAMPLE 1D DROITE Octet de poid FORT
OCTET 5 >---> SAMPLE 2G GAUCHE Octet de poid FAIBLE
OCTET 6 >---> SAMPLE 2G GAUCHE Octet de poid FORT
OCTET 7 >---> SAMPLE 2D DROITE Octet de poid FAIBLE
OCTET 8 >---> SAMPLE 2D DROITE Octet de poid FORT
ect...

---------------------------------------------------------------------
---------------------------------------------------------------------

VOICI LES PRINCIPAUX REGISTRES DU MIXER(CT1745) :

Pour acceder aux registres ,il faut ecrire le numero du registre
au port 2x4H (REGISTRE D'INDEX).
Puis on peut lire ou ecrire dans le registre selectionner au
port 2x5H (REGISTRE DE DONNEE).

 MIXER  | 
REGISTRE+               DESCRIPTION           
--------+----------------------------------------------------
   00H  |  RESET MIXER
   01H  |  STATUT
   04H  |  VOLUME VOICE
   0AH  |  VOLUME DU MICROPHONE
   22H  |  VOLUME MASTER
   28H  |  VOLUME CD
   2EH  |  VOLUME LINE
   30H  |  VOLUME MASTER GAUCHE
   31H  |  VOLUME MASTER DROITE
   32H  |  VOLUME VOICE GAUCHE
   33H  |  VOLUME VOICE DROITE
   36H  |  VOLUME CD GAUCHE
   37H  |  VOLUME CD DROITE
   38H  |  VOLUME LINE IN GAUCHE
   39H  |  VOLUME LINE IN DROITE
   3AH  |  VOLUME MICROPHONE
   3BH  |  VOLUME DU SPEAKER DU PC (haut-parleur à l'interrieur du PC)
   3CH  |  MIXER EN SORTIE
   3DH  |  MIXER EN ENTREE GAUCHE
   3EH  |  MIXER EN ENTREE DROITE
   3FH  |  AMPLI EN ENTREE GAUCHE
   40H  |  AMPLI EN ENTREE DROITE
   41H  |  AMPLI EN SORTIE GAUCHE
   42H  |  AMPLI EN SORTIE DROITE
   43H  |  AMPLI MICRO AUTO (AGC)
   44H  |  AIGU GAUCHE
   45H  |  AIGU DROITE
   46H  |  BASSE GAUCHE
   47H  |  BASSE DROITE
   80H  |  SELECT IRQ
   81H  |  SELECT DMA
   82H  |  IRQ STATUT
--------+-------------------------------------------------------------
----------------------------------------------------------------------
DESCRIPTION DES REGISTRES :

Le registre 00h :
Ce registre permet de faire un reset:
Ecrire 0 dans le registre d'index.
Attendre environ 100 mS.
Ecrire 0 dans le registre de donnée.

Le registre 01h : (en lecture uniquement)
Ce registre contient le registre precedament utiliser.??

Le registre 04h :

Bit 7-4 = VOLUME VOICE GAUCHE
Bit 3-0 = VOLUME VOICE DROITE

(VOIR REGISTRE 32H et 33H)

Le registre 0Ah :

Bit 7-3 = 0 : RESERVE
Bit 2-0 = VOLUME DU MICRO

(VOIR REGISTRE 3AH)

Le registre 22h :

Bit 7-4 = VOLUME MASTER GAUCHE
Bit 3-0 = VOLUME MASTER DROITE

(VOIR REGISTRE 30H et 31H)

Le registre 28h :

Bit 7-4 = VOLUME CD GAUCHE
Bit 3-0 = VOLUME CD DROITE

(VOIR REGISTRE 36H et 37H)

Le registre 2Eh :

Bit 7-4 = VOLUME LINE GAUCHE
Bit 3-0 = VOLUME LINE DROITE

(VOIR REGISTRE 38H et 39H)

LES REGISTRES 04H,0AH,22H,28H,2EH ONT ETE GARDER POUR DES RAISONS
DE COMPATIBILITER AVEC LES VERSIONS DE MIXER PRECEDANTE.
SI VOUS MODIFIER L'UN DE CES REGISTRES ,LEURS REGISTRES EQUIVALENT
(VOIR xx et xx) SERONT MODIFIER EUX AUSSI.

VOICI MAINTENANT CES NOUVEAUX REGISTRES EQUIVALENT:

Le registre 30h :

Bit 0-2 = 0  : RESERVE
Bit 7-3 = VOLUME MASTER GAUCHE

Le registre 31h :

Bit 0-2 = 0  : RESERVE
Bit 7-3 = VOLUME MASTER DROITE

Le registre 32h :

Bit 0-2 = 0  : RESERVE
Bit 7-3 = VOLUME VOICE GAUCHE

Le registre 33h :

Bit 0-2 = 0  : RESERVE
Bit 7-3 = VOLUME VOICE DROITE

Le registre 36h :

Bit 0-2 = 0  : RESERVE
Bit 7-3 = VOLUME CD GAUCHE

Le registre 37h :

Bit 0-2 = 0  : RESERVE
Bit 7-3 = VOLUME CD DROITE

Le registre 38h :

Bit 0-2 = 0  : RESERVE
Bit 7-3 = VOLUME LINE IN GAUCHE

Le registre 39h :

Bit 0-2 = 0  : RESERVE
Bit 7-3 = VOLUME LINE IN DROITE

Le registre 3Ah :

Bit 0-2 = 0  : RESERVE
Bit 7-3 = VOLUME MICRO

Le registre 3Bh :

Bit 0-5 = 0  : RESERVE
Bit 7-6 = VOLUME DU SPEAKER DU PC

Le registre 3Ch :
Permet de selectionner toute les lignes qui sortiront :

0 = OFF
1 = ON

Bit 0 : Microphone OFF
Bit 1 : CD AUDIO DROITE
Bit 2 : CD AUDIO GAUCHE
Bit 3 : LINE IN DROITE
Bit 4 : LINE IN GAUCHE
Bit 5-7 = 0 : RESERVER

Le registre 3Dh :
Permet de selectionner toute les lignes GAUCHE qui entreront :

0 = OFF
1 = ON

Bit 0 : Microphone OFF
Bit 1 : CD AUDIO DROITE
Bit 2 : CD AUDIO GAUCHE
Bit 3 : LINE IN DROITE
Bit 4 : LINE IN GAUCHE
Bit 5 : FM DROITE
Bit 6 : FM GAUCHE
Bit 7 = 0 : RESERVER

Le registre 3Eh :
Permet de selectionner toute les lignes DROITE qui entreront :

0 = OFF
1 = ON

Bit 0 : Microphone OFF
Bit 1 : CD AUDIO DROITE
Bit 2 : CD AUDIO GAUCHE
Bit 3 : LINE IN DROITE
Bit 4 : LINE IN GAUCHE
Bit 5 : FM DROITE
Bit 6 : FM GAUCHE
Bit 7 = 0 : RESERVER

Le registre 3Fh :

Bit 0-5 = 0 : RESEVER
Bit 7-6 = AMPLIFICATION DE L'ENTREE GAUCHE

Le registre 40h :

Bit 0-5 = 0 : RESEVER
Bit 7-6 = AMPLIFICATION DE L'ENTREE DROITE

Le registre 41h :

Bit 0-5 = 0 : RESEVER
Bit 7-6 = AMPLIFICATION DE LA SORTIE GAUCHE

Le registre 42h :

Bit 0-5 = 0 : RESEVER
Bit 7-6 = AMPLIFICATION DE LA SORTIE DROITE

Le registre 43h :

Bit 0 = CONTROL DE GAIN AUTOMATIQUE 
       (0=OFF et 1=ON ,peut être l'inverse?)
Bit 7-1 = 0 : RESEVER

Le registre 44h :

Bit 0-3 = 0 : RESEVER
Bit 7-4 = AIGU GAUCHE

Le registre 45h :

Bit 0-3 = 0 : RESEVER
Bit 7-4 = AIGU DROITE

Le registre 46h :

Bit 0-3 = 0 : RESEVER
Bit 7-4 = BASSE GAUCHE

Le registre 47h :

Bit 0-3 = 0 : RESEVER
Bit 7-4 = BASSE DROITE

Le registre 80h :

Ce registre permet de selection le numero de l'IRQ (qui declenchera
l'interrutpion)

0 = Pas active
1 = active (ou selectionner)

Bit 0 : IRQ 2
Bit 1 : IRQ 5
Bit 2 : IRQ 7
Bit 3 : IRQ 10
Bit 7-4 = 1 : RESERVER (pas sur ,c'est peut-etre 0 ?)

Remarque : Ce registre n'est pas affecter pas un reset.
           Il est possible de selection plusieurs IRQ ?
(En principe vous ne devez pas touchez à ce registre)

Le registre 81h :

Ce registre permet de selection le numero du DMA (par lequelle
le transfert s'effectura)

0 = Pas active
1 = active (selectionner)

Bit 0 : DMA 0 (8 bits)
Bit 1 : DMA 1 (8 bits)
Bit 2 : DMA 2 : RESERVER (0)
Bit 3 : DMA 3 (8 bits)
Bit 4 : DMA 4 : RESERVER (0)
Bit 1 : DMA 5 (16 bits)
Bit 2 : DMA 6 (16 bits)
Bit 3 : DMA 7 (16 bits)

Remarque : Ce registre n'est pas affecter pas un reset.
(En principe vous ne devez pas touchez à ce registre)
Si vous deselectionner tout les DMA 8 bits = interdire tout les
transfert 8 ou 16 bits.

Le registre 82h :

En lecture uniquement : Ce registre indique quel est le type
d'interruption.

Bit 0 : IRQ 8 bits (1=active)
Bit 1 : IRQ 16 bits (1=active)
Bit 2 : MPU-401 (interrutpion MIDI)  (1=active)
Bit 3 = 0 : RESERVER
Bit 7-4 = ??? (1h = v4.04, 2h = v4.05, 8h = v4.12)

---------------------------------------------------------------------
---------------------------------------------------------------------
FONCTIONNEMENT :

Pour ecrire des commandes (ou donnees) au DSP ,il faut d'abord
lire le bit 7 du port 2xch :
S'il est à 1 ,il faut attendre et relire ce bit jusqu'a ce qu'il
soit à 0.
Des qu'il est à 0 ,on peut ecrire une commande sur le port 2xch.
Mais pour ecrire la commande suivante ,il faut retester le bit 7 
du port 2xch .

Voici un exemple en assembleur : 
       mov   ah,commande
       ...
writedsp:
       mov   dx,2xch
wait1: in    al,dx
       test  al,80h
       jne   wait1
       mov   al,ah
       out   dx,al
       ret

En entrée dans AH ,il y a la commande/donnée

--------------------------------------------------------------------

Pour lire des donnees du DSP,il faut lire le bit 7 du port 2xeh :
S'il est à 0 ,il faut attendre et relire ce bit jusqu'a ce qu'il
soit à 1.
Des qu'il est à 1 ,on peut ecrire une commande sur le port 2xah.
Mais pour lire la donnee suivante ,il faut retester le bit 7 du
port 2xeh .

Voici un exemple en assembleur :

readdsp:
       mov   dx,2xeh
wait2: in    al,dx
       test  al,80h
       je    wait2
       sub   dl,4
       in    al,dx  ;AL = data
       ret

En sortie AL = donnée

--------------------------------------------------------------------

Pour verifié l'existance d'une carte SB16 et connaitre son
adresse de base ,il faut effectuer un RESET DSP au port 2x6h
avec  x variant de 1 à 8 et lire pour chaque x ,le port de donnee
qui doit revoyer la valeur AAh (indiquant la presence de la SB).
Pour effectuer le reset ,il faut ecrire 1 sur le port 2x6h et 
attendre 3 micro seconde et puis ecrire 0 sur le port 2x6h et
attendre 100 micro seconde pour qu'elle soit operationnel.

voici un exemple en assembleur :

testdsp:
           mov   bl,7
           mov   dx,210h
test:      add   dl,6
           mov   al,1
           out   dx,al    ; ecrit 1
           sub   ax,ax
wait3:     dec   ax       ; attendre 3 us minimum
           jne   wait3
           out   dx,al    ; ecrit 0
           xor   cx,cx    ; cx=0
           add   dl,8     ; dx=2xeh
wait4:     in    al,dx
           test  al,80h
           jne   ok       ;b7=1 lire DSP DATA
           loop  wait4    ;on ne met pas de boucle infinit
                          ;car si c'est pas le bon port , on 
                          ;peut attendre indefiniment.

           add   dl,2     ;Dx=2x0h  (x=x+1)
           dec   bl       
           jne  test
           jmp  pasdsp
ok:        sub  dl,4      ;DX= 2xah 
           in   al,dx
           add  dl,06h    ;DX= 2x0h  (x=x+1)
           cmp  al,0AAH   ;si AL=0AAh alors DSP trouver.
           je   dspok
           dec   bl       
           jne  testdsp
pasdsp:    xor  dx,dx     ;PAS DE DSP TROUVER
           ret            ;continu programme
dspok:     sub   dl,10h   ;DX=ADRESSE DE BASE DU DSP
           ret

En sortie : 
           - si DX=0 ,il n'y a pas de DSP(pas de carte son)
           - si DX<>0 , DX=adresse de base du DSP

---------------------------------------------------------------------
Pour programmer la carte son (jouer ou enregistrer un son),il faut :

0) CONNAITRE LE NUMERO DE L'INTERRUPTION ET CONNAITRE
   LES NUMERO DES CANNAUX DMA 1 ET DMA 2 (voir registre 80h
   et 81h du MIXER)

1) BLOQUER L'INTERRUPTION SB (SOUNDBLASTER)
2) INSTALLER LE GESTIONNAIRE D'INTERRUPTION
3) PROGRAMMER LE DMA (voir : la programmation du DMA)
4) SELECTIONNER LA FREQUENCE D'ECHANTILLONAGE AVEC LA
   COMMANDE 41H OU 42H :
   D'ABORD L'OCTET HI
   PUIS  L' OCTET LO
5) ENVOYER UNE COMMANDE CxH (8 bits) OU BxH (16 bits)
6) ENVOYER L'OCTET DE MODE (MONO OU STEREO,SIGNE OU NON SIGNE)
7) ENVOYER L'OCTET LO DU NOMBRE D'ECHANTILLON -1
8) ENVOYER L'OCTET HI DU NOMBRE D'ECHANTILLON -1
9) LIBERER L'INTERRUPTION DE LA CARTE SON

A LA FIN DU TRANSFERT LE DSP GENERE UNE INTERRUPTION 

--------------------------------------------------------------------
GESTIONNAIRE D'INTERRUPTION :

A la fin du gestionnaire :
il faut lire le port 2xeh pour une interruption 8 bits
ou lire le port 2xfh pour une interruption 16 bits .
et envoyer une commande EOI (EOI inutile si le PIC est en EOI
automatique) .

exemple :

GESTIONNAIRE_SON :
			    SAUVER les registres utiliser

			    reprogrammer eventuellement
 			    le DMA et le DSP (mode single cycle)
			    
			    mov	dx,2xeh	;pour une
			    in	al,dx		;interruption 8 bits

			    mov	dx,2xfh	;pour une
			    in	al,dx		;interruption 16 bits

			    mov	al,20h
			    out	20h,al	;Commande EOI

			    RESTITUER les registres sauvegarder

			    IRET

--------------------------------------------------------------------