$Revision: 431 $
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; ;;
;; Copyright (C) KolibriOS team 2004-2007. All rights reserved. ;;
;; Distributed under terms of the GNU General Public License ;;
;; ;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; ═юьхЁ яЁшэшьрхьюую юЄ ь√°ш срщЄр
MouseByteNumber_2 DB 0
; ╥ЁхїсрщЄютр ёЄЁєъЄєЁр фрээ√ї, яхЁхфртрхьр ь√°№■
FirstByte_2 DB 0
SecondByte_2 DB 0
ThirdByte_2 DB 0
timer_ticks_ps2 dd 0
;**************************************
;* ╬┴╨└┴╬╥╫╚╩ ╧╨┼╨█┬└═╚▀ ╬╥ ╠█╪╚ PS/2 *
;**************************************
check_mouse_data_ps2:
cmp [ps2_mouse_detected],0
je @@EndMouseInterrupt_2
call Wait8042BufferEmpty ;юўшёЄър сєЇхЁр
in AL,0x60 ;яюыєўшЄ№ ёъ¤э-ъюф
; ┬√сшЁрЄ№ яюЁ фъют√щ эюьхЁ яЁшэшьрхьюую срщЄр
cmp [MouseByteNumber_2],0
je @@SaveFirstByte
cmp [MouseByteNumber_2],1
je @@SaveSecondByte
cmp [MouseByteNumber_2],2
je @@SaveThirdByte
jmp @@Error_2
; ╟ряшёрЄ№ яхЁт√щ срщЄ яюё√ыъш
@@SaveFirstByte:
test AL,1000b ;яхЁт√щ срщЄ яюё√ыъш?
jz @@Error_2 ;ёсющ ёшэїЁюэшчрЎшш
mov [FirstByte_2],AL
inc [MouseByteNumber_2]
jmp @@EndMouseInterrupt_2
; ╟ряшёрЄ№ тЄюЁющ срщЄ яюё√ыъш
@@SaveSecondByte:
mov [SecondByte_2],AL
inc [MouseByteNumber_2]
jmp @@EndMouseInterrupt_2
; ╟ряшёрЄ№ ЄЁхЄшщ срщЄ яюё√ыъш
@@SaveThirdByte:
mov [ThirdByte_2],AL
mov [MouseByteNumber_2],0
; (яръхЄ фрээ√ї юЄ ь√°ш яЁшэ Є яюыэюёЄ№■)
; ╟ряшёрЄ№ эютюх чэрўхэшх срщЄр ёюёЄю эш ъэюяюъ
mov al,[FirstByte_2] ;[0xfb01]
and eax,3
mov [BTN_DOWN],al
mov [mouse_active],1
; ┬√ўшёышЄ№ эютє■ X-ъююЁфшэрЄє ъєЁёюЁр
; ╟рэхёЄш т AX яхЁхьх∙хэшх яю X
mov AH,0 ;фєсышЁєхь чэръ тю тёх ЁрчЁ ф√ AH
mov AL,[FirstByte_2]
test AL,10000b
jz @@M0
mov AH,0FFh
; ╟рэхёЄш т AL ьырф°шщ срщЄ
@@M0:
mov AL,[SecondByte_2]
call mouse_acceleration_ps2
; ┬√ўшёышЄ№ эютюх чэрўхэшх ъююЁфшэрЄ√
; ъєЁёюЁр яю X
add AX,[MOUSE_X] ;[XCoordinate]
cmp AX,0
jge @@M1
mov AX,0
jmp @@M2
@@M1:
cmp AX,[ScreenWidth] ;ScreenLength
jl @@M2
mov AX,[ScreenWidth] ;ScreenLength-1
dec ax
@@M2:
mov [MOUSE_X],AX ;[XCoordinate]
; ┬√ўшёы хь эютє■ Y-ъююЁфшэрЄє ъєЁёюЁр
; ╟рэхёЄш т AX яхЁхьх∙хэшх яю Y
mov AH,0 ;фєсышЁєхь чэръ тю тёх ЁрчЁ ф√ AH
mov AL,[FirstByte_2]
test AL,100000b
jz @@M3
mov AH,0FFh
; ╟рэхёЄш т AL ьырф°шщ срщЄ
@@M3:
mov AL,[ThirdByte_2]
call mouse_acceleration_ps2
; ┬√ўшёышЄ№ эютюх чэрўхэшх ъююЁфшэрЄ√ ъєЁёюЁр
; яю Y (Y-ъююЁфшэрЄр ь√°ш PS/2 эряЁртыхэр
; яЁюЄштюяюыюцэю ¤ъЁрээющ)
neg AX
add AX,[MOUSE_Y] ;[YCoordinate]
cmp AX,0
jge @@M4
mov AX,0
jmp @@M5
@@M4:
cmp AX,[ScreenHeight] ;ScreenHeigth
jl @@M5
mov AX,[ScreenHeight] ;ScreenHeigth-1
dec ax
@@M5:
mov [MOUSE_Y],AX ;[YCoordinate]
; ╧юърчрЄ№ ъєЁёюЁ т эютющ яючшЎшш
mov eax,[timer_ticks]
mov [timer_ticks_ps2],eax
jmp @@EndMouseInterrupt_2
; ╬сэрЁєцхэ ёсющ т яюЁ фъх яхЁхфрўш шэЇюЁьрЎшш юЄ ь√°ш
@@Error_2:
mov [MouseByteNumber_2],0
; ═юЁьры№эюх чртхЁ°хэшх яЁхЁ√трэш
@@EndMouseInterrupt_2:
call ready_for_next_irq_1
ret
mouse_acceleration_ps2:
push eax
mov eax,[timer_ticks]
sub eax,[timer_ticks_ps2]
cmp eax,[mouse_delay]
pop eax
ja @f
imul ax,[mouse_speed_factor]
@@:
ret
;***********************************************
;* ╬╞╚─└═╚┼ ╬╫╚╤╥╩╚ ┬╒╬─═╬├╬ ┴╙╘┼╨└ I8042 *
;* ╧Ёш т√їюфх шч яЁюЎхфєЁ√: *
;* Їыру ZF єёЄрэютыхэ - эюЁьры№эюх чртхЁ°хэшх, *
;* Їыру ZF ёсЁю°хэ - ю°шсър Єрщь-рєЄр. *
;***********************************************
Wait8042BufferEmpty:
; push CX
; mov CX,0FFFFh ;чрфрЄ№ ўшёыю Ўшъыют юцшфрэш
;@@kb:
; in AL,64h ;яюыєўшЄ№ ёЄрЄєё
; test AL,10b ;сєЇхЁ i8042 ётюсюфхэ?
; loopnz @@kb ;хёыш эхЄ, Єю Ўшъы
; pop CX
push ecx
xor ecx,ecx
@@:
in al,64h
test al,00000010b
loopnz @b
pop ecx
;┼ёыш яЁш т√їюфх шч яюфяЁюуЁрьь√ ёсЁю°хэ
;Їыру ZF - ю°шсър
ret ;тючтЁрЄ т яюфяЁюуЁрььє
;***************************************
;* ╬╞╚─└═╚┼ ╧╬╤╥╙╧╦┼═╚▀ ─└══█╒ ╬╥ ╠█╪╚ *
;***************************************
WaitMouseData:
; push CX
; mov CX,0FFFFh ;чрфрЄ№ ўшёыю Ўшъыют юцшфрэш
;@@mouse:
; in AL,64h ;юяЁюёшЄ№ ЁхушёЄЁ ёЄрЄєёр
; test AL,100000b ;фрээ√х яюёЄєяшыш?
; loopz @@mouse ;хёыш эхЄ, Єю Ўшъы
; pop CX
push ecx
mov ECX,0FFFFh
@@:
in al,64h
test al,100000b
loopz @b
pop ecx
;┼ёыш яЁш т√їюфх шч яюфяЁюуЁрьь√ єёЄрэютыхэ
;Їыру ZF - ю°шсър
ret