Rev 425 | Go to most recent revision | Details | Compare with Previous | Last modification | View Log | RSS feed
Rev | Author | Line No. | Line |
---|---|---|---|
425 | victor | 1 | $Revision: 431 $ |
431 | serge | 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_2 DB 0 |
||
11 | ; Трехбайтовая структура данных, передаваемая мышью |
||
12 | FirstByte_2 DB 0 |
||
13 | SecondByte_2 DB 0 |
||
14 | ThirdByte_2 DB 0 |
||
120 | mario79 | 15 | timer_ticks_ps2 dd 0 |
33 | mario79 | 16 | |
17 | ;************************************** |
||
18 | ;* ОБРАБОТЧИК ПРЕРЫВАНИЯ ОТ МЫШИ PS/2 * |
||
19 | ;************************************** |
||
20 | check_mouse_data_ps2: |
||
21 | cmp [ps2_mouse_detected],0 |
||
22 | je @@EndMouseInterrupt_2 |
||
23 | call Wait8042BufferEmpty ;очистка буфера |
||
24 | in AL,0x60 ;получить скэн-код |
||
25 | ; Выбирать порядковый номер принимаемого байта |
||
26 | cmp [MouseByteNumber_2],0 |
||
27 | je @@SaveFirstByte |
||
28 | cmp [MouseByteNumber_2],1 |
||
29 | je @@SaveSecondByte |
||
30 | cmp [MouseByteNumber_2],2 |
||
31 | je @@SaveThirdByte |
||
32 | jmp @@Error_2 |
||
33 | ; Записать первый байт посылки |
||
34 | @@SaveFirstByte: |
||
35 | test AL,1000b ;первый байт посылки? |
||
36 | jz @@Error_2 ;сбой синхронизации |
||
37 | mov [FirstByte_2],AL |
||
38 | inc [MouseByteNumber_2] |
||
39 | jmp @@EndMouseInterrupt_2 |
||
40 | ; Записать второй байт посылки |
||
41 | @@SaveSecondByte: |
||
42 | mov [SecondByte_2],AL |
||
43 | inc [MouseByteNumber_2] |
||
44 | jmp @@EndMouseInterrupt_2 |
||
45 | ; Записать третий байт посылки |
||
46 | @@SaveThirdByte: |
||
47 | mov [ThirdByte_2],AL |
||
48 | mov [MouseByteNumber_2],0 |
||
49 | ; (пакет данных от мыши принят полностью) |
||
50 | ; Записать новое значение байта состояния кнопок |
||
51 | mov al,[FirstByte_2] ;[0xfb01] |
||
52 | and eax,3 |
||
381 | serge | 53 | mov [BTN_DOWN],al |
33 | mario79 | 54 | mov [mouse_active],1 |
55 | ; Вычислить новую X-координату курсора |
||
56 | ; Занести в AX перемещение по X |
||
57 | mov AH,0 ;дублируем знак во все разряды AH |
||
58 | mov AL,[FirstByte_2] |
||
381 | serge | 59 | test AL,10000b |
33 | mario79 | 60 | jz @@M0 |
61 | mov AH,0FFh |
||
62 | ; Занести в AL младший байт |
||
63 | @@M0: |
||
64 | mov AL,[SecondByte_2] |
||
120 | mario79 | 65 | call mouse_acceleration_ps2 |
33 | mario79 | 66 | ; Вычислить новое значение координаты |
67 | ; курсора по X |
||
381 | serge | 68 | add AX,[MOUSE_X] ;[XCoordinate] |
33 | mario79 | 69 | cmp AX,0 |
70 | jge @@M1 |
||
71 | mov AX,0 |
||
72 | jmp @@M2 |
||
73 | @@M1: |
||
381 | serge | 74 | cmp AX,[ScreenWidth] ;ScreenLength |
33 | mario79 | 75 | jl @@M2 |
381 | serge | 76 | mov AX,[ScreenWidth] ;ScreenLength-1 |
33 | mario79 | 77 | dec ax |
78 | @@M2: |
||
381 | serge | 79 | mov [MOUSE_X],AX ;[XCoordinate] |
33 | mario79 | 80 | |
81 | ; Вычисляем новую Y-координату курсора |
||
82 | ; Занести в AX перемещение по Y |
||
83 | mov AH,0 ;дублируем знак во все разряды AH |
||
84 | mov AL,[FirstByte_2] |
||
85 | test AL,100000b |
||
86 | jz @@M3 |
||
87 | mov AH,0FFh |
||
88 | ; Занести в AL младший байт |
||
89 | @@M3: |
||
90 | mov AL,[ThirdByte_2] |
||
120 | mario79 | 91 | call mouse_acceleration_ps2 |
33 | mario79 | 92 | ; Вычислить новое значение координаты курсора |
93 | ; по Y (Y-координата мыши PS/2 направлена |
||
94 | ; противоположно экранной) |
||
381 | serge | 95 | neg AX |
96 | add AX,[MOUSE_Y] ;[YCoordinate] |
||
33 | mario79 | 97 | cmp AX,0 |
98 | jge @@M4 |
||
99 | mov AX,0 |
||
100 | jmp @@M5 |
||
101 | @@M4: |
||
381 | serge | 102 | cmp AX,[ScreenHeight] ;ScreenHeigth |
33 | mario79 | 103 | jl @@M5 |
381 | serge | 104 | mov AX,[ScreenHeight] ;ScreenHeigth-1 |
33 | mario79 | 105 | dec ax |
106 | @@M5: |
||
381 | serge | 107 | mov [MOUSE_Y],AX ;[YCoordinate] |
33 | mario79 | 108 | |
109 | ; Показать курсор в новой позиции |
||
120 | mario79 | 110 | mov eax,[timer_ticks] |
111 | mov [timer_ticks_ps2],eax |
||
33 | mario79 | 112 | jmp @@EndMouseInterrupt_2 |
113 | |||
114 | ; Обнаружен сбой в порядке передачи информации от мыши |
||
115 | @@Error_2: |
||
116 | mov [MouseByteNumber_2],0 |
||
381 | serge | 117 | ; Нормальное завершение прерывани |
33 | mario79 | 118 | @@EndMouseInterrupt_2: |
119 | call ready_for_next_irq_1 |
||
120 | ret |
||
120 | mario79 | 121 | |
122 | mouse_acceleration_ps2: |
||
123 | push eax |
||
124 | mov eax,[timer_ticks] |
||
125 | sub eax,[timer_ticks_ps2] |
||
126 | cmp eax,[mouse_delay] |
||
127 | pop eax |
||
128 | ja @f |
||
129 | imul ax,[mouse_speed_factor] |
||
130 | @@: |
||
131 | ret |
||
33 | mario79 | 132 | ;*********************************************** |
133 | ;* ОЖИДАНИЕ ОЧИСТКИ ВХОДНОГО БУФЕРА I8042 * |
||
134 | ;* При выходе из процедуры: * |
||
135 | ;* флаг ZF установлен - нормальное завершение, * |
||
136 | ;* флаг ZF сброшен - ошибка тайм-аута. * |
||
137 | ;*********************************************** |
||
138 | Wait8042BufferEmpty: |
||
139 | ; push CX |
||
381 | serge | 140 | ; mov CX,0FFFFh ;задать число циклов ожидани |
33 | mario79 | 141 | ;@@kb: |
142 | ; in AL,64h ;получить статус |
||
143 | ; test AL,10b ;буфер i8042 свободен? |
||
144 | ; loopnz @@kb ;если нет, то цикл |
||
145 | ; pop CX |
||
146 | push ecx |
||
147 | xor ecx,ecx |
||
148 | @@: |
||
381 | serge | 149 | in al,64h |
33 | mario79 | 150 | test al,00000010b |
151 | loopnz @b |
||
152 | pop ecx |
||
153 | ;Если при выходе из подпрограммы сброшен |
||
154 | ;флаг ZF - ошибка |
||
155 | ret ;возврат в подпрограмму |
||
156 | |||
157 | ;*************************************** |
||
158 | ;* ОЖИДАНИЕ ПОСТУПЛЕНИЯ ДАННЫХ ОТ МЫШИ * |
||
159 | ;*************************************** |
||
160 | WaitMouseData: |
||
381 | serge | 161 | ; push CX |
162 | ; mov CX,0FFFFh ;задать число циклов ожидани |
||
33 | mario79 | 163 | ;@@mouse: |
164 | ; in AL,64h ;опросить регистр статуса |
||
165 | ; test AL,100000b ;данные поступили? |
||
166 | ; loopz @@mouse ;если нет, то цикл |
||
167 | ; pop CX |
||
168 | push ecx |
||
169 | mov ECX,0FFFFh |
||
170 | @@: |
||
381 | serge | 171 | in al,64h |
33 | mario79 | 172 | test al,100000b |
173 | loopz @b |
||
174 | pop ecx |
||
175 | ;Если при выходе из подпрограммы установлен |
||
176 | ;флаг ZF - ошибка |
||
381 | serge | 177 | ret |
33 | mario79 | 178 |