ARMSX1 - RetroBIOS¶
Technical notes
PlayStation emulator forked from psxe, rebuilt around SDL2 frontends and a Dear ImGui fullscreen shell. Desktop, Android, iOS, UWP, WebAssembly and PSVita builds come out of one tree. The Android application is com.nanodata.armsx with the activity com.armsx2.Main, and its Compose launcher hosts the same core in process. ref: README.md:1-2, android/app/build.gradle:71-79, android/app/src/main/AndroidManifest.xml:78-92
A BIOS image is required. Boot stops before a session exists when no path resolves, and again when the file cannot be read. Skip BIOS does not change that: the image runs from reset and the hook only takes over at the shell entry point, once the kernel is built. ref: frontend/main.cpp:2529-2549, psx/psx.c:249-252, psx/fastboot.h:45, psx/fastboot.c:225-239
psxe_cfg_get_bios_path answers in three steps: the override file when it exists, then a scan of the search folder, then the override path unchanged. The override is [bios].override_file or -b and defaults to bios.bin under the preference path SDL_GetPrefPath("nanodata", "armsx"); the search folder is [bios].search_path or -B and defaults to the relative path bios. ref: frontend/config.c:1540-1559, frontend/config.c:1385-1404, frontend/config.c:677-683, frontend/config.c:54-57
The scan reads that folder once, keeps .bin and .rom, and returns the entry named bios.bin. Its other branch compares [bios].preferred_model against each filename through a normaliser that drops every non-alphanumeric character and lowercases the rest, applied to the name including its extension, so scph1001.bin normalises to scph1001bin and no model value equals it. A name carrying no extension, which would, is dropped by the extension filter first. ref: frontend/config.c:292-357, frontend/config.c:226-247, frontend/config.c:249-260
Nothing identifies the image beyond that. No name table, no size test, no hash. The loader takes the file's own length, allocates it, and the bus maps the device from 0x1fc00000 over that same length, which is how the 1 MB SCPH-5903 image stays addressable in full. ref: psx/dev/bios.c:21-54, psx/bus.c:50-54, psx/dev/bios.h:8-10
preferred_model carries 22 values, SCPH-1000 through SCPH-102C, printed by --help-model and mirrored by the Android model picker. ref: frontend/config.c:177-200, android/app/src/main/java/com/armsx2/config/Ps1Settings.kt:416-423
On Android the preference path is the application files directory, so
settings.toml and the default bios.bin sit there. The BIOS picker copies the
chosen dump to user_bios.bin and writes its absolute path into
[bios].override_file. EmulatorActivity passes --bios
The remaining paths the core opens are per game, and are written by the emulator or picked by the user: memory cards, created blank at first use; save states, rewind snapshots and screenshots; a GameShark .cht catalogue named by [cheats].cheats_file; and content-addressed PNG packs under the replacements folder of [video].texture_dir. ref: psx/dev/mcd.c:139-154, psx/cheats.c:346-390, psx/texrep.c:846-848
2 files | 1 required, 1 optional | 1 in repo, 1 missing
scph1001.bin required in repo
PlayStation BIOS image
- Size: min 512.0 KB, max 1.0 MB
- Source:
psx/dev/bios.c:21-54,psx/dev/bios.h:8-10,frontend/config.c:292-357,frontend/config.c:1540-1559,frontend/main.cpp:2529-2535 - Platforms: batocera, lakka, recalbox, retroarch, retrodeck, retropie, rocknix, romm
- Any image is accepted, whatever its name and length: the file is read whole and mapped at its own size. 524288 is the region psx_bios_init declares before the load, and 1048576 the SCPH-5903 image the loader names as the exception. The folder scan reaches an image only under the name bios.bin; [bios].override_file, -b and the Android picker open a path directly.
<expansion>.rom optional missing
Expansion port ROM image
- Size: max 512.0 KB
- Source:
psx/dev/exp1.c:12-44,psx/dev/exp1.h:8-10,psx/psx.c:260-261,frontend/config.c:681,frontend/main.cpp:1906,android/app/src/main/java/com/armsx2/ui/settings/Ps1AdvancedTab.kt:96-100 - Config key:
paths.expansion_rom - Read into the 512 KB region at 0x1f000000, which is filled with 0xff when no path is set. Named by [paths].expansion_rom, -e, or the Advanced tab of the Android settings. A path that is set and cannot be opened fails psx_init and stops the boot.
Generated on 2026-08-23T16:12:06Z