Added Microsoft Intellimouse emulation
This commit is contained in:
parent
09dbd1dd65
commit
7f7c11edb2
11 changed files with 92 additions and 36 deletions
|
|
@ -28,7 +28,12 @@ typedef struct mouse_ps2_t
|
|||
|
||||
int cd;
|
||||
|
||||
int x, y, b;
|
||||
int x, y, z, b;
|
||||
|
||||
int is_intellimouse;
|
||||
int intellimouse_mode;
|
||||
|
||||
uint8_t last_data[6];
|
||||
} mouse_ps2_t;
|
||||
|
||||
void mouse_ps2_write(uint8_t val, void *p)
|
||||
|
|
@ -92,7 +97,10 @@ void mouse_ps2_write(uint8_t val, void *p)
|
|||
|
||||
case 0xf2: /*Read ID*/
|
||||
keyboard_at_adddata_mouse(0xfa);
|
||||
keyboard_at_adddata_mouse(0x00);
|
||||
if (mouse->intellimouse_mode)
|
||||
keyboard_at_adddata_mouse(0x03);
|
||||
else
|
||||
keyboard_at_adddata_mouse(0x00);
|
||||
break;
|
||||
|
||||
case 0xf3: /*Set sample rate*/
|
||||
|
|
@ -113,6 +121,7 @@ void mouse_ps2_write(uint8_t val, void *p)
|
|||
case 0xff: /*Reset*/
|
||||
mouse->mode = MOUSE_STREAM;
|
||||
mouse->flags = 0;
|
||||
mouse->intellimouse_mode = 0;
|
||||
keyboard_at_adddata_mouse(0xfa);
|
||||
keyboard_at_adddata_mouse(0xaa);
|
||||
keyboard_at_adddata_mouse(0x00);
|
||||
|
|
@ -122,52 +131,74 @@ void mouse_ps2_write(uint8_t val, void *p)
|
|||
// fatal("mouse_ps2 : Bad command %02X\n", val, mouse->command);
|
||||
}
|
||||
}
|
||||
|
||||
if (mouse->is_intellimouse)
|
||||
{
|
||||
int c;
|
||||
|
||||
for (c = 0; c < 5; c++)
|
||||
mouse->last_data[c] = mouse->last_data[c+1];
|
||||
|
||||
mouse->last_data[5] = val;
|
||||
|
||||
if (mouse->last_data[0] == 0xf3 && mouse->last_data[1] == 0xc8 &&
|
||||
mouse->last_data[2] == 0xf3 && mouse->last_data[3] == 0x64 &&
|
||||
mouse->last_data[4] == 0xf3 && mouse->last_data[5] == 0x50)
|
||||
mouse->intellimouse_mode = 1;
|
||||
}
|
||||
}
|
||||
|
||||
void mouse_ps2_poll(int x, int y, int b, void *p)
|
||||
void mouse_ps2_poll(int x, int y, int z, int b, void *p)
|
||||
{
|
||||
mouse_ps2_t *mouse = (mouse_ps2_t *)p;
|
||||
uint8_t packet[3] = {0x08, 0, 0};
|
||||
|
||||
if (!x && !y && b == mouse->b)
|
||||
if (!x && !y && !z && b == mouse->b)
|
||||
return;
|
||||
|
||||
if (!mouse_scan)
|
||||
return;
|
||||
|
||||
mouse->x += x;
|
||||
mouse->y -= y;
|
||||
mouse->y -= y;
|
||||
mouse->z -= z;
|
||||
if (mouse->mode == MOUSE_STREAM && (mouse->flags & MOUSE_ENABLE) &&
|
||||
((mouse_queue_end - mouse_queue_start) & 0xf) < 13)
|
||||
{
|
||||
mouse->b = b;
|
||||
// pclog("Send packet : %i %i\n", ps2_x, ps2_y);
|
||||
if (mouse->x > 255)
|
||||
mouse->x = 255;
|
||||
mouse->x = 255;
|
||||
if (mouse->x < -256)
|
||||
mouse->x = -256;
|
||||
mouse->x = -256;
|
||||
if (mouse->y > 255)
|
||||
mouse->y = 255;
|
||||
mouse->y = 255;
|
||||
if (mouse->y < -256)
|
||||
mouse->y = -256;
|
||||
mouse->y = -256;
|
||||
if (mouse->z < -8)
|
||||
mouse->z = -8;
|
||||
if (mouse->z > 7)
|
||||
mouse->z = 7;
|
||||
if (mouse->x < 0)
|
||||
packet[0] |= 0x10;
|
||||
packet[0] |= 0x10;
|
||||
if (mouse->y < 0)
|
||||
packet[0] |= 0x20;
|
||||
packet[0] |= 0x20;
|
||||
if (mouse_buttons & 1)
|
||||
packet[0] |= 1;
|
||||
packet[0] |= 1;
|
||||
if (mouse_buttons & 2)
|
||||
packet[0] |= 2;
|
||||
if (mouse_buttons & 4)
|
||||
packet[0] |= 4;
|
||||
packet[0] |= 2;
|
||||
if ((mouse_buttons & 4) && (mouse_get_type(mouse_type) & MOUSE_TYPE_3BUTTON))
|
||||
packet[0] |= 4;
|
||||
packet[1] = mouse->x & 0xff;
|
||||
packet[2] = mouse->y & 0xff;
|
||||
|
||||
mouse->x = mouse->y = 0;
|
||||
|
||||
|
||||
keyboard_at_adddata_mouse(packet[0]);
|
||||
keyboard_at_adddata_mouse(packet[1]);
|
||||
keyboard_at_adddata_mouse(packet[2]);
|
||||
if (mouse->intellimouse_mode)
|
||||
keyboard_at_adddata_mouse(mouse->z);
|
||||
|
||||
mouse->x = mouse->y = mouse->z = 0;
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -187,6 +218,15 @@ void *mouse_ps2_init()
|
|||
return mouse;
|
||||
}
|
||||
|
||||
void *mouse_intellimouse_init()
|
||||
{
|
||||
mouse_ps2_t *mouse = mouse_ps2_init();
|
||||
|
||||
mouse->is_intellimouse = 1;
|
||||
|
||||
return mouse;
|
||||
}
|
||||
|
||||
void mouse_ps2_close(void *p)
|
||||
{
|
||||
mouse_ps2_t *mouse = (mouse_ps2_t *)p;
|
||||
|
|
@ -202,3 +242,11 @@ mouse_t mouse_ps2_2_button =
|
|||
mouse_ps2_poll,
|
||||
MOUSE_TYPE_PS2
|
||||
};
|
||||
mouse_t mouse_intellimouse =
|
||||
{
|
||||
"Microsoft Intellimouse (PS/2)",
|
||||
mouse_intellimouse_init,
|
||||
mouse_ps2_close,
|
||||
mouse_ps2_poll,
|
||||
MOUSE_TYPE_PS2 | MOUSE_TYPE_3BUTTON
|
||||
};
|
||||
|
|
|
|||
Loading…
Reference in a new issue