Core: Move IMEM/DMEM into SPRegistersHandler

This commit is contained in:
zilmar 2022-10-17 17:29:05 +10:30
parent 96244cd6fd
commit 4525e8b6f3
5 changed files with 59 additions and 47 deletions

View File

@ -38,6 +38,19 @@ SPRegistersHandler::SPRegistersHandler(CN64System & System, CMipsMemoryVM & MMU,
bool SPRegistersHandler::Read32(uint32_t Address, uint32_t & Value)
{
if (Address < 0x04040000)
{
if ((Address & 0x1000) == 0)
{
Value = *((uint32_t *)&m_DMEM[Address & 0xFFC]);
}
else
{
Value = *((uint32_t *)&m_IMEM[Address & 0xFFC]);
}
return true;
}
switch (Address & 0x1FFFFFFF)
{
case 0x04040000: Value = m_ExecutedDMARead ? m_SPMemAddrRegRead : SP_MEM_ADDR_REG; break;
@ -85,6 +98,19 @@ bool SPRegistersHandler::Read32(uint32_t Address, uint32_t & Value)
bool SPRegistersHandler::Write32(uint32_t Address, uint32_t Value, uint32_t Mask)
{
uint32_t MaskedValue = Value & Mask;
if (Address < 0x04040000)
{
if ((Address & 0x1000) == 0)
{
*((uint32_t *)&m_DMEM[Address & 0xFFC]) = MaskedValue;
}
else
{
*((uint32_t *)&m_IMEM[Address & 0xFFC]) = MaskedValue;
}
return true;
}
if (GenerateLog() && LogSPRegisters())
{
switch (Address & 0x1FFFFFFF)
@ -106,7 +132,6 @@ bool SPRegistersHandler::Write32(uint32_t Address, uint32_t Value, uint32_t Mask
}
}
uint32_t MaskedValue = Value & Mask;
switch (Address & 0x1FFFFFFF)
{
case 0x04040000: SP_MEM_ADDR_REG = (SP_MEM_ADDR_REG & ~Mask) | (MaskedValue); break;
@ -245,7 +270,7 @@ bool SPRegistersHandler::Write32(uint32_t Address, uint32_t Value, uint32_t Mask
void SPRegistersHandler::SP_DMA_READ()
{
uint8_t * Dest = ((SP_MEM_ADDR_REG & 0x1000) != 0 ? m_MMU.Imem() : m_MMU.Dmem());
uint8_t * Dest = ((SP_MEM_ADDR_REG & 0x1000) != 0 ? m_IMEM : m_DMEM);
uint8_t * Source = m_MMU.Rdram();
uint32_t ReadPos = SP_DRAM_ADDR_REG & 0x00FFFFF8;
int32_t Length = ((SP_RD_LEN_REG & 0xFFF) | 7) + 1;
@ -335,7 +360,7 @@ void SPRegistersHandler::SP_DMA_READ()
void SPRegistersHandler::SP_DMA_WRITE()
{
uint8_t * Source = ((SP_MEM_ADDR_REG & 0x1000) != 0 ? m_MMU.Imem() : m_MMU.Dmem());
uint8_t * Source = ((SP_MEM_ADDR_REG & 0x1000) != 0 ? m_IMEM : m_DMEM);
uint8_t * Dest = m_MMU.Rdram();
uint32_t WritePos = SP_DRAM_ADDR_REG & 0x00FFFFF8;
int32_t Length = ((SP_WR_LEN_REG & 0xFFF) | 7) + 1;
@ -407,6 +432,9 @@ void SPRegistersHandler::SystemReset(void)
{
SP_RD_LEN_REG = 0x00000FF8;
SP_WR_LEN_REG = 0x00000FF8;
memset(m_IMEM, 0, sizeof(m_IMEM));
memset(m_DMEM, 0, sizeof(m_DMEM));
}
void SPRegistersHandler::LoadedGameState(void)

View File

@ -46,6 +46,16 @@ public:
bool Read32(uint32_t Address, uint32_t & Value);
bool Write32(uint32_t Address, uint32_t Value, uint32_t Mask);
uint8_t * Imem()
{
return &m_IMEM[0];
}
uint8_t * Dmem()
{
return &m_DMEM[0];
}
private:
SPRegistersHandler();
SPRegistersHandler(const SPRegistersHandler &);
@ -65,6 +75,8 @@ private:
void SystemReset(void);
void LoadedGameState(void);
uint8_t m_IMEM[0x1000];
uint8_t m_DMEM[0x1000];
uint32_t m_SPMemAddrRegRead;
uint32_t m_SPDramAddrRegRead;
bool m_ExecutedDMARead;

View File

@ -39,8 +39,6 @@ CMipsMemoryVM::CMipsMemoryVM(CN64System & System, bool SavesReadOnly) :
m_TLB_ReadMap(nullptr),
m_TLB_WriteMap(nullptr),
m_RDRAM(nullptr),
m_DMEM(nullptr),
m_IMEM(nullptr),
m_Rom(*g_Rom)
{
g_Settings->RegisterChangeCB(Game_RDRamSize, this, (CSettings::SettingChangedFunc)RdramChanged);
@ -68,13 +66,11 @@ void CMipsMemoryVM::Reset(bool /*EraseMemory*/)
}
for (size_t Address = BaseAddress + 0x04000000; Address < (BaseAddress + 0x04001000); Address += 0x1000)
{
m_MemoryReadMap[Address >> 12] = (size_t)(m_DMEM - Address);
m_MemoryWriteMap[Address >> 12] = (size_t)(m_DMEM - Address);
m_MemoryReadMap[Address >> 12] = (size_t)(Dmem() - Address);
}
for (size_t Address = BaseAddress + 0x04001000; Address < (BaseAddress + 0x04002000); Address += 0x1000)
{
m_MemoryReadMap[Address >> 12] = (size_t)(m_IMEM - Address);
m_MemoryWriteMap[Address >> 12] = (size_t)(m_IMEM - Address);
m_MemoryReadMap[Address >> 12] = (size_t)(Imem() - Address);
}
}
}
@ -173,16 +169,6 @@ bool CMipsMemoryVM::Initialize(bool SyncSystem)
return false;
}
if (CommitMemory(m_RDRAM + 0x04000000, 0x2000, MEM_READWRITE) == nullptr)
{
WriteTrace(TraceN64System, TraceError, "Failed to allocate DMEM/IMEM (Size: 0x%X)", 0x2000);
FreeMemory();
return false;
}
m_DMEM = (uint8_t *)(m_RDRAM + 0x04000000);
m_IMEM = (uint8_t *)(m_RDRAM + 0x04001000);
m_MemoryReadMap = new size_t[0x100000];
if (m_MemoryReadMap == nullptr)
{
@ -241,8 +227,6 @@ void CMipsMemoryVM::FreeMemory()
FreeAddressSpace(m_RDRAM, 0x20000000);
}
m_RDRAM = nullptr;
m_IMEM = nullptr;
m_DMEM = nullptr;
}
if (m_TLB_ReadMap)
{
@ -278,13 +262,13 @@ uint8_t * CMipsMemoryVM::MemoryPtr(uint32_t VAddr, uint32_t Size, bool Read)
return (uint8_t *)(m_RDRAM + PAddr);
}
if (PAddr >= 0x04000000 && (PAddr + Size) < 0x04001000)
if (PAddr >= 0x04000000 && (PAddr + Size) <= 0x04001000)
{
return (uint8_t *)(m_DMEM + (PAddr - 0x04000000));
return (uint8_t *)&m_SPRegistersHandler.Dmem()[PAddr - 0x04000000];
}
if (PAddr >= 0x04001000 && (PAddr + Size) < 0x04002000)
if (PAddr >= 0x04001000 && (PAddr + Size) <= 0x04002000)
{
return (uint8_t *)(m_IMEM + (PAddr - 0x04001000));
return (uint8_t *)&m_SPRegistersHandler.Imem()[PAddr - 0x04001000];
}
if (Read && PAddr >= 0x10000000 && (PAddr + Size) < (0x10000000 + m_Rom.GetRomSize()))
{
@ -595,11 +579,6 @@ bool CMipsMemoryVM::SD_Memory(uint64_t VAddr, uint64_t Value)
*(uint32_t *)(MemoryPtr + VAddr32 + 4) = *((uint32_t *)(&Value));
return true;
}
if (m_TLB_WriteMap[VAddr32 >> 12] == -1)
{
GenerateTLBWriteException(VAddr, __FUNCTION__);
return false;
}
return SD_NonMemory(VAddr32, Value);
}
@ -784,6 +763,7 @@ bool CMipsMemoryVM::SB_NonMemory(uint32_t VAddr, uint32_t Value)
*(uint8_t *)(m_RDRAM + (PAddr ^ 3)) = (uint8_t)Value;
}
break;
case 0x04000000: m_SPRegistersHandler.Write32(PAddr & ~3, Value << ((3 - (PAddr & 3)) * 8), 0xFFFFFFFF); break;
case 0x1FC00000: m_PifRamHandler.Write32(PAddr & ~3, Value << ((3 - (PAddr & 3)) * 8), 0xFFFFFFFF); break;
default:
if (PAddr >= 0x10000000 && PAddr < 0x20000000)
@ -834,6 +814,7 @@ bool CMipsMemoryVM::SH_NonMemory(uint32_t VAddr, uint32_t Value)
}
}
break;
case 0x04000000: m_SPRegistersHandler.Write32(PAddr & ~3, Value << ((2 - (PAddr & 2)) * 8), 0xFFFFFFFF); break;
case 0x1FC00000: m_PifRamHandler.Write32(PAddr & ~3, Value << ((2 - (PAddr & 2)) * 8), 0xFFFFFFFF); break;
default:
if (PAddr >= 0x10000000 && PAddr < 0x20000000)
@ -888,17 +869,7 @@ bool CMipsMemoryVM::SW_NonMemory(uint32_t VAddr, uint32_t Value)
}
break;
case 0x03F00000: m_RDRAMRegistersHandler.Write32(PAddr, Value, 0xFFFFFFFF); break;
case 0x04000000:
if (PAddr < 0x04002000)
{
g_Recompiler->ClearRecompCode_Phys(PAddr & ~0xFFF, 0xFFF, CRecompiler::Remove_ProtectedMem);
*(uint32_t *)(m_RDRAM + PAddr) = Value;
}
else
{
m_SPRegistersHandler.Write32(PAddr, Value, 0xFFFFFFFF);
}
break;
case 0x04000000: m_SPRegistersHandler.Write32(PAddr, Value, 0xFFFFFFFF); break;
case 0x04100000: m_DPCommandRegistersHandler.Write32(PAddr, Value, 0xFFFFFFFF); break;
case 0x04300000: m_MIPSInterfaceHandler.Write32(PAddr, Value, 0xFFFFFFFF); break;
case 0x04400000: m_VideoInterfaceHandler.Write32(PAddr, Value, 0xFFFFFFFF); break;
@ -955,6 +926,7 @@ bool CMipsMemoryVM::SD_NonMemory(uint32_t VAddr, uint64_t Value)
*(uint64_t *)(m_RDRAM + PAddr) = Value;
}
break;
case 0x04000000: m_SPRegistersHandler.Write32(PAddr, (int32_t)(Value >> 32), 0xFFFFFFFF); break;
default:
if (PAddr >= 0x10000000 && PAddr < 0x20000000)
{

View File

@ -69,13 +69,13 @@ public:
{
return m_AllocatedRdramSize;
}
uint8_t * Dmem() const
uint8_t * Dmem()
{
return m_DMEM;
return m_SPRegistersHandler.Dmem();
}
uint8_t * Imem() const
uint8_t * Imem()
{
return m_IMEM;
return m_SPRegistersHandler.Imem();
}
CSram & GetSram()
@ -217,7 +217,7 @@ private:
SerialInterfaceHandler m_SerialInterfaceHandler;
SPRegistersHandler m_SPRegistersHandler;
VideoInterfaceHandler m_VideoInterfaceHandler;
uint8_t *m_RDRAM, *m_DMEM, *m_IMEM;
uint8_t * m_RDRAM;
uint32_t m_AllocatedRdramSize;
CN64Rom & m_Rom;

View File

@ -906,6 +906,7 @@ void CN64System::Reset(bool bInitReg, bool ClearMenory)
{
WriteTrace(TraceN64System, TraceDebug, "Start (bInitReg: %s, ClearMenory: %s)", bInitReg ? "true" : "false", ClearMenory ? "true" : "false");
g_Settings->SaveBool(GameRunning_InReset, true);
NotifyCallback(CN64SystemCB_Reset);
RefreshGameSettings();
m_MMU_VM.Reset(ClearMenory);
@ -952,7 +953,6 @@ void CN64System::Reset(bool bInitReg, bool ClearMenory)
{
m_SyncCPU->Reset(bInitReg, ClearMenory);
}
NotifyCallback(CN64SystemCB_Reset);
g_Settings->SaveBool(GameRunning_InReset, false);
WriteTrace(TraceN64System, TraceDebug, "Done");