From c7be31699fddb44125bf4d87c0e9ee5567ac4819 Mon Sep 17 00:00:00 2001 From: Abdessamad Derraz <3028866+Abdess@users.noreply.github.com> Date: Thu, 22 Oct 2026 04:04:40 +0200 Subject: [PATCH] docs: document the minui family platforms --- wiki/adding-a-platform.md | 30 ++++++++++++++++++++++++++++-- wiki/faq.md | 2 +- wiki/getting-started.md | 30 +++++++++++++++++++++++++++++- wiki/installer.md | 11 ++++++++++- wiki/testing-guide.md | 2 +- wiki/tools.md | 2 ++ wiki/troubleshooting.md | 3 +++ wiki/verification-modes.md | 11 +++++++++-- 8 files changed, 83 insertions(+), 8 deletions(-) diff --git a/wiki/adding-a-platform.md b/wiki/adding-a-platform.md index ee7ed3c8..95b8842e 100644 --- a/wiki/adding-a-platform.md +++ b/wiki/adding-a-platform.md @@ -151,7 +151,8 @@ platforms: source_url: https://... # upstream data URL source_format: json # json, xml, clrmamepro_dat, python_dict, # bash_script+csv, csharp_firmware_database, - # github_component_manifests, mister_downloader_db + # github_component_manifests, mister_downloader_db, + # pak_launch_scripts hash_type: md5 # primary hash in the upstream data cores: # which emulator profiles apply - core_a @@ -194,6 +195,17 @@ profile's layout. and `hatari`): both layouts are packed. A profile without a standalone build keeps its libretro layout whatever the platform calls it. +A platform that hands each libretro core a system directory of its own declares +them in `core_system_dirs`, keyed by the directory relative to the pack root, +each with the `cores` started with it and the `source_ref` of the launcher that +names them. MinUI, NextUI and MyMinUI give every launch tag `Bios//` +(`system_directory_ref` cites the minarch statement). A core's files are then +placed below each directory listed for it, an archive's core subfolder +(`archive_prefix`) moves with it, and a core listed nowhere gets no file: the +platform hands it no folder. `platform_layouts` builds one view per directory, +so the builder, the manifest, verify and slots read the same placement, and the +resolver still looks the collection up by the core's own path. + ### Optional fields ```yaml @@ -205,6 +217,8 @@ its libretro layout whatever the platform calls it. zip_digest: composite # the frontend hashes a .zip by its members only firmware_folder_flat: true # the frontend lists each system folder without # descending into it + native_list: none # the platform's code names no BIOS file, so no + # exporter hands one back source_wiki: https://... # human-readable upstream reference target_scraper: myplatform_targets # hardware target scraper name, null if static target_source: https://... # target data source URL @@ -220,6 +234,18 @@ its libretro layout whatever the platform calls it. parse_key: bios_directory ``` +A frontend whose BIOS live on its SD card is installed from the computer the +card is mounted on. Its rule is `os: any`, `method: card_marker`, with `file` +(a path below the card root) and `first_line_prefix`: `install.py` reads that +file under `--dest` and names the platform when its first line starts with the +prefix. MinUI, NextUI and MyMinUI write their release name to +`.system/version.txt`. + +`native_list: none` marks a platform whose own code publishes no BIOS list +(the MinUI family hands each core a folder and names no file in it). The test +that every registered platform has an exporter exempts it, and a second test +holds that its platform YAML declares no file. + `zip_digest: composite` is set where the frontend's own check takes `Zip::Md5Composite` for every `.zip` and never the container's MD5 (Recalbox, `Bios.cpp:64-68`). Each `.zip` entry is then checked against its composite alone, @@ -410,7 +436,7 @@ to use: | Mode | Behavior | Example platforms | |------|----------|-------------------| -| `existence` | File must exist, no hash check | RetroArch, Lakka, RetroPie | +| `existence` | File must exist, no hash check | RetroArch, Lakka, RetroPie, MinUI, NextUI, MyMinUI | | `md5` | MD5 must match the declared hash | Batocera, Recalbox, RetroBat, EmuDeck, RetroDECK, RomM, ROCKNIX, MiSTer FPGA | | `sha1` | SHA1 must match | BizHawk | diff --git a/wiki/faq.md b/wiki/faq.md index eba96b3d..b68d6833 100644 --- a/wiki/faq.md +++ b/wiki/faq.md @@ -220,7 +220,7 @@ that the file exists. `untested` means the file exists on disk but its hash does not match the expected value. This happens on MD5 and SHA1 platforms (Batocera, Recalbox, BizHawk, ROCKNIX, MiSTer FPGA, and the rest) when the file is present but contains different data than what the platform declares. -On existence-mode platforms (RetroArch, Lakka, RetroPie), files are never `untested` because the platform only checks presence, not content. Those files show as `ok` if present, whatever they contain. +On existence-mode platforms (RetroArch, Lakka, RetroPie, MinUI, NextUI, MyMinUI), files are never `untested` because the platform only checks presence, not content. Those files show as `ok` if present, whatever they contain. Running `verify.py --emulator --verbose` shows the emulator-level ground truth, which can confirm whether the file's hash matches what the source code expects. The platform report applies the same check on its own: `verify.py --platform retroarch` prints a `DISCREPANCY` line for every file the platform accepts and a profiled emulator rejects. diff --git a/wiki/getting-started.md b/wiki/getting-started.md index cb2ee08a..cbe79081 100644 --- a/wiki/getting-started.md +++ b/wiki/getting-started.md @@ -209,6 +209,33 @@ Files go under the per-core subdirectory the MiSTer BIOS database declares lists with a download URL are in scope: the rest ship with the MiSTer distribution and install themselves. +### MinUI, NextUI and MyMinUI + +``` +/Bios// +``` + +These frontends give each core a folder of its own, named after the tag in +parentheses of the Roms folder the game sits in: a game in +`Roms/Sony PlayStation (PS)/` runs with `Bios/PS/` as its system directory, one +in `Roms/Game Boy (GB)/` with `Bios/GB/` (MinUI +`workspace/all/minarch/minarch.c:2943`, NextUI +`workspace/all/minarch/ma_core.c:76`, MyMinUI +`workspace/all/minarch/minarch.c:3532`). The pack holds the `Bios/` folder: +extract it at the root of the card. A core started from two tags (Gambatte for +GB and GBC) gets its files in both folders. + +The installer runs on the computer the card is mounted on, with the card's root +as `--dest`: + +```bash +curl -fsSL https://raw.githubusercontent.com/Abdess/retrobios/main/install.sh | sh -s -- --platform minui --dest /media/$USER/CARD +``` + +Without `--platform`, it reads the release name the frontend writes in +`.system/version.txt` on the card. A pak that starts a standalone program +instead of a libretro core (DraStic for NDS, native PICO-8) is not covered. + ### BizHawk ``` @@ -246,7 +273,8 @@ dump shows up. The installer's `--check` hashes every file against the list on every platform, so it catches a wrong revision even where the frontend would not: -RetroArch, Lakka and RetroPie only check that a file exists, while Batocera, +RetroArch, Lakka, RetroPie, MinUI, NextUI and MyMinUI only check that a file +exists, while Batocera, RetroBat, Recalbox, EmuDeck, RetroDECK, RomM, ROCKNIX and MiSTer FPGA compare MD5 and BizHawk compares SHA1. diff --git a/wiki/installer.md b/wiki/installer.md index 57dae073..9ccb91de 100644 --- a/wiki/installer.md +++ b/wiki/installer.md @@ -322,6 +322,11 @@ not already found that way. | `%USERPROFILE%\BizHawk\Firmware` | BizHawk | the same | | `EmuHawk.exe` or `EmuHawkMono.sh` in a `BizHawk*` folder of the home folder or one level down (`~/Games/BizHawk-2.11.1`), the newest | BizHawk | `Firmware` beside it | +A `--dest` given without `--platform` is first read as an SD card: the MinUI +family writes the release name as the first line of `.system/version.txt` at +the card root (`MinUI-`, `NextUI-`, `MyMinUI-`), and that line names the file +list. + Desktop installs are read from their own configuration, and several can be found on one machine. @@ -393,7 +398,11 @@ for EmuDeck (`C:\Emulation\bios` on Windows), `/storage/roms/bios` for ROCKNIX, `C:\RetroBat\bios` for RetroBat, and RetroArch's own default system directory for RetroArch. BizHawk has no such folder: it reads `Firmware` beside its executable wherever the archive was extracted, so a forced -`--platform bizhawk` that finds no install stops and asks for `--dest`. On Android a forced `--platform retroarch` falls back to +`--platform bizhawk` that finds no install stops and asks for `--dest`. MinUI, +NextUI and MyMinUI keep their files on the SD card, which the installer reads +from a computer it is mounted on: a forced `--platform minui` stops and asks +for the card's root as `--dest`, and a `--dest` that is a folder inside such a +card (its `Bios/`) is refused with the root to name instead. On Android a forced `--platform retroarch` falls back to `/RetroArch/system` instead, a home directory there belonging to Termux rather than to the frontend. Pass `--dest` to say where instead of relying on that. diff --git a/wiki/testing-guide.md b/wiki/testing-guide.md index b3a50f9c..fc3b9160 100644 --- a/wiki/testing-guide.md +++ b/wiki/testing-guide.md @@ -40,7 +40,7 @@ Every module in `tests/`, by the area it guards. | Core regression suites | synthetic | `test_e2e`, `test_audit_regressions`, `test_tool_messages` | | File resolution and identity | synthetic + collection | `test_adler32_resolution`, `test_agnostic_scan`, `test_agnostic_scan_mode`, `test_agnostic_scope`, `test_agnostic_substitute`, `test_archive_choice`, `test_bios_companions`, `test_bundled_identity`, `test_casefold_cache`, `test_db_aliases`, `test_declared_names`, `test_derivations`, `test_directory_entries`, `test_extra_identity`, `test_foreign_tree`, `test_foreign_tree_names`, `test_frontend_digest`, `test_game_data_homonyms`, `test_hashing`, `test_identity`, `test_md5_pack_context`, `test_name_tiebreak`, `test_nec_filing`, `test_owner_resolution`, `test_path_suffix`, `test_resolution_evidence`, `test_sega_filing`, `test_shipped_content`, `test_twin_declarations`, `test_validated_choice`, `test_variant_choice`, `test_variant_identity`, `test_zipped_member` | | Verification, cross-reference and profile checks | synthetic + profiles | `test_case_insensitive_platforms`, `test_checks_have_values`, `test_core_file_fills_declaration`, `test_core_size_refusal`, `test_cross_reference_sources`, `test_crypto_aes`, `test_crypto_unique_data`, `test_crypto_verify`, `test_file_consumers`, `test_fileless_audit`, `test_flycast_layout`, `test_gap_settlement`, `test_hidden_extras`, `test_launcher_aliases`, `test_launcher_layer`, `test_native_mode`, `test_no_case_collisions`, `test_path_conflict_status`, `test_path_null_copies`, `test_profile_checks`, `test_profile_repositories`, `test_romm_hash_rule`, `test_shared_groups`, `test_standalone_links`, `test_standalone_mode`, `test_undeclared_dedup`, `test_unplaced_extras`, `test_validation_scope`, `test_verify_all_dir`, `test_verify_emulator_evidence`, `test_verify_listing`, `test_verify_pack_choice`, `test_verify_release_asset` | -| Packs and manifests | synthetic + real packs | `test_artifact_lock`, `test_atomic_artifacts`, `test_batocera_cores`, `test_deterministic_zip`, `test_emulator_pack_counts`, `test_finalize_pack_names`, `test_large_file_cache`, `test_libretro_layout`, `test_manifest_entry`, `test_pack_conformance_dirs`, `test_pack_core_extras`, `test_pack_counts`, `test_pack_destinations`, `test_pack_failures`, `test_pack_file_names`, `test_pack_grouping`, `test_pack_integrity`, `test_pack_member_identity`, `test_pack_readme`, `test_platform_inheritance`, `test_platform_keys`, `test_required_only_archives`, `test_required_only_twins`, `test_split_extras`, `test_split_names`, `test_split_pack`, `test_system_pack_extras`, `test_system_pack_parity`, `test_torrentzip`, `test_which_pack` | +| Packs and manifests | synthetic + real packs | `test_artifact_lock`, `test_atomic_artifacts`, `test_batocera_cores`, `test_deterministic_zip`, `test_emulator_pack_counts`, `test_finalize_pack_names`, `test_large_file_cache`, `test_libretro_layout`, `test_manifest_entry`, `test_minui_platform`, `test_pack_conformance_dirs`, `test_pack_core_extras`, `test_pack_counts`, `test_pack_destinations`, `test_pack_failures`, `test_pack_file_names`, `test_pack_grouping`, `test_pack_integrity`, `test_pack_member_identity`, `test_pack_readme`, `test_platform_inheritance`, `test_platform_keys`, `test_required_only_archives`, `test_required_only_twins`, `test_split_extras`, `test_split_names`, `test_split_pack`, `test_system_pack_extras`, `test_system_pack_parity`, `test_torrentzip`, `test_which_pack` | | Slots and regions | synthetic + profiles | `test_region`, `test_region_agnostic_scan`, `test_region_groups`, `test_region_held`, `test_region_platform_index`, `test_region_required_only`, `test_slot`, `test_slots`, `test_slots_shipped_file` | | Hardware targets and systems | synthetic + target files | `test_extract_targets`, `test_lakka_targets`, `test_libretro_slugs`, `test_system_ids`, `test_system_selection`, `test_target_names`, `test_target_scrapers`, `test_target_systems`, `test_target_verify` | | Installer and downloads | loopback server | `test_check_release`, `test_download`, `test_install`, `test_install_cores`, `test_install_experience`, `test_install_selection` | diff --git a/wiki/tools.md b/wiki/tools.md index 00bfe665..bf00832d 100644 --- a/wiki/tools.md +++ b/wiki/tools.md @@ -145,6 +145,7 @@ Verification modes per platform: | ROCKNIX | md5 | MD5 hash match, same shape as Batocera | | MiSTer FPGA | md5 | MD5 of the file at its destination, no ZIP inspection | | BizHawk | sha1 | SHA1 per firmware from `FirmwareDatabase.cs` | +| MinUI, NextUI, MyMinUI | existence | none: minarch hands each core `Bios//` and opens no file | Full details and severity mapping: [verification modes](verification-modes.md). `--region` narrows the report to the file set a regional pack would carry, and a @@ -848,6 +849,7 @@ stand alone. | `rocknix_scraper` | rocknix-systems script | Python dict | | `retropie_scraper` | RetroPie-Setup scriptmodules (`rp_module_id`, `rp_module_help`) and `retropie_packages.sh` (version) | Bash | | `misterfpga_scraper` | BiosDB_MiSTer bios_db.json.zip | JSON in ZIP | +| `minui_scraper`, `nextui_scraper`, `myminui_scraper` | each pak's `launch.sh` (`EMU_EXE`, the tag from the pak folder), each device's `cores/makefile` (the repository a library is built from) and the minarch statement that sets `core.bios_dir` | Shell, Make, C | | `coreinfo_scraper` | .info files from libretro-core-info | INI-like | | `bizhawk_scraper` | FirmwareDatabase.cs | C# source | | `mame_hash_scraper` | mamedev/mame source tree. `--release mameNNNN` writes the profile of one release a platform builds. `--devices --listxml FILE` adds the device ROM sets of the release's `-listxml` | C source (sparse clone), listxml | diff --git a/wiki/troubleshooting.md b/wiki/troubleshooting.md index ce099d3b..40226bc9 100644 --- a/wiki/troubleshooting.md +++ b/wiki/troubleshooting.md @@ -67,6 +67,9 @@ Each platform expects BIOS files in a specific base directory: - EmuDeck: `~/Emulation/bios/` - RetroDECK: `~/retrodeck/bios/` - RetroBat: `bios/` inside the RetroBat directory +- MinUI, NextUI, MyMinUI: `Bios//` at the root of the SD card, one folder + per tag in parentheses of the Roms folders (`Bios/PS/` for + `Roms/Sony PlayStation (PS)/`) Some cores expect files in subdirectories (e.g. `dc/` for Dreamcast, `pcsx2/bios/` for PlayStation 2). Check the `path:` field in the emulator profile for the exact diff --git a/wiki/verification-modes.md b/wiki/verification-modes.md index efaee1fe..33afd0e2 100644 --- a/wiki/verification-modes.md +++ b/wiki/verification-modes.md @@ -6,9 +6,9 @@ of each platform so that verification results match what the platform itself wou ## Existence mode -**Platforms**: RetroArch, Lakka, RetroPie +**Platforms**: RetroArch, Lakka, RetroPie, MinUI, NextUI, MyMinUI -**Source**: RetroArch `core_info.c`, function `path_is_valid()` +**Source**: RetroArch `core_info.c`, function `path_is_valid()`; minarch for the MinUI family The most straightforward mode. A file is OK if it exists at the expected path. No hash is checked. Any file with the correct name passes, regardless of content. @@ -25,6 +25,13 @@ upstream code: `core_info.c` only calls `path_is_valid()` and does not open or h Lakka and RetroPie inherit this behavior through platform config inheritance (`inherits: retroarch` in the platform YAML). +MinUI, NextUI and MyMinUI check nothing at all: minarch returns the folder +`Bios//` for `RETRO_ENVIRONMENT_GET_SYSTEM_DIRECTORY` and never opens a +file in it (MinUI `workspace/all/minarch/minarch.c:1889-1893` and `:2943`). The +core decides what it loads, so the files are the ones its profile documents, +placed below each folder a pak hands it (`core_system_dirs` in the platform +YAML). + ## MD5 mode