Subversion Repositories Kolibri OS

Rev

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

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