Pour améliorer l’interface d’un grand nombre de programmes,
il vaut mieux utiliser la souris. Pour faciliter la gestion de la souris, nous
allons faire ensembles une unité de gestion de la souris.
Ce tutorial vous explique brièvement la manière d’accéder
aux registres, et aux interruptions dites ASM.
Pour gérer la souris, nous passons par l’intermédiaire
de l’interruption 33h.
Dès le départ, Microsoft a équipé sa souris d'une
interface logiciel implémentée sous la forme du driver de périphérique
MOUSE.SYS ou du programme MOUSE.COM. Cette interface est devenue par la suite
un standard adopté par tous les constructeurs de souris afin de garantir
une compatibilité totale avec la souris Microsoft.
II) Les interruptions
Pour utiliser notre souris, nous allons avoir besoin des passer par les interruptions
assembleur.
Pour cela, il va nous falloir un registre, une variable logique du processeur.
Ce registre, nous allons le déclarer comme cela : var regs : registers;
Nota : Le nom de la fonction est généralement passé par
le registre AX ( regs.ax ). Et surtout, il faudra faire un Uses Dos ; car Registers
est situé dans l'unité Dos. Pour information, voici une liste rapide des registres du processeur : AX : Accumulateur, sert à toutes les opérations
BX: Base, sert dans les opérations sur la mémoire
CX: Counter, sert notamment pour les compteurs
DX: Dat, sert pour les opérations mathématiques principalement
DS: Data segment, segment mémoire pour les données
ES: Extra segment, segment temporaire
SI: Source index, sert pour les opérations sur les chaînes de caractères
et les buffers.
DI: Destination index, comme SI
Pour appeler une interruption, sans rentrer dans l’ASM, il y a quelque
chose de très utile : Intr ($INT, regs ) ;
III) L’initialisation
Pour commencer de travailler avec la souris, il nous faut déjà
l’initialiser.
La fonction (AX) d’initialisation est le n° $00. L’interruption
de la souris est $33.
Nous allons donc ajouter cette fonction qui permet d’initialiser la souris.
La fonction renvoi TRUE si l’initialisation s’est bien passée
et FALSE pour le contraire.
IV) Afficher – masquer
le curseur
Maintenant que nous avons initialisé la souris, nous allons pouvoir
afficher le curseur à l’écran, et bien sur, le masquer.
Pour le moment, nous allons juste nous occuper du mode texte. La fonction d’affichage
du curseur est nommée $01.De plus, la fonction qui masque le curseur
est nommée $02. L’interruption de la souris est toujours $33 …
elle n’a toujours pas bougée, et ce depuis des années.
Nous allons donc ajouter, cette fois deux procédures à notre unité.
V) Positionnement et état
de la souris
Bien. Nous avons maintenant, initialisé la souris, et nous voyons sur
l’écran, lors de l’appel à Afficher, le curseur de
notre souris. Maintenant, nous devons lire l’état de la souris.
Tout se passera au travers de la fonction $03, toujours à partir de l’interruption
$33.
C’est maintenant là que les registres sont importants :
Après votre appel à partir de intr, le registre regs contiendra
les éléments suivants : Regs.CX -> Position horizontale de la Souris Regs.DX -> Position verticale de la souris Regs.BX -> Etat des boutons.
a) Position de la souris
Pour la position de la souris, ce sont les registres CX et DX.
Nota : 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.
Nota : Regs.CX correspond aux X et Regs.DX correspond aux Y
Nous allons donc ajouter a notre unité, 1 procedure :
b) Etat des boutons
Voici ce que contient le registre BX, et ce qu'il signifie.
Valeur de BX
Signification
0
bouton gauche de la souris appuyé
1
bouton droit de la souris appuyé
2
bouton central de la souris appuyé
3-15
Aucune (0)
Nota : sans le tableau, le résultat de la fonction ci-dessous est inutilisable.
Nous allons encore ajouter une fonction à notre unité. Cette fonction
renvoi la VALEUR DU BIT. Vous devrez donc utiliser le tableau ci-dessus pour
déchiffrer la valeur
VI) Fin de l’unité
Voila, maintenant, il ne vous reste plus qu’a indexer toutes les fonctions
et procédures dans la partie interface de l’unité, ou de
la télécharger en cliquant ici…
Ou même copier / coller le code ci dessous :