Subversion Repositories Kolibri OS

Rev

Rev 387 | Go to most recent revision | Details | Compare with Previous | Last modification | View Log | RSS feed

Rev Author Line No. Line
444 serge 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
 
33 mario79 9
; Номер принимаемого от мыши байта
10
MouseByteNumber DB 0
11
; Трехбайтовая структура данных, передаваемая мышью
12
FirstByte       DB 0
13
SecondByte      DB 0
14
ThirdByte       DB 0
120 mario79 15
timer_ticks_com dd 0
33 mario79 16
;***************************************
17
;* НОВЫЙ ОБРАБОТЧИК ПРЕРЫВАНИЯ ОТ МЫШИ *
18
;***************************************
19
check_mouse_data_com1:
58 mario79 20
;        cmp     [com1_mouse_detected],0
21
;        je      @@EndMouseInterrupt
33 mario79 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
381 serge 72
        mov    [BTN_DOWN],al
33 mario79 73
        mov    [mouse_active],1
74
; Прибавить перемещение по X к координате X
75
        mov     AL,[FirstByte]
76
        shl     AL,6
77
        or      AL,[SecondByte]
78
        cbw
120 mario79 79
        call    mouse_acceleration_com1
381 serge 80
        add     AX,[MOUSE_X]    ;[XCoordinate]
33 mario79 81
        ; Курсор не должен выходить за левую или
82
        ; правую границу экрана
83
        js      @@X1
381 serge 84
        cmp     AX,[ScreenWidth]   ;ScreenLength
33 mario79 85
        jb      @@X2
86
        ; Установить координату X по правой границе
381 serge 87
        mov     AX,[ScreenWidth]   ;ScreenLength-1
33 mario79 88
        dec     ax
89
        jmp     @@X2
90
@@X1:
91
       ; Установить координату X по левой границе
92
        xor     AX,AX
93
@@X2:
381 serge 94
        mov     [MOUSE_X],AX     ;[XCoordinate]
33 mario79 95
        ; Прибавить перемещение по Y к координате Y
96
        mov     AL,[FirstByte]
97
        and     AL,00001100b
98
        shl     AL,4
99
        or      AL,[ThirdByte]
100
        cbw
120 mario79 101
        call    mouse_acceleration_com1
381 serge 102
        add     AX,[MOUSE_Y]   ;[YCoordinate]
33 mario79 103
        ; Курсор не должен выходить за верхнюю или
104
        ; нижнюю границу экрана
105
        js      @@Y1
381 serge 106
        cmp     AX,[ScreenHeight]  ;ScreenHeigth
33 mario79 107
        jb      @@Y2
108
        ; Установить координату X по нижней границе
381 serge 109
        mov     AX,[ScreenHeight] ;ScreenHeigth-1
33 mario79 110
        dec     ax
111
        jmp     @@Y2
112
@@Y1:
113
       ; Установить координату X по верхней границе
114
        xor     AX,AX
115
@@Y2:
381 serge 116
        mov     [MOUSE_Y],AX     ;[YCoordinate]
120 mario79 117
        mov   eax,[timer_ticks]
118
        mov   [timer_ticks_com],eax
33 mario79 119
        jmp     @@EndMouseInterrupt
120
 
121
@@Error:
122
; Произошел сбой в порядке передачи информации от
123
; мыши, обнулить счетчик байтов пакета данных
124
        mov     [MouseByteNumber],0
125
@@EndMouseInterrupt:
126
        call  ready_for_next_irq
127
        ret
128
 
120 mario79 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
127 mario79 136
        imul  ax,[mouse_speed_factor]
120 mario79 137
@@:
138
        ret