forked from KolibriOS/kolibrios
333b0bbae6
2) Detection PS2 mouse. 3) Switching FPU in PM with reset. 4) Click on the application button - works only if during release of a up-button mouse the cursor is on the button application. Realization Victor Alberto Gil Hanla (vhanla). Version 1.1 5) Return of focus (activated window) on previous application at completion of the active application 6) Change skin of header of windows type 4, at loss and return of focus (activated window). git-svn-id: svn://kolibrios.org@33 a494cfbc-eb01-0410-851d-a64ba20cac60
119 lines
3.5 KiB
HTML
119 lines
3.5 KiB
HTML
; Номер принимаемого от мыши байта
|
||
MouseByteNumber DB 0
|
||
; Трехбайтовая структура данных, передаваемая мышью
|
||
FirstByte DB 0
|
||
SecondByte DB 0
|
||
ThirdByte DB 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 [0xfb40],al
|
||
mov [mouse_active],1
|
||
; Прибавить перемещение по X к координате X
|
||
mov AL,[FirstByte]
|
||
shl AL,6
|
||
or AL,[SecondByte]
|
||
cbw
|
||
shl ax,1
|
||
add AX,[0xFB0A] ;[XCoordinate]
|
||
; Курсор не должен выходить за левую или
|
||
; правую границу экрана
|
||
js @@X1
|
||
cmp AX,[0xFE00] ;ScreenLength
|
||
jb @@X2
|
||
; Установить координату X по правой границе
|
||
mov AX,[0xFE00] ;ScreenLength-1
|
||
dec ax
|
||
jmp @@X2
|
||
@@X1:
|
||
; Установить координату X по левой границе
|
||
xor AX,AX
|
||
@@X2:
|
||
mov [0xFB0A],AX ;[XCoordinate]
|
||
; Прибавить перемещение по Y к координате Y
|
||
mov AL,[FirstByte]
|
||
and AL,00001100b
|
||
shl AL,4
|
||
or AL,[ThirdByte]
|
||
cbw
|
||
shl ax,1
|
||
add AX,[0xFB0C] ;[YCoordinate]
|
||
; Курсор не должен выходить за верхнюю или
|
||
; нижнюю границу экрана
|
||
js @@Y1
|
||
cmp AX,[0xFE04] ;ScreenHeigth
|
||
jb @@Y2
|
||
; Установить координату X по нижней границе
|
||
mov AX,[0xFE04] ;ScreenHeigth-1
|
||
dec ax
|
||
jmp @@Y2
|
||
@@Y1:
|
||
; Установить координату X по верхней границе
|
||
xor AX,AX
|
||
@@Y2:
|
||
mov [0xFB0C],AX ;[YCoordinate]
|
||
jmp @@EndMouseInterrupt
|
||
|
||
@@Error:
|
||
; Произошел сбой в порядке передачи информации от
|
||
; мыши, обнулить счетчик байтов пакета данных
|
||
mov [MouseByteNumber],0
|
||
@@EndMouseInterrupt:
|
||
call ready_for_next_irq
|
||
ret
|
||
|