Subversion Repositories Kolibri OS

Rev

Rev 2465 | Go to most recent revision | Show entire file | Regard whitespace | Details | Blame | Last modification | View Log | RSS feed

Rev 2465 Rev 3555
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      ?