I'll get down to brass tax here, my emulator sucks and I was thinking about abandoning its development in favour of another emulator I'm working on. However, I feel that the very least I can do is get it to a reasonably decent standard, and since I got Blargs CPU test (nestest.nes) working 100%, I want to get Blargs PPU tests (NEStress.nes) working to the same standard.
Here's the current state of the PPU test results from NEStress.nes
It's really bad, and so many games clearly suffer as a result of it. I have to sort this out, I would would really appreciate your help.
I feel like I have implemented everything I need to get all the basic PPU reads and writes working correctly, here's a list of a few things which I think I have implemented correctly (or not as the case IS) to get these tests passing.
Have I missed any important details?
Thanks
Here's the current state of the PPU test results from NEStress.nes
It's really bad, and so many games clearly suffer as a result of it. I have to sort this out, I would would really appreciate your help.
I feel like I have implemented everything I need to get all the basic PPU reads and writes working correctly, here's a list of a few things which I think I have implemented correctly (or not as the case IS) to get these tests passing.
- *the first write/second write flip-flop is shared between $2005/6.
*reading $2002 resets this flip-flop
*first read from $2007 is always invalid, so one "junk" read must be made before reading from $2007. The first read does not increment the vram pointer.
*this invalid read only occures after a PPU reguster is written to, all contiguous reads of $2007 do not suffer from any "inavlid reads" (other than the first of course).
*the vram pointer wraps around 14 bits
*$2000 - $2007 are mirrored all the way to $3FFF (1023 times!). Every write or read from here is treated the same as it would be for $2000 - $2007. i.e. writing to $2008 would change $2000 and visa versa. (I haven't emulated this yet as very few games actually write to this address space)
*I have implemented pallete mirroring correctly (or atleast, i think), same with nametable mirroring.
Have I missed any important details?
Thanks