diff --git a/src/ppu.rs b/src/ppu.rs index ab2d239..ecd17f1 100644 --- a/src/ppu.rs +++ b/src/ppu.rs @@ -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,33 +956,40 @@ impl PPU { } else if self.pixel < 257 || self.pixel > 320 { // self.dbg_int = true; // const POS: u32 = 1 << 15; - let bit_pos = 15 - self.background.x; - // Determine background color - let a = (self.background.cur_shift_high >> bit_pos) & 1; - let b = (self.background.cur_shift_low >> bit_pos) & 1; - let val = (a << 1) | b; - debug_assert!(val < 4); + 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; + let b = (self.background.cur_shift_low >> bit_pos) & 1; + let val = (a << 1) | b; + debug_assert!(val < 4); - let a = (self.background.cur_attr_shift_high >> bit_pos) & 1; - 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 }; + let a = (self.background.cur_attr_shift_high >> bit_pos) & 1; + let b = (self.background.cur_attr_shift_low >> bit_pos) & 1; + let palette = ((a << 1) | b) as u8; + debug_assert!(palette < 4); + 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