LA SOURIS


Utilisation des interruptions souris


But du présent document :

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.


SOMMAIRE

I.Principe

II.C'est parti !

1.Fonction 0000h : Réinitialiser le driver de souris

2.Fonction 0001h : Afficher le curseur

3.Fonction 0002h : Masquer le curseur

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

5.Fonction 0004h : Déplacer le curseur

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

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

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

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

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

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

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

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

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

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

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

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

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

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

21.Fonction 001Ah : Régler la sensibilité de la souris

22.Fonction 001Bh : Lire la sensibilité de la souris

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

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

25.Fonction 0021h : Réinitialiser le driver souris

26.Fonction 0024h : Lire le type de la souris

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

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

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

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

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

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

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

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

35.Fonctions non répertoriées

III.Remerciements

I.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.

II.C'est parti !

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é

 BX = Nombre de boutons de la Souris

 AX = 0000h : erreur, aucun driver de souris n'est installé

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

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 01h (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é.

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 :

 Bit 0 : 1 = bouton gauche de la souris appuyé

 Bit 1 : 1 = bouton droit de la souris appuyé

 Bit 2 : 1 = bouton central de la souris appuyé

 Bits 3-15 : Aucune (0)

 CX = Position horizontale de la Souris

 DX = Position verticale de la souris

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 souris ne possède que deux boutons, les informations fournies sur le bouton central sont dépourvues de signification.

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

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 TP

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 :

 Bit 0 = 1 : bouton gauche de la souris appuyé

 Bit 1 = 1 : bouton droit de la souris appuyé

 Bit 2 = 1 : bouton central de la souris appuyé

 Bits 3-15 : Aucune signification (0)

 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.

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 :

 Bit 0 = 1 : bouton gauche de la souris appuyé

 Bit 1 = 1 : bouton droit de la souris appuyé

 Bit 2 = 1 : bouton central de la souris appuyé

 Bits 3-15 : Aucune signification (0)

 BX = Nombre de fois que le bouton de la souris a été relâché

 CX = Position horizontale de la souris la dernière fois que le bouton a été relâché

 DX = Position verticale de la souris la dernière fois que le bouton a été relâché

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é relâché est à nouveau fixé sur 0 lorsque cette fonction est appelée.

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.

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.

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

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 :

 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.

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

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.

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

 Bit 0 : La souris a été déplacée

 Bit 1: Bouton gauche de la souris appuyé

 Bit 2 : Bouton gauche de la souris relâché

 Bit 3 : Bouton droit de la souris appuyé

 Bit 4 : Bouton droit de la souris relâché

 Bit 5 : Bouton central de la souris appuyé

 Bit 6 : Bouton central de la souris relâché

 Bits 7-15 : Aucune signification

 ES:DX = Adresses de segment et d'offset du gestionnaire

Sortie :

 Aucune

Remarques :

 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 :

 Bit 0 : Bouton gauche de la souris a été appuyé

 Bit 1 : Bouton droit de la souris a été appuyé

 Bit 2 : Bouton central de la souris a été appuyé

 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.

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

 Bit 0 : La souris a été déplacée

 Bit 1: Bouton gauche de la souris appuyé

 Bit 2 : Bouton gauche de la souris relâché

 Bit 3 : Bouton droit de la souris appuyé

 Bit 4 : Bouton droit de la souris relâché

 Bit 5 : Bouton central de la souris appuyé

 Bit 6 : Bouton central de la souris relâché

 Bits 7-15 : Aucune signification

 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).

16.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

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

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

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

 Bit 0 : La souris a été déplacée

 Bit 1 : Bouton gauche de la souris appuyé

 Bit 2 : Bouton gauche de la souris relâché

 Bit 3 : Bouton droit de la souris appuyé

 Bit 4 : Bouton droit de la souris relâché

 Bit 5 : Touche Shift actionnée pendant qu'un bouton de la souris était appuyé ou relâché

 Bit 6 : Touche Ctrl actionnée pendant qu'un bouton de la souris était appuyé ou relâché

 Bit 7 : Touche Alt actionnée pendant qu'un bouton de la souris était appuyé ou relâché

 Bits 8-15 : Aucune signification

 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 :

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

 0 : Bouton gauche de la souris a été appuyé

 1 : Bouton droit de la souris a été appuyé

 2 : Bouton central de la souris a été appuyé

 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.

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 :

 Bit 0 : La souris a été déplacée

 Bit 1 : Bouton gauche de la souris appuyé

 Bit 2 : Bouton gauche de la souris relâché

 Bit 3 : Bouton droit de la souris appuyé

 Bit 4 : Bouton droit de la souris relâché

 Bit 5 : Touche Shift actionnée pendant qu'un bouton de la souris était appuyé ou relâché

 Bit 6 : Touche Ctrl actionnée pendant qu'un bouton de la souris était appuyé ou relâché

 Bit 7 : Touche Alt actionnée pendant qu'un bouton de la souris était appuyé ou relâché

 Bits 8-15 : Aucune signification

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

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).

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

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.

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

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.

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.

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 :

 Bit 15 : Type du driver

 0b = Le driver se trouve dans un fichier COM

 1b = Le driver est sauvegardé en tant qu'un driver de périphérique. Il a été inséré par un fichier CONFIG.SYS.

 Bits 12 & 13 : Informations sur le curseur de la souris

 00b = Affichage d'un curseur texte logiciel

 01b = Affichage d'un curseur texte électronique

 10b, 11b = Affichage d'un curseur graphique

 Bits 8 à 11 : Valeur binaire représentant la fréquence d'interruption de l'électronique de la souris

 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.

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.

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.

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

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

0 = Erreur

Remarques :

 Cette fonction représente le contraire de la fonction 21h qui ne réinitialise que les paramètres logiciels.

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 :

 Bit 2 = Bouton 4

 Bit 3 = Bouton 2

 Bit 4 = Bouton 3

 Bit 5 = Bouton 1

 Les autres bits contiennent la valeur 0.

 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 :

 Bit 2 = Bouton 4

 Bit 3 = Bouton 2

 Bit 4 = Bouton 3

 Bit 5 = Bouton 1

 Les autres bits contiennent la valeur 0.

 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.

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.

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

 Bit 15 = Fonction 25h

 Bit 14 = Fonction 26h

 Bit 13 = Fonction 27h

 Bit 12 = Fonction 28h

 Bit 11 = Fonction 29h

 Bit 10 = Fonction 2Ah

 Bit 9 = Fonction 2Bh

 Bit 8 = Fonction 2Ch

 Bit 7 = Fonction 2Dh

 Bit 6 = Fonction 2Eh

 Bit 5 = Fonction 2Fh

 Bit 4 = Fonction 30h

 Bit 3 = Fonction 31h

 Bit 1 = Fonction 32h

 Bit 0 = Fonction 33h

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


III.Remerciements

Document écrit par Antoche - Antoche@altern.org - #ICQ : 38 08 99 43

Libre reproduction et diffusion autorisée - modifications interdites sans autorisation de l'auteur.

Bibliographie :

Ce guide n'aurait pas pu être écrit sans quelque aide. Je remercie :

- La Bible du programmeur PC 5e édition (Micro application 1994)

Retour à la rubrique programmation.