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 |