~ubuntu-branches/debian/experimental/mednafen/experimental

« back to all changes in this revision

Viewing changes to src/psx/input/dualanalog.cpp

  • Committer: Package Import Robot
  • Author(s): Stephen Kitt
  • Date: 2012-01-31 07:21:35 UTC
  • mfrom: (1.2.8)
  • Revision ID: package-import@ubuntu.com-20120131072135-es3dj12y00xcnrsk
Tags: 0.9.19-1
* New upstream WIP version.
* Update copyright information.
* Refresh use-system-tremor.patch and remove psx-big-endian-only.patch.
* Add spelling-fixes.patch based on Lintian's recommendations.
* Build-depend on debhelper 9 or later and remove corresponding Lintian
  override.

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
#include "../psx.h"
 
2
#include "../frontio.h"
 
3
#include "dualanalog.h"
 
4
 
 
5
namespace MDFN_IEN_PSX
 
6
{
 
7
 
 
8
class InputDevice_DualAnalog : public InputDevice
 
9
{
 
10
 public:
 
11
 
 
12
 InputDevice_DualAnalog(bool joystick_mode_);
 
13
 virtual ~InputDevice_DualAnalog();
 
14
 
 
15
 virtual void Power(void);
 
16
 virtual void UpdateInput(const void *data);
 
17
 
 
18
 //
 
19
 //
 
20
 //
 
21
 virtual void SetDTR(bool new_dtr);
 
22
 virtual bool GetDSR(void);
 
23
 virtual bool Clock(bool TxD, int32 &dsr_pulse_delay);
 
24
 
 
25
 private:
 
26
 
 
27
 bool joystick_mode;
 
28
 bool dtr;
 
29
 
 
30
 uint8 buttons[2];
 
31
 uint8 axes[2][2];
 
32
 
 
33
 int32 command_phase;
 
34
 uint32 bitpos;
 
35
 uint8 receive_buffer;
 
36
 
 
37
 uint8 command;
 
38
 
 
39
 uint8 transmit_buffer[8];
 
40
 uint32 transmit_pos;
 
41
 uint32 transmit_count;
 
42
};
 
43
 
 
44
InputDevice_DualAnalog::InputDevice_DualAnalog(bool joystick_mode_) : joystick_mode(joystick_mode_)
 
45
{
 
46
 Power();
 
47
}
 
48
 
 
49
InputDevice_DualAnalog::~InputDevice_DualAnalog()
 
50
{
 
51
 
 
52
}
 
53
 
 
54
void InputDevice_DualAnalog::Power(void)
 
55
{
 
56
 dtr = 0;
 
57
 
 
58
 buttons[0] = buttons[1] = 0;
 
59
 
 
60
 command_phase = 0;
 
61
 
 
62
 bitpos = 0;
 
63
 
 
64
 receive_buffer = 0;
 
65
 
 
66
 command = 0;
 
67
 
 
68
 memset(transmit_buffer, 0, sizeof(transmit_buffer));
 
69
 
 
70
 transmit_pos = 0;
 
71
 transmit_count = 0;
 
72
}
 
73
 
 
74
void InputDevice_DualAnalog::UpdateInput(const void *data)
 
75
{
 
76
 uint8 *d8 = (uint8 *)data;
 
77
 
 
78
 buttons[0] = d8[0];
 
79
 buttons[1] = d8[1];
 
80
 
 
81
 for(int stick = 0; stick < 2; stick++)
 
82
 {
 
83
  for(int axis = 0; axis < 2; axis++)
 
84
  {
 
85
   int32 tmp;
 
86
 
 
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);
 
88
   tmp >>= 8;
 
89
 
 
90
   axes[stick][axis] = tmp;
 
91
  }
 
92
 }
 
93
 
 
94
 //printf("%d %d %d %d\n", axes[0][0], axes[0][1], axes[1][0], axes[1][1]);
 
95
 
 
96
}
 
97
 
 
98
 
 
99
void InputDevice_DualAnalog::SetDTR(bool new_dtr)
 
