Mandarine - RetroBIOS¶
Technical notes
Citra fork, renamed Mandarine-Neo at release 1.3.0. External files live in sysdata/ and nand/ under the user directory: user/ next to the executable when that directory exists, otherwise Mandarine on Windows and macOS and mandarine-emu on Linux, with Citra and citra-emu kept as legacy locations. ref: src/common/common_paths.h:16-70, src/common/file_util.cpp:770-839
InitKeys reads boot9.bin then aes_keys.txt. Encrypted content needs one of the two; a ROM without crypto reads neither. ref: src/core/hw/aes/key.cpp:315-324, src/core/file_sys/ncch_container.cpp:200-210
Failure to derive a key or to find a seed marks the content undecryptable and loading stops with ErrorEncrypted. ref: src/core/file_sys/ncch_container.cpp:219-223, src/core/file_sys/ncch_container.cpp:236-280, src/core/file_sys/ncch_container.cpp:347-349
System archives resolve to the NAND title tree. Shared font, Mii data, country list and bad word list fall back to open-source replacements built into the binary when the title is absent. ref: src/core/file_sys/archive_ncch.cpp:126-179, externals/open_source_archives/Readme.md
The embedded shared font only answers title low ID 0x00014002. CHN, KOR and TWN resolve to 0x00014102, 0x00014202 and 0x00014302, which fall through to shared_font.bin and then to ErrorSystemFiles, reported as recoverable. ref: src/core/hle/service/apt/apt.cpp:195-213, src/core/hle/service/apt/apt.cpp:276-291, src/mandarine_qt/main.cpp:3209-3215
ClCertA is read from NAND title 0x0004001B00010002 and its ctr-common-1-cert.bin and ctr-common-1-key.bin members are decrypted with the KeySlot 0x0D normal key. Both the title and the key slot are needed for authenticated HTTPS. ref: src/core/hle/service/http/http_c.cpp:1963-2036
System titles are downloaded and installed in-app from the Nintendo CDN, so the NAND title tree is not user-supplied. ref: src/mandarine_qt/configuration/configure_system.cpp:672-678, src/core/hle/service/am/am.cpp:536, src/core/nus_download.cpp:12-13
DumpKeys.gm9, a GodMode9 script producing aes_keys.txt and seeddb.bin, ships in the tree and documents sysdata/ as their destination. ref: dist/dumpkeys/README.md, dist/dumpkeys/DumpKeys.gm9
The plugin loader scans sdmc/luma/plugins/
mcu.dat holds per-installation MCU state that the emulator writes itself when the file is absent or carries the wrong magic. ref: src/core/hle/service/cfg/cfg.cpp:734-756, src/core/hle/service/cfg/cfg.h:425-439
sector0x96.bin is defined but read by no code path. ref: src/common/common_paths.h:70
7 files | 0 required, 7 optional | 7 in repo, 0 missing | 1 with HLE fallback
boot9.bin optional in repo
- Path:
sysdata/boot9.bin - System: nintendo-3ds
- Size: 64.0 KB
- Validation: size
- Source:
src/core/hw/aes/key.cpp:137-206,src/core/hw/rsa/rsa.cpp:49-80,src/common/common_paths.h:69 - AES key section read at offset 55760, RSA modulus and exponent at 0xB3E0 and 0xB4E0
aes_keys.txt optional in repo
- Path:
sysdata/aes_keys.txt - System: nintendo-3ds
- Source:
src/core/hw/aes/key.cpp:208-311,src/common/common_paths.h:68 - Platforms: bizhawk, emudeck, retrodeck
- key slots, common keys, DLP and NFC key Ys and NFC secrets, one per line
seeddb.bin optional in repo
- Path:
sysdata/seeddb.bin - System: nintendo-3ds
- Source:
src/core/file_sys/seed_db.cpp:12-58 - Platforms: bizhawk
- game seed database for 9.6+ titles; an empty database is written when the file is absent
shared_font.bin optional in repo HLE fallback
- Path:
sysdata/shared_font.bin - System: nintendo-3ds
- Source:
src/core/hle/service/apt/apt.cpp:254-270,src/common/common_paths.h:67 - legacy path, tried after the shared font system archive; decompressed BCFNT with the 0x80 byte APT header
CTCert.bin optional in repo
- Path:
sysdata/CTCert.bin - System: nintendo-3ds
- Size: 384 B
- Validation: size
- Source:
src/core/hle/service/am/am.cpp:2427-2454,src/core/hle/service/am/am.cpp:83-93,src/core/hle/service/am/am.h:95 - console client certificate; signature type must be 0x010005 and the issuer one of the two Nintendo CA G3 strings. The certificate here is assembled from a console OTP: signature and expiry read at 0x44 and 0x20, public key derived from the private key at 0x24 over sect233r1, and the whole body checked against Nintendo's root public key
SecureInfo_A optional in repo
- Path:
nand/rw/sys/SecureInfo_A - System: nintendo-3ds
- Size: 273 B
- Validation: size
- Source:
src/core/hle/service/cfg/cfg.cpp:608-610,src/core/hle/service/cfg/cfg.cpp:689-709,src/core/hle/service/cfg/cfg.h:180-186 - console region and serial number; loaded on a size check alone, and paired with LocalFriendCodeSeed_B
LocalFriendCodeSeed_B optional in repo
- Path:
nand/rw/sys/LocalFriendCodeSeed_B - System: nintendo-3ds
- Size: 272 B
- Validation: size
- Source:
src/core/hle/service/cfg/cfg.cpp:604-606,src/core/hle/service/cfg/cfg.cpp:711-732,src/core/hle/service/cfg/cfg.h:188-193 - friend code generation seed; loaded on a size check alone, and paired with SecureInfo_A
Generated on 2026-08-23T16:12:06Z