Files
dolphin/Tools/WiiConformanceProbe

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

  1. 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.
  2. Copy apps/wii-conformance/ to the apps/ folder on each SD card and launch it through the Homebrew Channel. Use the exact same boot.dol on both runs. Dolphin LLE requires a configured writable virtual SD image.
  3. After the program returns, copy sd:/wii-conformance.csv from each SD card to separate files such as wii.csv and dolphin.csv.
  4. 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).