Cemu
Cemu emulates Nintendo Wii U. It reads 72 files, 1 of them required: without a required file it does not start games.
Run on its own, the app reads its files from this folder:
%APPDATA%/Cemu/
portable/ next to Cemu.exe when that folder exists, or the folder of Cemu.exe when settings.xml sits there.
Source: src/ (upstream emulator), src/ (upstream emulator)
~/
portable/ next to Cemu.app when that folder exists.
Source: src/ (upstream emulator)
$XDG_DATA_HOME/Cemu/, else ~/.local/share/Cemu/
portable/ next to the executable or the AppImage when that folder exists. Configuration sits in $XDG_CONFIG_HOME/Cemu, else ~/.config/Cemu.
Source: src/ (upstream emulator)
About this profile
Install this emulator's files
For Cemu inside RetroArch, Batocera or another setup. The installer finds your setup and its BIOS folder, then downloads only the files this emulator reads there and checks each one.
Open the Start menu. Type PowerShell and open it. Paste the line. Press Enter.
&([scriptblock]::Create((irm https://abdess.github.io/retrobios/i.ps1))) --emulator cemuOpen Terminal, in Applications, then Utilities. Paste the line. Press Return.
curl -fsSL https://abdess.github.io/retrobios/i | sh -s -- --emulator cemuOpen a terminal. Paste the line. Press Enter.
curl -fsSL https://abdess.github.io/retrobios/i | sh -s -- --emulator cemuSwitch to Desktop Mode. Open Konsole. Paste with Ctrl+Shift+V. Press Enter.
curl -fsSL https://abdess.github.io/retrobios/i | sh -s -- --emulator cemuOpen a terminal on the device. Or connect from a computer with SSH, a terminal over the network. Paste the line. Press Enter.
curl -fsSL https://abdess.github.io/retrobios/i | sh -s -- --emulator cemuTechnical notes
Wii U emulator. The libretro core is a fork of the Cemu tree with the wx application removed, kept merged with upstream, with the frontend glue in src/libretro/. The upstream_commit above is the last merge base. The repository builds the core and nothing else, as a bare shared object, for linux x86_64 and aarch64, windows x86_64, osx x86_64 and arm64, android arm64-v8a and x86_64, webos aarch64, ios arm64 and tvos arm64. Nothing that the standalone distribution carries next to the executable (resources/, gameProfiles/default/) comes with the core. The community graphic packs, which standalone downloads, are compiled into it. ref: CMakeLists.txt:4-7, src/CMakeLists.txt:75-90, .gitlab-ci.yml:123, 129, 152, 414, 435, 440, 448, 478, 564, 583
Path model. Cemu resolves every file through four roots: the user data path (keys.txt, otp.bin, seeprom.bin, cafeLibs/, graphicPacks/, shareddata.bin, resources/miiverse/, the default mlc01), the config path (settings.xml, network_services.xml, controllerProfiles/, per-title gameProfiles/), the data path (resources/sharedFonts/, gameProfiles/default/) and the MLC. The libretro core points user data, config, cache and data at <system_dir>/Cemu, and always puts the MLC at <save_dir>/Cemu/mlc01: it does not read settings.xml. The Cemu subdirectory is not doubled when the frontend already hands over a directory of that name (saves sorted per core). Standalone Cemu uses the portable directory next to the executable when it exists, otherwise the user data directory given per system in the data folder, and the MLC defaults to <user data>/mlc01. path: entries below are the libretro destination under the system directory, or under the save directory for the MLC (load_from), and standalone_path: is relative to the Cemu user data directory, which holds the MLC by default (load_from data_dir). The core reports library_name "Cemu" (src/libretro/CemuLibretro.cpp:4173). ref: src/libretro/CemuLibretro.cpp:2110-2170, src/libretro/CemuLibretro.cpp:4083-4091, src/gui/wxgui/CemuApp.cpp:90-123, src/gui/wxgui/CemuApp.cpp:127-171, src/config/ActiveSettings.cpp:295-321
keys.txt is read once from the user data path. A missing file is created with a comment header and an example key. Each line is stripped of comments, spaces, dashes and underscores and must then be 32 hex characters, otherwise an error is raised for that line. FindDiscKey tries every key in order against the encrypted partition header of a .wud/.wux and falls back to a 16-byte <image>.key next to the image. The libretro core asks that question before setting up any renderer and refuses the load with a message naming keys.txt when no key matches, so an encrypted disc image does not start without it. .wua archives, .rpx and NUS directories are not encrypted with a disc key and load without the file. ref: src/Cafe/Filesystem/FST/KeyCache.cpp:65-137, src/Cafe/Filesystem/FST/FST.cpp:192-246, src/libretro/CemuLibretro.cpp:6094-6142
Shared fonts. LoadSharedData runs at every title start and looks for the four fonts of title 0005001b-10042400 in the MLC first, then under resources/sharedFonts/ of the data path. All four must be found in one place or the other, otherwise none is loaded and the code tries shareddata.bin, a 32 MiB dump of the shared data region, read from the user data path straight into 0xF8000000. With nothing loaded a title that calls OSGetSharedData receives the placeholder font compiled into the binary, decompressed from a zlib array, so games run but with one Latin face standing in for the CJK sets. The four files in resources/sharedFonts/ of the source tree are Noto Sans CJK Medium faces under the console names, not dumps: the standalone distribution ships them, the libretro core does not and looks under <system_dir>/Cemu/resources/sharedFonts/. ref: src/Cafe/CafeSystem.cpp:286-365, src/Cafe/CafeSystem.cpp:907-911, src/Cafe/OS/libs/coreinit/coreinit.cpp:137-184, src/resource/CafeDefaultFont.cpp:2562-2569
Online files. iosuCrypto_init reads otp.bin and seeprom.bin from the user data path and rejects any size other than 1024 and 512 bytes. Without a valid OTP no certificate is loaded and online mode is off. The certificate table names 8 client certificates with their AES-encrypted RSA keys and 39 CA certificates, all under sys/title/0005001b/10054000/content/ of the MLC, and olive and wood appear twice under distinct ids, so 7 distinct client pairs and 39 CA files are read. A key file must be a non-empty multiple of 16 bytes and is decrypted with the key at OTP offset 0x120. Online mode is only enabled when every file of the table is present. For the libretro core these live in the save directory, not the system directory. ref: src/Cafe/IOSU/legacy/iosu_crypto.cpp:303-330, src/Cafe/IOSU/legacy/iosu_crypto.cpp:463-606, src/Cafe/IOSU/legacy/iosu_crypto.cpp:608-655, src/config/ActiveSettings.cpp:50-55, src/Cafe/Account/Account.cpp:422-458
cafeLibs. When a title depends on a module, the loader first looks for <module>.rpl in cafeLibs/ under the user data path and loads it in place of Cemu's own implementation, as long as the game profile does not set loadSharedLibraries to false (the default is true). Any Cafe OS module can be placed there. The code names snd_user.rpl and snduser2.rpl as the ones to dump when a title uses an unsupported audio effect, and gates swkbd.rpl and erreula.rpl on the presence of their data packs in the MLC (swkbd.pack of title 0005001b-1004f000, erreula.pack of 0005001b-10051000), falling back to the built-in applets when the pack is absent. ref: src/Cafe/OS/RPL/rpl.cpp:1929-1939, src/Cafe/OS/RPL/rpl.cpp:1971-1991, src/Cafe/OS/RPL/rpl.cpp:2142-2154, src/config/ActiveSettings.cpp:57-60, src/Cafe/OS/libs/snd_user/snd_user.cpp:1220-1227
Data directories. A title's game profile is read from gameProfiles/<title id>.ini under the config path, then from gameProfiles/default/<title id>.ini under the data path. Upstream ships 236 of them in bin/gameProfiles/default and the libretro data path is <system_dir>/Cemu. Standalone loads as a graphic pack every directory holding a rules.txt under graphicPacks/ of the user data path, and its downloader extracts the cemu_graphic_packs release into graphicPacks/downloadedGraphicPacks/. The libretro core carries its own copy of that set, zipped into the binary at build time from the dependencies/cemu_graphic_packs submodule. On each content load it compares the first line of graphicPacks/version.txt with the set it carries and, when they differ, deletes everything under <system_dir>/Cemu/graphicPacks and unpacks its set there. A user's own packs go in <system_dir>/Cemu/customGraphicPacks, where a folder replaces the bundled pack at the same relative path. The core enables the packs flagged default and those switched on through its core options. Miiverse posts for The Wind Waker HD are served from resources/miiverse/OfflineDB.zar under the user data path when the Nintendo network service is selected. ref: src/Cafe/GameProfile/GameProfile.cpp:181-195, src/Cafe/GraphicPack/GraphicPack2.cpp:96-111, src/gui/wxgui/DownloadGraphicPacksWindow.cpp:133, src/gui/wxgui/DownloadGraphicPacksWindow.cpp:234-238, src/libretro/embed_graphic_packs.cmake:8-54, src/libretro/LibretroGraphicPacks.cpp:30-103, src/libretro/CemuLibretro.cpp:6355, src/libretro/CemuLibretro.cpp:3541-3582, src/libretro/CemuLibretro.cpp:3895-3905, src/Cafe/OS/libs/nn_olv/nn_olv_OfflineDB.cpp:21-31, src/Cafe/OS/libs/nn_olv/nn_olv_OfflineDB.cpp:124-125, src/Cafe/OS/libs/nn_olv/nn_olv_InitializeTypes.cpp:242-248
Generated, not collected: settings.xml (standalone only), network_services.xml (custom service URLs, read when present), controllerProfiles/, title_list_cache.xml (standalone only, the core keeps no cache), the shader caches, log.txt, sdcard/, dump/, and the language.txt and country.txt that the wx frontend and the libretro core both write into title 0005001b-1005c000 of the MLC when absent. The core also creates titles/ under <system_dir>/Cemu and scans it for updates and DLC, which like title.tmd, title.tik and bootSound.btsnd belong to each title's own dump. The core writes account_name.txt under <system_dir>/Cemu with a "<persistent id> = <name>" line per account and names the accounts from it when a title starts. ref: src/main.cpp:117-141, src/config/NetworkSettings.cpp:10-14, src/gui/wxgui/CemuApp.cpp:580-606, src/libretro/CemuLibretro.cpp:2072-2108, src/libretro/CemuLibretro.cpp:4108-4114, src/libretro/CemuLibretro.cpp:4906-4918, src/Cafe/HW/Latte/Core/LatteShaderCache.cpp:232
72 files: 1 required, 71 optional. 17 have an HLE fallback.
In this collection: 71 in repo, 0 missing and 1 unsourceable.
Required
Section titled “Required”| File | Status |
|---|---|
keys.txtDisc title keys, one AES-128 key per line
Source
| in repo |
Optional
Section titled “Optional”| File | Status | Hash |
|---|---|---|
otp.binWii U OTP dump
Validation and source
| in repo | - |
seeprom.binWii U SEEPROM dump
Validation and source
| in repo | - |
CafeCn.ttfShared font, Simplified Chinese, console dump
Source
| in repo HLE fallback | - |
CafeKr.ttfShared font, Korean, console dump
Source
| in repo HLE fallback | - |
CafeStd.ttfShared font, standard Latin and Japanese, console dump
Source
| in repo HLE fallback | - |
CafeTw.ttfShared font, Traditional Chinese, console dump
Source
| in repo HLE fallback | - |
CafeCn.ttfShared font replacement, Noto Sans SC Medium
Hashes and source
| in repo HLE fallback libretro | SHA1 2d95227b9b3e |
CafeCn.ttfShared font replacement, Noto Sans SC Medium
Hashes, packages and source
| in repo HLE fallback standalone installed with the standalone emulator | SHA1 2d95227b9b3e |
CafeKr.ttfShared font replacement, Noto Sans KR Medium
Hashes and source
| in repo HLE fallback libretro | SHA1 f0ef38fcc613 |
CafeKr.ttfShared font replacement, Noto Sans KR Medium
Hashes, packages and source
| in repo HLE fallback standalone installed with the standalone emulator | SHA1 f0ef38fcc613 |
CafeStd.ttfShared font replacement, Noto Sans JP Medium
Hashes and source
| in repo HLE fallback libretro | SHA1 da0d4bcc3b13 |
CafeStd.ttfShared font replacement, Noto Sans JP Medium
Hashes, packages and source
| in repo HLE fallback standalone installed with the standalone emulator | SHA1 da0d4bcc3b13 |
CafeTw.ttfShared font replacement, Noto Sans TC Medium
Hashes and source
| in repo HLE fallback libretro | SHA1 8ec796192ebc |
CafeTw.ttfShared font replacement, Noto Sans TC Medium
Hashes, packages and source
| in repo HLE fallback standalone installed with the standalone emulator | SHA1 8ec796192ebc |
shareddata.binDump of the shared data region of a console
Source
| in repo HLE fallback | - |
snd_user.rplCafe OS sound library
Source
| in repo HLE fallback | - |
snduser2.rplCafe OS sound library, second generation
Source
| in repo HLE fallback | - |
swkbd.rplCafe OS software keyboard applet library
Source
| in repo HLE fallback | - |
erreula.rplCafe OS error viewer applet library
Source
| in repo HLE fallback | - |
swkbd.packSoftware keyboard applet data, title 0005001b-1004f000
Source
| in repo | - |
erreula.packError viewer applet data, title 0005001b-10051000
Source
| in repo | - |
OfflineDB.zarArchived Miiverse posts for The Wind Waker HD
Source
| unsourceable | - |
WIIU_COMMON_1_CERT.derClient certificate, common
Source
| in repo | - |
WIIU_COMMON_1_RSA_KEY.aesClient key, common, AES-CBC encrypted
Source
| in repo | - |
WIIU_ACCOUNT_1_CERT.derClient certificate, account
Source
| in repo | - |
WIIU_ACCOUNT_1_RSA_KEY.aesClient key, account, AES-CBC encrypted
Source
| in repo | - |
WIIU_OLIVE_1_CERT.derClient certificate, olive (Miiverse)
Source
| in repo | - |
WIIU_OLIVE_1_RSA_KEY.aesClient key, olive, AES-CBC encrypted
Source
| in repo | - |
WIIU_VINO_1_CERT.derClient certificate, vino (Nintendo TVii)
Source
| in repo | - |
WIIU_VINO_1_RSA_KEY.aesClient key, vino, AES-CBC encrypted
Source
| in repo | - |
WIIU_WOOD_1_CERT.derClient certificate, wood (eShop)
Source
| in repo | - |
WIIU_WOOD_1_RSA_KEY.aesClient key, wood, AES-CBC encrypted
Source
| in repo | - |
CACERT_NINTENDO_CA.der
Source
| in repo | - |
CACERT_NINTENDO_CA_G2.der
Source
| in repo | - |
CACERT_NINTENDO_CA_G3.der
Source
| in repo | - |
CACERT_NINTENDO_CLASS2_CA.der
Source
| in repo | - |
CACERT_NINTENDO_CLASS2_CA_G2.der
Source
| in repo | - |
CACERT_NINTENDO_CLASS2_CA_G3.der
Source
| in repo | - |
BALTIMORE_CYBERTRUST_ROOT_CA.der
Source
| in repo | - |
CYBERTRUST_GLOBAL_ROOT_CA.der
Source
| in repo | - |
VERIZON_GLOBAL_ROOT_CA.der
Source
| in repo | - |
GLOBALSIGN_ROOT_CA.der
Source
| in repo | - |
GLOBALSIGN_ROOT_CA_R2.der
Source
| in repo | - |
GLOBALSIGN_ROOT_CA_R3.der
Source
| in repo | - |
VERISIGN_CLASS3_PUBLIC_PRIMARY_CA_G3.der
Source
| in repo | - |
VERISIGN_UNIVERSAL_ROOT_CA.der
Source
| in repo | - |
VERISIGN_CLASS3_PUBLIC_PRIMARY_CA_G5.der
Source
| in repo | - |
THAWTE_PRIMARY_ROOT_CA_G3.der
Source
| in repo | - |
THAWTE_PRIMARY_ROOT_CA.der
Source
| in repo | - |
GEOTRUST_GLOBAL_CA.der
Source
| in repo | - |
GEOTRUST_GLOBAL_CA2.der
Source
| in repo | - |
GEOTRUST_PRIMARY_CA.der
Source
| in repo | - |
GEOTRUST_PRIMARY_CA_G3.der
Source
| in repo | - |
ADDTRUST_EXT_CA_ROOT.der
Source
| in repo | - |
COMODO_CA.der
Source
| in repo | - |
UTN_DATACORP_SGC_CA.der
Source
| in repo | - |
UTN_USERFIRST_HARDWARE_CA.der
Source
| in repo | - |
DIGICERT_HIGH_ASSURANCE_EV_ROOT_CA.der
Source
| in repo | - |
DIGICERT_ASSURED_ID_ROOT_CA.der
Source
| in repo | - |
DIGICERT_GLOBAL_ROOT_CA.der
Source
| in repo | - |
GTE_CYBERTRUST_GLOBAL_ROOT.der
Source
| in repo | - |
VERISIGN_CLASS3_PUBLIC_PRIMARY_CA.der
Source
| in repo | - |
THAWTE_PREMIUM_SERVER_CA.der
Source
| in repo | - |
EQUIFAX_SECURE_CA.der
Source
| in repo | - |
ENTRUST_SECURE_SERVER_CA.der
Source
| in repo | - |
VERISIGN_CLASS3_PUBLIC_PRIMARY_CA_G2.der
Source
| in repo | - |
ENTRUST_CA_2048.der
Source
| in repo | - |
ENTRUST_ROOT_CA.der
Source
| in repo | - |
ENTRUST_ROOT_CA_G2.der
Source
| in repo | - |
DIGICERT_ASSURED_ID_ROOT_CA_G2.der
Source
| in repo | - |
DIGICERT_GLOBAL_ROOT_CA_G2.der
Source
| in repo | - |
Profile data
Section titled “Profile data”Firmware titles
-
id: 0005001b-10042400, name: Shared fonts, required: no, note: Read from the MLC before the resources/sharedFonts/ copy of the data path., source ref:
src/Cafe/CafeSystem.cpp:286-296(emulator code, libretro port)-
content:
- CafeCn.ttf
- CafeKr.ttf
- CafeStd.ttf
- CafeTw.ttf
-
-
id: 0005001b-10054000, name: SSL certificates, required: no, note: Every file of the certificate table must be present for online mode, with a valid otp.bin and seeprom.bin., source ref:
src/Cafe/IOSU/legacy/iosu_crypto.cpp:463-521(emulator code, libretro port),src/Cafe/IOSU/legacy/iosu_crypto.cpp:535(emulator code, libretro port)-
content:
- ccerts/
- scerts/
-
-
id: 0005001b-1004f000, name: Software keyboard applet, required: no, note: Presence of the pack lets a dumped swkbd.rpl in cafeLibs/ replace the built-in keyboard., source ref:
src/Cafe/OS/RPL/rpl.cpp:1929-1933(emulator code, libretro port)-
content:
- content/00/swkbd/swkbd.pack
-
-
id: 0005001b-10051000, name: Error viewer applet, required: no, note: Presence of the pack lets a dumped erreula.rpl in cafeLibs/ replace the built-in error viewer., source ref:
src/Cafe/OS/RPL/rpl.cpp:1935-1939(emulator code, libretro port)-
content:
- content/00/erreula/erreula.pack
-
-
id: 0005001b-1005c000, name: Language and country lists, required: no, note: Written when absent, by the wx frontend on first run and by the libretro core at init., source ref:
src/gui/wxgui/CemuApp.cpp:580-606(upstream emulator),src/libretro/CemuLibretro.cpp:2072-2108(libretro glue)-
content:
- language.txt
- country.txt
-
MLC structure
- mlc01/sys/title/0005001b/10042400/content/
- mlc01/sys/title/0005001b/10054000/content/ccerts/
- mlc01/sys/title/0005001b/10054000/content/scerts/
- mlc01/sys/title/0005001b/1004f000/content/00/swkbd/
- mlc01/sys/title/0005001b/10051000/content/00/erreula/
- mlc01/sys/title/0005001b/1005c000/content/
- mlc01/usr/title/00050000/
- mlc01/usr/title/0005000c/
- mlc01/usr/title/0005000e/
- mlc01/usr/save/
- mlc01/usr/boss/
Data directories
Section titled “Data directories”cemu-gameprofiles>Cemu/gameProfiles/default: Cemu default game profiles (one .ini per title id)- Fetched from https://github.com/cemu-project/Cemu/archive/{version}.tar.gz
- Revision: 3310f3b8b184d64a62b89fd59088c799432badf5 (
3310f3b8b184d64a62b89fd59088c799432badf5) - Read by the libretro build only
- Source:
src/Cafe/GameProfile/GameProfile.cpp:181-195(emulator code, libretro port),src/libretro/CemuLibretro.cpp:2162-2170(libretro glue)
cemu-graphic-packs>Cemu/graphicPacks/downloadedGraphicPacks: Cemu community graphic packs, release Github981- Fetched from https://github.com/cemu-project/cemu_graphic_packs/releases/download/Github981/graphicPacks981.zip
- Revision: master (
0x8DF0B72EBE848B3) - Read by the standalone build only
- Source:
src/Cafe/GraphicPack/GraphicPack2.cpp:96-111(emulator code, libretro port),src/gui/wxgui/DownloadGraphicPacksWindow.cpp:234-238(upstream emulator)
Next steps
Section titled “Next steps”- Get your files, for the setup you play on
- Every system, and the files each one needs
- When a game does not start