; Номер принимаемого от мыши байта
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    [0xfb40],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,[0xFB0A]    ;[XCoordinate]
        ; Курсор не должен выходить за левую или
        ; правую границу экрана
        js      @@X1_1
        cmp     AX,[0xFE00]   ;ScreenLength
        jb      @@X2_1
        ; Установить координату X по правой границе
        mov     AX,[0xFE00]   ;ScreenLength-1
        dec     ax
        jmp     @@X2_1
@@X1_1:
       ; Установить координату X по левой границе
        xor     AX,AX
@@X2_1:
        mov     [0xFB0A],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,[0xFB0C]   ;[YCoordinate]
        ; Курсор не должен выходить за верхнюю или
        ; нижнюю границу экрана
        js      @@Y1_1
        cmp     AX,[0xFE04]  ;ScreenHeigth
        jb      @@Y2_1
        ; Установить координату X по нижней границе
        mov     AX,[0xFE04] ;ScreenHeigth-1
        dec     ax
        jmp     @@Y2_1
@@Y1_1:
       ; Установить координату X по верхней границе
        xor     AX,AX
@@Y2_1:
        mov     [0xFB0C],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
