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