From dea1a2fd580849087bd627665d47d4458f044801 Mon Sep 17 00:00:00 2001 From: Sour Date: Sat, 4 Feb 2023 15:34:16 -0500 Subject: [PATCH] NES: Fixed NSF playback issues due to incorrect state at power on/reset --- Core/NES/BaseMapper.h | 1 + Core/NES/Mappers/NSF/NsfMapper.cpp | 7 +++++++ Core/NES/Mappers/NSF/NsfMapper.h | 1 + Core/NES/NesConsole.cpp | 2 ++ 4 files changed, 11 insertions(+) diff --git a/Core/NES/BaseMapper.h b/Core/NES/BaseMapper.h index f1c55294..0daaa82f 100644 --- a/Core/NES/BaseMapper.h +++ b/Core/NES/BaseMapper.h @@ -166,6 +166,7 @@ public: virtual ~BaseMapper(); virtual void Reset(bool softReset); + virtual void OnAfterResetPowerOn() {} GameSystem GetGameSystem(); PpuModel GetPpuModel(); diff --git a/Core/NES/Mappers/NSF/NsfMapper.cpp b/Core/NES/Mappers/NSF/NsfMapper.cpp index 2352b0e3..04c1318c 100644 --- a/Core/NES/Mappers/NSF/NsfMapper.cpp +++ b/Core/NES/Mappers/NSF/NsfMapper.cpp @@ -88,6 +88,11 @@ void NsfMapper::Reset(bool softReset) if(!softReset) { _songNumber = _nsfHeader.StartingSong - 1; } +} + +void NsfMapper::OnAfterResetPowerOn() +{ + //Do this after reset/power on sequence is over, otherwise cpu reset will reset all these values //INIT logic NesMemoryManager* mm = _console->GetMemoryManager(); @@ -137,7 +142,9 @@ void NsfMapper::Reset(bool softReset) state.A = _songNumber; state.X = (_nsfHeader.Flags & 0x01) ? 1 : 0; //PAL = 1, NTSC = 0 state.Y = 0; + state.SP = 0xFD; + //Disable Frame Counter & DMC interrupts _console->GetCpu()->SetIrqMask((uint8_t)IRQSource::External); _irqCounter = 0; diff --git a/Core/NES/Mappers/NSF/NsfMapper.h b/Core/NES/Mappers/NSF/NsfMapper.h index ce2a047c..4063198b 100644 --- a/Core/NES/Mappers/NSF/NsfMapper.h +++ b/Core/NES/Mappers/NSF/NsfMapper.h @@ -82,6 +82,7 @@ protected: void InitMapper() override; void InitMapper(RomData& romData) override; void Reset(bool softReset) override; + void OnAfterResetPowerOn() override; void GetMemoryRanges(MemoryRanges &ranges) override; uint32_t GetIrqReloadValue(); diff --git a/Core/NES/NesConsole.cpp b/Core/NES/NesConsole.cpp index 1100fd14..f893aef8 100644 --- a/Core/NES/NesConsole.cpp +++ b/Core/NES/NesConsole.cpp @@ -120,6 +120,7 @@ void NesConsole::Reset() if(_vsSubConsole) { _vsSubConsole->Reset(); } + _mapper->OnAfterResetPowerOn(); } LoadRomResult NesConsole::LoadRom(VirtualFile& romFile) @@ -190,6 +191,7 @@ LoadRomResult NesConsole::LoadRom(VirtualFile& romFile) _memoryManager->Reset(false); _controlManager->Reset(false); _cpu->Reset(false, _region); + _mapper->OnAfterResetPowerOn(); } return result; }