Homebrew Homebrew game [WIP] P3P3DS - Persona 3 Portable Statically Recompiled for New 3DS

  • Thread starter Thread starter enderlit
  • Start date Start date
  • Views Views 1,657
  • Replies Replies 14
  • Likes Likes 5

enderlit

Member
Newcomer
Joined
Oct 1, 2026
Messages
10
Reaction score
20
Trophies
0
Age
26
XP
51
Country
Israel
P3P3DS is an open-source (MIT) project to run Shin Megami Tensei: Persona 3 Portable (ULUS-10512) natively on the New 3DS / New 2DS XL.

It is not a PSP emulator: the game's MIPS executable is statically recompiled ahead of time into C++ and then ARM code, and the PSP system services it needs are reimplemented on top of libctru (HLE). Graphics run on the 3DS GPU (PICA200, citro3d).

Current status (v0.3.0, October 2026): playable, early
  • Runs on a real New 3DS / New 2DS XL from the title screen through NEW GAME, the first days and the first Dark Hour, including battles. Tested by me on a New 2DS XL through the first days and the first battle; later parts of the game are untested.
  • Dorm / field: 28-30 fps, dialogue scenes 30 fps most of the time.
  • Battle: 16-25 fps on hardware (0.2.7 ran battles at 5-7.5 fps). The PSP graphics work now runs on the New 3DS's second CPU core, in parallel with the game.
  • Saving and loading work, through a save menu on the bottom screen (D-Pad to choose, B to confirm, A to go back). Saves use their own format, not compatible with PSP / PPSSPP saves.
  • No sound yet. The opening movie has no decoder yet and is skipped automatically.
  • Known glitches: garbage instead of the logos right after start (0.3.0); a garbage or black frame at some scene transitions; a light outline around changed facial expressions in dialogue portraits.
  • Expect crashes in places nobody has reached yet: the game stops with the name of the missing PSP function, which goes straight into the next fix.
Correction: an early reply in this thread said "40-60 fps". That number was wrong: the counter measured screen refreshes, not game frames. P3P runs at 30 fps at most; the numbers above are real game frames.

How to try it
No copyrighted files are distributed. Download the P3P3DS Builder from the GitHub Releases page (Windows wizard or Linux console version). It turns your own ULUS-10512 ISO into p3p3ds.3dsx on your PC in about 5-15 minutes. You need devkitPro with the 3DS packages installed. Copy p3p3ds.3dsx to /3ds/ and your ISO to /p3p3ds/ on the SD card.

Reports help a lot: a photo plus sdmc:/p3p3ds/report.txt (build, speed and where the time goes).

Roadmap
Audio (NDSP) -> the remaining glitches (start logos, transitions, portraits) -> battles at a steady 30 fps -> opening movie, .cia. Old 3DS: tested, it stops at start for lack of memory (the port needs about 112 MB, the Old 3DS gives 64-96 MB); it would need a different approach, so not soon.

  • 0.3.0: playable on hardware. The PSP graphics work runs on the New 3DS's second CPU core in parallel with the game: battles 16-25 fps on a New 2DS XL (0.2.7: 5-7.5), dorm 28-30 fps. Smaller recompiled code (about 3.5 MB more free memory).
  • 0.2.9: battles faster again (about 9.9 -> 16 fps in Azahar): model vertices cached between frames, thousands of tiny model draws merged into a few dozen blocks per frame, cheaper speed report; two emulation bugs fixed (VFPU state of new threads, a skipped retry of blocking audio/file calls).
  • 0.2.8: faster battles (about 5.8 -> 9.9 fps): the 3DS renderer sends GPU state only when it changes and merges consecutive model draws into one GPU draw.
  • 0.2.7: the first battle renders correctly (the "exploded" models and black background were a back-face culling bug).
  • 0.2.6: 3D models transformed, skinned and lit on the GPU; Linux Builder (thanks to Dmitri Shimanski); releases built automatically.
  • 0.2.5: the first battle no longer crashes.
  • 0.2.2: saving and loading; menus at their real 30 fps; speed limiter.

About development: I use Claude Code (an AI coding assistant) heavily for writing code. I decide what gets built, test every build on my New 2DS XL, and nothing is claimed without a measurement or a photo.

Repo: https://github.com/endercodezz/P3P3DS
Releases: https://github.com/endercodezz/P3P3DS/releases

Feedback and contributions are welcome, especially from people who know PSP internals, citro3d / PICA200, NDSP or ATRAC3plus / H.264 decoding.

photo_2026-10-11_15-51-30.jpgphoto_2026-10-11_15-51-32.jpgphoto_2026-10-11_15-56-44.jpg
 
Last edited by enderlit,
I feel like this should have maybe been shared once it got past the point of being ports of the ATLUS and CRIWARE logos lol

Either way, best of luck to you. I'm all for seeing more wacky ports. Might also be an idea to add a disclaimer that you are indeed driving development and not just blindly following Claude (assuming this is the case) if you want people to join in on development.
 
  • Like
