gcrecomp_runtime/memory/
vram.rs1use 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; 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; 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}