You become a machine with your workflow, once again limited only by your time/energy, tokens, and your discretion on how to spend it.
Seems like easy money to just decompile a retro game, add some quality of life improvements and stick it on steam.
Are their hands tied by legal or what other factors are preventing this?
Indeed. But I think it's fair to say that just embracing LLMs is not enough.
Relatedly, https://github.com/perfect-dark-pc-port/perfect_dark forked from the above describes itself as “a work-in-progress port of the Perfect Dark decompilation to modern platforms”. Further: “The game is in a mostly functional state, with both singleplayer and split-screen multiplayer modes fully working. There are minor graphics- and gameplay-related issues, and possibly occasional crashes.”
Worth a look if you want a bit of nostalgia.
I’m really curious about trying this myself. Recently I’ve been handing off tasks for agents to complete on their own more and more. While their work is acceptable I’ve found them to not only take a long time to complete it, but they often add too much complexity and tests.
Historically there was a notion of "clean room" reimplementation.
These days it seems people translate the actual game code into a different representation of that same code and that makes it open source? Github is full of these.
I'd also encourage people to check out the Legend of Dragoon recomp [1]. It's a real labor of love that has breathed new life into a largely abandoned game. You can play it fully vanilla, or with improved graphics, fixes to cumbersome design choices, bugfixes, etc.
Yes.
Even if you're the owner of the game, the contracts for the voice actors, motion capture, models, etc. frequently define very narrow terms of usage. Defining the exact release platforms is common. Not to mention profit sharing if the actors or studios you're hiring are popular.
It's even worse for retro games. Many times the original rights holder went out of business, sold their rights, died, or something else that muddies the ownership chain.
is there really no tools whatsoever that produce proof certificates for "these two functions do the same thing"?
Including the one my username is inspired by. It's why you see a lot of fan remakes. Another sad side effect of corporate owned IP is also a lot of times the individuals who did the bulk of the work on something can't be the ones to do a remake. They don't own their own work. A company owns it. That's what most of us sign up for to get a paycheck. But when it's something like film or games, the effect on artists or designers can be pretty depressing.
So yes, games are not unique in this way. I am hopeful in the optimistic future case where LLMs lead to lower barriers to entry, UBI, and so forth that copyright essentially disappears, or at the very least is severely reformed.
Many things should simply enter the public domain at a far more accelerated rate.
https://github.com/perfect-dark-pc-port/perfect_dark
Ported it to OpenBSD for fun an evening about a year ago.
Trying to reconstruct the original build environment that Andy Onions (where are you?) used took some time. It was assembled with 16-bit MASM, but you can't easily run 16-bit exes under 64-bit Windows, so a bit of a kludge to set up DOSbox where the LLMs can push/pull in-and-out of it while being able to drive it enough to execute MASM and read the stderr and output files etc to get a feedback loop going.
Making up plausible function names and branch labels was pretty quick for LLMs.
On the one hand, it is fairly clear that producing source code with the explicit goal of reproducing a 1:1 binary is in no way transformative, so that's out. This would be a really hard argument to even attempt.
On the other hand, these projects are mostly free, intended for owners of the game to play the original game on a different platform or in a modified format, and not likely to have a negative effect on the original work's desirability or value. And, the reproductions aren't complete and alone usually produce limited to no value to a consumer (usually, they won't start without the original game files). These are the other important factors considered in fair use determinations and generally go the way of these being OK.
So, it's hard to say. With reverse engineering and copyright in the US in general, context is crucially important; something that would be completely illegal for one purpose (ie - decompiling and recompiling a competitor's software to distribute it without a license or use it internally without purchasing it would be obviously illegal) could be OK for another one.
These projects start off with the original assembly code and use it actively throughout all stages. This is about as far away from clean room as you get.
This is also partly a preservation activity so (as best we can create it) identical code generating identical output is a big part of the point.
I had hoped to someday make retro games for all major 80s and 90s consoles. I started with the Atari 2600 12 years ago[0], and planned to move to other 6502 family systems when I had time. I realized last year that AI could essentially do all of what I considered the hard parts and craft of retro game assembly, which felt like having the rug pulled out from me. Projects like this have really turned that around for me.
New tools just mean old things become easier and new things become the difficult (where I think the fun is), but solvable, frontier. This category of projects inspired me to pick back up an Ultima V decompilation project I started more than 10 years ago[1,2]. I'm looking forward to a world where all of my childhood games are cracked wide open for mods, ports, etc.
[0]: https://github.com/cleak/FlappyBoot [1]: https://github.com/cleak/u5-spec (spec for Ultima V binary) [2]: https://github.com/cleak/u5-engine (Rust port of Ultima V made from the spec; still lots of prose slop)
It inspired me to use AI to decompile my favorite games as well, mostly Mega Man Battle Network games from my childhood. I'm not going to make it in 84 days though. I insist on understanding the game and documenting it myself instead of just having the AI do it all for me on autopilot.
As slow as that is, it's already led to some awesome moments. AI built a literal synthesizer that played back music straight out of the ROM. Mapped out all of the music that way. It was incredible.
Have neen reverse engineering my laptop's BIOS as well. AI is fully in charge of that one, and it's nearly done. Hopefully soon I'll have drivers and perhaps even coreboot.
(Of course there will always be the annoying "never AI" virtue-signalers, but the same can be said about anything.)
Games of this generation had code that wasn't intended to be supported or managed after release (no patches for those consoles) and so the code tended to be fairly horrible.
The 80s games were mostly coded in bedrooms, but after that it all moved to teams in offices and a lot of studios went boom-to-bust pretty quickly.
In my mind using an LLM to assist with decompiling is fine, as the output is provably correct. It either compiles to the original binary or it doesn’t.
Turning that into a playable PC game with controls that feel good, etc, is a different story. That requires human taste & judgement.
i think you agree that there is. but it should change your language about this idea of "consumers" and "benefits" - like this is the difference between making code and making a product. nobody NEEDS retro games. in my opinion, they aren't even that good! they are completely and utterly an aesthetic experience. the process IS the product.
there was official source code release for 6502 port, why not match names from that one?
Absolutely false. There are an infinite number of programs that will compile to the same machine code. Especially when an optimizer is involved. Discovering one of those is a creative process, transformative, and protected.
Using an LLM to do it for you? I wouldn’t touch that with a 10 foot pole. Seems too close to mechanical transformation to me.
1) Rights can't be held by corporations, only individuals. So the rights to a piece of art or IP would always trace down to a list of names.
2) Everything enters the public domain after 20 years or the death of the entire list of ownership.
Then a freshly written project would be completely different with no derivative elements at all; the only commonality between the two codebases is their functional elements. You can compile a decomp into the same binary, but that's only to prove functional equivalence. The intended mode would be with a modern compiler that completely rewrites the logic (it might even have to if it writes it for a completely different computer architecture, which describes every retro console game). Then neither the source nor the compiled artifact would match.
When run through a disassembler, in most cases, it’s probably the first time anyone has ever looked at the assembly (assuming PlayStation or newer). There are no comments or labels or symbols. Not what most people would consider “the original assembly”.
Seems more like voodoo.
But in essence it's not so complex. You only need the original compiler that was used to compile the game and tools like ghidra. Binutils for the architecture can help. From there you ask the agent to start building the project. Prepare to spend a ton of tokens though if you go the full AI route.
Which does kind of suck. Yeah, it's not nearly as cool to say "I prompted a probabilistic pile of tensors and it did the hard work for me", and I think it majorly adjusts how "impressive" projects are. There's no point pretending like decompiling a game by hand and using GPT-6.7 to do it are remotely comparable.
The suck-y part is that if you do the decomp with GPT-6.7 and produce, say, a PC port of an early 2000s console game, a large number of people will refuse to touch it and treat it as if you have committed a cardinal sin. Maybe that's justified? I dunno. It definitely goes beyond people just saying it isn't as fun.
For me it was Goldeneye (of course) and Diddy Kong Racing.
Not to mention, there's a lot of stuff beyond an "aesthetic experience". Videogames have historical value, and they have relevancy at the very least as a testament of the state of the industry at any given point.
Legend of Dragoon, for example, integrated QTE-like controls in its attacks, even as a turn-based game. FFVIII, released the same year, implemented interaction in a somewhat similar way. These two are very early predecessors to mechanics Clair Obscur: Expedition 33 much more recently used. That has value.
If anyone wants to establish random conditions as to why they consider a work to be worthy or not, they may have those. But then they should keep them to themselves, rather than pretending people shouldn't care about something because of the way it was done. It's like the classic situation of someone complaining about how some open source project doesn't do something exactly in the way they like. I have nothing but contempt and despise for that sort of people, and it's a whole order of magnitude worse here, where the "problem" stems from their political stance, which nobody with a pulse should give a crap about.
Isn't the current system setup around the idea that the company gets the rights, and in return the workers get a basically risk-free salary? Wouldn’t your proposal undo that, so then workers took on the risk of whether they got paid, based on whether the game ends up being profitable?
Their comment still stands; whether it's machine code or "original assembly code" that shipped on the disk it falls under "clean room" reversing and by extension implementation.
I strongly disagree with this notion from even a conceptual (much less legal) level; the point of compilation is not to erase the algorithms the programmer implemented, just to optimize and implement them.
> You can compile a decomp into the same binary, but that's only to prove functional equivalence.
This is like saying that a translated book is only "functionally" identical to the original; there's a lot of precedent in copyright law for this not being the case, and I don't think any argument revolving around the transformativeness of the compilation process would fly at all.
Emulators constantly run into games that don't run because of specific hardware nuances that may or may not have been intentionally used (Ex. relying on exact cycle counts, reading uninitialized memory, changing values while they're used, etc.).
Meanwhile so many westerners see LLMs as "stealing IP", it becomes a bit paradoxical where the lines get drawn.
Since I'm just pitching wild ideas on the Internet of course I have the freedom to make any suggestion I want, but I would like to live in a world where (a) no companies or rights owners are able to play bullshit games with gating access to art that can be reproduced at trivial cost and (b) we can consume all the art we want that's past its sell-by date. It's insane to me that we don't have free, legal databases of every work of art created before, say, 2006.
[right hand emoji] "their political stance"... "they should keep them to themselves"
Copyright for this new code is owned by the person doing decompilation. No one knows how similar to the original it is or not, just that it compiles to the same output.
Edit to clarify: by not exist, I mean it is not publicly available.
Programs as written are nothing like programs as compiled, certainly not as an expressive endeavor. Books don't have an analog. There's no point where we strip all conceptual meaning from the book and leave only the procedural algorithms the semantics demand. There's no point where we replace all the individual words with autovectorized versions, or where we automatically delete impossible sentences, or remove every layer of abstraction that the programmer put in there exactly for the ability to convey ideas.
This is something someone only familiar with writing code for general purpose devices or higher level languages can't imagine. But when you're building for one very specific hardware platform you can tailor your code to that platform in ways that simply aren't possible when building for portability.
A reimplementation or a behavior-based clone is an entirely different legal world from decompilation.
Also, If it is an unauthorized derivative work, as I understand it then it might not even qualify for copyright protection itself.
I’m very pleased to announce that the original Snowboard Kids is now 100% decompiled! This means that all functions1 have matching C implementations that, when compiled, produce identical machine code to the original game.
This was obviously not a one-person effort. I am particularly grateful to inspectredc, Bl00D4NGEL, and queueRAM for their significant contributions to the project. No amount of AI would have been able to replace them.2 I would also like to thank iFuzzle, JamesBLewis, and douglasjv for lending their tokens to the cause.
My hope is that a full decompilation will prove useful to the Snowboard Kids community. Speedrunners in particular have long focused on the first game. Working source code can help shed light on externally observed phenomena such as CPU pathing and the exact factors contributing to player speed. A full understanding of the source code will also be useful for static recompilation and more ambitious modding efforts in the future.
The speed at which the project was finished is also noteworthy. Snowboard Kids took only 84 days to decompile compared with 596 days for Snowboard Kids 2, roughly one-seventh of the elapsed time.3
Weekly progress of the Snowboard Kids decompilation.
What explains this difference? Well, it’s 2026, so the answer is at least partially AI. But it would be a gross oversimplification to attribute the difference entirely to LLMs.
To state the obvious, I was not starting from scratch. By this point I had already spent nearly two years on a similar project and was vastly faster than when I began. This advantage is difficult to quantify and was somewhat offset by new challenges such as working with a different compiler.
Overall, roughly 4.8% of matching commits involved expert intervention.4 I have already credited these amazing people once, but it’s worth reiterating. This project would not have been possible without significant help from the decompilation community, particularly inspectredc, queueRAM, and Bl00D4NGEL <3.
The difficulty generally didn’t come from trying to understand what a function did5 but rather how that logic was expressed in C and how the resulting code was compiled. Snowboard Kids was compiled with IDO 5.3 rather than the GCC 2.7.2 compiler used by Snowboard Kids 2.
Most programmers will be familiar with GCC. It is a widely used open-source compiler still in active development today. IDO, on the other hand, was a proprietary compiler developed by SGI, whose own story is closely entwined with that of the Nintendo 64.6 Its source was not available, and its original development environment was tied to obsolete SGI hardware and software. To use and properly understand it today, the decompilation community has had to reverse-engineer and decompile parts of the compiler toolchain as well as statically recompile the IDO 5.3 and 7.1 suites to run on modern hardware. That closed history makes IDO harder to reason about than an open compiler such as GCC.
IDO splits optimisation and code generation across several different passes, transforming code quite aggressively along the way.7 Tiny changes to the C can then ripple through those passes and produce a completely different register allocation.
The community has made great strides in understanding IDO and its quirks, but this remains more of an art than a science. LLMs and I are not particularly good at reproducing its output. The usual workflow, for both me and the agents, was to figure out what a function did and then write C that approximated that purpose. From there, small tweaks assisted by the permuter could catch any remaining differences. But you can’t permute yourself into a match in all cases, particularly when the underlying structure is wrong. IDO’s behaviour made this workflow far less predictable.
A motivated human team with the right expertise and intuition can match or even exceed the pace of the Snowboard Kids decompilation. The Pilotwings 64 decompilation was completed in only 74 days.8 Pilotwings 64 had 16% fewer functions than Snowboard Kids, but more compiled code overall, so this is not a clean comparison either.

