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 DB 0
3
; Трехбайтовая структура данных, передаваемая мышью
4
FirstByte       DB 0
5
SecondByte      DB 0
6
ThirdByte       DB 0
7
 
8
;***************************************
9
;* НОВЫЙ ОБРАБОТЧИК ПРЕРЫВАНИЯ ОТ МЫШИ *
10
;***************************************
11
check_mouse_data_com1:
12
        cmp     [com1_mouse_detected],0
13
        je      @@EndMouseInterrupt
14
; Проверить наличие данных
15
        mov     DX,3F8h  ;[COMPortBaseAddr]
16
        add     DX,5         ;xFDh
17
        in      AL,DX
18
        test    AL,1   ;Данные готовы?
19
        jz      @@Error
20
; Ввести данные
21
        mov     DX,3F8h   ;[COMPortBaseAddr]   ;xF8h
22
        in      AL,DX
23
; Сбросить старший незначащий бит
24
        and     AL,01111111b
25
 
26
; Определить порядковый номер принимаемого байта
27
        cmp     [MouseByteNumber],0
28
        je      @@FirstByte
29
        cmp     [MouseByteNumber],1
30
        je      @@SecondByte
31
        cmp     [MouseByteNumber],2
32
        je      @@ThirdByte
33
        jmp     @@Error
34
 
35
; Сохранить первый байт данных
36
@@FirstByte:
37
        test    AL,1000000b       ;Первый байт посылки?
38
        jz      @@Error
39
        mov     [FirstByte],AL
40
        inc     [MouseByteNumber] ;увеличить счетчик
41
        jmp     @@EndMouseInterrupt
42
; Сохранить второй байт данных
43
@@SecondByte:
44
        test    AL,1000000b
45
        jnz     @@Error
46
        mov     [SecondByte],AL
47
        inc     [MouseByteNumber] ;увеличить счетчик
48
        jmp     @@EndMouseInterrupt
49
; Сохранить третий байт данных
50
@@ThirdByte:
51
        test    AL,1000000b
52
        jnz     @@Error
53
        mov     [ThirdByte],AL    ;увеличить счетчик
54
        mov     [MouseByteNumber],0
55
; (Пакет данных от мыши принят полностью).
56
; Записать новое значение состояния кнопок мыши
57
        mov al,[FirstByte]   ;[0xfb01]
58
        mov ah,al
59
        shr al,3
60
        and al,2
61
        shr ah,5
62
        and ah,1
63
        add al,ah
64
        mov    [0xfb40],al
65
        mov    [mouse_active],1
66
; Прибавить перемещение по X к координате X
67
        mov     AL,[FirstByte]
68
        shl     AL,6
69
        or      AL,[SecondByte]
70
        cbw
71
         shl  ax,1
72
        add     AX,[0xFB0A]    ;[XCoordinate]
73
        ; Курсор не должен выходить за левую или
74
        ; правую границу экрана
75
        js      @@X1
76
        cmp     AX,[0xFE00]   ;ScreenLength
77
        jb      @@X2
78
        ; Установить координату X по правой границе
79
        mov     AX,[0xFE00]   ;ScreenLength-1
80
        dec     ax
81
        jmp     @@X2
82
@@X1:
83
       ; Установить координату X по левой границе
84
        xor     AX,AX
85
@@X2:
86
        mov     [0xFB0A],AX     ;[XCoordinate]
87
        ; Прибавить перемещение по Y к координате Y
88
        mov     AL,[FirstByte]
89
        and     AL,00001100b
90
        shl     AL,4
91
        or      AL,[ThirdByte]
92
        cbw
93
         shl  ax,1
94
        add     AX,[0xFB0C]   ;[YCoordinate]
95
        ; Курсор не должен выходить за верхнюю или
96
        ; нижнюю границу экрана
97
        js      @@Y1
98
        cmp     AX,[0xFE04]  ;ScreenHeigth
99
        jb      @@Y2
100
        ; Установить координату X по нижней границе
101
        mov     AX,[0xFE04] ;ScreenHeigth-1
102
        dec     ax
103
        jmp     @@Y2
104
@@Y1:
105
       ; Установить координату X по верхней границе
106
        xor     AX,AX
107
@@Y2:
108
        mov     [0xFB0C],AX     ;[YCoordinate]
109
        jmp     @@EndMouseInterrupt
110
 
111
@@Error:
112
; Произошел сбой в порядке передачи информации от
113
; мыши, обнулить счетчик байтов пакета данных
114
        mov     [MouseByteNumber],0
115
@@EndMouseInterrupt:
116
        call  ready_for_next_irq
117
        ret
118