Yesterday axolotl asked on 8bc whether it is possible to invert the monochrome palette in LSDj, for use with backlit screens with an inverted polarizing foil. And it’s very much possible to do, and it’s even possible to modify an existing ROM image. So, I’ll show you how I did it using a copy of the LSDj ROM, no$gmb and a hex editor. I’m using XVI32, but any hex editor would do.
The palette value is change by a hardware register, which is a place in memory that a Gameboy program can be write to, to change things. So I look it up in the Pan Docs, which is a manual to the Gameboy hardware. So let’s look in the section LCD Monochrome Palettes. There we see that the address is $ff47 in hexadecimal and how the value is constructed.
In no$gmb I open the ROM image and open Debug>Define Break/Condition and enter (ff47)! This tells the no$gmb to track any writes to that address so we can find the place where the palette is initialized and change it.

Click ok and press F9 to begin execution. (Or reset the emulator)

No$gmb stops and show a bunch of machine instructions. The interesting part is 019C and 019E. Which takes the hexadecimal value $E4, stores it in the CPU register A then writes it to the hardware register $FF47. This is the code we’re looking for. The value $E4 is the standard palette. Go back to pan docs and check again how the value is constructed.
Then let’s split the value into its individual colours.
$E4 = 11 10 01 00
11 is the lightest palette value and 00 is the darkest. Since want to invert the palette we’ll reverse the order.
00 01 10 11 = $1B
Great. Open the hex editor and replace the $E4 at position 019D with the value $1B.
Before:
Lastly, open the ROM in an emulator to confirm that the modification worked.






