Subversion Repositories Kolibri OS

Rev

Rev 593 | 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: 753 $
  9.  
  10.  
  11. struc COM_MOUSE_DATA {
  12. ; Íîìåð ïðèíèìàåìîãî îò ìûøè áàéòà
  13.         .MouseByteNumber        db      ?
  14. ; Òðåõáàéòîâàÿ ñòðóêòóðà äàííûõ, ïåðåäàâàåìàÿ ìûøüþ
  15.         .FirstByte              db      ?
  16.         .SecondByte             db      ?
  17.         .ThirdByte              db      ?
  18.         .timer_ticks_com        dd      ?
  19. }
  20. virtual at 0
  21.  COM_MOUSE_DATA COM_MOUSE_DATA
  22. end virtual
  23.  
  24. uglobal
  25. com1_mouse COM_MOUSE_DATA
  26. com2_mouse COM_MOUSE_DATA
  27. endg
  28.  
  29. ;***************************************
  30. ;* ÍÎÂÛÉ ÎÁÐÀÁÎÒ×ÈÊ ÏÐÅÐÛÂÀÍÈß ÎÒ ÌÛØÈ *
  31. ;***************************************
  32. check_mouse_data_com:
  33. ; in: esi -> COM_MOUSE_DATA struc, dx = base port (xF8h)
  34.         add     edx, 5          ; xFDh
  35.         in      al, dx
  36.         test    al, 1           ; Äàííûå ãîòîâû?
  37.         jz      .Error
  38. ; Ââåñòè äàííûå
  39.         sub     edx, 5
  40.         in      al, dx
  41. ; Ñáðîñèòü ñòàðøèé íåçíà÷àùèé áèò
  42.         and     al, 01111111b
  43.  
  44. ; Îïðåäåëèòü ïîðÿäêîâûé íîìåð ïðèíèìàåìîãî áàéòà
  45.         cmp     [esi+COM_MOUSE_DATA.MouseByteNumber], 2
  46.         ja      .Error
  47.         jz      .ThirdByte
  48.         jp      .SecondByte
  49. ; Ñîõðàíèòü ïåðâûé áàéò äàííûõ
  50. .FirstByte:
  51.         test    al, 1000000b    ; Ïåðâûé áàéò ïîñûëêè?
  52.         jz      .Error
  53.         mov     [esi+COM_MOUSE_DATA.FirstByte], al
  54.         inc     [esi+COM_MOUSE_DATA.MouseByteNumber]
  55.         jmp     .EndMouseInterrupt
  56. ; Ñîõðàíèòü âòîðîé áàéò äàííûõ
  57. .SecondByte:
  58.         test    al, 1000000b
  59.         jnz     .Error
  60.         mov     [esi+COM_MOUSE_DATA.SecondByte], al
  61.         inc     [esi+COM_MOUSE_DATA.MouseByteNumber]
  62.         jmp     .EndMouseInterrupt
  63. ; Ñîõðàíèòü òðåòèé áàéò äàííûõ
  64. .ThirdByte:
  65.         test    al, 1000000b
  66.         jnz     .Error
  67.         mov     [esi+COM_MOUSE_DATA.ThirdByte], al
  68.         mov     [esi+COM_MOUSE_DATA.MouseByteNumber], 0
  69. ; (Ïàêåò äàííûõ îò ìûøè ïðèíÿò ïîëíîñòüþ).
  70. ; Çàïèñàòü íîâîå çíà÷åíèå ñîñòîÿíèÿ êíîïîê ìûøè
  71.         mov     al, [esi+COM_MOUSE_DATA.FirstByte]
  72.         mov     ah, al
  73.         shr     al, 3
  74.         and     al, 2
  75.         shr     ah, 5
  76.         and     ah, 1
  77.         add     al, ah
  78.         mov     [BTN_DOWN], al
  79.         mov     [mouse_active], 1
  80. ; Ïðèáàâèòü ïåðåìåùåíèå ïî X ê êîîðäèíàòå X
  81.         mov     al, [esi+COM_MOUSE_DATA.FirstByte]
  82.         shl     al, 6
  83.         or      al, [esi+COM_MOUSE_DATA.SecondByte]
  84.         call    mouse_acceleration_com
  85. ; mouse acceleration
  86.         mov     ecx, [timer_ticks]
  87.         sub     ecx, [esi+COM_MOUSE_DATA.timer_ticks_com]
  88.         cmp     ecx, [mouse_delay]
  89.         ja      @f
  90.         imul    ax, [mouse_speed_factor]
  91. @@:
  92.         add     ax, [MOUSE_X]
  93. ; Êóðñîð íå äîëæåí âûõîäèòü çà ëåâóþ èëè ïðàâóþ ãðàíèöó ýêðàíà
  94.         js      .x1
  95.         cmp     ax, [Screen_Max_X]
  96.         jb      .x2
  97. ; Óñòàíîâèòü êîîðäèíàòó X ïî ïðàâîé ãðàíèöå
  98.         mov     ax, [Screen_Max_X]
  99.         jmp     .x2
  100. .x1:
  101. ; Óñòàíîâèòü êîîðäèíàòó X ïî ëåâîé ãðàíèöå
  102.         xor     eax, eax
  103. .x2:
  104.         mov     [MOUSE_X], ax
  105. ; Ïðèáàâèòü ïåðåìåùåíèå ïî Y ê êîîðäèíàòå Y
  106.         mov     al, [esi+COM_MOUSE_DATA.FirstByte]
  107.         and     al, 00001100b
  108.         shl     al, 4
  109.         or      al, [esi+COM_MOUSE_DATA.ThirdByte]
  110.         call    mouse_acceleration_com
  111.         add     ax, [MOUSE_Y]
  112. ; Êóðñîð íå äîëæåí âûõîäèòü çà âåðõíþþ èëè íèæíþþ ãðàíèöó ýêðàíà
  113.         js      .y1
  114.         cmp     ax, [Screen_Max_Y]
  115.         jb      .y2
  116. ; Óñòàíîâèòü êîîðäèíàòó Y ïî íèæíåé ãðàíèöå
  117.         mov     ax, [Screen_Max_Y]
  118.         jmp     .y2
  119. .y1:
  120. ; Óñòàíîâèòü êîîðäèíàòó Y ïî âåðõíåé ãðàíèöå
  121.         xor     eax, eax
  122. .y2:
  123.         mov     [MOUSE_Y], ax
  124.         mov     eax, [timer_ticks]
  125.         mov     [esi+COM_MOUSE_DATA.timer_ticks_com], eax
  126.         jmp     .EndMouseInterrupt
  127.  
  128. .Error:
  129. ; Ïðîèçîøåë ñáîé â ïîðÿäêå ïåðåäà÷è èíôîðìàöèè îò
  130. ; ìûøè, îáíóëèòü ñ÷åò÷èê áàéòîâ ïàêåòà äàííûõ
  131.         mov     [esi+COM_MOUSE_DATA.MouseByteNumber],0
  132. .EndMouseInterrupt:
  133.         jmp     ready_for_next_irq
  134.  
  135. mouse_acceleration_com:
  136.         cbw
  137.         mov     ecx, [timer_ticks]
  138.         sub     ecx, [esi+COM_MOUSE_DATA.timer_ticks_com]
  139.         cmp     ecx, [mouse_delay]
  140.         ja      @f
  141.         imul    ax, [mouse_speed_factor]
  142. @@:
  143.         ret
  144.