From 8f53659d5ff4724a5dfbcd0d7ce8496dc59002fe Mon Sep 17 00:00:00 2001 From: Sour Date: Wed, 9 Jan 2019 20:53:51 -0500 Subject: [PATCH] Namco163: Fixed save games for games that use the mapper's 128-byte internal RAM as save data --- Core/BaseMapper.cpp | 6 +++--- Core/BaseMapper.h | 2 +- Core/Namco163.h | 24 ++++++++++++++++++++++++ Core/Namco163Audio.h | 10 +++++++++- 4 files changed, 37 insertions(+), 5 deletions(-) diff --git a/Core/BaseMapper.cpp b/Core/BaseMapper.cpp index f5c8217f..8dfaa55f 100644 --- a/Core/BaseMapper.cpp +++ b/Core/BaseMapper.cpp @@ -629,9 +629,6 @@ void BaseMapper::Initialize(RomData &romData) } else if(GetChrRamSize()) { InitializeChrRam(); } - - //Load battery data if present - LoadBattery(); if(romData.Info.HasTrainer) { if(_workRamSize >= 0x2000) { @@ -648,6 +645,9 @@ void BaseMapper::Initialize(RomData &romData) InitMapper(); InitMapper(romData); + //Load battery data if present + LoadBattery(); + ApplyCheats(); _romInfo.HasChrRam = HasChrRam(); diff --git a/Core/BaseMapper.h b/Core/BaseMapper.h index 9f6f6165..5ba2d4ca 100644 --- a/Core/BaseMapper.h +++ b/Core/BaseMapper.h @@ -125,7 +125,7 @@ protected: void RemovePpuMemoryMapping(uint16_t startAddr, uint16_t endAddr); bool HasBattery(); - void LoadBattery(); + virtual void LoadBattery(); string GetBatteryFilename(); uint32_t GetPRGPageCount(); diff --git a/Core/Namco163.h b/Core/Namco163.h index 374d0cf2..67e5e697 100644 --- a/Core/Namco163.h +++ b/Core/Namco163.h @@ -2,6 +2,8 @@ #include "stdafx.h" #include "BaseMapper.h" #include "Namco163Audio.h" +#include "Console.h" +#include "BatteryManager.h" enum class NamcoVariant { @@ -109,6 +111,28 @@ protected: } } + void LoadBattery() override + { + if(HasBattery()) { + vector batteryContent(_saveRamSize + Namco163Audio::AudioRamSize, 0); + _console->GetBatteryManager()->LoadBattery(".sav", batteryContent.data(), (uint32_t)batteryContent.size()); + + memcpy(_saveRam, batteryContent.data(), _saveRamSize); + memcpy(_audio->GetInternalRam(), batteryContent.data()+_saveRamSize, Namco163Audio::AudioRamSize); + } + } + + void SaveBattery() override + { + if(HasBattery()) { + vector batteryContent(_saveRamSize + Namco163Audio::AudioRamSize, 0); + memcpy(batteryContent.data(), _saveRam, _saveRamSize); + memcpy(batteryContent.data() + _saveRamSize, _audio->GetInternalRam(), Namco163Audio::AudioRamSize); + + _console->GetBatteryManager()->SaveBattery(".sav", batteryContent.data(), (uint32_t)batteryContent.size()); + } + } + void ProcessCpuClock() override { if(_irqCounter & 0x8000 && (_irqCounter & 0x7FFF) != 0x7FFF) { diff --git a/Core/Namco163Audio.h b/Core/Namco163Audio.h index 5195b655..d92c02ea 100644 --- a/Core/Namco163Audio.h +++ b/Core/Namco163Audio.h @@ -6,8 +6,11 @@ class Namco163Audio : public BaseExpansionAudio { +public: + static constexpr uint32_t AudioRamSize = 0x80; + private: - uint8_t _internalRam[0x80]; + uint8_t _internalRam[Namco163Audio::AudioRamSize]; int16_t _channelOutput[8]; uint8_t _ramPosition; bool _autoIncrement; @@ -150,6 +153,11 @@ public: _disableSound = false; } + uint8_t* GetInternalRam() + { + return _internalRam; + } + void WriteRegister(uint16_t addr, uint8_t value) { switch(addr & 0xF800) {