Wii IOS conformance probe
This is the first black-box comparison probe for the original IOS running on a
real Wii and under this fork's Starlet LLE mode. Build one DOL and run that
same file in both places. It records 64 rounds of IPC-backed resource-manager
open/close calls in all four open modes, missing-device errors, root directory
counts, installed-title counts, and an SD write/read/hash/cleanup round trip.
The output contains 1,860 numbered observations. The probe requests no NAND
writes, installs no IOS, and does not blindly scan MMIO registers. It creates and
removes only sd:/wii-conformance-data.bin on the SD card.
Build
Install devkitPPC and libogc/libfat using devkitPro, set DEVKITPRO and
DEVKITPPC in the build shell, then run make in this directory. The output is
wii-conformance.dol. On this Windows machine, the following command was used
successfully from this directory in PowerShell:
& 'C:\devkitPro\msys2\usr\bin\bash.exe' -c 'export DEVKITPRO=/c/devkitPro DEVKITPPC=/c/devkitPro/devkitPPC; export PATH=/c/devkitPro/devkitPPC/bin:/c/devkitPro/tools/bin:/usr/bin:/bin; make'
The ready-to-copy Homebrew Channel folder is apps/wii-conformance/, containing
boot.dol and meta.xml.
Capture
- Use a Wii and a Dolphin LLE profile with the same IOS version and revision. For exact directory/title counts, use the same NAND snapshot, starting state, and loaded title. The SD cards need enough free space for a 4 KiB test file and the CSV output.
- Copy
apps/wii-conformance/to theapps/folder on each SD card and launch it through the Homebrew Channel. Use the exact sameboot.dolon both runs. Dolphin LLE requires a configured writable virtual SD image. - After the program returns, copy
sd:/wii-conformance.csvfrom each SD card to separate files such aswii.csvanddolphin.csv. - Compare them with
python compare.py wii.csv dolphin.csv. Exit code 0 means all recorded observations agree, 1 reports differences, and 2 means the captures are invalid or use different IOS versions.
The CSV contains no keys or NAND contents. An allocated IOS file descriptor is
normalized to success/failure because its numeric value depends on unrelated
open handles. Call return codes and output counts remain exact. Time is not
compared in this first suite because scheduling and output I/O introduce noise.
captures/ is kept local and ignored by Git until each capture's console or
emulator provenance, IOS revision, probe binary hash, and initial NAND state
are documented. A filename alone is not evidence that a capture came from a
physical Wii.
Interpretation and next suites
A mismatch identifies a reproducible behavior to investigate; it does not by itself locate a bad register. Trace the first failing request inside Dolphin's Wii IPC, Starlet memory bus, and the relevant device. The next test suites should use explicit stimulus/response cases for IPC flag acknowledgements, shared-memory cache visibility, DMA, IRQ ordering, and individual devices. PPC homebrew cannot inspect every Starlet register while Nintendo IOS is running. A separate Starlet-side probe under MINI/BootMii can test raw hardware registers, but its results must be labeled as MINI-mode tests.
2026-09-23 IOS58 comparison
The same DOL (SHA-256
28EB2F51CB12B302D736518232CAB59715877A81CD0AABC1A938EF16CF0ADFC4)
ran on a physical Wii and in this fork's Starlet LLE mode under IOS58 revision
6176. Both captures contain all 1,860 observations. The SD tests in LLE first
failed during card initialization because Starlet SDHC did not implement CMD6
(Switch Function). After adding its 64-byte status response, all SD operations
completed and the CSV closed successfully.
The comparison finds 64 differences, all repeats of es_title_count: 111 on
the Wii versus 101 in the Dolphin profile. A read-only walk of the Dolphin raw
NAND and its journal found exactly 101 installed title TMDs. The remaining
1,796 observations match. This result covers the tested IOS58 paths only; it
cannot establish an overall emulator accuracy percentage.
Local captures are captures/wii-ios58-r6176.csv (SHA-256
C08E49B0ADCF1F0EF30FFE16775E3A354D269923028C9B775BBB189E7E2FF3E6)
and captures/dolphin-lle-ios58-r6176.csv (SHA-256
64D2E00EAE67370578BE2A15FC0951E7051E3468252B0D2533F5B968A0E14AD8).