From 53f17745d7a5d0d8672c4577e33b5d8e33642718 Mon Sep 17 00:00:00 2001 From: Sour Date: Sun, 2 Mar 2025 11:25:21 +0900 Subject: [PATCH] SGB: Prevent freeze/lock up when resetting a MBC3 game that has a RTC clock --- Core/Gameboy/Carts/GbMbc3.h | 1 + Core/Gameboy/Carts/GbMbc3Rtc.h | 9 +++++++-- Core/SNES/Coprocessors/SGB/SuperGameboy.cpp | 5 ++++- 3 files changed, 12 insertions(+), 3 deletions(-) diff --git a/Core/Gameboy/Carts/GbMbc3.h b/Core/Gameboy/Carts/GbMbc3.h index c4f6fd77..d6624517 100644 --- a/Core/Gameboy/Carts/GbMbc3.h +++ b/Core/Gameboy/Carts/GbMbc3.h @@ -26,6 +26,7 @@ public: void InitCart() override { _memoryManager->MapRegisters(0x0000, 0x7FFF, RegisterAccess::Write); + _rtc.Init(); } void RefreshMappings() override diff --git a/Core/Gameboy/Carts/GbMbc3Rtc.h b/Core/Gameboy/Carts/GbMbc3Rtc.h index 37d469fb..f28fd2ad 100644 --- a/Core/Gameboy/Carts/GbMbc3Rtc.h +++ b/Core/Gameboy/Carts/GbMbc3Rtc.h @@ -26,8 +26,7 @@ public: GbMbc3Rtc(Emulator* emu) { _emu = emu; - _lastMasterClock = 0; - LoadBattery(); + Init(); } ~GbMbc3Rtc() @@ -35,6 +34,12 @@ public: SaveBattery(); } + void Init() + { + _lastMasterClock = 0; + LoadBattery(); + } + void LoadBattery() { vector rtcData = _emu->GetBatteryManager()->LoadBattery(".rtc"); diff --git a/Core/SNES/Coprocessors/SGB/SuperGameboy.cpp b/Core/SNES/Coprocessors/SGB/SuperGameboy.cpp index 3bc1d069..a29ab4e6 100644 --- a/Core/SNES/Coprocessors/SGB/SuperGameboy.cpp +++ b/Core/SNES/Coprocessors/SGB/SuperGameboy.cpp @@ -46,8 +46,11 @@ SuperGameboy::~SuperGameboy() void SuperGameboy::Reset() { - _control = 0; + _control = 0x01; + _effectiveClockRate = 0; + _clockOffset = 0; _resetClock = 0; + UpdateClockRatio(); memset(_input, 0, sizeof(_input)); _inputIndex = 0;