diff --git a/HISTORY.txt b/HISTORY.txt index 99e32c0..8de9980 100644 --- a/HISTORY.txt +++ b/HISTORY.txt @@ -33,7 +33,8 @@ Genesis Plus GX 1.7.5 (xx/xx/xxxx) (Eke-Eke) * fixed incorrect masking of Level 3 (GFX) interrupts (spurious freeze during Japanese BIOS intro) * fixed H-INT vector handling when using Mode 1 * fixed access to "write-only" communication flags (verified on real hardware by Notaz) -* fixed pending level 1 interrupts when GFX interrupt is disabled (fixes random freezes out of "Batman Returns" option menu) +* fixed access to Sub-CPU "read-only" communication registers (fixes Round 5 Boss freeze in Streets of Rage / Sega Classics Arcade Collection) +* fixed pending level 1 interrupts when GFX interrupt is disabled (fixes random freezes when exiting "Batman Returns" option menu) * fixed CDD seek command again (Final Fight CD freeze with model 2 BIOS) * optimized Sub-CPU / Main-CPU synchronization diff --git a/builds/genesis_plus_gx_libretro.dll b/builds/genesis_plus_gx_libretro.dll index a740e46..d2c8295 100644 Binary files a/builds/genesis_plus_gx_libretro.dll and b/builds/genesis_plus_gx_libretro.dll differ diff --git a/builds/genplus_cube.dol b/builds/genplus_cube.dol index 065cb9b..ec11ffa 100644 Binary files a/builds/genplus_cube.dol and b/builds/genplus_cube.dol differ diff --git a/builds/genplus_wii.dol b/builds/genplus_wii.dol index 448d26d..5902708 100644 Binary files a/builds/genplus_wii.dol and b/builds/genplus_wii.dol differ diff --git a/core/cd_hw/scd.c b/core/cd_hw/scd.c index f3fa2be..fdf49d0 100644 --- a/core/cd_hw/scd.c +++ b/core/cd_hw/scd.c @@ -1010,11 +1010,18 @@ static void scd_write_byte(unsigned int address, unsigned int data) default: { /* SUB-CPU communication words */ - if ((address & 0xf0) == 0x20) + if ((address & 0x1f0) == 0x20) { s68k_poll_sync(1 << ((address - 0x10) & 0x1f)); } + /* MAIN-CPU communication words */ + else if ((address & 0x1f0) == 0x10) + { + /* read-only (Sega Classic Arcade Collection) */ + return; + } + /* default registers */ if (address & 1) { @@ -1297,11 +1304,18 @@ static void scd_write_word(unsigned int address, unsigned int data) default: { /* SUB-CPU communication words */ - if ((address & 0xf0) == 0x20) + if ((address & 0x1f0) == 0x20) { s68k_poll_sync(3 << ((address - 0x10) & 0x1e)); } + /* MAIN-CPU communication words */ + else if ((address & 0x1f0) == 0x10) + { + /* read-only (Sega Classic Arcade Collection) */ + return; + } + /* default registers */ scd.regs[(address >> 1) & 0xff].w = data; return;