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