Subversion Repositories Kolibri OS

Rev

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