Subversion Repositories Kolibri OS

Rev

Go to most recent revision | Details | Last modification | View Log | RSS feed

Rev Author Line No. Line
473 diamond 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