4,12 → 4,12 |
include '../../../imports.inc' |
|
struc IOCTL |
{ .handle dd ? |
.io_code dd ? |
.input dd ? |
.inp_size dd ? |
.output dd ? |
.out_size dd ? |
{ .handle dd ? |
.io_code dd ? |
.input dd ? |
.inp_size dd ? |
.output dd ? |
.out_size dd ? |
} |
|
virtual at 0 |
22,7 → 22,7 |
DRV_ENTRY equ 1 |
DRV_EXIT equ -1 |
|
MT_3B equ 0 |
MT_3B equ 0 |
MT_3BScroll equ 3 |
MT_5BScroll equ 4 |
|
33,73 → 33,73 |
|
proc START stdcall, state:dword |
|
cmp [state], DRV_ENTRY |
jne .fin |
cmp [state], DRV_ENTRY |
jne .fin |
.init: |
|
call detect_mouse |
test eax,eax |
jnz .exit |
call detect_mouse |
test eax,eax |
jnz .exit |
|
mov [MouseType],MT_3B |
mov [MouseType],MT_3B |
|
call try_mode_ID3 |
test eax,eax |
jnz .stop_try |
mov [MouseType],MT_3BScroll |
|
call try_mode_ID4 |
test eax,eax |
jnz .stop_try |
mov [MouseType],MT_5BScroll |
|
call try_mode_ID3 |
test eax,eax |
jnz .stop_try |
mov [MouseType],MT_3BScroll |
|
call try_mode_ID4 |
test eax,eax |
jnz .stop_try |
mov [MouseType],MT_5BScroll |
|
.stop_try: |
|
mov bl, 0x20 ; read command byte |
call kbd_cmd |
cmp ah,1 |
je .exit |
mov bl, 0x20 ; read command byte |
call kbd_cmd |
cmp ah,1 |
je .exit |
|
call kbd_read |
cmp ah,1 |
je .exit |
call kbd_read |
cmp ah,1 |
je .exit |
|
or al, 10b |
push eax |
mov bl, 0x60 ; write command byte |
call kbd_cmd |
cmp ah,1 |
je .exit |
or al, 10b |
push eax |
mov bl, 0x60 ; write command byte |
call kbd_cmd |
cmp ah,1 |
je .exit |
|
pop eax |
call kbd_write |
cmp ah,1 |
je .exit |
pop eax |
call kbd_write |
cmp ah,1 |
je .exit |
|
mov al, 0xF4 ; enable data reporting |
call mouse_cmd |
mov al, 0xF4 ; enable data reporting |
call mouse_cmd |
|
mov bl, 0xAE ; enable keyboard interface |
call kbd_cmd |
|
stdcall AttachIntHandler, 12, irq_handler |
stdcall RegService, my_service, service_proc |
ret |
mov bl, 0xAE ; enable keyboard interface |
call kbd_cmd |
|
stdcall AttachIntHandler, 12, irq_handler, dword 0 |
stdcall RegService, my_service, service_proc |
ret |
|
.fin: |
;stdcall DetachIntHandler, 12, irq_handler |
mov bl, 0xA7 ; disable mouse interface |
call kbd_cmd |
xor eax, eax |
ret |
;stdcall DetachIntHandler, 12, irq_handler |
mov bl, 0xA7 ; disable mouse interface |
call kbd_cmd |
xor eax, eax |
ret |
|
.exit: |
mov bl, 0xA7 ; disable mouse interface |
call kbd_cmd |
mov bl, 0xAE ; enable keyboard interface |
call kbd_cmd |
xor eax, eax |
ret |
mov bl, 0xA7 ; disable mouse interface |
call kbd_cmd |
mov bl, 0xAE ; enable keyboard interface |
call kbd_cmd |
xor eax, eax |
ret |
endp |
|
proc service_proc stdcall, ioctl:dword |
106,12 → 106,12 |
mov edi, [ioctl] |
mov eax, [edi+IOCTL.io_code] |
test eax, eax |
jz .getversion |
jz .getversion |
cmp eax,1 |
jz .gettype |
jz .gettype |
|
.err: |
or eax, -1 |
or eax, -1 |
ret |
|
.ok: |
120,13 → 120,13 |
|
.getversion: |
cmp [edi+IOCTL.out_size], 4 |
jb .err |
jb .err |
mov edi, [edi+IOCTL.output] |
mov dword [edi], PS2_DRV_VER ; version of driver |
jmp .ok |
.gettype: |
cmp [edi+IOCTL.out_size], 4 |
jb .err |
jb .err |
mov edi, [edi+IOCTL.output] |
mov eax,[MouseType] |
mov dword [edi], eax ; mouse type |
138,60 → 138,60 |
mov bl, 0xAD ; disable keyboard interface |
call kbd_cmd |
cmp ah,1 |
je .fail |
je .fail |
|
mov bl, 0xA8 ; enable mouse interface |
call kbd_cmd |
cmp ah,1 |
je .fail |
je .fail |
|
mov al, 0xFF ; reset |
mov al, 0xFF ; reset |
call mouse_cmd |
jc .fail |
jc .fail |
|
call mouse_read |
jc .fail |
jc .fail |
cmp al, 0xAA |
jne .fail ; dead mouse |
jne .fail ; dead mouse |
|
; get device ID |
call mouse_read |
jc .fail |
jc .fail |
cmp al, 0x00 |
jne .fail ; unknown device |
jne .fail ; unknown device |
xor eax,eax |
ret |
|
.fail: |
or eax,-1 |
or eax,-1 |
ret |
|
try_mode_ID3: |
mov al, 0xF3 ;Set Sample Rate |
call mouse_cmd |
jc .fail |
jc .fail |
mov al, 0xC8 ;200d |
call mouse_cmd |
jc .fail |
jc .fail |
mov al, 0xF3 ;Set Sample Rate |
call mouse_cmd |
jc .fail |
jc .fail |
mov al, 0x64 ;100d |
call mouse_cmd |
jc .fail |
jc .fail |
mov al, 0xF3 ;Set Sample Rate |
call mouse_cmd |
jc .fail |
jc .fail |
mov al, 0x50 ;80d |
call mouse_cmd |
jc .fail |
jc .fail |
|
mov al, 0xF2 ;Get device id |
call mouse_cmd |
jc .fail |
jc .fail |
|
call mouse_read |
jc .fail |
jc .fail |
cmp al, 0x03 |
jne .fail |
|
198,35 → 198,35 |
xor eax,eax |
ret |
.fail: |
or eax,-1 |
or eax,-1 |
ret |
|
try_mode_ID4: |
mov al, 0xF3 ;Set Sample Rate |
call mouse_cmd |
jc .fail |
jc .fail |
mov al, 0xC8 ;200d |
call mouse_cmd |
jc .fail |
jc .fail |
mov al, 0xF3 ;Set Sample Rate |
call mouse_cmd |
jc .fail |
jc .fail |
mov al, 0xC8 ;100d |
call mouse_cmd |
jc .fail |
jc .fail |
mov al, 0xF3 ;Set Sample Rate |
call mouse_cmd |
jc .fail |
jc .fail |
mov al, 0x50 ;80d |
call mouse_cmd |
jc .fail |
jc .fail |
|
mov al, 0xF2 ;Get device id |
call mouse_cmd |
jc .fail |
jc .fail |
|
call mouse_read |
jc .fail |
jc .fail |
cmp al, 0x04 |
jne .fail |
|
234,7 → 234,7 |
ret |
|
.fail: |
or eax,-1 |
or eax,-1 |
ret |
|
include 'ps2m_iofuncs.inc' |
242,12 → 242,12 |
|
section '.data' data readable writable align 16 |
|
version dd 0x00050005 |
version dd 0x00050005 |
my_service db 'ps2mouse',0 |
|
;iofuncs data |
mouse_cmd_byte db 0 |
mouse_nr_tries db 0 |
mouse_cmd_byte db 0 |
mouse_nr_tries db 0 |
mouse_nr_resends db 0 |
|
;hid data |
259,10 → 259,10 |
fourth_byte db 0 |
|
;main data |
MouseType dd 0 |
MouseType dd 0 |
|
XMoving dd 0 |
YMoving dd 0 |
ZMoving dd 0 |
ButtonState dd 0 |
XMoving dd 0 |
YMoving dd 0 |
ZMoving dd 0 |
ButtonState dd 0 |
;timerTicks dd 0 |