1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177
| org 100h
mov ax,cs
mov ds,ax
;passage en mode texte 80*25 16 couleurs
mov ah,0
mov al,3h
int 10h
;sauvegarde du pointeur originale sur IRQ 12=int 74h (souris)
push 0
pop es
mov si,74h
shl si,2
cli
mov ax,[es:si]
mov [offset_IRQ12_original],ax
mov ax,[es:si+2]
mov [segment_IRQ12_original],ax
;mis en place de notre IRQ12 perso
mov ax,souris
mov [es:si],ax ;offset
mov ax,cs
mov [es:si+2],ax ;segment
sti
;----------------- initialisation souris -----------
xor ax,ax
xor bx,bx
call mouse_wait1
mov al,0A8h
out 64h,al ;active interface auxilliaire du 8042
call mouse_wait0
in al,60h ;attend ACK
call mouse_wait1
mov al,20h
out 64h,al ;données ps2
call mouse_wait0
in al,60h
bts ax,1 ;bit 1 dans cf puis bit 1 armé=donnée présente sur 60h
btr ax,5 ;bit 5 dans cf puis bit 5 désarmé=donnée non liée à la souris ps2
mov bl,al
call mouse_wait1
mov al,60h
out 64h,al
call mouse_wait1
mov al,bl
out 60h,al
call mouse_wait0
mov ah,0F6h
call mouse_write ;réinitialise la souris,active la scrutation (stream mode)
;----------------------------------------------
;tester souris
mov ax,65535
B:
mov cx,65535
C: loop C
dec ax
jnz B
;restauration de IRQ12 original
cli
push 0
pop es
mov si,74h
shl si,2
mov ax,[offset_IRQ12_original]
mov [es:si],ax
mov ax,[segment_IRQ12_original]
mov [es:si+2],ax
sti
ret
;--------------attend qu'une donnée soit présente sur 60h
mouse_wait0:
mov cx,1000
wait0: in al,64h
test al,1
loope wait0
ret
;---------------attend que le controleur soit disponible
mouse_wait1:
mov cx,1000
wait1: in al,64h
test al,10b
loopne wait1
ret
;------------- mouse_write
mouse_write:
;en entrée: ah=commande à envoyer
call mouse_wait1
mov al,0D4h
out 64h,al
call mouse_wait1
xchg al,ah
out 60h,al
xchg al,ah
call mouse_wait0
in al,60h ;lit ack
ret
;-----------------
souris:
push ax
push bx
push cx
push si
push di
mov cx,100
xor ax,ax
waitkey:
in al,64h
dec cl
jnz souris1
ret
souris1:
and al,20h ;20h=100 000b
jz waitkey ;on boucle car bit 5 de 64h pas armé=c'est pas une donnée souris
in al,60h
;ici al contient normalement le premier octet envoyé
;acquitement
mov al,20h
out 0A0h,al ;pic escalve (irq 12 gérée par irq2 du maitre)
out 20h,al ;pic maitre
pop di
pop si
pop cx
pop bx
pop ax
fin_souris:
iret
offset_IRQ12_original resw 1
segment_IRQ12_original resw 1 |
Partager