Rev 431 | Go to most recent revision | Details | Compare with Previous | Last modification | View Log | RSS feed
Rev | Author | Line No. | Line |
---|---|---|---|
425 | victor | 1 | $Revision: 465 $ |
431 | serge | 2 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; |
3 | ;; ;; |
||
4 | ;; Copyright (C) KolibriOS team 2004-2007. All rights reserved. ;; |
||
5 | ;; Distributed under terms of the GNU General Public License ;; |
||
6 | ;; ;; |
||
7 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; |
||
8 | |||
1 | ha | 9 | ;************************************************** |
10 | ;* ПОИСК МЫШИ ПО ПОСЛЕДОВАТЕЛЬНЫМ ПОРТАМ * |
||
11 | ;* Процедура подготавливает глобальные переменные * |
||
12 | ;* COMPortNum и COMPortBaseAddr для подпрограммы * |
||
13 | ;* установки обработчика прерывания * |
||
14 | ;************************************************** |
||
15 | ; Автор исходного текста Кулаков Владимир Геннадьевич. |
||
16 | ; Адаптация и доработка Mario79 |
||
17 | |||
33 | mario79 | 18 | Detect_COM_Mouse: |
19 | pusha |
||
20 | call MSMouseSearch |
||
21 | cmp AL,'M' |
||
22 | jne @f |
||
23 | mov [com1_mouse_detected],1 |
||
58 | mario79 | 24 | pusha |
25 | |||
26 | mov eax,4 |
||
27 | shl eax,2 |
||
465 | serge | 28 | mov [irq_owner+eax], 1 |
58 | mario79 | 29 | |
381 | serge | 30 | inc dword [RESERVED_PORTS] |
31 | mov edi,[RESERVED_PORTS] |
||
58 | mario79 | 32 | shl edi,4 |
381 | serge | 33 | mov [RESERVED_PORTS+edi+0],dword 1 |
34 | mov [RESERVED_PORTS+edi+4],dword 0x3f0 |
||
35 | mov [RESERVED_PORTS+edi+8],dword 0x3ff |
||
58 | mario79 | 36 | |
37 | popa |
||
33 | mario79 | 38 | mov esi,boot_setmouse_type+22 |
39 | call boot_log |
||
40 | @@: |
||
41 | sub [COMPortBaseAddr],100h |
||
42 | call MSMouseSearch |
||
43 | cmp AL,'M' |
||
381 | serge | 44 | jne @f |
33 | mario79 | 45 | mov [com2_mouse_detected],1 |
58 | mario79 | 46 | pusha |
47 | |||
48 | mov eax,3 |
||
49 | shl eax,2 |
||
465 | serge | 50 | mov [irq_owner+eax], 1 |
381 | serge | 51 | |
52 | inc dword [RESERVED_PORTS] |
||
53 | mov edi,[RESERVED_PORTS] |
||
58 | mario79 | 54 | shl edi,4 |
381 | serge | 55 | mov [RESERVED_PORTS+edi+0],dword 1 |
56 | mov [RESERVED_PORTS+edi+4],dword 0x2f0 |
||
57 | mov [RESERVED_PORTS+edi+8],dword 0x2ff |
||
58 | mario79 | 58 | |
59 | popa |
||
33 | mario79 | 60 | mov esi,boot_setmouse_type+44 |
61 | call boot_log |
||
62 | @@: |
||
63 | popa |
||
64 | jmp end_detecting_mouse |
||
65 | |||
1 | ha | 66 | MSMouseSearch: |
33 | mario79 | 67 | ; ПОИСК МЫШИ ЧЕРЕЗ COM-ПОРТЫ |
1 | ha | 68 | MouseSearch: |
69 | ; Устанавливаем скорость |
||
70 | ; приема/передачи 1200 бод |
||
71 | mov DX,[COMPortBaseAddr] |
||
72 | add DX,3 |
||
73 | in AL,DX |
||
74 | or AL,80h ;установить бит DLAB |
||
75 | out DX,AL |
||
76 | mov DX,[COMPortBaseAddr] |
||
77 | mov AL,60h ;1200 бод |
||
78 | out DX,AL |
||
79 | inc DX |
||
80 | mov AL,0 |
||
81 | out DX,AL |
||
82 | ; Установить длину слова 7 бит, 1 стоповый бит, |
||
83 | ; четность не контролировать |
||
84 | mov DX,[COMPortBaseAddr] |
||
85 | add DX,3 |
||
86 | mov AL,00000010b |
||
87 | out DX,AL |
||
381 | serge | 88 | ; Запретить все прерывани |
1 | ha | 89 | mov DX,[COMPortBaseAddr] |
90 | inc DX |
||
91 | mov AL,0 |
||
92 | out DX,AL |
||
381 | serge | 93 | ; Проверить, что устройство подключено и являетс |
1 | ha | 94 | ; мышью типа MSMouse |
381 | serge | 95 | ; Отключить питание мыши и прерывани |
1 | ha | 96 | mov DX,[COMPortBaseAddr] |
97 | add DX,4 ;регистр управления модемом |
||
98 | mov AL,0 ;сбросить DTR, RTS и OUT2 |
||
99 | out DX,AL |
||
100 | ; Ожидать 5 "тиков" (0,2 с) |
||
101 | mov ecx,0xffff |
||
102 | dT_1: |
||
103 | dec ecx |
||
104 | cmp ecx,0 |
||
105 | jne dT_1 |
||
381 | serge | 106 | mov ecx,0xffff |
1 | ha | 107 | ; Включить питание мыши |
108 | mov AL,11b ;установить DTR и RTS |
||
109 | out DX,AL |
||
381 | serge | 110 | ; Очистить регистр данных |
1 | ha | 111 | mov DX,[COMPortBaseAddr] |
112 | in AL,DX |
||
381 | serge | 113 | ; Цикл опроса порта |
1 | ha | 114 | WaitData: |
115 | ; Ожидать еще 10 "тиков" |
||
116 | dec ecx |
||
117 | cmp ecx,0 |
||
118 | je NoMouse |
||
119 | ; Проверить наличие идентификационного байта |
||
120 | mov DX,[COMPortBaseAddr] |
||
121 | add DX,5 |
||
122 | in AL,DX |
||
123 | test AL,1 ;Данные готовы? |
||
124 | jz WaitData |
||
125 | ; Ввести данные |
||
126 | mov DX,[COMPortBaseAddr] |
||
127 | in AL,DX |
||
128 | NoMouse: |
||
33 | mario79 | 129 | ret |
1 | ha | 130 | |
131 | iglobal |
||
132 | COMPortBaseAddr dw 3F8h |
||
33 | mario79 | 133 | ;COMPortNum dw 0 |
1 | ha | 134 | endg |
135 | |||
136 | iglobal |
||
33 | mario79 | 137 | boot_setmouse_type db 'Detected - PS2 mouse',0 |
1 | ha | 138 | db 'Detected - COM1 mouse',0 |
139 | db 'Detected - COM2 mouse',0 |
||
140 | endg |
||
141 | |||
33 | mario79 | 142 | end_detecting_mouse: |
1 | ha | 143 |