1use crate::{Block, Error, Result, CARD_SIZE, FRAME_COUNT, FRAME_SIZE};
9
10#[repr(C)]
16pub struct RamCard {
17 bytes: [u8; CARD_SIZE],
18}
19
20impl RamCard {
21 pub const fn new() -> Self {
24 RamCard {
25 bytes: [0u8; CARD_SIZE],
26 }
27 }
28
29 pub fn from_image(image: &[u8]) -> Result<Self> {
31 if image.len() != CARD_SIZE {
32 return Err(Error::OutOfRange);
33 }
34 let mut c = RamCard::new();
35 c.bytes.copy_from_slice(image);
36 Ok(c)
37 }
38
39 pub fn image(&self) -> &[u8; CARD_SIZE] {
41 &self.bytes
42 }
43}
44
45impl Default for RamCard {
46 fn default() -> Self {
47 Self::new()
48 }
49}
50
51impl Block for RamCard {
52 fn read_frame(&mut self, frame: u16, out: &mut [u8; FRAME_SIZE]) -> Result<()> {
53 let f = frame as usize;
54 if f >= FRAME_COUNT {
55 return Err(Error::OutOfRange);
56 }
57 let base = f * FRAME_SIZE;
58 out.copy_from_slice(&self.bytes[base..base + FRAME_SIZE]);
59 Ok(())
60 }
61
62 fn write_frame(&mut self, frame: u16, data: &[u8; FRAME_SIZE]) -> Result<()> {
63 let f = frame as usize;
64 if f >= FRAME_COUNT {
65 return Err(Error::OutOfRange);
66 }
67 let base = f * FRAME_SIZE;
68 self.bytes[base..base + FRAME_SIZE].copy_from_slice(data);
69 Ok(())
70 }
71}