Subversion Repositories Kolibri OS

Rev

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

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