Subversion Repositories Kolibri OS

Rev

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

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