cpclib_asm/assembler/support/
sna.rs

1use std::ops::{Deref, DerefMut};
2
3use cpclib_common::bitvec::vec::BitVec;
4use cpclib_sna::Snapshot;
5
6use crate::page_info::PageInformation;
7
8#[derive(Clone)]
9pub(crate) struct SnaAssembler {
10    pub(crate) sna: Snapshot,
11    pub(crate) pages_info: Vec<PageInformation>,
12    pub written_bytes: BitVec
13}
14
15impl Default for SnaAssembler {
16    fn default() -> Self {
17        let mut sna = Snapshot::default(); // Snapshot::new_6128().unwrap();
18        sna.unwrap_memory_chunks();
19
20        let nb_pages = (sna.memory_size_header() / 64) as usize;
21
22        let pages_info = vec![Default::default(); nb_pages];
23        let written_bytes = BitVec::repeat(false, 0x4000 * 4 * nb_pages);
24
25        SnaAssembler {
26            sna,
27            pages_info,
28            written_bytes
29        }
30    }
31}
32
33impl Deref for SnaAssembler {
34    type Target = Snapshot;
35
36    fn deref(&self) -> &Self::Target {
37        &self.sna
38    }
39}
40
41impl DerefMut for SnaAssembler {
42    fn deref_mut(&mut self) -> &mut Self::Target {
43        &mut self.sna
44    }
45}
46
47impl SnaAssembler {
48    pub fn resize(&mut self, nb_pages: usize) {
49        self.pages_info.resize(nb_pages, Default::default());
50        self.written_bytes.resize(nb_pages * 0x1_0000, false);
51        self.sna.resize(nb_pages);
52
53        debug_assert_eq!(nb_pages, self.pages_info.len());
54        debug_assert_eq!(self.sna.nb_pages(), self.pages_info.len());
55    }
56}
57
58impl SnaAssembler {
59    /// Write the byte in the snapshot  and save this information in written bytes
60    pub fn set_byte(&mut self, address: u32, byte: u8) {
61        self.deref_mut().set_byte(address, byte);
62        self.written_bytes.set(address as _, true);
63    }
64
65    pub fn reset_written_bytes(&mut self) {
66        self.written_bytes.fill(false);
67    }
68}