mirror of
https://github.com/Abdess/retroarch_system.git
synced 2026-10-10 13:33:24 -05:00
feat: profile 9 new buildbot cores
This commit is contained in:
1 parent
92b2a1a498
commit
bd90dba630
9 files changed
+2286
No files matched your search
@@ -0,0 +1,54 @@
|
||||
emulator: Eternal Computer
|
||||
type: libretro
|
||||
core_classification: community_fork
|
||||
source: "https://codeberg.org/iyzsong/eternal-libretro"
|
||||
upstream: "https://github.com/adriancable/eternal"
|
||||
source_commit: "13adf143aea822ebc1ee23722a80e93a7979e4c9"
|
||||
upstream_commit: "17c8ab87de7f308f48f4990ed62c48b86173797d"
|
||||
profiled_date: "2026-09-17"
|
||||
core_version: "0.0"
|
||||
display_name: "Eternal Computer"
|
||||
cores:
|
||||
- eternal
|
||||
systems:
|
||||
- eternal-computer
|
||||
|
||||
notes: |
|
||||
Virtual machine for the Eternal Software Initiative architecture, a Subleq
|
||||
variant with indirect operands, a keyboard port, a console port, a wall
|
||||
clock at word 64 and a timer interrupt through word 0. Adrian Cable's
|
||||
reference machines are vm/vm.c (SDL3 framebuffer) and vm/vm_console.c;
|
||||
the libretro core by iyzsong carries the same loop in libretro.c:186-222.
|
||||
|
||||
Machine memory is a static array of 3<<27 words, 1.5 GiB, cleared again
|
||||
when the content is unloaded (libretro.c:360-364); the framebuffer is its
|
||||
last 800x512 words (libretro.c:9-13, 22-23), pushed to the frontend as
|
||||
XRGB8888 on every retro_run (libretro.c:330-334).
|
||||
|
||||
The content is the whole machine image. retro_load_game copies the buffer
|
||||
the frontend hands over to word 0, refuses an image larger than memory and
|
||||
starts the interpreter on a thread (libretro.c:302-314); need_fullpath is
|
||||
false and the accepted extensions are capsule and bootimage
|
||||
(libretro.c:275-282). The upstream machines fread the same file into mem
|
||||
(vm/vm.c:45-48, vm/vm_console.c:32).
|
||||
|
||||
A boot image comes out of tools/make_boot_image.py applied to a Subleq ELF:
|
||||
a boot block of text_start bytes, with the interrupt vector at word 0, the
|
||||
saved PC at word 1, the initial stack pointer at word 4, the framebuffer
|
||||
word address at word 6 and the constants 0, -1 and 1 at words 36, 38 and
|
||||
39, followed by the flat binary (tools/make_boot_image.py:34-68). The
|
||||
upstream repository ships capsules/vmlinux.bootimage.xz, ESI Linux with
|
||||
busybox, Doom, nano, lynx and htop in its initramfs, 110 MiB once
|
||||
decompressed; the frontend does not open xz, so the image is decompressed
|
||||
before loading.
|
||||
|
||||
Nothing else is read. retro_set_environment registers the log interface and
|
||||
the keyboard callback and nothing more (libretro.c:238-249); the core never
|
||||
asks for a system, save or content directory and opens no file itself.
|
||||
Keyboard events are translated to USB HID usage IDs and queued eight deep
|
||||
(libretro.c:36-184); console output goes to the host stdout with write
|
||||
(libretro.c:205-206); a fetched C of zero halts the machine and asks the
|
||||
frontend to shut down (libretro.c:196-199). No savestate
|
||||
(libretro.c:336-339), no memory map, no audio.
|
||||
|
||||
files: []
|
||||
@@ -0,0 +1,103 @@
|
||||
emulator: FreeJ2ME-Plus
|
||||
type: libretro
|
||||
core_classification: enhanced_fork
|
||||
source: "https://github.com/TASEmulators/freej2me-plus"
|
||||
upstream: "https://github.com/hex007/freej2me"
|
||||
profiled_date: "2026-09-17"
|
||||
source_commit: "631cf3f8edf18ce8ef2e9de46bd2dad50d6411a2"
|
||||
upstream_commit: "8b9bc8a19baf26e3d92f88934a64a32f1cbc2795"
|
||||
core_version: "1.52"
|
||||
display_name: "Mobile - J2ME (FreeJ2ME-Plus)"
|
||||
cores:
|
||||
- freej2me_plus
|
||||
systems:
|
||||
- j2me
|
||||
|
||||
notes: |
|
||||
Fork of FreeJ2ME adding phone-specific APIs (Siemens, Nokia, Motorola,
|
||||
KDDI, SKT, DoJa, JBlend, Mascot Capsule V3, M3G), KJX loading and more
|
||||
core options. The native core is a C bridge: retro_init reads the system
|
||||
directory, checks that freej2me_plus-lr.jar exists there and spawns
|
||||
java -jar with the file encoding and the screen size as arguments, then
|
||||
drives the Java process over pipes. Windows launches javaw through
|
||||
CreateProcess with the system directory as starting directory; Linux
|
||||
forks, chdir()s into it and execvp()s java. A Java runtime (8 or later)
|
||||
must be on the host PATH. The jar is built by ant from build.xml, which
|
||||
writes the libretro variant as freej2me_plus-lr.jar.
|
||||
ref: src/libretro/freej2me_libretro.c:38-42,
|
||||
src/libretro/freej2me_libretro.c:845-874,
|
||||
src/libretro/freej2me_libretro.c:1566-1568,
|
||||
src/libretro/freej2me_libretro.c:1665-1674,
|
||||
build.xml:66-76
|
||||
|
||||
Only existence is tested. When the jar is absent the core posts the
|
||||
SYSTEM_NOT_FOUND message and returns from retro_init before any process is
|
||||
created, so nothing loads. The message text still names freej2me-lr.jar,
|
||||
the file the original core opens; this core opens freej2me_plus-lr.jar.
|
||||
ref: src/libretro/freej2me_libretro.c:334-341,
|
||||
src/libretro/freej2me_libretro.c:852-858,
|
||||
src/libretro/freej2me_libretro.h:74
|
||||
|
||||
Every relative path the jar opens resolves against the system directory,
|
||||
since the Java process starts there. freej2me_system/ is created on first
|
||||
run and holds freej2me.conf (written with defaults when missing, then
|
||||
overridden by the core options the bridge sends), FreeJ2ME.log, and the
|
||||
SiemensData/ and XceData/ directories that the Siemens and XCE file APIs
|
||||
write to. FreeJ2MEDumps/KDDI/ receives the jar and jad extracted from a
|
||||
.kjx. Saves go to <save_dir>/freej2me/ (rms/<suite>/ and
|
||||
config/<suite>/game.conf), falling back to the system directory when the
|
||||
frontend has no save directory.
|
||||
ref: src/org/recompile/freej2me/Config.java:47-48,
|
||||
src/org/recompile/freej2me/Config.java:186-205,
|
||||
src/org/recompile/mobile/Mobile.java:117-119,
|
||||
src/org/recompile/mobile/Mobile.java:131,
|
||||
src/libretro/freej2me_libretro.c:912-920,
|
||||
src/org/recompile/freej2me/Libretro.java:198-202,
|
||||
src/javax/microedition/rms/RecordStore.java:111
|
||||
|
||||
Two files are user supplied and optional. With the freej2me_midifont core
|
||||
option on, Manager.checkCustomMidi loads the first .sf2 or .gm listed in
|
||||
freej2me_system/customMIDI/ as the MIDI soundbank; off, or with the
|
||||
directory empty, the JVM default soundbank is used. With freej2me_textfont
|
||||
on, PlatformFont loads the first .ttf, .otf or .ttc in
|
||||
freej2me_system/customFont/; off, the AWT SansSerif, Monospaced and Dialog
|
||||
faces are used. Both directories are created with a placeholder file when
|
||||
missing, and neither file has a fixed name.
|
||||
ref: src/libretro/freej2me_libretro.c:459-471,
|
||||
src/org/recompile/freej2me/Libretro.java:236,
|
||||
src/org/recompile/freej2me/Libretro.java:250,
|
||||
src/org/recompile/mobile/Mobile.java:987-993,
|
||||
src/javax/microedition/media/Manager.java:53,
|
||||
src/javax/microedition/media/Manager.java:325-346,
|
||||
src/org/recompile/mobile/PlatformFont.java:63,
|
||||
src/org/recompile/mobile/PlatformFont.java:102-119
|
||||
|
||||
files:
|
||||
- name: "freej2me_plus-lr.jar"
|
||||
system: j2me
|
||||
path: "freej2me_plus-lr.jar"
|
||||
required: true
|
||||
validation: [existence]
|
||||
description: "FreeJ2ME-Plus libretro Java application"
|
||||
note: "Java program the native core launches with java -jar from the system directory root. Built by ant from build.xml at the pinned revision; the code reads no size and no hash."
|
||||
source_ref: "src/libretro/freej2me_libretro.c:38-42 (freej2meapp), src/libretro/freej2me_libretro.c:845-861 (GET_SYSTEM_DIRECTORY, freej2me_present, SYSTEM_NOT_FOUND_MSG), src/libretro/freej2me_libretro.c:334-341 (access F_OK), src/libretro/freej2me_libretro.c:863-874 (java -jar argv), build.xml:66-76 (destfile)"
|
||||
|
||||
- name: "<soundfont>.sf2"
|
||||
system: j2me
|
||||
path: "freej2me_system/customMIDI/<soundfont>.sf2"
|
||||
required: false
|
||||
unsourceable: "user supplied, no canonical file"
|
||||
category: game_data
|
||||
description: "MIDI soundbank for J2ME audio"
|
||||
note: "First .sf2 or .gm in the directory listing, loaded through MidiSystem.getSoundbank when the freej2me_midifont option is on. A rejected file is logged and the JVM default soundbank stays."
|
||||
source_ref: "src/javax/microedition/media/Manager.java:53, src/javax/microedition/media/Manager.java:325-346, src/org/recompile/mobile/Mobile.java:987-989"
|
||||
|
||||
- name: "<font>.ttf"
|
||||
system: j2me
|
||||
path: "freej2me_system/customFont/<font>.ttf"
|
||||
required: false
|
||||
unsourceable: "user supplied, no canonical file"
|
||||
category: game_data
|
||||
description: "TrueType font for J2ME text"
|
||||
note: "First .ttf, .otf or .ttc in the directory listing, loaded through Font.createFont when the freej2me_textfont option is on. A rejected file is logged and the AWT faces stay."
|
||||
source_ref: "src/org/recompile/mobile/PlatformFont.java:63, src/org/recompile/mobile/PlatformFont.java:102-119, src/org/recompile/mobile/Mobile.java:991-993"
|
||||
@@ -0,0 +1,75 @@
|
||||
emulator: Omicron
|
||||
type: libretro
|
||||
core_classification: game_engine
|
||||
source: "https://github.com/libretro/Omicron"
|
||||
source_mirror: "https://git.libretro.com/libretro/Omicron"
|
||||
upstream: "https://github.com/msx80/Omicron"
|
||||
profiled_date: "2026-09-17"
|
||||
source_commit: "0181fbad079addb1fca895325c711f8f91397be4"
|
||||
upstream_commit: "aaaa2f1a98b88a6b1e6102417317ced206887076"
|
||||
core_version: "v1"
|
||||
display_name: "Omicron"
|
||||
cores:
|
||||
- omicron
|
||||
systems:
|
||||
- omicron
|
||||
|
||||
notes: |
|
||||
Java game engine on libGDX by msx80, inspired by fantasy consoles. A game
|
||||
is an .omicron cartridge: a jar carrying an omicron.properties descriptor
|
||||
that names the Game class, and numbered sheetN.png, soundN.wav, musicN.mp3
|
||||
and fileN.bin resources, all read from inside the cartridge
|
||||
(omicron-player/omicron-loader/src/main/java/org/github/msx80/omicron/fantasyconsole/cartridges/JarCartridge.java:20-25,
|
||||
omicron-player/omicron-engine/src/main/java/org/github/msx80/omicron/GameRun.java:74-100).
|
||||
The libretro core is the experimental frontend of the same repository; the
|
||||
libretro fork is the 2020-09-29 tree plus a GitLab CI file and a Makefile
|
||||
that takes the JNI headers from JAVA_HOME. The CI builds the shared
|
||||
library for Linux x64, i686 and aarch64 only (.gitlab-ci.yml:48-66).
|
||||
|
||||
retro_load_game builds <system_dir>/omicron/omicron.jar and refuses the
|
||||
content when the file is absent
|
||||
(libretro/LibretroOmicronCore/omicron_libretro.c:364-387). It then opens
|
||||
the JVM shared library by hand: JAVA_HOME must be set
|
||||
(libretro/LibretroOmicronCore/ejava.c:74-80), and libjvm.so or jvm.dll is
|
||||
probed under lib/server, jre/bin/server, jre/lib/amd64/server,
|
||||
jre/lib/aarch64/server, bin/server, bin/client and jre/bin/client, first
|
||||
hit wins (libretro/LibretroOmicronCore/ejava.c:86-94). The JVM is created
|
||||
with no option (libretro/LibretroOmicronCore/ejava.c:249-250). A
|
||||
Bootstrap class compiled into the core binary
|
||||
(libretro/LibretroOmicronCore/bootstrap.h) is defined through JNI and
|
||||
given the jar path; it opens the jar in a URLClassLoader and instantiates
|
||||
org.github.msx80.omicron.libretro.entrypoint.EntryPoint
|
||||
(libretro/LibretroOmicronCore/ejava.c:258-287,
|
||||
libretro/omicron-libretro-java/src/Bootstrap.java:33-39). One JVM per
|
||||
process: unloading keeps it and the next load reuses it
|
||||
(libretro/LibretroOmicronCore/ejava.c:291-305). The Java runtime is a
|
||||
host installation, not a file of this profile.
|
||||
|
||||
omicron.jar is the Maven jar-with-dependencies of
|
||||
libretro/omicron-libretro-java under that name: EntryPoint, the engine,
|
||||
loader and api modules, libGDX 1.9.10 with the LWJGL 3 backend and the
|
||||
desktop natives of both (libretro/omicron-libretro-java/pom.xml:13-61).
|
||||
GdxNativesLoader.load and GL.createCapabilities extract those natives
|
||||
from the jar when the frontend creates the GL context
|
||||
(libretro/omicron-libretro-java/src/org/github/msx80/omicron/libretro/entrypoint/EntryPoint.java:137-147),
|
||||
so nothing else is read from system_dir. Audio is a MockAudio and
|
||||
Preferences are written under java.io.tmpdir
|
||||
(libretro/omicron-libretro-java/src/experimental/LibretroApplication.java:45,
|
||||
libretro/omicron-libretro-java/src/experimental/LibretroApplication.java:172-173).
|
||||
|
||||
The cartridge class loader installs a SecurityManager
|
||||
(omicron-player/omicron-loader/src/main/java/org/github/msx80/omicron/fantasyconsole/crazyclassloader/NonAggressiveClassLoader.java:19-20).
|
||||
From Java 18 on System.setSecurityManager throws unless the JVM starts
|
||||
with java.security.manager=allow, which the core never passes; the C side
|
||||
does not check the pending exception, so the game is reported as loaded
|
||||
with a 0x0 geometry. Java 8 to 17 runs it.
|
||||
|
||||
files:
|
||||
- name: "omicron.jar"
|
||||
system: omicron
|
||||
path: "omicron/omicron.jar"
|
||||
required: true
|
||||
validation: [existence]
|
||||
description: "Omicron libretro Java backend: engine, libGDX, LWJGL and their natives"
|
||||
source_ref: "libretro/LibretroOmicronCore/omicron_libretro.c:364-387 (GET_SYSTEM_DIRECTORY, omicron/omicron.jar, fileExists), libretro/LibretroOmicronCore/ejava.c:258-287 (Bootstrap main with the jar path), libretro/omicron-libretro-java/src/Bootstrap.java:33-39 (URLClassLoader, EntryPoint), libretro/omicron-libretro-java/pom.xml:13-61"
|
||||
note: "Built with mvn package assembly:single in libretro/omicron-libretro-java after the omicron-api, omicron-loader and omicron-engine Gradle modules are published to the local Maven repository; the jar-with-dependencies output is renamed omicron.jar. Only its presence is checked."
|
||||
@@ -0,0 +1,77 @@
|
||||
emulator: piece-emu
|
||||
type: libretro
|
||||
core_classification: official_port
|
||||
source: "https://github.com/autch/piece-emu"
|
||||
upstream: "https://github.com/autch/piece-emu"
|
||||
profiled_date: "2026-09-17"
|
||||
source_commit: "08ec4b45176e8df0d6d6f67e56b87e847cd64a65"
|
||||
core_version: "0.1"
|
||||
display_name: "Aquaplus - P/ECE (piece-emu)"
|
||||
cores:
|
||||
- piece
|
||||
systems:
|
||||
- aquaplus-piece
|
||||
|
||||
notes: |
|
||||
Aquaplus P/ECE emulator (EPSON S1C33209 SoC, S1C33000 CPU core) by
|
||||
Autch. The repository ships an SDL3 standalone, a headless runner and
|
||||
the libretro core, all built from the same core, soc, board and system
|
||||
sources (src/libretro/CMakeLists.txt:17-57).
|
||||
|
||||
The content is a P/ECE Flash Image (.pfi): a 40-byte PFIHEADER carrying
|
||||
the SYSTEMINFO block, then the raw flash contents at the stored offset
|
||||
(src/pfi_format.h:22-47). retro_get_system_info sets need_fullpath to
|
||||
false, so the frontend hands the file over as a memory blob
|
||||
(src/libretro/piece_libretro.cpp:225-233). retro_load_game checks the
|
||||
PFI signature and SYSTEMINFO.size == 32, sizes SRAM and flash from
|
||||
SYSTEMINFO, copies the flash bytes into an SST39VF flash device and
|
||||
starts the CPU at the reset vector read from flash base 0xC00000
|
||||
(src/libretro/piece_libretro.cpp:271-362,
|
||||
src/debug/pfi_loader_blob.cpp:20-91). The P/ECE kernel, its PFFS file
|
||||
system and the installed applications (.pex) all live in that flash
|
||||
image. The bus maps internal IRAM, external SRAM, external flash and
|
||||
I/O only (src/core/bus.hpp:75-79 and src/core/bus.hpp:239); the core
|
||||
carries no embedded boot code, and retro_set_environment registers
|
||||
core options and nothing else (src/libretro/piece_libretro.cpp:204-218).
|
||||
No environment call asks for the system directory.
|
||||
|
||||
RETRO_MEMORY_SAVE_RAM exposes the whole flash as a PFI image (original
|
||||
header, then the flash bytes, re-copied sector by sector when the
|
||||
kernel writes), so the frontend's .srm is itself a bootable .pfi
|
||||
(src/libretro/piece_libretro.cpp:334-352, 538-564, 614-624). A stored
|
||||
.srm with a valid header replaces the flash on the first frame
|
||||
(src/libretro/piece_libretro.cpp:398-420).
|
||||
|
||||
A .pfi is produced from the official Aquaplus PieceSystem 1.20 updater
|
||||
with the bundled mkpfi. mkpfi checks the "Piece Kernel Program"
|
||||
signature at offset 8 of all.bin, writes the boot vector 0x00C02004
|
||||
into sector 0, leaves sector 1 blank and copies all.bin from sector 2
|
||||
(src/tools/mkpfi.c:14, 88-95, 115-135). A fresh image boots to the
|
||||
launcher with startup.pex, date.pex and gamepad.pex installed; games
|
||||
are added with pfar.
|
||||
|
||||
The .info reports display_version 0.3; the code announces 0.1.
|
||||
|
||||
files: []
|
||||
|
||||
platform_details:
|
||||
flash_image:
|
||||
format: "PFI"
|
||||
header_size: 40
|
||||
flash_base: "0xC00000"
|
||||
sector_size: 4096
|
||||
source_ref: "src/pfi_format.h:22-47, src/debug/pfi_loader_blob.cpp:20-91"
|
||||
kernel_source:
|
||||
name: "PieceSystem 1.20 updater"
|
||||
url: "https://aquaplus.jp/piece/dl/update120.exe"
|
||||
archive: "LHA self-extracting executable"
|
||||
members:
|
||||
- path: "piece/update/all.bin"
|
||||
size: 516096
|
||||
flash: "512 KB factory units"
|
||||
command: "mkpfi -512kb piece/update/all.bin piece.pfi"
|
||||
- path: "piece/update/2mb/all.bin"
|
||||
size: 516096
|
||||
flash: "2 MB modified units"
|
||||
command: "mkpfi -2mb piece/update/2mb/all.bin piece.pfi"
|
||||
source_ref: "src/tools/mkpfi.c:14, 88-95, 115-135"
|
||||
@@ -0,0 +1,80 @@
|
||||
emulator: radio
|
||||
type: utility
|
||||
core_classification: pure_libretro
|
||||
source: "https://git.libretro.com/libretro/libretro-radio"
|
||||
upstream: "https://github.com/fpscan/libretro-radio"
|
||||
author: "fpscan, gadsby"
|
||||
profiled_date: "2026-09-17"
|
||||
source_commit: "5d7d786ad1d8703a52184ff2ee39712c46ed67c9"
|
||||
upstream_commit: "5d7d786ad1d8703a52184ff2ee39712c46ed67c9"
|
||||
core_version: "1.1"
|
||||
display_name: "Internet Radio (Radio)"
|
||||
cores:
|
||||
- radio
|
||||
systems: []
|
||||
|
||||
notes: |
|
||||
Streams internet radio and plays local MP3 and WAV files behind a tuner
|
||||
display with five visualisers. The station list is built once in
|
||||
retro_load_game, in this order: the content when it is given, then
|
||||
radio_stations.m3u in the system directory, then the same name in the save
|
||||
directory, then in the working directory, then the 100 most clicked
|
||||
stations of the radio-browser.info API over plain HTTP, and last eight
|
||||
SomaFM streams compiled into the core. Each step runs only while the list
|
||||
is still empty, so the first source that yields a station wins.
|
||||
ref: libretro-radio.c:2409-2488
|
||||
|
||||
Content is an .m3u or .txt playlist, or a single .mp3 or .wav file. A
|
||||
playlist is read line by line: an EXTINF line names the next entry, any
|
||||
other line that is not a comment is a stream URL or a local file path,
|
||||
and a bare host gets http:// prepended. Up to 256 entries are kept and
|
||||
each is given a fake FM frequency for the tuner. A playlist that parses to
|
||||
zero entries counts as no content and the chain above continues, which is
|
||||
what the zero-byte empty.m3u in the repository is for. Local audio is
|
||||
opened from the path the playlist or the frontend gives; a WAV must be
|
||||
PCM or float with a fmt and a data chunk.
|
||||
ref: libretro-radio.c:1965-1971, libretro-radio.c:37,
|
||||
libretro-radio.c:2221-2291, libretro-radio.c:2419-2435,
|
||||
libretro-radio.c:746-797, libretro-radio.c:800-871
|
||||
|
||||
Streaming is a hand-written HTTP/1.0 client over an AF_INET socket: the
|
||||
URL scheme is stripped, an https:// entry is joined in clear on the port
|
||||
it names or 80, ICY status lines are accepted and up to five redirects
|
||||
are followed. No TLS library, certificate store or font file is read; the
|
||||
8x8 glyphs are a table in the binary. MP3 decoding is libmad, compiled in
|
||||
from the libretro-deps submodule.
|
||||
ref: libretro-radio.c:517-548, libretro-radio.c:564-743,
|
||||
libretro-radio.c:81, Makefile:30-45, .gitlab-ci.yml:13-17
|
||||
|
||||
The presets are the loaded list seen through the Active Preset core
|
||||
option, which selects entries 1 to 100 by index; a list longer than that
|
||||
is still walked with up and down on the pad. retro_load_game accepts a
|
||||
null game, but retro_set_environment only sets the pixel format and the
|
||||
variables and never announces SET_SUPPORT_NO_GAME, so the frontend still
|
||||
demands a content path and the .info supports_no_game only shows the
|
||||
Start Core entry.
|
||||
ref: libretro-radio.c:977-991, libretro-radio.c:1984-1999,
|
||||
libretro-radio.c:2068-2073
|
||||
|
||||
The GitLab project is the copy the buildbot builds through its own CI,
|
||||
from the same tree as the author's GitHub repository, and the Makefile
|
||||
names the binary radio_libretro.
|
||||
ref: .gitlab-ci.yml:10, Makefile:17
|
||||
|
||||
files:
|
||||
- name: radio_stations.m3u
|
||||
path: "radio_stations.m3u"
|
||||
required: false
|
||||
category: game_data
|
||||
validation: [existence]
|
||||
unsourceable: "station list the user writes, one stream URL or local audio path per line, with no name or entry the code expects"
|
||||
description: "default station list, read when the content yields no station"
|
||||
note: >-
|
||||
Opened from the system directory, then from the save directory, then
|
||||
from the working directory, each only while no station has been
|
||||
loaded yet. Parsed like a content playlist and accepted once one entry
|
||||
comes out of it; a missing or empty file hands over to the
|
||||
radio-browser.info API and then to the eight built-in SomaFM streams.
|
||||
A file put here replaces those two fallbacks for every start without
|
||||
content.
|
||||
source_ref: "libretro-radio.c:2437-2461, libretro-radio.c:2278-2291, libretro-radio.c:2464-2481"
|
||||
@@ -0,0 +1,55 @@
|
||||
emulator: Picocomputer 6502
|
||||
type: standalone + libretro
|
||||
core_classification: official_port
|
||||
source: "https://github.com/picocomputer/rp6502"
|
||||
source_branch: libretro
|
||||
upstream: "https://github.com/picocomputer/rp6502"
|
||||
profiled_date: "2026-09-17"
|
||||
source_commit: "02bfc3cbc9b2700795ce0a40fb49b413784cb832"
|
||||
core_version: "0.33"
|
||||
display_name: "Picocomputer 6502"
|
||||
cores:
|
||||
- rp6502
|
||||
systems:
|
||||
- picocomputer-6502
|
||||
|
||||
notes: |
|
||||
Rumbledethumps' Picocomputer 6502, a WDC 65C02 driven by two Raspberry Pi
|
||||
Picos acting as RIA and VGA. The libretro core, the desktop emulator and the
|
||||
Pico firmware live in one repository: src/host/libretro is the core and
|
||||
src/host/sokol the standalone, both linked over the same emu_core library
|
||||
(src/core/emu.cmake:31-105). A release fast-forwards the libretro branch to
|
||||
the tag, which is what the buildbot builds (version.cmake:14-19), and the
|
||||
core reports that tag as its version (src/core/sys/version.c:16-19).
|
||||
|
||||
The content is a .rp6502 program image and nothing else is loaded.
|
||||
retro_load_game refuses a null path (src/host/libretro/retro.c:520-526),
|
||||
makes it absolute and hands it to proc_boot (src/host/libretro/retro.c:545-563,
|
||||
src/host/libretro/retro.c:498-518), which fills SRAM and XRAM from the
|
||||
file's records through rom_load (src/core/sys/proc.c:83-104,
|
||||
src/core/rom/rom.c:46-82). The file is opened with fs_rom_open and must
|
||||
begin with #!RP6502 (src/core/rom/pump.c:96-115). Assets a program bundles
|
||||
are read on demand from the same file, hence need_fullpath
|
||||
(src/host/libretro/retro.c:344-354).
|
||||
|
||||
The RIA and VGA firmware are reimplemented inside emu_core, not read from
|
||||
disk: the terminal fonts are hex arrays (src/core/term/font.c:13-25) and the
|
||||
OEM code page tables are generated at build time from fatfs
|
||||
(src/core/gen.cmake:46-61, src/core/emu.cmake:28,83). The core never asks
|
||||
for the system directory. The frontend's save directory, or failing that the
|
||||
content's own directory, becomes the program's working directory on the host
|
||||
filesystem (src/host/libretro/retro.c:444-494), and the machine's stdio
|
||||
drivers are the ROM and that filesystem (src/host/libretro/drivers.h:60).
|
||||
The libretro machine declares no CONFIG_SAVE driver, so its settings are
|
||||
never written to disk (src/host/libretro/drivers.h:48-58,
|
||||
src/core/sys/config.c:62-64).
|
||||
|
||||
The standalone takes the program on the command line, installs --rom files
|
||||
as :basename aliases on a null drive and, given no program, waits for one to
|
||||
be dropped on the window (src/host/sokol/cli/cli.c:122-137,
|
||||
src/host/sokol/cli/main.c:210, src/host/sokol/cli/main.c:292-311). The
|
||||
debugger's ImGui layout file and the cc65 .dbg or llvm-mos ELF a DAP session
|
||||
names are the program's own build outputs (src/host/sokol/cli/cli.c:154,
|
||||
src/core/dap/cc65dbg.c:315, src/core/dap/dwarf_elf.c:44).
|
||||
|
||||
files: []
|
||||
@@ -0,0 +1,65 @@
|
||||
emulator: video_processor
|
||||
type: utility
|
||||
core_classification: pure_libretro
|
||||
source: "https://github.com/libretro/libretro-video-processor"
|
||||
source_mirror: "https://git.libretro.com/libretro/libretro-video-processor"
|
||||
upstream: "https://github.com/jaredmcneill/libretro-v4l2"
|
||||
author: "Jared McNeill"
|
||||
profiled_date: "2026-09-17"
|
||||
source_commit: "8fe4751f0039a1b645bf750531fcfc234958a7ac"
|
||||
upstream_commit: "c608ced893583e0a8a8153890f99453fd1647d53"
|
||||
core_version: "0.0.2"
|
||||
display_name: "Video Processor (V4L2)"
|
||||
cores:
|
||||
- video_processor
|
||||
systems: []
|
||||
|
||||
notes: |
|
||||
Capture core for V4L2 devices: a console plugged into a capture card is
|
||||
shown through the frontend so its scalers and shaders apply to the signal.
|
||||
The core opens the capture device, requests RGB24 and two mmap buffers,
|
||||
and converts each dequeued frame to RGB565 for the video callback. Audio
|
||||
comes from an ALSA capture PCM opened at 48 kHz, S16_LE, two channels, and
|
||||
is read from the frontend audio callback. There is no emulation, no state
|
||||
to serialize and no memory map.
|
||||
ref: video_processor_v4l2.c:299-419, video_processor_v4l2.c:492-529,
|
||||
video_processor_v4l2.c:531-544, video_processor_v4l2.c:554-698
|
||||
|
||||
Both devices are picked from core options built in retro_set_environment.
|
||||
The video list comes from a udev enumeration of the video4linux subsystem
|
||||
filtered on the /dev/video prefix, or from a fixed /dev/video0 to
|
||||
/dev/video3 list when libudev is not compiled in. The audio list comes from
|
||||
the ALSA PCM hints whose IOID is Input and whose name starts with hw: or
|
||||
default:. These are device nodes and PCM names, not files: nothing is read
|
||||
from the system directory, no path is built and no file is opened. The
|
||||
content handed to retro_load_game is not looked at either: valid_extensions
|
||||
is NULL, need_fullpath is false and the core never declares no-content
|
||||
support, so the frontend still asks for a file whose bytes are ignored.
|
||||
ref: video_processor_v4l2.c:140-205, video_processor_v4l2.c:208-242,
|
||||
video_processor_v4l2.c:244-268, video_processor_v4l2.c:448-455
|
||||
|
||||
The frame rate is the frameperiod of the active V4L2 standard and the
|
||||
pixel aspect comes from VIDIOC_CROPCAP; retro_get_region reports NTSC when
|
||||
the standard carries the NTSC bit and PAL otherwise. A device that does not
|
||||
enumerate its active standard makes retro_load_game fail.
|
||||
ref: video_processor_v4l2.c:457-480, video_processor_v4l2.c:593-617,
|
||||
video_processor_v4l2.c:728-731
|
||||
|
||||
Linux only, through linux/videodev2.h. libv4l2, ALSA and libudev are each
|
||||
autodetected by the Makefile and dropped when their header is missing;
|
||||
without libv4l2 the raw ioctl path is used and the format conversion the
|
||||
library provides is lost. The GitLab CI installs the three development
|
||||
packages, and the buildbot binary for linux x86_64 links libv4l2.so.0,
|
||||
libasound.so.2 and libudev.so.1. RetroArch also compiles a diverged copy of
|
||||
this core into its own binary under cores/libretro-video-processor when
|
||||
HAVE_VIDEOPROCESSOR is set; that copy declares no-content support and adds
|
||||
capture and output mode options, and opens the same device nodes only.
|
||||
ref: video_processor_v4l2.c:45-57, Makefile:107-124
|
||||
|
||||
Written by Jared McNeill in July 2016 as libretro-v4l2. The libretro fork
|
||||
carries the author's last commits, the audio batch callback and the ALSA
|
||||
overrun recovery, then the 2026 CI and dependency autodetection change; the
|
||||
original repository stopped at the RGB24 conversion commit.
|
||||
|
||||
files: []
|
||||
source_ref: "video_processor_v4l2.c:27-28, .gitlab-ci.yml:19"
|
||||
@@ -0,0 +1,247 @@
|
||||
emulator: WQXEmu
|
||||
type: standalone + libretro
|
||||
core_classification: official_port
|
||||
source: "https://git.libretro.com/libretro/wqxemu"
|
||||
upstream: "https://github.com/AloysHF/WQXEmu"
|
||||
profiled_date: "2026-09-17"
|
||||
source_commit: "7191df429042116e707ba68f5b2d2a8ae567b2ad"
|
||||
upstream_commit: "7191df429042116e707ba68f5b2d2a8ae567b2ad"
|
||||
core_version: "0.1.0"
|
||||
display_name: "Wenquxing - Electronic Dictionary (WQXEmu)"
|
||||
cores:
|
||||
- wqxemu
|
||||
systems:
|
||||
- wenquxing-nc1020
|
||||
- wenquxing-pc1000
|
||||
- wenquxing-cc800
|
||||
- wenquxing-nc2000
|
||||
- wenquxing-nc3000
|
||||
|
||||
notes: |
|
||||
Wenquxing electronic dictionary emulator written in Rust by AloysHF.
|
||||
The libretro core and the wqx-emu standalone binary share the
|
||||
wqxemu-core crate, which runs the original firmware of five models on
|
||||
an emulated 6502 SoC: NC1020, PC1000, CC800, NC2000 and NC3000. The
|
||||
git.libretro.com repository is a mirror of the GitHub one at the same
|
||||
commit; the buildbot consumes its .gitlab-ci.yml.
|
||||
|
||||
The core takes no content. retro_load_game refuses a non-null game
|
||||
info (crates/wqxemu-libretro/src/lib.rs:632-635) and the machine is
|
||||
started through Start Core, supports_no_game being set
|
||||
(crates/wqxemu-libretro/src/lib.rs:476-481). The model comes from the
|
||||
wqxemu_model core option, NC1020 when unset
|
||||
(crates/wqxemu-libretro/src/lib.rs:263-282,
|
||||
crates/wqxemu-libretro/src/lib.rs:956-973), and its firmware set is
|
||||
built as {system}/WQXEmu/<model>/<file>
|
||||
(crates/wqxemu-libretro/src/lib.rs:211-248, model names in
|
||||
crates/wqxemu-core/src/machine.rs:35-43). Every path of the set must be
|
||||
a regular file, otherwise retro_load_game names the missing paths and
|
||||
returns false (crates/wqxemu-libretro/src/lib.rs:250-257,
|
||||
crates/wqxemu-libretro/src/lib.rs:644-658). Only the set of the
|
||||
selected model is read.
|
||||
|
||||
Each machine reads its files whole with std::fs::read and checks their
|
||||
size only: a ROM or NOR image must be at least as large as the window
|
||||
it fills, the PC1000 ROM must be exactly 12 MiB or 16 MiB, and NAND
|
||||
images are copied without any check. A file that fails the check makes
|
||||
Emulator::new fail and retro_load_game returns false with the loader's
|
||||
message (crates/wqxemu-libretro/src/lib.rs:671-677). No hash is
|
||||
verified.
|
||||
|
||||
The firmware files are never written. Neither frontend calls save_nor;
|
||||
the writable flash, NAND, RAM and peripheral state of a session is
|
||||
serialized to {save}/<model>/<fingerprint>.wqxs, a gzip file the core
|
||||
creates on unload and reloads at the next start of the same model and
|
||||
firmware set (crates/wqxemu-libretro/src/lib.rs:316-340,
|
||||
crates/wqxemu-libretro/src/lib.rs:679-693,
|
||||
crates/wqxemu-core/src/save.rs:43-88). The fingerprint is an FNV-1a
|
||||
over the slot layout and the content of every file of the set
|
||||
(crates/wqxemu-core/src/machine.rs:89-113). That file is created by the
|
||||
core. retro_get_memory_data returns null for every memory id
|
||||
(crates/wqxemu-libretro/src/lib.rs:875-885).
|
||||
|
||||
The standalone binary takes the same files as explicit --rom, --nor,
|
||||
--nand and --nand0 paths and has no default directory; --model selects
|
||||
the machine, otherwise detect_model guesses it from the file sizes
|
||||
(crates/wqxemu/src/main.rs:27-42, crates/wqxemu/src/main.rs:239-274,
|
||||
crates/wqxemu/src/main.rs:276-288,
|
||||
crates/wqxemu-core/src/machines/mod.rs:38-87). Its device skins are
|
||||
include_bytes! PNGs (crates/wqxemu/src/keypad.rs:59-66).
|
||||
|
||||
The libretro-core-info file names the PC1000 NOR image pc1000.fls. The
|
||||
code opens pc1000.nor since commit 0a8f7a5 of 2026-08-23; the v0.1.0
|
||||
tag predates that commit and opens pc1000.fls.
|
||||
|
||||
files:
|
||||
- name: obj_lu.bin
|
||||
path: WQXEmu/nc1020/obj_lu.bin
|
||||
system: wenquxing-nc1020
|
||||
required: true
|
||||
min_size: 25165824
|
||||
validation: [size]
|
||||
description: "NC1020 system ROM, three 8 MiB volumes"
|
||||
note: >-
|
||||
Read whole from {system}/WQXEmu/nc1020/obj_lu.bin. The image must
|
||||
be at least 0x8000 * 0x300 bytes or the loader fails; a larger file
|
||||
is kept whole. Each 32 KiB bank is stored with its 16 KiB halves
|
||||
swapped and is swapped back on load, and the BBS pages are mapped
|
||||
from it.
|
||||
source_ref: "crates/wqxemu-libretro/src/lib.rs:214-219, crates/wqxemu-core/src/machines/nc1020.rs:61-98, crates/wqxemu-core/src/memory.rs:24"
|
||||
|
||||
- name: nc1020.fls
|
||||
path: WQXEmu/nc1020/nc1020.fls
|
||||
system: wenquxing-nc1020
|
||||
required: true
|
||||
min_size: 1048576
|
||||
validation: [size]
|
||||
description: "NC1020 NOR flash, 32 banks of 32 KiB"
|
||||
note: >-
|
||||
Read whole from {system}/WQXEmu/nc1020/nc1020.fls. The image must
|
||||
be at least 0x8000 * 0x20 bytes or the loader fails; only the first
|
||||
1 MiB is used, with the same 16 KiB half swap as the ROM. Writes go
|
||||
to the in-memory copy and are persisted in the .wqxs session file,
|
||||
never to this file.
|
||||
source_ref: "crates/wqxemu-libretro/src/lib.rs:214-219, crates/wqxemu-core/src/machines/nc1020.rs:101-122, crates/wqxemu-core/src/memory.rs:26"
|
||||
|
||||
- name: pc1000.rom
|
||||
path: WQXEmu/pc1000/pc1000.rom
|
||||
system: wenquxing-pc1000
|
||||
required: true
|
||||
size: [12582912, 16777216]
|
||||
validation: [size]
|
||||
description: "PC1000 system ROM, obj1 + obj2 + obj3"
|
||||
note: >-
|
||||
Read whole from {system}/WQXEmu/pc1000/pc1000.rom and stored
|
||||
linearly. Exactly 12 MiB (obj1, obj2, obj3 back to back) or 16 MiB
|
||||
(the PC1000EMUX and Android layout, obj3 at 12 MiB with 8 to 12 MiB
|
||||
unused) is accepted; any other size fails the loader. The volume
|
||||
tables are rebuilt for the layout found.
|
||||
source_ref: "crates/wqxemu-libretro/src/lib.rs:220-225, crates/wqxemu-core/src/machines/pc1000.rs:38-40, crates/wqxemu-core/src/machines/pc1000.rs:236-283"
|
||||
|
||||
- name: pc1000.nor
|
||||
aliases: [pc1000.fls]
|
||||
path: WQXEmu/pc1000/pc1000.nor
|
||||
system: wenquxing-pc1000
|
||||
required: true
|
||||
min_size: 524288
|
||||
validation: [size]
|
||||
description: "PC1000 NOR flash, 16 banks of 32 KiB"
|
||||
note: >-
|
||||
Read whole from {system}/WQXEmu/pc1000/pc1000.nor. The image must
|
||||
be at least 0x80000 bytes or the loader fails; only the first
|
||||
512 KiB is used. A dump stored with swapped 16 KiB halves is
|
||||
recognised by the info-block signature at bank 0 offset 0x4000 and
|
||||
unswapped. The v0.1.0 tag and the libretro-core-info file name it
|
||||
pc1000.fls.
|
||||
source_ref: "crates/wqxemu-libretro/src/lib.rs:220-225, crates/wqxemu-core/src/machines/pc1000.rs:42, crates/wqxemu-core/src/machines/pc1000.rs:284-313"
|
||||
|
||||
- name: obj.bin
|
||||
path: WQXEmu/cc800/obj.bin
|
||||
system: wenquxing-cc800
|
||||
required: true
|
||||
min_size: 16777216
|
||||
validation: [size]
|
||||
description: "CC800 system ROM, two volumes of 256 banks"
|
||||
note: >-
|
||||
Read whole from {system}/WQXEmu/cc800/obj.bin. The image must be at
|
||||
least 0x1000000 bytes or the loader fails; only the first 16 MiB is
|
||||
used. Each 32 KiB bank is stored with its 16 KiB halves swapped and
|
||||
is swapped back on load. Volume 0 is banks 0 to 255, volume 1 banks
|
||||
256 to 511.
|
||||
source_ref: "crates/wqxemu-libretro/src/lib.rs:226-231, crates/wqxemu-core/src/machines/cc800.rs:38, crates/wqxemu-core/src/machines/cc800.rs:229-251"
|
||||
|
||||
- name: cc800.fls
|
||||
path: WQXEmu/cc800/cc800.fls
|
||||
system: wenquxing-cc800
|
||||
required: true
|
||||
min_size: 524288
|
||||
validation: [size]
|
||||
description: "CC800 NOR flash, 16 banks of 32 KiB"
|
||||
note: >-
|
||||
Read whole from {system}/WQXEmu/cc800/cc800.fls. The image must be
|
||||
at least 0x80000 bytes or the loader fails; only the first 512 KiB
|
||||
is used, with the same 16 KiB half swap as the ROM.
|
||||
source_ref: "crates/wqxemu-libretro/src/lib.rs:226-231, crates/wqxemu-core/src/machines/cc800.rs:40, crates/wqxemu-core/src/machines/cc800.rs:252-267"
|
||||
|
||||
- name: nc2000.nor
|
||||
path: WQXEmu/nc2000/nc2000.nor
|
||||
system: wenquxing-nc2000
|
||||
required: true
|
||||
min_size: 524288
|
||||
validation: [size]
|
||||
description: "NC2000 NOR flash, 16 banks of 32 KiB"
|
||||
note: >-
|
||||
Read whole from {system}/WQXEmu/nc2000/nc2000.nor in physical order,
|
||||
no bank swap. The image must be at least 16 * 0x8000 bytes or the
|
||||
loader fails; only the first 512 KiB is used. Bank 0 is the fixed
|
||||
BIOS page at 0xE000.
|
||||
source_ref: "crates/wqxemu-libretro/src/lib.rs:232-237, crates/wqxemu-core/src/machines/nc2000.rs:20, crates/wqxemu-core/src/machines/nc2000.rs:28, crates/wqxemu-core/src/machines/nc2000.rs:265-277"
|
||||
|
||||
- name: nc2000.nand
|
||||
path: WQXEmu/nc2000/nc2000.nand
|
||||
system: wenquxing-nc2000
|
||||
required: true
|
||||
size: 34603008
|
||||
description: "NC2000 NAND flash main area, 65536 pages of 528 bytes"
|
||||
note: >-
|
||||
Read whole from {system}/WQXEmu/nc2000/nc2000.nand and copied after
|
||||
the 64-page first plane, up to 65536 pages of 512 data plus 16
|
||||
spare bytes. No size check: bytes beyond that are ignored and a
|
||||
shorter file leaves the remainder erased at 0xFF.
|
||||
source_ref: "crates/wqxemu-libretro/src/lib.rs:232-237, crates/wqxemu-core/src/machines/nc2000.rs:22-26, crates/wqxemu-core/src/machines/nc2000.rs:278-282, crates/wqxemu-core/src/machines/nc2000.rs:292-296"
|
||||
|
||||
- name: nc2000.nand0
|
||||
path: WQXEmu/nc2000/nc2000.nand0
|
||||
system: wenquxing-nc2000
|
||||
required: true
|
||||
size: 33792
|
||||
description: "NC2000 NAND flash first plane, 64 pages of 528 bytes"
|
||||
note: >-
|
||||
Read whole from {system}/WQXEmu/nc2000/nc2000.nand0 into the first
|
||||
64 pages of the NAND array. No size check. The libretro core always
|
||||
puts it in the NC2000 set and the standalone binary requires
|
||||
--nand0 for this model, so a missing file stops the start.
|
||||
source_ref: "crates/wqxemu-libretro/src/lib.rs:232-237, crates/wqxemu-core/src/machines/nc2000.rs:24, crates/wqxemu-core/src/machines/nc2000.rs:283-288, crates/wqxemu-core/src/machines/nc2000.rs:298-301, crates/wqxemu/src/main.rs:260-265"
|
||||
|
||||
- name: nc3000.nor
|
||||
path: WQXEmu/nc3000/nc3000.nor
|
||||
system: wenquxing-nc3000
|
||||
required: true
|
||||
min_size: 1048576
|
||||
validation: [size]
|
||||
description: "NC3000 NOR flash, 32 banks of 32 KiB"
|
||||
note: >-
|
||||
Read whole from {system}/WQXEmu/nc3000/nc3000.nor in physical order,
|
||||
no bank swap. The image must be at least 32 * 0x8000 bytes or the
|
||||
loader fails; only the first 1 MiB is used. Bank 0 is the fixed
|
||||
BIOS page at 0xE000.
|
||||
source_ref: "crates/wqxemu-libretro/src/lib.rs:238-246, crates/wqxemu-core/src/machines/nc3000.rs:23, crates/wqxemu-core/src/machines/nc3000.rs:33, crates/wqxemu-core/src/machines/nc3000.rs:272-284"
|
||||
|
||||
- name: nc3000.nand
|
||||
path: WQXEmu/nc3000/nc3000.nand
|
||||
system: wenquxing-nc3000
|
||||
required: true
|
||||
size: 69206016
|
||||
storage: large_file
|
||||
description: "NC3000 NAND flash, two planes of 65536 pages of 528 bytes"
|
||||
note: >-
|
||||
Read whole from {system}/WQXEmu/nc3000/nc3000.nand and copied after
|
||||
the 64-page first plane, up to 131072 pages of 512 data plus 16
|
||||
spare bytes. No size check: bytes beyond that are ignored and a
|
||||
shorter file leaves the remainder erased at 0xFF.
|
||||
source_ref: "crates/wqxemu-libretro/src/lib.rs:238-246, crates/wqxemu-core/src/machines/nc3000.rs:25-29, crates/wqxemu-core/src/machines/nc3000.rs:285-289, crates/wqxemu-core/src/machines/nc3000.rs:336-340"
|
||||
|
||||
- name: nc3000.nand0
|
||||
path: WQXEmu/nc3000/nc3000.nand0
|
||||
system: wenquxing-nc3000
|
||||
required: false
|
||||
size: 33792
|
||||
description: "NC3000 NAND flash first plane, 64 pages of 528 bytes"
|
||||
note: >-
|
||||
Read whole from {system}/WQXEmu/nc3000/nc3000.nand0 into the first
|
||||
64 pages of the NAND array when the file exists; the libretro core
|
||||
only adds it to the set in that case and the standalone --nand0 is
|
||||
optional for this model. Without it the core writes the marker
|
||||
"ggv nc3000" at offset 528 of an erased first plane and the machine
|
||||
boots the same way.
|
||||
source_ref: "crates/wqxemu-libretro/src/lib.rs:238-246, crates/wqxemu-core/src/machines/nc3000.rs:27-31, crates/wqxemu-core/src/machines/nc3000.rs:290-297, crates/wqxemu-core/src/machines/nc3000.rs:342-350, crates/wqxemu/src/main.rs:266-270"
|
||||
+1530
File diff suppressed because it is too large.
Load diff
Reference in new issue
Block a user