Subversion Repositories Kolibri OS

Rev

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

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