feat: profile 9 new buildbot cores

This commit is contained in:
Abdessamad Derraz committed 2026-10-04 14:59:17 +02:00
1 parent 92b2a1a498
commit bd90dba630
9 files changed
+2286

No files matched your search

+54
View File
@@ -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: []
+103
View File
@@ -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"
+75
View File
@@ -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."
+77
View File
@@ -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"
+80
View File
@@ -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"
+55
View File
@@ -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: []
+65
View File
@@ -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"
+247
View File
@@ -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
View File
File diff suppressed because it is too large. Load diff