Subversion Repositories Kolibri OS

Rev

Rev 381 | Go to most recent revision | Blame | Last modification | View Log | Download | RSS feed

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