0,0 → 1,121 |
;************************************************** |
;* ÏÎÈÑÊ ÌÛØÈ ÏÎ ÏÎÑËÅÄÎÂÀÒÅËÜÍÛÌ ÏÎÐÒÀÌ * |
;* Ïðîöåäóðà ïîäãîòàâëèâàåò ãëîáàëüíûå ïåðåìåííûå * |
;* COMPortNum è COMPortBaseAddr äëÿ ïîäïðîãðàììû * |
;* óñòàíîâêè îáðàáîò÷èêà ïðåðûâàíèÿ * |
;************************************************** |
; Àâòîð èñõîäíîãî òåêñòà Êóëàêîâ Âëàäèìèð Ãåííàäüåâè÷. |
; Àäàïòàöèÿ è äîðàáîòêà Mario79 |
|
MSMouseSearch: |
pusha |
; Çàïðåòèòü ïðåðûâàíèå COM1 è COM2 |
cli |
in AL,21h ;ïðî÷èòàòü ìàñêó ïðåðûâàíèé |
or AL,18h ;çàïðåòèòü IRQ3 è IRQ4 |
out 21h,AL ;çàìåíèòü ìàñêó |
sti |
; ÏÎÈÑÊ ÌÛØÈ ×ÅÐÅÇ 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 |
; Óñòðîéñòâî ÿâëÿåòñÿ ìûøüþ? |
cmp AL,'M' |
je EndDetect |
NoMouse: |
inc [COMPortNum] |
cmp [COMPortNum],1 |
ja EndDetect |
sub [COMPortBaseAddr],100h |
jmp MouseSearch |
|
iglobal |
COMPortBaseAddr dw 3F8h |
COMPortNum dw 0 |
endg |
|
iglobal |
boot_setmouse_type db 'No COM mouse, set PS2',0 |
db 'Detected - COM1 mouse',0 |
db 'Detected - COM2 mouse',0 |
|
endg |
|
EndDetect: |
cmp [COMPortNum],0 ;íîìåð ïîðòà ìåíüøå 0? |
jl ComMouseNotFound ;ìûøü íå íàéäåíà |
cmp [COMPortNum],1 ;íîìåð ïîðòà áîëüøå 1? |
ja ComMouseNotFound ;ìûøü íå íàéäåíà |
mov ax,[COMPortNum] |
add al,2 |
jmp set_detecting_mouse |
ComMouseNotFound: |
mov al,1 |
set_detecting_mouse: |
mov [0xF604],al |
dec al |
movzx eax,al |
imul eax,22 |
mov esi,boot_setmouse_type |
add esi,eax |
call boot_log |
popa |
|
|