LA PROGRAMMATION DE LA SOUNDBLASTER

La soundblaster (SB16) est composée entre autres d'une puce DSP (c'est le coeur de la carte, c'est elle qui s'occupe de gérer les sons ) et d'une puce MIXER (qui permet de gérer les volumes).

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

Adresse de base

2x0H

DESCRIPTION

R/W

+ 04
+ 05

REGITRE D'INDEX DU MIXER
DONNÉES DU MIXER

-/W
R/W

+ 06
+ 0A
+ 0C
+ 0C
+ 0E

RESET DSP
DONNÉES DSP
DONNÉES / COMMANDE DSP
ÉTAT DU BUFFER ÉCRITURE
ÉTAT DU BUFFER LECTURE

-/W
R/-
-/W
R/-
R/-

+ 0D
+ 0E
+ 0F

DSP interrupt clear port
DSP 8 bit interrupt
DSP 16 bit interrupt

R/- ???
R/-
R/-

+ 10h
+ 11h
+ 11h ou 10h ?
+ 12h
+ 13h

CD-ROM DATA
CD-ROM STATUT
CD-ROM COMMAND
CD-ROM RESET
CD-ROM ENABLE

R/-
R/-
-/W
-/W
-/W

JE RECHERCHE DES INFOS SUR LA PROGRAMMATION DU CD-ROM PAR
L'INTERMÉDIAIRE DE LA CARTE SON ET NON PAS AVEC MSCDEX, AINSI
QUE TOUTES LES COMMANDES. JE RECHERCHE AUSSI DES INFO SUR COMMENT
PROGRAMMER LA CARTE SON SANS UTILISER LE DMA (est-ce possible ?)
ET SUR LE BUS ISA ET PCI.
SI VOUS AVEZ DES INFO ECRIVER MOI :

pccoder@club-internet.fr


Je ne parlerai ici que de la version 4.xx + sans la synthèse FM ni la programmation MIDI .
Si vous êtes intéressé par les versions antérieurs (ou les autres commandes) écrivez-moi et je vous enverrai
la DOC que j'ai (en anglais).

VOIÇI LES PRINCIPALES COMMANDES DU DSP :

DSP
COMMAND

 
DESCRIPTION

 

    E1H
    D8H
    D1H
    D3H
    41H
    42H
    E0H
    E3H
    E4H
    E8H
    F0H
    F2H
    F3H
    FBH
    FCH
    FDH

 

    Indique la version du DSP
    Teste l'état du haut-parleur
    Activation du haut-parleur
    Désactivation du haut-parleur
    Indique la fréquence d'échantillonnage pour la sortie
    Indique le fréquence d'échantillonnage pour l'entrée
    DSP identification ??
    DSP copyright ?
    Write test register ??
    Read test register ??
    Sine generator ??
    8 bits, IRQ REQUEST ??
    16 bits, IRQ REQUEST ??
    ETAT DU DSP ?
    ETAT (auxiliaire) DU DSP ?
    DSP COMMAND STATUT ?

 

    CxH
    D0H
    D4H
    DAH
    45H

 

    Entrée/sortie d'échantillon 8 bits
    Suspension du transfert d'échantillon 8 bits
    Reprise du transfert d'échantillon 8 bits
    Fin du transfert DMA 8 bits en mode auto init
    Continu DMA auto init 8 bits

 

    BxH
    D5H
    D6H
    D9H
    47H

 

    Entrée/sortie d'échantillon 16 bits
    Suspension du transfert d'échantillon 16 bits
    Reprise du transfert d'échantillon 16 bits
    Fin du transfert DMA 16 bits en mode auto init
    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 COMMANDES :

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

