Section courante

A propos

Section administrative du site

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

  1. Écrivez un «1» sur le port de réinitialisation (2x6h) et attendez 3 microsecondes.
  2. Écrivez un «0» sur le port de réinitialisation.
  3. 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 :

  1.   MOV DX,wSBCBaseAddx ; Adresse d'entrée/sortie de base SBC 2x0h
  2.   ADD DL,6            ; Réinitialisation du port, 2x6h
  3.   MOV AL,1            ; Écrire un 1 sur le port de réinitialisation DSP
  4.   OUT DX,AL           ;
  5.   SUB AL,AL           ; Boucle de retard
  6. Delay:
  7.   DEC AL
  8.   JNZ Delay
  9.   OUT DX,AL           ; Écrire un 0 sur le port de réinitialisation DSP
  10.   SUB CX,CX           ; Maximum de 65536 essais
  11. Empty:
  12.   MOV DX,wSBCBaseAddx ; Adresse d'entrée/sortie de base SBC 2x0h
  13.   ADD DL,0Eh          ; Port d'état de lecture du tampon (Read-Buffer Status), 2xEh
  14.   IN AL,DX            ; Port d'état de lecture du tampon de lecture (Read Read-Buffer Status)
  15.   OR AL,AL            ; Données disponibles ?
  16.   JNS NextAttempt     ; Bit 7 effacé, réessayez
  17.   SUB DL,4            ; Read Data port, 2xAh
  18.   IN AL,DX            ; Lire les données DSP entrantes
  19.   CMP AL,0AAh         ; Recevoir le code de réussite, 0AAh ?
  20.   JE ResetOK          ; SUCCÈS!
  21. NextAttempt:
  22.   LOOP Empty          ; Essayer à nouveau
  23.   ;***
  24.   ;*** É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 :

  1.   MOV DX,wSBCBaseAddx ; Adresse d'entrée/sortie de base SBC 2x0h
  2.   ADD DL,0Eh          ; Port Read-Buffer Status, 2xEh
  3. Busy: 
  4.   IN AL,DX            ; Vérifier les données entrantes
  5.   OR AL,AL            ; Données disponibles ?
  6.   JNS Busy            ; Bit 7 effacé, réessayez
  7.   SUB DL,4            ; Port Read Data, 2xAh
  8.   IN AL,DX            ; Lire les données DSP entrantes

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

  1.   MOV DX,wSBCBaseAddx ; Adresse d'entrée/sortie de base SBC 2x0h
  2.   ADD DL,0Ch          ; Port Write-Buffer Status, 2xCh
  3. Busy: 
  4.   IN AL,DX            ; Port Read Write-Buffer Status
  5.   OR AL,AL            ; Peut-on écrire sur DSP ?
  6.   JS Busy             ; Bit 7 défini, réessayez
  7.   MOV AL,bData        ; Obtenir la commande ou les données DSP
  8.   OUT DX,AL           ; Envoyer à DSP

Gestion des interruptions du DSP

Le DSP génère une interruption matérielle pour chacun des processus suivants :

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 :

  1. IN AL,DX

où le registre DX a été préchargé avec :

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 :

  1.   MOV DX,wSB16BaseAddx ; Adresse d'entrée/sortie de base SB16 2x0h
  2.   ADD DL,4             ; Port d'adresse du registre du mélangeur 2x4h
  3.   MOV AL,82h           ; Index pour le registre d'état d'interruption
  4.   OUT DX,AL
  5.   INC DX               ; Port de données du mixeur
  6.   IN AL,DX             ; Obtenir l'état d'interruption
  7.   TEST AL,02h          ; Interruption d'entrée/sortie sonore numérisée en mode DMA 16 bits ?
  8.   JZ  ChainPreviousISR ; Non, chaîne vers l'ISR précédent
  9.    ;***
  10.    ;*** 1). Exécutez vos instructions d'entrée/sortie audio numérisées DMA 16 bits
  11.    ;*** 2). Reconnaître l'interruption DSP ; dans al,2xFh
  12.    ;*** 3). Envoyer un EOI au contrôleur d'interruption programmable
  13.    ;***
  14.   JMP ExitISR
  15. ChainPreviousISR:
  16.    ;***
  17.    ;*** Chaîne vers l'ISR précédent
  18. 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.



Dernière mise à jour : Dimanche, le 15 septembre 2024