mirror of
https://github.com/jpd002/Play-.git
synced 2025-04-28 13:47:57 +03:00
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:
parent
2276818152
commit
9c840f6e05
11 changed files with 43 additions and 26 deletions
|
@ -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));
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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();
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
||||
|
|
|
@ -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;
|
||||
|
||||
|
|
|
@ -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();
|
||||
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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);
|
||||
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue