diff options
Diffstat (limited to 'src/core/src/mem_map_funcs.cpp')
-rw-r--r-- | src/core/src/mem_map_funcs.cpp | 54 |
1 files changed, 36 insertions, 18 deletions
diff --git a/src/core/src/mem_map_funcs.cpp b/src/core/src/mem_map_funcs.cpp index 18959dc7..ee2f7927 100644 --- a/src/core/src/mem_map_funcs.cpp +++ b/src/core/src/mem_map_funcs.cpp @@ -25,17 +25,23 @@ #include "common.h" #include "mem_map.h" +#include "hw/hw.h" namespace Memory { template <typename T> -inline void ReadFromHardware(T &var, const u32 addr) { +inline void _Read(T &var, const u32 addr) { // TODO: Figure out the fastest order of tests for both read and write (they are probably different). // TODO: Make sure this represents the mirrors in a correct way. - // Could just do a base-relative read, too.... TODO - if ((addr & 0x3E000000) == 0x08000000) { + // Hardware I/O register reads + // 0x10XXXXXX- is physical address space, 0x1EXXXXXX is virtual address space + if ((addr & 0xFF000000) == 0x10000000 || (addr & 0xFF000000) == 0x1E000000) { + HW::Read<T>(var, addr); + + // FCRAM virtual address reads + } else if ((addr & 0x3E000000) == 0x08000000) { var = *((const T*)&g_fcram[addr & MEM_FCRAM_MASK]); // Scratchpad memory @@ -54,15 +60,20 @@ inline void ReadFromHardware(T &var, const u32 addr) { var = *((const T*)&g_fcram[addr & MEM_FCRAM_MASK]); } else { - _assert_msg_(MEMMAP, false, "unknown hardware read"); - // WARN_LOG(MEMMAP, "ReadFromHardware: Invalid addr %08x PC %08x LR %08x", addr, currentMIPS->pc, currentMIPS->r[MIPS_REG_RA]); + _assert_msg_(MEMMAP, false, "unknown memory read"); } } template <typename T> -inline void WriteToHardware(u32 addr, const T data) { +inline void _Write(u32 addr, const T data) { + + // Hardware I/O register writes + // 0x10XXXXXX- is physical address space, 0x1EXXXXXX is virtual address space + if ((addr & 0xFF000000) == 0x10000000 || (addr & 0xFF000000) == 0x1E000000) { + HW::Write<const T>(addr, data); + // ExeFS:/.code is loaded here: - if ((addr & 0xFFF00000) == 0x00100000) { + } else if ((addr & 0xFFF00000) == 0x00100000) { // TODO(ShizZy): This is dumb... handle correctly. From 3DBrew: // http://3dbrew.org/wiki/Memory_layout#ARM11_User-land_memory_regions // The ExeFS:/.code is loaded here, executables must be loaded to the 0x00100000 region when @@ -104,7 +115,7 @@ inline void WriteToHardware(u32 addr, const T data) { // Error out... } else { - _assert_msg_(MEMMAP, false, "unknown hardware write"); + _assert_msg_(MEMMAP, false, "unknown memory write"); } } @@ -126,14 +137,21 @@ u8 *GetPointer(const u32 addr) { // TODO(bunnei): Just a stub for now... ImplementMe! if ((addr & 0x3E000000) == 0x08000000) { return g_fcram + (addr & MEM_FCRAM_MASK); - } + + // HACK(bunnei): There is no layer yet to translate virtual addresses to physical addresses. + // Until we progress far enough along, we'll accept all physical address reads here. I think + // that this is typically a corner-case from usermode software unless they are trying to do + // bare-metal things (e.g. early 3DS homebrew writes directly to the FB @ 0x20184E60, etc. + } else if (((addr & 0xF0000000) == MEM_FCRAM_PADDR) && (addr < (MEM_FCRAM_PADDR_END))) { + return g_fcram + (addr & MEM_FCRAM_MASK); + //else if ((addr & 0x3F800000) == 0x04000000) { // return g_vram + (addr & MEM_VRAM_MASK); //} //else if ((addr & 0x3F000000) >= 0x08000000 && (addr & 0x3F000000) < 0x08000000 + g_MemorySize) { // return m_pRAM + (addr & g_MemoryMask); //} - else { + } else { //ERROR_LOG(MEMMAP, "Unknown GetPointer %08x PC %08x LR %08x", addr, currentMIPS->pc, currentMIPS->r[MIPS_REG_RA]); ERROR_LOG(MEMMAP, "Unknown GetPointer %08x", addr); static bool reported = false; @@ -151,25 +169,25 @@ u8 *GetPointer(const u32 addr) { u8 Read8(const u32 addr) { u8 _var = 0; - ReadFromHardware<u8>(_var, addr); + _Read<u8>(_var, addr); return (u8)_var; } u16 Read16(const u32 addr) { u16_le _var = 0; - ReadFromHardware<u16_le>(_var, addr); + _Read<u16_le>(_var, addr); return (u16)_var; } u32 Read32(const u32 addr) { u32_le _var = 0; - ReadFromHardware<u32_le>(_var, addr); + _Read<u32_le>(_var, addr); return _var; } u64 Read64(const u32 addr) { u64_le _var = 0; - ReadFromHardware<u64_le>(_var, addr); + _Read<u64_le>(_var, addr); return _var; } @@ -182,19 +200,19 @@ u32 Read16_ZX(const u32 addr) { } void Write8(const u32 addr, const u8 data) { - WriteToHardware<u8>(addr, data); + _Write<u8>(addr, data); } void Write16(const u32 addr, const u16 data) { - WriteToHardware<u16_le>(addr, data); + _Write<u16_le>(addr, data); } void Write32(const u32 addr, const u32 data) { - WriteToHardware<u32_le>(addr, data); + _Write<u32_le>(addr, data); } void Write64(const u32 addr, const u64 data) { - WriteToHardware<u64_le>(addr, data); + _Write<u64_le>(addr, data); } } // namespace |