Halo CE for RG35XX H

Halo: Combat Evolved on the Anbernic RG35XX H

A native ARM64 port for Knulli on the Allwinner H700 and its Mali-G31 GPU.

Yes, Halo CE runs natively on the Anbernic RG35XX H (RG35XXH) under Knulli: 60 fps in the menus and about 40 to 55 fps in campaign levels at the default render scale. The port builds the halo-ce-universal decompilation of the Xbox game as AArch64 code, with no emulation, no Box64, no Wine and no xemu. You need your own copy of the original Xbox game; the releases hold the port's own programs and no game data.

Source on GitHub How to install

Screenshots

Halo: Combat Evolved main menu running natively on an Anbernic RG35XX H under Knulli
The main menu on the RG35XX H (640x480).
Halo CE beach battle on The Silent Cartographer running on an Anbernic RG35XX H at 36 fps
The Silent Cartographer (b30) at render scale 0.75, 36 fps.

Features

Performance

Frames per second on an Anbernic RG35XX H, Knulli Gladiator II, stock thermal limits, with the level in the game's cache: the typical value and the range over the first minute of each level. Last updated 2026-10-01 (release v2026.10.01); the numbers are improving.

SceneRender scale 0.75 (default)Render scale 1.0 (640x480)
Main menu6060
c10, 343 Guilty Spark (swamp)about 40 (31–44)about 24 (19–28)
b30, The Silent Cartographer (beach battle)about 40 (35–44)about 30 (28–34)
a30, Halo (level opening)about 55 (39–60)about 40 (26–47)

At 640x480 the GPU is the limit; at 0.75, the Mali driver's CPU time per draw call. The measurements behind each optimisation are in PERFORMANCE.md.

Supported devices

The port needs an Allwinner H700 (4x Cortex-A53 at 1.5 GHz, Mali-G31 MP2, 1 GB RAM) running Knulli.

DeviceScreenStatus
Anbernic RG35XX H640x480Tested
Anbernic RG35XX Plus640x480Untested, expected to work
Anbernic RG35XX SP640x480Untested, expected to work
Anbernic RG35XX 2024640x480Untested, expected to work
Anbernic RG40XX H640x480Untested, expected to work
Anbernic RG40XX V640x480Untested, expected to work
Anbernic RG CubeXX720x720Untested
Anbernic RG34XX720x480Untested

TrimUI handhelds and devices with other SoCs are not supported. muOS and ROCKNIX are untested.

Install