Pilotwings 64, a charming flight simulator, was a Nintendo 64 launch title and remains a cult classic to this day.
Snowboard Kids was also smaller than its sequel, containing 2,145 functions compared with 2,995 in Snowboard Kids 2. Function count is a crude measure of difficulty, but there were simply fewer functions to decompile.
I’ve already written elsewhere about using agents to decompile functions. The same basic process was used here, so I’ll focus on what changed. Unlike the previous project, this one began with access to frontier models and a capable agent harness.
I was interested to see how agents would fare during the early stages of a project. One area where they thrived was matching standard-library code. In theory, this is the most obvious chunk of almost any Nintendo 64 decompilation. The code is not unique to the game, and versions of it are available online. Snowboard Kids contains more than a hundred source segments from Nintendo’s libultra, alongside functions from the libmus audio library. Tools such as N64Sym can identify probable library functions in the ROM.
This pass was fairly successful. The main stumbling block was convincing agents to rely on the existing library source rather than decompile the same functions again from scratch. This required stronger prompting. Once a likely library function was identified, agents were instructed to treat the corresponding source as their starting point and exhaust plausible SDK versions, compiler options, and conditional compilation paths before attempting their own implementation.
Another optimisation was to have an agent write a script that ran m2c against every unmatched function and automatically integrated any exact matches, rather than relying on agents to attempt those functions individually.9 The script matched only 17 of 1,830 functions, an incredibly low success rate of 0.93%, but anything matched this way was cheaper than burning agent tokens.
IDO is weird, but it is often weird in recurring ways. Successfully matching one function could reveal a compiler quirk that applied to many others. Codex has become better at carrying lessons between tasks through features such as local memories. To make those lessons available beyond a single agent, I prompted agents to record observed IDO behaviour in a DECOMPILATION_LEARNINGS.md file. When an agent discovered a generalisable compiler quirk, it could record the evidence there for later attempts. This created a useful feedback loop. Agents helped document IDO, and the resulting documentation made subsequent agents better at matching IDO code.
But the most useful resource was N64 Decomp Workbench, a collection of tooling and documentation for debugging late-stage MIPS decompilation mismatches. It can classify mismatches, account for relocations, replay individual compiler passes, and help distinguish a structural problem from a register-allocation problem. Pass replay requires the relevant compiler binaries and project-specific setup, but once configured it exposes information that a raw assembly diff cannot. A raw diff tells you that two functions differ. The Workbench can give agents a much better idea of why the functions differ and what sort of change might fix them.
For this project, I ran the decompilation harness across four Git worktrees. Each worktree gave an agent an independent copy of the repository, allowing several functions to be attempted in parallel.
One small but useful improvement was to give every task an explicit deadline and expose that deadline to the agent. During the Snowboard Kids 2 project, agents often struggled to use the permuter effectively because it would continue running until it found a 100% match or was manually stopped. An explicit deadline allowed agents to set sensible timeouts and trade off permuting time against other forms of problem-solving. Anecdotally, it also helped them judge how long to keep working on a difficult function before giving up. I could then increase the time allowance as the easy functions disappeared and the remaining work became more difficult.
Another problem that had existed in Snowboard Kids 2 but became more apparent as I added worktrees was synchronisation. As discussed in my previous post, each agent was given a function to decompile alongside a set of similar functions that had already been matched. These provided useful reference points for reproducing particular IDO instruction patterns. Work was divided between the worktrees using Nigel’s --shard option, which uses basic hashing to partition candidates between a specified number of workers.
This allowed more work to happen in parallel without duplication, but introduced a new problem as the worktrees diverged. One worktree, for example, might successfully decompile a function that was 99% similar to a function being attempted elsewhere, but that new reference would remain invisible to the other agent until the changes were merged. Periodically merging everything into the main branch and resynchronising the worktrees fixed this, but synchronising all four could take more than an hour. Synchronising continuously wasted time, while waiting too long increased drift.
To make synchronisation less critical, I updated the similarity search to inspect every worktree. A newly matched function could immediately become a reference for another agent without waiting for it to reach the main branch. The harness would produce messages such as the following.
1✓ Candidate ["func_80094A94", "func_80094FF4 (../sbk-c)",
2 "func_80094808", "func_8009491C (../sbk-a)",
3 "func_8009469C (../sbk-c)", "func_80093144"] was fixed!
This helped the process remain efficient as the easy functions disappeared. Synchronisation was still needed to consolidate and push changes, but it was no longer required for agents to learn from one another.
I tried GPT-5.5 and 5.6, Claude 4.5 and Fable, and GLM 5.2. This is completely unscientific. The models were tested against a changing set of difficult functions, sometimes after another model had already made partial progress. Broadly, though, Codex continued to outperform Claude, as it had towards the end of the previous project. Sol xhigh was particularly effective once it became available.
GLM 5.2, served by z.ai, was very disappointing. I had previously been a big fan of GLM. It was effective, even if it was not quite a frontier model, and its generous usage limits made up for the gap. That tradeoff became much less attractive as the limits grew less generous while latency remained awful. The feedback cycles were so long that I stopped giving it work and eventually cancelled my subscription.
The immediate priority is to better document the game. A 100% match means we have C code for every function; it does not mean we understand what every function does. There are still generated names to replace, unknown structure fields to identify, awkward matches to clean up, and large amounts of data to describe.
Work is also underway on a Snowboard Kids recompilation. Fortunately, the first game shares many of the quirks addressed by patches in Snowboard Kids 2: Recompiled.

