Warning: Declaration of MainMenu::Show($MaxLevel) should be compatible with MenuItem::Show($Level = 0) in /var/www/html/evasion/people/Antoine.Bouthors/common.php on line 156

Warning: Declaration of MainMenu::FindMe($Path, $Level) should be compatible with MenuItem::FindMe($Path) in /var/www/html/evasion/people/Antoine.Bouthors/common.php on line 167
Gérer la souris en assembleur sous DOS
 

Gérer la souris en assembleur sous DOS

Avant-propos

ATTENTION : Cet article est VIEUX ! Ils a été écrit en 1998 (ou peut-être même avant) pour un système d'exploitation défunt, nommé DOS. Pour les boulets qui essayent de faire de l'assembleur DOS sous Windows, si vous essayez d'utiliser ce qui est écrit dans cet article, si ca ne marche pas, c'est normal ! Pas besoin de m'envoyer un email. Si vous voulez que ça marche, soit repassez à DOS, soit utilisez les fonctions Windows, et pas les interruptions DOS.

Ici nous allons étudier comment utiliser la souris dans un programme DOS. L'utilisation de la souris est extrêmement simple et même un débutant n'aura aucun mal à s'en servir, car la gestion de la souris s'apparente quelque peu à celle du clavier.

Nous allons donc voir comment détecter les mouvements de la souris, les clics, mais aussi les trucs plus intéressant, comme la restriction de l'aire de déplacement, le déplacement du curseur par le programme lui-même, et même changer le curseur et le dessiner.

La seule contrainte ici est d'avoir un driver souris d'installé si on est sous DOS. Sous Windows, le driver est évidemment déjà présent.
 

1. Principe

Toutes les fonctions se rapportant à la souris sont appelées via l'interruption 33h. Le numéro de fonction est une valeur de 16 bits transmise par le registre AX.

La plupart des fonctions de souris travaillent avec les registres AX, BX, CX et DX pour traiter les informations provenant du programme d'appel et lui retourner les résultats nécessaires dans ces mêmes registres. Les registres ES, SI et DS ne s'avèrent utiles que dans des cas exceptionnels, notamment lorsqu'il s'agit de transmettre l'adresse des buffers.

En règle générale, l'appel d'une fonction a pour conséquence de changer le contenu du registre adressé pour retourner les résultats de la fonction. Le contenu des autres registres reste inchangé. Dans la plupart des fonctions, le registre AX sert cependant à retourner l'état de la fonction qui indique un échec de l'opération en cas d'erreur.

La version 8.0 du driver souris gère au total 53 fonctions (de 0000h à 0034h), en comptant les fonctions 0011h, 0012h et 002Eh qui ne sont pas documentées et ne s'utilisent qu'à l'intérieur du driver.

Les versions dont le numéro est inférieur à 6.26 ne peuvent être considérées ici car elles ne supportent pas les cartes graphiques modernes. De toute façon, ça m'étonnerait que vous ayez de telles versions car elles datent de l'âge de Neandertal.

Note : l'unité de déplacement de la souris est le mickey (parce que mickey mouse ! ah ah ah !). Non,non c'est vrai ! C'est vraiment ça ! 1 mickey équivaut à 1/200 de pouce.
 

2. C'est parti !

2.1 Fonction 0000h : Réinitialiser le driver de souris

Initialise le driver de souris et enclenche ainsi le test de la souris.
  • Entrée :
    • AX = 0000h
  • Sortie :
    • AX = FFFFh : dans ce cas, un driver de souris est installé
      AX = 0000h : erreur, aucun driver de souris n'est installé
    • BX = Nombre de boutons de la Souris
  • Remarques :
    • L'appel de cette fonction agit sur toute une série de paramètres de la souris qui peuvent être fixés à l'aide des différentes fonctions de la souris :
      • Le curseur de la souris est placé au centre de l'écran puis caché. Il apparaîtra désormais en mode graphique sous forme d'une flèche, alors qu'il sera représenté en mode de texte sous forme d'une case de texte en inversion vidéo. Le curseur de la souris est systématiquement affiché dans la page 0 de l'écran, indépendamment du mode. La zone de déplacement sélectionnée est la totalité de l'écran.
      • Les gestionnaires d'événements installés par un programme. Ils sont désactivés.
      • L'émulation du crayon optique est également désactivée.
      • La vitesse de la souris. Pour la vitesse horizontale de la souris, un rapport de 8 mickeys pour 8 points est défini. Pour la vitesse verticale, ce rapport est de 16 pour 8.
      • Le seuil de doublement de la vitesse de la souris. Il est fixé à 64 mickeys par seconde.
 

2.2 Fonction 0001h : Afficher le curseur

Après appel de cette fonction, le curseur de la souris devient visible sur l'écran et suit désormais les déplacements de la souris sur l'écran.
  • Entrée :
    • AX = 0001h
  • Sortie :
    • Aucune
  • Remarques :
    • L'appel de cette fonction entraîne l'incrémentation d'un compteur interne, en fonction duquel le curseur de la souris est ou non affiché sur l'écran. Si ce compteur contient la valeur 0, le curseur de la souris sera affiché sur l'écran, alors que la valeur -1 a pour effet de le faire disparaître de l'écran. Lorsque la fonction 00h (Reset) est appelée, ce compteur est tout d'abord fixé sur -1, pour prendre ensuite la valeur 0 lors du premier appel de cette fonction, ce qui se traduit par la réapparition du curseur sur l'écran.
    • Le driver de la souris suit les déplacements de la souris même si le curseur de la souris n'est pas affiché sur l'écran. A la suite de l'appel de cette fonction, le curseur de la souris ne réapparaîtra donc pas nécessairement au même endroit que là oł il se trouvait lorsqu'il avait été caché.
 

