I replaced it with UA6528 and all works fine, but I kept that broken PPU for myself. Because I have not many NTSC PPUs in my collection -> I thought it would be good exercise to take closer look at the problem and maybe fix it.
So for all CHR-ROM games, it displays just random set of sprites:
But if it's CHR-RAM game, there is complete mess:
So now I was sure that PPU has problems with writing to its external memory. I thought that maybe !WR signal is broken, but no - it is asserted correctly. Then I wrote simple testing program that forces PPU to write 0 to consecutive addresses (attachment):
Code: Select all
set_ppu_addr_to $0000 loop: lda #0 sta PPUDATA jmp loop
Good PPU (second photo is magnified view at the moment data is driven)
Now I was sure - PPU is not driving its data bus with data to be written, so instead of data.. low 8 bits of address are written!
Because the data that PPU writes to its memory always comes from CPU (and it is always from $2007), I thought of making small addon board that would latch all writes to $2007 and when !WE is asserted - output it, instead of `invalid` PPU data - good idea?
What about games that make use of raster effects?