From a8dac6e8051fb8f918f45431c4192148f99e1399 Mon Sep 17 00:00:00 2001 From: Sam M W Date: Mon, 3 Apr 2023 06:15:07 +0100 Subject: [PATCH] extract memory functionality into a trait --- README.md | 1 + examples/euclidean_algo.rs | 1 + examples/mos6502.rs | 1 + src/cpu.rs | 1 + src/instruction.rs | 1 + src/memory.rs | 19 ++++++++++++++++--- 6 files changed, 21 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index 7f7303c..bcd6c4d 100644 --- a/README.md +++ b/README.md @@ -20,6 +20,7 @@ Source: [Wikipedia](https://en.wikipedia.org/wiki/MOS_Technology_6502) ## How to use this library ```rust +use mos6502::memory::Bus; use mos6502::cpu; fn main() { diff --git a/examples/euclidean_algo.rs b/examples/euclidean_algo.rs index 0177362..446f5d2 100644 --- a/examples/euclidean_algo.rs +++ b/examples/euclidean_algo.rs @@ -1,6 +1,7 @@ extern crate mos6502; use mos6502::cpu; +use mos6502::memory::Bus; fn main() { println!("Enter two numbers (< 128) to know their GCD:"); diff --git a/examples/mos6502.rs b/examples/mos6502.rs index c71080c..26fa717 100644 --- a/examples/mos6502.rs +++ b/examples/mos6502.rs @@ -29,6 +29,7 @@ extern crate mos6502; #[cfg(not(test))] use mos6502::cpu; +use mos6502::memory::Bus; #[cfg(not(test))] fn main() { diff --git a/src/cpu.rs b/src/cpu.rs index 6de3598..43d05be 100644 --- a/src/cpu.rs +++ b/src/cpu.rs @@ -26,6 +26,7 @@ // POSSIBILITY OF SUCH DAMAGE. use crate::instruction::{self, DecodedInstr, Instruction, OpInput}; +use crate::memory::Bus; use crate::memory::Memory; use crate::registers::{Registers, StackPointer, Status, StatusArgs}; diff --git a/src/instruction.rs b/src/instruction.rs index b755d05..a2e6508 100644 --- a/src/instruction.rs +++ b/src/instruction.rs @@ -26,6 +26,7 @@ // POSSIBILITY OF SUCH DAMAGE. use crate::cpu::CPU; +use crate::memory::Bus; use crate::memory::Memory; // Abbreviations diff --git a/src/memory.rs b/src/memory.rs index c4f9535..7194de7 100644 --- a/src/memory.rs +++ b/src/memory.rs @@ -58,26 +58,39 @@ impl Default for Memory { } } +pub trait Bus { + fn get_byte(&self, address: u16) -> u8; + fn set_byte(&mut self, address: u16, value: u8) -> u8; + + fn set_bytes(&mut self, start: u16, values: &[u8]) { + for i in 0..values.len() as u16 { + self.set_byte(start + i, values[i as usize]); + } + } +} + impl Memory { pub fn new() -> Memory { Memory { bytes: [0; MEMORY_SIZE], } } +} - pub fn get_byte(&self, address: u16) -> u8 { +impl Bus for Memory { + fn get_byte(&self, address: u16) -> u8 { self.bytes[address as usize] } // Sets the byte at the given address to the given value and returns the // previous value at the address. - pub fn set_byte(&mut self, address: u16, value: u8) -> u8 { + fn set_byte(&mut self, address: u16, value: u8) -> u8 { let old_value = self.get_byte(address); self.bytes[address as usize] = value; old_value } - pub fn set_bytes(&mut self, start: u16, values: &[u8]) { + fn set_bytes(&mut self, start: u16, values: &[u8]) { let start = start as usize; // This panics if the range is invalid