32x: add 6btn quirk
authornotaz <notasas@gmail.com>
Mon, 19 Aug 2013 21:54:03 +0000 (00:54 +0300)
committernotaz <notasas@gmail.com>
Mon, 19 Aug 2013 21:54:03 +0000 (00:54 +0300)
pico/cart.c
pico/carthw.cfg
pico/carthw_cfg.c
pico/media.c
pico/pico.c
pico/pico.h
platform/common/emu.c

index db742a8..6a835b6 100644 (file)
@@ -643,6 +643,8 @@ static int rom_strcmp(int rom_offset, const char *s1)
 {\r
   int i, len = strlen(s1);\r
   const char *s_rom = (const char *)Pico.rom;\r
+  if (rom_offset + len > Pico.romsize)\r
+    return 0;\r
   for (i = 0; i < len; i++)\r
     if (s1[i] != s_rom[(i + rom_offset) ^ 1])\r
       return 1;\r
@@ -897,10 +899,13 @@ static void parse_carthw(const char *carthw_cfg, int *fill_sram)
         SRam.flags &= ~SRF_EEPROM;\r
       else if (strcmp(p, "filled_sram") == 0)\r
         *fill_sram = 1;\r
+      else if (strcmp(p, "force_6btn") == 0)\r
+        PicoQuirks |= PQUIRK_FORCE_6BTN;\r
       else {\r
         elprintf(EL_STATUS, "carthw:%d: unsupported prop: %s", line, p);\r
         goto bad_nomsg;\r
       }\r
+      elprintf(EL_STATUS, "game prop: %s", p);\r
       continue;\r
     }\r
     else if (is_expr("eeprom_type", &p)) {\r
index ac918bf..d61161c 100644 (file)
@@ -8,6 +8,7 @@
 #  no_sram     - don't emulate sram/EEPROM even if ROM headers tell it's there
 #  no_eeprom   - save storage is not EEPROM, even if ROM headers tell it is
 #  filled_sram - save storage needs to be initialized with FFh instead of 00h
+#  force_6btn  - game only supports 6 button pad (32X X-men proto)
 #  
 # mappers (hw = ...):
 #  ssf2_mapper      - used in Super Street Fighter2
@@ -60,6 +61,12 @@ prop = filled_sram
 check_str = 0x150, "MICRO MACHINES II"
 prop = filled_sram
 
+# X-Men proto
+[X-Men (prototype)]
+check_str = 0x150, "32X SAMPLE PROGRAM"
+check_str = 0x32b74c, "Bishop Level"
+prop = force_6btn
+
 # The SSF2 mapper
 [Super Street Fighter II - The New Challengers (U)]
 check_str = 0x150, "SUPER STREET FIGHTER2 The New Challengers"
@@ -68,11 +75,9 @@ prop = no_sram
 
 # The Pier Solar mapper, custom eeprom location
 [Pier Solar and the Great Architects]
-check_str = 0x150, "PIER SOLAR\99&THE GREAT ARCHITECTS© WaterMelon\99"
+check_str = 0x150, "PIER"
+check_str = 0x610, "Respect"
 hw = piersolar_mapper
-sram_range = 0xa13009,0xa1300b
-eeprom_type = 3
-eeprom_lines = 2,1,0
 
 # detect *_in_1 based on first game and if it's larger than it should be,
 # as some dumps look like to be incomplete.
index 14aec3e..0974fa0 100644 (file)
@@ -22,15 +22,17 @@ static const char builtin_carthw_cfg[] =
   "check_str=0x150,\"MICRO MACHINES II\"\n"
   "prop=filled_sram\n"
   "[]\n"
+  "check_str=0x150,\"32X SAMPLE PROGRAM\"\n"
+  "check_str=0x32b74c,\"Bishop Level\"\n"
+  "prop=force_6btn\n"
+  "[]\n"
   "check_str=0x150,\"SUPER STREET FIGHTER2 The New Challengers\"\n"
   "hw=ssf2_mapper\n"
   "prop=no_sram\n"
   "[]\n"
-  "check_str=0x150,\"PIER SOLAR\x99&THE GREAT ARCHITECTS\xa9 WaterMelon\x99\"\n"
+  "check_str=0x150,\"PIER\"\n"
+  "check_str=0x610,\"Respect\"\n"
   "hw=piersolar_mapper\n"
-  "sram_range=0xa13009,0xa1300b\n"
-  "eeprom_type=3\n"
-  "eeprom_lines=2,1,0\n"
   "[]\n"
   "check_str=0x120,\"FLICKY\"\n"
   "check_size_gt=0x020000\n"
index ade8ded..c03846d 100644 (file)
@@ -212,6 +212,7 @@ enum media_type_e PicoLoadMedia(const char *filename,
     Stop_CD();
   PicoCartUnload();
   PicoAHW = 0;
+  PicoQuirks = 0;
 
   if (media_type == PM_CD)
   {
@@ -296,6 +297,9 @@ enum media_type_e PicoLoadMedia(const char *filename,
     }
   }
 
+  if (PicoQuirks & PQUIRK_FORCE_6BTN)
+    PicoSetInputDevice(0, PICO_INPUT_PAD_6BTN);
+
 out:
   if (rom_data)
     free(rom_data);
index 859935e..bbc514f 100644 (file)
@@ -16,6 +16,7 @@ int PicoSkipFrame;     // skip rendering frame?
 int PicoPad[2];        // Joypads, format is MXYZ SACB RLDU\r
 int PicoPadInt[2];     // internal copy\r
 int PicoAHW;           // active addon hardware: PAHW_*\r
+int PicoQuirks;        // game-specific quirks\r
 int PicoRegionOverride; // override the region detection 0: Auto, 1: Japan NTSC, 2: Japan PAL, 4: US, 8: Europe\r
 int PicoAutoRgnOrder;\r
 \r
index c0aa6da..e1bcf03 100644 (file)
@@ -77,6 +77,10 @@ extern int PicoOpt; // bitfield
 #define PAHW_PICO (1<<3)\r
 #define PAHW_SMS  (1<<4)\r
 extern int PicoAHW;            // Pico active hw\r
+\r
+#define PQUIRK_FORCE_6BTN   (1<<0)\r
+extern int PicoQuirks;\r
+\r
 extern int PicoSkipFrame;      // skip rendering frame, but still do sound (if enabled) and emulation stuff\r
 extern int PicoRegionOverride; // override the region detection 0: auto, 1: Japan NTSC, 2: Japan PAL, 4: US, 8: Europe\r
 extern int PicoAutoRgnOrder;   // packed priority list of regions, for example 0x148 means this detection order: EUR, USA, JAP\r
index 5807c1b..c2f4109 100644 (file)
@@ -444,6 +444,10 @@ int emu_reload_rom(const char *rom_fname_in)
                break;\r
        }\r
 \r
+       // make quirks visible in UI\r
+       if (PicoQuirks & PQUIRK_FORCE_6BTN)\r
+               currentConfig.input_dev0 = PICO_INPUT_PAD_6BTN;\r
+\r
        menu_romload_end();\r
        menu_romload_started = 0;\r
 \r