WIP vblank nmi

This commit is contained in:
2023-07-02 17:30:42 -05:00
parent 300456a2ef
commit 9d99d2d194
4 changed files with 94 additions and 29 deletions
+14 -18
View File
@@ -2,8 +2,6 @@ use super::registers::PPURegisters;
pub struct PPU {
framebuffer: Vec<u8>,
h_count: u16,
v_count: u16,
pub registers: PPURegisters,
}
@@ -11,8 +9,6 @@ impl PPU {
pub fn new() -> Self {
Self {
framebuffer: vec![],
h_count: 0,
v_count: 0,
registers: PPURegisters::new(),
}
}
@@ -28,12 +24,12 @@ impl PPU {
}
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;
self.registers.h_count += 1;
if self.registers.h_count > 339 {
self.registers.h_count = 0;
self.registers.v_count += 1;
if self.registers.v_count > 261 {
self.registers.v_count = 0;
}
}
}
@@ -52,17 +48,17 @@ mod ppu_general_test {
fn test_increment_hv_count() {
let mut ppu = PPU::new();
ppu.increment_hv_count();
assert_eq!(ppu.h_count, 1);
assert_eq!(ppu.registers.h_count, 1);
ppu.h_count = 339;
ppu.registers.h_count = 339;
ppu.increment_hv_count();
assert_eq!(ppu.h_count, 0);
assert_eq!(ppu.v_count, 1);
assert_eq!(ppu.registers.h_count, 0);
assert_eq!(ppu.registers.v_count, 1);
ppu.h_count = 339;
ppu.v_count = 261;
ppu.registers.h_count = 339;
ppu.registers.v_count = 261;
ppu.increment_hv_count();
assert_eq!(ppu.h_count, 0);
assert_eq!(ppu.v_count, 0);
assert_eq!(ppu.registers.h_count, 0);
assert_eq!(ppu.registers.v_count, 0);
}
}
+28
View File
@@ -114,12 +114,16 @@ pub enum Background {
pub struct PPURegisters {
data: [u8; 256],
pub h_count: u16,
pub v_count: u16,
}
impl PPURegisters {
pub fn new() -> Self {
Self {
data: [0x00; 256],
h_count: 0,
v_count: 0,
}
}
@@ -167,6 +171,13 @@ impl PPURegisters {
_ => unreachable!(),
}
}
pub fn is_vblanking(&self) -> bool {
if self.h_count >= 1 && self.h_count <= 224 {
return false
}
return true
}
}
@@ -189,4 +200,21 @@ mod ppu_registers_test {
registers.write(BG1SC, 2);
assert_eq!(registers.get_bg_size(Background::Bg1), BgSize::T32x64);
}
#[test]
fn test_is_vblanking() {
let mut registers = PPURegisters::new();
registers.h_count = 339;
assert_eq!(registers.is_vblanking(), true);
registers.h_count = 0;
assert_eq!(registers.is_vblanking(), true);
registers.h_count = 225;
assert_eq!(registers.is_vblanking(), true);
registers.h_count = 224;
assert_eq!(registers.is_vblanking(), false);
registers.h_count = 2;
assert_eq!(registers.is_vblanking(), false);
registers.h_count = 50;
assert_eq!(registers.is_vblanking(), false);
}
}