132 Commits
Author SHA1 Message Date
Abdessamad Derraz 8fe961a1ea fix: read the hle index scope from its comprehension 2026-10-06 07:37:41 +02:00
Abdessamad Derraz ce239d32c1 refactor: name unused mock arguments, flatten withs 2026-10-06 07:06:53 +02:00
Abdessamad Derraz 13995047fc refactor: simplify pack label, hash merge, diff exit 2026-10-06 07:06:22 +02:00
Abdessamad Derraz 31e86b6db5 refactor: let the retropie core check take none 2026-10-06 07:05:05 +02:00
Abdessamad Derraz da5e95cd0f refactor: extract the alias scope helpers 2026-10-06 07:04:54 +02:00
Abdessamad Derraz 3dce7b5f09 refactor: extract companion extras and the kept filter 2026-10-06 07:03:59 +02:00
Abdessamad Derraz 97ccf9027b refactor: extract emulator archive placement 2026-10-06 07:00:22 +02:00
Abdessamad Derraz 1caf5c4b5e refactor: one mismatch rule for builder and verifier 2026-10-06 06:57:01 +02:00
Abdessamad Derraz acfd80c928 refactor: extract verify listing and resolution steps 2026-10-06 06:50:59 +02:00
Abdessamad Derraz 4d8ea05494 refactor: move the truth steps out of pipeline main 2026-10-06 06:47:56 +02:00
Abdessamad Derraz 3df423e84f refactor: pull mismatch and region steps from manifest 2026-10-06 06:45:45 +02:00
Abdessamad Derraz 8a9924f1d8 refactor: extract retrodeck key matching helpers 2026-10-06 06:40:41 +02:00
Abdessamad Derraz 52fbea5faa refactor: split truth merge into match, fold, create 2026-10-06 06:40:07 +02:00
Abdessamad Derraz 421a7afb3f refactor: split the pin gate from bump_commit 2026-10-06 06:39:02 +02:00
Abdessamad Derraz 0b7acf1e7f refactor: hoist test imports, rank pairs at module level 2026-10-06 06:38:35 +02:00
Abdessamad Derraz c4dab556e7 fix: name only pinned claims as left unserved 2026-10-06 06:33:36 +02:00
Abdessamad Derraz 0390f2d19b fix: accept verified_members in pack manifests 2026-10-06 06:31:10 +02:00
Abdessamad Derraz e6afd06191 chore: regenerate database, manifests and readme 2026-10-06 05:46:44 +02:00
Abdessamad Derraz 03929ddaf0 fix: name each retropie package once per target 2026-10-06 05:33:18 +02:00
Abdessamad Derraz 2b71e47510 fix: give solarus and eka2l1 their own pad mappings 2026-10-06 05:26:54 +02:00
Abdessamad Derraz cd90f46937 fix: redeploy the site on any script it imports 2026-10-06 05:23:27 +02:00
Abdessamad Derraz d02672c17b fix: read retropie targets the way retropie does 2026-10-06 05:22:34 +02:00
Abdessamad Derraz c6ba139493 fix: stop target scrapes on a failed request 2026-10-06 05:19:05 +02:00
Abdessamad Derraz f0bab9766c fix: tell same-name files apart by path in truth 2026-10-06 05:18:07 +02:00
Abdessamad Derraz c55e3af5ac fix: preserve release assets by registered path 2026-10-06 05:13:34 +02:00
Abdessamad Derraz 1c34503f4e fix: one game data list for notes and composition 2026-10-06 05:11:41 +02:00
Abdessamad Derraz 72834837a5 fix: give a targeted export the full truth model 2026-10-06 05:09:45 +02:00
Abdessamad Derraz ae0bbb9d3c fix: fail a truth diff that compared nothing 2026-10-06 05:09:11 +02:00
Abdessamad Derraz e4cc978614 fix: skip schema tests when jsonschema is absent 2026-10-06 05:08:40 +02:00
Abdessamad Derraz f51c3a3fc7 fix: point the retrobat guide at install.ps1 2026-10-06 05:06:15 +02:00
Abdessamad Derraz c62a34b1b2 fix: read hle fallbacks from the platform cores only 2026-10-06 05:06:04 +02:00
Abdessamad Derraz ed18e61580 fix: fail a pack member the collection cannot name 2026-10-06 05:05:14 +02:00
Abdessamad Derraz 2cdb98239e fix: propose retropie names per core, never into or-lists 2026-10-06 05:01:10 +02:00
Abdessamad Derraz 623b0a6d47 fix: keep recalbox notes its own 2026-10-06 05:00:36 +02:00
Abdessamad Derraz 82583fe17a fix: correct one retrodeck revision, not all of them 2026-10-06 05:00:24 +02:00
Abdessamad Derraz 85501c41e8 fix: export one file's identity, never two mixed 2026-10-06 05:00:02 +02:00
Abdessamad Derraz 7273f5c8b9 chore: point seven profiles' refs at their values 2026-10-06 04:59:20 +02:00
Abdessamad Derraz e723c8c1b9 chore: point five profiles' refs at their values 2026-10-06 04:59:20 +02:00
Abdessamad Derraz 4db5866bbe chore: recale wqxemu and emucorex onto head 2026-10-06 04:59:20 +02:00
Abdessamad Derraz dc3a35bdc8 feat: profile visual-pinball hrtf, collect the sofa 2026-10-06 04:59:20 +02:00
Abdessamad Derraz 0c881820c7 chore: recale jazz2-native and linapple onto head 2026-10-06 04:59:20 +02:00
Abdessamad Derraz d839ce0a1c fix: drop cpc firmware regions, a keyboard picks 2026-10-06 04:58:59 +02:00
Abdessamad Derraz 1b885632a6 fix: drop saturn bios regions, the list is fixed 2026-10-06 04:58:59 +02:00
Abdessamad Derraz ad9f834f55 fix: drop pce system card regions, an option picks 2026-10-06 04:58:59 +02:00
Abdessamad Derraz 49e0f83ce9 fix: hold the data dir lock while packing it 2026-10-06 04:56:16 +02:00
Abdessamad Derraz 2b6dbb5e92 fix: choose regions among the files required-only keeps 2026-10-06 04:54:05 +02:00
Abdessamad Derraz 3d31a887cc fix: compare only the full pack to verify 2026-10-06 04:49:21 +02:00
Abdessamad Derraz e3f773dd82 fix: finalize only the packs this run names 2026-10-06 04:48:32 +02:00
Abdessamad Derraz c1b3e1fc33 fix: keep large-file revisions and clean failed fetches 2026-10-06 04:47:10 +02:00
Abdessamad Derraz b3c7e76adf fix: apply required-only to emulator pack archives 2026-10-06 04:46:03 +02:00
Abdessamad Derraz b2208d889e fix: count undistributed split extras with the helper 2026-10-06 04:43:49 +02:00
Abdessamad Derraz af357a2931 fix: give system packs their core extras 2026-10-06 04:42:35 +02:00
Abdessamad Derraz 1b40211366 fix: refuse every flag a quick mode does not read 2026-10-06 04:39:08 +02:00
Abdessamad Derraz a484754c76 chore: recale geolith jg.c refs onto upstream head 2026-10-06 04:37:48 +02:00
Abdessamad Derraz 46268bea47 fix: judge each profile ref by its own repository 2026-10-06 04:37:48 +02:00
Abdessamad Derraz 0fbe99a14a fix: keep cross-named aliases inside their profile 2026-10-06 04:35:35 +02:00
Abdessamad Derraz 16f4c071fe fix: arbitrate slots on the strongest profile proof 2026-10-06 04:32:19 +02:00
Abdessamad Derraz a8415c33c3 fix: key the casefold index on its source dict 2026-10-06 04:30:11 +02:00
Abdessamad Derraz 7e054fbcaf fix: pack windows platforms case-insensitively 2026-10-06 04:29:49 +02:00
Abdessamad Derraz 5784d45531 fix: carry pcsx2 companions under the names it opens 2026-10-06 04:29:16 +02:00
Abdessamad Derraz c526180351 fix: withhold a file only on the frontend digest 2026-10-06 04:21:47 +02:00
Abdessamad Derraz 36f7ee0b2b fix: one agnostic substitute rule for pack and verify 2026-10-06 04:19:40 +02:00
Abdessamad Derraz cf7d9ecb89 fix: carry identity in extras, refile rom b 2026-10-06 04:12:08 +02:00
Abdessamad Derraz ccc51b861b refactor: split the all-variants flag refusals 2026-10-06 03:11:07 +02:00
Abdessamad Derraz 3ae9729143 refactor: move flag refusals out of the main functions 2026-10-06 03:08:35 +02:00
Abdessamad Derraz 26ce416163 chore: regenerate database, manifests and readme 2026-10-06 02:47:55 +02:00
Abdessamad Derraz bd3bcc36ea fix: read accepted revision lists in profile aliases 2026-10-06 02:06:01 +02:00
Abdessamad Derraz f631174c85 test: check every registered platform pack 2026-10-06 01:54:11 +02:00
Abdessamad Derraz 22648e8a5f test: keep validation index on platform cores 2026-10-06 01:49:24 +02:00
Abdessamad Derraz 0de03b5e4c test: pin exact sets in the shipped content ratchets 2026-10-06 01:49:09 +02:00
Abdessamad Derraz 3bd19b9e97 test: fail, not skip, when slot conflicts vanish 2026-10-06 01:48:17 +02:00
Abdessamad Derraz ccf1a1573a fix: read platform hashes as verify does in PR checks 2026-10-06 01:47:48 +02:00
Abdessamad Derraz ca86236c12 refactor: one upstream name index for core lookups 2026-10-06 01:47:16 +02:00
Abdessamad Derraz 994836938c fix: lay out truth with the pack mode rule 2026-10-06 01:43:30 +02:00
Abdessamad Derraz 71cbbd9b21 feat: list retrodeck standalone emulators 2026-10-06 01:43:30 +02:00
Abdessamad Derraz 65c0f5ddc1 fix: apply changed-only to every profile_sync output 2026-10-06 01:42:00 +02:00
Abdessamad Derraz ef16ed2af2 fix: decrypt otp.bin with the standard library 2026-10-06 01:41:27 +02:00
Abdessamad Derraz da0c843bdd fix: default profile report containers to empty 2026-10-06 01:39:55 +02:00
Abdessamad Derraz e32df743d5 fix: refuse targets when their list cannot be read 2026-10-06 01:39:31 +02:00
Abdessamad Derraz 72d3654245 fix: register yaps2 resources, check data dir refs 2026-10-06 01:38:39 +02:00
Abdessamad Derraz bdcf134877 fix: build the database without network calls 2026-10-06 01:37:40 +02:00
Abdessamad Derraz aec1755c61 fix: gate on slot crashes and empty consistency 2026-10-06 01:34:59 +02:00
Abdessamad Derraz 53ee1bfd0e fix: fail the run when a platform pack errors 2026-10-06 01:34:30 +02:00
Abdessamad Derraz d2d88cf6b8 fix: send retropie users to the retropie pack 2026-10-06 01:33:58 +02:00
Abdessamad Derraz fbdee43e6d fix: point pack guides at the path each platform reads 2026-10-06 01:33:33 +02:00
Abdessamad Derraz 284f1aa6b7 fix: dedup core extras on their real destination 2026-10-06 01:32:56 +02:00
Abdessamad Derraz 10f3379751 fix: skip archive members by their yaml key 2026-10-06 01:32:33 +02:00
Abdessamad Derraz 76387d1962 fix: count romset members as held dumps 2026-10-06 01:32:09 +02:00
Abdessamad Derraz 9465a250cc fix: recale pcsx_rearmed bios refs, pal to oceania 2026-10-06 01:31:31 +02:00
Abdessamad Derraz 3bc80b2e06 fix: serve pal psx bios to oceania too 2026-10-06 01:31:27 +02:00
Abdessamad Derraz dcdfe5936e fix: drop fmsx font regions, fonts are options 2026-10-06 01:31:27 +02:00
Abdessamad Derraz ed47f437fc fix: drop prosystem regions, pal is a signal 2026-10-06 01:31:27 +02:00
Abdessamad Derraz 15abbec663 fix: drop o2em regions, the bios is a model 2026-10-06 01:31:27 +02:00
Abdessamad Derraz 077dcda775 fix: drop opera regions, the bios is an option 2026-10-06 01:31:27 +02:00
Abdessamad Derraz 27610c1d33 chore: regenerate database, manifests and readme 2026-10-06 01:22:56 +02:00
Abdessamad Derraz 25034cd958 fix: count what each export format writes 2026-10-06 01:22:56 +02:00
Abdessamad Derraz 480c02882d feat: collect the pc-88 font rom for quasi88 2026-10-06 01:22:56 +02:00
Abdessamad Derraz 056953d833 fix: attach profile aliases to a unique name only 2026-10-06 01:22:56 +02:00
Abdessamad Derraz 49d425aa8a fix: map pc-8801, dsi and cd-i system slugs 2026-10-06 01:22:56 +02:00
Abdessamad Derraz 58cb61a08f fix: refresh data dirs under a lock, by rename 2026-10-06 01:22:56 +02:00
Abdessamad Derraz 485e5bc2b3 feat: profile aps3e 2.43 on rpcs3 0.0.42 2026-10-06 00:26:36 +02:00
Abdessamad Derraz c5165ffb96 feat: profile cap32 at c238550 with the 664 rom 2026-10-06 00:26:36 +02:00
Abdessamad Derraz 183793481c fix: keep prose citations within reach and pinned 2026-10-06 00:26:36 +02:00
Abdessamad Derraz a762152c12 chore: recale gpsp refs onto their pin 2026-10-06 00:26:36 +02:00
Abdessamad Derraz b650f9eb8a chore: point desmume refs at the bios loads 2026-10-06 00:26:36 +02:00
Abdessamad Derraz 4ca4592f65 fix: group variant slots across their systems 2026-10-06 00:26:36 +02:00
Abdessamad Derraz 0fb09c6c94 fix: decide slots on the region pass grouping 2026-10-06 00:26:36 +02:00
Abdessamad Derraz 34e382eae8 fix: group regions by the target in pack integrity 2026-10-06 00:13:38 +02:00
Abdessamad Derraz 9e327a05ed fix: verify the pack the flags name, by exact name 2026-10-06 00:13:38 +02:00
Abdessamad Derraz f010e737c5 chore: regenerate database, manifests and readme 2026-10-05 22:55:32 +02:00
Abdessamad Derraz edce60bae1 feat: collect nethersx2-turnip assets from v0.7 2026-10-05 22:55:31 +02:00
Abdessamad Derraz 44663db144 fix: scan free bios names only in the bios folder 2026-10-05 22:55:31 +02:00
Abdessamad Derraz 757fad69bc feat: store pcsx2 achievement sound under its tail 2026-10-05 22:22:22 +02:00
Abdessamad Derraz ca6462c510 fix: order same-named files by their owner's copy 2026-10-05 22:22:22 +02:00
Abdessamad Derraz 3f5d825ac6 fix: no collision where one file passes every declaration 2026-10-05 22:12:23 +02:00
Abdessamad Derraz 151dd5ea04 fix: judge a slot on the declaration the pack ships 2026-10-05 22:10:48 +02:00
Abdessamad Derraz eaf315ea8f fix: check every zipped member a platform declares 2026-10-05 22:05:10 +02:00
Abdessamad Derraz 366598e662 fix: ship the archive every member declaration accepts 2026-10-05 22:05:10 +02:00
Abdessamad Derraz 5f3e9fbacd chore: regenerate install manifests 2026-10-05 22:00:13 +02:00
Abdessamad Derraz 045372992c fix: keep unsourceable entries out of the asset store 2026-10-05 22:00:13 +02:00
Abdessamad Derraz 38ffccc465 chore: regenerate install manifests 2026-10-05 21:53:59 +02:00
Abdessamad Derraz 68bcef544d fix: give the install manifest the arbitrated file 2026-10-05 21:53:59 +02:00
Abdessamad Derraz 81995a4c18 fix: emulator region report reads the pack drop set 2026-10-05 21:43:32 +02:00
Abdessamad Derraz 95d14819ce fix: one rule for the variant an emulator accepts 2026-10-05 21:36:14 +02:00
Abdessamad Derraz dc31a90dca fix: keep profile identity on second-pass extras 2026-10-05 21:27:35 +02:00
Abdessamad DerrazandClaude Opus 5.5 8e3a486107 fix: resolve held catacomb files, profile refs
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-05 02:51:29 +02:00
Abdessamad DerrazandClaude Opus 5.5 a3d5e6c048 chore: regenerate database, manifests and readme
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-05 02:51:23 +02:00
Abdessamad DerrazandClaude Opus 5.5 8e0c7bad38 feat: collect ap6, shareddata, introset, a2 scsi
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-05 02:51:23 +02:00
Abdessamad DerrazandClaude Opus 5.5 67f1b29fec feat: reprofile beetle_saturn, collect mpeg cards
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-05 02:51:22 +02:00
Abdessamad DerrazandClaude Opus 5.5 b9644f720c feat: build engine data at pinned commits
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-05 02:51:22 +02:00
Abdessamad DerrazandClaude Opus 5.5 0a9d36cae3 fix: name homonymous release assets by path
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-05 02:51:13 +02:00
Abdessamad DerrazandClaude Opus 5.5 5816562bf6 fix: one size predicate, size_options retired
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-05 02:51:13 +02:00
247 changed files with 11100 additions and 433562 deletions

No files matched your search

