Files
KOS_qrcodes/kernel/branches/flat_kernel/hid/m_com2.inc
Sergey Semyonov (Serge) f591baba3e create branch
git-svn-id: svn://kolibrios.org@387 a494cfbc-eb01-0410-851d-a64ba20cac60
2007-03-05 20:17:43 +00:00

131 lines
4.0 KiB
HTML
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
; Номер принимаемого от мыши байта
MouseByteNumber_1 DB 0
; Трехбайтовая структура данных, передаваемая мышью
FirstByte_1 DB 0
SecondByte_1 DB 0
ThirdByte_1 DB 0
timer_ticks_com_1 dd 0
;***************************************
;* НОВЫЙ ОБРАБОТЧИК ПРЕРЫВАНИЯ ОТ МЫШИ *
;***************************************
check_mouse_data_com2:
; cmp [com2_mouse_detected],0
; je @@EndMouseInterrupt_1
; Проверить наличие данных
mov DX,2F8h ;[COMPortBaseAddr]
add DX,5 ;xFDh
in AL,DX
test AL,1 ;Данные готовы?
jz @@Error_1
; Ввести данные
mov DX,2F8h ;[COMPortBaseAddr] ;xF8h
in AL,DX
; Сбросить старший незначащий бит
and AL,01111111b
; Определить порядковый номер принимаемого байта
cmp [MouseByteNumber_1],0
je @@FirstByte_1
cmp [MouseByteNumber_1],1
je @@SecondByte_1
cmp [MouseByteNumber_1],2
je @@ThirdByte_1
jmp @@Error_1
; Сохранить первый байт данных
@@FirstByte_1:
test AL,1000000b ;Первый байт посылки?
jz @@Error_1
mov [FirstByte_1],AL
inc [MouseByteNumber_1] ;увеличить счетчик
jmp @@EndMouseInterrupt_1
; Сохранить второй байт данных
@@SecondByte_1:
test AL,1000000b
jnz @@Error_1
mov [SecondByte_1],AL
inc [MouseByteNumber_1] ;увеличить счетчик
jmp @@EndMouseInterrupt_1
; Сохранить третий байт данных
@@ThirdByte_1:
test AL,1000000b
jnz @@Error_1
mov [ThirdByte_1],AL ;увеличить счетчик
mov [MouseByteNumber_1],0
; (Пакет данных от мыши принят полностью).
; Записать новое значение состояния кнопок мыши
mov al,[FirstByte_1] ;[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_1]
shl AL,6
or AL,[SecondByte_1]
cbw
call mouse_acceleration_com2
add AX,[MOUSE_X] ;[XCoordinate]
; Курсор не должен выходить за левую или
; правую границу экрана
js @@X1_1
cmp AX,[ScreenWidth] ;ScreenLength
jb @@X2_1
; Установить координату X по правой границе
mov AX,[ScreenWidth] ;ScreenLength-1
dec ax
jmp @@X2_1
@@X1_1:
; Установить координату X по левой границе
xor AX,AX
@@X2_1:
mov [MOUSE_X],AX ;[XCoordinate]
; Прибавить перемещение по Y к координате Y
mov AL,[FirstByte_1]
and AL,00001100b
shl AL,4
or AL,[ThirdByte_1]
cbw
call mouse_acceleration_com2
add AX,[MOUSE_Y] ;[YCoordinate]
; Курсор не должен выходить за верхнюю или
; нижнюю границу экрана
js @@Y1_1
cmp AX,[ScreenHeight] ;ScreenHeigth
jb @@Y2_1
; Установить координату X по нижней границе
mov AX,[ScreenHeight] ;ScreenHeigth-1
dec ax
jmp @@Y2_1
@@Y1_1:
; Установить координату X по верхней границе
xor AX,AX
@@Y2_1:
mov [MOUSE_Y],AX ;[YCoordinate]
mov eax,[timer_ticks]
mov [timer_ticks_com_1],eax
jmp @@EndMouseInterrupt_1
@@Error_1:
; Произошел сбой в порядке передачи информации от
; мыши, обнулить счетчик байтов пакета данных
mov [MouseByteNumber_1],0
@@EndMouseInterrupt_1:
call ready_for_next_irq
ret
mouse_acceleration_com2:
push eax
mov eax,[timer_ticks]
sub eax,[timer_ticks_com_1]
cmp eax,[mouse_delay]
pop eax
ja @f
imul ax,[mouse_speed_factor]
@@:
ret