Commit Graph
2666 Commits
Author SHA1 Message Date
Abdessamad Derraz 58735286a7 feat: let an archive join a set
Kronos reads kronos/stvbios.zip, else stvbios.zip at the root of the
system directory, and a ST-V game stops without either
(libretro.c:1608-1617, 1676-1681 at the pin). The archive under
archive_prefix and the root copy are one need, but only loose entries
could be members, so the required-only pack carried both.

An archive's own entry now joins a set like a loose file. verify
--emulator and the emulator pack settle archive units with the loose
entries, the required-only pick covers them, find_undeclared_files
and cross_reference record them, and the unit under archive_prefix
ranks before the same name at the root. Its members still settle the
archive by their contents. Kronos' stvbios.zip is grouped stv-bios.

No other profile reads one archive under two paths: odin and
tgpulse_next_m1 place their own entries at the prefix path, and
flycast's naomi.zip has one path per build.
2026-11-09 18:26:05 +01:00
Abdessamad Derraz 315dab82b7 feat: give each set its requirement and one pick
Three changes to the search-list model, one commit because the readers
and the profiles must move together for the schema to hold.

Set requirement in a groups map. pom2 falls back on apple2.rom for the
][ and the ][+, and on apple2e.rom for the //e it boots and for the
unenhanced //e: one required on the file could not say both. A profile
now declares groups: {name: {required}}, a member writes no required
of its own (schema and validate_schemas refuse one) and load_emulator_
profiles derives it, true when one of its sets is. group takes a name,
a list, or a map from set to rank where the rank differs per set. pom2
is grouped from SystemProfile.cpp and MainWindow.cpp:246-296 at its pin.

One member per required set under --required-only. The pick is the
first the code reads among the held members the region filter leaves,
by rank then declaration order; a set the platform declares a member
of is carried by that declaration. The emulator pack, verify
--emulator, the platform pack, its manifest and verify --platform read
alternatives.required_only_spares or core_file_spares.

variant_group is now selection_slot: files a core chooses between by
a rule other than first found (disc territory for PicoDrive and
Pizza Boy SC, the o2em_bios option, a WebAssembly probe in SWF
Player). Where the code takes any one, the field became a group:
ARMSX1 (ArmSxBackend.java:149-157, name order), ePSXe (load_bios
0x433540-0x433621 of the 2.0.5 Linux x64 binary, one configured path,
HLE when BiosHLE is set), FPse and FPse-NG, DXX-Rebirth's HOGs
(inferno.cpp:472-512). odin and zesarux carried it with no effect.
slot.py compares ranks only between candidates that share a set.
2026-11-09 18:19:32 +01:00
Abdessamad Derraz 2c76cc7df9 feat: read a search list as one need
A core that loads the first of several names (yabause: saturn_bios.bin,
sega_101.bin, mpr-17933.bin) needs one of them. Profiles wrote this as
required on the first name and optional on the others, so verify and
the gap report called saturn_bios.bin a missing required file while
sega_101.bin was held, and a set held only through a name marked
optional read as a need met by an optional file.

Model: an explicit group on the file entry, mirroring the platform
field. priority was not reused: it is a rank, read by slot.py, region.py
and truth.py inside a (system, region) slot, and that slot is not the
set. px68k-sdl ranks its IPL list and its font list each from 1 in one
system, pom2 ranks one list per machine model, DuckStation ranks 105
images across every region and takes any of them. A rank cannot say
where one list ends. priority stays the order inside a group.

Readers, through alternatives.settle_sets:
- verify --emulator and the emulator pack: a held member fills the
  set, the others leave the report, a set nobody holds is one gap
  under its first member naming the others.
- find_undeclared_files (verify platform, core complement of packs and
  manifests): same rule, a platform declaration or launcher counts as
  answering the set.
- cross_reference: excused members are set aside as other versions.
- slot.py: ranks compare members of one set only.
- archive members: a required set inside an archive is met by one.
- truth: a member gives no requirement of its own, one_of and
  one_of_required carry the set, and the exporters and the diff leave
  such a line's required as the platform wrote it.
- validate_schemas: members of a group share required.
2026-11-09 17:39:46 +01:00
Abdessamad Derraz fed8bdddd8 feat: read the lexaloffle launcher for batocera
Batocera's lexaloffleGenerator runs bios/pico-8/pico8 and
bios/voxatron/vox, raises when the binary is missing or not
executable, and puts each folder on LD_LIBRARY_PATH. The new
extractor records both per system from the AST, with the lines
of batocera-43.1 that say it.
2026-11-09 17:06:09 +01:00
Abdessamad Derraz 244bd11075 chore: merge origin/main 2026-11-09 16:46:40 +01:00
Abdessamad Derraz 6c14468862 feat: say the installer and setup pages plainly
- The installer speaks without "you": the first screen asks "Where
  to install?", rows read "Copy the BIOS files from an old card or a
  folder", a close match reads "Close matches: ...". The handheld
  launchers and their port text follow, and the pronoun guard no
  longer lists any installer message.
- A setup that runs as an app opens on its one-line command, the
  folder table after it; a setup that runs on its own device keeps
  the network folder first, which its ZIP route needs.
- The home steps say what to do: "Its page gives one line to copy",
  "Paste it, press Enter".
2026-11-09 16:33:56 +01:00
Abdessamad Derraz 7164a8c446 chore: merge launcher gap report 2026-11-09 16:16:42 +01:00
Abdessamad Derraz 8268f03269 feat: report files only a launcher reads
cross_reference and verify list the names a platform's launch code reads that the collection holds under no name. Reported apart, never scored.
2026-11-09 16:16:38 +01:00
Abdessamad Derraz 295bb4e275 chore: merge origin/main 2026-11-09 15:52:58 +01:00
Abdessamad Derraz a18262f184 chore: merge origin/main 2026-11-09 15:06:18 +01:00
Abdessamad Derraz c963499643 fix: wait for Confirm by its title in the tap test
The game-data tap test waited on the bare RetroBIOS: title, which the
screen before Confirm already showed, then pressed Enter only if one
settle had drawn Confirm. The runner drew it later and the install
never started. It now waits for the Confirm title and presses Enter.
2026-11-09 14:23:36 +01:00
Abdessamad Derraz 4542bcffa8 chore: bump uv to 0.13.4 in every pin
Dependabot moved uv in pyproject.toml alone, while validate.yml and
CONTRIBUTING kept 0.12.9. Both pins move together, and a test now
fails when a package pinned in both carries two versions.
2026-11-09 14:20:12 +01:00
Abdessamad Derraz 025fd08a72 chore: merge origin/main 2026-11-09 14:02:45 +01:00
Abdessamad Derraz 10dc67b63a fix: follow the doc tests to --refresh-cache 2026-11-09 13:44:24 +01:00
Abdessamad Derraz 51aa626028 fix: fetch platform originals without exporting
--fetch also exported and stopped on the absent dist/truth before any
download, so CI skipped every exporter fidelity case and tolerated the
step. --refresh-cache only downloads: the step can no longer fail
unseen.
2026-11-09 12:45:57 +01:00
Abdessamad Derraz 31132eb37e chore: merge origin/main 2026-11-09 12:28:14 +01:00
Abdessamad Derraz 85e81b15d5 fix: let the FM Towns ME model name through 2026-11-09 12:28:13 +01:00
Abdessamad Derraz 3368140e52 chore: merge site and docs fixes 2026-11-09 12:23:13 +01:00
Abdessamad Derraz a1a0f54572 chore: follow site tests to the rescraped data
Each change records a fact the data no longer states:

- ROCKNIX 20261101 dropped the AetherSX2 package, so the install box
  names KNULLI alone.
- RetroBat no longer pins an md5 on ar_bios.zip for the Arcadia, so no
  file is held for emerson-arcadia-2001 and its UNLINKED entry is gone.
- sega-model1 holds only the model1io and model1io2 device sets, filed
  under Arcade > Arcade and Arcade > MAME, with no section of its own.
- The Sega page gained Model 2 and new Chihiro and Hikaru files on the
  same card layout: its word ceiling is measured again at 3545.
2026-11-09 12:22:33 +01:00
Abdessamad Derraz d81a873b15 fix: allow advancemame's removed hng64 system 2026-11-09 12:16:32 +01:00
Abdessamad Derraz c6bf649a1e fix: expect the lowercase bbkemu folder 2026-11-09 12:12:18 +01:00
Abdessamad Derraz d6a0270ca7 chore: merge origin/main 2026-11-09 12:07:57 +01:00
Abdessamad Derraz df7c923fcf chore: merge origin/main 2026-11-09 12:06:30 +01:00
Abdessamad Derraz 43088a4e9e chore: merge origin/main 2026-11-09 11:45:57 +01:00
Abdessamad Derraz b9a35589a8 feat: build the PyPI package with flit_core
build_pypi.py stages install.py, the launcher, __main__.py, README and
LICENSE, then runs uv build with flit_core 3.12.0 pinned and
SOURCE_DATE_EPOCH set from install.py's commit. Adds python -m retrobios,
the PyPA classifiers, keywords and project URLs. CI installs uv.
2026-11-09 11:45:49 +01:00
Abdessamad Derraz 7da48ca56a feat: date the PyPI package by install.py commits 2026-11-09 11:40:37 +01:00
Abdessamad Derraz 2841998b60 chore: hold indexnow.py to the script rules
indexnow.py now exits through run_cli, its --dist option is documented
in tools.md, and test_site_freshness.py imports the tests package first.
2026-11-09 11:02:00 +01:00
Abdessamad Derraz 1647d0e4fb feat: send alias profile pages to their emulator
Search Console reported emulators/vba_m/ as not found: an alias
profile has no page, and only the names in a profile's cores: list
were redirected. Each of the 21 alias profiles now redirects to the
page of the profile it names.
2026-11-09 10:59:12 +01:00
Abdessamad Derraz 7d23d8f40b chore: merge origin/main 2026-11-09 10:57:37 +01:00
Abdessamad Derraz 045ad9e3af chore: merge origin/main 2026-11-09 10:54:08 +01:00
Abdessamad Derraz 602945faf0 feat: logos, build stamps and exact wording
- The installer says "Every file on the list is in place." where it
  said "Everything is in place.": a check covers the files the
  collection holds, and the required ones it lacks follow.
- The FAQ, first install, legal and home pages state only what the
  code shows (PlayStation 1 and Saturn run without a BIOS on some
  emulators, save files are never touched, records are added).
- MinUI and MyMinUI show their own boot logos, and the Android,
  Linux handheld and iPhone tiles show the Android robot, Tux and a
  plain device icon, each credited in sources.json.
- Each Markdown copy, llms.txt and llms-full.txt name the commit
  they were built from, version.json the current one, and the
  answering rules tell assistants to fetch a stale copy again.
- The deploy lists the pages whose words changed (digests.json) and
  posts them to IndexNow once the site is live.
2026-11-09 10:47:37 +01:00
Abdessamad Derraz 7b5a3f4802 chore: merge origin/main 2026-11-09 09:31:41 +01:00
Abdessamad Derraz c99639a15f chore: merge origin/main 2026-11-09 09:28:04 +01:00
Abdessamad Derraz f44ef8459e docs: state only what the code proves
Each claim in the README and the wiki now matches the code or data it
describes: line citations counted as such (93%), closed-source profiles
named, severity tied to the check mode, installs limited to files the
collection holds, and the demo labelled as a demonstration card.
2026-11-09 08:47:21 +01:00
Abdessamad Derraz e6c83859d5 chore: merge origin/main 2026-11-09 08:35:52 +01:00
Abdessamad Derraz 74b807ccf5 chore: merge origin/main 2026-11-09 08:16:49 +01:00
Abdessamad Derraz 1aa78fd0dc chore: merge profile batch two 2026-11-09 08:11:51 +01:00
Abdessamad Derraz 78e22851dd chore: guard the site against personal pronouns 2026-11-09 08:09:47 +01:00
Abdessamad Derraz a70f8bcb34 docs: write the site without personal pronouns 2026-11-09 08:09:47 +01:00
Abdessamad Derraz 7a5d5e5bf5 chore: merge core-info reviews 2026-11-09 07:57:57 +01:00
Abdessamad Derraz 70276f098c chore: merge six core-info profiles 2026-11-09 07:37:11 +01:00
Abdessamad Derraz b690a03864 feat: profile six libretro cores from source
anybor, anygm, sm2, tgpulse_next_m1, zcdi and zesarpcw had a core-info file and no profile. parallel_psp and parallel_xbox are left out: no source is published for them.
2026-11-09 07:36:36 +01:00
Abdessamad Derraz 45cf1accfb chore: merge origin/main 2026-11-09 07:35:22 +01:00
Abdessamad Derraz 77fef7289f feat: show the handheld demo and steps per tab
make_demo.py records a second variant: the full-screen interface at the
640x480 screen of an R36S, on an ArkOS root made with bwrap, started as
the Tools menu launcher starts it (RETROBIOS_PAD=gptokeyb), driven by the
keys gptokeyb sends for the buttons. demo.json holds one entry per
variant with its alt text. No Windows variant: under pwsh on Linux the
installer's summary gives --dest /mnt/e/bios back.

The quick install box of Get your files gets an "On the device" tab with
the handheld recording, the terminal recording under the others but
Windows, and, under the text of each computer tab, a drawing of opening
the terminal and pasting (sitesteps.py, inline SVG in the theme's
colours, title and desc). The terminal steps name the physical action.
2026-11-09 07:35:03 +01:00
Abdessamad Derraz d9b788787c fix: read keyed source and version in profile_sync 2026-11-09 07:34:26 +01:00
Abdessamad Derraz 16ec5fa2d2 docs: turn the readme into a front page
The README ran 211 lines and 2,000 words: five commands with options,
an 18-row download table, coverage figures and the build commands, all
before the help. It now says what the project does, gives the line that
installs for Windows and for the rest, shows it, lists the six ZIPs and
the setups that install by command, and leads to the site, where the
figures and every option live. The build commands sit in a closed block.
No personal pronoun is left in its text.
2026-11-09 07:28:32 +01:00
Abdessamad Derraz 19264db538 chore: merge issue 87 and platform refresh 2026-11-09 07:24:48 +01:00
Abdessamad Derraz 77a8f171ba feat: read retrobat bios groups
emulatorLauncher 228731e0 lists ten PS2 BIOS in one group: one held file
is enough and Program.cs reports the others OPTIONAL. The scraper keeps
group and optional, verify and the pack check apply the same rule.
2026-11-09 07:22:06 +01:00
Abdessamad Derraz abf0f06fa9 fix: read the launchers emulatorLauncher has now
ArcadeDuck searches the folder above a CHD-only set, GSplus writes the
first of four ROM names it finds, Hatari falls back on EmuTOS, hatariB
copies a TOS from bios/hatari/tos, and #region lines precede method
headers. ROCKNIX renamed start_hatari.sh and dropped aethersx2-sa.
2026-11-09 07:16:25 +01:00
Abdessamad Derraz 8328570d1c docs: name uvx retrobios beside the one-liner 2026-11-09 07:07:54 +01:00