|
|
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...
|
|
|
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:
|
|
|
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 d'un
microprocesseur 5x86 ou 6x86:
|
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.
|
|
|
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:
|
|
|
| Dernière mise à jour: Vendredi, le 27 janvier 2006 |
|