A native PlayStation Vita port of Halo: Combat Evolved, built from the decompilation of the Xbox game. It is not an emulator: the game's own code is compiled for the Vita's ARM processor, and its Direct3D rendering is translated to the Vita's GPU.
No game data is included. You need your own Xbox copy of Halo: Combat Evolved.
![]() |
![]() |
![]() |
Screenshots taken on a PS Vita.
- The whole campaign from the menus, with checkpoints, saves and Save and Quit, cinematics, and the movies (converted to MP4, see below).
- Multiplayer maps on your own (split screen with one player). System link between Vitas on the same Wi-Fi is in, but still being tested; play against PCs is not supported yet.
- Profiles, controller settings and the game's settings menus.
- A settings panel for the Vita's quality and control options: hold Select + Start in game.
- Up to 30 fps. Quiet areas and cinematics usually hold 25 to 30 fps; busy fights drop to around 20, and the largest (The Silent Cartographer's beach) to the mid-to-high teens.
The current list is in the roadmap and the issues. The main ones: some objects flicker or vanish at the screen's edges, invisible (camouflaged) Elites can show up black late in a long session, the first visit to an area can freeze for a second or two, and after resuming a save checkpoints have stopped triggering for at least one player.
- A PS Vita or PS TV with HENkaku/Ensō (firmware 3.60 to 3.74) and VitaShell.
- The Vita's shader compiler,
ur0:data/libshacccg.suprx. Many ports need it, so you may have it already. If not, install ShaRKF00D and run it once: it extracts the file tour0:data/. Without it the game stays on the loading picture while the menu's music and sounds play. - About 1.5 GB free on
ux0:(the game keeps decompressed copies of the levels it loads). - Your own Xbox copy of Halo: Combat Evolved (the disc, or an image of it). It must be the Xbox version: the PC version's maps do not work.
-
Download
halo.vpkfrom the latest release. -
Install it. Copy the VPK to the Vita (VitaShell's USB or FTP mode), open it in VitaShell and confirm. The bubble is called Halo CE.
-
Get the game files from your disc. An Xbox disc image (an
.iso, often called an XISO: the same thing) is unpacked by extract-xiso:extract-xiso -x "Halo.iso"makes a folder with the disc's files. You need two things from it: themapsfolder anddefault.xbe. (Already unpacked game files, as many backups come, work as they are.) -
Copy them to the Vita, with VitaShell's USB or FTP mode:
ux0:data/haloce-vita/maps/ <- the whole maps folder (ui.map, a10.map, bloodgulch.map ...) ux0:data/haloce-vita/default.xbe <- the loading screen's picture is read from it -
Start the game. The first load of each level takes a while: the game writes a cache file for it to the memory card.
Without the maps the game shows where to copy them and exits.
Stuck on the loading picture while the menu music plays? The shader
compiler is missing: see libshacccg.suprx above. halo.log says so with
the line gxm: no libshacccg.suprx.
Install the new halo.vpk over the old one. Your maps, saves and settings
in ux0:data/haloce-vita/ are kept.
The Xbox movies are Bink files, which the Vita cannot play. Convert them
(the disc's bink folder) to H.264 MP4 and put them in
ux0:data/haloce-vita/movies/ under the same names (intro.mp4,
credits.mp4, attract1.mp4 ...):
ffmpeg -i intro.bik -c:v libx264 -profile:v baseline -level 3.1 -pix_fmt yuv420p \
-vf scale=640:-2 -c:a aac -b:a 128k intro.mp4
For better quality at the same size, High profile also plays (thanks to maler82, #8):
ffmpeg -i intro.bik -c:v libx264 -profile:v high -level 4.0 -crf 20 -pix_fmt yuv420p \
-vf scale=640:-2 -c:a aac -b:a 128k -movflags +faststart intro.mp4
A movie without an MP4 is skipped, as the game skips a missing movie.
Checkpoints are written to the memory card as you play. To continue, choose the campaign again with the same profile and difficulty. Save and Quit from the pause menu is the safest way to stop.
| Vita | In game |
|---|---|
| Left stick / right stick | move / look |
| R / L | fire / throw grenade |
| Cross | jump |
| Circle | melee |
| Square | reload, action |
| Triangle | switch weapon |
| D-pad down / up | crouch (a toggle; see the panel) / zoom |
| D-pad left / right | switch grenades / flashlight |
| Start | pause; skips a cinematic |
| Select | scoreboard |
| Select + Start (hold) | settings panel |
Hold Select + Start for a second. Up and down choose a setting, left and
right change it, Circle closes the panel. Changes apply at once (the render
resolution and sound voices after a restart) and are kept in
ux0:data/haloce-vita/settings.txt.
The defaults favour frame rate: lower model detail at a distance, tiny distant objects skipped, static props and object lighting updated less often, sounds' muffling behind walls rechecked less often, and a 75% render resolution. Set model detail High, distant objects Off, scenery and lighting to every tick, sound occlusion every tick and the resolution to 100% to see and hear the game exactly as on the Xbox. Sound voices can play fewer positional sounds at once for speed.
- Linux (or WSL on Windows) with Python 3, ninja and clang 17 or newer (the game code is compiled by clang with the game's MSVC-like ABI).
- VitaSDK for the Vita side (compiled by its
GCC) and the packaging tools. Install it with
vdpm and set
VITASDK(or put it in~/vitasdk).
For example, on Ubuntu or Debian:
sudo apt install git python3 ninja-build clang lld curl
export VITASDK=/usr/local/vitasdk
export PATH=$VITASDK/bin:$PATH # (add both lines to ~/.bashrc)
git clone https://github.com/vitasdk/vdpm && cd vdpm
./bootstrap-vitasdk.sh && ./install-all.sh && cd ..
git clone https://github.com/BirchWoodGod/halo-ce-vita
cd halo-ce-vita
python3 configure.py --lto off --pgo off --portable --release
ninja vita
The results are build/vita/eboot.bin and build/vita/halo.vpk. Install
the VPK as above, or, with an FTP server running on the Vita (VitaShell's
SELECT), replace just the executable:
curl -T build/vita/eboot.bin ftp://<vita address>:1337/ux0:/app/HCEV00001/eboot.bin
Run configure.py again after adding a source file or changing anything in
port/vita/sce_sys (the LiveArea images and the title).
port/vita/README.md has the details: the layout of
port/vita, testing in Vita3K and in a Linux build of
the Vita renderer, debug switches, and the files the game keeps on the
memory card.
Issues and pull requests are welcome. What is planned next is in the roadmap. Open work:
- Performance in the biggest fights: the render on the first core is the limit at the peak.
- Online and ad hoc multiplayer between Vitas.
- The issues listed for the next update in the roadmap.
Open an issue with what you were doing (level, place, weapon, vehicle) and these files from the memory card (VitaShell's FTP or USB mode):
ux0:data/haloce-vita/halo.logandhalo-prev.log: the port's logs of this and the previous session (the previous one is the crashed one after a restart).- After a crash, the newest
ux0:data/psp2core-....psp2dmp: the crash dump. Leave the Vita alone for a minute after a crash so it finishes writing it (a dump still being written ends in.tmp). ux0:data/haloce-vita/data/debug.txt: the game's own log.
This port stands on a lot of other people's work:
- Bungie made Halo: Combat Evolved. Halo is a trademark of Microsoft.
- punpckhdq/halo: the decompilation
of the Xbox build 2342 (
cachebeta.exe, SHA-2564cc87b45f721270392a96f1674ed2b5cd4a7bb4355faeab4531d1cf1884d9520), including the decompiled Xbox libraries inlibs/(Direct3D 8, the C runtime, XAPI, Bink). - bnunu/halo-1: the fork of that decompilation the native port starts from.
- cybersecurity/halo-ce-universal:
the native Linux, Windows and Android port this repository is built on:
the platform layer, the OpenGL renderer the Vita renderer is modelled on,
the distributed netcode, system link over the internet, and much more.
Those platforms still build from this tree (
port/linux,port/windows,port/android, each with its own README). - Invader by SnowyMouse: the
tag definitions
port/linux/src/tag_layouts.his generated from (bytools/gen_tag_layouts.py), which let the port relocate the maps' tags. - Xita: the earlier work on running Halo on the Vita, whose findings (the register combiner translation, the GPU and threading lessons, the tools) went into this port.
- PS Vita port: BirchWoodGod.
Libraries and tools: VitaSDK, SDL3 (desktop builds), tomlc17, KCP, Mbed TLS, miniupnpc, musl's math functions, extract-xiso, and Vita3K for testing.
This port is licensed under the GNU General Public License, version 3
only (LICENSE), because port/linux/src/tag_layouts.h is
generated from Invader's GPL-3.0 tag definitions. To regenerate it, clone
Invader into invader/ (or set INVADER=<path>) and run
python3 tools/gen_tag_layouts.py port/linux/src/tag_layouts.h.
The decompilation and the halo-ce-universal port this builds on are dedicated to the public domain under CC0 1.0 (LICENSES/CC0-1.0.txt); the bundled libraries keep their own licenses. The license covers this code only: Halo's maps, executable and other game content belong to their owners and are not included.
This project is not affiliated with or endorsed by Microsoft or Bungie, and it contains no game assets.



