$Revision: 431 $
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; ;;
;; Copyright (C) KolibriOS team 2004-2007. All rights reserved. ;;
;; Distributed under terms of the GNU General Public License ;;
;; ;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; ═юьхЁ яЁшэшьрхьюую юЄ ь√°ш срщЄр
MouseByteNumber DB 0
; ╥ЁхїсрщЄютр ёЄЁєъЄєЁр фрээ√ї, яхЁхфртрхьр ь√°№■
FirstByte DB 0
SecondByte DB 0
ThirdByte DB 0
timer_ticks_com dd 0
;***************************************
;* ═╬┬█╔ ╬┴╨└┴╬╥╫╚╩ ╧╨┼╨█┬└═╚▀ ╬╥ ╠█╪╚ *
;***************************************
check_mouse_data_com1:
; cmp [com1_mouse_detected],0
; je @@EndMouseInterrupt
; ╧ЁютхЁшЄ№ эрышўшх фрээ√ї
mov DX,3F8h ;[COMPortBaseAddr]
add DX,5 ;xFDh
in AL,DX
test AL,1 ;─рээ√х уюЄют√?
jz @@Error
; ┬тхёЄш фрээ√х
mov DX,3F8h ;[COMPortBaseAddr] ;xF8h
in AL,DX
; ╤сЁюёшЄ№ ёЄрЁ°шщ эхчэрўр∙шщ сшЄ
and AL,01111111b
; ╬яЁхфхышЄ№ яюЁ фъют√щ эюьхЁ яЁшэшьрхьюую срщЄр
cmp [MouseByteNumber],0
je @@FirstByte
cmp [MouseByteNumber],1
je @@SecondByte
cmp [MouseByteNumber],2
je @@ThirdByte
jmp @@Error
; ╤юїЁрэшЄ№ яхЁт√щ срщЄ фрээ√ї
@@FirstByte:
test AL,1000000b ;╧хЁт√щ срщЄ яюё√ыъш?
jz @@Error
mov [FirstByte],AL
inc [MouseByteNumber] ;єтхышўшЄ№ ёўхЄўшъ
jmp @@EndMouseInterrupt
; ╤юїЁрэшЄ№ тЄюЁющ срщЄ фрээ√ї
@@SecondByte:
test AL,1000000b
jnz @@Error
mov [SecondByte],AL
inc [MouseByteNumber] ;єтхышўшЄ№ ёўхЄўшъ
jmp @@EndMouseInterrupt
; ╤юїЁрэшЄ№ ЄЁхЄшщ срщЄ фрээ√ї
@@ThirdByte:
test AL,1000000b
jnz @@Error
mov [ThirdByte],AL ;єтхышўшЄ№ ёўхЄўшъ
mov [MouseByteNumber],0
; (╧ръхЄ фрээ√ї юЄ ь√°ш яЁшэ Є яюыэюёЄ№■).
; ╟ряшёрЄ№ эютюх чэрўхэшх ёюёЄю эш ъэюяюъ ь√°ш
mov al,[FirstByte] ;[0xfb01]
mov ah,al
shr al,3
and al,2
shr ah,5
and ah,1
add al,ah
mov [BTN_DOWN],al
mov [mouse_active],1
; ╧ЁшсртшЄ№ яхЁхьх∙хэшх яю X ъ ъююЁфшэрЄх X
mov AL,[FirstByte]
shl AL,6
or AL,[SecondByte]
cbw
call mouse_acceleration_com1
add AX,[MOUSE_X] ;[XCoordinate]
; ╩єЁёюЁ эх фюыцхэ т√їюфшЄ№ чр ыхтє■ шыш
; яЁртє■ уЁрэшЎє ¤ъЁрэр
js @@X1
cmp AX,[ScreenWidth] ;ScreenLength
jb @@X2
; ╙ёЄрэютшЄ№ ъююЁфшэрЄє X яю яЁртющ уЁрэшЎх
mov AX,[ScreenWidth] ;ScreenLength-1
dec ax
jmp @@X2
@@X1:
; ╙ёЄрэютшЄ№ ъююЁфшэрЄє X яю ыхтющ уЁрэшЎх
xor AX,AX
@@X2:
mov [MOUSE_X],AX ;[XCoordinate]
; ╧ЁшсртшЄ№ яхЁхьх∙хэшх яю Y ъ ъююЁфшэрЄх Y
mov AL,[FirstByte]
and AL,00001100b
shl AL,4
or AL,[ThirdByte]
cbw
call mouse_acceleration_com1
add AX,[MOUSE_Y] ;[YCoordinate]
; ╩єЁёюЁ эх фюыцхэ т√їюфшЄ№ чр тхЁїэ■■ шыш
; эшцэ■■ уЁрэшЎє ¤ъЁрэр
js @@Y1
cmp AX,[ScreenHeight] ;ScreenHeigth
jb @@Y2
; ╙ёЄрэютшЄ№ ъююЁфшэрЄє X яю эшцэхщ уЁрэшЎх
mov AX,[ScreenHeight] ;ScreenHeigth-1
dec ax
jmp @@Y2
@@Y1:
; ╙ёЄрэютшЄ№ ъююЁфшэрЄє X яю тхЁїэхщ уЁрэшЎх
xor AX,AX
@@Y2:
mov [MOUSE_Y],AX ;[YCoordinate]
mov eax,[timer_ticks]
mov [timer_ticks_com],eax
jmp @@EndMouseInterrupt
@@Error:
; ╧Ёюшчю°хы ёсющ т яюЁ фъх яхЁхфрўш шэЇюЁьрЎшш юЄ
; ь√°ш, юсэєышЄ№ ёўхЄўшъ срщЄют яръхЄр фрээ√ї
mov [MouseByteNumber],0
@@EndMouseInterrupt:
call ready_for_next_irq
ret
mouse_acceleration_com1:
push eax
mov eax,[timer_ticks]
sub eax,[timer_ticks_com]
cmp eax,[mouse_delay]
pop eax
ja @f
imul ax,[mouse_speed_factor]
@@:
ret