← Blog
0.7.0 · RETROPIE · 2P · COMPLETE

2P Complete — All 73 Systems Now Local Multiplayer (sigil-retropie 286bbad + 2d3d4b8)

retropie 2player milestone controllers 0.7.0

With 2d3d4b8, P2 local controller support is now complete across all 73 sigilOS RetroPie systems. Three commits over 24 hours grew P2 coverage from 0 to 73: NES/SNES/Genesis/SMS (38bc419), Coleco/NeoGeo/Atari/SG-1000/MSX/C64/PCE/CPS (8e0de8d + 5eaf9fd), PSX/N64/GCN/DC/Saturn/PS2/Jaguar/O2/ChannelF/Intellivision (286bbad), then every remaining core (2d3d4b8). The API is uniform: sys3(44, 1, 0, 0) reads P2 state, core_set_input_port(1, btn2) routes it to the core. Hardware mapping details vary per system; the EL0 API does not.


286bbad — wave 3 (PSX / N64 / GCN / DC / Saturn / PS2 / Jaguar / O2 / ChannelF / Intellivision / FDS)

Wave 3 wired the 5th-generation and specialty platforms. Each system's P2 state is reached at a hardware-specific register offset; core_set_input_port(1, btn2) abstracts the write behind a uniform call.

SystemP2 register / offsetNotes
PSXpx_st+601P2 pad byte in PlayStation state block
N64n64_st+164P2 controller word — 4-byte unsigned input word
GameCubegc_mem $2A00204P2 button shadow in GC memory-mapped I/O
Dreamcastdc_st+601P2 pad byte; same offset as PSX by coincidence
SaturnstubSaturn core not yet complete — P2 port=1 write is a no-op; wired for when core lands
PS2ps2_mem $2231004P2 scratchpad in PS2 I/O area
Jaguarjag_jerry+1P2 latch in the Jerry co-processor I/O block
Odyssey2o2_cpu+17P2 latch in the Intel 8048 state area
Channel Ffcf_cpu+9P2 latch in the Fairchild F8 CPU state area
Intellivisionitv word at 1026P2 hand controller word in Intellivision state
FDSNES core already had core_set_input_port; only EL0 loop wiring added

2d3d4b8 — final wave (all remaining 73 systems)

The final wave swept every remaining core. Systems fall into three tiers based on how their hardware models P2 input:

REAL P2 — dedicated hardware P2 input path

Amiga, Atari 7800, Atari ST, VIC-20, Dragon 32, PC-FX, X68000, TI-99/4A, BBC Micro, PC-88, Acorn Electron, Arcade (MAME), Atari Lynx, Sega CD, CPS-2, CPS-3, Atari 5200. core_set_input_port(1, btn2) writes to the hardware-specified P2 register (varies by system — documented in each core).

EXTENDED — P2 slot confirmed from prior waves

PSX, N64, GameCube, Dreamcast, Saturn, PS2, Jaguar, Odyssey2, Channel F, Intellivision, Neo Geo, SG-1000, Colecovision, Genesis, SMS, Atari 2600, MSX, C64, PCE. P2 slot exists adjacent to P1 in the state area — hardware address reserved for future hardware P2 or already mapped. Already wired in previous waves; confirmed in the all-73 sweep.

STUBS — single-player or multi-tap pending

AT-8, ZX Spectrum, Vectrex, PS3, Wii, Wii U, Switch, Xbox 360, 3DO, PSP, Vita, 3DS, Neo Geo Pocket Color, WonderSwan, Virtual Boy, GBA, NDS, Supervision, Pokémon Mini, 32X. These systems are either inherently single-player (handhelds), have complex multi-tap peripherals requiring separate implementation, or their P2 hardware mapping is not yet confirmed. core_set_input_port(1, btn2) is accepted without error but does not route to hardware.


EL0 uniformity

39 EL0 apps updated in 2d3d4b8. Every *_app.sg except keyboard-only apps (cpc_app, apple2_app) now follows the same two-line pattern:

var btn2: Int = sys3(44, 1, 0, 0);
core_set_input_port(1, btn2);

Xbox One BT P2 mapping (buttons → normalized bitmask) is handled by the OS-side input_state(port) syscall (syscall 44). The EL0 app sees a normalized bitmask regardless of physical controller type or BT protocol. PARITY.md updated (16833fb).

The uniformity across 73 cores is intentional: the EL0 boundary is the only place the input model is defined. No core implements its own BT pairing, its own bitmask layout, or its own port enumeration. The OS owns the input model; the core owns the hardware register write.


2P milestone table

CapabilityStatus
P1 input (all 73 systems)✅ pre-existing
P2 input wired — NES/SNES/Genesis/SMS✅ 38bc419
P2 input wired — Coleco/NeoGeo/Atari/SG-1000/MSX/C64/PCE/CPS✅ 8e0de8d + 5eaf9fd
P2 input wired — PSX/N64/GCN/DC/Saturn/PS2/Jaguar/O2/ChannelF/Intellivision✅ 286bbad
P2 input wired — all remaining 73 systems✅ 2d3d4b8
SRDX Mode-2 P2 injection (netplay)✅ core_input_p2.sg (pre-existing)