Some cleanup and added $4016 EPSG addressing to all mappers

This commit is contained in:
Perkka2 2021-01-28 16:30:50 +01:00
parent 7de782b486
commit 64efda4e0b
6 changed files with 12 additions and 90 deletions

View file

@ -1,21 +1,9 @@
#pragma once #pragma once
#include "stdafx.h" #include "stdafx.h"
#include "BaseMapper.h" #include "BaseMapper.h"
#include "CPU.h"
#include "EPSGAudio.h"
using AudioClass = EPSGAudio;
class AXROM : public BaseMapper class AXROM : public BaseMapper
{ {
public:
unique_ptr<AudioClass> _audio;
void ProcessCpuClock() override
{
_audio->Clock();
}
protected: protected:
virtual uint16_t GetPRGPageSize() override { return 0x8000; } virtual uint16_t GetPRGPageSize() override { return 0x8000; }
virtual uint16_t GetCHRPageSize() override { return 0x2000; } virtual uint16_t GetCHRPageSize() override { return 0x2000; }
@ -24,16 +12,8 @@ class AXROM : public BaseMapper
{ {
SelectCHRPage(0, 0); SelectCHRPage(0, 0);
WriteRegister(0, GetPowerOnByte()); WriteRegister(0, GetPowerOnByte());
_audio.reset(new AudioClass(_console));
} }
virtual void StreamState(bool saving) override
{
BaseMapper::StreamState(saving);
SnapshotInfo audio{ _audio.get() };
Stream(audio);
}
bool HasBusConflicts() override { return _romInfo.SubMapperID == 2; } bool HasBusConflicts() override { return _romInfo.SubMapperID == 2; }
void WriteRegister(uint16_t addr, uint8_t value) override void WriteRegister(uint16_t addr, uint8_t value) override
@ -42,12 +22,4 @@ class AXROM : public BaseMapper
SetMirroringType(((value & 0x10) == 0x10) ? MirroringType::ScreenBOnly : MirroringType::ScreenAOnly); SetMirroringType(((value & 0x10) == 0x10) ? MirroringType::ScreenBOnly : MirroringType::ScreenAOnly);
} }
void WriteEPSG(uint16_t addr, uint8_t value) override
{
switch (addr & 0x4016) {
case 0x4016:
_audio->WriteRegister(addr, value);
break;
}
}
}; };

View file

