@@ -35,7 +35,6 @@ extern int id_shake_level[16];
3535#endif
3636
3737uint8_t CurPad = 0 , CurCmd = 0 ;
38- uint8_t pad_detect_pad[2 ] = {0 , 0 };
3938
4039typedef 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+ ;
9191static uint8_t unk46[8 ] = {0xFF , 0x5A , 0x00 , 0x00 , 0x01 , 0x02 , 0x00 , 0x0A };
9292
9393static 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};
9797static uint8_t unk4d[8 ] = {0xFF , 0x5A , 0xFF , 0xFF , 0xFF , 0xFF , 0xFF , 0xFF };
9898
9999unsigned 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 }
0 commit comments