mirror of
https://github.com/Abdess/retroarch_system.git
synced 2026-10-18 09:23:26 -05:00
A prose citation whose text lived under several pins stayed in read again until the text changed, so fixnes, zesarux and emucorex, exact at their pins, would have refused every later bump. prose_written_at names the pin a reader confirmed; it settles the readings and never overrides a history with one candidate.
822 lines
20 KiB
JSON
822 lines
20 KiB
JSON
{
|
|
"$schema": "https://json-schema.org/draft/2020-12/schema",
|
|
"title": "Emulator BIOS Profile",
|
|
"description": "One YAML per emulator core or engine, documenting every external file the code loads. Field reference: https://abdess.github.io/retrobios/wiki/profiling/",
|
|
"type": "object",
|
|
"additionalProperties": false,
|
|
"required": [
|
|
"emulator",
|
|
"type"
|
|
],
|
|
"allOf": [
|
|
{
|
|
"comment": "An alias profile points at another profile and carries no files of its own.",
|
|
"if": {
|
|
"properties": {
|
|
"type": {
|
|
"const": "alias"
|
|
}
|
|
},
|
|
"required": [
|
|
"type"
|
|
]
|
|
},
|
|
"then": {
|
|
"required": [
|
|
"alias_of"
|
|
]
|
|
},
|
|
"else": {
|
|
"required": [
|
|
"files"
|
|
]
|
|
}
|
|
},
|
|
{
|
|
"comment": "Per-file mode separates the two builds of a dual profile. A profile with only a standalone build has no libretro side to separate it from, and a file marked standalone there drops out of the gap analysis and of the packs of every platform that lists the emulator without standalone_cores.",
|
|
"if": {
|
|
"properties": {
|
|
"type": {
|
|
"const": "standalone"
|
|
}
|
|
},
|
|
"required": [
|
|
"type"
|
|
]
|
|
},
|
|
"then": {
|
|
"properties": {
|
|
"files": {
|
|
"items": {
|
|
"not": {
|
|
"properties": {
|
|
"mode": {
|
|
"const": "standalone"
|
|
}
|
|
},
|
|
"required": [
|
|
"mode"
|
|
]
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
],
|
|
"properties": {
|
|
"emulator": {
|
|
"type": "string"
|
|
},
|
|
"display_name": {
|
|
"type": "string"
|
|
},
|
|
"type": {
|
|
"description": "Operational: resolve_platform_cores() filters on it. Not a classification.",
|
|
"type": "string",
|
|
"enum": [
|
|
"libretro",
|
|
"standalone",
|
|
"standalone + libretro",
|
|
"alias",
|
|
"launcher",
|
|
"game",
|
|
"utility",
|
|
"test"
|
|
]
|
|
},
|
|
"core_classification": {
|
|
"description": "Descriptive only, no effect on tooling.",
|
|
"type": "string",
|
|
"enum": [
|
|
"pure_libretro",
|
|
"official_port",
|
|
"community_fork",
|
|
"frozen_snapshot",
|
|
"enhanced_fork",
|
|
"game_engine",
|
|
"embedded_hle",
|
|
"launcher",
|
|
"alias",
|
|
"other"
|
|
]
|
|
},
|
|
"built_by": {
|
|
"description": "The platforms that compile this libretro build themselves (Recalbox's mame0278). It is reached by a platform naming it in its cores list, never by all_libretro: the libretro buildbot does not publish it.",
|
|
"type": "array",
|
|
"items": {
|
|
"type": "string",
|
|
"minLength": 1
|
|
},
|
|
"minItems": 1,
|
|
"uniqueItems": true
|
|
},
|
|
"source": {
|
|
"type": [
|
|
"string",
|
|
"object"
|
|
]
|
|
},
|
|
"upstream": {
|
|
"type": [
|
|
"string",
|
|
"object",
|
|
"null"
|
|
]
|
|
},
|
|
"source_commit": {
|
|
"oneOf": [
|
|
{
|
|
"type": "string"
|
|
},
|
|
{
|
|
"type": "object"
|
|
}
|
|
],
|
|
"description": "Revision the profile was read at; an object keys it by build mode when the builds live in different repositories."
|
|
},
|
|
"upstream_commit": {
|
|
"oneOf": [
|
|
{
|
|
"type": "string"
|
|
},
|
|
{
|
|
"type": "object"
|
|
}
|
|
],
|
|
"description": "Revision the profile was read at; an object keys it by build mode when the builds live in different repositories."
|
|
},
|
|
"profiled_date": {
|
|
"description": "Quote it: an unquoted YAML date parses to a date object.",
|
|
"type": [
|
|
"string",
|
|
"object"
|
|
]
|
|
},
|
|
"core_version": {
|
|
"type": [
|
|
"string",
|
|
"number",
|
|
"object",
|
|
"null"
|
|
]
|
|
},
|
|
"alias_of": {
|
|
"type": "string"
|
|
},
|
|
"cores": {
|
|
"description": "Upstream names the core is known by. A dict maps each name to per-variant metadata. Names are strings: an unquoted 81 or 2048 parses as a number and stops matching the buildbot name.",
|
|
"oneOf": [
|
|
{
|
|
"type": "array",
|
|
"items": {
|
|
"type": "string",
|
|
"minLength": 1
|
|
},
|
|
"uniqueItems": true
|
|
},
|
|
{
|
|
"type": "object",
|
|
"propertyNames": {
|
|
"minLength": 1
|
|
}
|
|
}
|
|
]
|
|
},
|
|
"systems": {
|
|
"type": "array",
|
|
"items": {
|
|
"type": "string"
|
|
}
|
|
},
|
|
"mode": {
|
|
"type": "string",
|
|
"enum": [
|
|
"standalone",
|
|
"libretro",
|
|
"both"
|
|
]
|
|
},
|
|
"verification": {
|
|
"type": "string",
|
|
"enum": [
|
|
"existence",
|
|
"md5",
|
|
"sha1",
|
|
"crc32"
|
|
]
|
|
},
|
|
"exclusion_note": {
|
|
"type": "string"
|
|
},
|
|
"analysis": {
|
|
"type": "object"
|
|
},
|
|
"analysis_commit": {
|
|
"type": "string"
|
|
},
|
|
"analysis_date": {
|
|
"type": "string"
|
|
},
|
|
"archive_prefix": {
|
|
"type": "string"
|
|
},
|
|
"author": {
|
|
"type": "string"
|
|
},
|
|
"based_on": {
|
|
"type": "string"
|
|
},
|
|
"bios_directory": {
|
|
"type": "string"
|
|
},
|
|
"bios_identical_to": {
|
|
"type": "string"
|
|
},
|
|
"bios_mode": {
|
|
"type": "string"
|
|
},
|
|
"bios_size": {
|
|
"type": "integer",
|
|
"minimum": 0
|
|
},
|
|
"builtin_boot_roms": {
|
|
"type": "object"
|
|
},
|
|
"core": {
|
|
"type": "string"
|
|
},
|
|
"core_name": {
|
|
"type": "string"
|
|
},
|
|
"data_directories": {
|
|
"type": "array",
|
|
"items": {
|
|
"type": "object",
|
|
"additionalProperties": false,
|
|
"required": [
|
|
"ref"
|
|
],
|
|
"properties": {
|
|
"ref": {
|
|
"type": "string"
|
|
},
|
|
"destination": {
|
|
"type": "string"
|
|
},
|
|
"mode": {
|
|
"type": "string",
|
|
"enum": [
|
|
"standalone",
|
|
"libretro",
|
|
"both"
|
|
]
|
|
},
|
|
"source_ref": {
|
|
"type": "string"
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"dev_flash": {
|
|
"type": "object"
|
|
},
|
|
"dev_flash2": {
|
|
"type": "object"
|
|
},
|
|
"dev_flash3": {
|
|
"type": "object"
|
|
},
|
|
"firmware_titles": {
|
|
"type": "array",
|
|
"items": {
|
|
"type": "object"
|
|
}
|
|
},
|
|
"game_count": {
|
|
"type": "integer",
|
|
"minimum": 0
|
|
},
|
|
"logo": {
|
|
"type": "string"
|
|
},
|
|
"machine_directories": {
|
|
"type": "object"
|
|
},
|
|
"machine_properties": {
|
|
"type": "object"
|
|
},
|
|
"mame_version": {
|
|
"type": "string"
|
|
},
|
|
"memory_layout": {
|
|
"type": "object"
|
|
},
|
|
"mlc_structure": {
|
|
"type": "array",
|
|
"items": {
|
|
"type": "string"
|
|
}
|
|
},
|
|
"model_kickstart_map": {
|
|
"type": "object"
|
|
},
|
|
"note": {
|
|
"type": "string"
|
|
},
|
|
"notes": {
|
|
"type": [
|
|
"string",
|
|
"array",
|
|
"object"
|
|
]
|
|
},
|
|
"pack_structure": {
|
|
"type": "object"
|
|
},
|
|
"platform_details": {
|
|
"type": "object"
|
|
},
|
|
"resources_directory": {
|
|
"type": "string"
|
|
},
|
|
"rom_path": {
|
|
"type": "string"
|
|
},
|
|
"source_ref": {
|
|
"type": "string"
|
|
},
|
|
"valid_bios_crc32": {
|
|
"type": "object"
|
|
},
|
|
"whdload_kickstarts": {
|
|
"type": "array",
|
|
"items": {
|
|
"type": "string"
|
|
}
|
|
},
|
|
"files": {
|
|
"type": "array",
|
|
"items": {
|
|
"type": "object",
|
|
"additionalProperties": false,
|
|
"required": [
|
|
"name"
|
|
],
|
|
"properties": {
|
|
"name": {
|
|
"type": "string"
|
|
},
|
|
"required": {
|
|
"type": "boolean"
|
|
},
|
|
"system": {
|
|
"type": "string"
|
|
},
|
|
"path": {
|
|
"type": [
|
|
"string",
|
|
"null"
|
|
]
|
|
},
|
|
"destination": {
|
|
"type": "string"
|
|
},
|
|
"aliases": {
|
|
"type": "array",
|
|
"items": {
|
|
"type": "string"
|
|
}
|
|
},
|
|
"archive": {
|
|
"description": "ROM set the file lives in, for arcade entries.",
|
|
"type": "string"
|
|
},
|
|
"category": {
|
|
"type": "string",
|
|
"enum": [
|
|
"bios",
|
|
"game_data",
|
|
"bios_zip"
|
|
]
|
|
},
|
|
"mode": {
|
|
"type": "string",
|
|
"enum": [
|
|
"standalone",
|
|
"libretro",
|
|
"both"
|
|
]
|
|
},
|
|
"storage": {
|
|
"type": "string",
|
|
"enum": [
|
|
"embedded",
|
|
"external",
|
|
"user_provided",
|
|
"large_file",
|
|
"release"
|
|
]
|
|
},
|
|
"hle_fallback": {
|
|
"type": "boolean"
|
|
},
|
|
"adler32_byteswap": {
|
|
"type": "boolean"
|
|
},
|
|
"adler32_pairs_with": {
|
|
"description": "The file hashed together with this one; adler32_pairs lists the combinations the code accepts.",
|
|
"type": "string"
|
|
},
|
|
"adler32_pairs": {
|
|
"description": "Accepted Adler-32 combinations, this file's value first, in the code's table order.",
|
|
"type": "array",
|
|
"items": {
|
|
"type": "array",
|
|
"items": {"type": "string"},
|
|
"minItems": 2,
|
|
"maxItems": 2
|
|
},
|
|
"minItems": 1
|
|
},
|
|
"agnostic": {
|
|
"type": "boolean"
|
|
},
|
|
"bundled": {
|
|
"type": "boolean"
|
|
},
|
|
"config_key": {
|
|
"type": "string"
|
|
},
|
|
"embedded": {
|
|
"type": "boolean"
|
|
},
|
|
"fast_boot": {
|
|
"type": "string"
|
|
},
|
|
"has_builtin": {
|
|
"type": "boolean"
|
|
},
|
|
"load_from": {
|
|
"description": "Where the emulator reads the file when not from the system directory; keyed by build when the libretro and standalone builds read it from different places.",
|
|
"oneOf": [
|
|
{
|
|
"type": "string"
|
|
},
|
|
{
|
|
"type": "object",
|
|
"additionalProperties": false,
|
|
"minProperties": 1,
|
|
"properties": {
|
|
"libretro": {
|
|
"type": "string"
|
|
},
|
|
"standalone": {
|
|
"type": "string"
|
|
}
|
|
}
|
|
}
|
|
]
|
|
},
|
|
"priority": {
|
|
"description": "Preference order among the BIOS a system accepts, lowest first. DuckStation's FindBIOSImageInDirectory keeps the image whose priority is lower; a search list the code walks in order maps onto it as 1, 2, 3.",
|
|
"type": "integer",
|
|
"minimum": 0
|
|
},
|
|
"region_check": {
|
|
"type": "boolean"
|
|
},
|
|
"size_note": {
|
|
"type": "string"
|
|
},
|
|
"standalone_path": {
|
|
"type": "string"
|
|
},
|
|
"type": {
|
|
"description": "Set on an entry that names a directory the code reads whole. The entry then stands for every file under path.",
|
|
"type": "string",
|
|
"enum": [
|
|
"directory"
|
|
]
|
|
},
|
|
"variant_group": {
|
|
"type": "string",
|
|
"minLength": 1
|
|
},
|
|
"size": {
|
|
"type": [
|
|
"integer",
|
|
"array",
|
|
"null"
|
|
],
|
|
"minimum": 0,
|
|
"items": {
|
|
"type": "integer",
|
|
"minimum": 0
|
|
},
|
|
"minItems": 1
|
|
},
|
|
"min_size": {
|
|
"type": "integer"
|
|
},
|
|
"max_size": {
|
|
"type": "integer"
|
|
},
|
|
"md5": {
|
|
"oneOf": [
|
|
{
|
|
"type": "null"
|
|
},
|
|
{
|
|
"type": "string",
|
|
"pattern": "^[a-fA-F0-9]{32}$"
|
|
},
|
|
{
|
|
"type": "array",
|
|
"items": {
|
|
"type": "string",
|
|
"pattern": "^[a-fA-F0-9]{32}$"
|
|
}
|
|
}
|
|
]
|
|
},
|
|
"sha1": {
|
|
"oneOf": [
|
|
{
|
|
"type": "string",
|
|
"pattern": "^[a-fA-F0-9]{40}$"
|
|
},
|
|
{
|
|
"type": "array",
|
|
"items": {
|
|
"type": "string",
|
|
"pattern": "^[a-fA-F0-9]{40}$"
|
|
}
|
|
}
|
|
]
|
|
},
|
|
"sha256": {
|
|
"type": "string",
|
|
"pattern": "^[a-fA-F0-9]{64}(,[a-fA-F0-9]{64})*$"
|
|
},
|
|
"crc32": {
|
|
"description": "CRC32 the code accepts; a list when several dumps pass.",
|
|
"oneOf": [
|
|
{
|
|
"type": "string",
|
|
"pattern": "^[a-fA-F0-9]{8}$"
|
|
},
|
|
{
|
|
"type": "array",
|
|
"items": {
|
|
"type": "string",
|
|
"pattern": "^[a-fA-F0-9]{8}$"
|
|
},
|
|
"minItems": 1
|
|
}
|
|
]
|
|
},
|
|
"known_hash_adler32": {
|
|
"description": "Adler-32 values the code accepts; a list when several revisions pass.",
|
|
"oneOf": [
|
|
{
|
|
"type": [
|
|
"string",
|
|
"integer"
|
|
]
|
|
},
|
|
{
|
|
"type": "array",
|
|
"items": {
|
|
"type": [
|
|
"string",
|
|
"integer"
|
|
]
|
|
},
|
|
"minItems": 1
|
|
}
|
|
]
|
|
},
|
|
"validation": {
|
|
"description": "Checks the code performs. A dict splits core from upstream when they diverge.",
|
|
"oneOf": [
|
|
{
|
|
"type": "array",
|
|
"items": {
|
|
"type": "string"
|
|
}
|
|
},
|
|
{
|
|
"type": "object"
|
|
}
|
|
]
|
|
},
|
|
"region": {
|
|
"description": "Region the emulator code selects this file for, never the region of the dump.",
|
|
"type": "array",
|
|
"items": {
|
|
"enum": [
|
|
"world",
|
|
"north-america",
|
|
"canada",
|
|
"latin-america",
|
|
"brazil",
|
|
"mexico",
|
|
"argentina",
|
|
"europe",
|
|
"uk",
|
|
"france",
|
|
"germany",
|
|
"italy",
|
|
"spain",
|
|
"netherlands",
|
|
"portugal",
|
|
"greece",
|
|
"poland",
|
|
"russia",
|
|
"sweden",
|
|
"norway",
|
|
"denmark",
|
|
"finland",
|
|
"asia",
|
|
"japan",
|
|
"south-korea",
|
|
"china",
|
|
"taiwan",
|
|
"hong-kong",
|
|
"singapore",
|
|
"india",
|
|
"asia-ntsc",
|
|
"asia-pal",
|
|
"oceania",
|
|
"australia",
|
|
"new-zealand"
|
|
]
|
|
}
|
|
},
|
|
"contents": {
|
|
"type": "array",
|
|
"items": {
|
|
"type": "object",
|
|
"additionalProperties": false,
|
|
"required": [
|
|
"name"
|
|
],
|
|
"properties": {
|
|
"name": {
|
|
"type": "string",
|
|
"minLength": 1
|
|
},
|
|
"size": {
|
|
"type": "integer",
|
|
"minimum": 0
|
|
},
|
|
"sha1": {
|
|
"type": "string",
|
|
"pattern": "^[a-fA-F0-9]{40}$"
|
|
},
|
|
"crc32": {
|
|
"type": "string",
|
|
"pattern": "^[a-fA-F0-9]{8}$"
|
|
},
|
|
"description": {
|
|
"type": "string"
|
|
},
|
|
"bad_dump": {
|
|
"type": "boolean"
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"source_ref": {
|
|
"description": "A dict splits core from upstream when the two diverge.",
|
|
"type": [
|
|
"string",
|
|
"array",
|
|
"object"
|
|
]
|
|
},
|
|
"description": {
|
|
"type": "string"
|
|
},
|
|
"note": {
|
|
"type": "string"
|
|
},
|
|
"unsourceable": {
|
|
"type": "string"
|
|
},
|
|
"on_mismatch": {
|
|
"description": "What the code does when a declared check fails: reject the file (default) or warn and run with it, for every check or check by check.",
|
|
"oneOf": [
|
|
{
|
|
"enum": [
|
|
"reject",
|
|
"warn"
|
|
]
|
|
},
|
|
{
|
|
"type": "object",
|
|
"minProperties": 1,
|
|
"additionalProperties": false,
|
|
"patternProperties": {
|
|
"^(size|crc32|md5|sha1|sha256|adler32|signature|crypto)$": {
|
|
"enum": [
|
|
"reject",
|
|
"warn"
|
|
]
|
|
}
|
|
}
|
|
}
|
|
]
|
|
}
|
|
},
|
|
"allOf": [
|
|
{
|
|
"if": {
|
|
"properties": {
|
|
"name": {
|
|
"pattern": "/$"
|
|
}
|
|
}
|
|
},
|
|
"then": {
|
|
"required": [
|
|
"type"
|
|
]
|
|
}
|
|
},
|
|
{
|
|
"if": {
|
|
"anyOf": [
|
|
{
|
|
"required": [
|
|
"path"
|
|
],
|
|
"properties": {
|
|
"path": {
|
|
"type": "string",
|
|
"pattern": "/$"
|
|
}
|
|
}
|
|
},
|
|
{
|
|
"required": [
|
|
"standalone_path"
|
|
],
|
|
"properties": {
|
|
"standalone_path": {
|
|
"type": "string",
|
|
"pattern": "/$"
|
|
}
|
|
}
|
|
}
|
|
]
|
|
},
|
|
"then": {
|
|
"required": [
|
|
"type"
|
|
]
|
|
}
|
|
},
|
|
{
|
|
"if": {
|
|
"required": [
|
|
"type"
|
|
]
|
|
},
|
|
"then": {
|
|
"properties": {
|
|
"path": {
|
|
"type": "string",
|
|
"pattern": "/$"
|
|
}
|
|
}
|
|
}
|
|
}
|
|
]
|
|
}
|
|
},
|
|
"source_branch": {
|
|
"type": "string",
|
|
"description": "Branch the port was read from, when it is not the default one."
|
|
},
|
|
"prose_written_at": {
|
|
"type": "string",
|
|
"pattern": "^[0-9a-f]{40}$",
|
|
"description": "The pin a reader confirmed every prose citation against. When the profile's history shows several pins under one text, profile_sync takes this one as the revision the text describes; it never overrides a single candidate."
|
|
},
|
|
"pin_frozen": {
|
|
"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."
|
|
},
|
|
"upstream_gone": {
|
|
"type": "string",
|
|
"description": "Why the declared upstream can no longer be reached, when that is settled rather than transient. Records the death instead of leaving the profile failing every pass; profile_sync reports the contradiction if the forge answers again."
|
|
},
|
|
"source_mirror": {
|
|
"type": "string",
|
|
"description": "Repository carrying the same tree, consulted after source and upstream. The only thing that keeps a profile checkable once its own forge is withdrawn or its host stops resolving."
|
|
}
|
|
}
|
|
}
|