Introduction à la programmation DSP
Cette page décrit les éléments essentiels de la programmation du processeur de son numérique Creative Digital Sound Processor (DSP). La puce DSP gère les opérations d'entrée/sortie et MIDI du son numérisé. Vous devez lire attentivement ce chapitre pour vous assurer de bien comprendre les caractéristiques du DSP avant de procéder à la programmation du son numérisé ou des opérations MIDI.
Cette page couvre les sujets suivants :
- Adresses d'entrée/sortie du DSP
- Réinitialisation du DSP
- Lecture à partir du DSP
- Écriture dans le DSP
- Gestion des interruptions du DSP
Adresses d'entrée/sortie DSP
Le DSP est programmé via quatre adresses d'entrée/sortie sélectionnables sur les cartes Sound Blaster. La liste suivante répertorie les adresses d'entrée/sortie et leurs fonctionnalités. x représente les adresses d'entrée/sortie de base sélectionnables par cavalier.
Fonction | Port | Description |
---|---|---|
Reset | 2x6h (écriture seulement) | Utilisé pour réinitialiser le DSP à son état par défaut. |
Read Data | 2xAh (lecture seulement) | Utilisé pour accéder aux données DSP entrantes. |
Write Command/Data | 2xCh (écriture) | Utilisé pour envoyer des commandes ou des données au DSP. |
Write-Buffer Status | 2xCh (lecture) | Indique également si le DSP est prêt à accepter des commandes ou des données. |
Read-Buffer Status | 2xEh (lecture seulement) | Indique si des données entrantes sont disponibles pour la lecture. |
Réinitialisation du DSP
Le DSP doit être réinitialisé avant sa première programmation. La réinitialisation lui permet d'effectuer une initialisation et de revenir à son état par défaut. La réinitialisation du DSP s'effectue via le port de réinitialisation.
Après l'initialisation, le DSP renvoie un octet de données 0AAh au port de lecture des données. La procédure de réinitialisation du DSP est la suivante :
- Écrivez un «1» sur le port de réinitialisation (2x6h) et attendez 3 microsecondes.
- Écrivez un «0» sur le port de réinitialisation.
- Interrogez le port de lecture des données pour obtenir un octet prêt 0AAh. Vous devez vérifier le port Read-Buffer Status pour vous assurer qu'il y a des données avant de lire le port Read Data.
En règle générale, le DSP prend environ 100 microsecondes pour s'initialiser. Après cette période, si la valeur de retour n'est pas 0AAh ou s'il n'y a aucune donnée, il se peut que la carte Sound Blaster ne soit pas installée ou qu'une adresse d'entrée/sortie incorrecte soit utilisée. Vous devez quitter le processus de réinitialisation et déclarer une erreur.
Le fragment de code assembleur 8086 suivant montre le processus de réinitialisation du DSP :
- MOV DX,wSBCBaseAddx ; Adresse d'entrée/sortie de base SBC 2x0h
- ADD DL,6 ; Réinitialisation du port, 2x6h
- MOV AL,1 ; Écrire un 1 sur le port de réinitialisation DSP
- OUT DX,AL ;
- SUB AL,AL ; Boucle de retard
- Delay:
- DEC AL
- JNZ Delay
- OUT DX,AL ; Écrire un 0 sur le port de réinitialisation DSP
- SUB CX,CX ; Maximum de 65536 essais
- Empty:
- MOV DX,wSBCBaseAddx ; Adresse d'entrée/sortie de base SBC 2x0h
- ADD DL,0Eh ; Port d'état de lecture du tampon (Read-Buffer Status), 2xEh
- IN AL,DX ; Port d'état de lecture du tampon de lecture (Read Read-Buffer Status)
- OR AL,AL ; Données disponibles ?
- JNS NextAttempt ; Bit 7 effacé, réessayez
- SUB DL,4 ; Read Data port, 2xAh
- IN AL,DX ; Lire les données DSP entrantes
- CMP AL,0AAh ; Recevoir le code de réussite, 0AAh ?
- JE ResetOK ; SUCCÈS!
- NextAttempt:
- LOOP Empty ; Essayer à nouveau
- ;***
- ;*** Échec de la réinitialisation du DSP : Sound Blaster non détecté !
Lecture à partir du DSP
Lorsque des données DSP sont disponibles, elles peuvent être lues à partir du port de lecture des données.
Avant la lecture des données, le bit 7 du port d'état du tampon de lecture doit être vérifié pour s'assurer qu'il y a des données à lire. Si le bit 7 est 1, il y a des données à lire. Sinon, aucune donnée n'est disponible.
Le fragment de code assembleur suivant montre le processus de lecture des données à partir du DSP :
Écriture sur DSP
Les commandes et données DSP sont envoyées via le port de commande/données d'écriture.
Avant que les données ne soient écrites sur le DSP, le bit 7 du port d'état du tampon d'écriture doit être vérifié pour s'assurer que le tampon de commande/données DSP est vide. Si le bit 7 est 0, le tampon DSP est vide et prêt à recevoir des commandes ou des données. Sinon, aucune commande ou donnée ne doit être écrite sur le DSP.
Le fragment de code assembleur suivant montre le processus d'écriture d'un octet de commande ou de données sur le DSP :
- MOV DX,wSBCBaseAddx ; Adresse d'entrée/sortie de base SBC 2x0h
- ADD DL,0Ch ; Port Write-Buffer Status, 2xCh
- Busy:
- IN AL,DX ; Port Read Write-Buffer Status
- OR AL,AL ; Peut-on écrire sur DSP ?
- JS Busy ; Bit 7 défini, réessayez
- MOV AL,bData ; Obtenir la commande ou les données DSP
- OUT DX,AL ; Envoyer à DSP
Gestion des interruptions du DSP
Le DSP génère une interruption matérielle pour chacun des processus suivants :
- Mode DMA ADC
- Mode DMA DAC
- Mode interruption MIDI entrée
Une routine de service d'interruption (ISR) doit être configurée pour gérer les interruptions. Dans l'ISR, chaque interruption du DSP est reconnue en lisant une fois le port d'état de la mémoire tampon de lecture du DSP.
La reconnaissance des interruptions sur la version 4.xx du DSP est différente ; consultez la section suivante pour plus d'informations.
Partage des interruptions
Avec la version DSP 4.xx, quatre interruptions utilisent la même ligne de demande d'interruption (IRQ). Il s'agit des interruptions d'entrée/sortie audio numérisées en mode DMA 8 bits et 16 bits, du mode MIDI Sound Blaster (SB-MIDI) et du mode UART MIDI MPU-401.
Le registre d'état d'interruption, adressé comme registre 82h sur la carte des registres du mixeur, est utilisé par l'ISR pour déterminer si l'interruption lui est destinée ou à un autre ISR, auquel cas elle doit être enchaînée à la routine précédente.
La lecture du registre 82h s'effectue de la même manière que la lecture de n'importe quel autre registre du mixeur. L'octet lu à partir du registre 82h est interprété comme suit :
D7 | D6 | D5 | D4 | D3 | D2 | D1 | D0 |
---|---|---|---|---|---|---|---|
MPU-401 | Entrée/sortie audio numérisées en mode DMA 6 bits | Entrée/sortie audio numérisées en mode DMA 8 bits | |||||
SB-MIDI |
où les zones grisées désignent les bits réservés. Un bit est mis à 1 si l'interruption correspondante est déclenchée.
Pour envoyer un signal d'accusé de réception d'interruption au DSP, effectuez une lecture à partir de l'un des trois ports d'entrée/sortie avec :
- IN AL,DX
où le registre DX a été préchargé avec :
- 2xEh pour les entrées/sorties audio numérisées en mode DMA 8 bits ou SB-MIDI
- 2xFh pour les entrées/sorties audio numérisées en mode DMA 16 bits
- 3x0h pour MPU-401
Notez qu'il n'est pas possible de faire la distinction entre les entrées/sorties audio numérisées en mode DMA 8 bits et les interruptions SB-MIDI car ces deux processus partagent le même bit d'état d'interruption. Il est donc important d'éviter d'exécuter les deux processus en même temps. Pour rester rétrocompatible, l'acquittement des interruptions des entrées/sorties audio numérisées en mode DMA 8 bits et SB-MIDI s'effectue via le port Read-Buffer Status du DSP.
Le fragment de code assembleur suivant illustre la partie de gestion des interruptions dans un ISR d'entrée/sortie audio numérisé en mode DMA 16 bits :
- MOV DX,wSB16BaseAddx ; Adresse d'entrée/sortie de base SB16 2x0h
- ADD DL,4 ; Port d'adresse du registre du mélangeur 2x4h
- MOV AL,82h ; Index pour le registre d'état d'interruption
- OUT DX,AL
- INC DX ; Port de données du mixeur
- IN AL,DX ; Obtenir l'état d'interruption
- TEST AL,02h ; Interruption d'entrée/sortie sonore numérisée en mode DMA 16 bits ?
- JZ ChainPreviousISR ; Non, chaîne vers l'ISR précédent
- ;***
- ;*** 1). Exécutez vos instructions d'entrée/sortie audio numérisées DMA 16 bits
- ;*** 2). Reconnaître l'interruption DSP ; dans al,2xFh
- ;*** 3). Envoyer un EOI au contrôleur d'interruption programmable
- ;***
- JMP ExitISR
- ChainPreviousISR:
- ;***
- ;*** Chaîne vers l'ISR précédent
- ExitISR:
Configuration des paramètres DMA et d'interruption
Avec la version 4.xx du DSP, la ligne de demande d'interruption (IRQ) des canaux DMA est configurable par logiciel. Le registre de configuration d'interruption, adressé comme registre 80h sur la carte des registres du mixeur, est utilisé pour configurer ou déterminer la ligne de demande d'interruption. Le registre de configuration DMA, adressé comme registre 81h sur la carte des registres du mixeur, est utilisé pour configurer ou déterminer les canaux DMA.
La lecture et l'écriture des registres 80h et 81h s'effectuent de la même manière que la lecture et l'écriture de n'importe quel autre registre du mixeur.
L'octet du registre 80h est interprété comme suit :
D7 | D6 | D5 | D4 | D3 | D2 | D1 | D0 |
---|---|---|---|---|---|---|---|
IRQ10 | IRQ7 | IRQ5 | IRQ2 |
où les zones grisées indiquent les bits réservés.
Pour configurer le paramètre IRQ, définissez le bit d'interruption correspondant sur «1» pour sélectionner l'IRQ. Notez qu'un seul bit peut être activé à la fois.
L'octet du registre 81h est interprété comme suit :
D7 | D6 | D5 | D4 | D3 | D2 | D1 | D0 |
---|---|---|---|---|---|---|---|
DMA 7 | DMA 6 | DMA 5 | DMA 3 | DMA 1 | DMA 0 |
où les zones grisées indiquent les bits réservés.
Pour configurer les paramètres du canal DMA, définissez le bit d'interruption correspondant sur « 1 » pour sélectionner le canal DMA. Notez que seul un bit du canal DMA 16 bits (DMA5, DMA6 ou DMA7) peut être activé à la fois. Cela s'applique au canal DMA 8 bits (DMA0, DMA1 ou DMA3).
La version 4.xx du DSP prend également en charge le transfert de données audio numérisées 16 bits via le canal DMA 8 bits. Pour rendre cela possible, définissez tous les bits du canal DMA 16 bits sur « 0 » en ne laissant qu'un seul canal DMA 8 bits défini.
Notez que l'application ne doit pas écrire dans ces registres pour modifier les paramètres DMA et d'interruption car de nombreuses autres configurations système telles que l'environnement BLASTER et le fichier SYSTEM.INI de Windows doivent être mises à jour lors de la modification de ces registres. Ces registres ne doivent être modifiés que par un logiciel système tel que SBCONFIG.EXE fourni avec le paquet Sound Blaster 16.
Remarque : les registres 80h et 81h sont en lecture seule pour les cartes PnP.