diff --git a/emulators/ep128emu.yml b/emulators/ep128emu.yml new file mode 100644 index 00000000..a62c9f30 --- /dev/null +++ b/emulators/ep128emu.yml @@ -0,0 +1,309 @@ +emulator: ep128emu-core +type: libretro +source: "https://github.com/libretro/ep128emu-core" +cores: + - ep128emu_core +systems: + - enterprise-64 + - enterprise-128 + - videoton-tvc + - amstrad-cpc + - zx-spectrum + +# ep128emu-core emulates Enterprise 64/128, Videoton TVC, Amstrad CPC 464/664/6128, +# and ZX Spectrum 48/128. All ROMs are optional because the core ships built-in +# fallback ROMs compiled into roms.hpp. External ROM files override the built-ins +# and provide better accuracy for some systems. +# +# ROM path: /ep128emu/roms/ +# +# Machine selection (core/core.cpp:62-118): +# Content file extension determines machine type: +# .cas/.tap/.bas/.128/.com/.trn -> Enterprise +# .tvcwav/.cas(TVC) -> Videoton TVC +# .cdt/.tzx -> Amstrad CPC or ZX Spectrum (autodetect) +# .img/.dsk -> Enterprise disk (default) or CPC/TVC depending on content +# +# Enterprise ROM layout (core/core.cpp:195-307): +# EP128 (default): exos21.rom (segments 0-1) + basic21.rom (segment 4/5) +# EP64: exos20.rom (segments 0-1) + basic20.rom (segment 4/5) +# EP128 enhanced: exos24uk.rom (segments 0-3, 64K) +# Disk mode: exdos13.rom (segments 0x20-0x21) +# IS-DOS mode: exdos14isdos10uk.rom (segments 0x20-0x21) +# File I/O mode: epfileio.rom (segment 0x10) +# DTF mode: zt19uk.rom (segments 0x40-0x41) +# Hungarian locale: hun.rom + epdos16f.rom +# German locale: brd.rom +# +# Built-in fallbacks (roms/roms.hpp:46516-46538): +# All 22 ROMs have compiled-in defaults. The core prepends "_default_" to +# the filename and looks up the builtin_rom map when no external file is found. +# This means the core works out of the box without any user-supplied ROMs. +# +# TOSEC alternate names (core/core.hpp:80-118): +# The core tries TOSEC naming conventions as fallback before using built-in ROMs. +# For example exos21.rom -> "Expandible OS v2.1 (1985)(Intelligent Software).bin" +# CPC ROMs can also be split into page-sized files (OS.ROM + BASIC.ROM). + +notes: | + All ROMs go under /ep128emu/roms/. The core has built-in ROM + fallbacks for every file, so it works without any user-supplied ROMs. + External ROMs provide byte-exact originals vs the built-in copies. + + Enterprise EP128 is the default machine. EP64 is selected when content + requires it. Machine type can also be forced via core options. + + Hungarian and German locale ROMs are loaded automatically when content + metadata indicates the locale. The IS-DOS disk system is an alternative + to the standard EXDOS disk controller. + +files: + # ============================================================ + # Enterprise 64/128 - EXOS (Expandible OS) + # ============================================================ + + - name: exos21.rom + path: ep128emu/roms/exos21.rom + md5: f36f24cbb87745fbd2714e4df881db09 + required: false + system: enterprise-128 + has_builtin: true + note: "Enterprise 128 EXOS 2.1. Default OS for EP128 machines." + source_ref: "core/core.cpp:234-237" + + - name: exos20.rom + path: ep128emu/roms/exos20.rom + md5: 5ad3baaad3b5156d6b60b34229a676fb + required: false + system: enterprise-64 + has_builtin: true + note: "Enterprise 64 EXOS 2.0. Used when EP64 machine type is selected." + source_ref: "core/core.cpp:226-229" + + - name: exos24uk.rom + path: ep128emu/roms/exos24uk.rom + md5: 55af78f877a21ca45eb2df68a74fcc60 + required: false + system: enterprise-128 + has_builtin: true + note: "Enterprise 128 EXOS 2.4 (UK). Used when enhanced ROM mode is enabled. 64K, loaded across segments 0-3." + source_ref: "core/core.cpp:214-221" + + # ============================================================ + # Enterprise 64/128 - BASIC interpreter + # ============================================================ + + - name: basic21.rom + path: ep128emu/roms/basic21.rom + md5: e972fe42b398c9ff1d93ff014786aec6 + required: false + system: enterprise-128 + has_builtin: true + note: "Enterprise 128 BASIC 2.1. Loaded when cartridge mode is active (default)." + source_ref: "core/core.cpp:248,276" + + - name: basic20.rom + path: ep128emu/roms/basic20.rom + md5: 8e18edce4a7acb2c33cc0ab18f988482 + required: false + system: enterprise-64 + has_builtin: true + note: "Enterprise 64 BASIC 2.0. Used with EP64 machine type." + source_ref: "core/core.cpp:246,264,274" + + # ============================================================ + # Enterprise 64/128 - disk controllers + # ============================================================ + + - name: exdos13.rom + path: ep128emu/roms/exdos13.rom + md5: ddff70c014d1958dc75378b6c9aab6f8 + required: false + system: enterprise-128 + has_builtin: true + note: "EXDOS 1.3 disk controller. Loaded for EP128_DISK and EP64_DISK modes. 32K across segments 0x20-0x21." + source_ref: "core/core.cpp:303-306" + + - name: exdos14isdos10uk.rom + path: ep128emu/roms/exdos14isdos10uk.rom + required: false + system: enterprise-128 + has_builtin: true + note: "EXDOS 1.4 + IS-DOS 1.0 (UK). Used for IS-DOS disk mode instead of exdos13.rom." + source_ref: "core/core.cpp:295-298" + + # ============================================================ + # Enterprise 64/128 - file I/O and extensions + # ============================================================ + + - name: epfileio.rom + path: ep128emu/roms/epfileio.rom + md5: a68ebcbc73a4d2178d755b7755bf18fe + required: false + system: enterprise-128 + has_builtin: true + bundled: true + note: "Direct file I/O extension. Loaded for EP128_FILE and EP64_FILE modes. Source included in roms/ directory." + source_ref: "core/core.cpp:283-284" + + - name: zt19uk.rom + path: ep128emu/roms/zt19uk.rom + md5: 228540b6be83ae2acd7569c8ff0f91d0 + required: false + system: enterprise-128 + has_builtin: true + note: "ZozoTools 1.9 (UK). Loaded for DTF (direct tape file) mode. 32K across segments 0x40-0x41." + source_ref: "core/core.cpp:287-290" + + # ============================================================ + # Enterprise 64/128 - locale extensions + # ============================================================ + + - name: hun.rom + path: ep128emu/roms/hun.rom + md5: 22167938f142c222f40992839aa21a06 + required: false + system: enterprise-128 + has_builtin: true + note: "Hungarian language extension. Auto-loaded when content locale is Hungarian." + source_ref: "core/core.cpp:242-243" + + - name: epdos16f.rom + path: ep128emu/roms/epdos16f.rom + required: false + system: enterprise-128 + has_builtin: true + note: "EP-DOS 1.6f. Provides HFONT and CLKOFF for Hungarian locale. 32K across segments 0x06-0x07." + source_ref: "core/core.cpp:252-255" + + - name: brd.rom + path: ep128emu/roms/brd.rom + md5: 6af0402906944fd134004b85097c8524 + required: false + system: enterprise-128 + has_builtin: true + note: "German (BRD) language extension. Auto-loaded when content locale is German." + source_ref: "core/core.cpp:260-261" + + # ============================================================ + # Enterprise 64/128 - optional extras (in .info, not in source) + # ============================================================ + + - name: epd19hft.rom + path: ep128emu/roms/epd19hft.rom + md5: 12cfc9c7e48c8a16c2e09edbd926d467 + required: false + system: enterprise-128 + note: "EP-DOS 1.9 with Hungarian font. Listed in .info file as optional firmware." + source_ref: "ep128emu_core_libretro.info:firmware8" + + - name: zt19hfnt.rom + path: ep128emu/roms/zt19hfnt.rom + md5: 653daaf7b9b29c2c4e577f489580f247 + required: false + system: enterprise-128 + note: "ZozoTools 1.9 with Hungarian font. Listed in .info file as optional firmware." + source_ref: "ep128emu_core_libretro.info:firmware9" + + # ============================================================ + # Videoton TVC + # ============================================================ + + - name: tvc22_sys.rom + path: ep128emu/roms/tvc22_sys.rom + md5: 8c54285f541930cde766069942bad0f2 + required: false + system: videoton-tvc + has_builtin: true + note: "TVC system ROM v2.2. Main BIOS for all TVC modes." + source_ref: "core/core.cpp:313-314" + + - name: tvc22_ext.rom + path: ep128emu/roms/tvc22_ext.rom + md5: 5ce95a26ceed5bec73995d83568da9cf + required: false + system: videoton-tvc + has_builtin: true + note: "TVC extension ROM v2.2. Loaded alongside tvc22_sys.rom." + source_ref: "core/core.cpp:315-316" + + - name: tvcfileio.rom + path: ep128emu/roms/tvcfileio.rom + md5: a2cf86ba8e7fc58b242137fe59036832 + required: false + system: videoton-tvc + has_builtin: true + bundled: true + note: "TVC direct file I/O extension. Used for TVC64_FILE mode. Source included in roms/ directory." + source_ref: "core/core.cpp:319-320" + + - name: tvc_dos12d.rom + path: ep128emu/roms/tvc_dos12d.rom + md5: 88dc7876d584f90e4106f91444ab23b7 + required: false + system: videoton-tvc + has_builtin: true + note: "TVC DOS 1.2d. Loaded for TVC64_DISK mode." + source_ref: "core/core.cpp:324-325" + + # ============================================================ + # Amstrad CPC + # ============================================================ + + - name: cpc464.rom + path: ep128emu/roms/cpc464.rom + md5: a993f85b88ac4350cf4d41554e87fe4f + required: false + system: amstrad-cpc + has_builtin: true + note: "CPC 464 combined ROM (OS + BASIC). 32K loaded at segments 0x10 (OS) and 0x00 (BASIC) with offset." + source_ref: "core/core.cpp:335-338" + + - name: cpc664.rom + path: ep128emu/roms/cpc664.rom + md5: 5a384a2310f472c7857888371c00ed66 + required: false + system: amstrad-cpc + has_builtin: true + note: "CPC 664 combined ROM (OS + BASIC). Used for CPC_664_DISK mode." + source_ref: "core/core.cpp:343-346" + + - name: cpc6128.rom + path: ep128emu/roms/cpc6128.rom + md5: b96280dc6c95a48857b4b8eb931533ae + required: false + system: amstrad-cpc + has_builtin: true + note: "CPC 6128 combined ROM (OS + BASIC). Default CPC machine when no specific model requested." + source_ref: "core/core.cpp:352-355" + + - name: cpc_amsdos.rom + path: ep128emu/roms/cpc_amsdos.rom + md5: 25629dfe870d097469c217b95fdc1c95 + required: false + system: amstrad-cpc + has_builtin: true + note: "AMSDOS disk controller ROM. Loaded for CPC_DISK and CPC_664_DISK modes." + source_ref: "core/core.cpp:359-360" + + # ============================================================ + # ZX Spectrum + # ============================================================ + + - name: zx128.rom + path: ep128emu/roms/zx128.rom + md5: 85fede415f4294cc777517d7eada482e + required: false + system: zx-spectrum + has_builtin: true + note: "ZX Spectrum 128K ROM. 32K loaded at segments 0x00-0x01." + source_ref: "core/core.cpp:382-385" + + - name: zx48.rom + path: ep128emu/roms/zx48.rom + md5: 4c42a2f075212361c3117015b107ff68 + required: false + system: zx-spectrum + has_builtin: true + note: "ZX Spectrum 48K ROM. Used for ZX16 and ZX48 modes." + source_ref: "core/core.cpp:389-390" diff --git a/emulators/freechaf.yml b/emulators/freechaf.yml new file mode 100644 index 00000000..1092dd14 --- /dev/null +++ b/emulators/freechaf.yml @@ -0,0 +1,81 @@ +emulator: FreeChaF +type: libretro +source: "https://github.com/libretro/FreeChaF" +cores: + - freechaf +systems: + - fairchild-channelf + +notes: | + FreeChaF is a Fairchild Channel F emulator ported to libretro. + + BIOS loading is in src/libretro.c:186-208. The core first tries to load + sl90025.bin (Channel F II PSU1) at address 0x000. If that fails, it falls + back to sl31253.bin (original Channel F PSU1) at the same address. PSU2 + (sl31254.bin) is always loaded at address 0x400. + + Memory layout from src/memory.h:27-30: + 0x000-0x3FF PSU1 ROM (sl31253 or sl90025) + 0x400-0x7FF PSU2 ROM (sl31254) + 0x800-0x1FFF cartridge ROM + 0x2000+ VRAM + + If either PSU ROM fails to load, the core switches to experimental HLE + (high-level emulation) for that PSU. A warning message is shown to the + user recommending real BIOS files. HLE state is tracked per-PSU via + hle_state.psu1_hle and hle_state.psu2_hle (src/channelf_hle.c). + + The .info file declares all three firmware files as required (opt=false), + but the core does not abort on missing BIOS -- it falls back to HLE. + +files: + - name: "sl31253.bin" + system: fairchild-channelf + required: false + md5: ac9804d4c0e9d07e33472e3726ed15c3 + size: 1024 # 1 KB, fills 0x000-0x3FF + note: "Channel F PSU1 ROM (original). Fallback if sl90025.bin is missing." + source_ref: "src/libretro.c:192" + + - name: "sl31254.bin" + system: fairchild-channelf + required: false + md5: da98f4bb3242ab80d76629021bb27585 + size: 1024 # 1 KB, fills 0x400-0x7FF + note: "Channel F PSU2 ROM. Always loaded at address 0x400." + source_ref: "src/libretro.c:202" + + - name: "sl90025.bin" + system: fairchild-channelf + required: false + md5: 95d339631d867c8f1d15a5f2ec26069d + size: 1024 # 1 KB, fills 0x000-0x3FF + note: "Channel F II PSU1 ROM. Tried first, preferred over sl31253.bin." + source_ref: "src/libretro.c:186" + +platform_details: + bios_mapping: + target: "0x000-0x7FF in 64K memory space" + source_ref: "src/memory.h:27-29, src/memory.c:30-61" + notes: | + MEMORY_loadSysROM_libretro() reads the file and copies it into + Memory[] at the given address offset. PSU1 is loaded at 0x000, + PSU2 at 0x400. The loader caps file size to (MEMORY_SIZE - address) + to prevent overflow. MEMORY_RAMStart is advanced past the loaded + ROM to protect it from writes. + + hle_fallback: + source_ref: "src/channelf_hle.c" + notes: | + When BIOS files are missing, FreeChaF uses HLE to emulate the + PSU routines in software. This is marked as experimental and may + cause compatibility issues with some games. Each PSU can + independently fall back to HLE. + + load_priority: + source_ref: "src/libretro.c:186-198" + notes: | + PSU1 loading order: sl90025.bin (Channel F II) first, then + sl31253.bin (original Channel F) as fallback. If both fail, + HLE is used. sl90025.bin is the preferred BIOS as it includes + Channel F II improvements. diff --git a/emulators/freeintv.yml b/emulators/freeintv.yml new file mode 100644 index 00000000..c81b8f5f --- /dev/null +++ b/emulators/freeintv.yml @@ -0,0 +1,71 @@ +emulator: FreeIntv +type: libretro +source: "https://github.com/libretro/FreeIntv" +cores: + - freeintv +systems: + - intellivision + +notes: | + FreeIntv is a Mattel Intellivision emulator for libretro. + + BIOS loading happens in retro_init() (src/libretro.c:1166-1174). The core + calls retro_get_system_directory() then joins exec.bin and grom.bin paths + directly. No subdirectory, no core option to disable BIOS loading. + + loadExec() in src/intv.c:47-71 reads exec.bin as big-endian 16-bit words + into memory range 0x1000-0x1FFF (Executive ROM, 8 KB file). + + loadGrom() in src/intv.c:73-98 reads grom.bin as raw bytes into memory + range 0x3000-0x37FF (Graphics ROM, 2 KB file). + + Both files are required. Without them the core prints an error and shows + "PUT GROM/EXEC IN SYSTEM DIRECTORY" on the OSD, but does not abort. + Games will not run correctly without both BIOS files. + + The .info file declares firmware_count = 2 with both marked opt = false. + + No ECS (Entertainment Computer System) BIOS support exists in this core. + There is no ecs.bin loading code anywhere in the source. + +files: + - name: "exec.bin" + system: intellivision + required: true + size: 8192 # 8 KB (4096 x 16-bit words, 0x1000-0x1FFF) + md5: 62e761035cb657903761800f4437b8af + note: "Executive ROM. Big-endian 16-bit words loaded at 0x1000-0x1FFF." + source_ref: "src/intv.c:47-71, src/libretro.c:1169" + + - name: "grom.bin" + system: intellivision + required: true + size: 2048 # 2 KB (bytes, 0x3000-0x37FF) + md5: 0cd5946c6473e42e8e4c2137785e427f + note: "Graphics ROM. Raw bytes loaded at 0x3000-0x37FF." + source_ref: "src/intv.c:73-98, src/libretro.c:1173" + +platform_details: + bios_mapping: + exec: + target: "0x1000-0x1FFF (Executive ROM)" + format: "big-endian 16-bit words" + source_ref: "src/intv.c:55-58" + grom: + target: "0x3000-0x37FF (Graphics ROM)" + format: "raw 8-bit bytes" + source_ref: "src/intv.c:81-84" + notes: | + Memory[] is a 64K array of unsigned int (src/memory.c:26). + EXEC region (0x1000-0x1FFF) is write-protected in writeMem() + (src/memory.c:60-61). GROM region (0x3000-0x37FF) is also + write-protected (src/memory.c:62). + + cartridge_loading: + formats: "int, bin, rom" + methods: "Intellicart (magic byte 0xA8), raw ROM with fingerprint DB" + source_ref: "src/cart.c" + notes: | + Raw ROMs use a fingerprint database (sum of first 256 bytes) + to select one of 10 memory map configurations (load0-load9). + Intellicart format is auto-detected by 0xA8 magic byte. diff --git a/emulators/fuse.yml b/emulators/fuse.yml new file mode 100644 index 00000000..0160d8d5 --- /dev/null +++ b/emulators/fuse.yml @@ -0,0 +1,396 @@ +emulator: Fuse +type: libretro +source: "https://github.com/libretro/fuse-libretro" +cores: + - fuse +systems: + - sinclair-zxspectrum + +notes: | + Fuse (Free Unix Spectrum Emulator) ported to libretro. Emulates the ZX + Spectrum family: 16K, 48K, 48K NTSC, 128K, +2, +2A, +3, +3e, SE, Timex + TC2048, TC2068, TS2068, Pentagon 128K/512K/1024, and Scorpion 256K. + + ROM loading is in src/compat/file.c:91-118. The core first checks an + internal table of embedded ROMs (mem_entries[]). If the ROM filename is + not found there, it falls back to the filesystem at + {system_dir}/fuse/{rom_filename} (file.c:160-175). + + Embedded ROMs cover 48K-family, 128K, +2, +3, +3e, SE, TC2048, TC2068. + Pentagon, Scorpion, and peripheral ROMs are NOT embedded and must be + placed in {system_dir}/fuse/ by the user. + + Default ROM filenames are set in fuse/settings.c:209-260. Each machine + type loads its ROMs during reset via machine_load_rom() calls in + fuse/machines/*.c files. + + The +2A reuses the +3 ROMs (plus3-0/1/2/3.rom) per settings.c:234-237. + The TS2068 reuses TC2068 ROMs (tc2068-0/1.rom) per settings.c:257-258. + Spectrum 16K uses 48.rom per settings.c:211. + +files: + # -- Embedded ROMs (compiled into the core, not required on disk) -- + + - name: "fuse/48.rom" + system: sinclair-zxspectrum + required: false + md5: 4c42a2f075212361c3117015b107ff68 + sha1: 5ea7c2b824672e914525d1d5c419d71b84a426a2 + size: 16384 + note: "Spectrum 48K ROM. Also used for 16K and 48K NTSC. Embedded in core." + source_ref: "fuse/settings.c:211-212, fuse/machines/spec48.c:76" + + - name: "fuse/128-0.rom" + system: sinclair-zxspectrum + required: false + md5: b4d2692115a9f2924df92a3cbfb358fb + sha1: 4f4b11ec22326280bdb96e3baf9db4b4cb1d02c5 + size: 16384 + note: "Spectrum 128K ROM 0 (editor). Embedded in core." + source_ref: "fuse/settings.c:209, fuse/machines/spec128.c:70" + + - name: "fuse/128-1.rom" + system: sinclair-zxspectrum + required: false + md5: 6e09e5d3c4aef166601669feaaadc01c + sha1: 80080644289ed93d71a1103992a154cc9802b2fa + size: 16384 + note: "Spectrum 128K ROM 1 (48 BASIC). Embedded in core." + source_ref: "fuse/settings.c:210, fuse/machines/spec128.c:73" + + - name: "fuse/plus2-0.rom" + system: sinclair-zxspectrum + required: false + md5: 4ed7af4636308b8a48d7a35e6c5b546b + sha1: 72703f9a3e734f3c23ec34c0727aae4ccbef9a91 + size: 16384 + note: "Spectrum +2 ROM 0. Embedded in core." + source_ref: "fuse/settings.c:232, fuse/machines/specplus2.c:70" + + - name: "fuse/plus2-1.rom" + system: sinclair-zxspectrum + required: false + md5: b3db95931cc844efaeb82db9c171b9f3 + sha1: de8b0d2d0379cfe7c39322a086ca6da68c7f23cb + size: 16384 + note: "Spectrum +2 ROM 1. Embedded in core." + source_ref: "fuse/settings.c:233, fuse/machines/specplus2.c:73" + + - name: "fuse/plus3-0.rom" + system: sinclair-zxspectrum + required: false + md5: 9833b8b73384dd5fa3678377ff00a2bb + sha1: e319ed08b4d53a5e421a75ea00ea02039ba6555b + size: 16384 + note: "Spectrum +3 ROM 0. Also used for +2A. Embedded in core." + source_ref: "fuse/settings.c:234,238, fuse/machines/specplus3.c:197" + + - name: "fuse/plus3-1.rom" + system: sinclair-zxspectrum + required: false + md5: 0f711ceb5ab801b4701989982e0f334c + sha1: c9969fc36095a59787554026a9adc3b87678c794 + size: 16384 + note: "Spectrum +3 ROM 1. Also used for +2A. Embedded in core." + source_ref: "fuse/settings.c:235,239, fuse/machines/specplus3.c:200" + + - name: "fuse/plus3-2.rom" + system: sinclair-zxspectrum + required: false + md5: 3b6dd659d5e4ec97f0e2f7878152c987 + sha1: 22e50c6ba4157a3f6a821bd9937cd26e292775c6 + size: 16384 + note: "Spectrum +3 ROM 2. Also used for +2A. Embedded in core." + source_ref: "fuse/settings.c:236,240, fuse/machines/specplus3.c:203" + + - name: "fuse/plus3-3.rom" + system: sinclair-zxspectrum + required: false + md5: a148bcc575e51389e84fdf5d555c3196 + sha1: 65f031caa8148a5493afe42c41f4929deab26b4e + size: 16384 + note: "Spectrum +3 ROM 3. Also used for +2A. Embedded in core." + source_ref: "fuse/settings.c:237,241, fuse/machines/specplus3.c:206" + + - name: "fuse/plus3e-0.rom" + system: sinclair-zxspectrum + required: false + md5: bc123f625e245c225f92ef05933ed134 + sha1: 649fbd233490bf58b35350b0123d36caaaa011eb + size: 16384 + note: "Spectrum +3e ROM 0. Embedded in core." + source_ref: "fuse/settings.c:242, fuse/machines/specplus3e.c:70" + + - name: "fuse/plus3e-1.rom" + system: sinclair-zxspectrum + required: false + md5: 617364264c587d20c9fc4746c29679f2 + sha1: f12198108cbb14de4f03c6695bc16d08c85ee214 + size: 16384 + note: "Spectrum +3e ROM 1. Embedded in core." + source_ref: "fuse/settings.c:243, fuse/machines/specplus3e.c:73" + + - name: "fuse/plus3e-2.rom" + system: sinclair-zxspectrum + required: false + md5: c363e95dcd0a90e6e7f847e6e47e0179 + sha1: 773633dce5ba323a9e00d9d0f9e4d8c295df7c87 + size: 16384 + note: "Spectrum +3e ROM 2. Embedded in core." + source_ref: "fuse/settings.c:244, fuse/machines/specplus3e.c:76" + + - name: "fuse/plus3e-3.rom" + system: sinclair-zxspectrum + required: false + md5: a148bcc575e51389e84fdf5d555c3196 + sha1: 65f031caa8148a5493afe42c41f4929deab26b4e + size: 16384 + note: "Spectrum +3e ROM 3. Same as plus3-3.rom. Embedded in core." + source_ref: "fuse/settings.c:245, fuse/machines/specplus3e.c:79" + + - name: "fuse/se-0.rom" + system: sinclair-zxspectrum + required: false + md5: fb3f86eb1e5a695d9c50c124e7cfb875 + sha1: 8608328d7dd66602a4846f046b24fed500f7d828 + size: 16384 + note: "Spectrum SE ROM 0. Embedded in core." + source_ref: "fuse/settings.c:251, fuse/machines/spec_se.c:89" + + - name: "fuse/se-1.rom" + system: sinclair-zxspectrum + required: false + md5: 88de4a3129086f34bb9ca559acc51e6c + sha1: 3be5de57dd3bd0a9d15c57cabe9179afe2906a52 + size: 16384 + note: "Spectrum SE ROM 1. Embedded in core." + source_ref: "fuse/settings.c:252, fuse/machines/spec_se.c:92" + + - name: "fuse/tc2048.rom" + system: sinclair-zxspectrum + required: false + md5: 9dd7ecf784a6c04265c073c236f5fadb + sha1: febb2d495b6eda7cdcb4074935d6e9d9f328972d + size: 16384 + note: "Timex TC2048 ROM. Embedded in core." + source_ref: "fuse/settings.c:254, fuse/machines/tc2048.c:80" + + - name: "fuse/tc2068-0.rom" + system: sinclair-zxspectrum + required: false + md5: 55d462fccc6c536037404ef4ced08bec + sha1: 1446cb2780a9dedf640404a639fa3ae518b2d8aa + size: 16384 + note: "Timex TC2068 ROM 0. Also used for TS2068. Embedded in core." + source_ref: "fuse/settings.c:255,257, fuse/machines/tc2068.c:138" + + - name: "fuse/tc2068-1.rom" + system: sinclair-zxspectrum + required: false + md5: 575d203c6e15e679fba0b73f854ec7a2 + sha1: 7e265a2c1f621ed365ea23bdcafdedbc79c1299c + size: 8192 + note: "Timex TC2068 ROM 1 (EXROM). Also used for TS2068. Embedded in core." + source_ref: "fuse/settings.c:256,258, fuse/machines/tc2068.c:141" + + # -- External ROMs (NOT embedded, must be in {system_dir}/fuse/) -- + + # Pentagon family + - name: "fuse/128p-0.rom" + system: sinclair-zxspectrum + required: true + md5: "" + size: 16384 + note: "Pentagon 128K/512K/1024 ROM 0. Required for Pentagon machines." + source_ref: "fuse/settings.c:221,225,229, fuse/machines/pentagon.c:135" + + - name: "fuse/128p-1.rom" + system: sinclair-zxspectrum + required: true + md5: "" + size: 16384 + note: "Pentagon 128K/512K/1024 ROM 1. Required for Pentagon machines." + source_ref: "fuse/settings.c:222,226,230, fuse/machines/pentagon.c:138" + + - name: "fuse/trdos.rom" + system: sinclair-zxspectrum + required: true + md5: "" + size: 16384 + note: "TR-DOS ROM (Beta 128 disk interface). Used by Pentagon and Scorpion." + source_ref: "fuse/settings.c:223,227,231, fuse/machines/pentagon.c:141" + + - name: "fuse/gluck.rom" + system: sinclair-zxspectrum + required: true + md5: "" + size: 16384 + note: "Gluck ROM. Required for Pentagon 512K and 1024." + source_ref: "fuse/settings.c:224,228, fuse/machines/pentagon512.c:82" + + # Scorpion + - name: "fuse/256s-0.rom" + system: sinclair-zxspectrum + required: true + md5: "" + size: 16384 + note: "Scorpion 256K ROM 0. Required for Scorpion machine." + source_ref: "fuse/settings.c:247, fuse/machines/scorpion.c:76" + + - name: "fuse/256s-1.rom" + system: sinclair-zxspectrum + required: true + md5: "" + size: 16384 + note: "Scorpion 256K ROM 1. Required for Scorpion machine." + source_ref: "fuse/settings.c:248, fuse/machines/scorpion.c:79" + + - name: "fuse/256s-2.rom" + system: sinclair-zxspectrum + required: true + md5: "" + size: 16384 + note: "Scorpion 256K ROM 2. Required for Scorpion machine." + source_ref: "fuse/settings.c:249, fuse/machines/scorpion.c:82" + + - name: "fuse/256s-3.rom" + system: sinclair-zxspectrum + required: true + md5: "" + size: 16384 + note: "Scorpion 256K ROM 3 (TR-DOS). Required for Scorpion machine." + source_ref: "fuse/settings.c:250, fuse/machines/scorpion.c:85" + + # Peripheral ROMs (optional, only needed if peripheral is enabled) + - name: "fuse/if1-2.rom" + system: sinclair-zxspectrum + required: false + md5: "" + size: 16384 + note: "Interface 1 ROM (edition 2). Loaded by peripherals/if1.c:403." + source_ref: "fuse/settings.c:216, fuse/peripherals/if1.c:403" + + - name: "fuse/disciple.rom" + system: sinclair-zxspectrum + required: false + md5: 78e61a2a02121873c1756b21fd1398b1 + sha1: 9a75ed4b293f968985be4c9aa893cd88276d1ced + size: 8192 + note: "DISCiPLE disk interface ROM. Bundled in repo but not in mem_entries[]." + source_ref: "fuse/settings.c:215, fuse/peripherals/disk/disciple.c:279" + + - name: "fuse/plusd.rom" + system: sinclair-zxspectrum + required: false + md5: 42e5de16fb5e50082bb954ec7ce45851 + sha1: 6b841dc5797ef7eb219ad455cd1e434ca3b9d30d + size: 8192 + note: "+D disk interface ROM. Bundled in repo but not in mem_entries[]." + source_ref: "fuse/settings.c:246, fuse/peripherals/disk/plusd.c:239" + + - name: "fuse/didaktik80.rom" + system: sinclair-zxspectrum + required: false + md5: "" + note: "Didaktik 80 disk interface ROM. Not embedded." + source_ref: "fuse/settings.c:214, fuse/peripherals/disk/didaktik.c:236" + + - name: "fuse/opus.rom" + system: sinclair-zxspectrum + required: false + md5: "" + note: "Opus Discovery disk interface ROM. Not embedded." + source_ref: "fuse/settings.c:220, fuse/peripherals/disk/opus.c:210" + + - name: "fuse/mf1.rom" + system: sinclair-zxspectrum + required: false + md5: "" + note: "Multiface 1 ROM. Not embedded." + source_ref: "fuse/settings.c:217, fuse/peripherals/multiface.c:224" + + - name: "fuse/mf128.rom" + system: sinclair-zxspectrum + required: false + md5: "" + note: "Multiface 128 ROM. Not embedded." + source_ref: "fuse/settings.c:218, fuse/peripherals/multiface.c:225" + + - name: "fuse/mf3.rom" + system: sinclair-zxspectrum + required: false + md5: "" + note: "Multiface 3 ROM. Not embedded." + source_ref: "fuse/settings.c:219, fuse/peripherals/multiface.c:226" + + - name: "fuse/speccyboot-1.4.rom" + system: sinclair-zxspectrum + required: false + md5: c54aa8f374b0971f51546c29d5d1eba1 + sha1: 16af6f052b38a027dd49ba6e96e3a59d16b62672 + size: 8192 + note: "SpeccyBoot ethernet ROM. Bundled in repo but not in mem_entries[]." + source_ref: "fuse/settings.c:253, fuse/peripherals/speccyboot.c:148" + + - name: "fuse/ttx2000s.rom" + system: sinclair-zxspectrum + required: false + md5: "" + note: "TTX2000S teletext adapter ROM. Not embedded." + source_ref: "fuse/settings.c:259, fuse/peripherals/ttx2000s.c:198" + + - name: "fuse/usource.rom" + system: sinclair-zxspectrum + required: false + md5: "" + note: "Currah uSource ROM. Not embedded." + source_ref: "fuse/settings.c:260, fuse/peripherals/usource.c:129" + +platform_details: + bios_mapping: + source_ref: "src/compat/file.c:55-89, 129-223" + notes: | + ROM resolution order in compat_file_open(): + 1. Check mem_entries[] (18 embedded ROMs compiled as .h arrays) + 2. If not found, try {system_dir}/fuse/{filename} on filesystem + The path is constructed by concatenating system_dir + "/fuse" + path + where path includes the leading slash from fuse's internal path. + + embedded_roms: + source_ref: "src/compat/file.c:55-73" + notes: | + 18 ROMs embedded in the binary via .h headers generated from .rom files: + 48.rom, 128-0.rom, 128-1.rom, plus2-0.rom, plus2-1.rom, + plus3-0/1/2/3.rom, plus3e-0/1/2/3.rom, se-0.rom, se-1.rom, + tc2048.rom, tc2068-0.rom, tc2068-1.rom. + disciple.rom, plusd.rom, speccyboot-1.4.rom are present in the repo + fuse/roms/ directory but NOT in mem_entries[], so they are loaded + from the filesystem only. + + machine_rom_map: + source_ref: "fuse/settings.c:209-260, fuse/machines/*.c" + notes: | + Spectrum 16K: 48.rom (1 ROM) + Spectrum 48K: 48.rom (1 ROM) + Spectrum 48K NTSC: 48.rom (1 ROM) + Spectrum 128K: 128-0.rom, 128-1.rom (2 ROMs) + Spectrum +2: plus2-0.rom, plus2-1.rom (2 ROMs) + Spectrum +2A: plus3-0.rom, plus3-1.rom, plus3-2.rom, plus3-3.rom (4 ROMs) + Spectrum +3: plus3-0.rom, plus3-1.rom, plus3-2.rom, plus3-3.rom (4 ROMs) + Spectrum +3e: plus3e-0/1/2/3.rom (4 ROMs) + Spectrum SE: se-0.rom, se-1.rom (2 ROMs) + Timex TC2048: tc2048.rom (1 ROM) + Timex TC2068: tc2068-0.rom, tc2068-1.rom (2 ROMs) + Timex TS2068: tc2068-0.rom, tc2068-1.rom (2 ROMs, same files) + Pentagon 128K: 128p-0.rom, 128p-1.rom, trdos.rom (3 ROMs) + Pentagon 512K: 128p-0.rom, 128p-1.rom, trdos.rom, gluck.rom (4 ROMs) + Pentagon 1024: 128p-0.rom, 128p-1.rom, trdos.rom, gluck.rom (4 ROMs) + Scorpion 256K: 256s-0.rom, 256s-1.rom, 256s-2.rom, 256s-3.rom (4 ROMs) + + rom_copyright: + source_ref: "fuse/roms/README.copyright" + notes: | + Most ROMs are copyright Amstrad. Amstrad allows free distribution but + retains copyright. Selling ROMs standalone is not permitted. SE ROMs + are GPLv2+. DISCiPLE/+D ROMs are copyright Datel, distribution allowed. + SpeccyBoot ROM is MIT licensed. diff --git a/emulators/gambatte.yml b/emulators/gambatte.yml new file mode 100644 index 00000000..e59ac3f0 --- /dev/null +++ b/emulators/gambatte.yml @@ -0,0 +1,53 @@ +emulator: Gambatte +type: libretro +source: "https://github.com/libretro/gambatte-libretro" +systems: [nintendo-gb, nintendo-gbc] + +notes: | + Gambatte is a Game Boy / Game Boy Color emulator focused on accuracy. + No BIOS is required for normal operation. The core has a built-in + HLE boot sequence that skips the Nintendo logo animation by default. + + When the core option "gambatte_gb_bootloader" is set to "enabled" + (the default), the core looks for official boot ROMs in the system + directory to play the real startup logo animation. If the files are + missing, emulation still works without them. + + The boot ROM loaded depends on the hardware mode: + - DMG (original Game Boy): gb_bios.bin (256 bytes, 0x100) + - CGB (Game Boy Color) or GBA mode: gbc_bios.bin (2304 bytes, 0x900) + + In GBA mode the core patches the CGB boot ROM at 0xF2 to fake + GBA detection (ld b,0x01), enabling GBA-enhanced features in + compatible GBC games (Shantae, Zelda Oracle series, etc.). + + File path construction: libretro.cpp get_bootloader_from_file() + joins RETRO_ENVIRONMENT_GET_SYSTEM_DIRECTORY with each filename + directly - no subdirectories. + + Gambatte does NOT use sgb_bios.bin. The SGB palette references in + the source are color lookup tables for DMG palette colorization, + not actual Super Game Boy boot ROM loading. + +files: + # --- DMG boot ROM (optional, enables startup animation) --- + - name: "gb_bios.bin" + system: nintendo-gb + description: "Original Game Boy (DMG-01) boot ROM" + required: false + size: 256 + md5: "32fbbd84168d3482956eb3c5051637f5" + sha1: "4ed31ec6b0b175bb109c0eb5fd3d193da823339f" + source_ref: "libretro.cpp:1304-1364 (get_bootloader_from_file), bootloader.cpp:20-55 (load)" + notes: "Mapped at 0x0000-0x00FF, swapped out when register 0xFF50 is written. Core option gambatte_gb_bootloader must be enabled." + + # --- CGB boot ROM (optional, enables startup animation) --- + - name: "gbc_bios.bin" + system: nintendo-gbc + description: "Game Boy Color (CGB-001) boot ROM" + required: false + size: 2304 + md5: "dbfce9db9deaa2567f6a84fde55f9680" + sha1: "1293d68bf9643bc4f36954c1e80e38f39864528d" + source_ref: "libretro.cpp:1304-1364 (get_bootloader_from_file), bootloader.cpp:20-55 (load)" + notes: "Mapped at 0x0000-0x08FF with cartridge data preserved at 0x0100-0x01FF. Also used for GBA-enhanced mode with a patch at 0xF2. Presence required for FORCE_CGB flag when hw mode is set to GBC or GBA." diff --git a/emulators/kronos.yml b/emulators/kronos.yml new file mode 100644 index 00000000..213cf382 --- /dev/null +++ b/emulators/kronos.yml @@ -0,0 +1,238 @@ +emulator: Kronos +type: libretro +cores: + - kronos_libretro + - yabause_libretro +source: "https://github.com/FCare/Kronos" +systems: + - sega-saturn + - sega-stv + +notes: | + Kronos is a Sega Saturn and ST-V arcade emulator forked from Yabause. + The libretro repo at libretro/yabause ships the older "Yabause" core + (yabause_libretro) which handles Saturn only and has no STV support. + + Saturn BIOS search order (Kronos): + 1. {system}/kronos/saturn_bios.bin + 2. {system}/saturn_bios.bin + 3. {system}/sega_101.bin + 4. {system}/mpr-17933.bin + First file found wins. Real BIOS required, HLE is deprecated and causes + issues. Multi-disc (m3u) also forces real BIOS. + + Saturn BIOS search order (YabaSanshiro / Yabause): + 1. {system}/saturn_bios.bin + 2. {system}/sega_101.bin + 3. {system}/mpr-17933.bin + Falls back to HLE if none found, but HLE is not recommended. + + ST-V BIOS (Kronos only): + {system}/kronos/stvbios.zip or {system}/stvbios.zip + The ZIP is a MAME-style romset containing region-specific EPROMs. + Kronos picks the first matching BIOS by region, with a configurable + "favorite region" core option (EU/US/JP/TW). The ZIP must contain + at least one of the BIOS blobs listed below. ST-V games are detected + automatically when loading a .zip file. + + BIOS loading: libretro.c retro_load_game() lines 1601-1727. + STV blob table: ctrl/src/stv.c BiosList lines 112-136. + Region enums: ctrl/include/stv.h lines 47-52. + +files: + # ----------------------------------------------------------- + # Saturn BIOS - generic (any region accepted) + # ----------------------------------------------------------- + - name: "saturn_bios.bin" + system: sega-saturn + required: true + size: 524288 # 512 KB (0x80000) + note: "Primary Saturn BIOS. Any region. Searched first by both cores." + source_ref: "libretro.c:1619-1623 (kronos), libretro.c:1035 (yabause)" + + # ----------------------------------------------------------- + # Saturn BIOS - Japan v1.01 + # ----------------------------------------------------------- + - name: "sega_101.bin" + system: sega-saturn + region: [japan] + required: false + size: 524288 + md5: "85ec9ca47d8f6807718151cbcca8b964" + note: "Saturn BIOS v1.01 (Japan). Fallback if saturn_bios.bin missing." + source_ref: "libretro.c:1627 (kronos), libretro.c:1039 (yabause)" + + # ----------------------------------------------------------- + # Saturn BIOS - NA/EU + # ----------------------------------------------------------- + - name: "mpr-17933.bin" + system: sega-saturn + region: [north-america, europe] + required: false + size: 524288 + md5: "3240872c70984b6cbfda1586cab68dbe" + note: "Saturn BIOS (NA/EU). Last fallback for Saturn mode." + source_ref: "libretro.c:1631 (kronos), libretro.c:1043 (yabause)" + + # ----------------------------------------------------------- + # ST-V Arcade BIOS (stvbios.zip) - Kronos only + # ----------------------------------------------------------- + - name: "stvbios.zip" + system: sega-stv + required: true + note: > + MAME-style ZIP containing ST-V region BIOS EPROMs. Required for + ST-V arcade games. Kronos picks the best match based on game + region and the stv_favorite_region core option. At least one + BIOS blob must be present. Searched in kronos/ subdir first. + source_ref: "libretro.c:1608-1617, ctrl/src/stv.c:112-136" + + # ----------------------------------------------------------- + # ST-V BIOS blobs inside stvbios.zip + # ----------------------------------------------------------- + + # Japan + - name: "epr-23603.ic8" + system: sega-stv + region: [japan] + required: false + size: 524288 + crc32: "f688ae60" + note: "STV BIOS Japan (latest). Inside stvbios.zip." + source_ref: "stv.c:120" + + - name: "epr-20091.ic8" + system: sega-stv + region: [japan] + required: false + size: 524288 + crc32: "59ed40f4" + note: "STV BIOS Japan v1. Inside stvbios.zip." + source_ref: "stv.c:121" + + - name: "epr-19730.ic8" + system: sega-stv + region: [japan] + required: false + size: 524288 + crc32: "d0e0889d" + note: "STV BIOS Japan v2. Inside stvbios.zip." + source_ref: "stv.c:122" + + - name: "epr-17951a.ic8" + system: sega-stv + region: [japan] + required: false + size: 524288 + crc32: "2672f9d8" + note: "STV BIOS Japan v3. Inside stvbios.zip." + source_ref: "stv.c:123" + + - name: "epr-17740a.ic8" + system: sega-stv + region: [japan] + required: false + size: 524288 + crc32: "3e23c81f" + note: "STV BIOS Japan v4. Inside stvbios.zip." + source_ref: "stv.c:124" + + - name: "epr-17740.ic8" + system: sega-stv + region: [japan] + required: false + size: 524288 + crc32: "5c5aa63d" + note: "STV BIOS Japan v5. Inside stvbios.zip." + source_ref: "stv.c:125" + + # Europe + - name: "epr-17954a.ic8" + system: sega-stv + region: [europe] + required: false + size: 524288 + crc32: "f7722da3" + note: "STV BIOS Europe. Inside stvbios.zip." + source_ref: "stv.c:126" + + # USA + - name: "epr-17952a.ic8" + system: sega-stv + region: [north-america] + required: false + size: 524288 + crc32: "d1be2adf" + note: "STV BIOS USA. Inside stvbios.zip." + source_ref: "stv.c:127" + + - name: "epr-17741a.ic8" + system: sega-stv + region: [north-america] + required: false + size: 524288 + crc32: "4166c663" + note: "STV BIOS USA v1. Inside stvbios.zip." + source_ref: "stv.c:128" + + # Taiwan + - name: "epr-19854.ic8" + system: sega-stv + region: [taiwan] + required: false + size: 524288 + crc32: "e09d1f60" + note: "STV BIOS Taiwan. Inside stvbios.zip." + source_ref: "stv.c:129" + + - name: "epr-17953a.ic8" + system: sega-stv + region: [taiwan] + required: false + size: 524288 + crc32: "a4c47570" + note: "STV BIOS Taiwan v1. Inside stvbios.zip." + source_ref: "stv.c:130" + + - name: "epr-17742a.ic8" + system: sega-stv + region: [taiwan] + required: false + size: 524288 + crc32: "02daf123" + note: "STV BIOS Taiwan v2. Inside stvbios.zip." + source_ref: "stv.c:131" + + # Debug / Dev + - name: "stv110.bin" + system: sega-stv + required: false + size: 524288 + crc32: "3dfeda92" + note: "STV debug BIOS. Inside stvbios.zip. Not used in normal operation." + source_ref: "stv.c:132" + + - name: "stv1061.bin" + system: sega-stv + required: false + size: 524288 + crc32: "728dbca3" + note: "STV dev BIOS. Inside stvbios.zip. Not used in normal operation." + source_ref: "stv.c:133" + +platform_details: + saturn: + bios_size: 524288 + bios_address: "0x00000000-0x0007FFFF" + hle_available: true + hle_recommended: false + kronos_bios_subdir: "kronos" + source_ref: "sys/memory/src/memory.c:1346, libretro.c:1619-1638" + stv: + bios_format: "MAME-style ZIP (stvbios.zip)" + blob_size: 524288 + blob_load_address: "0x000000" + regions: [japan, europe, north-america, taiwan] + region_selection: "automatic per game, overridable via kronos_stv_favorite_region" + kronos_bios_subdir: "kronos" + source_ref: "ctrl/src/stv.c:112-136, ctrl/include/stv.h:47-52" diff --git a/emulators/mgba.yml b/emulators/mgba.yml new file mode 100644 index 00000000..e94e0ac4 --- /dev/null +++ b/emulators/mgba.yml @@ -0,0 +1,118 @@ +emulator: mGBA +type: libretro +source: "https://github.com/libretro/mgba" +cores: + - mgba +systems: + - nintendo-gba + - nintendo-gb + - nintendo-gbc + - nintendo-sgb + +notes: | + mGBA is a Game Boy Advance emulator with Game Boy, Game Boy Color, and + Super Game Boy support. + + All BIOS files are optional. mGBA ships a built-in HLE BIOS for GBA + (src/gba/hle-bios.c) that covers most software. The real BIOS improves + accuracy (startup logo, some edge-case SWI behavior). There is no HLE + BIOS for GB/GBC/SGB -- those rely on GBSkipBIOS() if no file is found. + + BIOS loading is controlled by two core options: + mgba_use_bios (default ON) - whether to look for BIOS files at all + mgba_skip_bios (default OFF) - skip the boot animation even if loaded + + The libretro port resolves BIOS filenames in retro_load_game() + (src/platform/libretro/libretro.c:2091-2148). It picks the filename + based on detected model: + GBA -> gba_bios.bin + GB (DMG/MGB) -> gb_bios.bin + GBC (CGB/AGB) -> gbc_bios.bin + SGB (SGB/SGB2)-> sgb_bios.bin + + The standalone core (src/gb/core.c:637-684) handles the same models + and maps SGB2 to sgb_bios.bin (marked TODO for a dedicated file). + + GBIsBIOS() in src/gb/gb.c validates BIOS files by CRC32 checksum. + Accepted checksums cover DMG, DMG0, MGB, SGB, SGB2, CGB, CGB0, CGBE, + AGB, and AGB0 revisions. + +files: + # ------------------------------------------------------- + # Game Boy Advance - BIOS (optional, HLE fallback) + # ------------------------------------------------------- + - name: gba_bios.bin + system: nintendo-gba + required: false + size: 16384 # 16 KB (0x4000, GBA_SIZE_BIOS) + note: "GBA BIOS. HLE replacement built in. Real BIOS adds boot logo and full SWI accuracy." + source_ref: "src/platform/libretro/libretro.c:2099" + + # ------------------------------------------------------- + # Game Boy - boot ROM (optional, skip fallback) + # ------------------------------------------------------- + - name: gb_bios.bin + system: nintendo-gb + required: false + size: 256 # 256 B (0x100) + note: "DMG/MGB boot ROM. Scrolling Nintendo logo. Skipped if absent." + source_ref: "src/platform/libretro/libretro.c:2134" + + # ------------------------------------------------------- + # Game Boy Color - boot ROM (optional, skip fallback) + # ------------------------------------------------------- + - name: gbc_bios.bin + system: nintendo-gbc + required: false + size: 2304 # 2304 B (0x900) + note: "CGB boot ROM. Used for CGB, AGB (GBA in GB mode), and SCGB models." + source_ref: "src/platform/libretro/libretro.c:2127" + + # ------------------------------------------------------- + # Super Game Boy - boot ROM (optional, skip fallback) + # ------------------------------------------------------- + - name: sgb_bios.bin + system: nintendo-sgb + required: false + size: 256 # 256 B (0x100) + note: "SGB/SGB2 boot ROM. Also used when model is SGB2 (no separate sgb2_bios.bin)." + source_ref: "src/platform/libretro/libretro.c:2130" + +platform_details: + gba: + bios_size: 16384 # 16 KB + hle_bios: true + source_ref: "src/gba/hle-bios.c, src/gba/gba.c:520-548" + notes: | + GBALoadBIOS() validates size (must be exactly 0x4000) then computes + an internal checksum. Two official checksums are recognized: + GBA_BIOS_CHECKSUM = 0xBAAE187F (standard GBA) + GBA_DS_BIOS_CHECKSUM = 0xBAAE1880 (DS GBA mode) + Other checksums trigger a warning but the file is still loaded. + + gb: + bios_size: 256 # 256 B + hle_bios: false + source_ref: "src/gb/gb.c:570-605" + notes: | + GBIsBIOS() validates by CRC32. Accepted DMG-family checksums: + DMG0 = 0xC2F5CC97, DMG = 0x59C8598E, MGB = 0xE6920754 + Files not matching any known checksum are rejected. + + gbc: + bios_size: 2304 # 2304 B (0x900) + hle_bios: false + source_ref: "src/gb/gb.c:570-605" + notes: | + Accepted CGB-family CRC32 checksums: + CGB = 0x41884E46, CGB0 = 0xE8EF5318, CGBE = 0xE95DC95D + AGB = 0xFFD6B0F1, AGB0 = 0x570337EA + + sgb: + bios_size: 256 # 256 B + hle_bios: false + source_ref: "src/gb/gb.c:570-605, src/gb/core.c:642-644" + notes: | + Accepted SGB CRC32 checksums: + SGB = 0xEC8A83B9, SGB2 = 0x53D0DD63 + SGB2 model falls through to sgb_bios.bin (marked TODO upstream). diff --git a/emulators/nestopia.yml b/emulators/nestopia.yml new file mode 100644 index 00000000..12fcd3cf --- /dev/null +++ b/emulators/nestopia.yml @@ -0,0 +1,67 @@ +emulator: Nestopia UE +type: libretro +source: "https://github.com/libretro/nestopia" +systems: [nintendo-nes, nintendo-fds] + +notes: | + Nestopia UE (Undead Edition) is a cycle-accurate NES/Famicom emulator. + NES cartridge games need no BIOS. Famicom Disk System games require + the FDS BIOS ROM (disksys.rom, 8 KB) loaded from the system directory. + The core validates the BIOS via CRC32 against two known dumps: + standard Famicom (0x5E607DCF) and Twin Famicom (0x4DF24A6C). + An unknown BIOS triggers a warning but still loads. + + NstDatabase.xml is an optional game database used for region autodetection, + aspect ratio selection, and 4-player adapter recognition. A copy is baked + into the core binary (libretro/nstdatabase.hpp) and used as fallback when + no external file is found. Placing a newer NstDatabase.xml in the system + directory overrides the built-in copy. + + An optional custom palette file (custom.pal, 192 bytes, 64 RGB triplets) + overrides the built-in palettes when the nestopia_palette core option is + set to Custom. The core ships with 10+ built-in palettes (Royaltea, + Smooth FBx, etc.) so the external file is rarely needed. + + Audio samples for specific games can be placed in system/nestopia/samples/ + as numbered .wav files (e.g., 00.wav, 01.wav). This is used for Famicom + expansion audio in a few titles. + + Game Genie is handled as cheat code decoding (software), not via a ROM file. + + File path construction: libretro/libretro.cpp retro_load_game() joins the + system directory (RETRO_ENVIRONMENT_GET_SYSTEM_DIRECTORY) with each + filename directly - no subdirectories. + +files: + # --- Famicom Disk System BIOS (required for FDS games) --- + - name: "disksys.rom" + system: nintendo-fds + description: "FDS BIOS ROM" + required: true + size: 8192 + md5: "ca30b50f880eb660a320674ed365ef7a" + sha1: "57fe1bdee955bb48d357e463ccbf129496930b62" + source_ref: "libretro/libretro.cpp:1608-1634 (FDS load), source/core/NstFds.cpp:61-131 (Bios class, CRC32 validation)" + notes: "Mapped at 0xE000-0xFFFF (8 KB). retro_load_game returns false if missing when loading .fds files. CRC32 checked: Famicom 0x5E607DCF, Twin Famicom 0x4DF24A6C." + + # --- NES game database (optional, overrides baked-in copy) --- + - name: "NstDatabase.xml" + system: nintendo-nes + description: "Nestopia game database for region and mapper autodetection" + required: false + size: 1022369 + md5: "0ee6cbdc6f5c96ce9c8aa5edb59066f4" + sha1: ~ + source_ref: "libretro/libretro.cpp:1561-1586 (database load), libretro/nstdatabase.hpp (baked-in fallback)" + notes: "XML database matching games by SHA1+CRC32. Used for region, mapper, mirroring, and 4-player adapter detection. Built-in fallback exists so this file is optional. Hash is for the upstream copy shipped with the core repo." + + # --- Custom palette (optional, core option nestopia_palette = Custom) --- + - name: "custom.pal" + system: nintendo-nes + description: "External NES color palette" + required: false + size: 192 + md5: ~ + sha1: ~ + source_ref: "libretro/libretro.cpp:1540-1559 (palette load)" + notes: "64 RGB triplets (64 x 3 bytes = 192 bytes). Only loaded when nestopia_palette core option is set to Custom. Falls back to built-in Royaltea palette if not found. Multiple valid palettes exist so no single canonical hash." diff --git a/emulators/o2em.yml b/emulators/o2em.yml new file mode 100644 index 00000000..0bba3f80 --- /dev/null +++ b/emulators/o2em.yml @@ -0,0 +1,98 @@ +emulator: O2EM +type: libretro +core: o2em_libretro +source: "https://github.com/libretro/libretro-o2em" +systems: + - odyssey2 + - videopac + +notes: | + O2EM is the libretro port of the Odyssey2/Videopac emulator. + The core requires exactly one BIOS ROM selected via the o2em_bios core option. + Default is o2rom.bin (Odyssey2 NTSC). The user can switch to c52.bin, g7400.bin + or jopac.bin for European/French Videopac variants. + + BIOS files are loaded from the system directory into rom_table[0] (1024 bytes). + The core identifies the BIOS variant by CRC32 and sets the vpp flag accordingly + (vpp=1 enables Videopac+ enhanced graphics for g7400.bin and jopac.bin). + + The core will not start without a valid BIOS file present. + Any single BIOS from the list below is sufficient for its region/hardware. + + All BIOS files are exactly 1 KB (1024 bytes). + + BIOS detection: libretro.c load_bios() lines 146-212, CRC32 switch. + BIOS selection: libretro_core_options.h o2em_bios option lines 52-64. + Core option handling: libretro.c lines 1107-1134. + +files: + # ------------------------------------------------------- + # Magnavox Odyssey2 (NTSC) - G7000 model + # ------------------------------------------------------- + - name: "o2rom.bin" + system: odyssey2 + region: [north-america] + required: true + size: 1024 + md5: "562d5ebf9e030a40d6fabfc2f33139fd" + sha1: "b2e1955d957a475de2411770452eff4ea19f4cee" + crc32: "8016a315" + note: "Magnavox Odyssey2 BIOS (G7000 NTSC). Default BIOS, vpp=0." + source_ref: "libretro.c:182-186" + + # ------------------------------------------------------- + # Philips Videopac G7000 (European) + # ------------------------------------------------------- + - name: "c52.bin" + system: videopac + region: [europe] + required: true + size: 1024 + md5: "f1071cdb0b6b10dde94d3bc8a6146387" + sha1: "a6120aed50831c9c0d95dbdf707820f601d9452e" + crc32: "a318e8d6" + note: "Philips Videopac G7000 European BIOS. vpp=0, auto-sets PAL region." + source_ref: "libretro.c:192-197" + + # ------------------------------------------------------- + # Philips Videopac+ G7400 (European) + # ------------------------------------------------------- + - name: "g7400.bin" + system: videopac + region: [europe] + required: true + size: 1024 + md5: "c500ff71236068e0dc0d0603d265ae76" + sha1: "5130243429b40b01a14e1304d0394b8459a6fbae" + crc32: "e20a9f41" + note: "Philips Videopac+ G7400 European BIOS. vpp=1, enables enhanced graphics." + source_ref: "libretro.c:187-191" + + # ------------------------------------------------------- + # Philips Videopac+ G7400 (French) - JoPac + # ------------------------------------------------------- + - name: "jopac.bin" + system: videopac + region: [france] + required: true + size: 1024 + md5: "279008e4a0db2dc5f1c048853b033828" + sha1: "54b8d2c1317628de51a85fc1c424423a986775e4" + crc32: "11647ca5" + note: "Philips Videopac+ G7400 French BIOS (JoPac). vpp=1, enables enhanced graphics." + source_ref: "libretro.c:198-203" + +platform_details: + odyssey2: + bios_size: 1024 + bios_selection: "core option o2em_bios, default o2rom.bin" + detection_method: "CRC32 of 1024-byte ROM" + hle_available: false + source_ref: "libretro.c:146-212, libretro_core_options.h:52-64" + videopac: + bios_size: 1024 + bios_selection: "core option o2em_bios, choose c52/g7400/jopac" + detection_method: "CRC32 of 1024-byte ROM" + vpp_flag: "g7400.bin and jopac.bin set vpp=1 for enhanced graphics" + hle_available: false + source_ref: "libretro.c:146-212, libretro_core_options.h:52-64" diff --git a/emulators/px68k.yml b/emulators/px68k.yml new file mode 100644 index 00000000..16a345f0 --- /dev/null +++ b/emulators/px68k.yml @@ -0,0 +1,110 @@ +emulator: px68k +type: libretro +source: "https://github.com/libretro/px68k-libretro" +cores: + - px68k +systems: + - sharp-x68000 + +# PX68K is a Sharp X68000 emulator (originally Keropi) ported to libretro. +# All ROM files are loaded from /keropi/ subdirectory. +# +# ROM loading (libretro.c:848-893 WinX68k_LoadROMs): +# 1. Base path set to /keropi/ via file_setcd(winx68k_dir) at line 969 +# 2. IPL ROM: iterates BIOSFILE[] = {iplrom.dat, iplrom30.dat, iplromco.dat, iplromxv.dat} +# and opens the first file found. Reads 0x20000 bytes (128 KB) into IPL buffer. +# Returns 0 (failure) if none found -- core will not start. +# 3. SCSI check (WinX68k_SCSICheck): if IPL contains SCSI vectors at offset 0x30600-0x30c00, +# patches a fake SCSI BIOS stub at $fc0000 with "Human68k" signature. +# 4. Byte-swaps IPL in 16-bit pairs (big-endian ROM on little-endian host). +# 5. Font ROM: opens cgrom.dat, falls back to cgrom.tmp if not found. +# Reads 0xc0000 bytes (768 KB) into FONT buffer. Returns 0 if neither exists. +# +# SRAM (x68k/sram.c:50-73): +# sram.dat is 16 KB of battery-backed SRAM, loaded on init and saved on cleanup. +# Not a BIOS -- runtime state. Created automatically if missing. +# +# Directory layout expected: +# /keropi/iplrom.dat (or iplrom30.dat, iplromco.dat, iplromxv.dat) +# /keropi/cgrom.dat (or cgrom.tmp) +# /keropi/sram.dat (auto-created) +# /keropi/config (auto-created, core settings) + +files: + # IPL ROM -- the main system BIOS. The core tries four filenames in order and + # uses the first one found. Only one is needed. iplrom.dat is the original X68000, + # iplrom30.dat is X68030, iplromco.dat is X68000 Compact, iplromxv.dat is X68000 XVI. + + - name: "iplrom.dat" + path: "keropi/iplrom.dat" + size: 131072 + required: true + note: > + X68000 IPL ROM (original model). 128 KB, loaded at IPL buffer offset 0x20000. + The core tries iplrom.dat first, then iplrom30.dat, iplromco.dat, iplromxv.dat + in order. At least one must be present or the core fails to start. + source_ref: "libretro.c:850-867" + + - name: "iplrom30.dat" + path: "keropi/iplrom30.dat" + size: 131072 + required: false + note: > + X68030 IPL ROM. Alternative to iplrom.dat for X68030 model emulation. + Only used if iplrom.dat is not found. + source_ref: "libretro.c:851" + + - name: "iplromco.dat" + path: "keropi/iplromco.dat" + size: 131072 + required: false + note: > + X68000 Compact IPL ROM. Alternative to iplrom.dat. + Only used if iplrom.dat and iplrom30.dat are not found. + source_ref: "libretro.c:851" + + - name: "iplromxv.dat" + path: "keropi/iplromxv.dat" + size: 131072 + required: false + note: > + X68000 XVI IPL ROM. Last fallback in the IPL search order. + Only used if the three other IPL variants are not found. + source_ref: "libretro.c:851" + + # Font ROM -- character generator ROM for text rendering. + + - name: "cgrom.dat" + path: "keropi/cgrom.dat" + size: 786432 + required: true + note: > + X68000 character generator ROM. 768 KB, provides the font glyphs for text + display. If missing, the core falls back to cgrom.tmp (user-generated font + cache). Core fails to start if neither file exists. + source_ref: "libretro.c:853, libretro.c:881-891" + + - name: "cgrom.tmp" + path: "keropi/cgrom.tmp" + size: 786432 + required: false + note: > + Alternative font file, used as fallback when cgrom.dat is absent. + Typically a font cache generated by the emulator itself on other platforms. + source_ref: "libretro.c:854, libretro.c:884-888" + +notes: + subdirectory: > + All files must be placed in /keropi/ subdirectory. The core sets + this path at init via sprintf(retro_system_conf, "%s/keropi", system_dir) and + then calls file_setcd() to make it the base for all file_open_c() calls. + ipl_selection: > + The four IPL ROM variants correspond to different X68000 hardware revisions. + The core uses whichever it finds first in order: iplrom.dat (original X68000), + iplrom30.dat (X68030), iplromco.dat (Compact), iplromxv.dat (XVI). Most users + only need iplrom.dat. The IPL also determines SASI vs SCSI disk support based + on vectors found at offsets 0x30600-0x30c00. + sram: > + sram.dat (16 KB) is read/write runtime state, not a BIOS file. The core creates + it automatically on first shutdown. It stores X68000 NVRAM settings (boot count, + boot device preferences, SRAM-resident programs).