Subversion Repositories Kolibri OS

Rev

Blame | Last modification | View Log | Download | RSS feed

  1. ; Íîìåð ïðèíèìàåìîãî îò ìûøè áàéòà
  2. MouseByteNumber_2 DB 0
  3. ; Òðåõáàéòîâàÿ ñòðóêòóðà äàííûõ, ïåðåäàâàåìàÿ ìûøüþ
  4. FirstByte_2       DB 0
  5. SecondByte_2      DB 0
  6. ThirdByte_2       DB 0
  7.  
  8. ;**************************************
  9. ;* ÎÁÐÀÁÎÒ×ÈÊ ÏÐÅÐÛÂÀÍÈß ÎÒ ÌÛØÈ PS/2 *
  10. ;**************************************
  11. check_mouse_data_ps2:
  12.         cmp     [ps2_mouse_detected],0
  13.         je      @@EndMouseInterrupt_2
  14.         call    Wait8042BufferEmpty ;î÷èñòêà áóôåðà
  15.         in      AL,0x60              ;ïîëó÷èòü ñêýí-êîä
  16. ; Âûáèðàòü ïîðÿäêîâûé íîìåð ïðèíèìàåìîãî áàéòà
  17.         cmp     [MouseByteNumber_2],0
  18.         je      @@SaveFirstByte
  19.         cmp     [MouseByteNumber_2],1
  20.         je      @@SaveSecondByte
  21.         cmp     [MouseByteNumber_2],2
  22.         je      @@SaveThirdByte
  23.         jmp     @@Error_2
  24. ; Çàïèñàòü ïåðâûé áàéò ïîñûëêè
  25. @@SaveFirstByte:
  26.         test    AL,1000b  ;ïåðâûé áàéò ïîñûëêè?
  27.         jz      @@Error_2     ;ñáîé ñèíõðîíèçàöèè
  28.         mov     [FirstByte_2],AL
  29.         inc     [MouseByteNumber_2]
  30.         jmp     @@EndMouseInterrupt_2
  31. ; Çàïèñàòü âòîðîé áàéò ïîñûëêè
  32. @@SaveSecondByte:
  33.         mov     [SecondByte_2],AL
  34.         inc     [MouseByteNumber_2]
  35.         jmp     @@EndMouseInterrupt_2
  36. ; Çàïèñàòü òðåòèé áàéò ïîñûëêè
  37. @@SaveThirdByte:
  38.         mov     [ThirdByte_2],AL
  39.         mov     [MouseByteNumber_2],0
  40. ; (ïàêåò äàííûõ îò ìûøè ïðèíÿò ïîëíîñòüþ)
  41. ; Çàïèñàòü íîâîå çíà÷åíèå áàéòà ñîñòîÿíèÿ êíîïîê
  42.         mov al,[FirstByte_2]   ;[0xfb01]
  43.         and    eax,3
  44.         mov    [0xfb40],al
  45.         mov    [mouse_active],1
  46. ; Âû÷èñëèòü íîâóþ X-êîîðäèíàòó êóðñîðà
  47.         ; Çàíåñòè â AX ïåðåìåùåíèå ïî X
  48.         mov     AH,0   ;äóáëèðóåì çíàê âî âñå ðàçðÿäû AH
  49.         mov     AL,[FirstByte_2]
  50.         test    AL,10000b    
  51.         jz      @@M0
  52.         mov     AH,0FFh
  53.         ; Çàíåñòè â AL ìëàäøèé áàéò
  54. @@M0:
  55.          mov     AL,[SecondByte_2]
  56.          shl  ax,1
  57.         ; Âû÷èñëèòü íîâîå çíà÷åíèå êîîðäèíàòû
  58.         ; êóðñîðà ïî X
  59.         add     AX,[0xFB0A]    ;[XCoordinate]
  60.         cmp     AX,0
  61.         jge     @@M1
  62.         mov     AX,0
  63.         jmp     @@M2
  64. @@M1:
  65.         cmp     AX,[0xFE00]   ;ScreenLength
  66.         jl      @@M2
  67.         mov     AX,[0xFE00]   ;ScreenLength-1
  68.         dec     ax
  69. @@M2:
  70.         mov     [0xFB0A],AX     ;[XCoordinate]
  71.  
  72. ; Âû÷èñëÿåì íîâóþ Y-êîîðäèíàòó êóðñîðà
  73.         ; Çàíåñòè â AX ïåðåìåùåíèå ïî Y
  74.         mov     AH,0   ;äóáëèðóåì çíàê âî âñå ðàçðÿäû AH
  75.         mov     AL,[FirstByte_2]
  76.         test    AL,100000b
  77.         jz      @@M3
  78.         mov     AH,0FFh
  79.         ; Çàíåñòè â AL ìëàäøèé áàéò
  80. @@M3:
  81.         mov     AL,[ThirdByte_2]
  82.          shl  ax,1
  83.         ; Âû÷èñëèòü íîâîå çíà÷åíèå êîîðäèíàòû êóðñîðà
  84.         ; ïî Y (Y-êîîðäèíàòà ìûøè PS/2 íàïðàâëåíà
  85.         ; ïðîòèâîïîëîæíî ýêðàííîé)
  86.         neg     AX  
  87.         add     AX,[0xFB0C]   ;[YCoordinate]
  88.         cmp     AX,0
  89.         jge     @@M4
  90.         mov     AX,0
  91.         jmp     @@M5
  92. @@M4:
  93.         cmp     AX,[0xFE04]  ;ScreenHeigth
  94.         jl      @@M5
  95.         mov     AX,[0xFE04] ;ScreenHeigth-1
  96.         dec     ax
  97. @@M5:
  98.         mov     [0xFB0C],AX     ;[YCoordinate]
  99.  
  100. ; Ïîêàçàòü êóðñîð â íîâîé ïîçèöèè
  101.         jmp     @@EndMouseInterrupt_2
  102.  
  103. ; Îáíàðóæåí ñáîé â ïîðÿäêå ïåðåäà÷è èíôîðìàöèè îò ìûøè
  104. @@Error_2:
  105.         mov   [MouseByteNumber_2],0
  106. ; Íîðìàëüíîå çàâåðøåíèå ïðåðûâàíèÿ
  107. @@EndMouseInterrupt_2:
  108.         call  ready_for_next_irq_1
  109.         ret
  110.                        
  111. ;***********************************************
  112. ;*   ÎÆÈÄÀÍÈÅ Î×ÈÑÒÊÈ ÂÕÎÄÍÎÃÎ ÁÓÔÅÐÀ I8042    *
  113. ;* Ïðè âûõîäå èç ïðîöåäóðû:                    *
  114. ;* ôëàã ZF óñòàíîâëåí - íîðìàëüíîå çàâåðøåíèå, *
  115. ;* ôëàã ZF ñáðîøåí - îøèáêà òàéì-àóòà.         *
  116. ;***********************************************
  117. Wait8042BufferEmpty:
  118. ;        push    CX
  119. ;        mov     CX,0FFFFh  ;çàäàòü ÷èñëî öèêëîâ îæèäàíèÿ
  120. ;@@kb:
  121. ;        in      AL,64h     ;ïîëó÷èòü ñòàòóñ
  122. ;        test    AL,10b     ;áóôåð i8042 ñâîáîäåí?
  123. ;        loopnz  @@kb       ;åñëè íåò, òî öèêë
  124. ;        pop     CX
  125.         push ecx
  126.         xor ecx,ecx
  127.       @@:
  128.         in     al,64h
  129.         test    al,00000010b
  130.         loopnz @b
  131.         pop    ecx
  132.         ;Åñëè ïðè âûõîäå èç ïîäïðîãðàììû ñáðîøåí
  133.         ;ôëàã ZF - îøèáêà
  134.         ret                   ;âîçâðàò â ïîäïðîãðàììó
  135.  
  136. ;***************************************
  137. ;* ÎÆÈÄÀÍÈÅ ÏÎÑÒÓÏËÅÍÈß ÄÀÍÍÛÕ ÎÒ ÌÛØÈ *
  138. ;***************************************
  139. WaitMouseData:
  140. ;        push    CX            
  141. ;        mov     CX,0FFFFh  ;çàäàòü ÷èñëî öèêëîâ îæèäàíèÿ
  142. ;@@mouse:
  143. ;        in      AL,64h     ;îïðîñèòü ðåãèñòð ñòàòóñà
  144. ;        test    AL,100000b ;äàííûå ïîñòóïèëè?
  145. ;        loopz   @@mouse    ;åñëè íåò, òî öèêë
  146. ;        pop     CX
  147.         push ecx
  148.         mov     ECX,0FFFFh
  149.       @@:
  150.         in     al,64h
  151.         test    al,100000b
  152.         loopz @b
  153.         pop    ecx
  154.         ;Åñëè ïðè âûõîäå èç ïîäïðîãðàììû óñòàíîâëåí
  155.         ;ôëàã ZF - îøèáêà
  156.         ret  
  157.  
  158.