feat: profile armsx1 0.3.6 on swanstation

The Android build now runs libretro SwanStation instead of psxe. Its importer accepts only 512 KB images whose MD5 is in a 25-entry table (Ps1BiosProbe.java:29-55), so the agnostic scph1001.bin entry becomes those 25 identified images. psxe now refuses sizes other than 512 KB and 1 MB (psx/dev/bios.c:44-49).
This commit is contained in:
Abdessamad Derraz committed 2026-10-26 23:20:43 +01:00
1 parent b870083413
commit 684b643b8a
1 file changed
+315 -79
+315 -79
View File
@@ -4,11 +4,12 @@ core_classification: community_fork
source: "https://github.com/ARMSX2/ARMSX1" source: "https://github.com/ARMSX2/ARMSX1"
source_branch: "android-compose" source_branch: "android-compose"
upstream: "https://github.com/allkern/psxe" upstream: "https://github.com/allkern/psxe"
profiled_date: "2026-08-11" profiled_date: "2026-10-26"
source_commit: "fadd20b6587a291e59b49378a2428358c6663b8c" source_commit: "d96a5b8ad6ccccb40a431488aa89b06f0318c217"
core_version: "0.1.3" core_version: "0.3.6"
display_name: "Sony - PlayStation (ARMSX1)" display_name: "Sony - PlayStation (ARMSX1)"
verification: existence verification: md5
found_by: content
bios_size: 524288 bios_size: 524288
bios_directory: "bios/" bios_directory: "bios/"
cores: cores:
@@ -17,83 +18,318 @@ systems:
- sony-playstation - sony-playstation
notes: | notes: |
PlayStation emulator forked from psxe, rebuilt around SDL2 frontends and a PlayStation emulator forked from psxe. The released application is the
Dear ImGui fullscreen shell. Desktop, Android, iOS, UWP, WebAssembly and Android build, com.nanodata.armsx, version 0.3.6 at this revision. That
PSVita builds come out of one tree. The Android application is build runs libretro SwanStation, checked out as the core/swanstation
com.nanodata.armsx with the activity com.armsx2.Main, and its Compose submodule at dd4805619bbbfc6e0d1776372cb16377088b448e and driven by an
launcher hosts the same core in process. in-process adapter, and no longer the psxe engine. The SDL desktop, iOS,
ref: README.md:1-2, android/app/build.gradle:71-79, UWP, web and PSVita frontends in the same tree still build on psxe. The
android/app/src/main/AndroidManifest.xml:78-92 release tags 0.1.5 to 0.3.6 all sit on 99b3081 of the main branch, a
2026-09-05 tree that carries none of this code. The version is the
versionName android-compose builds.
ref: android/app/build.gradle:72-75, SWANSTATION-DEV.md:10-19
A BIOS image is required. Boot stops before a session exists when no path Android accepts a BIOS only through its importer. The setup wizard, the
resolves, and again when the file cannot be read. Skip BIOS does not change BIOS manager and its folder scan all ask getBiosInfoFromFd, which requires
that: the image runs from reset and the hook only takes over at the shell exactly 512 KB and then either the OpenBIOS signature at 0x78 or one of 25
entry point, once the kernel is built. MD5 values taken from SwanStation's table. A recognised file is copied into
ref: frontend/main.cpp:2529-2549, psx/psx.c:249-252, psx/fastboot.h:45, <external files>/bios under its own name. The wizard does not leave the
psx/fastboot.c:225-239 BIOS page until one is recognised.
ref: android/app/src/main/java/kr/co/iefriends/pcsx2/NativeApp.java:1252-1262,
android/app/src/main/java/com/armsx2/core/Ps1BiosProbe.java:16-79,
android/app/src/main/java/com/armsx2/ui/onboarding/OnboardingViewModel.kt:183-203,
android/app/src/main/java/com/armsx2/ui/onboarding/OnboardingViewModel.kt:250-255,
android/app/src/main/java/com/armsx2/ui/bios/BiosManagerViewModel.kt:172-187
psxe_cfg_get_bios_path answers in three steps: the override file when it Before each launch the settings store walks the BIOS folder, the search
exists, then a scan of the search folder, then the override path unchanged. folder and the selected file's folder, each sorted by path, then the older
The override is [bios].override_file or -b and defaults to bios.bin under the user_bios.bin and bios.bin imports, and keeps the first 512 KB file whose
preference path SDL_GetPrefPath("nanodata", "armsx"). The search folder is MD5 entry names the preferred_model console, SCPH-1001 by default. It writes
[bios].search_path or -B and defaults to the relative path bios. that path as [bios].resolved_file, and the adapter hands it to SwanStation
ref: frontend/config.c:1540-1559, frontend/config.c:1385-1404, as the BIOS path of all three regions, relative to the system directory,
frontend/config.c:677-683, frontend/config.c:54-57 which is the folder of the selected BIOS or <external files>/bios.
ref: android/app/src/main/java/com/armsx2/config/Ps1SettingsStore.kt:176-195,
android/app/src/main/java/com/armsx2/core/Ps1BiosSelection.java:17-64,
android/app/src/main/java/com/armsx2/config/Ps1Settings.kt:32-33,
android/app/src/main/java/kr/co/iefriends/pcsx2/NativeApp.java:108-123,
native/swanstation/runtime.cpp:243-247, native/swanstation/runtime.cpp:255
The scan reads that folder once, keeps .bin and .rom, and returns the entry No match leaves the path empty, and SwanStation scans the system directory
named bios.bin. Its other branch compares [bios].preferred_model against each itself: files of 512 KB, 4 MB or 0x3E66F0 bytes, the first 512 KB hashed
filename through a normaliser that drops every non-alphanumeric character and against its 27-entry table, the first image of the console region returned,
lowercases the rest, applied to the name including its extension, so otherwise the first known image of another region. An unknown image is
scph1001.bin normalises to scph1001bin and no model value equals it. A name never used, and with nothing found the core boots its built-in OpenBIOS.
carrying no extension, which would, is dropped by the extension filter first. The region is Auto unless console.region says pal or ntsc, and Auto follows
ref: frontend/config.c:292-357, frontend/config.c:226-247, the disc, NTSC-U without one.
frontend/config.c:249-260 ref: swanstation src/core/host_interface.cpp:100-194,
swanstation src/core/bios.cpp:28-104,
swanstation src/core/system.cpp:592-645,
swanstation src/core/system.cpp:677-682,
native/swanstation/runtime.cpp:209
Nothing identifies the image beyond that. No name table, no size test, no The psxe frontends take [bios].override_file or -b, by default bios.bin
hash. The loader takes the file's own length, allocates it, and the bus maps under SDL_GetPrefPath("nanodata", "armsx"), when that file exists.
the device from 0x1fc00000 over that same length, which is how the 1 MB Otherwise they scan [bios].search_path, bios by default, for .bin and .rom
SCPH-5903 image stays addressable in full. files and return the first whose stem normalises to preferred_model, else
ref: psx/dev/bios.c:21-54, psx/bus.c:50-54, psx/dev/bios.h:8-10 one named bios.bin, else the override path unchanged. psx_bios_load refuses
anything but 512 KB or the 1 MB SCPH-5903 image and checks no hash.
preferred_model carries 22 values, SCPH-1000 through SCPH-102C, printed by ref: frontend/config.c:54-57, frontend/config.c:279-352,
--help-model and mirrored by the Android model picker. frontend/config.c:1378-1399, frontend/config.c:1535-1554,
ref: frontend/config.c:177-200, frontend/main.cpp:2555-2561, psx/dev/bios.c:22-75
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 <files>/bios.bin when
the package carries an assets/bios.bin, and the in-process launcher repeats
that check with stat. Release 0.1.3 ships no such asset.
ref: android/app/src/main/java/com/armsx2/core/Ps1Config.kt:20-41,
android/app/src/main/java/com/armsx2/ui/settings/Ps1BiosTab.kt:38-48,
android/app/src/main/java/com/nanodata/armsx/EmulatorActivity.java:58-61,
android/app/src/main/java/com/nanodata/armsx/EmulatorActivity.java:95-99,
frontend/android_jni.cpp:1708-1743, ARMSX1-0.1.3-release.apk assets
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
files: files:
- name: scph1001.bin - name: "scph1000.bin"
agnostic: true description: "SCPH-1000, DTL-H1000 (v1.0)"
required: true region: [japan]
min_size: 524288 required: false
max_size: 1048576 variant_group: "psx-bios"
description: "PlayStation BIOS image" size: 524288
md5: "239665b1a3dade1b5a52c06338011044"
validation: [size, md5]
source_ref: "android/app/src/main/java/com/armsx2/core/Ps1BiosProbe.java:30"
- name: "scph1001.bin"
description: "SCPH-1001, 5003, DTL-H1201, H3001 (v2.2 12-04-95 A)"
region: [north-america, latin-america]
required: false
variant_group: "psx-bios"
size: 524288
md5: "924e392ed05558ffdb115408c263dccf"
validation: [size, md5]
note: >- note: >-
Any image is accepted, whatever its name and length: the file is read The model both settings files preselect, SCPH-1001. The desktop
whole and mapped at its own size. 524288 is the region psx_bios_init scan also reaches this image by its stem.
declares before the load, and 1048576 the SCPH-5903 image the loader source_ref: "android/app/src/main/java/com/armsx2/core/Ps1BiosProbe.java:31"
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 - name: "scph1002a.bin"
path directly. description: "SCPH-1002, DTL-H1002 (v2.0 05-10-95 E)"
source_ref: "source psx/dev/bios.c:21-54, source psx/dev/bios.h:8-10, source frontend/config.c:292-357, source frontend/config.c:1540-1559, source frontend/main.cpp:2529-2535" region: [europe, oceania]
required: false
variant_group: "psx-bios"
size: 524288
md5: "54847e693405ffeb0359c6287434cbef"
validation: [size, md5]
source_ref: "android/app/src/main/java/com/armsx2/core/Ps1BiosProbe.java:32"
- name: "scph1002b.bin"
description: "SCPH-1002, DTL-H1102 (v2.1 07-17-95 E)"
region: [europe, oceania]
required: false
variant_group: "psx-bios"
size: 524288
md5: "417b34706319da7cf001e76e40136c23"
validation: [size, md5]
source_ref: "android/app/src/main/java/com/armsx2/core/Ps1BiosProbe.java:33"
- name: "scph1002c.bin"
description: "SCPH-1002, DTL-H1202, H3002 (v2.2 12-04-95 E)"
region: [europe, oceania]
required: false
variant_group: "psx-bios"
size: 524288
md5: "e2110b8a2b97a8e0b857a45d32f7e187"
validation: [size, md5]
source_ref: "android/app/src/main/java/com/armsx2/core/Ps1BiosProbe.java:34"
- name: "dtlh1100.bin"
description: "DTL-H1100 (v2.2 03-06-96 D)"
region: [japan]
required: false
variant_group: "psx-bios"
size: 524288
md5: "ca5cfc321f916756e3f0effbfaeba13b"
validation: [size, md5]
source_ref: "android/app/src/main/java/com/armsx2/core/Ps1BiosProbe.java:35"
- name: "scph3000.bin"
description: "SCPH-3000, DTL-H1000H (v1.1 01-22-95)"
region: [japan]
required: false
variant_group: "psx-bios"
size: 524288
md5: "849515939161e62f6b866f6853006780"
validation: [size, md5]
source_ref: "android/app/src/main/java/com/armsx2/core/Ps1BiosProbe.java:36"
- name: "scph1001_v20.bin"
description: "SCPH-1001, DTL-H1001 (v2.0 05-07-95 A)"
region: [north-america, latin-america]
required: false
variant_group: "psx-bios"
size: 524288
md5: "dc2b9bf8da62ec93e868cfd29f0d067d"
validation: [size, md5]
source_ref: "android/app/src/main/java/com/armsx2/core/Ps1BiosProbe.java:37"
- name: "scph3500.bin"
description: "SCPH-3500 (v2.1 07-17-95 J)"
region: [japan]
required: false
variant_group: "psx-bios"
size: 524288
md5: "cba733ceeff5aef5c32254f1d617fa62"
validation: [size, md5]
source_ref: "android/app/src/main/java/com/armsx2/core/Ps1BiosProbe.java:38"
- name: "scph1001_v21.bin"
description: "SCPH-1001, DTL-H1101 (v2.1 07-17-95 A)"
region: [north-america, latin-america]
required: false
variant_group: "psx-bios"
size: 524288
md5: "da27e8b6dab242d8f91a9b25d80c63b8"
validation: [size, md5]
source_ref: "android/app/src/main/java/com/armsx2/core/Ps1BiosProbe.java:39"
- name: "scph5000.bin"
description: "SCPH-5000, DTL-H1200, H3000 (v2.2 12-04-95 J)"
region: [japan]
required: false
variant_group: "psx-bios"
size: 524288
md5: "57a06303dfa9cf9351222dfcbb4a29d9"
validation: [size, md5]
source_ref: "android/app/src/main/java/com/armsx2/core/Ps1BiosProbe.java:40"
- name: "scph5500.bin"
description: "SCPH-5500 (v3.0 09-09-96 J)"
region: [japan]
required: false
variant_group: "psx-bios"
size: 524288
md5: "8dd7d5296a650fac7319bce665a6a53c"
validation: [size, md5]
source_ref: "android/app/src/main/java/com/armsx2/core/Ps1BiosProbe.java:41"
- name: "scph5501.bin"
description: "SCPH-5501, 5503, 7003 (v3.0 11-18-96 A)"
region: [north-america, latin-america]
required: false
variant_group: "psx-bios"
size: 524288
md5: "490f666e1afb15b7362b406ed1cea246"
validation: [size, md5]
source_ref: "android/app/src/main/java/com/armsx2/core/Ps1BiosProbe.java:42"
- name: "scph5502.bin"
description: "SCPH-5502, 5552 (v3.0 01-06-97 E)"
region: [europe, oceania]
required: false
variant_group: "psx-bios"
size: 524288
md5: "32736f17079d0b2b7024407c39bd3050"
validation: [size, md5]
source_ref: "android/app/src/main/java/com/armsx2/core/Ps1BiosProbe.java:43"
- name: "scph7000.bin"
description: "SCPH-7000, 7500, 9000 (v4.0 08-18-97 J)"
region: [japan]
required: false
variant_group: "psx-bios"
size: 524288
md5: "8e4c14f567745eff2f0408c8129f72a6"
validation: [size, md5]
source_ref: "android/app/src/main/java/com/armsx2/core/Ps1BiosProbe.java:44"
- name: "scph7000w.bin"
description: "SCPH-7000W (v4.1 11-14-97 A)"
region: [japan]
required: false
variant_group: "psx-bios"
size: 524288
md5: "b84be139db3ee6cbd075630aa20a6553"
validation: [size, md5]
source_ref: "android/app/src/main/java/com/armsx2/core/Ps1BiosProbe.java:45"
- name: "scph7001.bin"
description: "SCPH-7001, 7501, 7503, 9001, 9003, 9903 (v4.1 12-16-97 A)"
region: [north-america, latin-america]
required: false
variant_group: "psx-bios"
size: 524288
md5: "1e68c231d0896b7eadcad1d7d8e76129"
validation: [size, md5]
source_ref: "android/app/src/main/java/com/armsx2/core/Ps1BiosProbe.java:46"
- name: "scph7002.bin"
description: "SCPH-7002, 7502, 9002 (v4.1 12-16-97 E)"
region: [europe, oceania]
required: false
variant_group: "psx-bios"
size: 524288
md5: "b9d9a0286c33dc6b7237bb13cd46fdee"
validation: [size, md5]
source_ref: "android/app/src/main/java/com/armsx2/core/Ps1BiosProbe.java:47"
- name: "scph100.bin"
description: "SCPH-100 (v4.3 03-11-00 J)"
region: [japan]
required: false
variant_group: "psx-bios"
size: 524288
md5: "8abc1b549a4a80954addc48ef02c4521"
validation: [size, md5]
source_ref: "android/app/src/main/java/com/armsx2/core/Ps1BiosProbe.java:48"
- name: "scph101_v44.bin"
description: "SCPH-101 (v4.4 03-24-00 A)"
region: [north-america, latin-america]
required: false
variant_group: "psx-bios"
size: 524288
md5: "9a09ab7e49b422c007e6d54d7c49b965"
validation: [size, md5]
source_ref: "android/app/src/main/java/com/armsx2/core/Ps1BiosProbe.java:49"
- name: "scph101_v45.bin"
description: "SCPH-101 (v4.5 05-25-00 A)"
region: [north-america, latin-america]
required: false
variant_group: "psx-bios"
size: 524288
md5: "6e3735ff4c7dc899ee98981385f6f3d0"
validation: [size, md5]
source_ref: "android/app/src/main/java/com/armsx2/core/Ps1BiosProbe.java:50"
- name: "scph102_v44.bin"
description: "SCPH-102 (v4.4 03-24-00 E)"
region: [europe, oceania]
required: false
variant_group: "psx-bios"
size: 524288
md5: "b10f5e0e3d9eb60e5159690680b1e774"
validation: [size, md5]
source_ref: "android/app/src/main/java/com/armsx2/core/Ps1BiosProbe.java:51"
- name: "scph102_v45.bin"
description: "SCPH-102 (v4.5 05-25-00 E)"
region: [europe, oceania]
required: false
variant_group: "psx-bios"
size: 524288
md5: "de93caec13d1a141a40a79f5c86168d6"
validation: [size, md5]
source_ref: "android/app/src/main/java/com/armsx2/core/Ps1BiosProbe.java:52"
- name: "psxonpsp660.bin"
description: "PSP, SCPH-1000R (v4.5 05-25-00 J)"
region: [world]
required: false
variant_group: "psx-bios"
size: 524288
md5: "c53ca5908936d412331790f4426c6c33"
validation: [size, md5]
source_ref: "android/app/src/main/java/com/armsx2/core/Ps1BiosProbe.java:53"
- name: "scph1000r.bin"
description: "SCPH-1000R (v4.5 05-25-00 J)"
region: [japan]
required: false
variant_group: "psx-bios"
size: 524288
md5: "476d68a94ccec3b9c8303bbd1daf2810"
validation: [size, md5]
source_ref: "android/app/src/main/java/com/armsx2/core/Ps1BiosProbe.java:54"
- name: "<expansion>.rom" - name: "<expansion>.rom"
required: false required: false
@@ -102,8 +338,8 @@ files:
unsourceable: "any expansion port ROM the user points at, under no name and no version the code expects" unsourceable: "any expansion port ROM the user points at, under no name and no version the code expects"
description: "Expansion port ROM image" description: "Expansion port ROM image"
note: >- note: >-
Read into the 512 KB region at 0x1f000000, which is filled with 0xff when Read by the psxe frontends into the 512 KB region at 0x1f000000, which
no path is set. Named by [paths].expansion_rom, -e, or the Advanced tab of is filled with 0xff when no path is set. A path that is set and cannot be
the Android settings. A path that is set and cannot be opened fails opened fails psx_init. The Android settings only display the key, and
psx_init and stops the boot. the SwanStation adapter never reads it.
source_ref: "source psx/dev/exp1.c:12-44, source psx/dev/exp1.h:8-10, source psx/psx.c:260-261, source frontend/config.c:681, source frontend/main.cpp:1906, source android/app/src/main/java/com/armsx2/ui/settings/Ps1AdvancedTab.kt:96-100" source_ref: "psx/dev/exp1.c:12-44, psx/dev/exp1.h:9, psx/psx.c:312-313, frontend/config.c:93, frontend/main.cpp:2569-2570, android/app/src/main/java/com/armsx2/ui/settings/Ps1AdvancedTab.kt:102-108"