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 data_root: windows: path: "%APPDATA%/Azahar" source_ref: "src/common/file_util.cpp:945-958, src/common/common_paths.h:24-25" note: "A user folder beside the executable is used instead when it exists." linux: path: "$XDG_DATA_HOME/azahar-emu, else ~/.local/share/azahar-emu" source_ref: "src/common/file_util.cpp:904-921, 965-975, src/common/common_paths.h:44-45" note: "A user folder in the working directory is used instead when it exists." macos: path: "~/Library/Application Support/Azahar" source_ref: "src/common/file_util.cpp:965-975, 999-1012, src/common/common_paths.h:34-40" note: "$XDG_DATA_HOME/azahar-emu is kept when it, or the XDG config or cache folder, already exists, and a user folder in the working directory takes precedence over both." android: path: "the folder picked in the setup wizard" source_ref: "src/android/app/src/main/java/org/citra/citra_emu/utils/PermissionsHandler.kt:19,49-56, src/android/app/src/main/java/org/citra/citra_emu/utils/DirectoryInitialization.kt:90-98, src/common/file_util.cpp:961-962" note: "No default: the user grants a folder through the system picker, stored as CITRA_DIRECTORY, and every user path is resolved inside it." # 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 The standalone user directory is the one data_root names per system, with citra-emu and lime3ds-emu (Citra and Lime3DS on Windows and macOS) kept as legacy locations. sysdata/, nand/ and sdmc/ sit under it. 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"