Rev 129 | Go to most recent revision | Details | Compare with Previous | Last modification | View Log | RSS feed
Rev | Author | Line No. | Line |
---|---|---|---|
129 | mikedld | 1 | ; Номер принимаемого от мыши байта |
2 | MouseByteNumber DB 0 |
||
3 | ; Трехбайтовая структура данных, передаваемая мышью |
||
4 | FirstByte DB 0 |
||
5 | SecondByte DB 0 |
||
6 | ThirdByte DB 0 |
||
7 | timer_ticks_com dd 0 |
||
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 |
||
384 | mikedld | 64 | mov [BTN_DOWN],al |
129 | mikedld | 65 | mov [mouse_active],1 |
66 | ; Прибавить перемещение по X к координате X |
||
67 | mov AL,[FirstByte] |
||
68 | shl AL,6 |
||
69 | or AL,[SecondByte] |
||
70 | cbw |
||
71 | call mouse_acceleration_com1 |
||
384 | mikedld | 72 | add AX,[MOUSE_X] ;[XCoordinate] |
129 | mikedld | 73 | ; Курсор не должен выходить за левую или |
74 | ; правую границу экрана |
||
75 | js @@X1 |
||
384 | mikedld | 76 | cmp AX,[ScreenWidth] ;ScreenLength |
129 | mikedld | 77 | jb @@X2 |
78 | ; Установить координату X по правой границе |
||
384 | mikedld | 79 | mov AX,[ScreenWidth] ;ScreenLength-1 |
129 | mikedld | 80 | dec ax |
81 | jmp @@X2 |
||
82 | @@X1: |
||
83 | ; Установить координату X по левой границе |
||
84 | xor AX,AX |
||
85 | @@X2: |
||
384 | mikedld | 86 | mov [MOUSE_X],AX ;[XCoordinate] |
129 | mikedld | 87 | ; Прибавить перемещение по Y к координате Y |
88 | mov AL,[FirstByte] |
||
89 | and AL,00001100b |
||
90 | shl AL,4 |
||
91 | or AL,[ThirdByte] |
||
92 | cbw |
||
93 | call mouse_acceleration_com1 |
||
384 | mikedld | 94 | add AX,[MOUSE_Y] ;[YCoordinate] |
129 | mikedld | 95 | ; Курсор не должен выходить за верхнюю или |
96 | ; нижнюю границу экрана |
||
97 | js @@Y1 |
||
384 | mikedld | 98 | cmp AX,[ScreenHeight] ;ScreenHeigth |
129 | mikedld | 99 | jb @@Y2 |
100 | ; Установить координату X по нижней границе |
||
384 | mikedld | 101 | mov AX,[ScreenHeight] ;ScreenHeigth-1 |
129 | mikedld | 102 | dec ax |
103 | jmp @@Y2 |
||
104 | @@Y1: |
||
105 | ; Установить координату X по верхней границе |
||
106 | xor AX,AX |
||
107 | @@Y2: |
||
384 | mikedld | 108 | mov [MOUSE_Y],AX ;[YCoordinate] |
129 | mikedld | 109 | mov eax,[timer_ticks] |
110 | mov [timer_ticks_com],eax |
||
111 | jmp @@EndMouseInterrupt |
||
112 | |||
113 | @@Error: |
||
114 | ; Произошел сбой в порядке передачи информации от |
||
115 | ; мыши, обнулить счетчик байтов пакета данных |
||
116 | mov [MouseByteNumber],0 |
||
117 | @@EndMouseInterrupt: |
||
118 | call ready_for_next_irq |
||
119 | ret |
||
120 | |||
121 | mouse_acceleration_com1: |
||
122 | push eax |
||
123 | mov eax,[timer_ticks] |
||
124 | sub eax,[timer_ticks_com] |
||
125 | cmp eax,[mouse_delay] |
||
126 | pop eax |
||
127 | ja @f |
||
384 | mikedld | 128 | imul ax,[mouse_speed_factor] |
129 | mikedld | 129 | @@: |
130 | ret |