pcem/src/mouse_msystems.c

88 lines
2.3 KiB
C

#include <stdlib.h>
#include "ibm.h"
#include "mouse.h"
#include "pic.h"
#include "serial.h"
#include "timer.h"
typedef struct mouse_msystems_t
{
int mousepos, mousedelay;
int oldb;
SERIAL *serial;
} mouse_msystems_t;
static void mouse_msystems_poll(int x, int y, int z, int b, void *p)
{
mouse_msystems_t *mouse = (mouse_msystems_t *)p;
SERIAL *serial = mouse->serial;
uint8_t mousedat[5];
if (!x && !y && b == mouse->oldb)
return;
mouse->oldb = b;
y = -y;
if (x > 127)
x = 127;
if (y > 127)
y = 127;
if (x < -128)
x = -128;
if (y < -128)
y = -128;
/*Use Mouse Systems format*/
mousedat[0] = 0x87;
if (b & 1)
mousedat[0] &= ~0x04;
if (b & 2)
mousedat[0] &= ~0x01;
if (b & 4)
mousedat[0] &= ~0x02;
mousedat[1] = x;
mousedat[2] = y;
mousedat[3] = 0;
mousedat[4] = 0;
if (!(serial->mctrl & 0x10))
{
// pclog("Serial data %02X %02X %02X\n", mousedat[0], mousedat[1], mousedat[2]);
serial_write_fifo(mouse->serial, mousedat[0]);
serial_write_fifo(mouse->serial, mousedat[1]);
serial_write_fifo(mouse->serial, mousedat[2]);
serial_write_fifo(mouse->serial, mousedat[3]);
serial_write_fifo(mouse->serial, mousedat[4]);
}
}
static void *mouse_msystems_init()
{
mouse_msystems_t *mouse = (mouse_msystems_t *)malloc(sizeof(mouse_msystems_t));
memset(mouse, 0, sizeof(mouse_msystems_t));
mouse->serial = &serial1;
serial1.rcr_callback = NULL;
serial1.rcr_callback_p = NULL;
return mouse;
}
static void mouse_msystems_close(void *p)
{
mouse_msystems_t *mouse = (mouse_msystems_t *)p;
free(mouse);
serial1.rcr_callback = NULL;
}
mouse_t mouse_serial_msystems =
{
"Mouse Systems 3-button mouse (serial)",
mouse_msystems_init,
mouse_msystems_close,
mouse_msystems_poll,
MOUSE_TYPE_SERIAL | MOUSE_TYPE_3BUTTON
};