Files
libretro/emulators/dingooemu.yml
T
Abdessamad Derraz 4231902a6c docs: write prose without dashes or semicolons
Profiles, the wiki, comments, docstrings, command output and schema descriptions carried em-dashes, clause-joining semicolons, unicode arrows, box-drawing banners and check-mark glyphs. Each sentence was rewritten rather than having its character swapped. Hashes, paths, source_ref values and every cited file:line are unchanged, which a comparison of each parsed profile against the previous revision confirms.

validate_pr comments now say PASS and FAIL in words, and source_ref values in a profile's structured blocks render as code. test_prose_style fails if any of these comes back, in tracked files or in the generated site.
2026-10-19 06:47:31 +02:00

103 lines
5.1 KiB
YAML

emulator: DingooEmu
type: standalone + libretro
core_classification: pure_libretro
source: "https://github.com/AloysHF/DingooEmu"
upstream: "https://github.com/AloysHF/DingooEmu"
profiled_date: "2026-09-17"
source_commit: "f57c9339e6021cd37c4bd694c14b0813a9b5ee72"
core_version: "0.3.0"
display_name: "Dingoo - A320 / Gemei A330 (DingooEmu)"
cores:
- dingooemu
systems:
- dingoo-a320
- gemei-a330
notes: |
Dingoo A320 and Gemei A330 emulator written in Rust by AloysHF. The
libretro core and the dingoo-emu standalone binary share the
dingooemu-core crate. Content is read from its full path (need_fullpath
= true, crates/dingooemu-libretro/src/api.rs:87,
crates/dingooemu/src/main.rs:226, crates/dingooemu-core/src/emulator.rs:33-37,
crates/dingooemu-core/src/package.rs:124-135). The CCDL package's load
address selects the runtime: a .app loaded in the 0x8xxxxxxx range runs on
the MIPS32 interpreter as an A320, a .cc, .c2s or .c3s loaded at
0x10100000 (retail SDK) or 0x13800000 (homebrew SDK) runs on the
ARM32/Thumb interpreter as an A330
(crates/dingooemu-core/src/content.rs:66-74, 104-121,
crates/dingooemu-core/src/emulator.rs:44-55). Both runtimes bind the
package's imports to Rust implementations of the device SDK
(crates/dingooemu-core/src/a320/runtime/sdk_hle/mod.rs:22-30,
crates/dingooemu-core/src/a330/runtime/sdk_hle/mod.rs:226-234). No
firmware code is executed and no font or system file backs those calls.
The A320 guest file API
(crates/dingooemu-core/src/a320/runtime/sdk_hle/files.rs:43-128)
resolves a name in three steps: a file under the save directory, a
resource packed inside the .app, then a host file relative to the .app's
own directory (crates/dingooemu-core/src/a320/runtime.rs:1645-1665,
crates/dingooemu-core/src/a320/runtime.rs:1592-1618,
crates/dingooemu-core/src/a320/runtime.rs:1424-1428,
crates/dingooemu-core/src/a320/runtime.rs:1449-1462). fsys_findfirst
enumerates the .app's directory and refuses to leave it
(crates/dingooemu-core/src/a320/runtime.rs:1519-1529).
The A330 guest file API
(crates/dingooemu-core/src/a330/runtime/sdk_hle/files.rs:74-135)
resolves a name in five steps: a file under the save directory, a host
file relative to the content's directory, a resource packed inside the
package, the zip payload appended to the package, then an entry of the
firmware archive mounted from the content's directory. A name none of
them answers fails the open. fsys_findfirst enumerates the content's
directory and refuses to leave it
(crates/dingooemu-core/src/a330/runtime/sdk_hle/files.rs:381-395).
Files the game creates land in the frontend save directory
(crates/dingooemu-libretro/src/api.rs:150-155,
crates/dingooemu-core/src/emulator.rs:173-179) or, when the frontend
gives none and in the standalone, beside the content
(crates/dingooemu-core/src/a320/runtime.rs:372,
crates/dingooemu-core/src/a330/runtime.rs:415-417). The core queries
RETRO_ENVIRONMENT_GET_SAVE_DIRECTORY only
(crates/dingooemu-libretro/src/constants.rs:30), and no system directory
constant exists in the crate.
With the diagnostic core option on, dingooemu-diagnostic.txt is written
to the save directory, or beside the content without one
(crates/dingooemu-libretro/src/api.rs:156-159,
crates/dingooemu-libretro/src/diagnostics.rs:8,
crates/dingooemu-libretro/src/diagnostics.rs:83-89,
crates/dingooemu-libretro/src/diagnostics.rs:310-318). No include_bytes!
data is compiled in. The .info declares firmware_count = 0: the one file
below is read from the content's directory, never from the system
directory.
files:
- name: "A330.HXF"
system: gemei-a330
required: false
storage: large_file
load_from: content_dir
size: 76352901
validation: [signature]
md5: "d8e1849773223a842076ca04053a13a4"
sha1: "69b3544d992a23e8b736c61837914a4d1b4e7bb5"
description: "Gemei A330 firmware update archive, V1.1 build3 of 2011-02-13"
note: >-
Mounted when an A330 package loads
(crates/dingooemu-core/src/a330/runtime.rs:415-418): the content's directory is
scanned and the first entry whose extension is hxf, in any case, is
read whole. The file must start with WADF0100 and declare at offset
20 a size within its own length. Each record is a u32 name length,
the name, one byte, a u32 data length and the data, and a zero name
length ends the table. Names are lowercased, backslashes turned to
slashes and a leading drive letter dropped, so Z:\SYSTEM\nls\c_936.nls
and system/nls/c_936.nls reach the same entry. The archive is the
last source consulted when a game opens a file the save directory,
the content directory, the package's resources and its appended zip
payload do not hold. Without it such an open fails and the runtime
goes on. The image itself is never hashed, and the hashes here name
the last firmware Gemei published, and the V1.10 image of 2011-01-25
indexes the same way.
source_ref: "crates/dingooemu-core/src/a330/firmware_archive.rs:16-50, 54-58, 63-96, 117-124, crates/dingooemu-core/src/a330/runtime/sdk_hle/files.rs:108-133"