2
#include "../frontio.h"
8
class InputDevice_Mouse : public InputDevice
13
virtual ~InputDevice_Mouse();
15
virtual void Power(void);
16
virtual void UpdateInput(const void *data);
18
virtual void Update(const pscpu_timestamp_t timestamp);
19
virtual void ResetTS(void);
24
virtual void SetDTR(bool new_dtr);
25
virtual bool Clock(bool TxD, int32 &dsr_pulse_delay);
35
uint8 button_post_mask;
45
uint8 transmit_buffer[5];
47
uint32 transmit_count;
50
InputDevice_Mouse::InputDevice_Mouse()
55
InputDevice_Mouse::~InputDevice_Mouse()
60
void InputDevice_Mouse::Update(const pscpu_timestamp_t timestamp)
62
int32 cycles = timestamp - lastts;
64
clear_timeout += cycles;
65
if(clear_timeout >= (33868800 / 4))
67
//puts("Mouse timeout\n");
71
button &= button_post_mask;
77
void InputDevice_Mouse::ResetTS(void)
82
void InputDevice_Mouse::Power(void)
102
memset(transmit_buffer, 0, sizeof(transmit_buffer));
108
void InputDevice_Mouse::UpdateInput(const void *data)
110
accum_xdelta += (int32)MDFN_de32lsb((uint8*)data + 0);
111
accum_ydelta += (int32)MDFN_de32lsb((uint8*)data + 4);
113
if(accum_xdelta > 30 * 127) accum_xdelta = 30 * 127;
114
if(accum_xdelta < 30 * -128) accum_xdelta = 30 * -128;
116
if(accum_ydelta > 30 * 127) accum_ydelta = 30 * 127;
117
if(accum_ydelta < 30 * -128) accum_ydelta = 30 * -128;
119
button |= *((uint8 *)data + 8);
120
button_post_mask = *((uint8 *)data + 8);
123
// MDFN_DispMessage("Button\n");
124
//printf("%d %d\n", accum_xdelta, accum_ydelta);
128
void InputDevice_Mouse::SetDTR(bool new_dtr)
137
else if(dtr && !new_dtr)
139
//if(bitpos || transmit_count)
140
// printf("[PAD] Abort communication!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!\n");
146
bool InputDevice_Mouse::Clock(bool TxD, int32 &dsr_pulse_delay)
156
ret = (transmit_buffer[transmit_pos] >> bitpos) & 1;
158
receive_buffer &= ~(1 << bitpos);
159
receive_buffer |= TxD << bitpos;
160
bitpos = (bitpos + 1) & 0x7;
164
//printf("[PAD] Receive: %02x -- command_phase=%d\n", receive_buffer, command_phase);
173
switch(command_phase)
176
if(receive_buffer != 0x01)
180
transmit_buffer[0] = 0x12;
188
command = receive_buffer;
191
transmit_buffer[0] = 0x5A;
195
int32 xdelta = accum_xdelta;
196
int32 ydelta = accum_ydelta;
198
if(xdelta < -128) xdelta = -128;
199
if(xdelta > 127) xdelta = 127;
201
if(ydelta < -128) ydelta = -128;
202
if(ydelta > 127) ydelta = 127;
204
transmit_buffer[1] = 0xFF;
205
transmit_buffer[2] = 0xFC ^ (button << 2);
206
transmit_buffer[3] = xdelta;
207
transmit_buffer[4] = ydelta;
209
accum_xdelta -= xdelta;
210
accum_ydelta -= ydelta;
212
button &= button_post_mask;
230
if(!bitpos && transmit_count)
231
dsr_pulse_delay = 0x40; //0x100;
236
InputDevice *Device_Mouse_Create(void)
238
return new InputDevice_Mouse();
242
InputDeviceInputInfoStruct Device_Mouse_IDII[4] =
244
{ "x_axis", "X Axis", -1, IDIT_X_AXIS_REL },
245
{ "y_axis", "Y Axis", -1, IDIT_Y_AXIS_REL },
246
{ "right", "Right Button", 1, IDIT_BUTTON, NULL },
247
{ "left", "Left Button", 0, IDIT_BUTTON, NULL },