NES: Fixed NSF playback issues due to incorrect state at power on/reset

This commit is contained in:
Sour 2023-02-04 15:34:16 -05:00
parent deb8d736d2
commit dea1a2fd58
4 changed files with 11 additions and 0 deletions

View file

@ -166,6 +166,7 @@ public:
virtual ~BaseMapper();
virtual void Reset(bool softReset);
virtual void OnAfterResetPowerOn() {}
GameSystem GetGameSystem();
PpuModel GetPpuModel();

View file

@ -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;

View file

@ -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();

View file

@ -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;
}