Il faut envoyer cette commande au DSP puis, il faut lire
2 fois le DSP :
Le premier octet indique le numéro principal de la version.
Le deuxième octet indique le numéro 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 établi
(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 déconnecter le DSP du haut-parleur.

La commande 41h :
Cette commande permet de sélectionner la fréquence
d'échantillonnage pour la sortie (lecture).

Il faut envoyer cette commande au DSP
Il faut envoyer l'octet de poids fort puis l'octet de poids faible
de la fréquence d'échantillonnage.

La commande 42h :
Cette commande permet de sélectionner la fréquence
d'échantillonnage pour l'entrée (enregistrement).

Il faut envoyer cette commande au DSP
Il faut envoyer l'octet de poids fort puis l'octet de poids faible
de la fréquence d'échantillonnage.

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

Il faut envoyer cette commande au DSP, puis lire
le DSP jusqu'à ce qu'on lise '0' (zéro).

La commande F2h :
Cette commande permet de générer une interruption 8 bits. ??

La commande F3h :
Cette commande permet de générer une interruption 16 bits. ??

La commande FBh :
Cette commande permet de connaître l'état du DSP pendant une opération.

Bit 0   =   1   :   DMA DAC (Conversion numérique/analogique) 8 bits ACTIVE
Bit 1 = 1 : DMA ADC (Conversion analogique/numérique) 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 connaître l'état du DMA pendant une opération.

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 dernière commande
envoyée 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 (conversion numérique/analogique)
= 1 : Entrée ou enregistrement
(conversion analogique/numérique)

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 déclenche une interruption
et s'arrête.

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 déclenche une interruption puis
continu à retransmettre le bloc indéfiniment .
(voir commande DAh)

Le bit 1 = 0 : Désactive FIFO (de préférence en mode single cycle)
1 : Active FIFO (de préférence en mode auto init)

FIFO est un petite mémoire temporaire interne.

Voiçi toute les commandes possibles :

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 envoyé 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


Le bit 4

 
=
=

=
=

 
0
1

0
1

 
:
:

:
:

 
MONO
STEREO

NON SIGNE
SIGNE

00
10
20
30

=
=
=
=

mono
mono
stéreo
stéreo

-
-
-
-

non signe
signe
non signe
signe

Après, il faut envoyer le nombre d'échantillon 8 bits moins 1.
D'abord l'octet de poids faible (LO)
puis l'octet de poids fort (HI)

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

La commande D4h :
Cette commande permet de reprendre le transfert d'échantillon 8 bits.

La commande DAh :
Cette commande permet d'arrêter le transfert d'échantillon 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 (débuté par une
commande Cxh) sans devoir réutiliser une commande Cxh et donc on
ne doit plus 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 (conversion numérique/analogique)
= 1 : Entrée ou enregistrement
(conversion analogique/numérique)

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 déclenche une interruption
et s'arrête.

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 déclenche une interruption puis
continu à retransmettre le bloc indéfiniment .
(voir commande DAh)

Le bit 1 = 0 : Désactive FIFO (de préférence en mode single cycle)
1 : Active FIFO (de préférence en mode auto init)

FIFO est une petite mémoire temporaire interne.

Voiçi toute les commandes possibles :

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


Le bit 4

 
=
=

=
=

 
0
1

0
1

 
:
:

:
:

 
MONO
STEREO

NON SIGNE
SIGNE

00
10
20
30

=
=
=
=

mono
mono
stéreo
stéreo

-
-
-
-

non signe
signe
non signe
signe

Après, il faut envoyer le nombre d'échantillon 16 bits moins 1.
D'abord l'octet de poids faible (LO)
puis l'octet de poids fort (HI)

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

La commande D6h :
Cette commande permet de reprendre le transfert d'échantillon 16 bits.

La commande D9h :
Cette commande permet d'arrêter le transfert d'échantillon 16 bits
en mode auto init. Le bloc en cours est transferé jusqu'au bout .

La commande 47h : (ou 45h ?) Cette commande permet de poursuivre un transfert (debuté par une
commande Bxh) sans devoir réutiliser une commande Bxh, donc on
ne doit plus envoyer l'octet de mode, ni la taille du transfert .
---------------------------------------------------------------------------------------
---------------------------------------------------------------------------------------
VOICI L'ORDRE DANS LEQUEL DOIT ÊTRE LES OCTETS DANS
LA MEMOIRE SUIVANT LE MODE CHOISIT :
(avec mode DMA : incrémentation d'adresse)

POUR DES SONS 8 BITS MONO :

 
OCTET
OCTET
OCTET
OCTET
OCTET
etc.

1
2
3
4
5

>--->
>--->
>--->
>--->
>--->

SAMPLE
SAMPLE
SAMPLE
SAMPLE
SAMPLE

1
2
3
4
5

POUR DES SONS 8 BITS STÉRÉO :

 
OCTET
OCTET
OCTET
OCTET
OCTET
etc.

1
2
3
4
5

>--->
>--->
>--->
>--->
>--->

SAMPLE
SAMPLE
SAMPLE
SAMPLE
SAMPLE

1
1
2
2
3

GAUCHE
DROITE
GAUCHE
DROITE
GAUCHE

POUR DES SONS 16 BITS MONO :

 
OCTET
OCTET
OCTET
OCTET
OCTET
etc.

1
2
3
4
5

>--->
>--->
>--->
>--->
>--->

SAMPLE
SAMPLE
SAMPLE
SAMPLE
SAMPLE

1
1
2
2
3

Octet de poids FAIBLE (8 bit inférieur)
Octet de poids FORT (8 bit supérieur)
Octet de poids FAIBLE
Octet de poids FORT
Octet de poids FAIBLE

POUR DES SONS 16 BITS STÉRÉO :

 
OCTET
OCTET
OCTET
OCTET
OCTET
OCTET
OCTET
OCTET
etc.

1
2
3
4
5
6
7
8

>--->
>--->
>--->
>--->
>--->
>--->
>--->
>--->

SAMPLE
SAMPLE
SAMPLE
SAMPLE
SAMPLE
SAMPLE
SAMPLE
SAMPLE

1G
1G
1D
1D
2G
2G
2D
2D

GAUCHE
GAUCHE
DROITE
DROITE
GAUCHE
GAUCHE
DROITE
DROITE

Octet de poids FAIBLE
Octet de poids FORT
Octet de poids FAIBLE
Octet de poids FORT
Octet de poids FAIBLE
Octet de poids FORT
Octet de poids FAIBLE
Octet de poids FORT

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

VOICI LES PRINCIPAUX REGISTRES DU MIXER(CT1745) :

Pour accéder aux registres, il faut écrire le numéro du registre
au port 2x4H (REGISTRE D'INDEX).
Puis on peut lire ou écrire dans le registre sélectionné au port 2x5H (REGISTRE DE DONNÉE).

MIXER
REGISTRE

 
DESCRIPTION

 

    00H
    01H
    04H
    0AH
    22H
    28H
    2EH
    30H
    31H
    32H
    33H
    36H
    37H
    38H
    39H
    3AH
    3BH
    3CH
    3DH
    3EH
    3FH
    40H
    41H
    42H
    43H
    44H
    45H
    46H
    47H
    80H
    81H
    82H

 

    RESET MIXER
    STATUT
    VOLUME VOICE
    VOLUME DU MICROPHONE
    VOLUME MASTER
    VOLUME CD
    VOLUME LINE
    VOLUME MASTER GAUCHE
    VOLUME MASTER DROITE
    VOLUME VOICE GAUCHE
    VOLUME VOICE DROITE
    VOLUME CD GAUCHE
    VOLUME CD DROITE
    VOLUME LINE IN GAUCHE
    VOLUME LINE IN DROITE
    VOLUME MICROPHONE
    VOLUME DU SPEAKER DU PC (haut-parleur à l'intérieur du PC)
    MIXER EN SORTIE
    MIXER EN ENTREE GAUCHE
    MIXER EN ENTREE DROITE
    AMPLI EN ENTREE GAUCHE
    AMPLI EN ENTREE DROITE
    AMPLI EN SORTIE GAUCHE
    AMPLI EN SORTIE DROITE
    AMPLI MICRO AUTO (AGC)
    AIGU GAUCHE
    AIGU DROITE
    BASSE GAUCHE
    BASSE DROITE
    SELECT IRQ
    SELECT DMA
    IRQ STATUT

 
DESCRIPTION DES REGISTRES :

Le registre 00h :
Ce registre permet de faire un reset:
écrire 0 dans le registre d'index,
attendre environ 100 ms,
écrire 0 dans le registre de donnée.

Le registre 01h : (en lecture uniquement)
Ce registre contient le registre précédemment 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 : RÉSERVÉ
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 GARDÉS POUR DES RAISONS
DE COMPATIBILITÉ AVEC LES VERSIONS DE MIXER PRÉCÉDANTES.
SI VOUS MODIFIEZ L'UN DE CES REGISTRES, LEURS REGISTRES ÉQUIVALENTS
(voir xx et xx) SERONT MODIFIÉS EUX AUSSI.

VOIÇI MAINTENANT CES NOUVEAUX REGISTRES EQUIVALENTS:

Le registre 30h :

Bit 0-2 = 0 : RÉSERVÉ
Bit 7-3 = VOLUME MASTER GAUCHE

Le registre 31h :

Bit 0-2 = 0 : RÉSERVÉ
Bit 7-3 = VOLUME MASTER DROITE

Le registre 32h :

Bit 0-2 = 0 : RÉSERVÉ
Bit 7-3 = VOLUME VOICE GAUCHE

Le registre 33h :

Bit 0-2 = 0 : RÉSERVÉ
Bit 7-3 = VOLUME VOICE DROITE

Le registre 36h :

Bit 0-2 = 0 : RÉSERVÉ
Bit 7-3 = VOLUME CD GAUCHE

Le registre 37h :

Bit 0-2 = 0 : RÉSERVÉ
Bit 7-3 = VOLUME CD DROITE

Le registre 38h :

Bit 0-2 = 0 : RÉSERVÉ
Bit 7-3 = VOLUME LINE IN GAUCHE

Le registre 39h :

Bit 0-2 = 0 : RÉSERVÉ
Bit 7-3 = VOLUME LINE IN DROITE

Le registre 3Ah :

Bit 0-2 = 0 : RÉSERVÉ
Bit 7-3 = VOLUME MICRO

Le registre 3Bh :

Bit 0-5 = 0 : RÉSERVÉ
Bit 7-6 = VOLUME DU SPEAKER DU PC

Le registre 3Ch :
Permet de sélectionner toute les lignes qui sortiront :

0
1

=
=

OFF
ON

Bit
Bit
Bit
Bit
Bit
Bit

0
1
2
3
4
5 - 7 = 0

:
:
:
:
:
:

Microphone OFF
CD AUDIO DROITE
CD AUDIO GAUCHE
LINE IN DROITE
LINE IN GAUCHE
RESERVÉ

 
Le registre 3Dh :
Permet de sélectionner toute les lignes GAUCHE qui entreront :

0
1

=
=

OFF
ON

Bit
Bit
Bit
Bit
Bit
Bit
Bit
Bit

0
1
2
3
4
5
6
7 = 0

:
:
:
:
:
:
:
:

Microphone OFF
CD AUDIO DROITE
CD AUDIO GAUCHE
LINE IN DROITE
LINE IN GAUCHE
FM DROITE
FM GAUCHE
RESERVÉ

 
Le registre 3Eh :
Permet de sélectionner toute les lignes DROITE qui entreront :

0
1

=
=

OFF
ON

Bit
Bit
Bit
Bit
Bit
Bit
Bit
Bit

0
1
2
3
4
5
6
7 = 0

:
:
:
:
:
:
:
:

Microphone OFF
CD AUDIO DROITE
CD AUDIO GAUCHE
LINE IN DROITE
LINE IN GAUCHE
FM DROITE
FM GAUCHE
RESERVÉ

 
Le registre 3Fh :

Bit 0-5 = 0 : RESEVÉ
Bit 7-6 = AMPLIFICATION DE L'ENTRÉE GAUCHE

Le registre 40h :

Bit 0-5 = 0 : RESEVÉ
Bit 7-6 = AMPLIFICATION DE L'ENTRÉE DROITE

Le registre 41h :

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

Le registre 42h :

Bit 0-5 = 0 : RESEVÉ
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 : RESEVÉ
Bit 7-4 = AIGU GAUCHE

Le registre 45h :

Bit 0-3 = 0 : RESEVÉ
Bit 7-4 = AIGU DROITE

Le registre 46h :

Bit 0-3 = 0 : RESEVÉ
Bit 7-4 = BASSE GAUCHE

Le registre 47h :

Bit 0-3 = 0 : RESEVÉ
Bit 7-4 = BASSE DROITE

Le registre 80h :
Ce registre permet de sélectionner le numéro de l'IRQ (qui déclenchera l'interruption)

0 = Pas active
1 = Active (ou sélectionner)

Bit 0 : IRQ 2
Bit 1 : IRQ 5
Bit 2 : IRQ 7
Bit 3 : IRQ 10
Bit 7-4 = 1 : RESERVÉ (pas sur, c'est peut-être 0 ?)

Remarque :

Ce registre n'est pas affecté pas un reset.
Il est possible de sélectionner plusieurs IRQ ?

(En principe vous ne devez pas touchez à ce registre)

 
Le registre 81h :

Ce registre permet de sélectionner le numéro du DMA (par lequel
le transfert s'effectuera)

0 = Pas active
1 = Active (selectionnée)

Bit 0 : DMA 0 (8 bits)
Bit 1 : DMA 1 (8 bits)
Bit 2 : DMA 2 : RESERVÉ (0)
Bit 3 : DMA 3 (8 bits)
Bit 4 : DMA 4 : RESERVÉ (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 affecté pas un reset.
(En principe vous ne devez pas touchez à ce registre)
Si vous désélectionnez tous les DMA 8 bits = interdire tous les
transferts 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 (interruption MIDI) (1=active)
Bit 3 = 0 : RESERVÉ
Bit 7-4 = ??? (1h = v4.04, 2h = v4.05, 8h = v4.12)

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

FONCTIONNEMENT :

Pour écrire des commandes (ou données) 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'à ce qu'il
soit à 0.
Dès qu'il est à 0, on peut écrire une commande sur le port 2xch.
Mais pour écrire la commande suivante, il faut tester à nouveau
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 données du DSP, il faut lire le bit 7 du port 2xeh :
s'il est à 0, il faut attendre et relire ce bit jusqu'à ce qu'il
soit à 1.
Des qu'il est à 1, on peut écrire une commande sur le port 2xah.
Mais pour lire la donnée suivante, il faut tester à nouveau le bit
7 du port 2xeh .

Voici un exemple en assembleur :

readdsp:

wait2:





 






 
mov
in
test
je
sub
in
ret

 






 
dx,2xeh
al,dx
al,80h
wait2
dl,4
al,dx

 






 





;AL = data

 
En sortie AL = donnée

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

Pour vérifier l'existence d'une carte SB16 et connaître 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 donnée
qui doit renvoyer la valeur AAh (indiquant la présence de la SB).
Pour effectuer le reset, il faut écrire 1 sur le port 2x6h et
attendre 3 micro seconde puis écrire 0 sur le port 2x6h et
attendre 100 micro seconde pour qu'elle soit opérationnelle.

voici un exemple en assembleur :

testdsp:


test:



wait3:




wait4:










ok:






pasdsp:

dspok:

 
































 
mov
mov
add
mov
out
sub
dec
jne
out
xor
add
in
test
jne
loop



add
dec
jne
jmp
sub
in
add
cmp
je
dec
jne
xor
ret
sub
ret

 
































 
bl,7
dx,210h
dl,6
al,1
dx,al
ax,ax
ax
wait3
dx,al
cx,cx
dl,8
al,dx
al,80h
ok
wait4



dl,2
bl
test
pasdsp
dl,4
al,dx
dl,06h
al,0AAH
dspok
bl
testdsp
dx,dx

dl,10h

 
































 




; écrit 1

; attendre 3 us minimum

; écrit 0
; cx=0
; dx = 2xeh


;b7=1 lire DSP DATA
;on ne met pas de boucle infinit
;car si c'est pas le bon port , on
;peut attendre indéfiniment.

;Dx = 2x0h (x=x+1)



;DX = 2xah

;DX = 2x0h (x=x+1)
;si AL=0AAh alors DSP trouver.



;PAS DE DSP TROUVÉ
;continu programme
;DX=ADRESSE DE BASE DU DSP

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)



1)
2)
3)
4)



5)
6)
7)
8)
9)

