PSP Project Discord: https://discord.gg/5w4B69
- This repo contains a full decompilation of Super Mario 64 (J), (U), and (E) with minor exceptions in the audio subsystem.
- Naming and documentation of the source code and data structures are in progress.
- Efforts to decompile the Shindou ROM steadily advance toward a matching build.
- Beyond Nintendo 64, it can also target Linux and Windows natively.
This repo does not include all assets necessary for compiling the game. A prior copy of the game is required to extract the assets.
- Install prerequisites (Ubuntu):
sudo apt install -y git build-essential pkg-config libusb-1.0-0-dev libsdl2-dev
. - Clone the repo:
git clone https://github.com/sm64-port/sm64-port.git
, which will create a directorysm64-port
and then enter itcd sm64-port
. - Place a Super Mario 64 ROM called
baserom.<VERSION>.z64
into the repository's root directory for asset extraction, whereVERSION
can beus
,jp
, oreu
. - Run
make
to build. Qualify the version throughmake VERSION=<VERSION>
. Add-j4
to improve build speed (hardware dependent based on the amount of CPU cores available). - The executable binary will be located at
build/<VERSION>_pc/sm64.<VERSION>.f3dex2e
.
- Install and update MSYS2, following all the directions listed on https://www.msys2.org/.
- From the start menu, launch MSYS2 MinGW and install required packages depending on your machine (do NOT launch "MSYS2 MSYS"):
- 64-bit: Launch "MSYS2 MinGW 64-bit" and install:
pacman -S git make python3 mingw-w64-x86_64-gcc
- 32-bit (will also work on 64-bit machines): Launch "MSYS2 MinGW 32-bit" and install:
pacman -S git make python3 mingw-w64-i686-gcc
- Do NOT by mistake install the package called simply
gcc
.
- The MSYS2 terminal has a current working directory that initially is
C:\msys64\home\<username>
(home directory). At the prompt, you will see the current working directory in yellow.~
is an alias for the home directory. You can change the current working directory toMy Documents
by enteringcd /c/Users/<username>/Documents
. - Clone the repo:
git clone https://github.com/sm64-port/sm64-port.git
, which will create a directorysm64-port
and then enter itcd sm64-port
. - Place a Super Mario 64 ROM called
baserom.<VERSION>.z64
into the repository's root directory for asset extraction, whereVERSION
can beus
,jp
, oreu
. - Run
make
to build. Qualify the version throughmake VERSION=<VERSION>
. Add-j4
to improve build speed (hardware dependent based on the amount of CPU cores available). - The executable binary will be located at
build/<VERSION>_pc/sm64.<VERSION>.f3dex2e.exe
inside the repository.
Notes: Currently only supported building under linux and WSL
There is a file in the psp/
folder called snd_eng.prx
- This file is used to accelerate the sound generation and increase performance.
- It belongs next to the EBOOT.PBP or PRX.
Fixed textures live in the psp/textures/ folder. copy these into textures/, overwrite the extracted ones, and rebuild
- Install the PSP toolchain https://github.com/pspdev/psptoolchain.
- Place a Super Mario 64 ROM called
baserom.<VERSION>.z64
into the repository's root directory for asset extraction, whereVERSION
can beus
,jp
, oreu
. Note: Only US supported - Run
make TARGET_PSP=1
- Optionally if you would prefer an EBOOT.PBP for use on CFW Run
make TARGET_PSP=1 pbp
, and the foldermario64
will be made in the build folder.
Windows Instructions : NOTE UNSUPPORTED currently, must follow directions exactly!
- Install the PSP toolchain https://darksectordds.github.io/html/MinimalistPSPSDK/index.html
- Install Python3 from python.org, NOT the Windows Store
- Download this pack of helpful tools http://www.mediafire.com/file/jogmmqfwclmji3v/file
- Add the full path of where you installed the pspsdk eg.
C:\pspsdk\bin
to your environment variables - Copy the files from
pspsdk_bin/
from the windows pack into thebin
folder where you installed the pspsdk. The same folder you used above. - Copy
python3.exe
from the windows pack, next to makefile and baserom - Make a folder called
tmp
, next to makefile and baserom - Place a Super Mario 64 ROM called
baserom.<VERSION>.z64
into the repository's root directory for asset extraction, whereVERSION
can beus
,jp
, oreu
. - Copy files in
tools/
from the windows pack totools
folder in source, next to makefile and baserom - Open Powershell in the sm64 folder and run this:
- Run
make -t -s -C .\tools\
and ignore the line aboutmake: /bin/sh: Command not found
- Go back to powershell window:
- Run
$PSDefaultParameterValues['*:Encoding'] = 'utf8'
Only needed if using Powershell, if using cmd.exe you can skip this. - Run
make TARGET_PSP=1 SHELL=sh PYTHON=py
- Optionally if you would prefer an EBOOT.PBP for use on CFW Run
make TARGET_PSP=1 SHELL=sh PYTHON=py pbp
, and the foldermario64
will be made in the build folder.
Docker Instructions
- Place a Super Mario 64 ROM called
baserom.<VERSION>.z64
into the repository's root directory for asset extraction, whereVERSION
can beus
,jp
, oreu
. Note: Only US supported - Run the Docker container donated by mkst:
docker run --rm -ti -v $(pwd):/sm64 markstreet/sm64:psp make TARGET_PSP=1 pbp --jobs
- This will produce an EBOOT.PBP in
build/VERSION_psp/mario64/
folder along withsnd_eng.prx
for transfer to any CFW enabled Sony PSP.
Fixed textures live in the psp/textures/ folder. copy these into textures/, overwrite the extracted ones, and rebuild
- Install the Dreamcast toolchain https://github.com/KallistiOS/KallistiOS/tree/master/utils/dc-chain.
- Install python3
- Place a Super Mario 64 ROM called
baserom.<VERSION>.z64
into the repository's root directory for asset extraction, whereVERSION
can beus
,jp
, oreu
. Note: Only US supported - Run
make TARGET_DC=1 scramble
- This will produce a scrambled binary called
1ST_READ.BIN
ready to be burned onto a cd-r for use in a Dreamcast.
Docker Instructions
- Place a Super Mario 64 ROM called
baserom.<VERSION>.z64
into the repository's root directory for asset extraction, whereVERSION
can beus
,jp
, oreu
. Note: Only US supported - Run the Docker container donated by mkst:
docker run --rm -ti -v $(pwd):/sm64 markstreet/sm64:dreamcast make TARGET_DC=1 scramble --jobs
- This will produce a scrambled binary called
1ST_READ.BIN
ready to be burned onto a cd-r for use in a Dreamcast.
- If you get
make: gcc: command not found
ormake: gcc: No such file or directory
although the packages did successfully install, you probably launched the wrong MSYS2. Read the instructions again. The terminal prompt should contain "MINGW32" or "MINGW64" in purple text, and NOT "MSYS". - If you get
Failed to open baserom.us.z64!
you failed to place the baserom in the repository. You can writels
to list the files in the current working directory. If you are in thesm64-port
directory, make sure you see it here. - If you get
make: *** No targets specified and no makefile found. Stop.
, you are not in the correct directory. Make sure the yellow text in the terminal ends withsm64-port
. Usecd <dir>
to enter the correct directory. If you writels
you should see all the project files, includingMakefile
if everything is correct. - If you get any error, be sure MSYS2 packages are up to date by executing
pacman -Syu
andpacman -Su
. If the MSYS2 window closes immediately after opening it, restart your computer. - When you execute
gcc -v
, be sure you seeTarget: i686-w64-mingw32
orTarget: x86_64-w64-mingw32
. If you seeTarget: x86_64-pc-msys
, you either opened the wrong MSYS start menu entry or installed the incorrect gcc package.
The code can be debugged using gdb
. On Linux install the gdb
package and execute gdb <executable>
. On MSYS2 install by executing pacman -S winpty gdb
and execute winpty gdb <executable>
. The winpty
program makes sure the keyboard works correctly in the terminal. Also consider changing the -mwindows
compile flag to -mconsole
to be able to see stdout/stderr as well as be able to press Ctrl+C to interrupt the program. In the Makefile, make sure you compile the sources using -g
rather than -O2
to include debugging symbols. See any online tutorial for how to use gdb.
It is possible to build N64 ROMs as well with this repository. See https://github.com/n64decomp/sm64 for instructions.
sm64
├── actors: object behaviors, geo layout, and display lists
├── asm: handwritten assembly code, rom header
│ └── non_matchings: asm for non-matching sections
├── assets: animation and demo data
│ ├── anims: animation data
│ └── demos: demo data
├── bin: C files for ordering display lists and textures
├── build: output directory
├── data: behavior scripts, misc. data
├── doxygen: documentation infrastructure
├── enhancements: example source modifications
├── include: header files
├── levels: level scripts, geo layout, and display lists
├── lib: SDK library code
├── rsp: audio and Fast3D RSP assembly code
├── sound: sequences, sound samples, and sound banks
├── src: C source code for game
│ ├── audio: audio code
│ ├── buffers: stacks, heaps, and task buffers
│ ├── engine: script processing engines and utils
│ ├── game: behaviors and rest of game source
│ ├── goddard: Mario intro screen
│ ├── menu: title screen and file, act, and debug level selection menus
│ └── pc: port code, audio and video renderer
├── text: dialog, level names, act names
├── textures: skybox and generic texture data
└── tools: build tools
Pull requests are welcome. For major changes, please open an issue first to discuss what you would like to change.
Run clang-format
on your code to ensure it meets the project's coding standards.
Official Discord: https://discord.gg/7bcNTPK