You need an H700 handheld with Knulli, your own Halo: Combat Evolved disc image for the original Xbox, about 3 GB free on the card (the maps and the game's cache), and the latest release (or a build: below).

  1. Download the release. Download halo-ce-knulli-<version>.zip from the latest release.
  2. Unzip it onto the SD card. Unzip it onto the SD card, into the partition that holds the roms folder (over the network, \\KNULLI\share). It adds roms/ports/Halo.sh and the folder roms/ports/halo/.
  3. Add your disc image. Put your own Xbox disc image of Halo: Combat Evolved (.iso) in roms/ports/halo/.
  4. Launch from Ports. Start Halo from the Ports list. The first launch copies the maps/ folder out of the image with its progress on the screen (about four minutes), then the game sets up its cache (about a minute, with a black screen); the image can be deleted afterwards.
  5. Quit. To quit, hold the hotkey (MENU or SELECT) and press START.

Settings are in halo/config.toml (for example display.render_scale, default 0.75), the log in halo/log.txt.

Build from source

The build runs on Linux x86-64 (Ubuntu 24.04, WSL works) with python3, ninja-build, git, clang 22 from apt.llvm.org (for the arm64_32 guest target), the Android NDK r28c and gcc-aarch64-linux-gnu. It links against libSDL2-2.0.so.0 and libmali.so.0 copied from the handheld's /usr/lib; those are never committed.

git clone https://github.com/kirklandsig/halo-ce-anbernic-rg35xx.git
cd halo-ce-anbernic-rg35xx
mkdir -p sysroot   # copy libSDL2-2.0.so.0* and libmali.so.0* from the handheld here
ANDROID_NDK=/path/to/android-ndk-r28c SYSROOT_LIB=$PWD/sysroot ./build.sh
ls dist/           # halo  halo_guest.elf  Halo.sh  halo_extract.py  halo_screen.py  sdl_mapping.py

build.sh clones halo-ce-universal at a pinned commit, applies this project's patch, adds the Knulli host, and builds. The first build takes 10 to 30 minutes.

How it works

Halo's data holds 32-bit pointers, so the upstream Android port compiles the game as ILP32 AArch64 code (64-bit ARM instructions with 32-bit pointers) into a guest image that a small host loads. This project adds a host for Knulli: an aarch64 glibc Linux program that answers the guest's SDL3 calls with the firmware's SDL2, the only SDL with the Mali framebuffer driver, and replays the guest's OpenGL ES calls on a GL thread. Renderer changes for the tile-based Mali-G31 remove pipeline stalls and render-target switches. Details are in HOW-IT-WORKS.md.

FAQ

Can the Anbernic RG35XX H run Halo: Combat Evolved?

Yes. This port runs Halo CE natively on the RG35XX H under Knulli, as AArch64 code on the H700's Cortex-A53 cores with the Mali-G31 GPU. It is built from the halo-ce-universal decompilation; you supply the Xbox game's data.

What frame rate does Halo CE get on the RG35XX H?

At the default render scale of 0.75: 60 fps in the menus, about 40 fps on 343 Guilty Spark (c10, 31 to 44), about 40 fps in the beach battle of The Silent Cartographer (b30), and about 55 fps at the opening of Halo (a30). At the full 640x480 it is about 24 to 40 fps. The numbers are improving; see the performance table.

Does it work with the Xbox version or the PC version of Halo?

The Xbox version. The decompilation is of the Xbox build, and it reads the Xbox maps. The PC version (Gearbox's port) has different map files that this code cannot load. Use a disc image of the original Xbox game.

Is this legal?

The repository contains only source code and documentation, and its releases only the port's programs built from that source: the upstream decompilation's authors released their code under CC0, and so does this port. Neither contains game files, disc images or maps. You need your own copy of the Xbox game. Whether decompilation projects are lawful depends on where you live; this is not legal advice. See the legal notice.

Does it need PortMaster?

No. It is a plain Knulli port: a launcher script in roms/ports and a folder. It uses the firmware's own SDL2 and Mali driver and none of PortMaster's runtimes.

Does it work on muOS or ROCKNIX?

Untested. The host is built against Knulli's SDL2 (2.30.12) and Arm's framebuffer Mali driver. Other firmware for the H700 may ship a different graphics stack, which the host's SDL2 and EGL bridge would need to support. Reports are welcome.

Why not run the PC version with Box64 and Wine?

The PC version is a 32-bit x86 Windows program that draws with Direct3D 9. Running it on the H700 would need x86 translation, Wine, and a Direct3D to OpenGL ES translation layer, all on four Cortex-A53 cores and 1 GB of RAM. Each layer costs CPU time the device does not have. The native port runs the game's own logic as ARM64 code and draws with OpenGL ES directly.

Why not use xemu?

xemu emulates the whole original Xbox, its Pentium III CPU and its NV2A GPU, and needs a fast desktop CPU and a desktop OpenGL or Vulkan GPU. The H700's Cortex-A53 cores and its OpenGL ES-only Mali driver are far below that. A native port of the decompiled code avoids the emulation entirely.

Which other handhelds does it work on?

It should work on the other Allwinner H700 handhelds that run Knulli: the Anbernic RG35XX Plus, SP and 2024, RG40XX H and V, RG CubeXX and RG34XX. Only the RG35XX H has been tested. TrimUI handhelds and other SoCs are not supported.