Reactions: Exnor
I feel like this should have maybe been shared once it got past the point of being ports of the ATLUS and CRIWARE logos lol

Either way, best of luck to you. I'm all for seeing more wacky ports. Might also be an idea to add a disclaimer that you are indeed driving development and not just blindly following Claude (assuming this is the case) if you want people to join in on development.
small UPD: now you can play the game at 40-60 fps

EDIT: this number was wrong (the counter measured screen refreshes); real numbers are in the first post.
 

Attachments

  • _02.10.26_00.00.15.176.png
    _02.10.26_00.00.15.176.png
    107.9 KB · Views: 2
  • _01.10.26_23.58.56.831.png
    _01.10.26_23.58.56.831.png
    100.4 KB · Views: 1
Last edited by enderlit,
I'm not going to complain about this being only on New 3DS since it's clearly pretty early in development right now, but I do hope you'll optimise the game well and consider making it playable on old models too.
 
I'm not going to complain about this being only on New 3DS since it's clearly pretty early in development right now, but I do hope you'll optimise the game well and consider making it playable on old models too.
Yeah, Old 3DS optimization is planned.
 
Update - P3P3DS Builder 0.2.2

  • Saving and loading work. The PSP's save dialog is replaced by a menu on the bottom screen: D-Pad to choose, B to confirm, A to go back.
  • Fixed the crash at the first Shadow (battle transition).
  • Menus now run at their real 30 FPS (an input timing bug made them run at 20).
  • The speed limiter keeps the game from running faster than real time.

A correction: the "30-60 FPS" I posted earlier came from a counter that measured screen refreshes, not game frames. The bottom-screen report now shows both. Real numbers: about 87% of full speed on average on my New 2DS XL; in Azahar the Dark Hour drops to around 7 game FPS. Getting a stable 100% is what I'm working on next, then audio.

Download: https://github.com/endercodezz/P3P3DS/releases (you still need your own ISO and devkitPro).
If it crashes, please post a photo of the bottom screen or the file sdmc:/p3p3ds/report.txt.
Post automatically merged:

P3P3DS Builder 0.2.4 is out

Download: https://github.com/endercodezz/P3P3DS/releases (same as before: run the Builder on your PC with your own ULUS-10512 ISO, then copy p3p3ds.3dsx and the ISO to the SD card).

What changed since 0.2.2

  • Speed: removed a lot of wasted work outside the game code: per-call allocations in debug code, a memory leak (every GPU display list was kept forever), and a full 12 MB GPU-memory cache flush on every frame. The renderer also no longer re-presents a frame that hasn't changed.
  • Crash fix: 0.2.3 could crash at the first Shadow, with an exception screen and then the console shutting down. Fixed in 0.2.4.
  • Bottom-screen report: now shows where the time goes over the last 10 seconds (game code, system calls, graphics, idle). Useful if you want to send a report.
Measured on my New 2DS XL (build before the crash fix):

  • In the field: mostly a steady 30 fps, sometimes down to 20.
  • Average: 88% of real time.
  • First Shadow: drops to about 15 fps. Battles are the next thing to optimize.
  • Saving and loading work.
