A Super Mario 64 decompilation, brought to you by a bunch of clever folks.
Go to file
2020-06-02 12:44:34 -04:00
actors Refresh 10 2020-06-02 12:44:34 -04:00
asm Refresh 10 2020-06-02 12:44:34 -04:00
assets Refresh 3 2019-11-03 14:36:27 -05:00
bin Refresh 10 2020-06-02 12:44:34 -04:00
data Refresh 10 2020-06-02 12:44:34 -04:00
doxygen init2 2019-08-25 00:46:40 -04:00
enhancements Refresh 10 2020-06-02 12:44:34 -04:00
include Refresh 10 2020-06-02 12:44:34 -04:00
levels Refresh 10 2020-06-02 12:44:34 -04:00
lib Refresh 10 2020-06-02 12:44:34 -04:00
rsp Refresh 10 2020-06-02 12:44:34 -04:00
sound Refresh 10 2020-06-02 12:44:34 -04:00
src Refresh 10 2020-06-02 12:44:34 -04:00
text refresh 6 2020-02-03 00:51:26 -05:00
tools Refresh 10 2020-06-02 12:44:34 -04:00
.clang-format Refresh 1 2019-09-01 15:50:50 -04:00
.clang-tidy Refresh 1 2019-09-01 15:50:50 -04:00
.gitattributes Refresh 1 2019-09-01 15:50:50 -04:00
.gitignore init2 2019-08-25 00:46:40 -04:00
assets.json Refresh 10 2020-06-02 12:44:34 -04:00
CHANGES Refresh 10 2020-06-02 12:44:34 -04:00
charmap_menu.txt refresh 5 2020-01-03 10:38:57 -05:00
charmap.txt refresh 5 2020-01-03 10:38:57 -05:00
diff_settings.py Refresh 8 2020-04-03 14:57:26 -04:00
diff.py Refresh 10 2020-06-02 12:44:34 -04:00
Dockerfile Refresh 10 2020-06-02 12:44:34 -04:00
Doxyfile refresh 4 2019-12-01 21:52:53 -05:00
extract_assets.py Refresh 10 2020-06-02 12:44:34 -04:00
first-diff.py Refresh 10 2020-06-02 12:44:34 -04:00
format.sh init2 2019-08-25 00:46:40 -04:00
Jenkinsfile refresh 6 2020-02-03 00:51:26 -05:00
Makefile Refresh 10 2020-06-02 12:44:34 -04:00
Makefile.split Refresh 10 2020-06-02 12:44:34 -04:00
README.md Refresh 10 2020-06-02 12:44:34 -04:00
rename_sym.sh Refresh 7 2020-03-01 22:42:52 -05:00
sm64.eu.sha1 init2 2019-08-25 00:46:40 -04:00
sm64.jp.sha1 init2 2019-08-25 00:46:40 -04:00
sm64.ld Refresh 10 2020-06-02 12:44:34 -04:00
sm64.sh.sha1 Refresh 7 2020-03-01 22:42:52 -05:00
sm64.us.sha1 init2 2019-08-25 00:46:40 -04:00
undefined_syms.txt Refresh 8 2020-04-03 14:57:26 -04:00

Super Mario 64

  • 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.

It builds the following ROMs:

  • sm64.jp.z64 sha1: 8a20a5c83d6ceb0f0506cfc9fa20d8f438cafe51
  • sm64.us.z64 sha1: 9bef1128717f958171a4afac3ed78ee2bb4e86ce
  • sm64.eu.z64 sha1: 4ac5721683d0e0b6bbb561b58a71740845dceea9

This repo does not include all assets necessary for compiling the ROMs. A prior copy of the game is required to extract the assets.

