Skip to content

XeniOS - RetroBIOS

Type standalone
Classification Community forks
Source https://github.com/xenios-jp/XeniOS
Upstream https://github.com/has207/xenia-edge
Version 2.0.1
Profiled 2026-08-23
Cores xenios, XENIOS
Systems microsoft-xbox-360
Technical notes

Apple-focused fork of Xenia, based on Xenia Edge, published from the xenios branch as xenios_macos_apple_silicon.dmg, xenios_macos_intel.dmg, xenios_macos_universal.dmg and xenios_ios_iphone_ipad.ipa. The macOS build names its bundle and executable Xenia-edge, the iOS build XeniOS (src/xenia/app/CMakeLists.txt:11-13, 175, 339-341). ES-DE runs it through the XENIOS rule with the ROM and an optional .commands file of extra arguments.

The 2.0.1 disk image holds one bundle: beside its code signature it carries Info.plist, MacOS/Xenia-edge, Resources/AppIcon.icns, Resources/Assets.car and two dylibs under Contents/Frameworks. Rendering runs on Metal. Guest DXBC is converted to DXIL through libdxilconv.dylib, built from the fork's own DirectX Shader Compiler branch, then to Metal IR through Apple's Metal Shader Converter (libmetalirconverter.dylib). Both are imported shared libraries copied into Frameworks and reached by @rpath (third_party/CMakeLists.txt:432-456, src/xenia/app/CMakeLists.txt:348-360), so the code calls IRCompilerCreate and DxcCreateInstance as ordinary symbols and never names either file (src/xenia/gpu/metal/metal_shader_converter.cc:83, src/xenia/gpu/metal/dxbc_to_dxil_converter.cc:103). MoltenVK is statically linked and its entry points resolve as real symbols, so the Vulkan backend loads no loader library (src/xenia/ui/vulkan/vulkan_instance.cc:30-39, 81-83).

No Xbox 360 system file is read. xboxkrnl, xam and xbdm are C++ HLE modules registered at startup (src/xenia/emulator.cc:425-427), the XEX1 and XEX2 retail keys and the zeroed devkit key are constexpr arrays tried in turn (src/xenia/cpu/xex_module.cc:55-63, used at 344, 503 and 925-935), and every XConfig setting is assembled from cvars and constants by BuildSetting, in a file that makes no filesystem call at all (src/xenia/kernel/xconfig.cc:87-246). Launching a system title symlinks \SystemRoot to that title's own mount and resolves xam.xex, then $flash_xam.xex, through the guest filesystem (src/xenia/emulator.cc:744-759); spa.bin is resolved the same way inside an installed DLC package (src/xenia/kernel/xam/content_manager.cc:31, 425-426).

The fork's data ships inside the executable. The UI font and the app icon are linked in by xe_embed_binary_assets, and the 33 locale catalogues are compiled from .po to .mo at configure time and packed into one compressed bundle (src/xenia/ui/CMakeLists.txt:55-58, 60-82), which wx_locale.cc serves through a loader that replaces the wxWidgets file-based one (src/xenia/ui/wx_locale.cc:43-111, 139-140). The font is read from that buffer with AddFontFromMemoryTTF (src/xenia/ui/imgui_drawer.cc:367-377), and xe::EmbeddedBundle decodes the SDL controller mappings (src/xenia/hid/sdl/sdl_input_driver.cc:148-166), the canary game patches (src/xenia/patcher/patch_db.cc:304-318) and the canary.json and stable.json compatibility lists (src/xenia/app/game_compat_db.cc:65-78).

Three cvars accept a file and name none by default, so nothing is expected at a fixed path: custom_font_path falls back to the embedded font (src/xenia/ui/imgui_drawer.cc:39-42, 353-377), mappings_file to the embedded controller database (src/xenia/hid/sdl/sdl_input_driver.cc:35-38, 148-166), achievement_sound_path leaves the achievement sound silent (src/xenia/ui/audio_helper.cc:21-24, 44-53). The first two carry an UPDATE_from_path rule that clears the earlier default out of an existing config (src/xenia/ui/imgui_drawer.cc:43-44, src/xenia/hid/sdl/sdl_input_driver.cc:39).

