emulator: Azahar type: standalone + libretro core_classification: official_port source: "https://github.com/azahar-emu/azahar" upstream: "https://github.com/azahar-emu/azahar" profiled_date: "2026-10-22" source_commit: "219d743a1e698101fe1ab8bef43e6563126c3c27" core_version: "2126.2" display_name: "Nintendo - 3DS (Azahar)" library_name: "Azahar" cores: - azahar - azahar-sa systems: - nintendo-3ds # path: is where the libretro core reads a file below the save directory the # frontend hands it (load_from), standalone_path: where the standalone app # reads it under its user directory. notes: | Successor to Citra (via Lime3DS). The libretro core lives in the same repository (src/citra_libretro) and is built with ENABLE_LIBRETRO, which forces the SDL2, Qt and web service frontends off. ref: CMakeLists.txt:40, CMakeLists.txt:109-111, CMakeLists.txt:165-187 The libretro core moves the user directory to /Azahar/, or to /Azahar/ when the frontend gives no save directory. The core option "Azahar Default" keeps the standalone data directory instead. ref: src/citra_libretro/core_settings.cpp:592-603, src/citra_libretro/core_settings.cpp:1048-1080, src/citra_libretro/environment.cpp:191-208 The core reports library_name "Azahar". ref: src/citra_libretro/environment.cpp:269 Standalone data dir: azahar-emu under XDG_DATA_HOME (Azahar on Windows and macOS), with citra-emu and lime3ds-emu kept as legacy locations. A user/ directory beside the executable (Windows) or in the working directory takes precedence. sysdata/, nand/ and sdmc/ sit under the user directory. ref: src/common/common_paths.h:19-49, src/common/file_util.cpp:943-972, src/common/file_util.cpp:1023-1025 keys.txt has an AES-encrypted key blob compiled in, used when the file is absent. ENABLE_BUILTIN_KEYBLOB defaults to ON and is not among the options a libretro build forces off. ref: src/core/hw/aes/key.cpp:292-314, CMakeLists.txt:154, src/core/CMakeLists.txt:501-503 System archives (shared font, Mii data, country list, bad word list) are read from installed NAND titles. Open-source replacements embedded in the binary answer when the title is absent. ref: src/core/file_sys/archive_ncch.cpp:150-214, src/core/hle/service/apt/apt.cpp:211-276 boot9.bin and sector0x96.bin are defined but read by no code path. ref: src/common/common_paths.h:84-85 The .info declares no firmware. files: - name: keys.txt path: Azahar/sysdata/keys.txt standalone_path: sysdata/keys.txt load_from: {libretro: save_dir} system: nintendo-3ds required: false hle_fallback: true sha1: "5288772be438b86978a801e6dcb14228ad3a20af" md5: "4812e96097b7fc1bdd7b40366208b7a7" note: "AES key slots, common keys and NFC secrets. Embedded encrypted blob used if missing: default_keys_enc, AES-CBC with a zero key and IV, the hashes are those of the decrypted text" source_ref: "src/core/hw/aes/key.cpp:151-288, src/core/hw/aes/key.cpp:292-314, src/common/common_paths.h:83, src/core/hw/default_keys.h:11" - name: shared_font.bin path: Azahar/sysdata/shared_font.bin standalone_path: sysdata/shared_font.bin load_from: {libretro: save_dir} system: nintendo-3ds required: false hle_fallback: true note: "legacy path, tried when the shared font system archive fails to load" source_ref: "src/core/hle/service/apt/apt.cpp:278-293, src/core/hle/service/apt/apt.cpp:300-305, src/common/common_paths.h:82" - name: seeddb.bin path: Azahar/sysdata/seeddb.bin standalone_path: sysdata/seeddb.bin load_from: {libretro: save_dir} system: nintendo-3ds required: false note: "game seed database for 9.6+ titles, an empty one is written if absent" source_ref: "src/core/file_sys/seed_db.cpp:12-58" - name: otp.bin path: Azahar/sysdata/otp.bin standalone_path: sysdata/otp.bin load_from: {libretro: save_dir} system: nintendo-3ds required: false size: 256 validation: [size, crypto] note: "console-unique OTP, AES-CBC decrypted with the keys.txt OTP key, then checked against the OTP magic and its SHA-256" source_ref: "src/core/file_sys/otp.cpp:14-55, src/core/hw/unique_data.cpp:143-192, src/core/hw/unique_data.cpp:243-245" - name: movable.sed path: Azahar/nand/private/movable.sed standalone_path: nand/private/movable.sed load_from: {libretro: save_dir} system: nintendo-3ds required: false size: [288, 320] validation: [size, signature] on_mismatch: {signature: warn} note: "console-unique key seed, 288 bytes without the AES MAC block, 320 with it" source_ref: "src/core/hw/unique_data.cpp:194-233, src/core/hw/unique_data.cpp:247-249, src/core/hw/unique_data.h:103-133" - name: SecureInfo_A path: Azahar/nand/rw/sys/SecureInfo_A standalone_path: nand/rw/sys/SecureInfo_A load_from: {libretro: save_dir} system: nintendo-3ds required: false size: 273 validation: [size, signature] on_mismatch: {signature: warn} note: "console serial and region. A failed signature is retried against every region" source_ref: "src/core/hw/unique_data.cpp:48-103, src/core/hw/unique_data.cpp:235-237, src/core/hw/unique_data.h:57" - name: LocalFriendCodeSeed_B path: Azahar/nand/rw/sys/LocalFriendCodeSeed_B standalone_path: nand/rw/sys/LocalFriendCodeSeed_B load_from: {libretro: save_dir} system: nintendo-3ds required: false size: 272 validation: [size, signature] on_mismatch: {signature: warn} note: "friend code generation seed" source_ref: "src/core/hw/unique_data.cpp:105-141, src/core/hw/unique_data.cpp:239-241, src/core/hw/unique_data.h:76"