@@ -658,41 +658,12 @@ namespace Nes
io.line .Toggle ( io.address , GetCycles () );
}
NST_FORCE_INLINE void Ppu::UpdateScrollAddressLine ()
{
if (io.line )
{
// io.line.Toggle( scroll.address & 0x3FFF, cpu.GetCycles() ); // Original
int a12_mask = ~((scroll.address & 0x2000 ) >> 1 );
io.line .Toggle ( (scroll.address & a12_mask) & 0x3FFF , cpu.GetCycles () );
}
}
NST_FORCE_INLINE void Ppu::UpdateVramAddress ()
{
if ((scanline != SCANLINE_VBLANK ) && (regs.ctrl [1 ] & Regs::CTRL1_BG_SP_ENABLED))
{
if ( regs.ctrl [0 ] & Regs::CTRL0_INC32 )
{
if ((scroll.address & 0x7000 ) == 0x7000 )
{
scroll.address &= 0x0FFF ;
switch (scroll.address & 0x03E0 )
{
case 0x03A0 : scroll.address ^= 0x0800 ; break ;
case 0x03E0 : scroll.address &= 0x7C1F ; break ;
default : scroll.address += 0x20 ;
}
}
else
{
scroll.address += 0x1000 ;
}
}
else
{
scroll.address ++;
}
scroll.ClockX ();
scroll.ClockY ();
}
else
{
@@ -813,7 +784,7 @@ namespace Nes
oam.mask = oam.show [pos];
if ((regs.ctrl [1 ] & Regs::CTRL1_BG_SP_ENABLED) && !(data & Regs::CTRL1_BG_SP_ENABLED))
UpdateScrollAddressLine ( );
UpdateAddressLine (scroll. address & 0x3fff );
}
io.latch = data;
@@ -957,7 +928,10 @@ namespace Nes
{
scroll.latch = (scroll.latch & 0x7F00 ) | data;
scroll.address = scroll.latch ;
UpdateScrollAddressLine ();
if (!(regs.ctrl [1 ] & Regs::CTRL1_BG_SP_ENABLED) ||
(scanline == SCANLINE_VBLANK)) {
UpdateAddressLine (scroll.address & 0x3fff );
}
}
}
}
@@ -969,7 +943,10 @@ namespace Nes
uint address = scroll.address ;
UpdateVramAddress ();
UpdateScrollAddressLine ();
if (!(regs.ctrl [1 ] & Regs::CTRL1_BG_SP_ENABLED) ||
(scanline == SCANLINE_VBLANK)) {
UpdateAddressLine (scroll.address & 0x3fff );
}
io.latch = data;
@@ -1007,7 +984,10 @@ namespace Nes
address = scroll.address & 0x3FFF ;
UpdateVramAddress ();
UpdateScrollAddressLine ();
if (!(regs.ctrl [1 ] & Regs::CTRL1_BG_SP_ENABLED) ||
(scanline == SCANLINE_VBLANK)) {
UpdateAddressLine (scroll.address & 0x3fff );
}
io.latch = (address & 0x3F00 ) != 0x3F00 ? io.buffer : palette.ram [address & 0x1F ] & Coloring ();
io.buffer = (address >= 0x2000 ? nmt.FetchName ( address ) : chr.FetchPattern ( address ));
@@ -2107,12 +2087,19 @@ namespace Nes
}
else
{
cycles.hClock = HCLOCK_VBLANK_0 ;
cycles.hClock = HCLOCK_POSTRENDER ;
if (cycles.count <= HCLOCK_VBLANK_0 )
if (cycles.count <= HCLOCK_POSTRENDER )
break ;
}
case HCLOCK_POSTRENDER:
UpdateAddressLine (scroll.address & 0x3fff );
cycles.hClock = HCLOCK_VBLANK_0;
if (cycles.count <= HCLOCK_VBLANK_0)
break ;
case HCLOCK_VBLANK_0:
VBlank0: