Add hack for unlicensed games that don't handle the Z80 bus properly
authortechmetx11 <techmetx11@disroot.org>
Mon, 21 Aug 2023 15:21:25 +0000 (16:21 +0100)
committertechmetx11 <techmetx11@disroot.org>
Mon, 21 Aug 2023 15:21:25 +0000 (16:21 +0100)
pico/cart.c
pico/carthw.cfg
pico/carthw_cfg.c
pico/memory.c
pico/pico.h

index e8293ab..339b9fe 100644 (file)
@@ -1210,6 +1210,8 @@ static void parse_carthw(const char *carthw_cfg, int *fill_sram,
         PicoIn.quirks |= PQUIRK_MARSCHECK_HACK;\r
       else if (strcmp(p, "force_6btn") == 0)\r
         PicoIn.quirks |= PQUIRK_FORCE_6BTN;\r
+      else if (strcmp(p, "no_z80_bus_lock") == 0)\r
+        PicoIn.quirks |= PQUIRK_NO_Z80_BUS_LOCK;\r
       else {\r
         elprintf(EL_STATUS, "carthw:%d: unsupported prop: %s", line, p);\r
         goto bad_nomsg;\r
index 64e9152..013b04c 100644 (file)
@@ -4,10 +4,11 @@
 #  prot     - simple copy protection devices in unlicensed cartridges (see prot. below)
 #
 # cartridge properties (prop = ...):
-#  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)
+#  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)
+#  no_z80_bus_lock - don't emulate z80 bus getting closed to the 68k when bus is released
 #  
 # mappers (hw = ...):
 #  ssf2_mapper      - used in Super Street Fighter2
@@ -526,3 +527,20 @@ check_crc32 = 0xee9fc429
 hw = prot
 prot_ro_value16 = 0x400000,-2,0x6300
 
+# Unlicensed homebrew games made by V.M.V.
+# to prevent bus conflicts between the audio drivers in 68k and Z80
+
+[Ben 10 (Unl)]
+check_str = 0x180, "GM 00000000-00"
+check_crc32 = 0x6732aab4
+prop = no_z80_bus_lock
+
+[Mario 3: Vokrug Sveta (Unl)]
+check_str = 0x180, "GM 00000000-00"
+check_crc32 = 0xe302585a
+prop = no_z80_bus_lock
+
+[Mario 4: Kosmicheskaya Odisseya (Unl)]
+check_csum = 8224
+check_crc32 = 0x20ed0de8
+prop = no_z80_bus_lock
index 02f8c11..97e7dda 100644 (file)
@@ -387,4 +387,16 @@ static const char builtin_carthw_cfg[] =
   "check_crc32=0xee9fc429\n"
   "hw=prot\n"
   "prot_ro_value16=0x400000,-2,0x6300\n"
+  "[]\n"
+  "check_str=0x180,\"GM 00000000-00\"\n"
+  "check_crc32=0x6732aab4\n"
+  "prop=no_z80_bus_lock\n"
+  "[]\n"
+  "check_str=0x180,\"GM 00000000-00\"\n"
+  "check_crc32=0xe302585a\n"
+  "prop=no_z80_bus_lock\n"
+  "[]\n"
+  "check_csum=8224\n"
+  "check_crc32=0x20ed0de8\n"
+  "prop=no_z80_bus_lock\n"
 ;
index 818080f..6ee6282 100644 (file)
@@ -675,7 +675,7 @@ static void PicoWrite16_sram(u32 a, u32 d)
 static u32 PicoRead8_z80(u32 a)\r
 {\r
   u32 d = 0xff;\r
-  if ((Pico.m.z80Run & 1) || Pico.m.z80_reset) {\r
+  if (!(PicoIn.quirks & PQUIRK_NO_Z80_BUS_LOCK) && ((Pico.m.z80Run & 1) || Pico.m.z80_reset)) {\r
     elprintf(EL_ANOMALY, "68k z80 read with no bus! [%06x] @ %06x", a, SekPc);\r
     // open bus. Pulled down if MegaCD2 is attached.\r
     return 0;\r
@@ -699,7 +699,7 @@ static u32 PicoRead16_z80(u32 a)
 \r
 static void PicoWrite8_z80(u32 a, u32 d)\r
 {\r
-  if ((Pico.m.z80Run & 1) || Pico.m.z80_reset) {\r
+  if (!(PicoIn.quirks & PQUIRK_NO_Z80_BUS_LOCK) && ((Pico.m.z80Run & 1) || Pico.m.z80_reset)) {\r
     // verified on real hw\r
     elprintf(EL_ANOMALY, "68k z80 write with no bus or reset! [%06x] %02x @ %06x", a, d&0xff, SekPc);\r
     return;\r
index 2ef4692..f17d93d 100644 (file)
@@ -99,6 +99,7 @@ extern void *p32x_bios_g, *p32x_bios_m, *p32x_bios_s;
 #define PQUIRK_BLACKTHORNE_HACK (1<<1)\r
 #define PQUIRK_WWFRAW_HACK      (1<<2)\r
 #define PQUIRK_MARSCHECK_HACK   (1<<3)\r
+#define PQUIRK_NO_Z80_BUS_LOCK  (1<<4)\r
 \r
 // the emulator is configured and some status is reported\r
 // through this global state (not saved in savestates)\r