PPU $2007 write behaviour?

Discuss emulation of the Nintendo Entertainment System and Famicom.

Moderator: Moderators

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

PPU $2007 write behaviour?

Post by Zepper »

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: 3079
Joined: Fri May 08, 2015 7:17 pm

Re: PPU $2007 write behaviour?

Post by dougeff »

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: 11432
Joined: Sun Apr 13, 2008 11:12 am

Re: PPU $2007 write behaviour?

Post by lidnariq »

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