Skip to main content

gcrecomp_runtime/memory/
mapper.rs

1// Memory mapping and address translation
2use anyhow::Result;
3
4pub struct MemoryMapper {
5    // Maps virtual addresses to physical memory regions
6}
7
8impl MemoryMapper {
9    pub fn new() -> Self {
10        Self {}
11    }
12
13    pub fn translate_address(&self, virtual_addr: u32) -> Result<MemoryRegion> {
14        // GameCube memory map
15        match virtual_addr {
16            0x80000000..=0x817FFFFF => {
17                // Main RAM (24MB, mirrored)
18                Ok(MemoryRegion::Ram((virtual_addr & 0x00FFFFFF) as u32))
19            }
20            0xCC000000..=0xCC1FFFFF => {
21                // Video RAM (2MB)
22                Ok(MemoryRegion::VRam((virtual_addr & 0x001FFFFF) as u32))
23            }
24            0x80000000..=0x80FFFFFF => {
25                // Audio RAM (16MB)
26                Ok(MemoryRegion::ARam((virtual_addr & 0x00FFFFFF) as u32))
27            }
28            _ => {
29                // I/O registers or unmapped
30                Ok(MemoryRegion::IO(virtual_addr))
31            }
32        }
33    }
34}
35
36#[derive(Debug, Clone, Copy)]
37pub enum MemoryRegion {
38    Ram(u32),  // Physical RAM address
39    VRam(u32), // Physical VRAM address
40    ARam(u32), // Physical ARAM address
41    IO(u32),   // I/O register address
42}