Gary Riches 86786e2602 Mario 64 for the PlayStation 5: Ghostship 3.0.0 on RADV
Ghostship (the Super Mario 64 decompilation on libultraship) as PS5 title
PPSA99310, drawn by libultraship's Vulkan renderer through volk on the
PS5 Vulkan stack's RADV. SDL2 with video, audio and pad drivers for the
console; shaderc built from source; the ROM converted on the console by
Torch; a settings menu worked with the pad alone. No game data.

Claude-Session: https://claude.ai/code/session_01RgbCxcpr8XZH1TnrxK4BS9
2026-10-12 20:46:34 +01:00

Mario 64 for PlayStation 5

stars release licence

A PS5 homebrew port of Ghostship (v3.0.0), HarbourMasters' native port of the 1996 Nintendo 64 game, compiled from its decompilation on libultraship. On the console it draws through libultraship's Vulkan renderer on RADV, from the PS5 Vulkan stack.

The build reads no ROM and holds no game data. The player copies their own ROM beside the title, and the title converts it once, on the console.

Status

Runs on the console. First run on 2026-10-12 on a PS5 at 3840x2160: the title screen, the file select, a new game and the castle grounds, at a measured 60 images a second (frame interpolation; the game's logic stays at 30). Played for minutes, not hours: nothing past the castle grounds has been seen on the console.

Area State
Game data A US or JP .z64 in the title's folder is found on the first start and converted to sm64.o2r in a few seconds (seen with the US ROM). With neither file the title says what to copy where and closes; that message was added after the last time this path was run
Picture 3840x2160 on a 4K output, 16:9
60 fps Measured at 3840x2160 on the title screen and the castle grounds, without the HD texture pack below (not measured with it)
Menu The touch pad's click opens Ghostship's settings menu. L1/R1 change tab, L2/R2 change section, the d-pad and Cross work the settings, Options asks to quit. The controls are listed along the bottom of the screen
HD textures SM64 Reloaded seen working on the console
Saves, settings /data/homebrew/PPSA99310/userdata/
Button prompts The game's own (A, B, C buttons): not yet the DualSense's
Sound Starts; not checked by ear
Rumble Not checked
DevLoop devloop-shot in the title's folder (registered as ghostship)
Art The icon and background are the port's own, made with an image generator (ps5/art/)

Controls are Ghostship's defaults for a pad: left stick to move, Cross A, Circle B, L2 Z, R2 R, L1 L, Options START, the right stick for the C buttons. They can be changed in the menu under Settings, Controls.

Install

Download Mario64-PS5-vX.Y.zip from the latest release and unpack it: it holds one folder, PPSA99310. (Or build that folder yourself, see Build.) It contains no game data.

What the console needs

  • A PS5 that runs homebrew, with etaHEN (or an equivalent) loaded.
  • ShadowMountPlus, which shows the folders in /data/homebrew as titles on the home screen.
  • An FTP server on the console to copy files with (port 2121 here).

Steps

  1. Copy the whole folder PPSA99310 to the console as /data/homebrew/PPSA99310/, so that you have:

    /data/homebrew/PPSA99310/eboot.bin
    /data/homebrew/PPSA99310/ghostship.o2r
    /data/homebrew/PPSA99310/config.yml
    /data/homebrew/PPSA99310/assets/       (what the ROM's conversion reads)
    /data/homebrew/PPSA99310/sce_sys/      (param.json, icon0.png, pic0.dds, pic1.dds)
    /data/homebrew/PPSA99310/sce_module/libc.prx
    /data/homebrew/PPSA99310/licenses/
    

    Copy sce_sys/icon0.png with the first upload: ShadowMountPlus will not register a title without its icon.

  2. Copy your own Super Mario 64 ROM into the same folder, beside eboot.bin. It must be the Nintendo 64 game's US or JP release, in .z64 format (big endian; convert a .n64 or .v64 dump first), under any name ending in .z64. The title checks the ROM against these hashes and takes no other:

    /data/homebrew/PPSA99310/baserom.us.z64
    
    Release SHA-1
    US 9bef1128717f958171a4afac3ed78ee2bb4e86ce
    JP 8a20a5c83d6ceb0f0506cfc9fa20d8f438cafe51
  3. Wait a few seconds for "Mario 64" to appear on the home screen, and start it.

  4. The first start says "ROM found" and asks whether to generate the game files: press Cross. It takes a few seconds, and the game starts. The ROM is not needed again and can be deleted from the console.

If you already have an sm64.o2r made by Ghostship 3.0.0 on a PC, copy that into the folder in place of the ROM.

If "Mario 64" does not appear on the home screen, look in /data/shadowmount/debug.log. "AppInstallAll hook is no longer installed" means ShadowMountPlus has to be restarted before it will register a new title.

HD textures (optional)

The port takes Ghostship texture packs unchanged. The one tried on the console is SM64 Reloaded by GhostlyDark:

1. Download the Ghostship version of the pack. On the releases page, take the file whose name contains gs-o2r:

File Size
sm64-reloaded-v2.6.0-gs-o2r-hd.7z 99 MB the one tried on the console
sm64-reloaded-v2.6.0-gs-o2r-4k.7z 618 MB sharper; not tried here

The other files on that page are for emulators and other ports and will not work.

2. Unpack it. It holds one .o2r file, for example SM64_Reloaded_v2.6.0_HD.o2r (547 MB).

3. Copy the .o2r to the console's mods folder:

/data/homebrew/PPSA99310/userdata/mods/SM64_Reloaded_v2.6.0_HD.o2r

The folder exists once the game has been started once.

4. Switch the pack on in the menu. Start the game, then:

  1. Press the touch pad to open the menu.
  2. Press R1 once, to the Enhancements tab.
  3. The Graphics section is the first one and is already selected (if another is, press L2 until Graphics is).
  4. Move down with the d-pad to Use Alternate Assets, under "Mods", and press Cross to tick it.
  5. Press the touch pad to close the menu.

The setting is remembered. Untick the same box to go back to the original textures. (On the console it was switched on before the game started; if the textures do not change when you tick the box, quit and start the game again.)

Build

On Linux (on a Mac, in the Lima VM) with PS5_Vulkan, PS5_Mesa and PS5_PayloadSDK beside this folder.

ps5/tools/vm.sh build            # from macOS; ps5/tools/build.sh inside the VM
ps5/tools/vm.sh assets           # ghostship.o2r, Ghostship's own assets, into dist/
ps5/tools/vm.sh deploy
ps5/tools/vm.sh run

build.sh runs setup-source.sh first, which applies the console's changes to vendor/ghostship and its two submodules from ps5/patches/ (every hunk behind __PROSPERO__ or PS5). While changing anything under vendor/, run ps5/tools/setup-source.sh --save before a build.

ps5/tools/vm.sh assets ROM.z64 also makes sm64.o2r on this machine, into the ignored game/ folder, and ps5/tools/vm.sh console-files uploads it: the quicker loop while developing.

What the console needed:

  • SDL2. libultraship is written for SDL2; ps5/sdl/ holds SDL2 video, audio and pad drivers for the console (ps5/patches/sdl.patch registers them).
  • Vulkan with no loader. RADV is linked into the title, so libultraship's Vulkan renderer and Dear ImGui's reach it through volk. OpenGL is compiled out.
  • shaderc, built from source: the renderer writes its shaders as GLSL at run time.
  • No working directory. A title cannot chdir, getcwd or realpath; ps5/src/shims.c answers the last two for std::filesystem.
  • The log. A flush for every line made the ROM's conversion take twenty minutes; errors are flushed at once, the rest every two seconds.
  • The menu with a pad alone: see Status.

GHOSTSHIP_PS5_FPS=1 in /data/homebrew/PPSA99310/env.txt writes the frame rate to the console's log every ten seconds.

Licence

GPL-3.0 for the repository as a whole and for a built title: see LICENSING.md. No game data is stored here or built in. "Mario" and "Super Mario 64" are Nintendo's; this project is not affiliated with Nintendo, HarbourMasters or Sony Interactive Entertainment.

2026-10-15 07:16:31 +02:00
Languages
C 56%
Shell 31.4%
CMake 7.1%
Python 5.5%