pub struct ScratchDevice { memory: Vec, pub max_capacity: u32, pub pointer_1: u32, pub pointer_2: u32, } impl ScratchDevice { pub fn new() -> Self { Self { memory: Vec::new(), max_capacity: 16 * 65536, pointer_1: 0, pointer_2: 0, } } pub fn read_head_1(&mut self) -> u8 { let value = self.read_byte(self.pointer_1); self.pointer_1 += 1; return value; } pub fn read_head_2(&mut self) -> u8 { let value = self.read_byte(self.pointer_2); self.pointer_2 += 1; return value; } pub fn write_head_1(&mut self, value: u8) { self.write_byte(self.pointer_1, value); self.pointer_1 += 1; } pub fn write_head_2(&mut self, value: u8) { self.write_byte(self.pointer_2, value); self.pointer_2 += 1; } fn read_byte(&self, pointer: u32) -> u8 { let pointer = pointer as usize; match self.memory.get(pointer) { Some(value) => *value, None => 0, } } fn write_byte(&mut self, pointer: u32, value: u8) { if pointer < self.max_capacity { let pointer = pointer as usize; if pointer >= self.memory.len() { self.memory.resize(pointer + 1, 0); } self.memory[pointer] = value; } } }