I managed to get Mupen64-360 running on an Xbox 360 with a Winchester motherboard. Here is an explanation generated by the AI that helped fix it, along with the download link for the corrected XeLL Reloaded and Mupen64-360 files.
This was basically a vibe-coding project with GPT Codex and Claude, and the result appears to be very well done. That said, it took a lot of time, money, and perseverance. I also had to rely heavily on logical reasoning to work out the method, decide what to test, interpret the results, and keep the investigation moving. The AI did much of the coding, but getting to a working result still required a lot of hands-on testing and problem-solving.
I also plan to work on fixing more emulators, so stay tuned.
The investigation and fixes were carried out with the help of GPT Codex and Claude. Both were used to analyze the source code, interpret logs, identify bugs, and develop corrections, while the results were tested directly on the Xbox 360 Winchester.
The problem was not caused by a single incompatibility. It involved the XeLL ELF loader, USB recovery in libxenon, and the disk-mounting code used by Mupen64-360.
In XeLL Reloaded, we first fixed a build-order problem in the alex-free fork. The stage2.elf32.gz target removed object files that were still needed for the Stage 1 link, so the build order had to be adjusted. We also restored the missing rules file required by the toolchain. The most important change was restoring elf.c and elf_run.S from before the ELF loader rewrite in May 2020, while keeping the rest of libxenon modern. With that combination, XeLL finally managed to hand execution over to the recompiled Mupen.
In libxenon, we fixed a null-pointer access in qh_end_transfer() that caused the red crash screen with dar=0x3c. We also found that USB recovery was resetting port 0 instead of the port where the device was actually connected. In our case, the flash drive was on port 4, so recovery could repeatedly reset the wrong port and leave the storage driver stuck in its retry loop. Both reset calls were changed to use the device's actual port. Another fix made ehci_reset_usb_port() return an error after handing a non-high-speed port over to OHCI, preventing the EHCI code from trying to initialize a port it no longer owned. EHCI_TUNE_CERR was also restored from 0 to 3, although that was not the main cause of the problem.
Mupen64-360 was then rebuilt against the corrected libxenon. This required locating, compiling, and installing ZLX-Library, libxemit, and ntfs-xenon. We also had to rebuild and reinstall ZLX after an incomplete library caused linker errors involving symbols such as ZLX::Font, ZLX::Browser, and ZLX::Console.
The ROM-loading freeze turned out to have a separate cause. The flash drive was formatted as FAT directly at sector 0, without an MBR, a layout commonly called superfloppy. ZLX was seeing the 0x55AA signature and interpreting the FAT boot sector as a partition table. That produced invalid LBAs, including 0x7265206B, which initially looked like a USB or SCSI problem. The return address helped trace the issue back to FindPartitions() in mount.cpp.
We corrected the partition detection so that it checks for FAT16 or FAT32 directly at sector 0 before attempting to interpret the sector as an MBR. If a valid FAT filesystem is found there, it is mounted as a partition starting at sector 0. After this correction, the flash drive mounted correctly and ROMs started loading.
There was still a problem when both the flash drive and external HDD were connected. The TinyEHCI driver detected both devices, but ZLX was only mounting one USB interface at a time. We added support for mounting both interfaces and adjusted the order so that the flash drive remains uda0 and the external HDD becomes udb0. This matters because Mupen looks for its installation in uda0:/mupen64-360/. When the HDD was mounted as uda0, Mupen could no longer find the expected files, which caused problems with the background and ROM loading. With the corrected order, the flash drive remains the main device, the HDD is available as additional storage, and a single connected USB device still mounts as uda0.
The final working build is based on Mupen64-360 0.992 beta. Version 0.993 beta2 was also investigated, but it lost video output on the Winchester. From what we observed, it does not appear to have many code differences compared with 0.992 beta, although we did not perform a complete comparison.
I haven't tested the emulator extensively yet, but so far everything appears to be working perfectly. I tested Castlevania and The Legend of Zelda: Ocarina of Time, and both ran successfully. XeLL loads the recompiled Mupen64-360, ROMs work from the flash drive, and the external HDD can remain connected as additional storage.
Thank you for reading!
I updated the download links in my post and added a version with aspect ratio settings in the menu.
You no longer need to download multiple files or replace anything. The latest version is available here as a single zip file.
I was informed that the files I made available do not comply with the GPLv2 license. I'll correct this and make the files available again soon. If anyone needs them urgently, please contact me.
This was basically a vibe-coding project with GPT Codex and Claude, and the result appears to be very well done. That said, it took a lot of time, money, and perseverance. I also had to rely heavily on logical reasoning to work out the method, decide what to test, interpret the results, and keep the investigation moving. The AI did much of the coding, but getting to a working result still required a lot of hands-on testing and problem-solving.
I also plan to work on fixing more emulators, so stay tuned.
The investigation and fixes were carried out with the help of GPT Codex and Claude. Both were used to analyze the source code, interpret logs, identify bugs, and develop corrections, while the results were tested directly on the Xbox 360 Winchester.
The problem was not caused by a single incompatibility. It involved the XeLL ELF loader, USB recovery in libxenon, and the disk-mounting code used by Mupen64-360.
In XeLL Reloaded, we first fixed a build-order problem in the alex-free fork. The stage2.elf32.gz target removed object files that were still needed for the Stage 1 link, so the build order had to be adjusted. We also restored the missing rules file required by the toolchain. The most important change was restoring elf.c and elf_run.S from before the ELF loader rewrite in May 2020, while keeping the rest of libxenon modern. With that combination, XeLL finally managed to hand execution over to the recompiled Mupen.
In libxenon, we fixed a null-pointer access in qh_end_transfer() that caused the red crash screen with dar=0x3c. We also found that USB recovery was resetting port 0 instead of the port where the device was actually connected. In our case, the flash drive was on port 4, so recovery could repeatedly reset the wrong port and leave the storage driver stuck in its retry loop. Both reset calls were changed to use the device's actual port. Another fix made ehci_reset_usb_port() return an error after handing a non-high-speed port over to OHCI, preventing the EHCI code from trying to initialize a port it no longer owned. EHCI_TUNE_CERR was also restored from 0 to 3, although that was not the main cause of the problem.
Mupen64-360 was then rebuilt against the corrected libxenon. This required locating, compiling, and installing ZLX-Library, libxemit, and ntfs-xenon. We also had to rebuild and reinstall ZLX after an incomplete library caused linker errors involving symbols such as ZLX::Font, ZLX::Browser, and ZLX::Console.
The ROM-loading freeze turned out to have a separate cause. The flash drive was formatted as FAT directly at sector 0, without an MBR, a layout commonly called superfloppy. ZLX was seeing the 0x55AA signature and interpreting the FAT boot sector as a partition table. That produced invalid LBAs, including 0x7265206B, which initially looked like a USB or SCSI problem. The return address helped trace the issue back to FindPartitions() in mount.cpp.
We corrected the partition detection so that it checks for FAT16 or FAT32 directly at sector 0 before attempting to interpret the sector as an MBR. If a valid FAT filesystem is found there, it is mounted as a partition starting at sector 0. After this correction, the flash drive mounted correctly and ROMs started loading.
There was still a problem when both the flash drive and external HDD were connected. The TinyEHCI driver detected both devices, but ZLX was only mounting one USB interface at a time. We added support for mounting both interfaces and adjusted the order so that the flash drive remains uda0 and the external HDD becomes udb0. This matters because Mupen looks for its installation in uda0:/mupen64-360/. When the HDD was mounted as uda0, Mupen could no longer find the expected files, which caused problems with the background and ROM loading. With the corrected order, the flash drive remains the main device, the HDD is available as additional storage, and a single connected USB device still mounts as uda0.
The final working build is based on Mupen64-360 0.992 beta. Version 0.993 beta2 was also investigated, but it lost video output on the Winchester. From what we observed, it does not appear to have many code differences compared with 0.992 beta, although we did not perform a complete comparison.
I haven't tested the emulator extensively yet, but so far everything appears to be working perfectly. I tested Castlevania and The Legend of Zelda: Ocarina of Time, and both ran successfully. XeLL loads the recompiled Mupen64-360, ROMs work from the flash drive, and the external HDD can remain connected as additional storage.
Thank you for reading!
I updated the download links in my post and added a version with aspect ratio settings in the menu.
- Audio: Fixed resampler issues, improved audio queue/cache handling, and implemented a packet-based audio queue with a persistent resampler and DMA aligned to 2048-byte blocks.
- Stability: Fixed texture copying issues and a recompiler heap bug.
- Performance: Added a small CRC optimization and an ABI3/ENVMIXER3 optimization. Also eliminated redundant USB polling, improving VI/s by 22.3% (49.08 → 60.03) and the measured frame rate by 26.3% (18.62 → 23.52 FPS). This allows the emulator to reach full speed in the tested scenario, with substantially fewer long frame-time spikes.
- Display: Added an aspect ratio option.
- Additional changes: Increased the audio queue headroom from 16 KiB to 32 KiB.
I was informed that the files I made available do not comply with the GPLv2 license. I'll correct this and make the files available again soon. If anyone needs them urgently, please contact me.
Last edited by fixingthings,







