Subversion Repositories Kolibri OS

Rev

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

  1. $Revision: 431 $
  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.         cmp     AX,0
  70.         jge     @@M1
  71.         mov     AX,0
  72.         jmp     @@M2
  73. @@M1:
  74.         cmp     AX,[ScreenWidth]   ;ScreenLength
  75.         jl      @@M2
  76.         mov     AX,[ScreenWidth]   ;ScreenLength-1
  77.         dec     ax
  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.         cmp     AX,0
  98.         jge     @@M4
  99.         mov     AX,0
  100.         jmp     @@M5
  101. @@M4:
  102.         cmp     AX,[ScreenHeight]  ;ScreenHeigth
  103.         jl      @@M5
  104.         mov     AX,[ScreenHeight] ;ScreenHeigth-1
  105.         dec     ax
  106. @@M5:
  107.         mov     [MOUSE_Y],AX     ;[YCoordinate]
  108.  
  109. ; Ïîêàçàòü êóðñîð â íîâîé ïîçèöèè
  110.         mov   eax,[timer_ticks]
  111.         mov   [timer_ticks_ps2],eax
  112.         jmp     @@EndMouseInterrupt_2
  113.  
  114. ; Îáíàðóæåí ñáîé â ïîðÿäêå ïåðåäà÷è èíôîðìàöèè îò ìûøè
  115. @@Error_2:
  116.         mov   [MouseByteNumber_2],0
  117. ; Íîðìàëüíîå çàâåðøåíèå ïðåðûâàíè
  118. @@EndMouseInterrupt_2:
  119.         call  ready_for_next_irq_1
  120.         ret
  121.  
  122. mouse_acceleration_ps2:
  123.         push    eax
  124.         mov   eax,[timer_ticks]
  125.         sub   eax,[timer_ticks_ps2]
  126.         cmp   eax,[mouse_delay]
  127.         pop    eax
  128.         ja     @f
  129.         imul  ax,[mouse_speed_factor]
  130. @@:
  131.         ret
  132. ;***********************************************
  133. ;*   ÎÆÈÄÀÍÈÅ Î×ÈÑÒÊÈ ÂÕÎÄÍÎÃÎ ÁÓÔÅÐÀ I8042    *
  134. ;* Ïðè âûõîäå èç ïðîöåäóðû:                    *
  135. ;* ôëàã ZF óñòàíîâëåí - íîðìàëüíîå çàâåðøåíèå, *
  136. ;* ôëàã ZF ñáðîøåí - îøèáêà òàéì-àóòà.         *
  137. ;***********************************************
  138. Wait8042BufferEmpty:
  139. ;        push    CX
  140. ;        mov     CX,0FFFFh  ;çàäàòü ÷èñëî öèêëîâ îæèäàíè
  141. ;@@kb:
  142. ;        in      AL,64h     ;ïîëó÷èòü ñòàòóñ
  143. ;        test    AL,10b     ;áóôåð i8042 ñâîáîäåí?
  144. ;        loopnz  @@kb       ;åñëè íåò, òî öèêë
  145. ;        pop     CX
  146.         push ecx
  147.         xor ecx,ecx
  148.       @@:
  149.         in     al,64h
  150.         test    al,00000010b
  151.         loopnz @b
  152.         pop    ecx
  153.         ;Åñëè ïðè âûõîäå èç ïîäïðîãðàììû ñáðîøåí
  154.         ;ôëàã ZF - îøèáêà
  155.         ret                   ;âîçâðàò â ïîäïðîãðàììó
  156.  
  157. ;***************************************
  158. ;* ÎÆÈÄÀÍÈÅ ÏÎÑÒÓÏËÅÍÈß ÄÀÍÍÛÕ ÎÒ ÌÛØÈ *
  159. ;***************************************
  160. WaitMouseData:
  161. ;        push    CX
  162. ;        mov     CX,0FFFFh  ;çàäàòü ÷èñëî öèêëîâ îæèäàíè
  163. ;@@mouse:
  164. ;        in      AL,64h     ;îïðîñèòü ðåãèñòð ñòàòóñà
  165. ;        test    AL,100000b ;äàííûå ïîñòóïèëè?
  166. ;        loopz   @@mouse    ;åñëè íåò, òî öèêë
  167. ;        pop     CX
  168.         push ecx
  169.         mov     ECX,0FFFFh
  170.       @@:
  171.         in     al,64h
  172.         test    al,100000b
  173.         loopz @b
  174.         pop    ecx
  175.         ;Åñëè ïðè âûõîäå èç ïîäïðîãðàììû óñòàíîâëåí
  176.         ;ôëàã ZF - îøèáêà
  177.         ret
  178.  
  179.