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