mirror of
https://github.com/Abdess/retroarch_system.git
synced 2026-11-06 01:53:56 -06:00
chore: merge audit batch, resolver and profiles
This commit is contained in:
commit
e50eeb52fd
73 files changed
+943
-281
No files matched your search
@@ -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
@@ -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"
|
||||
],
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
@@ -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"
|
||||
|
||||
@@ -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"
|
||||
|
||||
|
||||
@@ -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
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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).
|
||||
#
|
||||
|
||||
@@ -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
@@ -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
@@ -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
@@ -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
|
||||
|
||||
@@ -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"
|
||||
@@ -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"
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -45,6 +45,7 @@ data_directories:
|
||||
|
||||
files:
|
||||
- name: "<bios>.bin"
|
||||
found_by: content
|
||||
path: "pcsx2/bios/<bios>.bin"
|
||||
required: true
|
||||
description: "PS2 BIOS binary"
|
||||
|
||||
@@ -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.
|
||||
|
||||
@@ -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.
|
||||
|
||||
@@ -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).
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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.
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
@@ -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"
|
||||
@@ -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
@@ -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.
|
||||
#
|
||||
|
||||
@@ -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.
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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.
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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
@@ -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.
|
||||
|
||||
|
||||
@@ -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.
|
||||
|
||||
@@ -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.
|
||||
|
||||
@@ -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]
|
||||
|
||||
@@ -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"
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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"
|
||||
|
||||
@@ -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 @@
|
||||
{"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 @@
|
||||
{"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 @@
|
||||
{"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 +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 +0,0 @@
|
||||
{"format_version":1,"region_files":{"xroar":{"any":["mc10.rom","mcx128.rom","mcx128a.rom"],"france":["alice.rom"]}},"system":"mc10"}
|
||||
@@ -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
@@ -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
@@ -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())
|
||||
|
||||
@@ -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",
|
||||
|
||||
@@ -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":
|
||||
|
||||
@@ -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()
|
||||
@@ -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
|
||||
|
||||
@@ -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()
|
||||
@@ -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."""
|
||||
|
||||
@@ -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()
|
||||
@@ -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",
|
||||
|
||||
@@ -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
@@ -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
|
||||
|
||||
Reference in new issue
Block a user