summaryrefslogtreecommitdiff
path: root/src/devices
diff options
context:
space:
mode:
authorBen Bridle <bridle.benjamin@gmail.com>2024-01-29 18:33:58 +1300
committerBen Bridle <bridle.benjamin@gmail.com>2024-01-31 07:37:54 +1300
commit30d2f099c9edf4f59fbbdd6686988ae7b0622ba2 (patch)
tree9c5661c8b623b398b15f0e6c6899f1f9d8bcbc44 /src/devices
parente4cdcf4f5082f90abd9e259ccc215ecbb1973ab5 (diff)
downloadbedrock-pc-30d2f099c9edf4f59fbbdd6686988ae7b0622ba2.zip
Prevent overflow errors on stream device pointers
The stream device pointers now use wrapping semantics in order to prevent overflow errors.
Diffstat (limited to 'src/devices')
-rw-r--r--src/devices/scratch.rs35
1 files changed, 19 insertions, 16 deletions
diff --git a/src/devices/scratch.rs b/src/devices/scratch.rs
index eea011b..950f87a 100644
--- a/src/devices/scratch.rs
+++ b/src/devices/scratch.rs
@@ -1,3 +1,10 @@
+macro_rules! then_inc {
+ ($v:expr) => {{
+ $v = $v.wrapping_add(1);
+ $v as usize
+ }};
+}
+
pub struct ScratchDevice {
memory: Vec<u8>,
pub max_capacity: u32,
@@ -17,38 +24,34 @@ impl ScratchDevice {
}
pub fn read_head_1(&mut self) -> u8 {
- let value = self.read_byte(self.pointer_1);
- self.pointer_1 += 1;
- return value;
+ let i = then_inc!(self.pointer_1);
+ self.read_byte(i)
}
pub fn read_head_2(&mut self) -> u8 {
- let value = self.read_byte(self.pointer_2);
- self.pointer_2 += 1;
- return value;
+ let i = then_inc!(self.pointer_2);
+ self.read_byte(i)
}
pub fn write_head_1(&mut self, value: u8) {
- self.write_byte(self.pointer_1, value);
- self.pointer_1 += 1;
+ let i = then_inc!(self.pointer_1);
+ self.write_byte(i, value);
}
pub fn write_head_2(&mut self, value: u8) {
- self.write_byte(self.pointer_2, value);
- self.pointer_2 += 1;
+ let i = then_inc!(self.pointer_2);
+ self.write_byte(i, value);
}
- fn read_byte(&self, pointer: u32) -> u8 {
- let pointer = pointer as usize;
- match self.memory.get(pointer) {
+ fn read_byte(&self, pointer: usize) -> u8 {
+ match self.memory.get(pointer as usize) {
Some(value) => *value,
None => 0,
}
}
- fn write_byte(&mut self, pointer: u32, value: u8) {
- if pointer < self.max_capacity {
- let pointer = pointer as usize;
+ fn write_byte(&mut self, pointer: usize, value: u8) {
+ if pointer < self.max_capacity as usize {
if pointer >= self.memory.len() {
self.memory.resize(pointer + 1, 0);
}