Namco163: Fixed save games for games that use the mapper's 128-byte internal RAM as save data

This commit is contained in:
Sour 2019-01-09 20:53:51 -05:00
parent 72d9e7ee13
commit 8f53659d5f
4 changed files with 37 additions and 5 deletions

View file

@ -630,9 +630,6 @@ void BaseMapper::Initialize(RomData &romData)
InitializeChrRam(); InitializeChrRam();
} }
//Load battery data if present
LoadBattery();
if(romData.Info.HasTrainer) { if(romData.Info.HasTrainer) {
if(_workRamSize >= 0x2000) { if(_workRamSize >= 0x2000) {
memcpy(_workRam + 0x1000, romData.TrainerData.data(), 512); memcpy(_workRam + 0x1000, romData.TrainerData.data(), 512);
@ -648,6 +645,9 @@ void BaseMapper::Initialize(RomData &romData)
InitMapper(); InitMapper();
InitMapper(romData); InitMapper(romData);
//Load battery data if present
LoadBattery();
ApplyCheats(); ApplyCheats();
_romInfo.HasChrRam = HasChrRam(); _romInfo.HasChrRam = HasChrRam();

View file

@ -125,7 +125,7 @@ protected:
void RemovePpuMemoryMapping(uint16_t startAddr, uint16_t endAddr); void RemovePpuMemoryMapping(uint16_t startAddr, uint16_t endAddr);
bool HasBattery(); bool HasBattery();
void LoadBattery(); virtual void LoadBattery();
string GetBatteryFilename(); string GetBatteryFilename();
uint32_t GetPRGPageCount(); uint32_t GetPRGPageCount();

View file

@ -2,6 +2,8 @@
#include "stdafx.h" #include "stdafx.h"
#include "BaseMapper.h" #include "BaseMapper.h"
#include "Namco163Audio.h" #include "Namco163Audio.h"
#include "Console.h"
#include "BatteryManager.h"
enum class NamcoVariant enum class NamcoVariant
{ {
@ -109,6 +111,28 @@ protected:
} }
} }
void LoadBattery() override
{
if(HasBattery()) {
vector<uint8_t> 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<uint8_t> 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 void ProcessCpuClock() override
{ {
if(_irqCounter & 0x8000 && (_irqCounter & 0x7FFF) != 0x7FFF) { if(_irqCounter & 0x8000 && (_irqCounter & 0x7FFF) != 0x7FFF) {

View file

@ -6,8 +6,11 @@
class Namco163Audio : public BaseExpansionAudio class Namco163Audio : public BaseExpansionAudio
{ {
public:
static constexpr uint32_t AudioRamSize = 0x80;
private: private:
uint8_t _internalRam[0x80]; uint8_t _internalRam[Namco163Audio::AudioRamSize];
int16_t _channelOutput[8]; int16_t _channelOutput[8];
uint8_t _ramPosition; uint8_t _ramPosition;
bool _autoIncrement; bool _autoIncrement;
@ -150,6 +153,11 @@ public:
_disableSound = false; _disableSound = false;
} }
uint8_t* GetInternalRam()
{
return _internalRam;
}
void WriteRegister(uint16_t addr, uint8_t value) void WriteRegister(uint16_t addr, uint8_t value)
{ {
switch(addr & 0xF800) { switch(addr & 0xF800) {