2.3 Fonction 0002h : Masquer le curseur

Cette fonction élimine le curseur de la souris de l'écran.
  • Entrée :
    • AX = 0002h
  • Sortie :
    • Aucune
  • Remarques :
    • L'appel de cette fonction entraîne la décrémentation d'un compteur interne, en fonction duquel le curseur de la souris est ou non affiché sur l'écran. Si ce compteur contient la valeur 0, le curseur de la souris sera affiché sur l'écran, alors que la valeur -1 a pour effet de le faire disparaître de l'écran.
    • Le driver de la souris suit les déplacements de la souris même après appel de cette fonction. A la suite de l'appel de la fonction 0001h (Afficher le curseur de la souris), le curseur de la souris ne réapparaîtra donc pas nécessairement au même endroit que là oł il se trouvait lorsqu'il avait été caché.
 

2.4 Fonction 0003h : Lire l'état de la souris

L'appel de cette fonction fournit la position actuelle de la souris et l'état des différents boutons de la souris. Elle permet de savoir si un bouton a été enfoncé, mais préférez cependant la fonction 0005h à celle-ci.
  • Entrée :
    • AX = 0003h
  • Sortie :
    • BX = Etat des boutons de la Souris
    • CX = Position horizontale de la Souris
    • DX = Position verticale de la souris
  • Remarques :
    • Structure de BX :

      Etat des boutons de la souris
      Bits Valeurs
      15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0  
                                     
                
        1 = bouton gauche de la souris appuyé
      0 = bouton gauche de la souris relâché
        1 = bouton droit de la souris appuyé
      0 = bouton droit de la souris relâché
        1 = bouton central de la souris appuyé
      0 = bouton central de la souris relâché
        0 (inutilisés)

    • Les ordonnées renvoyées dans les registres CX et DX ne se rapportent pas à l'écran physique mais aux positions en points écran dans l'écran virtuel de la souris.
    • Si la souris ne possède que deux boutons, les informations fournies sur le bouton central sont dépourvues de signification.
 

2.5 Fonction 0004h : Déplacer le curseur

Déplace le curseur de la souris vers une position déterminée de l'écran, à moins qu'il n'ait été caché avec la fonction 02h.
  • Entrée :
    • AX = 0004h
    • CX = Position horizontale de la Souris
    • DX = Position verticale de la souris
  • Sortie :
    • Aucune
  • Remarques :
    • Les ordonnées renvoyées dans les registres CX et DX ne se rapportent pas à l'écran physique mais aux positions en points écran dans l'écran virtuel de la souris.
    • Si la position spécifiée se situe en dehors de la zone de déplacement fixée avec les fonctions 07h et 08h, les coordonnées sont adaptées pour que le curseur de la souris ne sorte pas de cette zone.
    • Le curseur de la souris est bien déplacé vers la nouvelle position même s'il est caché, mais ce déplacement n'apparaîtra naturellement que lorsque le curseur sera à nouveau incrusté.
 

2.6 Fonction 0005h : Lire combien de fois un bouton a été enfoncé

Indique au programme d'appel combien de fois un bouton de la souris a été appuyé depuis le dernier appel de cette fonction et oł le curseur de la souris se trouvait la dernière fois que ce bouton avait été actionné. Cette fonction est très utile car elle s'apparente au KeyPressed de Turbo Pascal.
  • Entrée :
    • AX = 0005h
    • BX = Bouton de la souris appelé :
      • 0 = bouton gauche de la Souris
      • 1 = bouton droit de la Souris
      • 2 = bouton central de la souris
  • Sortie :
    • AX = Etat de tous les boutons de la souris (cf. 2.4)
    • BX = Nombre de fois que le bouton de la souris appelé a été actionné depuis le dernier appel de cette fonction
    • CX = Position horizontale de la souris la dernière fois que le bouton a été actionné
    • DX = Position verticale de la souris la dernière fois que le bouton a été actionné
  • Remarques :
    • Les ordonnées transmises dans les registres CX et DX ne se rapportent pas à l'écran physique mais aux positions en points écran dans l'écran virtuel de la souris.
    • Le compteur du nombre de fois que le bouton de la souris appelé a été appuyé est à nouveau fixé sur 0 lorsque cette fonction est appelée.
 

2.7 Fonction 0006h : Lire combien de fois un bouton a été relaché

Indique au programme d'appel combien de fois un bouton de la souris a été relâché depuis le dernier appel de cette fonction et oł figurait le curseur de la souris lors du dernier de ces événements.
  • Entrée :
    • AX = 0006h
    • BX = Bouton de la souris appelé :
      • 0 = bouton gauche de la Souris
      • 1 = bouton droit de la Souris
      • 2 = bouton central de la souris
  • Sortie :
    • AX = Etat de tous les boutons de la souris (cf. 2.4)
    • BX = Nombre de fois que le bouton de la souris appelé a été relaché depuis le dernier appel de cette fonction
    • CX = Position horizontale de la souris la dernière fois que le bouton a été relaché
    • DX = Position verticale de la souris la dernière fois que le bouton a été relaché
  • Remarques :
    • Les ordonnées transmises dans les registres CX et DX ne se rapportent pas à l'écran physique mais aux positions en points écran dans l'écran virtuel de la souris.
    • Le compteur du nombre de fois que le bouton de la souris relaché a été appuyé est à nouveau fixé sur 0 lorsque cette fonction est appelée.
 

