Actually disable sprite and background rendering based on mask

This commit is contained in:
2026-03-16 03:01:37 -05:00
parent b9a30c286a
commit fa88c825a6

View File

@@ -824,7 +824,9 @@ impl PPU {
self.background.second_pattern = val & 0b0001_0000 != 0;
self.oam.large_sprites = val & 0b0010_0000 != 0;
if val & 0b0100_0000 != 0 {
println!("WARNING: Bit 6 set in PPUCTRL - may cause damage on physical hardware");
println!(
"WARNING: Bit 6 set in PPUCTRL - may cause damage on physical hardware"
);
}
self.nmi_enabled = val & 0b1000_0000 != 0;
}
@@ -954,6 +956,7 @@ impl PPU {
} else if self.pixel < 257 || self.pixel > 320 {
// self.dbg_int = true;
// const POS: u32 = 1 << 15;
let bg_color = if self.mask.enable_background {
let bit_pos = 15 - self.background.x;
// Determine background color
let a = (self.background.cur_shift_high >> bit_pos) & 1;
@@ -965,22 +968,28 @@ impl PPU {
let b = (self.background.cur_attr_shift_low >> bit_pos) & 1;
let palette = ((a << 1) | b) as u8;
debug_assert!(palette < 4);
let color = val as u8 + if val != 0 { palette * 4 } else { 0 };
val as u8 + if val != 0 { palette * 4 } else { 0 }
} else {
0
};
if self.scanline < 240 && self.pixel < 257 {
let color = if let Some((sp_color, above, is_sprite_zero)) =
self.oam.pixel(self.pixel, self.scanline)
let color = if let Some((sp_color, above, is_sprite_zero)) = self
.mask
.enable_sprites
.then_some(())
.and(self.oam.pixel(self.pixel, self.scanline))
{
if is_sprite_zero && sp_color != 0 && color != 0 {
if is_sprite_zero && sp_color != 0 && bg_color != 0 {
self.sprite_zero_hit = true;
}
if sp_color == 0 || (color != 0 && !above) {
color
if sp_color == 0 || (bg_color != 0 && !above) {
bg_color
} else {
sp_color
}
} else {
color
bg_color
};
// Write to screen
self.render_buffer.write(
@@ -1014,7 +1023,9 @@ impl PPU {
| ((self.background.v >> 2) & 0x07);
// println!("Cur: {:04X}, comp: {:04X}", addr, addr_2);
// assert_eq!(addr, addr_2);
let val = mem.read(addr).reg_map(|_, offset| self.palette.ram(offset as u8));
let val = mem
.read(addr)
.reg_map(|_, offset| self.palette.ram(offset as u8));
self.background.next_attr = val;
} else if self.pixel % 8 == 6 {
// BG pattern low