aboutsummaryrefslogtreecommitdiff
path: root/src/CP15.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/CP15.cpp')
-rw-r--r--src/CP15.cpp84
1 files changed, 39 insertions, 45 deletions
diff --git a/src/CP15.cpp b/src/CP15.cpp
index 225847e..3d64259 100644
--- a/src/CP15.cpp
+++ b/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;
}