diff options
Diffstat (limited to 'src/core/mem_map.h')
| -rw-r--r-- | src/core/mem_map.h | 73 |
1 files changed, 73 insertions, 0 deletions
diff --git a/src/core/mem_map.h b/src/core/mem_map.h new file mode 100644 index 000000000..ad5abd16d --- /dev/null +++ b/src/core/mem_map.h | |||
| @@ -0,0 +1,73 @@ | |||
| 1 | // Copyright 2014 Citra Emulator Project | ||
| 2 | // Licensed under GPLv2 | ||
| 3 | // Refer to the license.txt file included. | ||
| 4 | |||
| 5 | #pragma once | ||
| 6 | |||
| 7 | //////////////////////////////////////////////////////////////////////////////////////////////////// | ||
| 8 | |||
| 9 | #include "common.h" | ||
| 10 | #include "common_types.h" | ||
| 11 | |||
| 12 | //////////////////////////////////////////////////////////////////////////////////////////////////// | ||
| 13 | |||
| 14 | enum { | ||
| 15 | MEM_BOOTROM_SIZE = 0x00010000, ///< Bootrom (super secret code/data @ 0x8000) size | ||
| 16 | MEM_MPCORE_PRIV_SIZE = 0x00002000, ///< MPCore private memory region size | ||
| 17 | MEM_VRAM_SIZE = 0x00600000, ///< VRAM size | ||
| 18 | MEM_DSP_SIZE = 0x00080000, ///< DSP memory size | ||
| 19 | MEM_AXI_WRAM_SIZE = 0x00080000, ///< AXI WRAM size | ||
| 20 | MEM_FCRAM_SIZE = 0x08000000, ///< FCRAM size... Really 0x07E00000, but power of 2 | ||
| 21 | // works much better | ||
| 22 | MEM_SCRATCHPAD_SIZE = 0x00004000, ///< Typical stack size - TODO: Read from exheader | ||
| 23 | |||
| 24 | MEM_VRAM_MASK = 0x007FFFFF, | ||
| 25 | MEM_FCRAM_MASK = (MEM_FCRAM_SIZE - 1), ///< FCRAM mask | ||
| 26 | MEM_SCRATCHPAD_MASK = (MEM_SCRATCHPAD_SIZE - 1), ///< Scratchpad memory mask | ||
| 27 | |||
| 28 | MEM_FCRAM_PADDR = 0x20000000, ///< FCRAM physical address | ||
| 29 | MEM_FCRAM_PADDR_END = (MEM_FCRAM_PADDR + MEM_FCRAM_SIZE), ///< FCRAM end of physical space | ||
| 30 | MEM_FCRAM_VADDR = 0x08000000, ///< FCRAM virtual address | ||
| 31 | MEM_FCRAM_VADDR_END = (MEM_FCRAM_VADDR + MEM_FCRAM_SIZE), ///< FCRAM end of virtual space | ||
| 32 | |||
| 33 | MEM_VRAM_VADDR = 0x1F000000, | ||
| 34 | MEM_SCRATCHPAD_VADDR = (0x10000000 - MEM_SCRATCHPAD_SIZE), ///< Scratchpad virtual address | ||
| 35 | }; | ||
| 36 | |||
| 37 | //////////////////////////////////////////////////////////////////////////////////////////////////// | ||
| 38 | |||
| 39 | namespace Memory { | ||
| 40 | |||
| 41 | // Base is a pointer to the base of the memory map. Yes, some MMU tricks | ||
| 42 | // are used to set up a full GC or Wii memory map in process memory. on | ||
| 43 | // 32-bit, you have to mask your offsets with 0x3FFFFFFF. This means that | ||
| 44 | // some things are mirrored too many times, but eh... it works. | ||
| 45 | |||
| 46 | // In 64-bit, this might point to "high memory" (above the 32-bit limit), | ||
| 47 | // so be sure to load it into a 64-bit register. | ||
| 48 | extern u8 *g_base; | ||
| 49 | |||
| 50 | // These are guaranteed to point to "low memory" addresses (sub-32-bit). | ||
| 51 | // 64-bit: Pointers to low-mem (sub-0x10000000) mirror | ||
| 52 | // 32-bit: Same as the corresponding physical/virtual pointers. | ||
| 53 | extern u8* g_fcram; ///< Main memory | ||
| 54 | extern u8* g_vram; ///< Video memory (VRAM) | ||
| 55 | extern u8* g_scratchpad; ///< Stack memory | ||
| 56 | |||
| 57 | void Init(); | ||
| 58 | void Shutdown(); | ||
| 59 | |||
| 60 | u8 Read8(const u32 addr); | ||
| 61 | u16 Read16(const u32 addr); | ||
| 62 | u32 Read32(const u32 addr); | ||
| 63 | |||
| 64 | u32 Read8_ZX(const u32 addr); | ||
| 65 | u32 Read16_ZX(const u32 addr); | ||
| 66 | |||
| 67 | void Write8(const u32 addr, const u8 data); | ||
| 68 | void Write16(const u32 addr, const u16 data); | ||
| 69 | void Write32(const u32 addr, const u32 data); | ||
| 70 | |||
| 71 | u8* GetPointer(const u32 Address); | ||
| 72 | |||
| 73 | } // namespace | ||