2.8 Fonction 0007h : Définir la zone de déplacement horizontale

Définit la zone horizontale à l'intérieur de laquelle le curseur de la souris peut se déplacer. L'utilisateur n'aura aucune possibilité de faire sortir le curseur de la souris de la zone ainsi fixée.
  • Entrée :
    • AX = 0007h
    • CX = position horizontale minimale de la souris
    • DX = position horizontale maximale de la souris
  • Sortie :
    • Aucune
  • Remarques :
    • Les ordonnées transmises dans les registres CX et DX ne se rapportent pas à l'écran physique mais aux positions en points écran dans l'écran virtuel de la souris.
    • Si le curseur de la souris se trouve en dehors de la zone spécifiée, il y est automatiquement ramené par le driver de la souris.
    • Si la valeur spécifiée dans le registre DX est inférieure à celle dans CX, les deux paramètres sont échangés.
 

2.9 Fonction 0008h : Définir la zone de déplacement verticale

Définit la zone verticale à l'intérieur de laquelle le curseur de la souris peut se déplacer. L'utilisateur n'aura aucune possibilité de faire sortir le curseur de la souris de la zone ainsi fixée.
  • Entrée :
    • AX = 0008h
    • CX = position verticale minimale de la souris
    • DX = position verticale maximale de la souris
  • Sortie :
    • Aucune
  • Remarques :
    • Les ordonnées transmises dans les registres CX et DX ne se rapportent pas à l'écran physique mais aux positions en points écran dans l'écran virtuel de la souris.
    • Si le curseur de la souris se trouve en dehors de la zone spécifiée, il y est automatiquement ramené par le driver de la souris.
    • Si la valeur spécifiée dans le registre DX est inférieure à celle dans CX, les deux paramètres sont échangés.
 

2.10 Fonction 0009h : Définir le curseur de la souris en mode graphique

En mode graphique, un tableau de bits définit l'apparence du curseur de la souris, en fixant de quelle manière les points sous le curseur de la souris et les points du curseur de la souris doivent être combinés. Cette fonction sert à définir ce tableau de bits, et donc l'apparence du curseur de la souris.
  • Entrée :
    • AX = 0009h
    • BX = Distance du point de référence au bord gauche du tableau de bits
    • CX = Distance du point de référence au bord supérieur du tableau de bits
    • ES:DX = Adresses de segment et d'offset du tableau de bits dans la mémoire
  • Sortie :
    • Aucune
  • Remarques :
    • Le tableau comporte 64 octets et est divisé en deux tableaux de 32 octets (4 x 8): un tableau AND et un autre XOR
    • Pour bien comprendre cette fonction, il faut bien saisir les opérations booléennes :
      1 AND 1 = 1
      1 AND 0 = 0
      Tous les bits ont donc la valeur de ceux du fond : un tableau AND constitué uniquement de 1 aura donc une couleur transparente et ne recouvrera pas ce qu'il y a derrière
      0 AND 1 = 0
      0 AND 0 = 0
      Tous les bits valent 0 quelle que soit la valeur de ceux du fons : un tableau AND constitué uniquement de 0 aura donc une couleur blanche et recouvrera tout ce qu'il y a derrière
      1 XOR 1 = 0
      1 XOR 0 = 1
      Tous les bits ont donc la valeur opposée à celle des bits du fond : un tableau XOR constitué uniquement de 1 aura donc une couleur inverse à celle du fond
      0 XOR 1 = 1
      0 XOR 0 = 0
      Tous les bits ont donc la valeur de ceux du fond : un tableau XOR constitué uniquement de 0 aura donc une couleur transparente et ne recouvrera pas ce qu'il y a derrière
      Il y a donc 4 couleurs différentes : noir, blanc, inverse et transparent
      Pour essayer toutes les combinaisons possibles, essayez donc un curseur tel que celui-ci (sur un fond multicolore) :

      Curseur DD 000000000h
      DD 000000000h
      DD 0FFFFFFFFh
      DD 0FFFFFFFFh
      DD 000000000h
      DD 000000000h
      DD 0FFFFFFFFh
      DD 0FFFFFFFFh
      DD 000000000h
      DD 000000000h
      DD 000000000h
      DD 000000000h
      DD 0FFFFFFFFh
      DD 0FFFFFFFFh
      DD 0FFFFFFFFh
      DD 0FFFFFFFFh
 

2.11 Fonction 000Ah : Définir le curseur de la souris en mode texte

