Subversion Repositories Kolibri OS

Rev

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

Rev Author Line No. Line
425 victor 1
$Revision: 480 $
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]
480 diamond 69
        jns     @@M1
70
        xor     eax, eax
33 mario79 71
        jmp     @@M2
72
@@M1:
381 serge 73
        cmp     AX,[ScreenWidth]   ;ScreenLength
33 mario79 74
        jl      @@M2
381 serge 75
        mov     AX,[ScreenWidth]   ;ScreenLength-1
33 mario79 76
@@M2:
381 serge 77
        mov     [MOUSE_X],AX     ;[XCoordinate]
33 mario79 78
 
79
; Вычисляем новую Y-координату курсора
80
        ; Занести в AX перемещение по Y
81
        mov     AH,0   ;дублируем знак во все разряды AH
82
        mov     AL,[FirstByte_2]
83
        test    AL,100000b
84
        jz      @@M3
85
        mov     AH,0FFh
86
        ; Занести в AL младший байт
87
@@M3:
88
        mov     AL,[ThirdByte_2]
120 mario79 89
        call     mouse_acceleration_ps2
33 mario79 90
        ; Вычислить новое значение координаты курсора
91
        ; по Y (Y-координата мыши PS/2 направлена
92
        ; противоположно экранной)
381 serge 93
        neg     AX
94
        add     AX,[MOUSE_Y]   ;[YCoordinate]
480 diamond 95
        jns     @@M4
96
        xor     eax, eax
33 mario79 97
        jmp     @@M5
98
@@M4:
381 serge 99
        cmp     AX,[ScreenHeight]  ;ScreenHeigth
33 mario79 100
        jl      @@M5
381 serge 101
        mov     AX,[ScreenHeight] ;ScreenHeigth-1
33 mario79 102
@@M5:
381 serge 103
        mov     [MOUSE_Y],AX     ;[YCoordinate]
33 mario79 104
 
105
; Показать курсор в новой позиции
120 mario79 106
        mov   eax,[timer_ticks]
107
        mov   [timer_ticks_ps2],eax
33 mario79 108
        jmp     @@EndMouseInterrupt_2
109
 
110
; Обнаружен сбой в порядке передачи информации от мыши
111
@@Error_2:
112
        mov   [MouseByteNumber_2],0
381 serge 113
; Нормальное завершение прерывани
33 mario79 114
@@EndMouseInterrupt_2:
115
        call  ready_for_next_irq_1
116
        ret
120 mario79 117
 
118
mouse_acceleration_ps2:
119
        push    eax
120
        mov   eax,[timer_ticks]
121
        sub   eax,[timer_ticks_ps2]
122
        cmp   eax,[mouse_delay]
123
        pop    eax
124
        ja     @f
125
        imul  ax,[mouse_speed_factor]
126
@@:
127
        ret
33 mario79 128
;***********************************************
129
;*   ОЖИДАНИЕ ОЧИСТКИ ВХОДНОГО БУФЕРА I8042    *
130
;* При выходе из процедуры:                    *
131
;* флаг ZF установлен - нормальное завершение, *
132
;* флаг ZF сброшен - ошибка тайм-аута.         *
133
;***********************************************
134
Wait8042BufferEmpty:
135
;        push    CX
381 serge 136
;        mov     CX,0FFFFh  ;задать число циклов ожидани
33 mario79 137
;@@kb:
138
;        in      AL,64h     ;получить статус
139
;        test    AL,10b     ;буфер i8042 свободен?
140
;        loopnz  @@kb       ;если нет, то цикл
141
;        pop     CX
142
        push ecx
143
        xor ecx,ecx
144
      @@:
381 serge 145
        in     al,64h
33 mario79 146
        test    al,00000010b
147
        loopnz @b
148
        pop    ecx
149
        ;Если при выходе из подпрограммы сброшен
150
        ;флаг ZF - ошибка
151
        ret                   ;возврат в подпрограмму
152
 
153
;***************************************
154
;* ОЖИДАНИЕ ПОСТУПЛЕНИЯ ДАННЫХ ОТ МЫШИ *
155
;***************************************
156
WaitMouseData:
381 serge 157
;        push    CX
158
;        mov     CX,0FFFFh  ;задать число циклов ожидани
33 mario79 159
;@@mouse:
160
;        in      AL,64h     ;опросить регистр статуса
161
;        test    AL,100000b ;данные поступили?
162
;        loopz   @@mouse    ;если нет, то цикл
163
;        pop     CX
164
        push ecx
165
        mov     ECX,0FFFFh
166
      @@:
381 serge 167
        in     al,64h
33 mario79 168
        test    al,100000b
169
        loopz @b
170
        pop    ecx
171
        ;Если при выходе из подпрограммы установлен
172
        ;флаг ZF - ошибка
381 serge 173
        ret
33 mario79 174