Files
libretro/emulators/azahar.yml
T
Abdessamad Derraz 811ccdfea0 fix: profile files cores read below the save dir
Read at each pinned commit: Azahar, Citra, Citra 2018, Panda3DS, Trident,
FS-UAE and Stella read these below the frontend save directory, Dolphin
and Ishiiruka below <save>/User, Cemu its MLC below <save>/Cemu. Each
profile names its library_name. Citra Canary reads sysdata from the
host data directory: its pin moves to the canary branch it is built from.
2026-10-22 19:58:35 +02:00

135 lines
5.6 KiB
YAML

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 <save_dir>/Azahar/, or to
<system_dir>/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"