The Wii is an overclocked GameCube wrapped in a new I/O security model. Broadway (CPU), Hollywood (GPU), and the Macronix DSP are functionally identical to their GameCube predecessors—same ISA, same paired-single extensions, same fixed-function TEV pipeline, same DSP instruction set—clocked 1.5× faster and paired with a new 64 MB GDDR3 memory pool and an ARM9 security co-processor (Starlet) running IOS.
For REFORGE, every GameCube code path remains valid; the deltas that matter are the memory map, the IOS-mediated I/O model, the extra eDRAM, and the Wiimote input stack. This document covers each at register level.
CHAPTER 01CPU: IBM Broadway at 729 MHz
Broadway is a PowerPC 750CL at 729 MHz—the same microarchitecture as Gekko (PowerPC 750CXe at 486 MHz) with no new user-visible instructions. CPU version register (PVR) reports 0x00087102 versus Gekko's 0x00083410. The silicon moved from 180 nm to 90 nm SOI (later 65 nm), yielding a die area of just 18.9 mm² and roughly 20% lower power draw despite the 50% clock increase.
The pipeline, execution units, and ISA are byte-identical to Gekko. Six execution units operate in a superscalar, out-of-order configuration: two integer units, one FPU, one load/store unit, one branch unit, and one system register unit. The FPU executes paired-single (PS) instructions—IBM's custom SIMD extension providing two parallel 32-bit float operations per cycle via 32 paired-single FPRs and 8 GQR (Graphics Quantization Registers) for quantized load/store.
The PS instruction set (ps_add, ps_mul, ps_madd, ps_merge00/01/10/11, psq_l, psq_st, etc.) is unchanged from Gekko, and a recompiler targeting Gekko PS code needs zero modifications for Broadway.
Cache hierarchy is identical32 KB L1 I-cache (8-way set-associative), 32 KB L1 D-cache (8-way set-associative, 16 KB lockable as scratchpad via DMA), and 256 KB unified L2 cache (2-way set-associative). L2 supports three fetch modes: 32-byte, 64-byte, and 128-byte bursts. The write-gather pipe address remains at 0xCC008000 (physical 0x0C008000), used for streaming GX FIFO commands to the GPU.
The front-side bus runs at 243 MHz, 64-bit wide, yielding a peak bandwidth of 1.9 GB/s. The bus-to-core multiplier is 3.0×. In GameCube compatibility mode, Broadway downclocks to 486 MHz with a 162 MHz bus.
Broadway-specific register differences from Gekko
Most SPRs are inherited from the 750CXe. Broadway adds HID4 (SPR 1011), not present on Gekko
| Bit | Name | Function |
|---|---|---|
| 28 | SBE | Related to instruction sync; PPCSync enables this, runs sync, restores old value |
| 30 | H4A_PS | Determines whether paired-singles are saved on context switch by Revolution OS |
| 31 | H4A | Unknown purpose; SDK notes a hardware bug making this bit unreliable to clear |
HID0 and HID2 are functionally identical to Gekko. HID2 bit 29 controls the write-gather pipe enable, and bit 30 controls locked-cache DMA enable—unchanged.
Broadway boots from physical address 0xFFF00100, which is mapped to the EXI boot vector. This vector is initialized by Starlet when bootstrapping the PowerPC.
Console clock constants (stored at 0x800000F8–FC)
- Bus speed: 0x0E7BE2C0 (243 MHz = 242,999,040)
- CPU speed: 0x2B73A840 (729 MHz = 728,997,120)
CHAPTER 02Memory architecture: MEM1, MEM2, and the death of ARAM
The Wii's memory is split across two physical pools with fundamentally different characteristics. MEM1 is about 3× faster than MEM2 for CPU reads, which is why code and game-logic structures live in MEM1 while assets, textures, and audio buffers go in MEM2.
Physical memory map (PPC view)
| Virtual (Cached) | Virtual (Uncached) | Physical | Size | Description |
|---|---|---|---|---|
| 0x80000000–0x817FFFFF | 0xC0000000–0xC17FFFFF | 0x00000000–0x017FFFFF | 24 MB | MEM1 — 1T-SRAM (inside Hollywood) |
| 0x90000000–0x93FFFFFF | 0xD0000000–0xD3FFFFFF | 0x10000000–0x13FFFFFF | 64 MB | MEM2 — GDDR3 SDRAM |
| 0xCC000000–0xCC008003 | — | 0x0C000000–0x0C008003 | ~32 KB | Legacy hardware registers (GX, DSP, VI, SI, EXI, AI, DI, PI) |
| 0xCD000000–0xCD008000 | — | 0x0D000000–0x0D008000 | 32 KB | Hollywood registers (shared with Starlet) |
| 0xC8000000–0xC8300000 | — | 0x08000000–0x08300000 | 3 MB | GX Embedded Framebuffer (EFB) |
Comparison with GameCube
| Component | GameCube | Wii |
|---|---|---|
| Main RAM | 24 MB 1T-SRAM (Splash), external | 24 MB 1T-SRAM (MEM1), inside Hollywood |
| Auxiliary RAM | 16 MB ARAM (serial SDRAM), DMA-only | 64 MB GDDR3 (MEM2), directly addressable |
| ARAM access | DSP DMA or ARAM DMA controller | N/A — ARAM registers exist but are non-functional |
| Audio data storage | ARAM | MEM1 or MEM2 (DSP accesses both directly) |
| Total usable | ~40 MB (24 + 16 DMA) | ~76 MB (24 + ~52 after IOS reservation) |
MEM2 IOS reservation
IOS reserves the top 12–16 MB of MEM2 for its own use. Key addresses from global memory locations
| Address | Value | Meaning |
|---|---|---|
| 0x80003118 | 0x04000000 | Physical MEM2 size (64 MB) |
| 0x80003124 | 0x90000800 | Usable MEM2 start |
| 0x80003128 | 0x933E0000 | Usable MEM2 end |
| 0x80003130 | 0x933E0000 | IOS IPC buffer start |
| 0x80003134 | 0x93400000 | IOS IPC buffer end |
| 0x80003148 | 0x93600000 | IOS reserved heap start |
| 0x8000314C | 0x93620000 | IOS reserved heap end |
In GameCube compatibility mode (MIOS), the bottom 16 MB of MEM2 emulates ARAM; the rest of MEM2 is inaccessible to GameCube code.
Global memory locations (MEM1 low area)
The first 0x3200 bytes of MEM1 contain OS globals shared between Broadway and IOS
| Address | Size | Description | |
|---|---|---|---|
| 0x80000000 | 4 | Game ID (e.g. 'RSPE') | |
| 0x80000018 | 4 | Wii disc magic: 0x5D1C9EA3 | |
| 0x8000001C | 4 | GC disc magic: 0xC2339F3D | |
| 0x80000020 | 4 | Boot code magic: 0x0D15EA5E | |
| 0x80000028 | 4 | Physical MEM1 size: 0x01800000 (24 MB) | |
| 0x800000CC | 4 | Video mode (0=NTSC, 1=PAL, 2=MPAL) | |
| 0x800000F8 | 4 | Bus speed: 0x0E7BE2C0 | |
| 0x800000FC | 4 | CPU speed: 0x2B73A840 | |
| 0x80003138 | 4 | Hollywood version: 0x00000011 | |
| 0x80003140 | 4 | IOS version (packed: major | minor) |
CHAPTER 03GPU: ATI Hollywood at 243 MHz
Hollywood's graphics core is functionally identical to Flipper—same fixed-function pipeline, same TEV architecture, same vertex and pixel processing units—running at 243 MHz versus Flipper's 162 MHz (exactly 1.5×). The TEV unit and its capabilities are explicitly confirmed as unchanged across multiple authoritative sources. There are no programmable shaders.
Pipeline architecture (inherited from Flipper)
The GX pipeline processes commands from a FIFO ring buffer in main memory. The CPU writes to the FIFO via the write-gather pipe at 0xCC008000:
Command Processor (CP) → receives 8-bit commands from FIFO → routes to internal units
- 0x08: CP register write (8-bit + 32-bit)
- 0x10: XF register write (16-bit addr + N × 32-bit data)
- 0x61: BP register write (8-bit reg + 24-bit value)
- 0x80–0xB8: Primitive draw commands (vertex data follows)
Transform Unit (XF) — handles vertex transforms, lighting, and texture coordinate generation. Processes up to one 16-byte vertex per cycle.
Setup/Rasterizer — triangle setup and rasterization. Four parallel pixel pipelines can output up to 2×2 pixels per cycle.
Texture Unit — four texture mapping units, each processing up to 8 textures per cycle via multi-texturing loops. Supports hardware S3TC (SRTC) decompression, mipmapping, and anisotropic filtering. 1 MB texture cache (1T-SRAM) can be split between cache and scratchpad.
TEV (Texture Environment Unit) — 16 programmable stages of fixed-function color blending. Each stage can combine texture colors, vertex colors, rasterized colors, and constants using configurable blend equations. TEV enables shader-like effects (cel shading, bump mapping, environment mapping) without programmable shaders. Games configure TEV at runtime via BP registers.
Pixel Engine (PE) — handles fog blending, Z-compare, alpha blending, and EFB writes.
Hardware register bases
| Unit | Base Address | Length | Access |
|---|---|---|---|
| Command Processor (CP) | 0x0C000000 | 0x80 | 16-bit |
| Pixel Engine (PE) | 0x0C001000 | 0x100 | 32-bit |
| Video Interface (VI) | 0x0C002000 | 0x100 | 16/32-bit |
| Processor Interface (PI) | 0x0C003000 | 0x100 | 32-bit |
| Memory Interface (MI) | 0x0C004000 | 0x80 | 16-bit |
| DSP Interface | 0x0C005000 | 0x200 | 16-bit |
| Disc Interface (DI) | 0x0C006000 | 0x40 | 32-bit |
| Serial Interface (SI) | 0x0C006400 | 0x100 | 32-bit |
| External Interface (EXI) | 0x0C006800 | 0x40 | 32-bit |
| Audio Interface (AI) | 0x0C006C00 | 0x20 | 32-bit |
| GX FIFO (WGPIPE) | 0x0C008000 | 0x4 | 32-bit |
eDRAM: 3 MB vs Flipper's 2 MB
Hollywood increases the embedded framebuffer (EFB) from 2 MB to 3 MB of 1T-SRAM, mapped at physical 0x08000000 (virtual 0xC8000000). This eDRAM provides ~12.8 GB/s internal bandwidth and is used for the Z-buffer, color buffer, and copy-out operations.
The extra 1 MB does not change the fundamental EFB architecture—games still render to the EFB then copy to an external framebuffer (XFB) in main memory for VI display. However, the additional space enables more room for anti-aliasing sample buffers at standard resolutions. At 640×528 with 24-bit color + 24-bit Z, a single framebuffer+Z consumes ~1.93 MB; the extra MB gives breathing room for multisampling.
Video output
The Wii outputs 480i/480p (NTSC) or 576i/576p (PAL) via the AV Multi Out connector. Component video (YPbPr) is supported for 480p progressive scan. Maximum framebuffer resolution is 640×528 (NTSC) or 640×574 (PAL). The VI generates a standard-definition analog signal—no HD output is possible.
Widescreen is implemented via anamorphic renderingthe projection matrix widens the field of view, the TV stretches the 4:3 signal to 16:9. The framebuffer dimensions remain unchanged.
CHAPTER 04Audio: Macronix DSP at 121.5 MHz
The Wii retains the identical Macronix custom 16-bit DSP from the GameCube, clocked at 121.5 MHz (up from 81 MHz on GameCube—again the 1.5× factor). Architecture, instruction set, and register interface are unchanged.
DSP specifications
| Parameter | Value |
|---|---|
| Architecture | Custom Macronix 16-bit, big-endian |
| Data RAM | 8 KB |
| Data ROM | 4 KB |
| Instruction RAM | 8 KB |
| Instruction ROM | 8 KB |
| Hardware decoder | DSP-ADPCM (4-bit, 14 samples per 8-byte frame) |
| Mixing capacity | Up to 64 voices (AX microcode) |
Key DSP registers (base 0x0C005000)
| Register | Address | Description |
|---|---|---|
| DSP_MAILBOX_IN_H | 0xCC005000 | CPU→DSP mailbox high (bit 15 = set flag) |
| DSP_MAILBOX_IN_L | 0xCC005002 | CPU→DSP mailbox low |
| DSP_MAILBOX_OUT_H | 0xCC005004 | DSP→CPU mailbox high (bit 15 = valid) |
| DSP_MAILBOX_OUT_L | 0xCC005006 | DSP→CPU mailbox low |
| DSP_CONTROL_STATUS | 0xCC00500A | Master control (halt, reset, interrupts, DMA status) |
DSP_CONTROL_STATUS bit fieldsbit 0 = RES (reset, triggers DMA of 1024 bytes to IRAM), bit 2 = HALT, bit 3 = AIDINT, bit 4 = AIDINTMSK, bit 7 = DSPINT, bit 8 = DSPINTMSK, bit 11 = BOOTMODE.
ARAM DMA registers (still present but non-functional on Wii)
The ARAM DMA registers at 0xCC005020–0xCC00502A exist for backward compatibility but return zeroes on read. In MIOS mode, the bottom 16 MB of MEM2 emulates ARAM and these registers become functional.
Audio Interface (AI) registers
| Register | Address | Description |
|---|---|---|
| AI_CONTROL | 0xCC006C00 | Bit 6: rate (0=48 kHz, 1=32 kHz); bit 0: play status |
| AI_VOLUME | 0xCC006C04 | Left (7:0), Right (15:8), 0x00–0xFF |
| AI_AISCNT | 0xCC006C08 | Sample counter (read-only) |
| AI_AIIT | 0xCC006C0C | Interrupt timing (fires when AISCNT matches) |
The only meaningful audio difference from GameCubeARAM does not exist. The DSP accesses MEM1 or MEM2 directly for audio sample data. Games (and the AX library) store DSP-ADPCM samples in MEM2 instead of ARAM.
DSP-ADPCM format
4 bits per sample, 8-byte frames (1-byte header + 7 bytes = 14 samples). Header encodes a scale value (bits 3:0) and coefficient index (bits 7:4) selecting from 8 pre-computed coefficient pairs. Compression ratio is ~3.5:1 versus 16-bit PCM. Coefficients are stored in the sample header structure in main memory, not in the audio data stream itself.
CHAPTER 05Disc format: proprietary DVD
Wii discs use a full-size 12 cm DVD with proprietary formatting (burst cutting area prevents standard DVD readers from accessing content). Capacity is 4.7 GB (single-layer) or 8.54 GB (dual-layer), versus the GameCube's 8 cm Mini-DVD at 1.5 GB.
Partition structure
Wii discs contain multiple partitions (typically Update + Data). The partition table lives at offset 0x40000:
| Offset | Content |
|---|---|
| 0x00000–0x003FF | Disc header (game ID, maker code, disc magic 0x5D1C9EA3) |
| 0x40000 | Partition info table (up to 4 groups) |
| 0x4E000 | Region settings |
Each partition contains a Ticket (with AES-encrypted title key), TMD (Title Metadata with content SHA-1 hashes), and encrypted partition data.
Encryption
Partition data is encrypted with AES-128-CBC using the title key (decrypted from the Ticket using the console's common key from OTP). Data is organized in 32 KB clusters: 0x400 bytes of encrypted SHA-1 hash data + 0x7C00 bytes of encrypted user data. A three-level hash hierarchy (H0→H1→H2→H3) provides integrity verification, with the H3 table's SHA-1 stored in the TMD.
On GameCube, disc access was direct hardware I/O via DI registers. On Wii, all disc I/O goes through IOS via /dev/di IPC calls—games never touch disc hardware directly.
CHAPTER 06Wii Remote: Bluetooth HID protocol and data formats
The Wiimote communicates over Bluetooth 2.0 using the HID protocol on L2CAP PSM 0x11 (control) and 0x13 (data). It's built around a Broadcom BCM2042 SoC with 16 KB EEPROM. The HID descriptor reports only payload sizes, not data semantics—all data formats are reverse-engineered.
Button bitmask (2 bytes, big-endian, present in all reports except 0x3d)
| Bit | Mask | Byte 0 | Byte 1 |
|---|---|---|---|
| 0 | 0x01 | D-Pad Left | Two |
| 1 | 0x02 | D-Pad Right | One |
| 2 | 0x04 | D-Pad Down | B |
| 3 | 0x08 | D-Pad Up | A |
| 4 | 0x10 | Plus | Minus |
| 7 | 0x80 | — | Home |
Bits 5–6 of both bytes carry accelerometer LSBs (see below).
Accelerometer: ADXL330
Three-axis, ±3g range. Data is 10-bit for X axis, 9-bit for Y and Z. Zero-g offset is approximately 0x80 (midpoint). Calibration data is stored in EEPROM at addresses 0x0016–0x001F (two copies for redundancy). Each calibration block stores 0g offsets and 1g reference values for all three axes with a checksum byte.
In standard reporting modes (0x31, 0x33, 0x35, 0x37), accelerometer data occupies 3 bytes (XX YY ZZ), with LSBs packed into unused button bits: byte 0 bits 6:5 = X[1:0], byte 1 bit 6 = Z[1], byte 1 bit 5 = Y[1].
IR camera: PixArt sensor
A 128×96 monochrome camera with on-chip blob tracking, providing 1024×768 sub-pixel resolution via 8× interpolation. Tracks up to 4 IR points simultaneously. Field of view: ~33° horizontal, ~23° vertical. The sensor bar provides two IR LED clusters separated by 20 cm.
IR camera initialization sequence(1) enable pixel clock via report 0x13, (2) enable logic via report 0x1a, (3) write 0x08 to register 0xB00030, (4) write 9-byte sensitivity block to 0xB00000, (5) write 2-byte sensitivity block to 0xB0001A, (6) write mode to 0xB00033, (7) write 0x08 to 0xB00030 again.
Three data modes (must match report mode byte count exactly)
| Mode | Bytes/object | Total | Data per object |
|---|---|---|---|
| Basic (1) | 5 per 2 objects | 10 | X[9:0], Y[9:0] |
| Extended (3) | 3 | 12 | X[9:0], Y[9:0], Size[3:0] |
| Full (5) | 9 | 36 (2×18, interleaved) | X, Y, Size, bounding box (Xmin/Ymin/Xmax/Ymax), intensity |
Missing objects return 0xFF in all fields.
Data reporting modes
| Mode | Payload | Contents |
|---|---|---|
| 0x30 | 2 | Buttons only |
| 0x31 | 5 | Buttons + Accelerometer (3 bytes) |
| 0x32 | 10 | Buttons + 8 Extension bytes |
| 0x33 | 17 | Buttons + Accel + 12 IR bytes (Extended mode) |
| 0x34 | 21 | Buttons + 19 Extension bytes |
| 0x35 | 21 | Buttons + Accel + 16 Extension bytes |
| 0x36 | 21 | Buttons + 10 IR bytes + 9 Extension bytes |
| 0x37 | 21 | Buttons + Accel + 10 IR + 6 Extension bytes |
| 0x3d | 21 | 21 Extension bytes only (no buttons) |
| 0x3e/0x3f | 21 each | Interleaved: Buttons + Accel + 36 IR (Full mode, half-speed) |
Mode is set via output report 0x12(a2) 12 TT MM where bit 2 of TT enables continuous reporting, MM is the mode ID. Default on power-up is 0x30.
Speaker
21 mm piezoelectric, supporting 4-bit Yamaha ADPCM or 8-bit signed PCM. Configuration via 7 bytes at register 0xA20001–0xA20008: byte 1 = format (0x00=ADPCM, 0x40=PCM8), bytes 2–3 = sample rate (little-endian; adpcm_rate = 6000000/value, pcm_rate = 12000000/value), byte 4 = volume. Audio data sent via report 0x18 (up to 20 bytes per report). Standard config: 3000 Hz 4-bit ADPCM.
Rumble
Controlled by bit 0 of byte 0 in every output report. Setting this bit activates the rumble motor; clearing it deactivates. The bit must be set correctly in every report to avoid inadvertently toggling the motor.
Extension controllers
Connected via 6-pin I²C port at 400 kHz, slave address 0x52. Register space mapped at 0xA40000 in Wiimote address space. Initialization: write 0x55 to 0xA400F0, then 0x00 to 0xA400FB (disables encryption, returns plaintext data). Extension ID read from 6 bytes at 0xA400FA.
Nunchuk data format (6 bytes at 0xA40008)
| Byte | Content |
|---|---|
| 0 | Stick X (0–255, center ~128) |
| 1 | Stick Y (0–255, center ~128) |
| 2 | Accelerometer X[9:2] |
| 3 | Accelerometer Y[9:2] |
| 4 | Accelerometer Z[9:2] |
| 5 | AZ[1:0] \| AY[1:0] \| AX[1:0] \| BC (0=pressed) \| BZ (0=pressed) |
Classic Controller reports 6 bytes with packed analog stick data (LX/LY 6-bit, RX/RY 5-bit, triggers 5-bit) and a 16-bit button bitmask (active-low). Higher-precision data format 0x02 provides 10-bit sticks and 8-bit triggers in 9 bytes.
GameCube controller (SI protocol)
Four GC controller ports on top of the Wii connect via the Serial Interface (SI) at register base 0x0C006400. Each port has a 32-byte buffer. The GC controller protocol uses a proprietary single-wire serial interface at 200 kHz with a standard polling command (0x400300) returning 8 bytes: buttons (16 bits), stick X/Y, C-stick X/Y, left trigger, right trigger—all 8-bit unsigned.
CHAPTER 07IOS: the ARM Starlet security co-processor
Hardware
An ARM926EJ-S (ARMv5TEJ) clocked at 243 MHz, embedded inside the Hollywood SoC. It has 96 KB internal SRAM, access to MEM2 (reserves ~12 MB for itself), and hardware AES-128 and SHA-1 accelerators. It manages all Wii-specific I/O: disc drive, USB 2.0, Bluetooth, Wi-Fi (802.11 b/g via SDIO), NAND flash (512 MB), and SD card.
IPC mechanism (Broadway ↔ Starlet)
Communication uses four hardware registers
| Address | Name | Description |
|---|---|---|
| 0x0D800000 | HW_IPC_PPCMSG | Broadway writes pointer to 0x40-byte IPC request struct |
| 0x0D800004 | HW_IPC_PPCCTRL | Broadway control flags (X1 set, Y1/Y2 read/clear) |
| 0x0D800008 | HW_IPC_ARMMSG | Starlet writes reply pointer |
| 0x0D80000C | HW_IPC_ARMCTRL | Starlet control flags |
IPC request structure (0x40 bytes, 0x20-aligned)
struct ipc_request {
u32 cmd; // 0x00: 1=open, 2=close, 3=read, 4=write, 5=seek, 6=ioctl, 7=ioctlv
u32 ret; // 0x04: return value
u32 fd; // 0x08: file descriptor
u32 arg[5]; // 0x0C: command arguments
};Transaction flowPPC writes request pointer to HW_IPC_PPCMSG → sets X1 flag → Starlet receives IRQ #31 → routes request to appropriate /dev/ handler → sets Y2 (acknowledge) → processes → writes reply to HW_IPC_ARMMSG → sets Y1 → PPC receives IRQ #30.
Device nodes
Games access all hardware through file-like IOS device nodes: /dev/di (disc), /dev/es (title management), /dev/fs (NAND filesystem), /dev/usb/, /dev/net/, /dev/sdio/slot0 (SD card), /dev/stm/* (power management). Each uses open/close/ioctl/ioctlv semantics.
NAND flash
512 MB total. Page size 2048+64 bytes. Uses SFFS (Secure FAT FileSystem) with AES-128-CBC encryption (per-console NAND key from OTP) and HMAC-SHA1 integrity. Directory structure: /title/ (installed titles), /ticket/ (title tickets), /shared1/ (shared content), /sys/ (system data), /tmp/.
CHAPTER 08GameCube backward compatibility
Transition sequence
When a GC disc is detected, the System Menu launches the BC title (0x0000000100000100), which: (1) lowers Broadway from 729→486 MHz and Hollywood from 243→162 MHz via hardware clock registers, (2) loads MIOS (a minimal IOS containing the GameCube IPL). MIOS locks down all Wii-specific hardware (USB, Bluetooth, Wi-Fi, NAND, SD) and gives Broadway direct hardware access to legacy registers—no IPC, no IOS mediation.
State comparison
| Component | Wii mode | GC mode |
|---|---|---|
| CPU clock | 729 MHz | 486 MHz |
| GPU clock | 243 MHz | 162 MHz |
| MEM1 | 24 MB, accessible | 24 MB, accessible (primary) |
| MEM2 | 64 MB, shared | Bottom 16 MB emulates ARAM; rest hidden |
| I/O model | IPC through IOS | Direct memory-mapped hardware registers |
| Controllers | Wiimote (Bluetooth) | GC controller ports (SI) |
| Disc I/O | IOS-mediated via /dev/di | Direct DI register access |
What MIOS patches
MIOS includes known game-specific patches for ZeldaWind Waker, Zelda: Collector's Edition, Tony Hawk's Pro Skater 3, and Pokémon Colosseum—fixing video timing issues and DVD read hooks. It blocks Datel/Action Replay discs from MIOS v5 onward.
Limitations
No GameCube Broadband/Modem Adapter (Wii lacks serial ports). No Game Boy Player. GameCube memory cards required (Wii NAND cannot save GC data). Wii Remote is disabled.
CHAPTER 09Implications for REFORGE static recompilation
For a Wii-targeting static recompiler, the critical architectural facts are
Instruction setIdentical to GameCube. PowerPC 750CL with paired-single extensions. No new instructions. A Gekko recompiler handles Broadway with zero ISA changes—only timing behavior differs due to the 1.5× clock.
Memory modelThe recompiler must handle two disjoint physical memory regions (MEM1 at 0x00000000, MEM2 at 0x10000000) with BAT-mapped virtual addresses. Games typically use MEM1 cached at 0x80000000 and MEM2 cached at 0x90000000.
I/O abstractionUnlike GameCube games (direct hardware access), Wii games interact with hardware exclusively through IOS IPC. The recompiler must provide equivalent /dev/ services—particularly /dev/di for disc reads, /dev/es for title operations, and /dev/net for networking.
GPU commandsThe GX FIFO command stream is identical to GameCube. Commands are written through the write-gather pipe at 0xCC008000. BP/CP/XF register formats are unchanged. The 3 MB EFB (vs 2 MB) only affects framebuffer size calculations, not command formats.
Controller inputWiimote data arrives via IOS Bluetooth stack, not direct hardware registers. The recompiler must emulate the WPAD library's IPC calls or provide equivalent input abstraction. GC controller input via SI registers is identical to GameCube.
Content decryptionWii disc images must be decrypted (AES-128-CBC per partition) before the recompiler can access game code. The title key is extracted from the partition Ticket using the common key.