Subversion Repositories Kolibri OS

Rev

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

Rev Author Line No. Line
33 mario79 1
; Номер принимаемого от мыши байта
2
MouseByteNumber_1 DB 0
3
; Трехбайтовая структура данных, передаваемая мышью
4
FirstByte_1       DB 0
5
SecondByte_1      DB 0
6
ThirdByte_1       DB 0
120 mario79 7
timer_ticks_com_1 dd 0
33 mario79 8
;***************************************
9
;* НОВЫЙ ОБРАБОТЧИК ПРЕРЫВАНИЯ ОТ МЫШИ *
10
;***************************************
11
check_mouse_data_com2:
58 mario79 12
;        cmp     [com2_mouse_detected],0
13
;        je      @@EndMouseInterrupt_1
33 mario79 14
; Проверить наличие данных
15
        mov     DX,2F8h  ;[COMPortBaseAddr]
16
        add     DX,5         ;xFDh
17
        in      AL,DX
18
        test    AL,1   ;Данные готовы?
19
        jz      @@Error_1
20
; Ввести данные
21
        mov     DX,2F8h   ;[COMPortBaseAddr]   ;xF8h
22
        in      AL,DX
23
; Сбросить старший незначащий бит
24
        and     AL,01111111b
25
 
26
; Определить порядковый номер принимаемого байта
27
        cmp     [MouseByteNumber_1],0
28
        je      @@FirstByte_1
29
        cmp     [MouseByteNumber_1],1
30
        je      @@SecondByte_1
31
        cmp     [MouseByteNumber_1],2
32
        je      @@ThirdByte_1
33
        jmp     @@Error_1
34
 
35
; Сохранить первый байт данных
36
@@FirstByte_1:
37
        test    AL,1000000b       ;Первый байт посылки?
38
        jz      @@Error_1
39
        mov     [FirstByte_1],AL
40
        inc     [MouseByteNumber_1] ;увеличить счетчик
41
        jmp     @@EndMouseInterrupt_1
42
; Сохранить второй байт данных
43
@@SecondByte_1:
44
        test    AL,1000000b
45
        jnz     @@Error_1
46
        mov     [SecondByte_1],AL
47
        inc     [MouseByteNumber_1] ;увеличить счетчик
48
        jmp     @@EndMouseInterrupt_1
49
; Сохранить третий байт данных
50
@@ThirdByte_1:
51
        test    AL,1000000b
52
        jnz     @@Error_1
53
        mov     [ThirdByte_1],AL    ;увеличить счетчик
54
        mov     [MouseByteNumber_1],0
55
; (Пакет данных от мыши принят полностью).
56
; Записать новое значение состояния кнопок мыши
57
        mov al,[FirstByte_1]   ;[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_1]
68
        shl     AL,6
69
        or      AL,[SecondByte_1]
70
        cbw
120 mario79 71
        call    mouse_acceleration_com2
33 mario79 72
        add     AX,[0xFB0A]    ;[XCoordinate]
73
        ; Курсор не должен выходить за левую или
74
        ; правую границу экрана
75
        js      @@X1_1
76
        cmp     AX,[0xFE00]   ;ScreenLength
77
        jb      @@X2_1
78
        ; Установить координату X по правой границе
79
        mov     AX,[0xFE00]   ;ScreenLength-1
80
        dec     ax
81
        jmp     @@X2_1
82
@@X1_1:
83
       ; Установить координату X по левой границе
84
        xor     AX,AX
85
@@X2_1:
86
        mov     [0xFB0A],AX     ;[XCoordinate]
87
        ; Прибавить перемещение по Y к координате Y
88
        mov     AL,[FirstByte_1]
89
        and     AL,00001100b
90
        shl     AL,4
91
        or      AL,[ThirdByte_1]
92
        cbw
120 mario79 93
        call    mouse_acceleration_com2
33 mario79 94
        add     AX,[0xFB0C]   ;[YCoordinate]
95
        ; Курсор не должен выходить за верхнюю или
96
        ; нижнюю границу экрана
97
        js      @@Y1_1
98
        cmp     AX,[0xFE04]  ;ScreenHeigth
99
        jb      @@Y2_1
100
        ; Установить координату X по нижней границе
101
        mov     AX,[0xFE04] ;ScreenHeigth-1
102
        dec     ax
103
        jmp     @@Y2_1
104
@@Y1_1:
105
       ; Установить координату X по верхней границе
106
        xor     AX,AX
107
@@Y2_1:
108
        mov     [0xFB0C],AX     ;[YCoordinate]
120 mario79 109
        mov   eax,[timer_ticks]
110
        mov   [timer_ticks_com_1],eax
33 mario79 111
        jmp     @@EndMouseInterrupt_1
112
 
113
@@Error_1:
114
; Произошел сбой в порядке передачи информации от
115
; мыши, обнулить счетчик байтов пакета данных
116
        mov     [MouseByteNumber_1],0
117
@@EndMouseInterrupt_1:
118
        call  ready_for_next_irq
119
        ret
120
 
120 mario79 121
mouse_acceleration_com2:
122
        push    eax
123
        mov   eax,[timer_ticks]
124
        sub   eax,[timer_ticks_com_1]
125
        cmp   eax,[mouse_delay]
126
        pop    eax
127
        ja     @f
127 mario79 128
        imul  ax,[mouse_speed_factor]
120 mario79 129
@@:
130
        ret