forked from KolibriOS/kolibrios
131 lines
4.0 KiB
HTML
131 lines
4.0 KiB
HTML
; Номер принимаемого от мыши байта
|
||
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
|