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

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

View file

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

View file

@ -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<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
{
if(_irqCounter & 0x8000 && (_irqCounter & 0x7FFF) != 0x7FFF) {

View file

@ -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) {