Subversion Repositories Kolibri OS

Rev

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

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