100
{
 
101
 if(!dtr && new_dtr)
 
102
 {
 
103
  command_phase = 0;
 
104
  bitpos = 0;
 
105
  transmit_pos = 0;
 
106
  transmit_count = 0;
 
107
 }
 
108
 else if(dtr && !new_dtr)
 
109
 {
 
110
  //if(bitpos || transmit_count)
 
111
  // printf("[PAD] Abort communication!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!\n");
 
112
 }
 
113
 
 
114
 dtr = new_dtr;
 
115
}
 
116
 
 
117
bool InputDevice_DualAnalog::GetDSR(void)
 
118
{
 
119
 if(!dtr)
 
120
  return(0);
 
121
 
 
122
 if(!bitpos && transmit_count)
 
123
  return(1);
 
124
 
 
125
 return(0);
 
126
}
 
127
 
 
128
bool InputDevice_DualAnalog::Clock(bool TxD, int32 &dsr_pulse_delay)
 
129
{
 
130
 bool ret = 1;
 
131
 
 
132
 dsr_pulse_delay = 0;
 
133
 
 
134
 if(!dtr)
 
135
  return(1);
 
136
 
 
137
 if(transmit_count)
 
138
  ret = (transmit_buffer[transmit_pos] >> bitpos) & 1;
 
139
 
 
140
 receive_buffer &= ~(1 << bitpos);
 
141
 receive_buffer |= TxD << bitpos;
 
142
 bitpos = (bitpos + 1) & 0x7;
 
143
 
 
144
 if(!bitpos)
 
145
 {
 
146
  //printf("[PAD] Receive: %02x -- command_phase=%d\n", receive_buffer, command_phase);
 
147
 
 
148
  if(transmit_count)
 
149
  {
 
150
   transmit_pos++;
 
151
   transmit_count--;
 
152
  }
 
153
 
 
154
 
 
155
  switch(command_phase)
 
156
  {
 
157
   case 0:
 
158
          if(receive_buffer != 0x01)
 
159
            command_phase = -1;
 
160
          else
 
161
          {
 
162
           transmit_buffer[0] = joystick_mode ? 0x53 : 0x73;
 
163
           transmit_pos = 0;
 
164
           transmit_count = 1;
 
165
           command_phase++;
 
166
          }
 
167
          break;
 
168
 
 
169
   case 1:
 
170
        command = receive_buffer;
 
171
        command_phase++;
 
172
 
 
173
        transmit_buffer[0] = 0x5A;
 
174
 
 
175
        //if(command != 0x42)
 
176
        // fprintf(stderr, "Gamepad unhandled command: 0x%02x\n", command);
 
177
 
 
178
        if(command == 0x42)
 
179
        {
 
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];
 
186
         transmit_pos = 0;
 
187
         transmit_count = 7;
 
188
        }
 
189
        else
 
190
        {
 
191
         command_phase = -1;
 
192
         transmit_buffer[1] = 0;
 
193
         transmit_buffer[2] = 0;
 
194
         transmit_pos = 0;
 
195
         transmit_count = 0;
 
196
        }
 
197
        break;
 
198
 
 
199
  }
 
200
 }
 
201
 
 
202
 if(!bitpos && transmit_count)
 
203
  dsr_pulse_delay = 0x40; //0x100;
 
204
 
 
205
 return(ret);
 
206
}
 
207
 
 
208
InputDevice *Device_DualAnalog_Create(bool joystick_mode)
 
209
{
 
210
 return new InputDevice_DualAnalog(joystick_mode);
 
211
}
 
212
 
 
213
 
 
214
InputDeviceInputInfoStruct Device_DualAnalog_IDII[24] =
 
215
{
 
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" },
 
224
 
 
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 },
 
229
 
 
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 },
 
234
 
 
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 },
 
239
 
 
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 },
 
244
 
 
245
};
 
246
 
 
247
// Not sure if all these buttons are named correctly!
 
248
InputDeviceInputInfoStruct Device_AnalogJoy_IDII[24] =
 
249
{
 
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" },
 
258
 
 
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 },
 
263
 
 
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 },
 
268
 
 
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 },
 
273
 
 
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 },
 
278
 
 
279
};
 
280
 
 
281
 
 
282
}