Namco163: Fixed save games for games that use the mapper's 128-byte internal RAM as save data
This commit is contained in:
parent
72d9e7ee13
commit
8f53659d5f
4 changed files with 37 additions and 5 deletions
|
@ -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();
|
||||||
|
|
|
@ -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();
|
||||||
|
|
|
@ -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) {
|
||||||
|
|
|
@ -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) {
|
||||||
|
|
Loading…
Add table
Reference in a new issue