Subversion Repositories Kolibri OS

Rev

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

Rev Author Line No. Line
473 diamond 1
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
2
;;                                                              ;;
3
;; Copyright (C) KolibriOS team 2004-2007. All rights reserved. ;;
4
;; Distributed under terms of the GNU General Public License    ;;
5
;;                                                              ;;
6
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
7
 
593 mikedld 8
$Revision: 753 $
9
 
10
 
473 diamond 11
struc COM_MOUSE_DATA {
12
; Номер принимаемого от мыши байта
13
        .MouseByteNumber        db      ?
14
; Трехбайтовая структура данных, передаваемая мышью
15
        .FirstByte              db      ?
16
        .SecondByte             db      ?
17
        .ThirdByte              db      ?
18
        .timer_ticks_com        dd      ?
19
}
20
virtual at 0
21
 COM_MOUSE_DATA COM_MOUSE_DATA
22
end virtual
23
 
24
uglobal
25
com1_mouse COM_MOUSE_DATA
26
com2_mouse COM_MOUSE_DATA
27
endg
28
 
29
;***************************************
30
;* НОВЫЙ ОБРАБОТЧИК ПРЕРЫВАНИЯ ОТ МЫШИ *
31
;***************************************
32
check_mouse_data_com:
33
; in: esi -> COM_MOUSE_DATA struc, dx = base port (xF8h)
34
        add     edx, 5          ; xFDh
35
        in      al, dx
36
        test    al, 1           ; Данные готовы?
37
        jz      .Error
38
; Ввести данные
39
        sub     edx, 5
40
        in      al, dx
41
; Сбросить старший незначащий бит
42
        and     al, 01111111b
43
 
44
; Определить порядковый номер принимаемого байта
45
        cmp     [esi+COM_MOUSE_DATA.MouseByteNumber], 2
46
        ja      .Error
47
        jz      .ThirdByte
48
        jp      .SecondByte
49
; Сохранить первый байт данных
50
.FirstByte:
51
        test    al, 1000000b    ; Первый байт посылки?
52
        jz      .Error
53
        mov     [esi+COM_MOUSE_DATA.FirstByte], al
54
        inc     [esi+COM_MOUSE_DATA.MouseByteNumber]
55
        jmp     .EndMouseInterrupt
56
; Сохранить второй байт данных
57
.SecondByte:
58
        test    al, 1000000b
59
        jnz     .Error
60
        mov     [esi+COM_MOUSE_DATA.SecondByte], al
61
        inc     [esi+COM_MOUSE_DATA.MouseByteNumber]
62
        jmp     .EndMouseInterrupt
63
; Сохранить третий байт данных
64
.ThirdByte:
65
        test    al, 1000000b
66
        jnz     .Error
67
        mov     [esi+COM_MOUSE_DATA.ThirdByte], al
68
        mov     [esi+COM_MOUSE_DATA.MouseByteNumber], 0
69
; (Пакет данных от мыши принят полностью).
70
; Записать новое значение состояния кнопок мыши
71
        mov     al, [esi+COM_MOUSE_DATA.FirstByte]
72
        mov     ah, al
73
        shr     al, 3
74
        and     al, 2
75
        shr     ah, 5
76
        and     ah, 1
77
        add     al, ah
78
        mov     [BTN_DOWN], al
79
        mov     [mouse_active], 1
80
; Прибавить перемещение по X к координате X
81
        mov     al, [esi+COM_MOUSE_DATA.FirstByte]
82
        shl     al, 6
83
        or      al, [esi+COM_MOUSE_DATA.SecondByte]
84
        call    mouse_acceleration_com
85
; mouse acceleration
86
        mov     ecx, [timer_ticks]
87
        sub     ecx, [esi+COM_MOUSE_DATA.timer_ticks_com]
88
        cmp     ecx, [mouse_delay]
89
        ja      @f
90
        imul    ax, [mouse_speed_factor]
91
@@:
92
        add     ax, [MOUSE_X]
93
; Курсор не должен выходить за левую или правую границу экрана
94
        js      .x1
753 serge 95
        cmp     ax, [Screen_Max_X]
473 diamond 96
        jb      .x2
97
; Установить координату X по правой границе
753 serge 98
        mov     ax, [Screen_Max_X]
473 diamond 99
        jmp     .x2
100
.x1:
101
; Установить координату X по левой границе
102
        xor     eax, eax
103
.x2:
104
        mov     [MOUSE_X], ax
105
; Прибавить перемещение по Y к координате Y
106
        mov     al, [esi+COM_MOUSE_DATA.FirstByte]
107
        and     al, 00001100b
108
        shl     al, 4
109
        or      al, [esi+COM_MOUSE_DATA.ThirdByte]
110
        call    mouse_acceleration_com
111
        add     ax, [MOUSE_Y]
112
; Курсор не должен выходить за верхнюю или нижнюю границу экрана
113
        js      .y1
753 serge 114
        cmp     ax, [Screen_Max_Y]
473 diamond 115
        jb      .y2
116
; Установить координату Y по нижней границе
753 serge 117
        mov     ax, [Screen_Max_Y]
473 diamond 118
        jmp     .y2
119
.y1:
120
; Установить координату Y по верхней границе
121
        xor     eax, eax
122
.y2:
123
        mov     [MOUSE_Y], ax
124
        mov     eax, [timer_ticks]
125
        mov     [esi+COM_MOUSE_DATA.timer_ticks_com], eax
126
        jmp     .EndMouseInterrupt
127
 
128
.Error:
129
; Произошел сбой в порядке передачи информации от
130
; мыши, обнулить счетчик байтов пакета данных
131
        mov     [esi+COM_MOUSE_DATA.MouseByteNumber],0
132
.EndMouseInterrupt:
133
        jmp     ready_for_next_irq
134
 
135
mouse_acceleration_com:
136
        cbw
137
        mov     ecx, [timer_ticks]
138
        sub     ecx, [esi+COM_MOUSE_DATA.timer_ticks_com]
139
        cmp     ecx, [mouse_delay]
140
        ja      @f
141
        imul    ax, [mouse_speed_factor]
142
@@:
143
        ret