Sommaire
- Introduction
- Programmation de la souris PS/2.
- Programmation de la souris Série.
- Programmation par pilote de souris.
Introduction
Actuellement, la souris peut-être programmer de trois façons différentes, par la méthode compatible PS/2 utilisant l'Interruption 15h, la programmation directe par le porte série et afin le plus répandu, la technique la plus simple, utilisant un pilote souris, c'est-à-dire la programmation par l'interruption 33h.
Ces trois méthodes comporte des avantages et des désavantages, ainsi on peut écrire des routines plus petite avec le pilote souris de l'Interruption 33h, cependant il n'est pas toujours charger en mémoire et donc non disponible par exemple sur les vieux DOS. La technique de programmation compatible PS/2 est largement répandu à partir des Pentium, mais avant ceux-ci, on les retrouve difficilement et de ce fait, il ne support pas les anciens modèles d'ordinateur. Enfin la technique de programmation par port série fonctionne sur les vieux modèle et s'en va progressivement en voie d'instinction...
Programmation de la souris PS/2
Cette technique ne fonctionne correctement quand dans un système d'exploitation DOS et risque de mal fonctionner ou carrément pas du tout si vous l'essayer sous un système d'exploitation Windows 9X, OS/2 ou Linux en mode d'émulation DOS. Dans le cas d'une application comme le MonsterBook par exemple, elle est lancer seulement si le pilote de souris de l'Interruption 33h est trouvée.
Premièrement, trouver la présence d'une souris PS/2. Ceci ce fait essentiellement par l'intermédiaire de l'Interruption 15h, mais dans les pilotes professionnels, je n'ai jamais trouver d'autres technique de par l'entremise de l'Interruption 15h. On teste tout d'abord la présence la présence des routines PS/2. Ensuite, on réinitialise la souris. On doit procéder de la façon suivante :
CLI
XOR
CX,CX
MOV BH,3
MOV AX,0C205h
INT 15h
JC @PasSourisPS2Trouvee
OR AH,AH
JNE @PasSourisPS2Trouvee
MOV AX,0C201h
INT 15h
JC @PasSourisPS2Trouvee
OR AH,AH
JNE @PasSourisPS2Trouvee
; Souris PS/2 présente
MOV CL,msPS2
@PasSourisPS2Trouvee:
XCHG
AX,CX
STI
Il faudra ensuite utiliser une routine d'installation permettant de déplacer un pointeur programmer par vous à chaque fois que cette souris ce déplace. Cette routine aura l'apparence suivante:
Procedure
InstallPS2(Routine:Pointer);Assembleur;ASM
MOV
CX,2
@Try2:
LES
BX,Routine
MOV AX,0C207h
INT 15h
JNC @
PSokyet
CMP AH,
4
JNE
@noPSdet
LOOP
@ Try2
JMP
@ noPSdet
@
PSokyet:
MOV BH
, 3
MOV AX,
0C203h
INT
15h
JC
@ NoPSdet
{ Fixe la résolution de la
Souris avec BH }
MOV BH
,1
MOV AX
,0C200h
INT 15h
JC @NoPSdet
{ Activation de la souris }
XOR DL,
DL
XOR
BH ,BH
MOV AX,
0C206h
INT
15h
@
NoPSdet:
@ End:
END;
De façon concrète, on pourra télécharger se petit exemple écrit en langage de programmation Pascal, celui-ci fonctionne en écran de texte couleur ou monochrome et est suffisamment écrit de façon sommaire pour que vous le compreniez facilement:
Télécharger | MOUSEPS2.ZIP | MOUSEPS2.PAS |
Programmation de la souris Série
Cette technique est de loin la plus complexe à programmer de tous. Ainsi, elle nécessite la programmation directe par l'électronique par l'intermédiaire du port série 9-broches. Il ne suffit pas de trouver l'existence d'une souris, il faut également s'adapter au standard existant, comme celui de Logitech, Mouse System, Microsoft,...
Voici un exemple du bout de code assembleur permettant de tester la présence sur un port série:
MOV SI,03F8h
; Adresse de port d'entrée/sortie
du COM1
; Réinitialise la
souris matériel
MOV DX,SI
ADD DX,3
MOV AL,80h
OUT DX,AL
; 3FBh Met le DLAB ouvert
MOV
DX,SI
MOV AX,96
OUT DX,AX
; 3F8h,3F9h 1200 baud
ADD
DX,3
MOV AL,2
; COMLCR
OUT
DX,AL
; 3FBh DLAB fermé, pas
de parité, arrêt=1, longueur=7/8
;Signale
RTS pulse («drop» et «raise»)
XOR AX,AX
MOV ES,AX
INC DX
MOV DI,ES:[46Ch]
w1m:
CMP
DI,ES:[46Ch]
JE w1m
; Attend l'horloge pour démarrer
OUT DX,AL
; 3FCh DTR/RTS/OUT2 fermé
MOV AL,3
MOV DI,ES:[46Ch]
w2m:
CMP
DI,ES:[46Ch]
JE w2m
; Attend la fin du tics d'horloge
OUT DX,AL
; 3FCh DTR/RTS ouvert, OUT2 fermé
; ---------- Détecte si une
souris Microsoft ou Logitech est présente
MOV BX,101h
; BL=Numéro MS, BH=MouseType
MOV CX,4
; Recherche les 4 premiers octets
dlm:
CALL
ReadCOMbyte
JC
ddm
CMP
AL,'M'
JNE ChkLG
MOV BL,0
; Souris de modèle Microsoft
détecté...
ChkLG:
CMP AL,'3'
JNE dnm
MOV BH,2
; Souris de modèle Logitech
détecté
dnm:
LOOP dlm
sdm:
CALL
ReadCOMByte
JNC
sdm
ddm:
MOV Byte
Ptr TypeMouse,BH
; Sauve 1=MS ou 2=Logitech
NEG BL
; Faire non-zéro pour drapeau
de retenu
; Suite du code
COMMouseExist
Proc Near
CLI
MOV CX,03F8h
STC
JCXZ
@@ComExRet
PUSH
CX
CALL DisableComInt
POP
DX
ADD
DX,3
MOV AL,0
OUT DX,AL
; 3FBh Réinitialise les
paramètres
INC DX
IN
AL,DX
; 3FCh Registre de contrôle
Modem
AND
AL,0E0h
; Demande les bits réservé
MOV AH,AL
SUB DX,3
IN
AL,DX
; 3F9h Registre d'interruption activé
AND AL,0F0h
; Demande les bits réservé
OR AL,AH
NEG AL
@@ComExRet:
STI
RET
EndP
ReadCOMByte
Proc Near
MOV
AH,2
; Longueur du tics d'horloge de
silence
MOV DX,SI
ADD DX,5
tlm:
MOV
DI,ES:[46Ch]
wlm:
IN
AL,DX
; Registre d'état de ligne
3FDh
TEST AL,1
JNZ rrm
; Saute si les données sont
prête
CMP
DI,ES:[46Ch]
JE wlm
; Saute si même tics d'horloge
DEC AH
JNZ tlm
; Attend le prochain tics d'horloge
en silence
STC
RET
rrm:
MOV
DX,SI
IN AL,DX
; 3F8h Réception de donnée
RET
EndP
DisableCOMint Proc Near
PUSHF
CLI
IN AL,21h
; 21h Demande le masque PIC
OR AL,10h
; Désactive les interruptions
série
OUT 21h,AL
MOV DX,03F8h
ADD DX,3
MOV AL,0
OUT DX,AL
;3FBh Fixe DLAB fermé
INC DX
IN AL,DX
; 3FCh Contrôle modem
AND AL,0F3h
OUT DX,AL
; 3FCh OUT2 fermé
SUB DX,3
MOV AL,0
OUT DX,AL
; 3F9h Toutes les interruptions fermé
POPF
RET
EndP
Cette routine de détection ne cherche que sur le COM1, il va de soit qu'il faudrait l'adapter pour effectuer une recherche sur les 8 port série possible (adresse 03F8h, 02F8h, 03E8h, 02E8h, 4220h, 4228h, 5220h, 5228h) afin de s'assurer que même si l'utilisateur n'a pas brancher sa souris sur le premier port, quelle soit cependant exploitable.
Programmation par le pilote souris
La routine suivante permet de tester la présence d'un pilote de souris. Il n'y a pas de technique particulière outre le fait de vérifier que l'Interruption 33h n'est pas bidon.
XOR AX,AX
MOV ES,AX
LES BX,ES:[033h*4]
MOV CX,ES
OR CX,BX
JCXZ @@NoMouse
; aucune interruption présente!
MOV BX,ES:[0CEh]
MOV ES,BX
CMP Byte Ptr ES:[0],0CFh
; Pour les hypocrites d'interruption souris, quand
JE
@@NoMouse
; elles sont bidon, elles pointent
sur un IRET!
; Pilote souris
présent
@@NoMouse: