brawllib_rs/
wii_memory.rs

1use byteorder::{BigEndian, ByteOrder};
2use fancy_slice::FancySlice;
3
4pub struct WiiMemory {
5    mem1: Vec<u8>,
6    mem2: Vec<u8>,
7}
8
9impl Default for WiiMemory {
10    fn default() -> Self {
11        Self::new()
12    }
13}
14
15impl WiiMemory {
16    pub fn new() -> Self {
17        WiiMemory {
18            mem1: vec![0; 0x180_0000],
19            mem2: vec![0; 0x400_0000],
20        }
21    }
22
23    pub fn write_u8(&mut self, address: usize, value: u8) {
24        if (0x8000_0000..0x8180_0000).contains(&address) {
25            self.mem1[address - 0x8000_0000] = value;
26        } else if (0x9000_0000..0x9400_0000).contains(&address) {
27            self.mem2[address - 0x9000_0000] = value;
28        } else {
29            error!(
30                "Failed to write value: 0x{:x} Cannot map address 0x{:x} to wii memory",
31                value, address
32            );
33        }
34    }
35
36    pub fn write_u16(&mut self, address: usize, value: u16) {
37        if (0x8000_0000..0x8180_0000).contains(&address) {
38            BigEndian::write_u16(&mut self.mem1[address - 0x8000_0000..], value);
39        } else if (0x9000_0000..0x9400_0000).contains(&address) {
40            BigEndian::write_u16(&mut self.mem2[address - 0x9000_0000..], value);
41        } else {
42            error!(
43                "Failed to write value: 0x{:x} Cannot map address 0x{:x} to wii memory",
44                value, address
45            );
46        }
47    }
48
49    pub fn write_u32(&mut self, address: usize, value: u32) {
50        if (0x8000_0000..0x8180_0000).contains(&address) {
51            BigEndian::write_u32(&mut self.mem1[address - 0x8000_0000..], value);
52        } else if (0x9000_0000..0x9400_0000).contains(&address) {
53            BigEndian::write_u32(&mut self.mem2[address - 0x9000_0000..], value);
54        } else {
55            error!(
56                "Failed to write value: 0x{:x} Cannot map address 0x{:x} to wii memory",
57                value, address
58            );
59        }
60    }
61
62    pub fn read_u8(&self, address: usize) -> u8 {
63        if (0x8000_0000..0x8180_0000).contains(&address) {
64            self.mem1[address - 0x8000_0000]
65        } else if (0x9000_0000..0x9400_0000).contains(&address) {
66            self.mem2[address - 0x9000_0000]
67        } else {
68            error!(
69                "Failed to read value: Cannot map address 0x{:x} to wii memory",
70                address
71            );
72            0
73        }
74    }
75
76    pub fn read_u16(&self, address: usize) -> u16 {
77        if (0x8000_0000..0x8180_0000).contains(&address) {
78            BigEndian::read_u16(&self.mem1[address - 0x8000_0000..])
79        } else if (0x9000_0000..0x9400_0000).contains(&address) {
80            BigEndian::read_u16(&self.mem2[address - 0x9000_0000..])
81        } else {
82            error!(
83                "Failed to read value: Cannot map address 0x{:x} to wii memory",
84                address
85            );
86            0
87        }
88    }
89
90    pub fn read_u32(&self, address: usize) -> u32 {
91        if (0x8000_0000..0x8180_0000).contains(&address) {
92            BigEndian::read_u32(&self.mem1[address - 0x8000_0000..])
93        } else if (0x9000_0000..0x9400_0000).contains(&address) {
94            BigEndian::read_u32(&self.mem2[address - 0x9000_0000..])
95        } else {
96            error!(
97                "Failed to read value: Cannot map address 0x{:x} to wii memory",
98                address
99            );
100            0
101        }
102    }
103
104    pub fn read_f32(&self, address: usize) -> f32 {
105        if (0x8000_0000..0x8180_0000).contains(&address) {
106            BigEndian::read_f32(&self.mem1[address - 0x8000_0000..])
107        } else if (0x9000_0000..0x9400_0000).contains(&address) {
108            BigEndian::read_f32(&self.mem2[address - 0x9000_0000..])
109        } else {
110            error!(
111                "Failed to read value: Cannot map address 0x{:x} to wii memory",
112                address
113            );
114            0.0
115        }
116    }
117
118    pub fn buffer_from(&self, address: usize) -> &[u8] {
119        if (0x8000_0000..0x8180_0000).contains(&address) {
120            &self.mem1[address - 0x8000_0000..]
121        } else if (0x9000_0000..0x9400_0000).contains(&address) {
122            &self.mem2[address - 0x9000_0000..]
123        } else {
124            error!(
125                "Failed to get buffer: Cannot map address 0x{:x} to wii memory",
126                address
127            );
128            &[]
129        }
130    }
131    pub fn fancy_slice_from(&self, address: usize) -> FancySlice<'_> {
132        let slice = if (0x8000_0000..0x8180_0000).contains(&address) {
133            &self.mem1[address - 0x8000_0000..]
134        } else if (0x9000_0000..0x9400_0000).contains(&address) {
135            &self.mem2[address - 0x9000_0000..]
136        } else {
137            error!(
138                "Failed to get buffer: Cannot map address 0x{:x} to wii memory",
139                address
140            );
141            &[]
142        };
143        FancySlice::new(slice)
144    }
145}