diff --git a/bios/Nintendo/Super Famicom Box/KROM1.BIN b/bios/Nintendo/Super Famicom Box/KROM1.BIN new file mode 100644 index 00000000..d11bdc0c Binary files /dev/null and b/bios/Nintendo/Super Famicom Box/KROM1.BIN differ diff --git a/bios/Nintendo/Super Famicom Box/MB90082.BIN b/bios/Nintendo/Super Famicom Box/MB90082.BIN new file mode 100644 index 00000000..2dc30f48 Binary files /dev/null and b/bios/Nintendo/Super Famicom Box/MB90082.BIN differ diff --git a/emulators/daedalusx64.yml b/emulators/daedalusx64.yml new file mode 100644 index 00000000..ada226d5 --- /dev/null +++ b/emulators/daedalusx64.yml @@ -0,0 +1,74 @@ +emulator: "DaedalusX64" +type: standalone +core_classification: embedded_hle +source: "https://github.com/DaedalusX64/daedalus" +profiled_date: "2026-10-17" +source_commit: "f17e9ed86f3806fadeb69abd29c9526ab2d4bd1b" +pin_frozen: "ROCKNIX 20261001 builds this revision. Later upstream commits are not part of that build." +core_version: "Git" +display_name: "Nintendo - 64 (DaedalusX64)" +cores: + - "daedalusx64" + - "daedalusx64-sa" +systems: + - nintendo-64 + +notes: | + High-level Nintendo 64 emulator. The boot sequence and the RSP are emulated + at high level: no PIF ROM or other console firmware is opened. The code + carries no version string; the tree is 837 commits past tag 1.1.8. + + Every data file is resolved against baseDir, which on Linux is the working + directory at startup. ROCKNIX copies the package to /storage/.config/DaedalusX64 + and starts the binary from there. + ref: Source/Utility/Paths.cpp:30-36, Source/Utility/Paths.cpp:40-42 + + Linux builds pick the renderer by architecture: OpenGL ES on aarch64 and arm, + desktop OpenGL elsewhere. Each renderer installs its own n64.psh, the fragment + shader library prepended to every shader the renderer compiles. The ES + renderer fails graphics init without it; the desktop one goes on with an + empty library and its shaders do not compile. + ref: Source/CMakeLists.txt:132-137, Source/SysPosix/CMakeLists.txt:12-18, + Source/SysGLES/HLEGraphics/RendererGL.cpp:77-110, + Source/SysGLES/Graphics/GraphicsContextGL.cpp:151-156, + Source/SysGL/HLEGraphics/RendererGL.cpp:86-120 + + roms.ini is the per-game settings database (name, save type, a few rendering + and timing flags), keyed on the two header CRCs and the country code. A game + it does not list runs on defaults. + ref: Source/RomFile/RomSettings.cpp:149-157, Source/RomFile/RomSettings.cpp:218-228, + Source/Core/ROM.cpp:481-484 + + The cheat reader is called with "Daedalus.cht" but ignores that argument and + opens a file named cheat_file in the working directory, creating it empty, so + the bundled Daedalus.cht is never read. + ref: Source/Core/ROM.cpp:534, Source/Interface/Cheats.cpp:265, Source/Interface/Cheats.cpp:293-303 + +files: + - name: "n64.psh" + path: "n64.psh" + system: nintendo-64 + required: true + bundled: true + description: "N64 fragment shader library" + note: "Two different files share this name: Source/SysGLES/HLEGraphics/n64.psh for the OpenGL ES build, Source/SysGL/HLEGraphics/n64.psh for the desktop OpenGL build. Installed beside the binary." + source_ref: "Source/SysGLES/HLEGraphics/RendererGL.cpp:103-110, Source/SysGL/HLEGraphics/RendererGL.cpp:116-120, Source/SysPosix/CMakeLists.txt:12-18" + + - name: "roms.ini" + path: "roms.ini" + system: nintendo-64 + required: false + bundled: true + category: game_data + description: "Per-game settings database" + note: "Shipped in Data/. Without it every game runs with default settings." + source_ref: "Source/RomFile/RomSettings.cpp:149-157, Source/RomFile/RomSettings.cpp:218-228, Source/Core/ROM.cpp:481-484" + + - name: "OpenSans.ttf" + path: "Resources/OpenSans.ttf" + system: nintendo-64 + required: false + bundled: true + description: "UI font" + note: "Opened through SDL_ttf for the on-screen menus; a failure is printed and emulation is not affected." + source_ref: "Source/SysGL/Graphics/DrawTextSDL.cpp:30-41, Source/SysGLES/Graphics/DrawTextSDL.cpp:30-41" diff --git a/emulators/dsperate.yml b/emulators/dsperate.yml new file mode 100644 index 00000000..e7521e6d --- /dev/null +++ b/emulators/dsperate.yml @@ -0,0 +1,137 @@ +emulator: "DSperate" +type: standalone +core_classification: other +source: "https://github.com/beebono/DSperate" +profiled_date: "2026-10-17" +source_commit: "81b73832c2e68e2b10cb5850f0a6d393ffc6fbb7" +pin_frozen: "ROCKNIX 20261001 ships the v2.0.1 release binaries, built by CI from the v2.0.1 tag at this commit." +core_version: "2.0.1" +display_name: "Nintendo - DS / DSi (DSperate)" +cores: + - "dsperate" + - "dsperate-sa" +systems: + - nintendo-ds + - nintendo-dsi + +notes: | + Nintendo DS emulator for ARM handhelds with a DSi mode. ROCKNIX installs the + release tarball for its architecture and runs it with --config pointing at + /storage/.config/dsperate/dsperate.ini. + + No file name is built in: every system file is a [paths] key of the ini (or + the matching command-line flag), and a key that is unset or names no file + counts as absent. The names below are the ones ROCKNIX's dsperate.ini gives, + all in /storage/roms/bios/. + ref: src/frontend/sdl/config.cpp:184-205, src/frontend/sdl/main.cpp:1289-1303 + + DS BIOS: both halves or neither, the ARM9 image 4 KB and the ARM7 image 16 KB + exactly. Without them the built-in FreeBIOS runs games by direct boot. The + firmware may be any non-empty file; without one a firmware is generated from + the [user] settings. Booting the DS menu needs both BIOS dumps and a real + firmware. No hash is checked; an FNV-1a of the loaded regions only tags save + states. + ref: src/core/nds.cpp:101-133, src/core/mem/bus.h:121-131, + src/frontend/sdl/main.cpp:1410, src/frontend/sdl/main.cpp:1440-1447 + + DSi: DSiWare and --dsi-mode need the DSi BIOS pair, 64 KB each, and the DS + BIOS dumps as well; FreeBIOS cannot run a DSi session. dsi_firmware replaces + firmware for a DSi session when no --firmware is given. The NAND is needed by + --dsi-mode and by NAND title shortcuts only; it must carry the nocash footer + (at the end, or at 0x000FF800). DSiWare without a NAND runs on a generated + console whose system font is DSperate's own unless dsi_font names a + TWLFontTable.dat. + ref: src/frontend/sdl/main.cpp:1294-1308, src/frontend/sdl/main.cpp:1452-1460, + src/core/nds_dsi.cpp:95-112, src/core/nds_dsi.cpp:121-127, + src/core/io/dsi_sd.cpp:111-140, src/core/nds_dsi.cpp:356-373, + src/frontend/sdl/main.cpp:1915-1919 + + Cheats come from usrcheat.dat: the [paths] cheats entry, else beside the ROM, + else the config directory. + ref: src/frontend/sdl/main.cpp:709-735 + +files: + - name: "bios9.bin" + system: nintendo-ds + required: false + hle_fallback: true + size: 4096 + validation: [size] + config_key: "paths.bios9" + description: "DS ARM9 BIOS" + note: "Loaded only together with bios7.bin. Absent, FreeBIOS runs games by direct boot. Needed to boot the DS menu and for any DSi session." + source_ref: "src/core/nds.cpp:105-108, src/core/mem/bus.h:130, src/frontend/sdl/main.cpp:1440-1460" + + - name: "bios7.bin" + system: nintendo-ds + required: false + hle_fallback: true + size: 16384 + validation: [size] + config_key: "paths.bios7" + description: "DS ARM7 BIOS" + note: "Loaded only together with bios9.bin. Absent, FreeBIOS runs games by direct boot. Needed to boot the DS menu and for any DSi session." + source_ref: "src/core/nds.cpp:105-109, src/core/mem/bus.h:131, src/frontend/sdl/main.cpp:1440-1460" + + - name: "firmware.bin" + system: nintendo-ds + required: false + hle_fallback: true + config_key: "paths.firmware" + description: "DS firmware" + note: "Any non-empty file is accepted. Absent, a firmware is generated from [user]. Needed to boot the DS menu." + source_ref: "src/core/nds.cpp:110, src/core/nds.cpp:124-125, src/frontend/sdl/main.cpp:1441-1447" + + - name: "dsi_bios9.bin" + system: nintendo-dsi + required: false + size: 65536 + validation: [size] + config_key: "paths.bios9i" + description: "DSi ARM9 BIOS" + note: "Loaded only together with dsi_bios7.bin. Without the pair DSiWare and --dsi-mode are refused; DS games do not use it." + source_ref: "src/core/nds_dsi.cpp:95-106, src/core/mem/bus.h:121, src/frontend/sdl/main.cpp:1301-1308" + + - name: "dsi_bios7.bin" + system: nintendo-dsi + required: false + size: 65536 + validation: [size] + config_key: "paths.bios7i" + description: "DSi ARM7 BIOS" + note: "Loaded only together with dsi_bios9.bin. Without the pair DSiWare and --dsi-mode are refused; DS games do not use it." + source_ref: "src/core/nds_dsi.cpp:95-106, src/core/mem/bus.h:122, src/frontend/sdl/main.cpp:1301-1308" + + - name: "dsi_firmware.bin" + system: nintendo-dsi + required: false + config_key: "paths.dsi_firmware" + description: "DSi firmware" + note: "Used instead of firmware.bin for a DSi session when no --firmware is given." + source_ref: "src/frontend/sdl/main.cpp:1294-1298" + + - name: "dsi_nand.bin" + system: nintendo-dsi + required: false + config_key: "paths.dsi_nand" + description: "DSi NAND image with nocash footer" + note: "Read only by --dsi-mode and NAND title shortcuts; DSiWare run from the game list does without it. Opened read-only, rejected without the \"DSi eMMC CID/CPU\" footer." + source_ref: "src/frontend/sdl/main.cpp:1263-1272, src/core/nds_dsi.cpp:121-127, src/core/io/dsi_sd.cpp:111-140" + + - name: "TWLFontTable.dat" + system: nintendo-dsi + required: false + hle_fallback: true + config_key: "paths.dsi_font" + description: "DSi system font" + note: "Used for DSiWare run without a NAND. Absent, DSperate's own font table is generated. ROCKNIX's ini leaves the key unset." + source_ref: "src/core/nds_dsi.cpp:356-373, src/frontend/sdl/main.cpp:1915-1919" + + - name: "usrcheat.dat" + system: nintendo-ds + required: false + category: game_data + config_key: "paths.cheats" + description: "Action Replay cheat database" + note: "Looked up by game code and header checksum; nothing is enabled by its presence." + source_ref: "src/frontend/sdl/main.cpp:709-735" diff --git a/emulators/fbalpha2019.yml b/emulators/fbalpha2019.yml new file mode 100644 index 00000000..1621af2d --- /dev/null +++ b/emulators/fbalpha2019.yml @@ -0,0 +1,452 @@ +emulator: "FB Alpha 2019" +type: libretro +core_classification: frozen_snapshot +source: "https://github.com/libretro/fbalpha" +upstream: "https://github.com/barry65536/FBAlpha" +profiled_date: "2026-10-17" +source_commit: "0581797db6fdffd826086b053ced4b6b29bb6678" +pin_frozen: "ROCKNIX 20261001 builds this revision as fbalpha2019. Later commits on libretro/fbalpha are not part of that build." +core_version: "v0.2.97.44" +display_name: "Arcade (FB Alpha 2019)" +cores: + - "fbalpha2019" +systems: + - arcade + - snk-neogeo-mvs + - snk-neogeo-cd + - igs-pgm + - super-kaneko-nova + - midway-mcr + - coleco-colecovision + - sinclair-spectrum + - msx + - nmk16 + - deco-cassette + - sega-system16b + - taito-cchip + - ym2608 + +notes: | + Final Burn Alpha v0.2.97.44 as left in libretro/fbalpha, the repository the + libretro project froze when development moved to FinalBurn Neo. The makefile + builds fbalpha_libretro.so; ROCKNIX installs it as fbalpha2019_libretro.so. + ref: src/burner/libretro/libretro.cpp:19 + + Each archive the driver names is looked for in three places, the first that + opens wins: the content directory, /fba/, then /. A missing + archive is only logged. + ref: src/burner/libretro/libretro.cpp:560-587 + + The archives come from BurnDrvGetZipName: the game, its board ROM set + (szBoardROM of the BurnDriver), then its parents. ColecoVision, MSX and + Spectrum drivers have their own GetZipName that strips the system prefix, so + cv_coleco opens coleco.zip, msx_msx opens msx.zip, spec_spectrum opens + spectrum.zip and spec_spec128 opens spec128.zip. The PGM single board sets + thegladpcb, dmnfrntpcb and svgpcb also open pgm.zip. + ref: src/burn/burn.cpp:94-133, src/burn/drv/coleco/d_coleco.cpp:638-670, + src/burn/drv/msx/d_msx.cpp:1680-1712, src/burn/drv/spectrum/d_spectrum.cpp:202-235, + src/burner/libretro/libretro.cpp:603-617 + + Every ROM is matched by CRC32 across all opened archives first, then by name. + A board ROM set is appended to the game's list at index 0x80, so its entries + are checked like the game's own: any entry without BRF_OPT that is found in + no archive aborts the load. The one exception is the Neo Geo MVS BIOS + sp-s3.sp1, skipped when another MVS, AES or Universe BIOS was found. + ref: src/burn/stdfunc.h:13-28, src/burner/libretro/libretro.cpp:635-657, + src/burner/libretro/libretro.cpp:733-748, src/burner/libretro/retro_common.cpp:4-47 + + Four Midway MCR games (kickman, kickc, wacko, nflfoot) name "ssio" as their + board ROM set instead of "midssio", so they open ssio.zip. + ref: src/burn/drv/pre90s/d_mcr.cpp:1782, src/burn/drv/pre90s/d_mcr.cpp:1820, + src/burn/drv/pre90s/d_mcr.cpp:2298, src/burn/drv/pre90s/d_mcr.cpp:3174 + + Neo Geo CD content runs the neocdz driver, whose board ROM set is neogeo: it + opens neocdz.zip then neogeo.zip. + ref: src/burner/libretro/libretro.cpp:1316-1317, src/burn/drv/neogeo/d_neogeo.cpp:1283-1299 + + Samples are read from /fba/samples/.zip and the high score + table from /fba/hiscore.dat (core option fba-hiscores, enabled by + default). + ref: src/burner/libretro/libretro.cpp:1158-1161, src/burn/hiscore.cpp:408, + src/burner/libretro/retro_common.cpp:85 + +files: + - name: "neogeo.zip" + category: bios_zip + system: snk-neogeo-mvs + description: "Neo Geo system BIOS ROM set" + required: true + note: "sm1.sm1, sfix.sfix and 000-lo.lo are required. sp-s3.sp1 is required unless one of the other 68K BIOS images is present; all other members are BRF_OPT." + source_ref: "src/burn/drv/neogeo/d_neogeo.cpp:930-981, src/burn/drv/neogeo/d_neogeo.cpp:1207-1216, src/burner/libretro/libretro.cpp:733-748" + contents: + - name: "sp-s3.sp1" + size: 131072 + crc32: "91b64be3" + - name: "sp-s2.sp1" + size: 131072 + crc32: "9036d879" + - name: "sp-s.sp1" + size: 131072 + crc32: "c7f2fa45" + - name: "sp-u2.sp1" + size: 131072 + crc32: "e72943de" + - name: "sp1-u2" + size: 131072 + crc32: "62f021f4" + - name: "sp-e.sp1" + size: 131072 + crc32: "2723a5b5" + - name: "sp1-u4.bin" + size: 131072 + crc32: "1179a30f" + - name: "sp1-u3.bin" + size: 131072 + crc32: "2025b7a2" + - name: "vs-bios.rom" + size: 131072 + crc32: "f0e8f27d" + - name: "sp-j2.sp1" + size: 131072 + crc32: "acede59c" + - name: "sp1.jipan.1024" + size: 131072 + crc32: "9fb0abe4" + - name: "sp-45.sp1" + size: 524288 + crc32: "03cc9f6a" + - name: "sp-j3.sp1" + size: 524288 + crc32: "486cb450" + - name: "japan-j3.bin" + size: 131072 + crc32: "dff6d41f" + - name: "sp1-j3.bin" + size: 131072 + crc32: "fbc6d469" + - name: "neo-po.bin" + size: 131072 + crc32: "16d0c132" + - name: "neo-epo.bin" + size: 131072 + crc32: "d27a71f1" + - name: "neodebug.bin" + size: 131072 + crc32: "698ebb7d" + - name: "sp-1v1_3db8c.bin" + size: 131072 + crc32: "162f0ebe" + - name: "uni-bios_3_3.rom" + size: 131072 + crc32: "24858466" + - name: "uni-bios_3_2.rom" + size: 131072 + crc32: "a4e8b9b3" + - name: "uni-bios_3_1.rom" + size: 131072 + crc32: "0c58093f" + - name: "uni-bios_3_0.rom" + size: 131072 + crc32: "a97c89a9" + - name: "uni-bios_2_3.rom" + size: 131072 + crc32: "27664eb5" + - name: "uni-bios_2_3o.rom" + size: 131072 + crc32: "601720ae" + - name: "uni-bios_2_2.rom" + size: 131072 + crc32: "2d50996a" + - name: "uni-bios_2_1.rom" + size: 131072 + crc32: "8dabf76b" + - name: "uni-bios_2_0.rom" + size: 131072 + crc32: "0c12c2ad" + - name: "uni-bios_1_3.rom" + size: 131072 + crc32: "b24b44a0" + - name: "uni-bios_1_2.rom" + size: 131072 + crc32: "4fa698e9" + - name: "uni-bios_1_2o.rom" + size: 131072 + crc32: "e19d3ce9" + - name: "uni-bios_1_1.rom" + size: 131072 + crc32: "5dda0d84" + - name: "uni-bios_1_0.rom" + size: 131072 + crc32: "0ce453a0" + - name: "neopen.sp1" + size: 131072 + crc32: "cb915e76" + - name: "sm1.sm1" + size: 131072 + crc32: "94416d67" + - name: "sfix.sfix" + size: 131072 + crc32: "c2ea0cfd" + - name: "000-lo.lo" + size: 131072 + crc32: "5a86cff2" + + - name: "neocdz.zip" + category: bios_zip + system: snk-neogeo-cd + description: "Neo Geo CDZ system ROM set" + required: true + note: "Both members are required. Matching is by CRC32 across neocdz.zip and neogeo.zip, so a neogeo.zip that also holds neocd.bin stands in for this archive." + source_ref: "src/burn/drv/neogeo/d_neogeo.cpp:1283-1299, src/burner/libretro/libretro.cpp:1316-1317" + contents: + - name: "neocd.bin" + size: 524288 + crc32: "df9de490" + - name: "000-lo.lo" + size: 131072 + crc32: "5a86cff2" + + - name: "pgm.zip" + category: bios_zip + system: igs-pgm + description: "IGS PolyGame Master system BIOS ROM set" + required: true + note: "No member carries BRF_OPT, so all six are required for every PGM game, ddp3_bios.u37 and bios.u42 included." + source_ref: "src/burn/drv/pgm/d_pgm.cpp:511-524, src/burn/drv/pgm/d_pgm.cpp:529-538" + contents: + - name: "pgm_t01s.rom" + size: 2097152 + crc32: "1a7123a0" + - name: "pgm_m01s.rom" + size: 2097152 + crc32: "45ae7159" + - name: "pgm_p01s.u20" + size: 131072 + crc32: "e42b166e" + - name: "pgm_p02s.u20" + size: 131072 + crc32: "78c15fa2" + - name: "ddp3_bios.u37" + size: 524288 + crc32: "b3cc5c8f" + - name: "bios.u42" + size: 131072 + crc32: "517cf7a2" + + - name: "skns.zip" + category: bios_zip + system: super-kaneko-nova + description: "Super Kaneko Nova System BIOS ROM set" + required: true + note: "The five regional BIOS images are all required: none carries BRF_OPT." + source_ref: "src/burn/drv/pst90s/d_suprnova.cpp:1788-1799, src/burn/drv/pst90s/d_suprnova.cpp:1808-1817" + contents: + - name: "sknsj1.u10" + size: 524288 + crc32: "7e2b836c" + - name: "sknse2.u10" + size: 524288 + crc32: "e2b9d7d1" + - name: "sknsa1.u10" + size: 524288 + crc32: "745e5212" + - name: "sknsu1.u10" + size: 524288 + crc32: "384d21ec" + - name: "sknsk1.u10" + size: 524288 + crc32: "ff1c9f79" + + - name: "midssio.zip" + category: bios_zip + system: midway-mcr + description: "Midway SSIO sound board PROM" + required: true + source_ref: "src/burn/drv/pre90s/d_mcr.cpp:1615-1621, src/burn/drv/pre90s/d_mcr.cpp:1626-1635" + contents: + - name: "82s123.12d" + size: 32 + crc32: "e1281ee9" + + - name: "ssio.zip" + aliases: ["midssio.zip"] + category: bios_zip + system: midway-mcr + description: "Midway SSIO sound board PROM, board name used by four games" + required: true + note: "Opened for kickman, kickc, wacko and nflfoot, whose driver names \"ssio\" as board ROM set. They pick the same SsiopromRomDesc entry as midssio." + source_ref: "src/burn/drv/pre90s/d_mcr.cpp:1615-1621, src/burn/drv/pre90s/d_mcr.cpp:1778-1782" + contents: + - name: "82s123.12d" + size: 32 + crc32: "e1281ee9" + + - name: "coleco.zip" + category: bios_zip + system: coleco-colecovision + description: "ColecoVision system BIOS ROM set" + required: true + note: "coleco.rom is required; colecoa.rom, svi603.rom and czz50.rom are BRF_OPT. Archive name from CVGetZipName, which drops the cv_ prefix of cv_coleco." + source_ref: "src/burn/drv/coleco/d_coleco.cpp:638-670, src/burn/drv/coleco/d_coleco.cpp:675-680" + contents: + - name: "coleco.rom" + size: 8192 + crc32: "3aa93ef3" + - name: "colecoa.rom" + size: 8192 + crc32: "39bb16fc" + - name: "svi603.rom" + size: 8192 + crc32: "19e91b82" + - name: "czz50.rom" + size: 16384 + crc32: "4999abc6" + + - name: "msx.zip" + category: bios_zip + system: msx + description: "MSX1 system BIOS ROM set" + required: true + note: "msx.rom is required; msxj.rom and kanji.rom are BRF_OPT. Archive name from MSXGetZipName, which drops the msx_ prefix of msx_msx." + source_ref: "src/burn/drv/msx/d_msx.cpp:1680-1712, src/burn/drv/msx/d_msx.cpp:1716-1720" + contents: + - name: "msx.rom" + size: 32768 + crc32: "a317e6b4" + - name: "msxj.rom" + size: 32768 + crc32: "071135e0" + - name: "kanji.rom" + size: 262144 + crc32: "1f6406fb" + + - name: "spectrum.zip" + category: bios_zip + system: sinclair-spectrum + description: "ZX Spectrum 48K ROM set" + required: true + note: "Archive name from SpectrumGetZipName, which drops the spec_ prefix of spec_spectrum." + source_ref: "src/burn/drv/spectrum/d_spectrum.cpp:202-235, src/burn/drv/spectrum/d_spectrum.cpp:237-239" + contents: + - name: "spectrum.rom" + size: 16384 + crc32: "ddee531f" + + - name: "spec128.zip" + category: bios_zip + system: sinclair-spectrum + description: "ZX Spectrum 128 ROM set" + required: true + note: "Opened by the 128K games. Archive name from SpectrumGetZipName, which drops the spec_ prefix of spec_spec128." + source_ref: "src/burn/drv/spectrum/d_spectrum.cpp:202-235, src/burn/drv/spectrum/d_spectrum.cpp:244-247" + contents: + - name: "zx128_0.rom" + size: 16384 + crc32: "e76799d2" + - name: "zx128_1.rom" + size: 16384 + crc32: "b96a36be" + + - name: "nmk004.zip" + category: bios_zip + system: nmk16 + description: "NMK004 sound MCU internal ROM" + required: true + source_ref: "src/burn/drv/pst90s/d_nmk16.cpp:5982-5988, src/burn/drv/pst90s/d_nmk16.cpp:5993-6002" + contents: + - name: "nmk004.bin" + size: 8192 + crc32: "83b6f611" + + - name: "decocass.zip" + category: bios_zip + system: deco-cassette + description: "DECO Cassette System BIOS ROM set" + required: true + note: "The program ROMs and cassmcu.1c are required; the six PROMs (v2.3m, v4.10d, v3.3j, dsp-3_p3-.e5, rms-3_p4-.f6, dsp-3_p5-.m4) are BRF_OPT." + source_ref: "src/burn/drv/dataeast/d_decocass.cpp:3392-3446, src/burn/drv/dataeast/d_decocass.cpp:3456-3465" + contents: + - name: "v0a-.7e" + size: 4096 + crc32: "3d33ac34" + - name: "v1-.5a" + size: 2048 + crc32: "b66b2c2a" + - name: "v2.3m" + size: 32 + crc32: "238fdb40" + - name: "v4.10d" + size: 32 + crc32: "3b5836b4" + - name: "v3.3j" + size: 32 + crc32: "51eef657" + - name: "dsp-3_p0-a.m9" + size: 2048 + crc32: "2541e34b" + - name: "dsp-3_p1-.l9" + size: 2048 + crc32: "3bfff5f3" + - name: "rms-3_p2-.c9" + size: 1024 + crc32: "6c4a891f" + - name: "dsp-3_p3-.e5" + size: 32 + crc32: "539a5a64" + - name: "rms-3_p4-.f6" + size: 32 + crc32: "9014c0fd" + - name: "dsp-3_p5-.m4" + size: 32 + crc32: "e52089a0" + - name: "v0b-.7e" + size: 4096 + crc32: "23d929b7" + - name: "dsp-3_p0-b.m9" + size: 2048 + crc32: "b67a91d9" + - name: "cassmcu.1c" + size: 1024 + crc32: "a6df18fd" + + - name: "isgsm.zip" + category: bios_zip + system: sega-system16b + description: "ISG Selection Master Type 2006 system BIOS" + required: true + source_ref: "src/burn/drv/sega/d_sys16b.cpp:10631-10633, src/burn/drv/sega/d_sys16b.cpp:11202-11211" + contents: + - name: "ism2006v00.u1" + size: 131072 + crc32: "2292585c" + + - name: "cchip.zip" + category: bios_zip + system: taito-cchip + description: "Taito C-Chip uPD78C11 internal ROM" + required: true + note: "Named as board ROM set by Operation Wolf, Rainbow Islands, Volfied and others; there is no BurnDriver called cchip, the name comes from szBoardROM." + source_ref: "src/burn/drv/taito/d_taitomisc.cpp:1369-1373, src/burn/drv/taito/d_taitomisc.cpp:6250" + contents: + - name: "cchip_upd78c11.bin" + size: 4096 + crc32: "43021521" + + - name: "ym2608.zip" + category: bios_zip + system: ym2608 + description: "Yamaha YM2608 internal ADPCM ROM" + required: true + source_ref: "src/burn/drv/pre90s/d_wc90.cpp:186-192, src/burn/drv/pre90s/d_wc90.cpp:1261-1270" + contents: + - name: "ym2608_adpcm_rom.bin" + size: 8192 + crc32: "23c9e0d8" + + - name: "hiscore.dat" + path: "fba/hiscore.dat" + system: arcade + required: false + description: "High score address database" + note: "Read when the fba-hiscores option is enabled, which is the default. Without it no high score is kept." + source_ref: "src/burn/hiscore.cpp:400-420, src/burner/libretro/libretro.cpp:1158" diff --git a/emulators/flycast2021.yml b/emulators/flycast2021.yml new file mode 100644 index 00000000..063af00f --- /dev/null +++ b/emulators/flycast2021.yml @@ -0,0 +1,180 @@ +emulator: "Flycast 2021" +type: libretro +core_classification: frozen_snapshot +source: "https://github.com/metallic77/flycast" +upstream: "https://github.com/libretro/flycast" +profiled_date: "2026-10-17" +source_commit: "603814c9f73b773c455d9a497f389d2f93a257fd" +upstream_commit: "4c293f306bc16a265c2d768af5d0cea138426054" +pin_frozen: "ROCKNIX 20261001 builds this revision. No branch of metallic77/flycast holds it any more: master was put back on the libretro merge base 4c293f30, so HEAD is the code before the fork's own commits." +core_version: "0.1" +display_name: "Sega - Dreamcast/Naomi (Flycast 2021)" +cores: + - "flycast2021" +systems: + - sega-dreamcast + - sega-naomi + - sega-atomiswave + +notes: | + The libretro/flycast tree as of April 2022 (merge base 4c293f30), from before + the libretro fork was rebased on flyinghead's Flycast, with 22 commits by + metallic77 on top that tune defaults and build flags for low-end handhelds. + ROCKNIX renames the core option prefix from reicast to flycast2021 and + installs the library as flycast2021_libretro.so. + ref: core/libretro/libretro.cpp:2296-2300 + + Every system file lives in /dc/. + ref: core/libretro/libretro.cpp:1893-1896 + + Dreamcast: the boot ROM is looked for as dc_boot.bin, dc_boot.bin.bin, + dc_bios.bin, dc_bios.bin.bin, the first that yields a full 2 MB read wins. + The HLE BIOS core option (hle_bios) defaults to enabled, and when it is on, or + when no boot ROM loads, reios boots the disc instead. Booting to the BIOS menu, + or starting without a disc, needs the real boot ROM and fails with -3 without + it. + ref: core/hw/holly/sb_mem.cpp:32-65, core/hw/holly/sb_mem.cpp:215-233, + core/hw/flashrom/flashrom.h:54-67, core/hw/flashrom/flashrom.h:84-118, + core/nullDC.cpp:420-431, core/nullDC.cpp:455-463, + core/libretro/libretro_core_options.h:133-145, core/libretro/libretro.cpp:726-731 + + NAOMI and Atomiswave: a BIOS archive is opened as /dc/ with .7z + then .zip appended. Each member is looked for in the game archive, its parent, + then the BIOS archive, by CRC32 and then by name; the BIOS table carries no + CRC32, so only the name matches. The member for the configured region is + tried first, then the first member listed. A game whose table entry names a + BIOS refuses to start without it; the others default to naomi. Five archive + names are reachable from the game table: naomi, awbios, f355bios, f355dlx, + hod2bios. airlbios and naomigd have table entries but no game names them. + ref: core/hw/naomi/naomi_cart.cpp:76-176, core/hw/naomi/naomi_cart.cpp:227-247, + core/archive/archive.cpp:26-42, core/hw/naomi/naomi_roms.h:76-217 + + LoadRomFiles also reads naomi_boot.bin, naomi_boot.bin.bin, naomi_bios.bin, + naomi_bios.bin.bin and epr-21576d.bin for NAOMI, but naomi_cart_Close clears + bios_loaded before the cartridge loads, so that file never stands in for + naomi.zip. + ref: core/hw/holly/sb_mem.cpp:59, core/hw/naomi/naomi_cart.cpp:427-444, + core/hw/naomi/naomi_cart.cpp:472-484 + +files: + - name: "dc_boot.bin" + path: "dc/dc_boot.bin" + aliases: ["dc_boot.bin.bin", "dc_bios.bin", "dc_bios.bin.bin"] + system: sega-dreamcast + required: false + hle_fallback: true + min_size: 2097152 + validation: [size] + description: "Dreamcast boot ROM" + note: "Read as 2 MB into the system ROM; a shorter file is rejected. Needed only to boot to the BIOS menu or when the HLE BIOS option is disabled." + source_ref: "core/hw/holly/sb_mem.cpp:50-65, core/hw/holly/sb_mem.cpp:215-229, core/hw/flashrom/flashrom.h:54-67, core/nullDC.cpp:420-431" + + - name: "dc_nvmem.bin" + path: "dc/dc_nvmem.bin" + aliases: ["dc_flash_wb.bin", "dc_flash.bin", "dc_flash.bin.bin"] + system: sega-dreamcast + required: false + min_size: 131072 + validation: [size] + description: "Dreamcast flash ROM" + note: "Loaded with the boot ROM and by the HLE path; a missing file leaves the flash blank and the core runs. Written back as dc_nvmem.bin." + source_ref: "core/hw/holly/sb_mem.cpp:196-213, core/hw/holly/sb_mem.cpp:231, core/hw/holly/sb_mem.cpp:236-243, core/hw/holly/sb_mem.cpp:271-278" + + - name: "font.bin" + path: "dc/font.bin" + system: sega-dreamcast + required: false + description: "Dreamcast system font for the HLE BIOS" + note: "Read whole into the font table of the reios ROM image. Absent, a built-in font is copied there." + source_ref: "core/reios/reios.cpp:736-755" + + - name: "naomi.zip" + path: "dc/naomi.zip" + category: bios_zip + system: sega-naomi + required: true + description: "NAOMI BIOS archive" + note: "Default BIOS of every NAOMI game whose table entry names none, cartridge, .lst, .bin and .dat images alike. One member is loaded: the one for the configured region, else epr-21576h.ic27." + source_ref: "core/hw/naomi/naomi_roms.h:132-189, core/hw/naomi/naomi_cart.cpp:227-247, core/hw/naomi/naomi_cart.cpp:472-484" + contents: + - name: "epr-21576h.ic27" + size: 2097152 + description: "Japan" + - name: "epr-21578h.ic27" + size: 2097152 + description: "Export" + - name: "epr-21577h.ic27" + size: 2097152 + description: "USA" + - name: "epr-21579d.ic27" + size: 2097152 + description: "Korea" + + - name: "awbios.zip" + path: "dc/awbios.zip" + category: bios_zip + system: sega-atomiswave + required: true + description: "Atomiswave BIOS archive" + note: "Named by all 34 Atomiswave games. Loaded into the flash chip, whose writable part is then reloaded from the save directory." + source_ref: "core/hw/naomi/naomi_roms.h:86-94, core/hw/naomi/naomi_cart.cpp:89-92, core/hw/naomi/naomi_cart.cpp:171-173" + contents: + - name: "bios0.ic23" + size: 131072 + + - name: "f355bios.zip" + path: "dc/f355bios.zip" + category: bios_zip + system: sega-naomi + required: true + description: "Ferrari F355 Challenge BIOS archive" + note: "Named by three Ferrari F355 Challenge entries, which refuse to start without it." + source_ref: "core/hw/naomi/naomi_roms.h:95-103, core/hw/naomi/naomi_cart.cpp:238-243" + contents: + - name: "epr-22851.ic27" + size: 2097152 + description: "Export" + - name: "epr-22850.ic27" + size: 2097152 + description: "USA" + - name: "epr-22849.ic27" + size: 2097152 + description: "Japan" + + - name: "f355dlx.zip" + path: "dc/f355dlx.zip" + category: bios_zip + system: sega-naomi + required: true + description: "Ferrari F355 Challenge Deluxe BIOS archive" + note: "Named by the f355 entry, which refuses to start without it." + source_ref: "core/hw/naomi/naomi_roms.h:104-119, core/hw/naomi/naomi_roms.h:1701, core/hw/naomi/naomi_cart.cpp:238-243" + contents: + - name: "epr-21864.ic27" + size: 2097152 + description: "Export" + - name: "epr-21863.ic27" + size: 2097152 + description: "USA" + - name: "epr-21862.ic27" + size: 2097152 + description: "Japan" + + - name: "hod2bios.zip" + path: "dc/hod2bios.zip" + category: bios_zip + system: sega-naomi + required: true + description: "The House of the Dead 2 BIOS archive" + note: "Named by four House of the Dead 2 entries, which refuse to start without it." + source_ref: "core/hw/naomi/naomi_roms.h:120-131, core/hw/naomi/naomi_cart.cpp:238-243" + contents: + - name: "epr-21331.ic27" + size: 2097152 + description: "Export" + - name: "epr-21330.ic27" + size: 2097152 + description: "USA" + - name: "epr-21329.ic27" + size: 2097152 + description: "Japan" diff --git a/emulators/mednafen_supafaust.yml b/emulators/mednafen_supafaust.yml index 21ef670d..a3b91783 100644 --- a/emulators/mednafen_supafaust.yml +++ b/emulators/mednafen_supafaust.yml @@ -7,7 +7,7 @@ profiled_date: "2026-03-24" source_commit: "642d1d1b6684aa7e306a02a89885f3f5456a5157" core_version: "1.29.0" display_name: "Nintendo - SNES / SFC (Beetle Supafaust)" -cores: [mednafen_supafaust, supafaust] +cores: [mednafen_supafaust, supafaust, beetle_supafaust] systems: [nintendo-snes] # Port of Mednafen's experimental snes_faust module. diff --git a/emulators/mupen64plus_next.yml b/emulators/mupen64plus_next.yml index 5b07c393..9571717e 100644 --- a/emulators/mupen64plus_next.yml +++ b/emulators/mupen64plus_next.yml @@ -8,7 +8,7 @@ source_commit: "12edd2c74a517ff86dfa8cfc71ad75e4c10486d5" core_version: "2.6.0" display_name: "Nintendo - Nintendo 64 (Mupen64Plus-Next)" systems: [nintendo-64, nintendo-64dd] -cores: [mupen64plus_next, mupen64plus_next_develop, mupen64plus_next_gles3, mupen64plus_next_gles2, mupen64plus, mupen64plus-next] +cores: [mupen64plus_next, mupen64plus_next_develop, mupen64plus_next_gles3, mupen64plus_next_gles2, mupen64plus, mupen64plus-next, mupen64plus_nx] files: - name: "IPL.n64" diff --git a/emulators/nanoboyadvance.yml b/emulators/nanoboyadvance.yml new file mode 100644 index 00000000..15ae81b5 --- /dev/null +++ b/emulators/nanoboyadvance.yml @@ -0,0 +1,47 @@ +emulator: "NanoBoyAdvance" +type: standalone +core_classification: other +source: "https://github.com/nba-emu/NanoBoyAdvance" +profiled_date: "2026-10-17" +source_commit: "3bb6f478f977dbfd3106508536e5fbce90d1898b" +pin_frozen: "ROCKNIX 20261001 builds this revision of the SDL2 frontend (v1.6 plus four commits). Later upstream work is not part of that build." +core_version: "1.6" +display_name: "Nintendo - Game Boy Advance (NanoBoyAdvance)" +cores: + - "nanoboyadvance" + - "nanoboyadvance-sa" +systems: + - nintendo-gba + +notes: | + Game Boy Advance emulator. ROCKNIX builds the SDL2 frontend only + (PLATFORM_SDL2=ON, PLATFORM_QT=OFF). + + The SDL2 frontend changes the working directory to the executable's + directory, then reads config.toml there. The BIOS path is the general.bios_path + key of that file, default "bios.bin", overridden by --bios on the command line. + ref: src/platform/sdl/main.cpp:288-293, src/platform/core/src/config.cpp:36, + src/platform/core/include/platform/config.hpp:17, src/platform/sdl/main.cpp:98-102 + + The BIOS is required. BIOSLoader refuses a missing path, a directory, and any + size other than 16 KB; the frontend prints the reason and exits. There is no + built-in replacement. bios_skip only jumps past the boot screen after the BIOS + is loaded. + ref: src/platform/core/src/loader/bios.cpp:17-48, src/platform/sdl/main.cpp:177-192, + src/nba/src/core.cpp:42-44 + + ROCKNIX patches config.toml and keymap.toml to /storage/.config/nanoboyadvance/ + and its config.toml sets bios_path = /storage/roms/bios/gba_bios.bin. + +files: + - name: "bios.bin" + path: "bios.bin" + aliases: ["gba_bios.bin"] + system: nintendo-gba + required: true + size: 16384 + validation: [size] + config_key: "general.bios_path" + description: "Game Boy Advance BIOS" + note: "Any file name through general.bios_path or --bios; bios.bin beside the executable when neither is set. ROCKNIX points the key at gba_bios.bin in its BIOS directory." + source_ref: "src/platform/core/src/loader/bios.cpp:17-48, src/platform/core/src/config.cpp:36, src/platform/sdl/main.cpp:177-192" diff --git a/emulators/supersnes9x.yml b/emulators/supersnes9x.yml new file mode 100644 index 00000000..1ab8a9ca --- /dev/null +++ b/emulators/supersnes9x.yml @@ -0,0 +1,133 @@ +emulator: "SuperSnes9x" +type: libretro +core_classification: enhanced_fork +source: "https://github.com/shanytc/snes9x" +upstream: "https://github.com/snes9xgit/snes9x" +profiled_date: "2026-10-17" +source_commit: "691e47b40fb38fa522a5471462344a2f0206b7a8" +pin_frozen: "ROCKNIX 20261001 builds this revision. Later commits on shanytc/snes9x rework the Super Famicom Box loader and are not part of that build." +core_version: "1.63.29" +display_name: "Nintendo - SNES / SFC / SGB / GB / GBC (SuperSnes9x)" +cores: + - "supersnes9x" +systems: + - nintendo-snes + - nintendo-satellaview + - nintendo-sufami-turbo + - nintendo-sfcbox + - nintendo-sgb + - nintendo-gb + - nintendo-gbc + +notes: | + Snes9x fork that adds a Game Boy core behind a Super Game Boy subsystem, the + Super Famicom Box (HD64180 supervisor) and other boards. The libretro build + compiles sfcbox.cpp, hd64180.cpp and the sgb/ tree. + ref: snes9x.h:11-13, libretro/Makefile.common:53-69 + + BIOS_DIR is the frontend's system directory. LoadBIOS, used for BS-X.bin and + STBIOS.bin, tries the content directory first and requires the read to fill + the whole buffer it is given. + ref: libretro/libretro.cpp:2320-2326, libretro/libretro.cpp:1145-1176 + + Game Boy content: with the snes9x_sgb_bios option at its default (auto) the + core looks for an SGB2 BIOS, then an SGB1 BIOS, in the content directory, + BIOS_DIR, then the working directory. A candidate is accepted only when its + header at 0x7FC0 reads "Super GAMEBOY", the next byte deciding SGB2. Without + one the built-in BIOS-less Game Boy core runs the cart. In BIOS mode a + 256-byte GB-side boot ROM is read too, and used only when it contains the + 3E F1 handshake sequence; otherwise an embedded SGB boot ROM is used. + ref: libretro/libretro.cpp:657-671, memmap.cpp:1088-1155, + memmap.cpp:1165-1213, memmap.cpp:1655-1686, memmap.cpp:1858-1883 + + Satellaview: a BS-X cart loads only with BS-X.bin (1 MB). The BS-X slot code + reads BS-X.bin or BS-X.bios from BIOS_DIR. + ref: libretro/libretro.cpp:1308-1311, bsx.cpp:1204-1235, bsx.cpp:1301-1307 + + Sufami Turbo: a cart loads only with STBIOS.bin (256 KB). The Sufami Turbo + subsystem asks LoadBIOS for 0x100000 bytes, so a 256 KB STBIOS.bin fails that + path; the plain content path and the two-cart path ask for 0x40000. + ref: libretro/libretro.cpp:1302-1305, libretro/libretro.cpp:1413-1425, + libretro/libretro.cpp:1445-1455 + + Super Famicom Box: the supervisor ROM is looked for in BIOS_DIR, the content + directory, its BIOS and ../BIOS subfolders, then the directory of the loaded + file. Without it the image is refused. The OSD font is optional. + ref: sfcbox.cpp:1350-1407, memmap.cpp:2561-2562 + +files: + - name: "BS-X.bin" + aliases: ["BS-X.bios"] + system: nintendo-satellaview + required: true + min_size: 1048576 + validation: [size] + description: "Satellaview BS-X BIOS" + note: "Required for BS-X carts. BS-X.bios is accepted by the slot code in bsx.cpp only." + source_ref: "libretro/libretro.cpp:1145-1176, libretro/libretro.cpp:1308-1311, bsx.cpp:1204-1235" + + - name: "STBIOS.bin" + system: nintendo-sufami-turbo + required: true + min_size: 262144 + validation: [size] + description: "Sufami Turbo BIOS" + note: "Required for Sufami Turbo carts. The Sufami Turbo subsystem reads 1 MB and rejects a 256 KB file." + source_ref: "libretro/libretro.cpp:1145-1176, libretro/libretro.cpp:1302-1305, libretro/libretro.cpp:1445-1455" + + - name: "sgb2.sfc" + aliases: ["SGB2.sfc", "Super Game Boy 2 (Japan).sfc"] + system: nintendo-sgb + required: false + description: "Super Game Boy 2 SNES BIOS" + note: "Preferred over sgb.sfc in auto mode. Header at 0x7FC0 must read \"Super GAMEBOY2\". Without an SGB BIOS, GB content runs on the BIOS-less core." + source_ref: "memmap.cpp:1088-1155, memmap.cpp:1655-1665" + + - name: "sgb.sfc" + aliases: ["SGB.sfc", "sgb1.sfc", "SGB1.sfc", "Super Game Boy (World).sfc"] + system: nintendo-sgb + required: false + description: "Super Game Boy SNES BIOS" + note: "Used when no SGB2 BIOS is found, or alone with the option set to sgb1. Header at 0x7FC0 must read \"Super GAMEBOY\" not followed by '2'." + source_ref: "memmap.cpp:1088-1155, memmap.cpp:1655-1665" + + - name: "sgb2.boot.rom" + aliases: ["sgb2_bios.bin"] + system: nintendo-sgb + required: false + hle_fallback: true + size: 256 + validation: [size] + description: "Super Game Boy 2 GB-side boot ROM" + note: "Read in SGB2 BIOS mode; used only when it contains the 3E F1 handshake bytes, else the embedded boot ROM runs." + source_ref: "memmap.cpp:1165-1213, memmap.cpp:1858-1883" + + - name: "sgb.boot.rom" + aliases: ["sgb1.boot.rom", "sgb_bios.bin"] + system: nintendo-sgb + required: false + hle_fallback: true + size: 256 + validation: [size] + description: "Super Game Boy GB-side boot ROM" + note: "Read in SGB1 BIOS mode; used only when it contains the 3E F1 handshake bytes, else the embedded boot ROM runs." + source_ref: "memmap.cpp:1165-1213, memmap.cpp:1858-1883" + + - name: "KROM1.BIN" + aliases: ["KROM.BIN", "krom1.bin"] + system: nintendo-sfcbox + required: true + min_size: 65536 + validation: [size] + description: "Super Famicom Box supervisor ROM (HD64180)" + note: "Required for Super Famicom Box images: LoadSFCBox returns false without it." + source_ref: "sfcbox.cpp:1350-1398, sfcbox.h:20, memmap.cpp:2561-2562" + + - name: "MB90082.BIN" + system: nintendo-sfcbox + required: false + min_size: 9216 + validation: [size] + description: "Super Famicom Box OSD character ROM" + note: "Absent, the supervisor overlay is not drawn." + source_ref: "sfcbox.cpp:1400-1403, sfcbox.h:25" diff --git a/emulators/touchhle.yml b/emulators/touchhle.yml new file mode 100644 index 00000000..189656c0 --- /dev/null +++ b/emulators/touchhle.yml @@ -0,0 +1,206 @@ +emulator: "touchHLE" +type: standalone +core_classification: embedded_hle +source: "https://github.com/touchHLE/touchHLE" +profiled_date: "2026-10-17" +source_commit: "3c5850585ba55615b17a58c58331b6d6f52d4a9d" +pin_frozen: "ROCKNIX 20261001 builds this revision. Later upstream commits are not part of that build." +core_version: "0.2.3" +display_name: "Apple - iPhone OS (touchHLE)" +cores: + - "touchhle" + - "touchhle-sa" +systems: + - apple-ios + +notes: | + High-level emulator for iPhone OS apps. The operating system and its + frameworks are reimplemented in Rust, so no Apple firmware or system file is + opened. What it reads besides the app are resources bundled with it: three + Free Software ARMv6 libraries, fonts, and a table of default per-app options. + ref: Cargo.toml:7, src/paths.rs:9-12, src/paths.rs:28-36 + + Resources are opened relative to the working directory, or the Resources + folder of a macOS bundle. ROCKNIX patches the Linux base to /usr/lib/touchHLE. + ref: src/paths.rs:63-82 + + The libraries are mapped into the guest at /usr/lib under their own names and + aliases. An app binary that links one of them loads it from there, and fails + to start with "Could not load bundled dylib" when the host file is missing. + ref: src/fs.rs:588-622, src/environment.rs:384-413 + + Fonts are opened the first time an app draws text in that face, and a + missing or unparsable file is a panic. The Liberation families stand in for + the iPhone OS faces; Noto Sans JP is used for strings holding kana or kanji. + ROCKNIX installs only the LiberationSans files, so an app that asks for a + monospace, serif or Japanese face stops there. + ref: src/font.rs:70-129, src/frameworks/uikit/ui_font.rs:26-43, + src/frameworks/uikit/ui_font.rs:180-205 + + touchHLE_default_options.txt is read before the user's touchHLE_options.txt; + when it cannot be opened a warning is printed and the app runs without it. + ref: src/lib.rs:319-323 + +files: + - name: "libgcc_s.1.dylib" + path: "touchHLE_dylibs/libgcc_s.1.dylib" + system: apple-ios + required: false + bundled: true + description: "GCC runtime library from the iPhoneOS 4.0 SDK" + note: "Exposed as /usr/lib/libgcc_s.1.dylib. Needed by apps that link it." + source_ref: "src/fs.rs:588-622, src/environment.rs:384-413" + + - name: "libstdc++.6.0.9.dylib" + path: "touchHLE_dylibs/libstdc++.6.0.9.dylib" + system: apple-ios + required: false + bundled: true + description: "GNU C++ standard library from the iPhoneOS 4.0 SDK" + note: "Exposed as /usr/lib/libstdc++.6.dylib and /usr/lib/libstdc++.6.0.9.dylib. Needed by apps that link it." + source_ref: "src/fs.rs:588-622, src/environment.rs:384-413" + + - name: "libz.1.2.3.dylib" + path: "touchHLE_dylibs/libz.1.2.3.dylib" + system: apple-ios + required: false + bundled: true + description: "zlib built from Apple's zlib-23.0.1 sources" + note: "Exposed as /usr/lib/libz.1.2.3.dylib, libz.1.dylib, libz.dylib and libz.1.1.3.dylib. Needed by apps that link it." + source_ref: "src/fs.rs:588-622, src/environment.rs:384-413" + + - name: "LiberationMono-Regular.ttf" + path: "touchHLE_fonts/LiberationMono-Regular.ttf" + system: apple-ios + required: false + bundled: true + description: "Bundled font" + note: "Opened on first use of its face; touchHLE panics when it is missing." + source_ref: "src/font.rs:70-85, src/font.rs:88-90" + + - name: "LiberationMono-Bold.ttf" + path: "touchHLE_fonts/LiberationMono-Bold.ttf" + system: apple-ios + required: false + bundled: true + description: "Bundled font" + note: "Opened on first use of its face; touchHLE panics when it is missing." + source_ref: "src/font.rs:70-85, src/font.rs:91-93" + + - name: "LiberationMono-BoldItalic.ttf" + path: "touchHLE_fonts/LiberationMono-BoldItalic.ttf" + system: apple-ios + required: false + bundled: true + description: "Bundled font" + note: "Opened on first use of its face; touchHLE panics when it is missing." + source_ref: "src/font.rs:70-85, src/font.rs:94-96" + + - name: "LiberationMono-Italic.ttf" + path: "touchHLE_fonts/LiberationMono-Italic.ttf" + system: apple-ios + required: false + bundled: true + description: "Bundled font" + note: "Opened on first use of its face; touchHLE panics when it is missing." + source_ref: "src/font.rs:70-85, src/font.rs:97-99" + + - name: "LiberationSans-Regular.ttf" + path: "touchHLE_fonts/LiberationSans-Regular.ttf" + system: apple-ios + required: false + bundled: true + description: "Bundled font" + note: "Opened on first use of its face; touchHLE panics when it is missing." + source_ref: "src/font.rs:70-85, src/font.rs:100-102" + + - name: "LiberationSans-Bold.ttf" + path: "touchHLE_fonts/LiberationSans-Bold.ttf" + system: apple-ios + required: false + bundled: true + description: "Bundled font" + note: "Opened on first use of its face; touchHLE panics when it is missing." + source_ref: "src/font.rs:70-85, src/font.rs:103-105" + + - name: "LiberationSans-BoldItalic.ttf" + path: "touchHLE_fonts/LiberationSans-BoldItalic.ttf" + system: apple-ios + required: false + bundled: true + description: "Bundled font" + note: "Opened on first use of its face; touchHLE panics when it is missing." + source_ref: "src/font.rs:70-85, src/font.rs:106-108" + + - name: "LiberationSans-Italic.ttf" + path: "touchHLE_fonts/LiberationSans-Italic.ttf" + system: apple-ios + required: false + bundled: true + description: "Bundled font" + note: "Opened on first use of its face; touchHLE panics when it is missing." + source_ref: "src/font.rs:70-85, src/font.rs:109-111" + + - name: "LiberationSerif-Regular.ttf" + path: "touchHLE_fonts/LiberationSerif-Regular.ttf" + system: apple-ios + required: false + bundled: true + description: "Bundled font" + note: "Opened on first use of its face; touchHLE panics when it is missing." + source_ref: "src/font.rs:70-85, src/font.rs:112-114" + + - name: "LiberationSerif-Bold.ttf" + path: "touchHLE_fonts/LiberationSerif-Bold.ttf" + system: apple-ios + required: false + bundled: true + description: "Bundled font" + note: "Opened on first use of its face; touchHLE panics when it is missing." + source_ref: "src/font.rs:70-85, src/font.rs:115-117" + + - name: "LiberationSerif-BoldItalic.ttf" + path: "touchHLE_fonts/LiberationSerif-BoldItalic.ttf" + system: apple-ios + required: false + bundled: true + description: "Bundled font" + note: "Opened on first use of its face; touchHLE panics when it is missing." + source_ref: "src/font.rs:70-85, src/font.rs:118-120" + + - name: "LiberationSerif-Italic.ttf" + path: "touchHLE_fonts/LiberationSerif-Italic.ttf" + system: apple-ios + required: false + bundled: true + description: "Bundled font" + note: "Opened on first use of its face; touchHLE panics when it is missing." + source_ref: "src/font.rs:70-85, src/font.rs:121-123" + + - name: "NotoSansJP-Regular.otf" + path: "touchHLE_fonts/NotoSansJP-Regular.otf" + system: apple-ios + required: false + bundled: true + description: "Bundled font" + note: "Opened on first use of its face; touchHLE panics when it is missing." + source_ref: "src/font.rs:70-85, src/font.rs:124-126" + + - name: "NotoSansJP-Bold.otf" + path: "touchHLE_fonts/NotoSansJP-Bold.otf" + system: apple-ios + required: false + bundled: true + description: "Bundled font" + note: "Opened on first use of its face; touchHLE panics when it is missing." + source_ref: "src/font.rs:70-85, src/font.rs:127-129" + + - name: "touchHLE_default_options.txt" + path: "touchHLE_default_options.txt" + system: apple-ios + required: false + bundled: true + category: game_data + description: "Default options per app" + note: "Command-line style options keyed by app bundle identifier, applied before the user's own file." + source_ref: "src/paths.rs:36, src/lib.rs:319-323" diff --git a/emulators/x1.yml b/emulators/x1.yml index e2533cda..71759257 100644 --- a/emulators/x1.yml +++ b/emulators/x1.yml @@ -9,6 +9,7 @@ core_version: "0.60a" display_name: "Sharp X1 (X Millennium)" cores: - x1 + - xmil systems: - sharp-x1 diff --git a/platforms/_registry.yml b/platforms/_registry.yml index 6b1c34da..c1def9da 100644 --- a/platforms/_registry.yml +++ b/platforms/_registry.yml @@ -374,6 +374,8 @@ platforms: logo: https://avatars.githubusercontent.com/u/152618023 scraper: rocknix schedule: weekly + target_scraper: rocknix_targets + target_source: https://github.com/ROCKNIX/distribution/blob/next/projects/ROCKNIX/packages/virtual/emulators/package.mk install: detect: - os: linux diff --git a/platforms/targets/_overrides.yml b/platforms/targets/_overrides.yml index ab19c2ef..dec39866 100644 --- a/platforms/targets/_overrides.yml +++ b/platforms/targets/_overrides.yml @@ -112,3 +112,19 @@ retropie: _default: # Homebrew game scriptmodule, not an emulator. remove_cores: [superflappybirds] + +rocknix: + targets: + _default: + # Runtimes and launchers the emulators metapackage installs beside the + # emulators: x86 translation (box64, box86), Windows (wine), the Steam + # and Heroic clients, and PortMaster, which installs ports. + remove_cores: + - box64 + - box86 + - heroic + - portmaster + - steam + - wine + amd64: + aliases: [x86_64, pc] diff --git a/platforms/targets/rocknix.yml b/platforms/targets/rocknix.yml new file mode 100644 index 00000000..6116885c --- /dev/null +++ b/platforms/targets/rocknix.yml @@ -0,0 +1,2088 @@ +platform: rocknix +source: https://github.com/ROCKNIX/distribution/tree/20261001/projects/ROCKNIX/packages/virtual/emulators/package.mk +scraped_at: '2026-10-17T13:15:29Z' +targets: + amd64: + architecture: x86_64 + cores: + - '81' + - a5200 + - amiberry + - arduous + - ares + - armsx2 + - atari800 + - azahar + - b2 + - beetle_gba + - beetle_lynx + - beetle_ngp + - beetle_pce + - beetle_pce_fast + - beetle_pcfx + - beetle_psx + - beetle_saturn + - beetle_supafaust + - beetle_supergrafx + - beetle_vb + - beetle_wswan + - bk + - bluemsx + - boom3 + - bsnes + - bsnes2014_accuracy + - bsnes2014_balanced + - bsnes2014_performance + - bsnes_hd + - bsnes_mercury_accuracy + - bsnes_mercury_balanced + - bsnes_mercury_performance + - cap32 + - cemu + - crocods + - daphne + - dolphin + - dosbox_core + - dosbox_pure + - doublecherrygb + - duckstation + - easyrpg + - ecwolf + - emuscv + - fake08 + - fbalpha2012 + - fbalpha2019 + - fbneo + - fceumm + - flycast + - fmsx + - freechaf + - freeintv + - freej2me + - fuse + - gambatte + - gearboy + - gearcoleco + - geargrafx + - gearlynx + - gearsystem + - genesis_plus_gx + - genesis_plus_gx_wide + - geolith + - gopher64 + - gw + - gzdoom + - handy + - hatari + - hypseus-singe + - jaxe + - mame + - mame2003_plus + - mame2010 + - mame2015 + - mednafen + - melonds + - melonds_ds + - mesen + - mesen_s + - mgba + - minivmac + - mojozork + - moonlight + - mu + - mupen64plus + - mupen64plus_nx + - nanoboyadvance + - neocd + - nestopia + - np2kai + - o2em + - openbor + - opera + - parallel_n64 + - pcsx_rearmed + - pico-8 + - picodrive + - pokemini + - potator + - ppsspp + - prboom + - prosystem + - puae + - puae2021 + - px68k + - quasi88 + - quicknes + - race + - same_cdi + - sameboy + - sameduck + - scummvm + - skyemu + - smsplus_gx + - snes9x + - snes9x2002 + - snes9x2005_plus + - snes9x2010 + - stella + - supersnes9x + - swanstation + - tgbdual + - theodore + - tic80 + - touchhle + - tyrquake + - uzem + - vba_next + - vbam + - vecx + - vice + - vircon32 + - virtualjaguar + - vita3k + - vitaquake2 + - vitaquake3 + - wasm4 + - wine + - xemu + - xmil + - yabasanshiro + h700: + architecture: aarch64 + cores: + - '81' + - a5200 + - amiberry + - arduous + - atari800 + - b2 + - beetle_gba + - beetle_lynx + - beetle_ngp + - beetle_pce + - beetle_pce_fast + - beetle_pcfx + - beetle_supafaust + - beetle_supergrafx + - beetle_vb + - beetle_wswan + - bk + - bluemsx + - box64 + - box86 + - bsnes2014_accuracy + - bsnes2014_balanced + - bsnes2014_performance + - bsnes_mercury_accuracy + - bsnes_mercury_balanced + - bsnes_mercury_performance + - cap32 + - crocods + - daphne + - desmume + - dosbox_core + - dosbox_pure + - doublecherrygb + - drastic + - dsperate + - duckstation + - easyrpg + - ecwolf + - emuscv + - fake08 + - fbalpha2012 + - fbalpha2019 + - fbneo + - fceumm + - flycast + - flycast2021 + - fmsx + - freechaf + - freeintv + - freej2me + - fuse + - gambatte + - gearboy + - gearcoleco + - geargrafx + - gearlynx + - gearsystem + - genesis_plus_gx + - genesis_plus_gx_wide + - geolith + - gpsp + - gw + - gzdoom + - handy + - hatari + - hypseus-singe + - jaxe + - mame + - mame2003_plus + - mame2010 + - mame2015 + - mednafen + - melonds + - melonds_ds + - mesen + - mesen_s + - mgba + - minivmac + - mojozork + - moonlight + - mu + - mupen64plus + - mupen64plus_nx + - neocd + - nestopia + - np2kai + - o2em + - openbor + - opera + - parallel_n64 + - pcsx_rearmed + - pico-8 + - picodrive + - pokemini + - portmaster + - potator + - ppsspp + - prboom + - prosystem + - puae + - puae2021 + - px68k + - quasi88 + - quicknes + - race + - same_cdi + - sameboy + - sameduck + - scummvm + - skyemu + - smsplus_gx + - snes9x + - snes9x2002 + - snes9x2005_plus + - snes9x2010 + - stella + - supersnes9x + - swanstation + - tgbdual + - theodore + - tic80 + - touchhle + - tyrquake + - uae4arm + - uzem + - vba_next + - vbam + - vecx + - vice + - vircon32 + - virtualjaguar + - vitaquake2 + - wasm4 + - wine + - xmil + - yabasanshiro + rk3326: + architecture: aarch64 + cores: + - '81' + - a5200 + - amiberry + - arduous + - atari800 + - b2 + - beetle_gba + - beetle_lynx + - beetle_ngp + - beetle_pce + - beetle_pce_fast + - beetle_pcfx + - beetle_supafaust + - beetle_supergrafx + - beetle_vb + - beetle_wswan + - bk + - bluemsx + - box64 + - box86 + - bsnes2014_accuracy + - bsnes2014_balanced + - bsnes2014_performance + - bsnes_mercury_accuracy + - bsnes_mercury_balanced + - bsnes_mercury_performance + - cap32 + - crocods + - daphne + - desmume + - dosbox_core + - dosbox_pure + - doublecherrygb + - drastic + - dsperate + - duckstation + - easyrpg + - ecwolf + - emuscv + - fake08 + - fbalpha2012 + - fbalpha2019 + - fbneo + - fceumm + - flycast + - flycast2021 + - fmsx + - freechaf + - freeintv + - freej2me + - fuse + - gambatte + - gearboy + - gearcoleco + - geargrafx + - gearlynx + - gearsystem + - genesis_plus_gx + - genesis_plus_gx_wide + - geolith + - gpsp + - gw + - gzdoom + - handy + - hatari + - hypseus-singe + - jaxe + - mame + - mame2003_plus + - mame2010 + - mame2015 + - mednafen + - melonds + - melonds_ds + - mesen + - mesen_s + - mgba + - minivmac + - mojozork + - moonlight + - mu + - mupen64plus + - mupen64plus_nx + - neocd + - nestopia + - np2kai + - o2em + - openbor + - opera + - parallel_n64 + - pcsx_rearmed + - pico-8 + - picodrive + - pokemini + - portmaster + - potator + - ppsspp + - prboom + - prosystem + - puae + - puae2021 + - px68k + - quasi88 + - quicknes + - race + - same_cdi + - sameboy + - sameduck + - scummvm + - skyemu + - smsplus_gx + - snes9x + - snes9x2002 + - snes9x2005_plus + - snes9x2010 + - stella + - supersnes9x + - swanstation + - tgbdual + - theodore + - tic80 + - touchhle + - tyrquake + - uae4arm + - uzem + - vba_next + - vbam + - vecx + - vice + - vircon32 + - virtualjaguar + - vitaquake2 + - wasm4 + - wine + - xmil + - yabasanshiro + rk3399: + architecture: aarch64 + cores: + - '81' + - a5200 + - aethersx2 + - amiberry + - arduous + - armsx2 + - atari800 + - b2 + - beetle_gba + - beetle_lynx + - beetle_ngp + - beetle_pce + - beetle_pce_fast + - beetle_pcfx + - beetle_psx + - beetle_supafaust + - beetle_supergrafx + - beetle_vb + - beetle_wswan + - bk + - bluemsx + - box64 + - box86 + - bsnes + - bsnes2014_accuracy + - bsnes2014_balanced + - bsnes2014_performance + - bsnes_hd + - bsnes_mercury_accuracy + - bsnes_mercury_balanced + - bsnes_mercury_performance + - cap32 + - crocods + - daphne + - desmume + - dolphin + - dosbox_core + - dosbox_pure + - doublecherrygb + - drastic + - dsperate + - duckstation + - easyrpg + - ecwolf + - emuscv + - fake08 + - fbalpha2012 + - fbalpha2019 + - fbneo + - fceumm + - flycast + - flycast2021 + - fmsx + - freechaf + - freeintv + - freej2me + - fuse + - gambatte + - gearboy + - gearcoleco + - geargrafx + - gearlynx + - gearsystem + - genesis_plus_gx + - genesis_plus_gx_wide + - geolith + - gpsp + - gw + - gzdoom + - handy + - hatari + - hypseus-singe + - jaxe + - mame + - mame2003_plus + - mame2010 + - mame2015 + - mednafen + - melonds + - melonds_ds + - mesen + - mesen_s + - mgba + - minivmac + - mojozork + - moonlight + - mu + - mupen64plus + - mupen64plus_nx + - nanoboyadvance + - neocd + - nestopia + - np2kai + - o2em + - openbor + - opera + - parallel_n64 + - pcsx_rearmed + - pico-8 + - picodrive + - pokemini + - portmaster + - potator + - ppsspp + - prboom + - prosystem + - puae + - puae2021 + - px68k + - quasi88 + - quicknes + - race + - same_cdi + - sameboy + - sameduck + - scummvm + - skyemu + - smsplus_gx + - snes9x + - snes9x2002 + - snes9x2005_plus + - snes9x2010 + - stella + - supersnes9x + - swanstation + - tgbdual + - theodore + - tic80 + - touchhle + - tyrquake + - uae4arm + - uzem + - vba_next + - vbam + - vecx + - vice + - vircon32 + - virtualjaguar + - vitaquake2 + - wasm4 + - wine + - xmil + - yabasanshiro + rk3566: + architecture: aarch64 + cores: + - '81' + - a5200 + - aethersx2 + - amiberry + - arduous + - armsx2 + - atari800 + - azahar + - b2 + - beetle_gba + - beetle_lynx + - beetle_ngp + - beetle_pce + - beetle_pce_fast + - beetle_pcfx + - beetle_supafaust + - beetle_supergrafx + - beetle_vb + - beetle_wswan + - bk + - bluemsx + - box64 + - box86 + - bsnes2014_accuracy + - bsnes2014_balanced + - bsnes2014_performance + - bsnes_mercury_accuracy + - bsnes_mercury_balanced + - bsnes_mercury_performance + - cap32 + - crocods + - daphne + - desmume + - dolphin + - dosbox_core + - dosbox_pure + - doublecherrygb + - drastic + - dsperate + - duckstation + - easyrpg + - ecwolf + - emuscv + - fake08 + - fbalpha2012 + - fbalpha2019 + - fbneo + - fceumm + - flycast + - flycast2021 + - fmsx + - freechaf + - freeintv + - freej2me + - fuse + - gambatte + - gearboy + - gearcoleco + - geargrafx + - gearlynx + - gearsystem + - genesis_plus_gx + - genesis_plus_gx_wide + - geolith + - gpsp + - gw + - gzdoom + - handy + - hatari + - hypseus-singe + - jaxe + - mame + - mame2003_plus + - mame2010 + - mame2015 + - mednafen + - melonds + - melonds_ds + - mesen + - mesen_s + - mgba + - minivmac + - mojozork + - moonlight + - mu + - mupen64plus + - mupen64plus_nx + - neocd + - nestopia + - np2kai + - o2em + - openbor + - opera + - parallel_n64 + - pcsx_rearmed + - pico-8 + - picodrive + - pokemini + - portmaster + - potator + - ppsspp + - prboom + - prosystem + - puae + - puae2021 + - px68k + - quasi88 + - quicknes + - race + - same_cdi + - sameboy + - sameduck + - scummvm + - skyemu + - smsplus_gx + - snes9x + - snes9x2002 + - snes9x2005_plus + - snes9x2010 + - stella + - supersnes9x + - swanstation + - tgbdual + - theodore + - tic80 + - touchhle + - tyrquake + - uae4arm + - uzem + - vba_next + - vbam + - vecx + - vice + - vircon32 + - virtualjaguar + - vita3k + - vitaquake2 + - wasm4 + - wine + - xmil + - yabasanshiro + rk3576: + architecture: aarch64 + cores: + - '81' + - a5200 + - aethersx2 + - amiberry + - arduous + - armsx2 + - atari800 + - azahar + - b2 + - beetle_gba + - beetle_lynx + - beetle_ngp + - beetle_pce + - beetle_pce_fast + - beetle_pcfx + - beetle_supafaust + - beetle_supergrafx + - beetle_vb + - beetle_wswan + - bk + - bluemsx + - box64 + - box86 + - bsnes2014_accuracy + - bsnes2014_balanced + - bsnes2014_performance + - bsnes_mercury_accuracy + - bsnes_mercury_balanced + - bsnes_mercury_performance + - cap32 + - crocods + - daphne + - desmume + - dolphin + - dosbox_core + - dosbox_pure + - doublecherrygb + - drastic + - dsperate + - duckstation + - easyrpg + - ecwolf + - emuscv + - fake08 + - fbalpha2012 + - fbalpha2019 + - fbneo + - fceumm + - flycast + - flycast2021 + - fmsx + - freechaf + - freeintv + - freej2me + - fuse + - gambatte + - gearboy + - gearcoleco + - geargrafx + - gearlynx + - gearsystem + - genesis_plus_gx + - genesis_plus_gx_wide + - geolith + - gpsp + - gw + - gzdoom + - handy + - hatari + - hypseus-singe + - jaxe + - mame + - mame2003_plus + - mame2010 + - mame2015 + - mednafen + - melonds + - melonds_ds + - mesen + - mesen_s + - mgba + - minivmac + - mojozork + - moonlight + - mu + - mupen64plus + - mupen64plus_nx + - neocd + - nestopia + - np2kai + - o2em + - openbor + - opera + - parallel_n64 + - pcsx_rearmed + - pico-8 + - picodrive + - pokemini + - portmaster + - potator + - ppsspp + - prboom + - prosystem + - puae + - puae2021 + - px68k + - quasi88 + - quicknes + - race + - same_cdi + - sameboy + - sameduck + - scummvm + - skyemu + - smsplus_gx + - snes9x + - snes9x2002 + - snes9x2005_plus + - snes9x2010 + - stella + - supersnes9x + - swanstation + - tgbdual + - theodore + - tic80 + - touchhle + - tyrquake + - uae4arm + - uzem + - vba_next + - vbam + - vecx + - vice + - vircon32 + - virtualjaguar + - vita3k + - vitaquake2 + - wasm4 + - wine + - xmil + - yabasanshiro + rk3588: + architecture: aarch64 + cores: + - '81' + - a5200 + - aethersx2 + - amiberry + - arduous + - armsx2 + - atari800 + - azahar + - b2 + - beetle_gba + - beetle_lynx + - beetle_ngp + - beetle_pce + - beetle_pce_fast + - beetle_pcfx + - beetle_psx + - beetle_saturn + - beetle_supafaust + - beetle_supergrafx + - beetle_vb + - beetle_wswan + - bk + - bluemsx + - box64 + - box86 + - bsnes + - bsnes2014_accuracy + - bsnes2014_balanced + - bsnes2014_performance + - bsnes_hd + - bsnes_mercury_accuracy + - bsnes_mercury_balanced + - bsnes_mercury_performance + - cap32 + - crocods + - daphne + - desmume + - dolphin + - dosbox_core + - dosbox_pure + - doublecherrygb + - drastic + - dsperate + - duckstation + - easyrpg + - ecwolf + - emuscv + - fake08 + - fbalpha2012 + - fbalpha2019 + - fbneo + - fceumm + - flycast + - flycast2021 + - fmsx + - freechaf + - freeintv + - freej2me + - fuse + - gambatte + - gearboy + - gearcoleco + - geargrafx + - gearlynx + - gearsystem + - genesis_plus_gx + - genesis_plus_gx_wide + - geolith + - gpsp + - gw + - gzdoom + - handy + - hatari + - hypseus-singe + - jaxe + - mame + - mame2003_plus + - mame2010 + - mame2015 + - mednafen + - melonds + - melonds_ds + - mesen + - mesen_s + - mgba + - minivmac + - mojozork + - moonlight + - mu + - mupen64plus + - mupen64plus_nx + - neocd + - nestopia + - np2kai + - o2em + - openbor + - opera + - parallel_n64 + - pcsx_rearmed + - pico-8 + - picodrive + - pokemini + - portmaster + - potator + - ppsspp + - prboom + - prosystem + - puae + - puae2021 + - px68k + - quasi88 + - quicknes + - race + - same_cdi + - sameboy + - sameduck + - scummvm + - skyemu + - smsplus_gx + - snes9x + - snes9x2002 + - snes9x2005_plus + - snes9x2010 + - stella + - supermodel + - supersnes9x + - swanstation + - tgbdual + - theodore + - tic80 + - touchhle + - tyrquake + - uae4arm + - uzem + - vba_next + - vbam + - vecx + - vice + - vircon32 + - virtualjaguar + - vita3k + - vitaquake2 + - wasm4 + - wine + - xmil + - yabasanshiro + s922x: + architecture: aarch64 + cores: + - '81' + - a5200 + - aethersx2 + - amiberry + - arduous + - armsx2 + - atari800 + - azahar + - b2 + - beetle_gba + - beetle_lynx + - beetle_ngp + - beetle_pce + - beetle_pce_fast + - beetle_pcfx + - beetle_psx + - beetle_saturn + - beetle_supafaust + - beetle_supergrafx + - beetle_vb + - beetle_wswan + - bigpemu + - bk + - bluemsx + - box64 + - box86 + - bsnes + - bsnes2014_accuracy + - bsnes2014_balanced + - bsnes2014_performance + - bsnes_hd + - bsnes_mercury_accuracy + - bsnes_mercury_balanced + - bsnes_mercury_performance + - cap32 + - crocods + - daphne + - dolphin + - dosbox_core + - dosbox_pure + - doublecherrygb + - drastic + - dsperate + - duckstation + - easyrpg + - ecwolf + - emuscv + - fake08 + - fbalpha2012 + - fbalpha2019 + - fbneo + - fceumm + - flycast + - flycast2021 + - fmsx + - freechaf + - freeintv + - freej2me + - fuse + - gambatte + - gearboy + - gearcoleco + - geargrafx + - gearlynx + - gearsystem + - genesis_plus_gx + - genesis_plus_gx_wide + - geolith + - gw + - gzdoom + - handy + - hatari + - hypseus-singe + - jaxe + - mame + - mame2003_plus + - mame2010 + - mame2015 + - melonds + - melonds_ds + - mesen + - mesen_s + - mgba + - minivmac + - mojozork + - moonlight + - mu + - mupen64plus + - mupen64plus_nx + - neocd + - nestopia + - np2kai + - o2em + - openbor + - opera + - parallel_n64 + - pcsx_rearmed + - pico-8 + - picodrive + - pokemini + - portmaster + - potator + - ppsspp + - prboom + - prosystem + - puae + - puae2021 + - px68k + - quasi88 + - quicknes + - race + - same_cdi + - sameboy + - sameduck + - scummvm + - skyemu + - smsplus_gx + - snes9x + - snes9x2002 + - snes9x2005_plus + - snes9x2010 + - stella + - supersnes9x + - swanstation + - tgbdual + - theodore + - tic80 + - touchhle + - tyrquake + - uae4arm + - uzem + - vba_next + - vbam + - vecx + - vice + - vircon32 + - virtualjaguar + - vita3k + - vitaquake2 + - wasm4 + - wine + - xmil + - yabasanshiro + sm4450: + architecture: aarch64 + cores: + - '81' + - a5200 + - aethersx2 + - amiberry + - arduous + - armsx2 + - atari800 + - azahar + - b2 + - beetle_gba + - beetle_lynx + - beetle_ngp + - beetle_pce + - beetle_pce_fast + - beetle_pcfx + - beetle_psx + - beetle_saturn + - beetle_supafaust + - beetle_supergrafx + - beetle_vb + - beetle_wswan + - bigpemu + - bk + - bluemsx + - box64 + - box86 + - bsnes + - bsnes2014_accuracy + - bsnes2014_balanced + - bsnes2014_performance + - bsnes_hd + - bsnes_mercury_accuracy + - bsnes_mercury_balanced + - bsnes_mercury_performance + - cap32 + - cemu + - crocods + - daedalusx64 + - daphne + - desmume + - dolphin + - dosbox_core + - dosbox_pure + - doublecherrygb + - dsperate + - duckstation + - easyrpg + - ecwolf + - emuscv + - fake08 + - fbalpha2012 + - fbalpha2019 + - fbneo + - fceumm + - flycast + - flycast2021 + - fmsx + - freechaf + - freeintv + - freej2me + - fuse + - gambatte + - gearboy + - gearcoleco + - geargrafx + - gearlynx + - gearsystem + - genesis_plus_gx + - genesis_plus_gx_wide + - geolith + - gpsp + - gw + - gzdoom + - handy + - hatari + - heroic + - hypseus-singe + - jaxe + - kronos + - mame + - mame2003_plus + - mame2010 + - mame2015 + - mednafen + - melonds + - melonds_ds + - mesen + - mesen_s + - mgba + - minivmac + - mojozork + - moonlight + - mu + - mupen64plus + - mupen64plus_nx + - nanoboyadvance + - neocd + - nestopia + - np2kai + - o2em + - openbor + - opera + - parallel_n64 + - pcsx_rearmed + - pico-8 + - picodrive + - pokemini + - portmaster + - potator + - ppsspp + - prboom + - prosystem + - puae + - puae2021 + - px68k + - quasi88 + - quicknes + - race + - same_cdi + - sameboy + - sameduck + - scummvm + - skyemu + - smsplus_gx + - snes9x + - snes9x2002 + - snes9x2005_plus + - snes9x2010 + - steam + - stella + - supermodel + - supersnes9x + - swanstation + - tgbdual + - theodore + - tic80 + - touchhle + - tyrquake + - uae4arm + - uzem + - vba_next + - vbam + - vecx + - vice + - vircon32 + - virtualjaguar + - vita3k + - vitaquake2 + - wasm4 + - wine + - xemu + - xmil + - yabasanshiro + sm6115: + architecture: aarch64 + cores: + - '81' + - a5200 + - aethersx2 + - amiberry + - arduous + - armsx2 + - atari800 + - azahar + - b2 + - beetle_gba + - beetle_lynx + - beetle_ngp + - beetle_pce + - beetle_pce_fast + - beetle_pcfx + - beetle_psx + - beetle_saturn + - beetle_supafaust + - beetle_supergrafx + - beetle_vb + - beetle_wswan + - bk + - bluemsx + - box64 + - box86 + - bsnes + - bsnes2014_accuracy + - bsnes2014_balanced + - bsnes2014_performance + - bsnes_hd + - bsnes_mercury_accuracy + - bsnes_mercury_balanced + - bsnes_mercury_performance + - cap32 + - crocods + - daphne + - desmume + - dolphin + - dosbox_core + - dosbox_pure + - doublecherrygb + - drastic + - dsperate + - duckstation + - easyrpg + - ecwolf + - emuscv + - fake08 + - fbalpha2012 + - fbalpha2019 + - fbneo + - fceumm + - flycast + - flycast2021 + - fmsx + - freechaf + - freeintv + - freej2me + - fuse + - gambatte + - gearboy + - gearcoleco + - geargrafx + - gearlynx + - gearsystem + - genesis_plus_gx + - genesis_plus_gx_wide + - geolith + - gpsp + - gw + - gzdoom + - handy + - hatari + - hypseus-singe + - jaxe + - mame + - mame2003_plus + - mame2010 + - mame2015 + - mednafen + - melonds + - melonds_ds + - mesen + - mesen_s + - mgba + - minivmac + - mojozork + - moonlight + - mu + - mupen64plus + - mupen64plus_nx + - neocd + - nestopia + - np2kai + - o2em + - openbor + - opera + - parallel_n64 + - pcsx_rearmed + - pico-8 + - picodrive + - pokemini + - portmaster + - potator + - ppsspp + - prboom + - prosystem + - puae + - puae2021 + - px68k + - quasi88 + - quicknes + - race + - same_cdi + - sameboy + - sameduck + - scummvm + - skyemu + - smsplus_gx + - snes9x + - snes9x2002 + - snes9x2005_plus + - snes9x2010 + - stella + - supermodel + - supersnes9x + - swanstation + - tgbdual + - theodore + - tic80 + - touchhle + - tyrquake + - uae4arm + - uzem + - vba_next + - vbam + - vecx + - vice + - vircon32 + - virtualjaguar + - vita3k + - vitaquake2 + - wasm4 + - wine + - xmil + - yabasanshiro + sm8250: + architecture: aarch64 + cores: + - '81' + - a5200 + - aethersx2 + - amiberry + - arduous + - armsx2 + - atari800 + - azahar + - b2 + - beetle_gba + - beetle_lynx + - beetle_ngp + - beetle_pce + - beetle_pce_fast + - beetle_pcfx + - beetle_psx + - beetle_saturn + - beetle_supafaust + - beetle_supergrafx + - beetle_vb + - beetle_wswan + - bigpemu + - bk + - bluemsx + - box64 + - box86 + - bsnes + - bsnes2014_accuracy + - bsnes2014_balanced + - bsnes2014_performance + - bsnes_hd + - bsnes_mercury_accuracy + - bsnes_mercury_balanced + - bsnes_mercury_performance + - cap32 + - cemu + - crocods + - daedalusx64 + - daphne + - desmume + - dolphin + - dosbox_core + - dosbox_pure + - doublecherrygb + - dsperate + - duckstation + - easyrpg + - ecwolf + - emuscv + - fake08 + - fbalpha2012 + - fbalpha2019 + - fbneo + - fceumm + - flycast + - flycast2021 + - fmsx + - freechaf + - freeintv + - freej2me + - fuse + - gambatte + - gearboy + - gearcoleco + - geargrafx + - gearlynx + - gearsystem + - genesis_plus_gx + - genesis_plus_gx_wide + - geolith + - gpsp + - gw + - gzdoom + - handy + - hatari + - heroic + - hypseus-singe + - jaxe + - kronos + - mame + - mame2003_plus + - mame2010 + - mame2015 + - mednafen + - melonds + - melonds_ds + - mesen + - mesen_s + - mgba + - minivmac + - mojozork + - moonlight + - mu + - mupen64plus + - mupen64plus_nx + - nanoboyadvance + - neocd + - nestopia + - np2kai + - o2em + - openbor + - opera + - parallel_n64 + - pcsx_rearmed + - pico-8 + - picodrive + - pokemini + - portmaster + - potator + - ppsspp + - prboom + - prosystem + - puae + - puae2021 + - px68k + - quasi88 + - quicknes + - race + - rpcs3 + - same_cdi + - sameboy + - sameduck + - scummvm + - skyemu + - smsplus_gx + - snes9x + - snes9x2002 + - snes9x2005_plus + - snes9x2010 + - steam + - stella + - supermodel + - supersnes9x + - swanstation + - tgbdual + - theodore + - tic80 + - touchhle + - tyrquake + - uae4arm + - uzem + - vba_next + - vbam + - vecx + - vice + - vircon32 + - virtualjaguar + - vita3k + - vitaquake2 + - wasm4 + - wine + - xemu + - xmil + - yabasanshiro + sm8550: + architecture: aarch64 + cores: + - '81' + - a5200 + - aethersx2 + - amiberry + - arduous + - ares + - armsx2 + - atari800 + - azahar + - b2 + - beetle_gba + - beetle_lynx + - beetle_ngp + - beetle_pce + - beetle_pce_fast + - beetle_pcfx + - beetle_psx + - beetle_saturn + - beetle_supafaust + - beetle_supergrafx + - beetle_vb + - beetle_wswan + - bigpemu + - bk + - bluemsx + - box64 + - box86 + - bsnes + - bsnes2014_accuracy + - bsnes2014_balanced + - bsnes2014_performance + - bsnes_hd + - bsnes_mercury_accuracy + - bsnes_mercury_balanced + - bsnes_mercury_performance + - cap32 + - cemu + - crocods + - daedalusx64 + - daphne + - desmume + - dolphin + - dosbox_core + - dosbox_pure + - doublecherrygb + - drastic + - dsperate + - duckstation + - easyrpg + - ecwolf + - emuscv + - fake08 + - fbalpha2012 + - fbalpha2019 + - fbneo + - fceumm + - flycast + - flycast2021 + - fmsx + - freechaf + - freeintv + - freej2me + - fuse + - gambatte + - gearboy + - gearcoleco + - geargrafx + - gearlynx + - gearsystem + - genesis_plus_gx + - genesis_plus_gx_wide + - geolith + - gopher64 + - gpsp + - gw + - gzdoom + - handy + - hatari + - heroic + - hypseus-singe + - jaxe + - kronos + - mame + - mame2003_plus + - mame2010 + - mame2015 + - mednafen + - melonds + - melonds_ds + - mesen + - mesen_s + - mgba + - minivmac + - mojozork + - moonlight + - mu + - mupen64plus + - mupen64plus_nx + - nanoboyadvance + - neocd + - nestopia + - np2kai + - o2em + - openbor + - opera + - parallel_n64 + - pcsx_rearmed + - pico-8 + - picodrive + - pokemini + - portmaster + - potator + - ppsspp + - prboom + - prosystem + - puae + - puae2021 + - px68k + - quasi88 + - quicknes + - race + - rpcs3 + - same_cdi + - sameboy + - sameduck + - scummvm + - skyemu + - smsplus_gx + - snes9x + - snes9x2002 + - snes9x2005_plus + - snes9x2010 + - steam + - stella + - supermodel + - supersnes9x + - swanstation + - tgbdual + - theodore + - tic80 + - touchhle + - tyrquake + - uae4arm + - uzem + - vba_next + - vbam + - vecx + - vice + - vircon32 + - virtualjaguar + - vita3k + - vitaquake2 + - wasm4 + - wine + - xemu + - xmil + - yabasanshiro + sm8650: + architecture: aarch64 + cores: + - '81' + - a5200 + - aethersx2 + - amiberry + - arduous + - ares + - armsx2 + - atari800 + - azahar + - b2 + - beetle_gba + - beetle_lynx + - beetle_ngp + - beetle_pce + - beetle_pce_fast + - beetle_pcfx + - beetle_psx + - beetle_saturn + - beetle_supafaust + - beetle_supergrafx + - beetle_vb + - beetle_wswan + - bigpemu + - bk + - bluemsx + - box64 + - bsnes + - bsnes2014_accuracy + - bsnes2014_balanced + - bsnes2014_performance + - bsnes_hd + - bsnes_mercury_accuracy + - bsnes_mercury_balanced + - bsnes_mercury_performance + - cap32 + - cemu + - crocods + - daphne + - dolphin + - dosbox_core + - dosbox_pure + - doublecherrygb + - dsperate + - duckstation + - easyrpg + - ecwolf + - emuscv + - fake08 + - fbalpha2012 + - fbalpha2019 + - fbneo + - fceumm + - flycast + - flycast2021 + - fmsx + - freechaf + - freeintv + - freej2me + - fuse + - gambatte + - gearboy + - gearcoleco + - geargrafx + - gearlynx + - gearsystem + - genesis_plus_gx + - genesis_plus_gx_wide + - geolith + - gopher64 + - gw + - gzdoom + - handy + - hatari + - heroic + - hypseus-singe + - jaxe + - kronos + - mame + - mame2003_plus + - mame2010 + - mame2015 + - mednafen + - melonds + - melonds_ds + - mesen + - mesen_s + - mgba + - minivmac + - mojozork + - moonlight + - mu + - mupen64plus + - mupen64plus_nx + - nanoboyadvance + - neocd + - nestopia + - np2kai + - o2em + - openbor + - opera + - parallel_n64 + - pcsx_rearmed + - pico-8 + - picodrive + - pokemini + - portmaster + - potator + - ppsspp + - prboom + - prosystem + - puae + - puae2021 + - px68k + - quasi88 + - quicknes + - race + - rpcs3 + - same_cdi + - sameboy + - sameduck + - scummvm + - skyemu + - smsplus_gx + - snes9x + - snes9x2002 + - snes9x2005_plus + - snes9x2010 + - steam + - stella + - supermodel + - supersnes9x + - swanstation + - tgbdual + - theodore + - tic80 + - touchhle + - tyrquake + - uae4arm + - uzem + - vba_next + - vbam + - vecx + - vice + - vircon32 + - virtualjaguar + - vita3k + - vitaquake2 + - wasm4 + - wine + - xemu + - xmil + - yabasanshiro + sm8750: + architecture: aarch64 + cores: + - '81' + - a5200 + - aethersx2 + - amiberry + - arduous + - ares + - armsx2 + - atari800 + - azahar + - b2 + - beetle_gba + - beetle_lynx + - beetle_ngp + - beetle_pce + - beetle_pce_fast + - beetle_pcfx + - beetle_psx + - beetle_saturn + - beetle_supafaust + - beetle_supergrafx + - beetle_vb + - beetle_wswan + - bigpemu + - bk + - bluemsx + - box64 + - bsnes + - bsnes2014_accuracy + - bsnes2014_balanced + - bsnes2014_performance + - bsnes_hd + - bsnes_mercury_accuracy + - bsnes_mercury_balanced + - bsnes_mercury_performance + - cap32 + - cemu + - crocods + - daphne + - dolphin + - dosbox_core + - dosbox_pure + - doublecherrygb + - dsperate + - duckstation + - easyrpg + - ecwolf + - emuscv + - fake08 + - fbalpha2012 + - fbalpha2019 + - fbneo + - fceumm + - flycast + - flycast2021 + - fmsx + - freechaf + - freeintv + - freej2me + - fuse + - gambatte + - gearboy + - gearcoleco + - geargrafx + - gearlynx + - gearsystem + - genesis_plus_gx + - genesis_plus_gx_wide + - geolith + - gopher64 + - gw + - gzdoom + - handy + - hatari + - heroic + - hypseus-singe + - jaxe + - kronos + - mame + - mame2003_plus + - mame2010 + - mame2015 + - mednafen + - melonds + - melonds_ds + - mesen + - mesen_s + - mgba + - minivmac + - mojozork + - moonlight + - mu + - mupen64plus + - mupen64plus_nx + - nanoboyadvance + - neocd + - nestopia + - np2kai + - o2em + - openbor + - opera + - parallel_n64 + - pcsx_rearmed + - pico-8 + - picodrive + - pokemini + - portmaster + - potator + - ppsspp + - prboom + - prosystem + - puae + - puae2021 + - px68k + - quasi88 + - quicknes + - race + - rpcs3 + - same_cdi + - sameboy + - sameduck + - scummvm + - skyemu + - smsplus_gx + - snes9x + - snes9x2002 + - snes9x2005_plus + - snes9x2010 + - steam + - stella + - supermodel + - supersnes9x + - swanstation + - tgbdual + - theodore + - tic80 + - touchhle + - tyrquake + - uae4arm + - uzem + - vba_next + - vbam + - vecx + - vice + - vircon32 + - virtualjaguar + - vita3k + - vitaquake2 + - wasm4 + - wine + - xemu + - xmil + - yabasanshiro diff --git a/scripts/scraper/targets/rocknix_targets_scraper.py b/scripts/scraper/targets/rocknix_targets_scraper.py new file mode 100644 index 00000000..161170b2 --- /dev/null +++ b/scripts/scraper/targets/rocknix_targets_scraper.py @@ -0,0 +1,202 @@ +"""Scraper for ROCKNIX per-device emulator availability. + +Sources (ROCKNIX/distribution, at the release tag platforms/rocknix.yml names): + - projects/ROCKNIX/packages/virtual/emulators/package.mk -- the cores every + image carries, those aarch64 adds, and a `case "${DEVICE}"` block per SoC + - projects/ROCKNIX/devices//options -- ENABLE_32BIT, which the 32-bit + cores of a device depend on (distributions/ROCKNIX/options defaults it on) + +An H700 or RK3326 handheld carries neither Dolphin nor AetherSX2: without a +target list, its pack shipped the PS2, GameCube and PS3 firmware anyway. +""" + +from __future__ import annotations + +import argparse +import re +import sys +from datetime import datetime, timezone + +import yaml + +from . import BaseTargetScraper + +PLATFORM_NAME = "rocknix" + +RAW_BASE = "https://raw.githubusercontent.com/ROCKNIX/distribution/{tag}" +GITHUB_API = "https://api.github.com/repos/ROCKNIX/distribution/contents" +EMULATORS_MK = "projects/ROCKNIX/packages/virtual/emulators/package.mk" +DEVICES_DIR = "projects/ROCKNIX/devices" + +try: + from ..base_scraper import fetch_bytes, github_headers + from ..rocknix_scraper import GITHUB_REPO +except ImportError: + from scraper.base_scraper import fetch_bytes, github_headers + from scraper.rocknix_scraper import GITHUB_REPO + +# `NAME="a b \ +# c"` or `NAME+=" a b"`, continuation lines joined first. +_ASSIGN_RE = re.compile(r'^\s*(?:\[[^\]]*\]\s*&&\s*)?(\w+)(\+?=)"([^"]*)"', re.MULTILINE) +_CASE_RE = re.compile(r'case "\$\{DEVICE\}" in(.*?)\besac\b', re.DOTALL) +_ARM_RE = re.compile(r"^\s*([A-Z0-9|]+)\)\s*$", re.MULTILINE) +_AARCH64_RE = re.compile( + r'if \[ "\$\{ARCH\}" = "aarch64" \]; then(.*?)\bfi\b', re.DOTALL +) + + +def _assignments(text: str) -> list[tuple[str, str, list[str]]]: + """(variable, operator, words) of each quoted assignment, in order.""" + joined = re.sub(r"\\\n", " ", text) + return [(name, op, value.split()) for name, op, value in _ASSIGN_RE.findall(joined)] + + +def _apply(state: dict[str, list[str]], text: str, with_32bit: bool) -> None: + for name, op, words in _assignments(text): + if name == "EMUS_32BIT" and not with_32bit: + continue + if op == "=": + state[name] = list(words) + else: + state.setdefault(name, []).extend(words) + + +def parse_device_cores( + package_mk: str, device: str, arch: str, with_32bit: bool +) -> tuple[list[str], list[str]]: + """(libretro packages, standalone packages) one device's image carries.""" + case = _CASE_RE.search(package_mk) + head = package_mk[: case.start()] if case else package_mk + aarch64 = _AARCH64_RE.search(head) + base = head if aarch64 is None else head[: aarch64.start()] + head[aarch64.end():] + state: dict[str, list[str]] = {} + _apply(state, base, with_32bit) + if arch == "aarch64" and aarch64 is not None: + _apply(state, aarch64.group(1), with_32bit) + if case is not None: + arms = list(_ARM_RE.finditer(case.group(1))) + for index, arm in enumerate(arms): + if device not in arm.group(1).split("|"): + continue + end = arms[index + 1].start() if index + 1 < len(arms) else len(case.group(1)) + _apply(state, case.group(1)[arm.end():end], with_32bit) + libretro = state.get("LIBRETRO_CORES", []) + [ + p for p in state.get("EMUS_32BIT", []) if re.search(r"[-_]lr$", p) + ] + standalone = state.get("PKG_EMUS", []) + [ + p for p in state.get("EMUS_32BIT", []) if not re.search(r"[-_]lr$", p) + ] + return libretro, standalone + + +def core_names(libretro: list[str], standalone: list[str]) -> list[str]: + """Package names as the profiles' cores: lists spell them. + + A libretro package is the core's name with `-lr` (`beetle-psx-lr`, + `neocd_lr`), spelled with underscores as the buildbot names it; a + standalone package drops its `-sa` (`duckstation-sa`, `hatarisa`). + """ + names = {re.sub(r"[-_]lr$", "", package).replace("-", "_") for package in libretro} + names.update(re.sub(r"-?sa$", "", package) for package in standalone) + return sorted(names) + + +# A package that builds nothing itself and pulls other cores in. idtech-lr +# installs ecwolf, prboom, tyrquake and vitaquake2 (vitaquake3 and boom3 on +# x86_64); no profile could name it. +METAPACKAGES = {"idtech-lr": "projects/ROCKNIX/packages/emulators/libretro/idtech-lr/package.mk"} +_IF_RE = re.compile(r'^if \[ "\$\{(\w+)\}" = "?([\w-]+)"? \]; then\n(.*?)^fi$', + re.MULTILINE | re.DOTALL) + + +def metapackage_cores(package_mk: str, arch: str) -> list[str]: + """The -lr packages a metapackage depends on for one architecture. + + OPENGLES_SUPPORT is yes on every ROCKNIX device (config/graphic, from + OPENGLES="mesa" in projects/ROCKNIX/options); TARGET_ARCH is the device's. + """ + found: list[str] = [] + for variable, value, body in _IF_RE.findall(package_mk): + if variable == "TARGET_ARCH" and value != arch: + continue + if variable not in ("TARGET_ARCH", "OPENGLES_SUPPORT"): + continue + for _name, _op, words in _assignments(body): + found += [w for w in words if re.search(r"[-_]lr$", w)] + return found + + +class Scraper(BaseTargetScraper): + """Per-device core lists from ROCKNIX's emulators metapackage.""" + + def __init__(self, url: str = "https://github.com/ROCKNIX/distribution"): + super().__init__(url=url) + self.tag = "" + + def _raw(self, path: str) -> str: + return fetch_bytes(f"{RAW_BASE.format(tag=self.tag)}/{path}").decode("utf-8") + + def _devices(self) -> list[str]: + import json # noqa: PLC0415 + + listing = json.loads(fetch_bytes( + f"{GITHUB_API}/{DEVICES_DIR}?ref={self.tag}", headers=github_headers() + )) + devices = [item["name"] for item in listing if item.get("type") == "dir"] + if not devices: + raise RuntimeError(f"no device in {DEVICES_DIR} at {self.tag}") + return sorted(devices) + + def fetch_targets(self) -> dict: + from scraper.base_scraper import fetch_github_latest_version # noqa: PLC0415 + + self.tag = fetch_github_latest_version(GITHUB_REPO) + if not self.tag: + raise RuntimeError("cannot read ROCKNIX's latest release tag") + package_mk = self._raw(EMULATORS_MK) + if "LIBRETRO_CORES" not in package_mk: + raise RuntimeError(f"no LIBRETRO_CORES in {EMULATORS_MK} at {self.tag}") + + targets: dict[str, dict] = {} + for device in self._devices(): + options = self._raw(f"{DEVICES_DIR}/{device}/options") + arch = "x86_64" if device == "AMD64" else "aarch64" + with_32bit = not re.search(r'ENABLE_32BIT="false"', options) + libretro, standalone = parse_device_cores(package_mk, device, arch, with_32bit) + for meta, path in METAPACKAGES.items(): + if meta in libretro: + libretro.remove(meta) + libretro += metapackage_cores(self._raw(path), arch) + cores = core_names(libretro, standalone) + targets[device.lower()] = {"architecture": arch, "cores": cores} + print(f" {device.lower()} ({arch}): {len(cores)} cores", file=sys.stderr) + + return { + "platform": PLATFORM_NAME, + "source": f"{self.url}/tree/{self.tag}/{EMULATORS_MK}", + "scraped_at": datetime.now(timezone.utc).strftime("%Y-%m-%dT%H:%M:%SZ"), + "targets": targets, + } + + +def main() -> None: + parser = argparse.ArgumentParser(description="Scrape ROCKNIX per-device cores") + parser.add_argument("--dry-run", action="store_true", help="Show target summary") + parser.add_argument("--output", "-o", help="Output YAML file") + args = parser.parse_args() + + scraper = Scraper() + data = scraper.fetch_targets() + if args.dry_run: + for name, info in data["targets"].items(): + print(f" {name} ({info['architecture']}): {len(info['cores'])} cores") + return + if args.output: + scraper.write_output(data, args.output) + print(f"Written to {args.output}") + return + print(yaml.dump(data, default_flow_style=False, sort_keys=False)) + + +if __name__ == "__main__": + main() diff --git a/tests/test_target_scrapers.py b/tests/test_target_scrapers.py index f9ec403b..15a0bbe8 100644 --- a/tests/test_target_scrapers.py +++ b/tests/test_target_scrapers.py @@ -176,6 +176,63 @@ class BatoceraKconfig(unittest.TestCase): "BR2_PACKAGE_RUFFLE"} & active) +class RocknixPerDevice(unittest.TestCase): + """ROCKNIX had no target list: an H700 handheld got the PS2, GameCube + and PS3 firmware of emulators its image does not carry.""" + + PACKAGE_MK = ( + 'PKG_EMUS="amiberry duckstation-sa hatarisa"\n' + 'EMUS_32BIT=""\n' + 'LIBRETRO_CORES="81-lr beetle-psx-lr \\\n' + ' neocd_lr idtech-lr"\n' + 'if [ "${ARCH}" = "aarch64" ]; then\n' + ' LIBRETRO_CORES+=" duckstation-lr"\n' + 'fi\n' + 'case "${DEVICE}" in\n' + ' H700|RK3326)\n' + ' [ "${ENABLE_32BIT}" == "true" ] && EMUS_32BIT="box86 gpsp-lr"\n' + ' PKG_EMUS+=" drastic-sa"\n' + ' ;;\n' + ' SM8550)\n' + ' PKG_EMUS+=" aethersx2-sa dolphin-sa"\n' + ' ;;\n' + ' AMD64)\n' + ' PKG_EMUS+=" dolphin-sa"\n' + 'esac\n' + ) + IDTECH = ( + 'if [ "${OPENGLES_SUPPORT}" = yes ]; then\n' + ' PKG_DEPENDS_TARGET+=" ecwolf-lr prboom-lr"\n' + 'fi\n' + 'if [ "${TARGET_ARCH}" = "x86_64" ]; then\n' + ' PKG_DEPENDS_TARGET+=" vitaquake3-lr"\n' + 'fi\n' + ) + + def test_each_device_gets_its_own_cores(self): + from scraper.targets.rocknix_targets_scraper import ( # noqa: PLC0415 + core_names, + parse_device_cores, + ) + + h700 = core_names(*parse_device_cores(self.PACKAGE_MK, "H700", "aarch64", True)) + self.assertTrue({"drastic", "gpsp", "duckstation", "beetle_psx", "hatari", + "81", "neocd"} <= set(h700)) + self.assertFalse({"aethersx2", "dolphin"} & set(h700)) + no32 = core_names(*parse_device_cores(self.PACKAGE_MK, "H700", "aarch64", False)) + self.assertNotIn("gpsp", no32) + amd64 = core_names(*parse_device_cores(self.PACKAGE_MK, "AMD64", "x86_64", False)) + self.assertIn("dolphin", amd64) + self.assertNotIn("drastic", amd64) + + def test_a_metapackage_names_the_cores_it_installs(self): + from scraper.targets.rocknix_targets_scraper import metapackage_cores # noqa: PLC0415 + + self.assertEqual(metapackage_cores(self.IDTECH, "aarch64"), ["ecwolf-lr", "prboom-lr"]) + self.assertEqual(metapackage_cores(self.IDTECH, "x86_64"), + ["ecwolf-lr", "prboom-lr", "vitaquake3-lr"]) + + class RetroPieModuleFlags(unittest.TestCase): """The RetroPie target list read flags as requirements and libretro alone.