cpclib_asm/assembler/support/
sna.rs1use 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(); 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 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}