From 1fb7b1572e1683ba0a6548dcd181c2f789f3b40c Mon Sep 17 00:00:00 2001 From: Abdessamad Derraz <3028866+Abdess@users.noreply.github.com> Date: Sat, 17 Oct 2026 13:40:17 +0200 Subject: [PATCH] feat: profile geartowns, coolbaremu and xenia_edge The buildbot publishes four cores no profile named. Geartowns (FM Towns) and CoolbarEmu get profiles read from their source, Xenia Edge gains its libretro build, and pokketstation follows its repository's rename to Pokket, re-read at HEAD. --- emulators/coolbaremu.yml | 44 +++++++++++ emulators/geartowns.yml | 150 ++++++++++++++++++++++++++++++++++++ emulators/pokketstation.yml | 69 +++++++++-------- emulators/xenia-edge.yml | 66 ++++++++++++---- 4 files changed, 286 insertions(+), 43 deletions(-) create mode 100644 emulators/coolbaremu.yml create mode 100644 emulators/geartowns.yml 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]