From f3d912f3d370683cd4e4787198f2fbd037151631 Mon Sep 17 00:00:00 2001 From: Abdessamad Derraz <3028866+Abdess@users.noreply.github.com> Date: Tue, 11 Aug 2026 18:54:15 +0200 Subject: [PATCH] feat: profile five more emulators and refine seven --- emulators/freechaf.yml | 2 + emulators/kemulator.yml | 203 +++++++++++++++++++++++++++ emulators/kenji-nx.yml | 272 +++++++++++++++++++++++++++++++++++++ emulators/kronos.yml | 3 + emulators/linkboy.yml | 98 +++++++++++++ emulators/lynx-emu.yml | 105 ++++++++++++++ emulators/m64plus-fz.yml | 163 ++++++++++++++++++++++ emulators/numero.yml | 3 + emulators/pcsx1.yml | 3 + emulators/px68k.yml | 4 + emulators/yabasanshiro.yml | 3 + emulators/yabause.yml | 3 + 12 files changed, 862 insertions(+) create mode 100644 emulators/kemulator.yml create mode 100644 emulators/kenji-nx.yml create mode 100644 emulators/linkboy.yml create mode 100644 emulators/lynx-emu.yml create mode 100644 emulators/m64plus-fz.yml diff --git a/emulators/freechaf.yml b/emulators/freechaf.yml index 17dba077..ebb8383b 100644 --- a/emulators/freechaf.yml +++ b/emulators/freechaf.yml @@ -36,6 +36,7 @@ notes: | files: - name: "sl31253.bin" system: fairchild-channelf + priority: 2 required: false hle_fallback: true note: "Channel F PSU1 ROM (original). Fallback if sl90025.bin is missing." @@ -50,6 +51,7 @@ files: - name: "sl90025.bin" system: fairchild-channelf + priority: 1 required: false hle_fallback: true note: "Channel F II PSU1 ROM. Tried first, preferred over sl31253.bin." diff --git a/emulators/kemulator.yml b/emulators/kemulator.yml new file mode 100644 index 00000000..78297d6e --- /dev/null +++ b/emulators/kemulator.yml @@ -0,0 +1,203 @@ +emulator: KEmulator nnmod +type: standalone +core_classification: community_fork +source: "https://github.com/shinovon/KEmulator" +upstream: "https://github.com/shinovon/KEmulator" +author: "shinovon" +profiled_date: "2026-08-11" +source_commit: "4230a6af24e8e5d60e00e760750cfd9f195f0bd5" +core_version: "2.21.5" +display_name: "Mobile - J2ME (KEmulator nnmod)" +cores: + - kemulator + - KEMULATOR +systems: + - j2me +mode: standalone +verification: existence + +notes: | + MIDP/CLDC runtime running on the host JVM, developed from decompiled KEmulator + 1.0.3. MIDlet bytecode executes against the javax.microedition classes compiled + into the application, so no device firmware is read. + + Yamaha SMAF audio is the one thing the user supplies. MMFPlayer.initialize() + probes the directory holding the executable for a hardware emulator library in + a fixed order, MA-7 then MA-5 then MA-3, and keeps the first complete set. MA-3 + ships with the emulator, so .mmf playback works on a stock install and the MA-5 + and MA-7 libraries raise the chip generation: MA-5 adds 32 PCM channels, MA-7 + adds DSP effects and is the only mode where supportsAudioTracks() is true, + which the MEXA phrase audio track API reads to size its track array. + ref: src/media/emulator/media/mmf/MMFPlayer.java:11-40, + src/media/emulator/media/mmf/MaDll.java:862-864, + src/media/emulator/media/mmf/PhrasePlayerImpl.java:20-26 + + The probe is 32-bit Windows only. isX64() returns before any file is touched, + so the x64 build loads none of these. The MIDI-through-MA path passes + notMmf=true, which skips the MA-7 branch and leaves MA-5 or MA-3. + ref: src/media/emulator/media/mmf/MMFPlayer.java:15-17, + src/media/javax/microedition/media/PlayerImpl.java:206-211, + win/src/main/emulator/EmulatorPlatform.java:9-11, + x64/src/main/emulator/EmulatorPlatform.java:9-11 + + Every caller degrades when the probe fails. PlayerImpl.midi() breaks out of the + ma block and falls back to MidiSystem; PlayerImpl.mmf(), SmafPlayer, AudioClip + and PhrasePlayerImpl each throw and lose SMAF audio alone. Only the file's + existence is tested, then the path goes to Native.load, so the code reads no + size and no hash. + ref: src/media/javax/microedition/media/PlayerImpl.java:212-249, + src/oem/com/jblend/media/smaf/SmafPlayer.java:91, + src/oem/com/samsung/util/AudioClip.java:61, + src/media/emulator/media/mmf/MaDll.java:181-190 + + The 3D and Mascot Capsule backends default to their OpenGL implementations, so + the two shipped native libraries below load only when the user selects the + SWERVE M3G engine or the Mascot Capsule DLL engine. + ref: src/main/emulator/Settings.java:20-21, + win/src/main/emulator/EmulatorPlatform.java:41-80 + + Two settings hold user-chosen paths with no fixed filename. SoundfontPath takes + any .sf2 or .dls and is empty by default, leaving useCustomSoundfont() false and + the JVM default soundbank in place. VlcDir points at a VLC installation that + vlcj scans for libvlc. + ref: src/media/emulator/media/EmulatorMIDI.java:26-36, + src/main/emulator/ui/swt/Property.java:1864-1905 + +files: + - name: M7_EmuSmw7.dll + system: j2me + required: false + validation: [existence] + description: "Yamaha MA-7 SMAF sequencer library" + note: "First branch of the MMFPlayer probe, taken only when M7_EmuHw.dll sits beside it and the caller did not pass notMmf. Selects MODE_MA7, the only mode carrying phrase audio tracks. Distributed with the SoftBank MEXA emulator." + source_ref: "src/media/emulator/media/mmf/MMFPlayer.java:19-23, src/media/emulator/media/mmf/MaDll.java:186" + + - name: M7_EmuHw.dll + system: j2me + required: false + validation: [existence] + description: "Yamaha MA-7 SMAF hardware layer" + note: "Tested for existence next to M7_EmuSmw7.dll; the MA-7 branch is skipped unless both are present. Loaded by the Windows loader as a dependency of the sequencer library, which is the path handed to Native.load." + source_ref: "src/media/emulator/media/mmf/MMFPlayer.java:21" + + - name: M5_EmuSmw5.dll + system: j2me + required: false + validation: [existence] + description: "Yamaha MA-5 SMAF sequencer library" + note: "Second branch of the probe, taken when the MA-7 pair is absent or the caller passed notMmf and M5_EmuHw.dll sits beside it. Selects MODE_MA5, whose init walks a 1024-byte allocation to an address ending in 0x81 before calling MaSound_EmuInitialize." + source_ref: "src/media/emulator/media/mmf/MMFPlayer.java:24-27, src/media/emulator/media/mmf/MaDll.java:184, src/media/emulator/media/mmf/MaDll.java:231-241" + + - name: M5_EmuHw.dll + system: j2me + required: false + validation: [existence] + description: "Yamaha MA-5 SMAF hardware layer" + note: "Tested for existence next to M5_EmuSmw5.dll; the MA-5 branch is skipped unless both are present." + source_ref: "src/media/emulator/media/mmf/MMFPlayer.java:25" + + - name: ma3smwemu.dll + system: j2me + required: false + bundled: true + size: 724992 + md5: c1625f6c2fbf66e2e838c6bc74ffe641 + sha1: b566d111ccd3e303d21ab5c4cd1519dc238a4fce + validation: [existence] + description: "Yamaha MA-3 SMAF emulator" + note: "Last branch of the probe and the only one satisfied by a single file. Selects MODE_MA3, whose init calls MaSound_Initialize directly. Present in a stock install, so .mmf playback needs nothing from the user on the 32-bit Windows build." + source_ref: "src/media/emulator/media/mmf/MMFPlayer.java:28-30, src/media/emulator/media/mmf/MaDll.java:182, src/media/emulator/media/mmf/MaDll.java:227-230" + + - name: jsr184client.dll + system: j2me + required: false + bundled: true + size: 405504 + md5: 9fcb2bd1f36d1e8d94f8e4e2650914c9 + sha1: ed9a60d56ddcc91514b033c16f2062638c3e6eeb + validation: [existence] + description: "SWERVE M3G native engine" + note: "Loaded from the executable's directory by the static initializers of the SWERVE javax.microedition.m3g classes, with a System.loadLibrary fallback on the library path. Reached only when the 3D engine setting is SWERVE, the LWJGL engine being the default." + source_ref: "m3g_swerve/src/javax/microedition/m3g/Graphics3D.java:275, m3g_swerve/src/javax/microedition/m3g/Loader.java:378, src/main/emulator/i.java:6-14" + + - name: java_micro3d_v3_32.dll + system: j2me + required: false + bundled: true + size: 27648 + md5: 60045cd91e30880c731c9fea8c712093 + sha1: b1d6aef4559bb46af27eebda50fe06e0de659966 + validation: [existence] + description: "Mascot Capsule V3 JNI bridge" + note: "System.loadLibrary from the static initializers of the com.mascotcapsule.micro3d.v3 classes, reached only when the Mascot Capsule engine setting is DLL. Its import table names micro3d_v3_32.dll." + source_ref: "micro3d_dll/src/com/mascotcapsule/micro3d/v3/Figure.java:162-165, micro3d_dll/src/com/mascotcapsule/micro3d/v3/Graphics3D.java:279" + + - name: micro3d_v3_32.dll + system: j2me + required: false + bundled: true + size: 475136 + md5: d5ab04740801208b92fa3de7252a75d8 + sha1: f59e0d445aafe2503c6e5249ca07df4b89626f8f + validation: [existence] + description: "Mascot Capsule V3 renderer" + note: "Pulled in by the Windows loader when java_micro3d_v3_32.dll loads; no Java code names it." + source_ref: "micro3d_dll/src/com/mascotcapsule/micro3d/v3/Figure.java:163" + + - name: amrdecoder.dll + aliases: + - amrdecoder_64.dll + - amrdecoder_arm64.dll + - libamrdecoder.so + - libamrdecoder_64.so + - libamrdecoder_arm32.so + - libamrdecoder_arm64.so + - libamrdecoder.dylib + - libamrdecoder_arm64.dylib + system: j2me + required: false + bundled: true + validation: [existence] + description: "opencore-amr decoder for AMR audio" + note: "System.load on a name composed from os.name and os.arch, resolved against the executable's directory. The 32-bit Windows build asks for amrdecoder.dll unconditionally. A load failure is printed and swallowed." + source_ref: "win/src/main/emulator/EmulatorPlatform.java:91-97, x64/src/main/emulator/EmulatorPlatform.java:173-212" + + - name: s60snr.ttf + system: j2me + required: false + bundled: true + category: game_data + validation: [existence] + description: "Series 60 typeface" + note: "Read from /res inside the jar the first time a FontAWT is built for the Series 60 face, then cached and derived per style and size." + source_ref: "src/main/emulator/graphics2D/awt/FontAWT.java:20-28" + + - name: Nokia.ttf + system: j2me + required: false + bundled: true + category: game_data + validation: [existence] + description: "Nokia typeface" + note: "Read from /res inside the jar the first time a FontAWT is built for the Nokia face." + source_ref: "src/main/emulator/graphics2D/awt/FontAWT.java:29-37" + + - name: presets.xml + system: j2me + required: false + bundled: true + category: game_data + validation: [existence] + description: "Device presets: screen sizes, key maps, platform identities" + note: "Devices.load reads the PresetsPath setting, /res/presets.xml by default, as a jar resource and falls back to a disk read when the resource is absent, which is how a user-supplied preset file is picked up." + source_ref: "src/main/emulator/Settings.java:133, src/main/emulator/Devices.java:25-50, src/main/emulator/Emulator.java:641" + + - name: en.txt + system: j2me + required: false + bundled: true + category: game_data + validation: [existence] + description: "UI strings, English" + note: "Read from the lang directory next to the executable at startup and kept as the fallback bundle; the language setting names a sibling in the same directory. Every lookup that misses both bundles falls back to the string built into the call site." + source_ref: "src/main/emulator/UILocale.java:11-48" diff --git a/emulators/kenji-nx.yml b/emulators/kenji-nx.yml new file mode 100644 index 00000000..96f88ff6 --- /dev/null +++ b/emulators/kenji-nx.yml @@ -0,0 +1,272 @@ +emulator: Kenji-NX +type: standalone +core_classification: community_fork +source: "https://git.ryujinx.app/projects/Kenji-NX" +source_branch: libryujinx_bionic +upstream: "https://git.ryujinx.app/projects/Ryubing" +profiled_date: "2026-08-11" +source_commit: "8d7d8f344cb01257c5bc59bb02a74bb89ab9bb5f" +core_version: "2.1.0-pr.2" +display_name: "Nintendo - Switch (Kenji-NX)" +cores: + - kenji-nx + - kenjinx + - "KENJI-NX" +systems: + - nintendo-switch +mode: standalone + +notes: | + Nintendo Switch emulator in C#, a fork of the Ryujinx line maintained by + KeatonTheBot. Two builds come out of one repository: the desktop Avalonia + front end on master, and the Android app on libryujinx_bionic, which carries + the whole desktop tree plus src/KenjinxAndroid and src/LibKenjinx. That branch + is the one read here, since master has no Android code at all. The Android + package is org.kenjinx.android and ES-DE launches it with the action + org.kenjinx.android.LAUNCH_GAME and the ROM in EXTRA_bootPath. + ref: README.md:15-24, src/KenjinxAndroid/app/build.gradle:11-15, + src/KenjinxAndroid/app/src/main/AndroidManifest.xml:8,69 + + Every external file hangs off one data root. AppDataManager.Initialize takes a + base path, keeps a portable directory next to the binary when one exists and + otherwise falls back to %APPDATA%/Ryujinx, the default directory name being + still Ryujinx. Android hands it getExternalFilesDir(null), which differs from + the user profile path and already exists, so the launch mode is Custom and the + ~/.switch fallback that ReloadKeySet consults in UserProfile mode never fires + there. games, profiles and system are created under the root on every start. + ref: src/Ryujinx.Common/Configuration/AppDataManager.cs:11-17,47,50-104,223-230, + src/LibKenjinx/LibKenjinx.cs:54-95, + src/KenjinxAndroid/app/src/main/java/org/kenjinx/android/MainActivity.kt:264-298 + + Firmware is installed rather than placed. ContentManager takes a directory, a + zip or an xci with an update partition, verifies each NCA against the key set + and refuses a package carrying unrelated archives, then registers the contents + under bis/system/Contents/registered. Android passes a file descriptor instead + of a path but reaches the same two methods. Nothing gates the launch on it: + homebrew NRO goes through ProcessLoader without touching the key set, and the + failure is deferred to the first service that needs a system archive. + ref: src/Ryujinx.HLE/FileSystem/ContentManager.cs:431-498,675-749,893-903, + src/LibKenjinx/Android/JniExportedMethods.cs:459-495, + src/Ryujinx.HLE/Loaders/Processes/ProcessLoader.cs:189-205 + + Two read paths belong to the desktop build alone, because the Android build + drops LibKenjinx.Native.cs and wires those subsystems differently. + SDL_GameControllerDB.txt is read by SDL3Driver, whose only callers are the + SDL3 audio, gamepad and keyboard drivers; on Android JnaDeviceInitialize + builds an OpenALHardwareDeviceDriver and InitializeInput builds a + VirtualGamepadDriver, so SDL3 never initialises. Amiibo diverge the same way: + the desktop scan decrypts a dump through AmiiboBinReader and therefore needs + key_retail.bin, while the Android entry buffers the raw tag in + KenjinxAmiiboShim and INfp reads the figure id straight out of offset 0x1DC. + ref: src/LibKenjinx/LibKenjinx.csproj:11-13, + src/LibKenjinx/Android/JniExportedMethods.cs:347-348,1046-1060, + src/LibKenjinx/LibKenjinx.Input.cs:28-39, + src/Ryujinx.HLE/Kenjinx/AmiiboBridge.cs:10-44, + src/Ryujinx.HLE/HOS/Services/Nfc/Nfp/NfpManager/KenjinxAmiiboShim.cs:15-41, + src/Ryujinx.HLE/HOS/Services/Nfc/Nfp/NfpManager/INfp.cs:149-166,257-279 + + Config.json, Profiles.json, updates.json, dlc.json, mods.json, metadata.json + and system/amiibo/.json are written by the emulator itself, and + system/amiibo/Amiibo.json is a catalogue the desktop window downloads from + AmiiboAPI and rewrites. None of them is user supplied. The Android app keeps + its own settings in Android shared preferences. + ref: src/Ryujinx.HLE/HOS/Services/Nfc/Nfp/VirtualAmiibo.cs:198-243, + src/Ryujinx/UI/ViewModels/AmiiboWindowViewModel.cs:61-63, + src/Ryujinx.Common/ReleaseInformation.cs:14-19, + src/KenjinxAndroid/app/src/main/java/org/kenjinx/android/viewmodels/QuickSettings.kt:92 + + Distribution moved off GitHub: Kenji-NX/Android-Releases returns HTTP 451 + under the Nintendo notice of 2026-02-12, and both the source and the builds + are served by the Forgejo instance, which is where ES-DE points as well. + ref: https://github.com/github/dmca/blob/master/2026/02/2026-02-12-nintendo.md, + tmp/es-de/ANDROID.md:470-474 + +files: + - name: prod.keys + required: true + path: system/prod.keys + description: "Production key set for NCA decryption" + note: >- + Read from the system directory under the data root, and additionally from + ~/.switch when the launch mode is UserProfile, which Android never is. The + four key files are looked up independently, so each is optional to the + reader, but an empty header key stops NCA header decryption outright and + no encrypted content loads. The desktop importer accepts a .keys file or a + zip of them and rejects any line that is not "name = value" in lowercase + hexadecimal; the Android importer accepts the name prod.keys only and + copies it straight into the system directory. + source_ref: "src/Ryujinx.HLE/FileSystem/VirtualFileSystem.cs:231-266, src/Ryujinx.HLE/FileSystem/ContentManager.cs:500-537,681-684,1082-1118, src/KenjinxAndroid/app/src/main/java/org/kenjinx/android/viewmodels/SettingsViewModel.kt:254-301" + + - name: title.keys + required: false + path: system/title.keys + description: "Per-title key set mapping rights id to title key" + note: >- + Read beside prod.keys and passed to the same key file reader. Tickets + found in a container are imported into the key set at load time, so a + title shipping its own ticket does not need an entry here. The importer + validates each line as two 32-character hexadecimal fields. + source_ref: "src/Ryujinx.HLE/FileSystem/VirtualFileSystem.cs:241,250-253,266,269-297, src/Ryujinx.HLE/FileSystem/ContentManager.cs:1086,1100-1102" + + - name: console.keys + required: false + path: system/console.keys + description: "Console-unique key set" + note: >- + Read beside prod.keys and passed to the same key file reader as the + console-specific set. Validated as "name = value" lines like prod.keys. + source_ref: "src/Ryujinx.HLE/FileSystem/VirtualFileSystem.cs:242,255-258,266, src/Ryujinx.HLE/FileSystem/ContentManager.cs:1103-1105" + + - name: dev.keys + required: false + path: system/dev.keys + description: "Development-unit key set" + note: >- + Read beside prod.keys and handed to the key file reader as the development + set, alongside the production one rather than instead of it. Validated as + "name = value" lines. + source_ref: "src/Ryujinx.HLE/FileSystem/VirtualFileSystem.cs:243,260-263,266, src/Ryujinx.HLE/FileSystem/ContentManager.cs:1104-1105" + + - name: ".zip" + aliases: [".xci"] + required: false + storage: large_file + description: "Switch system firmware package" + note: >- + Chosen through a file picker and read whole at install time, by path on + desktop and by file descriptor on Android. A zip is walked entry by entry + and an xci is opened at its update partition; a directory of NCAs is also + accepted on desktop. Each NCA is decrypted with the key set to read its + title id and content type, the package is rejected when it carries + archives that belong to no system title, and the version string comes out + of title 0100000000000809. The NCAs are then registered under + bis/system/Contents/registered and read from there, never as loose files. + No digest of the package itself is compared against anything. + source_ref: "src/Ryujinx.HLE/FileSystem/ContentManager.cs:431-498,675-749,751-1045, src/LibKenjinx/Android/JniExportedMethods.cs:459-495, src/KenjinxAndroid/app/src/main/java/org/kenjinx/android/viewmodels/SettingsViewModel.kt:308-364" + + - name: key_retail.bin + required: false + path: system/key_retail.bin + size: 160 + validation: [size] + description: "Amiibo master keys used to decrypt tag dumps" + note: >- + Read from the system directory under the data root and split into two + 80-byte master keys, the data key then the tag key, each being a 16-byte + HMAC key, a 14-byte type string, a reserved byte, a magic size byte, 16 + magic bytes and a 32-byte XOR pad. Any total other than 160 bytes throws + and the scan fails. The desktop window hides its amiibo-from-dump entry + when the file is absent. Only the desktop scan path decrypts a dump; the + Android slots hand the raw bytes to the tag buffer instead. + source_ref: "src/Ryujinx.HLE/HOS/Services/Nfc/AmiiboDecryption/AmiiboBinReader.cs:22-44,331-336, src/Ryujinx.HLE/HOS/Services/Nfc/AmiiboDecryption/AmiiboDecryptor.cs:10-16, src/Ryujinx.HLE/HOS/Services/Nfc/AmiiboDecryption/AmiiboMasterKey.cs:15-39, src/Ryujinx/UI/ViewModels/MainWindowViewModel.cs:385,2243" + + - name: SDL_GameControllerDB.txt + required: false + path: SDL_GameControllerDB.txt + category: game_data + description: "SDL gamepad mapping database" + note: >- + Read from the data root and handed to SDL_AddGamepadMappingsFromFile when + the SDL3 driver starts, which happens on the desktop build only. Guarded + by an existence test, and SDL carries its own built-in mappings, so a + missing file costs only the extra pad definitions. + source_ref: "src/Ryujinx.SDL3.Common/SDL3Driver.cs:100-105, src/Ryujinx.Input.SDL3/SDL3GamepadDriver.cs:53, src/Ryujinx.Audio.Backends.SDL3/SDL3HardwareDeviceDriver.cs:36, src/Ryujinx/UI/Windows/MainWindow.axaml.cs:110" + + - name: ".bin" + required: false + unsourceable: "dump of one physical amiibo figure, tied to the tag it was read from and never distributed generically" + description: "Amiibo tag dump" + note: >- + Read whole from wherever the picker points. The desktop path decrypts it + with key_retail.bin, accepts 532 bytes by padding to the 540 of 135 pages + of 4, and writes the tag back when a game edits its application area. The + Android slots read the bytes through the content resolver and buffer them + for the NFP service, which takes the figure id from offset 0x1DC without + decrypting anything. + source_ref: "src/Ryujinx.HLE/HOS/Horizon.cs:355-363, src/Ryujinx.HLE/HOS/Services/Nfc/AmiiboDecryption/AmiiboBinReader.cs:22-44,151-283, src/LibKenjinx/LibKenjinx.cs:700-729, src/KenjinxAndroid/app/src/main/java/org/kenjinx/android/views/GameViews.kt:328-349" + + - name: ".der" + required: false + path: system/ssl/ + unsourceable: "replacement certificate the user picks for one certificate authority, with no canonical artefact behind the name" + description: "Override for one built-in root certificate" + note: >- + Looked up under system/ssl by the enumeration name of the certificate + being read out of the firmware certificate store, and substituted for the + store entry when the file exists. The store itself comes from title + 0100000000000800, so the absence of an override changes nothing. + source_ref: "src/Ryujinx.HLE/HOS/Services/Ssl/BuiltInCertificateManager.cs:25,91-112,114-180" + + - name: ".zip" + required: false + path: drivers/ + unsourceable: "third-party Vulkan driver built for one GPU family, not an emulator artefact" + description: "Replacement Vulkan driver for the Android build" + note: >- + Imported through a picker filtered on application/zip and unpacked into a + folder named after the archive under drivers in the data root. A folder is + offered only when it holds a meta.json naming a libraryName that resolves + to a file present beside it; the chosen path is remembered in a file named + selected. At renderer start the folder is copied into internal storage, + because the external filesystem cannot carry an executable mapping, loaded + through the rootless Adreno driver loader, and the resulting handle is + passed to the Vulkan loader. An empty selection uses the system loader. + source_ref: "src/KenjinxAndroid/app/src/main/java/org/kenjinx/android/viewmodels/VulkanDriverViewModel.kt:13-167, src/KenjinxAndroid/app/src/main/java/org/kenjinx/android/viewmodels/MainViewModel.kt:202-243, src/LibKenjinx/Android/JniExportedMethods.cs:532-555, src/LibKenjinx/VulkanLoader.cs:27-29" + +# System archives read out of the installed firmware, never as loose files. +firmware_titles: + - id: "0100000000000809" + name: "System version" + content: ["file"] + required: false + note: "Version string reported for the installed firmware, and the value the installer returns after verifying a package." + source_ref: "src/Ryujinx.HLE/FileSystem/ContentManager.cs:32,1047-1080" + + - id: "010000000000080E" + name: "TimeZoneBinary" + content: ["binaryList.txt", "zoneinfo/"] + required: false + note: "Location list and zone rules. Without it the location cache holds UTC alone and the time zone manager is marked initialised without rules." + source_ref: "src/Ryujinx.HLE/HOS/Services/Time/TimeZone/TimeZoneContentManager.cs:24,62-86,88-119" + + - id: "0100000000000810" + name: "FontNintendoExtended" + content: ["nintendo_ext_003.bfttf"] + required: false + note: "Shared font, XOR-decoded from BFTTF into the shared memory the pl:u service exposes." + source_ref: "src/Ryujinx.HLE/FileSystem/ContentManager.cs:73,93, src/Ryujinx.HLE/HOS/Services/Sdb/Pl/SharedFontManager.cs:63-125,159-180" + + - id: "0100000000000811" + name: "FontStandard" + content: ["nintendo_udsg-r_std_003.bfttf"] + required: false + note: "Shared font. A missing font title throws InvalidSystemResourceException, so a title that asks for shared fonts stops there." + source_ref: "src/Ryujinx.HLE/FileSystem/ContentManager.cs:68,88, src/Ryujinx.HLE/HOS/Services/Sdb/Pl/SharedFontManager.cs:63-125" + + - id: "0100000000000812" + name: "FontKorean" + content: ["nintendo_udsg-r_ko_003.bfttf"] + required: false + note: "Shared font." + source_ref: "src/Ryujinx.HLE/FileSystem/ContentManager.cs:71,91" + + - id: "0100000000000813" + name: "FontChineseTraditional" + content: ["nintendo_udjxh-db_zh-tw_003.bfttf"] + required: false + note: "Shared font." + source_ref: "src/Ryujinx.HLE/FileSystem/ContentManager.cs:70,92" + + - id: "0100000000000814" + name: "FontChineseSimplified" + content: ["nintendo_udsg-r_org_zh-cn_003.bfttf", "nintendo_udsg-r_ext_zh-cn_003.bfttf"] + required: false + note: "Shared fonts. One title carries both the base and the extended simplified faces." + source_ref: "src/Ryujinx.HLE/FileSystem/ContentManager.cs:69-70,89-90" + + - id: "0100000000000800" + name: "Certificate store" + content: ["ssl_TrustedCerts.bdf", "ssl_TrustedCerts.tcf"] + required: false + note: "Trusted root certificates for the ssl service, the .tcf name being the one used up to firmware 2.3.0. Absent, the service logs and serves nothing." + source_ref: "src/Ryujinx.HLE/HOS/Services/Ssl/BuiltInCertificateManager.cs:25,114-180" diff --git a/emulators/kronos.yml b/emulators/kronos.yml index b8e1980d..9843e777 100644 --- a/emulators/kronos.yml +++ b/emulators/kronos.yml @@ -48,6 +48,7 @@ files: - name: "saturn_bios.bin" path: "kronos/saturn_bios.bin" system: sega-saturn + priority: 1 required: true size: 524288 validation: [size] @@ -60,6 +61,7 @@ files: - name: "sega_101.bin" system: sega-saturn region: [japan] + priority: 2 required: false size: 524288 validation: [size] @@ -72,6 +74,7 @@ files: - name: "mpr-17933.bin" system: sega-saturn region: [north-america, europe] + priority: 3 required: false size: 524288 validation: [size] diff --git a/emulators/linkboy.yml b/emulators/linkboy.yml new file mode 100644 index 00000000..740e1a65 --- /dev/null +++ b/emulators/linkboy.yml @@ -0,0 +1,98 @@ +emulator: Linkboy +type: standalone +core_classification: embedded_hle +source: "https://play.google.com/store/apps/details?id=com.pixelrespawn.linkboy" +upstream: closed-source +author: "Pixel Respawn LLC" +profiled_date: "2026-08-11" +core_version: "3.11.0" +display_name: "Nintendo - Game Boy / Color / Advance (Linkboy)" +mode: standalone +cores: + - "linkboy" + - "Linkboy" + - "LINKBOY" +systems: + - nintendo-gb + - nintendo-gbc + - nintendo-gba + - nintendo-sgb + +notes: | + Android package com.pixelrespawn.linkboy, closed source, free on Google Play with a + paid unlock, reached by ES-DE through its LINKBOY find rule. Two Play distribution + builds are read here, 3.11.0 (versionCode 86, minSdk 26, targetSdk 36, xapk sha256 + 83b92276d28d71e491ebcbec3fa85cef42ef49d8ee0c6fd1bbe0045bc118f866) and 1.4.2 + (versionCode 12), both carrying the app signing certificate sha256 + feb643cfdd9c49f58eb325fde3d869cefcf59e45dfadb8e540beca35a7b1c28e and the Play + distribution source stamp. Emulation lives in liblinkboy.so behind a JNI bridge; + addresses below are armeabi-v7a of 3.11.0 and class names are those of its + obfuscated dex. + + Four subsystems are declared: GBA, GBC, GB and SGB (ve0.java:16-21). An SGB + cartridge runs in GB mode when prefer-sgb is off (wo0.java:62, c51.java:183-185). + + The three firmware images are the only files the emulator reads that it does not + write itself. One table holds their names, sizes and md5 sums (cr.java:8), and the + firmware screen reports each as present, mismatched or absent by comparing the + size and then the md5 of the whole file (br.java:24-88, yz1.java:39, hr1.java:110). + Saves, cheats, thumbnails, keymaps and the ips, ups and bps patches picked up next + to a ROM are written or supplied per game, not fixed files. + + An image is read only while the use-bios preference is on, which is off until set + (wo0.java:63, a75.java:165-173, c51.java:186,268, w41.java:243). The loader appends + firmware/ and the name to the directory handed to setDataDir, the app's external + files directory (c51.java:69, hg3.java:32-38), and opens the result with fopen "rb". + A file whose length is not exactly the expected size is closed and treated as + absent, as is a short read; on success the loader returns the crc32 of the bytes + (liblinkboy.so 0x1c870-0x1ca10, crc32 at 0x1c4cc). + + A missing image stops nothing. The GBA path copies a replacement bios compiled into + the library over the 16 KB region and zero fills the remainder (0x109de8-0x109e64). + The GB and GBC path hands the reset routine a boot rom present flag, false when no + image was loaded, and the machine starts from its post boot state + (0x14f534-0x14f5b8, 0x14f638-0x14f654). + + Save states record the crc32 of the image they were made under. Loading a state + whose value differs from the running machine re-reads the file and refuses the state + when the crc32 still disagrees (0x10aa40-0x10aa98, 0x14fe00-0x14fe64). + +files: + - name: gba_bios.bin + path: firmware/gba_bios.bin + system: nintendo-gba + required: false + hle_fallback: true + size: 16384 + md5: a860e8c0b6d573d191e4ec7db1b1e4f6 + validation: [size, md5] + config_key: "use-bios" + description: "Game Boy Advance BIOS" + note: "Read into the 16 KB bios region when use-bios is on. Absent, mismatched in size or short, the region is filled with a replacement bios compiled into the library and zero padded." + source_ref: "Linkboy 3.11.0 cr.java:8, br.java:24-88, liblinkboy.so 0x109de8-0x109e64 (size argument 0x4000), loader 0x1c870-0x1ca10" + + - name: gbc_bios.bin + path: firmware/gbc_bios.bin + system: nintendo-gbc + required: false + hle_fallback: true + size: 2304 + md5: dbfce9db9deaa2567f6a84fde55f9680 + validation: [size, md5] + config_key: "use-bios" + description: "Game Boy Color boot ROM" + note: "Read when use-bios is on and the machine is a Game Boy Color. Without it the reset routine receives a false boot rom flag and the machine starts from its post boot state." + source_ref: "Linkboy 3.11.0 cr.java:8, br.java:24-88, liblinkboy.so 0x14f5a0-0x14f5b0 (size argument 0x900), 0x14f638-0x14f654, loader 0x1c870-0x1ca10" + + - name: gb_bios.bin + path: firmware/gb_bios.bin + system: nintendo-gb + required: false + hle_fallback: true + size: 256 + md5: 32fbbd84168d3482956eb3c5051637f5 + validation: [size, md5] + config_key: "use-bios" + description: "Game Boy boot ROM" + note: "Read when use-bios is on and the machine is a Game Boy. Without it the reset routine receives a false boot rom flag and the machine starts from its post boot state." + source_ref: "Linkboy 3.11.0 cr.java:8, br.java:24-88, liblinkboy.so 0x14f58c-0x14f59c (size argument 0x100), 0x14f638-0x14f654, loader 0x1c870-0x1ca10" diff --git a/emulators/lynx-emu.yml b/emulators/lynx-emu.yml new file mode 100644 index 00000000..3963ab89 --- /dev/null +++ b/emulators/lynx-emu.yml @@ -0,0 +1,105 @@ +emulator: "Lynx.emu" +type: standalone +core_classification: community_fork +source: "https://github.com/Rakashazi/emu-ex-plus-alpha" +upstream: "https://mednafen.github.io/" +profiled_date: "2026-08-11" +source_commit: "1c12fac5ce49badaadff2e2f210dcc30b89f4943" +core_version: "1.5.85" +display_name: "Atari - Lynx (Lynx.emu)" +mode: standalone +cores: + - "lynx-emu" + - "Lynx.emu" + - "LYNX-EMU" +systems: + - atari-lynx + +notes: | + Member of the EX Emulator series by Robert Broglia, which targets Android and + Linux (README.md:3-4,12-13) and keeps iOS and Pandora build shortcuts in the + tree (Lynx.emu/ios.mk, Lynx.emu/pandora.mk). Published as + com.explusalpha.LynxEmu (Lynx.emu/metadata/conf.mk:2,6,7) and reached by ES-DE + through its LYNX-EMU find rule. Mednafen's Lynx module, itself derived from + Handy by K. Wilkins, is vendored under Lynx.emu/src/lynx + (Lynx.emu/metadata/conf.mk:8, Lynx.emu/src/main/AppMeta.cc:26) and driven by + the app's own video, audio and input layers. The vendored copy declares + Mednafen 1.32.0-UNSTABLE + (EmuFramework/include/shared/mednafen/mednafen-config.h:167); the upstream + comparisons below are against the 1.32.1 release. Content is read from .lnx, + .lyx and .o files (Lynx.emu/metadata/conf.mk:5, + Lynx.emu/src/main/AppMeta.cc:30), and the module also takes a headerless image + of 128, 256 or 512 KB, a filetype upstream rejects + (Lynx.emu/src/lynx/system.cpp:90-91,112; mednafen src/lynx/system.cpp:86-93). + + The boot ROM is the one file the user supplies and it carries no name of its + own. The picker takes any name ending in .img and stores the chosen URI in + biosPath (Lynx.emu/src/main/EmuMenuViews.cc:32-50, + Lynx.emu/src/main/system.ccm:70, Lynx.emu/src/main/options.cc:33,55). + MDFN_MakeFName returns that URI for MDFNMKF_FIRMWARE and drops the + lynxboot.img name the module hands it, the name upstream resolves in its + firmware directory (Lynx.emu/src/main/options.cc:150-154, + Lynx.emu/src/lynx/system.cpp:103; mednafen src/lynx/system.cpp:101). CRom + opens the file only when the path is not empty and throws unless it is exactly + 512 bytes (Lynx.emu/src/lynx/rom.cpp:75-95). Upstream has neither test: it + opens whatever the firmware directory yields and takes 512 bytes or more + (mednafen src/lynx/rom.cpp:55-74). A path that is set but cannot be opened, or + that is the wrong length, aborts the content load rather than falling back + (EmuFramework/src/shared/mednafen-emuex/StreamImpl.cc:53-63, + Lynx.emu/src/lynx/system.cpp:337-342). + + With no path mValid stays false (Lynx.emu/src/lynx/rom.h:77) and Reset builds a + stub boot ROM in place: 512 bytes of 0x88, the reset vectors, and STA $FD97 at + $FE00, $FE19, $FE4A and $FF80 (Lynx.emu/src/lynx/rom.cpp:55-72, + Lynx.emu/src/lynx/rom.h:50, Lynx.emu/src/lynx/system.cpp:241-263). A write to + that register from inside the ROM window dispatches to the four HLE routines + (Lynx.emu/src/lynx/mikie.cpp:1033-1053), which clear RAM, pull the encrypted + loader blocks off the cartridge shifter, run them through lynx_decrypt and jump + to $0200 (Lynx.emu/src/lynx/system.cpp:150-208, + Lynx.emu/src/lynx/lynxdec.cpp:265). Neither the stub nor lynxdec.cpp exists + upstream, where the constructor reaches the throw and Reset carries the + homebrew branch alone (mednafen src/lynx/system.cpp:169-177). + + No hash is checked. The module holds no crc32 table, and its only md5 use is + the content hash that names saves and states (Lynx.emu/src/lynx/cart.cpp: + 245-264, Lynx.emu/src/lynx/system.cpp:313,319). The custom palette entry + survives in the module table and reaches nothing: Lynx_SetPixelFormat passes an + empty span where upstream Emulate passes espec->CustomPalette + (Lynx.emu/src/lynx/system.cpp:352,555,583; mednafen src/lynx/system.cpp: + 267,298), the app calls MDFNGI::Load directly instead of going through the + Mednafen frontend that reads .pal files + (EmuFramework/src/shared/mednafen-emuex/MDFNUtils.hh:133-145, + Lynx.emu/src/main/Main.cc:62-65), and the frame spec is value-initialised so + CustomPalette stays null + (EmuFramework/src/shared/mednafen-emuex/MDFNUtils.hh:153, + EmuFramework/src/shared/mednafen/git.h:399). Cheats answer false against + CheatInfo_Empty (Lynx.emu/src/main/options.cc:126-127, + Lynx.emu/src/lynx/system.cpp:586), no Cheats.cc is in the build + (Lynx.emu/src/CMakeLists.txt:6-21), and the app declares no bundled content, + the framework definition defaulting to an empty span + (EmuFramework/src/AppMeta.cc:40, + EmuFramework/include/emuframework/AppMeta.hh:66-68). + + MDFN_MakeFName is called once and only for the firmware, so the module asks for + no save file (Lynx.emu/src/lynx/system.cpp:103). What the app writes is .mca + states (Lynx.emu/src/main/system.ccm:86, Lynx.emu/src/main/Main.cc:47-54) and + LynxEmu.config (Lynx.emu/src/main/AppMeta.cc:27). ui.png, gpOverlay.png and the + shader sources are drawn by the framework from the application bundle + (EmuFramework/include/emuframework/AssetManager.hh:61-65, + EmuFramework/src/AssetManager.cc:58-65, + EmuFramework/src/VideoImageEffect.cc:164-172). + +files: + - name: lynxboot.img + system: atari-lynx + required: false + hle_fallback: true + has_builtin: true + size: 512 + validation: [size] + description: "Atari Lynx boot ROM" + note: >- + Picked by the user from any path, under any name ending in .img. The length + is the only test and a file of another length aborts the load rather than + falling back. + source_ref: "Lynx.emu/src/lynx/system.cpp:103 (firmware request), Lynx.emu/src/main/options.cc:150-154 (path comes from the picker), Lynx.emu/src/lynx/rom.cpp:75-95 (open and size test), Lynx.emu/src/main/EmuMenuViews.cc:32-50 (picker and extension filter), Lynx.emu/src/lynx/system.cpp:241-263 (stub boot ROM when absent)" diff --git a/emulators/m64plus-fz.yml b/emulators/m64plus-fz.yml new file mode 100644 index 00000000..10a694e2 --- /dev/null +++ b/emulators/m64plus-fz.yml @@ -0,0 +1,163 @@ +emulator: M64Plus FZ +type: standalone +core_classification: community_fork +source: "https://github.com/fzurita/mupen64plus-ae" +upstream: "https://github.com/fzurita/mupen64plus-ae" +source_branch: fz-master +profiled_date: "2026-08-11" +source_commit: "f3c381bcc58e4adce897aba323193d3f407e30e3" +core_version: "3.0.335 (beta)" +display_name: "Nintendo - Nintendo 64 (M64Plus FZ)" +cores: + - m64plus-fz + - M64PLUS-FZ + - org.mupen64plusae.v3.fzurita + - org.mupen64plusae.v3.fzurita.pro + - org.mupen64plusae.v3.fzurita.amazon +systems: + - nintendo-64 + - nintendo-64dd +mode: standalone + +notes: | + Android application forked from Paul Lamb's Mupen64Plus AE and published under + three package ids built from one code line: org.mupen64plusae.v3.fzurita, the + paid .pro and the Amazon .amazon. Those flags gate advertising and Google + Drive backup and nothing else (AppData.java:334-337, + DataPrefsActivity.java:173-182, GamePrefsActivity.java:288-296), so the three + packages want the same files. The repository default branch is a 2017 snapshot + of the parent project; the application is built from fz-master, which carries + mupen64plus-core, the hle, cxd4 and parallel RSP plugins, the GLideN64, + glide64mk2, gln64, rice, angrylion-plus and parallel video plugins, its own + audio, touchscreen and raphnet input plugins, and a miniupnp bridge for + netplay (settings.gradle:1). ES-DE launches it for both n64 and n64dd with an + ACTION_VIEW intent carrying a storage access uri, which the splash screen + forwards to the gallery as a rom path (AndroidManifest.xml:83-96, + ActivityHelper.java:191-198). + + Cartridge boot needs no boot ROM. The PIF boot sequence is simulated + (mupen64plus-core device/pif/bootrom_hle.c:48, entered from + device/r4300/interrupt.c:445,496 and main/main.c:1875) and the CIC-NUS-6105 + challenge is answered by an algorithm rather than a stored table + (device/pif/n64_cic_nus_6105.c:93). Nothing fills the PIF ROM window from a + file. + + Which 64DD IPL is used is not decided by the code. Two settings hold a path + and both end up as the same working file dd_rom.n64: the global one, titled + 64DD IPL (J), read when the launched file is itself a disk, and a per game + one, titled 64DD IPL, read when a cartridge is launched with a disk attached + (CoreService.java:599-612, CoreInterface.java:142,229,455-484). The core + offers a callback that would name the image per disk region and the front end + leaves it null (CoreInterface.java:221, main/main.c:1082-1086), so whichever + image sits in the slot is the one loaded. A disk is recognised only when its + system data header matches and carries one of three region words, 0xe848d316 + for Japan, 0x2263ee56 for the United States and 0x00000000 for development + (RomHeader.java:180-212); the word sets a country code used for the ROM + database and cheat lookup, never for picking the IPL. Launching a bare disk + with the global slot empty stops before the core starts + (CoreService.java:621-623), and since disk only games still need a cartridge + image the application feeds the m64p_test_rom.v64 asset in its place + (CoreService.java:620,625-630). Disk content inside a .zip or .7z is unpacked to + the working directory first (CoreInterface.java:486-518). + + Transfer Pak carts come from four per player path settings copied into the + working directory as playerN_gb_rom.gb and playerN_gb_ram.gb + (CoreService.java:558-568, CoreInterface.java:196-210,430-452). The core + rejects a cart under 32 KiB and an unknown type byte at 0x147 + (device/gb/gb_cart.c:994-1008) and fixes no name, size or hash, so neither the + cart nor its save carries an entry here. + + Seven data files ship inside the package and are unpacked on first start into + the private files directory, which is also what the core is told is + SharedDataPath (ExtractAssetsOrCleanupTask.java:63-73, SplashActivity.java:402, + AppData.java:411-423, NativeConfigFiles.java:112). mupen64plus.ini is the ROM + database, read by the core (main/rom.c:473-490 from api/frontend.c:106) and by + the gallery (SplashActivity.java:447, ScanRomsFragment.java:195, + GamePrefsActivity.java:244). mupencheat.default is copied over + Profiles/customCheats.txt into mupencheat.txt and parsed in Java + (SplashActivity.java:443, CheatUtils.java:88-93, GamePrefsActivity.java:618); + the core's own cheat.c opens no file. font.ttf is reached by GLideN64 only + after /system/fonts/DroidSans.ttf fails, which it does on current Android + (TextDrawer.cpp:201-233,235-241, NativeConfigFiles.java:292); the core's OSD, + the other upstream reader of that name, is absent from the Android source list + (mupen64plus-core.mk:24-105). RiceVideoLinux.ini holds rice's per ROM settings + (rice Config.cpp:38,933-951), Glide64mk2.ini glide64mk2's + (glide64mk2 Main.cpp:1581-1590), and gln64.conf with gln64rom.conf gln64's + global and per ROM settings (gln64 Config.cpp:245-252,296-300). + + Two more assets are read straight out of the package and never unpacked: + m64p_test_rom.v64, and GLideN64.custom.ini, whose per ROM overrides the front + end reads itself and writes into mupen64plus.cfg (AppData.java:416-417, + ConfigFile.java:224-230, NativeConfigFiles.java:224). GLideN64 also asks the + core for GLideN64.custom.ini in SharedDataPath, where it was never placed, so + that native lookup finds nothing (Config_mupenplus.cpp:325-341). The + touchscreen skins, the shader files and the controller, touchscreen and + emulation profile templates are used from the package the same way + (AppData.java:412,421-423). + + Optional content with no canonical artifact: hi-res texture packs under + CoreConfig/UserData/mupen64plus/hires_texture, imported from a user archive + (GlobalPrefs.java:472, NativeConfigFiles.java:268, ExtractTexturesFragment.java), + the _HIRESTEXTURES.htc and .hts caches the plugin builds from them, read + back for their alpha flag (NativeConfigFiles.java:364-371), customCheats.txt, + custom touchscreen skins and cover art (GlobalPrefs.java:484-490), and + alp_screen.vert with alp_screen.frag, which angrylion-plus opens as working + directory relative paths before falling back to its embedded shaders + (angrylion-plus output/vdac.c:119-165,245-247). + + Written rather than obtained: mupen64plus.cfg and the plugin sections in it, + the mempak, eeprom, flashram and sram saves and 64DD disk saves opened with + default content when absent, savestates, screenshots, the texture dump and + cache directories, the GLideN64 shader cache and romInfoCache.cfg + (GlobalPrefs.java:466-484, NativeConfigFiles.java:109-112,276,289). + + One file in the tree this build never reads: cxd4's rsp_conf.bin. Its reader + is the zilmar variant of update_conf behind #if !defined(M64P_PLUGIN_API); the + build defines that macro (mupen64plus-rsp-cxd4.mk:8), so the variant compiled + takes its settings from the core config API and ignores the filename it is + handed (mupen64plus-rsp-cxd4 module.c:83-93,239,636-657). + +files: + - name: "64DD_IPL_JP.n64" + aliases: ["64DD_IPL_v12_JPN.bin", "64DD_IPL.bin"] + system: nintendo-64dd + required: true + validation: [signature] + description: "64DD IPL ROM (Japanese retail)" + note: > + The image every commercially released disk needs, and the one the global + setting is named for. No name is fixed by the code: the path comes from a + document picker with no extension filter and the file is copied to + dd_rom.n64 before the core sees it. The core reads it whole, then + byteswaps after identifying the first word as one of 0x80270740 (z64), + 0x40072780 (n64) or 0x27804007 (v64); any other value logs an invalid IPL + and disables 64DD. Size is not checked and no hash is computed. + source_ref: "app/src/main/java/paulscode/android/mupen64plusae/jni/CoreService.java:599-612,622-624, app/src/main/java/paulscode/android/mupen64plusae/jni/CoreInterface.java:455-484, app/src/main/java/paulscode/android/mupen64plusae/persistent/GlobalPrefs.java:417,715, mupen64plus-core/upstream/src/main/main.c:1080-1145" + + - name: "64DD_IPL_US.n64" + aliases: ["64DD_IPL_USA.bin", "IPL_USA.n64"] + system: nintendo-64dd + required: true + validation: [signature] + description: "64DD IPL ROM (American retail)" + note: > + Needed for a disk whose system data carries the US region word + 0x2263ee56, which the header reader accepts alongside the Japanese and + development words. The front end holds one IPL path at a time and never + branches on that region, so this image is loaded by putting it in the same + setting. Same load path, format check and absence of size or hash + validation as the Japanese image. + source_ref: "app/src/main/java/paulscode/android/mupen64plusae/util/RomHeader.java:180-212, app/src/main/java/paulscode/android/mupen64plusae/jni/CoreInterface.java:221,455-484, mupen64plus-core/upstream/src/main/main.c:1080-1145" + + - name: "64DD_IPL_DEV.n64" + aliases: ["64DD_IPL_DEV.bin", "IPL_DEV.n64"] + system: nintendo-64dd + required: true + validation: [signature] + description: "64DD IPL ROM (development)" + note: > + Needed for a disk whose system data carries the development region word + 0x00000000, the third value the header reader accepts before giving up on + a file as a disk. Shares the single IPL setting with the other two images. + Same load path, format check and absence of size or hash validation. + source_ref: "app/src/main/java/paulscode/android/mupen64plusae/util/RomHeader.java:180-212, app/src/main/java/paulscode/android/mupen64plusae/jni/CoreInterface.java:221,455-484, mupen64plus-core/upstream/src/main/main.c:1080-1145" diff --git a/emulators/numero.yml b/emulators/numero.yml index 492bf192..edb6b47d 100644 --- a/emulators/numero.yml +++ b/emulators/numero.yml @@ -39,6 +39,7 @@ files: - name: "ti83se.rom" system: ti-83 description: "TI-83 Plus Silver Edition ROM dump" + priority: 1 required: false source_ref: "libnumero/libretro/libretronew.cpp:576-578" note: "Checked first. Recommended for largest storage capacity." @@ -46,6 +47,7 @@ files: - name: "ti83plus.rom" system: ti-83 description: "TI-83 Plus ROM dump" + priority: 2 required: false source_ref: "libnumero/libretro/libretronew.cpp:583-585" note: "Checked second, used if ti83se.rom is missing." @@ -53,6 +55,7 @@ files: - name: "ti83.rom" system: ti-83 description: "TI-83 ROM dump" + priority: 3 required: false source_ref: "libnumero/libretro/libretronew.cpp:591-593" note: "Checked last. Original TI-83 (non-Plus)." diff --git a/emulators/pcsx1.yml b/emulators/pcsx1.yml index 392b83c1..711ad49b 100644 --- a/emulators/pcsx1.yml +++ b/emulators/pcsx1.yml @@ -20,6 +20,7 @@ notes: > files: - name: "scph1001.bin" description: "SCPH-1001 (v2.2 12-04-95 A)" + priority: 1 required: false hle_fallback: true size: 524288 @@ -28,6 +29,7 @@ files: - name: "scph5501.bin" description: "SCPH-5501 (v3.0 11-18-96 A)" + priority: 2 required: false hle_fallback: true size: 524288 @@ -36,6 +38,7 @@ files: - name: "scph7001.bin" description: "SCPH-7001 (v4.1 12-16-97 A)" + priority: 3 required: false hle_fallback: true size: 524288 diff --git a/emulators/px68k.yml b/emulators/px68k.yml index d47db5ed..b41a2fab 100644 --- a/emulators/px68k.yml +++ b/emulators/px68k.yml @@ -43,6 +43,7 @@ files: - name: "iplrom.dat" path: "keropi/iplrom.dat" + priority: 1 size: 131072 required: true note: > @@ -53,6 +54,7 @@ files: - name: "iplrom30.dat" path: "keropi/iplrom30.dat" + priority: 2 size: 131072 required: false note: > @@ -62,6 +64,7 @@ files: - name: "iplromco.dat" path: "keropi/iplromco.dat" + priority: 3 size: 131072 required: false note: > @@ -71,6 +74,7 @@ files: - name: "iplromxv.dat" path: "keropi/iplromxv.dat" + priority: 4 size: 131072 required: false note: > diff --git a/emulators/yabasanshiro.yml b/emulators/yabasanshiro.yml index 1eebd3c0..67718059 100644 --- a/emulators/yabasanshiro.yml +++ b/emulators/yabasanshiro.yml @@ -35,6 +35,7 @@ notes: | files: - name: "saturn_bios.bin" system: sega-saturn + priority: 1 required: true hle_fallback: true note: "Primary Saturn BIOS. Any region accepted." @@ -43,6 +44,7 @@ files: - name: "sega_101.bin" system: sega-saturn region: [japan] + priority: 2 required: false hle_fallback: true note: "Saturn BIOS v1.01 (Japan). Fallback if saturn_bios.bin missing." @@ -51,6 +53,7 @@ files: - name: "mpr-17933.bin" system: sega-saturn region: [north-america, europe] + priority: 3 required: false hle_fallback: true note: "Saturn BIOS v1.003 (NA/EU). Last fallback." diff --git a/emulators/yabause.yml b/emulators/yabause.yml index 3481f51d..fdb1ab52 100644 --- a/emulators/yabause.yml +++ b/emulators/yabause.yml @@ -34,6 +34,7 @@ notes: | files: - name: "saturn_bios.bin" system: sega-saturn + priority: 1 required: true hle_fallback: true max_size: 524288 @@ -44,6 +45,7 @@ files: - name: "sega_101.bin" system: sega-saturn region: [japan] + priority: 2 required: false hle_fallback: true max_size: 524288 @@ -54,6 +56,7 @@ files: - name: "mpr-17933.bin" system: sega-saturn region: [north-america, europe] + priority: 3 required: false hle_fallback: true max_size: 524288