Skip to main content

gcrecomp_runtime/memory/
vram.rs

1// Video RAM simulation (2MB)
2use anyhow::Result;
3
4pub struct VRam {
5    data: Vec<u8>,
6    size: usize,
7}
8
9impl VRam {
10    pub fn new() -> Self {
11        const VRAM_SIZE: usize = 2 * 1024 * 1024; // 2MB
12        Self {
13            data: vec![0; VRAM_SIZE],
14            size: VRAM_SIZE,
15        }
16    }
17
18    pub fn read_u32(&self, address: u32) -> Result<u32> {
19        let addr = (address & 0x001FFFFF) as usize; // 21-bit addressing
20        if addr + 4 <= self.size {
21            Ok(u32::from_be_bytes([
22                self.data[addr],
23                self.data[addr + 1],
24                self.data[addr + 2],
25                self.data[addr + 3],
26            ]))
27        } else {
28            anyhow::bail!("VRAM read out of bounds: 0x{:08X}", address);
29        }
30    }
31
32    pub fn write_u32(&mut self, address: u32, value: u32) -> Result<()> {
33        let addr = (address & 0x001FFFFF) as usize;
34        if addr + 4 <= self.size {
35            let bytes = value.to_be_bytes();
36            self.data[addr..addr + 4].copy_from_slice(&bytes);
37            Ok(())
38        } else {
39            anyhow::bail!("VRAM write out of bounds: 0x{:08X}", address);
40        }
41    }
42
43    pub fn read_bytes(&self, address: u32, len: usize) -> Result<Vec<u8>> {
44        let addr = (address & 0x001FFFFF) as usize;
45        if addr + len <= self.size {
46            Ok(self.data[addr..addr + len].to_vec())
47        } else {
48            anyhow::bail!("VRAM read out of bounds: 0x{:08X} len {}", address, len);
49        }
50    }
51
52    pub fn write_bytes(&mut self, address: u32, data: &[u8]) -> Result<()> {
53        let addr = (address & 0x001FFFFF) as usize;
54        if addr + data.len() <= self.size {
55            self.data[addr..addr + data.len()].copy_from_slice(data);
56            Ok(())
57        } else {
58            anyhow::bail!(
59                "VRAM write out of bounds: 0x{:08X} len {}",
60                address,
61                data.len()
62            );
63        }
64    }
65}