diff --git a/snes-core/src/cpu/bus.rs b/snes-core/src/cpu/bus.rs index 1870a0c..018d09d 100644 --- a/snes-core/src/cpu/bus.rs +++ b/snes-core/src/cpu/bus.rs @@ -49,7 +49,7 @@ impl Bus { 0x0000..=0x1FFF => MemoryMap::WRAM, 0x2100..=0x21FF => MemoryMap::PPU, 0x4016..=0x4017 => MemoryMap::Joypad, - 0x4200..=0x420F => MemoryMap::CPU, + 0x4200..=0x42FF => MemoryMap::CPU, _ => MemoryMap::Cartridge, }, _ => MemoryMap::Cartridge, diff --git a/snes-core/src/cpu/internal_registers.rs b/snes-core/src/cpu/internal_registers.rs index c7c745c..a92463b 100644 --- a/snes-core/src/cpu/internal_registers.rs +++ b/snes-core/src/cpu/internal_registers.rs @@ -16,12 +16,23 @@ impl InternalRegisters { } } + fn get_index(address: u16) -> usize { + (address - INTERNAL_REGISTERS_ADDRESS) as usize + } + fn _read(&self, address: u16) -> u8 { - self.registers[(address - INTERNAL_REGISTERS_ADDRESS) as usize] + let index = InternalRegisters::get_index(address); + if index >= self.registers.len() { + return 0xFF; + } + self.registers[index] } fn _write(&mut self, address: u16, value: u8) { - self.registers[(address - INTERNAL_REGISTERS_ADDRESS) as usize] = value + let index = InternalRegisters::get_index(address); + if index < self.registers.len() { + self.registers[index] = value + } } pub fn read_external(&self, address: u16, ppu_registers: &PPURegisters) -> u8 { @@ -73,7 +84,7 @@ mod ppu_general_test { ppu.registers.h_count = 339; ppu.registers.v_count = 224; ppu.dot_cycle(); - assert_eq!(registers.read_vblank_nmi(&mut ppu.registers), 0x80); + assert_eq!(registers.read_vblank_nmi_mut(&mut ppu.registers), 0x80); // vblank bit is reset after read ppu.dot_cycle(); assert_eq!(registers.read_vblank_nmi(&mut ppu.registers), 0x00); diff --git a/snes-core/src/ppu/registers.rs b/snes-core/src/ppu/registers.rs index 2f9b471..5bfef49 100644 --- a/snes-core/src/ppu/registers.rs +++ b/snes-core/src/ppu/registers.rs @@ -378,7 +378,7 @@ impl PPURegisters { } pub fn is_vblanking(&self) -> bool { - if self.h_count >= 1 && self.h_count <= 224 { + if self.v_count >= 1 && self.v_count <= 224 { return false } return true @@ -577,17 +577,17 @@ mod ppu_registers_test { #[test] fn test_is_vblanking() { let mut registers = PPURegisters::new(); - registers.h_count = 339; + registers.v_count = 339; assert_eq!(registers.is_vblanking(), true); - registers.h_count = 0; + registers.v_count = 0; assert_eq!(registers.is_vblanking(), true); - registers.h_count = 225; + registers.v_count = 225; assert_eq!(registers.is_vblanking(), true); - registers.h_count = 224; + registers.v_count = 224; assert_eq!(registers.is_vblanking(), false); - registers.h_count = 2; + registers.v_count = 2; assert_eq!(registers.is_vblanking(), false); - registers.h_count = 50; + registers.v_count = 50; assert_eq!(registers.is_vblanking(), false); } } diff --git a/snes-frontend/src/ppu.rs b/snes-frontend/src/ppu.rs index a5c4f1f..93692c3 100644 --- a/snes-frontend/src/ppu.rs +++ b/snes-frontend/src/ppu.rs @@ -155,6 +155,7 @@ pub fn registers_window(ppu_registers: &PPURegisters, show_registers: &mut bool, ui.text(format!("V: {}", ppu_registers.v_count)); ui.text(format!("H: {}", ppu_registers.h_count)); ui.text(format!("VBlanking: {}", ppu_registers.is_vblanking())); + ui.text(format!("NMI Flag: {}", ppu_registers.vblank_nmi)); ui.separator(); ui.text("Registers:"); for (index, register_value) in ppu_registers.registers().iter().enumerate() {