Fixe le motif de bits définissant l'apparence du curseur de la souris en mode de texte.
  • Entrée :
    • AX = 000Ah
    • BX = Type de curseur de la Souris :
      • 0 = curseur logiciel
      • 1 = curseur électronique
    • CX = Masque AND pour le curseur logiciel ou ligne de départ du curseur électronique
    • DX = Masque XOR pour le curseur logiciel ou ligne finale du curseur électronique
  • Sortie :
    • Aucune
  • Remarques :
    • Si le curseur logiciel est sélectionné, le code du caractère sous le curseur de la souris et l'octet d'attribut correspondant sont tout d'abord combiné par un AND binaire avec le masque dans le registre CX, avant qu'une combinaison XOR soit ensuite opérée avec la valeur dans le registre DX. L'octet d'attribut est combiné avec les octets de plus fort poids des deux valeurs (CH et DH), alors que le code de caractère est combiné avec les octets de plus faible poids (CL et DL).
    • Structure de l'octet d'attribut :

      Structure de l'octet d'attribut
      Bits Valeurs
      6 5 4 3 2 1 0  
                   
              
        Couleur du texte :
      0 = blanc
      1 = orange
      2 = magenta
      3 = rouge
      4 = cyan
      5 = vert
      6 = bleu
      7 = noir
        Couleur du fond :
      0 = noir
      1 = bleu
      2 = vert
      3 = cyan
      4 = rouge
      5 = magenta
      6 = orange
      7 = blanc
        1 = blink
      0 = non-blink

    • Le curseur électronique est le curseur clignotant de l'écran. Les lignes de départ et de fin doivent être comprises, en mode monochrome, entre 0 et 13, et en mode couleur, entre 0 et 7. 0 correspond à la ligne supérieure et 13 (ou 7) à la ligne inférieure.
 

2.12 Fonction 000Bh : Lire la distance de déplacement de la souris

Détermine la distance entre la position actuelle de la souris et la position de la souris lors du dernier appel de cette fonction.
  • Entrée :
    • AX = 000Bh
    • CX = position verticale minimale de la souris
    • DX = position verticale maximale de la souris
  • Sortie :
    • CX = Distance horizontale
    • DX = Distance verticale
  • Remarques :
    • Les valeurs doivent être interprétées comme des nombres signés, les valeurs positives indiquant un déplacement vers le bas ou la droite de l'écran, alors que les valeurs négatives indiquent un déplacement vers le haut ou la gauche de l'écran.
    • Les valeurs ne sont pas fournies en points mais en mickeys.
    • Si la valeur spécifiée dans le registre DX est inférieure à celle dans CX, les deux paramètres sont échangés.
 

2.13 Fonction 000Ch : Installer un gestionnaire d'évènements

