mirror of
https://github.com/FranLMSP/snes.git
synced 2026-10-03 16:05:18 -04:00
WIP vblank nmi
This commit is contained in:
+14
-18
@@ -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);
|
||||
}
|
||||
}
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user