Not working yet: no sound, no opening movie (it's skipped). Old 3DS / 2DS is still not supported.

Not verified yet: whether battles after the first Shadow work. If you get there, please post your sdmc:/p3p3ds/report.txt and say where it happened. That's the most useful feedback right now.
 
Last edited by enderlit,
P3P3DS Builder 0.2.6 — first battle renders characters, Linux builder

  • The first Shadow battle no longer crashes (since 0.2.5).
  • New: 3D models are now transformed, skinned and lit on the 3DS GPU (vertex shader). In battle, characters now show up with lighting. Still broken: models look distorted, faces are missing, the background is black, and battles run at about 7–11 fps. That's what I'm working on next.
  • Field: about 21–30 fps, saves work, no sound yet.
  • Linux builder (console version) — thanks to Dmitri Shimanski, the project's first outside contributor.
  • Releases are now built automatically on GitHub (Windows zip + Linux tar.gz).
Known issues are listed in the README. Reports from your console (sdmc:/p3p3ds/report.txt plus a photo) are very welcome.
 
P3P3DS 0.2.7 is out.

The "exploded" models and black battle background from 0.2.6 were one bug: for 3D draws the back-face culling kept the wrong side, so models were drawn inside out and the walls and floor facing the camera were culled. Fixed in both renderers (the PC reference renderer had the same problem, which is how I found it: the PC runner now plays through the whole first battle). Confirmed on a New 2DS XL, photos attached.
  • Battle: 5-7.5 fps, 18-25% of real time. GE work on the CPU takes 63-70% of the time (about 1,000 draws per frame); GPU wait 10-20%.
  • Field: 21-30 fps, about 90% speed.
Known issues: battles are slow (next target: 20 fps at full speed), no sound, opening movie skipped, own save format, New 3DS only.

Download: https://github.com/endercodezz/P3P3DS/releases/tag/v0.2.7 (Builder for Windows and Linux; you need your own ULUS-10512 ISO and devkitPro).

Reports (photo + sdmc:/p3p3ds/report.txt) are very welcome.

photo_2026-10-05_21-06-48.jpgphoto_2026-10-05_21-06-49.jpgphoto_2026-10-05_21-06-50.jpg
 
P3P3DS 0.2.8: faster battles

0.2.7 fixed how battles look; 0.2.8 is about speed.

The 3DS renderer was doing a lot of CPU work for every single draw: P3P draws its 3D models as thousands of tiny pieces, and for each piece the port re-sent the whole GPU state and rebuilt the shader inputs. Now state is only sent when it changes, and consecutive pieces with the same state are merged into one GPU draw: in the first battle about 2 million game draws became 55 thousand.

Numbers (tested on the first battle, Evoker scene)
  • 0.2.7: 5.8 fps, 19% of real time
  • 0.2.8: 9.9 fps, 33% of real time
  • The rest of the time now goes to the game's own code and to unpacking model vertices, which are the next targets (goal: 20 fps).
Known issues: battles still slow, no sound, opening movie skipped, own save format, New 3DS only.

Download: https://github.com/endercodezz/P3P3DS/releases/tag/v0.2.8 (Builder for Windows and Linux; you need your own ULUS-10512 ISO and devkitPro).

Reports welcome: a photo of the bottom screen in battle, or sdmc:/p3p3ds/report.txt.
 
  • Like
Reactions: Serph-DDS
P3P3DS 0.2.9: battles faster again

0.2.8 cut the GPU state work per draw; 0.2.9 goes after what was left of the per-draw cost.

What changed
- P3P draws a battle scene as about 2,000 tiny pieces per frame, most of them just 4 vertices. Each piece used to be unpacked and copied on its own. Now pieces whose vertices follow each other in memory are merged into one block (about 34 pieces per block in the first battle), and the converted vertices are kept between frames, so an unchanged model is not unpacked again.
- The speed report itself was expensive: it read the system clock with a slow conversion twice for every PSP system call. It now uses the raw tick counter.
- Two emulation bugs found in a code review are fixed: new PSP threads started with the wrong VFPU (vector unit) state, and a blocking audio or file call could be skipped when the thread was interrupted right after waking up. Neither caused a visible problem in the scenes tested so far, but both could have caused subtle glitches later (wrong math, a lost audio buffer, a stuck file read).

Numbers (first battle, Evoker scene, Azahar emulator)
0.2.7: 5.8 fps, 19% of real time
0.2.8: 9.9 fps, 33%
0.2.9: about 16 fps, 52%
Not measured on real hardware yet. If you have a New 3DS / New 2DS XL, a photo of the bottom screen in the first battle would help a lot.

Where the time goes now: about 45% the game's own code, about 26% the 3DS renderer, the rest system calls, sound mixing and waiting for vblank. The next big step is running the PSP graphics work in parallel with the game, the way the PSP's own GPU does (on the New 3DS's extra CPU core), after checking that a homebrew .3dsx can use that core at all.

Known issues: battles still below 30 fps, no sound, opening movie skipped, own save format, New 3DS only.

Download: https://github.com/endercodezz/P3P3DS/releases/tag/v0.2.9 (Builder for Windows and Linux; you need your own ULUS-10512 ISO and devkitPro).

Reports welcome: a photo of the bottom screen in battle, or sdmc:/p3p3ds/report.txt.
 
P3P3DS 0.3.0: playable on New 3DS (no sound yet)

Tested on my New 2DS XL: title screen, NEW GAME, the first days and the first battle, all on real hardware.

Numbers (real hardware, New 2DS XL)
  • Dorm: 28-30 fps
  • Dialogue scenes: 30 fps most of the time
  • Battle: 16-25 fps (0.2.7: 5-7.5 fps)

What changed
On the PSP, the GPU works in parallel with the CPU: the game hands it a list of drawing commands and keeps running. Until now the port did all of that on one 3DS core, so the game waited while its frame was being drawn. In 0.3.0 the 3DS-side graphics work (preparing the models and talking to the PICA200) runs on the New 3DS's second CPU core, in parallel with the game. A check at start confirms the core is really available to a homebrew .3dsx: on my console it runs at 1.98x of one core.

In battle the game now almost never waits for the renderer (0-4% of the time). The game's own recompiled code is now the largest share, so that is where the next speed-ups have to come from.

Known issues
  • No sound (next on the list) and no opening movie.
  • Right after start, the logos are replaced by gray garbage (leftover video memory); the game then continues normally. New in 0.3.0, being looked at.
  • Some scene transitions show a garbage frame (black in emulators) instead of a fade.
  • A light outline around changed facial expressions in dialogue portraits.
  • New 3DS only. Own save format.

Download: https://github.com/endercodezz/P3P3DS/releases/latest (Builder for Windows and Linux; you need your own ULUS-10512 ISO and devkitPro).

Reports welcome: a photo of the bottom screen, or sdmc:/p3p3ds/report.txt.

photo_2026-10-11_15-51-32.jpg
 
Last edited by enderlit,

Site & Scene News

New Hot Discussed User Submitted