PPU $2007 write behaviour?

Discuss emulation of the Nintendo Entertainment System and Famicom.

Moderator: Moderators

Post Reply
User avatar
Zepper
Formerly Fx3
Posts: 3190
Joined: Fri Nov 12, 2004 4:59 pm
Location: Brazil
Contact:

PPU $2007 write behaviour?

Post by Zepper » Sun Mar 18, 2018 7:47 am

Do you remember this? Well, reading or writing $2007 during rendering triggers a Y increment and a coarse X increment, but is the PPU write* performed? Ignored?

*a write to CHR RAM, nametables or color ram

In other words... is this correct?

Code: Select all

      //2007W I/O
      case 7:
        if(ppuisrendering) {
           _clock_y(); _clock_x();
        } else {
           unsigned int tempaddr = ppu->address & 0x3FFF;
           ppu->address = (ppu->address + ppu->inc) & 0x7FFF;
           if(tempaddr < 0x2000) {
 /* CHR RAM write */
           } else if(tempaddr < 0x3F00) {
/* nametable write */
           } else {
/* color ram write */
           }
        }

User avatar
dougeff
Posts: 2600
Joined: Fri May 08, 2015 7:17 pm
Location: DIGDUG
Contact:

Re: PPU $2007 write behaviour?

Post by dougeff » Sun Mar 18, 2018 10:42 am

reading or writing $2007 during rendering triggers a Y increment and a coarse X increment
That would explain a lot (tests that I've done on reading / writing during rendering causing y scroll errors).
nesdoug.com -- blog/tutorial on programming for the NES

lidnariq
Posts: 8704
Joined: Sun Apr 13, 2008 11:12 am
Location: Seattle

Re: PPU $2007 write behaviour?

Post by lidnariq » Sun Mar 18, 2018 12:03 pm

Zepper wrote:but is the PPU write* performed?
Approximately yes.

The PPU's ALE signal is high when appropriate according to either the write sequence or the ordinary fetch cadence. This will smear addresses and data all over each other during the time.

The PPU's /WR strobe goes low. The /RD strobe is controlled entirely separately—this will yield a situation in which both /RD and /WR are low. For most RAMs this causes a write.

I don't know whether it can cause a write to palette memory. There aren't quite enough named nodes in Visual2C02 for me to easily track down whether the address logic to enable palette writes can be easily tickled.

Post Reply