UXN64
This is a port of the UXN virtual machine for the Nintendo 64 (N64). UXN is a project created by the artist collective and research studio 100 rabbits. It can be used to write small graphical applications, tools and games. Programs written for UXN are distributed via bytecode compiled roms, akin to classic console emulators.
Building from source
To build this project, you will need a MIPS III compatible
compiler toolchain and the official N64 sdk (libultra). For this
guide I'll assume you are using Linux and your toolchain and sdk will be located
at /opt/n64sdk/
and /opt/n64sdk/libultra/
respectively.
The toolchain
Paraphrasing the installation guide from the N64brew wiki. This installation will take some time. Also before you start make sure you export your path as follows. You probably don't need to install newlib for this project, but just in case we'll follow the full procedure.
PATH=/opt/n64sdk/bin:$PATH
Prepare the SDK directory
mkdir /opt/n64sdk
sudo chown <yourusername> /opt/n64sdk
Binutils
git clone git://sourceware.org/git/binutils-gdb.git /tmp/binutils
cd /tmp/binutils
mkdir build
cd build
../configure --target=mips32-elf --prefix=/opt/n64sdk --with-cpu=vr4300 --disable-nls --with-sysroot=/opt/n64sdk/mips32-elf/sysroot
make -j8 # select the number of cores you want to use. here I'm using 8.
make install
GCC and Newlib
# GCC (part 1)
git clone git://gcc.gnu.org/git/gcc.git /tmp/gcc
cd /tmp/gcc
mkdir build
cd build
../configure --target=mips32-elf --prefix=/opt/n64sdk --with-languages=c,c++ --disable-shared --disable-threads --disable-nls --without-headers --disable-multilib --with-newlib --with-sysroot=/opt/n64sdk/mips32-elf/sysroot --with-arch=vr4300 --with-abi=32
make -j8 all-gcc
make install-gcc
make -j8 all-target-libgcc
make install-target-libgcc
# Newlib
git clone git://sourceware.org/git/newlib-cygwin.git /tmp/newlib
cd /tmp/newlib
mkdir build
cd build
../configure --prefix=/usr --target=mips32-elf --disable-threads --disable-libssp CFLAGS_FOR_TARGET='-march=vr4300 -mfix4300 -G 0'
make -j8
make DESTDIR=/opt/n64sdk/mips32-elf/sysroot install
cd /opt/n64sdk/mips32-elf/sysroot/usr
mv mips32-elf/* .
rmdir mips32-elf
# GCC (part 2)
cd /tmp/gcc/build
make -j8 all-target-libgcc
make install-target-libgcc
Libultra
An iso image for the official N64 SDK can be found in archive.org. Download the iso and mount it to your filesystem:
mkdir /tmp/cdrom
sudo mount -o loop "N64 Dev kit full.iso" /tmp/cdrom
cd /tmp/cdrom
cp -r ultra /opt/n64sdk/libultra
This project
If everything is installed correctly, you should be able to clone this project as follows:
git clone https://git.badd10de.dev/uxn64/
cd uxn64
git submodule init
git submodule update
make UXN_ROM=/path/to/uxn/rom.rom
Since we are embedding the rom in the n64 file, to create different rom names
for each respective uxn rom we can change the TARGET
from the default uxn64
:
make UXN_ROM=screen.rom TARGET=uxn64-screen # creates uxn64-screen.n64
make UXN_ROM=audio.rom TARGET=uxn64-audio # creates uxn64-audio.n64