POPStarter DOCS

Components

← POPSLoader docs · view on GitHub ↗

Last updated: 2026-07-27 (Release 1.1.0; rolling v1.1.1-dev / experimental v1.1.1-dev-EXP73; HEAD = dev; BETA-12-PLAY is ARCHIVAL/frozen). For current Settings behavior, Known Issues, Preservation Contracts, Behavioral Invariants, and Hardware Status, see STATE.md (canonical). Where dated historical sections below differ from STATE.md, STATE.md wins.

COMPONENTS

Purpose

Current technical map of POPSLoader source files, their responsibility, and key
entry points. POPSLoader is a PS1-game launcher built on the Enceladus runtime:
EE C/C++, an embedded Lua application (bin/POPSLDR/*.lua compiled into the EE
ELF via bin2c), embedded IOP IRX modules, and a BRAM child ELF-loader. Every
technical claim below cites path:line against this worktree.

Scope note: this file documents what is actually present and wired in the
dev rolling state (the active branch; BETA-12-PLAY is frozen). Where a
component is on disk but unused (dead or
dormant), that is called out explicitly rather than omitted. Several files an
external audit flagged for removal — the 3D render pipeline (commit a56441c),
md5, and the orphaned SMB / strUtils source (commit f83dbbb) — have since
been removed from the tree and are documented as removed below. (The old
orphan src/luaSMB.cpp is gone; SMB (v1) is now a real, wired feature — a C
binding inside the System.* surface plus the GSMBNET scene — documented
below. Implemented this cycle, CI+Rolling green, validating on hardware.)

1. EE bootstrap and runtime (src/)

src/main.cpp — EE entry, pre-main IOP hygiene, IRX bring-up

src/luaplayer.cpp — Lua VM lifecycle and embedded asset wiring

src/luasystem.cpp — the largest binding surface (System.*)

src/luaHDD.cpp — HDD (dev9) IRX stack and PFS mounting

src/embed_assets.cpp — runtime name -> embedded blob resolver

Other EE runtime files

3D rendering pipeline (removed)

The legacy 3D render pipeline (src/render.cpp, src/calc_3d.cpp,
src/gsKit3d_sup.cpp, src/luaRender.cpp and the Render/Lights/Camera Lua
bindings, plus the -lmath3d link) was dead at the application level and has been
removed from the tree (commit a56441c). These files are no longer on disk, no
longer in the Makefile object lists, and luaRender_init is no longer called
from luaplayer.cpp.

Orphaned / dead-on-disk

2. Embedded Lua application (bin/POPSLDR/)

All bin/POPSLDR/*.lua are bin2c'd into the EE ELF at build time; the on-card
copies are not read at runtime. Editing them requires a rebuild.

bin/POPSLDR/system.lua — controller, device/launch engine, settings

bin/POPSLDR/ui.lua — the entire UI table, no main loop

bin/POPSLDR/images.lua — embedded UI glyph/chrome atlas

3. Boot script (etc/)

4. External ELF-handoff layer (src/elf_loader/)

5. IOP modules (iop/)

6. Controller modules (modules/)

7. On-card payload (bin/POPSLDR/, non-source)

8. Build / package / CI

Current Feature Surface by Main Menu Option

Dispatch in the MainMenu Play handler (ui.lua:3997), OPT switch ~ui.lua:4227-4404.
- MMCE (OPT1): implemented.
- MX4SIO (OPT2): implemented.
- HDD (PFS) (OPT4): implemented (routes to scene GHDD=5).
- USB (OPT5): implemented.
- Disc (DKWDRV) (OPT8): implemented.
- HDD (exFAT) (OPT3): implemented — scans the exFAT internal drive as a mass:
backend (BDMA ata) via InitATAPopsRoot + GetPS1GameLists -> scene GBDMHDD=6
(ui.lua:4349). Classified by exact ioctl driver-name ata. Validating on hardware.
- i.Link (OPT6): NOT implemented (ui.lua:4462).
- SMB (v1) (OPT7): implemented — routes to scene GSMBNET=7. SMB / Network
settings (server IP, share, user/password, IP assignment DHCP-or-static, port,
games path/cwd, link mode; IP addressing only) plus an "SMB modules" install
toggle that copies the POPStarter in-game SMB streaming pack (6 IRX:
poweroff/ps2dev9/ps2ip/ps2smap/smbman/SMSUTILS) into mc:/POPSTARTER and
generates IPCONFIG.DAT + SMBCONFIG.DAT from the settings (backfilled on
every settings save while the pack is installed). CONNECT is LAZY (net stack
+ share open only on entering the SMB page or a settings action, never at
boot) via the luasystem.cpp EnsureNet/connectSMB bindings; BROWSE scans
the share's POPS folder and lists VCDs; a blank Share field opens an in-UI
picker driven by GETSHARELIST; LAUNCH hands off to POPStarter with argv0
selector smb:/POPS/SB.<name>.ELF (POPStarter streams the VCD from its own
smb:/POPS mount via mc:/POPSTARTER/SMBCONFIG.DAT); DISCONNECT
(CLOSESHARE+LOGOFF) on leaving the page. NetBIOS is deferred (address type
must be IP). Implemented this cycle, CI+Rolling green, validating on
hardware
— the exact argv0 device prefix POPStarter accepts (fallbacks
mass:/POPS/SB.<name>.ELF then mass:/SB.<name>.ELF), the connect handshake,
and the GETSHARELIST DMA are the hardware-only unknowns. See the
luasystem.cpp SMB notes.

Preservation Contracts (hardware-load-bearing — do not regress)

Settle note: Load_HDD_IRX routes through EnsureAtaBdm(), which applies a
1-second settle before loading ata_bd and another after it (see
EnsureAtaBdmModulesInner in src/luasystem.cpp). The older "no cold-dev9
settle / fix lives on a separate branch" note is superseded — rolling publishes
from dev, which is this branch.

Primary Change Entry Points