chore: merge audit batch, resolver and profiles

This commit is contained in:
Abdessamad Derraz committed 2026-11-05 13:16:03 +01:00
commit e50eeb52fd
73 files changed
+943 -281

No files matched your search

+12 -12
View File
@@ -84,14 +84,14 @@ Each file is checked the way your platform checks it. Most compare a checksum, t
- **1,087 files** the platforms' emulators load are still to be found, and 138 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/)
- **18 platforms** supported with platform-specific verification
- **623 emulators** profiled from source (RetroArch cores + standalone)
- **533 systems** handled by those emulators (NES, SNES, PlayStation, Saturn, Dreamcast, ...)
- **532 systems** handled by those emulators (NES, SNES, PlayStation, Saturn, Dreamcast, ...)
- **19,943 files in the collection**, each with its SHA1, MD5, SHA256, CRC32 and Adler-32 fingerprints: 5,740 system files, 2,975 arcade ROM sets, 11,228 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
- **566 of 5,740 system files** matched to dump-preservation catalogs (No-Intro, Redump, TOSEC). Arcade sets and engine data fall outside what those catalogs index
- **15.7 GB** for the whole collection
## 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 499+ 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 498+ more.
Full list with per-file details: **[https://abdess.github.io/retrobios/](https://abdess.github.io/retrobios/)**
@@ -100,22 +100,22 @@ Full list with per-file details: **[https://abdess.github.io/retrobios/](https:/
| Platform | On its BIOS list | Files its emulators load | Checked by |
|----------|-----------------:|-------------------------:|------------|
| AmberELEC | 414/434 | 4,751/4,935 | MD5 hash |
| Batocera | 353/353 | 14,171/15,291 | MD5 hash |
| Batocera | 353/353 | 14,172/15,292 | MD5 hash |
| BizHawk | 118/118 | - | SHA1 hash |
| EmuDeck | 168/168 | 8,422/8,525 | MD5 hash |
| EmuDeck | 168/168 | 8,426/8,529 | MD5 hash |
| EmuELEC | 544/572 | 4,786/10,215 | MD5 hash |
| KNULLI | 290/290 | 9,126/15,349 | MD5 hash |
| Lakka | 532/532 | 7,910/7,996 | file presence |
| KNULLI | 290/290 | 9,127/15,350 | MD5 hash |
| Lakka | 532/532 | 7,909/7,995 | file presence |
| MiSTer FPGA | 81/81 | - | MD5 hash |
| MinUI | 0/0 | 78/79 | file presence |
| MyMinUI | 0/0 | 356/367 | file presence |
| NextUI | 0/0 | 343/350 | file presence |
| ROCKNIX | 38/38 | 7,421/9,134 | MD5 hash |
| ROCKNIX | 38/38 | 7,425/9,138 | MD5 hash |
| Recalbox | 351/351 | 3,125/3,344 | MD5 hash |
| RetroArch | 526/526 | 7,919/7,987 | file presence |
| RetroBat | 348/348 | 5,133/9,658 | MD5 hash |
| RetroDECK | 2,007/2,008 | 6,703/6,991 | MD5 hash |
| RetroPie * | 532/532 | 8,120/12,775 | file presence |
| RetroArch | 526/526 | 7,918/7,986 | file presence |
| RetroBat | 348/348 | 5,134/9,659 | MD5 hash |
| RetroDECK | 2,007/2,008 | 6,705/6,993 | MD5 hash |
| RetroPie * | 532/532 | 8,119/12,774 | file presence |
| RomM | 383/383 | 83/873 | 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/).
@@ -203,4 +203,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 project's legal position](https://abdess.github.io/retrobios/wiki/legal/).
*Auto-generated on 2026-11-05T12:02:13Z*
*Auto-generated on 2026-11-05T12:13:24Z*
File renamed without changes.
File renamed without changes.
+53 -53
View File
@@ -1,6 +1,6 @@
{
"schema_version": 1,
"generated_at": "2026-11-05T11:59:40Z",
"generated_at": "2026-11-05T12:13:24Z",
"total_files": 19943,
"total_size": 16892630154,
"bios_dir": "bios",
@@ -131310,6 +131310,26 @@
"crc32": "bb4b1c70",
"adler32": "81802751"
},
"f957c9aedd8ea478dafd98babe41faec7f339d8a": {
"path": "bios/Microsoft/Xbox/C/xbox.xtf",
"name": "xbox.xtf",
"size": 15613736,
"sha1": "f957c9aedd8ea478dafd98babe41faec7f339d8a",
"md5": "0466dd6c19ec9c1785e8aadfc8c5269e",
"sha256": "21c6207d02009a78767783679b6e74da3d4ca6e077c4808007f79dfe083d7489",
"crc32": "b12ee192",
"adler32": "ae7294e0"
},
"8b6e63f86dfd31821df210f5da73f8428b4fff15": {
"path": "bios/Microsoft/Xbox/C/xboxdash.xbe",
"name": "xboxdash.xbe",
"size": 1929216,
"sha1": "8b6e63f86dfd31821df210f5da73f8428b4fff15",
"md5": "8da4d816604e9b9d5aa69d1fd395a48e",
"sha256": "3ae2f3eae3917e0130d1e1a5c8e1c5df207ea31703646a174d98f7be9a769495",
"crc32": "4e78e0ae",
"adler32": "fed648f4"
},
"358a20e61ec1a2387127b1fa92113034fb279f9b": {
"path": "bios/Microsoft/Xbox/Complex.bin",
"name": "Complex.bin",
@@ -141597,26 +141617,6 @@
"crc32": "4d47ad9b",
"adler32": "991208da"
},
"f957c9aedd8ea478dafd98babe41faec7f339d8a": {
"path": "bios/Other/hakux/C/xbox.xtf",
"name": "xbox.xtf",
"size": 15613736,
"sha1": "f957c9aedd8ea478dafd98babe41faec7f339d8a",
"md5": "0466dd6c19ec9c1785e8aadfc8c5269e",
"sha256": "21c6207d02009a78767783679b6e74da3d4ca6e077c4808007f79dfe083d7489",
"crc32": "b12ee192",
"adler32": "ae7294e0"
},
"8b6e63f86dfd31821df210f5da73f8428b4fff15": {
"path": "bios/Other/hakux/C/xboxdash.xbe",
"name": "xboxdash.xbe",
"size": 1929216,
"sha1": "8b6e63f86dfd31821df210f5da73f8428b4fff15",
"md5": "8da4d816604e9b9d5aa69d1fd395a48e",
"sha256": "3ae2f3eae3917e0130d1e1a5c8e1c5df207ea31703646a174d98f7be9a769495",
"crc32": "4e78e0ae",
"adler32": "fed648f4"
},
"231b29ef9d6314930eb18e57240e27ae81a6e88f": {
"path": "bios/Other/hakux/controller_map.txt",
"name": "controller_map.txt",
@@ -217650,6 +217650,8 @@
"65a8ebf870420316a939ac44fd4c731d": "b15c6a834b7029e2dfed22127cf905b06857e6f5",
"ec00e31e746de2473acfe7903c5a4cb7": "6639b6693784574d204c42703a74fd8b088a3a5e",
"8cd18e1748114b3b019aed171cac2ee0": "c54a8e4f2fe01be6e85c9d210f432e4c82e0418c",
"0466dd6c19ec9c1785e8aadfc8c5269e": "f957c9aedd8ea478dafd98babe41faec7f339d8a",
"8da4d816604e9b9d5aa69d1fd395a48e": "8b6e63f86dfd31821df210f5da73f8428b4fff15",
"21445c6f28fca7285b0f167ea770d1e5": "358a20e61ec1a2387127b1fa92113034fb279f9b",
"39cee882148a87f93cb440b99dde3ceb": "3944392c954cfb176d4210544e88353b3c5d36b1",
"04e9565c5eb34c71c8f5f8b9f6524406": "4e1c2c2ee308ca4591542b3ca48653f65fae6e0f",
@@ -218614,8 +218616,6 @@
"a5518586f9c4c0bebc9fd6f322c6f501": "72ea5f869695d13dc8f3bf4806ee384aa766ab09",
"2f355f03254e572dd32e6fe7232f5ccc": "8881159097cd92f67bfec5250bc061626d87cf04",
"d87d6498c9e36a69907038e9198b7efb": "328b2ec7402df86add5c9cd68692c126b7e79707",
"0466dd6c19ec9c1785e8aadfc8c5269e": "f957c9aedd8ea478dafd98babe41faec7f339d8a",
"8da4d816604e9b9d5aa69d1fd395a48e": "8b6e63f86dfd31821df210f5da73f8428b4fff15",
"41eed0bf6aad777e6583ecb2ff0907b8": "231b29ef9d6314930eb18e57240e27ae81a6e88f",
"3155df291027d253e2596db3fca1ac4a": "2651f1eff1785999918c08600f079e1ad4a206e7",
"2f5c49dca4993da5911d632d3962c1f3": "0d4dee46085ced0fd117030a13533d903265301c",
@@ -258422,6 +258422,14 @@
"c54a8e4f2fe01be6e85c9d210f432e4c82e0418c",
"9da5f9ecfb1c9c32efa616f0300d02e8f702244d"
],
"xbox.xtf": [
"f957c9aedd8ea478dafd98babe41faec7f339d8a",
"df0cadf1a4a080992ef0459c413a841bc3906cc7"
],
"xboxdash.xbe": [
"8b6e63f86dfd31821df210f5da73f8428b4fff15",
"4d8d6b1d3f7ace05cbaf03565382b0e6e40c706c"
],
"Complex.bin": [
"358a20e61ec1a2387127b1fa92113034fb279f9b"
],
@@ -258464,10 +258472,6 @@
"Xbox Book.xtf": [
"4cc817432b81b7bd3b9f782b678bd69e3d4d5715"
],
"xbox.xtf": [
"df0cadf1a4a080992ef0459c413a841bc3906cc7",
"f957c9aedd8ea478dafd98babe41faec7f339d8a"
],
"xbox.xex": [
"1c577b7495d3d119f5a584b328e837901c537a28"
],
@@ -260597,10 +260601,6 @@
"EEPROM.bin": [
"d70fd7c6dac8b4bba1640faa9e48acc45de59d15"
],
"xboxdash.xbe": [
"4d8d6b1d3f7ace05cbaf03565382b0e6e40c706c",
"8b6e63f86dfd31821df210f5da73f8428b4fff15"
],
"chihiro_xbox_bios.bin": [
"b700b0041af8f84835e45d1d1250247bf7077188"
],
@@ -295594,6 +295594,8 @@
"32edb1d4": "b15c6a834b7029e2dfed22127cf905b06857e6f5",
"ccb97a84": "6639b6693784574d204c42703a74fd8b088a3a5e",
"bb4b1c70": "c54a8e4f2fe01be6e85c9d210f432e4c82e0418c",
"b12ee192": "f957c9aedd8ea478dafd98babe41faec7f339d8a",
"4e78e0ae": "8b6e63f86dfd31821df210f5da73f8428b4fff15",
"2c7a2191": "358a20e61ec1a2387127b1fa92113034fb279f9b",
"1dbb7b59": "3944392c954cfb176d4210544e88353b3c5d36b1",
"5ae5278a": "4e1c2c2ee308ca4591542b3ca48653f65fae6e0f",
@@ -296558,8 +296560,6 @@
"54fa92ab": "72ea5f869695d13dc8f3bf4806ee384aa766ab09",
"b8f57432": "8881159097cd92f67bfec5250bc061626d87cf04",
"4d47ad9b": "328b2ec7402df86add5c9cd68692c126b7e79707",
"b12ee192": "f957c9aedd8ea478dafd98babe41faec7f339d8a",
"4e78e0ae": "8b6e63f86dfd31821df210f5da73f8428b4fff15",
"bef6e55c": "231b29ef9d6314930eb18e57240e27ae81a6e88f",
"5808049a": "2651f1eff1785999918c08600f079e1ad4a206e7",
"89fa9730": "0d4dee46085ced0fd117030a13533d903265301c",
@@ -315538,6 +315538,8 @@
"63c781b9e50bfd55f10700eb70b5c571a9bedfd8d35af29f6a22a77550df5e7b": "b15c6a834b7029e2dfed22127cf905b06857e6f5",
"34f1c8ded59116436065783f8ad2ef0939df3cbfc76277ec9e5c41bf9ccb93cd": "6639b6693784574d204c42703a74fd8b088a3a5e",
"eb35d069715dfc0d37cfac086a0b73a89a02e8f12519cd8eda82ad479d1a4eed": "c54a8e4f2fe01be6e85c9d210f432e4c82e0418c",
"21c6207d02009a78767783679b6e74da3d4ca6e077c4808007f79dfe083d7489": "f957c9aedd8ea478dafd98babe41faec7f339d8a",
"3ae2f3eae3917e0130d1e1a5c8e1c5df207ea31703646a174d98f7be9a769495": "8b6e63f86dfd31821df210f5da73f8428b4fff15",
"1de4c87effe40d44f95581d204f9fa0600fbd5fe2171692316dcf97af0f4113f": "358a20e61ec1a2387127b1fa92113034fb279f9b",
"3d5fae186cb31b5a6331155e532ef63e493afd85d7af8576fb52c95d0ce0362c": "3944392c954cfb176d4210544e88353b3c5d36b1",
"b5c2cbdf297cd66ada8ef6fe4224c7c437cabc83d7c40c8e44af4941a72339c5": "4e1c2c2ee308ca4591542b3ca48653f65fae6e0f",
@@ -316502,8 +316504,6 @@
"52fab6a73204dc9bbb09d5c8c85c283f4d6bf25220a3bae3573c268908751f2b": "72ea5f869695d13dc8f3bf4806ee384aa766ab09",
"cd260d1c420dec2ad2d9511b522d88a72f820d2ca2ff63ded2cd95854d4748dd": "8881159097cd92f67bfec5250bc061626d87cf04",
"3b6b7288c186e4b8265cb1996af0e3620267ada9faf38f57d6f87b759ad804b7": "328b2ec7402df86add5c9cd68692c126b7e79707",
"21c6207d02009a78767783679b6e74da3d4ca6e077c4808007f79dfe083d7489": "f957c9aedd8ea478dafd98babe41faec7f339d8a",
"3ae2f3eae3917e0130d1e1a5c8e1c5df207ea31703646a174d98f7be9a769495": "8b6e63f86dfd31821df210f5da73f8428b4fff15",
"c8dd1e361ab3219a956b9b7879a17658b10273cc3569bf23cb9ffb23f55e5152": "231b29ef9d6314930eb18e57240e27ae81a6e88f",
"7cf66357beab4fa3ed48a63195e2c8ec7a7c59c053e6e20cdaa5163a32782fe6": "2651f1eff1785999918c08600f079e1ad4a206e7",
"994886a47a7e4f542bc0824758f122004887e19ddbdf83909bca635748f50c64": "0d4dee46085ced0fd117030a13533d903265301c",
@@ -483940,6 +483940,24 @@
".variants/xbox_hdd.qcow2.8cd18e17": [
"c54a8e4f2fe01be6e85c9d210f432e4c82e0418c"
],
"Microsoft/Xbox/C/xbox.xtf": [
"f957c9aedd8ea478dafd98babe41faec7f339d8a"
],
"Xbox/C/xbox.xtf": [
"f957c9aedd8ea478dafd98babe41faec7f339d8a"
],
"C/xbox.xtf": [
"f957c9aedd8ea478dafd98babe41faec7f339d8a"
],
"Microsoft/Xbox/C/xboxdash.xbe": [
"8b6e63f86dfd31821df210f5da73f8428b4fff15"
],
"Xbox/C/xboxdash.xbe": [
"8b6e63f86dfd31821df210f5da73f8428b4fff15"
],
"C/xboxdash.xbe": [
"8b6e63f86dfd31821df210f5da73f8428b4fff15"
],
"Microsoft/Xbox/Complex.bin": [
"358a20e61ec1a2387127b1fa92113034fb279f9b"
],
@@ -493830,24 +493848,6 @@
"gsplus-legacy/letgothl.ttf": [
"328b2ec7402df86add5c9cd68692c126b7e79707"
],
"Other/hakux/C/xbox.xtf": [
"f957c9aedd8ea478dafd98babe41faec7f339d8a"
],
"hakux/C/xbox.xtf": [
"f957c9aedd8ea478dafd98babe41faec7f339d8a"
],
"C/xbox.xtf": [
"f957c9aedd8ea478dafd98babe41faec7f339d8a"
],
"Other/hakux/C/xboxdash.xbe": [
"8b6e63f86dfd31821df210f5da73f8428b4fff15"
],
"hakux/C/xboxdash.xbe": [
"8b6e63f86dfd31821df210f5da73f8428b4fff15"
],
"C/xboxdash.xbe": [
"8b6e63f86dfd31821df210f5da73f8428b4fff15"
],
"Other/hakux/controller_map.txt": [
"231b29ef9d6314930eb18e57240e27ae81a6e88f"
],
+3
View File
@@ -102,6 +102,7 @@ notes: |
files:
- name: ps2-0230a-20080220.bin
found_by: content
path: bios/ps2-0230a-20080220.bin
required: true
min_size: 4194304
@@ -148,6 +149,7 @@ files:
source_ref: "source aethersx2/pcsx2/CDVD/CDVD.cpp:120-144, aethersx2 v1.5-3606 usr/share/aethersx2 0x95e7fc"
- name: eeprom.dat
load_from: working_directory
required: false
hle_fallback: true
size: 64
@@ -156,6 +158,7 @@ files:
source_ref: "source aethersx2/pcsx2/DEV9/DEV9.cpp:146-161, aethersx2 v1.5-3606 usr/share/aethersx2 0x97ac90"
- name: flash.dat
load_from: working_directory
required: false
hle_fallback: true
max_size: 8650752
+3
View File
@@ -163,6 +163,7 @@ notes: |
files:
- name: ps2-0230a-20080220.bin
found_by: content
path: pcsx2/bios/ps2-0230a-20080220.bin
aliases: [ps2-0250j-20100415.bin]
standalone_path: bios/ps2-0230a-20080220.bin
@@ -286,6 +287,7 @@ files:
source_ref: "source pcsx2/CDVD/CDVD.cpp:63-64, source pcsx2/CDVD/CDVD.cpp:207-220"
- name: eeprom.dat
load_from: working_directory
required: false
hle_fallback: true
size: 64
@@ -297,6 +299,7 @@ files:
source_ref: "source pcsx2/DEV9/DEV9.cpp:78, source pcsx2/DEV9/DEV9.cpp:225-276"
- name: flash.dat
load_from: working_directory
required: false
hle_fallback: true
max_size: 8650752
+1
View File
@@ -4,6 +4,7 @@ core_classification: game_engine
source: "https://github.com/christianhaitian/bennugd-monolithic"
profiled_date: "2026-10-22"
source_commit: "60ee3389efcf9b402d66035e87f33d17d70cbd83"
pin_frozen: "EmuELEC, the only platform that ships it, builds this revision (EmuELEC packages/sx05re/emuelec-ports/bennugd-monolithic/package.mk:5 at v4.8). Later commits are not part of that build."
core_version: "1.0.0"
version_basis:
kind: file
+1
View File
@@ -4,6 +4,7 @@ core_classification: game_engine
source: "https://github.com/cyxx/bermuda"
profiled_date: "2026-10-22"
source_commit: "cf6bdb68d53a1618967da565a44c931b15daf791"
pin_frozen: "EmuELEC, the only platform that ships it, builds this revision (EmuELEC packages/sx05re/emuelec-ports/bermuda/package.mk:5 at v4.8). Later commits are not part of that build."
core_version: "0.1.7"
version_basis:
kind: file
+18 -18
View File
@@ -12,7 +12,7 @@ version_basis:
distance: 0
display_name: "Bermuda Syndrome (bs)"
cores: [bsyndrome]
systems: [bsyndrome]
systems: [bermuda-syndrome]
notes: |
Rewrite of the engine of Bermuda Syndrome (Century Interactive, BMG, 1995)
@@ -54,7 +54,7 @@ files:
- name: "_01.SCN"
path: "DATA/SCN/_01.SCN"
category: game_data
system: bsyndrome
system: bermuda-syndrome
required: true
description: "Startup scene of the English and French releases"
source_ref: "game.cpp:33-51"
@@ -64,7 +64,7 @@ files:
- name: "bermuda.wgp"
path: "DATA/bermuda.wgp"
category: game_data
system: bsyndrome
system: bermuda-syndrome
required: true
description: "Bag background image"
source_ref: "resource.cpp:51"
@@ -73,7 +73,7 @@ files:
- name: "bermuda.spr"
path: "DATA/bermuda.spr"
category: game_data
system: bsyndrome
system: bermuda-syndrome
required: true
description: "Common sprites"
source_ref: "resource.cpp:60"
@@ -82,7 +82,7 @@ files:
- name: "bermuda.ovr"
path: "DATA/bermuda.ovr"
category: game_data
system: bsyndrome
system: bermuda-syndrome
required: true
description: "Overlay data of the full game"
source_ref: "resource.cpp:45-49"
@@ -92,7 +92,7 @@ files:
- name: "LOGO.AVI"
path: "DATA/DATA/LOGO.AVI"
category: game_data
system: bsyndrome
system: bermuda-syndrome
required: false
description: "Logo video"
source_ref: "game.cpp:138, 1043-1058"
@@ -102,7 +102,7 @@ files:
- name: "track01.ogg"
path: "MUSIC/track01.ogg"
category: game_data
system: bsyndrome
system: bermuda-syndrome
required: false
description: "CD audio track 01, played in place of title.mid"
source_ref: "game.cpp:1078-1112"
@@ -111,7 +111,7 @@ files:
- name: "track02.ogg"
path: "MUSIC/track02.ogg"
category: game_data
system: bsyndrome
system: bermuda-syndrome
required: false
description: "CD audio track 02, played in place of flyaway.mid"
source_ref: "game.cpp:1078-1112"
@@ -120,7 +120,7 @@ files:
- name: "track03.ogg"
path: "MUSIC/track03.ogg"
category: game_data
system: bsyndrome
system: bermuda-syndrome
required: false
description: "CD audio track 03, played in place of jungle1.mid and of the demo musik.mid"
source_ref: "game.cpp:1078-1112"
@@ -129,7 +129,7 @@ files:
- name: "track04.ogg"
path: "MUSIC/track04.ogg"
category: game_data
system: bsyndrome
system: bermuda-syndrome
required: false
description: "CD audio track 04, played in place of sadialog.mid"
source_ref: "game.cpp:1078-1112"
@@ -138,7 +138,7 @@ files:
- name: "track05.ogg"
path: "MUSIC/track05.ogg"
category: game_data
system: bsyndrome
system: bermuda-syndrome
required: false
description: "CD audio track 05, played in place of caves.mid"
source_ref: "game.cpp:1078-1112"
@@ -147,7 +147,7 @@ files:
- name: "track06.ogg"
path: "MUSIC/track06.ogg"
category: game_data
system: bsyndrome
system: bermuda-syndrome
required: false
description: "CD audio track 06, played in place of jungle2.mid"
source_ref: "game.cpp:1078-1112"
@@ -156,7 +156,7 @@ files:
- name: "track07.ogg"
path: "MUSIC/track07.ogg"
category: game_data
system: bsyndrome
system: bermuda-syndrome
required: false
description: "CD audio track 07, played in place of darkcave.mid"
source_ref: "game.cpp:1078-1112"
@@ -165,7 +165,7 @@ files:
- name: "track08.ogg"
path: "MUSIC/track08.ogg"
category: game_data
system: bsyndrome
system: bermuda-syndrome
required: false
description: "CD audio track 08, played in place of waterdiv.mid"
source_ref: "game.cpp:1078-1112"
@@ -174,7 +174,7 @@ files:
- name: "track09.ogg"
path: "MUSIC/track09.ogg"
category: game_data
system: bsyndrome
system: bermuda-syndrome
required: false
description: "CD audio track 09, played in place of merian1.mid"
source_ref: "game.cpp:1078-1112"
@@ -183,7 +183,7 @@ files:
- name: "track10.ogg"
path: "MUSIC/track10.ogg"
category: game_data
system: bsyndrome
system: bermuda-syndrome
required: false
description: "CD audio track 10, played in place of telquad.mid"
source_ref: "game.cpp:1078-1112"
@@ -192,7 +192,7 @@ files:
- name: "track11.ogg"
path: "MUSIC/track11.ogg"
category: game_data
system: bsyndrome
system: bermuda-syndrome
required: false
description: "CD audio track 11, played in place of gameover.mid"
source_ref: "game.cpp:1078-1112"
@@ -201,7 +201,7 @@ files:
- name: "track12.ogg"
path: "MUSIC/track12.ogg"
category: game_data
system: bsyndrome
system: bermuda-syndrome
required: false
description: "CD audio track 12, played in place of complete.mid"
source_ref: "game.cpp:1078-1112"
-5
View File
@@ -181,7 +181,6 @@ files:
size: 8192
sha1: "4ff0f11e80f4b57430d8f0c3799ed0f0e0f4565d"
validation: [size, sha1]
region: [japan]
description: "Japanese C64 kernal"
source_ref: "source C64.emu/src/vice/c64/c64rom.h:49, 90, source C64.emu/src/vice/c64/c64model.c:148-151, source C64.emu/src/vice/c64/c64-resources.c:246"
@@ -230,7 +229,6 @@ files:
required: false
size: 4096
validation: [size]
region: [japan]
description: "Japanese C64 character generator"
source_ref: "source C64.emu/src/vice/c64/c64rom.h:61, source C64.emu/src/vice/c64/c64model.c:148-151, 323"
@@ -279,7 +277,6 @@ files:
required: false
size: 4096
validation: [size]
region: [japan]
description: "Japanese character generator, Japanese SuperCPU model"
source_ref: "source C64.emu/src/vice/scpu64/scpu64model.c:303, source C64.emu/src/vice/c64/c64rom.h:61"
@@ -580,7 +577,6 @@ files:
required: false
size: 8192
validation: [size]
region: [japan]
description: "VIC-1001 kernal"
source_ref: "source C64.emu/src/vice/vic20/vic20rom.h:51, source C64.emu/src/vice/vic20/vic20model.c:60, 140"
@@ -608,7 +604,6 @@ files:
required: false
size: 4096
validation: [size]
region: [japan]
description: "VIC-1001 character generator"
source_ref: "source C64.emu/src/vice/vic20/vic20rom.h:57, source C64.emu/src/vice/vic20/vic20model.c:60, 139"
+1
View File
@@ -4,6 +4,7 @@ core_classification: game_engine
source: "https://github.com/lemon32767/ccleste"
profiled_date: "2026-10-22"
source_commit: "261d96f15af430b8111abc7a5250229246654f52"
pin_frozen: "EmuELEC, the only platform that ships it, builds this revision (EmuELEC packages/sx05re/emuelec-ports/ccleste/package.mk:5 at v4.8). Later commits are not part of that build."
core_version: "v1.4.0"
version_basis:
kind: tag
+2 -2
View File
@@ -712,12 +712,12 @@ files:
path: MasterSystem/bios.sms
system: sega-mastersystem
description: "European/US Master System BIOS"
region: [north-america, europe, oceania, brazil]
region: [north-america, latin-america, europe, oceania]
size: 8192
crc32: "0072ed54"
required: false
note: "Optional. Boots cartridge directly if absent. Loaded for every region but Japan."
source_ref: "Machines/Utility/ROMCatalogue.cpp:764-771, Machines/MasterSystem/MasterSystem.cpp:137-140, Analyser/Static/Sega/Target.hpp:24-29"
source_ref: "Machines/Utility/ROMCatalogue.cpp:764-771, Machines/MasterSystem/MasterSystem.cpp:137-140, Analyser/Static/Sega/Target.hpp:24-29, Analyser/Static/Sega/StaticAnalyser.cpp:49-66"
- name: japanese-bios.sms
path: MasterSystem/japanese-bios.sms
+1 -1
View File
@@ -28,7 +28,7 @@ notes: |
paths (:1473-1491) looking for a folder that passes
App:isThemeHospitalPath, which demands three subdirectories
named data, levels and qdata (:1435-1447).
2. Once a candidate is accepted, three sentinel files MUST exist
2. Once a candidate is accepted, three sentinel files must exist
(:1523-1525):
DATA/VBlk-0.tab
LEVELS/Level.L1
+1 -1
View File
@@ -21,7 +21,7 @@ systems:
# (Doukutsu Monogatari) engine in Rust, ported to libretro by Dr. Glaucous.
# It plays the original freeware Cave Story and Cave Story+ (Steam/Switch).
#
# The core does NOT use RetroArch's system directory for any BIOS or firmware.
# The core does not use RetroArch's system directory for any BIOS or firmware.
# get_system_directory() is defined in libretro.rs:1255 but never called by
# the core (the import is commented out in core.rs:28).
#
+2
View File
@@ -257,6 +257,7 @@ files:
source_ref: "source app/src/main/cpp/pcsx2/pcsx2/CDVD/CDVD.cpp:50-51, source app/src/main/cpp/pcsx2/pcsx2/CDVD/CDVD.cpp:195-208"
- name: eeprom.dat
load_from: working_directory
system: sony-playstation-2
required: false
hle_fallback: true
@@ -269,6 +270,7 @@ files:
source_ref: "source app/src/main/cpp/pcsx2/pcsx2/DEV9/DEV9.cpp:104-167"
- name: flash.dat
load_from: working_directory
system: sony-playstation-2
required: false
hle_fallback: true
+1 -1
View File
@@ -35,7 +35,7 @@ notes: |
3. "Char ROM" (4096 bytes, CHAR_ROM_SIZE 0x1000) -> TheC64->Char
4. "1541 ROM" (16384 bytes, DRIVE_ROM_SIZE 0x4000) -> TheC64->ROM1541
The core does NOT construct paths relative to retro_system_directory for
The core does not construct paths relative to retro_system_directory for
ROM loading. The system directory variable is fetched in retro_init() but
only used for the save directory fallback, not for ROM path construction.
DATADIR defaults to "" (empty string) when not defined by the build
+3 -3
View File
@@ -28,7 +28,7 @@ notes: |
{system_dir}/fuse/{rom_filename} (src/compat/file.c:160-175).
Embedded ROMs cover 48K-family, 128K, +2, +3, +3e, SE, TC2048, TC2068.
Pentagon, Scorpion, and peripheral ROMs are NOT embedded and must be
Pentagon, Scorpion, and peripheral ROMs are not embedded and must be
placed in {system_dir}/fuse/ by the user.
Default ROM filenames are set in fuse/settings.c:209-260. Each machine
@@ -244,7 +244,7 @@ files:
note: "Timex TC2068 ROM 1 (EXROM). Also used for TS2068. Embedded in core."
source_ref: "fuse/settings.c:262, fuse/settings.c:264, fuse/machines/tc2068.c:141"
# -- External ROMs (NOT embedded, must be in {system_dir}/fuse/) --
# -- External ROMs (not embedded, must be in {system_dir}/fuse/) --
# Pentagon family
- name: "fuse/128p-0.rom"
@@ -441,7 +441,7 @@ platform_details:
plus3-0/1/2/3.rom, plus3e-0/1/2/3.rom, se-0.rom, se-1.rom,
tc2048.rom, tc2068-0.rom, tc2068-1.rom.
disciple.rom, plusd.rom, speccyboot-1.4.rom are present in the repo
fuse/roms/ directory but NOT in mem_entries[], so they are loaded
fuse/roms/ directory but not in mem_entries[], so they are loaded
from the filesystem only.
machine_rom_map:
+56 -55
View File
@@ -4,9 +4,9 @@ core_classification: official_port
source: "https://github.com/libretro/hatari"
upstream: "https://github.com/hatari/hatari"
logo: "https://raw.githubusercontent.com/hatari/hatari/main/share/icons/hicolor/scalable/apps/hatari.svg"
profiled_date: "2026-10-21"
source_commit: "50929946d196f431906932420c55e1b3593dacc5"
upstream_commit: "23bc3060ebf0da348cc842e358c102ba88002b56"
profiled_date: "2026-11-05"
source_commit: "25f488b1667ed064a25c30eb3f06b40bc877c495"
upstream_commit: "c453b85f811fc11bed10e19e5e48fe95377e5a23"
core_version: "2.6.1-devel"
version_basis:
kind: file
@@ -38,39 +38,36 @@ data_root:
note: "~/.hatari is used instead when it exists and ~/.config/hatari does not. Holds hatari.cfg, hatari.nvram and auto.sav. The default tos.img is read from ../share/hatari beside the bin directory."
notes: |
The main branch of libretro/hatari is the upstream Hatari tree with its
experimental libretro target in src/retro, which upstream added in
January 2026, plus the port commits that follow their merge base,
51ed9991: VFS, disk control, core options, hard disk loading, the
virtual keyboard, drive LEDs and the floppy drive sound. It builds as
hatari_libretro (.gitlab-ci-libretro.yml:10-11, src/CMakeLists.txt:371-404),
reports library_name hatari and the HATARI_VERSION string 2.6.1-devel
(src/retro/main_retro.c:223-224, src/includes/version.h:8). The .info
The main branch of libretro/hatari is the upstream Hatari tree at
c453b85f, whose libretro target in src/retro carries the VFS, disk
control, core options and hard disk loading, with 23 port commits on top:
the libretro CI, static builds, the virtual keyboard, drive LEDs, the
floppy drive sound and the RetroArch reset. It builds as hatari_libretro
(.gitlab-ci-libretro.yml:10-11, src/CMakeLists.txt:331-341,
src/CMakeLists.txt:455-475), reports library_name hatari and the
HATARI_VERSION string 2.6.1-devel (src/retro/main_retro.c:243-244,
src/includes/version.h:8). The .info
shipped in the tree declares no firmware
(share/libretro/info/libretro-hatari.info). The
hatari_libretro.info in libretro-core-info took that file's metadata on
2026-09-16 and keeps a tos.img firmware entry with the TOS 1.02 US MD5,
which this code never checks.
retro_init builds <system>/tos.img, records whether it exists and passes
it as --tos (src/retro/main_retro.c:160-211). It first reads floppy.raw
from the system directory as the floppy drive sample
(src/retro/main_retro.c:185, src/retro/floppy_sound.c:146-186). When
tos.img is absent a frontend message is shown and retro_run only
refreshes the framebuffer (src/retro/main_retro.c:190-193,
src/retro/main_retro.c:286-299). The
name is fixed by that check: the .rom and .tos fallbacks of File_Read
(src/tos.c:60-66, src/file.c:312-353, src/file.c:544-583) are never
reached under a frontend. A missing --tos file fails option parsing
(src/options.c:1026-1079, src/options.c:1937-1945), but Main_ErrorExit only
raises the quit flag in this build (src/retro/main_retro.c:529-541), so
Main_Init carries on with bUseTos cleared and TOS_InitImage installs the
built-in test stub of faketosData.c instead of reading a ROM
(src/tos.c:43, src/tos.c:1112-1131, src/tos.c:1151-1162). Without a
system directory Main_Init runs with no --tos, the TOS path falls back to
tos.img in the Hatari data directory derived from the executable location
(src/configuration.c:810-812, src/paths.c:305-356, CMakeLists.txt:422-434)
and have_bios is never set. TOS_LoadImage strips the 256-byte (34-byte
retro_init builds <system>/tos.img and passes it as --tos when it exists
(src/retro/main_retro.c:174-231). It first reads floppy.raw from the
system directory as the floppy drive sample (src/retro/main_retro.c:202,
src/retro/floppy_sound.c:146-186). When tos.img is absent a frontend
message is shown, bUseTos is cleared and Main_Init runs without --tos
(src/retro/main_retro.c:207-222), so TOS_InitImage installs the built-in
test stub of faketosData.c instead of reading a ROM (src/tos.c:43,
src/tos.c:1112-1131, src/tos.c:1151-1162). The name is fixed by that
check: the .rom and .tos fallbacks of File_Read (src/tos.c:60-66,
src/retro/file_retro.c:64-88, src/filename.c:175-214) are never reached
under a frontend. Without a system directory Main_Init runs with no
--tos, and the TOS path falls back to tos.img in the Hatari data
directory derived from the executable location
(src/configuration.c:810-812, src/paths.c:305-356,
CMakeLists.txt:413-425). TOS_LoadImage strips the 256-byte (34-byte
for 4.92) loader of a RAM TOS, detects EmuTOS by ETOS at offset 0x2c,
refuses images below 0x40 bytes, above 1 MB, with a version outside
0x100-0x6FF or a load address other than 0xE00000 or 0xFC0000, and
@@ -82,63 +79,67 @@ notes: |
defaults to SYM_AUTOLOAD_DEBUGGER (src/configuration.c:621,
src/includes/configuration.h:29-31), every TOS load also reads a
<tos>.sym symbol table when one exists (src/tos.c:1094,
src/debug/symbols.c:1095-1113, src/debug/symbols.c:1002-1020,
src/debug/symbols.c:1099-1117, src/debug/symbols.c:1002-1024,
src/debug/symbols.c:372-407).
The Hatari home directory is the RetroArch save directory
(src/paths.c:236-250). Configuration is read from <CONFDIR>/hatari.cfg,
/etc on Unix and the current directory on Windows, then from hatari.cfg
in that home directory, before the --tos argument is applied
(src/main.c:260-282, src/main.c:319-322, src/configuration.c:862-867,
src/configuration.c:1061-1071, CMakeLists.txt:444-461). The boot core
(src/main.c:256-278, src/main.c:315-318, src/configuration.c:862-867,
src/configuration.c:1061-1071, CMakeLists.txt:435-452). The boot core
options are applied right after the command line, so the machine, DSP,
CPU, FPU, memory and hatari_patch_tos keys of hatari.cfg are overwritten
by them (src/main.c:328-330, src/retro/options.c:817-882). Every other
by them (src/main.c:324, src/retro/main_retro.c:519-522,
src/retro/options.c:817-882). Every other
section is honoured: the cartridge image (src/configuration.c:487-493),
floppy images, GEMDOS directories and ACSI, SCSI and IDE images
(src/configuration.c:362-364, src/configuration.c:375-483), MIDI, printer,
RS232 and SCC host endpoints (src/configuration.c:509-543), all disabled
by default (src/configuration.c:736-761) and opened by Midi_Host_Open,
Printer_TransferByteTo, RS232_OpenCOMPort and SCC_Init_Channel when
enabled (src/midi.c:342-367, src/printer.c:42-65, src/printer.c:89-106,
enabled (src/midi.c:340-365, src/printer.c:42-65, src/printer.c:89-106,
src/rs232.c:175-246, src/scc.c:439-500). szMappingFileName is parsed
(src/configuration.c:256) but the port's Keymap_LoadRemapFile is empty
(src/retro/keymap.c:222-224). Only the SDL build reads a keymap file
(src/sdl/keymap.c:701). The autosave snapshot is restored by
M68000_Start (src/m68000.c:332-348), which the port never calls. TT and
Falcon NVRAM is hatari.nvram in the home directory, read at NvRam_Init
and written at exit (src/falcon/nvram.c:282-294,
src/falcon/nvram.c:334-337).
and written at exit (src/falcon/nvram.c:480-492,
src/falcon/nvram.c:535-538).
Content is a floppy image, an .m3u list parsed relative to its own
directory (src/retro/disk_control.c:94-182), an .ide image put on the
IDE master, a .vhd image put on ACSI 0 or a .gem marker naming a GEMDOS
directory (src/retro/main_retro.c:420-478, src/retro/harddisk.c:32-129).
directory (src/retro/main_retro.c:427-485, src/retro/harddisk.c:32-129).
With a .gem, <system>/hatari/BOOT.ST is inserted into drive A when it
exists (src/retro/harddisk.c:105-127). A disk whose name ends in A pulls
the sibling ending in B into drive B (src/floppy.c:300-343,
src/floppy.c:385-388), and an STX image reads its .wd1772 overlay from
the same directory (src/floppies/stx.c:807-827). Savestates pass through
hatari_savestate.tmp in the system directory
(src/retro/main_retro.c:44, src/retro/main_retro.c:343-410). IPF support
(src/retro/main_retro.c:43, src/retro/main_retro.c:350-417). IPF support
is compiled in from rsn8887/capsimg when ENABLE_STATIC_CAPSIMAGE is on
(cmake/BuildDependencies.cmake:93-126). The Windows jobs build with it
since September 2026 (.gitlab-ci-libretro.yml:101,
.gitlab-ci-libretro.yml:109) and the static Vita, Wii, Wii U and Switch
jobs turn it off (.gitlab-ci-libretro.yml:193, .gitlab-ci-libretro.yml:202,
.gitlab-ci-libretro.yml:210, .gitlab-ci-libretro.yml:218).
File access goes through the libretro VFS when the frontend provides it
(src/retro/vfs.c:17-48, src/file.c:253-302, src/file.c:479-492), and a
device-prefixed path such as ux0:/ counts as absolute (src/file.c:152-164).
File access goes through src/retro/file_retro.c, which reads and writes
through the libretro VFS when the frontend provides it and through the C
library otherwise, with no .gz or archive unpacking
(src/retro/file_retro.c:29-88, src/retro/vfs.c:18-49), and a
device-prefixed path such as ux0:/ counts as absolute
(src/filename.c:122-134).
The standalone program is the SDL build of the upstream tree. Its default
TOS image is tos.img in the data directory (src/configuration.c:810-812),
which is the directory of the executable on Windows, ../Resources in the
macOS bundle and ../share/hatari beside the bin directory elsewhere
(src/paths.c:316-330, CMakeLists.txt:383-394). --tos and the
(src/paths.c:316-330, CMakeLists.txt:370-381). --tos and the
szTosImageFileName key replace it. When no image loads, Main_InitSubsystems
opens the settings dialog to pick one and exits with Failed to load TOS
image if none is chosen (src/main.c:191-201). Nothing is compiled in as a
image if none is chosen (src/main.c:187-197). Nothing is compiled in as a
fallback. The install rule copies a src/tos.img into the data directory
when one is present at build time, the source tree carries none, and the
release checklist puts the latest EmuTOS 1024k image in the binary
@@ -146,17 +147,17 @@ notes: |
~/.config/hatari, Library/Application Support/Hatari or
AppData\Local\Hatari under the user's home (src/paths.c:24-29,
src/paths.c:201-274). hatari.cfg is read from <CONFDIR> and then from that
home directory, or from the file -c names (src/main.c:256-278,
home directory, or from the file -c names (src/main.c:252-274,
src/configuration.c:862-867, src/options.c:1283-1289). hatari.nvram and
auto.sav, restored only when bAutoSave is on, are kept there
(src/configuration.c:727-733). The window icon is hatari-icon.bmp in the
data directory (src/sdl/screen.c:711-720).
data directory (src/sdl/screen.c:715-724).
--lilo boots a Linux kernel instead of TOS, vmlinuz and initrd in the data
directory by default (src/configuration.c:816-824, src/options.c:2309-2323).
IPF images are decoded by the built-in reader unless the capsimage
library is found at build time, which then reads them, and RAW and CTR
images need that library (src/CMakeLists.txt:70-74,
CMakeLists.txt:185-188).
CMakeLists.txt:166-169).
files:
- name: "tos.img"
@@ -166,7 +167,7 @@ files:
min_size: 64
max_size: 1048576
validation: [size]
source_ref: "source src/retro/main_retro.c:160-211, source src/retro/main_retro.c:286-299, source src/options.c:1937-1945, source src/configuration.c:489, source src/tos.c:60-66, source src/tos.c:976-1097, source src/tos.c:838-969, source src/file.c:312-353, upstream src/configuration.c:810-812, upstream src/paths.c:316-330, upstream CMakeLists.txt:383-394, upstream src/main.c:191-201, upstream src/reset.c:66-68, upstream src/file.c:275-308, upstream src/file.c:481-520, upstream src/CMakeLists.txt:79, upstream src/CMakeLists.txt:391-398"
source_ref: "source src/retro/main_retro.c:174-231, source src/options.c:1937-1945, source src/configuration.c:489, source src/tos.c:60-66, source src/tos.c:976-1097, source src/tos.c:838-969, source src/tos.c:1151-1162, source src/retro/file_retro.c:64-88, upstream src/configuration.c:810-812, upstream src/paths.c:316-330, upstream CMakeLists.txt:370-381, upstream src/main.c:187-197, upstream src/reset.c:66-68, upstream src/file.c:131-164, upstream src/filename.c:161-200, upstream src/CMakeLists.txt:90, upstream src/CMakeLists.txt:433-440"
note: >
Any TOS 1.00 to 4.04, TOS 0.00, a RAM TOS or EmuTOS. The file must
carry this exact name in the libretro build: retro_init only enables
@@ -177,7 +178,7 @@ files:
stand in for the default, and a .gz or archive is unpacked first. The
program exits when no image loads and none is picked in the settings
dialog (src/options.c:1937-1940, src/configuration.c:489,
src/tos.c:983, src/main.c:191-201).
src/tos.c:983, src/main.c:187-197).
- name: "tos.sym"
path: "tos.sym"
@@ -185,7 +186,7 @@ files:
required: false
storage: user_provided
unsourceable: "one table per TOS build, valid only beside the image it was linked with: each EmuTOS release archive carries the table of its ROM, etos512k.sym beside etos512k.img, and Atari TOS has none"
source_ref: "source src/tos.c:1094, source src/debug/symbols.c:1095-1113, source src/debug/symbols.c:1002-1020, source src/debug/symbols.c:372-407, source src/configuration.c:621, source src/includes/configuration.h:29-31, source src/retro/main_retro.c:186-198"
source_ref: "source src/tos.c:1094, source src/debug/symbols.c:1099-1117, source src/debug/symbols.c:1002-1024, source src/debug/symbols.c:372-407, source src/configuration.c:621, source src/includes/configuration.h:29-31, source src/retro/main_retro.c:203-213"
note: >
The name is the TOS image path with its last three characters
replaced by sym, and the image path is always tos.img here: retro_init
@@ -209,7 +210,7 @@ files:
validation: [size]
storage: user_provided
unsourceable: "any headerless s16le stereo 44100 Hz sample the user records, with no name or version the code expects beyond the filename"
source_ref: "source src/retro/floppy_sound.c:146-186, source src/retro/floppy_sound.c:130-143, source src/retro/main_retro.c:185, source src/retro/statusbar.c:129-130, source src/retro/options.c:369-383, source src/retro/options.c:914-916"
source_ref: "source src/retro/floppy_sound.c:146-186, source src/retro/floppy_sound.c:130-143, source src/retro/main_retro.c:202, source src/retro/statusbar.c:129-130, source src/retro/options.c:369-383, source src/retro/options.c:914-916"
note: >
Read whole at retro_init when its size is between 4 bytes and 16 MB,
and resampled to the core's audio rate. Otherwise the built-in
@@ -239,7 +240,7 @@ files:
description: "Boot floppy inserted with GEMDOS hard disk folders"
required: false
mode: libretro
source_ref: "source src/retro/harddisk.c:78-129, source src/retro/main_retro.c:442-446"
source_ref: "source src/retro/harddisk.c:78-129, source src/retro/main_retro.c:449-453"
note: "Inserted into drive A when the content is a .gem file."
- name: "hatari.cfg"
@@ -249,7 +250,7 @@ files:
required: false
storage: user_provided
unsourceable: "user settings in Hatari's INI format, with no canonical contents"
source_ref: "upstream src/main.c:260-282, source src/main.c:319-322, source src/main.c:328-330, source src/configuration.c:862-867, source src/configuration.c:1061-1071, upstream src/paths.c:236-250, source CMakeLists.txt:444-461, upstream src/options.c:1283-1289, upstream src/paths.c:24-29"
source_ref: "upstream src/main.c:256-278, source src/main.c:315-318, source src/main.c:324, source src/retro/main_retro.c:519-522, source src/configuration.c:862-867, source src/configuration.c:1061-1071, source src/paths.c:236-250, source CMakeLists.txt:435-452, upstream src/options.c:1283-1289, upstream src/paths.c:24-29"
note: >
Read from <CONFDIR>/hatari.cfg and then from hatari.cfg in the
RetroArch save directory, before the --tos argument and the boot
@@ -267,7 +268,7 @@ files:
validation: [size]
storage: user_provided
unsourceable: "machine state the emulator writes itself at exit, with no canonical contents"
source_ref: "source src/falcon/nvram.c:96-97, source src/falcon/nvram.c:116-141, source src/falcon/nvram.c:148-171, source src/falcon/nvram.c:282-294, source src/falcon/nvram.c:334-337, upstream src/paths.c:236-250, source src/main.c:208, upstream src/paths.c:24-29"
source_ref: "source src/falcon/nvram.c:163-164, source src/falcon/nvram.c:230-255, source src/falcon/nvram.c:263-286, source src/falcon/nvram.c:480-492, source src/falcon/nvram.c:535-538, source src/paths.c:236-250, source src/main.c:204, upstream src/paths.c:24-29"
note: >
Read from the RetroArch save directory at NvRam_Init, and from the
Hatari home directory in the standalone program. A short read keeps
@@ -298,7 +299,7 @@ files:
sha1: 48be1de23a980bca15a8ed3cb92917340e43bbee
sha256: 0e083a340ad2e522de94e5121565a4730f99d6ee3638c74f5a2c3be579529155
crc32: 1639262c
source_ref: "upstream src/sdl/screen.c:711-720, upstream src/CMakeLists.txt:391-394"
source_ref: "upstream src/sdl/screen.c:715-724, upstream src/CMakeLists.txt:433-436"
note: >
Loaded with SDL_LoadBMP from the data directory when the window is
created. Without it the window keeps the default icon. Installed
+15
View File
@@ -228,3 +228,18 @@ files:
required: false
note: "Falls back to sgb2.boot.rom at the system directory root."
source_ref: "higan/gb/system/system.cpp:54-65, icarus/heuristics/super-famicom.cpp:243, icarus/heuristics/super-famicom.cpp:614"
- name: "program.rom"
path: "Super GameBoy.sfc/program.rom"
system: nintendo-sgb
required: false
note: "Last folder tried, after the option's folder and SGB.sfc/."
source_ref: "higan/target-libretro/libretro-sfc.cpp:209-225, higan/sfc/cartridge/load.cpp:77-80"
- name: "sgb1.boot.rom"
path: "Super GameBoy.sfc/sgb1.boot.rom"
system: nintendo-sgb
size: 256
required: false
note: "Read from the folder program.rom was found in, then from the system directory root. The name follows the Super GAMEBOY header of an SGB1 program.rom."
source_ref: "higan/target-libretro/libretro-sfc.cpp:229, higan/gb/system/system.cpp:54-65, icarus/heuristics/super-famicom.cpp:232, icarus/heuristics/super-famicom.cpp:618"
+16
View File
@@ -227,3 +227,19 @@ files:
required: false
note: "Falls back to lr35902.boot.rom at the system directory root."
source_ref: "source nSide/gb/system/system.cpp:54-65, source nSide/emulator/game.hpp:101-104, source icarus/heuristics/super-famicom.cpp:103, source icarus/heuristics/super-famicom.cpp:523-527"
- name: "program.rom"
path: "Super GameBoy.sfc/program.rom"
system: nintendo-sgb
required: false
note: "Last folder tried, after the option's folder and SGB.sfc/."
source_ref: "source nSide/target-libretro/libretro-sfc.cpp:184-199, source nSide/sfc-balanced/cartridge/load.cpp:159-162"
- name: "lr35902.boot.rom"
path: "Super GameBoy.sfc/lr35902.boot.rom"
system: nintendo-sgb
size: 256
sha1: "aa2f50a77dfb4823da96ba99309085a3c6278515"
required: false
note: "Read from the folder program.rom was found in, then from the system directory root."
source_ref: "source nSide/target-libretro/libretro-sfc.cpp:201, source nSide/gb/system/system.cpp:54-65, source nSide/target-libretro/program.cpp:59-72, source icarus/heuristics/super-famicom.cpp:103"
+1
View File
@@ -4,6 +4,7 @@ core_classification: game_engine
source: "https://github.com/usineur/hode"
profiled_date: "2026-10-22"
source_commit: "59f3c466923c6b8d49e29176ff697a91165e7efc"
pin_frozen: "EmuELEC, the only platform that ships it, builds this revision (EmuELEC packages/sx05re/emuelec-ports/hodesdl/package.mk:6 at v4.8). Later commits are not part of that build."
core_version: "0.2.9f"
version_basis:
kind: file
+1 -2
View File
@@ -289,8 +289,7 @@ files:
directory (Q3E/src/main/jni/ecwolf/src/wl_main.cpp:1294-1307). Failing
to open it ends the process with "Could not open ecwolf.pk3!". It holds the IWADINFO rules that identify which Wolfenstein
data set is present, the palettes and the actor definitions. This build
reads it from disk after extraction, unlike the libretro core which
compiles it in.
reads it from disk after extraction.
source_ref: "Q3E/src/main/jni/ecwolf/src/version.h:12, Q3E/src/main/jni/ecwolf/src/wl_iwad.cpp:604, Q3E/src/main/java/com/n0n3m4/q3e/Q3EPatchResourceManager.java:186-195"
- name: glprogs.pk4
+1 -1
View File
@@ -24,7 +24,7 @@ notes: |
Loaded paks are matched against hardcoded unsigned 32-bit checksums
(code/qcommon/files.c:178-198: pak_checksums[], missionpak_checksums[]).
These are NOT MD5 / SHA1 / CRC32 of the file. They are id's own custom
These are not MD5 / SHA1 / CRC32 of the file. They are id's own custom
pak checksum (sum of each lump CRC, see FS_LoadZipFile). A mismatch
prints "WARNING: baseq3/pak0.pk3 is present but its checksum (%u) is
not correct" (code/qcommon/files.c:3574) and keeps running: the loader
+1
View File
@@ -45,6 +45,7 @@ data_directories:
files:
- name: "<bios>.bin"
found_by: content
path: "pcsx2/bios/<bios>.bin"
required: true
description: "PS2 BIOS binary"
+1 -2
View File
@@ -52,8 +52,7 @@ notes: |
Artwork in system_dir/mame2009/artwork/.
INI config files in system_dir/mame2009/ini/.
No hiscore.dat, history.dat, or mameinfo.dat support (unlike
mame2000/mame2003). The hiscore path is disabled in the libretro
No hiscore.dat, history.dat, or mameinfo.dat support. The hiscore path is disabled in the libretro
wrapper.
48 BIOS root sets. ROM naming follows MAME 0.135 conventions.
+2 -2
View File
@@ -16,10 +16,10 @@ systems: [nec-pc-engine]
verification: existence
notes: >
Fork of Mednafen's pce_fast module (speed-optimized, no SuperGrafx support).
Separate codebase from beetle_pce (mednafen/pce_fast/ vs mednafen/pce/).
Built from mednafen/pce_fast/.
BIOS loaded via HuCLoadCD() at CD-ROM load time. Core option "pce_fast_cdbios"
selects which card image to use (default: System Card 3).
No Games Express auto-detection (unlike beetle_pce), so the user must select manually.
Does not detect Games Express: the card is chosen by the pce_fast_cdbios option.
No hash or size validation on BIOS load.
Upstream pce_fast module only has a single pce_fast.cdbios string setting:
the 6-option dropdown is a libretro addition.
+1 -1
View File
@@ -26,7 +26,7 @@ systems: [macintosh-ii]
# 5. app parent directory
# 6. current directory
# The libretro port does NOT call ROM_IsValid() (unlike upstream backends),
# The libretro port does not call ROM_IsValid() (unlike upstream backends),
# so no checksum validation occurs. ROM_Init() patches the Mac's own boot
# ROM check (DisableRomCheck = 1, ROMEMDEV.c:279).
+3
View File
@@ -168,6 +168,7 @@ notes: |
files:
- name: ps2-0230a-20080220.bin
found_by: content
path: bios/ps2-0230a-20080220.bin
required: true
min_size: 4194304
@@ -230,6 +231,7 @@ files:
source_ref: "upstream aethersx2/pcsx2/CDVD/CDVD.cpp:120-144, nethersx2-turnip-classic v0.7 libemucore.so 0x791700-0x7918f4"
- name: eeprom.dat
load_from: working_directory
required: false
hle_fallback: true
size: 64
@@ -241,6 +243,7 @@ files:
source_ref: "upstream aethersx2/pcsx2/DEV9/DEV9.cpp:73, upstream aethersx2/pcsx2/DEV9/DEV9.cpp:145-160, nethersx2-turnip-classic v0.7 libemucore.so 0x7bb620-0x7bb680"
- name: flash.dat
load_from: working_directory
required: false
hle_fallback: true
max_size: 8650752
+3
View File
@@ -149,6 +149,7 @@ notes: |
files:
- name: ps2-0230a-20080220.bin
found_by: content
path: bios/ps2-0230a-20080220.bin
required: true
min_size: 4194304
@@ -211,6 +212,7 @@ files:
source_ref: "upstream aethersx2/pcsx2/CDVD/CDVD.cpp:120-144, nethersx2-turnip v0.7 libemucore.so 0x79cbd0-0x79cc20"
- name: eeprom.dat
load_from: working_directory
required: false
hle_fallback: true
size: 64
@@ -222,6 +224,7 @@ files:
source_ref: "upstream aethersx2/pcsx2/DEV9/DEV9.cpp:146-161, nethersx2-turnip v0.7 libemucore.so 0x7c5c44"
- name: flash.dat
load_from: working_directory
required: false
hle_fallback: true
max_size: 8650752
+3
View File
@@ -129,6 +129,7 @@ notes: |
files:
- name: ps2-0230a-20080220.bin
found_by: content
path: bios/ps2-0230a-20080220.bin
required: true
min_size: 4194304
@@ -194,6 +195,7 @@ files:
source_ref: "upstream aethersx2/pcsx2/CDVD/CDVD.cpp:120-144, nethersx2 v2.2n-4248 libemucore.so 0x79cbc0-0x79cdc4"
- name: eeprom.dat
load_from: working_directory
required: false
hle_fallback: true
size: 64
@@ -205,6 +207,7 @@ files:
source_ref: "upstream aethersx2/pcsx2/DEV9/DEV9.cpp:146-161, nethersx2 v2.2n-4248 libemucore.so 0x7c5c40-0x7c5ca0"
- name: flash.dat
load_from: working_directory
required: false
hle_fallback: true
max_size: 8650752
+4 -1
View File
@@ -10,6 +10,7 @@ version_basis:
tag: "RELEASE_22_0_RC2"
distance: 0
display_name: "MSX / ColecoVision / Spectravideo (openMSX)"
found_by: content
cores:
- openmsx
systems:
@@ -29,7 +30,9 @@ notes: |
ROM resolution via FilePool (src/file/FilePool.cc, FilePoolCore.cc):
searches configured directories for files matching SHA1 checksums.
Filenames are secondary hints, while SHA1 is the primary lookup key.
A ROM in share/systemroms is reached by its SHA1 alone: a filename is only
looked up beside the machine's XML (src/memory/Rom.cc:121-170,
src/config/HardwareConfig.cc:279-280, src/file/FileContext.cc:152-156).
Files may be gzipped or individually zipped.
Each user data directory contributes share/systemroms, scanned
recursively (src/file/FilePool.cc:27, src/file/FilePoolCore.cc:369-385). RetroBat
+3 -3
View File
@@ -17,7 +17,7 @@ verification: existence
notes: |
OpenTyrian is a source port of the DOS vertical scrolling shooter Tyrian,
ported to libretro. It loads the Tyrian 2.1 freeware game data directly.
Tyrian 1.x, 2.0, and Tyrian 2000 data files are NOT compatible.
Tyrian 1.x, 2.0, and Tyrian 2000 data files are not compatible.
The core's .info file sets supports_no_game = true. The core locates the
data directory by probing for tyrian1.lvl in several paths (file.c:33-58):
@@ -245,9 +245,9 @@ files:
# which maps to shapes{char}.dat at tyrian2.c:3079.
# The shipped set is ), W, X, Y, Z. lvlmast.c:128-131 writes } for the
# Episode 4 tileset, which no distributed file matches.
# Note: shapeFile[34] in lvlmast.c is a DIFFERENT mechanism:
# Note: shapeFile[34] in lvlmast.c is a different mechanism:
# it maps indices to characters for newsh?.shp (enemy sprites),
# NOT for shapes?.dat (level tilesets).
# not for shapes?.dat (level tilesets).
# -----------------------------------------------------------
- name: "shapes).dat"
category: game_data
+1 -2
View File
@@ -35,5 +35,4 @@ notes:
divergence_note: >
Fork of mupen64plus-core with significant divergence. Includes legacy
GPU plugins (Glide64, glN64, Rice, angrylion) and ParaLLEl-RDP/RSP.
Uses flat path 64DD_IPL.bin unlike mupen64plus-next which uses
Mupen64plus/IPL.n64 subdirectory.
Reads 64DD_IPL.bin at the root of the system folder.
+2
View File
@@ -91,6 +91,7 @@ notes: |
files:
- name: "<bios>.bin"
found_by: content
path: "pcsx2/bios/<bios>.bin"
description: "PS2 BIOS image"
min_size: 4194304
@@ -159,6 +160,7 @@ files:
failure to open is reported once on screen.
- name: "eeprom.dat"
load_from: working_directory
description: "DEV9 network adapter EEPROM"
size: 64
required: false
+3
View File
@@ -77,6 +77,7 @@ notes: |
files:
- name: ps2-0230a-20080220.bin
found_by: content
system: sony-playstation-2
required: true
description: "PS2 console BIOS"
@@ -126,6 +127,7 @@ files:
source_ref: "pcsx2/CDVD/CDVD.cpp:93-122"
- name: eeprom.dat
load_from: working_directory
system: sony-playstation-2
required: false
hle_fallback: true
@@ -135,6 +137,7 @@ files:
source_ref: "plugins/dev9ghzdrk/DEV9.cpp:176-227, plugins/dev9ghzdrk/DEV9.cpp:71-81"
- name: flash.dat
load_from: working_directory
system: sony-playstation-2
required: false
hle_fallback: true
+2
View File
@@ -25,6 +25,7 @@ notes: |
files:
- name: ps2-0230a-20080220.bin
found_by: content
aliases: [ps2-0250j-20100415.bin, SCPH-70004_BIOS_V12_EUR_200.BIN]
required: true
min_size: 4194304
@@ -66,6 +67,7 @@ files:
source_ref: "pcsx2/CDVD/CDVD.cpp:190-204"
- name: eeprom.dat
load_from: working_directory
required: false
hle_fallback: true
size: 64
+3
View File
@@ -80,6 +80,7 @@ notes: |
files:
- name: COH-H31100.rom0
found_by: content
system: namco-system246
required: true
min_size: 4194304
@@ -141,6 +142,7 @@ files:
source_ref: "source pcsx2/CDVD/CDVD.cpp:51-52, source pcsx2/CDVD/CDVD.cpp:196-209"
- name: eeprom.dat
load_from: working_directory
system: namco-system246
required: false
hle_fallback: true
@@ -150,6 +152,7 @@ files:
source_ref: "source pcsx2/DEV9/DEV9.cpp:67-77, source pcsx2/DEV9/DEV9.cpp:116-167"
- name: flash.dat
load_from: working_directory
system: namco-system246
required: false
hle_fallback: true
+1 -1
View File
@@ -54,7 +54,7 @@ notes: |
wrapper hardcodes it to 0 (always prefer real BIOS when available).
FreeBIOS (freebios/freebios.min) is 4096 bytes, a clean-room
reimplementation. It is NOT the official Nintendo Pokemon Mini BIOS.
reimplementation.
files:
- name: "bios.min"
+36 -23
View File
@@ -1,35 +1,48 @@
# Redream: Sega Dreamcast (libretro)
# ref: libretro/redream, docs.libretro.com/library/redream
# Uses dc/boot.bin and dc/flash.bin (different names from Flycast)
# Same BIOS data as Flycast's dc_boot.bin / dc_flash.bin
#
# doc vs source: docs list boot.bin md5 e10c53c2f8b90bab96ead2d368858623
# which matches dc_bios.bin in the repo. Flycast uses dc_boot.bin (same
# data, 2 MB) while Redream calls it boot.bin. The flash.bin is identical
# across both cores.
emulator: Redream
type: libretro
source: "https://github.com/libretro/redream"
core_version: null
source: "https://github.com/inolen/redream"
profiled_date: "2026-11-05"
source_commit: "ffb7302245ff40515cb9f0f0b0e233a4b39342d3"
core_version: "v1.0.0-25-gffb7302"
version_basis:
kind: unverified
why: no_pin
kind: tag
tag: "v1.0.0"
distance: 25
cores:
- redream
systems:
- sega-dreamcast
notes: |
Last public tree of redream (2018-04-18). It builds the SDL program and
a libretro core that reports library_name redream
(src/host/retro_host.c:214-220). retro_init makes <system>/dc the
application directory (src/host/retro_host.c:192-199), where the boot ROM
and the flash ROM are read. Later releases, 1.5.0 included, are built from
a private tree and published as binaries only.
files:
- name: dc_bios.bin
- name: boot.bin
path: dc/boot.bin
system: sega-dreamcast
destination: dc/boot.bin
required: true
sha1: 8951d1bb219ab2ff8583033d2119c899cc81f18c
md5: e10c53c2f8b90bab96ead2d368858623
required: false
hle_fallback: true
size: 2097152
- name: dc_flash.bin
md5:
- e10c53c2f8b90bab96ead2d368858623
- f2cd29d09f3e29984bcea22ab2e006fe
- 37c921eb47532cae8fb70e5d987ce91c
- a5c6a00818f97c5e3e91569ee22416dc
validation: [size, md5]
note: "Dreamcast boot ROM. An image of another size or with an md5 outside the list is refused, and the BIOS is then emulated at a high level."
source_ref: "src/guest/rom/boot.c:12-22, src/guest/rom/boot.c:24-46, src/guest/rom/boot.c:48-80, src/guest/rom/boot.c:82-89, src/guest/bios/bios.c:227-238, src/guest/bios/bios.c:326-336"
- name: flash.bin
path: dc/flash.bin
system: sega-dreamcast
destination: dc/flash.bin
required: true
sha1: 94d44d7f9529ec1642ba3771ed3c5f756d5bc872
md5: 0a93f7940c455905bea6e392dfde92a4
required: false
hle_fallback: true
size: 131072
validation: [size]
note: "Dreamcast flash ROM. An image of another size is ignored and the partitions are reset to factory settings, and the flash is written back on exit."
source_ref: "src/guest/rom/flash.c:26-36, src/guest/rom/flash.c:47-72, src/guest/rom/flash.c:100-107, src/guest/rom/flash.c:197-200, src/guest/bios/bios.c:137-198"
+2 -1
View File
@@ -4,7 +4,8 @@ core_classification: game_engine
source: "https://github.com/lethal-guitar/RigelEngine"
upstream: "https://github.com/lethal-guitar/RigelEngine"
profiled_date: "2026-10-22"
source_commit: "30afeff8f0b105eac77ee0a2fbd54b06e1a49b60"
source_commit: "f05996f9b3ad3b3ea5bb818e49e7977636746343"
pin_frozen: "EmuELEC, the only platform that ships it, builds this revision (EmuELEC packages/sx05re/emuelec-ports/rigelengine/package.mk:5 at v4.8). Later commits are not part of that build."
core_version: "0.9.1"
version_basis:
kind: file
+1 -1
View File
@@ -18,7 +18,7 @@ systems: [riscv]
# loads a .rvvm plain-text config file specifying bootrom, kernel, nvme drives,
# memory, CPU mode, cmdline, and framebuffer resolution.
#
# The core does NOT use the RetroArch system directory. All firmware paths are
# The core does not use the RetroArch system directory. All firmware paths are
# specified in the .rvvm config file and resolved relative to its directory.
# The core chdir()s to the .rvvm file's parent before initializing the VM.
#
+2 -2
View File
@@ -34,7 +34,7 @@ systems: [scummvm]
#
# MT-32/CM-32L ROM files go in scummvm/extra/ and are loaded by
# audio/softsynth/mt32.cpp. The core tries CM-32L first, then MT-32.
# These are NOT bundled (proprietary). Everything else is open-source
# These are not bundled (proprietary). Everything else is open-source
# data shipped with ScummVM releases.
# ----- scummvm.ini (config, auto-created) -----
@@ -566,7 +566,7 @@ files:
# Grim Fandango, Escape from Monkey Island, Myst III, The Longest
# Journey (Stark), Wintermute 3D, Freescape, HPL1 (Penumbra),
# Playground3D test engine. Listed in dists/scummvm.rc.
# Individual shader files are NOT listed here since they are
# Individual shader files are not listed here since they are
# bundled in shaders.dat for the theme path and as individual
# files in the extra/shaders/ directory. The build bundles them
# automatically via backends/platform/libretro/scripts/bundle_datafiles.sh.
+2 -3
View File
@@ -18,9 +18,8 @@ verification: existence
notes: |
SDLPoP is NagyD's open-source port of the DOS Prince of Persia (1989),
rebuilt from the leaked Jordan Mechner source and refined through
years of community reverse engineering. Unlike the other engines in
this directory, SDLPoP ships with ALL game data in-tree, so no retail
data file is required or useful.
years of community reverse engineering. SDLPoP ships all game data in
its tree, so no retail data file is needed.
open_dat() (src/seg009.c:438) reads an archive named FOO.DAT if
present, otherwise falls back to a loose folder data/FOO/ containing
+1 -1
View File
@@ -31,7 +31,7 @@ notes: |
the shareware build, wl6 then wl3 then wl1 for the full ones, sdm for
the Spear demo, sod or sd1 after --mission 0 or 1 for Spear of Destiny,
sd2 or sd3 after --mission 2 or 3 for the mission pack build
(wl_main.cpp:2015-2040). Unlike Wolf4SDL, every Spear build reads its
(wl_main.cpp:2015-2040). Every Spear build reads its
graphics and audio files under the sod extension (wl_menu.cpp:5341-5342)
and only vswap, maphead and gamemaps under the mission extension, so the
mission packs need the original game beside them.
+1 -1
View File
@@ -26,7 +26,7 @@ notes: |
Game data loaded at runtime from dat/ tree via datafile_path().
ref: crawl-ref/source/files.cc:375-458 (_get_base_dirs() + datafile_path())
No DATA_DIR_PATH defined in Makefile.libretro, so it falls back to SysEnv.crawl_dir.
Data is NOT compiled into the binary.
Data is not compiled into the binary.
dat/ tree contents (532 files, 16 MB):
- dat/tiles/*.png (floor, wall, feat, player, main, gui, icons) (crawl-ref/source/tiletex.cc:89-97)
+4 -2
View File
@@ -5,9 +5,11 @@ source: https://github.com/christianhaitian/ti99sim
upstream: https://www.mrousseau.org/programs/ti99sim/
profiled_date: "2026-03-29"
source_commit: "e3608541943b5258afe45b74e3f78e723df1fcbd"
core_version: null
core_version: "0.16.0"
version_basis:
kind: none
kind: file
path: "doc/CHANGES.html"
pattern: '<p>Version ([0-9][0-9.]*) - '
cores:
- ti99sim
+1 -1
View File
@@ -36,7 +36,7 @@ notes: |
separate libretro core.
All standard ROMs (kernal, basic, chargen, drive DOS, editor) are embedded
in the core binary via USE_EMBEDDED. External ROM files are NOT required
in the core binary via USE_EMBEDDED. External ROM files are not required
for normal operation. The embedded ROMs are compiled from vice/data/<machine>/
and ship with every build.
+1 -1
View File
@@ -20,7 +20,7 @@ notes: >
plus all drive ROMs (1540, 1541, 1541-II, 1551, 1570, 1571, 1571CR, 1581, 1001,
2031, 2040, 3040, 4040, 9000) and VIC-II palettes. Embedded ROM check in
sysfile_load takes priority over filesystem. Kernal Rev 1 (901227-01) and
Rev 2 (901227-02) are NOT embedded: selecting C64 OLD NTSC or C64 OLD PAL model
Rev 2 (901227-02) are not embedded: selecting C64 OLD NTSC or C64 OLD PAL model
requires them on the filesystem in system/vice/C64/. JiffyDOS requires True Drive
Emulation enabled and a 1541/1571/1581 drive type. SX-64 models use a separate
JiffyDOS kernal (JiffyDOS_SX-64.bin) not declared in the .info.
+1 -1
View File
@@ -21,7 +21,7 @@ notes: >
plus all drive ROMs (1540, 1541, 1541-II, 1551, 1570, 1571, 1571CR, 1581, 1001,
2031, 2040, 3040, 4040, 9000) and VIC-II palettes. Embedded ROM check in
sysfile_load takes priority over filesystem. Kernal Rev 1 (901227-01) and
Rev 2 (901227-02) are NOT embedded: selecting C64 OLD NTSC or C64 OLD PAL model
Rev 2 (901227-02) are not embedded: selecting C64 OLD NTSC or C64 OLD PAL model
requires them on the filesystem in system/vice/C64/. JiffyDOS requires True Drive
Emulation enabled and a 1541/1571/1581 drive type. SX-64 models use a separate
JiffyDOS kernal (JiffyDOS_SX-64.bin) not declared in the .info.
-2
View File
@@ -26,7 +26,6 @@ notes: >
files:
- name: "kernal.901486-02.bin"
description: "VIC-1001 Kernal Rev 2 (Japanese NTSC)"
region: [japan]
required: false
size: 8192
validation: [size]
@@ -35,7 +34,6 @@ files:
- name: "chargen-901460-02.bin"
description: "VIC-1001 Character ROM (Japanese)"
region: [japan]
required: false
size: 4096
validation: [size]
+2 -5
View File
@@ -15,9 +15,8 @@ cores: [x64sdl]
systems: [commodore-c64]
notes: >
Old port of VICE 3.1 using an SDL-to-libretro shim (r-type/sdlvice-libretro).
Separate codebase from the newer vice-libretro port. Marked experimental and
superseded. Unlike the newer port, this core does NOT embed system ROMs: all ROMs
must be on disk in <system_dir>/data/C64/ and <system_dir>/data/DRIVES/.
Marked experimental and superseded. This core embeds no system ROMs: all ROMs
are read from <system_dir>/data/C64/ and <system_dir>/data/DRIVES/.
The .info declares firmware_count=0, while the core reads the ROMs this profile lists. No JiffyDOS support.
No save states, no netplay, no cheats.
@@ -55,7 +54,6 @@ files:
- name: "jpkernal"
description: "Japanese C64 Kernal ROM"
region: [japan]
required: false
size: 8192
path: "data/C64/jpkernal"
@@ -64,7 +62,6 @@ files:
- name: "jpchrgen"
description: "Japanese C64 character generator ROM"
region: [japan]
required: false
size: 4096
path: "data/C64/jpchrgen"
+2 -2
View File
@@ -3,7 +3,7 @@ type: "standalone + libretro"
core_classification: community_fork
source:
standalone: "https://github.com/has207/xenia-edge"
libretro: "https://git.libretro.com/libretro/xenia-libretro"
libretro: "https://git.libretro.com/libretro/xenia-edge-libretro"
upstream: "https://github.com/has207/xenia-edge"
source_commit:
standalone: "71804222514022ce80b757ca79c4ddb2dcf4a06c"
@@ -51,7 +51,7 @@ notes: |
XENIA-EDGE rule and runs `xenia_edge <rom>`. RetroDECK unpacks the AppImage
into a xenia-edge component and executes bin/xenia_edge.
The libretro core xenia_edge_libretro is built from libretro/xenia-libretro
The libretro core xenia_edge_libretro is built from libretro/xenia-edge-libretro
on git.libretro.com (branch libretro, CORENAME xenia_edge in .gitlab-ci.yml),
mirrored as WizzardSK/xenia-libretro on GitHub. It carries the xenia-edge
tree merged from edge at 8dc77b09, the release named in upstream.version and
-4
View File
@@ -81,7 +81,6 @@ files:
- name: "d200e_1.rom"
system: dragon64
description: "Dragon 200-E BASIC IC18 (Spanish)"
region: [spain]
required: true
size: 16384
crc32: "95af0a0a"
@@ -93,7 +92,6 @@ files:
- name: "d200e_2.rom"
system: dragon64
description: "Dragon 200-E BASIC IC17 (Spanish)"
region: [spain]
required: false
size: 16384
crc32: "48b985df"
@@ -104,7 +102,6 @@ files:
- name: "d200e_26.rom"
system: dragon64
description: "Dragon 200-E external character generator ROM"
region: [spain]
required: false
size: 4096
crc32: "565724bc"
@@ -258,7 +255,6 @@ files:
- name: "alice.rom"
system: mc10
description: "Matra & Hachette Alice Microcolour BASIC"
region: [france]
required: true
size: 8192
crc32: "f876abe9"
+1
View File
@@ -179,6 +179,7 @@ notes: |
files:
- name: ps2-0230a-20080220.bin
found_by: content
path: pcsx2/bios/ps2-0230a-20080220.bin
aliases: [ps2-0250j-20100415.bin]
standalone_path: bios/ps2-0230a-20080220.bin
+1 -1
View File
@@ -1 +1 @@
{"files":[["22vp931.zip",1405,"bios"],["246C.mec",4,"bios"],["246C.nvm",1024,"bios"],["256.BIN",4194304,"bios"],["256.NVM",1024,"bios"],["32X_G_BIOS.BIN",256,"bios"],["32X_M_BIOS.BIN",2048,"bios"],["32X_S_BIOS.BIN",1024,"bios"],["3c505.zip",10896,"bios"],["3do_arcade_saot.bin",524288,"bios"],["3ds/Azahar/nand/private/movable.sed",320,"bios"],["3ds/Azahar/nand/rw/sys/LocalFriendCodeSeed_B",272,"bios"],["3ds/Azahar/nand/rw/sys/SecureInfo_A",273,"bios"],["3ds/Azahar/sysdata/keys.txt",7424,"bios"],["3ds/Azahar/sysdata/otp.bin",256,"bios"],["3ds/Azahar/sysdata/seeddb.bin",53264,"bios"],["3ds/Azahar/sysdata/shared_font.bin",3145728,"bios"],["3xtwin.zip",1417,"bios"],["5200.rom",2048,"bios"],["64DD_IPL_DEV.n64",4194304,"bios"],["64DD_IPL_JP.n64",4194304,"bios"],["64DD_IPL_US.n64",4194304,"bios"],["7800 BIOS (E).rom",16384,"bios"],["7800 BIOS (U).rom",4096,"bios"],["A78_highscore.bin",4096,"bios"],["APPLE2GS.ROM",131072,"bios"],["ATARIBAS.ROM",8192,"bios"],["ATARIOSA.ROM",10240,"bios"],["ATARIOSB.ROM",10240,"bios"],["ATARIXL.ROM",16384,"bios"],["AUDIOHED.BS1",1280,"game_data"],["AUDIOHED.BS6",1280,"game_data"],["AUDIOT.BS1",267636,"game_data"],["AUDIOT.BS6",267636,"game_data"],["BB01R4_OS.ROM",16384,"bios"],["BIOSGBA.ROM",16384,"bios"],["BLOCKS.000",143876,"game_data"],["BLOOD.RFF",3536782,"game_data"],["BONUS.000",161022,"game_data"],["BONUS.0SC",51832,"game_data"],["BONUSMAP.000",6455,"game_data"],["BS-X.bin",1048576,"bios"],["CM32LN_CONTROL.ROM",65536,"bios"],["CM32L_CONTROL.ROM",65536,"bios"],["CM32L_PCM.ROM",1048576,"bios"],["COH-H31000.BIN",4194304,"bios"],["COH-H31000.NVM",1024,"bios"],["Complex_4627.bin",1048576,"bios"],["DOSBOX.SF2",32319396,"bios"],["DUKE.RTS",188954,"game_data"],["DUKE3D.GRP",11035779,"game_data"],["END.0SC",17055,"game_data"],["EROM.BIN",247968,"bios"],["EmuMediaBoard/Chihiro/ic10_g24lc64.bin",8192,"bios"],["EmuMediaBoard/Chihiro/ic11_24lc024.bin",128,"bios"],["EmuMediaBoard/Chihiro/pc20_g24lc64.bin",8192,"bios"],["EmuMediaBoard/fpr21042_m29w160et.bin",2097152,"bios"],["FONT2.0FN",3819,"game_data"],["FONTBIG.0FN",6463,"game_data"],["FONTINY.0FN",3339,"game_data"],["FONTMN1.0FN",8982,"game_data"],["FONTMN2.0FN",6789,"game_data"],["FONTS.000",14542,"game_data"],["GBA/gba_bios.bin",16384,"bios"],["GC/EUR/IPL.bin",2097152,"bios"],["GC/JAP/IPL.bin",2097152,"bios"],["GC/USA/IPL.bin",2097152,"bios"],["GC/dsp_coef.bin",4096,"bios"],["GC/dsp_rom.bin",8192,"bios"],["GC/font_japanese.bin",259626,"bios"],["GC/font_western.bin",6478,"bios"],["GUI.RFF",7145,"game_data"],["GameIndex.yaml",1737799,"bios"],["IANIM.BS1",18977,"game_data"],["IANIM.BS6",18977,"game_data"],["IANIM.VSI",18977,"game_data"],["INSTRUCT.0SC",145067,"game_data"],["JiffyDOS_1541-II.bin",16384,"bios"],["JiffyDOS_1571_repl310654.bin",32768,"bios"],["JiffyDOS_1581.bin",32768,"bios"],["JiffyDOS_C128.bin",16384,"bios"],["JiffyDOS_C64.bin",8192,"bios"],["JiffyDOS_SX-64.bin",8192,"bios"],["LEVEL0.000",20390,"game_data"],["LEVEL0.001",36234,"game_data"],["LEVEL0.002",20642,"game_data"],["Load/Firmware/rtl_bt/rtl8723a_fw.bin",24548,"bios"],["Load/Firmware/rtl_bt/rtl8723b_fw.bin",45048,"bios"],["Load/Firmware/rtl_bt/rtl8723d_fw.bin",52080,"bios"],["Load/Firmware/rtl_bt/rtl8761a_fw.bin",74488,"bios"],["Load/Firmware/rtl_bt/rtl8761bu_fw.bin",44484,"bios"],["Load/Firmware/rtl_bt/rtl8821a_fw.bin",37420,"bios"],["Load/Firmware/rtl_bt/rtl8821c_fw.bin",54636,"bios"],["Load/Firmware/rtl_bt/rtl8822b_fw.bin",51176,"bios"],["Load/Firmware/rtl_bt/rtl8822cu_fw.bin",38207,"bios"],["Load/Firmware/rtl_bt/rtl8851bu_fw.bin",49760,"bios"],["Load/Firmware/rtl_bt/rtl8852au_fw.bin",67188,"bios"],["Load/Firmware/rtl_bt/rtl8852btu_fw.bin",128140,"bios"],["Load/Firmware/rtl_bt/rtl8852bu_fw.bin",129733,"bios"],["Load/Firmware/rtl_bt/rtl8852cu_fw.bin",113336,"bios"],["Load/Firmware/rtl_bt/rtl8922au_fw.bin",71360,"bios"],["Load/WiiSD.raw",134217728,"bios"],["LucidaConsole_12.abc",2332,"bios"],["LucidaConsole_12.tga",131090,"bios"],["MACRO.1",1032,"game_data"],["MAINCHAR.000",156281,"game_data"],["MAPHEAD.BS1",834,"game_data"],["MAPTEMP.BS1",90786,"game_data"],["MENU.000",124306,"game_data"],["MENUSNG.PSM",79609,"game_data"],["MT32_CONTROL.ROM",65536,"bios"],["MT32_PCM.ROM",524288,"bios"],["Mupen64plus/IPL_DEV.n64",4194304,"bios"],["Mupen64plus/IPL_JAP.n64",4194304,"bios"],["Mupen64plus/IPL_USA.n64",4194304,"bios"],["NWINTER.GRP",10965909,"game_data"],["ORDER.0SC",221478,"game_data"],["PANEL.000",13391,"game_data"],["PLANET.000",4300,"game_data"],["PS3UPDAT.PUP",206126236,"bios"],["ProSystem.dat",16364,"bios"],["ROM",131072,"bios"],["ROM_OS_BB01R59",16384,"bios"],["ROM_OS_BB01R59A",16384,"bios"],["ROM_OS_BB02R3V4",16384,"bios"],["ROM_OS_CC01R4",16384,"bios"],["RedumpDatabase.yaml",1917242,"bios"],["SANIM.BS1",276784,"game_data"],["SANIM.BS6",276784,"game_data"],["SC-55-v1.00/sc55_rom1.bin",32768,"bios"],["SC-55-v1.00/sc55_rom2.bin",262144,"bios"],["SC-55-v1.00/sc55_waverom1.bin",1048576,"bios"],["SC-55-v1.00/sc55_waverom2.bin",1048576,"bios"],["SC-55-v1.00/sc55_waveroLine truncated
{"files":[["22vp931.zip",1405,"bios"],["246C.mec",4,"bios"],["246C.nvm",1024,"bios"],["256.BIN",4194304,"bios"],["256.NVM",1024,"bios"],["32X_G_BIOS.BIN",256,"bios"],["32X_M_BIOS.BIN",2048,"bios"],["32X_S_BIOS.BIN",1024,"bios"],["3c505.zip",10896,"bios"],["3do_arcade_saot.bin",524288,"bios"],["3ds/Azahar/nand/private/movable.sed",320,"bios"],["3ds/Azahar/nand/rw/sys/LocalFriendCodeSeed_B",272,"bios"],["3ds/Azahar/nand/rw/sys/SecureInfo_A",273,"bios"],["3ds/Azahar/sysdata/keys.txt",7424,"bios"],["3ds/Azahar/sysdata/otp.bin",256,"bios"],["3ds/Azahar/sysdata/seeddb.bin",53264,"bios"],["3ds/Azahar/sysdata/shared_font.bin",3145728,"bios"],["3xtwin.zip",1417,"bios"],["5200.rom",2048,"bios"],["64DD_IPL_DEV.n64",4194304,"bios"],["64DD_IPL_JP.n64",4194304,"bios"],["64DD_IPL_US.n64",4194304,"bios"],["7800 BIOS (E).rom",16384,"bios"],["7800 BIOS (U).rom",4096,"bios"],["A78_highscore.bin",4096,"bios"],["APPLE2GS.ROM",131072,"bios"],["ATARIBAS.ROM",8192,"bios"],["ATARIOSA.ROM",10240,"bios"],["ATARIOSB.ROM",10240,"bios"],["ATARIXL.ROM",16384,"bios"],["AUDIOHED.BS1",1280,"game_data"],["AUDIOHED.BS6",1280,"game_data"],["AUDIOT.BS1",267636,"game_data"],["AUDIOT.BS6",267636,"game_data"],["BB01R4_OS.ROM",16384,"bios"],["BIOSGBA.ROM",16384,"bios"],["BLOCKS.000",143876,"game_data"],["BLOOD.RFF",3536782,"game_data"],["BONUS.000",161022,"game_data"],["BONUS.0SC",51832,"game_data"],["BONUSMAP.000",6455,"game_data"],["BS-X.bin",1048576,"bios"],["CM32LN_CONTROL.ROM",65536,"bios"],["CM32L_CONTROL.ROM",65536,"bios"],["CM32L_PCM.ROM",1048576,"bios"],["COH-H31000.BIN",4194304,"bios"],["COH-H31000.NVM",1024,"bios"],["Complex_4627.bin",1048576,"bios"],["DOSBOX.SF2",32319396,"bios"],["DUKE.RTS",188954,"game_data"],["DUKE3D.GRP",11035779,"game_data"],["END.0SC",17055,"game_data"],["EROM.BIN",247968,"bios"],["EmuMediaBoard/Chihiro/ic10_g24lc64.bin",8192,"bios"],["EmuMediaBoard/Chihiro/ic11_24lc024.bin",128,"bios"],["EmuMediaBoard/Chihiro/pc20_g24lc64.bin",8192,"bios"],["EmuMediaBoard/fpr21042_m29w160et.bin",2097152,"bios"],["FONT2.0FN",3819,"game_data"],["FONTBIG.0FN",6463,"game_data"],["FONTINY.0FN",3339,"game_data"],["FONTMN1.0FN",8982,"game_data"],["FONTMN2.0FN",6789,"game_data"],["FONTS.000",14542,"game_data"],["GBA/gba_bios.bin",16384,"bios"],["GC/EUR/IPL.bin",2097152,"bios"],["GC/JAP/IPL.bin",2097152,"bios"],["GC/USA/IPL.bin",2097152,"bios"],["GC/dsp_coef.bin",4096,"bios"],["GC/dsp_rom.bin",8192,"bios"],["GC/font_japanese.bin",259626,"bios"],["GC/font_western.bin",6478,"bios"],["GUI.RFF",7145,"game_data"],["GameIndex.yaml",1737799,"bios"],["IANIM.BS1",18977,"game_data"],["IANIM.BS6",18977,"game_data"],["IANIM.VSI",18977,"game_data"],["INSTRUCT.0SC",145067,"game_data"],["JiffyDOS_1541-II.bin",16384,"bios"],["JiffyDOS_1571_repl310654.bin",32768,"bios"],["JiffyDOS_1581.bin",32768,"bios"],["JiffyDOS_C128.bin",16384,"bios"],["JiffyDOS_C64.bin",8192,"bios"],["JiffyDOS_SX-64.bin",8192,"bios"],["LEVEL0.000",20390,"game_data"],["LEVEL0.001",36234,"game_data"],["LEVEL0.002",20642,"game_data"],["Load/Firmware/rtl_bt/rtl8723a_fw.bin",24548,"bios"],["Load/Firmware/rtl_bt/rtl8723b_fw.bin",45048,"bios"],["Load/Firmware/rtl_bt/rtl8723d_fw.bin",52080,"bios"],["Load/Firmware/rtl_bt/rtl8761a_fw.bin",74488,"bios"],["Load/Firmware/rtl_bt/rtl8761bu_fw.bin",44484,"bios"],["Load/Firmware/rtl_bt/rtl8821a_fw.bin",37420,"bios"],["Load/Firmware/rtl_bt/rtl8821c_fw.bin",54636,"bios"],["Load/Firmware/rtl_bt/rtl8822b_fw.bin",51176,"bios"],["Load/Firmware/rtl_bt/rtl8822cu_fw.bin",38207,"bios"],["Load/Firmware/rtl_bt/rtl8851bu_fw.bin",49760,"bios"],["Load/Firmware/rtl_bt/rtl8852au_fw.bin",67188,"bios"],["Load/Firmware/rtl_bt/rtl8852btu_fw.bin",128140,"bios"],["Load/Firmware/rtl_bt/rtl8852bu_fw.bin",129733,"bios"],["Load/Firmware/rtl_bt/rtl8852cu_fw.bin",113336,"bios"],["Load/Firmware/rtl_bt/rtl8922au_fw.bin",71360,"bios"],["Load/WiiSD.raw",134217728,"bios"],["LucidaConsole_12.abc",2332,"bios"],["LucidaConsole_12.tga",131090,"bios"],["MACRO.1",1032,"game_data"],["MAINCHAR.000",156281,"game_data"],["MAPHEAD.BS1",834,"game_data"],["MAPTEMP.BS1",90786,"game_data"],["MENU.000",124306,"game_data"],["MENUSNG.PSM",79609,"game_data"],["MT32_CONTROL.ROM",65536,"bios"],["MT32_PCM.ROM",524288,"bios"],["Mupen64plus/IPL_DEV.n64",4194304,"bios"],["Mupen64plus/IPL_JAP.n64",4194304,"bios"],["Mupen64plus/IPL_USA.n64",4194304,"bios"],["NWINTER.GRP",10965909,"game_data"],["ORDER.0SC",221478,"game_data"],["PANEL.000",13391,"game_data"],["PLANET.000",4300,"game_data"],["PS3UPDAT.PUP",206126236,"bios"],["ProSystem.dat",16364,"bios"],["ROM",131072,"bios"],["ROM_OS_BB01R59",16384,"bios"],["ROM_OS_BB01R59A",16384,"bios"],["ROM_OS_BB02R3V4",16384,"bios"],["ROM_OS_CC01R4",16384,"bios"],["RedumpDatabase.yaml",1917242,"bios"],["SANIM.BS1",276784,"game_data"],["SANIM.BS6",276784,"game_data"],["SC-55-v1.00/sc55_rom1.bin",32768,"bios"],["SC-55-v1.00/sc55_rom2.bin",262144,"bios"],["SC-55-v1.00/sc55_waverom1.bin",1048576,"bios"],["SC-55-v1.00/sc55_waverom2.bin",1048576,"bios"],["SC-55-v1.00/sc55_waveroLine truncated
+1 -1
View File
@@ -1 +1 @@
{"arcade":{"fbneo":{"file":"arcade/fbneo.json","gzip_size":115955,"sha256":"88961c9a6be804772baa767f6ee3a9162478c30c60fe55c8363d8fe4fbc909da","size":423362},"flycast":{"file":"arcade/flycast.json","gzip_size":1841,"sha256":"957189a6e993fda08e21c90ffc6ad94aed9ca9e6dd9ed8c7724e29db036791cb","size":5441},"mame":{"file":"arcade/mame.json","gzip_size":154527,"sha256":"b12010301293a218ecfac45706d81a26c3ac0c27eebeca7409bc8f6ce0163e9e","size":604648},"mame0258":{"file":"arcade/mame0258.json","gzip_size":141151,"sha256":"7ecff1979ed2ac123ea3ba4825dde6e2c31906415165fabefc9af93fa48a6de4","size":556059},"mame0278":{"file":"arcade/mame0278.json","gzip_size":148595,"sha256":"7881e3516f451ec83e886aaf41ebac9d60f497e1f954f49749d52890d7955cbf","size":582797},"mame2000":{"file":"arcade/mame2000.json","gzip_size":8624,"sha256":"f0d69b0872ecfc2845eeb7304543e5b17c11db82060b5514c206b6962ed08263","size":23316},"mame2003":{"file":"arcade/mame2003.json","gzip_size":17456,"sha256":"3b44e2a92c80a8f104b7781fcc1c776d025ad2cf4986638efa3ea041baa9a56d","size":48929},"mame2003_plus":{"file":"arcade/mame2003_plus.json","gzip_size":21077,"sha256":"2857283556fa49c20d8160ed113465bf0c2e643ed0b8acd2d38266a78be8e25e","size":62373},"mame2010":{"file":"arcade/mame2010.json","gzip_size":30869,"sha256":"50b1b381b4b07463f69f1f4c512dd1c98a78d4d0e9c3aeaf49b7b1b007b42152","size":96528},"mame2015":{"file":"arcade/mame2015.json","gzip_size":86990,"sha256":"afeb8c32f651421f74c6de057b0c0b837acd14c533b5160bb31f4411e0afffec","size":360117},"mame2016":{"file":"arcade/mame2016.json","gzip_size":101249,"sha256":"1f75147977d9d082a38b8f8e47a02b301f3d6e6db97c9b9282f3e7f27f26ee47","size":406190}},"containers":{"7z":{"description":"Per-file CRCs and sizes sit in the header at the end of the archive, LZMA-compressed by default (kEncodedHeader). One LZMA decode of the header, independent of the archive size, gives them. Python's lzma is an optional module.","re_read":true,"signature":{"bytes_hex":"377abcaf271c","offset":0},"source_ref":"ip7z/7zip@b88c6bc0 DOC/7zFormat.txt:171-189, DOC/7zFormat.txt:318-334, CPP/7zip/Archive/7z/7zHandlerOut.cpp:859"},"cd-sector":{"description":"User data of a CD sector. In a 2048-byte image (.iso) sector N starts at N * 2048. In a raw 2352-byte image it starts at N * 2352 plus 16 for Mode 1 and plus 24 for Mode 2 Form 1 (12 sync bytes, a 4-byte header, and for Mode 2 an 8-byte subheader).","re_read":true,"sector_size":{"iso":2048,"raw":2352},"source_ref":"stenzek/duckstation@526b4a12 src/util/iso_reader.cpp:157-171, src/util/cd_image.h:28-34","user_data_offset":{"mode1":16,"mode2":24}},"chd-v5":{"description":"MAME compressed hunks, big-endian. The header holds sizes, codecs and hashes only, never the system or the region. The overall SHA-1 is what MAME software lists record. Neither SHA-1 equals a Redump track hash: chdman hashes 2448-byte frames (subcode included, zero-filled), pads each track to 4 frames and byte-swaps audio, all tracks in one stream.","fields":{"compressors":{"encoding":"fourcc4","length":16,"offset":16},"header_length":{"encoding":"u32be","length":4,"offset":8,"value":124},"hunk_bytes":{"encoding":"u32be","length":4,"offset":56},"logical_bytes":{"encoding":"u64be","length":8,"offset":32},"map_offset":{"encoding":"u64be","length":8,"offset":40},"metadata_offset":{"encoding":"u64be","length":8,"offset":48},"overall_sha1":{"encoding":"hex","length":20,"offset":84},"parent_sha1":{"encoding":"hex","length":20,"offset":104},"raw_sha1":{"encoding":"hex","length":20,"offset":64},"unit_bytes":{"encoding":"u32be","length":4,"offset":60},"version":{"encoding":"u32be","length":4,"offset":12,"value":5}},"magic":{"bytes":"MComprHD","offset":0},"media_tags":{"CHCD":"cd","CHGD":"gd-rom","CHGT":"gd-rom","CHT2":"cd","CHTR":"cd","DVD ":"dvd","GDDD":"hard-disk"},"metadata_entry":{"description":"16-byte entry header, payload follows. Linked list from metadata_offset.","flags":{"encoding":"u8","length":1,"offset":4},"length":{"encoding":"u24be","length":3,"offset":5},"next":{"encoding":"u64be","length":8,"offset":8},"tag":{"encoding":"ascii","length":4,"offset":0}},"re_read":true,"source_ref":"mamedev/mame@f34f0250 src/lib/util/chd.h:148-162, src/lib/util/chd.cpp:2021-2061, src/lib/util/chd.cpp:2822-2831, src/lib/util/chd.h:212-235, src/lib/util/chd.cpp:1709-1749, src/tools/chdman.cpp:443-445, src/tools/chdman.cpp:2195-2203, src/lib/util/cdrom.cpp:2669-2672, src/emu/romload.cpp:1211"},"gamecube-disc":{"description":"Where disc offset 0 sits inside each container Dolphin opens.","formats":{"ciso":{"disc_header_at":32768,"magic":"CISO"},"gcz":{"disc_header_at":null,"magic_u32le":2970337281,"note":"block 0 is zlib unless bit 63 of its pointer is set"},"iso":{"disc_header_at":0,"magic":null},"rvz":{"disc_header_at":88,"magic":"RVZ\u0001","note":"first 0x80 disc bytes copied into header 2"},"wbfs":{"disc_header_at":null,"magic":"WBFS","note":"disc offset 0 at wlba[0] << wbfs_sector_shift"},"wia":{"disc_header_at":88,"magic":"WIA\u0001","note":Line truncated
{"arcade":{"fbneo":{"file":"arcade/fbneo.json","gzip_size":115955,"sha256":"88961c9a6be804772baa767f6ee3a9162478c30c60fe55c8363d8fe4fbc909da","size":423362},"flycast":{"file":"arcade/flycast.json","gzip_size":1841,"sha256":"957189a6e993fda08e21c90ffc6ad94aed9ca9e6dd9ed8c7724e29db036791cb","size":5441},"mame":{"file":"arcade/mame.json","gzip_size":154527,"sha256":"b12010301293a218ecfac45706d81a26c3ac0c27eebeca7409bc8f6ce0163e9e","size":604648},"mame0258":{"file":"arcade/mame0258.json","gzip_size":141151,"sha256":"7ecff1979ed2ac123ea3ba4825dde6e2c31906415165fabefc9af93fa48a6de4","size":556059},"mame0278":{"file":"arcade/mame0278.json","gzip_size":148595,"sha256":"7881e3516f451ec83e886aaf41ebac9d60f497e1f954f49749d52890d7955cbf","size":582797},"mame2000":{"file":"arcade/mame2000.json","gzip_size":8624,"sha256":"f0d69b0872ecfc2845eeb7304543e5b17c11db82060b5514c206b6962ed08263","size":23316},"mame2003":{"file":"arcade/mame2003.json","gzip_size":17456,"sha256":"3b44e2a92c80a8f104b7781fcc1c776d025ad2cf4986638efa3ea041baa9a56d","size":48929},"mame2003_plus":{"file":"arcade/mame2003_plus.json","gzip_size":21077,"sha256":"2857283556fa49c20d8160ed113465bf0c2e643ed0b8acd2d38266a78be8e25e","size":62373},"mame2010":{"file":"arcade/mame2010.json","gzip_size":30869,"sha256":"50b1b381b4b07463f69f1f4c512dd1c98a78d4d0e9c3aeaf49b7b1b007b42152","size":96528},"mame2015":{"file":"arcade/mame2015.json","gzip_size":86990,"sha256":"afeb8c32f651421f74c6de057b0c0b837acd14c533b5160bb31f4411e0afffec","size":360117},"mame2016":{"file":"arcade/mame2016.json","gzip_size":101249,"sha256":"1f75147977d9d082a38b8f8e47a02b301f3d6e6db97c9b9282f3e7f27f26ee47","size":406190}},"containers":{"7z":{"description":"Per-file CRCs and sizes sit in the header at the end of the archive, LZMA-compressed by default (kEncodedHeader). One LZMA decode of the header, independent of the archive size, gives them. Python's lzma is an optional module.","re_read":true,"signature":{"bytes_hex":"377abcaf271c","offset":0},"source_ref":"ip7z/7zip@b88c6bc0 DOC/7zFormat.txt:171-189, DOC/7zFormat.txt:318-334, CPP/7zip/Archive/7z/7zHandlerOut.cpp:859"},"cd-sector":{"description":"User data of a CD sector. In a 2048-byte image (.iso) sector N starts at N * 2048. In a raw 2352-byte image it starts at N * 2352 plus 16 for Mode 1 and plus 24 for Mode 2 Form 1 (12 sync bytes, a 4-byte header, and for Mode 2 an 8-byte subheader).","re_read":true,"sector_size":{"iso":2048,"raw":2352},"source_ref":"stenzek/duckstation@526b4a12 src/util/iso_reader.cpp:157-171, src/util/cd_image.h:28-34","user_data_offset":{"mode1":16,"mode2":24}},"chd-v5":{"description":"MAME compressed hunks, big-endian. The header holds sizes, codecs and hashes only, never the system or the region. The overall SHA-1 is what MAME software lists record. Neither SHA-1 equals a Redump track hash: chdman hashes 2448-byte frames (subcode included, zero-filled), pads each track to 4 frames and byte-swaps audio, all tracks in one stream.","fields":{"compressors":{"encoding":"fourcc4","length":16,"offset":16},"header_length":{"encoding":"u32be","length":4,"offset":8,"value":124},"hunk_bytes":{"encoding":"u32be","length":4,"offset":56},"logical_bytes":{"encoding":"u64be","length":8,"offset":32},"map_offset":{"encoding":"u64be","length":8,"offset":40},"metadata_offset":{"encoding":"u64be","length":8,"offset":48},"overall_sha1":{"encoding":"hex","length":20,"offset":84},"parent_sha1":{"encoding":"hex","length":20,"offset":104},"raw_sha1":{"encoding":"hex","length":20,"offset":64},"unit_bytes":{"encoding":"u32be","length":4,"offset":60},"version":{"encoding":"u32be","length":4,"offset":12,"value":5}},"magic":{"bytes":"MComprHD","offset":0},"media_tags":{"CHCD":"cd","CHGD":"gd-rom","CHGT":"gd-rom","CHT2":"cd","CHTR":"cd","DVD ":"dvd","GDDD":"hard-disk"},"metadata_entry":{"description":"16-byte entry header, payload follows. Linked list from metadata_offset.","flags":{"encoding":"u8","length":1,"offset":4},"length":{"encoding":"u24be","length":3,"offset":5},"next":{"encoding":"u64be","length":8,"offset":8},"tag":{"encoding":"ascii","length":4,"offset":0}},"re_read":true,"source_ref":"mamedev/mame@f34f0250 src/lib/util/chd.h:148-162, src/lib/util/chd.cpp:2021-2061, src/lib/util/chd.cpp:2822-2831, src/lib/util/chd.h:212-235, src/lib/util/chd.cpp:1709-1749, src/tools/chdman.cpp:443-445, src/tools/chdman.cpp:2195-2203, src/lib/util/cdrom.cpp:2669-2672, src/emu/romload.cpp:1211"},"gamecube-disc":{"description":"Where disc offset 0 sits inside each container Dolphin opens.","formats":{"ciso":{"disc_header_at":32768,"magic":"CISO"},"gcz":{"disc_header_at":null,"magic_u32le":2970337281,"note":"block 0 is zlib unless bit 63 of its pointer is set"},"iso":{"disc_header_at":0,"magic":null},"rvz":{"disc_header_at":88,"magic":"RVZ\u0001","note":"first 0x80 disc bytes copied into header 2"},"wbfs":{"disc_header_at":null,"magic":"WBFS","note":"disc offset 0 at wlba[0] << wbfs_sector_shift"},"wia":{"disc_header_at":88,"magic":"WIA\u0001","note":Line truncated
+1 -1
View File
@@ -1 +1 @@
{"case_sensitive":false,"folders":[{"basis":"id","core":"2ship","emulator":"2ship","extensions":[".n64",".z64"],"fallback":["2ship|2ship"],"folder":"2ship","profile":"2ship","source_ref":"os system/templates/emulationstation/es_systems.cfg:5376","systems":["2ship"]},{"basis":"id","core":"opera","emulator":"libretro","extensions":[".chd",".cue",".iso"],"fallback":["panasonic-3do|opera"],"folder":"3do","profile":"opera","source_ref":"os system/templates/emulationstation/es_systems.cfg:1598","systems":["panasonic-3do"]},{"basis":"id","core":"azahar","emulator":"azahar","extensions":[".3ds",".3dsx",".7z",".app",".axf",".cci",".cia",".cxi",".elf",".m3u",".squashfs",".z3dsx",".zcci",".zcia",".zcxi",".zip"],"fallback":["nintendo-3ds|azahar"],"folder":"3ds","profile":"azahar","source_ref":"os system/templates/emulationstation/es_systems.cfg:3031","systems":["nintendo-3ds"]},{"basis":"only system of hypseus-singe","core":"hypseus","emulator":"hypseus","extensions":[".actionmax"],"fallback":["arcade-laserdisc|hypseus-singe"],"folder":"actionmax","profile":"hypseus-singe","source_ref":"os system/templates/emulationstation/es_systems.cfg:246","systems":["arcade-laserdisc"]},{"arcade":"mame","basis":"id","core":"mame","emulator":"libretro","extensions":[".1dd",".7z",".bin",".col",".cqi",".cqm",".d77",".d88",".ddp",".dfi",".dsk",".hfe",".imd",".m3u",".mfi",".mfm",".rom",".td0",".wav",".zip"],"fallback":["coleco-adam|mame"],"folder":"adam","profile":"mame","source_ref":"os system/templates/emulationstation/es_systems.cfg:4690","systems":["coleco-adam"]},{"arcade":"mame","basis":"native name of retrobat","core":"mame","emulator":"libretro","extensions":[".7z",".bin",".zip"],"fallback":["entex-advision|mame"],"folder":"advision","profile":"mame","source_ref":"os system/templates/emulationstation/es_systems.cfg:4194","systems":["entex-advision"]},{"basis":"unresolved","core":"windows","emulator":"windows","extensions":[".bat",".lnk",".url"],"folder":"amazon","source_ref":"os system/templates/emulationstation/es_systems.cfg:3854","systems":[]},{"basis":"native name of retrobat","core":"puae","emulator":"libretro","extensions":[".7z",".adf",".adz",".dms",".hdf",".ipf",".lha",".m3u",".rp9",".uae",".zip"],"fallback":["commodore-amiga|puae"],"folder":"amiga1200","profile":"puae","source_ref":"os system/templates/emulationstation/es_systems.cfg:1642","systems":["commodore-amiga"]},{"basis":"native name of retrobat","core":"puae","emulator":"libretro","extensions":[".7z",".adf",".adz",".dms",".hdf",".ipf",".lha",".m3u",".rp9",".uae",".zip"],"fallback":["commodore-amiga|puae"],"folder":"amiga4000","profile":"puae","source_ref":"os system/templates/emulationstation/es_systems.cfg:1667","systems":["commodore-amiga"]},{"basis":"native name of retrobat","core":"puae","emulator":"libretro","extensions":[".7z",".adf",".adz",".ags",".dms",".hdf",".ipf",".lha",".m3u",".rp9",".uae",".zip"],"fallback":["commodore-amiga|puae"],"folder":"amiga500","profile":"puae","source_ref":"os system/templates/emulationstation/es_systems.cfg:1618","systems":["commodore-amiga"]},{"basis":"native name of retrobat","core":"puae","emulator":"libretro","extensions":[".7z",".ccd",".chd",".cso",".cue",".iso",".lha",".mds",".nrg",".rp9",".zip"],"fallback":["commodore-amiga|puae"],"folder":"amigacd32","profile":"puae","source_ref":"os system/templates/emulationstation/es_systems.cfg:1690","systems":["commodore-amiga"]},{"basis":"native name of retrobat","core":"puae","emulator":"libretro","extensions":[".7z",".ccd",".chd",".cso",".cue",".iso",".m3u",".mds",".nrg",".rp9",".zip"],"fallback":["commodore-amiga|puae"],"folder":"amigacdtv","profile":"puae","source_ref":"os system/templates/emulationstation/es_systems.cfg:1715","systems":["commodore-amiga"]},{"basis":"normalized id","core":"cap32","emulator":"libretro","extensions":[".7z",".cdt",".dsk",".kcr",".m3u",".sna",".tap",".voc",".zip"],"fallback":["amstrad-cpc|cap32"],"folder":"amstradcpc","profile":"cap32","source_ref":"os system/templates/emulationstation/es_systems.cfg:1740","systems":["amstrad-cpc"]},{"arcade":"mame","basis":"id","core":"mame","emulator":"libretro","extensions":[".7z",".bin",".zip"],"fallback":["apf-m1000|mame"],"folder":"apfm1000","profile":"mame","source_ref":"os system/templates/emulationstation/es_systems.cfg:4614","systems":["apf-m1000"]},{"basis":"id","core":"applewin","emulator":"applewin","extensions":[".do",".dsk",".hdv",".m3u",".nib",".po",".woz",".zip"],"fallback":["apple2|applewin"],"folder":"apple2","profile":"applewin","source_ref":"os system/templates/emulationstation/es_systems.cfg:1781","systems":["apple2"]},{"basis":"id","core":"gsplus","emulator":"gsplus","extensions":[".2mg",".hdv",".m3u",".woz",".zip"],"fallback":["apple-iigs|gsplus"],"folder":"apple2gs","profile":"gsplus","source_ref":"os system/templates/emulationstation/es_systems.cfg:1818","systems":["apple-iigs"]},{"arcade":"mame","basis":"id","core":"mame","emulator":"libretro","extensions":[".zip"],"fallback":["matLine truncated
{"case_sensitive":false,"folders":[{"basis":"id","core":"2ship","emulator":"2ship","extensions":[".n64",".z64"],"fallback":["2ship|2ship"],"folder":"2ship","profile":"2ship","source_ref":"os system/templates/emulationstation/es_systems.cfg:5376","systems":["2ship"]},{"basis":"id","core":"opera","emulator":"libretro","extensions":[".chd",".cue",".iso"],"fallback":["panasonic-3do|opera"],"folder":"3do","profile":"opera","source_ref":"os system/templates/emulationstation/es_systems.cfg:1598","systems":["panasonic-3do"]},{"basis":"id","core":"azahar","emulator":"azahar","extensions":[".3ds",".3dsx",".7z",".app",".axf",".cci",".cia",".cxi",".elf",".m3u",".squashfs",".z3dsx",".zcci",".zcia",".zcxi",".zip"],"fallback":["nintendo-3ds|azahar"],"folder":"3ds","profile":"azahar","source_ref":"os system/templates/emulationstation/es_systems.cfg:3031","systems":["nintendo-3ds"]},{"basis":"only system of hypseus-singe","core":"hypseus","emulator":"hypseus","extensions":[".actionmax"],"fallback":["arcade-laserdisc|hypseus-singe"],"folder":"actionmax","profile":"hypseus-singe","source_ref":"os system/templates/emulationstation/es_systems.cfg:246","systems":["arcade-laserdisc"]},{"arcade":"mame","basis":"id","core":"mame","emulator":"libretro","extensions":[".1dd",".7z",".bin",".col",".cqi",".cqm",".d77",".d88",".ddp",".dfi",".dsk",".hfe",".imd",".m3u",".mfi",".mfm",".rom",".td0",".wav",".zip"],"fallback":["coleco-adam|mame"],"folder":"adam","profile":"mame","source_ref":"os system/templates/emulationstation/es_systems.cfg:4690","systems":["coleco-adam"]},{"arcade":"mame","basis":"native name of retrobat","core":"mame","emulator":"libretro","extensions":[".7z",".bin",".zip"],"fallback":["entex-advision|mame"],"folder":"advision","profile":"mame","source_ref":"os system/templates/emulationstation/es_systems.cfg:4194","systems":["entex-advision"]},{"basis":"unresolved","core":"windows","emulator":"windows","extensions":[".bat",".lnk",".url"],"folder":"amazon","source_ref":"os system/templates/emulationstation/es_systems.cfg:3854","systems":[]},{"basis":"native name of retrobat","core":"puae","emulator":"libretro","extensions":[".7z",".adf",".adz",".dms",".hdf",".ipf",".lha",".m3u",".rp9",".uae",".zip"],"fallback":["commodore-amiga|puae"],"folder":"amiga1200","profile":"puae","source_ref":"os system/templates/emulationstation/es_systems.cfg:1642","systems":["commodore-amiga"]},{"basis":"native name of retrobat","core":"puae","emulator":"libretro","extensions":[".7z",".adf",".adz",".dms",".hdf",".ipf",".lha",".m3u",".rp9",".uae",".zip"],"fallback":["commodore-amiga|puae"],"folder":"amiga4000","profile":"puae","source_ref":"os system/templates/emulationstation/es_systems.cfg:1667","systems":["commodore-amiga"]},{"basis":"native name of retrobat","core":"puae","emulator":"libretro","extensions":[".7z",".adf",".adz",".ags",".dms",".hdf",".ipf",".lha",".m3u",".rp9",".uae",".zip"],"fallback":["commodore-amiga|puae"],"folder":"amiga500","profile":"puae","source_ref":"os system/templates/emulationstation/es_systems.cfg:1618","systems":["commodore-amiga"]},{"basis":"native name of retrobat","core":"puae","emulator":"libretro","extensions":[".7z",".ccd",".chd",".cso",".cue",".iso",".lha",".mds",".nrg",".rp9",".zip"],"fallback":["commodore-amiga|puae"],"folder":"amigacd32","profile":"puae","source_ref":"os system/templates/emulationstation/es_systems.cfg:1690","systems":["commodore-amiga"]},{"basis":"native name of retrobat","core":"puae","emulator":"libretro","extensions":[".7z",".ccd",".chd",".cso",".cue",".iso",".m3u",".mds",".nrg",".rp9",".zip"],"fallback":["commodore-amiga|puae"],"folder":"amigacdtv","profile":"puae","source_ref":"os system/templates/emulationstation/es_systems.cfg:1715","systems":["commodore-amiga"]},{"basis":"normalized id","core":"cap32","emulator":"libretro","extensions":[".7z",".cdt",".dsk",".kcr",".m3u",".sna",".tap",".voc",".zip"],"fallback":["amstrad-cpc|cap32"],"folder":"amstradcpc","profile":"cap32","source_ref":"os system/templates/emulationstation/es_systems.cfg:1740","systems":["amstrad-cpc"]},{"arcade":"mame","basis":"id","core":"mame","emulator":"libretro","extensions":[".7z",".bin",".zip"],"fallback":["apf-m1000|mame"],"folder":"apfm1000","profile":"mame","source_ref":"os system/templates/emulationstation/es_systems.cfg:4614","systems":["apf-m1000"]},{"basis":"id","core":"applewin","emulator":"applewin","extensions":[".do",".dsk",".hdv",".m3u",".nib",".po",".woz",".zip"],"fallback":["apple2|applewin"],"folder":"apple2","profile":"applewin","source_ref":"os system/templates/emulationstation/es_systems.cfg:1781","systems":["apple2"]},{"basis":"id","core":"gsplus","emulator":"gsplus","extensions":[".2mg",".hdv",".m3u",".woz",".zip"],"fallback":["apple-iigs|gsplus"],"folder":"apple2gs","profile":"gsplus","source_ref":"os system/templates/emulationstation/es_systems.cfg:1818","systems":["apple-iigs"]},{"arcade":"mame","basis":"id","core":"mame","emulator":"libretro","extensions":[".zip"],"fallback":["matLine truncated
@@ -1 +0,0 @@
{"format_version":1,"region_files":{"vice_xvic":{"japan":["chargen-901460-02.bin","kernal.901486-02.bin"]}},"system":"commodore-vic20"}
-1
View File
@@ -1 +0,0 @@
{"format_version":1,"region_files":{"xroar":{"any":["alpha-basic.rom","alpha-boot-v0.4.rom","alpha-boot-v1.0.rom","cdos20.rom","d64_1.rom","d64_2.rom","ddos10.rom","ddos12a.rom","ddos40.rom","delta2.rom","dplus48.rom","dplus49b.rom","dragonfly-1.3.rom","dragonfly-2.3.rom","sdbdos.rom","sdose6.rom"],"spain":["d200e_1.rom","d200e_2.rom","d200e_26.rom"]}},"system":"dragon64"}
-1
View File
@@ -1 +0,0 @@
{"format_version":1,"region_files":{"xroar":{"any":["mc10.rom","mcx128.rom","mcx128a.rom"],"france":["alice.rom"]}},"system":"mc10"}
+4
View File
@@ -991,6 +991,10 @@
"type": "string",
"description": "Why source_commit is held on purpose rather than followed. The profile is then judged against its own revision, like one pinned to a superseded tag: comparing it to HEAD says nothing and recaling would repoint its refs at code the build it documents never had."
},
"pin_follows": {
"type": "string",
"description": "Why source_commit follows the branch tip although a single platform ships the profile: that platform builds the tip, cited by its build file. Without it or pin_frozen, a bump refuses a profile one platform ships."
},
"data_root": {
"type": "object",
"minProperties": 1,
+12 -1
View File
@@ -1571,11 +1571,16 @@ def resolve_local_file(
# runs when no casing matches exactly, or when only another
# emulator's tree does: xm6typeg got XM6 Utility's synthesized
# SCSIINROM.DAT while the X68000 dump sat as scsiinrom.dat.
# Another casing in another emulator's tree proves nothing:
# reminiscence's music module reunion took skyline's
# zoneinfo/Indian/Reunion.
folded = _casefold_name_index(by_name)
for try_name in names_to_try:
for match_sha1 in folded.get(try_name.casefold(), []):
if match_sha1 in files_db and _size_ok(match_sha1):
path = files_db[match_sha1]["path"]
if _foreign_tree(path, owners):
continue
if os.path.exists(path) and path not in candidates:
candidates.append(path)
if candidates:
@@ -1659,7 +1664,13 @@ def resolve_local_file(
if ".zip" in os.path.basename(path):
try:
composite = md5_composite(path).lower()
if composite in md5_set:
# A zipped_file md5 is the member's: one member of
# another name has the same composite, and Batocera
# looks the member up by name.
if composite in md5_set and (
not zipped_file
or check_inside_zip(path, zipped_file, composite) == "ok"
):
return path, "md5_composite_exact"
except (zipfile.BadZipFile, OSError) as exc:
_warn_unreadable_archive(path, exc)
+138 -17
View File
@@ -11,6 +11,7 @@ from __future__ import annotations
import argparse
import bisect
import difflib
import functools
import itertools
import json
import os
@@ -35,7 +36,10 @@ import version_basis
from common import (
_norm_system_id,
github_token,
list_registered_platforms,
load_emulator_profiles,
load_platform_config,
resolve_platform_cores,
suggest_names,
system_index,
)
@@ -1065,6 +1069,29 @@ class ProfileReport:
)
def triage_state(report: ProfileReport) -> str:
"""One triage line: what to review, the pin to set again named first.
A pin outside its branch's history or a repository answering under
another name is fixed before any ref is read: pcem showed as "1 to
review" for an upstream_commit off the dev branch.
"""
if report.skipped:
return report.skipped
state = f"{report.needs_review()} to review"
if report.orphaned:
state += f", {len(report.orphaned)} orphaned pin"
if report.moved_repos:
state += f", {len(report.moved_repos)} repository moved"
stale = len(report.stale_prose or ())
if stale:
state += f", {stale} prose under an older pin"
unchecked = (report.counts or {}).get("UNCHECKED", 0)
if unchecked:
state += f", {unchecked} unchecked"
return state
def select_repo(profile: dict) -> upstream.Repo | None:
"""Repository the profile was read from: source first, then upstream."""
for field in ("source", "upstream"):
@@ -1463,14 +1490,40 @@ def tag_pinned_views(
return tagged
def resolve_through_gitlinks(path: str, links: Iterable[Iterable[str]]) -> str | None:
"""Path of `project file` inside the one submodule named after the project.
idtech4a++ cites `xash3d-fwgs filesystem/filesystem.c` and starship
`Torch src/Companion.cpp`: the declared tree holds a gitlink there, not
the files, so no blob path answers and the part stayed external.
"""
word, _, rest = path.partition(" ")
rest = rest.strip().lstrip("/")
if not rest:
return None
word = word.lower()
for paths in links:
matches = [
link for link in paths or ()
if word in link.rsplit("/", 1)[-1].lower()
]
if len(matches) == 1:
return f"{matches[0]}/{rest}"
if matches:
return None
return None
def _resolve_project_words(
refs: list, tree_order: Callable[[], Iterable[list[str] | None]]
refs: list, tree_order: Callable[[], Iterable[list[str] | None]],
link_order: Callable[[], Iterable[Iterable[str]]] = lambda: (),
) -> list:
"""Point `project file` parts at the declared tree that vendors them.
tree_order() yields the trees to search, pin before HEAD. It is only
called for a part that needs it, since reading a HEAD tree costs a
request. Parts no tree carries stay external.
tree_order() yields the trees to search, pin before HEAD, and
link_order() the submodule paths of the declared trees at their pins.
Each is only called for a part that needs it, since reading a tree costs
a request. Parts no tree carries stay external.
"""
resolved: dict[str, str | None] = {}
out = []
@@ -1479,7 +1532,9 @@ def _resolve_project_words(
for part in parts:
if is_external_citation(part.path):
if part.path not in resolved:
resolved[part.path] = resolve_project_word(part.path, tree_order())
resolved[part.path] = resolve_project_word(
part.path, tree_order()
) or resolve_through_gitlinks(part.path, link_order())
if resolved[part.path]:
part = replace(part, path=resolved[part.path])
rewritten.append(part)
@@ -1860,7 +1915,14 @@ def build_report(
if key in mute:
return None
try:
return upstream.fetch_file(repo, sha, wanted, cache_dir, offline)
found = upstream.fetch_file(repo, sha, wanted, cache_dir, offline)
if found is None and "/" in wanted:
# A file of a submodule is read at the commit its gitlink
# pins in this revision, so a bump moves it with the port.
inner = upstream.through_gitlink(repo, sha, wanted, cache_dir, offline)
if inner is not None:
found = upstream.fetch_file(*inner, cache_dir, offline)
return found
except (upstream.RateLimitError, upstream.NotCachedError):
raise
except upstream.UpstreamError as exc:
@@ -1917,6 +1979,9 @@ def build_report(
lambda: itertools.chain(
map(_pin_tree_for, views), map(lambda v: _context_for(v)[1], views)
),
lambda: (
upstream.list_gitlinks(v.repo, v.pin, cache_dir, offline) for v in views
),
)
lines_cache: dict[tuple[str, str, int | None], list[str] | None] = {}
@@ -3436,9 +3501,37 @@ def _needs_review(report: ProfileReport, accept_changed: bool) -> bool:
return any((report.counts or {}).get(s) for s in blocking)
@functools.lru_cache(maxsize=4)
def _platform_cores(emulators_dir: str, platforms_dir: str) -> tuple[tuple[str, frozenset[str]], ...]:
profiles = load_emulator_profiles(emulators_dir)
return tuple(
(platform, frozenset(resolve_platform_cores(
load_platform_config(platform, platforms_dir), profiles
)))
for platform in list_registered_platforms(platforms_dir, include_archived=True)
)
def shipping_platforms(
name: str, emulators_dir: str, platforms_dir: str = "platforms",
) -> list[str]:
"""The registered platforms whose cores resolve to this profile.
Archived platforms count: RetroPie still builds the packages it lists.
"""
return [
platform
for platform, cores in _platform_cores(
os.path.realpath(emulators_dir), platforms_dir
)
if name in cores
]
def bump_commit(
path: Path, report: ProfileReport, accept_changed: bool = False,
cache_dir: str = DEFAULT_CACHE, offline: bool = False,
platforms_dir: str = "platforms",
) -> bool:
"""Advance source_commit to HEAD when nothing needs a read again.
@@ -3462,6 +3555,20 @@ def bump_commit(
file=sys.stderr,
)
return False
if not (document.get("pin_frozen") or document.get("pin_follows")):
shipped = shipping_platforms(path.stem, str(path.parent), platforms_dir)
if len(shipped) == 1:
# One platform ships it, so the pin is the revision that platform
# builds: a bulk advance moved fheroes2, supertux and
# supermariowar past what EmuELEC compiles, and rigelengine is
# already one commit ahead of its package.mk.
print(
f"{path.stem}: only {shipped[0]} ships it. Read the revision its "
"build compiles and set pin_frozen, or pin_follows when it "
"builds the branch tip",
file=sys.stderr,
)
return False
if any(isinstance(document.get(f), dict) for f in ("source_commit", "upstream_commit")):
# A pin per build mode names one revision per repository, and the
# report heads only the primary one: rewriting str(dict) was a
@@ -4097,9 +4204,10 @@ def build_parser() -> argparse.ArgumentParser:
help="the profiles the branch adds against --base, as CI checks them",
)
parser.add_argument(
"--base", default="origin/main",
"--base",
help="revision --changed and --added compare with, through its merge "
"base with HEAD (default: %(default)s)",
"base with HEAD (default: the project's main line, upstream/main or "
"origin/main when that remote names the project, fetched otherwise)",
)
parser.add_argument(
"--emulators-dir", default="emulators",
@@ -4266,14 +4374,33 @@ def branch_profiles(emulators_dir: str, base: str, added_only: bool) -> list[str
})
def project_base() -> str:
"""The project's main line, the base --changed compares with by default.
In a fork's clone origin/main is the fork: once the branch is pushed it
is HEAD, and --changed --strict found nothing and passed while the PR's
CI then failed. validate_pr.py resolves the same line the same way.
"""
from validate_pr import _git_lines as git_lines, _project_main_line
line = _project_main_line()
if line:
return line
for remote in ("upstream", "origin"):
if git_lines("rev-parse", "--verify", "--quiet", f"{remote}/main"):
return f"{remote}/main"
return "HEAD"
def select_profiles(profiles: dict, args: argparse.Namespace) -> dict:
"""Profiles matching the selection flags."""
if args.changed or args.added:
names = branch_profiles(args.emulators_dir, args.base, args.added)
base = args.base or project_base()
names = branch_profiles(args.emulators_dir, base, args.added)
selected = {name: profiles[name] for name in names if name in profiles}
if not selected:
verb = "adds" if args.added else "adds or edits"
print(f"the branch {verb} no profile against {args.base}", file=sys.stderr)
print(f"the branch {verb} no profile against {base}", file=sys.stderr)
return selected
if args.emulator:
names = [args.emulator] if isinstance(args.emulator, str) else args.emulator
@@ -4871,13 +4998,7 @@ def _print_triage(
print(f"{'score':>5s} {'profile':30s} state (worst first)")
pending = 0
for score, report, refused in sorted(ranked, key=lambda item: -item[0]):
state = report.skipped or f"{report.needs_review()} to review"
stale = len(report.stale_prose or ())
if stale and not report.skipped:
state += f", {stale} prose under an older pin"
unchecked = (report.counts or {}).get("UNCHECKED", 0)
if unchecked and not report.skipped:
state += f", {unchecked} unchecked"
state = triage_state(report)
if refused:
state += f", {refused}"
pending += bool(report.needs_review())
-1
View File
@@ -890,7 +890,6 @@ SYSTEM_NAMES: dict[str, str] = {
"bermuda-syndrome": "Bermuda Syndrome game",
"brezzasoft-crystal": "BrezzaSoft Crystal System",
"bshift": "Half-Life: Blue Shift",
"bsyndrome": "Bermuda Syndrome game",
"caesar3": "Caesar III",
"cambridge-z88": "Cambridge Computer Z88",
"camplynx": "Camputers Lynx",
+52
View File
@@ -1115,6 +1115,58 @@ def list_gitlinks(
}
def submodule_urls(text: str, base: Repo) -> dict[str, Repo]:
"""Submodule path -> repository, read from a .gitmodules text.
A relative url (`../xash3d-fwgs.git`) names a sibling of the repository
that declares it, on the same forge.
"""
repos: dict[str, Repo] = {}
path = url = None
for line in [*text.splitlines(), "[end]"]:
stripped = line.strip()
if stripped.startswith("["):
if path and url:
if url.startswith(("../", "./")):
segments = [base.owner, base.name]
for part in url.split("/"):
if part == "..":
segments.pop()
elif part not in (".", ""):
segments.append(part)
url = f"https://{base.host}/{'/'.join(segments)}"
repo = parse_repo(url)
if repo is not None:
repos[path] = repo
path = url = None
continue
key, _, value = stripped.partition("=")
if key.strip() == "path":
path = value.strip()
elif key.strip() == "url":
url = value.strip()
return repos
def through_gitlink(
repo: Repo, sha: str, path: str, cache_dir: str, offline: bool = False
) -> tuple[Repo, str, str] | None:
"""The submodule repository, commit and inner path a path falls under.
starship cites `Torch src/Companion.cpp`, a file of the Torch submodule:
the declared tree holds only the gitlink, which pins the revision.
"""
links = list_gitlinks(repo, sha, cache_dir, offline)
link = next((p for p in links if path.startswith(p + "/")), None)
if link is None:
return None
modules = fetch_file(repo, sha, ".gitmodules", cache_dir, offline)
target = submodule_urls("\n".join(modules or ()), repo).get(link)
if target is None:
return None
return target, links[link], path[len(link) + 1:]
def commit_date(repo: Repo, sha: str, cache_dir: str, offline: bool = False) -> str | None:
"""When a revision was committed, as the forge reports it (ISO 8601)."""
if repo.family == "gitlab":
+127
View File
@@ -5713,6 +5713,10 @@ class AHashScanLabelNamesNoOtherDump(unittest.TestCase):
"beetle_psx reads its first 512 KB under the same name",
("duckstation-legacy", "ps1_rom.bin"):
"the same whole PS3 image, whose first 512 KB src/core/bios.cpp:89 hashes",
("openmsx", "COLECO.ROM"):
"share/machines/ColecoVision_SGM.xml:56 names it, tried beside the machine XML",
("openmsx", "fmpac.rom"):
"share/machines/Boosted_MSX2_EN.xml:83 names it, tried beside the machine XML",
}
@staticmethod
@@ -6821,5 +6825,128 @@ class PipelineChildrenSkipNodeCompileCache(unittest.TestCase):
self.assertIn('"NODE_DISABLE_COMPILE_CACHE": "1"', source)
class HiganSuperGameBoyFolderIsFree(unittest.TestCase):
"""higan reads program.rom in the option's folder, SGB.sfc/, then Super
GameBoy.sfc/. bsnes, Mesen-S and ares read SGB1.sfc and SGB2.sfc as files
in the same system directory, and SuperSnes9x sgb.sfc, so a pack that only
had the first two folders never gave the higan cores a Super Game Boy."""
def test_each_higan_core_has_a_folder_no_core_reads_as_a_file(self):
import yaml
file_names: set[str] = set()
for path in (ROOT / "emulators").glob("*.yml"):
document = yaml.safe_load(path.read_text(encoding="utf-8")) or {}
for entry in document.get("files") or []:
for name in [entry.get("name"), *(entry.get("aliases") or [])]:
if name:
file_names.add(str(name).casefold())
if entry.get("path"):
file_names.add(str(entry["path"]).casefold())
for profile in ("higan_sfc", "higan_sfc_balanced"):
document = yaml.safe_load(
(ROOT / "emulators" / f"{profile}.yml").read_text(encoding="utf-8")
)
folders = {
str(entry["path"]).split("/", 1)[0]
for entry in document["files"]
if str(entry.get("path") or "").endswith("/program.rom")
and entry.get("system") == "nintendo-sgb"
}
with self.subTest(profile=profile):
self.assertTrue(
[f for f in folders if f.casefold() not in file_names], folders
)
class ProfileNotesDescribeTheCoreAlone(unittest.TestCase):
"""mednafen_pce_fast, sdlpop and x64sdl described the core by what
another profile of this directory does ("unlike beetle_pce", "unlike the
other engines in this directory"), which means nothing once the profile
is read on its own, and 21 lines shouted NOT, ALL or MUST."""
SHOUT = re.compile(r"\b(NOT|NEVER|ONLY|MUST|ALL|DIFFERENT)\b(?! FOUND)")
def test_no_profile_shouts_or_compares_with_another_profile(self):
names = {path.stem.casefold() for path in (ROOT / "emulators").glob("*.yml")}
names |= {name.replace("_", "-") for name in names}
found = []
for path in sorted((ROOT / "emulators").glob("*.yml")):
text = path.read_text(encoding="utf-8")
for number, line in enumerate(text.splitlines(), 1):
if self.SHOUT.search(line):
found.append(f"{path.stem}:{number}")
for match in re.finditer(r"\bunlike (?:the )?([\w+-]+)", line, re.I):
if match.group(1).casefold() in names:
found.append(f"{path.stem}:{number}")
self.assertEqual(found, [])
class Ps2BiosImagesAreFoundByContent(unittest.TestCase):
"""PCSX2 and its forks scan the BIOS folder and keep the first 4 to 8 MB
image with a romdir (pcsx2/ps2/BiosTools.cpp:258-282 at f0523f8a). With
no found_by the label ps2-0230a-20080220.bin read as a name the core
opens, and the RetroDECK export added it as a required file."""
def test_every_ps2_image_scan_is_marked(self):
import yaml
from validation import opens_by_name
named = []
for path in sorted((ROOT / "emulators").glob("*.yml")):
profile = yaml.safe_load(path.read_text(encoding="utf-8")) or {}
if profile.get("bios_mode") != "agnostic":
continue
for entry in profile.get("files") or []:
if (
entry.get("min_size") == 4194304
and entry.get("max_size") == 8388608
and opens_by_name(entry, profile)
):
named.append(f"{path.stem}: {entry['name']}")
self.assertEqual(named, [])
class Dev9FilesAreReadFromTheWorkingDirectory(unittest.TestCase):
"""DEV9 opens eeprom.dat and flash.dat by bare name (PCSX2
pcsx2/DEV9/DEV9.cpp:144, AetherSX2 DEV9/flash.cpp:89): the working
directory, never the BIOS folder. Eight profiles left load_from unset,
so the file was packed into the BIOS folder, where nothing reads it."""
def test_every_dev9_file_names_the_working_directory(self):
import yaml
unset = []
for path in sorted((ROOT / "emulators").glob("*.yml")):
profile = yaml.safe_load(path.read_text(encoding="utf-8")) or {}
for entry in profile.get("files") or []:
if entry.get("name") in ("eeprom.dat", "flash.dat") and "DEV9" in str(
entry.get("source_ref")
) and entry.get("load_from") != "working_directory":
unset.append(f"{path.stem}: {entry['name']}")
self.assertEqual(unset, [])
class OpenMsxSystemRomsAreFoundBySha1(unittest.TestCase):
"""openMSX reaches a ROM in share/systemroms through the file pool by
SHA1 alone, a filename being looked up only beside the machine's XML
(src/memory/Rom.cc:121-170). Read as names the core opens, the labels
were added to the KNULLI and Batocera exports."""
def test_no_systemrom_label_reads_as_a_name(self):
import yaml
from validation import opens_by_name
profile = yaml.safe_load((ROOT / "emulators" / "openmsx.yml").read_text())
named = [
entry["name"] for entry in profile["files"]
if "share/systemroms/" in str(entry.get("path"))
and opens_by_name(entry, profile)
]
self.assertEqual(named, [])
if __name__ == "__main__":
unittest.main()
+34
View File
@@ -5541,6 +5541,40 @@ struct BurnDriver BurnDrvneogeo = {
self.assertEqual(local, path)
self.assertEqual(status, "name_exact")
def test_217b_zipped_file_composite_needs_the_member(self):
"""One member of another name has the zipped_file md5 as composite.
Batocera looks the member up by name, so the archive is not proof of
the entry: a MAME rename leaves exactly that archive behind.
"""
import hashlib as hl
import tempfile
from common import resolve_local_file
rom = b"inner rom bytes"
rom_md5 = hl.md5(rom).hexdigest()
with tempfile.TemporaryDirectory() as tmpdir:
path = os.path.join(tmpdir, "foo.zip")
with zipfile.ZipFile(path, "w") as zf:
zf.writestr("renamed.bin", rom)
db = {
"files": {"sha1z": {"name": "foo.zip", "path": path, "md5": "f" * 32}},
"indexes": {
"by_md5": {}, "by_name": {"foo.zip": ["sha1z"]},
"by_crc32": {}, "by_path_suffix": {},
},
}
entry = {"name": "foo.zip", "zipped_file": "expected.bin", "md5": rom_md5}
self.assertNotEqual(
resolve_local_file(entry, db)[1], "md5_composite_exact"
)
with zipfile.ZipFile(path, "w") as zf:
zf.writestr("expected.bin", rom)
self.assertEqual(
resolve_local_file(entry, db), (path, "md5_composite_exact")
)
def test_215_check_member_hash_inside_zip(self):
"""zipped_file entries verify the ROM inside the ZIP, not the ZIP."""
import hashlib as hl
+43
View File
@@ -93,6 +93,49 @@ class ForeignTreeNames(unittest.TestCase):
self.assertEqual(status, "data_dir")
self.assertEqual(Path(path).read_bytes(), b"B" * 64)
def test_another_casing_in_another_tree_is_not_the_file(self):
"""reminiscence's music module reunion took skyline's
zoneinfo/Indian/Reunion, a time-zone file, on the casefold step."""
self._hold("bios/Other/skyline/tzdata/zoneinfo/Indian/Reunion", b"T" * 64)
entry = {
"name": "reunion", "aliases": ["mod.flashback-reunion"],
"category": "game_data", "source_profile": "reminiscence",
}
self.assertEqual(resolve_local_file(entry, self.db), (None, "not_found"))
class RetailDashboardTree(unittest.TestCase):
"""x1-box asked for C/xbox.xtf: the only copy at that tail sat in hakuX's
tree and was set aside, and the name step served Xenia's Xbox 360 font.
The retail dashboard both emulators import lives with the console."""
def test_partition_c_resolves_by_path_for_both_importers(self):
import yaml
from common import load_database
db_path = REPO_ROOT / "database.json"
if not db_path.exists():
self.skipTest("database.json absent")
db = load_database(str(db_path))
for profile in ("x1-box", "hakux"):
document = yaml.safe_load(
(REPO_ROOT / "emulators" / f"{profile}.yml").read_text()
)
for entry in document["files"]:
dest = str(entry.get("path") or "")
if not dest.startswith("C/"):
continue
with self.subTest(profile=profile, dest=dest):
asked = {**entry, "source_profile": profile}
cwd = os.getcwd()
os.chdir(REPO_ROOT)
try:
path, status = resolve_local_file(asked, db, dest_hint=dest)
finally:
os.chdir(cwd)
self.assertEqual(status, "path_exact", path)
if __name__ == "__main__":
unittest.main()
+144
View File
@@ -333,6 +333,19 @@ class TestGoneUpstreamIsNotAnError(unittest.TestCase):
self.assertIn("upstream gone", out)
self.assertIn("upstream error", out)
def test_triage_names_an_orphaned_pin_and_a_moved_repository(self):
"""pcem's only problem was an upstream_commit off its dev branch, and
the triage line read "1 to review" like any drift."""
report = ProfileReport(
name="pcem", entries=[], counts={"UNCHECKED": 2},
orphaned=["sarah-walker-pcem/pcem: pin 25b54e3f is no ancestor of 4606fb1e"],
moved_repos=["a/b answers as c/b (renamed or transferred)"],
)
self.assertEqual(
profile_sync.triage_state(report),
"2 to review, 1 orphaned pin, 1 repository moved, 2 unchecked",
)
class TestWorstStatus(unittest.TestCase):
def test_gone_beats_everything(self):
@@ -501,6 +514,46 @@ class TestVerifyAtPin(unittest.TestCase):
self.assertIsNone(profile_sync.cites_another_version(same, "0.16.0"))
self.assertIsNone(profile_sync.cites_another_version(same, {"libretro": "v0.16.0"}))
def test_a_profile_with_a_repository_names_a_revision(self):
"""redream declared libretro/redream, a repository that never
existed, with no pin and no date: profile_sync skipped it and no
revision answered for the files Batocera, RetroBat and KNULLI ship."""
import yaml
root = Path(__file__).resolve().parents[1] / "emulators"
unpinned = [
path.stem
for path in sorted(root.glob("*.yml"))
if (profile := yaml.safe_load(path.read_text(encoding="utf-8")) or {})
and (profile.get("source") or profile.get("upstream"))
and not any(
profile.get(key)
for key in ("source_commit", "upstream_commit", "profiled_date")
)
]
self.assertEqual(unpinned, [])
def test_a_profile_citing_versions_documents_its_own(self):
"""ti99sim's core_version went null while doc/CHANGES.html at its pin
reads 0.16.0: every (v0.16.0) part then read as another version, and
the profile reported 0 to review with nothing checked."""
import yaml
root = Path(__file__).resolve().parents[1] / "emulators"
silent = []
for path in sorted(root.glob("*.yml")):
profile = yaml.safe_load(path.read_text(encoding="utf-8")) or {}
refs = " ".join(
str(entry.get("source_ref") or "") for entry in profile.get("files") or []
)
if not profile_sync._VERSION_NOTE_RE.search(refs):
continue
declared = profile.get("core_version")
values = declared.values() if isinstance(declared, dict) else [declared]
if not any(values):
silent.append(path.stem)
self.assertEqual(silent, [])
def test_a_name_stem_elsewhere_does_not_move_a_ref(self):
"""linapple cites the PRAVETS82 option, and the stem also names an install line."""
lines = ['option(ENABLE_ROM_CLONE_PRAVETS "" OFF)', "", "", "", "", "",
@@ -3203,6 +3256,35 @@ class TestBumpCommit(unittest.TestCase):
# Nothing was compared upstream, so its pin is not written.
self.assertNotIn("uphead", text)
def test_a_profile_one_platform_ships_waits_for_its_build(self):
"""EmuELEC alone ships RigelEngine and builds its package.mk
PKG_VERSION. A bulk advance moved fheroes2 and supertux past that
build, and rigelengine is a commit ahead of it already."""
root = Path(__file__).resolve().parents[1]
path = Path(self.tmp.name) / "rigelengine.yml"
path.write_text(
SAMPLE.replace("\nnotes:", "\ntype: standalone\ncores: [rigelengine, RigelEngine]\n\nnotes:", 1),
encoding="utf-8",
)
report = ProfileReport(
name="rigelengine", repo="o/n", pin="pin", head="newhead", entries=[],
counts={}, skipped=profile_sync.NO_SOURCE_REF,
)
platforms = str(root / "platforms")
self.assertEqual(
profile_sync.shipping_platforms("rigelengine", self.tmp.name, platforms),
["emuelec"],
)
with contextlib.redirect_stderr(io.StringIO()) as err:
self.assertFalse(bump_commit(path, report, platforms_dir=platforms))
self.assertIn("only emuelec ships it", err.getvalue())
path.write_text(
path.read_text(encoding="utf-8")
+ 'pin_follows: "EmuELEC builds the branch tip"\n',
encoding="utf-8",
)
self.assertTrue(bump_commit(path, report, platforms_dir=platforms))
def test_any_other_skip_still_holds_the_pin(self):
report = ProfileReport(
name="p", repo="o/n", pin="pin", head="newhead", entries=[], counts={},
@@ -3929,6 +4011,50 @@ class TestCollectCitations(unittest.TestCase):
self.assertIsNone(resolve("munt ROMInfo.cpp", [tree]))
self.assertIsNone(resolve("mupen64plus Config.cpp", [tree]))
def test_project_word_resolves_inside_a_submodule(self):
"""idtech4a++ and starship cite files of a submodule. The declared
tree holds only the gitlink, so the parts stayed external and moved
unchecked with every bump."""
links = ["Q3E/src/main/jni/xash3d/xash3d-fwgs", "tools/Torch", "libs/zlib"]
resolve = profile_sync.resolve_through_gitlinks
self.assertEqual(
resolve("xash3d-fwgs filesystem/filesystem.c", [links]),
"Q3E/src/main/jni/xash3d/xash3d-fwgs/filesystem/filesystem.c",
)
self.assertEqual(
resolve("Torch src/Companion.cpp", [links]), "tools/Torch/src/Companion.cpp"
)
self.assertIsNone(resolve("munt ROMInfo.cpp", [links]))
self.assertIsNone(resolve("lib x.c", [["a/lib1", "b/lib2"]]))
def test_a_submodule_file_is_read_at_its_pinned_commit(self):
port = upstream.make_repo("github.com", "glKarin", "com.n0n3m4.diii4a")
files = {
(port.slug, "p1", ".gitmodules"): [
'[submodule "Q3E/src/main/jni/xash3d/xash3d-fwgs"]',
"\tpath = Q3E/src/main/jni/xash3d/xash3d-fwgs",
"\turl = ../xash3d-fwgs.git",
],
("glKarin/xash3d-fwgs", "s1", "filesystem/filesystem.c"): ["getenv(x)"],
}
def fetch(repo, sha, path, *_):
return files.get((repo.slug, sha, path))
with mock.patch.object(upstream, "fetch_file", side_effect=fetch), \
mock.patch.object(
upstream, "list_gitlinks",
return_value={"Q3E/src/main/jni/xash3d/xash3d-fwgs": "s1"},
):
target = upstream.through_gitlink(
port, "p1",
"Q3E/src/main/jni/xash3d/xash3d-fwgs/filesystem/filesystem.c", "c",
)
self.assertEqual(
(target[0].slug, target[1], target[2]),
("glKarin/xash3d-fwgs", "s1", "filesystem/filesystem.c"),
)
def test_run_is_rendered_with_its_written_path(self):
parts = [RefPart("mupen64plus-video-rice/upstream/src/Config.cpp", 38, 38, "38")]
self.assertEqual(
@@ -5799,6 +5925,24 @@ class TestBranchProfiles(unittest.TestCase):
["draft", "edited", "new"],
)
def test_a_fork_clone_compares_with_the_project(self):
"""origin is the fork, pushed: origin/main is HEAD, and the default
base found nothing to check while the PR's CI failed."""
base = subprocess.run(
["git", "rev-parse", "main"], cwd=self.root, capture_output=True,
text=True, check=True,
).stdout.strip()
self._git("remote", "add", "origin", "https://github.com/someone/retrobios")
self._git("remote", "add", "upstream", "https://github.com/Abdess/retrobios")
self._git("update-ref", "refs/remotes/origin/main", "HEAD")
self._git("update-ref", "refs/remotes/upstream/main", base)
args = profile_sync.build_parser().parse_args(["--changed"])
profiles = {"kept": {}, "edited": {}, "new": {}, "draft": {}}
self.assertEqual(
list(profile_sync.select_profiles(profiles, args)),
["draft", "edited", "new"],
)
class TestBranchCheckIsWired(unittest.TestCase):
"""CONTRIBUTING and CI name the branch's profiles through the flag."""
+32
View File
@@ -509,6 +509,11 @@ class OneCodeOneRegionAnswer(unittest.TestCase):
profiles = common.load_emulator_profiles(self.PROFILES)
bios_sms = next(e for e in profiles["clk"]["files"] if e["name"] == "bios.sms")
self.assertIn("oceania", bios_sms["region"])
# A Mexican export cartridge is analysed as Europe or USA and boots the
# western BIOS: only Japan selects the other one.
self.assertEqual(
region.rank(region.normalize_declared(bios_sms["region"]), ["mexico"]), 0
)
tagged = {
e["name"]: e.get("region") for e in profiles["kronos"]["files"]
if e.get("archive") == "stvbios.zip" and e["name"].startswith("epr-")
@@ -1379,5 +1384,32 @@ class YmirLibretroRegions(unittest.TestCase):
if e["name"] == "sega_101.bin"))
class MachineModelRomsCarryNoTerritory(unittest.TestCase):
"""XRoar reads d200e_1.rom for the dragon200e machine and alice.rom for
the alice machine (src/xroar.c:437-444, 552-558), and VICE the Japanese
kernal and chargen for the C64 JAP and VIC-1001 models, which a file name
tagged (Japan) never selects (libretro-core.c:2018-2034 sets NTSC). The
site told a Spanish Dragon 64 owner to start with d200e_1.rom."""
CASES = {
"xroar": ("d200e_1.rom", "d200e_2.rom", "d200e_26.rom", "alice.rom"),
"x64sdl": ("jpkernal", "jpchrgen"),
"vice_xvic": ("kernal.901486-02.bin", "chargen-901460-02.bin"),
}
def test_model_roms_are_unregioned(self):
profiles = common.load_emulator_profiles(
os.path.join(os.path.dirname(__file__), "..", "emulators")
)
for profile, names in self.CASES.items():
for entry in profiles[profile]["files"]:
if entry["name"] in names:
with self.subTest(profile=profile, name=entry["name"]):
self.assertNotIn("region", entry)
self.assertFalse(
[e["name"] for e in profiles["c64-emu"]["files"] if e.get("region")]
)
if __name__ == "__main__":
unittest.main()
+64 -37
View File
@@ -115,7 +115,7 @@
"crates/wqxemu/src/keypad.rs",
"crates/wqxemu/src/main.rs"
],
"git.libretro.com/libretro/xenia-libretro@f23c14c717ef274516f29c9b5e97d6a9db28643d": [
"git.libretro.com/libretro/xenia-edge-libretro@f23c14c717ef274516f29c9b5e97d6a9db28643d": [
".ci/build-windows-cross.sh",
"libretro/CMakeLists.txt",
"libretro/libretro.cpp",
@@ -1798,6 +1798,7 @@
"Analyser/Static/Commodore/Target.hpp",
"Analyser/Static/MSX/StaticAnalyser.cpp",
"Analyser/Static/MSX/Target.hpp",
"Analyser/Static/Sega/StaticAnalyser.cpp",
"Analyser/Static/Sega/Target.hpp",
"Components/DiskII/DiskII.cpp",
"Machines/Apple/Macintosh/Macintosh.cpp",
@@ -3182,6 +3183,11 @@
"rott/rt_ted.c"
],
"github.com/finalburnneo/FBNeo@697e385c8285bfc528343b96d948ee3a4f9e24c5": [
"src/burn/burn.cpp",
"src/burn/drv/neogeo/d_neogeo.cpp",
"src/burn/hiscore.cpp"
],
"github.com/finalburnneo/FBNeo@c110542721d8674b6ff48e691ac032c040fecbba": [
"src/burn/burn.cpp",
"src/burn/drv/atari/d_atarisy1.cpp",
"src/burn/drv/channelf/d_channelf.cpp",
@@ -3477,39 +3483,6 @@
"src/xenia/ui/imgui_drawer.cc",
"src/xenia/ui/vulkan/vulkan_instance.cc"
],
"github.com/hatari/hatari@23bc3060ebf0da348cc842e358c102ba88002b56": [
"CMakeLists.txt",
"doc/release-checklist.txt",
"src/CMakeLists.txt",
"src/cart.c",
"src/change.c",
"src/configuration.c",
"src/debug/symbols.c",
"src/falcon/nvram.c",
"src/file.c",
"src/floppies/stx.c",
"src/floppy.c",
"src/includes/configuration.h",
"src/includes/version.h",
"src/m68000.c",
"src/main.c",
"src/midi.c",
"src/options.c",
"src/paths.c",
"src/printer.c",
"src/reset.c",
"src/retro/disk_control.c",
"src/retro/harddisk.c",
"src/retro/keymap.c",
"src/retro/main_retro.c",
"src/retro/options.c",
"src/retro/statusbar.c",
"src/rs232.c",
"src/scc.c",
"src/sdl/keymap.c",
"src/sdl/screen.c",
"src/tos.c"
],
"github.com/hatari/hatari@c1a5c88bc06e56778b6b7f8483becfd58a7da2b4": [
"src/cart.c",
"src/change.c",
@@ -3523,6 +3496,42 @@
"src/tos.c",
"src/vdi.c"
],
"github.com/hatari/hatari@c453b85f811fc11bed10e19e5e48fe95377e5a23": [
"CMakeLists.txt",
"doc/release-checklist.txt",
"src/CMakeLists.txt",
"src/cart.c",
"src/change.c",
"src/configuration.c",
"src/debug/symbols.c",
"src/falcon/nvram.c",
"src/file.c",
"src/filename.c",
"src/floppies/stx.c",
"src/floppy.c",
"src/includes/configuration.h",
"src/includes/version.h",
"src/m68000.c",
"src/main.c",
"src/midi.c",
"src/options.c",
"src/paths.c",
"src/printer.c",
"src/reset.c",
"src/retro/disk_control.c",
"src/retro/file_retro.c",
"src/retro/harddisk.c",
"src/retro/keymap.c",
"src/retro/main_retro.c",
"src/retro/options.c",
"src/retro/statusbar.c",
"src/retro/vfs.c",
"src/rs232.c",
"src/scc.c",
"src/sdl/keymap.c",
"src/sdl/screen.c",
"src/tos.c"
],
"github.com/hex007/freej2me@8b9bc8a19baf26e3d92f88934a64a32f1cbc2795": [
"build.xml",
"src/javax/microedition/media/Manager.java",
@@ -3599,6 +3608,12 @@
"src/system.go",
"src/util_desktop.go"
],
"github.com/inolen/redream@ffb7302245ff40515cb9f0f0b0e233a4b39342d3": [
"src/guest/bios/bios.c",
"src/guest/rom/boot.c",
"src/guest/rom/flash.c",
"src/host/retro_host.c"
],
"github.com/io12/qemu-libretro@aaba4471880587540314f82419d920431d55b769": [
"hw/alpha/dp264.c",
"hw/arm/digic_boards.c",
@@ -3853,7 +3868,7 @@
"README.md",
"sdl12main.c"
],
"github.com/lethal-guitar/RigelEngine@30afeff8f0b105eac77ee0a2fbd54b06e1a49b60": [
"github.com/lethal-guitar/RigelEngine@f05996f9b3ad3b3ea5bb818e49e7977636746343": [
"README.md",
"cmake/rigel_pack.cmake",
"src/assets/cmp_file_package.cpp",
@@ -3879,6 +3894,12 @@
"libretro.c"
],
"github.com/libretro/FBNeo@32958a89abd645ed20387c8d31d21ede3bc48161": [
"src/burn/burn.cpp",
"src/burn/drv/neogeo/d_neogeo.cpp",
"src/burn/hiscore.cpp",
"src/burner/libretro/libretro.cpp"
],
"github.com/libretro/FBNeo@da14132bab6683980b1ad7e4d0d6fd47bf06dce7": [
"src/burn/burn.cpp",
"src/burn/drv/atari/d_atarisy1.cpp",
"src/burn/drv/channelf/d_channelf.cpp",
@@ -4436,7 +4457,7 @@
"gwrom/gwrom.h",
"src/libretro.c"
],
"github.com/libretro/hatari@50929946d196f431906932420c55e1b3593dacc5": [
"github.com/libretro/hatari@25f488b1667ed064a25c30eb3f06b40bc877c495": [
".gitlab-ci-libretro.yml",
"CMakeLists.txt",
"cmake/BuildDependencies.cmake",
@@ -4448,6 +4469,7 @@
"src/debug/symbols.c",
"src/falcon/nvram.c",
"src/file.c",
"src/filename.c",
"src/floppies/stx.c",
"src/floppy.c",
"src/includes/configuration.h",
@@ -4460,6 +4482,7 @@
"src/printer.c",
"src/reset.c",
"src/retro/disk_control.c",
"src/retro/file_retro.c",
"src/retro/floppy_sound.c",
"src/retro/harddisk.c",
"src/retro/keymap.c",
@@ -4666,6 +4689,7 @@
"src/drivers/cvs.c",
"src/drivers/decocass.c",
"src/drivers/konamigx.c",
"src/drivers/namcos11.c",
"src/drivers/neogeo.c",
"src/drivers/nss.c",
"src/drivers/pgm.c",
@@ -8136,10 +8160,13 @@
"share/machines/Philips_VG_8020.xml",
"share/machines/Pioneer_PX-7.xml",
"share/machines/Spectravideo_SVI-328.xml",
"src/config/HardwareConfig.cc",
"src/file/File.cc",
"src/file/FileContext.cc",
"src/file/FilePool.cc",
"src/file/FilePoolCore.cc",
"src/file/ZipFileAdapter.cc"
"src/file/ZipFileAdapter.cc",
"src/memory/Rom.cc"
],
"github.com/openmoh/openmohaa@a2f340195975f4f042e28a60b62561dd9a0b2700": [
"code/qcommon/common.c",
+1
View File
@@ -521,6 +521,7 @@ reports the profile as uncheckable, and the CI job that runs
| `source_commit` | see above | commit SHA of `source` the code was read at. Anchors every `source_ref` line number |
| `upstream_commit` | no | same, for `upstream` |
| `pin_frozen` | no | why `source_commit` is held on purpose rather than followed. The profile is then judged against its own revision, like one pinned to a superseded tag |
| `pin_follows` | no | why `source_commit` follows the branch tip when a single platform ships the profile: that platform builds the tip, cited by its build file. A bump refuses a profile one platform ships until it carries `pin_frozen` or `pin_follows` |
| `data_root` | no | per operating system (`android`, `ios`, `windows`, `macos`, `linux`), the folder the app reads its user data from, under which `standalone_path` destinations sit: `path` as the user finds it (`Android/data/<package>/files`, `%APPDATA%/...`), with the `source_ref` that builds it. Only the systems the app runs on are keyed |
| `upstream_frozen` | no | why `upstream_commit` is held: the port vendors that upstream tree, synced to that release, or merged that commit. The upstream view is read at its own pin and a bump leaves it. Without it, a port that is a GitHub fork of its upstream follows the merge base of the two |
| `prose_written_at` | no | the pin a reader confirmed the prose citations against. When the profile's history shows a text living under several pins, profile_sync takes this one as the revision the text describes, so a bump is no longer refused for a citation already reread. It never overrides a history with a single candidate |
+7 -3
View File
@@ -448,8 +448,10 @@ to show one cited file and `--context N` lines around each hunk. `--strict`
exits 1 when a profile has refs to review, and CI runs it on every profile a change
adds. `--offline` answers from `--cache-dir` alone. `--changed` selects the
profiles the branch adds or edits, uncommitted ones included, and `--added`
the ones it adds, both against the merge base of `--base` (`origin/main` by
default) and HEAD.
the ones it adds, both against the merge base of `--base` and HEAD. By
default `--base` is the project's main line: `upstream/main` or `origin/main`
when that remote is the project, fetched from the project in a fork's clone,
where `origin/main` is the fork.
```bash
python scripts/profile_sync.py --all --system sega-saturn --changed-only
@@ -612,7 +614,9 @@ Writes are explicit and mechanical only. `--backfill-commits` fills a
missing `source_commit`, `--rebase-refs` recales `SHIFTED` and `RENAMED`
line ranges and moves `source_commit` to HEAD with them, all or nothing,
`--bump-commit` advances `source_commit` to HEAD only when nothing needs a
re-read. All three refuse to run on a dirty `emulators/` without `--force`,
re-read. It leaves a profile a single registered platform ships until the
profile says what that platform builds: `pin_frozen` for a fixed revision,
`pin_follows` for the branch tip. All three refuse to run on a dirty `emulators/` without `--force`,
and every write is verified by reparsing the document.
Uses `GITHUB_TOKEN` when set, which `--all` requires. Responses are cached