The panel carried a hand-written palette of neutral greys, on the reasoning that a Presentation sits outside the Compose tree and reading MaterialTheme from a plain View would mean holding a composition alive for six colours. The reasoning was right and the conclusion was not: ARMSX2's night theme is BLUE, so grey was not a neutral choice, it was a different app on the second screen. That is what "still looks quite unpleasant... more like stock android instead of armsx2" was describing. Armsx2Theme now publishes the RESOLVED scheme for code that cannot be a composable, and the panel reads that. No composition is held and there is no second copy of the theme logic to drift, so the panel follows Blue, Purple, OLED, Custom, Material You and the animated RGB mode without knowing any of them exist. Action tiles get a glyph over the label, because a tile has to be recognised from across a desk. Geometric Unicode rather than emoji: emoji bring their own colours and their own house style, which is the stock-Android look this is moving away from, while a glyph takes the accent like everything else. The two tiles that carry state SWAP their glyph rather than appending a line -- Pause shows what the tap will do, and Fast Forward no longer grows when you use it, which was half of the ragged-row problem. Panel background is now a choice: the theme's own ground, the library's backdrop darkened so it reads as the same app as the screen beside it, or solid black for an OLED second display. CPU, GPU and battery temperature tiles, asked for by two people. Android has no supported API -- HardwarePropertiesManager is signature-gated -- so this reads the thermal sysfs, which is permissionless but is not a contract: zone count, naming and even the UNIT are vendor-specific. Zones are discovered once by name, the unit is inferred by magnitude (no phone runs at 1000C and none idles at 0.045C, so the ranges cannot overlap), implausible values are dropped rather than displayed, and a device that exposes nothing shows a dash instead of a wrong number. Polling is on its own interval, 1 to 5 seconds -- that interval is the mitigation asked about, and it is why the panel tick can call it every frame for free.
ARMSX2 — Native ARM64 JIT Fork of PCSX2
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
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