CONNAÎTRE LE NUMÉRO DE L'INTERRUPTION ET CONNAÎTRE
LES NUMÉROS DES CANAUX DMA 1 ET DMA 2 (voir registre 80h
et 81h du MIXER)

BLOQUER L'INTERRUPTION SB (SOUNDBLASTER)
INSTALLER LE GESTIONNAIRE D'INTERRUPTION
PROGRAMMER LE DMA (voir : la programmation du DMA)
SÉLECTIONNER LA FRÉQUENCE D'ÉCHANTILLONAGE AVEC LA
COMMANDE 41H OU 42H :
D'ABORD L'OCTET HI
PUIS L'OCTET LO
ENVOYER UNE COMMANDE CxH (8 bits) OU BxH (16 bits)
ENVOYER L'OCTET DE MODE (MONO OU STEREO, SIGNE OU NON SIGNE)
ENVOYER L'OCTET LO DU NOMBRE D'ÉCHANTILLON -1
ENVOYER L'OCTET HI DU NOMBRE D'ÉCHANTILLON -1
LIBÉRER L'INTERRUPTION DE LA CARTE SON

À LA FIN DU TRANSFERT LE DSP GÉNÈRE 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 utilisés

reprogrammer éventuellement
le DMA et le DSP (mode single cycle)

 








 
mov
in

mov
in

mov
out

 








 
dx,2xeh
al,dx

dx,2xfh
al,dx

al,20h
20h,al

 








 
;pour une
;interruption 8 bits

;pour une
;interruption 16 bits


;Commande EOI

RESTITUER les registres sauvegarder

IRET