Subversion Repositories Kolibri OS

Rev

Rev 381 | Go to most recent revision | Blame | Last modification | View Log | Download | RSS feed

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