Skip to content

Commit 72e0047

Browse files
author
TonyJih
committed
Set analog mode via playstation
1 parent fe06aa4 commit 72e0047

File tree

3 files changed

+41
-47
lines changed

3 files changed

+41
-47
lines changed

src/pad.cpp

Lines changed: 33 additions & 40 deletions
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,6 @@ extern int id_shake_level[16];
3535
#endif
3636

3737
uint8_t CurPad = 0, CurCmd = 0;
38-
uint8_t pad_detect_pad[2] = {0, 0};
3938

4039
typedef struct tagGlobalData
4140
{
@@ -82,12 +81,13 @@ static uint8_t stdmodel[8] = {
8281
0x5A,
8382
0x01, // 03 - dualshock2, 01 - dualshock
8483
0x02, // number of modes
85-
0x01, // current mode: 01 - analog, 00 - digital
84+
0x00, // current mode: 01 - analog, 00 - digital
8685
0x02,
8786
0x01,
8887
0x00
8988
};
90-
89+
static uint8_t stdpar[8] = {0xFF, 0x5A, 0xFF, 0xFF, 0x80, 0x80, 0x80, 0x80}
90+
;
9191
static uint8_t unk46[8] = {0xFF, 0x5A, 0x00, 0x00, 0x01, 0x02, 0x00, 0x0A};
9292

9393
static uint8_t unk47[8] = {0xFF, 0x5A, 0x00, 0x00, 0x02, 0x00, 0x01, 0x00};
@@ -97,9 +97,7 @@ static uint8_t unk4c[8] = {0xFF, 0x5A, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00};
9797
static uint8_t unk4d[8] = {0xFF, 0x5A, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF};
9898

9999
unsigned char PAD1_poll(unsigned char value) {
100-
static uint8_t buf[8] = {0xFF, 0x5A, 0xFF, 0xFF, 0x80, 0x80, 0x80, 0x80};
101-
uint8_t analogpad = 0;
102-
100+
static uint8_t *buf;
103101
if (g.CurByte1 == 0) {
104102
uint16_t n;
105103
g.CurByte1++;
@@ -110,33 +108,39 @@ unsigned char PAD1_poll(unsigned char value) {
110108

111109
// Don't enable Analog/Vibration for a Digital or DualAnalog controller
112110
CurCmd = value;
113-
if (player_controller[0].pad_mode == 0 || player_controller[0].id == 0x53) {
111+
if (player_controller[0].pad_controllertype == 0) {
114112
CurCmd = CMD_READ_DATA_AND_VIBRATE;
115113
}
116114

117115
switch (CurCmd) {
118-
case CMD_SET_MODE_AND_LOCK: memcpy(buf, stdmode, 8);
116+
case CMD_SET_MODE_AND_LOCK:
117+
buf = stdmode;
119118
return 0xF3;
120-
case CMD_QUERY_MODEL_AND_MODE: memcpy(buf, stdmodel, 8);
119+
case CMD_QUERY_MODEL_AND_MODE:
120+
buf = stdmodel;
121121
buf[4] = player_controller[0].pad_mode;
122122
return 0xF3;
123-
case CMD_QUERY_ACT: memcpy(buf, unk46, 8);
123+
case CMD_QUERY_ACT:
124+
buf = unk46;
124125
return 0xF3;
125-
case CMD_QUERY_COMB: memcpy(buf, unk47, 8);
126+
case CMD_QUERY_COMB:
127+
buf = unk47;
126128
return 0xF3;
127-
case CMD_QUERY_MODE: memcpy(buf, unk4c, 8);
129+
case CMD_QUERY_MODE:
130+
buf = unk4c;
128131
return 0xF3;
129-
case CMD_VIBRATION_TOGGLE: memcpy(buf, unk4d, 8);
132+
case CMD_VIBRATION_TOGGLE:
133+
buf = unk4d;
130134
return 0xF3;
131135
case CMD_CONFIG_MODE:
132136
if (player_controller[0].configmode) {
133-
memcpy(buf, stdcfg, 8);
137+
buf = stdcfg;
134138
return 0xF3;
135139
}
136140
// else FALLTHROUGH
137141
case CMD_READ_DATA_AND_VIBRATE:
138142
default:
139-
143+
buf = stdpar;
140144
buf[2] = n & 0xFF;
141145
buf[3] = n >> 8;
142146

@@ -145,17 +149,15 @@ unsigned char PAD1_poll(unsigned char value) {
145149
* and Dualshock features won't work.
146150
* */
147151
if (player_controller[0].pad_controllertype == 0) g.CmdLen1 = 4;
148-
if (player_controller[0].id == 0x53) analogpad = 1;
149152

150-
if (player_controller[0].pad_mode == 1 || analogpad == 1) {
153+
if (player_controller[0].pad_mode) {
151154
buf[4] = player_controller[0].joy_right_ax0;
152155
buf[5] = player_controller[0].joy_right_ax1;
153156
buf[6] = player_controller[0].joy_left_ax0;
154157
buf[7] = player_controller[0].joy_left_ax1;
155158
}
156159

157-
if (player_controller[0].id == 0x53) return 0x53;
158-
return pad_detect_pad[0] ? player_controller[0].id : 0x41;
160+
return player_controller[0].id;
159161
}
160162
}
161163

@@ -167,7 +169,8 @@ unsigned char PAD1_poll(unsigned char value) {
167169
case CMD_CONFIG_MODE: player_controller[0].configmode = value;
168170
break;
169171

170-
case CMD_SET_MODE_AND_LOCK: player_controller[0].pad_mode = value;
172+
case CMD_SET_MODE_AND_LOCK:
173+
player_controller[0].pad_mode = value;
171174
player_controller[0].id = value ? 0x73 : 0x41;
172175
break;
173176

@@ -189,11 +192,11 @@ unsigned char PAD1_poll(unsigned char value) {
189192
case CMD_QUERY_MODE:
190193
switch (value) {
191194
case 0: // mode 0 - digital mode
192-
pad_detect_pad[0] = buf[5] = PSE_PAD_TYPE_STANDARD;
195+
buf[5] = PSE_PAD_TYPE_STANDARD;
193196
break;
194197

195198
case 1: // mode 1 - analog mode
196-
pad_detect_pad[0] = buf[5] = PSE_PAD_TYPE_ANALOGPAD;
199+
buf[5] = PSE_PAD_TYPE_ANALOGPAD;
197200
break;
198201
}
199202
break;
@@ -225,26 +228,16 @@ unsigned char PAD1_poll(unsigned char value) {
225228
}
226229
break;
227230
case CMD_VIBRATION_TOGGLE:
228-
if (g.CurByte1 >= 2 && g.CurByte1 < g.CmdLen1) {
229-
if (g.CurByte1 == player_controller[0].Vib[0]) {
231+
for (uint8_t i = 0; i < 2; i++) {
232+
if (player_controller[0].Vib[i] == g.CurByte1)
230233
buf[g.CurByte1] = 0;
234+
}
235+
if (value < 2) {
236+
player_controller[0].Vib[value] = g.CurByte1;
237+
if ((player_controller[0].id & 0x0f) < (g.CurByte1 - 1) / 2) {
238+
player_controller[0].id = (player_controller[0].id & 0xf0) + (g.CurByte1 - 1) / 2;
231239
}
232-
if (g.CurByte1 == player_controller[0].Vib[1]) {
233-
buf[g.CurByte1] = 1;
234-
}
235-
236-
if (value == 0) {
237-
player_controller[0].Vib[0] = g.CurByte1;
238-
if ((player_controller[0].id & 0x0f) < (g.CurByte1 - 1) / 2) {
239-
player_controller[0].id = (player_controller[0].id & 0xf0) + (g.CurByte1 - 1) / 2;
240-
}
241-
} else if (value == 1) {
242-
player_controller[0].Vib[1] = g.CurByte1;
243-
if ((player_controller[0].id & 0x0f) < (g.CurByte1 - 1) / 2) {
244-
player_controller[0].id = (player_controller[0].id & 0xf0) + (g.CurByte1 - 1) / 2;
245-
}
246-
}
247-
}
240+
}
248241
break;
249242
}
250243
}

src/plugin_lib/plugin_lib.cpp

100644100755
Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -197,11 +197,12 @@ static void pl_stats_update(void)
197197
{
198198
// TODO: show skipped frames in stats message
199199

200-
sprintf(pl_data.stats_msg, "%3ux%3ux%s CPU=%3u%% FPS=%3u/%u",
200+
sprintf(pl_data.stats_msg, "%3ux%3ux%s CPU=%3u%% FPS=%3u/%u %s",
201201
pl_data.sinfo.hres,
202202
pl_data.sinfo.vres,
203203
pl_data.sinfo.depth24 ? "24" : "15",
204204
(unsigned int)(pl_data.cpu_cur + 0.5f),
205205
(unsigned int)(pl_data.fps_cur + 0.5f),
206-
pl_data.sinfo.pal ? 50 : 60);
206+
pl_data.sinfo.pal ? 50 : 60,
207+
player_controller[0].pad_mode?"A":"D");
207208
}

src/port/sdl/port.cpp

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -593,8 +593,8 @@ void Set_Controller_Mode()
593593
player_controller[0].pad_controllertype = 1;
594594
break;
595595
/* DualShock, required for Ape Escape. */
596-
case 2: player_controller[0].id = 0x73;
597-
player_controller[0].pad_mode = 1;
596+
case 2: player_controller[0].id = 0x41;
597+
player_controller[0].pad_mode = 0;
598598
player_controller[0].pad_controllertype = 1;
599599
break;
600600
}
@@ -607,7 +607,7 @@ void joy_init()
607607
SDL_InitSubSystem(SDL_INIT_JOYSTICK);
608608
SDL_JoystickEventState(SDL_ENABLE);
609609

610-
player_controller[0].id = 0x41;
610+
//player_controller[0].id = 0x41;
611611
player_controller[0].joy_left_ax0 = 127;
612612
player_controller[0].joy_left_ax1 = 127;
613613
player_controller[0].joy_right_ax0 = 127;
@@ -618,8 +618,8 @@ void joy_init()
618618
player_controller[0].VibF[0] = 0;
619619
player_controller[0].VibF[1] = 0;
620620

621-
player_controller[0].pad_mode = 0;
622-
player_controller[0].pad_controllertype = 0;
621+
//player_controller[0].pad_mode = 0;
622+
//player_controller[0].pad_controllertype = 0;
623623

624624
player_controller[0].configmode = 0;
625625

0 commit comments

Comments
 (0)