If you have a rom hack of a game that normally has dsi functionality, but the dsi functionality is broken in the rom hack, this is what you can do to try and fix it. I will use Pokémon volt white 2 redux as my example here

This guide assumes you are using Twilight Menu 27.12.0 and nds-bootstrap 2.2.0, this is important because the loading of user-provided patches has changed in the newest nds bootstrap and these instructions will not work for older releases

I don't guarantee that it will work for every rom hack, but hopefully this is a universal fix

1- download Tinke DSi (not the regular one) at https://github.com/R-YaTian/TinkeDSi/releases

2- run Tinke.exe, and open the base unpatched rom for your rom hack

3- hit "Game information" at the top of the window

1731796793676.png


4- Dump donor iheader in the bottom-right (optionally, dump animation data as well)

1731796805583.png


You will have a .ihdr file for the donor iheader data, and an .adat file for the animation data if you chose to dump that.

5- close the Game information window to go back to the main window. You will need to locate the arm7i.bin and arm9i.bin files in your original rom. the easiest way is to type the file name in Search keywords. For Pokémon white 2, both are in the /ftc folder

once you see them in the file list, click on arm7i.bin to highlight it, and click Extract in the bottom-right. Do the same thing with arm9i.bin

1731796817679.png


6- close out of Tinke DSi, reopen it, and select the patched rom for the rom hack of your choice instead

7- just like before, hit Game information at the top, but this time, click Edit header and banner instead

1731796829330.png


8- in the new window, click Import donor iheader and select the .ihdr file you saved during step 4. If you made a dump of the animation data, click Import animation data and select the .adat file you saved before too

1731796841009.png


9- click save to save the imported files, and close the Game information window. Then on the main window, click Save ROM in the bottom right, and save the rom to a new file (different file name.) This is an important step for later

1731796852115.png


10- close Tinke again, and reopen it. This time, load the rom you just saved (edit.nds for me)

11- just like in step 5, you will look for arm7i.bin and arm9i.bin, but in the patched rom. if you had looked for them before saving your rom and reopening it, they wouldn't have been there, but now that you imported a donor iheader, tinke will display non-functional placeholders which allows you to replace them with the ones you dumped from the original rom earlier

enter "arm" in search keywords to single them out, click on arm7i.bin to select it, but this time, click Change file instead, and select the arm7i.bin file you picked earlier. Do the same with arm9i.bin afterwards

1731796864712.png


12- once both files are replaced, you're done. hit Save ROM like you did before, and save to a new file (fix.nds as an example)

13- close tinke again, and reopen it again, selecting the fixed rom you just saved, to ensure everything is reloaded and you see the correct data for the next step

14- hit Game information at the top again, but this time you're looking for the header CRC at the bottom of the list

1731796877443.png


check the game code at the top of the list, as well

15- go to https://github.com/DS-Homebrew/nds-bootstrap/tree/master/retail/apfix/files, the file name format for the ap patches is [4-digit game code]-[header CRC in hex].ips

find the patches with the matching game code for your game, in the case of Pokémon white 2 this is IRDO. the original unpatched rom has a header CRC of D75C, so click on IRDO-D75C.ips in the list, and then click "Raw" to the right to download the file

1731796894445.png


1731796898331.png


if you aren't sure which patch to download, open your original unpatched rom in Tinke, and in the Game information window, look for Geme code at the top (0xC), and header CRC near the bottom (0x15E)

16- once you have the ap fix ips for your game, take the header CRC you got from Tinke, for the final patched fixed rom you just made earlier, and convert that value to hex. Use something like this or whatever you want: https://www.calculator.net/hex-calculator.html

in the case of volt white 2 redux classic, the header CRC ends up being 45547, which converts to B1EB in hex. take the ips file you downloaded earlier, and replace the second part of the file name (the last four digits) with the hexadecimal header CRC you just calculated. For example, for Pokémon white 2, IRDO-D75C.ips becomes IRDO-B1EB.ips

17- connect your sd card to your computer, the one you have twilightmenu/nds bootstrap on. create a folder in /_nds/nds-bootstrap/ called "apFix", and put the .ips file you just renamed inside that folder

You're done, now you can put your sd card back into your console, and run the fixed rom in twilight menu. You will probably get a warning about needing to make sure you are on the latest nds bootstrap version for ap fix, just press A to proceed, and the game should run in DSi mode, with ap fix enabled. For emulators, you might have some problems with AP. The fixed rom for volt white 2 redux classic hangs on a black screen in Bizhawk for example, when you hit Continue on the main menu. it seems it doesn't apply the antipiracy fix, probably because the rom is unrecognized with the different header, but I don't know how to fix that. It might work in melonDS, if it handles things differently from Bizhawk