0,0 → 1,157 |
; Íîìåð ïðèíèìàåìîãî îò ìûøè áàéòà |
MouseByteNumber_2 DB 0 |
; Òðåõáàéòîâàÿ ñòðóêòóðà äàííûõ, ïåðåäàâàåìàÿ ìûøüþ |
FirstByte_2 DB 0 |
SecondByte_2 DB 0 |
ThirdByte_2 DB 0 |
|
;************************************** |
;* ÎÁÐÀÁÎÒ×ÈÊ ÏÐÅÐÛÂÀÍÈß ÎÒ ÌÛØÈ PS/2 * |
;************************************** |
check_mouse_data_ps2: |
cmp [ps2_mouse_detected],0 |
je @@EndMouseInterrupt_2 |
call Wait8042BufferEmpty ;î÷èñòêà áóôåðà |
in AL,0x60 ;ïîëó÷èòü ñêýí-êîä |
; Âûáèðàòü ïîðÿäêîâûé íîìåð ïðèíèìàåìîãî áàéòà |
cmp [MouseByteNumber_2],0 |
je @@SaveFirstByte |
cmp [MouseByteNumber_2],1 |
je @@SaveSecondByte |
cmp [MouseByteNumber_2],2 |
je @@SaveThirdByte |
jmp @@Error_2 |
; Çàïèñàòü ïåðâûé áàéò ïîñûëêè |
@@SaveFirstByte: |
test AL,1000b ;ïåðâûé áàéò ïîñûëêè? |
jz @@Error_2 ;ñáîé ñèíõðîíèçàöèè |
mov [FirstByte_2],AL |
inc [MouseByteNumber_2] |
jmp @@EndMouseInterrupt_2 |
; Çàïèñàòü âòîðîé áàéò ïîñûëêè |
@@SaveSecondByte: |
mov [SecondByte_2],AL |
inc [MouseByteNumber_2] |
jmp @@EndMouseInterrupt_2 |
; Çàïèñàòü òðåòèé áàéò ïîñûëêè |
@@SaveThirdByte: |
mov [ThirdByte_2],AL |
mov [MouseByteNumber_2],0 |
; (ïàêåò äàííûõ îò ìûøè ïðèíÿò ïîëíîñòüþ) |
; Çàïèñàòü íîâîå çíà÷åíèå áàéòà ñîñòîÿíèÿ êíîïîê |
mov al,[FirstByte_2] ;[0xfb01] |
and eax,3 |
mov [0xfb40],al |
mov [mouse_active],1 |
; Âû÷èñëèòü íîâóþ X-êîîðäèíàòó êóðñîðà |
; Çàíåñòè â AX ïåðåìåùåíèå ïî X |
mov AH,0 ;äóáëèðóåì çíàê âî âñå ðàçðÿäû AH |
mov AL,[FirstByte_2] |
test AL,10000b |
jz @@M0 |
mov AH,0FFh |
; Çàíåñòè â AL ìëàäøèé áàéò |
@@M0: |
mov AL,[SecondByte_2] |
shl ax,1 |
; Âû÷èñëèòü íîâîå çíà÷åíèå êîîðäèíàòû |
; êóðñîðà ïî X |
add AX,[0xFB0A] ;[XCoordinate] |
cmp AX,0 |
jge @@M1 |
mov AX,0 |
jmp @@M2 |
@@M1: |
cmp AX,[0xFE00] ;ScreenLength |
jl @@M2 |
mov AX,[0xFE00] ;ScreenLength-1 |
dec ax |
@@M2: |
mov [0xFB0A],AX ;[XCoordinate] |
|
; Âû÷èñëÿåì íîâóþ Y-êîîðäèíàòó êóðñîðà |
; Çàíåñòè â AX ïåðåìåùåíèå ïî Y |
mov AH,0 ;äóáëèðóåì çíàê âî âñå ðàçðÿäû AH |
mov AL,[FirstByte_2] |
test AL,100000b |
jz @@M3 |
mov AH,0FFh |
; Çàíåñòè â AL ìëàäøèé áàéò |
@@M3: |
mov AL,[ThirdByte_2] |
shl ax,1 |
; Âû÷èñëèòü íîâîå çíà÷åíèå êîîðäèíàòû êóðñîðà |
; ïî Y (Y-êîîðäèíàòà ìûøè PS/2 íàïðàâëåíà |
; ïðîòèâîïîëîæíî ýêðàííîé) |
neg AX |
add AX,[0xFB0C] ;[YCoordinate] |
cmp AX,0 |
jge @@M4 |
mov AX,0 |
jmp @@M5 |
@@M4: |
cmp AX,[0xFE04] ;ScreenHeigth |
jl @@M5 |
mov AX,[0xFE04] ;ScreenHeigth-1 |
dec ax |
@@M5: |
mov [0xFB0C],AX ;[YCoordinate] |
|
; Ïîêàçàòü êóðñîð â íîâîé ïîçèöèè |
jmp @@EndMouseInterrupt_2 |
|
; Îáíàðóæåí ñáîé â ïîðÿäêå ïåðåäà÷è èíôîðìàöèè îò ìûøè |
@@Error_2: |
mov [MouseByteNumber_2],0 |
; Íîðìàëüíîå çàâåðøåíèå ïðåðûâàíèÿ |
@@EndMouseInterrupt_2: |
call ready_for_next_irq_1 |
ret |
|
;*********************************************** |
;* ÎÆÈÄÀÍÈÅ Î×ÈÑÒÊÈ ÂÕÎÄÍÎÃÎ ÁÓÔÅÐÀ I8042 * |
;* Ïðè âûõîäå èç ïðîöåäóðû: * |
;* ôëàã ZF óñòàíîâëåí - íîðìàëüíîå çàâåðøåíèå, * |
;* ôëàã ZF ñáðîøåí - îøèáêà òàéì-àóòà. * |
;*********************************************** |
Wait8042BufferEmpty: |
; push CX |
; mov CX,0FFFFh ;çàäàòü ÷èñëî öèêëîâ îæèäàíèÿ |
;@@kb: |
; in AL,64h ;ïîëó÷èòü ñòàòóñ |
; test AL,10b ;áóôåð i8042 ñâîáîäåí? |
; loopnz @@kb ;åñëè íåò, òî öèêë |
; pop CX |
push ecx |
xor ecx,ecx |
@@: |
in al,64h |
test al,00000010b |
loopnz @b |
pop ecx |
;Åñëè ïðè âûõîäå èç ïîäïðîãðàììû ñáðîøåí |
;ôëàã ZF - îøèáêà |
ret ;âîçâðàò â ïîäïðîãðàììó |
|
;*************************************** |
;* ÎÆÈÄÀÍÈÅ ÏÎÑÒÓÏËÅÍÈß ÄÀÍÍÛÕ ÎÒ ÌÛØÈ * |
;*************************************** |
WaitMouseData: |
; push CX |
; mov CX,0FFFFh ;çàäàòü ÷èñëî öèêëîâ îæèäàíèÿ |
;@@mouse: |
; in AL,64h ;îïðîñèòü ðåãèñòð ñòàòóñà |
; test AL,100000b ;äàííûå ïîñòóïèëè? |
; loopz @@mouse ;åñëè íåò, òî öèêë |
; pop CX |
push ecx |
mov ECX,0FFFFh |
@@: |
in al,64h |
test al,100000b |
loopz @b |
pop ecx |
;Åñëè ïðè âûõîäå èç ïîäïðîãðàììû óñòàíîâëåí |
;ôëàã ZF - îøèáêà |
ret |
|