From a5553def94a992edb5b150d0e34f0550b0567fa8 Mon Sep 17 00:00:00 2001 From: Abdessamad Derraz <3028866+Abdess@users.noreply.github.com> Date: Tue, 17 Mar 2026 20:33:26 +0100 Subject: [PATCH] feat: add 10 emulator profiles (119-series batch 5) boytacean (GB Rust, 6 boot ROMs embedded), emux_chip8 (no BIOS), fake08 (PICO-8, Lua runtime compiled in), jaxe (CHIP-8, fonts hardcoded), lowresnx (fantasy console), opentyrian (Tyrian freeware data), openlara (Tomb Raider engine, game data), squirreljme (J2ME, 8 JARs), vitaquake2 (Quake 2, 4 variants), xrick (data.zip sound pack) 145 total profiles. --- emulators/boytacean.yml | 72 ++++++ emulators/emux_chip8.yml | 43 ++++ emulators/fake08.yml | 45 ++++ emulators/jaxe.yml | 44 ++++ emulators/lowresnx.yml | 42 ++++ emulators/openlara.yml | 28 +++ emulators/opentyrian.yml | 475 ++++++++++++++++++++++++++++++++++++++ emulators/squirreljme.yml | 91 ++++++++ emulators/vitaquake2.yml | 27 +++ emulators/xrick.yml | 78 +++++++ 10 files changed, 945 insertions(+) create mode 100644 emulators/boytacean.yml create mode 100644 emulators/emux_chip8.yml create mode 100644 emulators/fake08.yml create mode 100644 emulators/jaxe.yml create mode 100644 emulators/lowresnx.yml create mode 100644 emulators/openlara.yml create mode 100644 emulators/opentyrian.yml create mode 100644 emulators/squirreljme.yml create mode 100644 emulators/vitaquake2.yml create mode 100644 emulators/xrick.yml diff --git a/emulators/boytacean.yml b/emulators/boytacean.yml new file mode 100644 index 00000000..33a20962 --- /dev/null +++ b/emulators/boytacean.yml @@ -0,0 +1,72 @@ +emulator: Boytacean +type: libretro +source: "https://github.com/joamag/boytacean" +cores: + - boytacean +systems: + - nintendo-gb + - nintendo-gbc + +notes: | + Boytacean is a Game Boy / Game Boy Color emulator written in Rust by Joao Magalhaes. + No external BIOS or boot ROM files are needed. + + The core ships with multiple boot ROMs compiled directly into the binary as static + byte arrays in src/data.rs. For DMG mode the default is "DMG Bootix" (an open-source + boot ROM forked from SameBoy's Bootix project, 256 bytes). For CGB mode the default + is "CGB Boytacean" (a custom open-source CGB boot ROM, 2304 bytes). The original + Nintendo DMG, SGB, and CGB boot ROMs are also embedded as static arrays (DMG_BOOT, + SGB_BOOT, CGB_BOOT) but the defaults use the open-source replacements. + + The libretro frontend (frontends/libretro/src/core.rs) calls instance.load(true) in + retro_load_game(), which routes through load_dmg() or load_cgb() depending on the + cartridge header. These call load_boot_static() which copies one of the embedded byte + arrays into MMU memory. There is no RETRO_ENVIRONMENT_GET_SYSTEM_DIRECTORY call, no + filesystem access for boot ROMs, and no core option to load external boot ROM files. + + The .info file (boytacean_libretro.info) lists no firmware entries. + + Boot ROM selection defaults: + - DMG: BootRom::DmgBootix (gb.rs:1389) - open-source, 256 bytes + - CGB: BootRom::CgbBoytacean (gb.rs:1398) - open-source, 2304 bytes + + All boot ROM source code lives in src/boot/, forked from SameBoy and assembled + with rgbds. The compiled binaries are then converted to Rust const arrays in data.rs. + +files: [] + +analysis: + embedded_boot_roms: + dmg_boot: + constant: DMG_BOOT + size: 256 + description: "Original Nintendo DMG boot ROM (embedded, not default)" + source_ref: "data.rs:14-27" + sgb_boot: + constant: SGB_BOOT + size: 256 + description: "Super Game Boy boot ROM (embedded, not default)" + source_ref: "data.rs:29-42" + dmg_bootix: + constant: DMG_BOOTIX + size: 256 + description: "Open-source DMG boot ROM from Bootix project (default for DMG)" + source_ref: "data.rs:44-57" + mgb_bootix: + constant: MGB_BOOTIX + size: 256 + description: "Open-source MGB (Game Boy Pocket) boot ROM from Bootix project" + source_ref: "data.rs:59-72" + cgb_boot: + constant: CGB_BOOT + size: 2304 + description: "Original Nintendo CGB boot ROM (embedded, not default)" + source_ref: "data.rs:74-175" + cgb_boytacean: + constant: CGB_BOYTACEAN + size: 2304 + description: "Custom open-source CGB boot ROM (default for CGB)" + source_ref: "data.rs:177-275" + filesystem_access: false + system_directory_used: false + boot_rom_source: "src/boot/ (assembly, forked from SameBoy)" diff --git a/emulators/emux_chip8.yml b/emulators/emux_chip8.yml new file mode 100644 index 00000000..0b29da2e --- /dev/null +++ b/emulators/emux_chip8.yml @@ -0,0 +1,43 @@ +emulator: "emux (CHIP-8)" +type: libretro +source: "https://github.com/libretro/emux" +cores: + - emux_chip8 +systems: + - chip8 + +notes: | + emux is a multi-system emulator supporting CHIP-8, Game Boy, NES, and + Sega Master System as separate libretro cores. The CHIP-8 core + (emux_chip8) does not require any external BIOS or firmware files. + + The CHIP-8 architecture has no real BIOS. The standard font/character + set (hex digits 0-F, 5 bytes each = 80 bytes) is hardcoded in + mach/chip8.c:40-57 as the char_mem[] array. On reset, this font data + is copied into the beginning of the 4 KB RAM (address 0x000-0x04F) + via memcpy in chip8_reset() at mach/chip8.c:105. + + ROM loading: the game ROM is loaded via file_open(PATH_DATA, ...) in + chip8_init() at mach/chip8.c:68-74. On reset, ROM contents are copied + into RAM starting at address 0x200 (mach/chip8.c:113). The core + accepts .ch8, .bin, and .rom extensions (libretro/Makefile.rules:20). + + Memory map from mach/chip8.c:17-20: + 0x000-0x04F font/character data (hardcoded) + 0x050-0x1FF unused + 0x200-0xFFF program ROM + working RAM + + The libretro frontend retrieves the system directory via + RETRO_ENVIRONMENT_GET_SYSTEM_DIRECTORY (libretro/libretro.c:34) but + only uses it as a general config path, not for BIOS loading. + +files: [] + +platform_details: + bios_mapping: + target: "none" + source_ref: "mach/chip8.c:40-57, mach/chip8.c:98-115" + notes: | + No external BIOS. The 80-byte character font is compiled into the + binary as char_mem[] and memcpy'd into RAM[0x000] on every reset. + This is standard CHIP-8 behavior -- all interpreters embed the font. diff --git a/emulators/fake08.yml b/emulators/fake08.yml new file mode 100644 index 00000000..c2efe3aa --- /dev/null +++ b/emulators/fake08.yml @@ -0,0 +1,45 @@ +emulator: FAKE-08 +type: libretro +source: "https://github.com/jtothebell/fake-08" +cores: + - fake08 +systems: + - pico8 + +notes: | + FAKE-08 is an open-source PICO-8 compatible runtime for running .p8 and + .p8.png cartridges on platforms where the official PICO-8 binary is not + available (3DS, Vita, Switch, Wii U, various handhelds). + + The core retrieves RETRO_ENVIRONMENT_GET_SYSTEM_DIRECTORY in + retro_set_environment() (libretro.cpp:162-163) but never uses the value. + No file is loaded from the system directory. The PICO-8 boot sequence, + global Lua functions, and default cart menu are compiled directly into the + binary as string constants (p8GlobalLuaFunctions.h, DefaultCart.h). + + When no ROM is passed (supports_no_game = true), the core queues its + built-in BIOS cart "__FAKE08-BIOS.p8" (libretro.cpp:751). This is not + an external file -- it is generated internally by the VM. + + The core accepts .p8 (text) and .png (cartridge-as-image) formats + (libretro.cpp:258). Content is loaded either via the libretro data buffer + or full path depending on the _NEED_FULL_PATH_ compile flag. + +files: [] + +platform_details: + cartridge_format: + extensions: "p8, png" + source_ref: "platform/libretro/libretro.cpp:258" + notes: | + .p8 is the PICO-8 text cartridge format containing Lua code, gfx, + gff, map, sfx, and music sections. .png is the cartridge-as-image + format where cart data is steganographically encoded in the image. + + runtime: + source_ref: "source/vm.h, source/p8GlobalLuaFunctions.h" + notes: | + The FAKE-08 VM reimplements the PICO-8 API (128x128 screen, 16 colors, + 4-channel audio, Lua scripting) entirely in C++. The built-in BIOS + provides a cart browser and error display. Audio runs at 22050 Hz + with save state support via custom serialization (libretro.cpp:517-736). diff --git a/emulators/jaxe.yml b/emulators/jaxe.yml new file mode 100644 index 00000000..9f9624e7 --- /dev/null +++ b/emulators/jaxe.yml @@ -0,0 +1,44 @@ +emulator: JAXE +type: libretro +source: "https://github.com/libretro/jaxe" +cores: + - jaxe +systems: + - chip8 + +notes: | + JAXE is a CHIP-8, SCHIP, and XO-CHIP emulator by Kurtis Dinelle, + ported to libretro. Supports .ch8, .sc8, .xo8, and .hc8 ROMs. + + No external BIOS or font files required. The core has firmware_count = 0 + in jaxe_libretro.info and never calls RETRO_ENVIRONMENT_GET_SYSTEM_DIR. + + Font data is hardcoded in chip8_load_font() at src/chip8.c:119-168. + The standard 4x5 hex font (0-F, 80 bytes) is loaded at address 0x000, + and the SCHIP 8x10 big hex font (0-F, 160 bytes) follows immediately + after at address 0x050. Both are written directly into chip8->RAM[] + during chip8_reset() -> chip8_load_font(). + + Memory layout from include/chip8.h:42-45: + 0x000-0x04F standard font (NUM_FONT_BYTES = 80) + 0x050-0x0EF big font (NUM_BIG_FONT_BYTES = 160) + 0x0F0-0x0FF stack (STACK_SIZE = 16) + 0x100-0x10F audio buffer (AUDIO_BUF_SIZE = 16) + 0x200+ program ROM (PC_START_ADDR_DEFAULT) + + The fonts/dbgfont.ttf file in the repo is only used by the standalone + build (src/main.c:19) for the SDL debugger overlay, not by the + libretro core. + +files: [] + +platform_details: + bios_mapping: + target: "none" + source_ref: "jaxe_libretro.info:13, src/chip8.c:119-168" + notes: | + All font/sprite data is compiled into the binary. The standard + CHIP-8 hex font (5 bytes per character, 16 characters) and the + SCHIP big hex font (10 bytes per character, 16 characters) are + stored as a static array in chip8_load_font() and copied into + RAM on every reset. No file I/O is performed for BIOS or fonts. diff --git a/emulators/lowresnx.yml b/emulators/lowresnx.yml new file mode 100644 index 00000000..0174b9b1 --- /dev/null +++ b/emulators/lowresnx.yml @@ -0,0 +1,42 @@ +emulator: LowRes NX +type: libretro +source: "https://github.com/timoinutilis/lowres-nx" +cores: + - lowresnx +systems: + - lowresnx + +notes: | + LowRes NX is a fantasy console simulating an imaginary 8/16-bit handheld. + It runs programs written in a custom BASIC dialect, loaded as .nx files. + + The libretro port reads game content entirely through the retro_game_info + data buffer (need_fullpath = false, libretro_main.c:317). The .nx source + code is copied into memory at retro_load_game() (libretro_main.c:490) + and compiled by the built-in interpreter. + + The boot intro sequence is compiled from bootIntroSourceCode, a string + constant embedded in boot_intro.c -- not loaded from any external file. + The core never calls RETRO_ENVIRONMENT_GET_SYSTEM_DIRECTORY. There is + no code path that reads any file from the system directory. No BIOS, + firmware, or boot ROM is required. + + The virtual machine provides a 160x128 screen, 64 colors, 256 8x8 + sprites, 4-channel sound, d-pad + 2 buttons, and a pause button. + +files: [] + +platform_details: + cartridge_format: + extensions: "nx" + source_ref: "libretro_main.c:318" + notes: | + .nx files contain LowRes NX BASIC source code as plain text. + The interpreter compiles the source at load time. + + runtime: + source_ref: "core/ (compiled into binary)" + notes: | + The entire LowRes NX runtime (CPU emulation, video chip, audio chip, + BASIC compiler/interpreter, boot intro) is compiled into the core + binary. No external dependencies at runtime. Version 1.2. diff --git a/emulators/openlara.yml b/emulators/openlara.yml new file mode 100644 index 00000000..b4429c69 --- /dev/null +++ b/emulators/openlara.yml @@ -0,0 +1,28 @@ +emulator: OpenLara +type: libretro +source: "https://github.com/libretro/OpenLara" +cores: [openlara] +systems: [tomb-raider] +verification: existence +notes: > + Open-source reimplementation of the classic Tomb Raider engine (TR1-TR4). + Supports PC (.PHD, .TR2, .TR4), PlayStation (.PSX), and Saturn (.SAT) + level formats. The core accepts phd|psx|tr2|sat extensions + (retro_get_system_info sets valid_extensions, main.cpp:246). + need_fullpath is true - the core resolves sibling game assets relative + to the content directory. retro_load_game (main.cpp:602) derives + contentDir from the loaded level file path and strips the level/ + subdirectory if present, then passes a relative levelpath to the engine. + Game version is auto-detected by probing for known level files: + DATA/GYM.PHD (TR1 PC), PSXDATA/GYM.PSX (TR1 PSX), DATA/GYM.SAT + (TR1 Saturn), data/ASSAULT.TR2 (TR2 PC), DATA/ASSAULT.PSX (TR2 PSX), + data/JUNGLE.TR2 (TR3 PC), DATA/JUNGLE.PSX (TR3 PSX), data/angkor1.tr4 + (TR4 PC) - see gameflow.h:1047-1071. Audio tracks are loaded from + audio/ subdirectories as .ogg files or cdaudio.wad containers + (gameflow.h:1248-1350). The system directory is used only to create + a cache folder at {system_dir}/openlara/cache/ (main.cpp:177-197). + No BIOS, firmware, or engine data files are required in the system + directory. All required data comes from the original game files loaded + as content. + +files: [] diff --git a/emulators/opentyrian.yml b/emulators/opentyrian.yml new file mode 100644 index 00000000..ef56d789 --- /dev/null +++ b/emulators/opentyrian.yml @@ -0,0 +1,475 @@ +emulator: OpenTyrian +type: libretro +source: "https://github.com/trapexit/libretro-opentyrian" +cores: [opentyrian] +systems: [tyrian] +verification: existence + +notes: | + OpenTyrian is a source port of the DOS vertical scrolling shooter Tyrian, + ported to libretro. It loads the Tyrian 2.1 freeware game data directly. + Tyrian 1.x, 2.0, and Tyrian 2000 data files are NOT compatible. + + The core's .info file sets supports_no_game = true. The core locates the + data directory by probing for tyrian1.lvl in several paths (file.c:33-58): + 1. custom_data_dir (set via --data= CLI argument, params.c:120) + 2. TYRIAN_DIR (compile-time constant, Makefile:5-8) + 3. "data" (relative subdirectory) + 4. "." (current working directory) + The first path containing tyrian1.lvl wins. + + On startup (opentyr.c:270-388), the core: + - Scans for episodes by checking tyrian1.lvl through tyrian5.lvl + (episodes.c:270-277) + - Loads palette data from palette.dat (palette.c:45) + - Loads main shape tables from tyrian.shp (sprite.c:669-722, 12 sprite + banks packed in one file: fonts, interface, option sprites, game sprites, + weapon sprites, etc.) + - Loads sound effects from tyrian.snd and voice samples from voices.snd + (nortsong.c:112-134, opentyr.c:333) + - Loads music from music.mus (loudness.c:196) + - Loads help/item data from tyrian.hdt (helptext.c:184, episodes.c:60) + - Loads picture data from tyrian.pic (picload.c:32) + - Loads credits from tyrian.cdt (mainint.c:2002) + + Each episode loads additional files dynamically (episodes.c:261-263): + - tyrianN.lvl (level data, N=1-5) + - levelsN.dat (episode level definitions) + - cubetxtN.dat (datacube text for story mode) + + The game engine also loads shape files on demand: + - shapesX.dat where X is a character from a 34-entry lookup table + (lvlmast.c:23-27, tyrian2.c:3079). Characters used: + 2,4,7,8,A,B,C,D,E,F,G,H,I,J,K,L,M,N,O,P,Q,R,S,T,U,5,#,V,0,@,3,^,9 + - newshX.shp loaded via JE_loadCompShapes (sprite.c:469-481) using the + same character set plus '~' for destruct mode (destruct.c:569) and + '1' for arrow/mouse cursor sprites (mainint.c:493,884,1462) and + '6' for explosion sprites (tyrian2.c:771) + + Additional optional files: + - tyrianc.shp and voicesc.snd for Christmas mode (opentyr.c:301-309) + - tyrend.anm for ending animation (tyrian2.c:2473) + - tshp2.pcx loaded during gameplay (tyrian2.c:2757, pcxload.c:25) + - estsc.shp for ending sequence sprites (mainint.c:1995) + - demo.1 through demo.5 for demo playback (mainint.c:1781-1786) + + All filenames must be lowercase on case-sensitive filesystems. The repo + includes lower-script.sh for batch renaming. + + The Tyrian 2.1 freeware data is available at: + https://camanis.net/tyrian/tyrian21.zip + + No separate BIOS or firmware is needed. The freeware game data set is the + sole system requirement. + +files: + # ----------------------------------------------------------- + # Core data files (required, loaded unconditionally at init) + # ----------------------------------------------------------- + - name: "tyrian.shp" + system: tyrian + description: "Main shape tables (12 sprite banks: fonts, interface, options, game sprites)" + required: true + source_ref: "sprite.c:669-722 (JE_loadMainShapeTables)" + + - name: "palette.dat" + system: tyrian + description: "Color palette data (all palettes used by the game)" + required: true + source_ref: "palette.c:45 (JE_loadPals)" + + - name: "tyrian.hdt" + system: tyrian + description: "Help and item data (weapons, ships, shields, enemies, help text)" + required: true + source_ref: "episodes.c:60 (JE_loadItemDat), helptext.c:184 (JE_loadHelpText)" + + - name: "tyrian.pic" + system: tyrian + description: "Picture data (menu backgrounds, cutscene images)" + required: true + source_ref: "picload.c:32 (JE_loadPic)" + + - name: "tyrian.cdt" + system: tyrian + description: "Credits text (encrypted pascal strings)" + required: true + source_ref: "mainint.c:2002 (JE_drawCredits)" + + - name: "tyrian.snd" + system: tyrian + description: "Sound effects" + required: true + source_ref: "nortsong.c:112, opentyr.c:333 (JE_loadSndFile)" + + - name: "voices.snd" + system: tyrian + description: "Voice samples" + required: true + source_ref: "nortsong.c:134, opentyr.c:333 (JE_loadSndFile)" + + - name: "music.mus" + system: tyrian + description: "Music data (all game tracks)" + required: true + source_ref: "loudness.c:196 (load_music)" + + # ----------------------------------------------------------- + # Episode level files (episode 1 required, 2-5 optional) + # ----------------------------------------------------------- + - name: "tyrian1.lvl" + system: tyrian + description: "Episode 1 level data (also used as data directory detection marker)" + required: true + source_ref: "file.c:51 (data_dir probe), episodes.c:274 (JE_scanForEpisodes)" + + - name: "levels1.dat" + system: tyrian + description: "Episode 1 level definitions" + required: true + source_ref: "episodes.c:263 (JE_initEpisode), tyrian2.c:2434" + + - name: "cubetxt1.dat" + system: tyrian + description: "Episode 1 datacube text (in-game story lore)" + required: true + source_ref: "episodes.c:262 (JE_initEpisode), game_menu.c:1723" + + - name: "tyrian2.lvl" + system: tyrian + description: "Episode 2 level data" + required: false + source_ref: "episodes.c:274" + + - name: "levels2.dat" + system: tyrian + description: "Episode 2 level definitions" + required: false + source_ref: "episodes.c:263" + + - name: "cubetxt2.dat" + system: tyrian + description: "Episode 2 datacube text" + required: false + source_ref: "episodes.c:262" + + - name: "tyrian3.lvl" + system: tyrian + description: "Episode 3 level data" + required: false + source_ref: "episodes.c:274" + + - name: "levels3.dat" + system: tyrian + description: "Episode 3 level definitions" + required: false + source_ref: "episodes.c:263" + + - name: "cubetxt3.dat" + system: tyrian + description: "Episode 3 datacube text" + required: false + source_ref: "episodes.c:262" + + - name: "tyrian4.lvl" + system: tyrian + description: "Episode 4 level data" + required: false + source_ref: "episodes.c:274" + + - name: "levels4.dat" + system: tyrian + description: "Episode 4 level definitions" + required: false + source_ref: "episodes.c:263" + + - name: "cubetxt4.dat" + system: tyrian + description: "Episode 4 datacube text" + required: false + source_ref: "episodes.c:262" + + - name: "tyrian5.lvl" + system: tyrian + description: "Episode 5 level data" + required: false + source_ref: "episodes.c:274" + + - name: "levels5.dat" + system: tyrian + description: "Episode 5 level definitions" + required: false + source_ref: "episodes.c:263" + + - name: "cubetxt5.dat" + system: tyrian + description: "Episode 5 datacube text" + required: false + source_ref: "episodes.c:262" + + # ----------------------------------------------------------- + # Shape data files (loaded per-level, character from lookup) + # ----------------------------------------------------------- + - name: "shapes2.dat" + system: tyrian + description: "Level tileset shapes (character '2')" + required: false + source_ref: "tyrian2.c:3079, lvlmast.c:23-27" + + - name: "shapes3.dat" + system: tyrian + description: "Level tileset shapes (character '3')" + required: false + source_ref: "tyrian2.c:3079, lvlmast.c:23-27" + + - name: "shapes4.dat" + system: tyrian + description: "Level tileset shapes (character '4')" + required: false + source_ref: "tyrian2.c:3079, lvlmast.c:23-27" + + - name: "shapes5.dat" + system: tyrian + description: "Level tileset shapes (character '5')" + required: false + source_ref: "tyrian2.c:3079, lvlmast.c:23-27" + + - name: "shapes7.dat" + system: tyrian + description: "Level tileset shapes (character '7')" + required: false + source_ref: "tyrian2.c:3079, lvlmast.c:23-27" + + - name: "shapes8.dat" + system: tyrian + description: "Level tileset shapes (character '8')" + required: false + source_ref: "tyrian2.c:3079, lvlmast.c:23-27" + + - name: "shapes9.dat" + system: tyrian + description: "Level tileset shapes (character '9')" + required: false + source_ref: "tyrian2.c:3079, lvlmast.c:23-27" + + - name: "shapes0.dat" + system: tyrian + description: "Level tileset shapes (character '0')" + required: false + source_ref: "tyrian2.c:3079, lvlmast.c:23-27" + + - name: "shapesa.dat" + system: tyrian + description: "Level tileset shapes (character 'A')" + required: false + source_ref: "tyrian2.c:3079, lvlmast.c:23-27" + + - name: "shapesb.dat" + system: tyrian + description: "Level tileset shapes (character 'B')" + required: false + source_ref: "tyrian2.c:3079, lvlmast.c:23-27" + + - name: "shapesc.dat" + system: tyrian + description: "Level tileset shapes (character 'C')" + required: false + source_ref: "tyrian2.c:3079, lvlmast.c:23-27" + + - name: "shapesd.dat" + system: tyrian + description: "Level tileset shapes (character 'D')" + required: false + source_ref: "tyrian2.c:3079, lvlmast.c:23-27" + + - name: "shapese.dat" + system: tyrian + description: "Level tileset shapes (character 'E')" + required: false + source_ref: "tyrian2.c:3079, lvlmast.c:23-27" + + - name: "shapesf.dat" + system: tyrian + description: "Level tileset shapes (character 'F')" + required: false + source_ref: "tyrian2.c:3079, lvlmast.c:23-27" + + - name: "shapesg.dat" + system: tyrian + description: "Level tileset shapes (character 'G')" + required: false + source_ref: "tyrian2.c:3079, lvlmast.c:23-27" + + - name: "shapesh.dat" + system: tyrian + description: "Level tileset shapes (character 'H')" + required: false + source_ref: "tyrian2.c:3079, lvlmast.c:23-27" + + - name: "shapesi.dat" + system: tyrian + description: "Level tileset shapes (character 'I')" + required: false + source_ref: "tyrian2.c:3079, lvlmast.c:23-27" + + - name: "shapesj.dat" + system: tyrian + description: "Level tileset shapes (character 'J')" + required: false + source_ref: "tyrian2.c:3079, lvlmast.c:23-27" + + - name: "shapesk.dat" + system: tyrian + description: "Level tileset shapes (character 'K')" + required: false + source_ref: "tyrian2.c:3079, lvlmast.c:23-27" + + - name: "shapesl.dat" + system: tyrian + description: "Level tileset shapes (character 'L')" + required: false + source_ref: "tyrian2.c:3079, lvlmast.c:23-27" + + - name: "shapesm.dat" + system: tyrian + description: "Level tileset shapes (character 'M')" + required: false + source_ref: "tyrian2.c:3079, lvlmast.c:23-27" + + - name: "shapesn.dat" + system: tyrian + description: "Level tileset shapes (character 'N')" + required: false + source_ref: "tyrian2.c:3079, lvlmast.c:23-27" + + - name: "shapeso.dat" + system: tyrian + description: "Level tileset shapes (character 'O')" + required: false + source_ref: "tyrian2.c:3079, lvlmast.c:23-27" + + - name: "shapesp.dat" + system: tyrian + description: "Level tileset shapes (character 'P')" + required: false + source_ref: "tyrian2.c:3079, lvlmast.c:23-27" + + - name: "shapesq.dat" + system: tyrian + description: "Level tileset shapes (character 'Q')" + required: false + source_ref: "tyrian2.c:3079, lvlmast.c:23-27" + + - name: "shapesr.dat" + system: tyrian + description: "Level tileset shapes (character 'R')" + required: false + source_ref: "tyrian2.c:3079, lvlmast.c:23-27" + + - name: "shapess.dat" + system: tyrian + description: "Level tileset shapes (character 'S')" + required: false + source_ref: "tyrian2.c:3079, lvlmast.c:23-27" + + - name: "shapest.dat" + system: tyrian + description: "Level tileset shapes (character 'T')" + required: false + source_ref: "tyrian2.c:3079, lvlmast.c:23-27" + + - name: "shapesu.dat" + system: tyrian + description: "Level tileset shapes (character 'U')" + required: false + source_ref: "tyrian2.c:3079, lvlmast.c:23-27" + + - name: "shapesv.dat" + system: tyrian + description: "Level tileset shapes (character 'V')" + required: false + source_ref: "tyrian2.c:3079, lvlmast.c:23-27" + + # ----------------------------------------------------------- + # Compressed shape files (newshX.shp, loaded per-level) + # ----------------------------------------------------------- + - name: "newsh1.shp" + system: tyrian + description: "Compressed sprites (arrows, mouse cursor)" + required: false + source_ref: "mainint.c:493,884,1462 (JE_loadCompShapes '1')" + + - name: "newsh6.shp" + system: tyrian + description: "Compressed sprites (explosions)" + required: false + source_ref: "tyrian2.c:771 (JE_loadCompShapes '6')" + + - name: "newsh~.shp" + system: tyrian + description: "Compressed sprites (destruct mode)" + required: false + source_ref: "destruct.c:569 (JE_loadCompShapes '~')" + + # ----------------------------------------------------------- + # Optional / special mode files + # ----------------------------------------------------------- + - name: "tyrianc.shp" + system: tyrian + description: "Christmas mode shape tables (replaces tyrian.shp at Xmas)" + required: false + source_ref: "opentyr.c:301-309" + + - name: "voicesc.snd" + system: tyrian + description: "Christmas mode voice samples (replaces voices.snd at Xmas)" + required: false + source_ref: "opentyr.c:301,333" + + - name: "tyrend.anm" + system: tyrian + description: "Ending animation sequence" + required: false + source_ref: "tyrian2.c:2473 (JE_playAnim)" + + - name: "tshp2.pcx" + system: tyrian + description: "Additional ship graphics (PCX image)" + required: false + source_ref: "tyrian2.c:2757, pcxload.c:25-29" + + - name: "estsc.shp" + system: tyrian + description: "Ending sequence character sprites" + required: false + source_ref: "mainint.c:1995 (load_sprites_file EXTRA_SHAPES)" + + - name: "demo.1" + system: tyrian + description: "Demo replay file 1" + required: false + source_ref: "mainint.c:1781-1786" + + - name: "demo.2" + system: tyrian + description: "Demo replay file 2" + required: false + source_ref: "mainint.c:1781-1786" + + - name: "demo.3" + system: tyrian + description: "Demo replay file 3" + required: false + source_ref: "mainint.c:1781-1786" + + - name: "demo.4" + system: tyrian + description: "Demo replay file 4" + required: false + source_ref: "mainint.c:1781-1786" + + - name: "demo.5" + system: tyrian + description: "Demo replay file 5" + required: false + source_ref: "mainint.c:1781-1786" diff --git a/emulators/squirreljme.yml b/emulators/squirreljme.yml new file mode 100644 index 00000000..8dee659b --- /dev/null +++ b/emulators/squirreljme.yml @@ -0,0 +1,91 @@ +emulator: SquirrelJME +type: libretro +source: "https://github.com/SquirrelJME/SquirrelJME" +cores: [squirreljme] +systems: [j2me] +verification: existence +notes: | + Java ME 8 virtual machine for libretro. Runs J2ME MIDlets and older flip-phone games. + The core needs a class library JAR placed in RetroArch's system directory. + It searches for the JAR using a priority list: versioned-fast first, then versioned, + then unversioned variants. The first match wins. + + Search order (from nanocoat/src/boot.c sjme_nvm_romNames[]): + 1. squirreljme-{version}-fast.jar + 2. squirreljme-{version}.jar + 3. squirreljme-{version}-test.jar + 4. squirreljme-{version}-slow.jar + 5. squirreljme-{version}-slow-test.jar + 6. squirreljme-fast.jar + 7. squirreljme.jar + 8. squirreljme-test.jar + 9. squirreljme-slow.jar + 10. squirreljme-slow-test.jar + + Current version: 0.3.0. All firmware entries are marked optional in the .info file + because the core can launch its built-in modeless stars demo without a class library. + For actual J2ME software, one of these JARs is required. + + The class library JAR is built from the SquirrelJME project itself (not a third-party + BIOS dump). It is open source under MPL-2.0. + +files: + # -- Versioned JARs (v0.3.0, preferred) -- + + - name: "squirreljme-0.3.0-fast.jar" + description: "SquirrelJME class library v0.3.0 (fast/optimized build)" + required: false + bundled: false + source_ref: "nanocoat/src/boot.c:102, squirreljme_libretro.info:firmware5" + note: "Highest priority versioned JAR. Optimized runtime, recommended for normal use." + + - name: "squirreljme-0.3.0.jar" + description: "SquirrelJME class library v0.3.0 (standard build)" + required: false + bundled: false + source_ref: "nanocoat/src/boot.c:103, squirreljme_libretro.info:firmware4" + note: "Standard versioned build. Second in search priority." + + - name: "squirreljme-0.3.0-slow.jar" + description: "SquirrelJME class library v0.3.0 (slow/interpreter build)" + required: false + bundled: false + source_ref: "nanocoat/src/boot.c:105, squirreljme_libretro.info:firmware6" + note: "Pure interpreter mode, no optimizations. Useful for debugging." + + - name: "squirreljme-0.3.0-slow-test.jar" + description: "SquirrelJME class library v0.3.0 (slow build with tests)" + required: false + bundled: false + source_ref: "nanocoat/src/boot.c:106, squirreljme_libretro.info:firmware7" + note: "Interpreter mode with built-in test suites." + + # -- Unversioned JARs (fallback) -- + + - name: "squirreljme-fast.jar" + description: "SquirrelJME class library (fast/optimized, unversioned)" + required: false + bundled: false + source_ref: "nanocoat/src/boot.c:107, squirreljme_libretro.info:firmware1" + note: "Highest priority unversioned JAR. Renamed from a versioned build." + + - name: "squirreljme.jar" + description: "SquirrelJME class library (standard, unversioned)" + required: false + bundled: false + source_ref: "nanocoat/src/boot.c:108, squirreljme_libretro.info:firmware0" + note: "Most common filename. If only one JAR is provided, use this name." + + - name: "squirreljme-slow.jar" + description: "SquirrelJME class library (slow/interpreter, unversioned)" + required: false + bundled: false + source_ref: "nanocoat/src/boot.c:110, squirreljme_libretro.info:firmware2" + note: "Pure interpreter, unversioned." + + - name: "squirreljme-slow-test.jar" + description: "SquirrelJME class library (slow with tests, unversioned)" + required: false + bundled: false + source_ref: "nanocoat/src/boot.c:111, squirreljme_libretro.info:firmware3" + note: "Interpreter with tests, unversioned." diff --git a/emulators/vitaquake2.yml b/emulators/vitaquake2.yml new file mode 100644 index 00000000..0e6749ca --- /dev/null +++ b/emulators/vitaquake2.yml @@ -0,0 +1,27 @@ +emulator: vitaQuakeII +type: libretro +source: "https://github.com/libretro/vitaquake2" +cores: [vitaquake2, vitaquake2-rogue, vitaquake2-xatrix, vitaquake2-zaero] +systems: [quake2] +verification: existence +notes: > + Quake II engine source port. Four separate cores are built from the same codebase + via the basegame make variable: vitaquake2 (base game, baseq2), vitaquake2-rogue + (Ground Zero expansion, compiled with -DROGUE), vitaquake2-xatrix (The Reckoning, + compiled with -DXATRIX), and vitaquake2-zaero (Zaero mod, compiled with -DZAERO). + Each core validates that the content path contains its expected game directory name + (libretro.c:2073-2085,2173) and refuses to load mismatched content. The core + accepts .pak extensions (retro_get_system_info sets valid_extensions = "pak"). + Content is loaded from the PAK file path - the parent of the game subdirectory + becomes basedir (libretro.c:2206-2209), then FS_InitFilesystem (files.c:778) + adds baseq2/ and loads pak0.pak through pak9.pak sequentially from each game + directory. For expansion cores, retro_run passes "+set game rogue|xatrix|zaero" + (libretro.c:2232-2239) so the engine loads both baseq2/ and the expansion + directory. PAK0_CHECKSUM 0x40e614e0 (files.c:30) matches the retail pak0.pak + but is only used for directory CRC validation, not as a load gate. + PAK files are game data (maps, textures, models, sounds) from the retail game, + not engine firmware. No files are required in the RetroArch system directory. + The core needs no BIOS or firmware. Optional CD music in OGG format can be + placed in a music/ subdirectory alongside the PAK files. + +files: [] diff --git a/emulators/xrick.yml b/emulators/xrick.yml new file mode 100644 index 00000000..f9315869 --- /dev/null +++ b/emulators/xrick.yml @@ -0,0 +1,78 @@ +emulator: XRick +type: libretro +source: "https://github.com/libretro/xrick-libretro" +cores: + - xrick +systems: + - rick-dangerous + +notes: | + XRick is an open-source reimplementation of the Rick Dangerous engine (Core Design, 1989), + ported to libretro. It is not a general-purpose emulator; it only plays Rick Dangerous. + + The core sets need_fullpath = true, valid_extensions = "*|zip", and supports launching + without content (RETRO_ENVIRONMENT_SET_SUPPORT_NO_GAME = true, libretro-core.c:93-97). + + Game data handling works in two modes (retro_load_game, libretro-core.c:312-360): + 1. Content provided: the content path is passed directly as the -data argument + (line 318: snprintf "xrick" "-data" "%s"). Content can be data.zip or a directory. + 2. No content (standalone): the core builds the path {system_dir}/xrick/data.zip + using fill_pathname_join_special_ext(RETRO_DIR, "xrick", "data", ".zip") at lines + 324-326. If this file is missing, a "game files missing" error is displayed (line 337) + and loading fails. + + The fallback data path at line 359 confirms the expected location: + snprintf(RPATH, ... "xrick" "-data" "%s/xrick/data.zip", RETRO_DIR) + + All game graphics, maps, tile data, entity tables, and screen layouts are compiled directly + into the binary from dat_*.c source files (dat_ents.c, dat_maps.c, dat_picsPC.c, + dat_picsST.c, dat_screens.c, dat_snd.c, dat_spritesPC.c, dat_spritesST.c, dat_tilesPC.c, + dat_tilesST.c). Only the sound files are external. + + data.zip contains 29 WAV files in a sounds/ subdirectory: sound effects (bombshht, bonus, + box, bullet, crawl, die, ent0-ent8, explode, gameover, jump, pad, sbonus1, sbonus2, stick, + walk) and music tracks (tune0 through tune5). The data.c module handles opening files from + either a .zip archive (via unzip.c) or a flat directory, selected by extension detection + (data.c:56-73). + + xrick.c:23 shows the hardcoded fallback: data_setpath("data.zip") when no -data argument + is provided. + + system_dir is obtained via RETRO_ENVIRONMENT_GET_SYSTEM_DIRECTORY (libretro-core.c:185-189), + falling back to "." if unavailable. + + The data.zip file ships in the xrick-libretro repository root and is the original xrick + 0.21212 game data release from 2002 by BigOrno. + +files: + - name: "xrick/data.zip" + system: rick-dangerous + description: "Rick Dangerous sound data (29 WAV files: sfx and music tracks)" + required: true + size: 1457440 + md5: "a471e64e9f69afbe59c10cc94ed1b184" + sha1: "ecfc092fe6371dbf38e238a8ba5f90785b5db52d" + source_ref: "libretro-core.c:324-326 (path construction), libretro-core.c:328-357 (missing file error), libretro-core.c:359 (final path confirmation)" + notes: "Placed in system/xrick/data.zip. Contains sounds/ directory with 29 WAV files from the original xrick 0.21212 release. Without this file, standalone mode fails with 'XRick game files missing from frontend system directory'. Ships in the libretro repo root." + +analysis: + content_type: game_engine + content_extensions: ["*", "zip"] + system_directory_used: true + supports_no_content: true + data_files_location: "system/xrick/data.zip (standalone) or content path (with content)" + compiled_in_data: + - "dat_ents.c (entity/NPC tables)" + - "dat_maps.c (level map data)" + - "dat_picsPC.c, dat_picsST.c (background images, PC and Atari ST)" + - "dat_screens.c (screen layout data)" + - "dat_snd.c (sound metadata/indices)" + - "dat_spritesPC.c, dat_spritesST.c (sprite graphics)" + - "dat_tilesPC.c, dat_tilesST.c (tile graphics)" + external_data: + sounds: + - "bombshht.wav, bonus.wav, box.wav, bullet.wav, crawl.wav, die.wav" + - "ent0.wav through ent8.wav (9 entity sound effects)" + - "explode.wav, gameover.wav, jump.wav, pad.wav" + - "sbonus1.wav, sbonus2.wav, stick.wav, walk.wav" + - "tune0.wav through tune5.wav (6 music tracks)"