Subversion Repositories Kolibri OS

Rev

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