So I noticed there was an Action Replay code to force a NDS game to force the required language: https://gbatemp.net/threads/force-the-ds-dsi-games-language-with-an-ar-code.478344/
I have figured out a way to hack the NDS rom to force the required language, instead of using Action Replay codes. I'm aware that some tools like the TwilightMenu++ allow you to do this, but this is more useful if you are injecting a NDS rom into a NDS Wii U Virtual Console game (https://gbatemp.net/threads/wii-u-nintendo-ds-virtual-console-inject-guide.480668/), and some NDS Flash Cards don't give you this option.
To find out what languages a NDS game supports, I would recommend checking this website (https://www.advanscene.com/html/index.php). It sadly doesn't explain if the supported language is selected from the firmware, or if the user can pick (sometimes both methods are used). That you have to figure out for yourself.
From the few roms I have tried, this method seems to work perfectly. I will use Super Princess Peach (Europe) as a demonstration. This game supports English, French, German, Spanish, and Italian, and selects the language that is based on the firmware setting (if the firmware's language is set to Japanese, the game will load in English).
Download the Force Language Tools:
https://gbatemp.net/attachments/force-language-tools-7z.426768/
Install Notepad++:
https://notepad-plus-plus.org/
1 - Extract the contents of the Force Language Tools.7z files.
2 - Place a copy of the NDS rom into the main Force Language Tools folder.
3 - Open DsSmuMe emulator: desmume-0.9.11-win32 > DeSmuME_0.9.11_x86.exe
4 - Click: Config > Firmware Settings
5 - Change Language to the one you want to use.
6 - The required language will have been selected. In this example, Spanish has loaded, and there is no way to select a different language in the game.
7 - Open: dsbuff_v1Final > dsbuff.exe
8 - Click Browse... and open the NDS rom.
9 - Click Unpack.
10 - Click on Info button next to the Directory text box.
11 - Locate and click on the rom folder.
Note: Check that there are no files inside the folder! If there is, then delete all the files in that folder!
12 - Click the Green Tick to unpack the contents.
13 - This will open a new folder that contains the contents of the rom.
14 - Make a copy of arm9.bin file.
15 - Place a copy of "arm9.bin into the main folder.
16 - Open: no$gba > NO$GBA.EXE
17 - Click: Debug > Define Break/Condition
18 - Type in the following: [027FFCE4]?
This will freeze the emulator if a byte is read at that address.
19 - Click: Cartridge menu (FileName)
20 - Open the NDS rom.
21 - The game should freeze on the following instruction: add r0,r12,6h
22 - What we are interested in is the instruction above. It should be: ldrh r2,[r12,64h]
What it is doing is taking the R12 Address, adding 64 Hex bytes to R12 Address, and storing the value located at the new address into R2. So doing some calculations: 027FFC80 + hex(64) = 027FFCE4
That is the RAM Address that stores the language that was set in the firmware. What we are going to do is change the instruction to always load the required language setting into R2.
Make a note of the address where ldrh is stored. In this example: 020C98FC
23 - In the main folder, open compile.asm in Notepad++.
24 - At Line 20, place the new address after the 0x.
Take the address you made a note of in Step 22, and remove the 02 from the beginning.
For example: 020C98FC > 0C98FC
At Line 22, change the InsertLanguage text to language you want to force:
25 - Save the changes to the compile.asm file.
26 - Click on the make.bat file in the main folder.
27 - If you see this message, the instruction was changed successfully.
28 - Click the Pack icon.
29 - Click on Info button next to the ROM Contents text box.
30 - Locate and click on the rom folder.
31 - Click the Green Tick to pack the contents.
32 - Choose a location where you want to save the new NDS rom to, and give it a new name.
33 - Use the DeSmuMe emulator to test the new rom. Change the "Language" in the Firmware Settings to one that is different to the forced language (in this example, I will select English).
34 - Now the forced language will always load.
Enjoy!
I have figured out a way to hack the NDS rom to force the required language, instead of using Action Replay codes. I'm aware that some tools like the TwilightMenu++ allow you to do this, but this is more useful if you are injecting a NDS rom into a NDS Wii U Virtual Console game (https://gbatemp.net/threads/wii-u-nintendo-ds-virtual-console-inject-guide.480668/), and some NDS Flash Cards don't give you this option.
To find out what languages a NDS game supports, I would recommend checking this website (https://www.advanscene.com/html/index.php). It sadly doesn't explain if the supported language is selected from the firmware, or if the user can pick (sometimes both methods are used). That you have to figure out for yourself.
From the few roms I have tried, this method seems to work perfectly. I will use Super Princess Peach (Europe) as a demonstration. This game supports English, French, German, Spanish, and Italian, and selects the language that is based on the firmware setting (if the firmware's language is set to Japanese, the game will load in English).
Download the Force Language Tools:
https://gbatemp.net/attachments/force-language-tools-7z.426768/
Install Notepad++:
https://notepad-plus-plus.org/
1 - Extract the contents of the Force Language Tools.7z files.
2 - Place a copy of the NDS rom into the main Force Language Tools folder.
3 - Open DsSmuMe emulator: desmume-0.9.11-win32 > DeSmuME_0.9.11_x86.exe
4 - Click: Config > Firmware Settings
5 - Change Language to the one you want to use.
6 - The required language will have been selected. In this example, Spanish has loaded, and there is no way to select a different language in the game.
7 - Open: dsbuff_v1Final > dsbuff.exe
8 - Click Browse... and open the NDS rom.
9 - Click Unpack.
10 - Click on Info button next to the Directory text box.
11 - Locate and click on the rom folder.
Note: Check that there are no files inside the folder! If there is, then delete all the files in that folder!
12 - Click the Green Tick to unpack the contents.
13 - This will open a new folder that contains the contents of the rom.
14 - Make a copy of arm9.bin file.
15 - Place a copy of "arm9.bin into the main folder.
16 - Open: no$gba > NO$GBA.EXE
17 - Click: Debug > Define Break/Condition
18 - Type in the following: [027FFCE4]?
This will freeze the emulator if a byte is read at that address.
19 - Click: Cartridge menu (FileName)
20 - Open the NDS rom.
21 - The game should freeze on the following instruction: add r0,r12,6h
22 - What we are interested in is the instruction above. It should be: ldrh r2,[r12,64h]
What it is doing is taking the R12 Address, adding 64 Hex bytes to R12 Address, and storing the value located at the new address into R2. So doing some calculations: 027FFC80 + hex(64) = 027FFCE4
That is the RAM Address that stores the language that was set in the firmware. What we are going to do is change the instruction to always load the required language setting into R2.
Make a note of the address where ldrh is stored. In this example: 020C98FC
23 - In the main folder, open compile.asm in Notepad++.
24 - At Line 20, place the new address after the 0x.
Take the address you made a note of in Step 22, and remove the 02 from the beginning.
For example: 020C98FC > 0C98FC
At Line 22, change the InsertLanguage text to language you want to force:
- English
- French
- German
- Spanish
- Italian
- Japanese
25 - Save the changes to the compile.asm file.
26 - Click on the make.bat file in the main folder.
27 - If you see this message, the instruction was changed successfully.
28 - Click the Pack icon.
29 - Click on Info button next to the ROM Contents text box.
30 - Locate and click on the rom folder.
31 - Click the Green Tick to pack the contents.
32 - Choose a location where you want to save the new NDS rom to, and give it a new name.
33 - Use the DeSmuMe emulator to test the new rom. Change the "Language" in the Firmware Settings to one that is different to the forced language (in this example, I will select English).
34 - Now the forced language will always load.
Enjoy!
Attachments
Last edited by RadioShadow,