Menu HDMA Colors
thanks to Chickenlump and JLukas
I couldn't find the HDMA color menu in the ROM for the dialog boxes for the locations, I assume it's generated somehow, and not read from a hardcoded table. The menu HDMA colors are in the ROM easily editable, and I was hoping that the dialog boxes would be similar. Sooooo... I found the routines, and cheated the game into reading my own table I created in some freespace. :lee:
First up, the Menu HDMA colors:
Menu HDMA color loading $C2/86DD 08 PHP $C2/86DE 8B PHB $C2/86DF C2 30 REP #$30 $C2/86E1 A2 71 87 LDX #$8771 //8771 = C28771(ROM Address for HDMA Color table for menu) $C2/86E4 A0 E9 9D LDY #$9DE9 //9DE9 = 7E9DE9(RAM Address for HDMA Color Table for menu) $C2/86E7 A9 1F 00 LDA #$001F //1F = 30 bytes to copy $C2/86EA 54 7E C2 MVN 7E C2 The 30 byte table is located at C28771 in the ROM. 02 E8 02 E7 02 E6 02 E5 02 E4 02 E3 02 E2 02 E1 02 E0 82 E1 82 E2 82 E3 82 E4 82 E5 82 E6 82 E7
The first row is the top half of the colors, the second row is the bottom half of the colors. Change the color and direction of the colors. The bytes seem to go as DirectionByte then ColorByte. So if you just want to change the colors only, leave the 02's and 82's alone.
The menu was easy. The dialog boxes, I had to make my own table for. The game generates a table at 7F1538 and copies it to 7F1600. The dialog boxes need both tables, and both are exactly the same. I copied the table in RAM and moved it to some freespace in the ROM.
$FD/D5C5 A2 38 15 LDX #$1538 //First table $FD/D5C8 A0 00 16 LDY #$1600 //Second table $FD/D5CB A9 FF 00 LDA #$00FF $FD/D5CE 54 7F 7F MVN 7F 7F $FD/D5D1 E2 20 SEP #$20 $FD/D5D3 60 RTS At FDD5C5, I changed to 20 79 67 60 This jumps to my modified routine in some freespace. The address for my routine is FD6779. At FD6779, my new code is A2 99 66 A0 38 15 A9 FF 00 54 7F FD A2 99 66 A0 00 16 A9 FF 00 54 7F FD E2 20 60 This loads my custom table from some freespace in the ROM. The new table is right above the new code.
The table address is FD6699. This table you can modify to change the colors of the gradient, the direction of the gradient, etc..
Here is my custom table, pasted at FD6699:
01 A8 01 A8 01 A8 01 A8 01 A8 01 A7 01 A7 01 A7 01 A7 01 A7 01 A6 01 A6 01 A6 01 A6 01 A6 01 A5 01 A5 01 A5 01 A5 01 A5 01 A4 01 A4 01 A4 01 A4 01 A4 01 A3 01 A3 01 A3 01 A3 01 A3 01 A2 01 A2 01 A2 01 A2 01 A2 01 A1 01 A1 01 A1 01 A1 01 A1 81 A0 81 A0 81 A0 81 A0 81 A0 81 A1 81 A1 81 A1 81 A1 81 A1 81 A2 81 A2 81 A2 81 A2 81 A2 81 A3 81 A3 81 A3 81 A3 81 A3 81 A4 81 A4 81 A4 81 A4 81 A4 81 A5 81 A5 81 A5 81 A5 81 A5 81 A6 81 A6 81 A6 81 A6 81 A6 81 A7 81 A7 81 A7 81 A7 81 A7 81 A8 81 A8 81 A8 81 A8 81 A8 81 A9 81 A9 81 A9 81 A9 81 A9
I can't really recommend using this for your hacks just yet, as TF will probably overwrite it. The Menu HDMA table you can overwrite and change without worry though. This is just something I was scratching my head over for awhile, even if I had to cheat to get my own colors on there.
Hmm, I just had a look at this. You're right, the HDMA colors are generated instead of using a table. In fact, the routine is directly above the first table/second table copy routine posted above. After examining the pattern you used for your custom table, I came up with the following. Enter these PAR codes on a fresh, unmodified CT:
FDD55BA8 FDD57BA0 FDD59AA0 FDD5BDA9
Look familiar? :D
FDD55A-FDD57F is the routine for the first color/top half
FDD599-FDD5B2 is the routine for the second color/bottom half
The only part I'm not sure on is what FDD580-FDD598 is doing. It has something to do with how the two colors blend in the middle of the textbox. The value at FDD58C should probably be set to the same value FDD57B and FDD59A are using.
I was pretty sure that's what the whole routine did, but couldn't quite wrap my head around it. I certainly needed some more ASM experience, so I thought I'd come back to this. It's fun changing the way the game works.
The MVN command is quite useful, copying large chunks of data from ROM to RAM, and RAM to RAM.
I suppose they wrote the routine to generate that table to save 255 bytes that would have been taken up by the table, but looking at how much freespace and junk is left in the final ROM, it doesn't appear to have mattered much.
The overworld select minimap also uses a generated table, copied twice in RAM, one after the other. It's quite a huge table. I'll pinpoint it's routine later tonight.