Section courante

A propos

Section administrative du site

 Langage  Programmation  Annexe  Aide 
ABAP/4
Ada
Assembleur
Assembly & bytecode
ASP (Active Server Pages)
Basic
C
C++
C# (C Sharp)
Cobol
ColdFusion
Fortran
HTML
Java
JavaScript
LISP
Logo
LotusScript
Oberon
Pascal
Perl
PHP
PL/1
Prolog
Python
Rebol
REXX
Ruby
Rust
SAS
NoSQL
SQL
Swift
X++ (Axapta)
GNAT
SMALLAda
VHDL
Assembleur 370
Assembleur 1802
Assembleur 4004
Assembleur 6502
Assembleur 6800
Assembleur 68000
Assembleur 8080 et 8085
Assembleur 8089
Assembleur 80x86
Assembleur AGC4
Assembleur ARM
Assembleur DPS 8000
Assembleur i860
Assembleur Itanium
Assembleur MIPS
Assembleur PDP-11
Assembleur PowerPC
Assembleur RISC-V
Assembleur SPARC
Assembleur SuperH
Assembleur UNIVAC I
Assembleur VAX
Assembleur Z80
Assembleur Z8000
Assembleur z/Architecture
ASSEMBLER/MONITOR 64
Micol Assembler
GFA Assembler
A86
MASM (Macro Assembler)
TASM (Turbo Assembler)
CIL
Jasmin
LLVM
MSIL
Parrot
P-Code (PCode)
SWEET16
G-Pascal
ASP 1.0
ASP 2.0
ASP 3.0
ASP.NET
ASP.NET Core
ABasiC (Amiga)
Adam SmartBASIC
Altair BASIC
AmigaBASIC (Amiga)
AMOS Basic (Amiga)
Atari Basic (Atari 400, 600 XL, 800, 800XL)
Basic Apple II (Integer BASIC/APPLESOFT)
Basic Commodore 64 (CBM-BASIC)
Basic Commodore 128 (BASIC 7.0)
Basic Commodore VIC-20 (CBM-BASIC 2.0)
Basic Coco 1 (Color Basic)
Basic Coco 2 (Extended Color Basic)
Basic Coco 3 (Extended Color Basic 2.0)
BASICA (PC DOS)
Basic Pro
BBC BASIC
Blitz BASIC (Amiga)
DarkBASIC
Dartmouth BASIC
GFA-Basic (Atari ST/Amiga)
GWBASIC (MS-DOS)
Liberty BASIC
Locomotive BASIC (Amstrad CPC)
MSX-Basic
Omikron Basic (Atari ST)
Oric Extended Basic
Power Basic
Quick Basic/QBasic (MS-DOS)
Sinclair BASIC (ZX80, ZX81, ZX Spectrum)
ST BASIC (Atari ST)
Turbo Basic
Vintage BASIC
VBScript
Visual Basic (VB)
Visual Basic .NET (VB .NET)
Visual Basic pour DOS
Yabasic
BeckerBASIC
SIMONS' BASIC
Basic09 d'OS-9
Disk Extended Color Basic
Basic09 d'OS-9
Disk Extended Color Basic
Access
Excel
Visual Basic pour Windows
Visual Basic .NET pour Windows
C Shell Unix (csh)
C pour Amiga
C pour Atari ST
C pour DOS
C pour Falcon030
C pour GEMDOS (Atari ST)
C pour Linux
C pour PowerTV OS
C pour OS/2
C pour Unix
C pour Windows
Aztec C
CoCo-C
GNU C
HiSoft C
IBM C/2
Introl-C
Lattice C
Microsoft C
MinGW C
MSX-C
Open Watcom C
OS-9 C Compiler
Pure C
Quick C
Turbo C
HiSoft C for Atari ST
HiSoft C for CP/M (Amstrad CPC)
C++ pour OS/2
C++ pour Windows
Borland C++
C++Builder
IBM VisualAge C++
Intel C++
MinGW C++
Open Watcom C++
Symantec C++
Turbo C++
Visual C++
Visual C++ .NET
Watcom C++
Zortech C++
C# (C Sharp) pour Windows
Apple III Cobol
Microsoft Cobol
BlueDragon
Lucee
OpenBD
Railo
Smith Project
Microsoft Fortran
WATFOR-77
CSS
FBML
Open Graph
SVG
XML
XSL/XSLT
LESS
SASS
GCJ (GNU)
JSP
Jython
Visual J++
Node.js
TypeScript
AutoLISP
ACSLogo
LotusScript pour Windows
Amiga Oberon
Oberon .NET
Apple Pascal
Delphi/Kylix/Lazarus
Free Pascal
GNU Pascal
HighSpeed Pascal
IBM Personal Computer Pascal
Lisa Pascal
Maxon Pascal
MPW Pascal
OS-9 Pascal
OSS Personal Pascal
Pascal-86
Pascal du Cray Research
Pascal/VS
Pascal-XT
PURE Pascal
QuickPascal
RemObjets Chrome
Sun Pascal
THINK Pascal
Tiny Pascal (TRS-80)
Turbo Pascal
UCSD Pascal
VAX Pascal
Virtual Pascal
Turbo Pascal for CP/M-80
Turbo Pascal for DOS
Turbo Pascal for Macintosh
Turbo Pascal for Windows
CodeIgniter (Cadre d'application)
Drupal (Projet)
Joomla! (Projet)
Phalanger (PHP .NET)
phpBB (Projet)
Smarty (balise)
Twig (balise)
Symfony (Cadre d'application)
WordPress (Projet)
Zend (Cadre d'application)
PL360
PL/M-80
PL/M-86
Turbo Prolog
CPython
IronPython
Jython
PyPy
AREXX
Regina REXX
JMP
Btrieve
Cassandra
Clipper
CouchDB
dBASE
Hbase
Hypertable
MongoDB
Redis
Access
BigQuery
DB2
H2
Interbase
MySQL
Oracle
PostgreSQL
SAP HANA
SQL Server
Sybase
U-SQL
Affichage
Clavier
Cyrix
Traitement de texte
Manette de jeux
Mathématique
Modem
Partition
Presse-Papier
Son
Souris
Système d'exploitation
Hacker
Introduction
Métaphysique de l'affichage
Affichage d'élément simple
Traitement des couleurs
Accélérateur graphiques
Technique d'affichage de forme
Les Scalaires (images sur mesure)
Les Fractales
BIOS CGA pour Graphic Solutions
Triangle de «Sierpinski»
PS/2
Exécution de programmes fils et de sessions
Bibliothèque de code
Sources
Lexique et dictionnaire 80x86
Code Assembleur
Extension Fichier
Interruptions
Port d'E/S
RAM
Table Code
8080 et 8085
68000
Java
00h à 07h: Processeur
08h à 0Fh: Périphériques (IRQ0 à IRQ7)
10h: Gestionnaire vidéo
13h: Accès aux disques
15h: Extension d'Entrée/Sortie
16h: Clavier
21h: Service DOS
2Ah: Interface de service réseau
2Fh: Multiplexe
33h: Interface du pilote de souris
59h: GSS Computer Graphics Interface
5Ch: Réseau BIOS (NetBIOS)
67h: Gestionnaire EMM/EMS
00h: Mode vidéo
01h: Sélection du type de curseur
10h, F0h: Tseng Labs HiColor
4Fh: Pilote VESA
5Fh: Realtek RTVGA
6Fh: Video 7
18h: Demande des informations SCSI
01h: Écrit dans la RAM non-volatile (Amstrad PC1512)
02h: Lecture dans la RAM non-volatile (Amstrad PC1512)
10h: Gestionnaire principal TopView
89h: Entrée en mode protégé
00h: Lecture d'un caractère
64h: OS/2 API DOS32StartSession
FFh, 92h: Détecte la présence du pilote «PREDIR.EXE»
16h: Windows & DPMI
0Ah: Détection de Windows
84h: Demande le point d'entrée
86h: Détection du mode DPMI
87h: Détecte l'installation DPMI
8Eh: Machine virtuel et application
APPLE ][
ATARI 2600
Commodore 64
IBM PC
Préface
Notes légal
Dictionnaire
Recherche

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:


PARTAGER CETTE PAGE SUR
Dernière mise à jour : Dimanche, le 1 mai 2016