diff options
author | bunnei <ericbunnie@gmail.com> | 2014-04-05 06:01:07 +0200 |
---|---|---|
committer | bunnei <ericbunnie@gmail.com> | 2014-04-05 06:01:07 +0200 |
commit | 31abc42d3dd8ea6ba23b14afa276bae684d694ef (patch) | |
tree | 5bd30c1294b869ba75eb2491f9ba7a1ad5f6c68c /src/core/src/mem_map_funcs.cpp | |
parent | added hw module to interface h/w register reads/writes (diff) | |
download | yuzu-31abc42d3dd8ea6ba23b14afa276bae684d694ef.tar yuzu-31abc42d3dd8ea6ba23b14afa276bae684d694ef.tar.gz yuzu-31abc42d3dd8ea6ba23b14afa276bae684d694ef.tar.bz2 yuzu-31abc42d3dd8ea6ba23b14afa276bae684d694ef.tar.lz yuzu-31abc42d3dd8ea6ba23b14afa276bae684d694ef.tar.xz yuzu-31abc42d3dd8ea6ba23b14afa276bae684d694ef.tar.zst yuzu-31abc42d3dd8ea6ba23b14afa276bae684d694ef.zip |
Diffstat (limited to '')
-rw-r--r-- | src/core/src/mem_map_funcs.cpp | 18 |
1 files changed, 15 insertions, 3 deletions
diff --git a/src/core/src/mem_map_funcs.cpp b/src/core/src/mem_map_funcs.cpp index b000571e5..dc4c2381d 100644 --- a/src/core/src/mem_map_funcs.cpp +++ b/src/core/src/mem_map_funcs.cpp @@ -25,6 +25,7 @@ #include "common.h" #include "mem_map.h" +#include "hw/hw.h" namespace Memory { @@ -32,10 +33,15 @@ template <typename T> 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 @@ -60,8 +66,14 @@ inline void _Read(T &var, const u32 addr) { template <typename T> 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 |