chore: merge accepted cores and one tick list

This commit is contained in:
Abdessamad Derraz committed 2026-11-03 15:07:55 +01:00
commit 081a1c24e5
48 files changed
+2266 -1099

No files matched your search

+1 -1
View File
@@ -16,7 +16,7 @@
# and Invoke-WebRequest throws on a cut transfer before the hash is read:
# the site's build rewrites this line there (scripts/sitebootstrap.py).
$mismatchAdvice = "The download was most likely cut short: try again. Within minutes of an update of this project the two files can come from caches of different ages. Waiting five minutes settles that."
$defaultInstallSha256 = "403b6e8a7efcd24858b0f46ffa19c2b9012cdeef149768729d8e48d0b68a296a"
$defaultInstallSha256 = "5b8bd7b486d236ee1d00439b2bdd4f6fefcf20112abe3b0f1037e38426d80c15"
$maximumInstallerBytes = 2MB
$installerExit = 0
$installer = if ($PSScriptRoot) { Join-Path $PSScriptRoot "install.py" } else { $null }
+580 -336
View File
File diff suppressed because it is too large. Load diff
+1 -1
View File
@@ -23,7 +23,7 @@ DEFAULT_INSTALL_URL="https://raw.githubusercontent.com/Abdess/retrobios/main/ins
# curl or wget stop on a cut transfer before the hash is read: the site's
# build rewrites this line there (scripts/sitebootstrap.py).
MISMATCH_ADVICE="The download was most likely cut short: try again. Within minutes of an update of this project the two files can come from caches of different ages. Waiting five minutes settles that."
DEFAULT_INSTALL_SHA256="403b6e8a7efcd24858b0f46ffa19c2b9012cdeef149768729d8e48d0b68a296a"
DEFAULT_INSTALL_SHA256="5b8bd7b486d236ee1d00439b2bdd4f6fefcf20112abe3b0f1037e38426d80c15"
MAX_INSTALLER_BYTES=2097152
cleanup() {
+8 -8
View File
@@ -27,8 +27,8 @@
{
"dest": "roms/ports/retrobios/install.py",
"repo_path": "install.py",
"size": 984900,
"sha256": "403b6e8a7efcd24858b0f46ffa19c2b9012cdeef149768729d8e48d0b68a296a",
"size": 996397,
"sha256": "5b8bd7b486d236ee1d00439b2bdd4f6fefcf20112abe3b0f1037e38426d80c15",
"executable": false
},
{
@@ -71,8 +71,8 @@
"muos": {
"archive": {
"dest": "ARCHIVE/RetroBIOS.muxapp",
"size": 1038077,
"sha256": "49b9de6afa23afda4f6c786fa0968c36af1bd2ec9b52cb0927df4c527dcc701c"
"size": 1049574,
"sha256": "30bbe8a0f78cc7b6bb37b9290c69e2244e0b9217339d9ea695f45c0d7815a263"
},
"members": [
{
@@ -92,8 +92,8 @@
{
"name": "RetroBIOS/install.py",
"repo_path": "install.py",
"size": 984900,
"sha256": "403b6e8a7efcd24858b0f46ffa19c2b9012cdeef149768729d8e48d0b68a296a",
"size": 996397,
"sha256": "5b8bd7b486d236ee1d00439b2bdd4f6fefcf20112abe3b0f1037e38426d80c15",
"executable": false
},
{
@@ -166,8 +166,8 @@
{
"dest": ".config/modules/retrobios/install.py",
"repo_path": "install.py",
"size": 984900,
"sha256": "403b6e8a7efcd24858b0f46ffa19c2b9012cdeef149768729d8e48d0b68a296a",
"size": 996397,
"sha256": "5b8bd7b486d236ee1d00439b2bdd4f6fefcf20112abe3b0f1037e38426d80c15",
"executable": false
},
{
+27
View File
@@ -17,6 +17,7 @@
"scanned",
"version",
"choices",
"set_aside",
"file",
"system",
"checking",
@@ -58,6 +59,9 @@
{
"$ref": "#/$defs/choices"
},
{
"$ref": "#/$defs/set_aside"
},
{
"$ref": "#/$defs/file"
},
@@ -299,6 +303,29 @@
}
}
},
"set_aside": {
"type": "object",
"additionalProperties": false,
"required": [
"event",
"platform",
"dests"
],
"properties": {
"event": {
"const": "set_aside"
},
"platform": {
"type": "string"
},
"dests": {
"type": "array",
"items": {
"type": "string"
}
}
}
},
"file": {
"type": "object",
"additionalProperties": false,
+112 -13
View File
@@ -14,12 +14,15 @@ install.py gains has no prose yet: the generator names it and writes nothing,
and the row is added by hand inside the markers, its first cell holding the
option, kind, code or value alone.
The run samples (a dry run, a first install, a later check) are printed by
install.py itself, run in its own process against the committed
install/<platform>.json served on the loopback, from a home and a card made
under tmp/ and shown as /home/me and /userdata. Only the transport and the
machine are stood in for, see _child. Each is dated by the `generated` field
of its list, so a rendering is the same from one day to the next.
The run samples (a dry run, a first install, a later check, the reasons a
file is refused, a run copying from an old card) are printed by install.py
itself, run in its own process against the committed install/<platform>.json
served on the loopback, from a home and a card made under tmp/ and shown as
/home/me and /userdata. The reasons and the copy are read from a four-file
list laid out in that home (SMALL_LIST), whose files are written there. Only
the transport and the machine are stood in for, see _child. Each is dated by
the `generated` field of its list, so a rendering is the same from one day
to the next.
"""
from __future__ import annotations
@@ -33,10 +36,12 @@ import json
import os
import re
import shutil
import socketserver
import subprocess
import sys
import tempfile
import threading
import zipfile
from pathlib import Path, PurePosixPath
from typing import Callable
@@ -282,6 +287,44 @@ class _ListHandler(http.server.SimpleHTTPRequestHandler):
return
class _LoopbackServer(http.server.ThreadingHTTPServer):
"""The list server, named by its number: HTTPServer.server_bind looks
127.0.0.1 up with socket.getfqdn, a DNS query wherever /etc/hosts does
not name it (code_audit_24 P3-12)."""
def server_bind(self) -> None:
socketserver.TCPServer.server_bind(self)
host, port = self.server_address[:2]
self.server_name, self.server_port = host, port
# The list the reasons and the copy are shown with: four files, each with
# the contents its name says, read as RetroArch's.
SMALL_LIST = {
"scph5500.bin": (b"J" * 64, ["sony-playstation"], ["japan"], None),
"scph5501.bin": (b"U" * 64, ["sony-playstation"], ["north-america"],
["beetle_psx", "pcsx_rearmed"]),
"gba_bios.bin": (b"G" * 32, ["nintendo-gba"], None, ["mgba"]),
"pcsx/extra.bin": (b"E" * 8, ["sony-playstation"], None, ["pcsx_rearmed"]),
}
def write_small_list(path: Path) -> None:
import hashlib # noqa: PLC0415
files = []
for dest, (data, systems, regions, cores) in SMALL_LIST.items():
files.append({"dest": dest, "size": len(data), "sha1": hashlib.sha1(data).hexdigest(),
"sha256": hashlib.sha256(data).hexdigest(),
"md5": hashlib.md5(data).hexdigest(), "systems": systems,
"cores": cores, "repo_path": f"bios/{dest}",
**({"regions": regions} if regions else {})})
path.write_text(json.dumps({
"manifest_version": 2, "platform": "retroarch", "display_name": "RetroArch",
"base_destination": "system", "files": files, "total_files": len(files),
"total_size": sum(entry["size"] for entry in files)}), encoding="utf-8")
def _child(spec: dict) -> int:
"""install.main() as the sample runs it, in its own process. Only the
transport and the machine are stood in for: no connection leaves the
@@ -300,8 +343,13 @@ def _child(spec: dict) -> int:
raise OSError(f"the sample makes no request to {address[0]}")
return real_connect(address, *args, **kwargs)
def landed(f: dict, _bios: Path, _verbose: bool = False, progress: object = None,
_copy: object = None) -> tuple[str, bool, str]:
real_download = _install._download_one
def landed(f: dict, bios: Path, verbose: bool = False, progress: object = None,
copy: object = None) -> tuple[str, bool, str]:
if copy is not None:
# A copy from this machine is made for real: it is local.
return real_download(f, bios, verbose, progress, copy)
if progress is not None:
progress.add(f["size"])
return f["dest"], True, ""
@@ -353,7 +401,7 @@ class Sandbox:
config = self.home / ".config" / "retroarch" / "retroarch.cfg"
config.parent.mkdir(parents=True)
config.write_text(RETROARCH_CFG, encoding="utf-8")
self.server = http.server.ThreadingHTTPServer(("127.0.0.1", 0), _ListHandler)
self.server = _LoopbackServer(("127.0.0.1", 0), _ListHandler)
threading.Thread(target=self.server.serve_forever, daemon=True).start()
return self
@@ -362,26 +410,55 @@ class Sandbox:
self.server.server_close()
shutil.rmtree(self.root)
def small(self, kind: str) -> str:
"""A run over SMALL_LIST in a home of its own: "refused", a --check
of a folder holding a copy of each kind a check names, or "from", a
run copying from an old card what it holds and downloading the rest."""
home = self.root / kind
system = home / ".config" / "retroarch" / "system"
system.mkdir(parents=True)
(system.parent / "retroarch.cfg").write_text(RETROARCH_CFG, encoding="utf-8")
listed = home / "list.json"
write_small_list(listed)
data = {dest: entry[0] for dest, entry in SMALL_LIST.items()}
if kind == "refused":
(system / "scph5500.bin").write_bytes(data["scph5500.bin"])
(system / "scph5501.bin").write_bytes(data["scph5500.bin"])
(system / "system").mkdir()
(system / "system" / "gba_bios.bin").write_bytes(data["gba_bios.bin"])
with zipfile.ZipFile(system / "PSX BIOS.zip", "w") as archive:
archive.writestr("extra.bin", data["pcsx/extra.bin"])
# A check that flags a file ends on 1, as documented.
return self.run("retroarch", "--check", "--manifest", str(listed), home=home,
codes=(1,))
old = home / "old"
old.mkdir()
for dest in ("scph5500.bin", "scph5501.bin"):
(old / dest).write_bytes(data[dest])
return self.run("retroarch", "--yes", "--manifest", str(listed), "--from", str(old),
home=home, landed=True)
def run(self, platform: str, *argv: str, landed: bool = False,
held: bool = False) -> str:
held: bool = False, home: Path | None = None, codes: tuple = (0,)) -> str:
"""What install.py prints for the run, the sandbox read as a user's
home and card."""
home = home or self.home
card = self.card / "userdata" / "bios" if platform != "retroarch" else None
if card is not None:
card.mkdir(parents=True, exist_ok=True)
spec = {"platform": platform, "argv": ["--plain", "--platform", platform, *argv],
"card": str(card) if card else None, "landed": landed, "held": held}
env = {"PATH": os.environ.get("PATH", ""), "HOME": str(self.home),
env = {"PATH": os.environ.get("PATH", ""), "HOME": str(home),
"RETROBIOS_OS": "linux", "LANG": "C.UTF-8",
"RETROBIOS_BASE_URL": f"http://127.0.0.1:{self.server.server_address[1]}"}
done = subprocess.run(
[sys.executable, "-s", "-c", CHILD, json.dumps(spec)],
cwd=ROOT, env=env, stdin=subprocess.DEVNULL, capture_output=True, text=True,
check=False)
if done.returncode != 0:
if done.returncode not in codes:
raise SampleFailed(f"install.py {' '.join(spec['argv'])} exited "
f"{done.returncode}: {done.stderr.strip()[-2000:]}")
return done.stdout.replace(str(self.home), SHOWN_HOME).replace(str(self.card), SHOWN_CARD)
return done.stdout.replace(str(home), SHOWN_HOME).replace(str(self.card), SHOWN_CARD)
# The runs printed in this process, by what they read: the page is rendered
@@ -411,6 +488,14 @@ class _LazySandbox:
_RUNS[key] = self.box.run(platform, *argv, **kinds)
return _RUNS[key]
def small(self, kind: str) -> str:
key = ("small", kind, _stamp("retroarch"))
if key not in _RUNS:
if self.box is None:
self.box = self.stack.enter_context(Sandbox())
_RUNS[key] = self.box.small(kind)
return _RUNS[key]
class SampleFailed(Exception):
"""A run sample install.py could not print."""
@@ -487,9 +572,23 @@ def sample_writers(box: Sandbox) -> dict[str, Callable[[str], str]]:
+ _fenced([_bulk_line(box)])),
"run-check": lambda _body: _fenced(
_lines_from(check_run(), "Checking existing files", " Everything is in place")),
"check-refused": lambda _body: _fenced(_refused_lines(box.small("refused"))),
"from-run": lambda _body: _fenced(
_lines_from(box.small("from"), "Done.", count=2)),
}
def _refused_lines(text: str) -> list[str]:
"""The files a check flags, each with its reason and where its cores read it."""
lines = text.splitlines()
start = next((i for i, line in enumerate(lines)
if re.fullmatch(r" \d+ files? [a-z ]+:", line)), None)
if start is None:
raise SampleFailed("the check printed no files not in place")
end = max(i for i, line in enumerate(lines) if line.lstrip().startswith("read by "))
return lines[start:end + 1]
def render(page: str) -> str:
"""The page with each marked table and run sample written from install.py."""
writers = {
+7 -6
View File
@@ -3943,8 +3943,10 @@ def first_screen_words() -> list[str]:
# The screen it opens first: the setup found, or the list when none
# is. Install comes on the next one, Choose systems beside it and named
# above on the page (tui_audit_16 P3-10).
return [f"It asks **{installer.TUI_FOUND_TITLE}** (or **{installer.TUI_CHOOSE_TITLE}**), "
f"then offers **{installer.TUI_INSTALL_ROW}**."]
# Nothing found, the folder comes before Install: which-pack left it
# out (tui_audit_17 P3-9).
return [f"It asks **{installer.TUI_FOUND_TITLE}** (or **{installer.TUI_CHOOSE_TITLE}** "
f"and **{installer.TUI_FOLDER_TITLE}**), then offers **{installer.TUI_INSTALL_ROW}**."]
def check_pass_line() -> str:
@@ -4113,8 +4115,7 @@ def only_some_consoles(name: str, prefix: str = "") -> list[str]:
"""The way to a smaller download, in the words Get your files uses."""
return [
f"Only some consoles? [Pick them]({prefix}which-pack.md?platform={name}"
f"#only-some-consoles), or choose **{_installer().TUI_SYSTEMS_ROW}** in the "
"command.",
f"#only-some-consoles), or the command's **{_installer().TUI_SYSTEMS_ROW}**.",
"",
]
@@ -11411,8 +11412,8 @@ def generate_which_pack() -> str:
"",
"## Only some consoles?",
"",
"Pick them here, and get the files and the command. Or run the command "
f"below and choose **{_installer().TUI_SYSTEMS_ROW}**.",
"Pick them here, and get the files and the command. Or use the command's "
f"**{_installer().TUI_SYSTEMS_ROW}**.",
"",
"<FilePicker />",
"",
+18 -18
View File
@@ -373,6 +373,7 @@
^[[0;1m ^[[0;1;32mEverything is in place^[[0m
BIOS folder: ^[[0;1m~/.config/retroarch/system^[[0m
^[[0;32m5 in place^[[0m, 0 missing, 0 wrong copies
1 of the 0 wrong copies is replaced, the old one kept in a backup folder.
Free space: 50.0 GB
^[[0;7;35m > Close^[[0m
@@ -404,20 +405,19 @@
^[[0;1;35mA/Enter^[[0m Close ^[[0;2mB/Esc^[[0m Back ^[[0;2mY/o^[[0m Options ^[[0;2m?^[[0m Help
=== systems
^[[0;1m ^[[0;1;35mRetroBIOS^[[0;1m: Choose systems^[[0m
Filter (/ to type)
[x] nintendo-gba (gba) 1 file, 16.0 KB
[x] sony-playstation 3 files, 1.0 MB
^[[0;7;35m > [ ] nintendo-famicom-disk (ファミコン) in place^[[0m
All
None
Filter (/ to type)
^[[0;7;35m > [x] nintendo-gba (gba) 1 file, 16.0 KB^[[0m
[x] sony-playstation 3 files, 1.0 MB
^[[0;2m [ ] nintendo-famicom-disk (ファミコン) in place^[[0m
^[[0;32mDone^[[0m
@@ -448,7 +448,7 @@
^[[0;1m ^[[0;1;35m2^[[0;1m of ^[[0;1;35m3^[[0;1m systems: ^[[0;1;35m4^[[0;1m files, ^[[0;1;35m1.0 MB^[[0m
^[[0;1;35mA/Enter^[[0m Continue ^[[0;2mB/Esc^[[0m Back ^[[0;2mX/Space^[[0m Tick ^[[0;2m?^[[0m Help
^[[0;1;35mA/Enter^[[0m Tick ^[[0;2mB/Esc^[[0m Done ^[[0;2m?^[[0m Help
=== options
^[[0;1m ^[[0;1;35mRetroBIOS^[[0;1m: Options^[[0m
@@ -498,8 +498,8 @@
^[[0;7;35m > [1] North America^[[0m
[ ] Japan
None
^[[0;32mDone^[[0m
@@ -534,14 +534,15 @@
=== cores
^[[0;1m ^[[0;1;35mRetroBIOS^[[0;1m: Cores^[[0m
Every core ticked keeps every core's files. Untick the cores you do not use: the platform's own
files are always kept.
Untick the cores you do not use: the platform's own files are always kept, and a core with no
extra file reads only those.
^[[0;7;35m > All^[[0m
^[[0;7;35m > Filter (/ to type)^[[0m
[ ] mesen 1 file, 8.0 KB
[x] pcsx_rearmed 1 file, 4 B
All
None
Filter (/ to type)
[ ] mesen
[x] pcsx_rearmed
^[[0;32mDone^[[0m
@@ -570,8 +571,7 @@
^[[0;1;35mA/Enter^[[0m Tick all ^[[0;2mB/Esc^[[0m Back ^[[0;2mX/Space^[[0m Tick ^[[0;2m?^[[0m Help
^[[0;1;35mA/Enter^[[0m Filter ^[[0;2mB/Esc^[[0m Done ^[[0;2m?^[[0m Help
=== preview
^[[0;1m ^[[0;1;35mRetroBIOS^[[0;1m: Preview^[[0m
@@ -742,6 +742,7 @@
^[[0;1m ^[[0;1;32m3 installed^[[0;1m, ^[[0;1;31m1 failed^[[0;1m.^[[0m
BIOS folder: ^[[0;1m/home/user/.config/retroarch/system^[[0m
^[[0;1;31mfailed:^[[0m scph5500.bin (HTTP 404)
Run it again to retry only those.
The files it replaced are kept in /home/user/.config/retroarch/retrobios-backup/2026-10-23_1200
To put them back: python3 install.py \
--restore /home/user/.config/retroarch/retrobios-backup/2026-10-23_1200
@@ -773,7 +774,6 @@
^[[0;1;35mA/Enter^[[0m Exit
+22 -22
View File
@@ -122,25 +122,25 @@
BIOS folder:
^[[0;1m~/.config/retroarch/system^[[0m
^[[0;32m5 in place^[[0m, 0 missing, 0 wrong copies
1 of the 0 wrong copies is replaced,
the old one kept in a backup folder.
Free space: 50.0 GB
^[[0;7;35m > Close^[[0m
Options
^[[0;1;35mA^[[0m Close ^[[0;2mB^[[0m Back ^[[0;2mY^[[0m Options ^[[0;2m?^[[0m Help
=== systems
^[[0;1m ^[[0;1;35mRetroBIOS^[[0;1m: Choose systems^[[0m
[x] nintendo-gba (gba) 16.0 KB
[x] sony-playstation 1.0 MB
^[[0;7;35m > [ ] nintendo-famicom-disk in place^[[0m
All
None
Filter (/ to type)
^[[0;7;35m > [x] nintendo-gba (gba) 16.0 KB^[[0m
[x] sony-playstation 1.0 MB
^[[0;2m [ ] nintendo-famicom-disk in place^[[0m
^[[0;2m 1-3 of 3^[[0m
nintendo-famicom-disk (ファミコン): in
place
^[[0;1m ^[[0;1;35m2^[[0;1m of ^[[0;1;35m3^[[0;1m systems: ^[[0;1;35m4^[[0;1m files, ^[[0;1;35m1.0 MB^[[0m
^[[0;1;35mA^[[0m Continue ^[[0;2mB^[[0m Back ^[[0;2mX^[[0m Tick ^[[0;2m?^[[0m Help
^[[0;1;35mA^[[0m Tick ^[[0;2mB^[[0m Done ^[[0;2m?^[[0m Help
=== options
^[[0;1m ^[[0;1;35mRetroBIOS^[[0;1m: Options^[[0m
@@ -165,21 +165,21 @@
^[[0;7;35m > [1] North America^[[0m
[ ] Japan
^[[0;2m 1-2 of 2^[[0m
^[[0;1;35mA^[[0m Tick ^[[0;2mB^[[0m Done ^[[0;2m<>^[[0m Order ^[[0;2m?^[[0m Help
=== cores
^[[0;1m ^[[0;1;35mRetroBIOS^[[0;1m: Cores^[[0m
Every core ticked keeps every core's
files. Untick the cores you do not
use: the platform's own files are
always kept.
^[[0;7;35m > All^[[0m
None
Filter (/ to type)
[ ] mesen
[x] pcsx_rearmed
^[[0;1;35mA^[[0m Tick all ^[[0;2mB^[[0m Back ^[[0;2mX^[[0m Tick ^[[0;2m?^[[0m Help
Untick the cores you do not use: the
platform's own files are always
kept, and a core with no extra file
reads only those.
^[[0;7;35m > Filter (/ to type)^[[0m
[ ] mesen 1 file, 8.0 KB
[x] pcsx_rearmed 1 file, 4 B
^[[0;2m 1-2 of 2^[[0m
^[[0;1;35mA^[[0m Filter ^[[0;2mB^[[0m Done ^[[0;2m?^[[0m Help
=== preview
^[[0;1m ^[[0;1;35mRetroBIOS^[[0;1m: Preview^[[0m
@@ -239,11 +239,11 @@
BIOS folder:
^[[0;1m/home/user/.config/retroarch/system^[[0m
^[[0;1;31mfailed:^[[0m scph5500.bin (HTTP 404)
Run it again to retry only those.
The files it replaced are kept in
/home/user/.config/retroarch/
retrobios-backup/2026-10-23_1200
To put them back: python3 install.py \
^[[0;2m 1-8 of 16^[[0m
^[[0;2m 1-8 of 17^[[0m
^[[0;1;35mA^[[0m Exit ^[[0;2m^v^[[0m Scroll
=== error
^[[0;1m ^[[0;1;35mRetroBIOS^[[0;1m: ^[[0;1;31mSomething went wrong^[[0m
+24 -24
View File
@@ -149,31 +149,31 @@
BIOS folder:
^[[0;1m~/.config/retroarch/system^[[0m
^[[0;32m5 in place^[[0m, 0 missing, 0 wrong copies
1 of the 0 wrong copies is replaced,
the old one kept in a backup folder.
Free space: 50.0 GB
^[[0;7;35m > Close^[[0m
Options
^[[0;1;35mA^[[0m Close ^[[0;2mB^[[0m Back ^[[0;2mY^[[0m Options ^[[0;2m?^[[0m Help
=== systems
^[[0;1m ^[[0;1;35mRetroBIOS^[[0;1m: Choose systems^[[0m
Filter (/ to type)
[x] nintendo-gba (gba) 16.0 KB
[x] sony-playstation 1.0 MB
^[[0;7;35m > [ ] nintendo-famicom-disk in place^[[0m
All
None
Filter (/ to type)
^[[0;7;35m > [x] nintendo-gba (gba) 16.0 KB^[[0m
[x] sony-playstation 1.0 MB
^[[0;2m [ ] nintendo-famicom-disk in place^[[0m
^[[0;32mDone^[[0m
nintendo-famicom-disk (ファミコン): in
place
^[[0;1m ^[[0;1;35m2^[[0;1m of ^[[0;1;35m3^[[0;1m systems: ^[[0;1;35m4^[[0;1m files, ^[[0;1;35m1.0 MB^[[0m
^[[0;1;35mA^[[0m Continue ^[[0;2mB^[[0m Back ^[[0;2mX^[[0m Tick ^[[0;2m?^[[0m Help
^[[0;1;35mA^[[0m Tick ^[[0;2mB^[[0m Done ^[[0;2m?^[[0m Help
=== options
^[[0;1m ^[[0;1;35mRetroBIOS^[[0;1m: Options^[[0m
@@ -201,27 +201,27 @@
^[[0;7;35m > [1] North America^[[0m
[ ] Japan
None
^[[0;32mDone^[[0m
^[[0;1;35mA^[[0m Tick ^[[0;2mB^[[0m Done ^[[0;2m<>^[[0m Order ^[[0;2m?^[[0m Help
=== cores
^[[0;1m ^[[0;1;35mRetroBIOS^[[0;1m: Cores^[[0m
Every core ticked keeps every core's
files. Untick the cores you do not
use: the platform's own files are
always kept.
Untick the cores you do not use: the
platform's own files are always
kept, and a core with no extra file
reads only those.
^[[0;7;35m > All^[[0m
^[[0;7;35m > Filter (/ to type)^[[0m
[ ] mesen 1 file, 8.0 KB
[x] pcsx_rearmed 1 file, 4 B
All
None
Filter (/ to type)
[ ] mesen
[x] pcsx_rearmed
^[[0;32mDone^[[0m
^[[0;1;35mA^[[0m Tick all ^[[0;2mB^[[0m Back ^[[0;2mX^[[0m Tick ^[[0;2m?^[[0m Help
^[[0;1;35mA^[[0m Filter ^[[0;2mB^[[0m Done ^[[0;2m?^[[0m Help
=== preview
^[[0;1m ^[[0;1;35mRetroBIOS^[[0;1m: Preview^[[0m
@@ -293,14 +293,14 @@
BIOS folder:
^[[0;1m/home/user/.config/retroarch/system^[[0m
^[[0;1;31mfailed:^[[0m scph5500.bin (HTTP 404)
Run it again to retry only those.
The files it replaced are kept in
/home/user/.config/retroarch/
retrobios-backup/2026-10-23_1200
To put them back: python3 install.py \
--restore .../2026-10-23_1200
^[[0;2m Shortened to fit this window.^[[0m
Same choice without questions:
^[[0;2m 1-11 of 16^[[0m
^[[0;2m 1-11 of 17^[[0m
^[[0;1;35mA^[[0m Exit ^[[0;2m^v^[[0m Scroll
=== error
^[[0;1m ^[[0;1;35mRetroBIOS^[[0;1m: ^[[0;1;31mSomething went wrong^[[0m
+18 -18
View File
@@ -229,6 +229,7 @@
^[[0;1m ^[[0;1;32mEverything is in place^[[0m
BIOS folder: ^[[0;1m~/.config/retroarch/system^[[0m
^[[0;32m5 in place^[[0m, 0 missing, 0 wrong copies
1 of the 0 wrong copies is replaced, the old one kept in a backup folder.
Free space: 50.0 GB
^[[0;7;35m > Close^[[0m
@@ -246,18 +247,17 @@
^[[0;1;35mA/Enter^[[0m Close ^[[0;2mB/Esc^[[0m Back ^[[0;2mY/o^[[0m Options ^[[0;2m?^[[0m Help
=== systems
^[[0;1m ^[[0;1;35mRetroBIOS^[[0;1m: Choose systems^[[0m
Filter (/ to type)
[x] nintendo-gba (gba) 1 file, 16.0 KB
[x] sony-playstation 3 files, 1.0 MB
^[[0;7;35m > [ ] nintendo-famicom-disk (ファミコン) in place^[[0m
All
None
Filter (/ to type)
^[[0;7;35m > [x] nintendo-gba (gba) 1 file, 16.0 KB^[[0m
[x] sony-playstation 3 files, 1.0 MB
^[[0;2m [ ] nintendo-famicom-disk (ファミコン) in place^[[0m
^[[0;32mDone^[[0m
@@ -272,7 +272,7 @@
^[[0;1m ^[[0;1;35m2^[[0;1m of ^[[0;1;35m3^[[0;1m systems: ^[[0;1;35m4^[[0;1m files, ^[[0;1;35m1.0 MB^[[0m
^[[0;1;35mA/Enter^[[0m Continue ^[[0;2mB/Esc^[[0m Back ^[[0;2mX/Space^[[0m Tick ^[[0;2m?^[[0m Help
^[[0;1;35mA/Enter^[[0m Tick ^[[0;2mB/Esc^[[0m Done ^[[0;2m?^[[0m Help
=== options
^[[0;1m ^[[0;1;35mRetroBIOS^[[0;1m: Options^[[0m
@@ -307,8 +307,8 @@
^[[0;7;35m > [1] North America^[[0m
[ ] Japan
None
^[[0;32mDone^[[0m
@@ -326,14 +326,15 @@
=== cores
^[[0;1m ^[[0;1;35mRetroBIOS^[[0;1m: Cores^[[0m
Every core ticked keeps every core's files. Untick the cores you do not use:
the platform's own files are always kept.
Untick the cores you do not use: the platform's own files are always kept, and
a core with no extra file reads only those.
^[[0;7;35m > All^[[0m
^[[0;7;35m > Filter (/ to type)^[[0m
[ ] mesen 1 file, 8.0 KB
[x] pcsx_rearmed 1 file, 4 B
All
None
Filter (/ to type)
[ ] mesen
[x] pcsx_rearmed
^[[0;32mDone^[[0m
@@ -346,8 +347,7 @@
^[[0;1;35mA/Enter^[[0m Tick all ^[[0;2mB/Esc^[[0m Back ^[[0;2mX/Space^[[0m Tick ^[[0;2m?^[[0m Help
^[[0;1;35mA/Enter^[[0m Filter ^[[0;2mB/Esc^[[0m Done ^[[0;2m?^[[0m Help
=== preview
^[[0;1m ^[[0;1;35mRetroBIOS^[[0;1m: Preview^[[0m
@@ -454,6 +454,7 @@
^[[0;1m ^[[0;1;32m3 installed^[[0;1m, ^[[0;1;31m1 failed^[[0;1m.^[[0m
BIOS folder: ^[[0;1m/home/user/.config/retroarch/system^[[0m
^[[0;1;31mfailed:^[[0m scph5500.bin (HTTP 404)
Run it again to retry only those.
The files it replaced are kept in
/home/user/.config/retroarch/retrobios-backup/2026-10-23_1200
To put them back: python3 install.py \
@@ -471,7 +472,6 @@
^[[0;1;35mA/Enter^[[0m Exit
=== error
^[[0;1m ^[[0;1;35mRetroBIOS^[[0;1m: ^[[0;1;31mSomething went wrong^[[0m
+8 -8
View File
@@ -1,13 +1,14 @@
RetroBIOS: Cores
Every core ticked keeps every core's files. Untick the cores you do not use: the platform's own
files are always kept.
Untick the cores you do not use: the platform's own files are always kept, and a core with no
extra file reads only those.
> All
> Filter (/ to type)
[ ] mesen 1 file, 8.0 KB
[x] pcsx_rearmed 1 file, 4 B
All
None
Filter (/ to type)
[ ] mesen
[x] pcsx_rearmed
Done
@@ -36,5 +37,4 @@
A/Enter Tick all B/Esc Back X/Space Tick ? Help
A/Enter Filter B/Esc Done ? Help
+10 -10
View File
@@ -1,12 +1,12 @@
RetroBIOS: Cores
Every core ticked keeps every core's
files. Untick the cores you do not
use: the platform's own files are
always kept.
> All
None
Filter (/ to type)
[ ] mesen
[x] pcsx_rearmed
A Tick all B Back X Tick ? Help
Untick the cores you do not use: the
platform's own files are always
kept, and a core with no extra file
reads only those.
> Filter (/ to type)
[ ] mesen 1 file, 8.0 KB
[x] pcsx_rearmed 1 file, 4 B
1-2 of 2
A Filter B Done ? Help
+10 -10
View File
@@ -1,15 +1,15 @@
RetroBIOS: Cores
Every core ticked keeps every core's
files. Untick the cores you do not
use: the platform's own files are
always kept.
Untick the cores you do not use: the
platform's own files are always
kept, and a core with no extra file
reads only those.
> All
> Filter (/ to type)
[ ] mesen 1 file, 8.0 KB
[x] pcsx_rearmed 1 file, 4 B
All
None
Filter (/ to type)
[ ] mesen
[x] pcsx_rearmed
Done
A Tick all B Back X Tick ? Help
A Filter B Done ? Help
+8 -8
View File
@@ -1,13 +1,14 @@
RetroBIOS: Cores
Every core ticked keeps every core's files. Untick the cores you do not use:
the platform's own files are always kept.
Untick the cores you do not use: the platform's own files are always kept, and
a core with no extra file reads only those.
> All
> Filter (/ to type)
[ ] mesen 1 file, 8.0 KB
[x] pcsx_rearmed 1 file, 4 B
All
None
Filter (/ to type)
[ ] mesen
[x] pcsx_rearmed
Done
@@ -20,5 +21,4 @@
A/Enter Tick all B/Esc Back X/Space Tick ? Help
A/Enter Filter B/Esc Done ? Help
+1 -1
View File
@@ -3,6 +3,7 @@
Everything is in place
BIOS folder: ~/.config/retroarch/system
5 in place, 0 missing, 0 wrong copies
1 of the 0 wrong copies is replaced, the old one kept in a backup folder.
Free space: 50.0 GB
> Close
@@ -34,7 +35,6 @@
A/Enter Close B/Esc Back Y/o Options ? Help
+2 -2
View File
@@ -4,9 +4,9 @@
BIOS folder:
~/.config/retroarch/system
5 in place, 0 missing, 0 wrong copies
1 of the 0 wrong copies is replaced,
the old one kept in a backup folder.
Free space: 50.0 GB
> Close
Options
A Close B Back Y Options ? Help
+2 -2
View File
@@ -4,12 +4,12 @@
BIOS folder:
~/.config/retroarch/system
5 in place, 0 missing, 0 wrong copies
1 of the 0 wrong copies is replaced,
the old one kept in a backup folder.
Free space: 50.0 GB
> Close
Options
A Close B Back Y Options ? Help
+1 -1
View File
@@ -3,6 +3,7 @@
Everything is in place
BIOS folder: ~/.config/retroarch/system
5 in place, 0 missing, 0 wrong copies
1 of the 0 wrong copies is replaced, the old one kept in a backup folder.
Free space: 50.0 GB
> Close
@@ -20,5 +21,4 @@
A/Enter Close B/Esc Back Y/o Options ? Help
+2 -2
View File
@@ -5,8 +5,8 @@
> [1] North America
[ ] Japan
None
Done
+1 -1
View File
@@ -8,5 +8,5 @@
> [1] North America
[ ] Japan
1-2 of 2
A Tick B Done <> Order ? Help
+2 -2
View File
@@ -8,8 +8,8 @@
> [1] North America
[ ] Japan
None
Done
A Tick B Done <> Order ? Help
+2 -2
View File
@@ -6,8 +6,8 @@
> [1] North America
[ ] Japan
None
Done
+1 -1
View File
@@ -3,6 +3,7 @@
3 installed, 1 failed.
BIOS folder: /home/user/.config/retroarch/system
failed: scph5500.bin (HTTP 404)
Run it again to retry only those.
The files it replaced are kept in /home/user/.config/retroarch/retrobios-backup/2026-10-23_1200
To put them back: python3 install.py \
--restore /home/user/.config/retroarch/retrobios-backup/2026-10-23_1200
@@ -34,7 +35,6 @@
A/Enter Exit
+2 -2
View File
@@ -4,9 +4,9 @@
BIOS folder:
/home/user/.config/retroarch/system
failed: scph5500.bin (HTTP 404)
Run it again to retry only those.
The files it replaced are kept in
/home/user/.config/retroarch/
retrobios-backup/2026-10-23_1200
To put them back: python3 install.py \
1-8 of 16
1-8 of 17
A Exit ^v Scroll
+2 -2
View File
@@ -4,12 +4,12 @@
BIOS folder:
/home/user/.config/retroarch/system
failed: scph5500.bin (HTTP 404)
Run it again to retry only those.
The files it replaced are kept in
/home/user/.config/retroarch/
retrobios-backup/2026-10-23_1200
To put them back: python3 install.py \
--restore .../2026-10-23_1200
Shortened to fit this window.
Same choice without questions:
1-11 of 16
1-11 of 17
A Exit ^v Scroll
+1 -1
View File
@@ -3,6 +3,7 @@
3 installed, 1 failed.
BIOS folder: /home/user/.config/retroarch/system
failed: scph5500.bin (HTTP 404)
Run it again to retry only those.
The files it replaced are kept in
/home/user/.config/retroarch/retrobios-backup/2026-10-23_1200
To put them back: python3 install.py \
@@ -20,5 +21,4 @@
A/Enter Exit
+62 -62
View File
@@ -462,11 +462,11 @@
BIOS folder:
~/.config/retroarch/system
5 in place, 0 missing, 0 wrong copies
1 of the 0 wrong copies is replaced,
the old one kept in a backup folder.
Free space: 50.0 GB
> Close
Options
A Close B Back Y Options
=== plan-in-place 40x15
RetroBIOS: RetroArch
@@ -475,14 +475,14 @@
BIOS folder:
~/.config/retroarch/system
5 in place, 0 missing, 0 wrong copies
1 of the 0 wrong copies is replaced,
the old one kept in a backup folder.
Free space: 50.0 GB
> Close
Options
A Close B Back Y Options
=== plan-in-place 80x24
RetroBIOS: RetroArch
@@ -490,6 +490,7 @@
Everything is in place
BIOS folder: ~/.config/retroarch/system
5 in place, 0 missing, 0 wrong copies
1 of the 0 wrong copies is replaced, the old one kept in a backup folder.
Free space: 50.0 GB
> Close
@@ -507,47 +508,46 @@
A Close B Back Y Options
=== systems 40x12
RetroBIOS: Choose systems
[x] nintendo-gba (gba) 16.0 KB
[x] sony-playstation 1.0 MB
> [ ] nintendo-famicom-disk in place
All
None
Filter (with a keyboard)
> [x] nintendo-gba (gba) 16.0 KB
[x] sony-playstation 1.0 MB
[ ] nintendo-famicom-disk in place
1-3 of 3
nintendo-famicom-disk (ファミコン): in
place
2 of 3 systems: 4 files, 1.0 MB
A Continue B Back X Tick
A Tick B Done
=== systems 40x15
RetroBIOS: Choose systems
Filter (with a keyboard)
[x] nintendo-gba (gba) 16.0 KB
[x] sony-playstation 1.0 MB
> [ ] nintendo-famicom-disk in place
All
None
Filter (with a keyboard)
> [x] nintendo-gba (gba) 16.0 KB
[x] sony-playstation 1.0 MB
[ ] nintendo-famicom-disk in place
Done
nintendo-famicom-disk (ファミコン): in
place
2 of 3 systems: 4 files, 1.0 MB
A Continue B Back X Tick
A Tick B Done
=== systems 80x24
RetroBIOS: Choose systems
Filter (with a keyboard)
[x] nintendo-gba (gba) 1 file, 16.0 KB
[x] sony-playstation 3 files, 1.0 MB
> [ ] nintendo-famicom-disk (ファミコン) in place
All
None
Filter (with a keyboard)
> [x] nintendo-gba (gba) 1 file, 16.0 KB
[x] sony-playstation 3 files, 1.0 MB
[ ] nintendo-famicom-disk (ファミコン) in place
Done
@@ -562,7 +562,7 @@
2 of 3 systems: 4 files, 1.0 MB
A Continue B Back X Tick
A Tick B Done
=== options 40x12
RetroBIOS: Options
@@ -628,7 +628,7 @@
> [1] North America
[ ] Japan
1-2 of 2
A Tick B Done <> Order
=== regions 40x15
RetroBIOS: Preferred regions
@@ -641,8 +641,8 @@
> [1] North America
[ ] Japan
None
Done
A Tick B Done <> Order
@@ -655,8 +655,8 @@
> [1] North America
[ ] Japan
None
Done
@@ -674,43 +674,44 @@
=== cores 40x12
RetroBIOS: Cores
Every core ticked keeps every core's
files. Untick the cores you do not
use: the platform's own files are
always kept.
> All
None
Filter (with a keyboard)
[ ] mesen
[x] pcsx_rearmed
A Tick all B Back X Tick
Untick the cores you do not use: the
platform's own files are always
kept, and a core with no extra file
reads only those.
> Filter (with a keyboard)
[ ] mesen 1 file, 8.0 KB
[x] pcsx_rearmed 1 file, 4 B
1-2 of 2
A Filter B Done
=== cores 40x15
RetroBIOS: Cores
Every core ticked keeps every core's
files. Untick the cores you do not
use: the platform's own files are
always kept.
Untick the cores you do not use: the
platform's own files are always
kept, and a core with no extra file
reads only those.
> All
> Filter (with a keyboard)
[ ] mesen 1 file, 8.0 KB
[x] pcsx_rearmed 1 file, 4 B
All
None
Filter (with a keyboard)
[ ] mesen
[x] pcsx_rearmed
Done
A Tick all B Back X Tick
A Filter B Done
=== cores 80x24
RetroBIOS: Cores
Every core ticked keeps every core's files. Untick the cores you do not use:
the platform's own files are always kept.
Untick the cores you do not use: the platform's own files are always kept, and
a core with no extra file reads only those.
> All
> Filter (with a keyboard)
[ ] mesen 1 file, 8.0 KB
[x] pcsx_rearmed 1 file, 4 B
All
None
Filter (with a keyboard)
[ ] mesen
[x] pcsx_rearmed
Done
@@ -723,8 +724,7 @@
A Tick all B Back X Tick
A Filter B Done
=== preview 80x24
RetroBIOS: Preview
@@ -890,11 +890,11 @@
BIOS folder:
/home/user/.config/retroarch/system
failed: scph5500.bin (HTTP 404)
Run it again to retry only those.
The files it replaced are kept in
/home/user/.config/retroarch/
retrobios-backup/2026-10-23_1200
Details: /tmp/retrobios-x/install.log
A Exit
=== result 40x15
RetroBIOS: Finished with errors
@@ -903,6 +903,7 @@
BIOS folder:
/home/user/.config/retroarch/system
failed: scph5500.bin (HTTP 404)
Run it again to retry only those.
The files it replaced are kept in
/home/user/.config/retroarch/
retrobios-backup/2026-10-23_1200
@@ -910,7 +911,6 @@
A Exit
=== result 80x24
RetroBIOS: Finished with errors
@@ -918,6 +918,7 @@
3 installed, 1 failed.
BIOS folder: /home/user/.config/retroarch/system
failed: scph5500.bin (HTTP 404)
Run it again to retry only those.
The files it replaced are kept in
/home/user/.config/retroarch/retrobios-backup/2026-10-23_1200
Details: /tmp/retrobios-x/install.log
@@ -935,7 +936,6 @@
A Exit
=== error 40x12
RetroBIOS: Something went wrong
+62 -62
View File
@@ -462,11 +462,11 @@
BIOS folder:
~/.config/retroarch/system
5 in place, 0 missing, 0 wrong copies
1 of the 0 wrong copies is replaced,
the old one kept in a backup folder.
Free space: 50.0 GB
> Close
Options
A Close B Back Y Options
=== plan-in-place 40x15
RetroBIOS: RetroArch
@@ -475,14 +475,14 @@
BIOS folder:
~/.config/retroarch/system
5 in place, 0 missing, 0 wrong copies
1 of the 0 wrong copies is replaced,
the old one kept in a backup folder.
Free space: 50.0 GB
> Close
Options
A Close B Back Y Options
=== plan-in-place 80x24
RetroBIOS: RetroArch
@@ -490,6 +490,7 @@
Everything is in place
BIOS folder: ~/.config/retroarch/system
5 in place, 0 missing, 0 wrong copies
1 of the 0 wrong copies is replaced, the old one kept in a backup folder.
Free space: 50.0 GB
> Close
@@ -507,47 +508,46 @@
A Close B Back Y Options
=== systems 40x12
RetroBIOS: Choose systems
[x] nintendo-gba (gba) 16.0 KB
[x] sony-playstation 1.0 MB
> [ ] nintendo-famicom-disk in place
All
None
Filter (with a keyboard)
> [x] nintendo-gba (gba) 16.0 KB
[x] sony-playstation 1.0 MB
[ ] nintendo-famicom-disk in place
1-3 of 3
nintendo-famicom-disk (ファミコン): in
place
2 of 3 systems: 4 files, 1.0 MB
A Continue B Back X Tick
A Tick B Done
=== systems 40x15
RetroBIOS: Choose systems
Filter (with a keyboard)
[x] nintendo-gba (gba) 16.0 KB
[x] sony-playstation 1.0 MB
> [ ] nintendo-famicom-disk in place
All
None
Filter (with a keyboard)
> [x] nintendo-gba (gba) 16.0 KB
[x] sony-playstation 1.0 MB
[ ] nintendo-famicom-disk in place
Done
nintendo-famicom-disk (ファミコン): in
place
2 of 3 systems: 4 files, 1.0 MB
A Continue B Back X Tick
A Tick B Done
=== systems 80x24
RetroBIOS: Choose systems
Filter (with a keyboard)
[x] nintendo-gba (gba) 1 file, 16.0 KB
[x] sony-playstation 3 files, 1.0 MB
> [ ] nintendo-famicom-disk (ファミコン) in place
All
None
Filter (with a keyboard)
> [x] nintendo-gba (gba) 1 file, 16.0 KB
[x] sony-playstation 3 files, 1.0 MB
[ ] nintendo-famicom-disk (ファミコン) in place
Done
@@ -562,7 +562,7 @@
2 of 3 systems: 4 files, 1.0 MB
A Continue B Back X Tick
A Tick B Done
=== options 40x12
RetroBIOS: Options
@@ -628,7 +628,7 @@
> [1] North America
[ ] Japan
1-2 of 2
A Tick B Done <> Order
=== regions 40x15
RetroBIOS: Preferred regions
@@ -641,8 +641,8 @@
> [1] North America
[ ] Japan
None
Done
A Tick B Done <> Order
@@ -655,8 +655,8 @@
> [1] North America
[ ] Japan
None
Done
@@ -674,43 +674,44 @@
=== cores 40x12
RetroBIOS: Cores
Every core ticked keeps every core's
files. Untick the cores you do not
use: the platform's own files are
always kept.
> All
None
Filter (with a keyboard)
[ ] mesen
[x] pcsx_rearmed
A Tick all B Back X Tick
Untick the cores you do not use: the
platform's own files are always
kept, and a core with no extra file
reads only those.
> Filter (with a keyboard)
[ ] mesen 1 file, 8.0 KB
[x] pcsx_rearmed 1 file, 4 B
1-2 of 2
A Filter B Done
=== cores 40x15
RetroBIOS: Cores
Every core ticked keeps every core's
files. Untick the cores you do not
use: the platform's own files are
always kept.
Untick the cores you do not use: the
platform's own files are always
kept, and a core with no extra file
reads only those.
> All
> Filter (with a keyboard)
[ ] mesen 1 file, 8.0 KB
[x] pcsx_rearmed 1 file, 4 B
All
None
Filter (with a keyboard)
[ ] mesen
[x] pcsx_rearmed
Done
A Tick all B Back X Tick
A Filter B Done
=== cores 80x24
RetroBIOS: Cores
Every core ticked keeps every core's files. Untick the cores you do not use:
the platform's own files are always kept.
Untick the cores you do not use: the platform's own files are always kept, and
a core with no extra file reads only those.
> All
> Filter (with a keyboard)
[ ] mesen 1 file, 8.0 KB
[x] pcsx_rearmed 1 file, 4 B
All
None
Filter (with a keyboard)
[ ] mesen
[x] pcsx_rearmed
Done
@@ -723,8 +724,7 @@
A Tick all B Back X Tick
A Filter B Done
=== preview 80x24
RetroBIOS: Preview
@@ -890,11 +890,11 @@
BIOS folder:
/home/user/.config/retroarch/system
failed: scph5500.bin (HTTP 404)
Run it again to retry only those.
The files it replaced are kept in
/home/user/.config/retroarch/
retrobios-backup/2026-10-23_1200
Details: /tmp/retrobios-x/install.log
A Exit
=== result 40x15
RetroBIOS: Finished with errors
@@ -903,6 +903,7 @@
BIOS folder:
/home/user/.config/retroarch/system
failed: scph5500.bin (HTTP 404)
Run it again to retry only those.
The files it replaced are kept in
/home/user/.config/retroarch/
retrobios-backup/2026-10-23_1200
@@ -910,7 +911,6 @@
A Exit
=== result 80x24
RetroBIOS: Finished with errors
@@ -918,6 +918,7 @@
3 installed, 1 failed.
BIOS folder: /home/user/.config/retroarch/system
failed: scph5500.bin (HTTP 404)
Run it again to retry only those.
The files it replaced are kept in
/home/user/.config/retroarch/retrobios-backup/2026-10-23_1200
Details: /tmp/retrobios-x/install.log
@@ -935,7 +936,6 @@
A Exit
=== error 40x12
RetroBIOS: Something went wrong
+62 -62
View File
@@ -462,11 +462,11 @@
BIOS folder:
~/.config/retroarch/system
5 in place, 0 missing, 0 wrong copies
1 of the 0 wrong copies is replaced,
the old one kept in a backup folder.
Free space: 50.0 GB
> Close
Options
A Close B Back Y Options
=== plan-in-place 40x15
RetroBIOS: RetroArch
@@ -475,14 +475,14 @@
BIOS folder:
~/.config/retroarch/system
5 in place, 0 missing, 0 wrong copies
1 of the 0 wrong copies is replaced,
the old one kept in a backup folder.
Free space: 50.0 GB
> Close
Options
A Close B Back Y Options
=== plan-in-place 80x24
RetroBIOS: RetroArch
@@ -490,6 +490,7 @@
Everything is in place
BIOS folder: ~/.config/retroarch/system
5 in place, 0 missing, 0 wrong copies
1 of the 0 wrong copies is replaced, the old one kept in a backup folder.
Free space: 50.0 GB
> Close
@@ -507,47 +508,46 @@
A Close B Back Y Options
=== systems 40x12
RetroBIOS: Choose systems
[x] nintendo-gba (gba) 16.0 KB
[x] sony-playstation 1.0 MB
> [ ] nintendo-famicom-disk in place
All
None
Filter (with a keyboard)
> [x] nintendo-gba (gba) 16.0 KB
[x] sony-playstation 1.0 MB
[ ] nintendo-famicom-disk in place
1-3 of 3
nintendo-famicom-disk (ファミコン): in
place
2 of 3 systems: 4 files, 1.0 MB
A Continue B Back X Tick
A Tick B Done
=== systems 40x15
RetroBIOS: Choose systems
Filter (with a keyboard)
[x] nintendo-gba (gba) 16.0 KB
[x] sony-playstation 1.0 MB
> [ ] nintendo-famicom-disk in place
All
None
Filter (with a keyboard)
> [x] nintendo-gba (gba) 16.0 KB
[x] sony-playstation 1.0 MB
[ ] nintendo-famicom-disk in place
Done
nintendo-famicom-disk (ファミコン): in
place
2 of 3 systems: 4 files, 1.0 MB
A Continue B Back X Tick
A Tick B Done
=== systems 80x24
RetroBIOS: Choose systems
Filter (with a keyboard)
[x] nintendo-gba (gba) 1 file, 16.0 KB
[x] sony-playstation 3 files, 1.0 MB
> [ ] nintendo-famicom-disk (ファミコン) in place
All
None
Filter (with a keyboard)
> [x] nintendo-gba (gba) 1 file, 16.0 KB
[x] sony-playstation 3 files, 1.0 MB
[ ] nintendo-famicom-disk (ファミコン) in place
Done
@@ -562,7 +562,7 @@
2 of 3 systems: 4 files, 1.0 MB
A Continue B Back X Tick
A Tick B Done
=== options 40x12
RetroBIOS: Options
@@ -628,7 +628,7 @@
> [1] North America
[ ] Japan
1-2 of 2
A Tick B Done <> Order
=== regions 40x15
RetroBIOS: Preferred regions
@@ -641,8 +641,8 @@
> [1] North America
[ ] Japan
None
Done
A Tick B Done <> Order
@@ -655,8 +655,8 @@
> [1] North America
[ ] Japan
None
Done
@@ -674,43 +674,44 @@
=== cores 40x12
RetroBIOS: Cores
Every core ticked keeps every core's
files. Untick the cores you do not
use: the platform's own files are
always kept.
> All
None
Filter (with a keyboard)
[ ] mesen
[x] pcsx_rearmed
A Tick all B Back X Tick
Untick the cores you do not use: the
platform's own files are always
kept, and a core with no extra file
reads only those.
> Filter (with a keyboard)
[ ] mesen 1 file, 8.0 KB
[x] pcsx_rearmed 1 file, 4 B
1-2 of 2
A Filter B Done
=== cores 40x15
RetroBIOS: Cores
Every core ticked keeps every core's
files. Untick the cores you do not
use: the platform's own files are
always kept.
Untick the cores you do not use: the
platform's own files are always
kept, and a core with no extra file
reads only those.
> All
> Filter (with a keyboard)
[ ] mesen 1 file, 8.0 KB
[x] pcsx_rearmed 1 file, 4 B
All
None
Filter (with a keyboard)
[ ] mesen
[x] pcsx_rearmed
Done
A Tick all B Back X Tick
A Filter B Done
=== cores 80x24
RetroBIOS: Cores
Every core ticked keeps every core's files. Untick the cores you do not use:
the platform's own files are always kept.
Untick the cores you do not use: the platform's own files are always kept, and
a core with no extra file reads only those.
> All
> Filter (with a keyboard)
[ ] mesen 1 file, 8.0 KB
[x] pcsx_rearmed 1 file, 4 B
All
None
Filter (with a keyboard)
[ ] mesen
[x] pcsx_rearmed
Done
@@ -723,8 +724,7 @@
A Tick all B Back X Tick
A Filter B Done
=== preview 80x24
RetroBIOS: Preview
@@ -890,11 +890,11 @@
BIOS folder:
/home/user/.config/retroarch/system
failed: scph5500.bin (HTTP 404)
Run it again to retry only those.
The files it replaced are kept in
/home/user/.config/retroarch/
retrobios-backup/2026-10-23_1200
Details: /tmp/retrobios-x/install.log
A Exit
=== result 40x15
RetroBIOS: Finished with errors
@@ -903,6 +903,7 @@
BIOS folder:
/home/user/.config/retroarch/system
failed: scph5500.bin (HTTP 404)
Run it again to retry only those.
The files it replaced are kept in
/home/user/.config/retroarch/
retrobios-backup/2026-10-23_1200
@@ -910,7 +911,6 @@
A Exit
=== result 80x24
RetroBIOS: Finished with errors
@@ -918,6 +918,7 @@
3 installed, 1 failed.
BIOS folder: /home/user/.config/retroarch/system
failed: scph5500.bin (HTTP 404)
Run it again to retry only those.
The files it replaced are kept in
/home/user/.config/retroarch/retrobios-backup/2026-10-23_1200
Details: /tmp/retrobios-x/install.log
@@ -935,7 +936,6 @@
A Exit
=== error 40x12
RetroBIOS: Something went wrong
+64 -64
View File
@@ -437,11 +437,11 @@
BIOS folder:
~/.config/retroarch/system
5 in place, 0 missing, 0 wrong copies
1 of the 0 wrong copies is replaced,
the old one kept in a backup folder.
Free space: 50.0 GB
> Close
Options
Enter Close Esc Back o Options
=== plan-in-place 40x15
RetroBIOS: RetroArch
@@ -450,14 +450,14 @@
BIOS folder:
~/.config/retroarch/system
5 in place, 0 missing, 0 wrong copies
1 of the 0 wrong copies is replaced,
the old one kept in a backup folder.
Free space: 50.0 GB
> Close
Options
Enter Close Esc Back o Options
=== plan-in-place 80x24
RetroBIOS: RetroArch
@@ -465,6 +465,7 @@
Everything is in place
BIOS folder: ~/.config/retroarch/system
5 in place, 0 missing, 0 wrong copies
1 of the 0 wrong copies is replaced, the old one kept in a backup folder.
Free space: 50.0 GB
> Close
@@ -482,47 +483,46 @@
Enter Close Esc Back o Options ? Help
=== systems 40x12
RetroBIOS: Choose systems
[x] nintendo-gba (gba) 16.0 KB
[x] sony-playstation 1.0 MB
> [ ] nintendo-famicom-disk in place
All
None
Filter (/ to type)
> [x] nintendo-gba (gba) 16.0 KB
[x] sony-playstation 1.0 MB
[ ] nintendo-famicom-disk in place
1-3 of 3
nintendo-famicom-disk (ファミコン): in
place
2 of 3 systems: 4 files, 1.0 MB
Enter Continue Esc Back Space Tick
Enter Tick Esc Done ? Help
=== systems 40x15
RetroBIOS: Choose systems
Filter (/ to type)
[x] nintendo-gba (gba) 16.0 KB
[x] sony-playstation 1.0 MB
> [ ] nintendo-famicom-disk in place
All
None
Filter (/ to type)
> [x] nintendo-gba (gba) 16.0 KB
[x] sony-playstation 1.0 MB
[ ] nintendo-famicom-disk in place
Done
nintendo-famicom-disk (ファミコン): in
place
2 of 3 systems: 4 files, 1.0 MB
Enter Continue Esc Back Space Tick
Enter Tick Esc Done ? Help
=== systems 80x24
RetroBIOS: Choose systems
Filter (/ to type)
[x] nintendo-gba (gba) 1 file, 16.0 KB
[x] sony-playstation 3 files, 1.0 MB
> [ ] nintendo-famicom-disk (ファミコン) in place
All
None
Filter (/ to type)
> [x] nintendo-gba (gba) 1 file, 16.0 KB
[x] sony-playstation 3 files, 1.0 MB
[ ] nintendo-famicom-disk (ファミコン) in place
Done
@@ -537,7 +537,7 @@
2 of 3 systems: 4 files, 1.0 MB
Enter Continue Esc Back Space Tick ? Help
Enter Tick Esc Done ? Help
=== options 40x12
RetroBIOS: Options
@@ -603,7 +603,7 @@
> [1] North America
[ ] Japan
1-2 of 2
Enter Tick Esc Done <> Order ? Help
=== regions 40x15
RetroBIOS: Preferred regions
@@ -616,8 +616,8 @@
> [1] North America
[ ] Japan
None
Done
Enter Tick Esc Done <> Order ? Help
@@ -630,8 +630,8 @@
> [1] North America
[ ] Japan
None
Done
@@ -649,43 +649,44 @@
=== cores 40x12
RetroBIOS: Cores
Every core ticked keeps every core's
files. Untick the cores you do not
use: the platform's own files are
always kept.
> All
None
Filter (/ to type)
[ ] mesen
[x] pcsx_rearmed
Enter Tick all Esc Back Space Tick
Untick the cores you do not use: the
platform's own files are always
kept, and a core with no extra file
reads only those.
> Filter (/ to type)
[ ] mesen 1 file, 8.0 KB
[x] pcsx_rearmed 1 file, 4 B
1-2 of 2
Enter Filter Esc Done ? Help
=== cores 40x15
RetroBIOS: Cores
Every core ticked keeps every core's
files. Untick the cores you do not
use: the platform's own files are
always kept.
Untick the cores you do not use: the
platform's own files are always
kept, and a core with no extra file
reads only those.
> All
> Filter (/ to type)
[ ] mesen 1 file, 8.0 KB
[x] pcsx_rearmed 1 file, 4 B
All
None
Filter (/ to type)
[ ] mesen
[x] pcsx_rearmed
Done
Enter Tick all Esc Back Space Tick
Enter Filter Esc Done ? Help
=== cores 80x24
RetroBIOS: Cores
Every core ticked keeps every core's files. Untick the cores you do not use:
the platform's own files are always kept.
Untick the cores you do not use: the platform's own files are always kept, and
a core with no extra file reads only those.
> All
> Filter (/ to type)
[ ] mesen 1 file, 8.0 KB
[x] pcsx_rearmed 1 file, 4 B
All
None
Filter (/ to type)
[ ] mesen
[x] pcsx_rearmed
Done
@@ -698,8 +699,7 @@
Enter Tick all Esc Back Space Tick ? Help
Enter Filter Esc Done ? Help
=== preview 40x12
RetroBIOS: Preview
@@ -923,11 +923,11 @@
BIOS folder:
/home/user/.config/retroarch/system
failed: scph5500.bin (HTTP 404)
Run it again to retry only those.
The files it replaced are kept in
/home/user/.config/retroarch/
retrobios-backup/2026-10-23_1200
To put them back: python3 install.py \
1-8 of 16
1-8 of 17
Enter Exit ^v Scroll
=== result 40x15
RetroBIOS: Finished with errors
@@ -936,14 +936,14 @@
BIOS folder:
/home/user/.config/retroarch/system
failed: scph5500.bin (HTTP 404)
Run it again to retry only those.
The files it replaced are kept in
/home/user/.config/retroarch/
retrobios-backup/2026-10-23_1200
To put them back: python3 install.py \
--restore .../2026-10-23_1200
Shortened to fit this window.
Same choice without questions:
1-11 of 16
1-11 of 17
Enter Exit ^v Scroll
=== result 80x24
RetroBIOS: Finished with errors
@@ -951,6 +951,7 @@
3 installed, 1 failed.
BIOS folder: /home/user/.config/retroarch/system
failed: scph5500.bin (HTTP 404)
Run it again to retry only those.
The files it replaced are kept in
/home/user/.config/retroarch/retrobios-backup/2026-10-23_1200
To put them back: python3 install.py \
@@ -968,7 +969,6 @@
Enter Exit
=== error 40x12
RetroBIOS: Something went wrong
+62 -62
View File
@@ -491,11 +491,11 @@
BIOS folder:
~/.config/retroarch/system
5 in place, 0 missing, 0 wrong copies
1 of the 0 wrong copies is replaced,
the old one kept in a backup folder.
Free space: 50.0 GB
> Close
Options
A Close R2 Back L2 Options
=== plan-in-place 40x15
RetroBIOS: RetroArch
@@ -504,14 +504,14 @@
BIOS folder:
~/.config/retroarch/system
5 in place, 0 missing, 0 wrong copies
1 of the 0 wrong copies is replaced,
the old one kept in a backup folder.
Free space: 50.0 GB
> Close
Options
A Close R2 Back L2 Options
=== plan-in-place 80x24
RetroBIOS: RetroArch
@@ -519,6 +519,7 @@
Everything is in place
BIOS folder: ~/.config/retroarch/system
5 in place, 0 missing, 0 wrong copies
1 of the 0 wrong copies is replaced, the old one kept in a backup folder.
Free space: 50.0 GB
> Close
@@ -536,47 +537,46 @@
A Close R2 Back L2 Options
=== systems 40x12
RetroBIOS: Choose systems
[x] nintendo-gba (gba) 16.0 KB
[x] sony-playstation 1.0 MB
> [ ] nintendo-famicom-disk in place
All
None
Filter (with a keyboard)
> [x] nintendo-gba (gba) 16.0 KB
[x] sony-playstation 1.0 MB
[ ] nintendo-famicom-disk in place
1-3 of 3
nintendo-famicom-disk (ファミコン): in
place
2 of 3 systems: 4 files, 1.0 MB
Start Continue A Tick R2 Back
A Tick R2 Done
=== systems 40x15
RetroBIOS: Choose systems
Filter (with a keyboard)
[x] nintendo-gba (gba) 16.0 KB
[x] sony-playstation 1.0 MB
> [ ] nintendo-famicom-disk in place
All
None
Filter (with a keyboard)
> [x] nintendo-gba (gba) 16.0 KB
[x] sony-playstation 1.0 MB
[ ] nintendo-famicom-disk in place
Done
nintendo-famicom-disk (ファミコン): in
place
2 of 3 systems: 4 files, 1.0 MB
Start Continue A Tick R2 Back
A Tick R2 Done
=== systems 80x24
RetroBIOS: Choose systems
Filter (with a keyboard)
[x] nintendo-gba (gba) 1 file, 16.0 KB
[x] sony-playstation 3 files, 1.0 MB
> [ ] nintendo-famicom-disk (ファミコン) in place
All
None
Filter (with a keyboard)
> [x] nintendo-gba (gba) 1 file, 16.0 KB
[x] sony-playstation 3 files, 1.0 MB
[ ] nintendo-famicom-disk (ファミコン) in place
Done
@@ -591,7 +591,7 @@
2 of 3 systems: 4 files, 1.0 MB
Start Continue A Tick R2 Back
A Tick R2 Done
=== options 40x12
RetroBIOS: Options
@@ -657,7 +657,7 @@
> [1] North America
[ ] Japan
1-2 of 2
A Tick R2 Done <> Order
=== regions 40x15
RetroBIOS: Preferred regions
@@ -670,8 +670,8 @@
> [1] North America
[ ] Japan
None
Done
A Tick R2 Done <> Order
@@ -684,8 +684,8 @@
> [1] North America
[ ] Japan
None
Done
@@ -703,43 +703,44 @@
=== cores 40x12
RetroBIOS: Cores
Every core ticked keeps every core's
files. Untick the cores you do not
use: the platform's own files are
always kept.
> All
None
Filter (with a keyboard)
[ ] mesen
[x] pcsx_rearmed
A Tick all R2 Back
Untick the cores you do not use: the
platform's own files are always
kept, and a core with no extra file
reads only those.
> Filter (with a keyboard)
[ ] mesen 1 file, 8.0 KB
[x] pcsx_rearmed 1 file, 4 B
1-2 of 2
A Filter R2 Done
=== cores 40x15
RetroBIOS: Cores
Every core ticked keeps every core's
files. Untick the cores you do not
use: the platform's own files are
always kept.
Untick the cores you do not use: the
platform's own files are always
kept, and a core with no extra file
reads only those.
> All
> Filter (with a keyboard)
[ ] mesen 1 file, 8.0 KB
[x] pcsx_rearmed 1 file, 4 B
All
None
Filter (with a keyboard)
[ ] mesen
[x] pcsx_rearmed
Done
A Tick all R2 Back
A Filter R2 Done
=== cores 80x24
RetroBIOS: Cores
Every core ticked keeps every core's files. Untick the cores you do not use:
the platform's own files are always kept.
Untick the cores you do not use: the platform's own files are always kept, and
a core with no extra file reads only those.
> All
> Filter (with a keyboard)
[ ] mesen 1 file, 8.0 KB
[x] pcsx_rearmed 1 file, 4 B
All
None
Filter (with a keyboard)
[ ] mesen
[x] pcsx_rearmed
Done
@@ -752,8 +753,7 @@
A Tick all R2 Back
A Filter R2 Done
=== preview 80x24
RetroBIOS: Preview
@@ -919,11 +919,11 @@
BIOS folder:
/home/user/.config/retroarch/system
failed: scph5500.bin (HTTP 404)
Run it again to retry only those.
The files it replaced are kept in
/home/user/.config/retroarch/
retrobios-backup/2026-10-23_1200
Details: /tmp/retrobios-x/install.log
A Exit
=== result 40x15
RetroBIOS: Finished with errors
@@ -932,6 +932,7 @@
BIOS folder:
/home/user/.config/retroarch/system
failed: scph5500.bin (HTTP 404)
Run it again to retry only those.
The files it replaced are kept in
/home/user/.config/retroarch/
retrobios-backup/2026-10-23_1200
@@ -939,7 +940,6 @@
A Exit
=== result 80x24
RetroBIOS: Finished with errors
@@ -947,6 +947,7 @@
3 installed, 1 failed.
BIOS folder: /home/user/.config/retroarch/system
failed: scph5500.bin (HTTP 404)
Run it again to retry only those.
The files it replaced are kept in
/home/user/.config/retroarch/retrobios-backup/2026-10-23_1200
Details: /tmp/retrobios-x/install.log
@@ -964,7 +965,6 @@
A Exit
=== error 40x12
RetroBIOS: Something went wrong
+62 -62
View File
@@ -491,11 +491,11 @@
BIOS folder:
~/.config/retroarch/system
5 in place, 0 missing, 0 wrong copies
1 of the 0 wrong copies is replaced,
the old one kept in a backup folder.
Free space: 50.0 GB
> Close
Options
Start Close B Back
=== plan-in-place 40x15
RetroBIOS: RetroArch
@@ -504,14 +504,14 @@
BIOS folder:
~/.config/retroarch/system
5 in place, 0 missing, 0 wrong copies
1 of the 0 wrong copies is replaced,
the old one kept in a backup folder.
Free space: 50.0 GB
> Close
Options
Start Close B Back
=== plan-in-place 80x24
RetroBIOS: RetroArch
@@ -519,6 +519,7 @@
Everything is in place
BIOS folder: ~/.config/retroarch/system
5 in place, 0 missing, 0 wrong copies
1 of the 0 wrong copies is replaced, the old one kept in a backup folder.
Free space: 50.0 GB
> Close
@@ -536,47 +537,46 @@
Start Close B Back
=== systems 40x12
RetroBIOS: Choose systems
[x] nintendo-gba (gba) 16.0 KB
[x] sony-playstation 1.0 MB
> [ ] nintendo-famicom-disk in place
All
None
Filter (Select shows a keyboard)
> [x] nintendo-gba (gba) 16.0 KB
[x] sony-playstation 1.0 MB
[ ] nintendo-famicom-disk in place
1-3 of 3
nintendo-famicom-disk (ファミコン): in
place
2 of 3 systems: 4 files, 1.0 MB
Start Continue B Back Y Tick
Start Tick B Done
=== systems 40x15
RetroBIOS: Choose systems
Filter (Select shows a keyboard)
[x] nintendo-gba (gba) 16.0 KB
[x] sony-playstation 1.0 MB
> [ ] nintendo-famicom-disk in place
All
None
Filter (Select shows a keyboard)
> [x] nintendo-gba (gba) 16.0 KB
[x] sony-playstation 1.0 MB
[ ] nintendo-famicom-disk in place
Done
nintendo-famicom-disk (ファミコン): in
place
2 of 3 systems: 4 files, 1.0 MB
Start Continue B Back Y Tick
Start Tick B Done
=== systems 80x24
RetroBIOS: Choose systems
Filter (Select shows a keyboard)
[x] nintendo-gba (gba) 1 file, 16.0 KB
[x] sony-playstation 3 files, 1.0 MB
> [ ] nintendo-famicom-disk (ファミコン) in place
All
None
Filter (Select shows a keyboard)
> [x] nintendo-gba (gba) 1 file, 16.0 KB
[x] sony-playstation 3 files, 1.0 MB
[ ] nintendo-famicom-disk (ファミコン) in place
Done
@@ -591,7 +591,7 @@
2 of 3 systems: 4 files, 1.0 MB
Start Continue B Back Y Tick
Start Tick B Done
=== options 40x12
RetroBIOS: Options
@@ -657,7 +657,7 @@
> [1] North America
[ ] Japan
1-2 of 2
Start Tick B Done <> Order
=== regions 40x15
RetroBIOS: Preferred regions
@@ -670,8 +670,8 @@
> [1] North America
[ ] Japan
None
Done
Start Tick B Done <> Order
@@ -684,8 +684,8 @@
> [1] North America
[ ] Japan
None
Done
@@ -703,43 +703,44 @@
=== cores 40x12
RetroBIOS: Cores
Every core ticked keeps every core's
files. Untick the cores you do not
use: the platform's own files are
always kept.
> All
None
Filter (Select shows a keyboard)
[ ] mesen
[x] pcsx_rearmed
Start Tick all B Back Y Tick
Untick the cores you do not use: the
platform's own files are always
kept, and a core with no extra file
reads only those.
> Filter (Select shows a keyboard)
[ ] mesen 1 file, 8.0 KB
[x] pcsx_rearmed 1 file, 4 B
1-2 of 2
Start Filter B Done
=== cores 40x15
RetroBIOS: Cores
Every core ticked keeps every core's
files. Untick the cores you do not
use: the platform's own files are
always kept.
Untick the cores you do not use: the
platform's own files are always
kept, and a core with no extra file
reads only those.
> All
> Filter (Select shows a keyboard)
[ ] mesen 1 file, 8.0 KB
[x] pcsx_rearmed 1 file, 4 B
All
None
Filter (Select shows a keyboard)
[ ] mesen
[x] pcsx_rearmed
Done
Start Tick all B Back Y Tick
Start Filter B Done
=== cores 80x24
RetroBIOS: Cores
Every core ticked keeps every core's files. Untick the cores you do not use:
the platform's own files are always kept.
Untick the cores you do not use: the platform's own files are always kept, and
a core with no extra file reads only those.
> All
> Filter (Select shows a keyboard)
[ ] mesen 1 file, 8.0 KB
[x] pcsx_rearmed 1 file, 4 B
All
None
Filter (Select shows a keyboard)
[ ] mesen
[x] pcsx_rearmed
Done
@@ -752,8 +753,7 @@
Start Tick all B Back Y Tick
Start Filter B Done
=== preview 40x12
RetroBIOS: Preview
@@ -977,11 +977,11 @@
BIOS folder:
/home/user/.config/retroarch/system
failed: scph5500.bin (HTTP 404)
Run it again to retry only those.
The files it replaced are kept in
/home/user/.config/retroarch/
retrobios-backup/2026-10-23_1200
Details: /tmp/retrobios-x/install.log
Start Exit
=== result 40x15
RetroBIOS: Finished with errors
@@ -990,6 +990,7 @@
BIOS folder:
/home/user/.config/retroarch/system
failed: scph5500.bin (HTTP 404)
Run it again to retry only those.
The files it replaced are kept in
/home/user/.config/retroarch/
retrobios-backup/2026-10-23_1200
@@ -997,7 +998,6 @@
Start Exit
=== result 80x24
RetroBIOS: Finished with errors
@@ -1005,6 +1005,7 @@
3 installed, 1 failed.
BIOS folder: /home/user/.config/retroarch/system
failed: scph5500.bin (HTTP 404)
Run it again to retry only those.
The files it replaced are kept in
/home/user/.config/retroarch/retrobios-backup/2026-10-23_1200
Details: /tmp/retrobios-x/install.log
@@ -1022,7 +1023,6 @@
Start Exit
=== error 40x12
RetroBIOS: Something went wrong
+6 -6
View File
@@ -1,12 +1,12 @@
RetroBIOS: Choose systems
Filter (/ to type)
[x] nintendo-gba (gba) 1 file, 16.0 KB
[x] sony-playstation 3 files, 1.0 MB
> [ ] nintendo-famicom-disk (ファミコン) in place
All
None
Filter (/ to type)
> [x] nintendo-gba (gba) 1 file, 16.0 KB
[x] sony-playstation 3 files, 1.0 MB
[ ] nintendo-famicom-disk (ファミコン) in place
Done
@@ -37,4 +37,4 @@
2 of 3 systems: 4 files, 1.0 MB
A/Enter Continue B/Esc Back X/Space Tick ? Help
A/Enter Tick B/Esc Done ? Help
+7 -7
View File
@@ -1,12 +1,12 @@
RetroBIOS: Choose systems
[x] nintendo-gba (gba) 16.0 KB
[x] sony-playstation 1.0 MB
> [ ] nintendo-famicom-disk in place
All
None
Filter (/ to type)
> [x] nintendo-gba (gba) 16.0 KB
[x] sony-playstation 1.0 MB
[ ] nintendo-famicom-disk in place
1-3 of 3
nintendo-famicom-disk (ファミコン): in
place
2 of 3 systems: 4 files, 1.0 MB
A Continue B Back X Tick ? Help
A Tick B Done ? Help
+8 -8
View File
@@ -1,15 +1,15 @@
RetroBIOS: Choose systems
Filter (/ to type)
[x] nintendo-gba (gba) 16.0 KB
[x] sony-playstation 1.0 MB
> [ ] nintendo-famicom-disk in place
All
None
Filter (/ to type)
> [x] nintendo-gba (gba) 16.0 KB
[x] sony-playstation 1.0 MB
[ ] nintendo-famicom-disk in place
Done
nintendo-famicom-disk (ファミコン): in
place
2 of 3 systems: 4 files, 1.0 MB
A Continue B Back X Tick ? Help
A Tick B Done ? Help
+6 -6
View File
@@ -1,12 +1,12 @@
RetroBIOS: Choose systems
Filter (/ to type)
[x] nintendo-gba (gba) 1 file, 16.0 KB
[x] sony-playstation 3 files, 1.0 MB
> [ ] nintendo-famicom-disk (ファミコン) in place
All
None
Filter (/ to type)
> [x] nintendo-gba (gba) 1 file, 16.0 KB
[x] sony-playstation 3 files, 1.0 MB
[ ] nintendo-famicom-disk (ファミコン) in place
Done
@@ -21,4 +21,4 @@
2 of 3 systems: 4 files, 1.0 MB
A/Enter Continue B/Esc Back X/Space Tick ? Help
A/Enter Tick B/Esc Done ? Help
+33
View File
@@ -0,0 +1,33 @@
"""The guard a test module turns on for itself and the Python it starts
(sitecustomize). module_guard() gives the setUpModule and tearDownModule
pair: the module fails at its end when anything tried to leave the loopback."""
from __future__ import annotations
import os
from pathlib import Path
from typing import Callable
from .sitecustomize import disable, enable, refused
__all__ = ["module_guard", "enable", "disable", "refused"]
def module_guard(name: str) -> tuple[Callable[[], None], Callable[[], None]]:
log = Path(__file__).resolve().parents[2] / "tmp" / "tests" / f"netlog-{name}-{os.getpid()}"
state: dict = {}
def set_up() -> None:
log.parent.mkdir(parents=True, exist_ok=True)
state["before"] = enable(str(log))
def tear_down() -> None:
disable(state.pop("before", {}))
tried = refused(str(log))
log.unlink(missing_ok=True)
if tried:
raise AssertionError(
f"{len(tried)} connections off the loopback during {name} (pid host): "
+ ", ".join(tried[:10]))
return set_up, tear_down
+135
View File
@@ -0,0 +1,135 @@
"""The machine running the installer tests, kept out of them.
Python imports this module at start in every process a test starts with
tests/netguard on PYTHONPATH (enable), and the test module
calls guard() for its own process. Two things the host has never reach a
test: a connection off the loopback, which is refused (OSError, as a network
that is down) and written to RETROBIOS_TEST_NETLOG, and the cards and drives
mounted under /media, /run/media, /mnt and /Volumes, which read as folders
no drive is mounted on. A test module passed on a machine with no network
and no card, and failed with an AmberELEC card in the reader, while 261
connections to GitHub left the module in a run (code_audit_24 P3-13).
"""
from __future__ import annotations
import errno
import os
import socket
import sys
LOOPBACK = frozenset({"127.0.0.1", "::1", "localhost", "0.0.0.0", ""})
MOUNT_ROOTS = ("/media", "/run/media", "/mnt", "/Volumes")
NETLOG = "RETROBIOS_TEST_NETLOG"
# What guard() replaced, for unguard().
_SAVED: dict = {}
def _refuse(host: object) -> None:
where = os.environ.get(NETLOG)
# A name under .invalid never resolves (RFC 2606): a test names one to
# fail on purpose, refused here before its DNS query leaves.
if where and not str(host).endswith(".invalid"):
with open(where, "a", encoding="utf-8") as log:
log.write(f"{os.getpid()} {host} {' '.join(sys.argv)[:300]}\n")
raise OSError(errno.ENETUNREACH, f"a test makes no request to {host}")
def guard() -> None:
"""Refuse every connection off the loopback, hide the host's mounts."""
if _SAVED:
return
_SAVED.update(connect=socket.socket.__dict__.get("connect"),
connect_ex=socket.socket.__dict__.get("connect_ex"),
getaddrinfo=socket.getaddrinfo, ismount=os.path.ismount)
connect = socket.socket.connect
connect_ex = socket.socket.connect_ex
getaddrinfo = socket.getaddrinfo
def host_of(address: object) -> object:
return address[0] if isinstance(address, tuple) and address else None
def checked(sock: socket.socket, address: object) -> None:
if sock.family in (socket.AF_INET, socket.AF_INET6) and \
host_of(address) not in LOOPBACK:
_refuse(host_of(address))
def guarded_connect(self: socket.socket, address: object) -> None:
checked(self, address)
return connect(self, address)
def guarded_connect_ex(self: socket.socket, address: object) -> int:
checked(self, address)
return connect_ex(self, address)
def guarded_getaddrinfo(host: object, *args: object, **kwargs: object) -> list:
if host is not None and str(host) not in LOOPBACK:
_refuse(host)
return getaddrinfo(host, *args, **kwargs)
socket.socket.connect = guarded_connect # type: ignore[method-assign]
socket.socket.connect_ex = guarded_connect_ex # type: ignore[method-assign]
socket.getaddrinfo = guarded_getaddrinfo # type: ignore[assignment]
ismount = os.path.ismount
def guarded_ismount(path: object) -> bool:
text = os.fspath(path) if not isinstance(path, str) else path
if isinstance(text, bytes):
text = text.decode(errors="replace")
if any(text == root or text.startswith(root + "/") for root in MOUNT_ROOTS):
return False
return ismount(path)
os.path.ismount = guarded_ismount # type: ignore[assignment]
def unguard() -> None:
"""The process as it was before guard()."""
if not _SAVED:
return
for name in ("connect", "connect_ex"):
if _SAVED[name] is None:
delattr(socket.socket, name)
else:
setattr(socket.socket, name, _SAVED[name])
socket.getaddrinfo = _SAVED["getaddrinfo"]
os.path.ismount = _SAVED["ismount"]
_SAVED.clear()
def enable(log: str) -> dict:
"""Guard this process and every Python it starts, the refusals written
to log. Returns the variables it changed, for disable()."""
before = {name: os.environ.get(name) for name in ("PYTHONPATH", NETLOG)}
here = os.path.dirname(os.path.abspath(__file__))
paths = [here, *[p for p in os.environ.get("PYTHONPATH", "").split(os.pathsep) if p]]
os.environ["PYTHONPATH"] = os.pathsep.join(dict.fromkeys(paths))
os.environ[NETLOG] = log
with open(log, "w", encoding="utf-8"):
pass
guard()
return before
def disable(before: dict) -> None:
"""This process and the Python it starts as before enable()."""
unguard()
for name, value in before.items():
if value is None:
os.environ.pop(name, None)
else:
os.environ[name] = value
def refused(log: str) -> list[str]:
"""The connections refused since enable(log), one line each."""
try:
with open(log, encoding="utf-8") as text:
return [line.strip() for line in text if line.strip()]
except OSError:
return []
if os.environ.get(NETLOG):
guard()
+53
View File
@@ -175,6 +175,59 @@ class InstallerOutputExample(unittest.TestCase):
self.assertLessEqual(abs(added - float(total) * units[unit]), 0.15 * units[unit])
class InstallerSamplesSayWhatTheCodePrints(unittest.TestCase):
"""code_audit_24 P3-8 to P3-12: samples typed by hand outside the
generated blocks, a sentence on a log read as the terminal's, pages that
described the generator as tables alone, and a sandbox that asked DNS."""
def test_the_refused_and_from_samples_are_generated(self):
import install
page = _page("installer.md")
refused = _generated(page, "check-refused")
self.assertRegex(refused, r"\n \d+ files? [a-z ]+:\n")
self.assertIn("read by beetle_psx, pcsx_rearmed at", refused)
self.assertNotRegex(page, r"opened at /\S+ by ")
self.assertIn('"read by ', inspect.getsource(install.opened_line))
ending = _generated(page, "from-run")
self.assertRegex(ending, r"Done\. \d+ files installed\.\n \d+ files copied from ")
self.assertNotIn("a line under\n`Done`", page)
self.assertNotIn("38 files copied from E:\\, 4 downloaded", page)
def test_one_line_per_file_is_said_of_a_log(self):
page = _page("installer.md")
at = page.index("<!-- generated: run-download -->")
before = page[page.rindex("\n\n", 0, at - 2):at]
self.assertIn("At a terminal one progress line", before)
self.assertIn("A pipe or a log gets one line per file", before)
def test_the_generator_pages_name_the_run_samples_and_step_7(self):
tools = _page("tools.md")
row = next(line for line in tools.splitlines()
if line.startswith("| `generate_installer_doc.py`"))
self.assertIn("run samples", row)
self.assertIn("generate_installer_doc.py", next(
line for line in tools.splitlines() if line.startswith("| 7 |")))
self.assertIn("run samples", _page("installer.md").split(
"The tables of options, events, exit codes, keys and card markers", 1)[1][:600])
self.assertIn("generate_installer_doc.py", next(
line for line in _page("adding-a-platform.md").splitlines()
if line.startswith("7. ")))
def test_the_sandbox_looks_nothing_up(self):
import socket
from unittest import mock
import generate_installer_doc
def no_lookup(*_args: object) -> str:
raise AssertionError("the sandbox asked for a name")
with mock.patch.object(socket, "getfqdn", no_lookup), \
generate_installer_doc.Sandbox() as box:
self.assertEqual(box.server.server_name, "127.0.0.1")
class OneResolutionChain(unittest.TestCase):
"""architecture.md drew path_suffix as the first step, before SHA1, while
the code and verification-modes.md try it after every hash."""
+34 -6
View File
@@ -10,6 +10,7 @@ import io
import json
import os
import stat
import select
import shlex
import re
import shutil
@@ -31,6 +32,13 @@ _spec = importlib.util.spec_from_file_location("install", REPO_ROOT / "install.p
install = importlib.util.module_from_spec(_spec)
_spec.loader.exec_module(install)
sys.path.insert(0, str(REPO_ROOT / "tests"))
from netguard import module_guard # noqa: E402
# No connection off the loopback and no card of the host reaches a test
# (code_audit_24 P3-13): the module fails at its end otherwise.
setUpModule, tearDownModule = module_guard("test_install")
def _tempdir(test: unittest.TestCase) -> str:
"""A scratch directory under the repository's tmp/, removed after the test.
@@ -4175,17 +4183,35 @@ class AQuestionLeftWithCtrlDOrCtrlCIsAStop(unittest.TestCase):
home = Path(_tempdir(self))
master, slave = pty.openpty()
# Its output on the terminal too: piped, nothing is asked, and the
# test skipped on every machine.
proc = subprocess.Popen(
[sys.executable, "install.py"], cwd=REPO_ROOT, stdin=slave,
stdout=subprocess.PIPE, stderr=subprocess.STDOUT, text=True,
env={**os.environ, "HOME": str(home), "RETROBIOS_OS": "linux"},
[sys.executable, "install.py", "--plain"], cwd=REPO_ROOT, stdin=slave,
stdout=slave, stderr=slave,
# No request leaves the machine: the standalone emulators' lists
# come from the network (code_audit_24 P3-13).
env={**os.environ, "HOME": str(home), "RETROBIOS_OS": "linux",
"RETROBIOS_INSTALL_OFFLINE": "1"},
)
os.close(slave)
self.addCleanup(os.close, master)
time.sleep(3)
out = ""
deadline = time.monotonic() + 60
while "Which setup?" not in out and proc.poll() is None \
and time.monotonic() < deadline:
if select.select([master], [], [], 0.2)[0]:
out += os.read(master, 65536).decode("utf-8", "replace")
os.write(master, b"\x04")
out, _ = proc.communicate(timeout=60)
if "Choose the platform" not in out:
proc.wait(timeout=60)
while select.select([master], [], [], 0.2)[0]:
try:
chunk = os.read(master, 65536)
except OSError:
break
if not chunk:
break
out += chunk.decode("utf-8", "replace")
if "Which setup?" not in out:
self.skipTest("a platform was detected on this machine")
self.assertEqual(proc.returncode, 130, out)
self.assertIn("Stopped", out)
@@ -5204,6 +5230,8 @@ class EventsDescribeTheRun(unittest.TestCase, _SyntheticTree):
# The systems Choose systems lists, before the files are read.
{"event": "choices", "platform": "retroarch",
"systems": ["sys-a", "sys-b", "other"]},
# Nothing set aside before the choice (code_audit_24 P3-3).
{"event": "set_aside", "platform": "retroarch", "dests": []},
# a.bin and b.bin are in place: the first read and the last.
{"event": "checking", "files_done": 1, "files_total": 2},
{"event": "checking", "files_done": 2, "files_total": 2},
+4 -2
View File
@@ -1632,10 +1632,12 @@ class SomethingElseAtADestination(unittest.TestCase):
proc = repo.run("--yes")
self.assertEqual(proc.returncode, 1, proc.stderr)
self.assertNotIn("Traceback", proc.stderr)
self.assertIn("failed: scph5500.bin (a folder sits where this file goes",
# Each failure named once, on its FAILED line (tui_audit_17 P3-7).
self.assertIn("FAILED scph5500.bin (a folder sits where this file goes",
proc.stdout)
self.assertIn("failed: scph5501.bin (file in place could not be kept aside",
self.assertIn("FAILED scph5501.bin (file in place could not be kept aside",
proc.stdout)
self.assertEqual(proc.stdout.count("scph5500.bin ("), 1, proc.stdout)
self.assertTrue((repo.dest / "scph5500.bin").is_dir())
self.assertIn("gba_bios.bin", repo.installed())
+685 -165
View File
File diff suppressed because it is too large. Load diff
+3 -1
View File
@@ -160,7 +160,9 @@ class SetupPagesOfferPartOfThePack(unittest.TestCase):
self.assertIn(f"/retrobios/which-pack/?platform={key}#only-some-consoles", text)
# The screen's own row: the line menu's c is not what the
# one-liner opens.
self.assertIn("or choose **Choose systems** in the command.", text)
self.assertIn("or the command's **Choose systems**.", text)
# Never "choose **Choose systems**" (tui_audit_17 P3-9).
self.assertNotIn("choose **Choose systems**", text)
def test_the_anchor_exists(self):
self.assertIn("## Only some consoles?", _page("which-pack.md"))
+1
View File
@@ -279,6 +279,7 @@ class EveryTestDependencyIsInstalledInCi(unittest.TestCase):
{p.stem for p in (root / "scripts").rglob("*.py")}
| {p.name for p in (root / "scripts").iterdir() if p.is_dir()}
| {p.stem for p in (root / "tests").glob("*.py")}
| {p.name for p in (root / "tests").iterdir() if p.is_dir()}
| {"scripts", "tests", "install"}
)
imported: set[str] = set()
+1 -1
View File
@@ -675,7 +675,7 @@ This executes in sequence:
4. `generate_pack.py --all` - build ZIP packs + install and target manifests
5. Consistency check: verify and the pack agree on counts and on the paths each archive holds
6. Pack integrity - extract ZIPs and verify hashes per platform mode
7. `generate_readme.py` - regenerate README and CONTRIBUTING
7. `generate_readme.py` - regenerate README and CONTRIBUTING, then `generate_installer_doc.py` rewrites the tables and run samples of `wiki/installer.md` from the new lists
8. `generate_site.py` - regenerate the documentation site and its navigation
A new platform is archived-by-default nowhere: `status: active` puts it in
+41 -19
View File
@@ -480,7 +480,9 @@ On a first install nothing is in place. On a later run the line counts what
is already there, and only the rest is downloaded. A download of 1 GB or more
is confirmed first, the size and the folder in the question.
The second phase downloads what is missing, one line per file:
The second phase downloads what is missing. At a terminal one progress line
moves with the count and the size. A pipe or a log gets one line per file,
as the log of the run below:
<!-- generated: run-download -->
@@ -525,9 +527,10 @@ RetroArch with `--system sony-playstation`, from the list of 2026-10-27:
`--dry-run` prints the same line under its plan.
When some files came from this machine rather than the network, a line under
`Done` says where each came from (`38 files copied from E:\, 3 copied from
the wrong place in the BIOS folder, 4 downloaded.`). See
When some files came from this machine rather than the network, the run says
where each came from: on the `Done` line when all came from one place
(`Done. 22 files copied from /home/me/old.`), on a line under it otherwise
(`2 files copied from /home/me/old, 2 downloaded.`). See
[Copy from an old card](#copy-from-an-old-card).
The word `Done` and the BIOS folder are the confirmation. Any other ending
@@ -565,20 +568,27 @@ replaces it and keeps the old one, see
### Why a file is refused { #why-a-file-is-refused }
Each file `--check` flags comes with the reason it found and the place each
core opens it:
core reads it. A RetroArch folder holding a copy of each kind, checked
against a list of four files:
<!-- generated: check-refused -->
```
3 files to download:
2 of these files are in the BIOS folder in the wrong place: a run without --check copies them where the cores open them, and leaves your copies as they are.
wrong copy: scph5501.bin
another region: the contents of scph5500.bin (japan)
opened at /home/me/.config/retroarch/system/scph5501.bin by beetle_psx, pcsx_rearmed
read by beetle_psx, pcsx_rearmed at /home/me/.config/retroarch/system/scph5501.bin
missing: gba_bios.bin
nested folder: it is at system/system/gba_bios.bin, a system folder inside system
opened at /home/me/.config/retroarch/system/gba_bios.bin by mgba
a run without --check copies it into place
read by mgba at /home/me/.config/retroarch/system/gba_bios.bin
missing: pcsx/extra.bin
still zipped: it is inside PSX BIOS.zip
opened at /home/me/.config/retroarch/system/pcsx/extra.bin by pcsx_rearmed
a run without --check copies it into place
read by pcsx_rearmed at /home/me/.config/retroarch/system/pcsx/extra.bin
```
<!-- /generated: check-refused -->
| Reason | What the folder holds |
|--------|-----------------------|
@@ -699,12 +709,15 @@ other contents is kept aside first, as a download would replace it (see
[Files you already had](#files-you-already-had)). What no folder holds is
downloaded as usual, or taken from the pack with `--from-pack`. Several
`--from` are read in the order given, and the end of the run says where each
file came from:
file came from. A run of a list of four files, two of them in `old`:
<!-- generated: from-run -->
```
Done. 44 files installed.
38 files copied from E:\, 4 downloaded, 2 still missing.
Done. 4 files installed.
2 files copied from /home/me/old, 2 downloaded.
```
<!-- /generated: from-run -->
`--check --from FOLDER` writes nothing and says how many files the folder
would give (`E:\ holds 38 of these files: a run without --check copies
@@ -1056,6 +1069,8 @@ gives for the device, below the card's root instead of its mount point:
| `.tmp_update/onionVersion/version.txt` | Onion | `BIOS`, RetroArch's list |
| `.allium/` | Allium | `BIOS`, RetroArch's list |
| `Koriki/version.txt` | Koriki | `BIOS`, RetroArch's list |
| `bgmusic/` beside `bios/`, on a drive that is not a fixed disk | ArkOS | `bios`, RetroArch's list |
| `launchimages/` beside `bios/`, on a drive that is not a fixed disk | ArkOS | `bios`, RetroArch's list |
| `gamedata/`, `homebrew/` beside `bios/`, on a drive that is not a fixed disk | AmberELEC | `bios`, AmberELEC's list |
| `bezels/default.cfg` beside `bios/`, on a drive that is not a fixed disk | EmuELEC | `bios`, EmuELEC's list |
| `system/batocera.conf` holding `system.hostname=BATOCERA` or no hostname line, and no KNULLI file above | Batocera SHARE drive | `bios`, Batocera's list |
@@ -1635,14 +1650,20 @@ The build scripts need 3.9 and are not bound by this.
Every change to `install.py` recomputes the SHA-256 pinned in `install.sh` and
`install.ps1` in the same commit. The tests compare the pins with the file.
The tables of options, events, exit codes and keys on this page sit between
`generated` markers and are written from `install.py` by
`scripts/generate_installer_doc.py`: the options from its parser, the events
from `EVENT_KEYS`, the codes from its `sys.exit` calls, the keys from
`TUI_ROUTES`. The prose cells stay as written. A row the code gains stops the
script until its text is added inside the markers, and `--check`, which a
test runs, fails on a table behind the code. `--page FILE` renders another
copy of the page, which the tests use.
The tables of options, events, exit codes, keys and card markers, the line
menu and the run samples on this page sit between `generated` markers and are
written from `install.py` by `scripts/generate_installer_doc.py`: the options
from its parser, the events from `EVENT_KEYS`, the codes from its `sys.exit`
calls, the keys from `TUI_ROUTES`, the card markers from its card rules. The
run samples (a dry run, a first install, a check, the reasons a file is
refused, a copy from an old card) are printed by `install.py` itself, in a
sandbox under `tmp/` served on the loopback from the committed
`install/*.json`. A new list therefore rewrites this page, and `--check`
fails until the script has run. Pipeline step 7 runs it after the README.
The prose cells stay as written. A row the code gains stops the script until
its text is added inside the markers, and `--check`, which a test runs, fails
on a table behind the code. `--page FILE` renders another copy of the page,
which the tests use.
The [handheld](#on-a-handheld-the-retrobios-port) archives each carry
`install.py`, the one the one-line command of the same commit downloads:
@@ -1714,6 +1735,7 @@ other schemas under `api/v1/schemas/`.
| `scanned` | `folder`, `files`, `truncated`, `other_drives` | Each folder named with `--from`, once read and before `detect`. `files` counts the files found, `truncated` is true when the search stopped at 200,000 of them, and `other_drives` lists the folders below it on another drive, which were not entered |
| `version` | `platform`, `list_version`, `installed_version`, `message` | Before `choices`, when the system here runs another version than the one the list was built for: `list_version` is the list's, `installed_version` the one the system's version file states, and `message` says it and what it means. Not written when either version is unknown. The run goes on |
| `choices` | `platform`, `systems` | Before `checking`: the systems the run's list lets one choose among, sorted by id, `other` last for the files no system names. The run's other options apply (`--core`, `--region`, `--no-game-data`, the files left out for an unknown save directory), `--system` does not: these are the systems a screen lists to choose from, and the count a `--system` is out of |
| `set_aside` | `platform`, `dests` | Right after `choices`: the files of the list the run sets aside before any choice, in list order, those read from a save directory whose place is not known among them. A screen chooses its cores among the rest, the cores `--core` accepts |
| `file` | `platform`, `dest`, `systems`, `size`, `state` | Each file of the list after the check. `state` is `present` (hash verified), `wrong_hash` or `missing` |
| `system` | `platform`, `system`, `name`, `files`, `present`, `missing`, `wrong_hash`, `bytes_needed` | Each system, sorted by id, and with `--system` only the systems named. Files with no system count under `other`. `name` is the platform's own name for it |
| `checking` | `files_done`, `files_total` | While the files already in the folder are read and hashed, at most every half second and once at the end. `files_total` counts the files found in place |
+2 -2
View File
@@ -49,7 +49,7 @@ Pipeline steps:
| 4d | Collected copies only an emulator install provides (`bundled_only.py --strict`, gates the run) | - |
| 5 | Consistency check: counts, paths per archive, every emulator pack | if verify or pack skipped |
| 6 | Pack integrity (extract + hash) | `--skip-packs` |
| 7 | Generate README | `--skip-docs` |
| 7 | Generate README and CONTRIBUTING, then the installer page's tables and run samples (`generate_installer_doc.py`) | `--skip-docs` |
| 8 | Generate site | `--skip-docs` |
| 8b | Render the site with `npm run build --prefix website`, then `validate_site.py`, as the deploy does | `--skip-docs`, or Node not set up (`npm ci --prefix website`) |
@@ -1301,7 +1301,7 @@ before a release (wiki/release-process.md). Its lines stay in
| `validate_pr.py` | Validate BIOS files in pull requests, post markdown report |
| `validate_schemas.py` | Validate the data contracts: schemas and semantic invariants. `--source-only` checks `emulators/` and `platforms/` alone, which is what PR validation runs |
| `generate_event_schema.py` | Write `schemas/install-events.schema.json` from `EVENT_KEYS` in `install.py` (`--check` exits 1 when the file is stale, which `validate_schemas.py` also reports) |
| `generate_installer_doc.py` | Rewrite the generated tables of `wiki/installer.md` (options, events, exit codes, keys per route) from `install.py` (`--check` exits 1 when a table is stale, `--page FILE` writes another copy of the page) |
| `generate_installer_doc.py` | Rewrite the generated blocks of `wiki/installer.md` from `install.py`: the tables (options, events, exit codes, keys per route, card markers), the line menu, and the run samples `install.py` prints in a sandbox against the committed `install/*.json`, so a new list rewrites the page (`--check` exits 1 when a block is stale, `--page FILE` writes another copy of the page). Pipeline step 7 |
| `auto_fetch.py` | Fetch missing BIOS files from known sources (4-step pipeline). A download is accepted only when every cryptographic hash the entry declares (sha256, sha1, md5) matches. crc32 and size find a file the database already holds, never accept a download. An entry with no cryptographic hash is reported and not searched |
| `list_platforms.py` | List active platforms (`--include-archived` adds the archived ones, used by CI) |
| `download.py` | Download a pack from GitHub releases, every part checked (Python, stdlib only) |