summaryrefslogtreecommitdiff
path: root/src/memory.rs
diff options
context:
space:
mode:
authorBen Bridle <bridle.benjamin@gmail.com>2023-12-24 19:54:50 +1300
committerBen Bridle <bridle.benjamin@gmail.com>2023-12-24 19:54:50 +1300
commit2b16a99ba3d1ba6536a1db28471288a0c2274a71 (patch)
tree7df2fc16f6cf81a4d7c313a6c65e53183c721d9d /src/memory.rs
downloadbedrock-core-2b16a99ba3d1ba6536a1db28471288a0c2274a71.zip
First commitv1.0.0
Diffstat (limited to 'src/memory.rs')
-rw-r--r--src/memory.rs62
1 files changed, 62 insertions, 0 deletions
diff --git a/src/memory.rs b/src/memory.rs
new file mode 100644
index 0000000..755c4bc
--- /dev/null
+++ b/src/memory.rs
@@ -0,0 +1,62 @@
+pub struct Memory {
+ pub mem: [u8; 65536],
+ pub pc: u16,
+}
+
+impl Memory {
+ pub fn new() -> Self {
+ Self {
+ mem: [0; 65536],
+ pc: 0,
+ }
+ }
+
+ pub fn load_program(&mut self, bytecode: &[u8]) {
+ self.mem[..bytecode.len()].copy_from_slice(bytecode)
+ }
+
+ pub fn read_u8(&self, addr: u16) -> u8 {
+ self.mem[addr as usize]
+ }
+
+ pub fn write_u8(&mut self, val: u8, addr: u16) {
+ self.mem[addr as usize] = val;
+ }
+
+ pub fn read_u8_next(&mut self) -> u8 {
+ let byte = self.mem[self.pc as usize];
+ self.pc = self.pc.wrapping_add(1);
+ byte
+ }
+
+ pub fn read_u16(&self, addr: u16) -> u16 {
+ let byte_high = self.read_u8(addr);
+ let byte_low = self.read_u8(addr.wrapping_add(1));
+ u16::from_be_bytes([byte_high, byte_low])
+ }
+
+ pub fn write_u16(&mut self, val: u16, addr: u16) {
+ let [byte_high, byte_low] = val.to_be_bytes();
+ self.write_u8(byte_high, addr);
+ self.write_u8(byte_low, addr.wrapping_add(1));
+ }
+
+ pub fn read_u16_next(&mut self) -> u16 {
+ let byte_high = self.read_u8_next();
+ let byte_low = self.read_u8_next();
+ u16::from_be_bytes([byte_high, byte_low])
+ }
+
+ pub fn read_pc(&self) -> u16 {
+ self.pc
+ }
+
+ pub fn write_pc(&mut self, val: u16) {
+ self.pc = val;
+ }
+
+ pub fn reset(&mut self) {
+ self.mem.fill(0);
+ self.pc = 0;
+ }
+}