the cartridge was a score
At sixty frames a second, Ethan Hunt stood still.
Not all the time. On three frames in every eight he didn’t move at all, and on the next one he jumped a whole step, about thirteen units, to catch up. Run him down the roof of the train and he shuddered like a tape with a crease in it.
Nothing was broken. In 1998 the game’s animations were authored for 30 ticks a second, and a character walks by its animation. Each keyframe carries a step, and the step lands only when a keyframe does. Play the same animation at twice the frame rate and some frames fall between keyframes, where no step exists. The fix was a hook that adds the fraction of a step for the fraction of a keyframe played. Thirteen, zero, thirteen became 7.6 to 8.4, every frame. Now Ethan runs smoothly.
That fix is the most interesting thing in the repo, by a distance. To see why, you need the rest of the story, and then a philosopher who thought hard about forgery.
one night
Mission: Impossible came out on the Nintendo 64 in 1998. It never got a PC port. Nobody decompiled it and nobody recompiled it. The N64 scene has spent years doing that by hand for Mario 64, Ocarina of Time and Banjo-Kazooie, and nobody had got round to this one.
At 9:31 on a Wednesday night I started a repo and pointed Claude at the cartridge.
- 9:46 PM. All 1,697 of the game’s functions translated from MIPS to C. Fifteen minutes.
- 10:29. It boots to the first screen.
- 11:13. The briefing for the first mission.
- 11:35. A 60 FPS option.
- 12:35 AM. Keyboard and mouse. WASD moves, the mouse turns Ethan, right-click aims.
- 2:23. All twenty levels load and take twenty seconds of random input at 59 to 61 FPS without a crash.
- Sleep.
- 11:22 the next morning. Quitting stops crashing. It had crashed four times in five.
- 12:30 PM. Ethan stops stuttering.
- 2:40 PM. The first level mod: the embassy, tinted red, with taller walls.
That’s thirty commits in one session, seventeen and a half hours from the first commit to the last, with an eight-hour gap overnight.
Embassy Function, the ballroom. 1080p, widescreen, captured from the recomp.
The recomp isn’t an emulator. An emulator pretends to be the N64: it reads each of the game’s instructions and acts it out on a simulated machine, every frame, forever. A static recompiler reads the instructions once, ahead of time, and writes them out as C. An ordinary compiler then builds that into an ordinary program. Mr-Wiseguy’s N64Recomp does the translation, N64ModernRuntime stands in for the console’s operating system, and RT64 draws. The game doesn’t run on anything pretending to be a Nintendo. It just runs.
The translation was the fifteen-minute part. The other seventeen hours went to everything the code assumed without saying.
the painting and the score
In Languages of Art (1968), Nelson Goodman asked why you can forge some art and not other art.
You can forge a Rembrandt. A perfect copy, right down to the brushstroke, still isn’t the painting, because what makes it the painting is its history: this canvas, this hand, this afternoon. You can’t forge Beethoven’s Fifth. Any orchestra that plays what’s on the page has played the Fifth. Goodman called the first kind of art autographic and the second allographic, and he put the line at notation. Music has a score, a written-down account of what counts as the work. Painting doesn’t.
He took the idea further than most people want to follow. Strictly, he said, a performance with one wrong note isn’t a performance of the work at all. Identity goes by the notation, and it’s all or nothing. He also suggested that an art might start out autographic and become allographic once someone works out a way to write it down.
Retro gaming has been having this argument for twenty years without the vocabulary. The emulation purist is autographic. The work is the cartridge in the console: original timing, original resolution, and the slowdown counts as part of it. A recompilation is the allographic bet. It treats the code as the score. Perform every instruction faithfully on a new instrument and you’ve played the game.
The bet is only possible because someone wrote the notation down first. The decomp community spent years mapping the N64’s libraries by hand, identifying its microcodes and naming its functions. That’s why a tool can look at an anonymous Mission: Impossible binary and say this is osContInit, this is the audio interface, these belong to Nintendo, not the game. The project’s README ends with a thank-you to those people, and it’s the right thank-you. Every function name the tools recognized traces back to someone’s weekend.
CIA Rooftop.
where the score runs out
The night’s real work happened where the score went quiet.
The rests. The game is full of loops that spin until some number changes, and on the console a hardware interrupt changes it. The runtime schedules the game’s threads cooperatively, so nothing else runs while a loop spins, and the faithful performance is a freeze. Ten of those loops needed a yield written in. The score had rests that only the original instrument knew how to count.
The tempo. The animations say advance a keyframe. They never say what happens between keyframes, because in 1998 there was no between. At 60 FPS there’s a frame in the gap and the score has nothing to say about it, so someone has to decide. The decision was to move Ethan by the fraction of a step. That’s interpretation, the same thing a pianist does with a tempo marking the composer never expected to be played this fast.
The wrong note. The audio code sizes each frame of sound as a signed number and then checks it against a minimum using an unsigned comparison. A negative size sails through as roughly four billion, and the next call asks the audio hardware for a 4 GB buffer. The game shipped that way in 1998. On the console the case apparently never came up. The runtime’s audio queue can produce it after a hitch, so the recomp crashed in two of five level captures. The fix is one signed compare. By Goodman’s strict rule, that one corrected note means this isn’t a performance of Mission: Impossible anymore. Leave the note in and the game crashes.
Ice Storm: Subpen.
Here’s what I think those three have in common. The cartridge was never a complete score. It was a score plus an instrument, and the instrument held part of the work: the interrupts, the thirty-tick clock, an audio queue that never ran long. Change the instrument and every part of the work the old machine was quietly keeping has to be written into the text. Every hook in the repo does that: it’s a line of the N64, written down for the first time.
A port is the moment the instrument gets written into the score.
Goodman’s strict rule doesn’t survive that, and it shouldn’t. But his distinction does, and it explains something odd about the settings menu. Under Graphics → Frame Rate there are two choices: 60 FPS, and Original (30). The autographic reading and the allographic reading shipped side by side, as a toggle.
twenty-eight years and one night
Last month I argued in the unremade that a volunteer reimplementation surviving a decade is a demand signal with a cost attached. Nobody spends eleven years of evenings rebuilding a game nobody wants.
This project is the other side of that coin. Mission: Impossible got nothing for twenty-eight years. That silence wasn’t measuring how much people cared. It was measuring the price. When the price falls to one night, the signal goes with it: you can do this for any game now, so doing it proves less about love. What’s left to show you care is playing it. A person has to sit down, play it, and confirm the music works, and that’s the one line in the commit log no tool could have written.
The README says it plainly: Claude did the reverse engineering, the runtime fixes and the mouse aim, and a human aimed it at the game and played it. Its own last word on the matter is that it runs at 60 FPS with mouse aim, and that beats nothing. I’d put the division of labour a little more precisely. The notation took a community years, by hand. The performance now costs one evening and a subscription. Credit should run in the same direction as the difficulty, and it does.
Embassy Function, the guard in the hall.
The game, the build steps and every commit are at github.com/nickallevato/mi_n64_exe. It’s Linux-only for now, and you need your own ROM. The repo has no game data in it, just the screenshots.
By Goodman’s strict rule, the version where Ethan runs smoothly isn’t the game. The one that is sits one menu away, under Frame Rate. It’s labelled Original.