aboutsummaryrefslogtreecommitdiff
path: root/src/CP15.cpp
diff options
context:
space:
mode:
authorArisotura <thetotalworm@gmail.com>2021-10-28 22:41:42 +0200
committerArisotura <thetotalworm@gmail.com>2021-10-28 22:41:42 +0200
commit15a66b1be1552615ac3017a225009e0f12cad351 (patch)
treeed8e1ef28003d5cfcc7fc65aee6392ad04a311bb /src/CP15.cpp
parent43daa1c7d25043eb4e9eb13e6d2df58f1d0400f6 (diff)
more accurate DTCM check
Diffstat (limited to 'src/CP15.cpp')
-rw-r--r--src/CP15.cpp53
1 files changed, 29 insertions, 24 deletions
diff --git a/src/CP15.cpp b/src/CP15.cpp
index f30ed9e..1d81931 100644
--- a/src/CP15.cpp
+++ b/src/CP15.cpp
@@ -50,6 +50,7 @@ void ARMv5::CP15Reset()
ITCMSize = 0;
DTCMBase = 0xFFFFFFFF;
+ DTCMMask = 0;
DTCMSize = 0;
memset(ICache, 0, 0x2000);
@@ -102,25 +103,29 @@ void ARMv5::CP15DoSavestate(Savestate* file)
void ARMv5::UpdateDTCMSetting()
{
u32 newDTCMBase;
+ u32 newDTCMMask;
u32 newDTCMSize;
+
if (CP15Control & (1<<16))
{
- newDTCMBase = DTCMSetting & 0xFFFFF000;
newDTCMSize = 0x200 << ((DTCMSetting >> 1) & 0x1F);
- //printf("DTCM [%08X] enabled at %08X, size %X\n", DTCMSetting, newDTCMBase, newDTCMSize);
+ newDTCMMask = 0xFFFFF000 & ~(newDTCMSize-1);
+ newDTCMBase = DTCMSetting & newDTCMMask;
}
else
{
- newDTCMBase = 0xFFFFFFFF;
newDTCMSize = 0;
- //printf("DTCM disabled\n");
+ newDTCMBase = 0xFFFFFFFF;
+ newDTCMMask = 0;
}
- if (newDTCMBase != DTCMBase || newDTCMSize != DTCMSize)
+
+ if (newDTCMBase != DTCMBase || newDTCMMask != DTCMMask)
{
#ifdef JIT_ENABLED
- ARMJIT_Memory::RemapDTCM(newDTCMBase, newDTCMSize);
+ ARMJIT_Memory::RemapDTCM(newDTCMBase, newDTCMMask);
#endif
DTCMBase = newDTCMBase;
+ DTCMMask = newDTCMMask;
DTCMSize = newDTCMSize;
}
}
@@ -600,12 +605,12 @@ void ARMv5::CP15Write(u32 id, u32 val)
case 0x910:
- DTCMSetting = val;
+ DTCMSetting = val & 0xFFFFF03E;
UpdateDTCMSetting();
return;
case 0x911:
- ITCMSetting = val;
+ ITCMSetting = val & 0x0000003E;
UpdateITCMSetting();
return;
@@ -774,10 +779,10 @@ void ARMv5::DataRead8(u32 addr, u32* val)
*val = *(u8*)&ITCM[addr & (ITCMPhysicalSize - 1)];
return;
}
- if (addr >= DTCMBase && addr < (DTCMBase + DTCMSize))
+ if ((addr & DTCMMask) == DTCMBase)
{
DataCycles = 1;
- *val = *(u8*)&DTCM[(addr - DTCMBase) & (DTCMPhysicalSize - 1)];
+ *val = *(u8*)&DTCM[addr & (DTCMPhysicalSize - 1)];
return;
}
@@ -797,10 +802,10 @@ void ARMv5::DataRead16(u32 addr, u32* val)
*val = *(u16*)&ITCM[addr & (ITCMPhysicalSize - 1)];
return;
}
- if (addr >= DTCMBase && addr < (DTCMBase + DTCMSize))
+ if ((addr & DTCMMask) == DTCMBase)
{
DataCycles = 1;
- *val = *(u16*)&DTCM[(addr - DTCMBase) & (DTCMPhysicalSize - 1)];
+ *val = *(u16*)&DTCM[addr & (DTCMPhysicalSize - 1)];
return;
}
@@ -826,10 +831,10 @@ void ARMv5::DataRead32(u32 addr, u32* val)
*val = *(u32*)&ITCM[addr & (ITCMPhysicalSize - 1)];
return;
}
- if (addr >= DTCMBase && addr < (DTCMBase + DTCMSize))
+ if ((addr & DTCMMask) == DTCMBase)
{
DataCycles = 1;
- *val = *(u32*)&DTCM[(addr - DTCMBase) & (DTCMPhysicalSize - 1)];
+ *val = *(u32*)&DTCM[addr & (DTCMPhysicalSize - 1)];
return;
}
@@ -847,10 +852,10 @@ void ARMv5::DataRead32S(u32 addr, u32* val)
*val = *(u32*)&ITCM[addr & (ITCMPhysicalSize - 1)];
return;
}
- if (addr >= DTCMBase && addr < (DTCMBase + DTCMSize))
+ if ((addr & DTCMMask) == DTCMBase)
{
DataCycles += 1;
- *val = *(u32*)&DTCM[(addr - DTCMBase) & (DTCMPhysicalSize - 1)];
+ *val = *(u32*)&DTCM[addr & (DTCMPhysicalSize - 1)];
return;
}
@@ -871,10 +876,10 @@ void ARMv5::DataWrite8(u32 addr, u8 val)
#endif
return;
}
- if (addr >= DTCMBase && addr < (DTCMBase + DTCMSize))
+ if ((addr & DTCMMask) == DTCMBase)
{
DataCycles = 1;
- *(u8*)&DTCM[(addr - DTCMBase) & (DTCMPhysicalSize - 1)] = val;
+ *(u8*)&DTCM[addr & (DTCMPhysicalSize - 1)] = val;
return;
}
@@ -897,10 +902,10 @@ void ARMv5::DataWrite16(u32 addr, u16 val)
#endif
return;
}
- if (addr >= DTCMBase && addr < (DTCMBase + DTCMSize))
+ if ((addr & DTCMMask) == DTCMBase)
{
DataCycles = 1;
- *(u16*)&DTCM[(addr - DTCMBase) & (DTCMPhysicalSize - 1)] = val;
+ *(u16*)&DTCM[addr & (DTCMPhysicalSize - 1)] = val;
return;
}
@@ -929,10 +934,10 @@ void ARMv5::DataWrite32(u32 addr, u32 val)
#endif
return;
}
- if (addr >= DTCMBase && addr < (DTCMBase + DTCMSize))
+ if ((addr & DTCMMask) == DTCMBase)
{
DataCycles = 1;
- *(u32*)&DTCM[(addr - DTCMBase) & (DTCMPhysicalSize - 1)] = val;
+ *(u32*)&DTCM[addr & (DTCMPhysicalSize - 1)] = val;
return;
}
@@ -953,10 +958,10 @@ void ARMv5::DataWrite32S(u32 addr, u32 val)
#endif
return;
}
- if (addr >= DTCMBase && addr < (DTCMBase + DTCMSize))
+ if ((addr & DTCMMask) == DTCMBase)
{
DataCycles += 1;
- *(u32*)&DTCM[(addr - DTCMBase) & (DTCMPhysicalSize - 1)] = val;
+ *(u32*)&DTCM[addr & (DTCMPhysicalSize - 1)] = val;
return;
}