$Revision$
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;                                                              ;;
;; Copyright (C) KolibriOS team 2004-2007. All rights reserved. ;;
;; Distributed under terms of the GNU General Public License    ;;
;;                                                              ;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

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

Detect_COM_Mouse:
        pusha
        call   MSMouseSearch
        cmp    AL,'M'
        jne    @f
        mov    [com1_mouse_detected],1
        mov     [irq_owner+4*4], 1      ; IRQ4 owner is System
        mov     eax, [RESERVED_PORTS]
        inc     eax
        mov     [RESERVED_PORTS], eax
        shl     eax, 4
        mov     [RESERVED_PORTS+eax+0], dword 1
        mov     [RESERVED_PORTS+eax+4], dword 0x3F8
        mov     [RESERVED_PORTS+eax+8], dword 0x3FF
        mov    esi,boot_setmouse_type+22
        call  boot_log
     @@:
        sub    [COMPortBaseAddr],100h
        call   MSMouseSearch
        cmp    AL,'M'
        jne    @f
        mov    [com2_mouse_detected],1
        mov     [irq_owner+3*4], 1      ; IRQ3 owner is System
        mov     eax, [RESERVED_PORTS]
        inc     eax
        mov     [RESERVED_PORTS], eax
        shl     eax, 4
        mov     [RESERVED_PORTS+eax+0], dword 1
        mov     [RESERVED_PORTS+eax+4], dword 0x2F8
        mov     [RESERVED_PORTS+eax+8], dword 0x2FF
        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     EDX,4   ;регистр управления модемом
        mov     AL,0    ;сбросить DTR, RTS и OUT2
        out     DX,AL
        ; Ожидать 5 "тиков" (0,2 с)
        mov     ecx, 0xFFFF
        loop    $
        ; Включить питание мыши
        mov     al, 1
        out     dx, al
        mov     ecx, 0xFFFF
        loop    $
        ; Очистить регистр данных
        sub     edx, 4
        in      AL,DX
        add     edx, 4
        mov     AL,11b  ;установить DTR и RTS
        out     DX,AL
        mov     ecx, 0x1FFFF
; Цикл опроса порта
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: