diff --git a/emulators/coolbaremu.yml b/emulators/coolbaremu.yml new file mode 100644 index 00000000..fcd1c24d --- /dev/null +++ b/emulators/coolbaremu.yml @@ -0,0 +1,44 @@ +emulator: "CoolbarEmu" +type: libretro +core_classification: official_port +source: "https://github.com/AloysHF/CoolbarEmu" +upstream: "https://github.com/AloysHF/CoolbarEmu" +profiled_date: "2026-10-17" +source_commit: "88e90440daab0bdc7bc141728b51841e0c730528" +core_version: "0.2.0" +display_name: "Coolbar (CoolbarEmu)" +cores: + - "coolbaremu" +systems: + - "coolbar" + +notes: | + Emulator for Coolbar/CBE applications of Chinese feature phones, written + in Rust. The workspace builds a standalone binary (crates/coolbaremu) and + the libretro core (crates/coolbaremu-libretro), the buildbot builds the + latter only (Cargo.toml:13). Guest ARM/Thumb code runs on the armv4t_emu + crate and the phone firmware services are reimplemented in + crates/coolbaremu-core/src/machine/services. Text is drawn with the unifont + crate compiled into the core (Cargo.toml:35, + crates/coolbaremu-core/src/machine/drawing.rs:1886). + + The content is read whole by CbeArchive::load() + (crates/coolbaremu-core/src/cbe/archive.rs:68-73). Files next to the .cbe + (pay kernels, records, update data) are indexed as the guest filesystem + (crates/coolbaremu-core/src/machine/mod.rs:1022-1024, + crates/coolbaremu-core/src/machine/virtual_fs.rs:58-103); they belong to + the game. + + The only system directory read is coolbaremu_orientation.csv, an optional + user list of CRC32, size and orientation for landscape titles missing from + the built-in table (crates/coolbaremu-libretro/src/libretro/api.rs:45, + crates/coolbaremu-libretro/src/libretro/api.rs:369-399, + crates/coolbaremu-core/src/orientation_profile.rs:31-54). A missing file is + logged and the built-in table applies. + +files: [] + +exclusion_note: > + The firmware services are reimplemented in the core and the font is the + embedded unifont crate; the system directory holds only an optional + user-written orientation list. diff --git a/emulators/geartowns.yml b/emulators/geartowns.yml new file mode 100644 index 00000000..5589ade3 --- /dev/null +++ b/emulators/geartowns.yml @@ -0,0 +1,150 @@ +emulator: "Geartowns" +type: libretro +core_classification: official_port +source: "https://github.com/drhelius/Geartowns" +upstream: "https://github.com/drhelius/Geartowns" +profiled_date: "2026-10-17" +source_commit: "25d2025be28e9fcc319f597a516f21e0778f770b" +core_version: "0.0.6-8-g25d2025" +display_name: "Fujitsu - FM Towns (Geartowns)" +cores: + - "geartowns" +systems: + - "fmtowns" + +notes: | + FM Towns emulator by Ignacio Sanchez (drhelius). The same tree builds the + desktop application and the libretro core (platforms/libretro). The core + emulates the Model 1/2, 1F/2F, 10F/20F, II CX, UX, UG, HG and the Marty + (src/system/machine_profiles.h:61-75, `emulated` field). The version string + is `git describe` at build time (platforms/libretro/Makefile:369-371). + + retro_load_game() fails when load_bios() finds no firmware + (platforms/libretro/libretro.cpp:704-708). load_bios() searches + system/geartowns first, then the system directory itself, each time + accepting first only a set made for the selected model and then any set + (platforms/libretro/libretro.cpp:798-825). Firmware::FindSources() takes + as candidates the folder itself, every direct subfolder and every .zip in + it (src/media/firmware.cpp:286-346); folder and zip names are free. A + candidate counts only when the System, OS, Font and Dictionary ROMs are all + present at the right size, and the CRC32 of its System ROM names the set + (src/media/firmware.cpp:375-414, src/media/firmware.h:114-123). + + Six sets are known (src/media/firmware.h:114-123): fmtowns (Model 1/2), + freetowns (Free FM Towns Project replacement ROMs, used by the Model 1/2), + fmtownsux (UX, also used by 1F/2F, 10F/20F, CX and UG), fmtmarty (Marty), + fmtownshr and fmtownsftv (both used by the HG, HR preferred). On Auto the + model comes from the game database and falls back to the Model 1/2 or to + the first model in release order that has a set + (src/geartowns_core.cpp:1624-1649, src/geartowns_core.cpp:1691-1696). A set + made for another model still loads in the second pass, with a warning + (platforms/libretro/libretro.cpp:827-860). + + File names are matched without case, inside a zip only at the archive root + (src/media/firmware.cpp:614-663). Accepted names per component are + FMT_SYS.ROM, FMT_SYS_A.ROM, FMTHR_SYS.ROM; FMT_DOS.ROM, FMT_DOS_A.ROM; + FMT_FNT.ROM; FMT_DIC.ROM; FMT_F20.ROM, FMT_F20_A.ROM; MYTOWNS.ROM, + MYTOWNSUX.ROM, MYTOWNSM2.ROM, MYTOWNSFTV.ROM, MYTOWNSHR.ROM; MAR_EX0.ROM to + MAR_EX3.ROM (src/media/firmware.cpp:28-42). Without separate files the + Marty components are cut from MROM.M36 and MROM.M37, 2 MiB each + (src/media/firmware.cpp:497-508): OS at 0 and the first three extension + parts in M36; the fourth extension part, 20-dot font at 0x80000, + dictionary at 0x100000, font at 0x180000 and System ROM at 0x1C0000 in M37. + + Each component must have its exact size or it is rejected + (src/media/firmware.cpp:530-612, src/common/defines.h:47-54): System + 256 KiB, OS 512 KiB, Font 256 KiB, Dictionary 512 KiB, 20-dot Font 512 KiB, + Serial 32 bytes, Extension 2 MiB (four 512 KiB parts). System, OS, Font and + Dictionary are required; a missing 20-dot Font or Extension is replaced by + 0xFF, a missing Serial ROM is generated (src/media/firmware.cpp:73-163, + src/media/firmware.cpp:258-261). The CRC32 of every component is looked up + in game_db.h (src/media/firmware.cpp:165-182, src/media/game_db.h:303-335); + an unknown CRC only produces a warning. The Free FM Towns set is known by + System 65DC3B1F, OS 43C18E92, Font 736D9CB1 and a blank Dictionary + 504BF849. The Marty slices are known by System 937311F6, OS 2BC2AF96, + Extension E1A9FA72 and 20-dot Font 75660AAC. + + The CMOS is written by the core next to the saves + (platforms/libretro/libretro.cpp:2753-2767); it is state, not a file to + obtain. + +files: + - name: "fmtowns.zip" + description: "FM Towns Model 1/2 firmware set" + system: "fmtowns" + category: bios_zip + path: "geartowns/fmtowns.zip" + required: true + contents: + - { name: "fmt_sys.rom", size: 262144, crc32: "53319e23" } + - { name: "fmt_dos.rom", size: 524288, crc32: "112872ee" } + - { name: "fmt_fnt.rom", size: 262144, crc32: "955c6b75" } + - { name: "fmt_dic.rom", size: 524288, crc32: "b314c659" } + source_ref: "platforms/libretro/libretro.cpp:704-708, platforms/libretro/libretro.cpp:807-825, src/media/firmware.h:116, src/media/firmware.cpp:28-33, src/media/firmware.cpp:286-346, src/media/game_db.h:303-307" + note: > + Set for the Model 1/2, the machine Auto falls back to. The same four + files load from any subfolder of system/geartowns or from + system/geartowns itself. The core has no CRC for a Model 1/2 20-dot + Font; fmt_f20.rom is read when present. + + - name: "fmtownsux.zip" + description: "FM Towns II UX firmware set" + system: "fmtowns" + category: bios_zip + path: "geartowns/fmtownsux.zip" + required: false + contents: + - { name: "fmt_sys_a.rom", size: 262144, crc32: "92f3fa67" } + - { name: "fmt_dos_a.rom", size: 524288, crc32: "22270e9f" } + - { name: "fmt_fnt.rom", size: 262144, crc32: "dd6fd544" } + - { name: "fmt_dic.rom", size: 524288, crc32: "82d1daa2" } + - { name: "mytownsux.rom", size: 32, crc32: "5cc7e6bc" } + source_ref: "src/media/firmware.h:118-119, src/media/firmware.cpp:28-34, src/media/game_db.h:309-314" + note: "Set for the UX, also used by the 1F/2F, 10F/20F, CX and UG." + + - name: "fmtmarty.zip" + description: "FM Towns Marty firmware set" + system: "fmtowns" + category: bios_zip + path: "geartowns/fmtmarty.zip" + required: false + contents: + - { name: "mrom.m36", size: 2097152 } + - { name: "mrom.m37", size: 2097152 } + source_ref: "src/media/firmware.h:120, src/media/firmware.cpp:497-508, src/media/game_db.h:316-320" + note: > + The core checks the CRC32 of the slices it cuts from the two mask + ROMs, not of the files: System 937311F6, OS 2BC2AF96, Extension + E1A9FA72, 20-dot Font 75660AAC. The Marty 2 layout with separate + FMT_*.ROM and MAR_EX0.ROM to MAR_EX3.ROM files is read the same way. + + - name: "fmtownshr.zip" + description: "FM Towns II HR firmware set" + system: "fmtowns" + category: bios_zip + path: "geartowns/fmtownshr.zip" + required: false + contents: + - { name: "fmthr_sys.rom", size: 262144, crc32: "8aeff982" } + - { name: "fmt_dos.rom", size: 524288 } + - { name: "fmt_fnt.rom", size: 262144 } + - { name: "fmt_dic.rom", size: 524288 } + - { name: "mytownshr.rom", size: 32, crc32: "c52f0e89" } + source_ref: "src/media/firmware.h:121, src/media/firmware.cpp:28-34, src/media/game_db.h:322-324" + note: "First choice for the HG; the HR itself is not emulated." + + - name: "fmtownsftv.zip" + description: "FM Towns II Fresh TV firmware set" + system: "fmtowns" + category: bios_zip + path: "geartowns/fmtownsftv.zip" + required: false + contents: + - { name: "fmt_sys.rom", size: 262144, crc32: "afe4ebcf" } + - { name: "fmt_dos.rom", size: 524288 } + - { name: "fmt_fnt.rom", size: 262144 } + - { name: "fmt_dic.rom", size: 524288 } + - { name: "fmt_f20.rom", size: 524288, crc32: "9f55a20c" } + - { name: "mytownsftv.rom", size: 32, crc32: "a961aae7" } + source_ref: "src/media/firmware.h:122, src/media/firmware.cpp:28-34, src/media/game_db.h:326-329" + note: "Second choice for the HG; the MF/Fresh itself is not emulated." diff --git a/emulators/pokketstation.yml b/emulators/pokketstation.yml index ae479433..15f6a9ff 100644 --- a/emulators/pokketstation.yml +++ b/emulators/pokketstation.yml @@ -1,47 +1,56 @@ emulator: pokketstation type: libretro core_classification: official_port -source: "https://github.com/mentalfoundry/pokketstation" -upstream: "https://github.com/mentalfoundry/pokketstation" -profiled_date: "2026-09-17" -source_commit: "484933271b7d362e8e76f1121839c33e5d5ec83e" -core_version: "v1.12" +source: "https://github.com/mentalfoundry/Pokket" +upstream: "https://github.com/mentalfoundry/Pokket" +profiled_date: "2026-10-17" +source_commit: "de736cee392567d58e842f96afe77f707e694ce5" +core_version: "v1.23" display_name: "Sony - PocketStation (pokketstation)" -cores: [pokketstation] +cores: ["pokketstation", "pokket"] systems: [sony-pocketstation] notes: | PocketStation emulator with a portable C core (core/) shared by the libretro - core, an SDL2 desktop application and a PS Vita port. The libretro core - reports library_version "0.1"; the project version is the release tag, - v1.12 in the desktop frontend (frontends/desktop/main.c:40). + core, an SDL2 and Win32 desktop application built on Windows only + (frontends/desktop/CMakeLists.txt:1-16), a PS Vita port and an Emscripten build. + The libretro target is pokket_libretro (frontends/libretro/CMakeLists.txt:10-16). + Both the libretro core and the desktop application report POKKET_VERSION, + v1.23 from the project() line of the root CMakeLists.txt (CMakeLists.txt:4-5, + frontends/libretro/libretro.c:189-196). - load_bios opens /pocketstation.bin, reads 16384 bytes and fails when - fewer are read; a longer file is accepted and truncated. psemu_load_bios - copies the image and rejects any size other than PSEMU_BIOS_SIZE. - retro_load_game returns false when load_bios fails, and psemu_run executes - nothing while no BIOS is loaded: there is no HLE and no embedded copy. - Content (.mcr, .mcd, .mcs, .pss, .bin, .gme) is identified by its bytes, - not by the extension: a 128 KB image is a full card, a 134976-byte file - opening with 123-456-STD is a DexDrive dump whose 3904-byte header is - skipped, anything else is tried as a single save then as a Title Sector - body (core/src/psemu.c:187-209, 301-317). Save RAM is the full 128 KB - flash image. + read_bios opens /pocketstation.bin, reads 16384 bytes and fails when + fewer are read; a longer file is accepted and truncated + (frontends/libretro/libretro.c:545-559). psemu_load_bios copies the image and + rejects any size other than PSEMU_BIOS_SIZE (core/src/psemu.c:92-99). + retro_load_game returns false when read_bios fails, and psemu_run executes + nothing while no BIOS is loaded: there is no HLE and no embedded copy + (frontends/libretro/libretro.c:586-595, core/src/psemu.c:808-812). The IR + Link subsystem runs two units in one core and loads the same file into both + (frontends/libretro/libretro.c:652-693). + Content (.mcr, .mcs, .pss, .mcd, .bin, .gme) is identified by its bytes, + not by the extension: a 128 KB image is a full card, a file opening with + 123-456-STD followed by a whole number of 8 KB blocks up to a full card + is a DexDrive dump whose 3904-byte header is skipped, anything else is tried + as a single save then as a Title Sector body (core/src/psemu.c:113-140, + 211-234, 326-347). Save RAM is the full 128 KB flash image. psemu_settings_offsets_known hashes the loaded image with FNV-1a and compares it with 0xB2E46838, the retail 110 revision the project traced; a match - enables the date, time and volume override writes into kernel RAM. Any - 16 KB image boots. Two mask ROM revisions are documented: 061, from - prototype hardware, and 110, the retail one; the ASCII tags at offsets - 0x1DFC (C061 or C110) and 0x3FFC (J061 or J110) identify them - (docs/hardware-notes.md:782-792). SWI 0Fh FlashWriteSerial works on 061 - and locks the CPU on 110. + enables the date, time and volume override writes into kernel RAM + (core/src/psemu.c:1150-1175). Any 16 KB image boots. Two mask ROM revisions + are documented: 061, from prototype hardware, and 110, the retail one; the + ASCII tags at offsets 0x1DFC (C061 or C110) and 0x3FFC (J061 or J110) + identify them. SWI 0Fh FlashWriteSerial works on 061 and locks the CPU on + 110 (docs/hardware-notes.md:1046-1056). The desktop application takes the BIOS path from the command line, then from the bios= key of settings.cfg beside the executable, then falls back - to bios.bin beside the executable; File > Load BIOS opens any path - (frontends/desktop/main.c:630-668, 1000-1035, 2380-2451). The Vita frontend - loads no BIOS yet (frontends/vita/main.c:31-33). + to bios.bin beside the executable; File > Load BIOS opens any path and + writes it to settings.cfg (frontends/desktop/main.c:653-700, 1216-1254, + 3016-3020, 3071-3091). The Vita frontend loads no BIOS yet + (frontends/vita/main.c:31-33), and the Emscripten build leaves the BIOS to + the hosting page (frontends/web/README.md:35). files: - name: "pocketstation.bin" @@ -50,7 +59,7 @@ files: required: true validation: [size] standalone_path: "bios.bin" - source_ref: "frontends/libretro/libretro.c:178-196, frontends/libretro/libretro.c:206-208, core/src/psemu.c:90-97, core/src/psemu.c:474-477, core/src/psemu.c:854-879, core/include/psemu/psemu.h:19" + source_ref: "frontends/libretro/libretro.c:545-559, frontends/libretro/libretro.c:586-595, core/src/psemu.c:92-99, core/src/psemu.c:808-812, core/src/psemu.c:1150-1175, core/include/psemu/psemu.h:19" note: > Read from the frontend system directory. The desktop application reads the whole file and psemu_load_bios rejects any size other than 16384; diff --git a/emulators/xenia-edge.yml b/emulators/xenia-edge.yml index 3e01bb6e..240e68d9 100644 --- a/emulators/xenia-edge.yml +++ b/emulators/xenia-edge.yml @@ -1,17 +1,23 @@ emulator: Xenia Edge -type: standalone +type: "standalone + libretro" core_classification: community_fork -source: "https://github.com/has207/xenia-edge" +source: + standalone: "https://github.com/has207/xenia-edge" + libretro: "https://git.libretro.com/libretro/xenia-libretro" upstream: "https://github.com/has207/xenia-edge" -source_commit: "fb1c5bf08b16dab5422136c44c593a9f516750f0" -profiled_date: "2026-09-17" -core_version: "edge" +source_commit: + standalone: "fb1c5bf08b16dab5422136c44c593a9f516750f0" + libretro: "552d508a563dec9a6d05042654de9f76f00e9ba5" +profiled_date: "2026-10-17" +core_version: + standalone: "edge" + libretro: "8dc77b0" display_name: "Xenia Edge (Xbox 360)" cores: - - xenia-edge + - "xenia-edge" + - "xenia_edge" systems: - microsoft-xbox-360 -mode: standalone notes: | Xbox 360 emulator forked from Xenia Canary, with a wxWidgets front end, a @@ -21,6 +27,34 @@ notes: | XENIA-EDGE rule and runs `xenia_edge `; RetroDECK unpacks the AppImage into a xenia-edge component and executes bin/xenia_edge. + The libretro core xenia_edge_libretro is built from libretro/xenia-libretro + on git.libretro.com (branch libretro, CORENAME xenia_edge in .gitlab-ci.yml), + mirrored as WizzardSK/xenia-libretro on GitHub. It carries the xenia-edge + tree merged from edge at 8dc77b09, the release named in upstream.version and + reported as library_version (libretro/CMakeLists.txt:74-78, + libretro/libretro.cpp:1906-1909). The core is one shared library linked from + the emulator's static libraries, without the wxWidgets app + (libretro/CMakeLists.txt:1-13, 104-130), and the top-level CMakeLists.txt + defines XENIA_LIBRETRO for every target of the tree. Everything it keeps + is under /Xenia-Edge: storage root, content, cache, xenia.log, and + xbl_profilename.txt, which it creates with "Player" and reads to name the + profile it creates (libretro/libretro.cpp:1476-1503, 1526-1546). The frame + rate unlock list is compiled into the core and written there when missing + (libretro/CMakeLists.txt:15-33, libretro/libretro_gamedb.cc:36-51), and the + bundled patches of the running title are written to Xenia-Edge/patches with + their core option state before Xenia reads that folder at boot + (libretro/libretro.cpp:791-798). It reads no firmware, font or runtime from + disk. Vulkan comes from the frontend's instance + (libretro/libretro_vk_presenter.cc:42-62), Direct3D 12 runs on the system + runtime with the D3D12Core.dll check of d3d12_provider.cc compiled out under + XENIA_LIBRETRO, and the download prompts for missing runtimes are stubbed + out (libretro/libretro_headless_stubs.cc:22-27). + The Windows build embeds bin/x64/dxil.dll of the DXC release as a resource + (libretro/CMakeLists.txt:35-51, .ci/build-windows-cross.sh:61-80) and writes + it to Xenia-Edge/D3D12/dxil.dll when the copy there differs in size, then + points d3d12_runtime_path at that folder, where the D3D12 provider loads it + by full path (libretro/libretro.cpp:1437-1462, 1552-1559). + No Xbox 360 system file is read. xboxkrnl, xam and xbdm are C++ HLE modules registered at startup (src/xenia/emulator.cc:395-404), the XEX2 retail and devkit AES keys are constant arrays in the binary (src/xenia/cpu/xex_module.cc:67-72), and every @@ -77,7 +111,8 @@ notes: | files: # -- Direct3D 12 runtime, Windows only -- - - name: dxil.dll + - name: "dxil.dll" + mode: standalone path: "D3D12/dxil.dll" system: microsoft-xbox-360 required: true @@ -98,9 +133,11 @@ files: v1.9.2602.24, pinned at sha256 cf658aacf070d3045e31b8f1f8a696c2945f37c1095019481ef7c513368db3b4; bin/arm64 on ARM64 builds. It is the single entry the installer extracts - from that archive. + from that archive. The libretro core writes its own embedded copy to + Xenia-Edge/D3D12/ in the system directory and loads it from there. - - name: D3D12Core.dll + - name: "D3D12Core.dll" + mode: standalone path: "D3D12/D3D12Core.dll" system: microsoft-xbox-360 required: true @@ -116,7 +153,8 @@ files: build/native/bin/arm64 on ARM64 builds. The package version has to match the exported number. - - name: D3D12SDKLayers.dll + - name: "D3D12SDKLayers.dll" + mode: standalone path: "D3D12/D3D12SDKLayers.dll" system: microsoft-xbox-360 required: false @@ -130,7 +168,8 @@ files: # -- Vulkan runtime, Windows only -- - - name: vulkan-1.dll + - name: "vulkan-1.dll" + mode: standalone path: "Vulkan/vulkan-1.dll" system: microsoft-xbox-360 required: false @@ -147,7 +186,8 @@ files: # -- Visual C++ runtime, Windows only -- - - name: vc_redist.x64.exe + - name: "vc_redist.x64.exe" + mode: standalone system: microsoft-xbox-360 required: false validation: [signature]