Quick Start (for Ubuntu)

  1. Install prerequisites: sudo apt install -y build-essential git binutils-mips-linux-gnu python3 libaudiofile-dev
  2. Clone the repo from within Linux: git clone https://github.com/n64decomp/sm64.git
  3. Place a Super Mario 64 ROM called baserom.<VERSION>.z64 into the project folder for asset extraction, where VERSION can be us, jp, or eu.
  4. Run make to build. Qualify the version through make VERSION=<VERSION>. Add -j4 to improve build speed (hardware dependent).

Ensure the repo path length does not exceed 255 characters. Long path names result in build errors.

Installation

Windows

Install WSL and a distro of your choice following Windows Subsystem for Linux Installation Guide for Windows 10. We recommend either Debian or Ubuntu 18.04 Linux distributions under WSL. Note: WSL1 does not currently support Ubuntu 20.04.

Next, clone the SM64 repo from within the Linux shell: git clone https://github.com/n64decomp/sm64.git

Then continue following the directions in the Linux installation section below.

Linux

There are 3 steps to set up a working build.

Step 1: Install dependencies

The build system has the following package requirements:

  • binutils-mips
  • python3 >= 3.6
  • libaudiofile
  • qemu-irix

Dependency installation instructions for common Linux distros are provided below:

Debian / Ubuntu

To install build dependencies:

sudo apt install -y build-essential git binutils-mips-linux-gnu python3 libaudiofile-dev

Download latest package from qemu-irix Releases.

Install this package with:

sudo dpkg -i qemu-irix-2.11.0-2169-g32ab296eef_amd64.deb
Arch Linux

To install build dependencies:

sudo pacman -S base-devel python audiofile

Install the following AUR packages:

Other Linux distributions

Most modern Linux distributions should have equivalent packages to the other two listed above. You may have to use a different version of GNU binutils. Listed below are fully compatible binutils distributions with support in the makefile, and examples of distros that offer them:

  • mips64-elf- (Arch AUR)
  • mips-linux-gnu- (Ubuntu and other Debian-based distros)
  • mips64-linux-gnu- (RHEL/CentOS/Fedora)

You may also use Docker to handle installing an image with minimal dependencies.

Step 2: Copy baserom(s) for asset extraction

For each version (jp/us/eu) for which you want to build a ROM, put an existing ROM at ./baserom.<VERSION>.z64 for asset extraction.

Step 3: Build the ROM

Run make to build the ROM (defaults to VERSION=us). Other examples:

make VERSION=jp -j4       # build (J) version instead with 4 jobs
make VERSION=eu COMPARE=0 # build (EU) version but do not compare ROM hashes

Resulting artifacts can be found in the build directory.

The full list of configurable variables are listed below, with the default being the first listed:

  • VERSION: us, jp, eu, sh (WIP)
  • GRUCODE: f3d_old, f3d_new, f3dex, f3dex2, f3dzex
  • COMPARE: 1 (compare ROM hash), 0 (do not compare ROM hash)
  • NON_MATCHING: Use functionally equivalent C implementations for non-matchings. Also will avoid instances of undefined behavior.
  • CROSS: Cross-compiler tool prefix (Example: mips64-elf-).
  • QEMU_IRIX: Path to a qemu-irix binary.

macOS

Installing Docker is the recommended avenue for macOS users. This project does not support macOS natively due to lack of macOS host support.

Docker Installation

Create Docker image

Create the docker image with docker build -t sm64.

Build

To build, mount the local filesystem into the Docker container and build the ROM with docker run.

macOS example for (U):
docker run --rm --mount type=bind,source="$(pwd)",destination=/sm64 sm64 make VERSION=us -j4
Linux example for (U):

For a Linux host, Docker needs to be instructed which user should own the output files:

docker run --rm --mount type=bind,source="$(pwd)",destination=/sm64 --user $UID:$UID sm64 make VERSION=us -j4

Resulting artifacts can be found in the build directory.

Project Structure

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
├── text: dialog, level names, act names
├── textures: skybox and generic texture data
└── tools: build tools

Contributing

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/DuYH3Fh