Subversion Repositories Kolibri OS

Rev

Rev 480 | Blame | Compare with Previous | Last modification | View Log | Download | RSS feed

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