Everything under the storage root is written by the emulator or dropped in by the user: xenia-edge.config.toml and per-title config/.config.toml (src/xenia/config.cc:44-52), patches/*.patch.toml read on top of the embedded set (src/xenia/patcher/patch_db.cc:29-59), plugins/<title id>/plugins.toml behind allow_plugins, which defaults false (src/xenia/patcher/plugin_loader.cc:16-21, 32-34, 58-62), content, cache_host and the per-module executable_addr_flags.bin analysis cache (src/xenia/app/xenia_main.cc:588-613, src/xenia/cpu/xex_module.cc:1336-1343). portable.txt next to the executable keeps the storage root there instead of the user folder (src/xenia/app/xenia_main.cc:556-570). On iOS the embedded patches are written out to Documents/patches on first run (src/xenia/app/xenia_main_ios.mm:226-253) and touch layouts live as Documents/touch-layouts/<id>.toml, written by the layout editor (src/xenia/ui/ios/touch/touch_layout_store_ios.mm:133-140). The only bundle file the code opens by name is embedded.mobileprovision, absent from the published .ipa and present only once the user has signed it, read for a single log line reporting its size and two entitlements (src/xenia/app/xenia_main_ios.mm:170-193).</p> </details> <p>No BIOS or firmware files required.</p> <div class="admonition info"> <p class="admonition-title">Why no files</p> <p>XeniOS emulates the Xbox 360 by high-level emulation and reads no BIOS, firmware, NAND image, flash dump or keyvault at any point: the kernel, XAM and XBDM are compiled-in modules, the XEX AES keys are constant arrays and XConfig is synthesised. Its own data (UI font, icons, locale catalogues, SDL controller mappings, game patches, compatibility lists) is compressed into the executable through xe_embed_binary_assets and xe_embed_compressed_bundle, so none of it exists as a file beside the binary; the shipped bundle carries only the executable, its property list, an icon, a compiled asset catalog and the two shader translation dylibs. The three cvars that accept a path default to empty and fall back to those embedded copies. libmetalirconverter.dylib and libdxilconv.dylib are linked at build time and resolved by the loader through @rpath, no code path names them, and they are obtained by the same download that provides the executable.</p> </div> <p><em>Generated on 2026-08-23T16:12:06Z</em></p> </article> </div> <script>var tabs=__md_get("__tabs");if(Array.isArray(tabs))e:for(var set of document.querySelectorAll(".tabbed-set")){var labels=set.querySelector(".tabbed-labels");for(var tab of tabs)for(var label of labels.getElementsByTagName("label"))if(label.innerText.trim()===tab){var input=document.getElementById(label.htmlFor);input.checked=!0;continue e}}</script> <script>var target=document.getElementById(location.hash.slice(1));target&&target.name&&(target.checked=target.name.startsWith("__tabbed_"))</script> </div> <button type="button" class="md-top md-icon" data-md-component="top" hidden> <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M13 20h-2V8l-5.5 5.5-1.42-1.42L12 4.16l7.92 7.92-1.42 1.42L13 8z"/></svg> Back to top </button> </main> <footer class="md-footer"> <nav class="md-footer__inner md-grid" aria-label="Footer" > <a href="../xenia-edge/" class="md-footer__link md-footer__link--prev" aria-label="Previous: Xenia Edge"> <div class="md-footer__button md-icon"> <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M20 11v2H8l5.5 5.5-1.42 1.42L4.16 12l7.92-7.92L13.5 5.5 8 11z"/></svg> </div> <div class="md-footer__title"> <span class="md-footer__direction"> Previous </span> <div class="md-ellipsis"> Xenia Edge </div> </div> </a> <a href="../yabause/" class="md-footer__link md-footer__link--next" aria-label="Next: yabause"> <div class="md-footer__title"> <span class="md-footer__direction"> Next </span> <div class="md-ellipsis"> yabause </div> </div> <div class="md-footer__button md-icon"> <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M4 11v2h12l-5.5 5.5 1.42 1.42L19.84 12l-7.92-7.92L10.5 5.5 16 11z"/></svg> </div> </a> </nav> <div class="md-footer-meta md-typeset"> <div class="md-footer-meta__inner md-grid"> <div class="md-copyright"> <div class="md-copyright__highlight"> MIT for the tooling. BIOS and firmware files are third-party system software, preserved for personal backup, archival and interoperability. </div> Made with <a href="https://squidfunk.github.io/mkdocs-material/" target="_blank" rel="noopener"> Material for MkDocs </a> </div> <div class="md-social"> <a href="https://github.com/Abdess/retrobios" target="_blank" rel="noopener" title="RetroBIOS on GitHub" class="md-social__link"> <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512"><!--! Font Awesome Free 7.1.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2025 Fonticons, Inc.--><path d="M173.9 397.4c0 2-2.3 3.6-5.2 3.6-3.3.3-5.6-1.3-5.6-3.6 0-2 2.3-3.6 5.2-3.6 3-.3 5.6 1.3 5.6 3.6m-31.1-4.5c-.7 2 1.3 4.3 4.3 4.9 2.6 1 5.6 0 6.2-2s-1.3-4.3-4.3-5.2c-2.6-.7-5.5.3-6.2 2.3m44.2-1.7c-2.9.7-4.9 2.6-4.6 4.9.3 2 2.9 3.3 5.9 2.6 2.9-.7 4.9-2.6 4.6-4.6-.3-1.9-3-3.2-5.9-2.9M252.8 8C114.1 8 8 113.3 8 252c0 110.9 69.8 205.8 169.5 239.2 12.8 2.3 17.3-5.6 17.3-12.1 0-6.2-.3-40.4-.3-61.4 0 0-70 15-84.7-29.8 0 0-11.4-29.1-27.8-36.6 0 0-22.9-15.7 1.6-15.4 0 0 24.9 2 38.6 25.8 21.9 38.6 58.6 27.5 72.9 20.9 2.3-16 8.8-27.1 16-33.7-55.9-6.2-112.3-14.3-112.3-110.5 0-27.5 7.6-41.3 23.6-58.9-2.6-6.5-11.1-33.3 2.6-67.9 20.9-6.5 69 27 69 27 20-5.6 41.5-8.5 62.8-8.5s42.8 2.9 62.8 8.5c0 0 48.1-33.6 69-27 13.7 34.7 5.2 61.4 2.6 67.9 16 17.7 25.8 31.5 25.8 58.9 0 96.5-58.9 104.2-114.8 110.5 9.2 7.9 17 22.9 17 46.4 0 33.7-.3 75.4-.3 83.6 0 6.5 4.6 14.4 17.3 12.1C436.2 457.8 504 362.9 504 252 504 113.3 391.5 8 252.8 8M105.2 352.9c-1.3 1-1 3.3.7 5.2 1.6 1.6 3.9 2.3 5.2 1 1.3-1 1-3.3-.7-5.2-1.6-1.6-3.9-2.3-5.2-1m-10.8-8.1c-.7 1.3.3 2.9 2.3 3.9 1.6 1 3.6.7 4.3-.7.7-1.3-.3-2.9-2.3-3.9-2-.6-3.6-.3-4.3.7m32.4 35.6c-1.6 1.3-1 4.3 1.3 6.2 2.3 2.3 5.2 2.6 6.5 1 1.3-1.3.7-4.3-1.3-6.2-2.2-2.3-5.2-2.6-6.5-1m-11.4-14.7c-1.6 1-1.6 3.6 0 5.9s4.3 3.3 5.6 2.3c1.6-1.3 1.6-3.9 0-6.2-1.4-2.3-4-3.3-5.6-2"/></svg> </a> </div> </div> </div> </footer> </div> <div class="md-dialog" data-md-component="dialog"> <div class="md-dialog__inner md-typeset"></div> </div> <div class="md-progress" data-md-component="progress" role="progressbar"></div> <script id="__config" type="application/json">{"annotate": null, "base": "../..", "features": ["navigation.instant", "navigation.instant.prefetch", "navigation.instant.progress", "navigation.tabs", "navigation.tabs.sticky", "navigation.sections", "navigation.top", "navigation.tracking", "navigation.indexes", "navigation.prune", "navigation.footer", "search.suggest", "search.highlight", "search.share", "content.code.copy", "content.tabs.link", "toc.follow"], "search": "../../assets/javascripts/workers/search.2c215733.min.js", "tags": null, "translations": {"clipboard.copied": "Copied to clipboard", "clipboard.copy": "Copy to clipboard", "search.result.more.one": "1 more on this page", "search.result.more.other": "# more on this page", "search.result.none": "No matching documents", "search.result.one": "1 matching document", "search.result.other": "# matching documents", "search.result.placeholder": "Type to start searching", "search.result.term.missing": "Missing", "select.version": "Select version"}, "version": null}</script> <script src="../../assets/javascripts/bundle.d7400e89.min.js"></script> <script src="../../javascripts/site.js"></script> </body> </html>