mirror of
https://github.com/melonDS-emu/melonDS.git
synced 2025-07-23 06:10:03 -06:00
first steps in bringing over the JIT refactor/fastmem
This commit is contained in:
84
src/CP15.cpp
84
src/CP15.cpp
@ -22,6 +22,7 @@
|
||||
#include "DSi.h"
|
||||
#include "ARM.h"
|
||||
#include "ARMJIT.h"
|
||||
#include "ARMJIT_Memory.h"
|
||||
|
||||
|
||||
// access timing for cached regions
|
||||
@ -42,8 +43,8 @@ void ARMv5::CP15Reset()
|
||||
DTCMSetting = 0;
|
||||
ITCMSetting = 0;
|
||||
|
||||
memset(ITCM, 0, 0x8000);
|
||||
memset(DTCM, 0, 0x4000);
|
||||
memset(ITCM, 0, ITCMPhysicalSize);
|
||||
memset(DTCM, 0, DTCMPhysicalSize);
|
||||
|
||||
ITCMSize = 0;
|
||||
DTCMBase = 0xFFFFFFFF;
|
||||
@ -75,8 +76,8 @@ void ARMv5::CP15DoSavestate(Savestate* file)
|
||||
file->Var32(&DTCMSetting);
|
||||
file->Var32(&ITCMSetting);
|
||||
|
||||
file->VarArray(ITCM, 0x8000);
|
||||
file->VarArray(DTCM, 0x4000);
|
||||
file->VarArray(ITCM, ITCMPhysicalSize);
|
||||
file->VarArray(DTCM, DTCMPhysicalSize);
|
||||
|
||||
file->Var32(&PU_CodeCacheable);
|
||||
file->Var32(&PU_DataCacheable);
|
||||
@ -98,36 +99,30 @@ void ARMv5::CP15DoSavestate(Savestate* file)
|
||||
|
||||
void ARMv5::UpdateDTCMSetting()
|
||||
{
|
||||
#ifdef JIT_ENABLED
|
||||
u32 oldDTCMBase = DTCMBase;
|
||||
u32 oldDTCMSize = DTCMSize;
|
||||
#endif
|
||||
u32 newDTCMBase;
|
||||
u32 newDTCMSize;
|
||||
if (CP15Control & (1<<16))
|
||||
{
|
||||
DTCMBase = DTCMSetting & 0xFFFFF000;
|
||||
DTCMSize = 0x200 << ((DTCMSetting >> 1) & 0x1F);
|
||||
newDTCMBase = DTCMSetting & 0xFFFFF000;
|
||||
newDTCMSize = 0x200 << ((DTCMSetting >> 1) & 0x1F);
|
||||
//printf("DTCM [%08X] enabled at %08X, size %X\n", DTCMSetting, DTCMBase, DTCMSize);
|
||||
}
|
||||
else
|
||||
{
|
||||
DTCMBase = 0xFFFFFFFF;
|
||||
DTCMSize = 0;
|
||||
newDTCMBase = 0xFFFFFFFF;
|
||||
newDTCMSize = 0;
|
||||
//printf("DTCM disabled\n");
|
||||
}
|
||||
#ifdef JIT_ENABLED
|
||||
if (oldDTCMBase != DTCMBase || oldDTCMSize != DTCMSize)
|
||||
if (newDTCMBase != DTCMBase || newDTCMSize != DTCMSize)
|
||||
{
|
||||
ARMJIT::UpdateMemoryStatus9(oldDTCMBase, oldDTCMBase + oldDTCMSize);
|
||||
ARMJIT::UpdateMemoryStatus9(DTCMBase, DTCMBase + DTCMSize);
|
||||
ARMJIT_Memory::RemapDTCM(newDTCMBase, newDTCMSize);
|
||||
DTCMBase = newDTCMBase;
|
||||
DTCMSize = newDTCMSize;
|
||||
}
|
||||
#endif
|
||||
}
|
||||
|
||||
void ARMv5::UpdateITCMSetting()
|
||||
{
|
||||
#ifdef JIT_ENABLED
|
||||
u32 oldITCMSize = ITCMSize;
|
||||
#endif
|
||||
if (CP15Control & (1<<18))
|
||||
{
|
||||
ITCMSize = 0x200 << ((ITCMSetting >> 1) & 0x1F);
|
||||
@ -138,10 +133,6 @@ void ARMv5::UpdateITCMSetting()
|
||||
ITCMSize = 0;
|
||||
//printf("ITCM disabled\n");
|
||||
}
|
||||
#ifdef JIT_ENABLED
|
||||
if (oldITCMSize != ITCMSize)
|
||||
ARMJIT::UpdateMemoryStatus9(0, std::max(oldITCMSize, ITCMSize));
|
||||
#endif
|
||||
}
|
||||
|
||||
|
||||
@ -581,12 +572,15 @@ void ARMv5::CP15Write(u32 id, u32 val)
|
||||
|
||||
case 0x750:
|
||||
ICacheInvalidateAll();
|
||||
//Halt(255);
|
||||
return;
|
||||
case 0x751:
|
||||
ICacheInvalidateByAddr(val);
|
||||
//Halt(255);
|
||||
return;
|
||||
case 0x752:
|
||||
printf("CP15: ICACHE INVALIDATE WEIRD. %08X\n", val);
|
||||
//Halt(255);
|
||||
return;
|
||||
|
||||
|
||||
@ -723,7 +717,7 @@ u32 ARMv5::CodeRead32(u32 addr, bool branch)
|
||||
if (addr < ITCMSize)
|
||||
{
|
||||
CodeCycles = 1;
|
||||
return *(u32*)&ITCM[addr & 0x7FFF];
|
||||
return *(u32*)&ITCM[addr & (ITCMPhysicalSize - 1)];
|
||||
}
|
||||
|
||||
CodeCycles = RegionCodeCycles;
|
||||
@ -750,13 +744,13 @@ void ARMv5::DataRead8(u32 addr, u32* val)
|
||||
if (addr < ITCMSize)
|
||||
{
|
||||
DataCycles = 1;
|
||||
*val = *(u8*)&ITCM[addr & 0x7FFF];
|
||||
*val = *(u8*)&ITCM[addr & (ITCMPhysicalSize - 1)];
|
||||
return;
|
||||
}
|
||||
if (addr >= DTCMBase && addr < (DTCMBase + DTCMSize))
|
||||
{
|
||||
DataCycles = 1;
|
||||
*val = *(u8*)&DTCM[(addr - DTCMBase) & 0x3FFF];
|
||||
*val = *(u8*)&DTCM[(addr - DTCMBase) & (DTCMPhysicalSize - 1)];
|
||||
return;
|
||||
}
|
||||
|
||||
@ -773,13 +767,13 @@ void ARMv5::DataRead16(u32 addr, u32* val)
|
||||
if (addr < ITCMSize)
|
||||
{
|
||||
DataCycles = 1;
|
||||
*val = *(u16*)&ITCM[addr & 0x7FFF];
|
||||
*val = *(u16*)&ITCM[addr & (ITCMPhysicalSize - 1)];
|
||||
return;
|
||||
}
|
||||
if (addr >= DTCMBase && addr < (DTCMBase + DTCMSize))
|
||||
{
|
||||
DataCycles = 1;
|
||||
*val = *(u16*)&DTCM[(addr - DTCMBase) & 0x3FFF];
|
||||
*val = *(u16*)&DTCM[(addr - DTCMBase) & (DTCMPhysicalSize - 1)];
|
||||
return;
|
||||
}
|
||||
|
||||
@ -796,13 +790,13 @@ void ARMv5::DataRead32(u32 addr, u32* val)
|
||||
if (addr < ITCMSize)
|
||||
{
|
||||
DataCycles = 1;
|
||||
*val = *(u32*)&ITCM[addr & 0x7FFF];
|
||||
*val = *(u32*)&ITCM[addr & (ITCMPhysicalSize - 1)];
|
||||
return;
|
||||
}
|
||||
if (addr >= DTCMBase && addr < (DTCMBase + DTCMSize))
|
||||
{
|
||||
DataCycles = 1;
|
||||
*val = *(u32*)&DTCM[(addr - DTCMBase) & 0x3FFF];
|
||||
*val = *(u32*)&DTCM[(addr - DTCMBase) & (DTCMPhysicalSize - 1)];
|
||||
return;
|
||||
}
|
||||
|
||||
@ -817,13 +811,13 @@ void ARMv5::DataRead32S(u32 addr, u32* val)
|
||||
if (addr < ITCMSize)
|
||||
{
|
||||
DataCycles += 1;
|
||||
*val = *(u32*)&ITCM[addr & 0x7FFF];
|
||||
*val = *(u32*)&ITCM[addr & (ITCMPhysicalSize - 1)];
|
||||
return;
|
||||
}
|
||||
if (addr >= DTCMBase && addr < (DTCMBase + DTCMSize))
|
||||
{
|
||||
DataCycles += 1;
|
||||
*val = *(u32*)&DTCM[(addr - DTCMBase) & 0x3FFF];
|
||||
*val = *(u32*)&DTCM[(addr - DTCMBase) & (DTCMPhysicalSize - 1)];
|
||||
return;
|
||||
}
|
||||
|
||||
@ -838,16 +832,16 @@ void ARMv5::DataWrite8(u32 addr, u8 val)
|
||||
if (addr < ITCMSize)
|
||||
{
|
||||
DataCycles = 1;
|
||||
*(u8*)&ITCM[addr & 0x7FFF] = val;
|
||||
*(u8*)&ITCM[addr & (ITCMPhysicalSize - 1)] = val;
|
||||
#ifdef JIT_ENABLED
|
||||
ARMJIT::InvalidateITCMIfNecessary(addr);
|
||||
ARMJIT::CheckAndInvalidate<0, ARMJIT_Memory::memregion_ITCM>(addr);
|
||||
#endif
|
||||
return;
|
||||
}
|
||||
if (addr >= DTCMBase && addr < (DTCMBase + DTCMSize))
|
||||
{
|
||||
DataCycles = 1;
|
||||
*(u8*)&DTCM[(addr - DTCMBase) & 0x3FFF] = val;
|
||||
*(u8*)&DTCM[(addr - DTCMBase) & (DTCMPhysicalSize - 1)] = val;
|
||||
return;
|
||||
}
|
||||
|
||||
@ -864,16 +858,16 @@ void ARMv5::DataWrite16(u32 addr, u16 val)
|
||||
if (addr < ITCMSize)
|
||||
{
|
||||
DataCycles = 1;
|
||||
*(u16*)&ITCM[addr & 0x7FFF] = val;
|
||||
*(u16*)&ITCM[addr & (ITCMPhysicalSize - 1)] = val;
|
||||
#ifdef JIT_ENABLED
|
||||
ARMJIT::InvalidateITCMIfNecessary(addr);
|
||||
ARMJIT::CheckAndInvalidate<0, ARMJIT_Memory::memregion_ITCM>(addr);
|
||||
#endif
|
||||
return;
|
||||
}
|
||||
if (addr >= DTCMBase && addr < (DTCMBase + DTCMSize))
|
||||
{
|
||||
DataCycles = 1;
|
||||
*(u16*)&DTCM[(addr - DTCMBase) & 0x3FFF] = val;
|
||||
*(u16*)&DTCM[(addr - DTCMBase) & (DTCMPhysicalSize - 1)] = val;
|
||||
return;
|
||||
}
|
||||
|
||||
@ -890,16 +884,16 @@ void ARMv5::DataWrite32(u32 addr, u32 val)
|
||||
if (addr < ITCMSize)
|
||||
{
|
||||
DataCycles = 1;
|
||||
*(u32*)&ITCM[addr & 0x7FFF] = val;
|
||||
*(u32*)&ITCM[addr & (ITCMPhysicalSize - 1)] = val;
|
||||
#ifdef JIT_ENABLED
|
||||
ARMJIT::InvalidateITCMIfNecessary(addr);
|
||||
ARMJIT::CheckAndInvalidate<0, ARMJIT_Memory::memregion_ITCM>(addr);
|
||||
#endif
|
||||
return;
|
||||
}
|
||||
if (addr >= DTCMBase && addr < (DTCMBase + DTCMSize))
|
||||
{
|
||||
DataCycles = 1;
|
||||
*(u32*)&DTCM[(addr - DTCMBase) & 0x3FFF] = val;
|
||||
*(u32*)&DTCM[(addr - DTCMBase) & (DTCMPhysicalSize - 1)] = val;
|
||||
return;
|
||||
}
|
||||
|
||||
@ -914,16 +908,16 @@ void ARMv5::DataWrite32S(u32 addr, u32 val)
|
||||
if (addr < ITCMSize)
|
||||
{
|
||||
DataCycles += 1;
|
||||
*(u32*)&ITCM[addr & 0x7FFF] = val;
|
||||
*(u32*)&ITCM[addr & (ITCMPhysicalSize - 1)] = val;
|
||||
#ifdef JIT_ENABLED
|
||||
ARMJIT::InvalidateITCMIfNecessary(addr);
|
||||
ARMJIT::CheckAndInvalidate<0, ARMJIT_Memory::memregion_ITCM>(addr);
|
||||
#endif
|
||||
return;
|
||||
}
|
||||
if (addr >= DTCMBase && addr < (DTCMBase + DTCMSize))
|
||||
{
|
||||
DataCycles += 1;
|
||||
*(u32*)&DTCM[(addr - DTCMBase) & 0x3FFF] = val;
|
||||
*(u32*)&DTCM[(addr - DTCMBase) & (DTCMPhysicalSize - 1)] = val;
|
||||
return;
|
||||
}
|
||||
|
||||
|
Reference in New Issue
Block a user