@@ -98,10 +98,6 @@ bool mbc_HasRAM(MbcType type) {
9898 return search != mbcData.end () && search->second .second ;
9999}
100100
101- static void skipBlankSpace (char const *&ptr) {
102- ptr += strspn (ptr, " \t " );
103- }
104-
105101static void skipMBCSpace (char const *&ptr) {
106102 ptr += strspn (ptr, " \t _" );
107103}
@@ -115,16 +111,6 @@ static char normalizeMBCChar(char c) {
115111 return c;
116112}
117113
118- static bool readMBCSlice (char const *&name, char const *expected) {
119- while (*expected) {
120- // If `name` is too short, the character will be '\0' and this will return `false`
121- if (normalizeMBCChar (*name++) != *expected++) {
122- return false ;
123- }
124- }
125- return true ;
126- }
127-
128114[[noreturn]]
129115static void fatalUnknownMBC (char const *name) {
130116 fatal (" Unknown MBC \" %s\"\n %s" , name, acceptedMBCNames);
@@ -136,8 +122,7 @@ static void fatalWrongMBCFeatures(char const *name) {
136122}
137123
138124MbcType mbc_ParseName (char const *name, uint8_t &tpp1Major, uint8_t &tpp1Minor) {
139- char const *ptr = name;
140- skipBlankSpace (ptr); // Trim off leading blank space
125+ char const *ptr = name + strspn (name, " \t " ); // Skip leading blank space
141126
142127 if (!strcasecmp (ptr, " help" ) || !strcasecmp (ptr, " list" )) {
143128 puts (acceptedMBCNames); // Outputs to stdout and appends a newline
@@ -156,14 +141,16 @@ MbcType mbc_ParseName(char const *name, uint8_t &tpp1Major, uint8_t &tpp1Minor)
156141 }
157142
158143 // Begin by reading the MBC type:
159- uint16_t mbc;
144+ uint16_t mbc = UINT16_MAX ;
160145
161- #define tryReadSlice (expected ) \
162- do { \
163- if (!readMBCSlice (ptr, expected)) { \
164- fatalUnknownMBC (name); \
165- } \
166- } while (0 )
146+ auto tryReadSlice = [&ptr, &name](char const *expected) {
147+ while (*expected) {
148+ // If `name` is too short, the character will be '\0' and this will return `false`
149+ if (normalizeMBCChar (*ptr++) != *expected++) {
150+ fatalUnknownMBC (name);
151+ }
152+ }
153+ };
167154
168155 switch (*ptr++) {
169156 case ' R' : // ROM / ROM_ONLY
@@ -183,13 +170,7 @@ MbcType mbc_ParseName(char const *name, uint8_t &tpp1Major, uint8_t &tpp1Minor)
183170 switch (*ptr++) {
184171 case ' B' :
185172 case ' b' :
186- switch (*ptr++) {
187- case ' C' :
188- case ' c' :
189- break ;
190- default :
191- fatalUnknownMBC (name);
192- }
173+ tryReadSlice (" C" );
193174 switch (*ptr++) {
194175 case ' 1' :
195176 mbc = MBC1;
@@ -209,17 +190,13 @@ MbcType mbc_ParseName(char const *name, uint8_t &tpp1Major, uint8_t &tpp1Minor)
209190 case ' 7' :
210191 mbc = MBC7_SENSOR_RUMBLE_RAM_BATTERY;
211192 break ;
212- default :
213- fatalUnknownMBC (name);
214193 }
215194 break ;
216195 case ' M' :
217196 case ' m' :
218197 tryReadSlice (" M01" );
219198 mbc = MMM01;
220199 break ;
221- default :
222- fatalUnknownMBC (name);
223200 }
224201 break ;
225202
@@ -242,7 +219,7 @@ MbcType mbc_ParseName(char const *name, uint8_t &tpp1Major, uint8_t &tpp1Minor)
242219 tryReadSlice (" MA5" );
243220 mbc = BANDAI_TAMA5;
244221 break ;
245- case ' P' : {
222+ case ' P' :
246223 tryReadSlice (" P1" );
247224 // Parse version
248225 skipMBCSpace (ptr);
@@ -266,9 +243,6 @@ MbcType mbc_ParseName(char const *name, uint8_t &tpp1Major, uint8_t &tpp1Minor)
266243 mbc = TPP1;
267244 break ;
268245 }
269- default :
270- fatalUnknownMBC (name);
271- }
272246 break ;
273247
274248 case ' H' : // HuC{1, 3}
@@ -281,12 +255,11 @@ MbcType mbc_ParseName(char const *name, uint8_t &tpp1Major, uint8_t &tpp1Minor)
281255 case ' 3' :
282256 mbc = HUC3;
283257 break ;
284- default :
285- fatalUnknownMBC (name);
286258 }
287259 break ;
260+ }
288261
289- default :
262+ if (mbc == UINT16_MAX) {
290263 fatalUnknownMBC (name);
291264 }
292265
@@ -301,18 +274,10 @@ MbcType mbc_ParseName(char const *name, uint8_t &tpp1Major, uint8_t &tpp1Minor)
301274 static constexpr uint8_t MULTIRUMBLE = 1 << 2 ;
302275 // clang-format on
303276
304- for (;;) {
305- skipBlankSpace (ptr); // Trim off trailing blank space
306-
307- // If done, start processing "features"
308- if (!*ptr) {
309- break ;
310- }
277+ while (*ptr) {
311278 // We expect a '+' at this point
312279 skipMBCSpace (ptr);
313- if (*ptr++ != ' +' ) {
314- fatalUnknownMBC (name);
315- }
280+ tryReadSlice (" +" );
316281 skipMBCSpace (ptr);
317282
318283 switch (*ptr++) {
@@ -341,8 +306,6 @@ MbcType mbc_ParseName(char const *name, uint8_t &tpp1Major, uint8_t &tpp1Minor)
341306 tryReadSlice (" M" );
342307 features |= RAM;
343308 break ;
344- default :
345- fatalUnknownMBC (name);
346309 }
347310 break ;
348311
@@ -357,12 +320,8 @@ MbcType mbc_ParseName(char const *name, uint8_t &tpp1Major, uint8_t &tpp1Minor)
357320 tryReadSlice (" IMER" );
358321 features |= TIMER;
359322 break ;
360-
361- default :
362- fatalUnknownMBC (name);
363323 }
364324 }
365- #undef tryReadSlice
366325
367326 switch (mbc) {
368327 case ROM:
@@ -459,37 +418,34 @@ MbcType mbc_ParseName(char const *name, uint8_t &tpp1Major, uint8_t &tpp1Minor)
459418 }
460419 break ;
461420
462- case TPP1:
421+ case TPP1: {
422+ // clang-format off: vertically align values
423+ static constexpr uint8_t BATTERY_TPP1 = 1 << 3 ;
424+ static constexpr uint8_t TIMER_TPP1 = 1 << 2 ;
425+ static constexpr uint8_t MULTIRUMBLE_TPP1 = 1 << 1 ;
426+ static constexpr uint8_t RUMBLE_TPP1 = 1 << 0 ;
427+ // clang-format on
428+
463429 if (features & RAM) {
464430 warning (WARNING_MBC, " TPP1 requests RAM implicitly if given a non-zero RAM size" );
465431 }
466432 if (features & BATTERY) {
467- mbc |= 0x08 ;
433+ mbc |= BATTERY_TPP1 ;
468434 }
469435 if (features & TIMER) {
470- mbc |= 0x04 ;
471- }
472- if (features & MULTIRUMBLE) {
473- mbc |= 0x03 ; // Also set the rumble flag
436+ mbc |= TIMER_TPP1;
474437 }
475438 if (features & RUMBLE) {
476- mbc |= 0x01 ;
439+ mbc |= RUMBLE_TPP1 ;
477440 }
478441 if (features & SENSOR) {
479442 fatalWrongMBCFeatures (name);
480443 }
481- // Multiple rumble speeds imply rumble
482- if (mbc & 0x01 ) {
483- assume (mbc & 0x02 );
444+ if (features & MULTIRUMBLE) {
445+ mbc |= MULTIRUMBLE_TPP1 | RUMBLE_TPP1; // Multiple rumble speeds imply rumble
484446 }
485447 break ;
486448 }
487-
488- skipBlankSpace (ptr); // Trim off trailing blank space
489-
490- // If there is still something left, error out
491- if (*ptr) {
492- fatalUnknownMBC (name);
493449 }
494450
495451 return static_cast <MbcType>(mbc);
0 commit comments