Cette fonction permet à un programme d'installer un gestionnaire d'événements, qui sera appelé lorsque interviendra un événement déterminé concernant la souris. Cela évite de tout le temps tester l'état de la souris.
  • Entrée :
    • AX = 000Ch
    • CX = Evénements devant déclencher l'appel du gestionnaire d'événements (masque d'événements)
    • ES:DX = Adresses de segment et d'offset du gestionnaire
  • Sortie :
    • Aucune
  • Remarques :
    • Structure de CX :

      Masque d'évènements
      Bits Valeurs
      15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0  
                                     
                        
        La souris a été déplacée
        Bouton gauche de la souris appuyé
        Bouton gauche de la souris relâché
        Bouton droit de la souris appuyé
        Bouton droit de la souris relâché
        Bouton central de la souris appuyé
        Bouton central de la souris relâché
        Aucune signification

    • Le gestionnaire d'événements est appelé par le driver de la souris à travers une instruction assembleur FAR CALL et il doit donc de ce fait se terminer également par une instruction FAR RETurn. Comme pour un gestionnaire d'interruption, aucun des registres du processeur ne doit être restitué à l'utilisateur avec un contenu modifié.
    • Le driver de la souris fournit les informations suivantes au gestionnaire d'événements lorsqu'il est appelé :
      • AX = Masque d'événements. Les différents bits correspondent aux différents événements tels qu'ils ont été indiqués dans le registre CX lors de l'installation du gestionnaire d'événements. D'autres bits peuvent également être fixés car cette valeur reflète l'état actuel du driver de la souris, sans se limiter aux événements sélectionnés.
      • BX = Etat des boutons de la Souris (cf. 2.4)
      • CX = Position horizontale de la souris.
      • DX = Position verticale de la souris.
      • SI = Longueur du dernier déplacement horizontal de la souris.
      • DI = Longueur du dernier déplacement vertical de la souris.
      • DS = Segment de données du driver de la souris
    • Les ordonnées transmises dans les registres CX et DX ne se rapportent pas à l'écran physique mais aux positions en points écran dans l'écran virtuel de la souris.
    • Les distances spécifiées dans les registres SI et DI ne sont pas exprimées en points écran, mais en mickeys (1/200ème de pouce). Les valeurs transmises doivent être interprétées comme des nombres signés, les valeurs négatives indiquant un déplacement vers le haut ou la gauche de l'écran, alors que les valeurs positives indiquent un déplacement vers le bas ou la droite de l'écran.
 

2.14 Fonction 0014h : Remplacer le gestionnaire d'évènements

Cette fonction permet à un programme d'installer un nouveau gestionnaire d'événements pour certains événements souris déterminés, tout en obtenant en même temps l'adresse de l'ancien gestionnaire d'événements.
  • Entrée :
    • AX = 0014h
    • CX = Evénements devant déclencher l'appel du gestionnaire d'événements (masque d'événements, cf. 2.13)
    • ES:DX = Adresses de segment et d'offset du gestionnaire
  • Sortie :
    • CX = Masque d'événements du gestionnaire d'événements installé jusqu'ici
    • ES:DX = Adresses de segment et d'offset du gestionnaire d'événements installé jusqu'ici
  • Remarques :
    • Les informations nécessaires sur l'appel du gestionnaire d'événements sont fournies dans la description de la fonction 0Ch (Installer le gestionnaire d'événements).
 

2.15 Fonction 0015h : Lire la taille du buffer d'état de la souris

Cette fonction fournit la taille du buffer d'état de la souris dans lequel un programme peut sauvegarder l'état complet du driver de la souris.
  • Entrée :
    • AX = 0015h
  • Sortie :
    • BX = Taille du buffer d'état de la souris en octets
  • Remarques :
    • Cette fonction sert à l'appel de la fonction 16h.
 

2.17 Fonction 0016h : Sauvegarder l'état de la souris

Lorsque cette fonction est appelée, le driver de la souris copie toutes les informations d'état gérées dans un buffer du programme d'appel.
  • Entrée :
    • AX = 0016h
    • ES:DX = Adresses de segment et d'offset du buffer
  • Sortie :
    • Aucune
  • Remarques :
    • L'appel de cette fonction peut par exemple être utile avant de faire exécuter un programme à l'aide de la fonction EXEC, pour que tous les paramètres de la souris puissent être à nouveau fixés sur leurs valeurs antérieures après exécution de ce programme, quelles que soient les modifications intervenues à l'intérieur du programme appelé.
    • N'oubliez pas de réserver suffisamment d'espace en utilisant la fonction 15h.
 

2.18 Fonction 0017h : Restaurer l'état de la souris

Lit tous les paramètres de la souris dans un buffer dans lequel ils avaient été sauvegardés auparavant avec la fonction 16h.
  • Entrée :
    • AX = 0017h
    • ES:DX = Adresses de segment et d'offset du buffer
  • Sortie :
    • Aucune
  • Remarques :
    • Aucune
 

2.19. Fonction 0018h : Installer un gestionnaire d'évènements alternatif

Cette fonction permet à un programme d'installer au maximum trois gestionnaires d'événements différents, qui devront être appelés par le driver de la souris lorsque interviendront certains événements liés à la souris et au clavier.
  • Entrée :
    • AX = 0018h
    • CX = Evénements devant entraîner l'appel du gestionnaire d'événements
    • ES:DX = Adresses de segment et d'offset du gestionnaire
  • Sortie :
    • AX = 0018h : Le gestionnaire d'événements a été installé
      AX = 0FFFFh : Le gestionnaire d'événements n'a pu être installé
  • Remarques :
    • Structure de CX :

      Masque d'évènements
      Bits Valeurs
      15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0  
                                     
                          
        La souris a été déplacée
        Bouton gauche de la souris appuyé
        Bouton gauche de la souris relâché
        Bouton droit de la souris appuyé
        Bouton droit de la souris relâché
        Touche Shift actionnée pendant qu'un bouton de la souris était appuyé ou relâché
        Touche Ctrl actionnée pendant qu'un bouton de la souris était appuyé ou relâché
        Touche Alt actionnée pendant qu'un bouton de la souris était appuyé ou relâché
        Aucune signification

    • Dans le masque d'événements du registre CX doit être fixé au moins l'un des bits 5 à 7 pour que l'événement soit combiné au fait d'actionner au moins une touche de contrôle. Si les touches de contrôle ne doivent pas être prises en compte, il est préférable d'utiliser les fonctions 0Ch ou 14h.
    • Une erreur peut se produire si trois gestionnaires d'événements alternatifs ont déjà été installés ou bien si un gestionnaire d'événements a déjà été enregistré avec la même masque d'événements.
    • Le gestionnaire d'événements est appelé par le driver de la souris à travers une instruction assembleur FAR CALL et il doit donc de ce fait se terminer également par une instruction FAR RET. Comme pour un gestionnaire d'interruption, aucun des registres du processeur ne doit être restitué à l'utilisateur avec un contenu modifié.
    • Le driver de la souris fournit les informations suivantes au gestionnaire d'événements lorsqu'il est appelé :
      • AX = Masque d'événements. Les différents bits correspondent aux différents événements tels qu'ils ont été indiqués dans le registre CX lors de l'installation du gestionnaire d'événements (Voir 2.13). D'autres bits peuvent également être fixés car cette valeur reflète l'état actuel du driver de la souris, sans se limiter aux événements sélectionnés.
      • BX = Etat des boutons de la Souris (cf. 2.13)
      • CX = Position horizontale de la souris.
      • DX = Position verticale de la souris.
      • SI = Longueur du dernier déplacement horizontal de la souris.
      • DI = Longueur du dernier déplacement vertical de la souris.
      • DS = Segment de données du driver de la souris
    • Les ordonnées transmises dans les registres CX et DX ne se rapportent pas à l'écran physique mais aux positions en points écran dans l'écran virtuel de la souris.
    • Les distances spécifiées dans les registres SI et DI ne sont pas exprimées en points écran, mais en mickeys (1/200ème de pouce). Les valeurs transmises doivent être interprétées comme des nombres signés, les valeurs négatives indiquant un déplacement vers le haut ou la gauche de l'écran, alors que les valeurs positives indiquent un déplacement vers le bas ou la droite de l'écran.
 

2.20 Fonction 0019h : Lire l'addresse d'un gestionnaire d'évènements alternatif

Renvoie au programme d'appel l'adresse d'un gestionnaire d'événements alternatif.
  • Entrée :
    • AX = 0019h
    • CX = Masque d'événements du gestionnaire d'événements appelé
  • Sortie :
    • AX = 0000h : OK, dans ce cas :
    • CX = Masque d'événements (cf. 2.19)
    • ES:DX = Adresses de segment et d'offset du gestionnaire
  • Remarques :
    • L'appel de fonction échoue si aucune gestionnaire d'événements alternatif n'a encore été installé avec le masque d'événements spécifié.
 

2.21 Fonction 001Ah : Régler la sensibilité de la souris

Cette fonction est une combinaison des fonctions 0Fh et 13h, qui permettent respectivement de fixer le rapport entre déplacement de la souris et déplacement du curseur de la souris, d'une part, et de fixer le seuil de doublement de la vitesse de la souris, d'autre part.
  • Entrée :
    • AX = 001Ah
    • BX = Nombre de mickeys représentant huit points horizontalement
    • CX = Nombre de mickeys représentant huit points verticalement
    • DX = Seuil pour le doublement de la vitesse de la souris
  • Sortie :
    • Aucune
  • Remarques :
    • Les valeurs de BX et CX peuvent être spécifiées des valeurs comprises entre 1 et 32767.
    • Le réglage par défaut est de 8 mickeys horizontalement et de 16 mickeys verticalement, de sorte que le curseur de la souris se déplace deux fois plus "vite" horizontalement que verticalement.
    • Pour empêcher tout doublement de la vitesse de la souris, il suffit de fixer le seuil suffisamment haut. Des vitesses de 5000 mickeys par seconde ne peuvent, par exemple, déjà plus être atteintes en pratique.
    • Les valeurs par défaut peuvent être à nouveau fixées en appelant la fonction 00h (Réinitialisation du driver de la souris).
 

2.22 Fonction 001Bh : Lire la sensibilité de la souris

Renvoie les paramètres qui ont été fixés à travers la fonction 1Ah ou à travers les fonctions 0Fh et 13h.
  • Entrée :
    • AX = 001Bh
  • Sortie :
    • BX = Nombre de mickeys représentant huit points horizontalement
    • CX = Nombre de mickeys représentant huit points verticalement
    • DX = Seuil pour le doublement de la vitesse de la souris
  • Remarques :
 

2.23 Fonction 001Dh : Définir une page écran pour le curseur

Fixe la page écran dans laquelle le driver de la souris doit afficher le curseur de la souris.
  • Entrée :
    • AX = 001Dh
    • BX = Numéro de la page écran
  • Sortie :
    • Aucune
  • Remarques :
    • La valeur par défaut est la page écran 0.
    • L'appel de cette fonction ne présente naturellement d'intérêt que si votre programme travaille avec plusieurs pages écran, telles qu'elles sont offertes par les cartes CGA, EGA et VGA.
 

2.24 Fonction 001Eh : Lire la page écran dans laquelle se trouve le curseur

Détermine la page écran dans laquelle le curseur de la souris est représenté par le driver de la souris.
  • Entrée :
    • AX = 001Eh
  • Sortie :
    • BX = Numéro de la page écran
  • Remarques :
 

2.25 Fonction 0021h : Réinitialiser le driver souris

Cette fonction effectue une réinitialisation du driver de la souris, en cachant le curseur de la souris et en désactivant les gestionnaires d'événements déjà installés.
  • Entrée :
    • AX = 0021h
  • Sortie :
    • AX = FFFFh : Erreur
      AX = 0021h :Tout va bien, dans ce cas :
    • BX = nombre de boutons
  • Remarques :
    • Cette fonction, contrairement à la fonction 00h ne réinitialise pas le hardware de la souris.
 

2.26 Fonction 0024h : Lire le type de la souris

Fournit le type de souris ainsi que son numéro de version.
  • Entrée :
    • AX = 0024h
  • Sortie :
    • BH = Partie entière du numéro de version
    • BL = Partie décimale du numéro de version
    • CH = Type de souris :
      • 1 = Souris bus
      • 2 = Souris série
      • 3 = Souris InPort
      • 4 = Souris PS/2
      • 5 = Souris HP
    • CL = Numéro IRQ :
      • 0 = PS/2
      • 2, 3, 4, 5 ou 7 = Numéro PC
  • Remarques :
    • Un driver de souris de version 6.24 aura 6 dans le registre BH et 24h dans le registre BL.
 

2.27 Fonction 0025h : Lire les informations générales (version du driver > 6.26)

Cette fonction retourne des informations générales sur le driver de souris, par exemple le type du driver et l'état du curseur de la souris.
  • Entrée :
    • AX = 0025h
  • Sortie :
    • AX = Informations générales (voir plus bas)
    • BX, CX, DX = Informations d'état concernant OS/2 uniquement
  • Remarques :
    • Les informations générales sont transmises dans les divers tableaux de bits du registre AX. Il reproduit les informations suivantes :

      Informations générales
      Bits Valeurs
      15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0  
                                     
                  
        Inutilisés
        Valeur binaire représentant la fréquence d'interruption de l'électronique de la souris
        Informations sur le curseur de la souris :
      00 = Affichage d'un curseur texte logiciel
      01 = Affichage d'un curseur texte électronique
      10 = 11 = Affichage d'un curseur graphique
        Inutilisé
        Type du driver :
      0 = Le driver se trouve dans un fichier COM
      1 = Le driver est sauvegardé en tant qu'un driver de périphérique. Il a été inséré par un fichier CONFIG.SYS.

    • Les arguments obtenus dans les registres BX, CX et DX ne sont retournés que par un driver de souris sous OS/2. Ils ne jouent aucun rôle dans la programmation DOS.
 

2.28 Fonction 0026h : Lire l'extension de l'écran souris virtuel (version du driver > 6.26)

Cette fonction retourne l'extension absolue de l'écran de souris virtuel et indique si le driver de souris est actuellement activé ou désactivé.
  • Entrée :
    • AX = 0026h
  • Sortie :
    • BX = Etat du driver de souris
    • CX = Ordonnée X maximale
    • DX = Ordonnée Y maximale
  • Remarques :
    • En ce qui concerne l'état du driver de souris, 0 représente l'état désactivé et les autres valeurs l'état activé. Cet état peut être modifié à l'aide des fonctions 1Fh et 20h.
    • Les valeurs retournées dans les registres CX et DX concernent la taille absolue de l'écran de souris virtuel et non les valeurs spécifiées à l'aide des fonctions 07h et 08h. Elles peuvent être obtenues au moyen de la fonction 31h.
 

2.29 Fonction 0027h : Lire les masques de bits du curseur (version du driver > 7.01)

Cette fonction permet de prendre connaissance des masques de bits en cours pour la création du curseur logiciel ou pour la ligne de départ et la ligne finale du curseur électronique. En outre, cette fonction donne des informations sur le déplacement de la souris depuis sa dernière utilisation.
  • Entrée :
    • AX = 0027h
  • Sortie :
    • AX = Masque AND du curseur logiciel ou ligne de départ du curseur électronique
    • BX = Masque XOR du curseur logiciel ou ligne finale du curseur électronique
    • CX = Longueur du déplacement horizontal en mickeys
    • DX = Longueur du déplacement vertical en mickeys
  • Remarques :
    • Si un curseur électronique se trouve activé au moment de l'appel de la fonction, celle-ci retourne la ligne de départ et la ligne finale (en lignes Scan). Au contraire, si le curseur logiciel est actif, la fonction retourne les masques de bits en cours.
    • Bien que cette fonction soit reconnue depuis la version 7.01 du driver de souris, les informations concernant les lignes de départ et finales du curseur électronique ne sont transmises qu'à partir de la version 7.02. Cela élimine un risque d'erreur dans la version 7.01 qui ne fonctionne librement qu'avec le curseur logiciel.
    • Les distances de déplacement retournées dans les registres CX et DX ne sont pas modifiées à cause des différents paramètres logiciels tels que le seuil du doublement de la vitesse de la souris ou la table d'accélération. Elles représentent donc les valeurs transmises directement au driver de souris par le hard.
 

2.30 Fonction 002Ah : Lire les infos du curseur (version du driver > 7.02)

Cette fonction retourne diverses informations concernant le curseur et l'électronique de la souris.
  • Entrée :
    • AX = 002Ah
  • Sortie :
    • AX = Compteur de curseur interne
    • BX = Ordonnée X du Hot-Spot
    • CX = Ordonnée Y du Hot-Spot
    • DX = Type de souris
  • Remarques :
    • Le compteur de souris interne indique si le curseur est actuellement visible ou non. Vous pouvez agir indirectement sur lui en appelant les fonctions 01h et 02h. La valeur 0 signale alors que le curseur de souris est pour l'instant invisible. Toute autre valeur indique que le curseur de souris se trouve sur l'écran.
    • En ce qui concerne le curseur graphique, le Hot-Spot reproduit le point à l'intérieur du masque de bits du curseur retourné à la suite d'une demande de sa position. Pour exprimer sa suppression du coin supérieur gauche du masque de bits, une valeur positive signée comprise entre -128 et 127 est retournée dans les registres BX ou CX.
    • Dans le registre DX, la fonction retourne un code de type selon la table suivante :
      • 0 = pas de souris
      • 1 = souris bus
      • 2 = souris série
      • 3 = souris InPort
      • 4 = souris PS/2
      • 5 = souris HP
 

2.31 Fonction 002Fh : Réinitialiser le hardware de la souris (version du driver > 7.02)

Cette fonction réinitialise l'électronique de la souris sans agir sur les paramètres logiciels tels que le masque de bits du curseur de la souris, le seuil du doublement de la vitesse de la souris ou les courbes d'accélération.
  • Entrée :
    • AX = 002Fh
  • Sortie :
    • AX = FFFFh : Tout va bien
      AX = 0000h : Erreur
  • Remarques :
    • Cette fonction représente le contraire de la fonction 21h qui ne réinitialise que les paramètres logiciels.
 

2.32 Fonction 0030h : Définir/Obtenir les paramètres de la souris Ballpoint (version du driver > 7.04)

Cette fonction est conçue spécialement pour les besoins de la souris Ballpoint. Elle permet de définir ou lire les paramètres spécifiques à cette souris. Il s'agit notamment de connaître l'orientation de la souris Ballpoint et les trois boutons considérés comme activés parmi les quatre qui sont disponibles.
  • Entrée :
    • AX = 0030h
    • BX = Angle de rotation
    • CX = Code de commande
  • Sortie :
    • AX = Etat de la fonction
    • BX = Angle de rotation
    • CX = Boutons activés
  • Remarques :
    • Après appel de la fonction, il faut obligatoirement vérifier l'état dans le registre AX. La valeur -1 indique en effet qu'aucune souris Ballpoint n'est installée. Toute autre valeur signale en revanche l'existence d'une souris Ballpoint et reproduit l'état des divers boutons de la souris. Les différents boutons sont représentés par les bits suivants à l'intérieur du registre AX :

      Etat des boutons de la souris BallPoint
      Bits Valeurs
      7 6 5 4 3 2 1 0  
                     
                    
        0 (inutilisés)
        Bouton 4
        Bouton 2
        Bouton 3
        Bouton 1
        0 (inutilisés)

    • Si cette fonction est utilisée pour demander l'angle de rotation en cours et les boutons activés, il faut préalablement charger le registre CX avec la valeur 0 avant l'appel. Un angle de rotation en BX ne s'avère alors pas indispensable. Comme résultat de la fonction, on obtient l'angle de rotation en BX avec une valeur comprise entre 0 et 360 (degrés). En outre, les deux boutons activés peuvent être lus dans l'octet de poids fort de CX alors que les boutons désactivés sont codifiés dans l'octet de poids faible de ce registre. A l'intérieur des deux octets, les bits suivants sont disponibles pour les différents boutons :

      Etat des boutons de la souris BallPoint
      Bits Valeurs
      7 6 5 4 3 2 1 0  
                     
                    
        0 (inutilisés)
        Bouton 4
        Bouton 2
        Bouton 3
        Bouton 1
        0 (inutilisés)

    • Si l'angle de rotation actuel de la souris Ballpoint est communiqué au driver de souris à l'aide de cette fonction et les deux boutons activés sont sélectionnés, les boutons activés et désactivés sont alors à codifier en CX. La codification s'effectue selon le même principe que le renvoi des boutons activés ou désactivés à la suite d'un appel (voir plus haut). Comme angle de rotation, la fonction attend une valeur comprise entre 0 et 360 en BX.
 

2.33 Fonction 0031h : Lire l'étirement de l'écran virtuel (version du driver > 7.05)

Cette fonction offre à un programme la possibilité de demander l'étirement de l'écran de souris virtuel dans le mode vidéo actuel.
  • Entrée :
    • AX = 0031h
  • Sortie :
    • AX = Ordonnée X minimale
    • BX = Ordonnée Y minimale
    • CX = Ordonnée X maximale
    • DX = Ordonnée Y maximale
  • Remarques :
    • La taille de l'écran de souris virtuel peut également être modifiée par les fonctions 07h et 08h qui réduisent le champ de déplacement du curseur.
 

2.34 Fonction 0032h : Connaître les fonctions disponibles (version du driver > 7.05)

Cette fonction permet tout simplement de connaître toutes les fonctions reconnues depuis la fonction 25h.
  • Entrée :
    • AX = 0032h
  • Sortie :
    • AX = Fonctions reconnues
  • Remarques :
    • Le résultat de la fonction retourné en AX doit être considéré comme un tableau de bits oł chaque bit représente une fonction. S'il est réglé, cela signifie que la fonction est reconnue. Le bit 15 représente la fonction 25h, le bit 14 la fonction 26h, le bit 13 la fonction 27h, etc. :

      Fonctions disponibles
      Bits Valeurs
      15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0  
                                     
                                        
        Fonction 34h
        Fonction 33h
        Fonction 32h
        Fonction 31h
        Fonction 30h
        Fonction 2Fh
        Fonction 2Eh
        Fonction 2Dh
        Fonction 2Ch
        Fonction 2Bh
        Fonction 2Ah
        Fonction 29h
        Fonction 28h
        Fonction 27h
        Fonction 26h
        Fonction 25h
 

2.35 Fonctions non répertoriées

J'ai volontairement supprimé quelques fonctions que je trouvais inutiles, ou du moins qui n'avaient pas d'intérêt dans la conception d'un jeu ou d'un programme normal (et puis c'est déjà assez chiant de se taper toutes les autres). Cependant, si certaines vous intéressent, mailez-moi et je les rajouterai. Ces fonctions sont les suivantes :
  • 0Dh : Active l'émulation du crayon optique (intéressant uniquement avec un crayon optique)
  • 0Eh : Désactive l'émulation du crayon optique
  • 0Fh : Définir le rapport entre les mickeys et les points (inclus dans la fonction 1Ah)
  • 10h : Définir la zone d'exclusion (cache le curseur lorsqu'il se trouve dans une zone définie)
  • 11h : Fonction interne au driver
  • 12h : Fonction interne au driver
  • 13h : Définir le seuil de doublement de la souris (ne marche pas avec tous les drivers et est inclus dans la fonction 1Ah)
  • 1Ch : Définir la fréquence d'int de la souris (ne marche qu'avec une souris InPort)
  • 1Fh : Désactiver le driver de souris (sert à rien)
  • 20h : Activer le driver de souris (idem)
  • 22h : Choisir la langue étrangères pour les message d'erreur (qq'un peut-il me dire à quoi ça sert, étant donné qu'aucun message d'erreur n'est jamais renvoyé ?)
  • 23h : Liste des langues étrangères disponibles
  • 28h : Définir le mode vidéo (utiliser plutôt l'int 10h)
  • 29h : Lire les modes vidéos supportés par la carte vidéo (idem)
  • 2Bh : Lire les courbes d'accélération (sert à rien)
  • 2Ch : Lire la courbe d'accélération en cours (sert à rien)
  • 2Dh : Définir/Lire la courbe d'accélération (sert à rien)
  • 2Eh : Fonction interne au driver
  • 33h : Lire le buffer (sert à rien puisqu'on ne connaît pas la structure du buffer)
  • 34h : Lire l'emplacement du fichier MOUSE.INI
 

3. Remerciements

Ce guide n'aurait pas pu être écrit sans quelque aide. Je remercie La Bible du programmeur PC 5e édition (Micro application 1994)

Antoche