Section courante

A propos

Section administrative du site

Sommaire


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:


Dernière mise à jour : Dimanche, le 1 mai 2016