summaryrefslogtreecommitdiff
path: root/src/devices/scratch.rs
diff options
context:
space:
mode:
Diffstat (limited to 'src/devices/scratch.rs')
-rw-r--r--src/devices/scratch.rs58
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;
+ }
+ }
+}