Releases: xmiguel911x/PSX3IOS
Release list
beta 0.2.5
File selector fixed, TrollStore version added
beta 0.3
beta 0.3
the per-game core settings translated
into every language the app speaks, and two texts that were confidently telling
people the wrong thing.
Language
- The per-game core settings are readable in all fourteen languages. The
explanations under LLVM precompilation, SPU block size, resolution scale and the
decoder mix existed only in English and Spanish, which meant that everyone else
was choosing between values whose consequences were not written down anywhere
they could read. Those, the two memory warnings, the settings notebook and the
"this device cannot emulate" notice are now translated: 240 strings across the
twelve remaining languages. What is still identical to English after this pass
is the set of words that are the same word in that language — Mono, Auto,
Normal, Panel, Version in German, Options in French — and changing those
would only make them worse.
Text
- The memory warning no longer promises that 8 GB of RAM is enough. It ended
by saying that devices with 8 GB or more need none of this, which is false and
was reported by someone holding a phone with 12 GB who had just been blocked by
it. The extended virtual addressing entitlement governs address space, not
physical memory; extra RAM does not widen it. The notice now says the outcome
depends on how the app was installed, which is the part the reader can act on. - The credits show the version you are actually running. The version was a
translatable string copied by hand into all fourteen language blocks, and it had
been left atbeta.0.1while beta.0.2 was being handed out — three releases
beta 0.2
beta 0.2
Emulation
- A cache-maintenance call no longer kills the thread that makes it.
sys_icache_invalidatetouches memory to do its work, so a null pointer takes
the caller down with a segfault at address 0. One of the two calls in the SPU
recompiler's dispatch path sits on the common exit, where the patch-point
pointer is legitimately null because nothing was rewritten. It was killing all
five SPURS kernels one after another, which left the game's twelve PPU threads
waiting on them forever. From the outside it looked exactly like a hang: no
error, CPU at 16 %, millions of idle sleeps. Fixed at the call site, and
psx3ios_jit_flushnow refuses an invalid address and records it instead of
dying. - The graphics layer is back to a state that draws. A merge from another
ARM64 port had left 28 files of the RSX and Vulkan code changed, among them the
swapchain, the image-layout transitions and the pipeline compiler. The result
was a game that ran perfectly and displayed nothing — broken geometry or a
black screen — which is a hard symptom to read, because the emulator looks
healthy: it compiles shaders, counts frames and uses CPU. Two additions that
had no business in an iOS app went with it: an Android Vulkan loader and a
profiler's GPU timer. - x18 is always reserved on Apple hardware. It is the platform register and
the system may overwrite it at any moment, but LLVM only infers that from the
target triple, and ours deliberately sayslinuxso that its runtime linker
emits ELF and builds the branch islands a 266 MiB code arena needs. It is now
reserved in the backend itself, where no chain of options can leave it open,
and every launch records whether it took effect.
Settings
- Your settings now win over the recommended database. Turning something off
for a game was being silently undone at boot: the emulator applies its
recommended per-game configuration after everything else, so the database
overwrote the user's own choice with no indication anywhere. The recommended
values still fill in what you have not touched, but the keys you set for that
game are removed from them before they are applied, and the log says how many
were dropped. - The recommended database can be switched off entirely, and ships off, so a
game starts with your settings and nothing else
Setup
- The guided setup finishes the job. Everything under Settings → JIT can now
be completed without leaving it: enabling JIT, choosing the StikDebug script,
and turning on the launch handoff, alongside firmware and the memory
entitlements — seven steps instead of five. Each action button shows the real
state rather than an instruction, so "JIT enabled" and a script's filename tell
you there is nothing left to do on that page. - Installing firmware no longer closes the setup screen. It used to dismiss
itself so the library could do the work, which dropped the user out halfway
through configuration with the distinct impression they had broken something.
The file picker is now presented over the guide and the install runs inside it,
spinner and all, returning to the same card with the button reading
"Firmware installed".
Interface
- The background colour can be changed, in Settings → Theme. It tints the
gradient, the waves and the specks without touching the theme itself: the two
are separate on purpose, since wanting a different colour is not a reason to
be given a different layout. Six to choose from, all dark enough to keep what
sits on top readable. - Everything decorative stops while a game runs. The waves and the specks
kept animating behind a game that covered them completely — GPU and battery
taken from the emulation to draw something nobody can see. They now suspend
when a game starts and resume when you leave it, and coming back from the
background does not restart them while a game is still running. The game's
music stops at the same point, when the compilation screen gives way. - Only the selected cover lights up. Every cover in the row was getting the
blue edge and the halo, which meant none of them stood out: twenty highlighted
covers are twenty ordinary covers, and the one actually selected was lost among
them. The chosen one now takes the lit edge, the glow and full size while the
rest step back a little, dimmer and slightly smaller. Contrast only works if
something gives way. - The background moves the way it should. The waves used to bounce back and
forth, which reads as a pendulum rather than a current. Each one is now drawn
two screens
beta 0.1
It was never launched
beta 0.1
First beta. The app moves out of alpha with wider device support, a rebuilt
interface and full access to the emulator core.
Compatibility
- Runs on iOS 15.0 and later. The deployment target was lowered from 17.0.
- Updated to the latest RPCS3 core
Emulation
- Every core setting is now exposed — all 273 options from the RPCS3
configuration tree, grouped as the emulator groups them, with the value shown
and anything changed from default highlighted. - Plain-language explanations under the most-used core settings, translated
into all 14 app languages. The setting names stay in English on purpose:
they are the terms every RPCS3 guide and forum post uses, so translating them
would leave users unable to search for help. - Community game patches. Download the official RPCS3 patch list and enable
or disable individual patches per game, using the emulator's own patch engine
and configuration file. - External game folders. Add any folder on the device — an attached drive, a
Files provider, or local storage — and launch games straight from it. Nothing
is copied into the emulator's own folder, so games are not stored twice.
Interface
- Rebuilt library: a cover carousel with a detail card showing an interactive
3D Blu-ray case that can be rotated, opened, and have its disc taken out. - Full iPad support. Layouts now adapt by proportion rather than by width in
points, which is what broke iPad portrait: at 834 points wide it was being
treated as landscape. Verified by calculation across 28 real screen sizes,
including iPad Split View widths. - Gamepad control of the interface. With a controller connected the library
is fully navigable: change game, play, open options, and rotate the 3D case
with the right stick. Input is released entirely while a game is running. - Arrows to switch games on either side of the cover, in portrait, leaving
the artwork free for its own gestures. - Swipe back through the settings screens instead of only the back arrow.
- Guided setup screen on first launch, walking through firmware, JIT and the
memory entitlements, and reopenable at any time from Settings. - Performance panel over the game, switched on from the PS button menu:
frames per second, RSX load and memory, each with a coloured bar. Every figure
is measured rather than estimated — the RSX load is the emulator's own, and
memory is the physical footprint iOS actually enforces. A reading that cannot
be taken shows a dash, never a zero. - The translation button can be turned on and off from the PS button menu,
and stays as you left it instead of appearing on every launch. - The performance panel can be dragged anywhere on screen and remembers where
you left it, and carries a lightning bolt showing whether JIT is active. - Start with or without JIT from the game card: the play button starts with
the interpreter, the bolt starts with the recompiler. The choice applies to
that launch only and does not change the game's settings. In the classic theme
the same two options appear when you tap a cover. - Core settings per game. All 273 options, browsed by the emulator's own
categories, saved as overrides that apply only to that game and on top of the
general settings. Values are picked from the list the core itself offers, and
numeric ranges use a slider — no typing values from memory. Anything you change
is marked on the cover, and a single button removes it all again. - Display and Controls in the PS button menu: aspect ratio and resolution
without leaving the game, the connected controllers, the touch-control skin and
button placement. Closing the game is now the last entry in that menu, since it
is the only irreversible one. - The notebook starts empty and is yours. Save a game's current settings into
it with one button from its options, and swipe to remove an entry. - Trophy names and descriptions follow the app language, read from the
per-language trophy files a game ships rather than always showing English. - Game version now reflects the installed update instead of always reporting
the version printed on the disc. - Play and Options became icons, so they no longer distort at any window size.
Fixes
- JIT fixed. Just-in-time recompilation works again, which is the difference
between playable and unusable on this hardware. - Shoulder buttons (L1/L2 and R1/R2) no longer overlap in any skin or
orientation, whatever layout was previously saved. - The circle button now responds across its whole area in portrait. It was
sitting four points from the screen edge, inside the strip iOS reserves for
its own gestures. - The D-pad is drawn with its arms pointing inward, matching a real controller,
in ever
alpha 0.0.3 — initial release
First public build, kept here for the record. RPCS3's core running on iOS with
a JIT that survives Apple's memory rules, a touch controller, and a game
library — enough to boot a game and not much more. No binary is attached: the
build it describes was published in reddit, and anything from that period is
superseded by the releases below.
beta 0.4
beta 0.4
Two reports from people running the app in ways I do not: JIT that the system had
already granted was being thrown away, and the bundle was missing keys that every
iOS app carries.
JIT
- JIT that was already granted is no longer discarded. Setting up the JIT
ground asks the attached debugger to register each chunk of executable memory,
and any chunk it did not register aborted the whole thing. But the registration
call also reports failure when no debugger is attached at all — which is the
normal state for two of the three ways this app gets JIT. LiveContainer grants
it by attaching a debugger that then detaches, and TrollStore grants it through
an entitlement with no debugger ever involved. In both cases the permission is
real and the memory works; there is simply nobody left to notify. The app was
throwing that away and falling back to the interpreter, while telling the user
"JIT unavailable" on a device where JIT was working. It now measures instead of
inferring: with no debugger present it writes a minimal function through the
write alias and calls it through the executable view, under a signal guard so
that a refusal degrades instead of taking the process down. If it runs, there is
JIT. The path with a debugger attached is unchanged, and a registration failure
there is still fatal. - Attaching JIT after the app is open now works. The ground was probed once
per session, so the first answer was cached for good. Under LiveContainer the
natural order is to open the app and enable JIT afterwards, which meant the
answer being cached was always "no" — and nothing the user did could change it
short of relaunching. The status pill re-measures now, and it also refreshes
when you return to the app, which is exactly the moment the permission has just
been granted somewhere else.