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"