PURPOSE: Verify the Dolphin Python bridge is reachable and responding. USAGE: Call once at session start before other tool calls. Issues the bridge's `bridge.ping` method — doubles as a liveness probe and bridge-version sniff. BEHAVIOR: No side effects. mcp-dolphin connects to the bridge on demand (TCP 127.0.0.1:55355 by default). The bridge must be loaded inside Dolphin via Scripting → Add New Script → mcp_bridge.py. 10-second timeout if the bridge isn't running, Dolphin isn't running, or the port is wrong. RETURNS: Single line 'OK — bridge vBRIDGE_VERSION (DOLPHIN_LABEL)'.
PURPOSE: Report what the bridge knows about its environment (bridge version, Dolphin label). v0.1.0 doesn't query game metadata — Felk's API doesn't expose disc ID / title directly, those have to be read from OS_GLOBALS at 0x80000020 yourself via dolphin_read_range. USAGE: Diagnostic. For game state, use dolphin_read_range(0x80000000, 32) and decode: bytes 0-3 are the disc ID (4-char ASCII), 4-5 are maker code, 6 is disc number, 7 is disc version. BEHAVIOR: No side effects. Same underlying call as dolphin_ping but presents fields explicitly. RETURNS: Multi-line text — Bridge version, Dolphin label.
PURPOSE: Read an unsigned 8-bit byte from PowerPC memory at the given absolute address. USAGE: Use for single-byte fields — flags, counters, small enums. For 16/32/64-bit values use dolphin_read16/read32/read64. For spans of more than ~4 bytes use dolphin_read_range. PowerPC is big-endian — so for multi-byte values you almost always want the dedicated width tool, not this one. BEHAVIOR: No side effects — pure read. No alignment requirement. Returns an error on unmapped address, bridge disconnect, or bridge FAIL.
GameCube + Wii main address space landmarks (PowerPC, big-endian):
0x80000000-0x817FFFFF MEM1 main RAM (24 MiB) — GameCube + Wii game code & data
GameCube games stay entirely within MEM1.
Wii games use MEM1 for code and frequently-accessed data.
0x80000020 OS_GLOBALS — game-info struct (disc ID, FST, etc.)
0x80000034 OS_ARENA_LO (start of free MEM1 heap)
0x80003100 OS_REPORT (developer-console mirror, varies by SDK)
0x90000000-0x93FFFFFF MEM2 (64 MiB) — Wii ONLY. Larger texture/asset data,
IOS work areas. Reading MEM2 on a GameCube game
returns garbage / FAIL.
0xCC000000-0xCC00FFFF Hollywood I/O (Wii) / Flipper I/O (GameCube) — DMA,
GPU FIFO, AI, EXI registers. Reads are usually safe,
writes can wedge the emulator. Avoid.
0xCD000000-0xCD007FFF Wii-only Hollywood registers.
Notes:
• All multi-byte values are BIG-ENDIAN on the real hardware. Felk's
memory.read_u*/write_u* helpers handle the byte swap for you —
the value you see is the value the game sees as a u32.
• Addresses are 32-bit; Felk truncates the high bits of any u64
address argument.
• Pointers in MEM1 are often stored as 4-byte addresses with the
high bit set (e.g. 0x81234567). Dereferencing them requires no
masking — pass the raw value back into memory.read_*.
RETURNS: Single line 'ADDR_HEX: VAL_DEC (0xVAL_HEX)', e.g. '0x80003000: 99 (0x63)'.
PURPOSE: Read an unsigned 16-bit big-endian value from PowerPC memory at the given absolute address. USAGE: For 16-bit fields — HP, score, coordinates on many GC/Wii titles. For single bytes use dolphin_read8; for 32/64-bit use dolphin_read32/read64. Value is interpreted big-endian (PowerPC native); the byte at `address` is the high byte. BEHAVIOR: No side effects — pure read. Address MUST be 2-byte aligned. Returns an error on unmapped address, bridge disconnect, or FAIL.
GameCube + Wii main address space landmarks (PowerPC, big-endian):
0x80000000-0x817FFFFF MEM1 main RAM (24 MiB) — GameCube + Wii game code & data
GameCube games stay entirely within MEM1.
Wii games use MEM1 for code and frequently-accessed data.
0x80000020 OS_GLOBALS — game-info struct (disc ID, FST, etc.)
0x80000034 OS_ARENA_LO (start of free MEM1 heap)
0x80003100 OS_REPORT (developer-console mirror, varies by SDK)
0x90000000-0x93FFFFFF MEM2 (64 MiB) — Wii ONLY. Larger texture/asset data,
IOS work areas. Reading MEM2 on a GameCube game
returns garbage / FAIL.
0xCC000000-0xCC00FFFF Hollywood I/O (Wii) / Flipper I/O (GameCube) — DMA,
GPU FIFO, AI, EXI registers. Reads are usually safe,
writes can wedge the emulator. Avoid.
0xCD000000-0xCD007FFF Wii-only Hollywood registers.
Notes:
• All multi-byte values are BIG-ENDIAN on the real hardware. Felk's
memory.read_u*/write_u* helpers handle the byte swap for you —
the value you see is the value the game sees as a u32.
• Addresses are 32-bit; Felk truncates the high bits of any u64
address argument.
• Pointers in MEM1 are often stored as 4-byte addresses with the
high bit set (e.g. 0x81234567). Dereferencing them requires no
masking — pass the raw value back into memory.read_*.
RETURNS: Single line 'ADDR_HEX: VAL_DEC (0xVAL_HEX)'.
PURPOSE: Read an unsigned 32-bit big-endian value from PowerPC memory at the given absolute address. USAGE: The workhorse — most game state and pointers are 32-bit. Use for timestamps, large counters, RGBA colors, full pointers (PowerPC is a 32-bit ISA so pointers fit here). For 8/16/64-bit values use the corresponding sibling. BEHAVIOR: No side effects — pure read. Address MUST be 4-byte aligned. Returns an error on unmapped address, bridge disconnect, or FAIL.
GameCube + Wii main address space landmarks (PowerPC, big-endian):
0x80000000-0x817FFFFF MEM1 main RAM (24 MiB) — GameCube + Wii game code & data
GameCube games stay entirely within MEM1.
Wii games use MEM1 for code and frequently-accessed data.
0x80000020 OS_GLOBALS — game-info struct (disc ID, FST, etc.)
0x80000034 OS_ARENA_LO (start of free MEM1 heap)
0x80003100 OS_REPORT (developer-console mirror, varies by SDK)
0x90000000-0x93FFFFFF MEM2 (64 MiB) — Wii ONLY. Larger texture/asset data,
IOS work areas. Reading MEM2 on a GameCube game
returns garbage / FAIL.
0xCC000000-0xCC00FFFF Hollywood I/O (Wii) / Flipper I/O (GameCube) — DMA,
GPU FIFO, AI, EXI registers. Reads are usually safe,
writes can wedge the emulator. Avoid.
0xCD000000-0xCD007FFF Wii-only Hollywood registers.
Notes:
• All multi-byte values are BIG-ENDIAN on the real hardware. Felk's
memory.read_u*/write_u* helpers handle the byte swap for you —
the value you see is the value the game sees as a u32.
• Addresses are 32-bit; Felk truncates the high bits of any u64
address argument.
• Pointers in MEM1 are often stored as 4-byte addresses with the
high bit set (e.g. 0x81234567). Dereferencing them requires no
masking — pass the raw value back into memory.read_*.
RETURNS: Single line 'ADDR_HEX: VAL_DEC (0xVAL_HEX)'.
PURPOSE: Read an unsigned 64-bit big-endian value from PowerPC memory at the given absolute address. USAGE: For paired 32-bit slots, doubles, packed flags. PowerPC is 32-bit so true 64-bit fields are less common than on PS2 — usually game state is 32-bit. Use this when you actually have a 64-bit field, not as a convenience for two 32-bit reads. BEHAVIOR: No side effects — pure read. Address MUST be 8-byte aligned. The result is returned as a decimal STRING (not a JSON number) to preserve precision past 2^53. Returns an error on unmapped address, bridge disconnect, or FAIL.
GameCube + Wii main address space landmarks (PowerPC, big-endian):
0x80000000-0x817FFFFF MEM1 main RAM (24 MiB) — GameCube + Wii game code & data
GameCube games stay entirely within MEM1.
Wii games use MEM1 for code and frequently-accessed data.
0x80000020 OS_GLOBALS — game-info struct (disc ID, FST, etc.)
0x80000034 OS_ARENA_LO (start of free MEM1 heap)
0x80003100 OS_REPORT (developer-console mirror, varies by SDK)
0x90000000-0x93FFFFFF MEM2 (64 MiB) — Wii ONLY. Larger texture/asset data,
IOS work areas. Reading MEM2 on a GameCube game
returns garbage / FAIL.
0xCC000000-0xCC00FFFF Hollywood I/O (Wii) / Flipper I/O (GameCube) — DMA,
GPU FIFO, AI, EXI registers. Reads are usually safe,
writes can wedge the emulator. Avoid.
0xCD000000-0xCD007FFF Wii-only Hollywood registers.
Notes:
• All multi-byte values are BIG-ENDIAN on the real hardware. Felk's
memory.read_u*/write_u* helpers handle the byte swap for you —
the value you see is the value the game sees as a u32.
• Addresses are 32-bit; Felk truncates the high bits of any u64
address argument.
• Pointers in MEM1 are often stored as 4-byte addresses with the
high bit set (e.g. 0x81234567). Dereferencing them requires no
masking — pass the raw value back into memory.read_*.
RETURNS: Single line 'ADDR_HEX: VAL_DEC (0xVAL_HEX)' — VAL_DEC is a decimal string that may exceed 2^53.
PURPOSE: Read a contiguous range of bytes from PowerPC memory as a hex dump. USAGE: For >4 bytes — far cheaper than looping dolphin_read8 (one bridge round-trip vs N). Max 65536 bytes/call; chunk larger reads in 64 KiB. Powers snapshot-diff RAM hunting, unknown-struct inspection, and region capture. BEHAVIOR: No side effects. The bridge reads byte-by-byte via Felk's memory.read_u8 then returns hex over the wire. No alignment requirement.
GameCube + Wii main address space landmarks (PowerPC, big-endian):
0x80000000-0x817FFFFF MEM1 main RAM (24 MiB) — GameCube + Wii game code & data
GameCube games stay entirely within MEM1.
Wii games use MEM1 for code and frequently-accessed data.
0x80000020 OS_GLOBALS — game-info struct (disc ID, FST, etc.)
0x80000034 OS_ARENA_LO (start of free MEM1 heap)
0x80003100 OS_REPORT (developer-console mirror, varies by SDK)
0x90000000-0x93FFFFFF MEM2 (64 MiB) — Wii ONLY. Larger texture/asset data,
IOS work areas. Reading MEM2 on a GameCube game
returns garbage / FAIL.
0xCC000000-0xCC00FFFF Hollywood I/O (Wii) / Flipper I/O (GameCube) — DMA,
GPU FIFO, AI, EXI registers. Reads are usually safe,
writes can wedge the emulator. Avoid.
0xCD000000-0xCD007FFF Wii-only Hollywood registers.
Notes:
• All multi-byte values are BIG-ENDIAN on the real hardware. Felk's
memory.read_u*/write_u* helpers handle the byte swap for you —
the value you see is the value the game sees as a u32.
• Addresses are 32-bit; Felk truncates the high bits of any u64
address argument.
• Pointers in MEM1 are often stored as 4-byte addresses with the
high bit set (e.g. 0x81234567). Dereferencing them requires no
masking — pass the raw value back into memory.read_*.
RETURNS: 'ADDR_HEX [N bytes]:' header + space-separated 2-digit uppercase hex bytes.
PURPOSE: Write a single unsigned byte (0-255) to PowerPC memory at the given absolute address. USAGE: Use for single-byte cheats, debug pokes, and game-state mutations. For 16/32/64-bit values prefer dolphin_write16/write32/write64 (atomic from the game's perspective). To roll back, dolphin_save_state BEFORE the write and dolphin_load_state to restore. BEHAVIOR: DESTRUCTIVE: overwrites with no undo. Direct memory access — bypasses PowerPC MMU translation and any DMA semantics. Writes to read-only regions (boot ROM at 0xFFF00000, certain I/O ranges) are silently dropped by Dolphin. The write takes effect immediately, but visible effects appear only when the emulator next ticks. No alignment requirement for byte access.
GameCube + Wii main address space landmarks (PowerPC, big-endian):
0x80000000-0x817FFFFF MEM1 main RAM (24 MiB) — GameCube + Wii game code & data
GameCube games stay entirely within MEM1.
Wii games use MEM1 for code and frequently-accessed data.
0x80000020 OS_GLOBALS — game-info struct (disc ID, FST, etc.)
0x80000034 OS_ARENA_LO (start of free MEM1 heap)
0x80003100 OS_REPORT (developer-console mirror, varies by SDK)
0x90000000-0x93FFFFFF MEM2 (64 MiB) — Wii ONLY. Larger texture/asset data,
IOS work areas. Reading MEM2 on a GameCube game
returns garbage / FAIL.
0xCC000000-0xCC00FFFF Hollywood I/O (Wii) / Flipper I/O (GameCube) — DMA,
GPU FIFO, AI, EXI registers. Reads are usually safe,
writes can wedge the emulator. Avoid.
0xCD000000-0xCD007FFF Wii-only Hollywood registers.
Notes:
• All multi-byte values are BIG-ENDIAN on the real hardware. Felk's
memory.read_u*/write_u* helpers handle the byte swap for you —
the value you see is the value the game sees as a u32.
• Addresses are 32-bit; Felk truncates the high bits of any u64
address argument.
• Pointers in MEM1 are often stored as 4-byte addresses with the
high bit set (e.g. 0x81234567). Dereferencing them requires no
masking — pass the raw value back into memory.read_*.
RETURNS: 'Wrote VAL_DEC (0xVAL_HEX) → ADDR_HEX'.
PURPOSE: Write an unsigned 16-bit big-endian value to PowerPC memory. USAGE: For 16-bit cheats/pokes (HP, score, coordinates). For single bytes use dolphin_write8; for 32/64-bit use dolphin_write32/write64. The value is byte-swapped to big-endian by Felk's bridge — pass the value the game logically sees, not its byte order. BEHAVIOR: DESTRUCTIVE: overwrites two bytes with no undo. Address MUST be 2-byte aligned. Returns an error on bridge disconnect or FAIL.
GameCube + Wii main address space landmarks (PowerPC, big-endian):
0x80000000-0x817FFFFF MEM1 main RAM (24 MiB) — GameCube + Wii game code & data
GameCube games stay entirely within MEM1.
Wii games use MEM1 for code and frequently-accessed data.
0x80000020 OS_GLOBALS — game-info struct (disc ID, FST, etc.)
0x80000034 OS_ARENA_LO (start of free MEM1 heap)
0x80003100 OS_REPORT (developer-console mirror, varies by SDK)
0x90000000-0x93FFFFFF MEM2 (64 MiB) — Wii ONLY. Larger texture/asset data,
IOS work areas. Reading MEM2 on a GameCube game
returns garbage / FAIL.
0xCC000000-0xCC00FFFF Hollywood I/O (Wii) / Flipper I/O (GameCube) — DMA,
GPU FIFO, AI, EXI registers. Reads are usually safe,
writes can wedge the emulator. Avoid.
0xCD000000-0xCD007FFF Wii-only Hollywood registers.
Notes:
• All multi-byte values are BIG-ENDIAN on the real hardware. Felk's
memory.read_u*/write_u* helpers handle the byte swap for you —
the value you see is the value the game sees as a u32.
• Addresses are 32-bit; Felk truncates the high bits of any u64
address argument.
• Pointers in MEM1 are often stored as 4-byte addresses with the
high bit set (e.g. 0x81234567). Dereferencing them requires no
masking — pass the raw value back into memory.read_*.
RETURNS: 'Wrote VAL_DEC (0xVAL_HEX) → ADDR_HEX'.
PURPOSE: Write an unsigned 32-bit big-endian value to PowerPC memory at the given absolute address. USAGE: The workhorse for cheats — most game state is 32-bit. For 8/16-bit values use dolphin_write8/write16; for true 64-bit fields use dolphin_write64 (atomic, vs two non-atomic write32s). For floats, reinterpret the IEEE-754 bits as an integer first. BEHAVIOR: DESTRUCTIVE: overwrites four bytes with no undo. Address MUST be 4-byte aligned. Writes to read-only regions are silently dropped.
GameCube + Wii main address space landmarks (PowerPC, big-endian):
0x80000000-0x817FFFFF MEM1 main RAM (24 MiB) — GameCube + Wii game code & data
GameCube games stay entirely within MEM1.
Wii games use MEM1 for code and frequently-accessed data.
0x80000020 OS_GLOBALS — game-info struct (disc ID, FST, etc.)
0x80000034 OS_ARENA_LO (start of free MEM1 heap)
0x80003100 OS_REPORT (developer-console mirror, varies by SDK)
0x90000000-0x93FFFFFF MEM2 (64 MiB) — Wii ONLY. Larger texture/asset data,
IOS work areas. Reading MEM2 on a GameCube game
returns garbage / FAIL.
0xCC000000-0xCC00FFFF Hollywood I/O (Wii) / Flipper I/O (GameCube) — DMA,
GPU FIFO, AI, EXI registers. Reads are usually safe,
writes can wedge the emulator. Avoid.
0xCD000000-0xCD007FFF Wii-only Hollywood registers.
Notes:
• All multi-byte values are BIG-ENDIAN on the real hardware. Felk's
memory.read_u*/write_u* helpers handle the byte swap for you —
the value you see is the value the game sees as a u32.
• Addresses are 32-bit; Felk truncates the high bits of any u64
address argument.
• Pointers in MEM1 are often stored as 4-byte addresses with the
high bit set (e.g. 0x81234567). Dereferencing them requires no
masking — pass the raw value back into memory.read_*.
RETURNS: 'Wrote VAL_DEC (0xVAL_HEX) → ADDR_HEX'.
PURPOSE: Write an unsigned 64-bit big-endian value to PowerPC memory. USAGE: For paired 32-bit slots, doubles, packed flags. Atomic from the game's perspective; preferred over chaining two write32s when ordering matters. BEHAVIOR: DESTRUCTIVE: overwrites eight bytes with no undo. Address MUST be 8-byte aligned. `value` is a DECIMAL STRING (0..18446744073709551615) to preserve precision past JS's 2^53 number limit.
GameCube + Wii main address space landmarks (PowerPC, big-endian):
0x80000000-0x817FFFFF MEM1 main RAM (24 MiB) — GameCube + Wii game code & data
GameCube games stay entirely within MEM1.
Wii games use MEM1 for code and frequently-accessed data.
0x80000020 OS_GLOBALS — game-info struct (disc ID, FST, etc.)
0x80000034 OS_ARENA_LO (start of free MEM1 heap)
0x80003100 OS_REPORT (developer-console mirror, varies by SDK)
0x90000000-0x93FFFFFF MEM2 (64 MiB) — Wii ONLY. Larger texture/asset data,
IOS work areas. Reading MEM2 on a GameCube game
returns garbage / FAIL.
0xCC000000-0xCC00FFFF Hollywood I/O (Wii) / Flipper I/O (GameCube) — DMA,
GPU FIFO, AI, EXI registers. Reads are usually safe,
writes can wedge the emulator. Avoid.
0xCD000000-0xCD007FFF Wii-only Hollywood registers.
Notes:
• All multi-byte values are BIG-ENDIAN on the real hardware. Felk's
memory.read_u*/write_u* helpers handle the byte swap for you —
the value you see is the value the game sees as a u32.
• Addresses are 32-bit; Felk truncates the high bits of any u64
address argument.
• Pointers in MEM1 are often stored as 4-byte addresses with the
high bit set (e.g. 0x81234567). Dereferencing them requires no
masking — pass the raw value back into memory.read_*.
RETURNS: 'Wrote VAL_DEC (0xVAL_HEX) → ADDR_HEX'.
PURPOSE: Set GameCube controller state on a given port for one frame's worth of input. USAGE: Buttons supported: A, B, X, Y, Z, Start, L, R, Up, Down, Left, Right. Analog axes: StickX, StickY, CStickX, CStickY, TriggerLeft, TriggerRight. To 'hold' a button across multiple frames, call repeatedly — Dolphin's input is per-frame, not edge-triggered, so a button you don't include in this call's state is implicitly released. For TAS-style frame-perfect sequences, alternate set + dolphin_frame_advance(1) calls. BEHAVIOR: DESTRUCTIVE to controller state for the addressed port. Overwrites all input — anything you don't include is released. Felk's set_gc_buttons accepts a partial dict; unspecified buttons are false, unspecified analog axes are at neutral (0 for both sticks and triggers). RETURNS: 'Set GC port N: <state-summary>'.
+9 more tools listed on main page