a6764896b9
git-svn-id: svn://kolibrios.org@492 a494cfbc-eb01-0410-851d-a64ba20cac60
136 lines
3.0 KiB
PHP
136 lines
3.0 KiB
PHP
;**************************************
|
|
;* IRQ HANDLER FOR PS/2 MOUSE *
|
|
;**************************************
|
|
|
|
proc irq_handler
|
|
|
|
call Wait8042BufferEmpty ;clear buffer
|
|
in al,0x60 ;get scan-code
|
|
|
|
cmp [mouse_byte],0
|
|
je .byte1
|
|
cmp [mouse_byte],1
|
|
je .byte2
|
|
cmp [mouse_byte],2
|
|
je .byte3
|
|
cmp [mouse_byte],3
|
|
je .byte4
|
|
jmp .error
|
|
|
|
.byte1:
|
|
test al,1000b ;first byte?
|
|
jz .error
|
|
mov [first_byte],al
|
|
inc [mouse_byte]
|
|
jmp .exit
|
|
|
|
.byte2:
|
|
mov [second_byte],al
|
|
inc [mouse_byte]
|
|
jmp .exit
|
|
|
|
.byte3:
|
|
mov [third_byte],al
|
|
cmp [MouseType],MT_3B
|
|
je .full_packet
|
|
inc [mouse_byte]
|
|
jmp .exit
|
|
|
|
.byte4:
|
|
mov [fourth_byte],al
|
|
|
|
|
|
.full_packet:
|
|
mov [mouse_byte],0
|
|
mov al,byte [first_byte]
|
|
and eax,7
|
|
mov byte [ButtonState],al
|
|
|
|
cmp [MouseType],MT_3B
|
|
je .xy_moving
|
|
mov al,[fourth_byte]
|
|
cmp [MouseType],MT_3BScroll
|
|
je .z_moving
|
|
|
|
mov ah,al
|
|
and ah,00110000b
|
|
shr ah,1
|
|
or byte [ButtonState],ah
|
|
and al,00001111b
|
|
bt eax,3
|
|
jnc .z_moving
|
|
or al,11110000b
|
|
|
|
.z_moving:
|
|
movsx eax,al
|
|
mov [ZMoving],eax
|
|
|
|
.xy_moving:
|
|
mov ah,0
|
|
mov al,[first_byte]
|
|
test al,10000b
|
|
jz @f
|
|
mov ah,0FFh
|
|
|
|
@@:
|
|
mov al,[second_byte]
|
|
cwde
|
|
mov [XMoving],eax
|
|
|
|
mov ah,0
|
|
mov al,[first_byte]
|
|
test al,100000b
|
|
jz @f
|
|
mov ah,0FFh
|
|
|
|
@@:
|
|
mov al,[third_byte]
|
|
cwde
|
|
|
|
@@:
|
|
mov [YMoving],eax
|
|
|
|
mov eax,[ZMoving]
|
|
test eax,1
|
|
jnz .vert
|
|
|
|
sar eax,1
|
|
push eax
|
|
push 0
|
|
jmp @f
|
|
|
|
.vert:
|
|
push 0
|
|
push eax
|
|
|
|
@@:
|
|
|
|
stdcall SetMouseData, [ButtonState], [XMoving], [YMoving]
|
|
|
|
jmp .exit
|
|
|
|
.error:
|
|
mov [mouse_byte],0
|
|
|
|
.exit:
|
|
ret
|
|
endp
|
|
|
|
|
|
;***********************************************
|
|
;* Waiting for clearing I8042 buffer *
|
|
;* Retutned state: *
|
|
;* ZF is set - good ending, *
|
|
;* ZF is cleared - time-out error. *
|
|
;***********************************************
|
|
Wait8042BufferEmpty:
|
|
push ecx
|
|
xor ecx,ecx
|
|
@@:
|
|
in al,64h
|
|
test al,00000010b
|
|
loopnz @b
|
|
pop ecx
|
|
|
|
ret
|