Subversion Repositories Kolibri OS

Rev

Blame | 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.