ps3recomp
Because the Cell processor deserves a second life
Static recompilation runtime libraries for PlayStation 3 titles. Turn PS3 binaries into native executables. No emulator required.
Join the sp00nznet recomp Discord — the community hub for sp00nznet's recomp projects, where ps3recomp development happens in the open. Good place to ask questions, show a port you are working on, or find out what people are stuck on before you duplicate the effort.
What Is This?
ps3recomp is an open-source toolkit that provides the runtime libraries, system stubs, and analysis tools needed to statically recompile PlayStation 3 games into native PC executables.
Instead of interpreting or dynamically recompiling PowerPC/SPU instructions at runtime (what emulators like RPCS3 do brilliantly), we take the opposite approach: translate everything ahead of time into C/C++ that compiles with your favorite compiler on any modern platform.
This is the same philosophy behind:
- N64Recomp (N64 -> native)
- UnleashedRecomp (Xbox 360 -> native)
- PS2Recomp (PS2 -> native)
- burnout3 (Original Xbox -> native)
- ReXGlue (Xbox 360 -> native)
- AnyPS5 (PS5 -> native)
...but for the PS3's glorious, terrifying Cell Broadband Engine.
Why PS3?
The PlayStation 3 has over 3,000 titles and some of the most beloved games ever made. RPCS3 has done heroic work making ~70% of the library playable through emulation, but static recompilation offers something different:
- Native performance — no runtime translation overhead
- Lower hardware requirements — runs on mid-range PCs
- Moddability — recompiled C/C++ is infinitely more hackable than PPC binaries
- Preservation — native ports survive long after emulators stop being maintained
- Portability — the output is C/C++, so it can target any platform a compiler does (see platform support for where the runtime actually stands today)
Platform support
CI builds and tests every row on every pull request: Windows (clang-cl), macOS arm64, Linux (GCC and Clang), and Linux with the Vulkan backend on lavapipe under the validation layer. A green check means the runtime built and the tests passed. It does not mean a game ran; the last row is the only one that claims that.
| Windows | macOS (arm64) | Linux | |
|---|---|---|---|
| Runtime library builds | yes | yes | yes |
| Lifter test suites + C unit tests | yes | yes | yes |
| Render backend | D3D12 | Metal | Vulkan (opt-in); null (headless, CI) |
| Runs a recompiled game, in this tree | yes | no | no |
What stops macOS and Linux running a title is the PPU boot scaffold.
ppu_loader.cpp, boot_main.cpp and the HLE dispatch are compiled per game,
not into the library. They compile on POSIX with zero errors (a CI ratchet
keeps it that way) and the frame clock runs there, but no title has yet been
booted to gameplay from this tree on either OS.
The renderers are further along than that. ps3recomp_host drives cellGcm
→ RSX → backend end to end with no game. With guest programs on, Metal and
Vulkan both run the title's own shaders on the shared register-file draw
engine. Every ps3recomp_host scene passes on both, including render-to-texture,
MRT, depth textures, cube maps and stencil. Linux's default stays the headless
null backend, a CPU triangle filler that CI draws with.
Downstream, people are already past this. Twisted Metal's menus run on Linux/Vulkan, inFamous on macOS, and Killzone 3 under Proton (see In the community). Those ports carry patches that are still on their way upstream, which is why the table still says "no".
The Challenge
The PS3's Cell processor is a beast unlike anything else:
| Component | What It Is | Why It's Hard |
|---|---|---|
| PPU | PowerPC 64-bit main CPU | Custom ISA extensions, VMX/AltiVec SIMD |
| 6x SPU | 128-bit SIMD vector processors | Proprietary ISA, 256KB local store, explicit DMA |
| Memory | 256MB XDR RAM | 128-byte alignment requirements, split bus |
| LV2 Kernel | Proprietary OS layer | ~300+ system calls, complex threading model |
| PRX Modules | Dynamic libraries | 100+ system libraries with intricate interdependencies |
We don't shy away from hard problems. We just break them into smaller ones.
Architecture
ps3recomp/
├── tools/ # Binary analysis & recompilation pipeline
│ ├── elf_parser.py # Parse PS3 ELF/SELF/PRX binaries
│ ├── ppu_disasm.py # PowerPC disassembler with PS3 extensions
│ ├── ppu_lifter.py # PPU assembly -> C code lifter
│ ├── spu_disasm.py # SPU instruction set disassembler
│ ├── spu_lifter.py # SPU assembly -> C code lifter
│ ├── extract_spu_images.py # Extract embedded SPU images from PRX/ELF
│ ├── find_spu_functions.py # SPU function boundary detection
│ ├── wrap_spu_elf.py # Wrap a raw SPU blob as a loadable ELF
│ ├── prx_analyzer.py # Analyze PRX imports/exports and NIDs
│ ├── nid_database.py # Function Name ID (NID) resolver
│ ├── find_functions.py # Function boundary detection
│ └── generate_stubs.py # Generate HLE stub skeletons from a NID list
│
├── runtime/ # Core runtime for recompiled executables
│ ├── ppu/ # PPU execution context
│ │ ├── ppu_context.h # Register file, CR, LR, CTR, FPSCR
│ │ ├── ppu_memory.h # Memory access macros (loads, stores, byte-swap)
│ │ └── ppu_ops.h # Instruction operation macros
│ ├── spu/ # SPU execution context
│ │ ├── spu_context.h # 128×128-bit register file, 256KB local store, image_id
│ │ ├── spu_channels.c # Channel ops + per-image function-table dispatch
│ │ ├── spu_helpers.h # SPU intrinsics (incl. float conversions)
│ │ ├── spu_dma.h # DMA (MFC) transfer engine
│ │ └── tests/ # Self-contained SPU runtime tests
│ ├── memory/ # Memory subsystem
│ │ └── vm.h # Virtual memory manager (256MB address space)
│ └── syscalls/ # LV2 kernel system call implementations
│ ├── sys_ppu_thread.h # Thread creation/management
│ ├── sys_mutex.h # Mutex/cond synchronization
│ ├── sys_memory.h # Memory allocation/mapping
│ ├── sys_fs.h # Filesystem operations
│ └── lv2_syscall_table.h # Full syscall dispatch table
│
├── libs/ # HLE library implementations
│ ├── audio/ # cellAudio, cellAdec, libmixer, libsnd3, libsynth2
│ ├── video/ # cellGcmSys, cellResc, cellVideoOut, cellVpost, cellVdec
│ ├── input/ # cellPad, cellKb, cellMouse
│ ├── hardware/ # cellGem, cellCamera, cellUsbd
│ ├── network/ # cellNetCtl, cellHttp, cellHttps, cellSsl, sceNp*
│ ├── filesystem/ # cellFs, cellGame, cellSaveData, cellStorage
│ ├── system/ # cellSysutil, cellSysmodule, cellRtc, sysPrxForUser
│ ├── spurs/ # cellSpurs, cellFiber, cellSpursJq, cellDaisy (SPU task management)
│ ├── sync/ # cellSync, cellSync2 (cross-PPU/SPU synchronization)
│ ├── codec/ # cellJpgDec, cellPngDec, cellGifDec, cellPamf, cellDmux, cellAdecAtrac3p, cellAdecCelp8, cellVdecDivx
│ ├── font/ # cellFont, cellFontFT, cellFreeType, cellL10n
│ └── misc/ # cellScreenshot, cellSubdisplay, cellImeJp, cellVideoExport, cellMusicExport, cellGameRecording, etc.
│
├── include/ps3emu/ # Public API headers
│ ├── ps3types.h # Fundamental PS3 types (u8-u128, s8-s64, be_t<>)
│ ├── endian.h # Big-endian <-> little-endian conversion
│ ├── nid.h # NID hashing and lookup
│ ├── module.h # Module registration framework
│ └── error_codes.h # PS3 system error codes (CELL_OK, CELL_E*)
│
├── templates/project/ # Starter template for new game ports
│ ├── CMakeLists.txt # Build system
│ ├── main.cpp # Application entry point
│ ├── stubs.cpp # Game-specific function overrides
│ └── config.toml # Recompiler configuration
│
├── config/ # Reference configurations
│ └── example.toml # Example recompilation config
│
└── docs/ # See the Documentation table below
How It Works
The pipeline follows the same proven approach as our burnout3 project, adapted for the Cell architecture:
PS3 Game Disc / PKG
│
▼
┌─────────────┐
│ SELF/EBOOT │ Encrypted PS3 executable
│ Decryption │ (requires keys / fSELF)
└──────┬──────┘
│
▼
┌─────────────┐
│ ELF Parser │ Extract sections, segments, relocations
│ + PRX Scan │ Identify imported NIDs & library deps
└──────┬──────┘
│
▼
┌─────────────┐
│ PPU Disasm │ Disassemble PowerPC 64-bit + VMX
│ + Analysis │ Function boundaries, jump tables, ABI
└──────┬──────┘
│
▼
┌─────────────┐
│ PPU Lifter │ PowerPC → C code generation
│ + SPU Lift │ SPU programs → C code generation
└──────┬──────┘
│
▼
┌─────────────┐
│ Link with │ ps3recomp runtime + HLE libs
│ Runtime │ Provides all PS3 OS services
└──────┬──────┘
│
▼
┌─────────────┐
│ Compile & │ MSVC / GCC / Clang
│ Ship! │ Native x86-64 executable
└─────────────┘
SPU Strategy
The SPU is the elephant in the room. Each SPU has its own instruction set, its own 256KB memory, and communicates with the PPU via DMA and mailbox channels. Our approach:
- SPU programs are self-contained — they live in ELF segments loaded to local store (
extract_spu_images.pypulls them out of PRX/ELF) - Recompile each SPU program separately — dedicated
spu_disasm.py+spu_lifter.pyhandle the SPU ISA - SPU local store becomes an array — 256KB per "virtual SPU"
- DMA operations become memcpy — via the MFC engine (
spu_dma.h) - Channels become cross-thread message queues — preserving ordering guarantees
- Per-image function-table dispatch —
image_idlets multiple SPU programs (e.g. a SPURS kernel, a policy module, and a job) coexist at overlapping local-store addresses
This mirrors how RPCS3 handles SPU but at compile time rather than runtime. The
disassembler, lifter, and runtime are functional and covered by self-contained
tests (runtime/spu/tests/: sum, shufb, DMA, brsl-return).
Module Status
HLE implementations of the PS3 system libraries, written for this project. RPCS3 is a behavioural reference, not a code source. About 93 modules complete and 5 partial (media decode, SPURS), in roughly 260 files and 100,000 lines under libs/.
| Category | Modules | Status |
|---|---|---|
| Kernel Threading | sys_ppu_thread, sys_mutex, sys_cond, sys_semaphore, sys_rwlock | ✅ Complete |
| Kernel Events | sys_event (queues, ports, flags), sys_timer | ✅ Complete |
| Kernel Memory | sys_memory, sys_mmapper (containers, shared mem) | ✅ Complete |
| Kernel Filesystem | sys_fs (path mapping, real I/O) | ✅ Complete |
| Filesystem | cellFs (real file I/O, dir ops, stat, path translation) | ✅ Complete |
| Save System | cellSaveData (callback-driven, PARAM.SFO), cellGame | ✅ Complete |
| Input | cellPad (XInput/SDL2), cellKb, cellMouse | ✅ Complete |
| Audio | cellAudio (WASAPI/SDL2, mixing thread, multi-port) | ✅ Complete |
| Video Output | cellVideoOut (resolution config, 720p default) | ✅ Complete |
| Codecs | cellPngDec, cellJpgDec, cellGifDec (stb_image) | ✅ Complete |
| Font | cellFont (stb_truetype backend + fallback metrics) | ✅ Complete |
| Network | sys_net (BSD sockets, P2P), cellNet, cellNetCtl, cellHttpUtil, cellSsl, sceNp*, sceNpTrophy, sceNpMatching2 + Score over psnr | ✅ Complete |
| Hardware | cellUsbd (USB), cellCamera (PS Eye), cellGem (PS Move) — stub, no devices | ✅ Complete |
| Sync | cellSync (atomic spinlocks, LF queue), cellSync2 (OS-backed) | ✅ Complete |
| System | cellRtc, cellMsgDialog, cellOskDialog, cellUserInfo, cellGameExec | ✅ Complete |
| Localization | cellL10n (UTF-8/16/32/UCS-2, ISO-8859-1, generic converter) | ✅ Complete |
| Resolution | cellResc (display modes, scaling, interlace, aspect ratio) | ✅ Complete |
| Fibers | cellFiber (PPU fibers via Windows Fibers/ucontext) | ✅ Complete |
| AV Config | cellAvconfExt (audio output info, gamma, sound availability) | ✅ Complete |
| Input Util | cellKey2char (HID scancode → Unicode, US-101 layout) | ✅ Complete |
| Graphics | cellGcmSys (cmd buffer, IO mapping, tile/zcull, flip handlers, timestamps, FIFO walker + ring recycle), RSX command processor (NV47xx parsing, state tracking, backend callbacks), live D3D12 backend (executes the title's real NV4097 vertex/fragment programs — indexed draws, per-draw VP constants + textures, render-to-texture, MRT, FP predication), null backend (Win32 window) | ✅ Complete |
| SPURS | cellSpurs (management APIs, event flags, task/workload tracking), cellSpursJq (job queues with wait/signal), cellDaisy (real ring buffer FIFO) | ✅ Complete |
| Core Runtime | cellSysutil (BGM, cache, disc), cellSysmodule, sysPrxForUser (real lwmutex/lwcond/threads) | ✅ Complete |
| Media Pipeline | cellPamf (PAMF header + stream descriptors), cellDmux (callback sequencing), cellVdec (H.264/MPEG-2 through FFmpeg loaded at run time, opt-in), cellAtrac (ATRAC3plus, all-in-memory), cellAdec (callbacks, no decode yet), cellSail (state machine) | 🔨 Partial |
| HTTP/HTTPS | cellHttp (real HTTP/1.1 via native sockets), cellHttps (TLS stub with cert management) | ✅ Complete |
| Misc/Export | cellSubdisplay, cellImeJp, cellVideoExport, cellMusicExport, cellPhotoExport/Import, cellGameRecording, cellPrint, cellRemotePlay | ✅ Complete |
Full status tracking: docs/MODULE_STATUS.md
Documentation
We've written extensive docs covering every aspect of the project. Whether you're contributing, porting a game, or just trying to understand how PS3 static recompilation works, there's a doc for you.
| Document | What It Covers |
|---|---|
| Getting Started | Prerequisites, installation, first recompilation walkthrough |
| Architecture | Cell processor overview, recomp pipeline stages, memory model, comparison with RPCS3 |
| Building | CMake build system, compiler support, platform-specific notes, troubleshooting |
| Game Porting Guide | Full 12-phase walkthrough for porting a PS3 game — with flOw case study |
| Custom Modules | Step-by-step tutorial for writing new HLE modules — NID system, calling convention bridge, patterns |
| FAQ & Troubleshooting | Common questions, build errors, runtime crashes, lifter issues, performance tips |
| Contributing | Development setup, code style, PR guidelines, ways to contribute |
| Runtime Reference | Virtual memory manager, PPU/SPU execution contexts, type system, endianness, syscall dispatch, DMA engine |
| Syscall Reference | All LV2 kernel syscalls: threading, sync, events, timers, memory, filesystem |
| NID System | How PS3 function linking works, NID computation, module registration framework |
| Module Reference | Detailed documentation for every HLE module — what they do and how they're implemented |
| Module Status | Quick-reference status table for all modules |
| RSX Graphics | RSX GPU translation architecture: command processor, D3D12 and Metal backends, shader strategy |
| Tools Reference | Every recompiler pipeline tool documented: ELF parser, disassembler, lifter, NID database |
| SPU Lifter | SPU ISA decoding/lifting, the runtime model (local store, channels, DMA, per-image dispatch), and the SPU tests |
| Platform Abstraction | How we handle Win32 vs POSIX: threading, sockets, timers, audio, memory, fibers |
| SPU Fallback | The PPU-side fallback registry — a hand-written replacement for an SPU job, or a bring-up shim before an image is lifted |
| Debug Console | Ask a title that is already running what it is doing, without a rebuild |
| Runtime Diagnostics | Generated index of every diagnostic environment variable the runtime reads |
| Prototype & Debug Builds | Why unencrypted, symbol-bearing prototype builds are the pipeline's ground truth |
| Online Play | Matchmaking, leaderboards and P2P play through a psnr server — --psnr host --username NAME |
| Regression Gate | How five ports are checked against recorded goldens before a shared-runtime change lands — and how to tell a real red from the four kinds of measurement artefact |
Getting Started
Downloads: each release
includes a prebuilt SDK bundle per platform (ps3recomp-<version>-win-x64.zip,
-mac-arm64.zip, -linux-x64.zip) plus SHA256SUMS.txt. A bundle contains the
runtime library, its headers and the Python pipeline. VERSION.txt inside it
says what that platform can and cannot do yet.
Prerequisites (building from source): Python 3.10+, CMake 3.20+, a C17/C++20 compiler (MSVC 19.x / clang-cl, GCC 12+, or Clang 15+)
git clone https://github.com/sp00nznet/ps3recomp.git cd ps3recomp pip install -r requirements.txt # Stage 1: image, OPD function table, TOC and firmware imports python tools/ppu_loader.py /path/to/EBOOT.ELF -o out/ # Stage 2: lift to C++. --hle-stubs turns each firmware import stub into # ps3_hle_call(nid); leave it out and the first import call crashes the port. python tools/ppu_lifter.py /path/to/EBOOT.ELF \ --functions out/EBOOT.functions.json \ --hle-stubs out/EBOOT.imports.json \ --output templates/project/recompiled/ # Stage 3: the NID -> HLE handler table, next to the lifted code python tools/gen_hle_nids.py --all --out templates/project/recompiled/ppu_hle_nids.cpp # Build the port from the template (RECOMP_DIR defaults to ./recompiled) cd templates/project cmake -B build -G Ninja cmake --build build
See docs/GETTING_STARTED.md for the full walkthrough.
Game Ports Using ps3recomp
Status as of 2026-10-12. Each port's own README carries the live detail and the run recipe.
In game
| Game | Title ID | Status | Repo |
|---|---|---|---|
| The Simpsons Arcade Game (Konami) | NPUB30563 | Playable, and playable online. Boots through the Konami intro and character select into Stage 1, Downtown Springfield, with its ATRAC3plus music (#186) and correct flashes and glyphs (#185). Two players meet over psnr and play a match together: lobby, character select, the host's game setup, then Stage 1 in sync on both machines with each player's input moving their character on both screens — including with one player behind a NAT, through psnr's relay (#200, see docs/ONLINE.md). A Konami arcade emulator EBOOT: the 1991 coin-op ROM lives in SIMPSONS.SR and the binary emulates the hardware around it |
sp00nznet/simpsonsarcade-ps3 |
| Tornado Outbreak (Loose Cannon / Konami) | BLUS30371 | In game, rendering correctly with no per-title overrides. Logos and Bink intro, title, main menu, New Game (the save is created), the story intro and dialogue, then the first level under stick control at ~10–16 fps. The runtime fixes it needed — raw-SPU proxy DMA, vertex-program flow control, GPU resolve copies — are shared (#189) | sp00nznet/tornado |
Earlier ports
Not under active development; they are where much of the runtime was first proven, and several stay in the regression gate.
| Game | Title ID | Where it got to | Repo |
|---|---|---|---|
| Virtua Fighter 5 (Sega AM2) | BLUS30020 | Renders its NOW LOADING, CRIWARE and AM2 screens; zero SPURS and zero PSN imports | sp00nznet/vf5 |
| Tokyo Jungle (Crispy's/SCE Japan) | NPUA80523 | Data install, SPURS jobs, title screen and the main menus | sp00nznet/tokyojungle |
| You Don't Know Jack (Jellyvision/THQ) | BLUS30569 | Menus and answerable quiz questions; movie-backed screens still draw noise | sp00nznet/youdontknowjack |
| Twisted Metal (Eat Sleep Play) | BCUS98106 | Drove the live NV4097 engine (#113); boots real game code and its asset install | sp00nznet/twistedmetal |
| flOw (thatgamecompany) | NPUA80001 | First draws with the real libsre.prx; assets load |
sp00nznet/flow |
| Rubber Ducky (Sony E3 2006 demo) | NPEA00003 | A debug build with full symbols — the lifter's ground truth, not a game target | sp00nznet/rubberducky |
In the community
Ports other people are running on ps3recomp, whose fixes come back upstream:
- inFamous (@NoahBPeterson): in game on macOS/arm64 at around 13 fps, booting on Sony's own liblv2 and libsre (LLE). Its exact SPU float and VMX work landed in v0.15.0 (#286, #287), and @erikomis's inFAMOUS 2 bring-up on the same branch sent six fixes (#311-#316).
- Twisted Metal (@Kurtisone): menus on Linux/Vulkan, the deferred renderer's lighting and post-FX included. Most of v0.14.0's draw-engine and Vulkan work came out of this port.
- Killzone 3 (@undecuple): reaches the first level with geometry, lighting, shadows and depth of field (Windows build, run under Proton). 33 of its general fixes landed in v0.15.0 (#214).
- LittleBigPlanet (@sagemono), Yakuza: Dead Souls (@canersaka), God of War II HD and Ben 10 Omniverse (@andrebrumdev), and DBZ Budokai HD (@gnome41).
Ask in the Discord to get yours listed.
Want to port a game? Start with the Getting Started section, check docs/MODULE_STATUS.md for system library coverage, and see the Game Porting Guide for a real-world walkthrough.
Relationship to Other Projects
| Project | Role |
|---|---|
| RPCS3 | Our primary reference for HLE module behavior and system call semantics. Standing on the shoulders of giants. |
| XenonRecomp | PowerPC recompiler for Xbox 360. Same ISA family and the same approach; our lifter is our own. |
| N64Recomp | Pioneered the modern static recomp approach. Our architecture follows the same "recompile to C, link with runtime" philosophy. |
| PS2Recomp | Sibling project for PS2. Different ISA (MIPS vs PowerPC) but same spirit. |
| ReXGlue | The closest sibling this project has: a static recompilation SDK for the Xbox 360, turning PowerPC into portable C++ compiled ahead of time rather than interpreted. Same shape as ps3recomp — a toolkit plus a runtime, with game ports built on top — and a generation of Xenon hardware away from Cell. Their release engineering covers five platforms from one reusable build workflow, with nightlies and tagged releases that publish artifacts. |
| pcrecomp | Our PC recompilation toolkit. Shared philosophy of "analyze → disassemble → lift → link → ship". |
Building Blocks We Leverage
- RPCS3: a behavioural reference for HLE modules and syscalls. We read what it does and then write our own. No RPCS3 (GPL) code belongs in this tree.
- Direct3D 12 / Metal / Vulkan: RSX graphics translation. D3D12 is the backend that runs games in this tree today. Metal (macOS) and Vulkan (Linux, opt-in, see docs/BUILDING.md) run guest shaders on the shared draw engine. CI draws with the headless null backend.
- SDL2: input and audio off Windows.
cellPadandcellAudioalways use their SDL2 backends on non-Windows hosts, so SDL2 is required there; on Windows they use XInput and WASAPI. SDL2 does no windowing here; each graphics backend makes its own. - FFmpeg (optional, loaded at run time): video decode for cellVdec and ATRAC3plus for cellAtrac. It is never linked and never vendored.
Contributing
This is a massive undertaking and we need help. Here's how to get involved:
- HLE Module Authors — Fill in the partial modules (media decode, SPURS edge cases) from documented behaviour
- PPU/SPU Experts — Improve the disassembler and lifter accuracy
- Graphics Engineers — Bring Metal and Vulkan to D3D12 parity, then run a title on them
- Game Testers — Try recompiling titles and report what breaks
- Documentation — Help us map out the PS3's system library landscape
See CONTRIBUTING.md for guidelines.
Not sure where to start, or want to sanity-check an idea first? Ask in the Discord — several of the people working on ports and on the lifter are there.
Legal
This project does not contain any proprietary Sony code, firmware, encryption keys, or copyrighted material (docs/FIRMWARE_LLE.md explains how LLE works without shipping firmware). It provides clean-room implementations of system library interfaces based on publicly documented behavior. You must provide your own legally obtained PS3 game files.
Contributors are credited in CONTRIBUTORS.md.
License
MIT License. See LICENSE for details.
Changelog
v0.15.0 — "Seventy-Six" (October 2026)
76 pull requests from six contributors, merged in #325. They come from five ports in progress: Killzone 2 and 3, inFAMOUS and inFAMOUS 2, and Twisted Metal, plus tekulvw's correctness sweep of the runtime and Metal. Every change ships with a test or a measurement.
SPU and SPURS
- Hardware-exact SPU float (@NoahBPeterson, #287).
Single precision now follows the ISA: extended range, truncation, denormal
flush and saturation.
frestuses the hardware table. Results are checked against an exact-arithmetic referee, and NEON paths run 1.6-4x faster with bit-identical output. This replaces the previous GPL-derived float code. - SPURS policy scheduling (@tekulvw, #291).
Each instance gets a coordinator and
nSpuspersistent workers, with admission capped by each workload's contention, so a waiting consumer no longer starves its producer. Every live SPU context also keeps private DMA and reservation state (#290). - Interpreter fallback resumes lifted code (#266), and machine status reports
the interrupt-enable bit (#289). MFC
SDCRZis implemented (#295), FNMS keeps its addend for zero times an extended operand (#318), and parked-list diagnostics are bounded (#298). SPURS task exit-code containers (#283), taskset storage size (#284) and TaskInfo requeue masking (#306) (@tekulvw). build_spu_workloads.py --inputdiscovers, validates and registers SPU ELFs from supplied files, and the project template runs it (@tekulvw, #288).SPU_RdDecno longer wraps 231 s after its base stamp (@erikomis, #313).- From @undecuple: the SMC micro-interpreter
addresses
lqa/stqaat I16 << 2 (#268). The MFC engine table grows past eight contexts (#272, later replaced by #290's unbounded registry). The policy module's u64 argument is passed in the preferred doubleword (#309), and_cellSpursAttributeInitializegets its SDK argument order (#310).
PPU lifter and loader
- Exact VMX (@NoahBPeterson, #286). About 45 VMX ops that lifted as
no-ops are now implemented, along with VSCR saturation and CR6 compares.
BO/BI branches are decoded (
bdnztandbdzfwere always taken), CTR is 64-bit, and get-PC idioms are recognised. - From @undecuple:
- big-endian lane order for ten VMX integer ops (#269);
lwaxjump tables (#285);scat the end of a function falls through (#297);- a carry-form definition is no longer mistaken for a callee-save restore (#320);
--chunks Ncuts lifted source by guest address and rewrites only the files that changed (#254).
- Loader, from @undecuple: TLS blocks sized by the TLS image (#253), a per-coroutine indirect-call depth guard (#270), and thread-locals that stay thread-local under MinGW (#271).
- Jump tables behind a tail-call epilogue are found (@erikomis, #311).
- Boot, from @tekulvw: PPU entry argv/envp live in stack-owned storage (#263), and HLE registrations regenerate when library sources change (#262).
RSX, draw engine, Metal and Vulkan
- Depth: from @undecuple, fragment depth export (#279), depth buffers sampled as textures return real depth (#280), and Z16 clear values are decoded (#282). From @tekulvw, 2D depth-compare textures (#302), depth24 endpoints preserved (#299), depth export in the shader cache keys (#301), and Metal depth attachments read back to guest memory (#300). From @Kurtisone, the depth bounds test (#319).
- Colour: from @tekulvw, sRGB framebuffer output (#304), per-channel texture input gamma (#305), fragment colour inputs clamped before source modifiers (#303), and register-fed DATA3F/DATA4F immediate vertices (#292).
- Fragment decompiler: predicated writes are a select, not a lerp (@undecuple, #278). The NV40 pack/unpack opcodes are implemented (@erikomis, #314).
- Antialiased surfaces render at sample resolution (#281), and the sampler cache key covers every field it decodes (#321) (@undecuple).
- Metal:
- from @tekulvw: owned colour targets snapshotted in GPU order (#307),
clears replayed over complete surfaces (#293), real window-close
reporting (#308), and opt-in
PS3RECOMP_METAL_FPSframe timing (#294); - from @erikomis: a command buffer that fails is reported (#316).
- from @tekulvw: owned colour targets snapshotted in GPU order (#307),
clears replayed over complete surfaces (#293), real window-close
reporting (#308), and opt-in
cellGcm
- From @undecuple: IO mapping table 16 -> 512 with no leak on refusal
(#255),
GET_REPORThonours its DMA context (#256), FIFO user commands reachcellGcmSetUserHandler(#273), and the in-FIFO flip wraps only the runtime's own ring (#275). - Strict-order IO mapping (@tekulvw, #248). A parked FIFO gets time to be
patched before the walker follows
put(@erikomis, #312).
System libraries
- cellFs: directory entries (@tekulvw, #247), configured disc roots
(@tekulvw, #249),
GetFreeSize/Chmod/Utime/SdataOpenByFd(#257), and 64-bit sizes on Windows (#258). - cellSaveData: PARAM.SFO is written and read as a real binary PSF, and old text saves still load (#322). UserAutoSave keeps its ninth argument (#276).
- Network:
- from @undecuple: cellHttp's URI path (#260) and response getters (#261);
sceNpBasic usable after
sceNpInit(#259); sceNpCommerce2CreateCtx(#323); the EDAT klicensee fromsceNpDrmIsAvailable(#274); - from @tekulvw: no SIGPIPE on host sends (#250) and
inet_pton(#265).
- from @undecuple: cellHttp's URI path (#260) and response getters (#261);
sceNpBasic usable after
- Other:
- from @undecuple:
sys_lwcond_tlayout (#277) andcellFontInitializeWithRevision(#324); - from @erikomis:
cellGemGetMemorySizeand the event-queue notify forms (#315); - from @tekulvw: the timezone syscall (#264), extended sysmodule tracking (#267), message-dialog abort (#251) and Sail boot parameters (#252).
- from @undecuple:
Older releases: CHANGELOG.md.

