Rev 2455 | Go to most recent revision | Show entire file | Regard whitespace | Details | Blame | Last modification | View Log | RSS feed
Rev 2455 | Rev 3539 | ||
---|---|---|---|
Line 172... | Line 172... | ||
172 | ret |
172 | ret |
173 | endp |
173 | endp |
Line 174... | Line 174... | ||
174 | 174 | ||
175 | align 4 |
175 | align 4 |
176 | MSMouseSearch: |
176 | MSMouseSearch: |
177 | ; ÏÎÈÑÊ ÌÛØÈ ×ÅÐÅÇ COM-ÏÎÐÒÛ |
177 | ; ПОИСК МЫШИ ЧЕРЕЗ COM-ПОРТЫ |
178 | MouseSearch: |
178 | MouseSearch: |
179 | ; Óñòàíàâëèâàåì ñêîðîñòü |
179 | ; Устанавливаем скорость |
180 | ; ïðèåìà/ïåðåäà÷è 1200 áîä |
180 | ; приема/передачи 1200 бод |
181 | ; in bx COM Port Base Address |
181 | ; in bx COM Port Base Address |
182 | mov DX, bx |
182 | mov DX, bx |
183 | add DX, 3 |
183 | add DX, 3 |
184 | in AL, DX |
184 | in AL, DX |
185 | or AL, 80h ;óñòàíîâèòü áèò DLAB |
185 | or AL, 80h ;установить бит DLAB |
186 | out DX, AL |
186 | out DX, AL |
187 | mov DX, bx |
187 | mov DX, bx |
188 | mov AL, 60h ;1200 áîä |
188 | mov AL, 60h ;1200 бод |
189 | out DX, AL |
189 | out DX, AL |
190 | inc DX |
190 | inc DX |
191 | mov AL, 0 |
191 | mov AL, 0 |
192 | out DX, AL |
192 | out DX, AL |
193 | ; Óñòàíîâèòü äëèíó ñëîâà 7 áèò, 1 ñòîïîâûé áèò, |
193 | ; Установить длину слова 7 бит, 1 стоповый бит, |
194 | ; ÷åòíîñòü íå êîíòðîëèðîâàòü |
194 | ; четность не контролировать |
195 | mov DX, bx |
195 | mov DX, bx |
196 | add DX, 3 |
196 | add DX, 3 |
197 | mov AL, 00000010b |
197 | mov AL, 00000010b |
198 | out DX, AL |
198 | out DX, AL |
199 | ; Çàïðåòèòü âñå ïðåðûâàíè |
199 | ; Запретить все прерывани |
200 | mov dx, bx |
200 | mov dx, bx |
201 | inc dx |
201 | inc dx |
202 | mov AL, 0 |
202 | mov AL, 0 |
203 | out DX, AL |
203 | out DX, AL |
204 | ; Ïðîâåðèòü, ÷òî óñòðîéñòâî ïîäêëþ÷åíî è ÿâëÿåòñ |
204 | ; Проверить, что устройство подключено и являетс |
205 | ; ìûøüþ òèïà MSMouse |
205 | ; мышью типа MSMouse |
206 | ; Îòêëþ÷èòü ïèòàíèå ìûøè è ïðåðûâàíè |
206 | ; Отключить питание мыши и прерывани |
207 | mov DX, bx |
207 | mov DX, bx |
208 | add EDX, 4 ;ðåãèñòð óïðàâëåíèÿ ìîäåìîì |
208 | add EDX, 4 ;регистр управления модемом |
209 | mov AL, 0 ;ñáðîñèòü DTR, RTS è OUT2 |
209 | mov AL, 0 ;сбросить DTR, RTS и OUT2 |
210 | out DX, AL |
210 | out DX, AL |
211 | ; Îæèäàòü 5 "òèêîâ" (0,2 ñ) |
211 | ; Ожидать 5 "тиков" (0,2 с) |
212 | mov ecx, 0xFFFF |
212 | mov ecx, 0xFFFF |
213 | loop $ |
213 | loop $ |
214 | ; Âêëþ÷èòü ïèòàíèå ìûøè |
214 | ; Включить питание мыши |
215 | mov al, 1 |
215 | mov al, 1 |
216 | out dx, al |
216 | out dx, al |
217 | mov ecx, 0xFFFF |
217 | mov ecx, 0xFFFF |
218 | loop $ |
218 | loop $ |
219 | ; Î÷èñòèòü ðåãèñòð äàííûõ |
219 | ; Очистить регистр данных |
220 | mov dx, bx |
220 | mov dx, bx |
221 | in AL, DX |
221 | in AL, DX |
222 | add edx, 4 |
222 | add edx, 4 |
223 | mov AL, 1011b ;óñòàíîâèòü DTR è RTS è OUT2 |
223 | mov AL, 1011b ;установить DTR и RTS и OUT2 |
224 | out DX, AL |
224 | out DX, AL |
225 | mov ecx, 0x1FFFF |
225 | mov ecx, 0x1FFFF |
226 | ; Öèêë îïðîñà ïîðòà |
226 | ; Цикл опроса порта |
227 | WaitData: |
227 | WaitData: |
228 | ; Îæèäàòü åùå 10 "òèêîâ" |
228 | ; Ожидать еще 10 "тиков" |
229 | dec ecx |
229 | dec ecx |
230 | ; cmp ecx,0 |
230 | ; cmp ecx,0 |
231 | jz NoMouse |
231 | jz NoMouse |
232 | ; Ïðîâåðèòü íàëè÷èå èäåíòèôèêàöèîííîãî áàéòà |
232 | ; Проверить наличие идентификационного байта |
233 | mov DX, bx |
233 | mov DX, bx |
234 | add DX, 5 |
234 | add DX, 5 |
235 | in AL, DX |
235 | in AL, DX |
236 | test AL, 1 ;Äàííûå ãîòîâû? |
236 | test AL, 1 ;Данные готовы? |
237 | jz WaitData |
237 | jz WaitData |
238 | ; Ââåñòè äàííûå |
238 | ; Ввести данные |
239 | mov DX, bx |
239 | mov DX, bx |
240 | in AL, DX |
240 | in AL, DX |
241 | NoMouse: |
241 | NoMouse: |
Line 255... | Line 255... | ||
255 | irq_handler: |
255 | irq_handler: |
Line 256... | Line 256... | ||
256 | 256 | ||
257 | ; in: esi -> COM_MOUSE_DATA struc, dx = base port (xF8h) |
257 | ; in: esi -> COM_MOUSE_DATA struc, dx = base port (xF8h) |
258 | add edx, 5 ; xFDh |
258 | add edx, 5 ; xFDh |
259 | in al, dx |
259 | in al, dx |
260 | test al, 1 ; Äàííûå ãîòîâû? |
260 | test al, 1 ; Данные готовы? |
261 | jz .Error |
261 | jz .Error |
262 | ; Ââåñòè äàííûå |
262 | ; Ввести данные |
263 | sub edx, 5 |
263 | sub edx, 5 |
264 | in al, dx |
264 | in al, dx |
265 | ; Ñáðîñèòü ñòàðøèé íåçíà÷àùèé áèò |
265 | ; Сбросить старший незначащий бит |
Line 266... | Line 266... | ||
266 | and al, 01111111b |
266 | and al, 01111111b |
267 | 267 | ||
268 | ; Îïðåäåëèòü ïîðÿäêîâûé íîìåð ïðèíèìàåìîãî áàéòà |
268 | ; Определить порядковый номер принимаемого байта |
269 | cmp [esi+COM_MOUSE_DATA.MouseByteNumber], 2 |
269 | cmp [esi+COM_MOUSE_DATA.MouseByteNumber], 2 |
270 | ja .Error |
270 | ja .Error |
271 | jz .ThirdByte |
271 | jz .ThirdByte |
272 | jp .SecondByte |
272 | jp .SecondByte |
273 | ; Ñîõðàíèòü ïåðâûé áàéò äàííûõ |
273 | ; Сохранить первый байт данных |
274 | .FirstByte: |
274 | .FirstByte: |
275 | test al, 1000000b ; Ïåðâûé áàéò ïîñûëêè? |
275 | test al, 1000000b ; Первый байт посылки? |
276 | jz .Error |
276 | jz .Error |
277 | mov [esi+COM_MOUSE_DATA.FirstByte], al |
277 | mov [esi+COM_MOUSE_DATA.FirstByte], al |
278 | inc [esi+COM_MOUSE_DATA.MouseByteNumber] |
278 | inc [esi+COM_MOUSE_DATA.MouseByteNumber] |
279 | jmp .EndMouseInterrupt |
279 | jmp .EndMouseInterrupt |
280 | ; Ñîõðàíèòü âòîðîé áàéò äàííûõ |
280 | ; Сохранить второй байт данных |
281 | .SecondByte: |
281 | .SecondByte: |
282 | test al, 1000000b |
282 | test al, 1000000b |
283 | jnz .Error |
283 | jnz .Error |
284 | mov [esi+COM_MOUSE_DATA.SecondByte], al |
284 | mov [esi+COM_MOUSE_DATA.SecondByte], al |
285 | inc [esi+COM_MOUSE_DATA.MouseByteNumber] |
285 | inc [esi+COM_MOUSE_DATA.MouseByteNumber] |
286 | jmp .EndMouseInterrupt |
286 | jmp .EndMouseInterrupt |
287 | ; Ñîõðàíèòü òðåòèé áàéò äàííûõ |
287 | ; Сохранить третий байт данных |
288 | .ThirdByte: |
288 | .ThirdByte: |
289 | test al, 1000000b |
289 | test al, 1000000b |
290 | jnz .Error |
290 | jnz .Error |
291 | mov [esi+COM_MOUSE_DATA.ThirdByte], al |
291 | mov [esi+COM_MOUSE_DATA.ThirdByte], al |
292 | mov [esi+COM_MOUSE_DATA.MouseByteNumber], 0 |
292 | mov [esi+COM_MOUSE_DATA.MouseByteNumber], 0 |
293 | ; (Ïàêåò äàííûõ îò ìûøè ïðèíÿò ïîëíîñòüþ). |
293 | ; (Пакет данных от мыши принят полностью). |
294 | ; Çàïèñàòü íîâîå çíà÷åíèå ñîñòîÿíèÿ êíîïîê ìûøè |
294 | ; Записать новое значение состояния кнопок мыши |
295 | mov al, [esi+COM_MOUSE_DATA.FirstByte] |
295 | mov al, [esi+COM_MOUSE_DATA.FirstByte] |
296 | mov ah, al |
296 | mov ah, al |
297 | shr al, 3 |
297 | shr al, 3 |
298 | and al, 2 |
298 | and al, 2 |
299 | shr ah, 5 |
299 | shr ah, 5 |
300 | and ah, 1 |
300 | and ah, 1 |
301 | add al, ah |
301 | add al, ah |
Line 302... | Line 302... | ||
302 | movzx eax, al |
302 | movzx eax, al |
303 | mov [BTN_DOWN], eax |
303 | mov [BTN_DOWN], eax |
304 | 304 | ||
305 | ; Ïðèáàâèòü ïåðåìåùåíèå ïî X ê êîîðäèíàòå X |
305 | ; Прибавить перемещение по X к координате X |
Line 306... | Line 306... | ||
306 | mov al, [esi+COM_MOUSE_DATA.FirstByte] |
306 | mov al, [esi+COM_MOUSE_DATA.FirstByte] |
307 | shl al, 6 |
307 | shl al, 6 |
308 | or al, [esi+COM_MOUSE_DATA.SecondByte] |
308 | or al, [esi+COM_MOUSE_DATA.SecondByte] |
Line 309... | Line 309... | ||
309 | 309 | ||
310 | cbw |
310 | cbw |
311 | movzx eax, ax |
311 | movzx eax, ax |
312 | mov [MOUSE_X], eax |
312 | mov [MOUSE_X], eax |
313 | 313 | ||
Line 325... | Line 325... | ||
325 | stdcall SetMouseData, [BTN_DOWN], [MOUSE_X], [MOUSE_Y], 0, 0 |
325 | stdcall SetMouseData, [BTN_DOWN], [MOUSE_X], [MOUSE_Y], 0, 0 |
Line 326... | Line 326... | ||
326 | 326 | ||
Line 327... | Line 327... | ||
327 | jmp .EndMouseInterrupt |
327 | jmp .EndMouseInterrupt |
328 | 328 | ||
329 | .Error: |
329 | .Error: |
Line 330... | Line 330... | ||
330 | ; Ïðîèçîøåë ñáîé â ïîðÿäêå ïåðåäà÷è èíôîðìàöèè îò |
330 | ; Произошел сбой в порядке передачи информации от |
331 | ; ìûøè, îáíóëèòü ñ÷åò÷èê áàéòîâ ïàêåòà äàííûõ |
331 | ; мыши, обнулить счетчик байтов пакета данных |
332 | 332 | ||
333 | mov [esi+COM_MOUSE_DATA.MouseByteNumber], 0 |
333 | mov [esi+COM_MOUSE_DATA.MouseByteNumber], 0 |
Line 338... | Line 338... | ||
338 | ;all initialized data place here |
338 | ;all initialized data place here |
Line 339... | Line 339... | ||
339 | 339 | ||
Line 340... | Line 340... | ||
340 | align 4 |
340 | align 4 |
341 | 341 | ||
342 | struc COM_MOUSE_DATA { |
342 | struc COM_MOUSE_DATA { |
343 | ; Íîìåð ïðèíèìàåìîãî îò ìûøè áàéòà |
343 | ; Номер принимаемого от мыши байта |
344 | .MouseByteNumber db ? |
344 | .MouseByteNumber db ? |
345 | ; Òðåõáàéòîâàÿ ñòðóêòóðà äàííûõ, ïåðåäàâàåìàÿ ìûøüþ |
345 | ; Трехбайтовая структура данных, передаваемая мышью |
346 | .FirstByte db ? |
346 | .FirstByte db ? |
347 | .SecondByte db ? |
347 | .SecondByte db ? |
348 | .ThirdByte db ? |
348 | .ThirdByte db ? |