A work-in-progress decompilation of the N64 emulator used in the Wii Virtual Console releases of N64 games like The Legend of Zelda: Ocarina of Time.
Supported versions:
sm64-j: Super Mario 64 (Wii Virtual Console) - Japansm64-u: Super Mario 64 (Wii Virtual Console) - North Americasm64-e: Super Mario 64 (Wii Virtual Console) - Europe/Australiamk64-j: Mario Kart 64 (Wii Virtual Console) - Japanmk64-u: Mario Kart 64 (Wii Virtual Console) - North Americamk64-e: Mario Kart 64 (Wii Virtual Console) - Europe/Australiaoot-j: The Legend of Zelda: Ocarina of Time (Wii Virtual Console) - Japanoot-u: The Legend of Zelda: Ocarina of Time (Wii Virtual Console) - North Americaoot-e: The Legend of Zelda: Ocarina of Time (Wii Virtual Console) - Europe/Australia
Currently the decompilation mainly targets the oot-j version.
You will need the following dependencies:
- git
- ninja
- python3
- wine (for macOS or non-x86 Linux)
- clang-format (optional)
You can install the dependencies with the following commands:
sudo apt-get update
sudo apt-get install git ninja-build python3
You can install dependencies via Homebrew with the following command:
brew install git ninja python3
brew install --cask --no-quarantine gcenx/wine/wine-crossover
You will need the following dependencies:
- ninja.exe
- Python (make sure to add it to your PATH during the installation)
- Git for Windows
You need to add C:\Program Files\Git\bin to your system's PATH (not the user one) in order to execute bash scripts properly.
To get objdiff to work properly you also need to add the path to the folder containing ninja.exe to the system's PATH.
-
Clone the repo using
git clone https://github.com/zeldaret/oot-vc. -
Extract the following binary containing the N64 emulator from the wad of the version you want to build:
content1.app
Then, copy the app file and place it in the repo as orig/<version>/content1.app.
You can use gzinject to perform both of this extraction step.
-
Run
python3 configure.pyto generate the build. (Note: on Windows you might need to runpython configure.py.) -
Run
ninjato build theoot-jversion, or runninja <version>to build another version.
./dol-diff <version>will rundtk dol diffto show the first differing symbol if the build does not match../dol-apply <version>will rundtk dol applyto sync symbols (e.g. if a function was renamed in the repo)../formatwill format all source files withclang-format.
For local decompilation testing, start the objdiff GUI and open this directory as the project directory.
Currently objdiff may not work properly on files using asm-processor (i.e. files with asm_processor=True in configure.py).
First, copy a matching build to the expected/ directory to diff against:
mkdir expected
cp -r build expected/
Then run e.g. ./diff.py -mwo3 xlMain to diff a function for oot-j, or e.g. ./diff.py -mwo3 xlMain -v VERSION to diff a function for another version.
Run tools/decompme.py <c-file> <asm-file> (e.g. tools/decompme.py src/emulator/cpu.c asm/non_matchings/cpu/cpuExecute.s) to create a
decomp.me scratch for a function. The C file and all of its included headers will be used as the context.
To import a function for decomp-permuter, ensure powerpc-eabi-objdump binary
is on your PATH (for instance by adding tools/binutils from this project) and run something like
path/to/permuter/import.py src/emulator/cpu.c asm/non_matchings/cpu/cpuExecute.s
path/to/permuter/permuter.py nonmatchings/cpuExecute -j 8Sometimes you may need to tweak the source in order for things to import
correctly, for example by explicitly marking auto-inlined functions as inline.