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 ? |
|
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 |
|
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 :
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 :
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 :
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 |
|