I’m looking into porting the levels and other content from the first game into the second game’s engine, although I have no idea how much work that will be yet.
Beyond that, I’m interested in decompiling Snowboard Kids Plus on the PlayStation, a Japan-exclusive expanded release of the first game with extra levels and characters.
If you’ve made it this far, you’re probably interested in decompilation and Snowboard Kids. Take a look at the Snowboard Kids decompilation project. There is still plenty of cleanup and documentation work to do, and contributions are very welcome.
Almost. A small amount of handwritten assembly from system libraries remains because assembly was the original source rather than a temporary decompilation placeholder. ↩︎
In the best case, I think the project would have stalled around 89–90% without their IDO expertise. ↩︎
For Snowboard Kids 2, I measured from the first commit on 28 September 2024 to the final matching function on 17 May 2026, a span of 596 days. The 84-day figure for Snowboard Kids is my project-level count; the public repository itself spans from the first commit on 28 May 2026 to the final matching function on 19 August 2026, just over 83 days. ↩︎
Based on a manual review of the Git history, I identified roughly 41 expert-assisted matches, corresponding to about 4.8% of the commits I classified as function-matching work. This retrospective classification is approximate because commits can contain multiple functions, help was often incorporated into my own commits, and the figure does not measure person-hours. Note that I am not counting myself as an “expert”. ↩︎
One notable exception was validateControllerPakSave, which appears to have been used to debug Controller Pak saves. Most of its debugging and validation logic was omitted from the final build. ↩︎
Nintendo has described adopting an architecture from Silicon Graphics for the Nintendo 64. The original development system was similarly SGI-centric. Nintendo’s development documentation describes connecting its emulator board to an SGI Indy workstation, and IDO was one of the supported compilers. The relationship therefore extended from the console’s underlying architecture to the machines and tools used to develop its games. ↩︎
IDO used a multi-stage compilation pipeline. Its uopt documentation says that eligible loops were unrolled four times by default. Coincidentally, four is also the number of racers in the game. Loops with four iterations are therefore candidates for complete unrolling, and they occur frequently 🫠. ↩︎
Measured from the addition of progress tracking on 26 January 2026 to the final matching functions on 10 April 2026, the decompilation took almost exactly 74 days. Pilotwings 64 had 1,791 functions compared with 2,145 for Snowboard Kids, but approximately 838 KB of code compared with 732 KB for Snowboard Kids. ↩︎
Using a one-shot script like this is not a particularly novel idea. I’m pretty sure I copied it from somewhere, possibly Diddy Kong Racing’s m2c_all.sh. ↩︎
In fact, the goal of most decomp not to produce the same binary, that’s just used as a validation.
True, but as a derivative work of the original source code they don't have rights to do anything with that code without infringing copyright.