cos2000v1/mouse.asm

240 lines
4.9 KiB
NASM
Raw Normal View History

.model tiny
.486
smart
.code
org 0100h
start:
jmp tsr
drv db 'MOUSE',0
Tsr:
cli
cmp ax,1234h
jne nomore
mov ax,4321h
jmp itsok
nomore:
push bx ax
mov ah,4
mov bh,0
int 50h
mov bl,al
pop ax
cmp byte ptr cs:isact,1
je nottest
mov cs:isact,1
and bl,10000b
cmp bl,16
jae react
mov bl,ah
xor bh,bh
shl bx,1
mov bx,cs:[bx].tables
mov cs:current,bx
pop bx
call cs:current
itsok:
jnc noerror
push bp
mov bp,sp
or byte ptr [bp+6],1b
pop bp
mov ax,cs
shl eax,16
mov ax,cs:current
jmp endofint
noerror:
push bp
mov bp,sp
and byte ptr [bp+6],0FEh
pop bp
endofint:
mov cs:isact,0
sti
iret
nottest:
pop bx
jmp endofint
current dw 0
tables dw cmdmouse
dw cmdmouse2
dw detectmouse
dw getmouse
isact db 0
;Envoie une commande AL <20> la souris via controleur clavier
cmdmouse:
push ax
videbuff1:
in al, 64h
and al, 10b
jne videbuff1
mov al, 00d4h
out 64h, al
videbuff2:
in al, 64h
and al, 10b
jne videbuff2
pop ax
out 60h, al
in al, 60h
ret
;Envoie une commande2 AL <20> la souris via controleur clavier carry=nomouse
cmdmouse2:
push ax
videbuff21:
in al, 64h
and al, 10b
jne videbuff21
mov al, 0060h
out 64h, al
videbuff22:
in al, 64h
and al, 10b
jne videbuff22
pop ax
out 60h, al
in al, 60h
ret
Detectmouse:
push ax cx
mov al, 0a8h ;AUX enable
out 64h, al
mov al, 0f3h ;Set sample
call cmdmouse
mov al, 100 ;Set sample
call cmdmouse
mov al, 0e8h ;Set resolution
call cmdmouse
mov al, 01 ;Set resolution
call cmdmouse
mov al, 0e7h ;Set scale 2:1
call cmdmouse
mov al, 0f4h ;Enable device
call cmdmouse
mov al, 47h ;Interruption ON
call cmdmouse2
mov cx, 1024
testmouse:
in al, 60h ;Lecture du port de donn<6E>es
cmp al, 250 ;Test si il y a une souris
je okmouse
dec cx
jnz testmouse
stc
jmp endoftest
okmouse:
clc
endoftest:
pop cx ax
ret
;envoie en bx,cx les coordonn<6E>es et en dl les boutons
getmouse:
mov bl,cs:vx
xor bh,bh
mov cl,cs:vy
xor ch,ch
mov dl,cs:button
;sub dl,8
;and dl,0Fh
clc
ret
Button db 0
rx dw 0
ry dw 0
VX db 0
VY db 0
X dw 0
Y dw 0
count db 0
error db 0
xy dw 0
old dw 0
;Gestionnaire de souris PS/2
react:
push ax bx cx dx di ds es
push cs
pop ds
in al, 60h
cmp error, 1
je gest1
cmp count, 1
je gest1
cmp count, 2
je gest2
cmp count, 3
je gest3
gest1:
mov count, 2
mov Button, al
and al, 00001000b
cmp al, 8
je gest1end
mov error, 1
jmp gest1end2
gest1end:
mov error, 0
gest1end2:
mov count, 2
jmp endgest
gest2:
mov count, 3
mov VX, al
jmp endgest
gest3:
mov count, 1
mov VY, al
jmp endgest
endgest:
mov bl,VY
xor bh,bh
add y,bx
mov bl,VX
xor bh,bh
add x,bx
push cs
pop es
mov di,offset infos
mov ah,34
int 47h
mov ax,x
mov bx,0FFFFh
xor ch,ch
mov cl,[di+1]
mul cx
div bx
mov rx,ax
mov ax,y
mov cl,[di]
mul cx
div bx
mov ry,ax
mul byte ptr [di+1]
add ax,rx
shl ax,1
mov di,ax
mov ax,0B800h
mov es,ax
mov bx,xy
mov ax,old
mov word ptr es:[bx],ax
mov xy,di
mov ax,es:[di]
mov old,ax
mov word ptr es:[di],0FF70h
mov al, 20h
out 0a0h, al
out 20h, al
pop es ds di dx cx bx ax
mov cs:isact,0
pop bx
iret
infos db 10 dup (0)
end start