Subversion Repositories Kolibri OS

Rev

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