;**************************************************
;* ╧╬╚╤╩ ╠█╪╚ ╧╬ ╧╬╤╦┼─╬┬└╥┼╦▄═█╠ ╧╬╨╥└╠ *
;* ╧ЁюЎхфєЁр яюфуюЄртыштрхЄ уыюсры№э√х яхЁхьхээ√х *
;* 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: