Subversion Repositories Kolibri OS

Compare Revisions

Regard whitespace Rev 491 → Rev 492

/drivers/mouse/ps2mouse4d/trunk/ps2m_irqh.inc
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