aboutsummaryrefslogtreecommitdiff
path: root/src/ARMJIT.h
diff options
context:
space:
mode:
authorRSDuck <rsduck@users.noreply.github.com>2020-05-09 00:45:05 +0200
committerRSDuck <rsduck@users.noreply.github.com>2020-05-09 00:45:05 +0200
commit0f53a34551d60964345debb1766f81ca4686eb17 (patch)
treec3d004adff258e1060e72076e829c99cd49b368c /src/ARMJIT.h
parentbcc4b5c8dda5ec91127808a525e2b7dbda41a4f3 (diff)
rewrite JIT memory emulation
Diffstat (limited to 'src/ARMJIT.h')
-rw-r--r--src/ARMJIT.h65
1 files changed, 40 insertions, 25 deletions
diff --git a/src/ARMJIT.h b/src/ARMJIT.h
index cab385f..44a6140 100644
--- a/src/ARMJIT.h
+++ b/src/ARMJIT.h
@@ -28,45 +28,60 @@ extern const u32 ExeMemRegionSizes[];
typedef u32 (*JitBlockEntry)();
-extern u32 AddrTranslate9[0x2000];
-extern u32 AddrTranslate7[0x4000];
-
const u32 ExeMemSpaceSize = 0x518000; // I hate you C++, sometimes I really hate you...
-template <u32 num>
-inline bool IsMapped(u32 addr)
-{
- if (num == 0)
- return AddrTranslate9[(addr & 0xFFFFFFF) >> 15] >= ExeMemRegionSizes[exeMem_Unmapped];
- else
- return AddrTranslate7[(addr & 0xFFFFFFF) >> 14] >= ExeMemRegionSizes[exeMem_Unmapped];
-}
-
-template <u32 num>
-inline u32 TranslateAddr(u32 addr)
-{
- if (num == 0)
- return AddrTranslate9[(addr & 0xFFFFFFF) >> 15] + (addr & 0x7FFF);
- else
- return AddrTranslate7[(addr & 0xFFFFFFF) >> 14] + (addr & 0x3FFF);
-}
+u32 TranslateAddr9(u32 addr);
+u32 TranslateAddr7(u32 addr);
+template <u32 Num>
JitBlockEntry LookUpBlockEntry(u32 addr);
-
void Init();
void DeInit();
-void InvalidateByAddr(u32 pseudoPhysical, bool mayRestore = true);
-void InvalidateAll();
+void Reset();
+
+void InvalidateByAddr(u32 pseudoPhysical);
+
+void InvalidateRegionIfNecessary(u32 addr);
-void InvalidateITCM(u32 addr);
-void InvalidateByAddr7(u32 addr);
+inline void InvalidateMainRAMIfNecessary(u32 addr)
+{
+ InvalidateRegionIfNecessary(ExeMemRegionOffsets[exeMem_MainRAM] + (addr & (MAIN_RAM_SIZE - 1)));
+}
+inline void InvalidateITCMIfNecessary(u32 addr)
+{
+ InvalidateRegionIfNecessary(ExeMemRegionOffsets[exeMem_ITCM] + (addr & 0x7FFF));
+}
+inline void InvalidateLCDCIfNecessary(u32 addr)
+{
+ if (addr < 0x68A3FFF)
+ InvalidateRegionIfNecessary(ExeMemRegionOffsets[exeMem_LCDC] + (addr - 0x6800000));
+}
+inline void InvalidateSWRAM7IfNecessary(u32 addr)
+{
+ InvalidateRegionIfNecessary(ExeMemRegionOffsets[exeMem_SWRAM] + (NDS::SWRAM_ARM7 - NDS::SharedWRAM) + (addr & NDS::SWRAM_ARM7Mask));
+}
+inline void InvalidateSWRAM9IfNecessary(u32 addr)
+{
+ InvalidateRegionIfNecessary(ExeMemRegionOffsets[exeMem_SWRAM] + (NDS::SWRAM_ARM9 - NDS::SharedWRAM) + (addr & NDS::SWRAM_ARM9Mask));
+}
+inline void InvalidateARM7WRAMIfNecessary(u32 addr)
+{
+ InvalidateRegionIfNecessary(ExeMemRegionOffsets[exeMem_ARM7_WRAM] + (addr & 0xFFFF));
+}
+inline void InvalidateARM7WVRAMIfNecessary(u32 addr)
+{
+ InvalidateRegionIfNecessary(ExeMemRegionOffsets[exeMem_ARM7_WVRAM] + (addr & 0x1FFFF));
+}
void CompileBlock(ARM* cpu);
void ResetBlockCache();
+void UpdateMemoryStatus9(u32 start, u32 end);
+void UpdateMemoryStatus7(u32 start, u32 end);
+
}
extern "C" void ARM_Dispatch(ARM* cpu, ARMJIT::JitBlockEntry entry);