Any idea what the issue might be? I read in some other posts that scrolling bugs often have to do with reads to PPU register 2002 and writes to PPU registers 2005/2006. Here are my implementations:
2002:
Code: Select all
fn ppuStatus(&mut self) -> u8 {
let mut value = self.prevReg & 0x001F;
value |= self.fSprOver << 5;
value |= self.fSprZero << 6;
if self.nmiOccured {
value |= 1 << 7;
}
self.w = 0;
self.nmiOccured = false;
return value;
}
2005/2006:
Code: Select all
fn ppuScroll(&mut self, val: u8) -> () {
if self.w == 0 {
self.t = (self.t & 0xFFE0) | ((val as u16) >> 3);
self.x = (val & 0x07);
self.w = 1;
}
else {
self.t = (self.t & 0x8FFF) | (((val & 0x07) as u16) << 12);
self.t = (self.t & 0xFC1F) | (((val & 0xF8) as u16) << 2);
self.w = 0;
}
}
fn ppuAddress(&mut self, val: u8) -> () {
if self.w == 0 {
self.t = (self.t & 0x80FF) | ((val as u16 & 0x3F) << 8);
self.w = 1;
}
else {
self.t = (self.t & 0xFF00) | (val as u16);
self.v = self.t;
self.w = 0;
}
}