From ea0b7536bb7d8acc92e180ee3632c18b3a8dd00c Mon Sep 17 00:00:00 2001 From: Abdessamad Derraz <3028866+Abdess@users.noreply.github.com> Date: Mon, 26 Oct 2026 23:20:44 +0100 Subject: [PATCH] feat: profile x1-box 1.3.2 The default core is now hakuX, an HLE kernel that needs no firmware, so the MCPX, flash and disk images are only required by the xemu core. The Chihiro driver is now built: Chihiro BIOS, media board flash and the three baseboard EEPROMs are read beside the flash image. SDL3 replaces SDL2, so the user mapping file is gamepad_map.txt. --- emulators/x1-box.yml | 290 +++++++++++++++++++++++++++++++------------ 1 file changed, 208 insertions(+), 82 deletions(-) diff --git a/emulators/x1-box.yml b/emulators/x1-box.yml index c9c6b83f7..0bf800383 100644 --- a/emulators/x1-box.yml +++ b/emulators/x1-box.yml @@ -4,55 +4,84 @@ core_classification: community_fork source: "https://github.com/izzy2lost/xemu" upstream: "https://github.com/xemu-project/xemu" author: "izzy2lost" -profiled_date: "2026-08-12" -source_commit: "3ed53f6843ac41147287468d996dfa939b40ad00" +profiled_date: "2026-10-26" +source_commit: "e092175b9196438ee2712bf6f45398fe2970b5fe" upstream_commit: "26fcbe54f17e496bdf530dad9f237e74e2f943fc" -core_version: "1.2.6" +core_version: "1.3.2" display_name: "Microsoft - Xbox (X1 BOX)" cores: - "x1-box" - "x1box" systems: - microsoft-xbox + - sega-chihiro mode: standalone notes: | Original Xbox emulator for Android, package com.izzy2lost.x1box, arm64-v8a. A Kotlin front end carries the launcher, setup wizard, game library, settings - and per-title overrides, and drives a whole xemu tree built through CMake - against SDL2 and QEMU 10.2.0. The imgui interface, the monitor and the - snapshot entry points are stubbed, so that front end is the only interface. - .LauncherActivity answers VIEW with a content or file URI, and that URI - becomes the disc slot before emulation opens. + and per-title overrides, and runs a game in one of two cores. The xemu core + is a whole xemu tree built through CMake against SDL3 3.4.14 and QEMU + 10.2.0, its imgui interface, monitor and snapshot entry points stubbed. The + hakuX core, built from android/hakux, runs the game on FEX with an HLE Xbox + kernel and an HLE GPU, and is the global default. A game can override the + choice. .LauncherActivity answers VIEW with a content or file URI, and that + URI becomes the disc slot before emulation opens. ref: QEMU_VERSION, - android/app/build.gradle.kts:49, 55, 64-65, 68, - android/app/src/main/AndroidManifest.xml:13-30, - android/app/src/main/cpp/CMakeLists.txt:858, 867-868, - android/app/src/main/java/com/izzy2lost/x1box/LauncherActivity.kt:37, - 92-121 + android/app/build.gradle.kts:49-54, 98, 104, 117, + android/app/src/main/AndroidManifest.xml:15-31, + android/app/src/main/cpp/CMakeLists.txt:79-80, 902, 911-912, + android/app/src/main/java/com/izzy2lost/x1box/HakuxLaunch.kt:25-34, + android/app/src/main/java/com/izzy2lost/x1box/LauncherActivity.kt:41, + 99-130 - The wizard walks four steps and each Next stays disabled until its own step - resolves: the MCPX boot ROM, the flash ROM, the disk image and a games - folder. The two ROM pickers keep .bin, .rom and .img, the disk picker .qcow2 - and .img. A pick is fingerprinted before anything is written, and only a file - that passes is copied into x1box under the external files directory as - mcpx.bin, flash.bin or hdd.img. A file chosen as a path in place is kept as - that path instead. Those names, the eeprom the wizard never asks for and the - disc are written to x1box/xemu.toml under sys.files. The disc is handed to - QEMU as a file descriptor through -add-fd and only copied to x1box/dvd.iso - when that fails. - ref: android/app/src/main/java/com/izzy2lost/x1box/SetupWizardActivity.kt:63-139, - 243-278, 411-459, - android/app/src/main/cpp/xemu_android.cpp:717-721, 757-870, 1315-1325 + The hakuX core needs no firmware. It boots the disc's default.xbe under its + own kernel, creates its 256-byte console EEPROM as eeprom.bin in its own + disk folder when none is there, and keeps saves in that folder when no disk + image is set. + ref: android/hakux/core/native/kernel/ex.c:172-225, + android/app/src/main/java/com/izzy2lost/x1box/HakuxLaunch.kt:36-41 - The three images are what the app gates on. The launcher sends the user back - through the wizard whenever the MCPX, the flash, the disk or the games folder - stops resolving, and an intent from a frontend reaches the emulator only once - the three images resolve. The core underneath is looser: an empty MCPX path - simply leaves the machine property off, an empty disk path attaches no drive + The wizard walks four steps: the MCPX boot ROM, the flash ROM, the disk + image and a games folder. With the xemu core chosen globally each Next stays + disabled until its own step resolves. With hakuX the three firmware steps + can be skipped, and only the games folder is required. The two ROM pickers + keep .bin, .rom and .img, the disk picker .qcow2 and .img. A pick is + fingerprinted before anything is written, and only a file that passes is + copied into x1box under the external files directory as mcpx.bin, flash.bin + or hdd.img. A file chosen as a path in place is kept as that path instead. + Those names, the eeprom the wizard never asks for and the disc are written + to x1box/xemu.toml under sys.files. The disc is handed to QEMU as a file + descriptor through -add-fd and only copied to x1box/dvd.iso when that fails. + ref: android/app/src/main/java/com/izzy2lost/x1box/SetupWizardActivity.kt:66-147, + 173-176, 281-303, 436-484, + android/app/src/main/cpp/xemu_android.cpp:866-870, 949-1082, 1660-1673 + + The launcher sends the user back through the wizard whenever the games + folder stops resolving, and, when the global core is xemu, whenever the + MCPX, the flash or the disk does. A frontend intent for a game that runs in + hakuX starts it directly, one for xemu only once the three images resolve. + The xemu core underneath is looser: an MCPX path that is empty or not 512 + bytes leaves the machine property off, an empty disk path attaches no drive at index 0, and only the flash clears autostart on its own. - ref: android/app/src/main/java/com/izzy2lost/x1box/LauncherActivity.kt:117-135, - system/vl.c:3000-3022, 3057-3072, 3078-3092 + ref: android/app/src/main/java/com/izzy2lost/x1box/LauncherActivity.kt:49-50, + 129-168, + system/vl.c:3074-3099, 3133-3149, 3160-3174 + + The xemu core also emulates the Sega Chihiro arcade board when Chihiro mode + is on, which forces 128 MiB of RAM and keeps the console EEPROM apart as + eeprom_chihiro.bin. The Chihiro BIOS then takes the flash slot, and the + MCPX ROM is not overlaid on it. The media board flash and the baseboard + EEPROMs are looked up by name beside that BIOS, since the Android build + leaves every chihiro.roms path empty. The network board firmware is read + only for a cabinet link, which this build never enables. A Chihiro game is a + netboot image or an extracted folder holding boot.id, both content. + ref: hw/xbox/chihiro/chihiro.c:58-61, hw/xbox/xbox.c:166-176, + hw/xbox/xbox.c:416-450, system/vl.c:2922-2944, system/vl.c:3152-3156, + hw/xbox/chihiro/chihiro.c:546-559, + android/app/src/main/cpp/xemu_settings_android.cc:116-139, + android/app/src/main/res/values/strings.xml:157, + android/app/src/main/java/com/izzy2lost/x1box/SettingsActivity.kt:3063-3090 Settings imports a dashboard tree from a ZIP or a folder into the FATX partitions of the configured disk image, C at 0x8CA80000 and E at 0xABE80000, @@ -64,10 +93,10 @@ notes: | games. The status line probes C for xboxdash.xbe, msdash.xbe, xbox.xtf and the directories xodash, audio, fonts and xboxdashdata.*, and calls the install complete when the boot XBE sits beside at least one of the others. - ref: android/app/src/main/cpp/xemu_fatx_import.c:51-54, 1786-1801, 1842-1847, - 1864-1911, + ref: android/app/src/main/cpp/xemu_fatx_import.c:51-54, 1838-1853, 1897-1902, + 1919-1966, android/app/src/main/java/com/izzy2lost/x1box/XboxInsigniaHelper.kt:10-53, - android/app/src/main/java/com/izzy2lost/x1box/SettingsActivity.kt:2370-2445 + android/app/src/main/java/com/izzy2lost/x1box/SettingsActivity.kt:2608-2683 Preparing Insignia turns the NAT backend on and writes the DNS 46.101.64.175 into the config sector of the disk image and into the EEPROM at 0xAC. @@ -81,16 +110,16 @@ notes: | settings both writes and reads back. ref: android/app/src/main/java/com/izzy2lost/x1box/XboxInsigniaHelper.kt:7-8, 62-77, - android/app/src/main/java/com/izzy2lost/x1box/XboxEepromEditor.kt:17, - 159-213, + android/app/src/main/java/com/izzy2lost/x1box/XboxEepromEditor.kt:18, + 164-218, android/app/src/main/java/com/izzy2lost/x1box/XboxHddFormatter.kt:7-16, 46-50, - android/app/src/main/java/com/izzy2lost/x1box/SettingsActivity.kt:48-56, - 1030-1086, 1432-1445 + android/app/src/main/java/com/izzy2lost/x1box/SettingsActivity.kt:51-79, + 1138-1194, 1670-1683 files: - name: mcpx_1.0.bin - required: true + required: false path: "x1box/mcpx.bin" config_key: "sys.files.bootrom_path" size: 512 @@ -98,7 +127,9 @@ files: validation: [size, md5] description: "MCPX southbridge boot ROM" note: >- - The only file the app verifies by content. A pick is accepted just when + Booted by the xemu core only, so the wizard asks for it only when that + core is the global choice. The only file the app verifies by content. A + pick is accepted just when its MD5 equals the value hardcoded in the wizard, which is the v1.0 boot ROM. Anything else is refused with the expected hash quoted, and the 512-byte dump whose MD5 is 196a5f59a13382c185636e691d6c323d is named @@ -107,42 +138,44 @@ files: is dropped. The loader then checks the size a second time and ends the process when it is not 512 bytes. The bytes are read over the last 512 of the flash image and the region stays writable so early retail kernels - keep their cache quirk. - source_ref: "source android/app/src/main/java/com/izzy2lost/x1box/SetupWizardActivity.kt:23-25, 67-91, 411-459, 461-500, source android/app/src/main/res/values/strings.xml:19-21, source system/vl.c:2998-3022, source hw/xbox/xbox.c:143-172" + keep their cache quirk. In Chihiro mode the image is left as it is, the + Chihiro BIOS carrying its own boot code. + source_ref: "source android/app/src/main/java/com/izzy2lost/x1box/SetupWizardActivity.kt:23-25, android/app/src/main/java/com/izzy2lost/x1box/SetupWizardActivity.kt:75-99, android/app/src/main/java/com/izzy2lost/x1box/SetupWizardActivity.kt:436-484, android/app/src/main/java/com/izzy2lost/x1box/SetupWizardActivity.kt:23, source android/app/src/main/res/values/strings.xml:21-23, source system/vl.c:3075-3099, source hw/xbox/xbox.c:151-193" - name: Complex_4627.bin - required: true + required: false path: "x1box/flash.bin" config_key: "sys.files.flashrom_path" - min_size: 65536 - size_note: "Any non-zero multiple of 65536; 256 KB is assumed when the image cannot be read." + size: [262144, 524288, 1048576] + size_note: "The picker takes these three sizes. The loader takes any non-zero multiple of 65536 and assumes 256 KB filled with 0xFF otherwise." validation: [size] description: "Xbox flash ROM" note: >- - Passed as -bios, and the one image whose absence stops the run on its - own: a path that cannot be opened queues an error and clears autostart. - The picker only refuses what looks like the boot ROM, a 512-byte file or - either MCPX hash, and asks for a BIOS instead. There is no positive hash - to match. The image is mapped at 0xFF000000 and mirrored to the top of + Booted by the xemu core only. Passed as -bios, and the one image whose + absence stops an xemu run on its own: a path that cannot be opened + queues an error and clears autostart. The picker refuses what looks like + the boot ROM, a 512-byte file or either MCPX hash, then any size other + than 256 KB, 512 KB or 1 MB. There is no positive hash to match. The image is mapped at 0xFF000000 and mirrored to the top of the address space. A size that is zero or not a multiple of 64 KB, or a short read, falls back to 256 KB filled with 0xFF. A retail image cannot launch unsigned code, so a debug or modified image is what boots a title. - source_ref: "source system/vl.c:3057-3072, source hw/xbox/xbox.c:64-102, source android/app/src/main/java/com/izzy2lost/x1box/SetupWizardActivity.kt:64, 93-116, 487-495" + source_ref: "source system/vl.c:3134-3149, source hw/xbox/xbox.c:72-110, source android/app/src/main/java/com/izzy2lost/x1box/SetupWizardActivity.kt:72, android/app/src/main/java/com/izzy2lost/x1box/SetupWizardActivity.kt:101-124, android/app/src/main/java/com/izzy2lost/x1box/SetupWizardActivity.kt:512-531" - name: xbox_hdd.qcow2 - required: true + required: false path: "x1box/hdd.img" config_key: "sys.files.hdd_path" description: "Xbox hard disk image" note: >- Taken in qcow2 or raw form and attached as index 0 with locked=on and cache=writethrough. An empty setting attaches no drive at all and an - unopenable one only queues a message, but the launcher refuses to leave - the wizard until the file resolves. The formatter builds FATX partitions + unopenable one only queues a message, but with the xemu core as the + global choice the launcher refuses to leave the wizard until the file + resolves. A hakuX run's saves are copied into it before xemu opens it. The formatter builds FATX partitions inside an image that already exists and needs at least 0x1DD156000 bytes for the retail layout. It never creates the image. Partitions C and E of this image are what the dashboard import writes into. - source_ref: "source system/vl.c:3078-3092, source android/app/src/main/java/com/izzy2lost/x1box/SetupWizardActivity.kt:65, 118-139, source android/app/src/main/java/com/izzy2lost/x1box/XboxHddFormatter.kt:7-16, 46-50, source android/app/src/main/cpp/xemu_android.cpp:822-843" + source_ref: "source system/vl.c:3160-3174, source android/app/src/main/java/com/izzy2lost/x1box/SetupWizardActivity.kt:73, android/app/src/main/java/com/izzy2lost/x1box/SetupWizardActivity.kt:126-147, source android/app/src/main/java/com/izzy2lost/x1box/XboxHddFormatter.kt:7-16, 46-50, source android/app/src/main/cpp/xemu_android.cpp:1016-1037, source android/app/src/main/java/com/izzy2lost/x1box/LauncherActivity.kt:146-153" - name: eeprom.bin required: false @@ -153,12 +186,106 @@ files: description: "Xbox EEPROM image" note: >- Always pointed at x1box/eeprom.bin, a path the wizard never asks for. - Generated as XBOX_EEPROM_VERSION_R1 when it does not exist, so a dump is - needed only to carry over a console serial, region or HDD key. It is - attached through the smbus-storage device. A size other than 256 bytes, + Generated as XBOX_EEPROM_VERSION_R1 when it does not exist. A file whose + checksum matches another key version, R2 and R3 dumps included, is + deleted and generated again, so only an R1 dump carries a console + serial, region or HDD key over. A video standard the kernel rejects is + reset to NTSC-M in place. It is attached through the smbus-storage + device. A size other than 256 bytes, or a generation that fails, clears autostart. Preparing Insignia and the EEPROM editor write to it in place. - source_ref: "source system/vl.c:2921-2964, 3045-3055, source android/app/src/main/cpp/xemu_android.cpp:757-759, 719, source android/app/src/main/cpp/xemu_settings_android.cc:246-286, source android/app/src/main/java/com/izzy2lost/x1box/SettingsActivity.kt:2748-2751" + source_ref: "source system/vl.c:2946-3041, system/vl.c:3122-3132, source android/app/src/main/cpp/xemu_android.cpp:949-951, android/app/src/main/cpp/xemu_android.cpp:868, source android/app/src/main/cpp/xemu_settings_android.cc:274-313, source android/app/src/main/java/com/izzy2lost/x1box/SettingsActivity.kt:2986-2989" + + - name: eeprom_chihiro.bin + system: sega-chihiro + required: false + path: "x1box/eeprom_chihiro.bin" + size: 256 + validation: [size] + description: "Chihiro console EEPROM image" + note: >- + The EEPROM a Chihiro session opens instead of eeprom.bin, the configured + name with _chihiro before its extension. Generated as + XBOX_EEPROM_VERSION_D, the debug key the Chihiro BIOS expects, when it + does not exist, and deleted and generated again when it carries another + key version. + source_ref: "source system/vl.c:2922-2944, system/vl.c:2950-2995, system/vl.c:3007-3018" + + - name: chihiro_xbox_bios.bin + system: sega-chihiro + required: false + path: "x1box/flash.bin" + config_key: "sys.files.flashrom_path" + size: 524288 + sha1: "b700b0041af8f84835e45d1d1250247bf7077188" + description: "Chihiro BIOS" + note: >- + Takes the flash slot in Chihiro mode and is passed as -bios like a + retail image, through the same picker. chihiro_bios_known names this + 512 KB image by its SHA-1, but nothing in this build calls it, so the + hash is not checked. The media board files are then looked up in the + folder of this file. + source_ref: "source hw/xbox/chihiro/chihiro.c:2326-2338, source system/vl.c:3133-3149, source hw/xbox/xbox.c:166-176, source android/app/src/main/res/values/strings.xml:157" + + - name: fpr21042_m29w160et.bin + system: sega-chihiro + required: false + path: "x1box/fpr21042_m29w160et.bin" + max_size: 4194304 + validation: [size] + description: "Media board flash ROM (SEGABOOT)" + note: >- + The first of three names tried beside the BIOS, then in its parent + folder. Read whole when it is not empty and at most 4 MB. Settings + installs a picked file into x1box under the matching name, or under this + one when the picked name matches none. Without it an error is logged and + the media board IDE serves no SEGABOOT. The board serial comes from the + MBDT header at 0xFFE00. + source_ref: "source hw/xbox/chihiro/chihiro.c:2305-2324, source hw/xbox/chihiro/chihiro.c:2342-2380, source hw/xbox/chihiro/chihiro.c:537-541, source hw/xbox/xbox.c:423-429, source android/app/src/main/java/com/izzy2lost/x1box/SettingsActivity.kt:3003-3056" + + - name: fpr-23887_29lv160te.ic4 + system: sega-chihiro + required: false + path: "x1box/fpr-23887_29lv160te.ic4" + aliases: [fpr-23887.bin] + max_size: 4194304 + validation: [size] + description: "Media board flash ROM, later revision" + note: "Read in place of fpr21042_m29w160et.bin when that one is absent, under either name." + source_ref: "source hw/xbox/chihiro/chihiro.c:2366-2380" + + - name: ic10_g24lc64.bin + system: sega-chihiro + required: false + hle_fallback: true + path: "x1box/ic10_g24lc64.bin" + size: 8192 + validation: [size] + description: "Base board QC EEPROM" + note: "Read beside the BIOS only at exactly 8192 bytes. Otherwise the House of the Dead 3 dump compiled into chihiro-firmware.h stands in." + source_ref: "source hw/xbox/chihiro/chihiro.c:2382-2451, source hw/xbox/xbox.c:433-438, source hw/xbox/chihiro/chihiro-firmware.h:24-25" + + - name: pc20_g24lc64.bin + system: sega-chihiro + required: false + hle_fallback: true + path: "x1box/pc20_g24lc64.bin" + size: 8192 + validation: [size] + description: "Base board SC EEPROM" + note: "Read beside the BIOS only at exactly 8192 bytes. Otherwise the House of the Dead 3 dump compiled into chihiro-firmware.h stands in." + source_ref: "source hw/xbox/chihiro/chihiro.c:2382-2451, source hw/xbox/xbox.c:439-444, source hw/xbox/chihiro/chihiro-firmware.h:540-541" + + - name: ic11_24lc024.bin + system: sega-chihiro + required: false + hle_fallback: true + path: "x1box/ic11_24lc024.bin" + size: 128 + validation: [size] + description: "Base board configuration EEPROM" + note: "Read beside the BIOS only at exactly 128 bytes. Otherwise the House of the Dead 3 dump compiled into chihiro-firmware.h stands in." + source_ref: "source hw/xbox/chihiro/chihiro.c:2382-2451, source hw/xbox/xbox.c:445-450, source hw/xbox/chihiro/chihiro-firmware.h:1056-1057" - name: xboxdash.xbe required: false @@ -172,7 +299,7 @@ files: boot counts as ready only once the name exists. The start path of the emulator never reads partition C, and preparing Insignia finishes with a warning when the name is missing. - source_ref: "source android/app/src/main/cpp/xemu_fatx_import.c:1796-1797, 1842-1843, 1864-1911, source android/app/src/main/java/com/izzy2lost/x1box/SettingsActivity.kt:2370-2401, 2436-2445, 2518, 2536-2538" + source_ref: "source android/app/src/main/cpp/xemu_fatx_import.c:1848-1849, android/app/src/main/cpp/xemu_fatx_import.c:1897-1898, android/app/src/main/cpp/xemu_fatx_import.c:1919-1966, source android/app/src/main/java/com/izzy2lost/x1box/SettingsActivity.kt:2608-2639, android/app/src/main/java/com/izzy2lost/x1box/SettingsActivity.kt:2674-2683, android/app/src/main/java/com/izzy2lost/x1box/SettingsActivity.kt:2756, android/app/src/main/java/com/izzy2lost/x1box/SettingsActivity.kt:2774-2776" - name: msdash.xbe required: false @@ -184,7 +311,7 @@ files: Its presence beside the boot XBE is one of the marks the status line reads to call a dashboard install complete, and it is one of the names that decide which directory of a picked tree is taken as the source root. - source_ref: "source android/app/src/main/cpp/xemu_fatx_import.c:1798-1799, 1844-1845, source android/app/src/main/java/com/izzy2lost/x1box/XboxInsigniaHelper.kt:13, 42-50, source android/app/src/main/java/com/izzy2lost/x1box/SettingsActivity.kt:2518, 2539-2541" + source_ref: "source android/app/src/main/cpp/xemu_fatx_import.c:1850-1851, android/app/src/main/cpp/xemu_fatx_import.c:1899-1900, source android/app/src/main/java/com/izzy2lost/x1box/XboxInsigniaHelper.kt:13, 42-50, source android/app/src/main/java/com/izzy2lost/x1box/SettingsActivity.kt:2756, android/app/src/main/java/com/izzy2lost/x1box/SettingsActivity.kt:2777-2779" - name: xbox.xtf required: false @@ -195,7 +322,7 @@ files: Probed at the root of partition C and imported with the rest of the tree, alongside the xodash, audio, fonts and xboxdashdata.* directories the root scan looks for. - source_ref: "source android/app/src/main/cpp/xemu_fatx_import.c:1786-1794, 1800-1801, 1846-1847, source android/app/src/main/java/com/izzy2lost/x1box/XboxInsigniaHelper.kt:12, 14-16, source android/app/src/main/java/com/izzy2lost/x1box/SettingsActivity.kt:2518, 2542-2543" + source_ref: "source android/app/src/main/cpp/xemu_fatx_import.c:1838-1846, android/app/src/main/cpp/xemu_fatx_import.c:1852-1853, android/app/src/main/cpp/xemu_fatx_import.c:1901-1902, source android/app/src/main/java/com/izzy2lost/x1box/XboxInsigniaHelper.kt:12, 14-16, source android/app/src/main/java/com/izzy2lost/x1box/SettingsActivity.kt:2756, android/app/src/main/java/com/izzy2lost/x1box/SettingsActivity.kt:2780-2781" - name: ".zip" required: false @@ -225,7 +352,7 @@ files: mapping goes in through controller_map.txt instead. The revision shipped here is 589031 bytes and is not the one other releases carry under this name. - source_ref: "source android/app/src/main/cpp/xemu_android.cpp:205-206, 236-275, 1192-1197" + source_ref: "source android/app/src/main/cpp/xemu_android.cpp:252-253, android/app/src/main/cpp/xemu_android.cpp:283-322, android/app/src/main/cpp/xemu_android.cpp:1529-1534" - name: X1_Covers.txt required: false @@ -235,30 +362,29 @@ files: Read from the assets and turned into a lookup from normalised game name to a URL under the X1_Covers repository, which the library fetches and caches per title. Only lines ending in .png are kept. - source_ref: "source android/app/src/main/java/com/izzy2lost/x1box/GameLibraryActivity.kt:103, 895-935" + source_ref: "source android/app/src/main/java/com/izzy2lost/x1box/GameLibraryActivity.kt:136, android/app/src/main/java/com/izzy2lost/x1box/GameLibraryActivity.kt:1494-1540" - - name: controller_map.txt + - name: gamepad_map.txt required: false load_from: internal_storage - description: "Extra SDL controller mappings" + description: "Extra SDL gamepad mappings" note: >- - SDL builds this path from the internal storage directory of the package - when SDL_GAMECONTROLLERCONFIG_FILE is unset, which it is here, and reads - it while the game controller subsystem starts, after the mappings - compiled in. It is the one mapping file a user can add without - rebuilding the package. The SDL2 tree in thirdparty is what the build - compiles, the local checkout taking precedence over the release archive - CMake would otherwise fetch. - source_ref: "source thirdparty/SDL2/src/joystick/SDL_gamecontroller.c:1873-1885, 1890-1907, source android/app/src/main/cpp/CMakeLists.txt:61-72" + SDL 3.4.14, which CMake downloads as a release archive when + thirdparty/SDL3 is absent, builds this path from the internal storage + directory of the package when SDL_GAMECONTROLLERCONFIG_FILE is unset, + which it is here, and reads it while the gamepad subsystem starts, after + the mappings compiled in. It is the one mapping file a user can add + without rebuilding the package. + source_ref: "SDL src/joystick/SDL_gamepad.c:2972-2984, SDL src/joystick/SDL_gamepad.c:3007-3009, source android/app/src/main/cpp/CMakeLists.txt:79-84, source android/app/src/main/cpp/CMakeLists.txt:104-112" exclusion_note: > Two file loads present in the tree are not reached by this build and are not - listed. hw/xbox/chihiro.c falls back to the media board ROM when no path is - given and maps a media board filesystem image beside it, but the whole driver - is filtered out of the source list, so no Chihiro machine exists here. + listed. The Chihiro network board firmware, ver1305.bin, is read only from + chihiro.roms.net_firmware_path and only when a cabinet link is enabled, and + the Android settings neither set the path nor enable the link. X1_Covers.xml ships in the assets and no code opens it, the library reading X1_Covers.txt instead. - ref: hw/xbox/chihiro.c, - android/app/src/main/cpp/CMakeLists.txt:705, + ref: hw/xbox/chihiro/chihiro.c:546-559, + android/app/src/main/cpp/xemu_settings_android.cc:124-139, android/app/src/main/assets/X1_Covers.xml, - android/app/src/main/java/com/izzy2lost/x1box/GameLibraryActivity.kt:901 + android/app/src/main/java/com/izzy2lost/x1box/GameLibraryActivity.kt:1500