diff options
Diffstat (limited to 'src/devices/scratch.rs')
-rw-r--r-- | src/devices/scratch.rs | 58 |
1 files changed, 58 insertions, 0 deletions
diff --git a/src/devices/scratch.rs b/src/devices/scratch.rs new file mode 100644 index 0000000..eea011b --- /dev/null +++ b/src/devices/scratch.rs @@ -0,0 +1,58 @@ +pub struct ScratchDevice { + memory: Vec<u8>, + 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; + } + } +} |