armv4t_emu/
example_mem.rs

1use std::collections::BTreeMap;
2
3#[cfg(feature = "serde")]
4use serde::{Deserialize, Serialize};
5
6use crate::Memory;
7
8/// Example memory device backed by a BTreeMap<u32, u8>.
9///
10/// Uninitialized memory returns 0x00.
11#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
12#[derive(Default)]
13pub struct ExampleMem(BTreeMap<u32, u8>);
14
15impl ExampleMem {
16    /// Constructs a new, empty ExampleMem.
17    pub fn new() -> ExampleMem {
18        ExampleMem(BTreeMap::new())
19    }
20
21    /// Constructs a new ExampleMem from the provided slice. Data is copied
22    /// contiguously from the slice into address [0..data.len()]
23    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}