armv4t_emu/
example_mem.rs1use std::collections::BTreeMap;
2
3#[cfg(feature = "serde")]
4use serde::{Deserialize, Serialize};
5
6use crate::Memory;
7
8#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
12#[derive(Default)]
13pub struct ExampleMem(BTreeMap<u32, u8>);
14
15impl ExampleMem {
16 pub fn new() -> ExampleMem {
18 ExampleMem(BTreeMap::new())
19 }
20
21 pub fn new_with_data(data: &[u8]) -> ExampleMem {
24 ExampleMem(
25 data.iter()
26 .cloned()
27 .enumerate()
28 .map(|(i, b)| (i as u32, b))
29 .collect(),
30 )
31 }
32}
33
34impl Memory for ExampleMem {
35 fn r8(&mut self, addr: u32) -> u8 {
36 *self.0.get(&addr).unwrap_or(&0)
37 }
38
39 fn r16(&mut self, addr: u32) -> u16 {
40 self.r8(addr) as u16 | (self.r8(addr + 1) as u16) << 8
41 }
42
43 fn r32(&mut self, addr: u32) -> u32 {
44 self.r16(addr) as u32 | (self.r16(addr + 2) as u32) << 16
45 }
46
47 fn w8(&mut self, addr: u32, val: u8) {
48 self.0.insert(addr, val);
49 }
50
51 fn w16(&mut self, addr: u32, val: u16) {
52 self.w8(addr, val as u8);
53 self.w8(addr + 1, (val >> 8) as u8);
54 }
55
56 fn w32(&mut self, addr: u32, val: u32) {
57 self.w16(addr, val as u16);
58 self.w16(addr + 2, (val >> 16) as u16);
59 }
60}