From b3efd0363d58aca398023261ca9c0db9e5b41d53 Mon Sep 17 00:00:00 2001 From: Daniel Bauer Date: Wed, 22 Jan 2020 10:20:29 +0100 Subject: [PATCH] restructureing --- src/nes/ppubus.rs | 88 ++++++++++++++++++++++++++--------------------- 1 file changed, 48 insertions(+), 40 deletions(-) diff --git a/src/nes/ppubus.rs b/src/nes/ppubus.rs index 4bd90a6..a015206 100644 --- a/src/nes/ppubus.rs +++ b/src/nes/ppubus.rs @@ -31,19 +31,49 @@ impl PPUBus { pub fn insert_cartridge(&mut self, c: Rc>) { self.cartridge = Some(c); } + + // map palette addr to internal memory array index + fn map_palette_addr(&self, addr: Addr) -> usize { + let mut rel_addr = addr - 0x3F00; + rel_addr = rel_addr % 0x0020; + if rel_addr == 0x0010 { rel_addr = 0x0000 } + if rel_addr == 0x0014 { rel_addr = 0x0004 } + if rel_addr == 0x0018 { rel_addr = 0x0008 } + if rel_addr == 0x001C { rel_addr = 0x000C } + rel_addr as usize + } + + // maps a pattern table address to the index of the internal array + fn map_pattern_table_addr(&self, addr: Addr) -> (usize, usize) { + let table = if addr < 0x1000 { 0 } else { 1 }; + let rel_addr = addr % 0x1000; + (table as usize, rel_addr as usize) + } + + // maps a nametable address to the corresponding index in the memory + // array + fn map_nametable_addr(&self, addr: Addr) -> (usize, usize) { + let table = if addr < 0x2400 { + 0 + } else if addr < 0x2800 { + 1 + } else if addr < 0x2C00 { + 2 + } else { + 3 + }; + let rel_addr = (addr - 0x2000) % 0x400; + + (table as usize, rel_addr as usize) + } } impl PPUMemory for PPUBus { fn readb_ppu(&self, addr: Addr) -> Byte { // Palette is never mapped to cartridge if PALETTE_ADDR_RANGE[0] <= addr && addr <= PALETTE_ADDR_RANGE[1] { - let mut rel_addr = addr - 0x3F00; - rel_addr = rel_addr % 0x0020; - if rel_addr == 0x0010 { rel_addr = 0x0000 } - if rel_addr == 0x0014 { rel_addr = 0x0004 } - if rel_addr == 0x0018 { rel_addr = 0x0008 } - if rel_addr == 0x001C { rel_addr = 0x000C } - return self.palette_memory[(rel_addr) as usize] + let idx = self.map_palette_addr(addr); + return self.palette_memory[idx] } // give the cartridge a chance to handle the rest @@ -54,35 +84,22 @@ impl PPUMemory for PPUBus { } if PATTERN_ADDR_RANGE[0] <= addr && addr <= PATTERN_ADDR_RANGE[1] { - let table = if addr < 0x1000 { 0 } else { 1 }; - return self.pattern_memory[table as usize][(addr % 0x1000) as usize] + let idx = self.map_pattern_table_addr(addr); + return self.pattern_memory[idx.0][idx.1] } if NAMETABLE_ADDR_RANGE[0] <= addr && addr <= NAMETABLE_ADDR_RANGE[1] { - let table = if addr < 0x2400 { - 0 - } else if addr < 0x2800 { - 1 - } else if addr < 0x2C00 { - 2 - } else { - 3 - }; - let rel_addr = addr - 0x2000; - return self.nametable_memory[table][(rel_addr % 0x400) as usize] + let idx = &self.map_nametable_addr(addr); + return self.nametable_memory[idx.0][idx.1] } 0x00 } + fn writeb_ppu(&mut self, addr: Addr, data: Byte) { // Palette is never mapped to cartridge if PALETTE_ADDR_RANGE[0] <= addr && addr <= PALETTE_ADDR_RANGE[1] { - let mut rel_addr = addr - 0x3F00; - rel_addr = rel_addr % 0x0020; - if rel_addr == 0x0010 { rel_addr = 0x0000 } - if rel_addr == 0x0014 { rel_addr = 0x0004 } - if rel_addr == 0x0018 { rel_addr = 0x0008 } - if rel_addr == 0x001C { rel_addr = 0x000C } - self.palette_memory[(rel_addr % 0x0020) as usize] = data; + let idx = self.map_palette_addr(addr); + self.palette_memory[idx] = data; } // give the cartridge a chance to handle the rest @@ -93,21 +110,12 @@ impl PPUMemory for PPUBus { } if PATTERN_ADDR_RANGE[0] <= addr && addr <= PATTERN_ADDR_RANGE[1] { - let table = if addr < 0x1000 { 0 } else { 1 }; - self.pattern_memory[table as usize][(addr % 0x1000) as usize] = data; + let idx = self.map_pattern_table_addr(addr); + self.pattern_memory[idx.0][idx.1] = data; } if NAMETABLE_ADDR_RANGE[0] <= addr && addr <= NAMETABLE_ADDR_RANGE[1] { - let table = if addr < 0x2400 { - 0 - } else if addr < 0x2800 { - 1 - } else if addr < 0x2C00 { - 2 - } else { - 3 - }; - let rel_addr = addr - 0x2000; - self.nametable_memory[table][(rel_addr % 0x400) as usize] = data; + let idx = &self.map_nametable_addr(addr); + self.nametable_memory[idx.0][idx.1] = data; } } }