@ -13,7 +13,7 @@
#include "EmulationSettings.h" #include "EmulationSettings.h"
void BaseMapper::WriteRegister(uint16_t addr, uint8_t value) { } void BaseMapper::WriteRegister(uint16_t addr, uint8_t value) { }
void BaseMapper::WriteEPSG(uint16_t addr, uint8_t value) { } void BaseMapper::WriteEPSG(uint16_t addr, uint8_t value) { _epsgaudio->WriteRegister(addr, value); }
uint8_t BaseMapper::ReadRegister(uint16_t addr) { return 0; } uint8_t BaseMapper::ReadRegister(uint16_t addr) { return 0; }
void BaseMapper::InitMapper(RomData &romData) { } void BaseMapper::InitMapper(RomData &romData) { }
void BaseMapper::Reset(bool softReset) { } void BaseMapper::Reset(bool softReset) { }
@ -509,8 +509,9 @@ void BaseMapper::StreamState(bool saving)
ArrayInfo<ChrMemoryType> chrMemoryType = { _chrMemoryType, 0x40 }; ArrayInfo<ChrMemoryType> chrMemoryType = { _chrMemoryType, 0x40 };
ArrayInfo<MemoryAccessType> prgMemoryAccess = { _prgMemoryAccess, 0x100 }; ArrayInfo<MemoryAccessType> prgMemoryAccess = { _prgMemoryAccess, 0x100 };
ArrayInfo<MemoryAccessType> chrMemoryAccess = { _chrMemoryAccess, 0x40 }; ArrayInfo<MemoryAccessType> chrMemoryAccess = { _chrMemoryAccess, 0x40 };
SnapshotInfo epsgaudio{ _epsgaudio.get() };
Stream(_mirroringType, chrRam, workRam, saveRam, nametableRam, prgMemoryOffset, chrMemoryOffset, prgMemoryType, chrMemoryType, prgMemoryAccess, chrMemoryAccess); Stream(_mirroringType, chrRam, workRam, saveRam, nametableRam, prgMemoryOffset, chrMemoryOffset, prgMemoryType, chrMemoryType, prgMemoryAccess, chrMemoryAccess, epsgaudio);
if(!saving) { if(!saving) {
RestorePrgChrState(); RestorePrgChrState();
@ -637,6 +638,7 @@ void BaseMapper::Initialize(RomData &romData)
InitMapper(); InitMapper();
InitMapper(romData); InitMapper(romData);
_epsgaudio.reset(new EPSGAudio(_console));
//Load battery data if present //Load battery data if present
LoadBattery(); LoadBattery();

View file

@ -9,6 +9,8 @@
#include "IBattery.h" #include "IBattery.h"
#include "RomData.h" #include "RomData.h"
#include "Console.h" #include "Console.h"
#include "CPU.h"
#include "EPSGAudio.h"
class BaseControlDevice; class BaseControlDevice;
@ -156,7 +158,7 @@ protected:
public: public:
static constexpr uint32_t NametableCount = 0x10; static constexpr uint32_t NametableCount = 0x10;
static constexpr uint32_t NametableSize = 0x400; static constexpr uint32_t NametableSize = 0x400;
unique_ptr<EPSGAudio> _epsgaudio;
void Initialize(RomData &romData); void Initialize(RomData &romData);
virtual ~BaseMapper(); virtual ~BaseMapper();
@ -166,6 +168,7 @@ public:
virtual void SetNesModel(NesModel model) { } virtual void SetNesModel(NesModel model) { }
virtual void ProcessCpuClock() { } virtual void ProcessCpuClock() { }
virtual void ProcessEPSGClock() { _epsgaudio->Clock(); }
virtual void NotifyVRAMAddressChange(uint16_t addr); virtual void NotifyVRAMAddressChange(uint16_t addr);
virtual void GetMemoryRanges(MemoryRanges &ranges) override; virtual void GetMemoryRanges(MemoryRanges &ranges) override;

View file

@ -465,6 +465,7 @@ bool Console::Initialize(VirtualFile &romFile, VirtualFile &patchFile, bool forP
void Console::ProcessCpuClock() void Console::ProcessCpuClock()
{ {
_mapper->ProcessEPSGClock();
_mapper->ProcessCpuClock(); _mapper->ProcessCpuClock();
_apu->ProcessCpuClock(); _apu->ProcessCpuClock();
} }

View file

@ -5,28 +5,10 @@
#include "CPU.h" #include "CPU.h"
#include "EmulationSettings.h" #include "EmulationSettings.h"
#include "A12Watcher.h" #include "A12Watcher.h"
#include "EPSGAudio.h"
#include "Sunsoft5bAudio.h"
#ifndef MMC3_DEFAULT_AUDIO
#define MMC3_USE_EPSG
#endif
#ifdef MMC3_USE_EPSG
using AudioClass = EPSGAudio;
#else
using AudioClass = Sunsoft5bAudio;
#endif
class MMC3 : public BaseMapper class MMC3 : public BaseMapper
{ {
public:
unique_ptr<AudioClass> _audio;
void ProcessCpuClock() override
{
_audio->Clock();
}
private: private:
enum class MMC3Registers enum class MMC3Registers
@ -208,10 +190,9 @@ public:
BaseMapper::StreamState(saving); BaseMapper::StreamState(saving);
ArrayInfo<uint8_t> registers = { _registers, 8 }; ArrayInfo<uint8_t> registers = { _registers, 8 };
SnapshotInfo a12Watcher{ &_a12Watcher }; SnapshotInfo a12Watcher{ &_a12Watcher };
SnapshotInfo audio{ _audio.get() };
Stream(_state.Reg8000, _state.RegA000, _state.RegA001, _currentRegister, _chrMode, _prgMode, Stream(_state.Reg8000, _state.RegA000, _state.RegA001, _currentRegister, _chrMode, _prgMode,
_irqReloadValue, _irqCounter, _irqReload, _irqEnabled, a12Watcher, _irqReloadValue, _irqCounter, _irqReload, _irqEnabled, a12Watcher,
_wramEnabled, _wramWriteProtected, registers, audio); _wramEnabled, _wramWriteProtected, registers);
} }
virtual uint16_t GetPRGPageSize() override { return 0x2000; } virtual uint16_t GetPRGPageSize() override { return 0x2000; }
@ -221,7 +202,6 @@ public:
virtual void InitMapper() override virtual void InitMapper() override
{ {
_audio.reset(new AudioClass(_console));
//Force MMC3A irqs for boards that are known to use the A revision. //Force MMC3A irqs for boards that are known to use the A revision.
//Some MMC3B boards also have the A behavior, but currently no way to tell them apart. //Some MMC3B boards also have the A behavior, but currently no way to tell them apart.
@ -278,22 +258,6 @@ public:
_irqEnabled = true; _irqEnabled = true;
break; break;
} }
switch (addr & 0xE000) {
case 0xC000:
case 0xE000:
_audio->WriteRegister(addr, value);
break;
}
}
void WriteEPSG(uint16_t addr, uint8_t value) override
{
switch (addr & 0x4016) {
case 0x4016:
_audio->WriteRegister(addr, value);
break;
}
} }
virtual void TriggerIrq() virtual void TriggerIrq()

View file

@ -3,22 +3,11 @@
#include "BaseMapper.h" #include "BaseMapper.h"
#include "CPU.h" #include "CPU.h"
#include "Sunsoft5bAudio.h" #include "Sunsoft5bAudio.h"
#include "EPSGAudio.h"
#ifndef SUNSOFT_DEFAULT_AUDIO
#define SUNSOFT_USE_EPSG
#endif
#ifdef SUNSOFT_USE_EPSG
using SunsoftFme7AudioClass = EPSGAudio;
#else
using SunsoftFme7AudioClass = Sunsoft5bAudio;
#endif
class SunsoftFme7 : public BaseMapper class SunsoftFme7 : public BaseMapper
{ {
private: private:
unique_ptr<SunsoftFme7AudioClass> _audio; unique_ptr<Sunsoft5bAudio> _audio;
uint8_t _command; uint8_t _command;
uint8_t _workRamValue; uint8_t _workRamValue;
bool _irqEnabled; bool _irqEnabled;
@ -35,7 +24,7 @@ protected:
void InitMapper() override void InitMapper() override
{ {
_audio.reset(new AudioClass(_console)); _audio.reset(new Sunsoft5bAudio(_console));
_command = 0; _command = 0;
_workRamValue = 0; _workRamValue = 0;
@ -81,15 +70,6 @@ protected:
SetCpuMemoryMapping(0x6000, 0x7FFF, _workRamValue & 0x3F, PrgMemoryType::PrgRom); SetCpuMemoryMapping(0x6000, 0x7FFF, _workRamValue & 0x3F, PrgMemoryType::PrgRom);
} }
} }
void WriteEPSG(uint16_t addr, uint8_t value) override
{
switch (addr & 0x4016) {
case 0x4016:
_audio->WriteRegister(addr, value);
break;
}
}
void WriteRegister(uint16_t addr, uint8_t value) override void WriteRegister(uint16_t addr, uint8_t value) override
{ {