Subversion Repositories Kolibri OS

Rev

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

Rev Author Line No. Line
129 mikedld 1
; Номер принимаемого от мыши байта
2
MouseByteNumber_2 DB 0
3
; Трехбайтовая структура данных, передаваемая мышью
4
FirstByte_2       DB 0
5
SecondByte_2      DB 0
6
ThirdByte_2       DB 0
7
timer_ticks_ps2   dd 0
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
384 mikedld 45
        mov    [BTN_DOWN],al
129 mikedld 46
        mov    [mouse_active],1
47
; Вычислить новую X-координату курсора
48
        ; Занести в AX перемещение по X
49
        mov     AH,0   ;дублируем знак во все разряды AH
50
        mov     AL,[FirstByte_2]
384 mikedld 51
        test    AL,10000b
129 mikedld 52
        jz      @@M0
53
        mov     AH,0FFh
54
        ; Занести в AL младший байт
55
@@M0:
56
         mov     AL,[SecondByte_2]
57
        call     mouse_acceleration_ps2
58
        ; Вычислить новое значение координаты
59
        ; курсора по X
384 mikedld 60
        add     AX,[MOUSE_X]    ;[XCoordinate]
129 mikedld 61
        cmp     AX,0
62
        jge     @@M1
63
        mov     AX,0
64
        jmp     @@M2
65
@@M1:
384 mikedld 66
        cmp     AX,[ScreenWidth]   ;ScreenLength
129 mikedld 67
        jl      @@M2
384 mikedld 68
        mov     AX,[ScreenWidth]   ;ScreenLength-1
129 mikedld 69
        dec     ax
70
@@M2:
384 mikedld 71
        mov     [MOUSE_X],AX     ;[XCoordinate]
129 mikedld 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]
83
        call     mouse_acceleration_ps2
84
        ; Вычислить новое значение координаты курсора
85
        ; по Y (Y-координата мыши PS/2 направлена
86
        ; противоположно экранной)
384 mikedld 87
        neg     AX
88
        add     AX,[MOUSE_Y]   ;[YCoordinate]
129 mikedld 89
        cmp     AX,0
90
        jge     @@M4
91
        mov     AX,0
92
        jmp     @@M5
93
@@M4:
384 mikedld 94
        cmp     AX,[ScreenHeight]  ;ScreenHeigth
129 mikedld 95
        jl      @@M5
384 mikedld 96
        mov     AX,[ScreenHeight] ;ScreenHeigth-1
129 mikedld 97
        dec     ax
98
@@M5:
384 mikedld 99
        mov     [MOUSE_Y],AX     ;[YCoordinate]
129 mikedld 100
 
101
; Показать курсор в новой позиции
102
        mov   eax,[timer_ticks]
103
        mov   [timer_ticks_ps2],eax
104
        jmp     @@EndMouseInterrupt_2
105
 
106
; Обнаружен сбой в порядке передачи информации от мыши
107
@@Error_2:
108
        mov   [MouseByteNumber_2],0
384 mikedld 109
; Нормальное завершение прерывани
129 mikedld 110
@@EndMouseInterrupt_2:
111
        call  ready_for_next_irq_1
112
        ret
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
124
;***********************************************
125
;*   ОЖИДАНИЕ ОЧИСТКИ ВХОДНОГО БУФЕРА I8042    *
126
;* При выходе из процедуры:                    *
127
;* флаг ZF установлен - нормальное завершение, *
128
;* флаг ZF сброшен - ошибка тайм-аута.         *
129
;***********************************************
130
Wait8042BufferEmpty:
131
;        push    CX
384 mikedld 132
;        mov     CX,0FFFFh  ;задать число циклов ожидани
129 mikedld 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
      @@:
384 mikedld 141
        in     al,64h
129 mikedld 142
        test    al,00000010b
143
        loopnz @b
144
        pop    ecx
145
        ;Если при выходе из подпрограммы сброшен
146
        ;флаг ZF - ошибка
147
        ret                   ;возврат в подпрограмму
148
 
149
;***************************************
150
;* ОЖИДАНИЕ ПОСТУПЛЕНИЯ ДАННЫХ ОТ МЫШИ *
151
;***************************************
152
WaitMouseData:
384 mikedld 153
;        push    CX
154
;        mov     CX,0FFFFh  ;задать число циклов ожидани
129 mikedld 155
;@@mouse:
156
;        in      AL,64h     ;опросить регистр статуса
157
;        test    AL,100000b ;данные поступили?
158
;        loopz   @@mouse    ;если нет, то цикл
159
;        pop     CX
160
        push ecx
161
        mov     ECX,0FFFFh
162
      @@:
384 mikedld 163
        in     al,64h
129 mikedld 164
        test    al,100000b
165
        loopz @b
166
        pop    ecx
167
        ;Если при выходе из подпрограммы установлен
168
        ;флаг ZF - ошибка
384 mikedld 169
        ret
129 mikedld 170