forked from KolibriOS/kolibrios
136 lines
3.6 KiB
HTML
136 lines
3.6 KiB
HTML
;**************************************************
|
||
;* ПОИСК МЫШИ ПО ПОСЛЕДОВАТЕЛЬНЫМ ПОРТАМ *
|
||
;* Процедура подготавливает глобальные переменные *
|
||
;* 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:
|
||
|