mirror of
https://github.com/melonDS-emu/melonDS.git
synced 2025-07-26 15:50:00 -06:00
rewrite JIT memory emulation
This commit is contained in:
65
src/ARMJIT.h
65
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 InvalidateITCM(u32 addr);
|
||||
void InvalidateByAddr7(u32 addr);
|
||||
void InvalidateByAddr(u32 pseudoPhysical);
|
||||
|
||||
void InvalidateRegionIfNecessary(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);
|
||||
|
Reference in New Issue
Block a user