From 300456a2ef9fdf8b2d6a33f15428e9e25bd079d7 Mon Sep 17 00:00:00 2001 From: Franco Colmenarez Date: Sun, 2 Jul 2023 10:29:10 -0500 Subject: [PATCH] h/v counters --- snes-core/src/cpu/vectors.rs | 2 +- snes-core/src/ppu/ppu.rs | 45 +++++++++++++++++++++++++++++++--- snes-core/src/ppu/registers.rs | 2 ++ 3 files changed, 45 insertions(+), 4 deletions(-) diff --git a/snes-core/src/cpu/vectors.rs b/snes-core/src/cpu/vectors.rs index 70e3961..ad19b0c 100644 --- a/snes-core/src/cpu/vectors.rs +++ b/snes-core/src/cpu/vectors.rs @@ -46,7 +46,7 @@ impl CPU { } fn push_emulation_interrupt(&mut self, bus: &mut Bus) { - if ! self.registers.emulation_mode { + if !self.registers.emulation_mode { self.phk(bus); } self.do_push(bus, &[ diff --git a/snes-core/src/ppu/ppu.rs b/snes-core/src/ppu/ppu.rs index 357180d..80c065d 100644 --- a/snes-core/src/ppu/ppu.rs +++ b/snes-core/src/ppu/ppu.rs @@ -2,6 +2,8 @@ use super::registers::PPURegisters; pub struct PPU { framebuffer: Vec, + h_count: u16, + v_count: u16, pub registers: PPURegisters, } @@ -9,21 +11,58 @@ impl PPU { pub fn new() -> Self { Self { framebuffer: vec![], + h_count: 0, + v_count: 0, registers: PPURegisters::new(), } } pub fn tick(&mut self, cpu_cycles: usize) { - for _ in 0..cpu_cycles { - self.do_cycle(); + for _ in 0..(cpu_cycles * 2) { + self.dot_cycle(); } } - pub fn do_cycle(&mut self) { + pub fn dot_cycle(&mut self) { + self.increment_hv_count(); + } + fn increment_hv_count(&mut self) { + self.h_count += 1; + if self.h_count > 339 { + self.h_count = 0; + self.v_count += 1; + if self.v_count > 261 { + self.v_count = 0; + } + } } pub fn framebuffer(&self) -> &Vec { &self.framebuffer } +} + + +#[cfg(test)] +mod ppu_general_test { + use super::*; + + #[test] + fn test_increment_hv_count() { + let mut ppu = PPU::new(); + ppu.increment_hv_count(); + assert_eq!(ppu.h_count, 1); + + ppu.h_count = 339; + ppu.increment_hv_count(); + assert_eq!(ppu.h_count, 0); + assert_eq!(ppu.v_count, 1); + + ppu.h_count = 339; + ppu.v_count = 261; + ppu.increment_hv_count(); + assert_eq!(ppu.h_count, 0); + assert_eq!(ppu.v_count, 0); + } } \ No newline at end of file diff --git a/snes-core/src/ppu/registers.rs b/snes-core/src/ppu/registers.rs index 9f9d336..aa45247 100644 --- a/snes-core/src/ppu/registers.rs +++ b/snes-core/src/ppu/registers.rs @@ -60,6 +60,8 @@ pub const WOBJLOG: u16 = 0x212B; // Window 2 Mask Logic (W) pub const TMW: u16 = 0x212E; // Window Area Main Screen Disable (W) pub const TSW: u16 = 0x212F; // Window Area Sub Screen Disable (W) +// PPU Interrupts +pub const RDNMI: u16 = 0x4210; // V-Blank NMI Flag pub const MAX_BG_WIDTH: usize = 16 * 64; pub const MAX_BG_HEIGHT: usize = 16 * 64;