Research emulator for the ARM9 core in the Nintendo Wii.
Credit is due to the following projects and resources that have guided the implementation since the beginning:
- Team Twiizers' fork of Skyeye
- MINI
- Wiibrew
- YAGCD
- libogc
- archshift/llama
- MerryMage/dynarmic
- All of the folks who still work on Wii/GC homebrew
- Execution through the boot ROM
- Execution through IOS first-stage bootloader
- Execution through IOS second-stage bootloader
- Execution in the IOS kernel
- Broadway/PowerPC-world HLE
- Emulated SDHC (SD card) support. (Alpha quality ATM! Place sd image as "sd.img" to connect card)
- Emulated USB support?
- Emulated WLAN functionality?
- Write a bunch of tests
- Guest debugging functionality (perhaps via GDB, or some UI?)
- Go fast (performance optimizations, i.e. a JIT backend, etc)
- Tools for fuzzing guest code
- Other related tools?
ironic is primarily developed on Linux and macOS (x86-64 and AArch64). Support for Windows is provided on best-effort basis. For technical reasons, minimum support is at Windows 10 1809 and Server 2019.
Rough matrix of what software versions get to what stages in the boot process
| Software Versions | past boot1? | past boot2? | into IOS? | Notes |
|---|---|---|---|---|
| 4.3U, boot1d, boot2v4 | No | No | No | None |
| 4.3U, boot1b, boot2v4 | Yes | Yes | Yes | None |
| 4.3U, boot1c, boot2v4 | Yes | Yes | Yes | None |
| 4.3U, boot1b, BootMii/boot2, boot2v4 | Yes | No | N/A | Missing some debug port writes in BootMii somehow Booting into MINI from SD Card results in a crash BootMii's fallback to boot2 results in crash (different) |
| TODO: More results |
I am not interested in accepting contributions to this project and I will probably work on it alone; at least, for now. When I get around to deciding on a license, it will probably be as permissive as possible.
I use Nightly by default, so you may have to do something like this:
$ git clone https://github.com/eigenform/ironic && cd ironic/
...
$ rustup toolchain install nightly
$ rustup override set nightly
$ cargo build --release
In order to boot, ironic expects the following files to live in the project
directory:
boot0.bin- The Wii boot ROM dumped from your consolenand.bin- The NAND flash data dumped from your consoleotp.bin- The associated OTP/fused memory dumped from your consoleseeprom.bin- The associated SEEPROM memory dumped from your console
The included script create_binfiles_from_nand.sh/create_binfiles_from_nand.bat will generate otp.bin and seeprom.bin for you using your nand.bin
You can run the emulator with the interpreter backend like this:
$ cargo run --release
Like skyeye-starlet, the ironic-tui target includes a server for PPC HLE.
Tools for interacting with the server and representing processes on the
PowerPC-side of the machine can be found in pyronic/.