Allow for different EE and IOP memory sizes to be used.

Enables larger memory size for Namco System 256 arcade machines while keeping the standard for PS2 games.
This commit is contained in:
Jean-Philip Desjardins 2023-06-08 17:12:43 -04:00
parent 2276818152
commit 9c840f6e05
11 changed files with 43 additions and 26 deletions

View file

@ -258,11 +258,13 @@ void CPS2VM::PauseAsync()
});
}
void CPS2VM::Reset()
void CPS2VM::Reset(uint32 eeRamSize, uint32 iopRamSize)
{
assert(m_nStatus == PAUSED);
BeforeExecutableReloaded = ExecutableReloadedHandler();
AfterExecutableReloaded = ExecutableReloadedHandler();
m_eeRamSize = eeRamSize;
m_iopRamSize = iopRamSize;
ResetVM();
}
@ -427,7 +429,13 @@ void CPS2VM::CreateVM()
void CPS2VM::ResetVM()
{
m_ee->Reset();
assert(m_eeRamSize != 0);
assert(m_iopRamSize != 0);
assert(m_eeRamSize <= PS2::EE_RAM_SIZE);
assert(m_iopRamSize <= PS2::IOP_RAM_SIZE);
m_ee->Reset(m_eeRamSize);
m_iop->Reset();
if(m_ee->m_gs != NULL)
@ -439,7 +447,7 @@ void CPS2VM::ResetVM()
auto iopOs = dynamic_cast<CIopBios*>(m_iop->m_bios.get());
assert(iopOs);
iopOs->Reset(std::make_shared<Iop::CSifManPs2>(m_ee->m_sif, m_ee->m_ram, m_iop->m_ram));
iopOs->Reset(m_iopRamSize, std::make_shared<Iop::CSifManPs2>(m_ee->m_sif, m_ee->m_ram, m_iop->m_ram));
iopOs->GetIoman()->RegisterDevice("rom0", std::make_shared<Iop::Ioman::CPreferenceDirectoryDevice>(PREF_PS2_ROM0_DIRECTORY));
iopOs->GetIoman()->RegisterDevice("host", std::make_shared<Iop::Ioman::CPreferenceDirectoryDevice>(PREF_PS2_HOST_DIRECTORY));

View file

@ -50,7 +50,7 @@ public:
void Resume() override;
void Pause() override;
void PauseAsync();
void Reset();
void Reset(uint32 = PS2::EE_BASE_RAM_SIZE, uint32 = PS2::IOP_BASE_RAM_SIZE);
STATUS GetStatus() const override;
@ -152,6 +152,8 @@ private:
uint32 m_eeFreqScaleNumerator = 1;
uint32 m_eeFreqScaleDenominator = 1;
uint32 m_eeRamSize = PS2::EE_BASE_RAM_SIZE;
uint32 m_iopRamSize = PS2::IOP_BASE_RAM_SIZE;
uint32 m_onScreenTicksTotal = 0;
uint32 m_vblankTicksTotal = 0;
int m_vblankTicks = 0;

View file

@ -5,7 +5,9 @@ namespace PS2
{
enum
{
EE_RAM_SIZE = 0x02000000
EE_RAM_SIZE = 0x04000000,
EE_BASE_RAM_SIZE = 0x02000000,
EE_EXT_RAM_SIZE = 0x04000000,
};
enum
@ -40,7 +42,9 @@ namespace PS2
enum
{
IOP_RAM_SIZE = 0x00200000
IOP_RAM_SIZE = 0x00400000,
IOP_BASE_RAM_SIZE = 0x00200000,
IOP_EXT_RAM_SIZE = 0x00400000,
};
enum

View file

@ -183,7 +183,7 @@ void CSubSystem::SetVpu1(std::shared_ptr<CVpu> newVpu1)
m_vpu1 = newVpu1;
}
void CSubSystem::Reset()
void CSubSystem::Reset(uint32 ramSize)
{
m_os->Release();
m_EE.m_executor->Reset();
@ -219,7 +219,7 @@ void CSubSystem::Reset()
m_intc.Reset();
m_timer.Reset();
m_os->Initialize();
m_os->Initialize(ramSize);
m_os->GetLibMc2().Reset();
FillFakeIopRam();
//LoadBIOS();

View file

@ -27,7 +27,7 @@ namespace Ee
CSubSystem(uint8*, CIopBios&);
virtual ~CSubSystem();
void Reset();
void Reset(uint32);
int ExecuteCpu(int);
bool IsCpuIdle() const;
void CountTicks(int);

View file

@ -272,10 +272,11 @@ CPS2OS::~CPS2OS()
Release();
}
void CPS2OS::Initialize()
void CPS2OS::Initialize(uint32 ramSize)
{
m_elf = nullptr;
m_idleEvaluator.Reset();
m_ramSize = ramSize;
SetVsyncFlagPtrs(0, 0);
UpdateTLBEnabledState();
@ -404,7 +405,7 @@ std::pair<uint32, uint32> CPS2OS::GetExecutableRange() const
if(p->nFileSize == 0) continue;
if(!(p->nFlags & ELF::PF_X)) continue;
uint32 end = p->nVAddress + p->nFileSize;
if(end >= PS2::EE_RAM_SIZE) continue;
if(end >= m_ramSize) continue;
minAddr = std::min<uint32>(minAddr, p->nVAddress);
maxAddr = std::max<uint32>(maxAddr, end);
}
@ -464,7 +465,7 @@ void CPS2OS::LoadExecutableInternal()
if(p != nullptr)
{
if(p->nFileSize == 0) continue;
if(p->nVAddress >= PS2::EE_RAM_SIZE)
if(p->nVAddress >= m_ramSize)
{
assert(false);
continue;
@ -1425,7 +1426,7 @@ uint8* CPS2OS::GetStructPtr(uint32 address) const
}
else
{
address &= (PS2::EE_RAM_SIZE - 1);
address &= (m_ramSize - 1);
memory = m_ram;
}
return memory + address;
@ -2672,7 +2673,7 @@ void CPS2OS::sc_SetupThread()
{
//We need to substract 4k from RAM size because some games (Espgaluda) rely on the
//stack and heap being a very precise size. EE kernel seems to substract that amount too.
stackAddr = PS2::EE_RAM_SIZE - (4 * 1024);
stackAddr = m_ramSize - (4 * 1024);
}
else
{
@ -3171,7 +3172,7 @@ void CPS2OS::sc_Deci2Call()
if(handler->valid != 0)
{
uint32 stringAddr = *reinterpret_cast<uint32*>(&m_ram[handler->bufferAddr + 0x10]);
stringAddr &= (PS2::EE_RAM_SIZE - 1);
stringAddr &= (m_ramSize - 1);
uint32 length = m_ram[stringAddr + 0x00] - 0x0C;
uint8* string = &m_ram[stringAddr + 0x0C];
@ -3223,7 +3224,7 @@ void CPS2OS::sc_MachineType()
//7F
void CPS2OS::sc_GetMemorySize()
{
m_ee.m_State.nGPR[SC_RETURN].nV[0] = PS2::EE_RAM_SIZE;
m_ee.m_State.nGPR[SC_RETURN].nV[0] = m_ramSize;
m_ee.m_State.nGPR[SC_RETURN].nV[1] = 0;
}

View file

@ -29,7 +29,7 @@ public:
CPS2OS(CMIPS&, uint8*, uint8*, uint8*, CGSHandler*&, CSIF&, CIopBios&);
virtual ~CPS2OS();
void Initialize();
void Initialize(uint32);
void Release();
bool IsIdle() const;
@ -399,6 +399,7 @@ private:
CGSHandler*& m_gs;
uint8* m_ram = nullptr;
uint32 m_ramSize = 0;
uint8* m_bios = nullptr;
uint8* m_spr = nullptr;

View file

@ -97,10 +97,9 @@
#define MODULE_ID_CDVD_EE_DRIVER 0x70000000
CIopBios::CIopBios(CMIPS& cpu, uint8* ram, uint32 ramSize, uint8* spr)
CIopBios::CIopBios(CMIPS& cpu, uint8* ram, uint8* spr)
: m_cpu(cpu)
, m_ram(ram)
, m_ramSize(ramSize)
, m_spr(spr)
, m_threadFinishAddress(0)
, m_returnFromExceptionAddress(0)
@ -129,8 +128,10 @@ CIopBios::~CIopBios()
DeleteModules();
}
void CIopBios::Reset(const Iop::SifManPtr& sifMan)
void CIopBios::Reset(uint32 ramSize, const Iop::SifManPtr& sifMan)
{
m_ramSize = ramSize;
SetDefaultImageVersion(DEFAULT_IMAGE_VERSION);
PopulateSystemIntcHandlers();

View file

@ -162,7 +162,7 @@ public:
REMOTE,
};
CIopBios(CMIPS&, uint8*, uint32, uint8*);
CIopBios(CMIPS&, uint8*, uint8*);
virtual ~CIopBios();
int32 LoadModuleFromPath(const char*, uint32 = ~0U, bool = true);
@ -195,7 +195,7 @@ public:
void NotifyVBlankStart() override;
void NotifyVBlankEnd() override;
void Reset(const Iop::SifManPtr&);
void Reset(uint32, const Iop::SifManPtr&);
void SaveState(Framework::CZipArchiveWriter&) override;
void LoadState(Framework::CZipArchiveReader&) override;
@ -648,7 +648,7 @@ private:
CMIPS& m_cpu;
uint8* m_ram = nullptr;
uint32 m_ramSize;
uint32 m_ramSize = 0;
uint8* m_spr = nullptr;
uint32 m_threadFinishAddress;
uint32 m_returnFromExceptionAddress;

View file

@ -38,11 +38,11 @@ CSubSystem::CSubSystem(bool ps2Mode)
{
if(ps2Mode)
{
m_bios = std::make_shared<CIopBios>(m_cpu, m_ram, PS2::IOP_RAM_SIZE, m_scratchPad);
m_bios = std::make_shared<CIopBios>(m_cpu, m_ram, m_scratchPad);
}
else
{
m_bios = std::make_shared<CPsxBios>(m_cpu, m_ram, PS2::IOP_RAM_SIZE);
m_bios = std::make_shared<CPsxBios>(m_cpu, m_ram, PS2::IOP_BASE_RAM_SIZE);
}
m_cpu.m_executor = std::make_unique<CGenericMipsExecutor<BlockLookupOneWay>>(m_cpu, (IOP_RAM_SIZE * 4), BLOCK_CATEGORY_PS2_IOP);

View file

@ -336,7 +336,7 @@ void ArcadeUtils::BootArcadeMachine(CPS2VM* virtualMachine, const fs::path& arca
//Reset PS2VM
virtualMachine->Pause();
virtualMachine->Reset();
virtualMachine->Reset(PS2::EE_EXT_RAM_SIZE, PS2::IOP_EXT_RAM_SIZE);
PrepareArcadeEnvironment(virtualMachine, def);