Subversion Repositories Kolibri OS

Compare Revisions

Regard whitespace Rev 32 → Rev 33

/kernel/trunk/hid/m_ps2.inc
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