;**************************************************
;*      ПОИСК МЫШИ ПО ПОСЛЕДОВАТЕЛЬНЫМ ПОРТАМ     *
;* Процедура подготавливает глобальные переменные *
;* COMPortNum и COMPortBaseAddr для подпрограммы  *
;* установки обработчика прерывания               *
;**************************************************
; Автор исходного текста Кулаков Владимир Геннадьевич.
; Адаптация и доработка Mario79

Detect_COM_Mouse:
        pusha
        call   MSMouseSearch
        cmp    AL,'M'
        jne    @f
        mov    [com1_mouse_detected],1
        pusha

        mov   eax,4
        shl   eax,2
        mov   [irq_owner+eax],byte 1

        inc   dword [0x2d0000]
        mov   edi,[0x2d0000]
        shl   edi,4
        mov   [0x2d0000+edi+0],dword 1
        mov   [0x2d0000+edi+4],dword 0x3f0
        mov   [0x2d0000+edi+8],dword 0x3ff

        popa
        mov    esi,boot_setmouse_type+22
        call  boot_log
     @@:
        sub    [COMPortBaseAddr],100h
        call   MSMouseSearch
        cmp    AL,'M'
        jne    @f        
        mov    [com2_mouse_detected],1
        pusha

        mov   eax,3
        shl   eax,2
        mov   [irq_owner+eax],byte 1
        
        inc   dword [0x2d0000]
        mov   edi,[0x2d0000]
        shl   edi,4
        mov   [0x2d0000+edi+0],dword 1
        mov   [0x2d0000+edi+4],dword 0x2f0
        mov   [0x2d0000+edi+8],dword 0x2ff        

        popa
        mov    esi,boot_setmouse_type+44
        call  boot_log
     @@:
        popa
        jmp     end_detecting_mouse

MSMouseSearch:
        ; ПОИСК МЫШИ ЧЕРЕЗ COM-ПОРТЫ
MouseSearch:
        ; Устанавливаем скорость
        ; приема/передачи 1200 бод
        mov     DX,[COMPortBaseAddr]
        add     DX,3
        in      AL,DX
        or      AL,80h  ;установить бит DLAB
        out     DX,AL
        mov     DX,[COMPortBaseAddr]
        mov     AL,60h  ;1200 бод
        out     DX,AL
        inc     DX
        mov     AL,0
        out     DX,AL
        ; Установить длину слова 7 бит, 1 стоповый бит,
        ; четность не контролировать
        mov     DX,[COMPortBaseAddr]
        add     DX,3
        mov     AL,00000010b
        out     DX,AL
        ; Запретить все прерывания
        mov     DX,[COMPortBaseAddr]
        inc     DX
        mov     AL,0
        out     DX,AL
; Проверить, что устройство подключено и является
; мышью типа MSMouse
        ; Отключить питание мыши и прерывания
        mov     DX,[COMPortBaseAddr]
        add     DX,4    ;регистр управления модемом
        mov     AL,0    ;сбросить DTR, RTS и OUT2
        out     DX,AL
        ; Ожидать 5 "тиков" (0,2 с)
        mov  ecx,0xffff
dT_1:
        dec  ecx
        cmp ecx,0
        jne dT_1
        mov  ecx,0xffff 
        ; Включить питание мыши
        mov     AL,11b  ;установить DTR и RTS
        out     DX,AL
        ; Очистить регистр данных 
        mov     DX,[COMPortBaseAddr]
        in      AL,DX
; Цикл опроса порта 
WaitData:
        ; Ожидать еще 10 "тиков"
         dec  ecx
         cmp  ecx,0
         je     NoMouse
        ; Проверить наличие идентификационного байта
        mov     DX,[COMPortBaseAddr]
        add     DX,5
        in      AL,DX
        test    AL,1   ;Данные готовы?
        jz      WaitData
        ; Ввести данные
        mov     DX,[COMPortBaseAddr]
        in      AL,DX
NoMouse:
        ret

iglobal
COMPortBaseAddr dw 3F8h
;COMPortNum dw 0
endg

iglobal
boot_setmouse_type  db   'Detected - PS2  mouse',0
                    db   'Detected - COM1 mouse',0
                    db   'Detected - COM2 mouse',0
endg

end_detecting_mouse: