Subversion Repositories Kolibri OS

Rev

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

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