2
#include "../frontio.h"
3
#include "dualanalog.h"
8
class InputDevice_DualAnalog : public InputDevice
12
InputDevice_DualAnalog(bool joystick_mode_);
13
virtual ~InputDevice_DualAnalog();
15
virtual void Power(void);
16
virtual void UpdateInput(const void *data);
21
virtual void SetDTR(bool new_dtr);
22
virtual bool GetDSR(void);
23
virtual bool Clock(bool TxD, int32 &dsr_pulse_delay);
39
uint8 transmit_buffer[8];
41
uint32 transmit_count;
44
InputDevice_DualAnalog::InputDevice_DualAnalog(bool joystick_mode_) : joystick_mode(joystick_mode_)
49
InputDevice_DualAnalog::~InputDevice_DualAnalog()
54
void InputDevice_DualAnalog::Power(void)
58
buttons[0] = buttons[1] = 0;
68
memset(transmit_buffer, 0, sizeof(transmit_buffer));
74
void InputDevice_DualAnalog::UpdateInput(const void *data)
76
uint8 *d8 = (uint8 *)data;
81
for(int stick = 0; stick < 2; stick++)
83
for(int axis = 0; axis < 2; axis++)
87
tmp = 32768 + MDFN_de32lsb((const uint8 *)data + stick * 16 + axis * 8 + 4) - ((int32)MDFN_de32lsb((const uint8 *)data + stick * 16 + axis * 8 + 8) * 32768 / 32767);
90
axes[stick][axis] = tmp;
94
//printf("%d %d %d %d\n", axes[0][0], axes[0][1], axes[1][0], axes[1][1]);
99
void InputDevice_DualAnalog::SetDTR(bool new_dtr)
108
else if(dtr && !new_dtr)
110
//if(bitpos || transmit_count)
111
// printf("[PAD] Abort communication!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!\n");
117
bool InputDevice_DualAnalog::GetDSR(void)
122
if(!bitpos && transmit_count)
128
bool InputDevice_DualAnalog::Clock(bool TxD, int32 &dsr_pulse_delay)
138
ret = (transmit_buffer[transmit_pos] >> bitpos) & 1;
140
receive_buffer &= ~(1 << bitpos);
141
receive_buffer |= TxD << bitpos;
142
bitpos = (bitpos + 1) & 0x7;
146
//printf("[PAD] Receive: %02x -- command_phase=%d\n", receive_buffer, command_phase);
155
switch(command_phase)
158
if(receive_buffer != 0x01)
162
transmit_buffer[0] = joystick_mode ? 0x53 : 0x73;
170
command = receive_buffer;
173
transmit_buffer[0] = 0x5A;
175
//if(command != 0x42)
176
// fprintf(stderr, "Gamepad unhandled command: 0x%02x\n", command);
180
transmit_buffer[1] = 0xFF ^ buttons[0];
181
transmit_buffer[2] = 0xFF ^ buttons[1];
182
transmit_buffer[3] = axes[0][0];
183
transmit_buffer[4] = axes[0][1];
184
transmit_buffer[5] = axes[1][0];
185
transmit_buffer[6] = axes[1][1];
192
transmit_buffer[1] = 0;
193
transmit_buffer[2] = 0;
202
if(!bitpos && transmit_count)
203
dsr_pulse_delay = 0x40; //0x100;
208
InputDevice *Device_DualAnalog_Create(bool joystick_mode)
210
return new InputDevice_DualAnalog(joystick_mode);
214
InputDeviceInputInfoStruct Device_DualAnalog_IDII[24] =
216
{ "select", "SELECT", 4, IDIT_BUTTON, NULL },
217
{ NULL, "empty", 0, IDIT_BUTTON },
218
{ NULL, "empty", 0, IDIT_BUTTON },
219
{ "start", "START", 5, IDIT_BUTTON, NULL },
220
{ "up", "D-Pad UP ↑", 0, IDIT_BUTTON, "down" },
221
{ "right", "D-Pad RIGHT →", 3, IDIT_BUTTON, "left" },
222
{ "down", "D-Pad DOWN ↓", 1, IDIT_BUTTON, "up" },
223
{ "left", "D-Pad LEFT ←", 2, IDIT_BUTTON, "right" },
225
{ "l2", "L2 (rear left shoulder)", 11, IDIT_BUTTON, NULL },
226
{ "r2", "R2 (rear right shoulder)", 13, IDIT_BUTTON, NULL },
227
{ "l1", "L1 (front left shoulder)", 10, IDIT_BUTTON, NULL },
228
{ "r1", "R1 (front right shoulder)", 12, IDIT_BUTTON, NULL },
230
{ "triangle", "△ (upper)", 6, IDIT_BUTTON_CAN_RAPID, NULL },
231
{ "circle", "○ (right)", 9, IDIT_BUTTON_CAN_RAPID, NULL },
232
{ "cross", "x (lower)", 7, IDIT_BUTTON_CAN_RAPID, NULL },
233
{ "square", "□ (left)", 8, IDIT_BUTTON_CAN_RAPID, NULL },
235
{ "rstick_right", "Right Stick RIGHT →", 21, IDIT_BUTTON_ANALOG },
236
{ "rstick_left", "Right Stick LEFT ←", 20, IDIT_BUTTON_ANALOG },
237
{ "rstick_down", "Right Stick DOWN ↓", 19, IDIT_BUTTON_ANALOG },
238
{ "rstick_up", "Right Stick UP ↑", 18, IDIT_BUTTON_ANALOG },
240
{ "lstick_right", "Left Stick RIGHT →", 17, IDIT_BUTTON_ANALOG },
241
{ "lstick_left", "Left Stick LEFT ←", 16, IDIT_BUTTON_ANALOG },
242
{ "lstick_down", "Left Stick DOWN ↓", 15, IDIT_BUTTON_ANALOG },
243
{ "lstick_up", "Left Stick UP ↑", 14, IDIT_BUTTON_ANALOG },
247
// Not sure if all these buttons are named correctly!
248
InputDeviceInputInfoStruct Device_AnalogJoy_IDII[24] =
250
{ "select", "SELECT", 8, IDIT_BUTTON, NULL },
251
{ NULL, "empty", 0, IDIT_BUTTON },
252
{ NULL, "empty", 0, IDIT_BUTTON },
253
{ "start", "START", 9, IDIT_BUTTON, NULL },
254
{ "up", "Thumbstick UP ↑", 14, IDIT_BUTTON, "down" },
255
{ "right", "Thumbstick RIGHT →", 17, IDIT_BUTTON, "left" },
256
{ "down", "Thumbstick DOWN ↓", 15, IDIT_BUTTON, "up" },
257
{ "left", "Thumbstick LEFT ←", 16, IDIT_BUTTON, "right" },
259
{ "l2", "Left stick, Trigger", 2, IDIT_BUTTON, NULL },
260
{ "r2", "Left stick, Pinky", 3, IDIT_BUTTON, NULL },
261
{ "l1", "Left stick, L-thumb", 0, IDIT_BUTTON, NULL },
262
{ "r1", "Left stick, R-thumb", 1, IDIT_BUTTON, NULL },
264
{ "triangle", "Right stick, Pinky", 13, IDIT_BUTTON_CAN_RAPID, NULL },
265
{ "circle", "Right stick, R-thumb", 11, IDIT_BUTTON_CAN_RAPID, NULL },
266
{ "cross", "Right stick, L-thumb", 10, IDIT_BUTTON_CAN_RAPID, NULL },
267
{ "square", "Right stick, Trigger", 12, IDIT_BUTTON_CAN_RAPID, NULL },
269
{ "rstick_right", "Right Stick, RIGHT →", 21, IDIT_BUTTON_ANALOG },
270
{ "rstick_left", "Right Stick, LEFT ←", 20, IDIT_BUTTON_ANALOG },
271
{ "rstick_down", "Right Stick, BACK ↓", 19, IDIT_BUTTON_ANALOG },
272
{ "rstick_up", "Right Stick, FORE ↑", 18, IDIT_BUTTON_ANALOG },
274
{ "lstick_right", "Left Stick, RIGHT →", 7, IDIT_BUTTON_ANALOG },
275
{ "lstick_left", "Left Stick, LEFT ←", 6, IDIT_BUTTON_ANALOG },
276
{ "lstick_down", "Left Stick, BACK ↓", 5, IDIT_BUTTON_ANALOG },
277
{ "lstick_up", "Left Stick, FORE ↑", 4, IDIT_BUTTON_ANALOG },