Tutorial  Updated

Fix GC PAL (1.0) Bios on Wii U in Nintendont

Hello everyone, I would like to tell you that I manage to found a fix for the european PAL IPL.bin to make it display normally on the Wii U. It's my first "Tutorial" kind of thread so forgive me if I lack of ability to summarize.

For context:
Using Nintendont, trying to launch the iplpal.bin from a Wii U system results by image glitching and also video corruption because the image will keep being glitched across all the vWii if you quit Nintendont.
It should look like this :



We assumed that's it's due to the fact that Nintendo engineers didn't make the Wii U graphic chip compatible with the old Pal 576i resolution at 50hz refresh rate. I am not sure of this statement anymore but you'll see why.

That being said the only solution for us european people was to use the NTSC USA bios, which run normally, and patch it with a Swiss RAM patch to make It region free in order to let pal game be recognized and launchable from the bios. It's not perfect but at least it make Us able to use the memory card manager even if only English is available. Note however that it can cause incompatibilites with some 50hz PAL games like the game's running with high speed because of 60hz. I know the bios is supposed to be launched separately from the game by Nintendont (force video settings never been applied to the bios) but It has in one way or another a impact on the following game.

And because the GC bios feature of Nintendont is purely for nostalgia (is optional and not needed for compatibility like the Nintendont thread said so well), I really wanted that my bios have the language selector. But for the same reason I just said, nobody would work on it since, the NTSC bios work, It only concern european people (and the world is american centered, lucky english speaking europeans lol), that also use a Wii U, and also want to enable the GC bios, but not just the intro as a video (like already made by a Nintendont fork CrisMMMod), but the actual bios with memory card manager. Very niche isn't it.

So recently I came across a Nintendont fork named "Better-Nintendont" by SuperrSonic.
https://github.com/SuperrSonic/Better-Nintendont
His purpose was to improve Nintendont compatibility with games and add some patches, and some that have effect on the Bios including one very interesting to my concern "GameCube menu 480p patch from Swiss".
Everything is located in https://github.com/SuperrSonic/Better-Nintendont/blob/main/loader/source/ipl.c

After using it this patch doesn't seem to work properly with me or at least for every bios region and revision I tested, but it permitted me to learn interesting memory addresses.

What We are looking for are where the patches are made in the memory and found them in the decrypted ipl.bin. I never planned to apply 480p but what was in the NTSC bios before the patch to get 480i60hz.

In line 181, the code check "if" the identity of the bios is NTSC 1.1 by checking whether "0x3800000C" is actually written at address "0x8130B590‎". If it's true it start to patch some things. I will spare you all my testing but just so you know, the line that should apply 480p by entering 2 at the address, changing this byte doesn't work and the bios don't start.
On NTSCs bios at the location where you put "2" it originally have "00". So I tried to put 0 in PALs bios but same thing it doesn't do anything (the bios doesn't boot and freeze while black screen).

Screenshot_20261006_180509_Chrome.jpg


