Rev 473 | 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: 593 $ |
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 |
||
95 | cmp ax, [ScreenWidth] |
||
96 | jb .x2 |
||
97 | ; Установить координату X по правой границе |
||
98 | mov ax, [ScreenWidth] |
||
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 |
||
114 | cmp ax, [ScreenHeight] |
||
115 | jb .y2 |
||
116 | ; Установить координату Y по нижней границе |
||
117 | mov ax, [ScreenHeight] |
||
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 |