diff options
-rw-r--r-- | src/devices.rs | 16 | ||||
-rw-r--r-- | src/devices/memory.rs | 62 | ||||
-rw-r--r-- | src/emulator.rs | 1 |
3 files changed, 40 insertions, 39 deletions
diff --git a/src/devices.rs b/src/devices.rs index b843aca..4ba29a8 100644 --- a/src/devices.rs +++ b/src/devices.rs @@ -102,8 +102,8 @@ impl DeviceBus for StandardDevices { 0x13 => read_l!(self.memory.address_1), 0x14 => self.memory.read_from_head_1(), 0x15 => self.memory.read_from_head_1(), - 0x16 => read_h!(self.memory.page_count()), - 0x17 => read_l!(self.memory.page_count()), + 0x16 => read_h!(self.memory.page_limit), + 0x17 => read_l!(self.memory.page_limit), 0x18 => read_h!(self.memory.page_2), 0x19 => read_l!(self.memory.page_2), 0x1A => read_h!(self.memory.address_2), @@ -247,16 +247,16 @@ impl DeviceBus for StandardDevices { 0x0E => no_write!(), 0x0F => no_write!(), // Memory - 0x10 => { write_h!(self.memory.page_1); self.memory.expand_memory() }, - 0x11 => { write_l!(self.memory.page_1); self.memory.expand_memory() }, + 0x10 => write_h!(self.memory.page_1), + 0x11 => write_l!(self.memory.page_1), 0x12 => write_h!(self.memory.address_1), 0x13 => write_l!(self.memory.address_1), 0x14 => self.memory.write_to_head_1(val), 0x15 => self.memory.write_to_head_1(val), - 0x16 => write_h!(self.memory.page_limit), - 0x17 => write_l!(self.memory.page_limit), - 0x18 => { write_h!(self.memory.page_2); self.memory.expand_memory() }, - 0x19 => { write_l!(self.memory.page_2); self.memory.expand_memory() }, + 0x16 => no_write!(), + 0x17 => no_write!(), + 0x18 => write_h!(self.memory.page_2), + 0x19 => write_l!(self.memory.page_2), 0x1A => write_h!(self.memory.address_2), 0x1B => write_l!(self.memory.address_2), 0x1C => self.memory.write_to_head_2(val), diff --git a/src/devices/memory.rs b/src/devices/memory.rs index 1d33f64..56125d2 100644 --- a/src/devices/memory.rs +++ b/src/devices/memory.rs @@ -5,8 +5,11 @@ fn new_blank_page() -> [u8; 65536] { [0; 65536] } pub struct MemoryDevice { - pages: Vec<Page>, + // Hard limit on the number of pages which can be allocated pub page_limit: u16, + // Pages which have actually been allocated + pub pages: Vec<Page>, + pub page_1: u16, pub address_1: u16, pub page_2: u16, @@ -17,8 +20,9 @@ pub struct MemoryDevice { impl MemoryDevice { pub fn new() -> Self { Self { - pages: Vec::new(), page_limit: 0, + pages: Vec::new(), + page_1: 0, address_1: 0, page_2: 0, @@ -27,31 +31,21 @@ impl MemoryDevice { } } - pub fn page_count(&self) -> u16 { - self.pages.len() as u16 - } - pub fn copy(&mut self) { - // Return if at least one page is out-of-bounds - if self.page_1 as usize >= self.pages.len() - || self.page_2 as usize >= self.pages.len() { - return - } - let p1 = self.page_1 as usize; - let p2 = self.page_2 as usize; - let a1 = self.address_1; - let a2 = self.address_2; - - for i in 0..=self.copy_length { - let byte = self.pages[p2][a2.wrapping_add(i) as usize]; - self.pages[p1][a1.wrapping_add(i) as usize] = byte; - } - } + let count = std::cmp::max(self.page_1, self.page_2) as usize + 1; + if count <= self.page_limit as usize { + if self.pages.len() < count { + self.pages.resize_with(count, new_blank_page); + } + let p1 = self.page_1 as usize; + let p2 = self.page_2 as usize; + let a1 = self.address_1; + let a2 = self.address_2; - pub fn expand_memory(&mut self) { - let size = std::cmp::max(self.page_1, self.page_2) as usize + 1; - if size < self.page_limit as usize { - self.pages.resize_with(size, new_blank_page); + for i in 0..=self.copy_length { + let byte = self.pages[p2][a2.wrapping_add(i) as usize]; + self.pages[p1][a1.wrapping_add(i) as usize] = byte; + } } } @@ -75,15 +69,23 @@ impl MemoryDevice { pub fn write_to_head_1(&mut self, byte: u8) { let address = then_inc!(self.address_1); - if let Some(page) = self.pages.get_mut(self.page_1 as usize) { - page[address] = byte; + let page = self.page_1 as usize; + if self.page_limit as usize > page { + if self.pages.len() <= page { + self.pages.resize_with(page + 1, new_blank_page); + } + self.pages[page][address] = byte; } } pub fn write_to_head_2(&mut self, byte: u8) { - let address = then_inc!(self.address_2); - if let Some(page) = self.pages.get_mut(self.page_2 as usize) { - page[address] = byte; + let address = then_inc!(self.address_1); + let page = self.page_2 as usize; + if self.page_limit as usize > page { + if self.pages.len() <= page { + self.pages.resize_with(page + 1, new_blank_page); + } + self.pages[page][address] = byte; } } } diff --git a/src/emulator.rs b/src/emulator.rs index 8649f26..e88e320 100644 --- a/src/emulator.rs +++ b/src/emulator.rs @@ -30,7 +30,6 @@ impl BedrockEmulator { let mut vm = Processor::new(StandardDevices::new()); vm.dev.screen.resize(ScreenDimensions::new(256, 192)); vm.dev.memory.page_limit = 256; - vm.dev.memory.expand_memory(); vm.load_program(bytecode); Self { |