Subversion Repositories Kolibri OS

Rev

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

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