+1 -2
View File
@@ -22,7 +22,6 @@ on:
- "scripts/hashing.py"
- "scripts/largefiles.py"
- "scripts/list_platforms.py"
- "scripts/manifestselect.py"
- "scripts/nativemode.py"
- "scripts/packextras.py"
- "scripts/packpaths.py"
@@ -85,7 +84,7 @@ jobs:
# mkdocs-material >= 9.7.5 caps mkdocs < 2; the upper bound keeps a major
# theme release from changing the site without a deliberate bump here.
- run: pip install pyyaml "jsonschema[format-nongpl]==4.26.0" "mkdocs-material>=9.7.5,<10" "pymdown-extensions>=10.14"
- run: pip install pyyaml jsonschema==4.26.0 "mkdocs-material>=9.7.5,<10" "pymdown-extensions>=10.14"
- name: Validate data contracts
run: python scripts/validate_schemas.py
+2 -2
View File
@@ -112,7 +112,7 @@ jobs:
python-version: "3.12"
- name: Install dependencies
run: pip install pyyaml "jsonschema[format-nongpl]==4.26.0"
run: pip install pyyaml jsonschema==4.26.0
- name: Validate platform configs and emulator profiles
run: python scripts/validate_schemas.py --source-only
@@ -127,7 +127,7 @@ jobs:
python-version: "3.12"
- name: Install dependencies
run: pip install pyyaml "jsonschema[format-nongpl]==4.26.0"
run: pip install pyyaml jsonschema==4.26.0
# The exporter fidelity cases compare what we hand back against the
# file each platform publishes, so they need those files. They skip
+32 -32
View File
@@ -32,7 +32,7 @@ The script auto-detects your platform, downloads only missing files, and verifie
## Download BIOS packs
One pack per platform, and it holds everything the platform runs: its own BIOS list plus every file its emulator cores load. Pick your platform, download the ZIP, extract to the BIOS path. The installer above does the same file by file. At a terminal it asks whether to install everything or to choose systems, cores and regions, and `--system`, `--core`, `--region` and `--target` make the same choice without questions; for a bare minimum, build your own pack below.
One pack per platform, and it holds everything the platform runs: its own BIOS list plus every file its emulator cores load. Pick your platform, download the ZIP, extract to the BIOS path. The installer above does the same file by file, and `--target` narrows it to one machine; for a region or a bare minimum, build your own pack below.
Files is how many the pack holds once extracted, the figure a file manager shows for the folder. It differs from one platform to the next because a pack carries only what that platform's emulators load. The size is what the files occupy once extracted; the ZIP itself downloads smaller.
A pack over 2 GB comes in several parts, and every part is needed. How to open them depends on their name:
@@ -44,20 +44,20 @@ Every release ships `SHA256SUMS.txt` and a detached signature of it, checkable a
| Platform | Files | Extracted size | Extract to | Download |
|----------|------:|---------------:|-----------|----------|
| Batocera | 12,810 | 7.5 GB | `/userdata/bios/` | [Download](../../releases/latest) |
| BizHawk | 950 | 2.4 GB | `Firmware/` | [Download](../../releases/latest) |
| EmuDeck | 620 | 3.2 GB | `~/Emulation/bios/` | [Download](../../releases/latest) |
| Lakka | 8,504 | 6.0 GB | `/storage/system/` | [Download](../../releases/latest) |
| MiSTer FPGA | 83 | 29 MB | `/media/fat/games/` | [Download](../../releases/latest) |
| ROCKNIX | 5,804 | 6.1 GB | `/storage/roms/bios/` | [Download](../../releases/latest) |
| Recalbox | 3,222 | 3.9 GB | `/recalbox/share/bios/` | [Download](../../releases/latest) |
| RetroArch | 8,504 | 6.0 GB | `system/` | [Download](../../releases/latest) |
| RetroBat | 12,399 | 7.9 GB | `bios/` | [Download](../../releases/latest) |
| RetroDECK | 7,793 | 8.0 GB | `~/retrodeck/` | [Download](../../releases/latest) |
| RetroPie * | 12,533 | 8.1 GB | `~/RetroPie/BIOS/` | [Download](../../releases/latest) |
| RomM | 1,087 | 1.5 GB | `library/bios/` | [Download](../../releases/latest) |
| Batocera | 1,839 | 4.0 GB | `/userdata/bios/` | [Download](../../releases/latest) |
| BizHawk | 542 | 2.2 GB | `Firmware/` | [Download](../../releases/latest) |
| EmuDeck | 624 | 3.2 GB | `~/Emulation/bios/` | [Download](../../releases/latest) |
| Lakka | 4,525 | 5.5 GB | `/storage/system/` | [Download](../../releases/latest) |
| MiSTer FPGA | 74 | 24 MB | `/media/fat/games/` | [Download](../../releases/latest) |
| ROCKNIX | 1,741 | 5.3 GB | `/storage/roms/bios/` | [Download](../../releases/latest) |
| Recalbox | 1,330 | 3.6 GB | `/recalbox/share/bios/` | [Download](../../releases/latest) |
| RetroArch | 4,525 | 5.5 GB | `system/` | [Download](../../releases/latest) |
| RetroBat | 1,466 | 4.4 GB | `bios/` | [Download](../../releases/latest) |
| RetroDECK | 3,519 | 6.2 GB | `~/retrodeck/` | [Download](../../releases/latest) |
| RetroPie * | 4,525 | 5.5 GB | `~/RetroPie/BIOS/` | [Download](../../releases/latest) |
| RomM | 617 | 1.3 GB | `bios/{platform_slug}/` | [Download](../../releases/latest) |
The RetroDECK pack already carries its own `bios/` folder, so it extracts into `~/retrodeck/` rather than into the BIOS folder.
The RetroDECK pack already contains its own `bios/` folder, so it extracts into `~/retrodeck/` rather than into the BIOS folder.
\* Archived: the configuration is kept and packs are still built, but upstream is no longer scraped on a schedule.
@@ -68,17 +68,17 @@ These are the files an emulator loads from disk instead of carrying inside itsel
Each file is checked the way your platform checks it. Most compare a checksum, the fingerprint of a file's contents, which catches a corrupt or unexpected copy. RetroArch, Lakka and RetroPie only look for the filename, because that is all their code does: the Coverage table says which applies to you. Independently of that, the collection records five fingerprints per file, and wherever an emulator's code states an expected size or hash, that value is read from its source and rechecked here.
- **393 files** the platforms' emulators load are still to be found, and 51 more cannot be sourced at all (per-user keys, user-filled slots, dumps nobody has made); both are named in the [gap analysis](https://abdess.github.io/retrobios/gaps/)
- **392 files** the platforms' emulators load are still to be found, and 51 more cannot be sourced at all (per-user keys, user-filled slots, dumps nobody has made); both are named in the [gap analysis](https://abdess.github.io/retrobios/gaps/)
- **12 platforms** supported with platform-specific verification
- **506 emulators** profiled from source (RetroArch cores + standalone)
- **544 systems** handled by those emulators (NES, SNES, PlayStation, Saturn, Dreamcast, ...)
- **19,005 files in the collection**, each with its SHA1, MD5, SHA256, CRC32 and Adler-32 fingerprints: 5,269 system files, 2,808 arcade ROM sets, 10,928 game and engine data files. That is every platform and emulator together, so no pack holds them all: each carries what its own emulators load, counted in the download table
- **562 of 5,269 system files** matched to dump-preservation catalogs (No-Intro, Redump, TOSEC); arcade sets and engine data fall outside what those catalogs index
- **16687 MB** total collection size
- **546 systems** handled by those emulators (NES, SNES, PlayStation, Saturn, Dreamcast, ...)
- **18,990 files in the collection**, each with its SHA1, MD5, SHA256, CRC32 and Adler-32 fingerprints: 5,252 system files, 2,810 arcade ROM sets, 10,928 game and engine data files. That is every platform and emulator together, so no pack holds them all: each carries what its own emulators load, counted in the download table
- **562 of 5,252 system files** matched to dump-preservation catalogs (No-Intro, Redump, TOSEC); arcade sets and engine data fall outside what those catalogs index
- **16672 MB** total collection size
## Supported systems
NES, SNES, Nintendo 64, GameCube, Wii, Game Boy, Game Boy Advance, Nintendo DS, Nintendo 3DS, Switch, PlayStation, PlayStation 2, PlayStation 3, PSP, PS Vita, Mega Drive, Saturn, Dreamcast, Game Gear, Master System, Neo Geo, Atari 2600, Atari 7800, Atari Lynx, Atari ST, MSX, PC Engine, TurboGrafx-16, ColecoVision, Intellivision, Commodore 64, Amiga, ZX Spectrum, Arcade (MAME), and 510+ more.
NES, SNES, Nintendo 64, GameCube, Wii, Game Boy, Game Boy Advance, Nintendo DS, Nintendo 3DS, Switch, PlayStation, PlayStation 2, PlayStation 3, PSP, PS Vita, Mega Drive, Saturn, Dreamcast, Game Gear, Master System, Neo Geo, Atari 2600, Atari 7800, Atari Lynx, Atari ST, MSX, PC Engine, TurboGrafx-16, ColecoVision, Intellivision, Commodore 64, Amiga, ZX Spectrum, Arcade (MAME), and 512+ more.
Full list with per-file details: **[https://abdess.github.io/retrobios/](https://abdess.github.io/retrobios/)**
@@ -86,18 +86,18 @@ Full list with per-file details: **[https://abdess.github.io/retrobios/](https:/
| Platform | On its BIOS list | Files its emulators load | Checked by |
|----------|-----------------:|-------------------------:|------------|
| Batocera | 353/353 | 12,295/12,726 | MD5 hash |
| BizHawk | 118/118 | 800/801 | SHA1 hash |
| EmuDeck | 168/168 | 430/432 | MD5 hash |
| Lakka | 526/526 | 5,260/5,290 | file presence |
| Batocera | 353/353 | 12,307/12,738 | MD5 hash |
| BizHawk | 118/118 | 649/650 | SHA1 hash |
| EmuDeck | 168/168 | 381/383 | MD5 hash |
| Lakka | 527/527 | 5,263/5,293 | file presence |
| MiSTer FPGA | 81/81 | - | MD5 hash |
| ROCKNIX | 38/38 | 5,697/5,727 | MD5 hash |
| Recalbox | 351/351 | 2,731/2,739 | MD5 hash |
| RetroArch | 526/526 | 5,260/5,290 | file presence |
| RetroBat | 348/348 | 11,885/12,316 | MD5 hash |
| RetroDECK | 2,008/2,008 | 5,400/5,450 | MD5 hash |
| RetroPie * | 526/526 | 9,181/9,323 | file presence |
| RomM | 381/381 | 753/760 | MD5 hash |
| ROCKNIX | 38/38 | 5,702/5,732 | MD5 hash |
| Recalbox | 351/351 | 2,728/2,736 | MD5 hash |
| RetroArch | 527/527 | 5,263/5,293 | file presence |
| RetroBat | 348/348 | 11,749/12,179 | MD5 hash |
| RetroDECK | 2,008/2,008 | 5,296/5,346 | MD5 hash |
| RetroPie * | 527/527 | 9,182/9,324 | file presence |
| RomM | 381/381 | 624/630 | MD5 hash |
Each fraction is what the pack has over what is needed, counting required and optional files alike since both ship. The first column is the BIOS list the platform publishes. The second counts files its emulators load that this list never mentions, found by reading their source code, and it is routinely several times larger. A short fraction means files are still missing, and they are named in the [gap analysis](https://abdess.github.io/retrobios/gaps/).
That second number is a floor, not a ceiling: an emulator that accepts any file handed to it names none in its code, so nothing there can be counted.
@@ -180,4 +180,4 @@ The scripts and tooling are released under the [MIT License](LICENSE).
The BIOS and firmware files are not covered by that license: they are third-party system software, preserved and provided for personal backup, archival, and interoperability with emulation software. [NOTICE](NOTICE) sets out their status and how to ask for a file to be removed.
The reasoning, and where it is weakest, is in the [FAQ](https://abdess.github.io/retrobios/wiki/faq/#is-this-legal).
*Auto-generated on 2026-10-10T10:40:24Z*
*Auto-generated on 2026-10-06T03:31:49Z*
File diff suppressed because it is too large. Load diff
File diff suppressed because it is too large. Load diff
Binary file not shown.
-150
View File
@@ -1,150 +0,0 @@
# Default keys file bundled with Azahar.
# DISCLAIMER: The keys present in this document are used exclusively for interoperability
# with the user's legally obtained software, as well as to perform cryptographic operations
# on other 3DS-related data of non creative nature (data structures, numbers, etc).
:AES
# Generator constant
generatorConstant=1ff9e9aac5fe0408024591dc5d52768a
# OTP
otpKey=06457901d485a367ac4f2ad01c53cf74
otpIV=ba4f599b0ae1122c80e13f6865c4fa49
# Movable
movableKeyY=a717802dea9776137ba16cd389141cf0
movableCmacY=6e1e6bcb9ee098dd67ae771ad73b2cc9
# KeyX
slot0x18KeyX=82e9c9bebfb8bdb875ecc0a07d474374
slot0x19KeyX=f5367fce73142e66ed13917914b7f2ef
slot0x1AKeyX=eaba984c9cb766d4a3a7e974e2e713a3
slot0x1BKeyX=45ad04953992c7c893724a9a7bce6182
slot0x1CKeyX=c3830f8156e3543b723f0bc046741e8f
slot0x1DKeyX=d6b38bc759417596d619d6029d13e0d8
slot0x1EKeyX=bb623a97ddd793d757c4104b8d9fb969
slot0x1FKeyX=4c28ec6effa3c23646078bba350c7995
slot0x25KeyX=cee7d8ab30c00dae850ef5e382ac5af3
slot0x2CKeyX=b98e95ceca3e4d171f76a94de934c053
slot0x2DKeyX=b98e95ceca3e4d171f76a94de934c053
slot0x2EKeyX=b98e95ceca3e4d171f76a94de934c053
slot0x2FKeyX=b98e95ceca3e4d171f76a94de934c053
slot0x30KeyX=c66e23128f289133f04cdb877a3749f2
slot0x31KeyX=c66e23128f289133f04cdb877a3749f2
slot0x32KeyX=c66e23128f289133f04cdb877a3749f2
slot0x33KeyX=c66e23128f289133f04cdb877a3749f2
slot0x34KeyX=6fbb01f872caf9c01834eec04065ee53
slot0x35KeyX=6fbb01f872caf9c01834eec04065ee53
slot0x36KeyX=6fbb01f872caf9c01834eec04065ee53
slot0x37KeyX=6fbb01f872caf9c01834eec04065ee53
slot0x38KeyX=b529221cddb5db5a1bf26eff2041e875
slot0x39KeyX=b529221cddb5db5a1bf26eff2041e875
slot0x3AKeyX=b529221cddb5db5a1bf26eff2041e875
slot0x3BKeyX=b529221cddb5db5a1bf26eff2041e875
slot0x3CKeyX=c35d6d15680b1ad4e912a341836121b3
slot0x3DKeyX=617085719b7cfb316df4df2e8362c6e2
slot0x3EKeyX=24baf628d06889bf282d0aa35dc55650
slot0x3FKeyX=a31233280bb4daa7761393f78c424952
# KeyY
slot0x04KeyY=ff3388ecd21705bb339e967986dc4907
slot0x05KeyY=54ef035f30260e0e9b5e004fc985dc22
slot0x06KeyY=24b05aaaac0b099252030c02d1040317
slot0x07KeyY=e9acc5abd4ad3f0660c83c8934882f3f
slot0x08KeyY=4803050106d482dcd75f85c5aadff9b3
slot0x09KeyY=af6346efdddfa9806e3c6b6855b78930
slot0x0AKeyY=0a870a2c4b2fc3172e5f0335d8c5085d
slot0x0BKeyY=fda0152fcd6ddb3133b887ba727c0ada
slot0x24KeyY=74ca074884f4228deb2a1ca72d287762
slot0x2EKeyY=7462553f9e5a7904b8647cca736da1f5
slot0x2FKeyY=c369baa21e188a88a9aa94e5506a9f16
slot0x31KeyY=7462553f9e5a7904b8647cca736da1f5
# DLP/NFC KeyY (slot 0x39)
dlpKeyY=7462553f9e5a7904b8647cca736da1f5
nfcKeyY=ed7858a8bba7eed7fc970c5979bc0af2
# Ticket Common KeyY (slot 0x3D)
common0=d07b337f9ca4385932a2e25723232eb9
common1=0c767230f0998f1c46828202faacbe4c
common2=c475cb3ab8c788bb575e12a10907b8a4
common3=e486eee3d0c09c902f6686d4c06f649f
common4=ed31ba9c04b067506c4497a35b7804fc
common5=5e66998ab4e8931606850fd7a16dd755
# KeyN
slot0x0CKeyN=e7c9ff9d4f5b6f4dc5e2f50e856f0ab2
slot0x0DKeyN=e7c9ff9d4f5b6f4dc5e2f50e856f0ab2
slot0x0EKeyN=e7c9ff9d4f5b6f4dc5e2f50e856f0ab2
slot0x0FKeyN=e7c9ff9d4f5b6f4dc5e2f50e856f0ab2
slot0x10KeyN=285713db53051c089bdfb3b6aa638fda
slot0x11KeyN=285713db53051c089bdfb3b6aa638fda
slot0x12KeyN=285713db53051c089bdfb3b6aa638fda
slot0x13KeyN=285713db53051c089bdfb3b6aa638fda
slot0x14KeyN=2af3bbd32cd59c06fd4abe58651987ad
slot0x15KeyN=be2836751c734ba8da18e1887f888bd6
slot0x16KeyN=e3a18eb1c1dc8a3d27c3967e6e362de3
slot0x17KeyN=d0294cfb7be0b4fb7324d986fd3993bb
slot0x20KeyN=7c92f6272551c4614db0b345edd2e869
slot0x21KeyN=7c92f6272551c4614db0b345edd2e869
slot0x22KeyN=7c92f6272551c4614db0b345edd2e869
slot0x23KeyN=7c92f6272551c4614db0b345edd2e869
slot0x26KeyN=bbe8b4e09d0937816b234d8eb3cd3ca2
slot0x27KeyN=bbe8b4e09d0937816b234d8eb3cd3ca2
slot0x28KeyN=bbe8b4e09d0937816b234d8eb3cd3ca2
slot0x29KeyN=5218127e133ce3b85bb8c018ce76b7e2
slot0x2AKeyN=4a4264cf32e84170666f29ac88ef3f7e
slot0x2BKeyN=51af6c4c8b13da3228bd29b371cf84e1
slot0x2DKeyN=3ed6f5cf2cc37c54655000b7c8b52e0d
slot0x32KeyN=b87e64018b190ffe048a8124c6454196
slot0x36KeyN=28c0d59b736657bcdf50ff174979958a
slot0x38KeyN=6e78a3be9bddda09bfd569483f24fce0
# NFC Secrets
nfcSecret0Phrase=756e666978656420696e666f7300
nfcSecret0Seed=db4b9e3f45278f397eff9b4fb993
nfcSecret0HmacKey=1d164b375b72a55728b91d64b6a3c205
nfcSecret1Phrase=6c6f636b65642073656372657400
nfcSecret1Seed=fdc8a07694b89e4c47d37de8ce5c74c1
nfcSecret1HmacKey=7f752d2873a20017fef85c0575904b6d
nfcIv=4fd39a6e79fceaad99904db8ee38e9db
:RSA
# Slots
slot0x00X=c034829a11c7116a08633e89a78ca0919779da8cc967077afc60e1786247e5068b9a76588a15f0304b3887b5147c259f7a2e6e480aceb0be35f0c5885ea2d8838fd6aafe45ac58fc08d4d0569d3cd3b09f9c6985fcd5c7152ebc54a885d6b11129b503611510bbfa0b07552d5800ecf636ef90d101cd475a3f4274e0c1e828b2bb516c8cd80f95f5db6a239083435509c0190e5d218b19c3bebc2a3aa73cebf53e7e4998d9be01a440f3f1c0f3157ba6f65a7be9e059d4d26f9de997141979df2ceaa175d91db2079051978f805d6f97741b6db4e96e3305611392b4b7ca76f0b45387c40d5879cde6b1509062216cb9ac21f3510ccd6df4da8f581ff86d2f31
slot0x00M=c12e4877ff0fedb98afa6dbe5d7ac86489a4e0901dba22d2e7ba945c830126ca71976f284a5e57e386b4778fbb78e3f1750ecd8b6ed3984f3cd363f801dd9ed5271ea859f49ff4da02d88445efba774b3a46279167cb905300d0903ecb71772b78cfe918921e2bef699f87d9cbef273fbc0e320d177e925021e869bb827f227f17da206ae9ce5de262566c4fab0be86866f7218fd48c248c0d8cbdeb3adbc423a6cd1b572f82c0172d23e32b1b4f0c30b04c20749126851dba39b31a2918c23f91034969e601c0a1099742e8fd31cfe4a02cd9e6bd7b646c52465567c7463b2a9e7e9fa53a0e260d4daee68091ee7adfa1c1491538276161e1c10293f4592a33
# Ticket wrap
ticketWrapExp=010001
ticketWrapMod=d24cb2e48feaf004d4bb08f8f3defcbb0c934a146b15366c9ddc1eb1649b9feb964b569c2283954d3d2b8a1ab21dc1159c2e6cb4cdd4c0bb96dbad4f02d31f45573892af855273aca20c459b9bd3126425c05d766bfd2fad87986c08416aea8d4266cd9d4ffc3f20f7b5672b686793141edde1b11689aca2f6469c9b0ea4577150235185ed4e7e4f2f9036c165a20c73e160c644a47303d2ed9bb0ba2fc90989bd87eb4563d8f7a61d889a7807b155e7f2107d048d828fcba23090839341385614fde4fabe84f2f0532da34750f32ab11fbe084c0083edbf0b50e96a49dd9d1e293e2249ee954db8afd139461ead4f11a2d06836446473140ed3867e4e5ead3b
# Secure info
secureInfoExp=010001
secureInfoMod=b1791a6d1eadd429ba89a1cd433630174bc68730c5e70560197b50d8c4546710a6e8a101bc2ceb0376f005c70ce0b6d6dffd26df33468bdbb2391e7ec01aa1a5a091e807da378676ba390a25429d5961e161d40485a74bb20186beb11a3572c1c2ea28ab7a1015325c9e712b7df965eae6c6fb8baed76c2a94a6c5ece40eaf987e06f20f884fd20635a476e9f70aba5c5b1461520054044593e468270435355aad5809d1193f5a0728d6db6b551f77945dc3be6fae5bcc0863e476dfa29b36ea853403e616eaa905e07f3a3e7e7077cf166a61d17e4d354c744485d4f67b0eee32f1c2d5790248e9621a33baa39b02b02294057ff6b43888e301e55a237c9c0b
# Local friend code seed
lfcsExp=010001
lfcsMod=a3759a3546cfa7fe30ec55a1b64e08e9449d0c72fcd191fd610a288975bce6a9b21556e9c7670255adfc3cee5edb78259a4b221b71e7e9515b2a6793b21868ce5e5e12ffd86806af318d56f9549902346a17e7837496a05aaf6efde6bed686aafd7a65a8ebe11c983a15c17ab540c23d9b7cfdd463c5e6deb77824c629473335b2e937e054ee9fa53dd793ca3eae4db60f5a11e70cdfba03b21e2b31b65906db5f940bf76e74cad4ab55d940058f10fe06050c81bb422190ba4f5c5382e1e10fbc949f60695d1303aae2e0c108424c200b9baa552d55276e24e5d60457588ff75f0cec819f6d2d28f31055f83b7662d4e4a69369b5da6b4023af07eb9cbfa9c9
:ECC
# Root public
rootPublicXY=004e3bb74d5d959e68ce900434fe9e4a3f094a33771fa7c0e4b023264d98014ca1fc799d3fa52171d5f9bd5b1777ec0fef7a38d1669bbf830325843a
# Padding......
-154
View File
@@ -1,154 +0,0 @@
# Default keys file bundled with Azahar.
# DISCLAIMER: The keys present in this document are used exclusively for interoperability
# with the user's legally obtained software, as well as to perform cryptographic operations
# on other 3DS-related data of non creative nature (data structures, numbers, etc).
:AES
# Generator constant
generatorConstant=1ff9e9aac5fe0408024591dc5d52768a
# OTP
otpKey=06457901d485a367ac4f2ad01c53cf74
otpIV=ba4f599b0ae1122c80e13f6865c4fa49
# Movable
movableKeyY=a717802dea9776137ba16cd389141cf0
movableCmacY=6e1e6bcb9ee098dd67ae771ad73b2cc9
# KeyX
slot0x18KeyX=82e9c9bebfb8bdb875ecc0a07d474374
slot0x19KeyX=f5367fce73142e66ed13917914b7f2ef
slot0x1AKeyX=eaba984c9cb766d4a3a7e974e2e713a3
slot0x1BKeyX=45ad04953992c7c893724a9a7bce6182
slot0x1CKeyX=c3830f8156e3543b723f0bc046741e8f
slot0x1DKeyX=d6b38bc759417596d619d6029d13e0d8
slot0x1EKeyX=bb623a97ddd793d757c4104b8d9fb969
slot0x1FKeyX=4c28ec6effa3c23646078bba350c7995
slot0x25KeyX=cee7d8ab30c00dae850ef5e382ac5af3
slot0x2CKeyX=b98e95ceca3e4d171f76a94de934c053
slot0x2DKeyX=b98e95ceca3e4d171f76a94de934c053
slot0x2EKeyX=b98e95ceca3e4d171f76a94de934c053
slot0x2FKeyX=b98e95ceca3e4d171f76a94de934c053
slot0x30KeyX=c66e23128f289133f04cdb877a3749f2
slot0x31KeyX=c66e23128f289133f04cdb877a3749f2
slot0x32KeyX=c66e23128f289133f04cdb877a3749f2
slot0x33KeyX=c66e23128f289133f04cdb877a3749f2
slot0x34KeyX=6fbb01f872caf9c01834eec04065ee53
slot0x35KeyX=6fbb01f872caf9c01834eec04065ee53
slot0x36KeyX=6fbb01f872caf9c01834eec04065ee53
slot0x37KeyX=6fbb01f872caf9c01834eec04065ee53
slot0x38KeyX=b529221cddb5db5a1bf26eff2041e875
slot0x39KeyX=b529221cddb5db5a1bf26eff2041e875
slot0x3AKeyX=b529221cddb5db5a1bf26eff2041e875
slot0x3BKeyX=b529221cddb5db5a1bf26eff2041e875
slot0x3CKeyX=c35d6d15680b1ad4e912a341836121b3
slot0x3DKeyX=617085719b7cfb316df4df2e8362c6e2
slot0x3EKeyX=24baf628d06889bf282d0aa35dc55650
slot0x3FKeyX=a31233280bb4daa7761393f78c424952
# KeyY
slot0x04KeyY=ff3388ecd21705bb339e967986dc4907
slot0x05KeyY=54ef035f30260e0e9b5e004fc985dc22
slot0x06KeyY=24b05aaaac0b099252030c02d1040317
slot0x07KeyY=e9acc5abd4ad3f0660c83c8934882f3f
slot0x08KeyY=4803050106d482dcd75f85c5aadff9b3
slot0x09KeyY=af6346efdddfa9806e3c6b6855b78930
slot0x0AKeyY=0a870a2c4b2fc3172e5f0335d8c5085d
slot0x0BKeyY=fda0152fcd6ddb3133b887ba727c0ada
slot0x24KeyY=74ca074884f4228deb2a1ca72d287762
slot0x2EKeyY=7462553f9e5a7904b8647cca736da1f5
slot0x2FKeyY=c369baa21e188a88a9aa94e5506a9f16
slot0x31KeyY=7462553f9e5a7904b8647cca736da1f5
# DLP/NFC KeyY (slot 0x39)
dlpKeyY=7462553f9e5a7904b8647cca736da1f5
nfcKeyY=ed7858a8bba7eed7fc970c5979bc0af2
# Ticket Common KeyY (slot 0x3D)
common0=d07b337f9ca4385932a2e25723232eb9
common1=0c767230f0998f1c46828202faacbe4c
common2=c475cb3ab8c788bb575e12a10907b8a4
common3=e486eee3d0c09c902f6686d4c06f649f
common4=ed31ba9c04b067506c4497a35b7804fc
common5=5e66998ab4e8931606850fd7a16dd755
# KeyN
slot0x0CKeyN=e7c9ff9d4f5b6f4dc5e2f50e856f0ab2
slot0x0DKeyN=e7c9ff9d4f5b6f4dc5e2f50e856f0ab2
slot0x0EKeyN=e7c9ff9d4f5b6f4dc5e2f50e856f0ab2
slot0x0FKeyN=e7c9ff9d4f5b6f4dc5e2f50e856f0ab2
slot0x10KeyN=285713db53051c089bdfb3b6aa638fda
slot0x11KeyN=285713db53051c089bdfb3b6aa638fda
slot0x12KeyN=285713db53051c089bdfb3b6aa638fda
slot0x13KeyN=285713db53051c089bdfb3b6aa638fda
slot0x14KeyN=2af3bbd32cd59c06fd4abe58651987ad
slot0x15KeyN=be2836751c734ba8da18e1887f888bd6
slot0x16KeyN=e3a18eb1c1dc8a3d27c3967e6e362de3
slot0x17KeyN=d0294cfb7be0b4fb7324d986fd3993bb
slot0x20KeyN=7c92f6272551c4614db0b345edd2e869
slot0x21KeyN=7c92f6272551c4614db0b345edd2e869
slot0x22KeyN=7c92f6272551c4614db0b345edd2e869
slot0x23KeyN=7c92f6272551c4614db0b345edd2e869
slot0x26KeyN=bbe8b4e09d0937816b234d8eb3cd3ca2
slot0x27KeyN=bbe8b4e09d0937816b234d8eb3cd3ca2
slot0x28KeyN=bbe8b4e09d0937816b234d8eb3cd3ca2
slot0x29KeyN=5218127e133ce3b85bb8c018ce76b7e2
slot0x2AKeyN=4a4264cf32e84170666f29ac88ef3f7e
slot0x2BKeyN=51af6c4c8b13da3228bd29b371cf84e1
slot0x2DKeyN=3ed6f5cf2cc37c54655000b7c8b52e0d
slot0x32KeyN=b87e64018b190ffe048a8124c6454196
slot0x36KeyN=28c0d59b736657bcdf50ff174979958a
slot0x38KeyN=6e78a3be9bddda09bfd569483f24fce0
# NFC Secrets
nfcSecret0Phrase=756e666978656420696e666f7300
nfcSecret0Seed=db4b9e3f45278f397eff9b4fb993
nfcSecret0HmacKey=1d164b375b72a55728b91d64b6a3c205
nfcSecret1Phrase=6c6f636b65642073656372657400
nfcSecret1Seed=fdc8a07694b89e4c47d37de8ce5c74c1
nfcSecret1HmacKey=7f752d2873a20017fef85c0575904b6d
nfcIv=4fd39a6e79fceaad99904db8ee38e9db
# DLP Checksum
dlpChecksumModIv=fe449ac13ae3b4095011d18944107833
:RSA
# Slots
slot0x00X=c034829a11c7116a08633e89a78ca0919779da8cc967077afc60e1786247e5068b9a76588a15f0304b3887b5147c259f7a2e6e480aceb0be35f0c5885ea2d8838fd6aafe45ac58fc08d4d0569d3cd3b09f9c6985fcd5c7152ebc54a885d6b11129b503611510bbfa0b07552d5800ecf636ef90d101cd475a3f4274e0c1e828b2bb516c8cd80f95f5db6a239083435509c0190e5d218b19c3bebc2a3aa73cebf53e7e4998d9be01a440f3f1c0f3157ba6f65a7be9e059d4d26f9de997141979df2ceaa175d91db2079051978f805d6f97741b6db4e96e3305611392b4b7ca76f0b45387c40d5879cde6b1509062216cb9ac21f3510ccd6df4da8f581ff86d2f31
slot0x00M=c12e4877ff0fedb98afa6dbe5d7ac86489a4e0901dba22d2e7ba945c830126ca71976f284a5e57e386b4778fbb78e3f1750ecd8b6ed3984f3cd363f801dd9ed5271ea859f49ff4da02d88445efba774b3a46279167cb905300d0903ecb71772b78cfe918921e2bef699f87d9cbef273fbc0e320d177e925021e869bb827f227f17da206ae9ce5de262566c4fab0be86866f7218fd48c248c0d8cbdeb3adbc423a6cd1b572f82c0172d23e32b1b4f0c30b04c20749126851dba39b31a2918c23f91034969e601c0a1099742e8fd31cfe4a02cd9e6bd7b646c52465567c7463b2a9e7e9fa53a0e260d4daee68091ee7adfa1c1491538276161e1c10293f4592a33
# Ticket wrap
ticketWrapExp=010001
ticketWrapMod=d24cb2e48feaf004d4bb08f8f3defcbb0c934a146b15366c9ddc1eb1649b9feb964b569c2283954d3d2b8a1ab21dc1159c2e6cb4cdd4c0bb96dbad4f02d31f45573892af855273aca20c459b9bd3126425c05d766bfd2fad87986c08416aea8d4266cd9d4ffc3f20f7b5672b686793141edde1b11689aca2f6469c9b0ea4577150235185ed4e7e4f2f9036c165a20c73e160c644a47303d2ed9bb0ba2fc90989bd87eb4563d8f7a61d889a7807b155e7f2107d048d828fcba23090839341385614fde4fabe84f2f0532da34750f32ab11fbe084c0083edbf0b50e96a49dd9d1e293e2249ee954db8afd139461ead4f11a2d06836446473140ed3867e4e5ead3b
# Secure info
secureInfoExp=010001
secureInfoMod=b1791a6d1eadd429ba89a1cd433630174bc68730c5e70560197b50d8c4546710a6e8a101bc2ceb0376f005c70ce0b6d6dffd26df33468bdbb2391e7ec01aa1a5a091e807da378676ba390a25429d5961e161d40485a74bb20186beb11a3572c1c2ea28ab7a1015325c9e712b7df965eae6c6fb8baed76c2a94a6c5ece40eaf987e06f20f884fd20635a476e9f70aba5c5b1461520054044593e468270435355aad5809d1193f5a0728d6db6b551f77945dc3be6fae5bcc0863e476dfa29b36ea853403e616eaa905e07f3a3e7e7077cf166a61d17e4d354c744485d4f67b0eee32f1c2d5790248e9621a33baa39b02b02294057ff6b43888e301e55a237c9c0b
# Local friend code seed
lfcsExp=010001
lfcsMod=a3759a3546cfa7fe30ec55a1b64e08e9449d0c72fcd191fd610a288975bce6a9b21556e9c7670255adfc3cee5edb78259a4b221b71e7e9515b2a6793b21868ce5e5e12ffd86806af318d56f9549902346a17e7837496a05aaf6efde6bed686aafd7a65a8ebe11c983a15c17ab540c23d9b7cfdd463c5e6deb77824c629473335b2e937e054ee9fa53dd793ca3eae4db60f5a11e70cdfba03b21e2b31b65906db5f940bf76e74cad4ab55d940058f10fe06050c81bb422190ba4f5c5382e1e10fbc949f60695d1303aae2e0c108424c200b9baa552d55276e24e5d60457588ff75f0cec819f6d2d28f31055f83b7662d4e4a69369b5da6b4023af07eb9cbfa9c9
:ECC
# Root public
rootPublicXY=004e3bb74d5d959e68ce900434fe9e4a3f094a33771fa7c0e4b023264d98014ca1fc799d3fa52171d5f9bd5b1777ec0fef7a38d1669bbf830325843a
# Padding...................
File diff suppressed because it is too large. Load diff
Binary file not shown.
@@ -1,498 +0,0 @@
// SPDX-FileCopyrightText: 2002-2025 PCSX2 Dev Team
// SPDX-License-Identifier: GPL-3.0+
#ifndef FXAA_HLSL
#define FXAA_HLSL 0
#endif
#ifndef FXAA_GLSL_130
#define FXAA_GLSL_130 0
#endif
#ifndef FXAA_GLSL_VK
#define FXAA_GLSL_VK 0
#endif
#define UHQ_FXAA 1 //High Quality Fast Approximate Anti Aliasing. Adapted for GS from Timothy Lottes FXAA 3.11.
#define FxaaSubpixMax 0.0 //[0.00 to 1.00] Amount of subpixel aliasing removal. 0.00: Edge only antialiasing (no blurring)
#define FxaaEarlyExit 1 //[0 or 1] Use Fxaa early exit pathing. When disabled, the entire scene is antialiased(FSAA). 0 is off, 1 is on.
/*------------------------------------------------------------------------------
[GLOBALS|FUNCTIONS]
------------------------------------------------------------------------------*/
#if (FXAA_GLSL_130 == 1)
in vec2 PSin_t;
layout(location = 0) out vec4 SV_Target0;
layout(binding = 0) uniform sampler2D TextureSampler;
#elif (FXAA_GLSL_VK == 1)
layout(location = 0) in vec2 PSin_t;
layout(location = 0) out vec4 SV_Target0;
layout(set = 0, binding = 0) uniform sampler2D TextureSampler;
#elif (FXAA_HLSL == 1)
Texture2D Texture : register(t0);
SamplerState TextureSampler : register(s0);
struct VS_INPUT
{
float4 p : POSITION;
float2 t : TEXCOORD0;
};
struct VS_OUTPUT
{
float4 p : SV_Position;
float2 t : TEXCOORD0;
};
struct PS_OUTPUT
{
float4 c : SV_Target0;
};
#elif defined(__METAL_VERSION__)
static constexpr sampler MAIN_SAMPLER(coord::normalized, address::clamp_to_edge, filter::linear);
#endif
/*------------------------------------------------------------------------------
[FXAA CODE SECTION]
------------------------------------------------------------------------------*/
#if (FXAA_HLSL == 1)
struct FxaaTex { SamplerState smpl; Texture2D tex; };
#define FxaaTexTop(t, p) t.tex.SampleLevel(t.smpl, p, 0.0)
#define FxaaTexOff(t, p, o, r) t.tex.SampleLevel(t.smpl, p, 0.0, o)
#define FxaaDiscard clip(-1)
#define FxaaSat(x) saturate(x)
#elif (FXAA_GLSL_130 == 1 || FXAA_GLSL_VK == 1)
#define int2 ivec2
#define float2 vec2
#define float3 vec3
#define float4 vec4
#define FxaaDiscard discard
#define FxaaSat(x) clamp(x, 0.0, 1.0)
#define FxaaTex sampler2D
#define FxaaTexTop(t, p) textureLod(t, p, 0.0)
#define FxaaTexOff(t, p, o, r) textureLodOffset(t, p, 0.0, o)
#elif defined(__METAL_VERSION__)
#define FxaaTex texture2d<float>
#define FxaaTexTop(t, p) t.sample(MAIN_SAMPLER, p)
#define FxaaTexOff(t, p, o, r) t.sample(MAIN_SAMPLER, p, o)
#define FxaaDiscard discard_fragment()
#define FxaaSat(x) saturate(x)
#endif
#define FxaaEdgeThreshold 0.063
#define FxaaEdgeThresholdMin 0.00
#define FXAA_QUALITY_P0 1.0
#define FXAA_QUALITY_P1 1.5
#define FXAA_QUALITY_P2 2.0
#define FXAA_QUALITY_P3 2.0
#define FXAA_QUALITY_P4 2.0
#define FXAA_QUALITY_P5 2.0
#define FXAA_QUALITY_P6 2.0
#define FXAA_QUALITY_P7 2.0
#define FXAA_QUALITY_P8 2.0
#define FXAA_QUALITY_P9 2.0
#define FXAA_QUALITY_P10 4.0
#define FXAA_QUALITY_P11 8.0
#define FXAA_QUALITY_P12 8.0
/*------------------------------------------------------------------------------
[GAMMA PREPASS CODE SECTION]
------------------------------------------------------------------------------*/
float RGBLuminance(float3 color)
{
const float3 lumCoeff = float3(0.2126729, 0.7151522, 0.0721750);
return dot(color.rgb, lumCoeff);
}
float3 RGBGammaToLinear(float3 color, float gamma)
{
color = FxaaSat(color);
color.r = (color.r <= 0.0404482362771082) ?
color.r / 12.92 : pow((color.r + 0.055) / 1.055, gamma);
color.g = (color.g <= 0.0404482362771082) ?
color.g / 12.92 : pow((color.g + 0.055) / 1.055, gamma);
color.b = (color.b <= 0.0404482362771082) ?
color.b / 12.92 : pow((color.b + 0.055) / 1.055, gamma);
return color;
}
float3 LinearToRGBGamma(float3 color, float gamma)
{
color = FxaaSat(color);
color.r = (color.r <= 0.00313066844250063) ?
color.r * 12.92 : 1.055 * pow(color.r, 1.0 / gamma) - 0.055;
color.g = (color.g <= 0.00313066844250063) ?
color.g * 12.92 : 1.055 * pow(color.g, 1.0 / gamma) - 0.055;
color.b = (color.b <= 0.00313066844250063) ?
color.b * 12.92 : 1.055 * pow(color.b, 1.0 / gamma) - 0.055;
return color;
}
float4 PreGammaPass(float4 color)
{
const float GammaConst = 2.233;
color.rgb = RGBGammaToLinear(color.rgb, GammaConst);
color.rgb = LinearToRGBGamma(color.rgb, GammaConst);
color.a = RGBLuminance(color.rgb);
return color;
}
/*------------------------------------------------------------------------------
[FXAA CODE SECTION]
------------------------------------------------------------------------------*/
float FxaaLuma(float4 rgba)
{
rgba.w = RGBLuminance(rgba.xyz);
return rgba.w;
}
float4 FxaaPixelShader(float2 pos, FxaaTex tex, float2 fxaaRcpFrame, float fxaaSubpix, float fxaaEdgeThreshold, float fxaaEdgeThresholdMin)
{
float2 posM = pos;
float4 rgbyM = FxaaTexTop(tex, posM);
rgbyM.w = RGBLuminance(rgbyM.xyz);
#define lumaM rgbyM.w
float lumaS = FxaaLuma(FxaaTexOff(tex, posM, int2( 0, 1), fxaaRcpFrame.xy));
float lumaE = FxaaLuma(FxaaTexOff(tex, posM, int2( 1, 0), fxaaRcpFrame.xy));
float lumaN = FxaaLuma(FxaaTexOff(tex, posM, int2( 0,-1), fxaaRcpFrame.xy));
float lumaW = FxaaLuma(FxaaTexOff(tex, posM, int2(-1, 0), fxaaRcpFrame.xy));
float maxSM = max(lumaS, lumaM);
float minSM = min(lumaS, lumaM);
float maxESM = max(lumaE, maxSM);
float minESM = min(lumaE, minSM);
float maxWN = max(lumaN, lumaW);
float minWN = min(lumaN, lumaW);
float rangeMax = max(maxWN, maxESM);
float rangeMin = min(minWN, minESM);
float range = rangeMax - rangeMin;
float rangeMaxScaled = rangeMax * fxaaEdgeThreshold;
float rangeMaxClamped = max(fxaaEdgeThresholdMin, rangeMaxScaled);
#if (FxaaEarlyExit == 1)
// Potential optimization, early exit.
if (range < rangeMaxClamped)
return rgbyM;
#endif
float lumaNW = FxaaLuma(FxaaTexOff(tex, posM, int2(-1,-1), fxaaRcpFrame.xy));
float lumaSE = FxaaLuma(FxaaTexOff(tex, posM, int2( 1, 1), fxaaRcpFrame.xy));
float lumaNE = FxaaLuma(FxaaTexOff(tex, posM, int2( 1,-1), fxaaRcpFrame.xy));
float lumaSW = FxaaLuma(FxaaTexOff(tex, posM, int2(-1, 1), fxaaRcpFrame.xy));
float lumaNS = lumaN + lumaS;
float lumaWE = lumaW + lumaE;
float subpixRcpRange = 1.0/range;
float subpixNSWE = lumaNS + lumaWE;
float edgeHorz1 = (-2.0 * lumaM) + lumaNS;
float edgeVert1 = (-2.0 * lumaM) + lumaWE;
float lumaNESE = lumaNE + lumaSE;
float lumaNWNE = lumaNW + lumaNE;
float edgeHorz2 = (-2.0 * lumaE) + lumaNESE;
float edgeVert2 = (-2.0 * lumaN) + lumaNWNE;
float lumaNWSW = lumaNW + lumaSW;
float lumaSWSE = lumaSW + lumaSE;
float edgeHorz4 = (abs(edgeHorz1) * 2.0) + abs(edgeHorz2);
float edgeVert4 = (abs(edgeVert1) * 2.0) + abs(edgeVert2);
float edgeHorz3 = (-2.0 * lumaW) + lumaNWSW;
float edgeVert3 = (-2.0 * lumaS) + lumaSWSE;
float edgeHorz = abs(edgeHorz3) + edgeHorz4;
float edgeVert = abs(edgeVert3) + edgeVert4;
float subpixNWSWNESE = lumaNWSW + lumaNESE;
float lengthSign = fxaaRcpFrame.x;
bool horzSpan = edgeHorz >= edgeVert;
float subpixA = subpixNSWE * 2.0 + subpixNWSWNESE;
if(!horzSpan) lumaN = lumaW;
if(!horzSpan) lumaS = lumaE;
if(horzSpan) lengthSign = fxaaRcpFrame.y;
float subpixB = (subpixA * (1.0/12.0)) - lumaM;
float gradientN = lumaN - lumaM;
float gradientS = lumaS - lumaM;
float lumaNN = lumaN + lumaM;
float lumaSS = lumaS + lumaM;
bool pairN = abs(gradientN) >= abs(gradientS);
float gradient = max(abs(gradientN), abs(gradientS));
if(pairN) lengthSign = -lengthSign;
float subpixC = FxaaSat(abs(subpixB) * subpixRcpRange);
float2 posB;
posB.x = posM.x;
posB.y = posM.y;
float2 offNP;
offNP.x = (!horzSpan) ? 0.0 : fxaaRcpFrame.x;
offNP.y = ( horzSpan) ? 0.0 : fxaaRcpFrame.y;
if(!horzSpan) posB.x += lengthSign * 0.5;
if( horzSpan) posB.y += lengthSign * 0.5;
float2 posN;
posN.x = posB.x - offNP.x * FXAA_QUALITY_P0;
posN.y = posB.y - offNP.y * FXAA_QUALITY_P0;
float2 posP;
posP.x = posB.x + offNP.x * FXAA_QUALITY_P0;
posP.y = posB.y + offNP.y * FXAA_QUALITY_P0;
float subpixD = ((-2.0)*subpixC) + 3.0;
float lumaEndN = FxaaLuma(FxaaTexTop(tex, posN));
float subpixE = subpixC * subpixC;
float lumaEndP = FxaaLuma(FxaaTexTop(tex, posP));
if(!pairN) lumaNN = lumaSS;
float gradientScaled = gradient * 1.0/4.0;
float lumaMM = lumaM - lumaNN * 0.5;
float subpixF = subpixD * subpixE;
bool lumaMLTZero = lumaMM < 0.0;
lumaEndN -= lumaNN * 0.5;
lumaEndP -= lumaNN * 0.5;
bool doneN = abs(lumaEndN) >= gradientScaled;
bool doneP = abs(lumaEndP) >= gradientScaled;
if(!doneN) posN.x -= offNP.x * FXAA_QUALITY_P1;
if(!doneN) posN.y -= offNP.y * FXAA_QUALITY_P1;
bool doneNP = (!doneN) || (!doneP);
if(!doneP) posP.x += offNP.x * FXAA_QUALITY_P1;
if(!doneP) posP.y += offNP.y * FXAA_QUALITY_P1;
if(doneNP) {
if(!doneN) lumaEndN = FxaaLuma(FxaaTexTop(tex, posN.xy));
if(!doneP) lumaEndP = FxaaLuma(FxaaTexTop(tex, posP.xy));
if(!doneN) lumaEndN = lumaEndN - lumaNN * 0.5;
if(!doneP) lumaEndP = lumaEndP - lumaNN * 0.5;
doneN = abs(lumaEndN) >= gradientScaled;
doneP = abs(lumaEndP) >= gradientScaled;
if(!doneN) posN.x -= offNP.x * FXAA_QUALITY_P2;
if(!doneN) posN.y -= offNP.y * FXAA_QUALITY_P2;
doneNP = (!doneN) || (!doneP);
if(!doneP) posP.x += offNP.x * FXAA_QUALITY_P2;
if(!doneP) posP.y += offNP.y * FXAA_QUALITY_P2;
if(doneNP) {
if(!doneN) lumaEndN = FxaaLuma(FxaaTexTop(tex, posN.xy));
if(!doneP) lumaEndP = FxaaLuma(FxaaTexTop(tex, posP.xy));
if(!doneN) lumaEndN = lumaEndN - lumaNN * 0.5;
if(!doneP) lumaEndP = lumaEndP - lumaNN * 0.5;
doneN = abs(lumaEndN) >= gradientScaled;
doneP = abs(lumaEndP) >= gradientScaled;
if(!doneN) posN.x -= offNP.x * FXAA_QUALITY_P3;
if(!doneN) posN.y -= offNP.y * FXAA_QUALITY_P3;
doneNP = (!doneN) || (!doneP);
if(!doneP) posP.x += offNP.x * FXAA_QUALITY_P3;
if(!doneP) posP.y += offNP.y * FXAA_QUALITY_P3;
if(doneNP) {
if(!doneN) lumaEndN = FxaaLuma(FxaaTexTop(tex, posN.xy));
if(!doneP) lumaEndP = FxaaLuma(FxaaTexTop(tex, posP.xy));
if(!doneN) lumaEndN = lumaEndN - lumaNN * 0.5;
if(!doneP) lumaEndP = lumaEndP - lumaNN * 0.5;
doneN = abs(lumaEndN) >= gradientScaled;
doneP = abs(lumaEndP) >= gradientScaled;
if(!doneN) posN.x -= offNP.x * FXAA_QUALITY_P4;
if(!doneN) posN.y -= offNP.y * FXAA_QUALITY_P4;
doneNP = (!doneN) || (!doneP);
if(!doneP) posP.x += offNP.x * FXAA_QUALITY_P4;
if(!doneP) posP.y += offNP.y * FXAA_QUALITY_P4;
if(doneNP) {
if(!doneN) lumaEndN = FxaaLuma(FxaaTexTop(tex, posN.xy));
if(!doneP) lumaEndP = FxaaLuma(FxaaTexTop(tex, posP.xy));
if(!doneN) lumaEndN = lumaEndN - lumaNN * 0.5;
if(!doneP) lumaEndP = lumaEndP - lumaNN * 0.5;
doneN = abs(lumaEndN) >= gradientScaled;
doneP = abs(lumaEndP) >= gradientScaled;
if(!doneN) posN.x -= offNP.x * FXAA_QUALITY_P5;
if(!doneN) posN.y -= offNP.y * FXAA_QUALITY_P5;
doneNP = (!doneN) || (!doneP);
if(!doneP) posP.x += offNP.x * FXAA_QUALITY_P5;
if(!doneP) posP.y += offNP.y * FXAA_QUALITY_P5;
if(doneNP) {
if(!doneN) lumaEndN = FxaaLuma(FxaaTexTop(tex, posN.xy));
if(!doneP) lumaEndP = FxaaLuma(FxaaTexTop(tex, posP.xy));
if(!doneN) lumaEndN = lumaEndN - lumaNN * 0.5;
if(!doneP) lumaEndP = lumaEndP - lumaNN * 0.5;
doneN = abs(lumaEndN) >= gradientScaled;
doneP = abs(lumaEndP) >= gradientScaled;
if(!doneN) posN.x -= offNP.x * FXAA_QUALITY_P6;
if(!doneN) posN.y -= offNP.y * FXAA_QUALITY_P6;
doneNP = (!doneN) || (!doneP);
if(!doneP) posP.x += offNP.x * FXAA_QUALITY_P6;
if(!doneP) posP.y += offNP.y * FXAA_QUALITY_P6;
if(doneNP) {
if(!doneN) lumaEndN = FxaaLuma(FxaaTexTop(tex, posN.xy));
if(!doneP) lumaEndP = FxaaLuma(FxaaTexTop(tex, posP.xy));
if(!doneN) lumaEndN = lumaEndN - lumaNN * 0.5;
if(!doneP) lumaEndP = lumaEndP - lumaNN * 0.5;
doneN = abs(lumaEndN) >= gradientScaled;
doneP = abs(lumaEndP) >= gradientScaled;
if(!doneN) posN.x -= offNP.x * FXAA_QUALITY_P7;
if(!doneN) posN.y -= offNP.y * FXAA_QUALITY_P7;
doneNP = (!doneN) || (!doneP);
if(!doneP) posP.x += offNP.x * FXAA_QUALITY_P7;
if(!doneP) posP.y += offNP.y * FXAA_QUALITY_P7;
if(doneNP) {
if(!doneN) lumaEndN = FxaaLuma(FxaaTexTop(tex, posN.xy));
if(!doneP) lumaEndP = FxaaLuma(FxaaTexTop(tex, posP.xy));
if(!doneN) lumaEndN = lumaEndN - lumaNN * 0.5;
if(!doneP) lumaEndP = lumaEndP - lumaNN * 0.5;
doneN = abs(lumaEndN) >= gradientScaled;
doneP = abs(lumaEndP) >= gradientScaled;
if(!doneN) posN.x -= offNP.x * FXAA_QUALITY_P8;
if(!doneN) posN.y -= offNP.y * FXAA_QUALITY_P8;
doneNP = (!doneN) || (!doneP);
if(!doneP) posP.x += offNP.x * FXAA_QUALITY_P8;
if(!doneP) posP.y += offNP.y * FXAA_QUALITY_P8;
if(doneNP) {
if(!doneN) lumaEndN = FxaaLuma(FxaaTexTop(tex, posN.xy));
if(!doneP) lumaEndP = FxaaLuma(FxaaTexTop(tex, posP.xy));
if(!doneN) lumaEndN = lumaEndN - lumaNN * 0.5;
if(!doneP) lumaEndP = lumaEndP - lumaNN * 0.5;
doneN = abs(lumaEndN) >= gradientScaled;
doneP = abs(lumaEndP) >= gradientScaled;
if(!doneN) posN.x -= offNP.x * FXAA_QUALITY_P9;
if(!doneN) posN.y -= offNP.y * FXAA_QUALITY_P9;
doneNP = (!doneN) || (!doneP);
if(!doneP) posP.x += offNP.x * FXAA_QUALITY_P9;
if(!doneP) posP.y += offNP.y * FXAA_QUALITY_P9;
if(doneNP) {
if(!doneN) lumaEndN = FxaaLuma(FxaaTexTop(tex, posN.xy));
if(!doneP) lumaEndP = FxaaLuma(FxaaTexTop(tex, posP.xy));
if(!doneN) lumaEndN = lumaEndN - lumaNN * 0.5;
if(!doneP) lumaEndP = lumaEndP - lumaNN * 0.5;
doneN = abs(lumaEndN) >= gradientScaled;
doneP = abs(lumaEndP) >= gradientScaled;
if(!doneN) posN.x -= offNP.x * FXAA_QUALITY_P10;
if(!doneN) posN.y -= offNP.y * FXAA_QUALITY_P10;
doneNP = (!doneN) || (!doneP);
if(!doneP) posP.x += offNP.x * FXAA_QUALITY_P10;
if(!doneP) posP.y += offNP.y * FXAA_QUALITY_P10;
if(doneNP) {
if(!doneN) lumaEndN = FxaaLuma(FxaaTexTop(tex, posN.xy));
if(!doneP) lumaEndP = FxaaLuma(FxaaTexTop(tex, posP.xy));
if(!doneN) lumaEndN = lumaEndN - lumaNN * 0.5;
if(!doneP) lumaEndP = lumaEndP - lumaNN * 0.5;
doneN = abs(lumaEndN) >= gradientScaled;
doneP = abs(lumaEndP) >= gradientScaled;
if(!doneN) posN.x -= offNP.x * FXAA_QUALITY_P11;
if(!doneN) posN.y -= offNP.y * FXAA_QUALITY_P11;
doneNP = (!doneN) || (!doneP);
if(!doneP) posP.x += offNP.x * FXAA_QUALITY_P11;
if(!doneP) posP.y += offNP.y * FXAA_QUALITY_P11;
if(doneNP) {
if(!doneN) lumaEndN = FxaaLuma(FxaaTexTop(tex, posN.xy));
if(!doneP) lumaEndP = FxaaLuma(FxaaTexTop(tex, posP.xy));
if(!doneN) lumaEndN = lumaEndN - lumaNN * 0.5;
if(!doneP) lumaEndP = lumaEndP - lumaNN * 0.5;
doneN = abs(lumaEndN) >= gradientScaled;
doneP = abs(lumaEndP) >= gradientScaled;
if(!doneN) posN.x -= offNP.x * FXAA_QUALITY_P12;
if(!doneN) posN.y -= offNP.y * FXAA_QUALITY_P12;
doneNP = (!doneN) || (!doneP);
if(!doneP) posP.x += offNP.x * FXAA_QUALITY_P12;
if(!doneP) posP.y += offNP.y * FXAA_QUALITY_P12;
}}}}}}}}}}}
float dstN = posM.x - posN.x;
float dstP = posP.x - posM.x;
if(!horzSpan) dstN = posM.y - posN.y;
if(!horzSpan) dstP = posP.y - posM.y;
bool goodSpanN = (lumaEndN < 0.0) != lumaMLTZero;
float spanLength = (dstP + dstN);
bool goodSpanP = (lumaEndP < 0.0) != lumaMLTZero;
float spanLengthRcp = 1.0/spanLength;
bool directionN = dstN < dstP;
float dst = min(dstN, dstP);
bool goodSpan = directionN ? goodSpanN : goodSpanP;
float subpixG = subpixF * subpixF;
float pixelOffset = (dst * (-spanLengthRcp)) + 0.5;
float subpixH = subpixG * fxaaSubpix;
float pixelOffsetGood = goodSpan ? pixelOffset : 0.0;
float pixelOffsetSubpix = max(pixelOffsetGood, subpixH);
if(!horzSpan) posM.x += pixelOffsetSubpix * lengthSign;
if( horzSpan) posM.y += pixelOffsetSubpix * lengthSign;
return float4(FxaaTexTop(tex, posM).xyz, lumaM);
}
#if (FXAA_GLSL_130 == 1 || FXAA_GLSL_VK == 1)
float4 FxaaPass(float4 FxaaColor, float2 uv0)
#elif (FXAA_HLSL == 1)
float4 FxaaPass(float4 FxaaColor : COLOR0, float2 uv0 : TEXCOORD0)
#elif defined(__METAL_VERSION__)
float4 FxaaPass(float4 FxaaColor, float2 uv0, texture2d<float> tex)
#endif
{
#if (FXAA_HLSL == 1)
FxaaTex tex;
tex.tex = Texture;
tex.smpl = TextureSampler;
float2 PixelSize;
Texture.GetDimensions(PixelSize.x, PixelSize.y);
FxaaColor = FxaaPixelShader(uv0, tex, 1.0/PixelSize.xy, FxaaSubpixMax, FxaaEdgeThreshold, FxaaEdgeThresholdMin);
#elif (FXAA_GLSL_130 == 1 || FXAA_GLSL_VK == 1)
vec2 PixelSize = vec2(textureSize(TextureSampler, 0));
FxaaColor = FxaaPixelShader(uv0, TextureSampler, 1.0/PixelSize.xy, FxaaSubpixMax, FxaaEdgeThreshold, FxaaEdgeThresholdMin);
#elif defined(__METAL_VERSION__)
float2 PixelSize = float2(tex.get_width(), tex.get_height());
FxaaColor = FxaaPixelShader(uv0, tex, 1.f/PixelSize, FxaaSubpixMax, FxaaEdgeThreshold, FxaaEdgeThresholdMin);
#endif
return FxaaColor;
}
/*------------------------------------------------------------------------------
[MAIN() & COMBINE PASS CODE SECTION]
------------------------------------------------------------------------------*/
#if (FXAA_GLSL_130 == 1 || FXAA_GLSL_VK == 1)
void main()
{
vec4 color = texture(TextureSampler, PSin_t);
color = PreGammaPass(color);
color = FxaaPass(color, PSin_t);
SV_Target0 = float4(color.rgb, 1.0);
}
#elif (FXAA_HLSL == 1)
PS_OUTPUT main(VS_OUTPUT input)
{
PS_OUTPUT output;
float4 color = Texture.Sample(TextureSampler, input.t);
color = PreGammaPass(color);
color = FxaaPass(color, input.t);
output.c = float4(color.rgb, 1.0);
return output;
}
// Metal main function in in fxaa.metal
#endif
File diff suppressed because it is too large. Load diff
@@ -1,470 +0,0 @@
// SPDX-FileCopyrightText: 2002-2026 PCSX2 Dev Team
// SPDX-License-Identifier: GPL-3.0+
//#version 420 // Keep it for text editor detection
layout(std140, binding = 1) uniform cb20
{
vec2 VertexScale;
vec2 VertexOffset;
vec2 TextureScale;
vec2 TextureOffset;
vec2 PointSize;
uint MaxDepth;
float LineAA1Width;
};
#ifdef VERTEX_SHADER
#ifndef VS_EXPAND_NONE
#define VS_EXPAND_NONE 0
#define VS_EXPAND_POINT 1
#define VS_EXPAND_LINE 2
#define VS_EXPAND_SPRITE 3
#define VS_EXPAND_LINE_AA1 4
#define VS_EXPAND_TRIANGLE_AA1 5
#endif
out SHADER
{
vec4 t_float;
vec4 t_int;
#if VS_IIP != 0
vec4 c;
#else
flat vec4 c;
#endif
float inv_cov; // We use the inverse to make it simpler to interpolate.
flat uint interior; // 1 for triangle interior; 0 for edge.
} VSout;
const float exp_min32 = exp2(-32.0f);
#if VS_EXPAND == VS_EXPAND_NONE
layout(location = 0) in vec2 i_st;
layout(location = 2) in vec4 i_c;
layout(location = 3) in float i_q;
layout(location = 4) in uvec2 i_p;
layout(location = 5) in uint i_z;
layout(location = 6) in uvec2 i_uv;
layout(location = 7) in vec4 i_f;
void texture_coord()
{
vec2 uv = vec2(i_uv) - TextureOffset;
vec2 st = i_st - TextureOffset;
// Float coordinate
VSout.t_float.xy = st;
VSout.t_float.w = i_q;
// Integer coordinate => normalized
VSout.t_int.xy = uv * TextureScale;
#if VS_FST
// Integer coordinate => integral
VSout.t_int.zw = uv;
#else
// Some games uses float coordinate for post-processing effect
VSout.t_int.zw = st / TextureScale;
#endif
}
void vs_main()
{
// Clamp to max depth, gs doesn't wrap
highp uint z = min(i_z, MaxDepth);
// pos -= 0.05 (1/320 pixel) helps avoiding rounding problems (integral part of pos is usually 5 digits, 0.05 is about as low as we can go)
// example: ceil(afterseveralvertextransformations(y = 133)) => 134 => line 133 stays empty
// input granularity is 1/16 pixel, anything smaller than that won't step drawing up/left by one pixel
// example: 133.0625 (133 + 1/16) should start from line 134, ceil(133.0625 - 0.05) still above 133
gl_Position.xy = vec2(i_p) - vec2(0.05f, 0.05f);
gl_Position.xy = gl_Position.xy * VertexScale - VertexOffset;
#if HAS_CLIP_CONTROL
gl_Position.z = float(z) * exp_min32;
#else
gl_Position.z = (float(z) * exp_min32) * 2.0f - 1.0f;
#endif
gl_Position.w = 1.0f;
texture_coord();
VSout.c = i_c;
VSout.t_float.z = i_f.x; // pack for with texture
#if VS_POINT_SIZE
gl_PointSize = PointSize.x;
#endif
}
#else // VS_EXPAND
struct RawVertex
{
vec2 ST;
uint RGBA;
float Q;
uint XY;
uint Z;
uint UV;
uint FOG;
};
layout(std140, binding = 4) uniform cb22
{
uint BaseVertex;
uint BaseIndex;
uint pad_cb22_0;
uint pad_cb22_1;
};
layout(std140, binding = 2) readonly buffer VertexBuffer {
RawVertex vertex_buffer[];
};
// Warning: use std430 instead of std140 so that the ints are tightly packed.
layout(std430, binding = 3) readonly buffer IndexBuffer {
uint index_buffer[];
};
struct ProcessedVertex
{
vec4 p;
vec4 t_float;
vec4 t_int;
vec4 c;
};
uint load_index(uint _i)
{
uint i = _i + BaseIndex;
// i is even => load lower 16 bits; i odd => load upper 16 bits.
uint shift = (i & 1u) << 4u;
return (index_buffer[i >> 1u] >> shift) & 0xFFFFu;
}
ProcessedVertex load_vertex(uint index)
{
RawVertex rvtx = vertex_buffer[BaseVertex + index];
vec2 i_st = rvtx.ST;
vec4 i_c = vec4(uvec4(bitfieldExtract(rvtx.RGBA, 0, 8), bitfieldExtract(rvtx.RGBA, 8, 8),
bitfieldExtract(rvtx.RGBA, 16, 8), bitfieldExtract(rvtx.RGBA, 24, 8)));
float i_q = rvtx.Q;
uvec2 i_p = uvec2(bitfieldExtract(rvtx.XY, 0, 16), bitfieldExtract(rvtx.XY, 16, 16));
uint i_z = rvtx.Z;
uvec2 i_uv = uvec2(bitfieldExtract(rvtx.UV, 0, 16), bitfieldExtract(rvtx.UV, 16, 16));
vec4 i_f = unpackUnorm4x8(rvtx.FOG);
ProcessedVertex vtx;
uint z = min(i_z, MaxDepth);
vtx.p.xy = vec2(i_p) - vec2(0.05f, 0.05f);
vtx.p.xy = vtx.p.xy * VertexScale - VertexOffset;
#if HAS_CLIP_CONTROL
vtx.p.z = float(z) * exp_min32;
#else
vtx.p.z = (float(z) * exp_min32) * 2.0f - 1.0f;
#endif
vtx.p.w = 1.0f;
vec2 uv = vec2(i_uv) - TextureOffset;
vec2 st = i_st - TextureOffset;
vtx.t_float.xy = st;
vtx.t_float.w = i_q;
vtx.t_int.xy = uv * TextureScale;
#if VS_FST
vtx.t_int.zw = uv;
#else
vtx.t_int.zw = st / TextureScale;
#endif
vtx.c = i_c;
vtx.t_float.z = i_f.x;
return vtx;
}
// Convert XY from NDC to GS pixel coordinates (i.e. 1.0 = 1 GS pixel).
vec2 get_xy_unscaled(vec2 xy)
{
return round(xy / VertexScale) / 16.0f;
}
// Get the XY deltas in GS pixel coordinates, using first vertex as the origin.
mat2 get_xy_deltas_unscaled(ProcessedVertex v0, ProcessedVertex v1, ProcessedVertex v2)
{
vec2 xy0 = get_xy_unscaled(v0.p.xy);
vec2 xy1 = get_xy_unscaled(v1.p.xy);
vec2 xy2 = get_xy_unscaled(v2.p.xy);
return mat2(xy1 - xy0, xy2 - xy0);
}
// Get the AA1 outward expand direction to the edge formed by the first two vertices.
// This is up or down for shallow (X dominant) edges, and right or left for steep (Y dominant) edges.
// Similar expansion to line AA1 except instead of expanding on both sides of the line,
// expand on on the side towards the outside of the triangle.
vec2 get_aa1_triangle_expand_dir(ProcessedVertex v0, ProcessedVertex v1, ProcessedVertex v2)
{
mat2 xy_deltas = get_xy_deltas_unscaled(v0, v1, v2);
vec2 line_delta = xy_deltas[0];
vec2 line_opposite = xy_deltas[1];
vec2 line_normal = vec2(line_delta.y, -line_delta.x);
vec2 line_expand = abs(line_delta.x) >= abs(line_delta.y) ? vec2(0.0f, 1.0f) : vec2(1.0f, 0.0f);
if ((dot(line_expand, line_normal) >= 0.0f) == (dot(line_opposite, line_normal) >= 0.0f))
{
// Expand direction point towards the interior so flip it.
line_expand = -line_expand;
}
return line_expand;
}
mat2 get_inverse(mat2 mat, float det)
{
return mat2(mat[1][1], -mat[0][1], -mat[1][0], mat[0][0]) * (1.0f / det);
}
// Extrapolate triangle attributes from the first vertex along the given direction.
// dp_mat is derived from the input vertices, it is passed in to avoid recomputing.
void extrapolate_aa1_triangle_edge(inout ProcessedVertex v0, ProcessedVertex v1, ProcessedVertex v2, mat2 dp_mat, vec2 dp)
{
// Get texture deltas
#if VS_TME
#if VS_FST
mat2 dt = mat2(v1.t_int.zw - v0.t_int.zw, v2.t_int.zw - v0.t_int.zw);
#else
mat2 dt = mat2(v1.t_float.xy - v0.t_float.xy, v2.t_float.xy - v0.t_float.xy);
#endif
#endif
// Get color delta if interpolating
#if VS_IIP
mat2x4 dc = mat2x4(v1.c - v0.c, v2.c - v0.c);
#endif
vec2 dz = vec2(v1.p.z - v0.p.z, v2.p.z - v0.p.z); // Z deltas
vec2 df = vec2(v1.t_float.z - v0.t_float.z, v2.t_float.z - v0.t_float.z); // Fog deltas
vec2 dq = vec2(v1.t_float.w - v0.t_float.w, v2.t_float.w - v0.t_float.w); // Q deltas
// To prevent unstable extrapolation, do not extrapolate if the
// minimum perpendicular length of the triangle is < 2 pixels.
float dp_det = determinant(dp_mat); // Twice signed triangle area.
float len0 = length(dp_mat[0]);
float len1 = length(dp_mat[1]);
float len2 = length(dp_mat[1] - dp_mat[0]);
float min_perp_length = abs(dp_det) / max(max(len0, len1), len2);
// Get the position -> barycentric weight matrix
mat2 inv_dp_mat = get_inverse(dp_mat, dp_det);
vec2 weights = min_perp_length < 2.0f ? vec2(0) : inv_dp_mat * dp;
v0.p.xy += dp * PointSize; // Extrapolate position
// Extrapolate texture coords
#if VS_TME
#if VS_FST
v0.t_int.zw += dt * weights;
v0.t_int.xy = v0.t_int.zw * TextureScale;
#else
v0.t_float.xy += dt * weights;
v0.t_int.zw = v0.t_float.xy / TextureScale;
v0.t_float.w += dot(dq, weights);
#endif
#endif
// Extrapolate and clamp color
#if VS_IIP
v0.c += dc * weights;
v0.c = clamp(v0.c, vec4(0), vec4(255));
#endif
v0.p.z += dot(dz, weights); // Extrapolate depth
v0.t_float.z += dot(df, weights); // Extrapolate fog
}
void main()
{
ProcessedVertex vtx;
uint vid = uint(gl_VertexID);
#if VS_EXPAND == VS_EXPAND_POINT
vtx = load_vertex(vid >> 2);
vtx.p.x += ((vid & 1u) != 0u) ? PointSize.x : 0.0f;
vtx.p.y += ((vid & 2u) != 0u) ? PointSize.y : 0.0f;
#elif (VS_EXPAND == VS_EXPAND_LINE) || (VS_EXPAND == VS_EXPAND_LINE_AA1)
uint vid_base = vid >> 2;
bool is_bottom = (vid & 2u) != 0u;
bool is_right = (vid & 1u) != 0u;
uint vid_other = is_bottom ? vid_base - 1u : vid_base + 1u;
vtx = load_vertex(vid_base);
ProcessedVertex other = load_vertex(vid_other);
// Use bottom minus top for delta regardless of which vertex we are expanding.
vec2 line_delta = is_bottom ? (vtx.p.xy - other.p.xy) : (other.p.xy - vtx.p.xy);
vec2 line_vector = normalize(line_delta / VertexScale);
vec2 line_expand = vec2(line_vector.y, -line_vector.x);
#if VS_EXPAND == VS_EXPAND_LINE_AA1
line_expand *= 2.0f * LineAA1Width;
#endif
vec2 line_width = (line_expand * PointSize) / 2.0f;
vec2 offset = is_right ? line_width : -line_width;
vtx.p.xy += offset;
#if VS_EXPAND == VS_EXPAND_LINE_AA1
VSout.inv_cov = is_right ? 1.0f : -1.0f;
#endif
// Lines will be run as (0 1 2) (1 2 3)
// This means that both triangles will have a point based off the top line point as their first point
// So we don't have to do anything for !IIP
#elif VS_EXPAND == VS_EXPAND_SPRITE
// Sprite points are always in pairs
uint vid_base = vid >> 1;
uint vid_lt = vid_base & ~1u;
uint vid_rb = vid_base | 1u;
ProcessedVertex lt = load_vertex(vid_lt);
ProcessedVertex rb = load_vertex(vid_rb);
vtx = rb;
bool is_right = ((vid & 1u) != 0u);
vtx.p.x = is_right ? lt.p.x : vtx.p.x;
vtx.t_float.x = is_right ? lt.t_float.x : vtx.t_float.x;
vtx.t_int.xz = is_right ? lt.t_int.xz : vtx.t_int.xz;
bool is_bottom = ((vid & 2u) != 0u);
vtx.p.y = is_bottom ? lt.p.y : vtx.p.y;
vtx.t_float.y = is_bottom ? lt.t_float.y : vtx.t_float.y;
vtx.t_int.yw = is_bottom ? lt.t_int.yw : vtx.t_int.yw;
#elif VS_EXPAND == VS_EXPAND_TRIANGLE_AA1
// Triangles with AA1 are expanded as follows:
// - Vertices 0-2: Interior of triangle (1 triangle).
// - Vertices 3-8: First edge expanded (2 triangles).
// - Vertices 9-14: Second edge expanded (2 triangles).
// - Vertices 15-20: Third edge expanded (2 triangles).
// - Vertices 21-26: First corner cap (2 triangles).
// - Vertices 27-32: Second corner cap (2 triangles).
// - Vertices 33-38: Third corner cap (2 triangles).
uint prim_id = vid / 39u;
uint prim_offset = vid - 39u * prim_id; // range: 0-38
bool interior = prim_offset < 3u;
bool edge = 3u <= prim_offset && prim_offset < 21u;
if (interior)
{
vtx = load_vertex(load_index(3u * prim_id + prim_offset));
VSout.inv_cov = 0.0f; // Full coverage
VSout.interior = 1u;
}
else if (edge)
{
// Vertex indices for this edge. We need all 3 for determining exterior/interior.
uint prim_offset_edges = prim_offset - 3u; // range: 0-17
uint i0 = prim_offset_edges / 6u;
uint i1 = (i0 >= 2u) ? i0 - 2u : i0 + 1u;
uint i2 = (i0 >= 1u) ? i0 - 1u : i0 + 2u;
uint edge_offset = prim_offset_edges - 6u * i0; // range: 0-5
// Note: order of top/bottom, inside/outside is arbitrary,
// as long as it assembles into two triangles forming a quad.
bool is_bottom = (2u <= edge_offset) && (edge_offset <= 4u);
bool is_outside = (edge_offset & 1u) != 0u;
vtx = load_vertex(load_index(3u * prim_id + (is_bottom ? i1 : i0)));
ProcessedVertex other = load_vertex(load_index(3u * prim_id + (is_bottom ? i0 : i1)));
ProcessedVertex opposite = load_vertex(load_index(3u * prim_id + i2));
mat2 pos_deltas = get_xy_deltas_unscaled(vtx, other, opposite);
vec2 expand_dir = is_outside ? get_aa1_triangle_expand_dir(vtx, other, opposite) : vec2(0);
// Do actual extrapolation, or no-op if expand_dir == 0.
extrapolate_aa1_triangle_edge(vtx, other, opposite, pos_deltas, expand_dir);
VSout.inv_cov = is_outside ? 1.0f : 0.0f; // No coverage on outside, otherwise full.
VSout.interior = 0u;
}
else // Corner cap
{
// Vertex indices for this cap. We need all 3 for determining exterior/interior.
uint prim_offset_cap = prim_offset - 21u; // range: 0-17
uint i0 = prim_offset_cap / 6u;
uint i1 = (i0 >= 2u) ? i0 - 2u : i0 + 1u;
uint i2 = (i0 >= 1u) ? i0 - 1u : i0 + 2u;
uint cap_offset = prim_offset_cap - 6u * i0; // range: 0-5
bool is_near_corner = cap_offset == 0u || cap_offset == 3u;
bool is_far_corner = cap_offset == 2u || cap_offset == 5u;
bool is_first_tri = cap_offset < 3u;
// First triangle is on the side of vertex i1 and second is on the side of vertex i2.
vtx = load_vertex(load_index(3u * prim_id + i0));
ProcessedVertex other = load_vertex(load_index(3u * prim_id + (is_first_tri ? i1 : i2)));
ProcessedVertex opposite = load_vertex(load_index(3u * prim_id + (is_first_tri ? i2 : i1)));
mat2 pos_deltas = get_xy_deltas_unscaled(vtx, other, opposite);
// Get the edge expansion directions of both incident edges.
vec2 edge_expand_dir_0 = get_aa1_triangle_expand_dir(vtx, other, opposite);
vec2 edge_expand_dir_1 = get_aa1_triangle_expand_dir(vtx, opposite, other);
// Check if the corner is already filled by the expanded edges.
// This happens if the expand directions are the same.
// If so we output a degenerate triangle at this corner.
bool corner_filled = all(equal(edge_expand_dir_0, edge_expand_dir_1));
// Nothing if corner is filled, otherwise opposite to the bisector of the corner angle.
vec2 far_corner_dir = corner_filled ? vec2(0) : -normalize((pos_deltas[0] + pos_deltas[1]) / 2.0f);
// Determine the expand direction.
vec2 expand_dir = is_near_corner ? vec2(0) : // No extrapolation
is_far_corner ? far_corner_dir : // Opposite to the angle bisector of corner
edge_expand_dir_0; // Standard AA1 edge expansion
// Do the actual extrapolation (no-op if expand_dir == 0).
extrapolate_aa1_triangle_edge(vtx, other, opposite, pos_deltas, expand_dir);
VSout.inv_cov = is_near_corner ? 0.0f : 1.0f; // Full coverage at near corner, otherwise none.
VSout.interior = 0u;
}
#endif
gl_Position = vtx.p;
VSout.t_float = vtx.t_float;
VSout.t_int = vtx.t_int;
VSout.c = vtx.c;
}
#endif // VS_EXPAND
#endif // VERTEX_SHADER
File diff suppressed because it is too large. Load diff
File diff suppressed because it is too large. Load diff
File renamed without changes.
Binary file not shown.
File diff suppressed because it is too large. Load diff
File diff suppressed because it is too large. Load diff
+140 -493
View File
File diff suppressed because it is too large. Load diff
+10
View File
@@ -88,6 +88,7 @@ files:
- name: OS6128_UK.rom
path: "private/firmware/OS6128_UK.rom"
system: amstrad-cpc
region: [uk]
required: true
min_size: 32768
validation: [size]
@@ -137,6 +138,7 @@ files:
- name: OS464_UK.rom
path: "private/firmware/OS464_UK.rom"
system: amstrad-cpc
region: [uk]
required: false
min_size: 32768
validation: [size]
@@ -148,6 +150,7 @@ files:
- name: OS464_FR.rom
path: "private/firmware/OS464_FR.rom"
system: amstrad-cpc
region: [france]
required: false
min_size: 32768
validation: [size]
@@ -161,6 +164,7 @@ files:
- name: OS664_UK.rom
path: "private/firmware/OS664_UK.rom"
system: amstrad-cpc
region: [uk]
required: false
min_size: 32768
validation: [size]
@@ -172,6 +176,7 @@ files:
- name: XMEM_FW_3_15_UK.rom
path: "private/firmware/XMEM_FW_3_15_UK.rom"
system: amstrad-cpc
region: [uk]
required: false
min_size: 32768
validation: [size]
@@ -183,6 +188,7 @@ files:
- name: XMEM_FW_3_15_FR.rom
path: "private/firmware/XMEM_FW_3_15_FR.rom"
system: amstrad-cpc
region: [france]
required: false
min_size: 32768
validation: [size]
@@ -218,6 +224,7 @@ files:
- name: Amstrad_f4.cpr
path: "private/firmware/Amstrad_f4.cpr"
system: amstrad-cpc
region: [france]
required: false
size: 131156
md5: e7159fd674022ba05f9b347ae3cdafc6
@@ -228,6 +235,7 @@ files:
- name: Amstrad_s4.cpr
path: "private/firmware/Amstrad_s4.cpr"
system: amstrad-cpc
region: [spain]
required: false
size: 131156
md5: 6eeed3fdd4abc98a2a932da810410128
@@ -249,6 +257,7 @@ files:
- name: hackit400uk.rom
path: "private/hacker/hackit400uk.rom"
system: amstrad-cpc
region: [uk]
required: false
size: 16384
md5: 9a293eaaebca601f671070ad56cb81b6
@@ -260,6 +269,7 @@ files:
- name: hacker481fr.rom
path: "private/hacker/hacker481fr.rom"
system: amstrad-cpc
region: [france]
required: false
size: 16384
md5: dfdd9924295f491d54f30569874287f8
+1 -1
View File
@@ -4,7 +4,7 @@ core_classification: enhanced_fork
source: "https://github.com/amadvance/advancemame"
upstream: "https://www.mamedev.org"
profiled_date: "2026-08-08"
source_commit: "21f8f6f79d8a9abe9f23b1a070841963774cf65d"
source_commit: "0f6a7677ad42b4dfdfa36b046f74bef5238d5837"
core_version: "5.0"
mame_version: "0.106"
display_name: "Arcade (AdvanceMAME)"
-3
View File
@@ -148,9 +148,6 @@ files:
path: resources/GameIndex.yaml
required: false
bundled: true
sha1:
- 997fdfb1c1873c1a43972b2984ac0da61fd47b14
- 71fc274cbe27f382afb0324024ebdc6f59aa666d
description: "Game database"
note: "Read from the resources folder, keyed by serial, and carrying the per-game fixes, patches and settings overrides. Parsed into gamedb.cache in the cache folder and reparsed whenever the modification time moves."
source_ref: "aethersx2/pcsx2/GameDatabase.cpp:35-36, aethersx2/pcsx2/GameDatabase.cpp:348-352, aethersx2/pcsx2/GameDatabase.cpp:523-535"
+40 -1
View File
@@ -61,7 +61,7 @@ notes: |
Firmware path resolution: settings.paths.firmware (user override) or
{userData}/ares/Firmware/ (default). Per-system firmware assigned in
Settings > Firmware dialog or via scan-by-hash.
ref: desktop-ui/settings/settings.hpp:87-99, desktop-ui/desktop-ui.cpp:68-75
ref: desktop-ui/settings/settings.hpp:89-101, desktop-ui/desktop-ui.cpp:68-75
Systems with fully embedded firmware (no user files needed):
Game Boy (boot.rom), Game Boy Color (boot.rom), Mega Drive (TMSS),
@@ -93,6 +93,7 @@ files:
- name: colecovision.rom
system: colecovision
required: true
mode: standalone
sha256: "990bf1956f10207d8781b619eb74f89b00d921c8d45c95c334c16c8cceca09ad"
validation: [sha256]
description: "ColecoVision BIOS"
@@ -102,6 +103,7 @@ files:
- name: disksys.rom
system: famicom-disk-system
required: true
mode: standalone
sha256: "fdc1a76e654feea993fcb38366e05ee5f4eb641f86fe6bebaeefd412e112dd72"
validation: [sha256]
description: "Famicom Disk System BIOS"
@@ -111,6 +113,7 @@ files:
- name: gba_bios.bin
system: game-boy-advance
required: true
mode: standalone
sha256: "fd2547724b505f487e6dcb29ec2ecff3af35a841a77ab2e85fd87350abd36570"
validation: [sha256]
description: "GBA BIOS"
@@ -120,6 +123,7 @@ files:
- name: bios.gg
system: game-gear
required: false
mode: standalone
sha256: "8c8a21335038285cfa03dc076100c1f0bfadf3e4ff70796f11f3dfaaab60eee2"
validation: [sha256]
description: "Game Gear BIOS"
@@ -130,6 +134,7 @@ files:
system: master-system
region: [north-america]
required: false
mode: standalone
sha256: "477617917a12a30f9f43844909dc2de6e6a617430f5c9a36306c86414a670d50"
validation: [sha256]
description: "Master System BIOS (US)"
@@ -139,6 +144,7 @@ files:
system: master-system
region: [japan]
required: false
mode: standalone
sha256: "67846e26764bd862f19179294347f7353a4166b62ac4198a5ec32933b7da486e"
validation: [sha256]
description: "Master System BIOS (Japan)"
@@ -148,6 +154,7 @@ files:
system: master-system
region: [europe]
required: false
mode: standalone
sha256: "477617917a12a30f9f43844909dc2de6e6a617430f5c9a36306c86414a670d50"
validation: [sha256]
description: "Master System BIOS (Europe), same binary as US"
@@ -159,6 +166,7 @@ files:
system: mega-cd
region: [north-america]
required: true
mode: standalone
sha256: "fb477cdbf94c84424c2feca4fe40656d85393fe7b7b401911b45ad2eb991258c"
validation: [sha256]
description: "Mega CD / Sega CD BIOS (US)"
@@ -168,6 +176,7 @@ files:
system: mega-cd
region: [japan]
required: true
mode: standalone
sha256: "7133fc2dd2fe5b7d0acd53a5f10f3d00b5d31270239ad20d74ef32393e24af88"
validation: [sha256]
description: "Mega CD BIOS (Japan)"
@@ -177,6 +186,7 @@ files:
system: mega-cd
region: [europe]
required: true
mode: standalone
sha256: "fe608a2a07676a23ab5fd5eee2f53c9e2526d69a28aa16ccd85c0ec42e6933cb"
validation: [sha256]
description: "Mega CD BIOS (Europe)"
@@ -187,6 +197,7 @@ files:
system: mega-ld
region: [north-america]
required: true
mode: standalone
sha256: "e89b5a319f66406611ec82fe5c4aa6827c175a05135bd7bd177366cba0465021"
validation: [sha256]
description: "LaserActive SEGA PAC BIOS (US), v1.04"
@@ -196,6 +207,7 @@ files:
system: mega-ld
region: [japan]
required: true
mode: standalone
sha256: "dca942d977217f703d8d1c6eb1aeb6b32c78ecc421486bbb46c459d385161c94"
validation: [sha256]
description: "LaserActive SEGA PAC BIOS (Japan), v1.02"
@@ -205,6 +217,7 @@ files:
- name: MSX.ROM
system: msx
required: true
mode: standalone
sha256: "413a2b601a94b3792e054be2439cc77a1819cceadbfa9542f88d51c7480f2ef0"
validation: [sha256]
description: "MSX BIOS ROM (Japan)"
@@ -214,6 +227,7 @@ files:
- name: MSX2.ROM
system: msx2
required: true
mode: standalone
sha256: "0c672d86ead61a97f49a583b88b7c1905da120645cd44f0c9f2baf4f4631e0b1"
validation: [sha256]
description: "MSX2 main BIOS ROM (Japan)"
@@ -222,6 +236,7 @@ files:
- name: MSX2EXT.ROM
system: msx2
required: true
mode: standalone
sha256: "6c6f421a10c428d960b7ecc990f99af1c638147f747bddca7b0bf0e2ab738300"
validation: [sha256]
description: "MSX2 sub ROM (Japan)"
@@ -231,6 +246,7 @@ files:
- name: neo-epo.bin
system: neo-geo
required: true
mode: standalone
description: "Neo Geo AES BIOS. Accepts neogeo.zip (extracts neo-epo.bin) or direct file. Byte-swapped on load."
source_ref: "desktop-ui/emulator/neo-geo-aes.cpp:14, mia/system/neo-geo-aes.cpp:16"
@@ -238,6 +254,7 @@ files:
- name: sp-45.sp1
system: neo-geo
required: true
mode: standalone
description: "Neo Geo MVS BIOS. Accepts neogeo.zip (extracts sp-45.sp1) or direct file. Byte-swapped on load."
source_ref: "desktop-ui/emulator/neo-geo-mvs.cpp:15, mia/system/neo-geo-mvs.cpp:16"
@@ -245,6 +262,7 @@ files:
- name: ngp_bios.rom
system: neo-geo-pocket
required: true
mode: standalone
sha256: "0293555b21c4fac516d25199df7809b26beeae150e1d4504a050db32264a6ad7"
validation: [sha256]
description: "Neo Geo Pocket BIOS"
@@ -254,6 +272,7 @@ files:
- name: ngpc_bios.rom
system: neo-geo-pocket-color
required: true
mode: standalone
sha256: "8fb845a2f71514cec20728e2f0fecfade69444f8d50898b92c2259f1ba63e10d"
validation: [sha256]
description: "Neo Geo Pocket Color BIOS"
@@ -264,6 +283,7 @@ files:
system: nintendo-64dd
region: [japan]
required: true
mode: standalone
sha256: "806400ec0df94b0755de6c5b8249d6b6a9866124c5ddbdac198bde22499bfb8b"
validation: [sha256]
description: "Nintendo 64DD IPL ROM (Japan retail)"
@@ -273,6 +293,7 @@ files:
system: nintendo-64dd
region: [north-america]
required: true
mode: standalone
sha256: "e9fec87a45fba02399e88064b9e2f8cf0f2106e351c58279a87f05da5bc984ad"
validation: [sha256]
description: "Nintendo 64DD IPL ROM (US dev kit)"
@@ -281,6 +302,7 @@ files:
- name: 64dd_ipl_DEV.bin
system: nintendo-64dd
required: true
mode: standalone
sha256: "9c2962a8b994a29e4cd04b3a6e4ed730a751414655ab6a9799ebf5fc08b79d44"
validation: [sha256]
description: "Nintendo 64DD IPL ROM (development)"
@@ -290,6 +312,7 @@ files:
- name: syscard1.pce
system: pc-engine-cd
required: true
mode: standalone
sha256: "afe9f27f91ac918348555b86298b4f984643eafa2773196f2c5441ea84f0c3bb"
validation: [sha256]
description: "PC Engine CD-ROM2 System Card v1.0 (Japan). Also used by PC Engine LD."
@@ -298,6 +321,7 @@ files:
- name: syscard3.pce
system: pc-engine-cd
required: true
mode: standalone
sha256: "e11527b3b96ce112a037138988ca72fd117a6b0779c2480d9e03eaebece3d9ce"
validation: [sha256]
description: "Super CD-ROM2 System Card v3.0 (Japan). Also used by SuperGrafx CD as Arcade Card."
@@ -306,6 +330,7 @@ files:
- name: syscard3u.pce
system: pc-engine-cd
required: true
mode: standalone
sha256: "cadac2725711b3c442bcf237b02f5a5210c96f17625c35fa58f009e0ed39e4db"
validation: [sha256]
description: "TurboGrafx-CD Super System Card v3.0 (US)"
@@ -314,6 +339,7 @@ files:
- name: games_express.pce
system: pc-engine-cd
required: true
mode: standalone
sha256: "4b86bb96a48a4ca8375fc0109631d0b1d64f255a03b01de70594d40788ba6c3d"
validation: [sha256]
description: "Games Express CD Card (Japan). Also used by PC Engine LD."
@@ -323,6 +349,7 @@ files:
- name: pac-n10.pce
system: pc-engine-ld
required: true
mode: standalone
sha256: "0e87a3385a27b3a4cac51934819b7eefa5b3d690768d2495633838488cd0e2e4"
validation: [sha256]
description: "NEC PAC-N10 LaserActive module (US)"
@@ -331,6 +358,7 @@ files:
- name: pac-n1.pce
system: pc-engine-ld
required: true
mode: standalone
sha256: "459325690a458baebd77495c91e37c4dddfdd542ba13a821ce954e5bb245627f"
validation: [sha256]
description: "NEC PAC-N1 LaserActive module (Japan)"
@@ -339,6 +367,7 @@ files:
- name: pce-lp1.pce
system: pc-engine-ld
required: true
mode: standalone
sha256: "3f43b3b577117d84002e99cb0baeb97b0d65b1d70b4adadc68817185c6a687f0"
validation: [sha256]
description: "NEC PCE-LP1 LaserActive module (Japan)"
@@ -348,6 +377,7 @@ files:
- name: scph5501.bin
system: sony-playstation
required: true
mode: standalone
sha256: "11052b6499e466bbf0a709b1f9cb6834a9418e66680387912451e971cf8a1fef"
validation: [sha256]
description: "PlayStation BIOS (US)"
@@ -356,6 +386,7 @@ files:
- name: scph5500.bin
system: sony-playstation
required: true
mode: standalone
sha256: "9c0421858e217805f4abe18698afea8d5aa36ff0727eb8484944e00eb5e7eadb"
validation: [sha256]
description: "PlayStation BIOS (Japan)"
@@ -364,6 +395,7 @@ files:
- name: scph5502.bin
system: sony-playstation
required: true
mode: standalone
sha256: "1faaa18fa820a0225e488d9f086296b8e6c46df739666093987ff7d8fd352c09"
validation: [sha256]
description: "PlayStation BIOS (Europe)"
@@ -374,6 +406,7 @@ files:
system: saturn
region: [north-america]
required: true
mode: standalone
description: "Sega Saturn BIOS (US)"
source_ref: "desktop-ui/emulator/saturn.cpp:14"
@@ -381,6 +414,7 @@ files:
system: saturn
region: [japan]
required: true
mode: standalone
description: "Sega Saturn BIOS (Japan)"
source_ref: "desktop-ui/emulator/saturn.cpp:15"
@@ -388,6 +422,7 @@ files:
system: saturn
region: [europe]
required: true
mode: standalone
description: "Sega Saturn BIOS (Europe)"
source_ref: "desktop-ui/emulator/saturn.cpp:16"
@@ -395,6 +430,7 @@ files:
- name: SGB1.sfc
system: super-famicom
required: false
mode: standalone
category: game_data
description: "Super Game Boy cartridge ROM. Loaded via CLI as SFC cartridge alongside GB game."
source_ref: "EmuDeck emuDeckares.sh (launcher)"
@@ -402,6 +438,7 @@ files:
- name: SGB2.sfc
system: super-famicom
required: false
mode: standalone
category: game_data
description: "Super Game Boy 2 cartridge ROM. Loaded via CLI as SFC cartridge alongside GB game."
source_ref: "EmuDeck emuDeckares.sh (launcher)"
@@ -409,6 +446,7 @@ files:
- name: STBIOS.bin
system: super-famicom
required: false
mode: standalone
category: game_data
description: "SuFami Turbo adapter BIOS. Loaded via CLI as SFC cartridge alongside SuFami games."
source_ref: "EmuDeck emuDeckares.sh (launcher)"
@@ -416,6 +454,7 @@ files:
- name: BS-X.bin
system: super-famicom
required: false
mode: standalone
category: game_data
description: "Satellaview BS-X Town cartridge ROM. Loaded via CLI as SFC cartridge for BS games."
source_ref: "EmuDeck emuDeckares.sh (launcher)"
-9
View File
@@ -272,8 +272,6 @@ files:
standalone_path: resources/GameIndex.yaml
required: false
bundled: true
sha1: 72bfdf91fa11a86e2810a7c167cdcf11e20418a8
size: 2690355
description: "Game database"
note: >-
Read from the resources folder, keyed by serial, carrying the per-game
@@ -299,8 +297,6 @@ files:
standalone_path: resources/RedumpDatabase.yaml
required: false
bundled: true
sha1: bf2c73d668cd671df8adfe2ec3c7074e8ba9176a
size: 1917242
description: "Disc track hash database"
note: >-
Loaded on the first hash lookup and used to tell the user whether a dump
@@ -312,8 +308,6 @@ files:
standalone_path: resources/patches.zip
required: false
bundled: true
sha1: f7d0f1606c87019f00109ebdf0f260299f0a72da
size: 2007224
description: "Game patch archive"
note: >-
Per-game pnach entries matched on serial and disc CRC. The patches and
@@ -506,7 +500,6 @@ files:
- name: cas.glsl
path: pcsx2/resources/shaders/vulkan/cas.glsl
standalone_path: resources/shaders/vulkan/cas.glsl
sha1: "005cecf1a5e20b05407d55d0aad22cf81ad66c31"
required: false
bundled: true
description: "Vulkan contrast adaptive sharpening shader"
@@ -794,8 +787,6 @@ files:
standalone_path: resources/sounds/achievements/unlock.wav
required: false
bundled: true
sha1: da328a0a3074ec86fee2d6741bfc2e5a1f68d063
size: 202702
description: "Achievement unlock sound"
source_ref: "pcsx2/Achievements.cpp:69, pcsx2/Achievements.cpp:1278-1284, pcsx2/Achievements.cpp:1581"
+2 -4
View File
@@ -38,10 +38,8 @@ files:
system: nintendo-3ds
required: false
hle_fallback: true
sha1: "5fab786695311433602028cd89898689c5df0898"
md5: "cb52d323b13129a2f0bc3e3e911e567f"
note: "embedded encrypted fallback if missing: default_keys_enc, AES-CBC with a zero key and IV; the hashes are those of the decrypted text without its PKCS#7 block"
source_ref: "src/core/hw/aes/key.cpp:283-300, src/common/common_paths.h:83, src/core/hw/default_keys.h:4-5"
note: "embedded encrypted fallback if missing"
source_ref: "src/core/hw/aes/key.cpp:283, src/common/common_paths.h:83"
- name: shared_font.bin
path: sysdata/shared_font.bin
+2 -4
View File
@@ -56,10 +56,8 @@ files:
system: nintendo-3ds
required: false
hle_fallback: true
sha1: "5288772be438b86978a801e6dcb14228ad3a20af"
md5: "4812e96097b7fc1bdd7b40366208b7a7"
note: "AES key slots, common keys and NFC secrets; embedded encrypted blob used if missing: default_keys_enc, AES-CBC with a zero key and IV, the hashes are those of the decrypted text"
source_ref: "src/core/hw/aes/key.cpp:225-364, src/core/hw/aes/key.cpp:473-613, src/core/hw/default_keys.h:11"
note: "AES key slots, common keys and NFC secrets; embedded encrypted blob used if missing"
source_ref: "src/core/hw/aes/key.cpp:225-364, src/core/hw/aes/key.cpp:473-613"
- name: aes_keys.txt
path: sysdata/aes_keys.txt
+3
View File
@@ -101,6 +101,7 @@ files:
- name: "psxonpsp660.bin"
description: "PSP embedded PS1 BIOS (region-free override)"
region: [world]
required: false
size: 524288
sha1: "96880d1ca92a016ff054be5159bb06fe03cb4e14"
@@ -113,6 +114,7 @@ files:
- name: "ps1_rom.bin"
description: "PS3 embedded PS1 BIOS, first 512KB extracted (region-free override)"
region: [world]
required: false
sha1: "c40146361eb8cf670b19fdc9759190257803cab7"
md5: "81bbe60ba7a3d1cea1d48c14cbcc647b"
@@ -124,6 +126,7 @@ files:
- name: "openbios.bin"
description: "OpenBIOS (open-source PS1 HLE BIOS, region-free override)"
region: [world]
required: false
size: 524288
mode: libretro
+1 -1
View File
@@ -14,7 +14,7 @@ notes: |
Libretro port of Mednafen's Virtual Boy emulation module.
No external BIOS or firmware files. The Virtual Boy has no boot
ROM; the V810 CPU executes directly from the game ROM mapped at
0x07000000. Load() in libretro.cpp:1810 takes only ROM data.
0x07000000. Load() in libretro.cpp:1833 takes only ROM data.
Upstream Mednafen supports an optional vb.pal palette file
(Documentation/vb.html); the libretro port handles palette via
core options instead.
+3
View File
@@ -406,6 +406,7 @@ files:
- name: KANJI.rom
path: "Machines/Shared Roms/KANJI.rom"
region: [japan]
size: 262144
required: false
note: "Kanji font ROM (256 KB). Used by MSX2+, turboR, and Japanese MSX2 machines."
@@ -413,6 +414,7 @@ files:
- name: MSXKANJI.rom
path: "Machines/Shared Roms/MSXKANJI.rom"
region: [japan]
size: 32768
required: false
note: "MSX-Kanji driver ROM. Used by MSX2+, turboR, and Japanese MSX2 for kanji display."
@@ -454,6 +456,7 @@ files:
- name: HANGUL.rom
path: "Machines/Shared Roms/HANGUL.rom"
region: [south-korea]
size: 131072
required: false
note: "Korean Hangul font ROM (128 KB)."
+5 -6
View File
@@ -14,14 +14,13 @@ notes: >
Doom 3 source port based on dhewm3 (GPL Doom 3 engine). The core accepts
.pk4 extensions (retro_get_system_info sets valid_extensions = "pk4").
Content is loaded directly from the .pk4 file path - the engine extracts
the grandparent directory as fs_basepath (libretro.cpp:2381,2449-2450
the grandparent directory as fs_basepath (libretro.cpp:1097,1135-1136
via extract_directory called twice on info->path) and expects the standard
Doom 3 directory layout with base/ containing pak000.pk4 through pak008.pk4.
BASE_GAMEDIR is hardcoded to "base" (Licensee.h:58). One binary serves both
games: content in a directory named d3xp, or the doom_game core option,
passes "+set fs_game d3xp" (libretro.cpp:1635-1643, 2384-2405) to load the
Resurrection of Evil expansion from a d3xp/ subdirectory alongside base/.
The filesystem code (FileSystem.cpp:2207)
BASE_GAMEDIR is hardcoded to "base" (Licensee.h:58). The boom3_xp variant
compiles with _D3XP defined, which passes "+set fs_game d3xp" at startup
(libretro.cpp:538-544) to load the Resurrection of Evil expansion from a
d3xp/ subdirectory alongside base/. The filesystem code (FileSystem.cpp:2125)
scans for .pk4 files in the game directory and loads them in order, with
higher-numbered paks overriding lower ones. The core requires OpenGL
(RETRO_ENVIRONMENT_SET_HW_RENDER) and XRGB8888 pixel format. All required
+5 -5
View File
@@ -36,7 +36,7 @@ files:
mode: standalone
size: 256
note: "Original Nintendo DMG boot ROM"
source_ref: "src/gb.rs:1416, src/data.rs:14"
source_ref: "src/gb.rs:1516, src/data.rs:14"
- name: sgb_boot.bin
system: nintendo-gb
@@ -45,7 +45,7 @@ files:
mode: standalone
size: 256
note: "Super Game Boy boot ROM"
source_ref: "src/gb.rs:1417, src/data.rs:29"
source_ref: "src/gb.rs:1517, src/data.rs:29"
- name: dmg_bootix.bin
system: nintendo-gb
@@ -54,7 +54,7 @@ files:
mode: standalone
size: 256
note: "Open-source DMG boot ROM from Bootix (default DMG)"
source_ref: "src/gb.rs:1418, src/data.rs:44"
source_ref: "src/gb.rs:1518, src/data.rs:44"
- name: mgb_bootix.bin
system: nintendo-gb
@@ -63,7 +63,7 @@ files:
mode: standalone
size: 256
note: "Open-source MGB (Pocket) boot ROM from Bootix"
source_ref: "src/gb.rs:1419, src/data.rs:59"
source_ref: "src/gb.rs:1519, src/data.rs:59"
- name: cgb_boot.bin
system: nintendo-gbc
@@ -81,4 +81,4 @@ files:
mode: standalone
size: 2304
note: "Custom open-source CGB boot ROM (default CGB)"
source_ref: "src/gb.rs:1421, src/data.rs:177"
source_ref: "src/gb.rs:1484, src/data.rs:177"
+8 -4
View File
@@ -24,26 +24,30 @@ mode: standalone
files:
- name: "prod.keys"
required: true
path: "switch/prod.keys"
path: "switch/"
mode: standalone
note: "Production keys for NCA decryption (master, key area, header, titlekek)"
source_ref: "src/core/crypto/key_manager.cpp:655-656"
- name: "title.keys"
required: false
path: "switch/title.keys"
path: "switch/"
mode: standalone
note: "Per-title encryption keys (rights_id to titlekey mappings)"
source_ref: "src/core/crypto/key_manager.cpp:659-660"
- name: "console.keys"
required: false
path: "switch/console.keys"
path: "switch/"
mode: standalone
note: "Console-specific keys (BIS, SD seed)"
source_ref: "src/core/crypto/key_manager.cpp:661-662"
- name: "key_retail.bin"
required: false
path: "switch/key_retail.bin"
path: "switch/"
size: 160
mode: standalone
note: "Amiibo decryption keys (two InternalKey structs, 0x50 bytes each)"
source_ref: "src/core/hle/service/nfc/common/amiibo_crypto.cpp:274-292"
+118 -100
View File
File diff suppressed because it is too large. Load diff
+3 -3
View File
@@ -28,11 +28,11 @@ notes: |
- ROMEXT[0] (upper ROM slot 0, 16KB): second half of cpc6128_bin (BASIC)
- ROMEXT[7] (upper ROM slot 7, 16KB): romdisc_bin (AMSDOS)
Called from HardResetCPC() (crocods-core/platform.c:1024-1035) using
Called from HardResetCPC() (crocods-core/platform.c:1009-1020) using
the extern byte arrays directly. No filesystem ROM loading exists in
the libretro path.
A Multiface ROM loader exists (crocods-core/multiface.c:53-64) that
A Multiface ROM loader exists (crocods-core/multiface.c:51-61) that
reads LocRomMulti via fopen(), but InitMultiface() is never called
from the libretro build or platform.c. Dead code in libretro context.
@@ -45,7 +45,7 @@ files: []
platform_details:
bios_mapping:
source_ref: "crocods-core/vga.c:185-200, crocods-core/platform.c:1024-1035"
source_ref: "crocods-core/vga.c:185-200, crocods-core/platform.c:1009-1020"
note: |
All ROMs are embedded. InitMemCPC() copies cpc6128_bin and romdisc_bin
into ROMINF and ROMEXT arrays via memcpy. No filesystem lookup occurs.
+5 -5
View File
@@ -135,8 +135,8 @@ files:
required: false
hle_fallback: true
size: 8192
validation: [size, adler32]
known_hash_adler32: ["0x66f334fe", "0x128ea7a2"]
validation: [size]
known_hash_adler32: "0x66f334fe"
adler32_byteswap: true
description: "DSP instruction ROM"
note: "DSP LLE only, and LLE aborts when the file is absent or not 8192 bytes. The adler32 is taken over the byte-swapped image and the value here is the Nintendo pair; five replacement pairs are also accepted."
@@ -147,12 +147,12 @@ files:
required: false
hle_fallback: true
size: 4096
validation: [size, adler32]
known_hash_adler32: ["0xf3b93527", "0xa4a575f5"]
validation: [size]
known_hash_adler32: "0xf3b93527"
adler32_byteswap: true
description: "DSP coefficient ROM"
note: "Read by DSP LLE alongside the instruction ROM, and by the AX ucode under HLE for polyphase resampling, which drops any file that is not 0x1000 bytes and plays on without it."
source_ref: "Source/Core/Common/CommonPaths.h:109, Source/Core/Core/HW/DSPLLE/DSPLLE.cpp:120-152, Source/Core/Core/HW/DSPHLE/UCodes/AX.cpp:45-70, Source/Core/Core/DSP/DSPCore.h:49, Source/Core/Core/DSP/DSPCore.cpp:38-105"
source_ref: "Source/Core/Common/CommonPaths.h:109, Source/Core/Core/HW/DSPLLE/DSPLLE.cpp:120-152, Source/Core/Core/HW/DSPHLE/UCodes/AX.cpp:45-70, Source/Core/Core/DSP/DSPCore.h:49"
- name: codehandler.bin
path: null
+5 -5
View File
@@ -171,8 +171,8 @@ files:
required: false
hle_fallback: true
size: 8192
validation: [size, adler32]
known_hash_adler32: ["0x66f334fe", "0xe789b5a5"]
validation: [size]
known_hash_adler32: "0x66f334fe"
adler32_byteswap: true
description: "DSP instruction ROM"
note: "DSP LLE only, and a file that is absent or not 8192 bytes fails initialisation, which aborts the emulation thread. The adler32 is taken over the byte-swapped image and the value here is the Nintendo pair; six replacement pairs are also accepted."
@@ -183,12 +183,12 @@ files:
required: false
hle_fallback: true
size: 4096
validation: [size, adler32]
known_hash_adler32: ["0xf3b93527", "0xa4a575f5"]
validation: [size]
known_hash_adler32: "0xf3b93527"
adler32_byteswap: true
description: "DSP coefficient ROM"
note: "Read by DSP LLE alongside the instruction ROM, and by the AX ucode under HLE for polyphase resampling, which drops any file that is not 0x1000 bytes and plays on without it."
source_ref: "Source/Core/Common/CommonPaths.h:121, Source/Core/Core/HW/DSPLLE/DSPLLE.cpp:87-120, Source/Core/Core/HW/DSPHLE/UCodes/AX.cpp:42-69, Source/Core/Core/DSP/DSPCore.h:58, Source/Core/Core/DSP/DSPCore.cpp:28-102"
source_ref: "Source/Core/Common/CommonPaths.h:121, Source/Core/Core/HW/DSPLLE/DSPLLE.cpp:87-120, Source/Core/Core/HW/DSPHLE/UCodes/AX.cpp:42-69, Source/Core/Core/DSP/DSPCore.h:58"
- name: codehandler.bin
path: null
+11 -11
View File
@@ -67,22 +67,22 @@ files:
size: 8192
required: false
hle_fallback: true
validation: [size, adler32]
known_hash_adler32: ["0x66f334fe", "0xe789b5a5"]
validation: [size]
known_hash_adler32: "0x66f334fe"
adler32_byteswap: true
note: "DSP instruction ROM for LLE audio. Free replacement (v0.4) included"
source_ref: "Source/Core/Common/CommonPaths.h:136, Source/Core/Core/HW/DSPLLE/DSPLLE.cpp:84-117, Source/Core/Core/DSP/DSPCore.cpp:28-102"
source_ref: "Source/Core/Common/CommonPaths.h:136, Source/Core/Core/HW/DSPLLE/DSPLLE.cpp:84-117"
- name: "dsp_coef.bin"
path: "GC/dsp_coef.bin"
size: 4096
required: false
hle_fallback: true
validation: [size, adler32]
known_hash_adler32: ["0xf3b93527", "0xa4a575f5"]
validation: [size]
known_hash_adler32: "0xf3b93527"
adler32_byteswap: true
note: "DSP coefficient ROM for LLE audio and HLE polyphase resampling. Free replacement included"
source_ref: "Source/Core/Common/CommonPaths.h:137, Source/Core/Core/DSP/DSPCore.cpp:32-33, Source/Core/Core/HW/DSPHLE/UCodes/AX.cpp:55-62, Source/Core/Core/DSP/DSPCore.cpp:28-102"
source_ref: "Source/Core/Common/CommonPaths.h:137, Source/Core/Core/DSP/DSPCore.cpp:32-33, Source/Core/Core/HW/DSPHLE/UCodes/AX.cpp:55-62"
# -- GameCube Fonts --
# Bundled free alternatives exist but have padding differences causing misplaced text.
@@ -148,7 +148,7 @@ files:
required: false
hle_fallback: true
note: "BootMii NAND backup. Can be imported to populate Wii NAND with channels, saves, system menu"
source_ref: "Source/Core/DiscIO/NANDImporter.cpp:27-45,47-92"
source_ref: "Source/Core/DiscIO/NANDImporter.cpp:26-39,42-89"
- name: "keys.bin"
path: null
@@ -156,7 +156,7 @@ files:
required: false
hle_fallback: true
note: "OTP/SEEPROM dump (Wii encryption keys). Needed if not appended to nand.bin for NAND import"
source_ref: "Source/Core/DiscIO/NANDImporter.cpp:20, Source/Core/DiscIO/NANDImporter.cpp:77-91, Source/Core/DiscIO/NANDImporter.h:35-38"
source_ref: "Source/Core/DiscIO/NANDImporter.cpp:20, Source/Core/DiscIO/NANDImporter.cpp:82-94, Source/Core/DiscIO/NANDImporter.h:46"
# -- Wii SD Card Image --
- name: "WiiSD.raw"
@@ -189,21 +189,21 @@ files:
required: false
hle_fallback: true
note: "SSL client certificate. Auto-extracted from IOS13 content during NAND import"
source_ref: "Source/Core/DiscIO/NANDImporter.cpp:220-304"
source_ref: "Source/Core/DiscIO/NANDImporter.cpp:239-323"
- name: "clientcakey.pem"
path: "Wii/clientcakey.pem"
required: false
hle_fallback: true
note: "SSL client private key. Auto-extracted from IOS13 content during NAND import"
source_ref: "Source/Core/DiscIO/NANDImporter.cpp:256"
source_ref: "Source/Core/DiscIO/NANDImporter.cpp:275"
- name: "rootca.pem"
path: "Wii/rootca.pem"
required: false
hle_fallback: true
note: "SSL root CA certificate. Auto-extracted from IOS13 content during NAND import"
source_ref: "Source/Core/DiscIO/NANDImporter.cpp:257"
source_ref: "Source/Core/DiscIO/NANDImporter.cpp:276"
# -- Realtek Bluetooth firmware (Wiimote passthrough) --
# Required for real Wiimote connectivity via USB Bluetooth adapters with Realtek chipsets.
+2 -2
View File
@@ -1,8 +1,8 @@
emulator: DOSBox Pure Unleashed
type: standalone
core_classification: official_port
source: "https://codeberg.org/schelling/dosbox-pure-unleashed"
upstream: "https://codeberg.org/schelling/dosbox-pure"
source: "https://github.com/schellingb/dosbox-pure-unleashed"
upstream: "https://github.com/schellingb/dosbox-pure"
source_commit: "4a11412248ca4c862751a7d9e6818023795031e9"
upstream_commit: "7f6e8fb7385fa446d1444d671063268520bf9b54"
logo: "https://raw.githubusercontent.com/schellingb/dosbox-pure-unleashed/main/images/logo.png"
+1 -1
View File
@@ -16,7 +16,7 @@ notes: |
ref: src/gui/midi_mt32.cpp:35,51-66
MUNT identifies ROMs by SHA1+size (libretro/deps/munt/mt32emu/src/ROMInfo.cpp:171-180).
FluidSynth reads .sf2/.sf3/.dls/.gig from system/soundfonts/.
ref: libretro/src/libretro.cpp:1099-1110
ref: libretro/src/libretro.cpp:1112-1123
BASSMIDI reads .sf2/.sfz from system/soundfonts/, requires BASS +
BASSMIDI shared libs in system dir (dlopen'd at runtime).
ref: libretro/src/midi_bassmidi.cpp:232-254
+14 -87
View File
@@ -2,54 +2,41 @@ emulator: DOSBox Pure
type: standalone + libretro
core_classification: enhanced_fork
source: "https://github.com/libretro/dosbox-pure"
upstream: "https://codeberg.org/schelling/dosbox-pure"
upstream: "https://github.com/schellingb/dosbox-pure"
logo: "https://raw.githubusercontent.com/schellingb/dosbox-pure/main/images/logo.png"
profiled_date: "2026-03-23"
source_commit: "cdaea10ce8cac231bc341ca05d4c5e4e5fe0fbd5"
core_version: "1.0-preview7"
source_commit: "a4a0bab7f8931433588f2fcad9045c85b277373d"
core_version: "1.0-preview5"
display_name: "DOS (DOSBox-Pure)"
cores: [dosbox_pure]
systems: [dos]
verification: sha1
notes: |
No BIOS required. MT-32, Sound Canvas and SoundFont support is optional for
MIDI music.
No BIOS required. MT-32 and SoundFont support is optional for MIDI music.
ROM scanning (both modes):
Recursive scan of system directory for *_CONTROL.ROM and *.SF2/*.SF3.
ref: dosbox_pure_libretro.cpp:1399-1410
MT-32 requires matched pair: *_CONTROL.ROM + *_PCM.ROM (PCM name derived
from CONTROL name by replacing CONTROL with PCM, preserving case).
ref: src/gui/midi_mt32.h:189-199
ref: midi_mt32.h:189-199
ZIP archives also supported — scanned for files by size (65536/131072 =
control, 524288/1048576 = PCM), not by name.
ref: src/gui/midi_mt32.h:160-166
Files can also be on mounted C: drive (DOSBOX.SF2, MT32_CONTROL.ROM,
ROM1.BIN).
ref: dosbox_pure_libretro.cpp:2806-2813
ref: midi_mt32.h:160-166
Files can also be on mounted C: drive (DOSBOX.SF2, MT32_CONTROL.ROM).
ref: dosbox_pure_libretro.cpp:2803-2805
Cache file DOSBoxPureMidiCache.txt written when scan >2s.
ref: dosbox_pure_libretro.cpp:1449-1464
Sound Canvas: the scan also lists every file whose name ends in ROM1.BIN,
WAVEROM1.BIN excepted, as "Sound Canvas SC-55". Selected, the Nuked-SC55
driver opens it at exactly 32768 bytes, then ROM2, ROM2_ST, ROM_SM,
WAVEROM1, WAVEROM2 and WAVEROM3 beside it, spelled with the capitalization
and extension of ROM1.BIN. Each file fills the slot its size names. Byte 67
of ROM1 selects the model, SC-55mkII/SC-55st, SC-55/SC-155, CM-300/SCC-1,
JV-880 or SCB-55, and the sizes the other ROMs must have. The driver does
not open without ROM1 and ROM2.
ref: dosbox_pure_libretro.cpp:1405, src/gui/midi_sc55.h:38-47,
src/gui/midi_sc55.h:71-95, src/gui/midi_sc55.h:97-134
ref: dosbox_pure_libretro.cpp:1425-1445
Bundled MUNT (header-only mt32emu.h) for MT-32 emulation.
SHA1+size validation at load: unrecognized ROMs rejected (Synth::open fails).
ref: src/gui/mt32emu.h:2982-2988,3016-3019,5183-5187
ref: mt32emu.h:2982-2988,3016-3019,5183-5187
12 full control ROMs + 2 PCM ROMs supported (no split ROMs in this MUNT).
TinySoundFont (tsf.h) for SF2/SF3 playback.
No firmware entries in .info file — all MIDI files optional.
DBP_STANDALONE build mode exists (same MIDI logic, different I/O layer).
ref: dosbox_pure_libretro.cpp:81,1588,2302
ref: dosbox_pure_libretro.cpp:81,1590,2302
files:
# -- MT-32 Control ROMs (64 KB) --
@@ -181,7 +168,7 @@ files:
note: >
accepted by every MT-32 control ROM, v1.x and v2.x. Each control ROM
fixes the PCM size it accepts through its pcmCount: 128 requires this
524288 byte image. ref: src/gui/mt32emu.h:2586-2598,3167,3025
524288 byte image. ref: mt32emu.h:2586-2598,3167,3025
- name: "CM32L_PCM.ROM"
description: "CM-32L/CM-64/LAPC-I PCM ROM"
@@ -196,7 +183,7 @@ files:
accepted by the CM-32L and CM-32LN control ROMs, which carry pcmCount
256 and require this 1048576 byte image. The alias covers the name
derived from CM32LN_CONTROL.ROM.
ref: src/gui/mt32emu.h:2586-2598,3167,3025, src/gui/midi_mt32.h:194-195
ref: mt32emu.h:2586-2598,3167,3025, midi_mt32.h:194-195
# -- General MIDI SoundFont --
@@ -204,68 +191,8 @@ files:
description: "General MIDI SoundFont (any .sf2/.sf3 accepted)"
required: false
hle_fallback: true
source_ref: "dosbox_pure_libretro.cpp:1405 (scan classifies .SF* as a SoundFont), dosbox_pure_libretro.cpp:2495-2499 (path taken from the system directory), dosbox_pure_libretro.cpp:2806-2813 (auto-detected on the mounted C: drive)"
source_ref: "dosbox_pure_libretro.cpp:1410 (scan classifies .SF* as a SoundFont), dosbox_pure_libretro.cpp:2492-2495 (path taken from the system directory), dosbox_pure_libretro.cpp:2803-2805 (auto-detected on the mounted C: drive)"
note: >
Any .SF2 or .SF3 file in the system directory works. The core lists all
found SoundFonts in the MIDI config dropdown. DOSBOX.SF2 is the conventional
name and is also auto-detected when placed inside game content on C: drive.
# -- Roland SC-55 family ROMs (Nuked-SC55 driver) --
- name: "ROM1.BIN"
path: "SC-55/ROM1.BIN"
aliases: ["rom1.bin"]
description: "SC-55 family program ROM 1"
required: false
size: 32768
validation: [size]
source_ref: "dosbox_pure_libretro.cpp:1405, src/gui/midi_sc55.h:71-75, src/gui/midi_sc55.h:97-101"
note: >-
Any name ending in ROM1.BIN anywhere under the system directory is
listed; byte 67 selects the emulated model.
- name: "ROM2.BIN"
path: "SC-55/ROM2.BIN"
aliases: ["rom2.bin", "ROM2_ST.BIN", "rom2_st.bin"]
description: "SC-55 family program ROM 2"
required: false
size: [262144, 524288]
validation: [size]
source_ref: "src/gui/midi_sc55.h:41, src/gui/midi_sc55.h:78-93, src/gui/midi_sc55.h:95"
note: "The driver does not open without ROM1 and ROM2. ROM2_ST fills the same slot when ROM2 did not."
- name: "ROM_SM.BIN"
path: "SC-55/ROM_SM.BIN"
aliases: ["rom_sm.bin"]
description: "SC-55mkII/SC-55st sub-MCU ROM"
required: false
size: 4096
validation: [size]
source_ref: "src/gui/midi_sc55.h:42, src/gui/midi_sc55.h:78-93, src/gui/midi_sc55.h:113-116"
- name: "WAVEROM1.BIN"
path: "SC-55/WAVEROM1.BIN"
aliases: ["waverom1.bin"]
description: "SC-55 family wave ROM 1"
required: false
size: [1048576, 2097152]
validation: [size]
source_ref: "src/gui/midi_sc55.h:43-45, src/gui/midi_sc55.h:78-93, src/gui/midi_sc55.h:111-134"
- name: "WAVEROM2.BIN"
path: "SC-55/WAVEROM2.BIN"
aliases: ["waverom2.bin"]
description: "SC-55 family wave ROM 2"
required: false
size: [1048576, 2097152]
validation: [size]
source_ref: "src/gui/midi_sc55.h:43-45, src/gui/midi_sc55.h:78-93, src/gui/midi_sc55.h:111-134"
- name: "WAVEROM3.BIN"
path: "SC-55/WAVEROM3.BIN"
aliases: ["waverom3.bin"]
description: "SC-55/SC-155/CM-300 wave ROM 3"
required: false
size: 1048576
validation: [size]
source_ref: "src/gui/midi_sc55.h:43-45, src/gui/midi_sc55.h:78-93, src/gui/midi_sc55.h:117-125"
+1 -1
View File
@@ -30,7 +30,7 @@ notes: |
only by the two settings screens, which fall back to the real filename when it
is null.
ref: src/core/bios.h:41-43 (field declarations)
ref: src/duckstation-qt/biossettingswidget.cpp:149, src/core/fullscreenui_settings.cpp:3281
ref: src/duckstation-qt/biossettingswidget.cpp:149, src/core/fullscreenui_settings.cpp:3301
Lower priority = preferred. PS2 deprioritized (>= 100) for dynamic fast boot.
Late PAL deprioritized (>= 150) due to additional regional checks.
OpenBIOS detected by signature at offset 0x78, not by hash.
+1 -1
View File
@@ -24,7 +24,7 @@ notes: |
"embedded" when that fails. The system directory is still passed to SelectGame,
but for the game data search, not for the engine package.
ref: src/libretro/ecwolf_pk3_data.c, src/wl_iwad.cpp:664-672,
src/libretro/libretro.cpp:1009-1011
src/libretro/libretro.cpp:1028-1030
Standalone: ecwolf.pk3 searched in progdir (binary directory).
ref: src/libretro/wl_main.cpp:1247 (progdir passed to SelectGame)
+10 -5
View File
@@ -27,32 +27,37 @@ mode: standalone
files:
- name: "prod.keys"
required: true
path: "switch/prod.keys"
path: "switch/"
mode: standalone
note: "Production keys for NCA decryption (master, key area, header, titlekek)"
source_ref: "src/core/crypto/key_manager.cpp:574-575, 853"
- name: "dev.keys"
required: false
path: "switch/dev.keys"
path: "switch/"
mode: standalone
note: "Development-unit keys, read instead of prod.keys when use_dev_keys is set"
source_ref: "src/core/crypto/key_manager.cpp:570-571, 852"
- name: "title.keys"
required: false
path: "switch/title.keys"
path: "switch/"
mode: standalone
note: "Per-title encryption keys (rights_id to titlekey mappings)"
source_ref: "src/core/crypto/key_manager.cpp:577-578, 850"
- name: "console.keys"
required: false
path: "switch/console.keys"
path: "switch/"
mode: standalone
note: "Console-specific keys (BIS, SD seed)"
source_ref: "src/core/crypto/key_manager.cpp:579-580"
- name: "key_retail.bin"
required: false
path: "switch/key_retail.bin"
path: "switch/"
size: 160
mode: standalone
note: "Amiibo decryption keys (two InternalKey structs, 0x50 bytes each)"
source_ref: "src/core/hle/service/nfc/common/amiibo_crypto.cpp:281-302"
+23 -23
View File
@@ -8,9 +8,9 @@ upstream: "https://github.com/EKA2L1/EKA2L1"
profiled_date: "2026-09-17"
source_commit:
standalone: "1fcfadbff7f8b81d8c17bc82d04b0c94d16803bf"
libretro: "1c49c1bcde3853273cd520a5360bff756f872e06"
libretro: "97ac3df6767f819c95405e4c86e7007d2e8ae61d"
upstream_commit:
libretro: "11f5b6cd141c0884a130ee45743f1f5e17bb1783"
libretro: "47b4ad76a6dd7d3656f52be86dfd5b9ff9a50c70"
core_version: "0.0.9"
display_name: "Nokia - Symbian / N-Gage (EKA2L1)"
cores:
@@ -27,13 +27,13 @@ notes: |
N-Gage 2.0 libraries and the game libraries from S60v1 to Symbian Belle. One
tree builds the Qt desktop frontend, the Android and iOS applications, and a
libretro core; the core lives on the libretro branch of the WizzardSK fork,
rebased on the upstream revision named in its upstream.version, 11f5b6cd.
content.cpp passes isolate_drives false to install_firmware and
install_rom_with_optional_rpkg, so drives C, D and E are shared between
devices.
merged from upstream at 47b4ad76. The tip of that branch, 7a40bb0d, merges
upstream 0b7d9d67 and does not build the core: content.cpp still calls
install_firmware and install_rom_with_optional_rpkg without the
isolate_drives argument they take from that merge on. The libretro pin is the
last revision of the branch that builds.
ref: README.md:20, README.md:29-32, src/emu/CMakeLists.txt:61-62,
CMakeLists.txt:18, .gitlab-ci.yml:17-25, src/emu/libretro/CMakeLists.txt:40-46,
src/emu/libretro/src/content.cpp:178-184,
CMakeLists.txt:18, .gitlab-ci.yml:14-22, src/emu/libretro/src/content.cpp:96-100,
src/emu/system/src/installation/rpkg.cpp:208-210,
src/emu/system/src/installation/firmware.cpp:290-293
@@ -54,12 +54,12 @@ notes: |
sw.txt or langsw.txt under z:\resource\versions, sw.txt or langsw.txt under
z:\system\versions, or z:\system\install\sonyericssonp90xplatform.sis. That
is the N-Gage case: its files are unpacked to drives/z/, the firmware code is
read from them and the image is copied to SYM.ROM. Any other image needs
the RPKG made by the Dumber tool beside it, which supplies the ROFS. A .vpl
variant packing list names the .fpsx flash images of a factory firmware,
from which the core image, the ROFS and the drive contents are extracted.
The names of the dump files are free; SYM.ROM is the name the installers
give the resident copy.
read from them and the image is copied to SYM.ROM. The libretro pin tests
z:\system\versions\sw.txt alone. Any other image needs the RPKG made by the
Dumber tool beside it, which supplies the ROFS. A .vpl variant packing list
names the .fpsx flash images of a factory firmware, from which the core image,
the ROFS and the drive contents are extracted. The names of the dump files
are free; SYM.ROM is the name the installers give the resident copy.
ref: src/emu/system/src/installation/rpkg.cpp:44-68,
src/emu/system/src/software.cpp:396-408,
src/emu/system/src/installation/rpkg.cpp:132-199,
@@ -97,11 +97,11 @@ notes: |
<system>/eka2l1/libretro-content.txt against the UID it registered, or a
.eka2l1 text shortcut naming the UID of an application already installed.
supports_no_game is false. is_experimental is true in the .info.
ref: src/emu/libretro/src/main.cpp:55-57, src/emu/libretro/src/state.cpp:12-17,
src/emu/libretro/src/main.cpp:92-110, src/emu/libretro/src/content.cpp:129-195,
src/emu/libretro/src/main.cpp:173-181, src/emu/libretro/src/main.cpp:72-73,
src/emu/libretro/src/main.cpp:126-127, src/emu/libretro/src/content.cpp:203,
src/emu/libretro/src/content.cpp:350-355
ref: src/emu/libretro/src/main.cpp:51-53, src/emu/libretro/src/state.cpp:12-17,
src/emu/libretro/src/main.cpp:82-100, src/emu/libretro/src/content.cpp:44-111,
src/emu/libretro/src/main.cpp:161-169, src/emu/libretro/src/main.cpp:68-69,
src/emu/libretro/src/main.cpp:116-117, src/emu/libretro/src/content.cpp:119,
src/emu/libretro/src/content.cpp:244-249
At this revision the libretro build stages none of the shipped resource
folders and never calls set_runtime_resource_root, so the GL shaders, the
@@ -110,8 +110,8 @@ notes: |
and creates no audio or controller driver, so the patch libraries, the Lua
scripts, the MIDI banks and the controller database are not read there.
Those entries carry mode standalone.
ref: src/emu/libretro/CMakeLists.txt:8-72, src/emu/libretro/src/thread.cpp:20-61,
src/emu/libretro/src/thread.cpp:87-93,
ref: src/emu/libretro/CMakeLists.txt:8-45, src/emu/libretro/src/thread.cpp:19-38,
src/emu/libretro/src/thread.cpp:41-60, src/emu/libretro/src/thread.cpp:83-89,
src/emu/common/src/path.cpp:427-450, src/emu/system/src/epoc.cpp:1389-1410
Shipped runtime files are read at their own name below the working
@@ -156,7 +156,7 @@ notes: |
src/emu/config/src/panic_blacklist.cpp:27-35, src/emu/config/src/app_settings.cpp:82-114,
src/emu/utils/src/panic.cpp:32-38, src/emu/scripting/src/manager.cpp:196-202,
src/emu/scripting/src/manager.cpp:230-256, src/emu/services/src/fbs/fbs.cpp:443,
src/emu/services/src/fbs/impls/font.cpp:1185-1208, .gitlab-ci.yml:22,
src/emu/services/src/fbs/impls/font.cpp:1185-1208, .gitlab-ci.yml:19,
src/emu/qt/CMakeLists.txt:264-278, src/emu/qt/CMakeLists.txt:289-290,
src/emu/qt/CMakeLists.txt:376-377, cmake/Symbian.cmake:20-31
@@ -182,7 +182,7 @@ files:
dump, an EKA2 image with its RPKG, or a VPL with its .fpsx images.
source_ref:
standalone: "src/emu/system/src/epoc.cpp:1486-1494, src/emu/system/src/epoc.cpp:824-848, src/emu/system/include/system/consts.h:23-25, src/emu/system/src/installation/rpkg.cpp:44-68, src/emu/system/src/installation/rpkg.cpp:196-199, src/emu/qt/src/device_install_dialog.cpp:162-172"
libretro: "src/emu/libretro/src/main.cpp:92-110, src/emu/libretro/src/content.cpp:129-195, src/emu/libretro/src/main.cpp:173-181, src/emu/system/src/installation/rpkg.cpp:208-255"
libretro: "src/emu/libretro/src/main.cpp:82-100, src/emu/libretro/src/content.cpp:44-111, src/emu/libretro/src/main.cpp:161-169, src/emu/system/src/installation/rpkg.cpp:202-248"
- name: audiooutputrouting.dll.map
standalone_path: patch/audiooutputrouting.dll.map
-8
View File
@@ -289,8 +289,6 @@ files:
system: sony-playstation-2
required: false
bundled: true
sha1: 2d9878fdd70979ecf6dd0da7652efd3797c26039
size: 2697551
category: game_data
description: "per-title compatibility and fix database"
note: >-
@@ -305,8 +303,6 @@ files:
system: sony-playstation-2
required: false
bundled: true
sha1: dceb4536fba7fb89452864fc512a4d071a19eae0
size: 1906463
category: game_data
description: "disc hash database"
note: >-
@@ -319,8 +315,6 @@ files:
system: sony-playstation-2
required: false
bundled: true
sha1: a3d939af27fe0929e61b8e20d49ef58316c0a66c
size: 2091144
category: game_data
description: "built-in game patch archive"
note: >-
@@ -560,8 +554,6 @@ files:
- name: unlock.wav
path: resources/sounds/achievements/unlock.wav
sha1: da328a0a3074ec86fee2d6741bfc2e5a1f68d063
size: 202702
system: sony-playstation-2
required: false
description: "achievement unlock sound"
+2 -2
View File
@@ -21,7 +21,7 @@ systems:
- coleco-colecovision
- sinclair-spectrum
- msx
- nintendo-fds
- nes-fds
- super-kaneko-nova
- deco-cassette
- namco-na1
@@ -1061,7 +1061,7 @@ files:
# -------------------------------------------------------
- name: "fdsbios.nes"
archive: fdsbios.zip
system: nintendo-fds
system: nes-fds
required: true
size: 8192 # 0x2000
crc32: "5e607dcf"
+3 -3
View File
@@ -16,7 +16,7 @@ notes: |
contributed by Joe Zbiciak (jzIntv), mask ROM embedded in source
(src/ivoice.c:337-510, 4097-byte static array). No external ivoice ROM.
BIOS loading in retro_init() (src/libretro.c:1175-1183). Paths joined
BIOS loading in retro_init() (src/libretro.c:1184-1192). Paths joined
directly to system directory, no subdirectory.
loadExec() reads exec.bin as big-endian 16-bit words into 0x1000-0x1FFF.
@@ -35,11 +35,11 @@ files:
required: true
size: 8192
note: "Executive ROM. Big-endian 16-bit words loaded at 0x1000-0x1FFF."
source_ref: "src/intv.c:51-96, src/libretro.c:1178"
source_ref: "src/intv.c:55-142, src/libretro.c:1187"
- name: "grom.bin"
system: intellivision
required: true
size: 2048
note: "Graphics ROM. Raw bytes loaded at 0x3000-0x37FF."
source_ref: "src/intv.c:98-144, src/libretro.c:1182"
source_ref: "src/intv.c:144-190, src/libretro.c:1191"
+4 -4
View File
@@ -34,17 +34,17 @@ files:
- name: "bios.sms"
system: sega-mastersystem
required: false
source_ref: "platforms/libretro/libretro.cpp:736, platforms/libretro/libretro.cpp:731-743 (load_bootroms)"
source_ref: "platforms/libretro/libretro.cpp:777, platforms/libretro/libretro.cpp:780 (load_bootroms)"
- name: "bios.gg"
system: sega-gamegear
required: false
source_ref: "platforms/libretro/libretro.cpp:737, platforms/libretro/libretro.cpp:731-743 (load_bootroms)"
source_ref: "platforms/libretro/libretro.cpp:1067, platforms/libretro/libretro.cpp:780 (load_bootroms)"
platform_details:
mastersystem:
bios_filename: "bios.sms"
source_ref: "src/Memory.cpp:267-272"
source_ref: "src/Memory.cpp:227-232"
note: |
Boot ROM loaded via LoadBootromSMS() -> LoadBootroom(path, false).
Raw binary read, stored in m_pBootromSMS. Bank count computed as
@@ -52,7 +52,7 @@ platform_details:
gamegear:
bios_filename: "bios.gg"
source_ref: "src/Memory.cpp:274-279"
source_ref: "src/Memory.cpp:234-239"
note: |
Boot ROM loaded via LoadBootromGG() -> LoadBootroom(path, true).
Raw binary read, stored in m_pBootromGG. Same bank computation.
+6 -6
View File
@@ -64,22 +64,22 @@ files:
size: 8192
required: false
hle_fallback: true
validation: [size, adler32]
known_hash_adler32: ["0x66f334fe", "0x128ea7a2"]
validation: [size]
known_hash_adler32: "0x66f334fe"
adler32_byteswap: true
note: "DSP instruction ROM for LLE audio. Free replacement included"
source_ref: "Source/Core/Common/CommonPaths.h:112, Source/Core/Core/HW/DSPLLE/DSPLLE.cpp:142-150, Source/Core/Core/DSP/DSPCore.cpp:48,67, Source/Core/Core/DSP/DSPCore.cpp:38-105"
source_ref: "Source/Core/Common/CommonPaths.h:112, Source/Core/Core/HW/DSPLLE/DSPLLE.cpp:142-150, Source/Core/Core/DSP/DSPCore.cpp:48,67"
- name: "dsp_coef.bin"
path: "GC/dsp_coef.bin"
size: 4096
required: false
hle_fallback: true
validation: [size, adler32]
known_hash_adler32: ["0xf3b93527", "0xa4a575f5"]
validation: [size]
known_hash_adler32: "0xf3b93527"
adler32_byteswap: true
note: "DSP coefficient ROM for LLE audio and HLE polyphase resampling. Free replacement included"
source_ref: "Source/Core/Common/CommonPaths.h:113, Source/Core/Core/HW/DSPLLE/DSPLLE.cpp:143-153, Source/Core/Core/HW/DSPHLE/UCodes/AX.cpp:43-72, Source/Core/Core/DSP/DSPCore.cpp:48,68, Source/Core/Core/DSP/DSPCore.cpp:38-105"
source_ref: "Source/Core/Common/CommonPaths.h:113, Source/Core/Core/HW/DSPLLE/DSPLLE.cpp:143-153, Source/Core/Core/HW/DSPHLE/UCodes/AX.cpp:43-72, Source/Core/Core/DSP/DSPCore.cpp:48,68"
# -- GameCube Fonts --
# Bundled free alternatives exist but have padding differences causing misplaced text.
+16
View File
@@ -79,6 +79,7 @@ files:
description: "Sega CD BIOS (US)"
region: [north-america]
required: true
mode: standalone
size: 131072
validation: [size]
source_ref: "frontend/jgenesis-native-driver/src/mainloop/genesis.rs:39-49 (read), frontend/jgenesis-native-driver/src/mainloop/genesis.rs:238-244 (bios_path_for_region), backend/segacd-core/src/api.rs:77-79 (BIOS_LEN check)"
@@ -89,6 +90,7 @@ files:
description: "Mega CD BIOS (Europe)"
region: [europe]
required: true
mode: standalone
size: 131072
validation: [size]
source_ref: "frontend/jgenesis-native-driver/src/mainloop/genesis.rs:238-244 (eu_bios_path), backend/segacd-core/src/api.rs:77-79"
@@ -98,6 +100,7 @@ files:
description: "Mega CD BIOS (Japan)"
region: [japan]
required: true
mode: standalone
size: 131072
validation: [size]
source_ref: "frontend/jgenesis-native-driver/src/mainloop/genesis.rs:238-244 (jp_bios_path), backend/segacd-core/src/api.rs:77-79"
@@ -109,6 +112,7 @@ files:
system: nintendo-gba
description: "Game Boy Advance BIOS"
required: true
mode: standalone
size: 16384
validation: [size]
source_ref: "frontend/jgenesis-native-driver/src/mainloop/gba.rs:29-33 (GbaNoBios), backend/gba-core/src/memory.rs:10,102-107 (BIOS_ROM_LEN check)"
@@ -122,6 +126,7 @@ files:
system: nintendo-snes
description: "NEC uPD77C25 firmware for DSP-1"
required: true
mode: standalone
size: 8192
source_ref: "backend/snes-core/src/memory/cartridge.rs:336-353 (MissingDsp1Rom), backend/snes-coprocessors/src/upd77c25.rs:28-31,35-38,382-390"
note: "0x1800 program plus 0x800 data. Also used by DSP-1B titles, which have no separate slot. Layout is sliced at a fixed offset, size is not checked."
@@ -131,6 +136,7 @@ files:
system: nintendo-snes
description: "NEC uPD77C25 firmware for DSP-2"
required: true
mode: standalone
size: 8192
source_ref: "backend/snes-core/src/memory/cartridge.rs:340-342 (MissingDsp2Rom), :929 (Dungeon Master CRC32 match), backend/snes-coprocessors/src/upd77c25.rs:382-390"
@@ -139,6 +145,7 @@ files:
system: nintendo-snes
description: "NEC uPD77C25 firmware for DSP-3"
required: true
mode: standalone
size: 8192
source_ref: "backend/snes-core/src/memory/cartridge.rs:343-345 (MissingDsp3Rom), :931 (SD Gundam GX CRC32 match), backend/snes-coprocessors/src/upd77c25.rs:382-390"
@@ -147,6 +154,7 @@ files:
system: nintendo-snes
description: "NEC uPD77C25 firmware for DSP-4"
required: true
mode: standalone
size: 8192
source_ref: "backend/snes-core/src/memory/cartridge.rs:346-348 (MissingDsp4Rom), :933 (Top Gear 3000 CRC32 match), backend/snes-coprocessors/src/upd77c25.rs:382-390"
@@ -155,6 +163,7 @@ files:
system: nintendo-snes
description: "NEC uPD96050 firmware for ST010"
required: true
mode: standalone
size: 53248
source_ref: "backend/snes-core/src/memory/cartridge.rs:294-305 (MissingSt010Rom), :938-943 (variant detection), backend/snes-coprocessors/src/upd77c25.rs:28-31,35-38"
note: "0xC000 program plus 0x1000 data. Used by F1 ROC II."
@@ -164,6 +173,7 @@ files:
system: nintendo-snes
description: "NEC uPD96050 firmware for ST011"
required: true
mode: standalone
size: 53248
source_ref: "backend/snes-core/src/memory/cartridge.rs:298-300 (MissingSt011Rom), :938-943 (Hayazashi Nidan Morita Shougi CRC32 match)"
@@ -172,6 +182,7 @@ files:
system: nintendo-snes
description: "ARM firmware for ST018"
required: true
mode: standalone
min_size: 163840
validation: [size]
source_ref: "backend/snes-core/src/memory/cartridge.rs:310-320 (MissingSt018Rom), backend/snes-coprocessors/src/st018.rs:18-22,346-352 (TOTAL_ROM_LEN check)"
@@ -184,6 +195,7 @@ files:
system: sega-mastersystem
description: "Master System BIOS"
required: false
mode: standalone
source_ref: "frontend/jgenesis-native-driver/src/mainloop/smsgg.rs:27-33,50-56,74-80,112-122, backend/smsgg-core/src/memory.rs:101-106,148-168"
note: "Read only when sms_boot_from_bios is enabled or the emulator runs without a cartridge, both off by default. One slot accepts any regional dump, no size or content check."
@@ -191,6 +203,7 @@ files:
system: sega-gamegear
description: "Game Gear BIOS"
required: false
mode: standalone
source_ref: "frontend/jgenesis-native-driver/src/mainloop/smsgg.rs:27-33,50-56,74-80,112-122"
note: "Read only when gg_boot_from_bios is enabled or the emulator runs without a cartridge, both off by default."
@@ -201,6 +214,7 @@ files:
system: nintendo-gb
description: "Game Boy boot ROM"
required: false
mode: standalone
size: 256
validation: [size]
source_ref: "frontend/jgenesis-native-driver/src/mainloop/gb.rs:29-33,77-89, backend/gb-core/src/memory.rs:9,45-63 (DMG_BOOT_ROM_LEN check)"
@@ -210,6 +224,7 @@ files:
system: nintendo-gbc
description: "Game Boy Color boot ROM"
required: false
mode: standalone
min_size: 2048
max_size: 2304
validation: [size]
@@ -224,6 +239,7 @@ files:
system: nintendo-nes
description: "External NES color palette"
required: false
mode: standalone
min_size: 192
max_size: 1536
validation: [size]
+1 -1
View File
@@ -61,7 +61,7 @@ notes: |
the JVM default soundbank in place. VlcDir points at a VLC installation that
vlcj scans for libvlc.
ref: src/media/emulator/media/EmulatorMIDI.java:26-36,
src/main/emulator/ui/swt/Property.java:1863-1904
src/main/emulator/ui/swt/Property.java:1860-1901
files:
- name: M7_EmuSmw7.dll
+2 -2
View File
@@ -187,7 +187,7 @@ files:
- name: "<CaCertificateId>.der"
required: false
path: "system/ssl/<CaCertificateId>.der"
path: system/ssl/
unsourceable: "replacement certificate the user picks for one certificate authority, with no canonical artefact behind the name"
description: "Override for one built-in root certificate"
note: >-
@@ -199,7 +199,7 @@ files:
- name: "<driver>.zip"
required: false
path: "drivers/<driver>.zip"
path: drivers/
unsourceable: "third-party Vulkan driver built for one GPU family, not an emulator artefact"
description: "Replacement Vulkan driver for the Android build"
note: >-
+3 -4
View File
@@ -2,10 +2,9 @@ emulator: Kronos
type: libretro
core_classification: official_port
source: "https://github.com/libretro/yabause"
source_branch: kronos
upstream: "https://github.com/FCare/Kronos"
profiled_date: "2026-03-24"
source_commit: "3791ffb2221fda61d70aec5cca376418caf05669"
source_commit: "8926b0c6c347f8c5c755911ddb0ac695420ffbf8"
core_version: "v2.6.0"
display_name: "Sega - Saturn/ST-V (Kronos)"
cores:
@@ -245,7 +244,7 @@ files:
size: 2097152
validation: [size]
note: "ROM cartridge for The King of Fighters '95. Auto-detected via game DB."
source_ref: "yabause/src/utils/src/db.c:43-44, yabause/src/sys/memory/src/cs0.c:1526-1535"
source_ref: "yabause/src/utils/src/db.c:43-44, yabause/src/cs0.c:1207-1216"
- name: "mpr-19367-mx.ic1"
system: sega-saturn
@@ -253,4 +252,4 @@ files:
size: 2097152
validation: [size]
note: "ROM cartridge for Ultraman: Hikari no Kyojin Densetsu. Auto-detected via game DB."
source_ref: "yabause/src/utils/src/db.c:45, yabause/src/sys/memory/src/cs0.c:1526-1535"
source_ref: "yabause/src/utils/src/db.c:45, yabause/src/cs0.c:1207-1216"
+10 -10
View File
@@ -30,57 +30,57 @@ notes: |
files:
- name: "<bios>.bin"
path: "pcsx2/bios/<bios>.bin"
path: "pcsx2/bios/"
required: true
description: "PS2 BIOS binary"
min_size: 4194304
max_size: 8388608
validation: [size]
source_ref: "pcsx2/ps2/BiosTools.cpp:33-34,63-180,249-274,286-348"
source_ref: "pcsx2/ps2/BiosTools.cpp:231-254,267-322"
note: >
Scans pcsx2/bios/ for any file between 4 MB and 8 MB. Validates via romdir
structure parsing (RESET + ROMVER entries). User selects BIOS via core option
pcsx2_bios. Falls back to first valid BIOS found if configured BIOS is missing.
- name: "<bios>.rom1"
path: "pcsx2/bios/<bios>.rom1"
path: "pcsx2/bios/"
required: false
max_size: 4194304
description: "DVD player ROM"
source_ref: "pcsx2/ps2/BiosTools.cpp:189-229,339"
source_ref: "pcsx2/ps2/BiosTools.cpp:190-211,314"
note: >
DVD player ROM. Tries <biospath>.rom1 (appended) then <biosbase>.rom1
(extension replaced). Silently skipped if not found.
- name: "<bios>.rom2"
path: "pcsx2/bios/<bios>.rom2"
path: "pcsx2/bios/"
required: false
max_size: 524288
description: "Chinese ROM extension"
source_ref: "pcsx2/ps2/BiosTools.cpp:189-229,340"
source_ref: "pcsx2/ps2/BiosTools.cpp:190-211,315"
note: >
Chinese region ROM extension. Same naming convention as rom1.
Only present on Chinese region consoles.
- name: "<bios>.nvm"
path: "pcsx2/bios/<bios>.nvm"
path: "pcsx2/bios/"
required: false
hle_fallback: true
size: 1024
description: "NVRAM / EEPROM data"
source_ref: "pcsx2/CDVD/CDVD.cpp:196-227"
source_ref: "pcsx2/CDVD/CDVD.cpp:224-267"
note: >
Console EEPROM data (language, timezone, region, iLink ID, OSD settings).
Path derived from BIOS path with extension replaced to .nvm.
Auto-created with region-appropriate defaults if missing or invalid.
- name: "<bios>.mec"
path: "pcsx2/bios/<bios>.mec"
path: "pcsx2/bios/"
required: false
hle_fallback: true
size: 4
description: "Mechacon version"
source_ref: "pcsx2/CDVD/CDVD.cpp:229-245"
source_ref: "pcsx2/CDVD/CDVD.cpp:255-266"
note: >
Mechacon (disc drive controller) version as u32.
Auto-created with default 0x00020603 if missing.
+1 -1
View File
@@ -17,7 +17,7 @@ notes: |
standalone upstream.
retro_load_game() calls lutro_load(info->path) to load the game
directory or archive (libretro.c:241). The core exposes
directory or archive (libretro.c:267). The core exposes
love.filesystem.getAppdataDirectory to games as the system_dir
(filesystem.c:296) but does not load any files from it itself.
No BIOS, firmware, or system files required.
+1010 -1113
View File
File diff suppressed because it is too large. Load diff
+401 -410
View File
File diff suppressed because it is too large. Load diff
+1 -1
View File
@@ -680,7 +680,7 @@ files:
required: true
category: bios_zip
system: casio-loopy
source_ref: "src/mame/casio/casloopy.cpp:2097-2105"
source_ref: "src/mame/casio/casloopy.cpp:2105-2462"
contents:
- name: hd6437021.lsi302
description: SH-1 CPU internal mask ROM
+2 -2
View File
@@ -292,7 +292,7 @@ files:
- name: "scph5502.bin"
system: sony-playstation
description: "SCPH-5502 / v3.0E BIOS"
region: [europe, oceania]
region: [europe]
required: true
size: 524288
sha256: "1faaa18fa820a0225e488d9f086296b8e6c46df739666093987ff7d8fd352c09"
@@ -376,7 +376,7 @@ files:
- name: "epr-17952a.ic8"
system: sega-stv
description: "ST-V BIOS (North America)"
region: [north-america, south-korea, asia-pal, brazil, latin-america]
region: [north-america]
required: true
size: 524288
validation: [size]
+6
View File
@@ -23,24 +23,28 @@ notes: >
files:
- name: "syscard3.pce"
description: "CD-ROM System Card 3.0 (Japan)"
region: [japan]
required: true
source_ref: "libretro.c:65, libretro.c:1896-1901"
note: "Default value for pce_fast_cdbios option."
- name: "syscard2.pce"
description: "CD-ROM System Card 2.0 (Japan)"
region: [japan]
required: false
source_ref: "libretro.c:1903"
note: "pce_fast_cdbios = 'System Card 2'."
- name: "syscard1.pce"
description: "CD-ROM System Card 1.0 (Japan)"
region: [japan]
required: false
source_ref: "libretro.c:1905"
note: "pce_fast_cdbios = 'System Card 1'."
- name: "gexpress.pce"
description: "Games Express CD Card"
region: [japan]
required: false
aliases: ["gecard.pce"]
source_ref: "libretro.c:1906-1907"
@@ -48,12 +52,14 @@ files:
- name: "syscard3u.pce"
description: "CD-ROM System Card 3.0 (US / TurboGrafx-CD)"
region: [north-america]
required: false
source_ref: "libretro.c:1908-1909"
note: "pce_fast_cdbios = 'System Card 3 US'. Not in .info."
- name: "syscard2u.pce"
description: "CD-ROM System Card 2.0 (US / TurboGrafx-CD)"
region: [north-america]
required: false
source_ref: "libretro.c:1910-1911"
note: "pce_fast_cdbios = 'System Card 2 US'. Not in .info."
+9 -9
View File
@@ -30,7 +30,7 @@ notes: |
mgba_skip_bios (default OFF) - skip the boot animation even if loaded
The libretro port resolves BIOS filenames in retro_load_game()
(src/platform/libretro/libretro.c:2060-2118). It picks the filename
(src/platform/libretro/libretro.c:2091-2148). It picks the filename
based on detected model:
GBA -> gba_bios.bin
GB (DMG/MGB) -> gb_bios.bin
@@ -38,7 +38,7 @@ notes: |
SGB -> sgb_bios.bin
SGB2 -> gb_bios.bin (falls to default, missing case)
The standalone core (src/gb/core.c:649-696) correctly maps SGB2 to
The standalone core (src/gb/core.c:637-684) correctly maps SGB2 to
sgb_bios.bin (marked TODO for a dedicated file). The libretro port
omits GB_MODEL_SGB2 from its switch, so SGB2 falls to default.
@@ -57,7 +57,7 @@ files:
size: 16384 # 16 KB (0x4000, GBA_SIZE_BIOS)
validation: [size]
note: "GBA BIOS. HLE replacement built in. Real BIOS adds boot logo and full SWI accuracy."
source_ref: "src/platform/libretro/libretro.c:2068"
source_ref: "src/platform/libretro/libretro.c:2099"
# -------------------------------------------------------
# Game Boy - boot ROM (optional, skip fallback)
@@ -68,7 +68,7 @@ files:
size: 256 # 256 B (0x100)
validation: [crc32]
note: "DMG/MGB boot ROM. Scrolling Nintendo logo. Skipped if absent."
source_ref: "src/platform/libretro/libretro.c:2104"
source_ref: "src/platform/libretro/libretro.c:971"
# -------------------------------------------------------
# Game Boy Color - boot ROM (optional, skip fallback)
@@ -79,7 +79,7 @@ files:
size: 2304 # 2304 B (0x900)
validation: [crc32]
note: "CGB boot ROM. Used for CGB, AGB (GBA in GB mode), and SCGB models."
source_ref: "src/platform/libretro/libretro.c:2097"
source_ref: "src/platform/libretro/libretro.c:2127"
# -------------------------------------------------------
# Super Game Boy - boot ROM (optional, skip fallback)
@@ -89,14 +89,14 @@ files:
required: false
size: 256 # 256 B (0x100)
validation: [crc32]
note: "SGB boot ROM. SGB2 maps here in standalone (src/gb/core.c:655) but falls to gb_bios.bin in libretro."
source_ref: "src/platform/libretro/libretro.c:2100"
note: "SGB boot ROM. SGB2 maps here in standalone (src/gb/core.c:643) but falls to gb_bios.bin in libretro."
source_ref: "src/platform/libretro/libretro.c:2130"
platform_details:
gba:
bios_size: 16384 # 16 KB
hle_bios: true
source_ref: "src/gba/hle-bios.c, src/gba/gba.c:513-552"
source_ref: "src/gba/hle-bios.c, src/gba/gba.c:520-551"
note: |
GBALoadBIOS() validates size (must be exactly 0x4000) then computes
an internal checksum. Two official checksums are recognized:
@@ -125,7 +125,7 @@ platform_details:
sgb:
bios_size: 256 # 256 B
hle_bios: false
source_ref: "src/gb/gb.c:570-605, src/gb/core.c:654-656"
source_ref: "src/gb/gb.c:570-605, src/gb/core.c:642-644"
note: |
Accepted SGB CRC32 checksums:
SGB = 0xEC8A83B9, SGB2 = 0x53D0DD63
+3 -3
View File
@@ -98,7 +98,7 @@ notes: |
MSX.emu/src/blueMSX/Memory/romMapperDRAM.c:88-99), and the Philips FDC, Panasonic
FDC and MoonSound mappers test nothing at all
(MSX.emu/src/blueMSX/Memory/romMapperPhilipsFdc.c:139-146,
MSX.emu/src/blueMSX/Memory/romMapperTC8566AF.c:228-255,
MSX.emu/src/blueMSX/Memory/romMapperTC8566AF.c:236-262,
MSX.emu/src/blueMSX/Memory/romMapperMoonsound.c:129-158).
The ROM database is compiled in. mediaDbGuessRom matches a cartridge's SHA-1 against
@@ -396,7 +396,7 @@ files:
required: true
size: 16384
description: "Panasonic floppy disk ROM of the MSX2+ machine"
source_ref: "MSX.emu/src/blueMSX/Board/Machine.c:300-339,450-468,1168-1181, MSX.emu/src/main/RomLoader.cc:57-92,94-133, MSX.emu/src/blueMSX/Memory/romMapperTC8566AF.c:228-255"
source_ref: "MSX.emu/src/blueMSX/Board/Machine.c:300-339,450-468,1168-1181, MSX.emu/src/main/RomLoader.cc:57-92,94-133, MSX.emu/src/blueMSX/Memory/romMapperTC8566AF.c:236-262"
- name: "MSXTR.rom"
path: "Machines/Shared Roms/MSXTR.rom"
@@ -436,7 +436,7 @@ files:
required: true
size: 65536
description: "MSX-DOS 2.3 disk ROM of the turbo R machine"
source_ref: "MSX.emu/src/blueMSX/Board/Machine.c:300-339,450-468,1168-1181, MSX.emu/src/main/RomLoader.cc:57-92,94-133, MSX.emu/src/blueMSX/Memory/romMapperTC8566AF.c:228-255"
source_ref: "MSX.emu/src/blueMSX/Board/Machine.c:300-339,450-468,1168-1181, MSX.emu/src/main/RomLoader.cc:57-92,94-133, MSX.emu/src/blueMSX/Memory/romMapperTC8566AF.c:236-262"
- name: "coleco.rom"
path: "Machines/COL - ColecoVision/coleco.rom"
+5 -7
View File
@@ -151,18 +151,16 @@ files:
source_ref: "cbus/ideio.c:1928-1930, cbus/ideio.c:1944-1981"
# -- SCSI BIOS ROM --
# Read into a 0x4000 buffer; any non-empty read is kept. Falls back to the
# scsibios[] stub.
# Loaded by scsiio.c:219. 16 KB (0x4000). Falls back to scsibios[] stub.
- name: "scsi.rom"
path: "np2kai/scsi.rom"
max_size: 16384
size: 16384
required: false
hle_fallback: true
note: >
SCSI controller BIOS ROM, up to 16 KB: the full-size test is commented
out and a shorter file is used as read. The core includes a built-in
SCSI controller BIOS ROM (16 KB). The core includes a built-in
SCSI BIOS stub as fallback.
source_ref: "cbus/scsiio.c:720-732"
source_ref: "cbus/scsiio.c:214-231"
# -- SASI BIOS ROM --
# Loaded by sasiio.c:455. 4 KB (0x1000). Falls back to sasibios[] stub.
@@ -215,4 +213,4 @@ files:
note: >
Keyboard remapping configuration (text file). User-created file
for custom keyboard layout. The core uses built-in defaults if absent.
source_ref: "keystat.c:46,116-151"
source_ref: "keystat.c:43,113-148"
+6 -6
View File
@@ -20,7 +20,7 @@ notes: |
Doukutsu.exe there (nxengine/libretro/libretro.cpp:289-294). When launched with a .exe
content file, it uses the parent directory of that file (nxengine/libretro/libretro.cpp:272).
At startup (nxengine/main.cpp:75-90), the core opens Doukutsu.exe and extracts:
At startup (main.cpp:75-90), the core opens Doukutsu.exe and extracts:
ORG music (extractorg.c), PXT sound effects (extractpxt.c), stage tile
attributes (extractstages.c), 18 credit BMPs + pixel.bmp (endpic/),
and the wavetable (nxengine/extract-auto/cachefiles.c:464-485). All kept in memory.
@@ -28,7 +28,7 @@ notes: |
The data/ directory (399 files from the freeware release) is loaded into
an in-memory cache at init (nxengine/extract-auto/cachefiles.c:38-439, 497-540). All subsequent
file access goes through this cache. The core verifies data/ by checking
for data/npc.tbl (nxengine/main.cpp:47-58).
for data/npc.tbl (main.cpp:47-58).
The font is compiled-in (bitmap_font.h). The upstream standalone version
uses font.ttf via SDL_ttf.
@@ -45,7 +45,7 @@ files:
size: 1478656
md5: "38695d3d69d7a0ada8178072dad4c58b"
sha1: "bb2d0441e073da9c584f23c2ad8c7ab8aac293bf"
source_ref: "nxengine/main.cpp:77-78 (opened for extraction), nxengine/libretro/libretro.cpp:278 (existence check)"
source_ref: "main.cpp:77-78 (opened for extraction), nxengine/libretro/libretro.cpp:290 (existence check)"
note: "Placed in system/nxengine/. The core extracts ORG music, PXT sounds, stage tile attributes, BMP graphics, and wavetable from this binary at each launch."
- name: "data/"
@@ -64,7 +64,7 @@ files:
system: cave-story
description: "NPC attribute table (entity behavior flags, HP, damage, display rect offsets)"
required: true
source_ref: "nxengine/main.cpp:47-53 (existence check for data/ directory), nxengine/ai/ai.cpp:56-59 (loaded for NPC properties)"
source_ref: "main.cpp:50 (existence check for data/ directory), ai/ai.cpp:56-59 (loaded for NPC properties)"
note: "Located in system/nxengine/data/. Used to validate data directory presence and to load NPC behavior attributes."
- name: "data/sprites.sif"
@@ -84,5 +84,5 @@ files:
description: "Tile attribute lookup table (maps tile codes to collision/behavior attributes)"
required: false
hle_fallback: true
source_ref: "nxengine/map.cpp:290-303 (loaded at init, hardcoded default if missing)"
note: "Not part of the freeware distribution. Generated by the standalone NXEngine extraction tool. The libretro core has hardcoded defaults in nxengine/map.cpp:30."
source_ref: "map.cpp:290-303 (loaded at init, hardcoded default if missing)"
note: "Not part of the freeware distribution. Generated by the standalone NXEngine extraction tool. The libretro core has hardcoded defaults in map.cpp:30."
+1 -1
View File
@@ -16,7 +16,7 @@ files:
required: false
description: "64DD IPL ROM"
note: "Only loaded when a 64DD disk image (.ndd) is present via subsystem API. Core fails to load disk games without it."
source_ref: "libretro/libretro.c:848"
source_ref: "libretro/libretro.c:1021"
notes:
hle_available: true
+5 -5
View File
@@ -83,7 +83,7 @@ notes: |
files:
- name: "<bios>.bin"
path: "pcsx2/bios/<bios>.bin"
path: "pcsx2/bios/"
description: "PS2 BIOS image"
min_size: 4194304
max_size: 8388608
@@ -96,7 +96,7 @@ files:
auto selection accept any size that passes the romdir check.
- name: "<bios>.rom1"
path: "pcsx2/bios/<bios>.rom1"
path: "pcsx2/bios/"
description: "DVD player ROM"
max_size: 4194304
required: false
@@ -106,7 +106,7 @@ files:
skipped with a console line when absent.
- name: "<bios>.rom2"
path: "pcsx2/bios/<bios>.rom2"
path: "pcsx2/bios/"
description: "Chinese ROM extension"
max_size: 4194304
required: false
@@ -115,7 +115,7 @@ files:
Same lookup as rom1. Present on Chinese region consoles only.
- name: "<bios>.nvm"
path: "pcsx2/bios/<bios>.nvm"
path: "pcsx2/bios/"
description: "Console NVRAM (region parameters, language, iLink ID, OSD settings)"
size: 1024
required: false
@@ -127,7 +127,7 @@ files:
on save.
- name: "<bios>.mec"
path: "pcsx2/bios/<bios>.mec"
path: "pcsx2/bios/"
description: "Mechacon version, one u32"
size: 4
required: false
+16 -26
View File
@@ -25,7 +25,7 @@ files:
min_size: 4194304
max_size: 8388608
validation: [size]
source_ref: "pcsx2/ps2/BiosTools.cpp:16-17,80-197,258-283,317-370"
source_ref: "pcsx2/ps2/BiosTools.cpp:258-362"
note: "Accepts any file 4-8 MB with valid romdir (RESET + ROMVER). Naming convention ps2-VVVVr-YYYYMMDD.bin (version, region, date)."
- name: ps2-0230a-20080220.rom1
@@ -48,7 +48,7 @@ files:
size: 1024
description: "Console NVRAM"
note: "Read at the BIOS path with the extension replaced by nvm, opened case-insensitively. Built in memory from region defaults when absent or blank."
source_ref: "pcsx2/CDVD/CDVD.cpp:165-189"
source_ref: "pcsx2/CDVD/CDVD.cpp:160-188"
- name: ps2-0230a-20080220.mec
required: false
@@ -66,32 +66,22 @@ files:
note: "DEV9 network adapter EEPROM. Falls back to built-in defaults if missing."
- name: GameIndex.yaml
path: resources/GameIndex.yaml
path: pcsx2/resources/GameIndex.yaml
required: false
bundled: true
sha1: 5e2d50a3376dc6a0750505bec68626d39a5bd4c1
size: 2683897
category: game_data
description: "per-title compatibility and fix database"
source_ref: "pcsx2/GameDatabase.cpp:39, pcsx2/GameDatabase.cpp:1026-1035"
note: "Read from the resources directory shipped with the application. Console error and no per-title fixes if missing."
mode: libretro
source_ref: "pcsx2/GameDatabase.cpp:46, pcsx2/GameDatabase.cpp:896"
note: "Game compatibility database. OSD warning if missing."
- name: RedumpDatabase.yaml
path: resources/RedumpDatabase.yaml
- name: cheats_ws.zip
path: pcsx2/resources/cheats_ws.zip
required: false
bundled: true
sha1: bf2c73d668cd671df8adfe2ec3c7074e8ba9176a
size: 1917242
category: game_data
description: "disc hash database"
source_ref: "pcsx2/GameDatabase.cpp:1133, pcsx2/GameDatabase.cpp:1188-1197"
note: "Read from the resources directory shipped with the application, used to name a disc from its dump."
mode: libretro
source_ref: "pcsx2/VMManager.cpp:348-361"
note: "Widescreen patches archive."
- name: patches.zip
path: resources/patches.zip
- name: cheats_ni.zip
path: pcsx2/resources/cheats_ni.zip
required: false
bundled: true
category: game_data
description: "built-in game patch archive"
source_ref: "pcsx2/Patch.cpp:117, pcsx2/Patch.cpp:289-318"
note: "Opened read only from the resources directory shipped with the application and searched for the pnach matching the running serial and CRC. Widescreen and no-interlacing patches live inside it."
mode: libretro
source_ref: "pcsx2/VMManager.cpp:383-396"
note: "No-interlacing patches archive."
+4 -4
View File
@@ -59,14 +59,14 @@ files:
# -- Fallback BIOS filenames (searched in order after scph550x) --
- name: "psxonpsp660.bin"
description: "PSP embedded PS1 BIOS, filed as the Japanese BIOS"
region: [japan]
description: "PSP embedded PS1 BIOS (region detected at runtime)"
region: [world]
size: 524288
required: false
hle_fallback: true
validation: [size]
source_ref: "frontend/libretro.c:3864-3867 (listed_bios[3]), frontend/libretro.c:3654-3669 (try_use_bios region guess)"
note: "The core reads the region out of the image: bytes 0x7ff51 are ' J' in this dump, so it takes the JP slot (' E' takes EU, anything else US), one image per slot, first found kept. The disc licence picks the slot at boot (Config.Bios[Config.PsxRegion]); a US or EU disc only reaches this file when its own slot is empty. Must be 512 KB."
source_ref: "frontend/libretro.c:3864-3867 (listed_bios[3])"
note: "Region detected from content at runtime. Must be 512 KB in libretro context."
- name: "scph101.bin"
description: "SCPH-101 (v4.4 03-24-00 A) - PSone US"
+5 -5
View File
@@ -12,7 +12,7 @@ systems:
- sega-megadrive
- sega-genesis
- sega-megacd
- sega-megacd
- sega-segacd
- sega-32x
- sega-mastersystem
- sega-gamegear
@@ -63,7 +63,7 @@ files:
# Mega CD / Sega CD - US region
# -------------------------------------------------------
- name: "us_scd2_9306.bin"
system: sega-megacd
system: sega-segacd
variant_group: "mega-cd-bios"
region: [north-america]
priority: 1
@@ -73,7 +73,7 @@ files:
source_ref: "platform/libretro/libretro.c:1273"
- name: "SegaCDBIOS9303.bin"
system: sega-megacd
system: sega-segacd
variant_group: "mega-cd-bios"
region: [north-america]
priority: 2
@@ -83,7 +83,7 @@ files:
source_ref: "platform/libretro/libretro.c:1273"
- name: "us_scd1_9210.bin"
system: sega-megacd
system: sega-segacd
variant_group: "mega-cd-bios"
region: [north-america]
priority: 3
@@ -93,7 +93,7 @@ files:
source_ref: "platform/libretro/libretro.c:1273"
- name: "bios_CD_U.bin"
system: sega-megacd
system: sega-segacd
variant_group: "mega-cd-bios"
region: [north-america]
priority: 4
+1 -1
View File
@@ -84,7 +84,7 @@ platform_details:
size: 4096
load_priority:
source_ref: "source/PokeMini.c:500-509"
source_ref: "source/PokeMini.c:515-523"
note: |
During PokeMini_Reset(), the core first reloads FreeBIOS as a
safe baseline, then attempts to load bios.min from disk. If
+1 -1
View File
@@ -51,5 +51,5 @@ files:
md5: "72ae1b47820fcc93cc0df9c428d0face"
sha1: "5f4aed208301449c2e9514edfd325fe9dead76fa"
crc32: "a5751b99"
source_ref: "src/d_main.c:1449-1465 (PACKAGE .wad load), libretro/libretro.c:4171-4252 (I_FindFile search), src/config.h:39 (PACKAGE=prboom)"
source_ref: "src/d_main.c:1438-1476 (PACKAGE .wad load), libretro/libretro.c:4254-4330 (I_FindFile search), src/config.h:39 (PACKAGE=prboom)"
note: "Searched in system/prboom/ then system/. Falls back to internal defaults if missing, but menus and HUD may render incorrectly without it."
+39 -6
View File
@@ -37,6 +37,7 @@ files:
region: [north-america]
size: 2097152
required: false
mode: standalone
hle_fallback: true
note: "GameCube NTSC-U boot ROM. HLE available but real IPL needed for GC menu boot and accurate fonts"
source_ref: "Source/Core/Common/CommonPaths.h:138, Source/Core/Core/HW/EXI/EXI_DeviceIPL.cpp:109-110"
@@ -46,6 +47,7 @@ files:
region: [europe]
size: 2097152
required: false
mode: standalone
hle_fallback: true
note: "GameCube PAL boot ROM"
source_ref: "Source/Core/Core/HW/EXI/EXI_DeviceIPL.cpp:184"
@@ -55,6 +57,7 @@ files:
region: [japan]
size: 2097152
required: false
mode: standalone
hle_fallback: true
note: "GameCube NTSC-J boot ROM. JAP is the legacy directory name"
source_ref: "Source/Core/Core/HW/EXI/EXI_DeviceIPL.cpp:186"
@@ -67,23 +70,25 @@ files:
path: "GC/dsp_rom.bin"
size: 8192
required: false
mode: standalone
hle_fallback: true
validation: [size, adler32]
known_hash_adler32: ["0x66f334fe", "0xe789b5a5"]
validation: [size]
known_hash_adler32: "0x66f334fe"
adler32_byteswap: true
note: "DSP instruction ROM for LLE audio. Free replacement (v0.4) included"
source_ref: "Source/Core/Common/CommonPaths.h:135, Source/Core/Core/HW/DSPLLE/DSPLLE.cpp:87-117, Source/Core/Core/DSP/DSPCore.cpp:28-102"
source_ref: "Source/Core/Common/CommonPaths.h:135, Source/Core/Core/HW/DSPLLE/DSPLLE.cpp:87-117"
- name: "dsp_coef.bin"
path: "GC/dsp_coef.bin"
size: 4096
required: false
mode: standalone
hle_fallback: true
validation: [size, adler32]
known_hash_adler32: ["0xf3b93527", "0xa4a575f5"]
validation: [size]
known_hash_adler32: "0xf3b93527"
adler32_byteswap: true
note: "DSP coefficient ROM for LLE audio. Free replacement included"
source_ref: "Source/Core/Common/CommonPaths.h:138, Source/Core/Core/DSP/DSPCore.cpp:32-38, Source/Core/Core/DSP/DSPCore.cpp:28-102"
source_ref: "Source/Core/Common/CommonPaths.h:138, Source/Core/Core/DSP/DSPCore.cpp:32-38"
# -- GameCube Fonts --
# Bundled free alternatives exist but have padding differences causing misplaced text.
@@ -93,6 +98,7 @@ files:
path: "GC/font_western.bin"
size: 9589
required: false
mode: standalone
hle_fallback: true
note: "Windows-1252 font for GC/Wii text rendering. Free alternative bundled, real one from IPL dump preferred"
source_ref: "Source/Core/Common/CommonPaths.h:132, Source/Core/Core/HW/EXI/EXI_DeviceIPL.cpp:131,203-218"
@@ -101,6 +107,7 @@ files:
path: "GC/font_japanese.bin"
size: 303693
required: false
mode: standalone
hle_fallback: true
note: "Shift-JIS font for Japanese text. Free alternative bundled, real one from IPL dump preferred"
source_ref: "Source/Core/Common/CommonPaths.h:135, Source/Core/Core/HW/EXI/EXI_DeviceIPL.cpp:130"
@@ -111,6 +118,7 @@ files:
- name: "gba_bios.bin"
path: "GBA/gba_bios.bin"
required: false
mode: standalone
hle_fallback: true
note: "GBA BIOS for GC-GBA link feature (uses integrated mGBA). Path configurable in settings"
source_ref: "Source/Core/Common/CommonPaths.h:144, Source/Core/Core/HW/GBACore.cpp:344-361"
@@ -119,6 +127,7 @@ files:
- name: "SYSCONF"
path: "Wii/shared2/sys/SYSCONF"
required: false
mode: standalone
hle_fallback: true
note: "Wii system configuration. Auto-generated by PrimeHack, can be imported from NAND backup"
source_ref: "Source/Core/Common/CommonPaths.h:118, Source/Core/Core/WiiRoot.cpp:266"
@@ -127,6 +136,7 @@ files:
path: "Wii/title/00000001/00000002/data/setting.txt"
size: 256
required: false
mode: standalone
hle_fallback: true
note: "Wii region/language settings. Auto-generated during Wii boot emulation"
source_ref: "Source/Core/Common/CommonPaths.h:152, Source/Core/Core/Boot/Boot_BS2Emu.cpp:377-454"
@@ -135,6 +145,7 @@ files:
- name: "nand.bin"
path: null
required: false
mode: standalone
hle_fallback: true
note: "BootMii NAND backup. Can be imported to populate Wii NAND with channels, saves, system menu"
source_ref: "Source/Core/DiscIO/NANDImporter.cpp:26-89"
@@ -143,6 +154,7 @@ files:
path: null
size: 1024
required: false
mode: standalone
hle_fallback: true
note: "OTP/SEEPROM dump (Wii encryption keys). Needed if not appended to nand.bin for NAND import"
source_ref: "Source/Core/DiscIO/NANDImporter.cpp:19,76-88"
@@ -151,6 +163,7 @@ files:
- name: "WiiSD.raw"
path: "Load/WiiSD.raw"
required: false
mode: standalone
hle_fallback: true
note: "Virtual SD card image for Wii homebrew. Auto-created, supports SD/SDHC up to 4GB"
source_ref: "Source/Core/Common/CommonPaths.h:149"
@@ -159,6 +172,7 @@ files:
- name: "codehandler.bin"
path: null
required: false
mode: standalone
hle_fallback: true
note: "Gecko/Ocarina cheat code handler. Shipped with PrimeHack in Sys/"
source_ref: "Source/Core/Common/CommonPaths.h:154, Source/Core/Core/GeckoCode.cpp:121"
@@ -167,6 +181,7 @@ files:
- name: "Wii System Menu"
path: null
required: false
mode: standalone
hle_fallback: true
note: "Wii System Menu WAD. Installed to NAND via Tools > Install WAD, needed for Wii Menu boot"
source_ref: "Source/Core/DolphinQt/MenuBar.cpp:335, Source/Core/DolphinQt/MenuBar.cpp:1582-1590"
@@ -175,6 +190,7 @@ files:
- name: "clientca.pem"
path: "Wii/clientca.pem"
required: false
mode: standalone
hle_fallback: true
note: "SSL client certificate. Auto-extracted from IOS13 content during NAND import"
source_ref: "Source/Core/DiscIO/NANDImporter.cpp:201-285"
@@ -182,6 +198,7 @@ files:
- name: "clientcakey.pem"
path: "Wii/clientcakey.pem"
required: false
mode: standalone
hle_fallback: true
note: "SSL client private key. Auto-extracted from IOS13 content during NAND import"
source_ref: "Source/Core/DiscIO/NANDImporter.cpp:237"
@@ -189,6 +206,7 @@ files:
- name: "rootca.pem"
path: "Wii/rootca.pem"
required: false
mode: standalone
hle_fallback: true
note: "SSL root CA certificate. Auto-extracted from IOS13 content during NAND import"
source_ref: "Source/Core/DiscIO/NANDImporter.cpp:238"
@@ -202,90 +220,105 @@ files:
- name: "rtl8723a_fw.bin"
path: "Load/Firmware/rtl_bt/rtl8723a_fw.bin"
required: false
mode: standalone
note: "Realtek 8723A BT firmware for Wiimote passthrough"
source_ref: "Source/Core/Core/IOS/USB/Bluetooth/RealtekFirmwareLoader.cpp:379"
- name: "rtl8723b_fw.bin"
path: "Load/Firmware/rtl_bt/rtl8723b_fw.bin"
required: false
mode: standalone
note: "Realtek 8723B BT firmware for Wiimote passthrough"
source_ref: "Source/Core/Core/IOS/USB/Bluetooth/RealtekFirmwareLoader.cpp:516-519"
- name: "rtl8723d_fw.bin"
path: "Load/Firmware/rtl_bt/rtl8723d_fw.bin"
required: false
mode: standalone
note: "Realtek 8723D BT firmware for Wiimote passthrough"
source_ref: "Source/Core/Core/IOS/USB/Bluetooth/RealtekFirmwareLoader.cpp:383"
- name: "rtl8761a_fw.bin"
path: "Load/Firmware/rtl_bt/rtl8761a_fw.bin"
required: false
mode: standalone
note: "Realtek 8761A BT firmware for Wiimote passthrough"
source_ref: "Source/Core/Core/IOS/USB/Bluetooth/RealtekFirmwareLoader.cpp:385"
- name: "rtl8761bu_fw.bin"
path: "Load/Firmware/rtl_bt/rtl8761bu_fw.bin"
required: false
mode: standalone
note: "Realtek 8761BU BT firmware for Wiimote passthrough"
source_ref: "Source/Core/Core/IOS/USB/Bluetooth/RealtekFirmwareLoader.cpp:387"
- name: "rtl8821a_fw.bin"
path: "Load/Firmware/rtl_bt/rtl8821a_fw.bin"
required: false
mode: standalone
note: "Realtek 8821A BT firmware for Wiimote passthrough"
source_ref: "Source/Core/Core/IOS/USB/Bluetooth/RealtekFirmwareLoader.cpp:389"
- name: "rtl8821c_fw.bin"
path: "Load/Firmware/rtl_bt/rtl8821c_fw.bin"
required: false
mode: standalone
note: "Realtek 8821C BT firmware for Wiimote passthrough"
source_ref: "Source/Core/Core/IOS/USB/Bluetooth/RealtekFirmwareLoader.cpp:391"
- name: "rtl8822b_fw.bin"
path: "Load/Firmware/rtl_bt/rtl8822b_fw.bin"
required: false
mode: standalone
note: "Realtek 8822B BT firmware for Wiimote passthrough"
source_ref: "Source/Core/Core/IOS/USB/Bluetooth/RealtekFirmwareLoader.cpp:395"
- name: "rtl8822cu_fw.bin"
path: "Load/Firmware/rtl_bt/rtl8822cu_fw.bin"
required: false
mode: standalone
note: "Realtek 8822CU BT firmware for Wiimote passthrough"
source_ref: "Source/Core/Core/IOS/USB/Bluetooth/RealtekFirmwareLoader.cpp:393"
- name: "rtl8851bu_fw.bin"
path: "Load/Firmware/rtl_bt/rtl8851bu_fw.bin"
required: false
mode: standalone
note: "Realtek 8851BU BT firmware for Wiimote passthrough"
source_ref: "Source/Core/Core/IOS/USB/Bluetooth/RealtekFirmwareLoader.cpp:397"
- name: "rtl8852au_fw.bin"
path: "Load/Firmware/rtl_bt/rtl8852au_fw.bin"
required: false
mode: standalone
note: "Realtek 8852AU BT firmware for Wiimote passthrough"
source_ref: "Source/Core/Core/IOS/USB/Bluetooth/RealtekFirmwareLoader.cpp:399"
- name: "rtl8852bu_fw.bin"
path: "Load/Firmware/rtl_bt/rtl8852bu_fw.bin"
required: false
mode: standalone
note: "Realtek 8852BU BT firmware for Wiimote passthrough"
source_ref: "Source/Core/Core/IOS/USB/Bluetooth/RealtekFirmwareLoader.cpp:401"
- name: "rtl8852cu_fw.bin"
path: "Load/Firmware/rtl_bt/rtl8852cu_fw.bin"
required: false
mode: standalone
note: "Realtek 8852CU BT firmware for Wiimote passthrough"
source_ref: "Source/Core/Core/IOS/USB/Bluetooth/RealtekFirmwareLoader.cpp:403"
- name: "rtl8852btu_fw.bin"
path: "Load/Firmware/rtl_bt/rtl8852btu_fw.bin"
required: false
mode: standalone
note: "Realtek 8852BT/8852BE-VT BT firmware for Wiimote passthrough"
source_ref: "Source/Core/Core/IOS/USB/Bluetooth/RealtekFirmwareLoader.cpp:405"
- name: "rtl8922au_fw.bin"
path: "Load/Firmware/rtl_bt/rtl8922au_fw.bin"
required: false
mode: standalone
note: "Realtek 8922AU BT firmware for Wiimote passthrough"
source_ref: "Source/Core/Core/IOS/USB/Bluetooth/RealtekFirmwareLoader.cpp:407"
+5 -5
View File
@@ -56,7 +56,7 @@ notes: |
capsimg.so/capsimg.dll is an optional shared library for IPF floppy image
support (SPS/CAPS format). Not a BIOS file, loaded dynamically at runtime.
Source: libretro/libretro-core.h:140-245, libretro/libretro-core.c:5609-5777,
Source: libretro/libretro-core.h:140-245, libretro/libretro-core.c:5612-5752,
libretro/libretro-core.c:6044-6093
files:
@@ -243,20 +243,20 @@ files:
system: commodore-amiga
required: false
note: "Amiga Forever ROM decryption key. Copied to saves/WHDLoad/Devs/Kickstarts/ for WHDLoad."
source_ref: "libretro/libretro-core.c:5963-5978"
source_ref: "libretro/libretro-core.c:5969-5980"
- name: "WHDLoad.key"
system: commodore-amiga
required: false
unsourceable: "per-user signed registration key, never distributed generically, WHDLoad free since v18.2"
note: "WHDLoad license key. Copied to saves/WHDLoad/L/ for registered WHDLoad use."
source_ref: "libretro/libretro-core.c:5979-5994"
source_ref: "libretro/libretro-core.c:5985-5998"
- name: "WHDLoad.prefs"
system: commodore-amiga
required: false
note: "WHDLoad preferences. Copied to saves/WHDLoad/S/ when present."
source_ref: "libretro/libretro-core.c:5995-6018"
source_ref: "libretro/libretro-core.c:6000-6023"
model_kickstart_map:
A500: {kickstart: "kick34005.A500", ext: null}
@@ -290,4 +290,4 @@ platform_details:
amiga_forever: "amiga-os-{version}.rom"
tosec: "Kickstart v{version} rev {rev} ({year})(Commodore)({model}).rom"
scan_prefixes: ["kick", "amiga-os", "KS ROM"]
source_ref: "libretro/libretro-core.c:2650-2677"
source_ref: "libretro/libretro-core.c:2651-2678"
+6 -6
View File
@@ -60,8 +60,8 @@ notes: |
capsimg.so/capsimg.dll is an optional shared library for IPF floppy image
support (SPS/CAPS format). Not a BIOS file, loaded dynamically at runtime.
Source: libretro/libretro-core.h:140-245, libretro/libretro-core.c:5533-5701,
libretro/libretro-core.c:5788-5879
Source: libretro/libretro-core.h:140-245, libretro/libretro-core.c:5384-5550,
libretro/libretro-core.c:5636-5795
files:
# -------------------------------------------------------
@@ -247,20 +247,20 @@ files:
system: commodore-amiga
required: false
note: "Amiga Forever ROM decryption key. Copied to saves/WHDLoad/Devs/Kickstarts/ for WHDLoad."
source_ref: "libretro/libretro-core.c:5887-5902"
source_ref: "libretro/libretro-core.c:5735-5746"
- name: "WHDLoad.key"
system: commodore-amiga
required: false
unsourceable: "per-user signed registration key, never distributed generically, WHDLoad free since v18.2"
note: "WHDLoad license key. Copied to saves/WHDLoad/L/ for registered WHDLoad use."
source_ref: "libretro/libretro-core.c:5903-5918"
source_ref: "libretro/libretro-core.c:5751-5764"
- name: "WHDLoad.prefs"
system: commodore-amiga
required: false
note: "WHDLoad preferences. Copied to saves/WHDLoad/S/ when present."
source_ref: "libretro/libretro-core.c:5919-5942"
source_ref: "libretro/libretro-core.c:5768-5791"
model_kickstart_map:
A500: {kickstart: "kick34005.A500", ext: null}
@@ -294,4 +294,4 @@ platform_details:
amiga_forever: "amiga-os-{version}.rom"
tosec: "Kickstart v{version} rev {rev} ({year})(Commodore)({model}).rom"
scan_prefixes: ["kick", "amiga-os", "KS ROM"]
source_ref: "libretro/libretro-core.c:2629-2656"
source_ref: "libretro/libretro-core.c:2577-2616"
+6 -3
View File
@@ -20,19 +20,22 @@ mode: standalone
files:
- name: "prod.keys"
required: true
path: "switch/prod.keys"
path: "switch/"
mode: standalone
note: "Switch production keys for NCA decryption"
source_ref: "src/Ryujinx.HLE/FileSystem/VirtualFileSystem.cs:239"
- name: "title.keys"
required: false
path: "switch/title.keys"
path: "switch/"
mode: standalone
note: "Per-title decryption keys, needed for specific game content"
source_ref: "src/Ryujinx.HLE/FileSystem/VirtualFileSystem.cs:240"
- name: "console.keys"
required: false
path: "switch/console.keys"
path: "switch/"
mode: standalone
note: "Console-specific keys for encrypted content"
source_ref: "src/Ryujinx.HLE/FileSystem/VirtualFileSystem.cs:241"
+26 -26
View File
@@ -48,20 +48,20 @@ files:
- name: "libSceLibcInternal.sprx"
required: false
hle_fallback: true
path: "shadps4/sys_modules/libSceLibcInternal.sprx"
path: "shadps4/sys_modules/"
description: "PS4 C standard library"
source_ref: "src/core/linker.cpp:80-91"
- name: "libSceNgs2.sprx"
required: false
hle_fallback: true
path: "shadps4/sys_modules/libSceNgs2.sprx"
path: "shadps4/sys_modules/"
description: "PS4 next-generation audio system"
source_ref: "src/core/libraries/sysmodule/sysmodule_internal.cpp:217"
- name: "libSceUlt.sprx"
required: false
path: "shadps4/sys_modules/libSceUlt.sprx"
path: "shadps4/sys_modules/"
description: "PS4 user-level threading library"
note: "No HLE implementation; the module is stubbed when absent."
source_ref: "src/core/libraries/sysmodule/sysmodule_internal.cpp:218"
@@ -69,13 +69,13 @@ files:
- name: "libSceRtc.sprx"
required: false
hle_fallback: true
path: "shadps4/sys_modules/libSceRtc.sprx"
path: "shadps4/sys_modules/"
description: "PS4 real-time clock library"
source_ref: "src/core/libraries/sysmodule/sysmodule_internal.cpp:221"
- name: "libSceJpegDec.sprx"
required: false
path: "shadps4/sys_modules/libSceJpegDec.sprx"
path: "shadps4/sys_modules/"
description: "PS4 JPEG decoder"
note: "No HLE implementation; the module is stubbed when absent."
source_ref: "src/core/libraries/sysmodule/sysmodule_internal.cpp:222"
@@ -83,83 +83,83 @@ files:
- name: "libSceJpegEnc.sprx"
required: false
hle_fallback: true
path: "shadps4/sys_modules/libSceJpegEnc.sprx"
path: "shadps4/sys_modules/"
description: "PS4 JPEG encoder"
source_ref: "src/core/libraries/sysmodule/sysmodule_internal.cpp:223"
- name: "libScePngEnc.sprx"
required: false
hle_fallback: true
path: "shadps4/sys_modules/libScePngEnc.sprx"
path: "shadps4/sys_modules/"
description: "PS4 PNG encoder"
source_ref: "src/core/libraries/sysmodule/sysmodule_internal.cpp:225"
- name: "libSceJson.sprx"
required: false
path: "shadps4/sys_modules/libSceJson.sprx"
path: "shadps4/sys_modules/"
description: "PS4 JSON parser"
note: "No HLE implementation; the module is stubbed when absent."
source_ref: "src/core/libraries/sysmodule/sysmodule_internal.cpp:226"
- name: "libSceJson2.sprx"
required: false
path: "shadps4/sys_modules/libSceJson2.sprx"
path: "shadps4/sys_modules/"
description: "PS4 JSON v2 parser"
note: "No HLE implementation; the module is stubbed when absent."
source_ref: "src/core/libraries/sysmodule/sysmodule_internal.cpp:227"
- name: "libSceCesCs.sprx"
required: false
path: "shadps4/sys_modules/libSceCesCs.sprx"
path: "shadps4/sys_modules/"
description: "PS4 character encoding conversion"
note: "No HLE implementation; the module is stubbed when absent."
source_ref: "src/core/libraries/sysmodule/sysmodule_internal.cpp:228"
- name: "libSceAt9Enc.sprx"
required: false
path: "shadps4/sys_modules/libSceAt9Enc.sprx"
path: "shadps4/sys_modules/"
description: "PS4 ATRAC9 encoder"
note: "No HLE implementation; the module is stubbed when absent."
source_ref: "src/core/libraries/sysmodule/sysmodule_internal.cpp:229"
- name: "libSceAudiodec.sprx"
required: false
path: "shadps4/sys_modules/libSceAudiodec.sprx"
path: "shadps4/sys_modules/"
description: "PS4 audio decoder"
note: "No HLE implementation; the module is stubbed when absent."
source_ref: "src/core/libraries/sysmodule/sysmodule_internal.cpp:230"
- name: "libSceAudiodecCpu.sprx"
required: false
path: "shadps4/sys_modules/libSceAudiodecCpu.sprx"
path: "shadps4/sys_modules/"
description: "PS4 CPU audio decoder"
note: "No HLE implementation; the module is stubbed when absent."
source_ref: "src/core/libraries/sysmodule/sysmodule_internal.cpp:231"
- name: "libSceAudiodecCpuDdp.sprx"
required: false
path: "shadps4/sys_modules/libSceAudiodecCpuDdp.sprx"
path: "shadps4/sys_modules/"
description: "PS4 CPU Dolby Digital Plus decoder"
note: "No HLE implementation; the module is stubbed when absent."
source_ref: "src/core/libraries/sysmodule/sysmodule_internal.cpp:232"
- name: "libSceAudiodecCpuM4aac.sprx"
required: false
path: "shadps4/sys_modules/libSceAudiodecCpuM4aac.sprx"
path: "shadps4/sys_modules/"
description: "PS4 CPU AAC decoder"
note: "No HLE implementation; the module is stubbed when absent."
source_ref: "src/core/libraries/sysmodule/sysmodule_internal.cpp:233"
- name: "libSceAudiodecCpuDtsHdLbr.sprx"
required: false
path: "shadps4/sys_modules/libSceAudiodecCpuDtsHdLbr.sprx"
path: "shadps4/sys_modules/"
description: "PS4 CPU DTS-HD LBR decoder"
note: "No HLE implementation; the module is stubbed when absent."
source_ref: "src/core/libraries/sysmodule/sysmodule_internal.cpp:234"
- name: "libSceAudiodecCpuHevag.sprx"
required: false
path: "shadps4/sys_modules/libSceAudiodecCpuHevag.sprx"
path: "shadps4/sys_modules/"
description: "PS4 CPU HEVAG decoder"
note: "No HLE implementation; the module is stubbed when absent."
source_ref: "src/core/libraries/sysmodule/sysmodule_internal.cpp:235"
@@ -167,34 +167,34 @@ files:
- name: "libSceFont.sprx"
required: false
hle_fallback: true
path: "shadps4/sys_modules/libSceFont.sprx"
path: "shadps4/sys_modules/"
description: "PS4 font rendering library"
source_ref: "src/core/libraries/sysmodule/sysmodule_internal.cpp:236"
- name: "libSceFontFt.sprx"
required: false
hle_fallback: true
path: "shadps4/sys_modules/libSceFontFt.sprx"
path: "shadps4/sys_modules/"
description: "PS4 FreeType font library"
source_ref: "src/core/libraries/sysmodule/sysmodule_internal.cpp:237"
- name: "libSceFreeTypeOt.sprx"
required: false
path: "shadps4/sys_modules/libSceFreeTypeOt.sprx"
path: "shadps4/sys_modules/"
description: "PS4 FreeType OpenType library"
note: "No HLE implementation; the module is stubbed when absent."
source_ref: "src/core/libraries/sysmodule/sysmodule_internal.cpp:238"
- name: "libSceFreeTypeOl.sprx"
required: false
path: "shadps4/sys_modules/libSceFreeTypeOl.sprx"
path: "shadps4/sys_modules/"
description: "PS4 FreeType outline library"
note: "No HLE implementation; the module is stubbed when absent."
source_ref: "src/core/libraries/sysmodule/sysmodule_internal.cpp:239"
- name: "libSceFreeTypeOptOl.sprx"
required: false
path: "shadps4/sys_modules/libSceFreeTypeOptOl.sprx"
path: "shadps4/sys_modules/"
description: "PS4 FreeType optimised outline library"
note: "No HLE implementation; the module is stubbed when absent."
source_ref: "src/core/libraries/sysmodule/sysmodule_internal.cpp:240"
@@ -202,13 +202,13 @@ files:
- name: "libSceRudp.sprx"
required: false
hle_fallback: true
path: "shadps4/sys_modules/libSceRudp.sprx"
path: "shadps4/sys_modules/"
description: "PS4 reliable UDP library"
source_ref: "src/core/libraries/sysmodule/sysmodule_internal.cpp:243"
- name: "libSceWkFontConfig.sprx"
required: false
path: "shadps4/sys_modules/libSceWkFontConfig.sprx"
path: "shadps4/sys_modules/"
description: "PS4 WebKit font configuration"
note: "No HLE implementation; the module is stubbed when absent."
source_ref: "src/core/libraries/sysmodule/sysmodule_internal.cpp:244"
@@ -216,13 +216,13 @@ files:
- name: "libSceSystemGesture.sprx"
required: false
hle_fallback: true
path: "shadps4/sys_modules/libSceSystemGesture.sprx"
path: "shadps4/sys_modules/"
description: "PS4 system gesture recognition"
source_ref: "src/core/libraries/sysmodule/sysmodule_internal.cpp:249"
- name: "libSceXml.sprx"
required: false
path: "shadps4/sys_modules/libSceXml.sprx"
path: "shadps4/sys_modules/"
description: "PS4 XML parser"
note: "No HLE implementation; the module is stubbed when absent."
source_ref: "src/core/libraries/sysmodule/sysmodule_internal.cpp:250"
+8 -4
View File
@@ -25,26 +25,30 @@ mode: standalone
files:
- name: "prod.keys"
required: true
path: "switch/prod.keys"
path: "switch/"
mode: standalone
note: "Production keys for NCA decryption (master, key area, header, titlekek)"
source_ref: "src/core/crypto/key_manager.cpp:654"
- name: "title.keys"
required: false
path: "switch/title.keys"
path: "switch/"
mode: standalone
note: "Per-title encryption keys (rights_id to titlekey mappings)"
source_ref: "src/core/crypto/key_manager.cpp:657"
- name: "console.keys"
required: false
path: "switch/console.keys"
path: "switch/"
mode: standalone
note: "Console-specific keys (BIS, SD seed)"
source_ref: "src/core/crypto/key_manager.cpp:658"
- name: "key_retail.bin"
required: false
path: "switch/key_retail.bin"
path: "switch/"
size: 160
mode: standalone
note: "Amiibo decryption keys (two InternalKey structs, 0x50 bytes each)"
source_ref: "src/core/hle/service/nfc/common/amiibo_crypto.cpp:273-294"
+6 -6
View File
@@ -227,12 +227,12 @@ files:
path: "GC/dsp_rom.bin"
description: "DSP instruction ROM"
size: 8192
validation: [size, adler32]
known_hash_adler32: ["0x66f334fe", "0xe789b5a5"]
validation: [size]
known_hash_adler32: "0x66f334fe"
adler32_byteswap: true
required: false
hle_fallback: true
source_ref: "Source/Core/Common/CommonPaths.h:145, Source/Core/Core/HW/DSPLLE/DSPLLE.cpp:87-105,109-118, Source/Core/Core/DSP/DSPCore.h:44, Source/Core/Core/DSP/DSPCore.cpp:36-38, Source/Core/Core/DSP/DSPCore.cpp:28-102"
source_ref: "Source/Core/Common/CommonPaths.h:145, Source/Core/Core/HW/DSPLLE/DSPLLE.cpp:87-105,109-118, Source/Core/Core/DSP/DSPCore.h:44, Source/Core/Core/DSP/DSPCore.cpp:36-38"
note: >
LoadDSPRom rejects any file whose length differs from DSP_IROM_BYTE_SIZE and
swaps every 16 bit word before storing it, so the Adler32 in the source is
@@ -245,12 +245,12 @@ files:
path: "GC/dsp_coef.bin"
description: "DSP coefficient ROM"
size: 4096
validation: [size, adler32]
known_hash_adler32: ["0xf3b93527", "0xa4a575f5"]
validation: [size]
known_hash_adler32: "0xf3b93527"
adler32_byteswap: true
required: false
hle_fallback: true
source_ref: "Source/Core/Common/CommonPaths.h:146, Source/Core/Core/HW/DSPLLE/DSPLLE.cpp:87-105,110-119, Source/Core/Core/DSP/DSPCore.h:58, Source/Core/Core/HW/DSPHLE/UCodes/AX.cpp:61-62, Source/Core/Core/DSP/DSPCore.cpp:28-102"
source_ref: "Source/Core/Common/CommonPaths.h:146, Source/Core/Core/HW/DSPLLE/DSPLLE.cpp:87-105,110-119, Source/Core/Core/DSP/DSPCore.h:58, Source/Core/Core/HW/DSPHLE/UCodes/AX.cpp:61-62"
note: >
Also read by the HLE AX ucode for polyphase resampling. Adler32 is taken over
the byte-swapped data (Source/Core/Core/HW/DSPLLE/DSPLLE.cpp:100-102).
+5 -5
View File
@@ -74,7 +74,7 @@ notes: |
Source: retrodep/embedded/*.c (embedded ROM tables),
vice/src/*/rom.h (ROM name defines), vice/src/drive/driverom.h (drive ROMs),
retrodep/ui.c:274-315 (JiffyDOS loading), retrodep/ui.c:258-271 (SCPU kernal),
libretro/libretro-core.c:2806-2871 (core options for JiffyDOS/SCPU)
libretro/libretro-core.c:2807-2872 (core options for JiffyDOS/SCPU)
files:
# -------------------------------------------------------
@@ -1082,7 +1082,7 @@ files:
hle_fallback: true
embedded: false
note: "SuperCPU DOS v1.40 external kernal. Optional, selected via core option. Goes in system/vice/SCPU64/."
source_ref: "retrodep/ui.c:266, libretro/libretro-core.c:2830"
source_ref: "retrodep/ui.c:266, libretro/libretro-core.c:2832"
- name: "vice/SCPU64/scpu-dos-2.04.bin"
system: commodore-c64
@@ -1090,7 +1090,7 @@ files:
hle_fallback: true
embedded: false
note: "SuperCPU DOS v2.04 external kernal. Optional, selected via core option. Goes in system/vice/SCPU64/."
source_ref: "retrodep/ui.c:263, libretro/libretro-core.c:2831"
source_ref: "retrodep/ui.c:263, libretro/libretro-core.c:2834"
# -------------------------------------------------------
# Drive ROMs (shared across all cores with True Drive Emulation)
@@ -1274,7 +1274,7 @@ files:
hle_fallback: true
embedded: false
note: "JiffyDOS C64 kernal replacement. Optional, proprietary. Requires True Drive Emulation + 1541/1571/1581 drive."
source_ref: "retrodep/ui.c:302, libretro/libretro-core.c:2859"
source_ref: "retrodep/ui.c:302, libretro/libretro-core.c:2862"
- name: "vice/JiffyDOS_SX-64.bin"
system: commodore-c64
@@ -1290,7 +1290,7 @@ files:
hle_fallback: true
embedded: false
note: "JiffyDOS C128 kernal replacement. Optional, proprietary. C128 core only."
source_ref: "retrodep/ui.c:309, libretro/libretro-core.c:2861"
source_ref: "retrodep/ui.c:309, libretro/libretro-core.c:2864"
- name: "vice/JiffyDOS_1541-II.bin"
system: commodore-c64
+3 -4
View File
@@ -112,11 +112,10 @@ files:
required: false
size: 131072
validation: [size]
sha1: "af643900fea84234e08b616a6d27f03f0a61db96"
md5: "6e844759720226e58d55ecaf33608a13"
crc32: "ae25bdf5"
aliases:
- boot.rom
description: "Model-M cart boot ROM, read when the BIOS type is Model M"
source_ref: "libretro.c:5358-5380, src/bios/jagbios_m.c:9"
source_ref: "libretro.c:5358-5380"
note: >-
Read from the system directory only, as jagboot_m.rom, and only when
biosType is BT_M_SERIES. A short read falls back to the embedded
+8 -4
View File
@@ -26,26 +26,30 @@ mode: standalone
files:
- name: "prod.keys"
required: true
path: "switch/prod.keys"
path: "switch/"
mode: standalone
note: "Production keys for NCA decryption (master, key area, header, titlekek)"
source_ref: "src/core/crypto/key_manager.cpp:655-656"
- name: "title.keys"
required: false
path: "switch/title.keys"
path: "switch/"
mode: standalone
note: "Per-title encryption keys (rights_id to titlekey mappings)"
source_ref: "src/core/crypto/key_manager.cpp:659-660"
- name: "console.keys"
required: false
path: "switch/console.keys"
path: "switch/"
mode: standalone
note: "Console-specific keys (BIS, SD seed)"
source_ref: "src/core/crypto/key_manager.cpp:661-662"
- name: "key_retail.bin"
required: false
path: "switch/key_retail.bin"
path: "switch/"
size: 160
mode: standalone
note: "Amiibo decryption keys (two InternalKey structs, 0x50 bytes each)"
source_ref: "src/core/hle/service/nfc/common/amiibo_crypto.cpp:273-294"
-109
View File
@@ -90,7 +90,6 @@ files:
# ============================================================
- name: "48.rom"
sha1: "5ea7c2b824672e914525d1d5c419d71b84a426a2"
size: 16384
validation: [size]
required: true
@@ -101,7 +100,6 @@ files:
note: "48K BASIC. Also loaded four times over as the TBBlue fast-boot image (src/cpu.c:3653-3662)."
- name: "48es.rom"
sha1: "9e535e2e24231ccb65e33d107f6d0ceb23e99477"
size: 16384
validation: [size]
required: true
@@ -111,7 +109,6 @@ files:
note: "Spanish 48K+ ROM, selected for MACHINE_ID_SPECTRUM_48_PLUS_SPA."
- name: "inves.rom"
sha1: "d020440638aff4d39467128413ef795677be9c23"
size: 16384
validation: [size]
required: true
@@ -121,7 +118,6 @@ files:
note: "Investronica Inves Spectrum+. Loaded at memoria_spectrum[65536] (src/cpu.c:3551-3557)."
- name: "128.rom"
sha1: "16375d42ea109b47edded7a16028de7fdb3013a1"
size: 32768
validation: [size]
required: true
@@ -130,7 +126,6 @@ files:
source_ref: "src/cpu.c:3312-3314, src/utils.c:4100"
- name: "128s.rom"
sha1: "57c0b6681224378ce1d279fde13d644478423783"
size: 32768
validation: [size]
required: true
@@ -139,7 +134,6 @@ files:
source_ref: "src/cpu.c:3316-3318, src/utils.c:4100"
- name: "p2.rom"
sha1: "8cafb292af58617907b9e6b9093d3588a75849b8"
size: 32768
validation: [size]
required: true
@@ -149,7 +143,6 @@ files:
note: "ZX Spectrum +2."
- name: "p2f.rom"
sha1: "8a5be00921afd4e2c74059c217b31b9fb51c3d41"
size: 32768
validation: [size]
required: true
@@ -158,7 +151,6 @@ files:
source_ref: "src/cpu.c:3327-3329, src/utils.c:4100"
- name: "p2s.rom"
sha1: "baca5d798b3e786078feded19486d9fc29dbd4b7"
size: 32768
validation: [size]
required: true
@@ -167,7 +159,6 @@ files:
source_ref: "src/cpu.c:3331-3333, src/utils.c:4100"
- name: "p2a40.rom"
sha1: "929bf1a5e5687ebd8d7245f9b513a596c0ec21a4"
size: 65536
validation: [size]
required: true
@@ -177,7 +168,6 @@ files:
note: "+2A/+3 ROM v4.0."
- name: "p2a41.rom"
sha1: "500c0945760abeefcbd08bc22c0d07b14b336cf0"
size: 65536
validation: [size]
required: true
@@ -187,7 +177,6 @@ files:
note: "+2A/+3 ROM v4.1."
- name: "p2as.rom"
sha1: "a4b311135ccbe010318dcb872dae2c8f078c7447"
size: 65536
validation: [size]
required: true
@@ -196,7 +185,6 @@ files:
source_ref: "src/cpu.c:3347-3350, src/utils.c:4102"
- name: "pentagon.rom"
sha1: "a584272f21dc82c14b7d4f1ed440e23a976e71f0"
size: 32768
validation: [size]
required: true
@@ -205,7 +193,6 @@ files:
source_ref: "src/cpu.c:3381-3383, src/utils.c:4100 (MACHINE_IS_SPECTRUM_128_P2 covers Pentagon, src/cpu.h:545)"
- name: "se.rom"
sha1: "14321f2092b8af21b52b35c1518d9a753d6618d4"
size: 32768
validation: [size]
required: true
@@ -215,7 +202,6 @@ files:
note: "Chloe 140SE/280SE, SE Basic IV."
- name: "chrome.rom"
sha1: "fb305656769765224c58ca02445d4bf041891d18"
size: 65536
validation: [size]
required: true
@@ -224,7 +210,6 @@ files:
source_ref: "src/cpu.c:3406-3408, src/utils.c:4112"
- name: "prism.rom"
sha1: "6e03d87f868c40d5662ef6906931c77ba1b8b2c2"
size: 327680
validation: [size]
required: true
@@ -234,7 +219,6 @@ files:
note: "20 pages of 16K. Page map documented at src/cpu.c:3622-3638."
- name: "prism_failsafe.rom"
sha1: "d020440638aff4d39467128413ef795677be9c23"
size: 16384
validation: [size]
required: true
@@ -244,7 +228,6 @@ files:
note: "Loaded straight after prism.rom by prism_load_failsafe_rom(). The only ROM whose absence is fatal: the loader calls cpu_panic both when the file is missing and when the read is not 16384 bytes."
- name: "zxuno_bootloader.rom"
sha1: "0afcb798128e6587e7ea0787714568f7b68be012"
size: 8126
required: true
bundled: true
@@ -253,7 +236,6 @@ files:
size_note: "Read caps at 8192 bytes and only errors when fewer than 1 byte is read, so no exact size check. get_rom_size returns 214 for ZX-Uno (src/utils.c:4104) but that value is unused on this path."
- name: "zxevo_tsconf.rom"
sha1: "2551026b7d63a2627f79701e26688a7d715dc96a"
size: 524288
validation: [size]
required: true
@@ -262,7 +244,6 @@ files:
source_ref: "src/cpu.c:3410-3412, src/utils.c:4114"
- name: "zxevo_baseconf.rom"
sha1: "1570048704f11dc239060ee4f63190d199c94987"
size: 524288
validation: [size]
required: true
@@ -276,7 +257,6 @@ files:
# ============================================================
- name: "tbblue_loader.rom"
sha1: "8b2e927d0523bc27bffcc34c39527ab0d2362e0c"
size: 8192
validation: [size]
required: true
@@ -286,7 +266,6 @@ files:
note: "FPGA loader, mirrored to 16K at src/cpu.c:3665. Bypassed when --tbblue-fast-boot-mode selects 48.rom instead."
- name: "tbblue.mmc"
sha1: "e838e1d63dc9c1e518a79195c9512042dffb765f"
size: 67108864
required: false
bundled: true
@@ -300,7 +279,6 @@ files:
# ============================================================
- name: "tk90x.rom"
sha1: "9a943a008be13194fb006bddffa7d22d2277813f"
size: 16384
validation: [size]
required: true
@@ -309,7 +287,6 @@ files:
source_ref: "src/cpu.c:3294-3296, src/utils.c:4098"
- name: "tk90xs.rom"
sha1: "a9421b9e3a17689b7392da1f72dc71dd46e09ab1"
size: 16384
validation: [size]
required: true
@@ -318,7 +295,6 @@ files:
source_ref: "src/cpu.c:3298-3300, src/utils.c:4098"
- name: "tk95.rom"
sha1: "94edc401d43b0e9a9cdc1d35de4b6462dc414ab3"
size: 16384
validation: [size]
required: true
@@ -327,7 +303,6 @@ files:
source_ref: "src/cpu.c:3302-3304, src/utils.c:4098"
- name: "tk95es.rom"
sha1: "54f3445374d1758a3133232672e8783cb4fc7a32"
size: 16384
validation: [size]
required: true
@@ -340,7 +315,6 @@ files:
# ============================================================
- name: "tc2048.rom"
sha1: "febb2d495b6eda7cdcb4074935d6e9d9f328972d"
size: 16384
validation: [size]
required: true
@@ -349,7 +323,6 @@ files:
source_ref: "src/cpu.c:3418-3420, src/utils.c:4098 (TC2048 falls under MACHINE_IS_SPECTRUM_16_48, src/cpu.h:543)"
- name: "ts2068.rom"
sha1: "34cd8113bf75b65a4da6eea355f9d46ad635f7e4"
size: 24576
validation: [size]
required: true
@@ -359,7 +332,6 @@ files:
note: "Read as two blocks: 16384 into the main ROM table, then 8192 into the EX ROM table. Serves TS2068 and TC2068."
- name: "ts1500.rom"
sha1: "3eb437359221b4406d236085ec66fa02278e7495"
size: 8192
validation: [size]
required: true
@@ -372,7 +344,6 @@ files:
# ============================================================
- name: "zx80.rom"
sha1: "b6769a3197c77009e0933e038c15b43cf4c98c7a"
size: [4096, 8192]
validation: [size]
required: true
@@ -382,7 +353,6 @@ files:
note: "Serves ZX80, TK80 and TK82. An 8192-byte file is accepted as-is so the ZX81 ROM can run on a ZX80 (src/cpu.c:3758)."
- name: "zx81.rom"
sha1: "7b143ee964e9ada89d1f9e88f0bd48d919184cfc"
size: 8192
validation: [size]
required: true
@@ -392,7 +362,6 @@ files:
note: "Serves ZX81, Timex TS1000, TK82C, TK83 and the Czerweny CZ 1000/1500 models."
- name: "tk85.rom"
sha1: "7b961a1733fc047eb682150a32e17bca10a018d2"
size: 10240
validation: [size]
required: true
@@ -402,7 +371,6 @@ files:
note: "The TK85 test precedes the generic ZX81 test in get_rom_size, so 10240 wins over 8192."
- name: "zxpand_zx81.rom"
sha1: "3bdbf55720cf9623431a4d4017fa8f165aac4a66"
size: 8192
validation: [size]
required: false
@@ -412,7 +380,6 @@ files:
note: "ZXpand interface firmware. A short read disables ZXpand emulation."
- name: "zxpand_zx80.rom"
sha1: "8968261beab240e8a06e8cfe9e070987d860064b"
size: 8192
validation: [size]
required: false
@@ -421,7 +388,6 @@ files:
source_ref: "src/storage/zxpand.c:72, src/storage/zxpand.c:240, src/storage/zxpand.c:246-254"
- name: "ace.rom"
sha1: "597ba8a15a292688333c84dc9fd35172abe5e7e6"
size: 8192
validation: [size]
required: true
@@ -434,7 +400,6 @@ files:
# ============================================================
- name: "ql_js.rom"
sha1: "6e1e3cae275d0cd58977258c0b13480c8e910138"
size: 49152
min_size: 16384
validation: [size]
@@ -445,7 +410,6 @@ files:
size_note: "Reads up to 131072 bytes and errors only below 16384, so the check is a minimum rather than an exact size."
- name: "ql_jm.rom"
sha1: "6a8468dcdb27dc1b194febba8c957c4ef4313538"
size: 49152
required: false
bundled: true
@@ -454,7 +418,6 @@ files:
note: "JM release. Reachable through --romfile; the switch selects ql_js.rom."
- name: "tkii220.rom"
sha1: "f364472a81352479290e388e9a5afb57a0de8249"
size: 16384
required: false
bundled: true
@@ -463,7 +426,6 @@ files:
note: "QJUMP Toolkit II 2.20, the ROM ql.c names as the example for --ql-rom-c000-file. ql_load_extra_roms() runs after the system ROM and reads 16K into memoria_ql at 0xC000 from the path the option gives; the read count is not checked."
- name: "qsound_V1.94.rom"
sha1: "622a81dce98524148f067780c17eddbaf46e27f6"
aliases: ["Qsound_V1.94.rom"]
size: 8192
required: false
@@ -473,7 +435,6 @@ files:
note: "QL Qsound firmware, read into memoria_ql at 0xC0000 once --ql-qsound-enabled is set; the read count is not checked and --ql-qsound-rom points the loader at another file. QSOUND_ROM_FILE is spelled qsound_V1.94.rom while the shipped file is Qsound_V1.94.rom, so the default only resolves on a case-insensitive filesystem."
- name: "Z88OZ47.rom"
sha1: "35e528e81d8f4e5860adf4160a3da0926525c8fa"
size: 524288
required: true
bundled: true
@@ -482,7 +443,6 @@ files:
size_note: "Reads up to 512K and errors only when nothing is read; z88_internal_rom_size is derived from the byte count, so any size is accepted."
- name: "mk14.rom"
sha1: "802dc637ce5391a2a6627f76f919b12a869b56ef"
size: 512
validation: [size]
required: true
@@ -495,7 +455,6 @@ files:
# ============================================================
- name: "cpc464.rom"
sha1: "56d39c463da60968d93e58b4ba0e675829412a20"
size: 32768
validation: [size]
required: true
@@ -505,7 +464,6 @@ files:
note: "Serves CPC 464 and CPC 4128."
- name: "cpc664.rom"
sha1: "4a38f7f5bf7fd0a95cf882433c69e67251a46868"
size: 49152
validation: [size]
required: true
@@ -514,7 +472,6 @@ files:
source_ref: "src/cpu.c:3476-3478, src/utils.c:4142"
- name: "cpc6128.rom"
sha1: "29dd0487dc5a96cd00966d074de8700ddd4ee18b"
size: 49152
validation: [size]
required: true
@@ -523,7 +480,6 @@ files:
source_ref: "src/cpu.c:3480-3482, src/utils.c:4142"
- name: "pcw_boot.rom"
sha1: "245a173cfc7976a4cae8d255f3d1422aeaf5f09a"
size: 275
validation: [size]
required: true
@@ -533,7 +489,6 @@ files:
note: "Boot block the PCW pulls into RAM rather than a mapped ROM (src/cpu.c:3849). Serves PCW 8256 and 8512."
- name: "pcw_8x_boot1.dsk"
sha1: "3be724b3bfa01d03931463b8501ffb5c3f3621b7"
size: 194864
required: false
bundled: true
@@ -542,7 +497,6 @@ files:
note: "LocoScript boot disc, inserted by pcw_boot_locoscript()."
- name: "pcw_8x_boot2.dsk"
sha1: "4c13bba076897076322b375e34f87306640cf0d6"
size: 194864
required: false
bundled: true
@@ -555,7 +509,6 @@ files:
# ============================================================
- name: "samcoupe.rom"
sha1: "c86601633fb61a8c517f7657aad9af4e6870f2ee"
size: 32768
validation: [size]
required: true
@@ -564,7 +517,6 @@ files:
source_ref: "src/cpu.c:3484-3487, src/utils.c:4144"
- name: "atomlite.rom"
sha1: "b2303b7200f5a17b54b841af9f0604db7bbdd1ab"
size: 32768
validation: [size]
required: false
@@ -574,7 +526,6 @@ files:
note: "Replaces samcoupe.rom when Atom Lite emulation is on."
- name: "samram.rom"
sha1: "acac00b8b342d19ce9bb35a8744a9c0060d5eedd"
size: 32768
validation: [size]
required: false
@@ -584,7 +535,6 @@ files:
note: "SamRam interface firmware, opened from a path the user selects."
- name: "samram_eng.rom"
sha1: "5344ee16523862fa66e9397d1f8cfa2b2cbaf341"
size: 32768
validation: [size]
required: false
@@ -598,7 +548,6 @@ files:
# ============================================================
- name: "coleco.rom"
sha1: "99ba9be24ada3e86e5c17aeecb7a2d68c5edfe59"
size: 8192
validation: [size]
required: true
@@ -607,7 +556,6 @@ files:
source_ref: "src/cpu.c:3385-3387, src/utils.c:4120"
- name: "sg1000.rom"
sha1: "fdea3168fda81e5f25f7dee3a7231192a492836e"
size: 155
required: true
bundled: true
@@ -616,7 +564,6 @@ files:
size_note: "Nothing is read from this file. The SG-1000 branch is empty and the source comment states the file only has to exist for the open to succeed."
- name: "sms.rom"
sha1: "c315672807d8ddb8d91443729405c766dd95cae7"
size: 8192
validation: [size]
required: true
@@ -625,7 +572,6 @@ files:
source_ref: "src/cpu.c:3393-3395, src/utils.c:4124"
- name: "msx.rom"
sha1: "e998f0c441f4f1800ef44e42cd1659150206cf79"
size: 32768
validation: [size]
required: true
@@ -634,7 +580,6 @@ files:
source_ref: "src/cpu.c:3397-3399, src/utils.c:4126"
- name: "svi.rom"
sha1: "7d8daf52f78371ca2c9443e04827c8e1f98c8f2c"
size: 32768
validation: [size]
required: true
@@ -648,7 +593,6 @@ files:
# ============================================================
- name: "esxmmc085.rom"
sha1: "aa4c31dc9b08d80d0107b580d5a9216d23214776"
size: 8192
validation: [size]
required: false
@@ -658,7 +602,6 @@ files:
note: "divMMC esxdos firmware, the default when --divmmc-rom is unset. Needed by --enable-esxdos-handler, which the ES-DE zxnext command line sets."
- name: "esxide085.rom"
sha1: "178bae9e9209c43282e12c09884562e4ddf07e68"
size: 8192
validation: [size]
required: false
@@ -668,7 +611,6 @@ files:
note: "divIDE esxdos firmware, the default when --divide-rom is unset."
- name: "unodos3.rom"
sha1: "cdb90bd05b073ec7a5f875444e29ab0f6bcee9ac"
size: 8192
validation: [size]
required: false
@@ -678,7 +620,6 @@ files:
note: "divMMC firmware substituted for esxmmc085.rom on Chloe machines."
- name: "trdos.rom"
sha1: "0a74bd34538a03d0e1d214b425d95c14ad10c8c4"
size: 16384
validation: [size]
required: false
@@ -688,7 +629,6 @@ files:
note: "Beta Disk / TR-DOS firmware."
- name: "if1-v1.rom"
sha1: "4ffd9ed9c00cdc6f92ce69fdd8b618ef1203f48e"
size: [8192, 16384]
validation: [size]
required: false
@@ -698,7 +638,6 @@ files:
note: "Interface 1 firmware version 1, selected when if1_rom_version is 1. The load accepts 8192 or 16384 bytes and disables Interface 1 emulation otherwise."
- name: "if1-v2.rom"
sha1: "5cfb6bca4177c45fefd571734576b55e3a127c08"
size: [8192, 16384]
validation: [size]
required: false
@@ -708,7 +647,6 @@ files:
note: "Interface 1 firmware version 2, the default branch of if1_return_rom_name()."
- name: "hilow_datadrive.rom"
sha1: "fd3f165860c2564847805cfa7a7f769a627a687c"
size: 8192
validation: [size]
required: false
@@ -718,7 +656,6 @@ files:
note: "HiLow Data Drive firmware."
- name: "zxmmcplus.flash"
sha1: "9f0697c261c37e92bf2e488e3db223443c341b9d"
size: 1048576
validation: [size]
required: false
@@ -729,7 +666,6 @@ files:
size_note: "The image holds ROM and RAM together, so the check is ZXMMCPLUS_FLASHROM_SIZE + ZXMMCPLUS_RAM_SIZE, not the 512K ROM constant alone."
- name: "zxuno.flash"
sha1: "bb6740f15b5ed8d1d60f7f61f0737f769215ca57"
size: 4194304
validation: [size]
required: false
@@ -743,7 +679,6 @@ files:
# ============================================================
- name: "mf1.rom"
sha1: "ba28754a3cc31a4ca579829ed4310c313409cf5d"
size: 8192
validation: [size]
required: false
@@ -753,7 +688,6 @@ files:
note: "Multiface One. The file selector rejects anything that is not exactly 8 KB."
- name: "mf128.rom"
sha1: "f03f4ecbcf4a654f4775d16bda0d4cc47f884379"
size: 8192
validation: [size]
required: false
@@ -763,7 +697,6 @@ files:
note: "Multiface 128."
- name: "mf3.rom"
sha1: "5d74d2e2e5a537639da92ff120f8a6d86f474495"
size: 8192
validation: [size]
required: false
@@ -773,7 +706,6 @@ files:
note: "Multiface 3."
- name: "specmate.rom"
sha1: "c8f128610eeb5142d4d80f28e5dd07b7a5ab6b84"
size: 8192
validation: [size]
required: false
@@ -782,7 +714,6 @@ files:
source_ref: "src/copy_interfaces/specmate.h:27, src/copy_interfaces/specmate.h:29, src/copy_interfaces/specmate.c:189-205"
- name: "phoenix3.rom"
sha1: "d4f01500e0383a1cf34683fb30d96230c14c7da3"
size: 16384
validation: [size]
required: false
@@ -791,7 +722,6 @@ files:
source_ref: "src/copy_interfaces/phoenix.h:27, src/copy_interfaces/phoenix.h:29, src/copy_interfaces/phoenix.c:142"
- name: "defcon.rom"
sha1: "4c7d702e295a3383326606b805eab74affc501ba"
size: 16384
validation: [size]
required: false
@@ -800,7 +730,6 @@ files:
source_ref: "src/copy_interfaces/defcon.h:27, src/copy_interfaces/defcon.h:29, src/copy_interfaces/defcon.c:139"
- name: "dinamid3.rom"
sha1: "9ee4ca7abee12ba6fb34aede2185f6aa3cb2800b"
size: 2048
validation: [size]
required: false
@@ -809,7 +738,6 @@ files:
source_ref: "src/copy_interfaces/dinamid3.h:27, src/copy_interfaces/dinamid3.h:29, src/copy_interfaces/dinamid3.c:142"
- name: "interface007.rom"
sha1: "81af60ecd412854069227487417eb80b6c89934d"
size: 2048
validation: [size]
required: false
@@ -818,7 +746,6 @@ files:
source_ref: "src/copy_interfaces/interface007.h:27, src/copy_interfaces/interface007.h:29, src/copy_interfaces/interface007.c:143"
- name: "ramjet2.rom"
sha1: "a3852ee24ab57e0e1d800c9d99cd244f7363449b"
size: 16384
validation: [size]
required: false
@@ -827,7 +754,6 @@ files:
source_ref: "src/copy_interfaces/ramjet.h:27, src/copy_interfaces/ramjet.h:28-30, src/copy_interfaces/ramjet.c:165"
- name: "ramjet3.rom"
sha1: "362589adb01ebbf006a162e76062921c03ceb26e"
size: 16384
validation: [size]
required: false
@@ -836,7 +762,6 @@ files:
source_ref: "src/copy_interfaces/ramjet.h:28, src/copy_interfaces/ramjet.c:165"
- name: "transtape2.rom"
sha1: "45d3e32d58b1c405b75ee72d80153dd0305bbd9d"
size: 16384
validation: [size]
required: false
@@ -846,7 +771,6 @@ files:
note: "Selected when transtape_version is 2."
- name: "transtape3-vC.rom"
sha1: "b7ec72fa0a55243a53c55d649e0555acea25d0c1"
size: 16384
validation: [size]
required: false
@@ -856,7 +780,6 @@ files:
note: "Default for Transtape version 3."
- name: "transtape3-vA.rom"
sha1: "c627527551e441a000184565a72df8ff37fce891"
size: 16384
validation: [size]
required: false
@@ -866,7 +789,6 @@ files:
note: "Revision A, reached through the user-set transtape_rom_filename and loaded by the same size-checked path as the defaults."
- name: "transtape3-vB.rom"
sha1: "82bf848bac698d1ffd9ca809c4293f004152645a"
size: 16384
validation: [size]
required: false
@@ -876,7 +798,6 @@ files:
note: "Revision B, reached through the user-set transtape_rom_filename."
- name: "hilow_barbanegra.rom"
sha1: "3b3862943758ad35f340537b742ca25a8286267a"
size: 8192
validation: [size]
required: false
@@ -885,7 +806,6 @@ files:
source_ref: "src/copy_interfaces/hilow_barbanegra.h:27, src/copy_interfaces/hilow_barbanegra.h:30, src/copy_interfaces/hilow_barbanegra.c:282"
- name: "mhpokeador.rom"
sha1: "557f91755ede646a89e1146904a6d713f38d6b05"
size: 1024
validation: [size]
required: false
@@ -894,7 +814,6 @@ files:
source_ref: "src/copy_interfaces/mhpokeador.h:27, src/copy_interfaces/mhpokeador.h:39, src/copy_interfaces/mhpokeador.c:264"
- name: "mhpokeador-transfer.rom"
sha1: "4099c5d8f65a25bc0053e5730b7c40a29bcfb614"
size: 1024
validation: [size]
required: false
@@ -903,7 +822,6 @@ files:
source_ref: "src/copy_interfaces/mhpokeador.h:28, src/copy_interfaces/mhpokeador.c:264"
- name: "mhpokeador-salvapan.rom"
sha1: "4e438541ec2da0c3b9cf2cbf0cc3f5bc6cfb295e"
size: 1024
validation: [size]
required: false
@@ -912,7 +830,6 @@ files:
source_ref: "src/copy_interfaces/mhpokeador.h:29, src/copy_interfaces/mhpokeador.c:264"
- name: "mantransfev3.bin"
sha1: "e134a38468ed84d53df164d97fa24990aa557da3"
size: 200
required: false
bundled: true
@@ -925,7 +842,6 @@ files:
# ============================================================
- name: "gs105a.rom"
sha1: "1ba78923dc7d803e7995c165992e14e4608c2153"
size: 32768
validation: [size]
required: false
@@ -935,7 +851,6 @@ files:
note: "General Sound firmware v1.05a. GS_ROM_SIZE is in KB and the read is GS_ROM_SIZE*1024."
- name: "gs104.rom"
sha1: "c865121306eb3a7d811d82fbcc653b4dc1d6fa3d"
size: 32768
required: false
bundled: true
@@ -949,7 +864,6 @@ files:
# ============================================================
- name: "80-lec.rom"
sha1: "bb7a77d66e95d2e28ebb610e543c065e0d428619"
size: 16384
required: false
bundled: true
@@ -957,7 +871,6 @@ files:
source_ref: "src/start.c:4876-4880, src/cpu.c:3520-3523"
- name: "tk90x_v1br.rom"
sha1: "eab2eab803d8ec717b55a915de3bcb931b410a2f"
size: 16384
required: false
bundled: true
@@ -965,7 +878,6 @@ files:
source_ref: "src/ALTERNATEROMS:97, src/start.c:4876-4880, src/cpu.c:3520-3523"
- name: "tk90x_v2es.rom"
sha1: "a9af9c4d38882e2bd85086fc0c2d8d9afe90afad"
size: 16384
required: false
bundled: true
@@ -974,7 +886,6 @@ files:
note: "Corrected TK90X ROM."
- name: "tk95es_modif.rom"
sha1: "1dd39ee98e236389467e91a86cf5d8ed52583ba5"
size: 16384
required: false
bundled: true
@@ -983,7 +894,6 @@ files:
note: "TK95 Spanish ROM with message and symbol fixes by Rodolfo Edison Guerra."
- name: "Z88OZ431.rom"
sha1: "82e12674ba91eb85d4904c3948e4167aea6fd1b7"
size: 524288
required: false
bundled: true
@@ -991,7 +901,6 @@ files:
source_ref: "src/ALTERNATEROMS:83-92, src/start.c:4876-4880"
- name: "Z88OZ441.rom"
sha1: "778d188c201bd9eb6bf795e0cc8344a87600cd45"
size: 524288
required: false
bundled: true
@@ -999,7 +908,6 @@ files:
source_ref: "src/ALTERNATEROMS:83-92, src/start.c:4876-4880"
- name: "Z88OZ45.rom"
sha1: "aecf46de3563c6c6443e9780d633d7b7507e79ef"
size: 524288
required: false
bundled: true
@@ -1007,7 +915,6 @@ files:
source_ref: "src/ALTERNATEROMS:83-92, src/start.c:4876-4880"
- name: "Z88OZ46.rom"
sha1: "9e0e29baa3720abcbb8006cda8f19ea365faf20e"
size: 524288
required: false
bundled: true
@@ -1015,7 +922,6 @@ files:
source_ref: "src/ALTERNATEROMS:83-92, src/start.c:4876-4880"
- name: "Z88UK220.rom"
sha1: "5d89e8d98d2cc0acb8cd42dbfca601b7bd09c51e"
size: 131072
required: false
bundled: true
@@ -1023,7 +929,6 @@ files:
source_ref: "src/ALTERNATEROMS:83-92, src/start.c:4876-4880"
- name: "Z88UK300.rom"
sha1: "ceb688025b79454cf229cae4dbd0449df2747f79"
size: 131072
required: false
bundled: true
@@ -1031,7 +936,6 @@ files:
source_ref: "src/ALTERNATEROMS:83-92, src/start.c:4876-4880"
- name: "Z88UK400.rom"
sha1: "23c63ceced72d0a9031cba08d2ebc72ca336921d"
size: 131072
required: false
bundled: true
@@ -1040,7 +944,6 @@ files:
- name: "aszmice07.rom"
path: "alternate_roms/aszmice07.rom"
sha1: "7a37a248572689c8ac226c082b7026972d399b1c"
size: 8192
required: false
bundled: true
@@ -1050,7 +953,6 @@ files:
- name: "sp-rom.rom"
path: "alternate_roms/sp-rom.rom"
sha1: "ef4b575b5b5cc18a3e6c71c241c65aa18957e2d5"
size: 4096
required: false
bundled: true
@@ -1060,7 +962,6 @@ files:
- name: "ace.rom"
path: "alternate_roms/ace.rom"
sha1: "6e5c9416a1cc89fe4012627f496f71ff2bb07b81"
size: 8192
required: false
bundled: true
@@ -1071,7 +972,6 @@ files:
- name: "opense.rom"
path: "alternate_roms/opense.rom"
sha1: "24a339c5c163a687a8fed50f93714c6450e2562d"
size: 16384
required: false
bundled: true
@@ -1081,7 +981,6 @@ files:
- name: "sebasic4_rom1.rom"
path: "alternate_roms/sebasic4_rom1.rom"
sha1: "d7092d6d55ee8280057399362b5798d1f65d8eeb"
size: 16384
required: false
bundled: true
@@ -1091,7 +990,6 @@ files:
- name: "derby_p_32K.rom"
path: "alternate_roms/derby_p_32K.rom"
sha1: "f9c337782f9a4781548528841babd5bd13f2b745"
size: 32768
required: false
bundled: true
@@ -1101,7 +999,6 @@ files:
- name: "derby_pp_64K.rom"
path: "alternate_roms/derby_pp_64K.rom"
sha1: "7eaaf1ff19f74d5449033bacce9834d7b13022a9"
size: 65536
required: false
bundled: true
@@ -1111,7 +1008,6 @@ files:
- name: "plus2c.rom"
path: "alternate_roms/plus2c.rom"
sha1: "98effb0e2dc4ecf6e9f70be9828a688341396c0c"
size: 32768
required: false
bundled: true
@@ -1121,7 +1017,6 @@ files:
- name: "plus2b.rom"
path: "alternate_roms/plus2b.rom"
sha1: "420d8f1cd7bd75a79803eaa49e191d90cfd24f38"
size: 65536
required: false
bundled: true
@@ -1131,7 +1026,6 @@ files:
- name: "plus3e_mmcen3eE.rom"
path: "alternate_roms/plus3e_mmcen3eE.rom"
sha1: "a579f9c3571669294dad37b04dcb889a9c147d94"
size: 65536
required: false
bundled: true
@@ -1141,7 +1035,6 @@ files:
- name: "plus3e_mmces3eE.rom"
path: "alternate_roms/plus3e_mmces3eE.rom"
sha1: "44e98a3dfc966f7c8725c252487a44a2c0b450d6"
size: 65536
required: false
bundled: true
@@ -1151,7 +1044,6 @@ files:
- name: "plus3e_sm8en3eE.rom"
path: "alternate_roms/plus3e_sm8en3eE.rom"
sha1: "89b6227798a88a6ad0e3b9e58db979694912ee04"
size: 65536
required: false
bundled: true
@@ -1161,7 +1053,6 @@ files:
- name: "plus3e_sm8es3eE.rom"
path: "alternate_roms/plus3e_sm8es3eE.rom"
sha1: "a5b62b647ccaec4af9989b8fd7857d5f6426ae5d"
size: 65536
required: false
bundled: true
+1 -1
View File
@@ -8,7 +8,7 @@ param(
$ErrorActionPreference = "Stop"
$defaultInstallUrl = "https://raw.githubusercontent.com/Abdess/retrobios/main/install.py"
$defaultInstallSha256 = "d5f352fbe34cfd8ae40c0980c3986158ec1d9dd1babfe2bbc0918ffc0fa0bdf0"
$defaultInstallSha256 = "42b1747ae867d41da39b11daf783c0106daa6ed18861a2214c196f3a5c9a3c60"
$maximumInstallerBytes = 2MB
$installer = if ($PSScriptRoot) { Join-Path $PSScriptRoot "install.py" } else { $null }
$temporary = $null
+19 -578
View File
@@ -10,7 +10,6 @@ Usage:
python install.py --platform retroarch --dest ~/custom/bios
python install.py --check
python install.py --list-platforms
python install.py --platform retroarch --system sony-playstation --region us
"""
from __future__ import annotations
@@ -82,59 +81,9 @@ MAX_TARGETS_BYTES = 4 * 1024 * 1024
MAX_MANIFEST_FILES = 100_000
MAX_DOWNLOAD_SIZE = 1024 * 1024 * 1024
MAX_TOTAL_DOWNLOAD_SIZE = 64 * 1024 * 1024 * 1024
# Why a manifest leaves a file out, as the installer words it. The manifest
# schema and the generator are held to this list by the tests.
OMISSION_REASONS = {
"hash_mismatch": "hash mismatch",
"not_found": "not found",
"external": "external",
"user_provided": "user provided",
"no_platform_slug": "no platform folder",
}
_SHA1_RE = re.compile(r"^[0-9a-fA-F]{40}$")
_SHA256_RE = re.compile(r"^[0-9a-fA-F]{64}$")
# The region vocabulary of scripts/region.py, which this file cannot import.
# A test holds the two copies equal.
WORLD_REGION = "world"
REGION_TREE: dict[str, frozenset] = {
"north-america": frozenset({"canada"}),
"latin-america": frozenset({"brazil", "mexico", "argentina"}),
"europe": frozenset({
"uk", "france", "germany", "italy", "spain", "netherlands", "portugal",
"greece", "poland", "russia", "sweden", "norway", "denmark", "finland",
}),
"asia": frozenset({
"japan", "south-korea", "china", "taiwan", "hong-kong", "singapore",
"india", "asia-ntsc", "asia-pal",
}),
"oceania": frozenset({"australia", "new-zealand"}),
}
REGION_ALIASES: dict[str, str] = {
"jp": "japan",
"ntsc-j": "japan",
"us": "north-america",
"usa": "north-america",
"na": "north-america",
"ntsc-u": "north-america",
"eu": "europe",
"pal": "europe",
"kr": "south-korea",
"korea": "south-korea",
"auto": WORLD_REGION,
"gb": "uk",
}
_REGION_PARENT = {
member: parent for parent, members in REGION_TREE.items() for member in members
}
REGIONS = frozenset({WORLD_REGION} | set(REGION_TREE) | set(_REGION_PARENT))
MAX_SELECTION_TAGS = 1000
SELECTION_FIELDS = ("systems", "regions", "region_groups", "region_system_groups")
# The files cores load for systems the platform does not list (game engines,
# computers): no system of the platform owns them, and choosing systems
# leaves them out unless this name is chosen too.
OTHER_SYSTEMS = "other"
# Platforms with a manifest in install/. Manifest URLs are case sensitive,
# so user input is normalized against this list before any fetch.
AVAILABLE_PLATFORMS = (
@@ -154,36 +103,8 @@ DEFAULT_DESTS = {
"rocknix": Path("/storage/roms/bios"),
"misterfpga": Path("/media/fat/games"),
"retropie": Path.home() / "RetroPie" / "BIOS",
"romm": Path("/romm/library/bios"),
}
def _os_default_dests(os_type: str) -> dict[str, Path]:
"""Where a platform keeps its BIOS on this OS, when it is not detected.
The same folders the platform's detection looks for: a platform named on
the command line but not found must not land in ~/bios, which none of
them reads.
"""
home = Path.home()
if os_type == "windows":
profile = Path(os.environ.get("USERPROFILE", str(home)))
appdata = Path(os.environ.get("APPDATA", str(home / "AppData" / "Roaming")))
return {
"retroarch": appdata / "RetroArch" / "system",
# RetroBat's installer defaults to C:\RetroBat (installer.iss).
"retrobat": Path("C:/RetroBat/bios"),
"bizhawk": profile / "BizHawk" / "Firmware",
}
if os_type == "darwin":
return {
"retroarch": home / "Library" / "Application Support" / "RetroArch" / "system",
}
return {
"retroarch": home / ".config" / "retroarch" / "system",
"bizhawk": home / ".config" / "BizHawk" / "Firmware",
}
# Set when the run is interrupted, so queued downloads end instead of draining
# the pool: every future is submitted before the first one completes.
_stop = threading.Event()
@@ -855,19 +776,6 @@ def _destination_path(root: Path, value: object) -> Path:
return root.resolve() / Path(*relative.parts)
def _check_tags(entry: dict, field: str, where: str) -> None:
"""A selection field is absent or a short list of short strings."""
value = entry.get(field)
if value is None:
return
if (
not isinstance(value, list)
or len(value) > MAX_SELECTION_TAGS
or not all(isinstance(tag, str) and 0 < len(tag) <= 256 for tag in value)
):
raise ValueError(f"invalid {field} for {where}")
def _validate_manifest(data: object, plat: str) -> dict:
"""Validate the untrusted install-manifest boundary using stdlib only."""
if not isinstance(data, dict):
@@ -926,8 +834,6 @@ def _validate_manifest(data: object, plat: str) -> dict:
not isinstance(cores, list) or not all(isinstance(core, str) for core in cores)
):
raise ValueError(f"invalid cores list for {dest}")
for field in SELECTION_FIELDS:
_check_tags(entry, field, dest)
declared_total_files = data.get("total_files")
if declared_total_files is not None and declared_total_files != len(files):
@@ -940,6 +846,9 @@ def _validate_manifest(data: object, plat: str) -> dict:
if not isinstance(omitted, list) or len(omitted) > MAX_MANIFEST_FILES:
raise ValueError("invalid omitted_files list")
seen_omitted: set[str] = set()
allowed_omission_reasons = {
"hash_mismatch", "not_found", "external", "user_provided"
}
for index, entry in enumerate(omitted):
if not isinstance(entry, dict):
raise ValueError(f"omitted_files[{index}] must be an object")
@@ -957,7 +866,7 @@ def _validate_manifest(data: object, plat: str) -> dict:
raise ValueError(f"invalid omitted system for {dest}")
if not isinstance(entry.get("required"), bool):
raise ValueError(f"invalid omitted required flag for {dest}")
if entry.get("reason") not in OMISSION_REASONS:
if entry.get("reason") not in allowed_omission_reasons:
raise ValueError(f"invalid omission reason for {dest}")
cores = entry.get("cores")
if cores is not None and (
@@ -965,8 +874,6 @@ def _validate_manifest(data: object, plat: str) -> dict:
or not all(isinstance(core, str) for core in cores)
):
raise ValueError(f"invalid omitted cores list for {dest}")
for field in SELECTION_FIELDS:
_check_tags(entry, field, dest)
declared_total_omitted = data.get("total_omitted")
if (
declared_total_omitted is not None
@@ -980,24 +887,6 @@ def _validate_manifest(data: object, plat: str) -> dict:
for index, entry in enumerate(copies):
if not isinstance(entry, dict):
raise ValueError(f"standalone_copies[{index}] must be an object")
# The shape do_standalone_copies reads, checked here: a note with a
# list for detect, a copy naming neither file nor pattern, or a list
# for emulator passed and crashed the copy step after the download.
where = f"standalone_copies[{index}]"
if "note" in entry:
detect = entry.get("detect", {})
if not isinstance(entry["note"], str) or not isinstance(detect, dict):
raise ValueError(f"invalid note entry at {where}")
for values in detect.values():
if not isinstance(values, list) or not all(
isinstance(value, str) for value in values
):
raise ValueError(f"invalid note entry at {where}")
continue
if "file" not in entry and "pattern" not in entry:
raise ValueError(f"{where} names neither a file nor a pattern")
if not isinstance(entry.get("emulator", ""), str):
raise ValueError(f"invalid emulator at {where}")
if "file" in entry:
_safe_relative_path(
entry["file"], f"standalone_copies[{index}].file"
@@ -1101,228 +990,6 @@ def _filter_by_target(
return result
def canonical_region(raw: str) -> str:
"""One region name or alias, spelled the way manifests spell it."""
key = raw.strip().lower()
key = REGION_ALIASES.get(key, key)
if key not in REGIONS:
raise ValueError(f"unknown region: {raw.strip()}")
return key
def _region_comparable(a: str, b: str) -> bool:
return a == b or _REGION_PARENT.get(a) == b or _REGION_PARENT.get(b) == a
def _region_rank(file_regions: set[str], requested: list[str]) -> int:
for index, wanted in enumerate(requested):
if any(_region_comparable(wanted, region) for region in file_regions):
return index
return len(requested)
def region_drops(
entries: list[dict], requested: list[str], systems: list[str] | None = None
) -> set[str]:
"""Destinations a region priority list withdraws.
The pack builder's rule (region.resolve_region_drops), replayed over the
groups the manifest records. Per group, the best-ranked regional file
stays; a world file beats unmatched regional ones the code does not search
before it (`priority`, lower first); when nothing matches and no world
file exists, every regional file stays, so a group is never emptied. A file with no region never competes and always stays.
A core extra competes whatever systems are chosen; a platform's own
declaration competes only when its system is kept, as in the pack.
"""
if not requested:
return set()
kept_systems = set(systems) if systems else None
groups: dict[str, list[tuple[set, str, object]]] = {}
for entry in entries:
regions = entry.get("regions")
if not regions:
continue
joined = list(entry.get("region_groups") or [])
joined += [
group for group in entry.get("region_system_groups") or []
if kept_systems is None or group in kept_systems
]
priority = entry.get("priority")
if not isinstance(priority, int) or isinstance(priority, bool):
priority = None
for group in joined:
groups.setdefault(group, []).append((set(regions), entry["dest"], priority))
keep: set[str] = set()
drop: set[str] = set()
for members in groups.values():
world = {dest for regions, dest, _p in members if WORLD_REGION in regions}
ranks = {dest: priority for _regions, dest, priority in members}
regional = [
(_region_rank(regions, requested), dest)
for regions, dest, _p in members
if WORLD_REGION not in regions
]
keep |= world
if not regional:
continue
matched = [(rank, dest) for rank, dest in regional if rank < len(requested)]
if matched:
best = min(rank for rank, _dest in matched)
keep |= {dest for rank, dest in matched if rank == best}
drop |= {dest for _rank, dest in regional}
elif world:
world_ranks = [ranks[dest] for dest in world]
best_world = min(world_ranks) if None not in world_ranks else None
for _rank, dest in regional:
ours = ranks[dest]
if best_world is not None and ours is not None and ours < best_world:
keep.add(dest)
else:
drop.add(dest)
else:
keep |= {dest for _rank, dest in regional}
return drop - keep
def entry_systems(entry: dict) -> list[str]:
"""The platform systems a file or an omission belongs to.
An omission's `system` is spelled the way its profile spells it; only
`systems` names the platform's own, the ones --system accepts.
"""
return list(entry.get("systems") or [])
def narrow(
files: list[dict],
omitted: list[dict],
systems: list[str],
cores: list[str],
regions: list[str],
) -> tuple[list[dict], list[dict]]:
"""Keep what the chosen systems, cores and regions need.
A core choice keeps the platform's own list and narrows only the files
cores load, the rule --target already follows. Regions are then decided
the way the pack builder decides them under --system: over the chosen
systems' declarations and every core extra. The system filter comes last.
"""
if cores:
files = _filter_by_target(files, cores)
omitted = _filter_by_target(omitted, cores)
if regions:
dropped = region_drops(files + omitted, regions, systems)
files = [f for f in files if f["dest"] not in dropped]
omitted = [o for o in omitted if o["dest"] not in dropped]
if systems:
wanted = set(systems)
files = [f for f in files if _chosen(f, wanted)]
omitted = [o for o in omitted if _chosen(o, wanted)]
return files, omitted
def _chosen(entry: dict, wanted: set[str]) -> bool:
systems = entry_systems(entry)
if not systems:
return OTHER_SYSTEMS in wanted
return bool(wanted & set(systems))
def records_selection(files: list[dict]) -> bool:
"""Whether a manifest carries what narrowing reads; older ones do not."""
return any("systems" in entry for entry in files)
def available_choices(files: list[dict], omitted: list[dict]) -> dict[str, list[str]]:
"""The systems, cores and regions a manifest lets one narrow to."""
systems = {s for e in files + omitted for s in entry_systems(e)}
ordered = sorted(systems)
if any(not entry_systems(f) for f in files):
ordered.append(OTHER_SYSTEMS)
cores = {c for f in files for c in (f.get("cores") or [])}
regions = {
r for e in files + omitted for r in (e.get("regions") or [])
if r != WORLD_REGION
}
return {
"systems": ordered,
"cores": sorted(cores),
"regions": sorted(regions),
}
def resolve_choices(values: list[str], known: list[str], label: str) -> list[str]:
"""Names given on the command line, matched without regard to case.
Each value is one name or a comma-separated list. A whole value that is
itself a name wins over splitting it: Recalbox names one system
`msx1,msx2,msxturbor`. An unknown name is refused, never ignored, since
carrying on would install something other than what was asked.
"""
by_lower = {name.lower(): name for name in known}
chosen: list[str] = []
unknown: list[str] = []
for value in values:
value = value.strip()
tokens = [value] if value.lower() in by_lower else value.split(",")
for token in (t.strip() for t in tokens):
if not token:
continue
name = by_lower.get(token.lower())
if name is None:
unknown.append(token)
elif name not in chosen:
chosen.append(name)
if unknown:
available = ", ".join(known) if known else "none"
raise ValueError(
f"unknown {label}: {', '.join(unknown)} (available: {available})"
)
if values and not chosen:
raise ValueError(f"--{label} needs at least one name")
return chosen
def resolve_regions(values: list[str]) -> list[str]:
"""A region priority list, best first, from names or aliases."""
chosen: list[str] = []
for value in values:
for token in value.split(","):
if token.strip():
region = canonical_region(token)
if region not in chosen:
chosen.append(region)
if values and not chosen:
raise ValueError("--region needs at least one region")
return chosen
def parse_selection(text: str, count: int, ordered: bool = False) -> list[int]:
"""Numbers typed at a prompt: `3`, `1,4`, `2-5`, or `all`, 1-based.
Returned sorted, or in the typed order when the order is a priority.
"""
if text.strip().lower() in ("all", "*"):
return list(range(1, count + 1))
chosen: list[int] = []
for token in (t.strip() for t in text.split(",")):
if not token:
continue
low, sep, high = token.partition("-")
try:
start = int(low)
end = int(high) if sep else start
except ValueError:
raise ValueError(f"not a number or range: {token}") from None
if start > end or start < 1 or end > count:
raise ValueError(f"out of range: {token} (1-{count})")
for number in range(start, end + 1):
if number not in chosen:
chosen.append(number)
return chosen if ordered else sorted(chosen)
def _digest_file(path: Path, algorithms: tuple[str, ...]) -> dict[str, str]:
"""Compute several digests of a file in a single read.
@@ -1600,7 +1267,7 @@ def download_files(
def do_standalone_copies(
manifest: dict, bios_path: Path, os_type: str,
extra_dirs: dict[str, Path] | None = None,
) -> tuple[int, int, int]:
) -> tuple[int, int]:
"""Copy BIOS files to standalone emulator directories.
Supports:
@@ -1613,19 +1280,16 @@ def do_standalone_copies(
default per-OS locations, for setups such as LaunchBox that keep their
emulators outside them. The layout below the root is the same.
Returns (copied, skipped, failed): skipped is a target directory that
does not exist, failed a copy the system refused (permission, disk
full, read-only mount), which used to be counted as "dir not found".
Returns (copied_count, skipped_count).
"""
from fnmatch import fnmatch
copies = manifest.get("standalone_copies", [])
if not copies:
return 0, 0, 0
return 0, 0
copied = 0
skipped = 0
failed = 0
for entry in copies:
# Note entries: print message if emulator detected
@@ -1684,11 +1348,10 @@ def do_standalone_copies(
try:
shutil.copy2(src, dest)
copied += 1
except OSError as exc:
print(f" ERROR: {dest}: {exc.strerror or exc}")
failed += 1
except OSError:
skipped += 1
return copied, skipped, failed
return copied, skipped
def format_size(n: int) -> str:
@@ -1722,7 +1385,7 @@ def _prompt_manual_platform(os_type: str) -> list[tuple[str, Path]]:
plat = AVAILABLE_PLATFORMS[int(choice) - 1]
elif choice in AVAILABLE_PLATFORMS:
plat = choice
default_dest = _default_dest(os_type, plat)
default_dest = DEFAULT_DESTS.get(plat, Path.home() / "bios")
try:
raw = input(f"BIOS directory [{default_dest}]: ").strip()
except (EOFError, KeyboardInterrupt):
@@ -1742,9 +1405,7 @@ def _default_dest(os_type: str, platform_name: str) -> Path:
"""
if os_type == "android" and platform_name == "retroarch":
return _android_storage_root() / "RetroArch" / "system"
return _os_default_dests(os_type).get(
platform_name, DEFAULT_DESTS.get(platform_name, Path.home() / "bios")
)
return DEFAULT_DESTS.get(platform_name, Path.home() / "bios")
def _manual_usage_hint(os_type: str) -> list[str]:
@@ -1797,155 +1458,6 @@ def _prompt_platform_choice(
return platforms
def _ask(prompt: str) -> str:
try:
return input(prompt).strip()
except (EOFError, KeyboardInterrupt):
print()
sys.exit(0)
def _sized(files: list[dict]) -> str:
return f"{_plural(len(files), 'file')}, {format_size(sum(f.get('size', 0) for f in files))}"
def _pick(title: str, rows: list[tuple[str, list[dict]]], ordered: bool = False) -> list[str]:
"""Numbered list of names; an empty answer keeps every one."""
if not rows:
return []
print(f"\n{title}")
width = len(str(len(rows)))
name_width = min(max(len(name) for name, _files in rows), 32)
for index, (name, files) in enumerate(rows, 1):
print(f" {index:>{width}}) {name:<{name_width}} {_sized(files)}")
hint = "order of preference, e.g. 2,1" if ordered else "e.g. 1,3-5"
while True:
text = _ask(f"Numbers ({hint}), Enter for all, q to quit: ")
if not text:
return []
if text.lower() == "q":
sys.exit(0)
try:
chosen = parse_selection(text, len(rows), ordered=ordered)
except ValueError as exc:
print(f" {exc}")
continue
if chosen:
return [rows[number - 1][0] for number in chosen]
def _prompt_custom_selection(
plat: str, files: list[dict], omitted: list[dict]
) -> tuple[list[str], list[str], list[str]] | None:
"""Offer to narrow the install by system, core and region.
Enter installs everything, the default most runs want. Returns None
then, or the three choices; each empty list keeps everything on its axis.
"""
print(f"\n{plat.capitalize()}: {_sized(files)}.")
print(" Enter) install everything")
print(" c) choose systems, cores and regions")
print(" q) quit")
while True:
answer = _ask("> ").lower()
if answer == "":
return None
if answer == "q":
sys.exit(0)
if answer == "c":
break
choices = available_choices(files, omitted)
if OTHER_SYSTEMS in choices["systems"]:
print(f"\n'{OTHER_SYSTEMS}' holds what cores load for systems this platform")
print("does not list, such as game engines and extra computers.")
systems = _pick("Systems:", [
(name, [f for f in files if _chosen(f, {name})])
for name in choices["systems"]
])
kept, kept_omitted = narrow(files, omitted, systems, [], [])
cores: list[str] = []
core_names = available_choices(kept, kept_omitted)["cores"]
if core_names:
print("\nThe platform's own files for these systems are always kept;")
print("the extra files each core loads can be narrowed.")
cores = _pick("Cores:", [
(name, [f for f in kept if name in (f.get("cores") or [])])
for name in core_names
])
kept, kept_omitted = narrow(kept, kept_omitted, [], cores, [])
regions: list[str] = []
region_names = available_choices(kept, kept_omitted)["regions"]
if region_names:
print("\nSome systems have one BIOS per region. Keeping only the")
print("preferred region removes the others where a match exists.")
regions = _pick("Regions:", [
(name, [f for f in kept if name in (f.get("regions") or [])])
for name in region_names
], ordered=True)
return systems, cores, regions
def _same_choice_hint(plat: str, systems: list[str], cores: list[str], regions: list[str]) -> str:
"""The options that repeat a choice made at the prompts."""
def quoted(value: str) -> str:
return f'"{value}"' if any(c in value for c in " ;&|") else value
parts = [f"--platform {plat}"]
parts += [f"--system {quoted(name)}" for name in systems]
parts += [f"--core {quoted(name)}" for name in cores]
if regions:
parts.append(f"--region {','.join(regions)}")
return " ".join(parts)
def _print_choices(
plat: str, files: list[dict], omitted: list[dict], systems: bool
) -> None:
"""What --system or --core accepts for a platform, with what each holds."""
choices = available_choices(files, omitted)
names = choices["systems"] if systems else choices["cores"]
if not names:
print(f" {plat} records no {'systems' if systems else 'cores'}")
return
width = min(max(len(name) for name in names), 40)
for name in names:
held = (
[f for f in files if _chosen(f, {name})]
if systems
else [f for f in files if name in (f.get("cores") or [])]
)
print(f" {name:<{width}} {_sized(held)}")
def _requested_narrowing(
args: argparse.Namespace, plat: str, files: list[dict], omitted: list[dict]
) -> tuple[list[str], list[str], list[str]] | None:
"""The systems, cores and regions named on the command line, checked."""
if not (args.system or args.core or args.region):
return None
if not records_selection(files):
# Without the fields, a region filter would match nothing and install
# everything: refused rather than ignored.
print(
f"Error: the {plat} file list records no systems or regions; "
"narrowing needs a newer one",
file=sys.stderr,
)
sys.exit(1)
choices = available_choices(files, omitted)
try:
systems = resolve_choices(args.system or [], choices["systems"], "system")
cores = resolve_choices(args.core or [], choices["cores"], "core")
regions = resolve_regions(args.region or [])
except ValueError as exc:
print(f"Error: {plat}: {exc}", file=sys.stderr)
sys.exit(1)
return systems, cores, regions
def main() -> None:
"""Entry point."""
parser = argparse.ArgumentParser(
@@ -1995,56 +1507,10 @@ def main() -> None:
action="store_true",
help="opt in to copies into detected standalone-emulator directories",
)
parser.add_argument(
"--system",
action="append",
metavar="NAME",
help="install only these systems (repeat or comma-separate; see --list-systems)",
)
parser.add_argument(
"--core",
action="append",
metavar="NAME",
help="keep only the extra files these cores load (see --list-cores)",
)
parser.add_argument(
"--region",
action="append",
metavar="LIST",
help="preferred regions, best first, e.g. us,eu,jp: keep one BIOS per "
"region where a system has several",
)
parser.add_argument(
"--list-systems",
action="store_true",
help="list a platform's systems with their file counts and exit",
)
parser.add_argument(
"--list-cores",
action="store_true",
help="list the cores whose extra files a platform installs and exit",
)
parser.add_argument(
"--no-input",
action="store_true",
help="never ask a question; fail where an answer is needed",
)
args = parser.parse_args()
if not 1 <= args.jobs <= 32:
parser.error("--jobs must be between 1 and 32")
if args.region:
try:
resolve_regions(args.region)
except ValueError as exc:
parser.error(f"{exc} (known: {', '.join(sorted(REGIONS))})")
for option, values in (("--system", args.system), ("--core", args.core)):
if values is not None and not any(
token.strip() for value in values for token in value.split(",")
):
parser.error(f"{option} needs at least one name")
interactive = sys.stdin.isatty() and not args.no_input
listing = args.list_targets or args.list_systems or args.list_cores
print("RetroBIOS\n")
os_type = detect_os()
@@ -2092,7 +1558,7 @@ def main() -> None:
platforms = detect_platforms(os_type)
if not platforms:
print(" No supported platform detected.")
if not interactive or listing:
if not sys.stdin.isatty() or args.list_targets:
for line in _manual_usage_hint(os_type):
print(line)
sys.exit(1)
@@ -2100,7 +1566,7 @@ def main() -> None:
for name, path in platforms:
print(f" Found {name.capitalize()} at {path}")
if len(platforms) > 1 and not listing and interactive:
if len(platforms) > 1 and not args.list_targets and sys.stdin.isatty():
platforms = _prompt_platform_choice(platforms)
total_downloaded = 0
@@ -2166,27 +1632,6 @@ def main() -> None:
omitted_files = _filter_by_target(omitted_files, target_cores)
print(f" Filtered {before} -> {len(files)} files for target {args.target}")
selection = _requested_narrowing(args, plat_name, files, omitted_files)
if (
selection is None
and interactive
and not args.check
and not listing
and records_selection(files)
):
selection = _prompt_custom_selection(plat_name, files, omitted_files)
if selection is not None:
print("\n Same choice without questions: "
+ _same_choice_hint(plat_name, *selection))
if selection is not None:
before = len(files)
files, omitted_files = narrow(files, omitted_files, *selection)
print(f" Narrowed {before} -> {len(files)} files")
if args.list_systems or args.list_cores:
_print_choices(plat_name, files, omitted_files, args.list_systems)
continue
total_size = sum(f.get("size", 0) for f in files)
print(f" {len(files)} files ({format_size(total_size)})")
if omitted_files:
@@ -2198,7 +1643,7 @@ def main() -> None:
reason = entry.get("reason", "unknown")
reasons[reason] = reasons.get(reason, 0) + 1
reason_summary = ", ".join(
f"{OMISSION_REASONS.get(reason, reason)}: {count}"
f"{reason.replace('_', ' ')}: {count}"
for reason, count in sorted(reasons.items())
)
print(
@@ -2264,22 +1709,18 @@ def main() -> None:
print("\nStandalone emulators:")
lb_root = launchbox_root(os_type)
extra_dirs = launchbox_bios_dirs(lb_root) if lb_root else None
copied, skipped, copy_failed = do_standalone_copies(
copied, skipped = do_standalone_copies(
manifest, bios_path, os_type, extra_dirs
)
if copied or skipped or copy_failed:
print(
f" {copied} copied, {skipped} skipped (dir not found), "
f"{copy_failed} failed"
)
total_errors += copy_failed
if copied or skipped:
print(f" {copied} copied, {skipped} skipped (dir not found)")
elif manifest.get("standalone_copies") and not args.check:
print(
"\nStandalone copies skipped "
"(use --standalone-copies to opt in)."
)
if not args.check and not listing:
if not args.check and not args.list_targets:
_report_outcome(
installed_paths,
total_downloaded,
+2 -9
View File
@@ -18,7 +18,7 @@ esac
TEMP_INSTALLER=""
TEMP_DIRECTORY=""
DEFAULT_INSTALL_URL="https://raw.githubusercontent.com/Abdess/retrobios/main/install.py"
DEFAULT_INSTALL_SHA256="d5f352fbe34cfd8ae40c0980c3986158ec1d9dd1babfe2bbc0918ffc0fa0bdf0"
DEFAULT_INSTALL_SHA256="42b1747ae867d41da39b11daf783c0106daa6ed18861a2214c196f3a5c9a3c60"
MAX_INSTALLER_BYTES=2097152
cleanup() {
@@ -97,11 +97,4 @@ if [ -z "$PYTHON" ]; then
exit 1
fi
# Piped from curl, standard input is this script, not the terminal: the
# installer would skip every question it can ask. Hand it the terminal when
# there is one.
if [ ! -t 0 ] && (: </dev/tty) 2>/dev/null; then
"$PYTHON" "$INSTALLER" "$@" </dev/tty
else
"$PYTHON" "$INSTALLER" "$@"
fi
"$PYTHON" "$INSTALLER" "$@"
+576 -7254
View File
File diff suppressed because it is too large. Load diff
+372 -3945
View File
File diff suppressed because it is too large. Load diff
+163 -2529
View File
File diff suppressed because it is too large. Load diff
+724 -6225
View File
File diff suppressed because it is too large. Load diff
+82 -325
View File
@@ -5,7 +5,7 @@
"platform": "misterfpga",
"display_name": "MiSTer FPGA",
"version": "1.0",
"generated": "2026-10-10T05:24:26Z",
"generated": "2026-10-04T20:41:16Z",
"base_destination": "games",
"detect": [
{
@@ -29,10 +29,7 @@
"sha256": "41b5b8e7c44e55eaf5cfd4f2a58df42f4a1bbc776723368fb25bf118dd631b1b",
"size": 1048576,
"repo_path": "bios/3DO Company/3DO/panafz1.bin",
"cores": null,
"systems": [
"3do"
]
"cores": null
},
{
"dest": "3DO/kanji.rom",
@@ -40,10 +37,7 @@
"sha256": "8974193e76cf255ebc40fe20b95b405db2cc1ea07910584380e50c6d9ca181aa",
"size": 1048576,
"repo_path": "bios/3DO Company/3DO/panafz1j-kanji.bin",
"cores": null,
"systems": [
"3do"
]
"cores": null
},
{
"dest": "Apple-IIgs/boot.rom",
@@ -51,10 +45,7 @@
"sha256": "01398a51b3aa16c40bb3d5df43494316cc12eebb87871712cecc396e1beb2df8",
"size": 262144,
"repo_path": "bios/Apple/Apple II/apple2gs.rom",
"cores": null,
"systems": [
"apple-iigs"
]
"cores": null
},
{
"dest": "Apple-IIgs/boot1.rom",
@@ -62,10 +53,7 @@
"sha256": "34cd454c6201bfd26839d6ace2ff6b1231e09d6279e49b4890311756dc3825fb",
"size": 131072,
"repo_path": "bios/Apple/Apple IIGS/ROM",
"cores": null,
"systems": [
"apple-iigs"
]
"cores": null
},
{
"dest": "Jaguar/boot.rom",
@@ -73,10 +61,7 @@
"sha256": "f0bd29599b3dfca7f5620c011256c1dc45c9d82c428a318f965c2ba3ded2e9f9",
"size": 131072,
"repo_path": "bios/Atari/Jaguar/boot.rom",
"cores": null,
"systems": [
"atari-jaguar"
]
"cores": null
},
{
"dest": "Jaguar/boot1.rom",
@@ -84,10 +69,7 @@
"sha256": "7ebadb56f8082c86d6f74e2c38e02b218db420d3049f8f9c988f6490dc7f9fc0",
"size": 262144,
"repo_path": "bios/Atari/Jaguar/boot1.rom",
"cores": null,
"systems": [
"atari-jaguar"
]
"cores": null
},
{
"dest": "Jaguar/boot2.rom",
@@ -95,10 +77,7 @@
"sha256": "bf02591cfe4ab4f082ea23c447da5c53afbfddace6d700b785ba04b7ac5c64e0",
"size": 131072,
"repo_path": "bios/Atari/Jaguar/boot2.rom",
"cores": null,
"systems": [
"atari-jaguar"
]
"cores": null
},
{
"dest": "AtariLynx/boot.rom",
@@ -106,10 +85,7 @@
"sha256": "c26a36c1990bcf841155e5a6fea4d2ee1a4d53b3cc772e70f257a962ad43b383",
"size": 512,
"repo_path": "bios/Atari/Lynx/Atari_LYNX_boot.img",
"cores": null,
"systems": [
"atari-lynx"
]
"cores": null
},
{
"dest": "Astrocade/boot.rom",
@@ -117,10 +93,7 @@
"sha256": "f01220d94b82145a6d18f114ff59be9c178f69de24f8ad0f4d19eee8b86b17c7",
"size": 8192,
"repo_path": "bios/Bally/Astrocade/astro.bin",
"cores": null,
"systems": [
"bally-astrocade"
]
"cores": null
},
{
"dest": "Casio_PV-2000/boot0.rom",
@@ -128,10 +101,7 @@
"sha256": "2587d206eb63917848ea30e14232448ed4f873c6796a22e2bf6543b01f46308e",
"size": 16384,
"repo_path": "bios/Casio/PV-2000/hn613128pc64.bin",
"cores": null,
"systems": [
"casio-pv2000"
]
"cores": null
},
{
"dest": "CreatiVision/boot.rom",
@@ -139,10 +109,7 @@
"sha256": "48a7fda99c1b9c0d90b70de0b4a9431a5a781f94d1874ee6d91830a638c9e5c3",
"size": 16384,
"repo_path": "bios/VTech/CreatiVision/laser2001.rom",
"cores": null,
"systems": [
"creativision"
]
"cores": null
},
{
"dest": "SCV/boot.rom",
@@ -150,10 +117,7 @@
"sha256": "25c7ff2d735d1ae895af9262f31e083c5c1bd99a8f31b5b378dfbc0f166ec97f",
"size": 6144,
"repo_path": "bios/Epoch/Super Cassette Vision/boot.rom",
"cores": null,
"systems": [
"epoch-scv"
]
"cores": null
},
{
"dest": "Gamate/boot.rom",
@@ -161,10 +125,7 @@
"sha256": "26f206fa4eedbe040f619e3af78efa1d38588535b1d746f6a462da639ced4b1e",
"size": 4096,
"repo_path": "bios/Bit Corporation/Gamate/gamate_bios_umc.bin",
"cores": null,
"systems": [
"gamate"
]
"cores": null
},
{
"dest": "GameKing/boot.rom",
@@ -172,10 +133,7 @@
"sha256": "7843fd082889cac046d446160f38755f7c8c4a8e4f9dd9d5104b185f0bc1dec4",
"size": 524288,
"repo_path": "bios/TimeTop/GameKing/boot.rom",
"cores": null,
"systems": [
"gameking"
]
"cores": null
},
{
"dest": "Interact/boot.rom",
@@ -183,10 +141,7 @@
"sha256": "e0888ba82382aabb7557aa4a3445e613bd7f33bae1af5ece211e2cb6bc9ffa82",
"size": 2048,
"repo_path": "bios/Interact/Home Computer/interact.rom",
"cores": null,
"systems": [
"interact"
]
"cores": null
},
{
"dest": "Loopy/boot0.rom",
@@ -194,10 +149,7 @@
"sha256": "82a8d6add06e324e36c71b0a7a92d607af3db5e65574a6892794d70df668e9d5",
"size": 32768,
"repo_path": "bios/Casio/Loopy/boot0.rom",
"cores": null,
"systems": [
"loopy"
]
"cores": null
},
{
"dest": "Loopy/boot1.rom",
@@ -205,10 +157,7 @@
"sha256": "7540ff64268e500a34fb83c8642510d341440ac6258f6c36851e182870e40f75",
"size": 524288,
"repo_path": "bios/Casio/Loopy/boot1.rom",
"cores": null,
"systems": [
"loopy"
]
"cores": null
},
{
"dest": "Marty/mrom.m36",
@@ -216,10 +165,7 @@
"sha256": "2cd7466183ba965259df35ff078b7b057a99086feea0050ddf87aebc6932f429",
"size": 2097152,
"repo_path": "bios/Fujitsu/FM Towns/mrom.m36",
"cores": null,
"systems": [
"marty"
]
"cores": null
},
{
"dest": "Marty/mrom.m37",
@@ -227,10 +173,7 @@
"sha256": "10fc6d984d0a440c3410d805f4bea247fb5dd5a509befff481164923f883797d",
"size": 2097152,
"repo_path": "bios/Fujitsu/FM Towns/mrom.m37",
"cores": null,
"systems": [
"marty"
]
"cores": null
},
{
"dest": "Intellivision/boot0.rom",
@@ -238,10 +181,7 @@
"sha256": "1aeb614856beba95463166daf09304b414d5617d3f37d221724b3337fc4b2722",
"size": 8192,
"repo_path": "bios/Mattel/Intellivision/INTV_EROM.bin",
"cores": null,
"systems": [
"mattel-intellivision"
]
"cores": null
},
{
"dest": "Intellivision/boot1.rom",
@@ -249,10 +189,7 @@
"sha256": "a80b6841182547d08635ad30a6af71441c4c9eed9391b3dd22feb30d8e50cc85",
"size": 2048,
"repo_path": "bios/Mattel/Intellivision/INTV_GROM.bin",
"cores": null,
"systems": [
"mattel-intellivision"
]
"cores": null
},
{
"dest": "Intellivision/boot2.rom",
@@ -260,10 +197,7 @@
"sha256": "dabade432af1523f43029057071ca8c1ed3604498c784603e8733023382ad7a5",
"size": 2048,
"repo_path": "bios/Mattel/Intellivision/IVOICE.BIN",
"cores": null,
"systems": [
"mattel-intellivision"
]
"cores": null
},
{
"dest": "Intellivision/boot3.rom",
@@ -271,10 +205,7 @@
"sha256": "2fcea60039c4a8836b9bb71e391d70a145c724b4dae516be733fe842ba6687c7",
"size": 24576,
"repo_path": "bios/Mattel/Intellivision/ECS.bin",
"cores": null,
"systems": [
"mattel-intellivision"
]
"cores": null
},
{
"dest": "MSX1/boot.rom",
@@ -282,10 +213,7 @@
"sha256": "04fd77f02f652770cbb3cc6b4a594cc736d56486a106c1068965f1fe090746a5",
"size": 32768,
"repo_path": "bios/Microsoft/MSX/share/systemroms/vg8020_basic-bios1.rom",
"cores": null,
"systems": [
"microsoft-msx"
]
"cores": null
},
{
"dest": "PC8801/boot.rom",
@@ -293,10 +221,7 @@
"sha256": "0dc3fcf58c90c1f119a710babd54b57babf81ba8573c070b33f0cc21948b3086",
"size": 393216,
"repo_path": "bios/NEC/PC-88/PC8801 MKII SR BIOS.rom",
"cores": null,
"systems": [
"nec-pc-88"
]
"cores": null
},
{
"dest": "TGFX16-CD/cd_bios.rom",
@@ -304,10 +229,7 @@
"sha256": "b057e09822c3767120ba56f2ce02f089b5824d4b489ea3cd7ad9405b3a339a52",
"size": 262144,
"repo_path": "bios/NEC/PC Engine CD/Super CD 3.1.pce",
"cores": null,
"systems": [
"nec-pc-engine-cd"
]
"cores": null
},
{
"dest": "NGPC/boot0.rom",
@@ -315,10 +237,7 @@
"sha256": "8fb845a2f71514cec20728e2f0fecfade69444f8d50898b92c2259f1ba63e10d",
"size": 65536,
"repo_path": "bios/SNK/Neo Geo Pocket/SNK Neo-Geo Pocket Color BIOS (1999)(SNK)(en-ja).bin",
"cores": null,
"systems": [
"ngpc"
]
"cores": null
},
{
"dest": "NGPC/boot1.rom",
@@ -326,10 +245,7 @@
"sha256": "0293555b21c4fac516d25199df7809b26beeae150e1d4504a050db32264a6ad7",
"size": 65536,
"repo_path": "bios/SNK/Neo Geo Pocket/SNK Neo-Geo Pocket BIOS (1998)(SNK)(en-ja).bin",
"cores": null,
"systems": [
"ngpc"
]
"cores": null
},
{
"dest": "N64/boot.rom",
@@ -337,10 +253,7 @@
"sha256": "fa7b09795ef1e54461e59f6f2d902368133e3f1cd980e34383e6a780d74beffd",
"size": 1984,
"repo_path": "bios/Nintendo/Nintendo 64/boot.rom",
"cores": null,
"systems": [
"nintendo-64"
]
"cores": null
},
{
"dest": "N64/boot1.rom",
@@ -348,10 +261,7 @@
"sha256": "79c81fffae934b6df251da6c3a394f52c6a0eaa07115a3b9677743e3c1335f4a",
"size": 1984,
"repo_path": "bios/Nintendo/Nintendo 64/boot1.rom",
"cores": null,
"systems": [
"nintendo-64"
]
"cores": null
},
{
"dest": "N64/boot3.rom",
@@ -359,10 +269,7 @@
"sha256": "806400ec0df94b0755de6c5b8249d6b6a9866124c5ddbdac198bde22499bfb8b",
"size": 4194304,
"repo_path": "bios/Nintendo/64DD/64DD_IPL_v12_JPN.bin",
"cores": null,
"systems": [
"nintendo-64"
]
"cores": null
},
{
"dest": "N64/boot4.rom",
@@ -370,10 +277,7 @@
"sha256": "9c2962a8b994a29e4cd04b3a6e4ed730a751414655ab6a9799ebf5fc08b79d44",
"size": 4194304,
"repo_path": "bios/Nintendo/64DD/64DD_IPL_DEV.bin",
"cores": null,
"systems": [
"nintendo-64"
]
"cores": null
},
{
"dest": "N64/boot5.rom",
@@ -381,10 +285,7 @@
"sha256": "e9fec87a45fba02399e88064b9e2f8cf0f2106e351c58279a87f05da5bc984ad",
"size": 4194304,
"repo_path": "bios/Nintendo/64DD/64DD_IPL_USA.bin",
"cores": null,
"systems": [
"nintendo-64"
]
"cores": null
},
{
"dest": "GAMEBOY/boot1.rom",
@@ -392,10 +293,7 @@
"sha256": "b4f2e416a35eef52cba161b159c7c8523a92594facb924b3ede0d722867c50c7",
"size": 2304,
"repo_path": "bios/Nintendo/Game Boy Color/GBC_cgb.bin",
"cores": null,
"systems": [
"nintendo-gb"
]
"cores": null
},
{
"dest": "GBA/boot.rom",
@@ -403,10 +301,7 @@
"sha256": "fd2547724b505f487e6dcb29ec2ecff3af35a841a77ab2e85fd87350abd36570",
"size": 16384,
"repo_path": "bios/Nintendo/Game Boy Advance/GBA_bios.rom",
"cores": null,
"systems": [
"nintendo-gba"
]
"cores": null
},
{
"dest": "NES/boot0.rom",
@@ -414,10 +309,7 @@
"sha256": "99c18490ed9002d9c6d999b9d8d15be5c051bdfa7cc7e73318053c9a994b0178",
"size": 8192,
"repo_path": "bios/Arcade/FBNeo/fdsbios.nes",
"cores": null,
"systems": [
"nintendo-nes"
]
"cores": null
},
{
"dest": "PokemonMini/boot.rom",
@@ -425,10 +317,7 @@
"sha256": "45a1c7f28b9ad585e67f047abe9c1c956724bfcab8c9011002af4274e7c50e8f",
"size": 4096,
"repo_path": "bios/Nintendo/Pokemon Mini/bios.min",
"cores": null,
"systems": [
"nintendo-pokemon-mini"
]
"cores": null
},
{
"dest": "SGB/Super Game Boy 2.sfc",
@@ -436,10 +325,7 @@
"sha256": "c172498a23d1176672931bab33b629c7d28f914a43dca9e540b8af1b37ccf2c6",
"size": 524288,
"repo_path": "bios/Nintendo/Super Game Boy/SGB2.sfc/program.rom",
"cores": null,
"systems": [
"nintendo-sgb"
]
"cores": null
},
{
"dest": "SGB/Super Game Boy.sfc",
@@ -447,10 +333,7 @@
"sha256": "a75160f7b89b1f0e20fd2f6441bb86285c7378db5035ef6885485eaff6059376",
"size": 262144,
"repo_path": "bios/Nintendo/Super Game Boy/SGB1.sfc/program.rom",
"cores": null,
"systems": [
"nintendo-sgb"
]
"cores": null
},
{
"dest": "SNES/bsx_bios.rom",
@@ -458,10 +341,7 @@
"sha256": "a49827b45ff9ac9cf5b4658190e1428e59251bc82d8a63d8e9e0f71e439f008f",
"size": 1048576,
"repo_path": "bios/Nintendo/SNES/BS-X.bin",
"cores": null,
"systems": [
"nintendo-snes"
]
"cores": null
},
{
"dest": "CD-i/boot0.rom",
@@ -469,10 +349,7 @@
"sha256": "fd123e66beadaf844cb220a44166ea33f9fd0d64bafb9e6399febff445429db2",
"size": 524288,
"repo_path": "bios/Philips/CD-i/cdi220b.rom",
"cores": null,
"systems": [
"philips-cdi"
]
"cores": null
},
{
"dest": "CD-i/boot1.rom",
@@ -480,10 +357,7 @@
"sha256": "15794460f2ad630f6dd483a02ef958818c7a5c65f8afe76364bc9ffb7ccad3cc",
"size": 8192,
"repo_path": "bios/Philips/CD-i/zx405042p__cdi_slave_2.0__b43t__zzmk9213.mc68hc705c8a_withtestrom.7206",
"cores": null,
"systems": [
"philips-cdi"
]
"cores": null
},
{
"dest": "CD-i/boot2.rom",
@@ -491,10 +365,7 @@
"sha256": "e8a8cabb23650b53c2cb0763c3a1409f6c0d580a52fbe8ef834d44d4021db165",
"size": 131072,
"repo_path": "bios/Philips/CD-i/vmpega_split.rom",
"cores": null,
"systems": [
"philips-cdi"
]
"cores": null
},
{
"dest": "PocketChallengeV2/boot.rom",
@@ -502,10 +373,7 @@
"sha256": "bf4480dbea1c47c8b54ce7be9382bc1006148f431fbe4277e136351fa74f635e",
"size": 4096,
"repo_path": "bios/Bandai/WonderSwan/bootrom.ws",
"cores": null,
"systems": [
"pocket-challenge-v2"
]
"cores": null
},
{
"dest": "PocketChallengeV2/boot1.rom",
@@ -513,10 +381,7 @@
"sha256": "f5a5c044d84ce1681f94e9ef74287cb989784497be5bd5108df17908dfa55db2",
"size": 8192,
"repo_path": "bios/Bandai/WonderSwan/bootrom.wsc",
"cores": null,
"systems": [
"pocket-challenge-v2"
]
"cores": null
},
{
"dest": "MegaCD/Europe/cd_bios.rom",
@@ -524,10 +389,7 @@
"sha256": "fe608a2a07676a23ab5fd5eee2f53c9e2526d69a28aa16ccd85c0ec42e6933cb",
"size": 131072,
"repo_path": "bios/Sega/Mega CD/eu_mcd2_9303.bin",
"cores": null,
"systems": [
"sega-mega-cd"
]
"cores": null
},
{
"dest": "MegaCD/Japan/cd_bios.rom",
@@ -535,10 +397,7 @@
"sha256": "7133fc2dd2fe5b7d0acd53a5f10f3d00b5d31270239ad20d74ef32393e24af88",
"size": 131072,
"repo_path": "bios/Sega/Mega CD/jp_mcd2_921222.bin",
"cores": null,
"systems": [
"sega-mega-cd"
]
"cores": null
},
{
"dest": "MegaCD/USA/cd_bios.rom",
@@ -546,10 +405,7 @@
"sha256": "fb477cdbf94c84424c2feca4fe40656d85393fe7b7b401911b45ad2eb991258c",
"size": 131072,
"repo_path": "bios/Sega/Mega CD/SegaCDBIOS9303.bin",
"cores": null,
"systems": [
"sega-mega-cd"
]
"cores": null
},
{
"dest": "MegaCD/boot.rom",
@@ -557,10 +413,7 @@
"sha256": "59403e7f8be1d4e98d673cca17cfec072770a56415165ad7ac88dcd3f7273317",
"size": 131072,
"repo_path": "bios/Sega/Mega CD/US Sega CD 2 (Region Free) 930601 l_oliveira.bin",
"cores": null,
"systems": [
"sega-mega-cd"
]
"cores": null
},
{
"dest": "Saturn/boot.rom",
@@ -568,10 +421,7 @@
"sha256": "37561c4444bec52ae1aae31de5579f1856d5b23002ee083ade42f9ed13c8616f",
"size": 524288,
"repo_path": "bios/Sega/Saturn/.variants/hisaturn_v103.bin",
"cores": null,
"systems": [
"sega-saturn"
]
"cores": null
},
{
"dest": "NEOGEO/000-lo.lo",
@@ -579,10 +429,7 @@
"sha256": "2a76f023dc578804c6bcd58ed514ffc04fcb433b3bd75d4452575ffda57a0707",
"size": 131072,
"repo_path": "bios/SNK/Neo Geo CD/000-lo.lo",
"cores": null,
"systems": [
"snk-neogeo"
]
"cores": null
},
{
"dest": "NEOGEO/neo-epo.sp1",
@@ -590,10 +437,7 @@
"sha256": "70f7906d68acbc3630b6e7792ebb485288b05ca72c6d4c243e07e230aae8d1e4",
"size": 131072,
"repo_path": "bios/SNK/Neo Geo/neo-epo.bin",
"cores": null,
"systems": [
"snk-neogeo"
]
"cores": null
},
{
"dest": "NEOGEO/sfix.sfix",
@@ -601,10 +445,7 @@
"sha256": "fcf51e688c006408be92c5adaf37d4302d05e7e681193dd0623072e53915c90e",
"size": 131072,
"repo_path": "bios/SNK/Neo Geo/sfix.sfix",
"cores": null,
"systems": [
"snk-neogeo"
]
"cores": null
},
{
"dest": "NEOGEO/sp-s2.sp1",
@@ -612,10 +453,7 @@
"sha256": "ae1c5cc9a0acdead8a3d5a16ee84f575582f2209677464b05a2b8b0451f658a1",
"size": 131072,
"repo_path": "bios/SNK/Neo Geo/sp-s2.sp1",
"cores": null,
"systems": [
"snk-neogeo"
]
"cores": null
},
{
"dest": "NEOGEO/uni-bios.rom",
@@ -623,10 +461,7 @@
"sha256": "e016ce75097df0b5f5910e8eb4914439f5c77511de65df5a1e089eef147b256b",
"size": 131072,
"repo_path": "bios/SNK/Neo Geo/uni-bios_4_0.rom",
"cores": null,
"systems": [
"snk-neogeo"
]
"cores": null
},
{
"dest": "NeoGeo-CD/neocd.bin",
@@ -634,10 +469,7 @@
"sha256": "2e93af5848080ea04d17a7841b742f009330d30e4ff40c3410547581d921c892",
"size": 524288,
"repo_path": "bios/SNK/Neo Geo CD/neocd.bin",
"cores": null,
"systems": [
"snk-neogeo-cd"
]
"cores": null
},
{
"dest": "NeoGeo-CD/top-sp1.bin",
@@ -645,10 +477,7 @@
"sha256": "c11c33589b2057008a7e4c7c700fcd989a8c0f95f869e7e7539fdd00414d99a7",
"size": 524288,
"repo_path": "bios/SNK/Neo Geo CD/top-sp1.bin",
"cores": null,
"systems": [
"snk-neogeo-cd"
]
"cores": null
},
{
"dest": "NeoGeo-CD/uni-bioscd.rom",
@@ -656,10 +485,7 @@
"sha256": "1c3ec20824a58e5f5cbf47ccc2c91a10f34d21cfa2791b3413cea89b0c920db8",
"size": 524288,
"repo_path": "bios/SNK/Neo Geo/uni-bioscd33.rom",
"cores": null,
"systems": [
"snk-neogeo-cd"
]
"cores": null
},
{
"dest": "PSX/boot.rom",
@@ -667,10 +493,7 @@
"sha256": "39dcc1a0717036c9b6ac52fefd1ee7a57d3808e8cfbc755879fa685a0a738278",
"size": 524288,
"repo_path": "bios/Sony/PlayStation/scph7001.bin",
"cores": null,
"systems": [
"sony-playstation"
]
"cores": null
},
{
"dest": "PSX/boot1.rom",
@@ -678,10 +501,7 @@
"sha256": "e900504d1755f021f861b82c8258c5e6658c7b592f800cccd91f5d32ea380d28",
"size": 524288,
"repo_path": "bios/Sony/PlayStation/scph7000.bin",
"cores": null,
"systems": [
"sony-playstation"
]
"cores": null
},
{
"dest": "PSX/boot2.rom",
@@ -689,10 +509,7 @@
"sha256": "5e84a94818cf5282f4217591fefd88be36b9b174b3cc7cb0bcd75199beb450f1",
"size": 524288,
"repo_path": "bios/Sony/PlayStation/scph7002.bin",
"cores": null,
"systems": [
"sony-playstation"
]
"cores": null
},
{
"dest": "PSX/sbi.zip",
@@ -700,10 +517,7 @@
"sha256": "32db7bb64131623fa912ef30a85f7d70cee2abbca56c21d360d2025e12b8aca9",
"size": 218953,
"repo_path": "bios/Sony/PlayStation/sbi.zip",
"cores": null,
"systems": [
"sony-playstation"
]
"cores": null
},
{
"dest": "Studio-II/boot0.rom",
@@ -711,10 +525,7 @@
"sha256": "1e7ae3cd972eb39681e6c6df5f1ac6f7d86c9e59788e40d6b4c948375e9ca5f7",
"size": 2048,
"repo_path": "bios/RCA/Studio II/boot0.rom",
"cores": null,
"systems": [
"studio-ii"
]
"cores": null
},
{
"dest": "Studio-II/boot1.rom",
@@ -722,10 +533,7 @@
"sha256": "e90cb0c5be993689a2d4fa03e664f5943967160153520d435391aaefff06da35",
"size": 4096,
"repo_path": "bios/RCA/Studio II/boot1.rom",
"cores": null,
"systems": [
"studio-ii"
]
"cores": null
},
{
"dest": "Studio-II/boot2.rom",
@@ -733,10 +541,7 @@
"sha256": "a0d6c1852fb407f86d25c802441ff15ec7fd041683c6a9ae0d23db0ca0df8c0b",
"size": 4096,
"repo_path": "bios/RCA/Studio II/boot2.rom",
"cores": null,
"systems": [
"studio-ii"
]
"cores": null
},
{
"dest": "Studio-II/boot3.rom",
@@ -744,10 +549,7 @@
"sha256": "7a95530b9be7fe487e027a5ea7ffe4a7561762cc3fc8cdc535d6f36e5f23c8a0",
"size": 2048,
"repo_path": "bios/RCA/Studio II/boot3.rom",
"cores": null,
"systems": [
"studio-ii"
]
"cores": null
},
{
"dest": "Studio-II/chip8.bin",
@@ -755,10 +557,7 @@
"sha256": "8764ba7e02fe00489997b45ac1f15f188f726cbcd5311e252225e62eb58d6d04",
"size": 768,
"repo_path": "bios/RCA/Studio II/boot4.rom",
"cores": null,
"systems": [
"studio-ii"
]
"cores": null
},
{
"dest": "Studio-II/openstudio2.bin",
@@ -766,10 +565,7 @@
"sha256": "36ddd9ffa17a194bd8103efb807e104a529134685502839a4f14ea4d5de648ad",
"size": 2048,
"repo_path": "bios/RCA/Studio II/openstudio2.bin",
"cores": null,
"systems": [
"studio-ii"
]
"cores": null
},
{
"dest": "SuperAcan/boot0.rom",
@@ -777,10 +573,7 @@
"sha256": "2e4d88bec69b5e7e4803368c233ce0d20f6dd107c5af0cfcc0089d310c695d7c",
"size": 4096,
"repo_path": "bios/Funtech/Super A'Can/boot0.rom",
"cores": null,
"systems": [
"superacan"
]
"cores": null
},
{
"dest": "SuperAcan/boot1.rom",
@@ -788,10 +581,7 @@
"sha256": "219f51bcb8544fe733bf784e087544f97aa5457945260c7fa07a8639f30f3a68",
"size": 8192,
"repo_path": "bios/Funtech/Super A'Can/boot1.rom",
"cores": null,
"systems": [
"superacan"
]
"cores": null
},
{
"dest": "SuperAcan/boot2.rom",
@@ -799,10 +589,7 @@
"sha256": "9889590805a97b7bb439d853d9ae4d6b31067bacb8225ab0538f3491dedab4b8",
"size": 8192,
"repo_path": "bios/Funtech/Super A'Can/boot2.rom",
"cores": null,
"systems": [
"superacan"
]
"cores": null
},
{
"dest": "COCO3/boot0.rom",
@@ -810,10 +597,7 @@
"sha256": "ad358430568250eb8330a37f85361d9ce67e5ae6d5a28c17b31802cd3953a5d2",
"size": 32768,
"repo_path": "bios/Tandy/CoCo/coco3.rom",
"cores": null,
"systems": [
"tandy-coco"
]
"cores": null
},
{
"dest": "COCO3/boot1.rom",
@@ -821,10 +605,7 @@
"sha256": "1c40c5a74e72edaeecc2511fee1aab347eae2c3d5fc6778cb622e3df14d63157",
"size": 8192,
"repo_path": "bios/Tandy/CoCo/disk11.rom",
"cores": null,
"systems": [
"tandy-coco"
]
"cores": null
},
{
"dest": "COCO3/boot2.rom",
@@ -832,10 +613,7 @@
"sha256": "1a5a3e95522296f66a192e9a7ca0725ecc88862f9bb31f50ef37ae789404692f",
"size": 8192,
"repo_path": "bios/Tandy/CoCo/orch90.rom",
"cores": null,
"systems": [
"tandy-coco"
]
"cores": null
},
{
"dest": "TI-99_4A/boot0.rom",
@@ -843,10 +621,7 @@
"sha256": "53ad354861a62b9144e02e878845c7e1a5dd75342b715047db64b780954f7c88",
"size": 196608,
"repo_path": "bios/Texas Instruments/TI-99/boot0.rom",
"cores": null,
"systems": [
"ti99"
]
"cores": null
},
{
"dest": "GameCom/boot.rom",
@@ -854,10 +629,7 @@
"sha256": "64cbaa1a5e8bae8fae90a7affd6743df5d23edfc4e1e23002ca77c8b7ec1bb64",
"size": 262144,
"repo_path": "bios/Tiger/Game.com/GameCom External BIOS (Kitrinx v0.03).bin",
"cores": null,
"systems": [
"tiger-game-com"
]
"cores": null
},
{
"dest": "VideoBrain/boot.rom",
@@ -865,10 +637,7 @@
"sha256": "545b466e7cc0c2cce7e9479857dbedee1476fc56245f0de45f816c1b99b75562",
"size": 4096,
"repo_path": "bios/VideoBrain/Family Computer/boot.rom",
"cores": null,
"systems": [
"videobrain"
]
"cores": null
},
{
"dest": "WonderSwan/boot.rom",
@@ -876,10 +645,7 @@
"sha256": "bf4480dbea1c47c8b54ce7be9382bc1006148f431fbe4277e136351fa74f635e",
"size": 4096,
"repo_path": "bios/Bandai/WonderSwan/bootrom.ws",
"cores": null,
"systems": [
"wonderswan"
]
"cores": null
},
{
"dest": "WonderSwan/boot1.rom",
@@ -887,10 +653,7 @@
"sha256": "f5a5c044d84ce1681f94e9ef74287cb989784497be5bd5108df17908dfa55db2",
"size": 8192,
"repo_path": "bios/Bandai/WonderSwan/bootrom.wsc",
"cores": null,
"systems": [
"wonderswan"
]
"cores": null
},
{
"dest": "WonderSwanColor/boot.rom",
@@ -898,10 +661,7 @@
"sha256": "bf4480dbea1c47c8b54ce7be9382bc1006148f431fbe4277e136351fa74f635e",
"size": 4096,
"repo_path": "bios/Bandai/WonderSwan/bootrom.ws",
"cores": null,
"systems": [
"wonderswan-color"
]
"cores": null
},
{
"dest": "WonderSwanColor/boot1.rom",
@@ -909,10 +669,7 @@
"sha256": "f5a5c044d84ce1681f94e9ef74287cb989784497be5bd5108df17908dfa55db2",
"size": 8192,
"repo_path": "bios/Bandai/WonderSwan/bootrom.wsc",
"cores": null,
"systems": [
"wonderswan-color"
]
"cores": null
}
]
}
+475 -5210
View File
File diff suppressed because it is too large. Load diff
+724 -6225
View File
File diff suppressed because it is too large. Load diff
+537 -7764
View File
File diff suppressed because it is too large. Load diff
+2201 -14360
View File
File diff suppressed because it is too large. Load diff
+737 -7148
View File
File diff suppressed because it is too large. Load diff
+157 -1994
View File
File diff suppressed because it is too large. Load diff
Loaded 100 of 247 files, more files were not shown because too many files have changed in this diff. Show more