Go to most recent revision | Details | Last modification | View Log | RSS feed
Rev | Author | Line No. | Line |
---|---|---|---|
1 | ha | 1 | ;************************************************** |
2 | ;* ПОИСК МЫШИ ПО ПОСЛЕДОВАТЕЛЬНЫМ ПОРТАМ * |
||
3 | ;* Процедура подготавливает глобальные переменные * |
||
4 | ;* COMPortNum и COMPortBaseAddr для подпрограммы * |
||
5 | ;* установки обработчика прерывания * |
||
6 | ;************************************************** |
||
7 | ; Автор исходного текста Кулаков Владимир Геннадьевич. |
||
8 | ; Адаптация и доработка Mario79 |
||
9 | |||
10 | MSMouseSearch: |
||
11 | pusha |
||
12 | ; Запретить прерывание COM1 и COM2 |
||
13 | cli |
||
14 | in AL,21h ;прочитать маску прерываний |
||
15 | or AL,18h ;запретить IRQ3 и IRQ4 |
||
16 | out 21h,AL ;заменить маску |
||
17 | sti |
||
18 | ; ПОИСК МЫШИ ЧЕРЕЗ COM-ПОРТЫ |
||
19 | MouseSearch: |
||
20 | ; Устанавливаем скорость |
||
21 | ; приема/передачи 1200 бод |
||
22 | mov DX,[COMPortBaseAddr] |
||
23 | add DX,3 |
||
24 | in AL,DX |
||
25 | or AL,80h ;установить бит DLAB |
||
26 | out DX,AL |
||
27 | mov DX,[COMPortBaseAddr] |
||
28 | mov AL,60h ;1200 бод |
||
29 | out DX,AL |
||
30 | inc DX |
||
31 | mov AL,0 |
||
32 | out DX,AL |
||
33 | ; Установить длину слова 7 бит, 1 стоповый бит, |
||
34 | ; четность не контролировать |
||
35 | mov DX,[COMPortBaseAddr] |
||
36 | add DX,3 |
||
37 | mov AL,00000010b |
||
38 | out DX,AL |
||
39 | ; Запретить все прерывания |
||
40 | mov DX,[COMPortBaseAddr] |
||
41 | inc DX |
||
42 | mov AL,0 |
||
43 | out DX,AL |
||
44 | ; Проверить, что устройство подключено и является |
||
45 | ; мышью типа MSMouse |
||
46 | ; Отключить питание мыши и прерывания |
||
47 | mov DX,[COMPortBaseAddr] |
||
48 | add DX,4 ;регистр управления модемом |
||
49 | mov AL,0 ;сбросить DTR, RTS и OUT2 |
||
50 | out DX,AL |
||
51 | ; Ожидать 5 "тиков" (0,2 с) |
||
52 | mov ecx,0xffff |
||
53 | dT_1: |
||
54 | dec ecx |
||
55 | cmp ecx,0 |
||
56 | jne dT_1 |
||
57 | mov ecx,0xffff |
||
58 | ; Включить питание мыши |
||
59 | mov AL,11b ;установить DTR и RTS |
||
60 | out DX,AL |
||
61 | ; Очистить регистр данных |
||
62 | mov DX,[COMPortBaseAddr] |
||
63 | in AL,DX |
||
64 | ; Цикл опроса порта |
||
65 | WaitData: |
||
66 | ; Ожидать еще 10 "тиков" |
||
67 | dec ecx |
||
68 | cmp ecx,0 |
||
69 | je NoMouse |
||
70 | ; Проверить наличие идентификационного байта |
||
71 | mov DX,[COMPortBaseAddr] |
||
72 | add DX,5 |
||
73 | in AL,DX |
||
74 | test AL,1 ;Данные готовы? |
||
75 | jz WaitData |
||
76 | ; Ввести данные |
||
77 | mov DX,[COMPortBaseAddr] |
||
78 | in AL,DX |
||
79 | ; Устройство является мышью? |
||
80 | cmp AL,'M' |
||
81 | je EndDetect |
||
82 | NoMouse: |
||
83 | inc [COMPortNum] |
||
84 | cmp [COMPortNum],1 |
||
85 | ja EndDetect |
||
86 | sub [COMPortBaseAddr],100h |
||
87 | jmp MouseSearch |
||
88 | |||
89 | iglobal |
||
90 | COMPortBaseAddr dw 3F8h |
||
91 | COMPortNum dw 0 |
||
92 | endg |
||
93 | |||
94 | iglobal |
||
95 | boot_setmouse_type db 'No COM mouse, set PS2',0 |
||
96 | db 'Detected - COM1 mouse',0 |
||
97 | db 'Detected - COM2 mouse',0 |
||
98 | |||
99 | endg |
||
100 | |||
101 | EndDetect: |
||
102 | cmp [COMPortNum],0 ;номер порта меньше 0? |
||
103 | jl ComMouseNotFound ;мышь не найдена |
||
104 | cmp [COMPortNum],1 ;номер порта больше 1? |
||
105 | ja ComMouseNotFound ;мышь не найдена |
||
106 | mov ax,[COMPortNum] |
||
107 | add al,2 |
||
108 | jmp set_detecting_mouse |
||
109 | ComMouseNotFound: |
||
110 | mov al,1 |
||
111 | set_detecting_mouse: |
||
112 | mov [0xF604],al |
||
113 | dec al |
||
114 | movzx eax,al |
||
115 | imul eax,22 |
||
116 | mov esi,boot_setmouse_type |
||
117 | add esi,eax |
||
118 | call boot_log |
||
119 | popa |
||
120 |