J1coding 4fa820435d iOS: decode a launch link's filename once, not twice
queryValue returns its answer already percent-decoded on both of its paths:
URLComponents decodes for the ordinary case, and the raw-query fallback
decodes by hand for callbacks that arrive unencoded. launchGame then decoded
it again.

A second pass reads a literal percent in the value as the start of a new
escape. 100%.iso percent-encodes to 100%25.iso, the first decode gives back
100%.iso, and the second sees % followed by .i, which is not hex, so
removingPercentEncoding returns nil. The guard falls through and tells the
player the link is missing a game filename, which is the one thing it
plainly carries. Only the launch route did this; exportLibrary reads the
same helper and does not.

The contract now sits on queryValue rather than being something each caller
has to know, since knowing it is what went wrong.

The fence pins more than the fix, because armsx2://launch?game= is not an
internal detail. libraryPayload hands that string to other frontends, which
store it and replay it much later, so the verb, the parameter name and the
encoding are a contract with software this repository does not control. It
also compares the schemes the handler accepts against the ones Info.plist
registers, in both directions: a scheme in code but not in the plist fails
silently, because iOS never routes the URL and the handler that would have
accepted it is never reached.

Six mutations run against the real source, all six caught, each restored
byte for byte. The scheme check needed the second direction to catch the
sixth; the first version iterated the known list and could not see an
addition.
2026-08-18 23:41:53 +02:00
2026-07-27 19:48:36 +02:00
2024-01-14 14:18:03 -05:00
2026-04-03 12:41:47 -04:00
2026-07-18 12:04:18 -04:00

ARMSX2 — Native ARM64 JIT Fork of PCSX2

All Platforms

ARMSX2 is a free and open-source PlayStation 2 (PS2) emulator based on PCSX2. Its purpose is to emulate the PS2's hardware, using a combination of MIPS CPU Interpreters, Recompilers and a Virtual Machine which manages hardware states and PS2 system memory. This allows you to play PS2 games on your phone, PC, or gaming handheld, with many additional features and benefits.

Thank You

The ARMSX2 team is eternally indebted to the PCSX2 project it is based on. We are so fortunate to build on their 20 years of hardcore development.

About This Fork

Project Demo

The upstream PCSX2 project ships an ARM64 interpreter build for ARM, but its high-performance JIT recompilers (EE, IOP, VU0, VU1, and vtlb fast memory) are x86-64 only.

This fork exists to close that gap. The goal is to preserve the correctness features of 20 years of PCSX2 development, while generating the fastest native ARM performance possible.

Current status:

  • EE (Emotion Engine) recompiler — integer, float, MMI, COP0/COP1/COP2, branches, load/store
  • IOP (I/O Processor / R3000A) recompiler — full integer, load/store, branches, coprocessors
  • VU (Vector Unit) recompiler — microVU skeleton + Upper FMAC vector ISA complete; Lower ISA and runtime complete
  • vtlb fast memory
  • Native ARM64 binary builds and boots the PS2 BIOS
  • 2D games are already playable
  • 3D games run

Why LLMs / AI Were Used

A word on methodology:

The x86-64 JIT code in upstream ARMSX2 is already proven correct — it has run thousands of PS2 titles for years. The challenge in this port is not emulator design or JIT theory; it is mechanical translation of a large, well-understood x86-64 assembly codebase into equivalent ARM64 assembly (via VIXL) while preserving the exact same register-allocation contracts, block lifecycle, and recompiler semantics.

Large language models (LLMs) were used as an accelerant for this translation work — pattern-matching x86 JIT boilerplate to ARM64 equivalents, scaffolding emit routines, and keeping the porting velocity high. The JIT logic (block compiler, dispatcher, analysis passes, flag pipelines, clamping rules, Tri-Ace hacks, etc.) is taken directly from the upstream x86 implementation and validated against it. Nothing was hallucinated from scratch.

In other words: the hard engineering was done by the PCSX2 team over two decades. The hard typing — translating ~50k lines of x86 emitter code into ARM64 — is what AI helped compress.

System Requirements

ARMSX2 targets ARM64 across desktop (macOS, Windows, Linux) and mobile (Android, iOS/iPadOS), all from the single shared core. Our setup documentation page contains additional details on software and hardware requirements.

Please note that a BIOS dump from a legitimately-owned PS2 console is required to use the emulator. For more information, visit this page.

Building

Check out our github actions for the latest build recipe

S
Description
No description provided
Readme
512 MiB
Languages
C++ 68.2%
Kotlin 9.8%
Swift 7.7%
C 5.6%
Objective-C++ 2.2%
Other 6.4%