Rev 5031 | Go to most recent revision | Details | Compare with Previous | Last modification | View Log | RSS feed
Rev | Author | Line No. | Line |
---|---|---|---|
5044 | clevermous | 1 | ; standard driver stuff; version of driver model = 5 |
2 | format PE DLL native 0.05 |
||
492 | kastigar | 3 | |
3550 | hidnplayr | 4 | DEBUG equ 1 |
5 | |||
6 | MT_3B equ 0 |
||
492 | kastigar | 7 | MT_3BScroll equ 3 |
8 | MT_5BScroll equ 4 |
||
9 | |||
10 | PS2_DRV_VER equ 1 |
||
11 | |||
5044 | clevermous | 12 | section '.flat' code readable writable executable |
13 | data fixups |
||
14 | end data |
||
15 | include '../../../struct.inc' |
||
16 | include '../../../macros.inc' |
||
17 | include '../../../proc32.inc' |
||
18 | include '../../../peimport.inc' |
||
492 | kastigar | 19 | |
20 | |||
5044 | clevermous | 21 | entry START |
22 | proc START c, state:dword, cmdline:dword |
||
492 | kastigar | 23 | |
3550 | hidnplayr | 24 | cmp [state], DRV_ENTRY |
5031 | clevermous | 25 | jne .nothing |
492 | kastigar | 26 | .init: |
5031 | clevermous | 27 | ; disable keyboard and mouse interrupts |
28 | ; keyboard IRQ handler can interfere badly otherwise |
||
29 | pushf |
||
30 | cli |
||
31 | mov bl, 0x20 ; read command byte |
||
32 | call kbd_cmd |
||
33 | test ah,ah |
||
34 | jnz .fin |
||
35 | call kbd_read |
||
36 | test ah,ah |
||
37 | jnz .fin |
||
38 | popf |
||
39 | and al, 0xFC ; disable interrupts |
||
40 | or al, 0x10 ; disable keyboard |
||
41 | push eax |
||
42 | mov bl, 0x60 ; write command byte |
||
43 | call kbd_cmd |
||
44 | pop eax |
||
45 | call kbd_write |
||
492 | kastigar | 46 | |
3550 | hidnplayr | 47 | call detect_mouse |
48 | test eax,eax |
||
49 | jnz .exit |
||
492 | kastigar | 50 | |
3550 | hidnplayr | 51 | mov [MouseType],MT_3B |
492 | kastigar | 52 | |
3550 | hidnplayr | 53 | call try_mode_ID3 |
54 | test eax,eax |
||
55 | jnz .stop_try |
||
56 | mov [MouseType],MT_3BScroll |
||
57 | |||
58 | call try_mode_ID4 |
||
59 | test eax,eax |
||
60 | jnz .stop_try |
||
61 | mov [MouseType],MT_5BScroll |
||
62 | |||
492 | kastigar | 63 | .stop_try: |
64 | |||
5031 | clevermous | 65 | mov al, 0xF4 ; enable data reporting |
66 | call mouse_cmd |
||
67 | |||
68 | ; enable keyboard and mouse interrupts |
||
3550 | hidnplayr | 69 | mov bl, 0x20 ; read command byte |
70 | call kbd_cmd |
||
71 | call kbd_read |
||
5031 | clevermous | 72 | or al, 3 ; enable interrupts |
73 | and al, not 0x10 ; enable keyboard |
||
3550 | hidnplayr | 74 | push eax |
75 | mov bl, 0x60 ; write command byte |
||
76 | call kbd_cmd |
||
77 | pop eax |
||
78 | call kbd_write |
||
492 | kastigar | 79 | |
5044 | clevermous | 80 | invoke AttachIntHandler, 12, irq_handler, 0 |
81 | invoke RegService, my_service, service_proc |
||
3550 | hidnplayr | 82 | ret |
492 | kastigar | 83 | |
84 | .fin: |
||
5031 | clevermous | 85 | popf |
5044 | clevermous | 86 | ;invoke DetachIntHandler, 12, irq_handler |
3550 | hidnplayr | 87 | mov bl, 0xA7 ; disable mouse interface |
88 | call kbd_cmd |
||
5031 | clevermous | 89 | .nothing: |
3550 | hidnplayr | 90 | xor eax, eax |
91 | ret |
||
492 | kastigar | 92 | |
93 | .exit: |
||
3550 | hidnplayr | 94 | mov bl, 0xA7 ; disable mouse interface |
95 | call kbd_cmd |
||
5031 | clevermous | 96 | |
97 | ; enable keyboard interrupt, leave mouse interrupt disabled |
||
98 | mov bl, 0x20 ; read command byte |
||
3550 | hidnplayr | 99 | call kbd_cmd |
5031 | clevermous | 100 | call kbd_read |
101 | or al, 1 ; enable keyboard interrupt |
||
102 | and al, not 0x10 ; enable keyboard |
||
103 | push eax |
||
104 | mov bl, 0x60 ; write command byte |
||
105 | call kbd_cmd |
||
106 | pop eax |
||
107 | call kbd_write |
||
108 | |||
3550 | hidnplayr | 109 | xor eax, eax |
110 | ret |
||
492 | kastigar | 111 | endp |
112 | |||
113 | proc service_proc stdcall, ioctl:dword |
||
114 | mov edi, [ioctl] |
||
115 | mov eax, [edi+IOCTL.io_code] |
||
116 | test eax, eax |
||
3550 | hidnplayr | 117 | jz .getversion |
492 | kastigar | 118 | cmp eax,1 |
3550 | hidnplayr | 119 | jz .gettype |
492 | kastigar | 120 | |
121 | .err: |
||
3550 | hidnplayr | 122 | or eax, -1 |
492 | kastigar | 123 | ret |
124 | |||
125 | .ok: |
||
126 | xor eax, eax |
||
127 | ret |
||
128 | |||
129 | .getversion: |
||
130 | cmp [edi+IOCTL.out_size], 4 |
||
3550 | hidnplayr | 131 | jb .err |
492 | kastigar | 132 | mov edi, [edi+IOCTL.output] |
3550 | hidnplayr | 133 | mov dword [edi], PS2_DRV_VER ; version of driver |
492 | kastigar | 134 | jmp .ok |
135 | .gettype: |
||
136 | cmp [edi+IOCTL.out_size], 4 |
||
3550 | hidnplayr | 137 | jb .err |
492 | kastigar | 138 | mov edi, [edi+IOCTL.output] |
139 | mov eax,[MouseType] |
||
3550 | hidnplayr | 140 | mov dword [edi], eax ; mouse type |
492 | kastigar | 141 | jmp .ok |
142 | endp |
||
143 | |||
144 | detect_mouse: |
||
145 | |||
3550 | hidnplayr | 146 | mov bl, 0xA8 ; enable mouse interface |
492 | kastigar | 147 | call kbd_cmd |
148 | cmp ah,1 |
||
3550 | hidnplayr | 149 | je .fail |
492 | kastigar | 150 | |
3550 | hidnplayr | 151 | mov al, 0xFF ; reset |
492 | kastigar | 152 | call mouse_cmd |
3550 | hidnplayr | 153 | jc .fail |
492 | kastigar | 154 | |
155 | call mouse_read |
||
3550 | hidnplayr | 156 | jc .fail |
492 | kastigar | 157 | cmp al, 0xAA |
3550 | hidnplayr | 158 | jne .fail ; dead mouse |
492 | kastigar | 159 | |
160 | ; get device ID |
||
161 | call mouse_read |
||
3550 | hidnplayr | 162 | jc .fail |
492 | kastigar | 163 | cmp al, 0x00 |
3550 | hidnplayr | 164 | jne .fail ; unknown device |
5031 | clevermous | 165 | |
492 | kastigar | 166 | xor eax,eax |
167 | ret |
||
168 | |||
169 | .fail: |
||
3550 | hidnplayr | 170 | or eax,-1 |
492 | kastigar | 171 | ret |
172 | |||
173 | try_mode_ID3: |
||
174 | mov al, 0xF3 ;Set Sample Rate |
||
175 | call mouse_cmd |
||
3550 | hidnplayr | 176 | jc .fail |
492 | kastigar | 177 | mov al, 0xC8 ;200d |
178 | call mouse_cmd |
||
3550 | hidnplayr | 179 | jc .fail |
492 | kastigar | 180 | mov al, 0xF3 ;Set Sample Rate |
181 | call mouse_cmd |
||
3550 | hidnplayr | 182 | jc .fail |
492 | kastigar | 183 | mov al, 0x64 ;100d |
184 | call mouse_cmd |
||
3550 | hidnplayr | 185 | jc .fail |
492 | kastigar | 186 | mov al, 0xF3 ;Set Sample Rate |
187 | call mouse_cmd |
||
3550 | hidnplayr | 188 | jc .fail |
492 | kastigar | 189 | mov al, 0x50 ;80d |
190 | call mouse_cmd |
||
3550 | hidnplayr | 191 | jc .fail |
492 | kastigar | 192 | |
193 | mov al, 0xF2 ;Get device id |
||
194 | call mouse_cmd |
||
3550 | hidnplayr | 195 | jc .fail |
492 | kastigar | 196 | |
197 | call mouse_read |
||
3550 | hidnplayr | 198 | jc .fail |
492 | kastigar | 199 | cmp al, 0x03 |
200 | jne .fail |
||
201 | |||
202 | xor eax,eax |
||
203 | ret |
||
204 | .fail: |
||
3550 | hidnplayr | 205 | or eax,-1 |
492 | kastigar | 206 | ret |
207 | |||
208 | try_mode_ID4: |
||
209 | mov al, 0xF3 ;Set Sample Rate |
||
210 | call mouse_cmd |
||
3550 | hidnplayr | 211 | jc .fail |
492 | kastigar | 212 | mov al, 0xC8 ;200d |
213 | call mouse_cmd |
||
3550 | hidnplayr | 214 | jc .fail |
492 | kastigar | 215 | mov al, 0xF3 ;Set Sample Rate |
216 | call mouse_cmd |
||
3550 | hidnplayr | 217 | jc .fail |
492 | kastigar | 218 | mov al, 0xC8 ;100d |
219 | call mouse_cmd |
||
3550 | hidnplayr | 220 | jc .fail |
492 | kastigar | 221 | mov al, 0xF3 ;Set Sample Rate |
222 | call mouse_cmd |
||
3550 | hidnplayr | 223 | jc .fail |
492 | kastigar | 224 | mov al, 0x50 ;80d |
225 | call mouse_cmd |
||
3550 | hidnplayr | 226 | jc .fail |
492 | kastigar | 227 | |
228 | mov al, 0xF2 ;Get device id |
||
229 | call mouse_cmd |
||
3550 | hidnplayr | 230 | jc .fail |
492 | kastigar | 231 | |
232 | call mouse_read |
||
3550 | hidnplayr | 233 | jc .fail |
492 | kastigar | 234 | cmp al, 0x04 |
235 | jne .fail |
||
236 | |||
237 | xor eax,eax |
||
238 | ret |
||
239 | |||
240 | .fail: |
||
3550 | hidnplayr | 241 | or eax,-1 |
492 | kastigar | 242 | ret |
243 | |||
244 | include 'ps2m_iofuncs.inc' |
||
245 | include 'ps2m_irqh.inc' |
||
246 | |||
3550 | hidnplayr | 247 | my_service db 'ps2mouse',0 |
492 | kastigar | 248 | |
249 | ;iofuncs data |
||
3550 | hidnplayr | 250 | mouse_cmd_byte db 0 |
251 | mouse_nr_tries db 0 |
||
492 | kastigar | 252 | mouse_nr_resends db 0 |
253 | |||
254 | ;hid data |
||
255 | mouse_byte dd 0 |
||
256 | |||
257 | first_byte db 0 |
||
258 | second_byte db 0 |
||
259 | third_byte db 0 |
||
260 | fourth_byte db 0 |
||
261 | |||
262 | ;main data |
||
3550 | hidnplayr | 263 | MouseType dd 0 |
492 | kastigar | 264 | |
3550 | hidnplayr | 265 | XMoving dd 0 |
266 | YMoving dd 0 |
||
267 | ZMoving dd 0 |
||
268 | ButtonState dd 0 |
||
492 | kastigar | 269 | ;timerTicks dd 0 |