0,0 → 1,135 |
;************************************** |
;* 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 |