Files
KOS_qrcodes/kernel/branches/flat_kernel/hid/m_com1.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
3.9 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 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