From 825aa78bc5c7b444ea1ddb59af67c75c42fc8683 Mon Sep 17 00:00:00 2001 From: Abdessamad Derraz <3028866+Abdess@users.noreply.github.com> Date: Tue, 11 Aug 2026 00:56:14 +0200 Subject: [PATCH] feat: profile xm6 pro-68k, typeg and zesarux X68000 and ZX Spectrum emulators read from their own source trees. --- emulators/xm6pro68k.yml | 263 ++++++++++ emulators/xm6typeg.yml | 412 +++++++++++++++ emulators/zesarux.yml | 1044 +++++++++++++++++++++++++++++++++++++++ 3 files changed, 1719 insertions(+) create mode 100644 emulators/xm6pro68k.yml create mode 100644 emulators/xm6typeg.yml create mode 100644 emulators/zesarux.yml diff --git a/emulators/xm6pro68k.yml b/emulators/xm6pro68k.yml new file mode 100644 index 00000000..504e4f81 --- /dev/null +++ b/emulators/xm6pro68k.yml @@ -0,0 +1,263 @@ +emulator: xm6pro68k +type: standalone +core_classification: enhanced_fork +source: "https://mijet.eludevisibility.org/XM6%20Pro-68k/XM6%20Pro-68k.html" +upstream: closed-source +based_on: "XM6 v2.06 by PI." +profiled_date: "2026-08-10" +core_version: "260726" +display_name: "XM6 Pro-68k (Sharp X68000)" +mode: standalone +cores: + - xm6pro68k + - xm6pro + - XM6PRO68K + - XM6PRO68K-WINDOWS +systems: + - sharp-x68000 + +notes: | + Closed-source Windows fork of PI's XM6 v2.06 (README.txt:6) by M.I.J.E.T., + distributed only from mijet.eludevisibility.org as three 7-Zip packages: the + program, a mandatory DLL Package and an optional Web Package that adds signed + update downloads. Version.txt in the build analysed here reads 260726. The first + release, 120303, forked XM6 v2.05. XM6.exe is a 32-bit MFC application whose + import directory names mfc90u.dll and MSVCR90.dll, so the Visual C++ 2008 runtime + carried by the DLL Package, or the redistributable, must sit beside the executable + for the process to start; a second non-Unicode build lives in MBCS/ and needs the + same files duplicated there. ES-DE launches it through the XM6PRO68K and + XM6PRO68K-WINDOWS find rules with the working directory set to the emulator + folder, on Linux under Wine or Proton. RetroBat registers it as xm6pro + (Program.cs:189, Installer.cs:151), runs XM6.exe from its own directory and + rewrites XM6.ini before launch (Xm6pro.Generator.cs:22-79). + + System files are resolved beside XM6.exe. XM6 v2.06 declares them in + Filepath::SystemFile[] (vm/filepath.cpp:394-405) and Filepath::SysFile + (vm/filepath.cpp:121-137) builds each path from SystemDir when one is set and from + the executable's own directory otherwise. XM6 Pro-68k references all ten names, + nine of them in one contiguous string block mirroring that table in reverse, and + exposes no ROM directory setting, while README.txt:71-73 requires the DLL Package + files to be extracted next to the executable rather than into a subdirectory. + Loading goes through Fileio::Load and + Fileio::Read (vm/fileio.cpp:35-51, 175-192), which succeed only when the file + holds at least the requested byte count, so every size below is a floor: a longer + file loads and its tail is ignored. The XM6 v2.06 sources cited throughout are + readable in mixerjdp/XM6_Libretro, which preserves the vm/ layer. + + Machine selection follows ROM presence. Memory::Init (vm/memory.cpp:171-196) + loads the base SASI machine, then probes XVI, Compact and X68030 in that order and + keeps the first that succeeds. Memory::LoadROM (vm/memory.cpp:236-372) pairs each + machine with its ROMs: XVI and Compact need their IPL plus SCSIINROM.DAT, X68030 + needs IPLROM30.DAT plus ROM30.DAT read at 0x20000 bytes instead of 0x2000, and the + base machine needs no SCSI ROM. Internal SCSI is the interface built into the + X68000 SUPER and later models, external SCSI is the CZ-6BS1 add-on board + (Reference Manual.txt:1529-1536). + + Two files diverge from XM6 v2.06. The base IPL ROM is compiled into the + executable: "The program now includes an internal copy of the basic IPL ROM. It + will still try to load IPL ROMs externally first" (Change Log.txt:125-126), and + README.txt:23-25 tells users to leave IPLROM.DAT out because loading it only costs + startup time. The hard CG ROM requirement was dropped (Change Log.txt:129), so a + missing font ROM yields garbage glyphs instead of failing initialisation + (README.txt:277-278). + + Two menu tools synthesise replacements. Synthesize replacement CG-ROM builds + CGROM.TMP from the installed MS Gothic and MS Mincho fonts and aborts when either + is absent; README.txt:294-296 warns that different machines produce different + files. Synthesize replacement SCSI ROMs asks for a Human68k version 3.02 disk + image, dialog default HUMAN302.XDF with filter *HUMAN*3*02*.???, extracts + /BIN/FORMAT.X and writes SCSIINROM.DAT and SCSIEXROM.DAT. + + The ROM Warning section of the Advanced options holds three startup checks, all + enabled by default and individually suppressible: an IPLROM.DAT version check + naming version 1.0 (05/07/1987) as recommended, a CGROM.DAT contents check and a + SCSIEXROM.DAT / SCSIINROM.DAT contents check. Each raises a dialog; none rejects + the file, so no hash below is enforced by the program. + + Reference Manual.txt ships with the program and Software Notes.txt is fetched by + the Web Package through Scripts\Update Notes.bat. Both are prose documents that + the Help menu and Help > Peruse Notes hand to a text editor, not data XM6 parses. + XM6.ini and XM6U.ini are written by the program. + +files: + # -- IPL ROMs, one per emulated model, each read at 0x20000 bytes -- + + - name: IPLROM.DAT + system: sharp-x68000 + required: false + has_builtin: true + min_size: 131072 + validation: [size] + md5: 7fd4caabac1d9169e289f0f7bbf71d8e + sha1: 0ed038ed2133b9f78c6e37256807424e0d927560 + description: "X68000 boot ROM, base SASI model" + source_ref: "Change Log.txt:125-126, README.txt:23-25, XM6 2.06 vm/memory.cpp:256-276" + note: >- + XM6.exe carries this ROM internally and only reads the file when it is + present, so the emulator boots without it. The embedded copy sits at file + offset 1337256 in .rdata of the Unicode build and 1288176 in the MBCS build, + stored in the 16-bit pairwise swapped form the loader produces at + vm/memory.cpp:278-285; unswapped it is the 131072-byte dump hashed here, + catalogued by TOSEC as Sharp X68000 Boot ROM (1987)(Sharp), and it is the + version 1.0 (05/07/1987) the startup warning recommends. README.txt:23-25 + advises against installing the file at all because reading and swapping it + only lengthens startup. + + - name: IPLROMXV.DAT + system: sharp-x68000 + required: false + min_size: 131072 + validation: [size] + description: "X68000 XVI boot ROM" + source_ref: "XM6 2.06 vm/memory.cpp:178-180, 261-263" + note: >- + Probed after the base machine loads. Its presence, together with + SCSIINROM.DAT, is what makes the XVI machine available; absent, the base + X68000 still runs. No internal copy is compiled into XM6.exe. + + - name: IPLROMCO.DAT + system: sharp-x68000 + required: false + min_size: 131072 + validation: [size] + description: "X68000 Compact boot ROM" + source_ref: "XM6 2.06 vm/memory.cpp:181-185, 264-266" + note: >- + Probed after XVI. Selects the Compact machine when found, and that machine + also needs SCSIINROM.DAT. No internal copy is compiled into XM6.exe. + + - name: IPLROM30.DAT + system: sharp-x68000 + required: false + min_size: 131072 + validation: [size] + description: "X68030 boot ROM" + source_ref: "XM6 2.06 vm/memory.cpp:186-190, 267-269" + note: >- + Probed last. Selects the X68030 machine, which also needs ROM30.DAT. No + internal copy is compiled into XM6.exe. + + # -- X68030 SCSI ROM, the one SCSI ROM read at 0x20000 bytes -- + + - name: ROM30.DAT + system: sharp-x68000 + required: false + min_size: 131072 + validation: [size] + description: "X68030 SCSI ROM" + source_ref: "README.txt:25, XM6 2.06 vm/memory.cpp:316-319, 334-337" + note: >- + The SCSI half of the X68030 machine, and the only SCSI ROM read at 0x20000 + bytes rather than 0x2000. Without it LoadROM(X68030) fails and the X68030 + machine is not offered. README.txt:25 calls it non-critical and notes that + installing it can cost performance. + + # -- Font ROM, read at 0xc0000 bytes, CGROM.DAT first then CGROM.TMP -- + + - name: CGROM.DAT + system: sharp-x68000 + required: false + bundled: true + min_size: 786432 + validation: [size] + md5: cb0a5cfcf7247a7eab74bb2716260269 + sha1: 8d72c5b4d63bb14c5dbdac495244d659aa1498b6 + description: "X68000 character generator ROM" + source_ref: "README.txt:277-278, Change Log.txt:129, XM6 2.06 vm/memory.cpp:287-295" + note: >- + Supplies the glyphs for text the X68000 renders. Stock XM6 v2.06 fails + initialisation when neither font file loads; XM6 Pro-68k dropped that + requirement, so a missing font ROM shows garbage glyphs and the emulator + keeps running, and what remains is the suppressible contents warning. + The mandatory DLL Package ships this exact 786432-byte file, catalogued by + TOSEC as Sharp X68000 CG ROM (1987)(Sharp); the hash identifies that copy and + is not verified by the program. + + - name: CGROM.TMP + system: sharp-x68000 + required: false + min_size: 786432 + validation: [size] + description: "Synthesised font ROM, fallback when CGROM.DAT is absent" + source_ref: "README.txt:292-296, XM6 2.06 vm/memory.cpp:290-294" + note: >- + Read only when CGROM.DAT is missing, at the same size. Tools > Synthesize + replacement CG-ROM writes it from the installed MS Gothic and MS Mincho fonts + and fails when either is absent. No hash is declared because the output + depends on the fonts of the machine that generated it. XM6 refuses to use it + while CGROM.DAT is present. + + # -- SCSI ROMs, read at 0x2000 bytes, required by the interface they drive -- + + - name: SCSIINROM.DAT + system: sharp-x68000 + required: false + bundled: true + min_size: 8192 + validation: [size] + md5: aeb4607a14612606c833227437aaa16a + sha1: 15a17798839a3f7f361119205aebc301c2df5967 + description: "Internal SCSI interface ROM, X68000 SUPER and later" + source_ref: "Reference Manual.txt:1529-1536, XM6 2.06 vm/memory.cpp:309-315" + note: >- + Needed to use internal SCSI drives, and also loaded as part of the XVI and + Compact machines, so those two models are unavailable without it whatever + their IPL. The mandatory DLL Package ships this exact 8192-byte file and the + hash identifies that copy; the startup contents check only warns. + + - name: SCSIEXROM.DAT + system: sharp-x68000 + required: false + bundled: true + min_size: 8160 + validation: [size] + md5: 237be014374b74d327f15f250d4d62bf + sha1: 49616c09a8986ffe6a12ad600febe512f7ba8ae4 + description: "External SCSI interface ROM, CZ-6BS1 board" + source_ref: "Reference Manual.txt:1529-1536, XM6 2.06 vm/memory.cpp:320-324, 346-357" + note: >- + Needed to use the external SCSI interface, which is the only SCSI variant + that can coexist with SASI. The loader first reads 0x2000 bytes and, on + failure, retries with the 0x1fe0-byte WinX68k layout loaded at buffer offset + 0x20, so 8160 is the real floor. The mandatory DLL Package ships the + 8192-byte form hashed here. + + # -- Battery-backed NVRAM -- + + - name: SRAM.DAT + system: sharp-x68000 + required: false + size: 16384 + description: "X68000 SRAM image, boot device and memory switch settings" + source_ref: "Reference Manual.txt:1366-1368, 2648-2651, XM6 2.06 vm/filepath.cpp:404" + note: >- + Read at startup and rewritten on exit when the contents changed, so XM6 + creates it on first run and a supplied image only preloads the settings. The + Tools > SRAM menu reloads, duplicates and write-protects it, and the boot + counter option updates it on exit. Size is the X68000 SRAM size and is not + checked by the program. + + # -- Optional libraries loaded by name at runtime, shipped in the DLL Package -- + + - name: 7z.dll + system: sharp-x68000 + required: false + bundled: true + description: "7-Zip library for .7z, .zip and .xz support" + source_ref: "README.txt:166-170, XM6.exe strings 7z.dll, Optional DLL Not Present" + note: >- + Absent from the import directory and looked up by name at runtime, so XM6 + starts without it and reports Optional DLL Not Present, Archive support is + not available. Enables loading disk images and state files from archives and + writing XZ-compressed state files. + + - name: zlib1.dll + system: sharp-x68000 + required: false + bundled: true + description: "zlib, used for PNG output and deflate archives" + source_ref: "README.txt:322-323, XM6.exe strings 7z.dll or zlib1.dll" + note: >- + Looked up by name at runtime alongside 7z.dll and named in the same Optional + DLL Not Present dialog. README.txt:322-323 credits the PNG Reference Library + and zlib for the screenshot support. diff --git a/emulators/xm6typeg.yml b/emulators/xm6typeg.yml new file mode 100644 index 00000000..673eeaa9 --- /dev/null +++ b/emulators/xm6typeg.yml @@ -0,0 +1,412 @@ +emulator: xm6typeg +type: standalone +core_classification: enhanced_fork +source: "http://retropc.net/pi/xm6/index.html" +upstream: closed-source +based_on: "XM6 v2.06 by PI." +profiled_date: "2026-08-10" +core_version: "3.38" +display_name: "XM6 TypeG (Sharp X68000)" +mode: standalone +cores: + - xm6typeg + - XM6TYPEG + - XM6TYPEG-WINDOWS +systems: + - sharp-x68000 + +notes: | + Closed-source Windows fork of XM6 v2.06, extended by GIMONS from 2010 and + maintained again by PI. since version 3.34 (xm6g.pdf p.1, p.3). Distributed from + PI's XM6 page as a single archive, xm6_typeg_338_20260223.zip, holding an x64 + xm6g.exe, the Visual C++ 2015-2019 runtime it imports (mfc140u.dll, + msvcp140.dll, vcruntime140.dll, vcruntime140_1.dll) and the 32-page manual + xm6g.pdf. No source is published; the analysis below reads xm6g.exe, and the + XM6 v2.06 sources cited alongside are PI's own release, xm6_206s.zip from the + same page. ES-DE launches it through the XM6TYPEG and XM6TYPEG-WINDOWS find + rules with the working directory set to the emulator folder, on Linux under + Wine or Proton. The archive alone does not run: the manual opens with that + warning (xm6g.pdf p.5). + + Machines emulated are X68000, XVI, Compact, X68030 and the 040turbo and + 060turbo accelerator configurations (xm6g.pdf p.3). System files are resolved + beside xm6g.exe. A twenty-entry name table at xm6g.exe:0x140592350 holds them, + against ten in Filepath::SystemFile[] (XM6 2.06 vm/filepath.cpp:472-483), and + each path is built by copying the name, splitting it, and refilling drive and + directory from GetModuleFileNameW, the sequence XM6 2.06 spells out in + Filepath::SysFile and Filepath::SetBaseDir (vm/filepath.cpp:88-105, 172-186). + The path is rebuilt from the module path on every load, with no configured + directory taking part. Loading reads a fixed byte count and compares it + against the count returned, so every min_size below is a floor: a longer file + loads and its tail is ignored. + + Two files are mandatory. LoadROM (xm6g.exe:0x1404fc9a5) leaves through its + failure exit when the IPL read fails, and the CG read falls back to CGROM.TMP + before failing the same way, which is the string "XM6 requires two ROM files, + IPLROM.DAT file and CGROM.DAT(or CGROM.TMP) file." Nothing in the executable + substitutes for either. The system options page probes IPLROM.DAT, + IPLROMXV.DAT, IPLROMCO.DAT and IPLROM30.DAT with GetFileSizeEx and accepts a + file only at exactly 131072 bytes (xm6g.exe:0x140428f80, size test at + 0x14042920a). + + XM6 Utility, published separately at the same address, synthesises CGROM.TMP + from the installed Windows fonts and SCSIINROM.DAT or SCSIEXROM.DAT from the + Human68k version 3.02 disk image HUMAN302.XDF, which it requires at 0x134000 + bytes (XM6Util scsirom.cpp:86-90). It stamps the SCSI ROMs with "XM6 " at + offset 0x1ff8 and a version at 0x1ffc (XM6Util scsirom.cpp:243-245), and + xm6g.exe reads both files back and tests that signature + (xm6g.exe:0x14050147c, 0x1405015e0) to raise the startup warning that names + these files as substitutes and discourages them. Nothing rejects the file, and + no genuine ROM is hashed anywhere in the executable. + + SCSI ROM requirements follow the machine (xm6g.pdf p.17). SCSIINROM.DAT is + needed by SUPER, XVI and Compact and by any machine set to the internal SCSI + interface; SCSIEXROM.DAT drives the CZ-6BS1 external board, which is the only + SCSI variant the SASI models can take. X68030 needs neither, its SCSI ROM + being part of IPLROM30.DAT or IPLROM30S.DAT. IPLROM30S.DAT and ROM30S.DAT are + a pair used only when Expansion ROM is enabled on the X68030 options tab, for + ROMs patched for 060turbo (xm6g.pdf p.17). + + The Mercury Unit carries an OPN (YMF288) whose rhythm section is sampled from + external files. The fmgen and X68Sound engines read six WAV files named from a + table at xm6g.exe:0x1405c0090 (0x1404ed610, CreateFileW at 0x1404ed8bf); the + ymfm engine reads ym2608_adpcm_rom.bin instead (0x140574fec, ReadFile at + 0x140575095), which is why the rhythm level control is documented as inert for + ymfm. + + xm6g.ini and the state file STATE.XM6, the twentieth table entry, are written + by the program and are not listed below. RTC.DAT and the SRAM files are listed + because they are battery-backed images with hardware counterparts that preload + settings when supplied, even though XM6 TypeG creates them on exit when they + are absent (xm6g.pdf p.18). + +files: + # -- IPL ROMs, one per emulated model, read at 0x20000 bytes and byte-swapped -- + + - name: IPLROM.DAT + system: sharp-x68000 + required: true + size: 131072 + validation: [size] + description: "X68000 boot ROM version 1.0, base models" + source_ref: "xm6g.pdf p.16, xm6g.exe:0x1404fc9a5 (read at 0x1404fcbb7), xm6g.exe:0x14042920a, XM6 2.06 vm/memory.cpp:249-270" + note: >- + Covers the first model, ACE, EXPERT, PRO and SUPER. LoadROM reads 0x20000 + bytes and fails when fewer are returned, and the failure aborts + initialisation. The startup warning naming version 1.00 (05/07/1987) as + recommended only advises; it does not reject the file. The recommended + source is the free X68BIOSE.LZH package (xm6g.pdf p.6). + + - name: IPLROMXV.DAT + system: sharp-x68000 + required: false + size: 131072 + validation: [size] + description: "X68000 XVI boot ROM version 1.1" + source_ref: "xm6g.pdf p.16, xm6g.exe:0x14042927c, XM6 2.06 vm/memory.cpp:256-258" + note: >- + Selects the XVI machine, which also needs SCSIINROM.DAT. The options page + offers the machine only when this file is exactly 131072 bytes. + + - name: IPLROMCO.DAT + system: sharp-x68000 + required: false + size: 131072 + validation: [size] + description: "X68000 Compact boot ROM version 1.2" + source_ref: "xm6g.pdf p.16, xm6g.exe:0x14042946b, XM6 2.06 vm/memory.cpp:259-261" + note: >- + Selects the Compact machine, which also needs SCSIINROM.DAT. Same exact + size test as the other IPL ROMs. + + - name: IPLROM30.DAT + system: sharp-x68000 + required: false + size: 131072 + validation: [size] + description: "X68030 boot ROM version 1.3, $FE0000-$FFFFFF half" + source_ref: "xm6g.pdf p.16, xm6g.exe:0x14042965a, XM6 2.06 vm/memory.cpp:262-264" + note: >- + Upper half of the X68030 and X68030 Compact boot ROM, paired with + ROM30.DAT. It carries the SCSI ROM for those machines, so neither + SCSIINROM.DAT nor SCSIEXROM.DAT applies to them. + + - name: ROM30.DAT + system: sharp-x68000 + required: false + min_size: 131072 + validation: [size] + description: "X68030 boot ROM version 1.3, $FC0000-$FDFFFF half" + source_ref: "xm6g.pdf p.16, xm6g.exe:0x1404fd1f8, XM6 2.06 vm/memory.cpp:311-313, 328-335" + note: >- + Lower half of the X68030 boot ROM, loaded through the SCSI ROM slot and + the only one of those read at 0x20000 bytes rather than 0x2000. Without it + the X68030 machine does not load. + + - name: IPLROM30S.DAT + system: sharp-x68000 + required: false + min_size: 131072 + validation: [size] + description: "Expansion boot ROM, $FE0000-$FEFFFF" + source_ref: "xm6g.pdf p.16-17, xm6g.exe:0x140592350 index 4" + note: >- + Read in place of IPLROM30.DAT when Expansion ROM is checked on the X68030 + options tab, the setting stored as EXTROM. Paired with ROM30S.DAT and + intended for ROMs patched for 060turbo. + + - name: ROM30S.DAT + system: sharp-x68000 + required: false + min_size: 131072 + validation: [size] + description: "Expansion boot ROM, lower half" + source_ref: "xm6g.pdf p.16, xm6g.exe:0x1404fd201" + note: >- + The other half of the expansion pair, loaded through the same SCSI ROM + slot as ROM30.DAT and read at the same size. + + # -- CG ROMs, read at 0xc0000 bytes, model specific first then CGROM.DAT then CGROM.TMP -- + + - name: CGROM.DAT + system: sharp-x68000 + required: true + min_size: 786432 + validation: [size] + description: "X68000 character generator ROM" + source_ref: "xm6g.pdf p.17-18, xm6g.exe:0x1404fcf11 (read at 0x1404fd013), XM6 2.06 vm/memory.cpp:283-289" + note: >- + Supplies the glyphs the X68000 renders, mapped at $F00000-$FBFFFF. Used by + the base models and as the fallback for every machine whose own CG ROM is + absent. Initialisation fails when neither this file nor CGROM.TMP loads. + + - name: CGROMXV.DAT + system: sharp-x68000 + required: false + min_size: 786432 + validation: [size] + description: "X68000 XVI character generator ROM" + source_ref: "xm6g.pdf p.17-18, xm6g.exe:0x1404fcd99" + note: >- + Preferred when the XVI machine is selected. CGROM.DAT is used when it is + missing. + + - name: CGROMCO.DAT + system: sharp-x68000 + required: false + min_size: 786432 + validation: [size] + description: "X68000 Compact character generator ROM" + source_ref: "xm6g.pdf p.17-18, xm6g.exe:0x1404fcdac" + note: >- + Preferred when the Compact machine is selected, with the same fallback to + CGROM.DAT. + + - name: CGROM30.DAT + system: sharp-x68000 + required: false + min_size: 786432 + validation: [size] + description: "X68030 character generator ROM" + source_ref: "xm6g.pdf p.17-18, xm6g.exe:0x1404fcc36 (read at 0x1404fcd42)" + note: >- + Preferred when X68030 or X68030 Compact is selected, with the same + fallback to CGROM.DAT. + + - name: CGROM.TMP + system: sharp-x68000 + required: false + min_size: 786432 + validation: [size] + description: "Synthesised font ROM, fallback when no CG ROM is present" + source_ref: "xm6g.pdf p.18, p.6, xm6g.exe:0x1404fd041, XM6 2.06 vm/memory.cpp:286-289" + note: >- + Read at the same size, only after CGROM.DAT fails. XM6 Utility builds it + from the fonts installed on the machine that generated it, so no hash is + declared. XM6 TypeG treats it as non-recommended and raises a suppressible + startup warning whenever it is in use. + + # -- SCSI ROMs, tried at 0x20000 then 0x2000, external also at 0x1fe0 -- + + - name: SCSIINROM.DAT + system: sharp-x68000 + required: false + min_size: 8192 + size_options: [8192, 131072] + validation: [size] + description: "Internal SCSI interface ROM, SUPER and later" + source_ref: "xm6g.pdf p.17, xm6g.exe:0x1404fd1ef (reads at 0x1404fd327, 0x1404fd3dd), XM6 2.06 vm/memory.cpp:305-310, 328-345" + note: >- + Required by SUPER, XVI and Compact, and by any machine whose SCSI + interface option is set to internal, that option defaulting to none. The + loader tries 0x20000 bytes first and falls back to 0x2000. A copy carrying + "XM6 " at offset 0x1ff8 was synthesised by XM6 Utility and raises the + startup warning. + + - name: SCSIEXROM.DAT + system: sharp-x68000 + required: false + min_size: 8160 + size_options: [8160, 8192, 131072] + validation: [size] + description: "External SCSI interface ROM, CZ-6BS1 board" + source_ref: "xm6g.pdf p.17, xm6g.exe:0x1404fd20a (retry at 0x1404fd419), XM6 2.06 vm/memory.cpp:316-318, 341-352" + note: >- + Drives the CZ-6BS1 board, the only SCSI variant the first model, ACE, + EXPERT and PRO can take, and mutually exclusive with the internal + interface everywhere else. After 0x20000 and 0x2000 the loader retries at + 0x1fe0 bytes into buffer offset 0x20, the WinX68k high-speed layout, so + 8160 is the real floor. + + # -- Battery-backed images, read at startup, written on exit when changed -- + + - name: SRAM.DAT + system: sharp-x68000 + required: false + size_options: [16384, 65536] + description: "SRAM image for EXPERT and the other base models" + source_ref: "xm6g.pdf p.18, xm6g.exe:0x140592350 index 14, XM6 2.06 vm/sram.cpp:70-81, 112" + note: >- + Holds the boot device and memory switch settings for the first model, ACE, + EXPERT, PRO and SUPER. A supplied image preloads those settings. The + standard capacity is the 16 KB X68000 SRAM; the SRAM64K modification the + emulator reproduces raises it to 64 KB. No size is enforced. + + - name: SRAMXVI.DAT + system: sharp-x68000 + required: false + size_options: [16384, 65536] + description: "SRAM image for XVI" + source_ref: "xm6g.pdf p.18, xm6g.exe:0x140592350 index 15" + note: >- + Per-model SRAM introduced by XM6 TypeG, which keeps one image per machine + instead of the single SRAM.DAT of XM6 v2.06. + + - name: SRAMCMP.DAT + system: sharp-x68000 + required: false + size_options: [16384, 65536] + description: "SRAM image for Compact" + source_ref: "xm6g.pdf p.18, xm6g.exe:0x140592350 index 16" + note: >- + Read when the Compact machine is selected. + + - name: SRAM030.DAT + system: sharp-x68000 + required: false + size_options: [16384, 65536] + description: "SRAM image for X68030, 040turbo and 060turbo" + source_ref: "xm6g.pdf p.18, xm6g.exe:0x140592350 index 17" + note: >- + Shared by X68030, X68030 Compact and the 040turbo and 060turbo + configurations. + + - name: RTC.DAT + system: sharp-x68000 + required: false + description: "RTC alarm settings for timer start" + source_ref: "xm6g.pdf p.18, xm6g.exe:0x140592350 index 18" + note: >- + Alarm registers of the battery-backed clock, used by the timer start + feature and applying to every machine. XM6 TypeG creates it on exit when + it is absent. + + # -- Mercury Unit rhythm samples, read by the OPN (YMF288) section -- + + - name: ym2608_adpcm_rom.bin + system: sharp-x68000 + required: false + description: "YM2608 ADPCM-A rhythm ROM, ymfm engine" + source_ref: "xm6g.exe:0x140574eb0 (name at 0x140574fec, read at 0x140575095)" + note: >- + Rhythm source for the Mercury Unit OPN when the FM engine is set to ymfm. + The name is appended to a directory and the file is read whole; when it is + absent the rhythm section stays silent and the emulator runs. + + - name: 2608_BD.WAV + system: sharp-x68000 + required: false + description: "Mercury Unit rhythm sample, bass drum" + source_ref: "xm6g.exe:0x1404ed610, name table 0x1405c0090, CreateFileW at 0x1404ed8bf" + note: >- + One of the six rhythm samples the fmgen and X68Sound engines read for the + Mercury Unit OPN. The name is built as 2608_ plus the table entry plus + .WAV. A missing file is handled through ERROR_FILE_NOT_FOUND and leaves + that instrument silent. + + - name: 2608_SD.WAV + system: sharp-x68000 + required: false + description: "Mercury Unit rhythm sample, snare drum" + source_ref: "xm6g.exe:0x1404ed610, name table 0x1405c0090" + + - name: 2608_TOP.WAV + system: sharp-x68000 + required: false + description: "Mercury Unit rhythm sample, top cymbal" + source_ref: "xm6g.exe:0x1404ed610, name table 0x1405c0090" + + - name: 2608_HH.WAV + system: sharp-x68000 + required: false + description: "Mercury Unit rhythm sample, hi-hat" + source_ref: "xm6g.exe:0x1404ed610, name table 0x1405c0090" + + - name: 2608_TOM.WAV + system: sharp-x68000 + required: false + description: "Mercury Unit rhythm sample, tom-tom" + source_ref: "xm6g.exe:0x1404ed610, name table 0x1405c0090" + + - name: 2608_RIM.WAV + system: sharp-x68000 + aliases: + - 2608_RYM.WAV + required: false + description: "Mercury Unit rhythm sample, rim shot" + source_ref: "xm6g.exe:0x1404ed610, name table 0x1405c0090, 0x1404ed808-0x1404ed841" + note: >- + Last of the six. This entry alone has a second accepted name, + 2608_RYM.WAV, the spelling carried by widely circulated sample sets. + + # -- Libraries looked up by name at runtime, absent from the import directory -- + + - name: X68Sound.dll + system: sharp-x68000 + required: false + description: "FM synthesis engine by m_puusan" + source_ref: "xm6g.pdf p.29, p.31, xm6g.exe:LoadLibraryW at 0x140488dfb" + note: >- + One of the three FM engines the sound options offer, alongside the + built-in fmgen and ymfm. Not shipped in the archive; without it that + engine cannot be selected. + + - name: c86ctl.dll + system: sharp-x68000 + required: false + description: "Control library for external OPM hardware" + source_ref: "xm6g.exe:0x1404b2da6, version query at 0x1404b2daa" + note: >- + Loaded by name to drive a real YM2151 through a C86BOX class device + instead of software synthesis. The executable reads its file version + before use. + + - name: pcidebug.dll + system: sharp-x68000 + required: false + description: "PCI access library used by the debug interface" + source_ref: "xm6g.exe:LoadLibraryW at 0x1404fa344, FreeLibrary at 0x1404fa2f5" + note: >- + Loaded on demand and freed again. Absent, the feature that needs it is + unavailable and the emulator continues. + + - name: SOUND Canvas VA.dll + system: sharp-x68000 + required: false + path: "%ProgramFiles%/Roland/Sound Canvas VA/SOUND Canvas VA.dll" + description: "Roland Sound Canvas VA plugin used as MIDI output" + source_ref: "xm6g.exe:0x14048418a, INI key VstSCVA" + note: >- + Hosted as the MIDI output device when the VSTi option is selected. The + path is fixed to the Roland installation directory and the setting is + stored as VstSCVA. diff --git a/emulators/zesarux.yml b/emulators/zesarux.yml new file mode 100644 index 00000000..ecdaea24 --- /dev/null +++ b/emulators/zesarux.yml @@ -0,0 +1,1044 @@ +emulator: ZEsarUX +type: standalone +core_classification: other +source: "https://github.com/chernandezba/zesarux" +upstream: "https://github.com/chernandezba/zesarux" +source_commit: "ffccfcd819654d6237b6e1c1df7e261a22e8b728" +profiled_date: "2026-08-10" +core_version: "13.1-SN" +display_name: "Sinclair - ZX Spectrum and clones (ZEsarUX)" +verification: existence +cores: [zesarux] + +systems: + - sinclair-zx-spectrum + - sinclair-zx-spectrum-next + - sinclair-zx80 + - sinclair-zx81 + - sinclair-ql + - cambridge-z88 + - jupiter-ace + - timex-ts1500 + - timex-tc2048 + - timex-ts2068 + - microdigital-tk85 + - amstrad-cpc + - pcw + - sam-coupe + - colecovision + - sg-1000 + - sega-mastersystem + - msx + - spectravideo + - science-of-cambridge-mk14 + +notes: | + Multi-machine Sinclair emulator. Every ROM is read from disk at run time; + none is compiled into the binary. `rom_load` (cpu.c:3158-3751) maps + `current_machine_type` to a filename through a switch, then resolves it with + `find_sharedfile` (utils.c:1310-1348), which searches the current directory, + `../Resources/`, `INSTALL_PREFIX/share/zesarux/` and the directory holding the + binary, in that order. + + ZEsarUX ships these files and installs them next to the binary: `configure:1909` + lists `*.rom`, `zxuno.flash`, `zxmmcplus.flash`, `tbblue.mmc`, `pcw_8x_boot*dsk`, + `mantransfev3.bin` and `alternate_roms` in COMMONFILES. A normal install + therefore already carries every entry below, which is why they are marked + `bundled: true`. + + A missing machine ROM is not fatal: `rom_load` logs an error and returns + (cpu.c:3420-3428), the panic having been removed deliberately. The machine then + runs on uninitialised memory, so the ROMs the switch names are marked required + for the machine they serve. The one hard failure is `prism_failsafe.rom`, which + `prism_load_failsafe_rom` loads through its own path and which calls `cpu_panic` + when missing or short (machines/prism.c:581-590). + + The emulator verifies no hash on any of these files. It does check size: the + machine ROMs are compared against `get_rom_size` (utils.c:3514-3588) and the + interface ROMs against their own `*_ROM_SIZE` constants, with a mismatch logged + as an error. `validation: [size]` is set only where the code makes that + comparison. + + `--romfile` (start.c:998) overrides the machine ROM with any file the user + picks (cpu.c:3410-3413); the ROMs under `alternate_roms/` and the extra + variants in the install root exist for that path and are documented in the + shipped ALTERNATEROMS file. Interface ROMs are equally overridable + (`--divide-rom`, `--divmmc-rom`, `--dandanator-rom`, `--ifrom-rom`, + `--kartusho-rom`), and each falls back to the bundled default named here. + + ES-DE drives ZEsarUX for its `zxnext` system with `--machine tbblue + --tbblue-fast-boot-mode --enable-esxdos-handler`. Fast boot swaps + `tbblue_loader.rom` for `48.rom` (cpu.c:3263-3264), and the esxdos handler needs + the divMMC firmware `esxmmc085.rom`, so that path loads `48.rom`, `esxmmc085.rom` + and the `tbblue.mmc` card image rather than a dedicated Next ROM. + + ZEsarUX also loads UI and bundled-software resources through the same + `find_sharedfile` path: `keyboards/*.bmp` on-screen keyboard art + (menu/menu_items.c:19210, 21731, 21752), `z88_shortcuts.bmp` + (video/screen.c:11078) and the `my_soft/` homebrew collection + (menu/menu_items.c:32146, 32205; menu/menu_items_storage.c:582). They are + application resources rather than system firmware and carry no entry below. + `PrismChime.bin` sits in the source tree but no code reads it and COMMONFILES + does not install it. + +files: + # ============================================================ + # ZX Spectrum and clones - machine ROMs + # rom_load switch, cpu.c:3166-3406 + # ============================================================ + + - name: "48.rom" + size: 16384 + validation: [size] + required: true + bundled: true + system: sinclair-zx-spectrum + fast_boot: "tbblue" + source_ref: "cpu.c:3168-3177 (16K/48K, CZ 2000, CZ Spectrum), cpu.c:3263 (tbblue fast boot), utils.c:3528 (size)" + note: "48K BASIC. Also loaded four times over as the TBBlue fast-boot image (cpu.c:3543-3551)." + + - name: "48es.rom" + size: 16384 + validation: [size] + required: true + bundled: true + system: sinclair-zx-spectrum + source_ref: "cpu.c:3267-3268, utils.c:3528" + note: "Spanish 48K+ ROM, selected for MACHINE_ID_SPECTRUM_48_PLUS_SPA." + + - name: "inves.rom" + size: 16384 + validation: [size] + required: true + bundled: true + system: sinclair-zx-spectrum + source_ref: "cpu.c:3179-3181, utils.c:3528" + note: "Investronica Inves Spectrum+. Loaded at memoria_spectrum[65536] (cpu.c:3441-3447)." + + - name: "128.rom" + size: 32768 + validation: [size] + required: true + bundled: true + system: sinclair-zx-spectrum + source_ref: "cpu.c:3202-3203, utils.c:3530" + + - name: "128s.rom" + size: 32768 + validation: [size] + required: true + bundled: true + system: sinclair-zx-spectrum + source_ref: "cpu.c:3206-3207, utils.c:3530" + + - name: "p2.rom" + size: 32768 + validation: [size] + required: true + bundled: true + system: sinclair-zx-spectrum + source_ref: "cpu.c:3213-3214, utils.c:3530" + note: "ZX Spectrum +2." + + - name: "p2f.rom" + size: 32768 + validation: [size] + required: true + bundled: true + system: sinclair-zx-spectrum + source_ref: "cpu.c:3217-3218, utils.c:3530" + + - name: "p2s.rom" + size: 32768 + validation: [size] + required: true + bundled: true + system: sinclair-zx-spectrum + source_ref: "cpu.c:3221-3222, utils.c:3530" + + - name: "p2a40.rom" + size: 65536 + validation: [size] + required: true + bundled: true + system: sinclair-zx-spectrum + source_ref: "cpu.c:3227-3229, utils.c:3532" + note: "+2A/+3 ROM v4.0." + + - name: "p2a41.rom" + size: 65536 + validation: [size] + required: true + bundled: true + system: sinclair-zx-spectrum + source_ref: "cpu.c:3232-3234, utils.c:3532" + note: "+2A/+3 ROM v4.1." + + - name: "p2as.rom" + size: 65536 + validation: [size] + required: true + bundled: true + system: sinclair-zx-spectrum + source_ref: "cpu.c:3237-3239, utils.c:3532" + + - name: "pentagon.rom" + size: 32768 + validation: [size] + required: true + bundled: true + system: sinclair-zx-spectrum + source_ref: "cpu.c:3271-3272, utils.c:3530 (MACHINE_IS_SPECTRUM_128_P2 covers Pentagon, cpu.h:545)" + + - name: "se.rom" + size: 32768 + validation: [size] + required: true + bundled: true + system: sinclair-zx-spectrum + source_ref: "cpu.c:3247-3249, utils.c:3536" + note: "Chloe 140SE/280SE, SE Basic IV." + + - name: "chrome.rom" + size: 65536 + validation: [size] + required: true + bundled: true + system: sinclair-zx-spectrum + source_ref: "cpu.c:3296-3297, utils.c:3542" + + - name: "prism.rom" + size: 327680 + validation: [size] + required: true + bundled: true + system: sinclair-zx-spectrum + source_ref: "cpu.c:3258-3259, utils.c:3538" + note: "20 pages of 16K. Page map documented at cpu.c:3512-3528." + + - name: "prism_failsafe.rom" + size: 16384 + validation: [size] + required: true + bundled: true + system: sinclair-zx-spectrum + source_ref: "machines/prism.h:61, machines/prism.c:581-590, cpu.c:3536" + note: "Loaded straight after prism.rom by prism_load_failsafe_rom(). The only ROM whose absence is fatal: the loader calls cpu_panic both when the file is missing and when the read is not 16384 bytes." + + - name: "zxuno_bootloader.rom" + size: 8126 + required: true + bundled: true + system: sinclair-zx-spectrum + source_ref: "cpu.c:3243-3244, cpu.c:3486-3490" + size_note: "Read caps at 8192 bytes and only errors when fewer than 1 byte is read, so no exact size check. get_rom_size returns 214 for ZX-Uno (utils.c:3534) but that value is unused on this path." + + - name: "zxevo_tsconf.rom" + size: 524288 + validation: [size] + required: true + bundled: true + system: sinclair-zx-spectrum + source_ref: "cpu.c:3300-3301, utils.c:3544" + + - name: "zxevo_baseconf.rom" + size: 524288 + validation: [size] + required: true + bundled: true + system: sinclair-zx-spectrum + source_ref: "cpu.c:3304-3305, utils.c:3546" + + # ============================================================ + # ZX Spectrum Next (TBBlue) + # ============================================================ + + - name: "tbblue_loader.rom" + size: 8192 + validation: [size] + required: true + bundled: true + system: sinclair-zx-spectrum-next + source_ref: "cpu.c:3262-3264, cpu.c:3553-3559, utils.c:3540" + note: "FPGA loader, mirrored to 16K at cpu.c:3555. Bypassed when --tbblue-fast-boot-mode selects 48.rom instead." + + - name: "tbblue.mmc" + size: 67108864 + required: false + bundled: true + system: sinclair-zx-spectrum-next + source_ref: "menu/menu_items_storage.c:12144-12155, configure:1909" + note: "SD card image carrying the Next system software. Assigned as MMC card 0 by the local-tbblue menu action; the emulator reports 'tbblue.mmc image not found' when absent." + size_note: "64 MB, so it needs storage: large_file once the image is acquired and uploaded as a release asset." + + # ============================================================ + # Microdigital and Czerweny Spectrum clones + # ============================================================ + + - name: "tk90x.rom" + size: 16384 + validation: [size] + required: true + bundled: true + system: sinclair-zx-spectrum + source_ref: "cpu.c:3184-3185, utils.c:3528" + + - name: "tk90xs.rom" + size: 16384 + validation: [size] + required: true + bundled: true + system: sinclair-zx-spectrum + source_ref: "cpu.c:3188-3189, utils.c:3528" + + - name: "tk95.rom" + size: 16384 + validation: [size] + required: true + bundled: true + system: sinclair-zx-spectrum + source_ref: "cpu.c:3192-3193, utils.c:3528" + + - name: "tk95es.rom" + size: 16384 + validation: [size] + required: true + bundled: true + system: sinclair-zx-spectrum + source_ref: "cpu.c:3196-3197, utils.c:3528" + + # ============================================================ + # Timex + # ============================================================ + + - name: "tc2048.rom" + size: 16384 + validation: [size] + required: true + bundled: true + system: timex-tc2048 + source_ref: "cpu.c:3308-3309, utils.c:3528 (TC2048 falls under MACHINE_IS_SPECTRUM_16_48, cpu.h:543)" + + - name: "ts2068.rom" + size: 24576 + validation: [size] + required: true + bundled: true + system: timex-ts2068 + source_ref: "cpu.c:3253-3255, cpu.c:3589-3600, utils.c:3548" + note: "Read as two blocks: 16384 into the main ROM table, then 8192 into the EX ROM table. Serves TS2068 and TC2068." + + - name: "ts1500.rom" + size: 8192 + validation: [size] + required: true + bundled: true + system: timex-ts1500 + source_ref: "cpu.c:3332-3334, utils.c:3564" + + # ============================================================ + # ZX80 / ZX81 family + # ============================================================ + + - name: "zx80.rom" + size: 4096 + size_options: [4096, 8192] + validation: [size] + required: true + bundled: true + system: sinclair-zx80 + source_ref: "cpu.c:3312-3317, cpu.c:3644-3654, utils.c:3560" + note: "Serves ZX80, TK80 and TK82. An 8192-byte file is accepted as-is so the ZX81 ROM can run on a ZX80 (cpu.c:3648)." + + - name: "zx81.rom" + size: 8192 + validation: [size] + required: true + bundled: true + system: sinclair-zx81 + source_ref: "cpu.c:3319-3330, utils.c:3564" + note: "Serves ZX81, Timex TS1000, TK82C, TK83 and the Czerweny CZ 1000/1500 models." + + - name: "tk85.rom" + size: 10240 + validation: [size] + required: true + bundled: true + system: microdigital-tk85 + source_ref: "cpu.c:3338-3340, utils.c:3562" + note: "The TK85 test precedes the generic ZX81 test in get_rom_size, so 10240 wins over 8192." + + - name: "zxpand_zx81.rom" + size: 8192 + validation: [size] + required: false + bundled: true + system: sinclair-zx81 + source_ref: "storage/zxpand.c:71, storage/zxpand.c:240, storage/zxpand.c:246-254" + note: "ZXpand interface firmware. A short read disables ZXpand emulation." + + - name: "zxpand_zx80.rom" + size: 8192 + validation: [size] + required: false + bundled: true + system: sinclair-zx80 + source_ref: "storage/zxpand.c:72, storage/zxpand.c:240, storage/zxpand.c:246-254" + + - name: "ace.rom" + size: 8192 + validation: [size] + required: true + bundled: true + system: jupiter-ace + source_ref: "cpu.c:3344-3346, utils.c:3566" + + # ============================================================ + # Sinclair QL, Cambridge Z88, MK14 + # ============================================================ + + - name: "ql_js.rom" + size: 49152 + min_size: 16384 + validation: [size] + required: true + bundled: true + system: sinclair-ql + source_ref: "cpu.c:3379-3380, cpu.c:3719-3728" + size_note: "Reads up to 131072 bytes and errors only below 16384, so the check is a minimum rather than an exact size." + + - name: "ql_jm.rom" + size: 49152 + required: false + bundled: true + system: sinclair-ql + source_ref: "cpu.c:3383 (commented alternative), start.c:998" + note: "JM release. Reachable through --romfile; the switch selects ql_js.rom." + + - name: "Z88OZ47.rom" + size: 524288 + required: true + bundled: true + system: cambridge-z88 + source_ref: "cpu.c:3350-3352, cpu.c:3675-3685" + size_note: "Reads up to 512K and errors only when nothing is read; z88_internal_rom_size is derived from the byte count, so any size is accepted." + + - name: "mk14.rom" + size: 512 + validation: [size] + required: true + bundled: true + system: science-of-cambridge-mk14 + source_ref: "cpu.c:3386-3387, utils.c:3578" + + # ============================================================ + # Amstrad CPC and PCW + # ============================================================ + + - name: "cpc464.rom" + size: 32768 + validation: [size] + required: true + bundled: true + system: amstrad-cpc + source_ref: "cpu.c:3358-3363, utils.c:3570" + note: "Serves CPC 464 and CPC 4128." + + - name: "cpc664.rom" + size: 49152 + validation: [size] + required: true + bundled: true + system: amstrad-cpc + source_ref: "cpu.c:3366-3367, utils.c:3572" + + - name: "cpc6128.rom" + size: 49152 + validation: [size] + required: true + bundled: true + system: amstrad-cpc + source_ref: "cpu.c:3370-3371, utils.c:3572" + + - name: "pcw_boot.rom" + size: 275 + validation: [size] + required: true + bundled: true + system: pcw + source_ref: "cpu.c:3390-3396, cpu.c:3740-3746, utils.c:3580" + note: "Boot block the PCW pulls into RAM rather than a mapped ROM (cpu.c:3739). Serves PCW 8256 and 8512." + + - name: "pcw_8x_boot1.dsk" + size: 194864 + required: false + bundled: true + system: pcw + source_ref: "machines/pcw.c:1431-1469" + note: "LocoScript boot disc, inserted by pcw_boot_locoscript()." + + - name: "pcw_8x_boot2.dsk" + size: 194864 + required: false + bundled: true + system: pcw + source_ref: "machines/pcw.c:1431-1474" + note: "CP/M boot disc, inserted by pcw_boot_cpm() with boot end address 0x607." + + # ============================================================ + # SAM Coupe + # ============================================================ + + - name: "samcoupe.rom" + size: 32768 + validation: [size] + required: true + bundled: true + system: sam-coupe + source_ref: "cpu.c:3374-3376, utils.c:3574" + + - name: "atomlite.rom" + size: 32768 + validation: [size] + required: false + bundled: true + system: sam-coupe + source_ref: "cpu.c:3375, utils.c:3574" + note: "Replaces samcoupe.rom when Atom Lite emulation is on." + + - name: "samram.rom" + size: 32768 + validation: [size] + required: false + bundled: true + system: sinclair-zx-spectrum + source_ref: "storage/samram.c:46, storage/samram.c:482-484, storage/samram.c:497-500" + note: "SamRam interface firmware, opened from a path the user selects." + + - name: "samram_eng.rom" + size: 32768 + validation: [size] + required: false + bundled: true + system: sinclair-zx-spectrum + source_ref: "storage/samram.c:482-484, storage/samram.c:497-500" + note: "English SamRam firmware, same user-selected path." + + # ============================================================ + # Consoles and other 8-bit machines + # ============================================================ + + - name: "coleco.rom" + size: 8192 + validation: [size] + required: true + bundled: true + system: colecovision + source_ref: "cpu.c:3275-3276, utils.c:3550" + + - name: "sg1000.rom" + size: 155 + required: true + bundled: true + system: sg-1000 + source_ref: "cpu.c:3279-3280, cpu.c:3613-3617" + size_note: "Nothing is read from this file. The SG-1000 branch is empty and the source comment states the file only has to exist for the open to succeed." + + - name: "sms.rom" + size: 8192 + validation: [size] + required: true + bundled: true + system: sega-mastersystem + source_ref: "cpu.c:3283-3284, utils.c:3554" + + - name: "msx.rom" + size: 32768 + validation: [size] + required: true + bundled: true + system: msx + source_ref: "cpu.c:3287-3288, utils.c:3556" + + - name: "svi.rom" + size: 32768 + validation: [size] + required: true + bundled: true + system: spectravideo + source_ref: "cpu.c:3291-3293, utils.c:3558" + note: "Serves SVI-318 and SVI-328." + + # ============================================================ + # Storage interfaces + # ============================================================ + + - name: "esxmmc085.rom" + size: 8192 + validation: [size] + required: false + bundled: true + system: sinclair-zx-spectrum + source_ref: "storage/divmmc.c:45, storage/divmmc.c:95-103, storage/diviface.h:27, storage/diviface.c:758-765" + note: "divMMC esxdos firmware, the default when --divmmc-rom is unset. Needed by --enable-esxdos-handler, which the ES-DE zxnext command line sets." + + - name: "esxide085.rom" + size: 8192 + validation: [size] + required: false + bundled: true + system: sinclair-zx-spectrum + source_ref: "storage/divide.c:40, storage/divide.c:93, storage/diviface.h:27, storage/diviface.c:758-765" + note: "divIDE esxdos firmware, the default when --divide-rom is unset." + + - name: "unodos3.rom" + size: 8192 + validation: [size] + required: false + bundled: true + system: sinclair-zx-spectrum + source_ref: "storage/divmmc.c:96-99, storage/diviface.h:27, storage/diviface.c:758-765" + note: "divMMC firmware substituted for esxmmc085.rom on Chloe machines." + + - name: "trdos.rom" + size: 16384 + validation: [size] + required: false + bundled: true + system: sinclair-zx-spectrum + source_ref: "storage/betadisk.c:67, storage/betadisk.c:400, storage/betadisk.h:27, storage/betadisk.c:409-416" + note: "Beta Disk / TR-DOS firmware." + + - name: "if1-v1.rom" + size: 8192 + size_options: [8192, 16384] + validation: [size] + required: false + bundled: true + system: sinclair-zx-spectrum + source_ref: "storage/if1.c:57, storage/if1.c:336-340, storage/if1.c:369, storage/if1.c:381" + note: "Interface 1 firmware version 1, selected when if1_rom_version is 1. The load accepts 8192 or 16384 bytes and disables Interface 1 emulation otherwise." + + - name: "if1-v2.rom" + size: 8192 + size_options: [8192, 16384] + validation: [size] + required: false + bundled: true + system: sinclair-zx-spectrum + source_ref: "storage/if1.c:58, storage/if1.c:336-340, storage/if1.c:369, storage/if1.c:381" + note: "Interface 1 firmware version 2, the default branch of if1_return_rom_name()." + + - name: "hilow_datadrive.rom" + size: 8192 + validation: [size] + required: false + bundled: true + system: sinclair-zx-spectrum + source_ref: "storage/hilow_datadrive.h:27, storage/hilow_datadrive.h:30, storage/hilow_datadrive.c:1722" + note: "HiLow Data Drive firmware." + + - name: "zxmmcplus.flash" + size: 1048576 + validation: [size] + required: false + bundled: true + system: sinclair-zx-spectrum + source_ref: "storage/zxmmcplus.h:30, start.c:1690, storage/zxmmcplus.c:756, storage/zxmmcplus.c:768-775" + note: "ZXMMC+ flash ROM image, the default for --zxmmcplus-flash-file." + size_note: "The image holds ROM and RAM together, so the check is ZXMMCPLUS_FLASHROM_SIZE + ZXMMCPLUS_RAM_SIZE, not the 512K ROM constant alone." + + - name: "zxuno.flash" + size: 4194304 + validation: [size] + required: false + bundled: true + system: sinclair-zx-spectrum + source_ref: "machines/zxuno.h:29, machines/zxuno.h:80, start.c:1712, cpu.c:3494, machines/zxuno.c:1198-1205" + note: "ZX-Uno SPI flash image, loaded by zxuno_load_spi_flash() right after the bootloader. Default for --zxunospifile. ZXUNO_SPI_SIZE is 4096 KB." + + # ============================================================ + # Copier and utility interfaces + # ============================================================ + + - name: "mf1.rom" + size: 8192 + validation: [size] + required: false + bundled: true + system: sinclair-zx-spectrum + source_ref: "copy_interfaces/multiface.c:224, copy_interfaces/multiface.c:232-242, menu/menu_items.c:41985-41988" + note: "Multiface One. The file selector rejects anything that is not exactly 8 KB." + + - name: "mf128.rom" + size: 8192 + validation: [size] + required: false + bundled: true + system: sinclair-zx-spectrum + source_ref: "copy_interfaces/multiface.c:224, copy_interfaces/multiface.c:232-242, menu/menu_items.c:41985-41988" + note: "Multiface 128." + + - name: "mf3.rom" + size: 8192 + validation: [size] + required: false + bundled: true + system: sinclair-zx-spectrum + source_ref: "copy_interfaces/multiface.c:224, copy_interfaces/multiface.c:232-242, menu/menu_items.c:41985-41988" + note: "Multiface 3." + + - name: "specmate.rom" + size: 8192 + validation: [size] + required: false + bundled: true + system: sinclair-zx-spectrum + source_ref: "copy_interfaces/specmate.h:27, copy_interfaces/specmate.h:29, copy_interfaces/specmate.c:189-205" + + - name: "phoenix3.rom" + size: 16384 + validation: [size] + required: false + bundled: true + system: sinclair-zx-spectrum + source_ref: "copy_interfaces/phoenix.h:27, copy_interfaces/phoenix.h:29, copy_interfaces/phoenix.c:142" + + - name: "defcon.rom" + size: 16384 + validation: [size] + required: false + bundled: true + system: sinclair-zx-spectrum + source_ref: "copy_interfaces/defcon.h:27, copy_interfaces/defcon.h:29, copy_interfaces/defcon.c:139" + + - name: "dinamid3.rom" + size: 2048 + validation: [size] + required: false + bundled: true + system: sinclair-zx-spectrum + source_ref: "copy_interfaces/dinamid3.h:27, copy_interfaces/dinamid3.h:29, copy_interfaces/dinamid3.c:142" + + - name: "interface007.rom" + size: 2048 + validation: [size] + required: false + bundled: true + system: sinclair-zx-spectrum + source_ref: "copy_interfaces/interface007.h:27, copy_interfaces/interface007.h:29, copy_interfaces/interface007.c:143" + + - name: "ramjet2.rom" + size: 16384 + validation: [size] + required: false + bundled: true + system: sinclair-zx-spectrum + source_ref: "copy_interfaces/ramjet.h:27, copy_interfaces/ramjet.h:28-30, copy_interfaces/ramjet.c:165" + + - name: "ramjet3.rom" + size: 16384 + validation: [size] + required: false + bundled: true + system: sinclair-zx-spectrum + source_ref: "copy_interfaces/ramjet.h:28, copy_interfaces/ramjet.c:165" + + - name: "transtape2.rom" + size: 16384 + validation: [size] + required: false + bundled: true + system: sinclair-zx-spectrum + source_ref: "copy_interfaces/transtape.h:27, copy_interfaces/transtape.h:31, copy_interfaces/transtape.c:354, copy_interfaces/transtape.c:360" + note: "Selected when transtape_version is 2." + + - name: "transtape3-vC.rom" + size: 16384 + validation: [size] + required: false + bundled: true + system: sinclair-zx-spectrum + source_ref: "copy_interfaces/transtape.h:28, copy_interfaces/transtape.c:355, copy_interfaces/transtape.c:360" + note: "Default for Transtape version 3." + + - name: "transtape3-vA.rom" + size: 16384 + validation: [size] + required: false + bundled: true + system: sinclair-zx-spectrum + source_ref: "copy_interfaces/transtape.c:349-350, copy_interfaces/transtape.c:360-375" + note: "Revision A, reached through the user-set transtape_rom_filename and loaded by the same size-checked path as the defaults." + + - name: "transtape3-vB.rom" + size: 16384 + validation: [size] + required: false + bundled: true + system: sinclair-zx-spectrum + source_ref: "copy_interfaces/transtape.c:349-350, copy_interfaces/transtape.c:360-375" + note: "Revision B, reached through the user-set transtape_rom_filename." + + - name: "hilow_barbanegra.rom" + size: 8192 + validation: [size] + required: false + bundled: true + system: sinclair-zx-spectrum + source_ref: "copy_interfaces/hilow_barbanegra.h:27, copy_interfaces/hilow_barbanegra.h:30, copy_interfaces/hilow_barbanegra.c:282" + + - name: "mhpokeador.rom" + size: 1024 + validation: [size] + required: false + bundled: true + system: sinclair-zx-spectrum + source_ref: "copy_interfaces/mhpokeador.h:27, copy_interfaces/mhpokeador.h:39, copy_interfaces/mhpokeador.c:264" + + - name: "mhpokeador-transfer.rom" + size: 1024 + validation: [size] + required: false + bundled: true + system: sinclair-zx-spectrum + source_ref: "copy_interfaces/mhpokeador.h:28, copy_interfaces/mhpokeador.c:264" + + - name: "mhpokeador-salvapan.rom" + size: 1024 + validation: [size] + required: false + bundled: true + system: sinclair-zx-spectrum + source_ref: "copy_interfaces/mhpokeador.h:29, copy_interfaces/mhpokeador.c:264" + + - name: "mantransfev3.bin" + size: 200 + required: false + bundled: true + system: sinclair-zx-spectrum + source_ref: "menu/menu_items.c:41529-41545" + note: "Spectrum program the emulator injects to dump RAM to tape." + + # ============================================================ + # Sound + # ============================================================ + + - name: "gs105a.rom" + size: 32768 + validation: [size] + required: false + bundled: true + system: sinclair-zx-spectrum + source_ref: "soundchips/gs.h:34, soundchips/gs.h:29, soundchips/gs.c:525-545" + note: "General Sound firmware v1.05a. GS_ROM_SIZE is in KB and the read is GS_ROM_SIZE*1024." + + - name: "gs104.rom" + size: 32768 + required: false + bundled: true + system: sinclair-zx-spectrum + source_ref: "configure:1909" + note: "General Sound firmware v1.04. Shipped alongside gs105a.rom, but GS_ROM_NAME is fixed and there is no option to point the loader elsewhere, so it is usable only in place of gs105a.rom." + + # ============================================================ + # Alternate machine ROMs, selectable with --romfile (start.c:998, + # loaded at cpu.c:3410-3413). Documented in the shipped ALTERNATEROMS. + # ============================================================ + + - name: "80-lec.rom" + size: 16384 + required: false + bundled: true + system: sinclair-zx-spectrum + source_ref: "start.c:998, cpu.c:3410-3413" + + - name: "tk90x_v1br.rom" + size: 16384 + required: false + bundled: true + system: sinclair-zx-spectrum + source_ref: "ALTERNATEROMS:97, start.c:998, cpu.c:3410-3413" + + - name: "tk90x_v2es.rom" + size: 16384 + required: false + bundled: true + system: sinclair-zx-spectrum + source_ref: "ALTERNATEROMS:98, start.c:998, cpu.c:3410-3413" + note: "Corrected TK90X ROM." + + - name: "tk95es_modif.rom" + size: 16384 + required: false + bundled: true + system: sinclair-zx-spectrum + source_ref: "ALTERNATEROMS:101-106, start.c:998, cpu.c:3410-3413" + note: "TK95 Spanish ROM with message and symbol fixes by Rodolfo Edison Guerra." + + - name: "Z88OZ431.rom" + size: 524288 + required: false + bundled: true + system: cambridge-z88 + source_ref: "ALTERNATEROMS:83-92, start.c:998" + + - name: "Z88OZ441.rom" + size: 524288 + required: false + bundled: true + system: cambridge-z88 + source_ref: "ALTERNATEROMS:83-92, start.c:998" + + - name: "Z88OZ45.rom" + size: 524288 + required: false + bundled: true + system: cambridge-z88 + source_ref: "ALTERNATEROMS:83-92, start.c:998" + + - name: "Z88OZ46.rom" + size: 524288 + required: false + bundled: true + system: cambridge-z88 + source_ref: "ALTERNATEROMS:83-92, start.c:998" + + - name: "Z88UK220.rom" + size: 131072 + required: false + bundled: true + system: cambridge-z88 + source_ref: "ALTERNATEROMS:83-92, start.c:998" + + - name: "Z88UK300.rom" + size: 131072 + required: false + bundled: true + system: cambridge-z88 + source_ref: "ALTERNATEROMS:83-92, start.c:998" + + - name: "Z88UK400.rom" + size: 131072 + required: false + bundled: true + system: cambridge-z88 + source_ref: "ALTERNATEROMS:83-92, start.c:998" + + - name: "aszmice07.rom" + path: "alternate_roms/aszmice07.rom" + size: 8192 + required: false + bundled: true + system: sinclair-zx81 + source_ref: "ALTERNATEROMS:4-5, start.c:998" + note: "ASZMIC E07 replacement ROM with assembler and debugger. The 4K image is stored twice to reach 8K." + + - name: "sp-rom.rom" + path: "alternate_roms/sp-rom.rom" + size: 4096 + required: false + bundled: true + system: sinclair-zx81 + source_ref: "ALTERNATEROMS:7-9, start.c:998" + note: "Comprocsys SP ROM add-on card, loaded at address 2000H." + + - name: "ace.rom" + path: "alternate_roms/ace.rom" + size: 8192 + required: false + bundled: true + system: jupiter-ace + variant_group: "jupiter-ace-rom" + source_ref: "ALTERNATEROMS:11-12, start.c:998" + note: "Jupiter Ace ROM patched by Dutra Lacerda, distinct from the root ace.rom." + + - name: "opense.rom" + path: "alternate_roms/opense.rom" + size: 16384 + required: false + bundled: true + system: sinclair-zx-spectrum + source_ref: "ALTERNATEROMS:14-15, start.c:998" + note: "OpenSE BASIC 3.1.2 for the 48K." + + - name: "sebasic4_rom1.rom" + path: "alternate_roms/sebasic4_rom1.rom" + size: 16384 + required: false + bundled: true + system: sinclair-zx-spectrum + source_ref: "ALTERNATEROMS:18-19, start.c:998" + note: "SE BASIC 4.1.0 standalone ROM 1 for the 48K." + + - name: "derby_p_32K.rom" + path: "alternate_roms/derby_p_32K.rom" + size: 32768 + required: false + bundled: true + system: sinclair-zx-spectrum + source_ref: "ALTERNATEROMS:21-23, start.c:998" + note: "Derby+ for 128K machines with 32K of ROM." + + - name: "derby_pp_64K.rom" + path: "alternate_roms/derby_pp_64K.rom" + size: 65536 + required: false + bundled: true + system: sinclair-zx-spectrum + source_ref: "ALTERNATEROMS:21-23, start.c:998" + note: "Derby++ for 128K machines with 64K of ROM." + + - name: "plus2c.rom" + path: "alternate_roms/plus2c.rom" + size: 32768 + required: false + bundled: true + system: sinclair-zx-spectrum + source_ref: "ALTERNATEROMS:40-41, start.c:998" + note: "Unofficial +2C ROM by Andrew Owen, for 128K/+2." + + - name: "plus2b.rom" + path: "alternate_roms/plus2b.rom" + size: 65536 + required: false + bundled: true + system: sinclair-zx-spectrum + source_ref: "ALTERNATEROMS:46-76, start.c:998" + note: "+2B ROM set for +2A/+3: 128 editor, 48K BASIC, BBC BASIC, OpenSE BASIC 3.1.1." + + - name: "plus3e_mmcen3eE.rom" + path: "alternate_roms/plus3e_mmcen3eE.rom" + size: 65536 + required: false + bundled: true + system: sinclair-zx-spectrum + source_ref: "menu/menu_items.c:30627-30630, ALTERNATEROMS:26-30" + note: "+3e v1.38 English for MMC. Resolved by name through find_sharedfile for the +2e/+3e MMC machine preset." + + - name: "plus3e_mmces3eE.rom" + path: "alternate_roms/plus3e_mmces3eE.rom" + size: 65536 + required: false + bundled: true + system: sinclair-zx-spectrum + source_ref: "ALTERNATEROMS:26-30, start.c:998" + note: "+3e v1.38 Spanish for MMC." + + - name: "plus3e_sm8en3eE.rom" + path: "alternate_roms/plus3e_sm8en3eE.rom" + size: 65536 + required: false + bundled: true + system: sinclair-zx-spectrum + source_ref: "ALTERNATEROMS:32-36, start.c:998" + note: "+3e v1.38 English for simple 8-bit IDE." + + - name: "plus3e_sm8es3eE.rom" + path: "alternate_roms/plus3e_sm8es3eE.rom" + size: 65536 + required: false + bundled: true + system: sinclair-zx-spectrum + source_ref: "ALTERNATEROMS:32-36, start.c:998" + note: "+3e v1.38 Spanish for simple 8-bit IDE."