VRAM Dumping and ‘on the fly’ ROM patching
I finished this morning the code to dump the whole VRAM. It’s been a few days that I was working on it. One of the issue that I got with it is that the NMI got triggered in the middle of the transfer and that it was fucking up the VRAM registers of the snes. So when I was comming back from the NMI the transfert wasn’t done properly anymore.
That’s why I implemented the ‘on the fly’ Rom patching functionnality. This allow me to redirec tthe NMI Handler to a place where the NMI does nothing while I’m transfering the VRAM. Here is a little log of what is happening when I patch the ROM.
debugDump launched. NMI Handler ... NMI Handler ... ROM PATCH :: Set Offset 0 : 0xEA ROM PATCH :: Set Offset 1 : 0xFF ROM PATCH :: Set Offset 2 : 0x00 ROM PATCH :: Read ROM [0000FFEA] => 0xEA ROM PATCH :: Write ROM [0000FFEA] => 0x04 ROM PATCH :: Set Offset 0 : 0xEB ROM PATCH :: Set Offset 1 : 0xFF ROM PATCH :: Set Offset 2 : 0x00 ROM PATCH :: Read ROM [0000FFEB] => 0x85 ROM PATCH :: Write ROM [0000FFEB] => 0x86 Patched NMI Handler ... Patched NMI Handler ... Patched NMI Handler ... Patched NMI Handler ... Patched NMI Handler ...
The code to make this happen in snes side is :
offset = (word) &emptyNMI; oldNMI[0] = _1UP_ROMPatch((dword) 0x0000FFEA, (byte) offset); oldNMI[1] = _1UP_ROMPatch((dword) 0x0000FFEB, (byte) (offset>>8));byte _1UP_ROMPatch(dword offset, byte data) { byte oldValue; // Set address to patch *(byte*) REG(_1UP_ROM_PATCH_ADDR0) = (byte) offset; *(byte*) REG(_1UP_ROM_PATCH_ADDR1) = (byte) (offset>>8); *(byte*) REG(_1UP_ROM_PATCH_ADDR2) = (byte) (offset>>16); // Read actual value oldValue = *(byte*) REG(_1UP_ROM_PATCH_DATA); // Write new value *(byte*) REG(_1UP_ROM_PATCH_DATA) = (byte) data; return oldValue; }
I still use a patched version of BSnes to emulate the future hardware that is dev by Scott.
Next stuff is OAM Dump (sprite tables) …
See ya, Lint