However, I was intrigued by the code at line 184, "(s16 *)0x81300522 = type; //swiss" because unlike NTSCs bios, it was that offset used for checking PALs bios identity. At line 270 :
else if(*(u32 *)0x81300610 == 0x38600004) { //PAL 1.2
Then just after line 273:
*(s16 *)0x81300612 = type; //swiss

Which is the same 32bits word.

Line 316:
else if(*(u32 *)0x81300520 == 0x38600004) { //PAL 1.0
Line 319: *(s16 *)0x81300522 = type; //swiss

Line 362:
else if(*(u32 *)0x81300520 == 0x38600008) { //MPAL 1.1
Line 365: *(s16 *)0x81300522 = type; //swiss

Screenshot_20261006_180731_Chrome.jpg


So it made me think that PALs bios is not checked by an ID like NTSC but by a variable byte.

I decided to begin my testing with NTSC 1.1 and PAL 1.0 bios because these are the one I worked with before for the region free patch and the 1.1 NTSC revision is the one which is closer than the 1.0 PAL in its structure (GameCube release in Europe as 1.0 when the 1.1 NTSC came out, 1.0 NTSC were released a year before in USA and Japan).

So I simply tried to wrote what there is in the NTSC 1.1 at the offset 0x81300520 (38600000) at the equivalent offset in the PAL 1.0 but as you can see it's the same offset 0x81300520. It was originally wrote 38600004 on PAL.

FIX pal offset~2 (1).jpg


For your testing you need I decrypted version of your bios, using a xor decryptor software like XorCryptWin. In order to make the bios run on a Wii U system you will have to download Nintendont as a source code to modify the main.c code and erase the line that launch iplpal.bin "if (!IsWiiU())", "!" in other words launch it on anything that is not a Wii U. And then recompiling Nintendont with devkitpro. But it is not necessary just for testing, you can rename your modified IPL to iplusa.bin or ipljap.bin and launch an american or japanese games.

And then Here's what happen :



It WORKS. This is the PAL bios running normally on Wii U, it has the language selector etc, well with one exception, it's only accepting NTSC games now, it can only be solved with a region free patch on top of that. I already did this when I shot the video.

region free pal offset~2.jpg


But one thing was remaining unanswered. This bios, on Wii U is displayed in 50hz, If your Wii U is set to 480i60, the bios will be launch at 576i50 just like on regular Wii. If your Wii U is set to 480p60 the bios will be displayed at 576p50 (Never seen on Wii It can't do it). And if you set your Wii U to 1080p60, the bios will be launch at 1080p and 50Hz, so at the end of the day there is no need to convert video to 480i60.

The Wii U has no problem with such resolution and refresh rate. Moreover, the recent update of vWiiCompat Installer permit to change vWii video on region change settings, on PAL region We can set PAL and then some vWii homebrew (not system menu though) output 576i and become 576p if your at 480p as a base.

So I will be honest, I do not know what this byte change exactly. It could have been just for region game the video wouldn't miraculously worked, and also, PAL-M plays NTSC-US games whereas its byte is 08 not 00. It doesn't change the bios language either. I assume it load a kind of "library" that hold several parameters related to the region at the same time.

With that Being said, We got a fully working PAL 1.0 bios on Wii U. At proper 50Hz, so no need to change the animation speed, and no more Pal game speed incompatibilities !

Unfortunately, this miracle doesn't work on the 1.2 revision of the PAL bios, swapping the 04 byte at x81300612 to 00 or anything just make the bios freeze. It will need further investigation for its case.

It really annoys me because my goal was not only to get a patched ipl.bin in my sd on my own, it's not update free concerning Nintendont because at each update I will have to edit the main.c to make PALs bios not skipped on Wii U.

And because GameCube bios are copyrighted files it's obvious that We can not share them pre-patched or not. So I wanted to make Nintendont patch it itself on RAM to make it work with people using a clean unpatched IPL.

So I've integrated the patch for the bios 1.0 in the official Nintendont ipl.c code. The patch has the "if (IsWiiU)" so that way it don't anything on a normal Wii. Also, putting the Pal-M value "08" result the same fix than "00" since this bios plays NTSC games so I guess it loads the same bunch of settings

patch in Nintendont~2.jpg


However I know that It is not enough to make Nintendont contributors officially remove the "if Wii U" skip Pal IPL.

What We could do is to make that the main.c tell to only skip 1.2 pal bios that is ran from a Wii U, to let pal1.2 on Wii alone, and authorize Pal 1.0 to run on Wii U. But I don't know how to make that possible if the code has to skip the IPL but has to scan it to know that this is a 1.2 revision with a "if(*(u32 *)0x81300610 == 0x38600004) { //PAL 1.2 " as a check...

I will first see what the official contributors would say about this first patch if they want it in Nintendont or not.

Anyway it was a kind of pain that be obsessed by this issue for literally years. Thank you for reading.
Thanks to SuperrSonic for his work and the Swiss team for their patches and research.

One of my 2 steps for that the Wii U can replace a Wii has been reached. It remains to be able to use GameCube controller on Wii games through the adapter.
 
Last edited by creedof69,

Site & Scene News

New Hot Discussed User Submitted