174,68 → 174,68 |
|
align 4 |
MSMouseSearch: |
; ÏÎÈÑÊ ÌÛØÈ ×ÅÐÅÇ COM-ÏÎÐÒÛ |
; ПОИСК МЫШИ ЧЕРЕЗ COM-ПОРТЫ |
MouseSearch: |
; Óñòàíàâëèâàåì ñêîðîñòü |
; ïðèåìà/ïåðåäà÷è 1200 áîä |
; Устанавливаем скорость |
; приема/передачи 1200 бод |
; in bx COM Port Base Address |
mov DX, bx |
add DX, 3 |
in AL, DX |
or AL, 80h ;óñòàíîâèòü áèò DLAB |
or AL, 80h ;установить бит DLAB |
out DX, AL |
mov DX, bx |
mov AL, 60h ;1200 áîä |
mov AL, 60h ;1200 бод |
out DX, AL |
inc DX |
mov AL, 0 |
out DX, AL |
; Óñòàíîâèòü äëèíó ñëîâà 7 áèò, 1 ñòîïîâûé áèò, |
; ÷åòíîñòü íå êîíòðîëèðîâàòü |
; Установить длину слова 7 бит, 1 стоповый бит, |
; четность не контролировать |
mov DX, bx |
add DX, 3 |
mov AL, 00000010b |
out DX, AL |
; Çàïðåòèòü âñå ïðåðûâàíè |
; Запретить все прерывани |
mov dx, bx |
inc dx |
mov AL, 0 |
out DX, AL |
; Ïðîâåðèòü, ÷òî óñòðîéñòâî ïîäêëþ÷åíî è ÿâëÿåòñ |
; ìûøüþ òèïà MSMouse |
; Îòêëþ÷èòü ïèòàíèå ìûøè è ïðåðûâàíè |
; Проверить, что устройство подключено и являетс |
; мышью типа MSMouse |
; Отключить питание мыши и прерывани |
mov DX, bx |
add EDX, 4 ;ðåãèñòð óïðàâëåíèÿ ìîäåìîì |
mov AL, 0 ;ñáðîñèòü DTR, RTS è OUT2 |
add EDX, 4 ;регистр управления модемом |
mov AL, 0 ;сбросить DTR, RTS и OUT2 |
out DX, AL |
; Îæèäàòü 5 "òèêîâ" (0,2 ñ) |
; Ожидать 5 "тиков" (0,2 с) |
mov ecx, 0xFFFF |
loop $ |
; Âêëþ÷èòü ïèòàíèå ìûøè |
; Включить питание мыши |
mov al, 1 |
out dx, al |
mov ecx, 0xFFFF |
loop $ |
; Î÷èñòèòü ðåãèñòð äàííûõ |
; Очистить регистр данных |
mov dx, bx |
in AL, DX |
add edx, 4 |
mov AL, 1011b ;óñòàíîâèòü DTR è RTS è OUT2 |
mov AL, 1011b ;установить DTR и RTS и OUT2 |
out DX, AL |
mov ecx, 0x1FFFF |
; Öèêë îïðîñà ïîðòà |
; Цикл опроса порта |
WaitData: |
; Îæèäàòü åùå 10 "òèêîâ" |
; Ожидать еще 10 "тиков" |
dec ecx |
; cmp ecx,0 |
jz NoMouse |
; Ïðîâåðèòü íàëè÷èå èäåíòèôèêàöèîííîãî áàéòà |
; Проверить наличие идентификационного байта |
mov DX, bx |
add DX, 5 |
in AL, DX |
test AL, 1 ;Äàííûå ãîòîâû? |
test AL, 1 ;Данные готовы? |
jz WaitData |
; Ââåñòè äàííûå |
; Ввести данные |
mov DX, bx |
in AL, DX |
NoMouse: |
257,27 → 257,27 |
; in: esi -> COM_MOUSE_DATA struc, dx = base port (xF8h) |
add edx, 5 ; xFDh |
in al, dx |
test al, 1 ; Äàííûå ãîòîâû? |
test al, 1 ; Данные готовы? |
jz .Error |
; Ââåñòè äàííûå |
; Ввести данные |
sub edx, 5 |
in al, dx |
; Ñáðîñèòü ñòàðøèé íåçíà÷àùèé áèò |
; Сбросить старший незначащий бит |
and al, 01111111b |
|
; Îïðåäåëèòü ïîðÿäêîâûé íîìåð ïðèíèìàåìîãî áàéòà |
; Определить порядковый номер принимаемого байта |
cmp [esi+COM_MOUSE_DATA.MouseByteNumber], 2 |
ja .Error |
jz .ThirdByte |
jp .SecondByte |
; Ñîõðàíèòü ïåðâûé áàéò äàííûõ |
; Сохранить первый байт данных |
.FirstByte: |
test al, 1000000b ; Ïåðâûé áàéò ïîñûëêè? |
test al, 1000000b ; Первый байт посылки? |
jz .Error |
mov [esi+COM_MOUSE_DATA.FirstByte], al |
inc [esi+COM_MOUSE_DATA.MouseByteNumber] |
jmp .EndMouseInterrupt |
; Ñîõðàíèòü âòîðîé áàéò äàííûõ |
; Сохранить второй байт данных |
.SecondByte: |
test al, 1000000b |
jnz .Error |
284,14 → 284,14 |
mov [esi+COM_MOUSE_DATA.SecondByte], al |
inc [esi+COM_MOUSE_DATA.MouseByteNumber] |
jmp .EndMouseInterrupt |
; Ñîõðàíèòü òðåòèé áàéò äàííûõ |
; Сохранить третий байт данных |
.ThirdByte: |
test al, 1000000b |
jnz .Error |
mov [esi+COM_MOUSE_DATA.ThirdByte], al |
mov [esi+COM_MOUSE_DATA.MouseByteNumber], 0 |
; (Ïàêåò äàííûõ îò ìûøè ïðèíÿò ïîëíîñòüþ). |
; Çàïèñàòü íîâîå çíà÷åíèå ñîñòîÿíèÿ êíîïîê ìûøè |
; (Пакет данных от мыши принят полностью). |
; Записать новое значение состояния кнопок мыши |
mov al, [esi+COM_MOUSE_DATA.FirstByte] |
mov ah, al |
shr al, 3 |
302,7 → 302,7 |
movzx eax, al |
mov [BTN_DOWN], eax |
|
; Ïðèáàâèòü ïåðåìåùåíèå ïî X ê êîîðäèíàòå X |
; Прибавить перемещение по X к координате X |
mov al, [esi+COM_MOUSE_DATA.FirstByte] |
shl al, 6 |
or al, [esi+COM_MOUSE_DATA.SecondByte] |
311,7 → 311,7 |
movzx eax, ax |
mov [MOUSE_X], eax |
|
; Ïðèáàâèòü ïåðåìåùåíèå ïî Y ê êîîðäèíàòå Y |
; Прибавить перемещение по Y к координате Y |
mov al, [esi+COM_MOUSE_DATA.FirstByte] |
and al, 00001100b |
shl al, 4 |
327,8 → 327,8 |
jmp .EndMouseInterrupt |
|
.Error: |
; Ïðîèçîøåë ñáîé â ïîðÿäêå ïåðåäà÷è èíôîðìàöèè îò |
; ìûøè, îáíóëèòü ñ÷åò÷èê áàéòîâ ïàêåòà äàííûõ |
; Произошел сбой в порядке передачи информации от |
; мыши, обнулить счетчик байтов пакета данных |
|
mov [esi+COM_MOUSE_DATA.MouseByteNumber], 0 |
.EndMouseInterrupt: |
340,9 → 340,9 |
align 4 |
|
struc COM_MOUSE_DATA { |
; Íîìåð ïðèíèìàåìîãî îò ìûøè áàéòà |
; Номер принимаемого от мыши байта |
.MouseByteNumber db ? |
; Òðåõáàéòîâàÿ ñòðóêòóðà äàííûõ, ïåðåäàâàåìàÿ ìûøüþ |
; Трехбайтовая структура данных, передаваемая мышью |
.FirstByte db ? |
.SecondByte db ? |
.ThirdByte db ? |