fix(ppu): delay ppu by one cycle on scx fifo discard
continuous-integration/drone/push Build is passing
Details
continuous-integration/drone/push Build is passing
Details
This commit is contained in:
parent
cc0cb0dd8a
commit
1d8fb8d32a
23
src/ppu.rs
23
src/ppu.rs
|
@ -51,6 +51,10 @@ pub struct Ppu {
|
||||||
obj_buffer: ObjectBuffer,
|
obj_buffer: ObjectBuffer,
|
||||||
frame_buf: Box<[u8; GB_WIDTH * GB_HEIGHT * 4]>,
|
frame_buf: Box<[u8; GB_WIDTH * GB_HEIGHT * 4]>,
|
||||||
window_stat: WindowStatus,
|
window_stat: WindowStatus,
|
||||||
|
|
||||||
|
scanline_start: bool,
|
||||||
|
to_discard: u8,
|
||||||
|
|
||||||
x_pos: u8,
|
x_pos: u8,
|
||||||
cycle: Cycle,
|
cycle: Cycle,
|
||||||
}
|
}
|
||||||
|
@ -105,6 +109,8 @@ impl Ppu {
|
||||||
}
|
}
|
||||||
|
|
||||||
self.x_pos = 0;
|
self.x_pos = 0;
|
||||||
|
self.scanline_start = true;
|
||||||
|
self.to_discard = 0;
|
||||||
|
|
||||||
self.fetch.hblank_reset();
|
self.fetch.hblank_reset();
|
||||||
self.window_stat.hblank_reset();
|
self.window_stat.hblank_reset();
|
||||||
|
@ -375,12 +381,17 @@ impl Ppu {
|
||||||
}
|
}
|
||||||
|
|
||||||
if self.fifo.is_enabled() {
|
if self.fifo.is_enabled() {
|
||||||
if self.x_pos == 0 && !self.fifo.back.is_empty() {
|
if self.x_pos == 0 && !self.fifo.back.is_empty() && self.scanline_start {
|
||||||
let to_discard = self.pos.scroll_x % 8;
|
self.to_discard = self.pos.scroll_x % 8;
|
||||||
|
self.scanline_start = false;
|
||||||
|
}
|
||||||
|
|
||||||
for _ in 0..to_discard {
|
if self.to_discard > 0 {
|
||||||
let _ = self.fifo.back.pop_front();
|
let _ = self.fifo.back.pop_front();
|
||||||
}
|
self.to_discard -= 1;
|
||||||
|
|
||||||
|
// Delay the PPU by one cycle
|
||||||
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Handle Background Pixel and Sprite FIFO
|
// Handle Background Pixel and Sprite FIFO
|
||||||
|
@ -472,6 +483,8 @@ impl Default for Ppu {
|
||||||
window_stat: Default::default(),
|
window_stat: Default::default(),
|
||||||
dma: Default::default(),
|
dma: Default::default(),
|
||||||
x_pos: 0,
|
x_pos: 0,
|
||||||
|
scanline_start: true,
|
||||||
|
to_discard: Default::default(),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue