POPStarter DOCS

Components

← POPSLoader docs ยท view on GitHub โ†—

Last updated: 2026-06-21 (BETA-13 rolling candidate; HEAD = BETA-13-PLAY @ 56a5ad5; BETA-12 is the public release at af983d7, and BETA-12-PLAY is now ARCHIVAL/frozen). Since the prior pass: nav auto-repeat and the right-stick description scroll were re-cut to FRAME-COUNTING (the wall clock reads microseconds on PS2, so the old "_ms" gates fired every frame); the analog-stickโ†’d-pad fold is now gated on a live-negotiated analog mode (new Pads.getMode() C binding) plus hysteresis; an OPL-style overscan (CRT inset) render transform was added (Screen.setOverscan/getOverscan + OVX/OVY); the game-list cover box now layers cover_default.png + cover_missing.png and MISSING.png was removed (โˆ’62 KB ELF); and two new settings keys (BOOT_SOUND, OVERSCAN) bring EncodeSettings to 20 keys. For current Settings behavior, Known Issues, Preservation Contracts, Behavioral Invariants, and Hardware Status, see STATE.md (canonical) โ€” this doc points there instead of restating them.

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
BETA-13-PLAY 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 SMB
main-menu entry remains as an unimplemented stub.)

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/pops_profiles.lua โ€” POPSTARTER.ELF location list

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): NOT implemented โ€” surfaces "This backend isn't implemented
yet" (toast at ui.lua:4312).
- i.Link (OPT6): NOT implemented (ui.lua:4396).
- SMB (v1) (OPT7): NOT implemented (ui.lua:4398). There is no SMB C client;
the former src/luaSMB.cpp orphan was removed in commit f83dbbb (see
Orphaned/dead-on-disk).

Preservation Contracts (hardware-load-bearing โ€” do not regress)

Divergence note (per project memory): this BETA-13-PLAY worktree's
PLDR.LoadHDDModules (system.lua:4754) and Load_HDD_IRX (luaHDD.cpp:120) have
NO cold-dev9 settle between HDD IRX loads. The "fail to load HDD" cold-dev9
settle fix lives on a separate rolling branch and is NOT merged here.

Primary Change Entry Points