Last updated: 2026-05-20
POPSLoader is a PS2 launcher for POPStarter built on Enceladus runtime pieces, with behavior primarily orchestrated by embedded Lua modules (system.lua, ui.lua, images.lua, pops_profiles.lua).
QA_REGRESSION_MATRIX.md is the detailed run ledger. This file summarizes the stable current repo state and the latest materially relevant hardware outcomes.
- Boot/runtime uses embedded Lua scripts.
bin/POPSLDR/IMG/default.pngis optional for GitHub Actions artifact builds; if it is absent,IMG.defaultfalls back to the required embeddedMISSING.pngasset.- Settings are persisted at
mc0:/POPSTARTER/.pldrs. - Settings edits are staged and committed on Settings/Profile confirm/leave.
- Persisted settings include:
- POPSTARTER path,
- DKWDRV path,
- video standard,
- hide-text mode,
- keyboard layout,
- BDMA mode.
- Startup backend auto-init exists and uses:
- boot path information,
- configured executable paths,
- selected profile path.
- HDD startup targets now run the same
PLDR.LoadHDDModules()path used by the HDD page instead of only the lower-level exec helper. - USB vs MX4SIO split is based on mount-driver identity, not path-prefix guessing.
- Runtime device access is not gated by the old device-lock system.
- Main menu can show a boot-device label.
- Exit modal exposes:
OSDSYSCancelBOOT.ELF
BOOT.ELFlookup order is:mc0:/BOOT/BOOT.ELFmc1:/BOOT/BOOT.ELF
- Current cover sources are:
- sidecar PNG next to the selected
.VCD, hdd0:__common/POPS/ART/<title>.pngfor HDD titles.
- sidecar PNG next to the selected
- Release packaging policy in CI is
PS1_POPSLOADER/*+POPS/PATCH_5.BINwith strict manifest validation. - Current CI package also includes
PS1_POPSLOADER/BUILD_INFO.txt, and the build/package workflow fails if the built ELF is missing key embedded runtime markers or if the generated embedded-loader blob was not regenerated. - Repository automation also includes
.github/workflows/opencode.yml, a comment-triggered AI-assistance workflow; it is not part of the build/package validation contract.
- Repo-verified:
bin/POPSLDR/ui.luastages the Settings/Profile POPSTARTER path editor draft and now carries an explicit POPSTARTER mode intoPLDR.CommitSettingsChanges(): manual path edits useCUSTOM, while explicit profile/default selection usesPROFILE_DEFAULT. - Repo-verified:
bin/POPSLDR/system.luaCommitSettingsChanges()normalizes the incomingpopstarter_mode, applies the normalized state, and thenEncodeSettings()persistsPOPSTARTER_MODE=<mode>plusPOPSTARTER_PATH=<path>; when the normalized mode is profile-default,EncodeSettings()intentionally writes an emptyPOPSTARTER_PATHand relies on the selected profile path at load time. - Hardware status: the settings/path mode correction is source-verified only until a memory-card
.pldrswrite plus reboot/load cycle is recorded inQA_REGRESSION_MATRIX.md; it is not a hardware claim for HDD-backed ELF execution. - Scope guard: this potential settings/path integrity risk is not claimed as the cause of
D-10,D-14, orU-10; those remain tracked through the detailed hardware chronology inQA_REGRESSION_MATRIX.mdand the decision notes inDECISIONS.md.
MMCE: implemented in code.MX4SIO: implemented in code.HDD (PFS): implemented in code.USB: implemented in code.Disc (DKWDRV): implemented in code.HDD (exFAT): not implemented.SMB (v1): not implemented.ILINK: not implemented.
- Shared default/Profile 1 local POPSTARTER baseline:
- 2026-03-27 hardware report initially failed with
Cant find POPSTARTER ELFwhen booted from USB with USBPOPSTARTER.ELFsidecar/cwd/Profile 1. - comparison against
BETA-10-play-CHECKPOINT2showed that branch's shared POPSTARTER resolution path worked without the later unverified common-path resolver/settings changes. - current source was rolled back to the checkpoint branch's shared resolver behavior for this path.
- user confirmed that rolled-back source restored the shared baseline on hardware.
- 2026-03-27 hardware report initially failed with
U-05OSDSYS exit:- reported fixed on hardware.
D-12startup backend auto-init:- a 2026-03-27 hardware report said booting from HDD did not auto-init the HDD driver stack.
- current source now routes HDD startup targets through
PLDR.LoadHDDModules()instead of onlyEnsureHddRuntimeReadyForExec(). - current source now keeps that startup HDD path limited to runtime readiness; it no longer scans HDD POPS partitions or builds the HDD game list during boot.
- HDD page entry still performs the partition scan and game-list build, and optional HDD cache writing now reuses the page-built list instead of rebuilding at startup.
- user previously confirmed the earlier HDD startup auto-init correction on hardware, but later 2026-03-28 reports on the narrowed boot-time split sources said HDD-backed startup/Profile POPSTARTER could still not be found after entering the USB page before the HDD page.
- the raw boot
APP_DIRfallback alone did not restore that case. - current source now also pre-resolves any HDD-backed startup/configured exec paths immediately after
PLDR.LoadHDDModules()so HDD POPSTARTER/Profile paths are mounted and recorded without reintroducing HDD page work at boot. - current source also routes on-demand HDD path mounts through
PLDR.LoadHDDModules()instead of only the lower-levelEnsureHddRuntimeReadyForExec()gate, so HDD POPSTARTER/Profile probes from USB or other pages use the same runtime init path as HDD page entry. - current source also fixes the startup warm-path classification for Profile 1/default relative
POPSTARTER.ELF, which had previously been skipped because only explicithdd:/pfs:paths were being marked for HDD warm-up. - because
etc/boot.luaestablishes HDD boot on a dedicatedpfs1:mount beforesystem.luaruns, current source now also carries that exact boot partition/slot metadata intosystem.lua, seeds the HDD mount tracker from it, and rebuilds HDD sidecar/partition context from mountedpfs1:candidates instead of relying only on later rediscovery. - user later confirmed on 2026-03-28 that the exact-boot-mount/source-context source restored the USB-before-HDD-page startup/Profile repro on hardware.
- latest recorded hardware on this line is therefore
PASS; preserve that behavior through furtherD-10work.
D-16first-entry USB backend discovery:- a 2026-03-27 hardware report said the first USB page entry reported no backend, but backing out and re-entering then worked.
- current source now adds a bounded wait between failed USB root probes in
BuildUsbIdentityDeferred(). - MX4SIO discovery code was not changed by this correction.
- user later confirmed that corrected source fixed the first-entry USB issue on hardware.
D-10HDD POPSTARTER on HDD:- reported failing on hardware.
- repro: boot from HDD, launch HDD title with HDD
POPSTARTER.ELFsidecar/CWD. - result: black-screen hang.
- 2026-03-27 re-test of the current source still failed when booted from HDD with default/Profile 1/cwd/sidecar
POPSTARTER.ELFon HDD and game device HDD. - current source also exposes an
R2alternate HDD launch path for HDD-residentPOPSTARTER.ELFthat swaps only the selector contract tohdd0:PART:pfs0:/GAME.ELF. - later 2026-03-27 experimental sources also black-screened after direct-load, Memory Card staging, and stripped-handoff changes.
- user later confirmed on 2026-03-28 that the narrowed source restored
D-15, so this remaining blocker is again isolated to HDD-backedPOPSTARTER.ELF. - a later 2026-03-28 re-test still black-screened on the narrowed Lua-side HDD-backed source with no visible positive change.
- a later 2026-03-28 re-test on the loader-side no-auto-exec-slot-preserve source still black-screened on both
XandR2. - a later 2026-03-28 re-test on the forced-
reboot_iop = 1source still black-screened on bothXandR2. - a later 2026-03-28 re-test on the direct-
hdd0:PART:pfsN:/POPSTARTER.ELFpreference source still black-screened onX. - a later 2026-03-28 re-test on the mounted-
pfs0:embedded-loader source still black-screened onX. - follow-up repo comparison showed that earlier source-context work had still been incomplete because Lua had usually already normalized HDD POPSTARTER to mounted
pfs1:/pfs3:paths before the reboot loader saw it. - a later 2026-03-28 re-test on that exact-boot-mount/source-context source still black-screened on
X. - current source now replaces the earlier ad hoc HDD source-context reboot handoff with an explicit partition-aware contract across Lua,
src/luasystem.cpp,src/elf_loader/src/elf.c, and the embedded loader. - on that contract, the parent passes exact HDD partition context separately from the mounted load path, normalizes the partition-aware exec filename to generic
pfs:/..., remountspfs0:from that partition while reusing the mounted relpath Lua already resolved, and no longer preserves the old trackedpfsN:mount into exec. - a 2026-03-29
D-10run on the prior partition-aware source no longer black-screened, but the launcher regained control withrc=-1 (returned after 22618 ms), which narrowed the remaining failure to the embedded-loader or target-ExecPS2handoff instead of HDD path discovery on that specific artifact. - a later 2026-03-29 GitHub artifact re-test on that broader partition-aware/current-source line black-screened again, so the returned-rc boundary is not yet stable enough to treat as the new steady state.
- current source also reports the actual exec filename separately from the probed/opened POPSTARTER path in the launcher popup so mounted-slot probe paths do not masquerade as the real load target.
- current source now restores more of the original parent-side embedded-loader jump contract in
src/elf_loader/src/elf.c: BRAM wipe plusSifInitRpc/SifLoadFileInit/SifLoadFileExitbefore the copy, andSifExitIopHeap/SifExitRpc/SifExitCmdbefore the finalExecPS2. - current source also returns the actual embedded-loader
ExecPS2result instead of collapsing it to-1, keeps legacySystem.loadELF(path, reboot_iop, selector)on POPSTARTER's normal one-argument selector contract, routes partition-aware HDD launches through the explicitSystem.loadELFWithPartition(path, reboot_iop, partition_context, selector)API and mounted-pfs0:SifLoadElfin the embedded loader so they match the reference loaders more closely once the parent has already remounted the target partition, normalizes stale canonical profile-path state so Profile 1/default no longer silently keeps another profile's HDD path, and keeps the older iomanX-awarefileXioload path only as the fallback for directpfs:/hdd:loads with no HDD partition context. - 2026-05-19 source audit found remaining handoff defects before new hardware retests: Lua mounted-PFS fallback can leave stale launch context, normal HDD game labels can fail fallback partition parsing, the fallback path can skip the pre-exec gate even when reconstruction failed,
System.loadELF(..., args..., partition_context)can leak the partition context into target argv, and the child loader still usessnprintf/strncatdespite older docs claiming that risk was avoided. SeeHDD_POPSTARTER_HANDOFF.md. - 2026-05-19 source change addresses the audit defects (excluding child-loader
snprintfcleanup which would require regenerating the embedded loader blob):ResolveFallbackMountedPfsExecPathnow accepts bare partition labels viaNormalizeHddPartitionLabelForMount,RunPOPStarterGamesyncscontext.exec_path/exec_partition_context/exec_*_slot/cold_external_launch/keep_hdd_slots*andlaunch_diagnosticsafter a successful fallback, the HDD pre-exec gate is skipped only when the fallback actually reconstructed a path,src/luasystem.cppexposes a dedicatedSystem.loadELFWithPartition(path, reboot_iop, partition_context, args...)binding instead of overloadingSystem.loadELFwith a trailing partition_context (the trailing detection was removed so partition_context can no longer leak into target argv),LaunchEnginecalls the new binding whencontext.exec_partition_contextis set, andExecuteViaEmbeddedLoaderno longer rejectsargc == 0so the child loader's documented default-argv synthesis is reachable. The POPSTARTER-specificargv[0]guard inExecuteHddBackedViaEmbeddedLoaderis unchanged. - 2026-05-20 hardware screenshot from the latest
BETA-12-PLAYartifact returned to the launcher withPOPSTARTER HDD pre-exec gate failed: Cannot resolve HDD partition contextforPOP:pfs3:/POPS/POPSTARTER.ELFandAPP:hdd0:+OPL:pfs:/APPS/PS1_POPSLOADER/. - 2026-05-20 source follow-up keeps the selector
argv[0]contract unchanged, fixes argument-shifted failure-popup route/gate diagnostics, lets Lua parsehdd0:PART:partition-context strings, allows safe bare HDD partition labels in the shared recovery candidate builder, and makes mounted-PFS fallback recover the actual POPSTARTER source partition before falling back to the selected HDD game partition. - a later readable 2026-05-20 screenshot showed the next pre-exec gate failure: the gate checked generic
pfs:/POPS/POPSTARTER.ELFeven though the real mounted path waspfs3:/POPS/POPSTARTER.ELF. Current source now probes a real mounted path in the gate while preserving the generic exec path for the partition-aware C loader. - current source now makes that partition-aware path non-default for normal HDD-backed POPSTARTER attempts. Normal
Xuses the real resolved executable path, clears Lua partition context, skips the Lua HDD pre-exec gate/remount fallback, and calls the direct non-reboot legacySystem.loadELF(path, 0, selector)contract. - after the direct non-reboot artifact still black-screened before POPSTARTER debug screens, current source removes the HDD-only parent cleanup immediately before
ExecPS2inLoadELFFromFileExecPS2()so the direct HDD handoff no longer exits SIF heap/RPC/CMD or unmounts PFS slots differently from the working non-HDD POPSTARTER path. - latest recorded hardware result on this
D-10line is still FAIL on the previous artifact; the 2026-05-20 source follow-up is repo-verified only andD-10remainsUnknown (verify on hardware)for the next artifact.
D-14HDD-backed POPSTARTER with non-HDD game:- reported failing on hardware.
- repro: launch a non-HDD title while
POPSTARTER.ELFitself is configured on HDD. - 2026-03-27 user hardware also black-screened when launching a USB game with Profile 2 pointing
POPSTARTER.ELFto HDD. - the user later clarified that the other same-day 2026-03-28 success report referred to
D-15, not this case. - a later 2026-03-28 re-test on the forced-
reboot_iop = 1source still black-screened onX;R2produced no response in that non-HDD-game repro. - a later 2026-03-28 re-test on the direct-
hdd0:PART:pfsN:/POPSTARTER.ELFpreference source still black-screened onX. - current source now uses the same partition-aware HDD reboot contract as
D-10, rather than the earlier ad hoc source-context handoff or whichever mountedpfsN:path Lua happened to resolve first. - latest recorded hardware remains
FAIL; current exact-line result is stillUnknown (verify on hardware).
D-15HDD game with non-HDD sidecar POPSTARTER:- reported as a regression on hardware.
- repro: boot from a non-HDD device with sidecar
POPSTARTER.ELFon that same device, then launch an HDD title. - 2026-03-27 user hardware reported a black screen on the EE-side HDD direct-load attempt.
- a later 2026-03-27 hardware report also black-screened on the broader stripped-handoff HDD-game path.
- current source now removes Lua-side HDD game pre-mount/CWD preservation from this path and passes only the normal selector handoff unless
POPSTARTER.ELFitself is HDD/PFS-backed. - user later confirmed on 2026-03-28 that USB boot + USB sidecar/cwd
POPSTARTER.ELF+ HDD game passes on hardware. - user reported a 2026-05-20 latest-artifact regression: USB boot with USB sidecar/cwd
POPSTARTER.ELF, then launching an HDD title, black-screened. - current source follow-up restores legacy
System.loadELF(path, reboot_iop, selector)one-argument selector behavior for normal/non-HDD POPSTARTER launches and keeps partition context on the explicit HDD API; hardware result isUnknown (verify on hardware). - user then reported the narrowed default/cwd sidecar failure: explicit
mass:/POPS/POPSTARTER.ELFlaunches, but defaultPOPSTARTER.ELFcan stop atCant find POPSTARTER ELF. Current source expands default sidecar lookup to include the live current directory plus boot/app directories; hardware result isUnknown (verify on hardware).
U-10BOOT.ELF after HDD page init:- one prior artifact was reported good,
- repo history shows the BOOT.ELF modal later moved from its older non-reboot direct
System.loadELF(elf_path, 0, elf_path)path to a reboot-I/O path with launch-CWD setup. - a later 2026-03-29 hardware report said BOOT.ELF still behaved incorrectly after HDD runtime had been initialized.
- current working inference is that
U-10may share the same underlying handoff/state-poisoning boundary asD-10, but that remains unproven andU-10still requires separate hardware confirmation. - current source now keeps the no-launch-CWD rollback, re-enables
reboot_iop = 1for BOOT.ELF only when HDD runtime has already been loaded, and uses a BOOT.ELF-specific cold external-launch prep that clears the exec keep mask and unmounts tracked HDD slots instead of preserving boot PFS state. - current-source hardware status on this conditional-reboot/cold-prep line is
Unknown (verify on hardware).
U-06PAL asset aspect:- current code compensates for PAL UI layout,
- hardware result is still
Unknown (verify on hardware).
- Preserve the reported
D-12HDD startup auto-init fix while iterating on HDD launch-path regressions. - Preserve the dedicated HDD boot
pfs1:mount contract frometc/boot.luawhile iterating on startup/Profile resolution. - Preserve the reported
D-16USB first-entry fix and confirm MX4SIO behavior remains unchanged on future retests. - Resolve HDD-backed
POPSTARTER.ELFhandoff when POPSTARTER itself is on HDD, including non-HDD game launches. - Preserve the restored
D-15path where HDD titles launch correctly when POPSTARTER stays on the non-HDD boot device. - Re-verify
BOOT.ELFafter HDD page init on current source. - Record concrete run logs in
QA_REGRESSION_MATRIX.md. - Implement HDD exFAT menu flow.
- Implement SMB menu flow.
- Implement ILINK menu flow.
- Decide whether a broader ART system is still needed beyond current sidecar/HDD-common cover support.
- Code/build/package statements above are repository-verified.
- Hardware behavior is
Unknown (verify on hardware)unless explicitly recorded as a reported result.