<rss version="2.0" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Retrocomputing | AkitaOnRails.com</title><link>https://akitaonrails.github.io/en/tags/retrocomputing/</link><description>Fabio Akita's blog — tech, career, and assorted geek topics. English edition.</description><generator>Hugo -- gohugo.io</generator><language>en</language><lastBuildDate>Mon, 19 Oct 2026 23:20:52 +0000</lastBuildDate><atom:link href="https://akitaonrails.github.io/en/tags/retrocomputing/index.xml" rel="self" type="application/rss+xml"/><item><title>AI Reverse Engineering: Is Adobe Dead?</title><link>https://akitaonrails.github.io/en/2026/10/13/ai-reverse-engineering-is-adobe-dead/</link><guid isPermaLink="true">https://akitaonrails.github.io/en/2026/10/13/ai-reverse-engineering-is-adobe-dead/</guid><pubDate>Tue, 13 Oct 2026 00:00:00 -0300</pubDate><description>&lt;p&gt;PhotoCraft exists. REA exists. Recomps and decomps of old games ship every day. Therefore: Adobe is dead, no binary is sacred, and programmers are finished.&lt;/p&gt;
&lt;p&gt;That was the week on X, and if you only read headlines, it&amp;rsquo;s a reasonable conclusion. This text is for anyone who wants to know what each of those things actually does.&lt;/p&gt;
&lt;p&gt;It blew up on the 9th, when the account below summed up what Brandon Thomas, a developer from Atlanta, had been publishing since late September: seven open source clones of Adobe&amp;rsquo;s main products, written in Rust with help from Claude Opus 5.5. Photoshop, Illustrator, Premiere, Lightroom, After Effects, InDesign, Acrobat. All free, all &amp;ldquo;clean room&amp;rdquo;, without a single line of Adobe code. This is the post that went viral:&lt;/p&gt;</description><content:encoded><![CDATA[<p>PhotoCraft exists. REA exists. Recomps and decomps of old games ship every day. Therefore: Adobe is dead, no binary is sacred, and programmers are finished.</p>
<p>That was the week on X, and if you only read headlines, it&rsquo;s a reasonable conclusion. This text is for anyone who wants to know what each of those things actually does.</p>
<p>It blew up on the 9th, when the account below summed up what Brandon Thomas, a developer from Atlanta, had been publishing since late September: seven open source clones of Adobe&rsquo;s main products, written in Rust with help from Claude Opus 5.5. Photoshop, Illustrator, Premiere, Lightroom, After Effects, InDesign, Acrobat. All free, all &ldquo;clean room&rdquo;, without a single line of Adobe code. This is the post that went viral:</p>
<blockquote class="twitter-tweet"><p lang="en" dir="ltr">AI is now being used to recreate Adobe's software, a developer has released seven free, open-source apps as clean-room alternatives to Adobe's main tools:<br><br>- PhotoCraft → Photoshop<br>- VectorCraft → Illustrator<br>- FilmCraft → Premiere Pro<br>- LightCraft → Lightroom<br>- EffectCraft → After Effects<br>- DesignCraft → InDesign<br>- PrintCraft → Acrobat Pro<br><br>Built in Rust with help from Claude Opus 5.5, they run on Windows, Linux, and macOS under MIT/Apache licenses without using Adobe's source code.</p>&mdash; Pirat_Nation (@Pirat_Nation) <a href="https://twitter.com/Pirat_Nation/status/2108437553615425881">October 9, 2026</a></blockquote>
<script async src="//platform.twitter.com/widgets.js" charset="utf-8"></script>
<p>The same week, <a href="https://github.com/morluto/rea"target="_blank" rel="noopener">REA</a>, &ldquo;Reverse Engineer Anything&rdquo;, passed 100K stars on GitHub, gaining tens of thousands a day. The pitch on its page: &ldquo;see a feature in an app that you want in your own product? Ask your agent to investigate it with REA and build a version for your project&rdquo;.</p>
<p>And anyone who follows retro gaming knows 2026 is the year that keeps on giving. There&rsquo;s a <a href="https://docs.google.com/spreadsheets/d/1MT_xMPlKNbyhANRUMzOH94J3ybeF0b1Ws8F0kb-_598/edit"target="_blank" rel="noopener">community spreadsheet</a> trying to list the unofficial PC ports, around 100 games from Ship of Harkinian to Skate 3, and it&rsquo;s always behind. The <a href="https://www.youtube.com/@VideoGameEsoterica"target="_blank" rel="noopener">Video Game Esoterica</a> channel publishes a new port almost daily: Time Crisis decompiled from the arcade board, Daytona USA, Bloodborne.</p>
<p>The Xbox One version of <a href="https://almost-there-games.itch.io/azimuth"target="_blank" rel="noopener">Forza Horizon 2</a>, stuck there since 2014, runs on Windows. <a href="https://github.com/boykopovar/AnyPS5"target="_blank" rel="noopener">AnyPS5</a> promises to convert PS5 executables into native PC binaries, and PS5 emulators like KytyPS5 and SharpEmu already <a href="https://www.invenglobal.com/articles/26860/astro-bot-boots-on-pc-as-ps5-emulation-makes-rapid-progress"target="_blank" rel="noopener">run Astro Bot</a> with actual gameplay. Much of it with AI in the loop, some of it openly vibe-coded.</p>
<p>Hence the consensus: programming, in general, is over. Every binary is reversible and reusable, just point the agent at it. My position is that it did get much easier, that it&rsquo;s still nowhere near the silver bullet people imagine, and that the engine behind it, the LLM, <a href="/en/2026/10/12/llms-agents-competent-enough/">stopped growing exponentially</a>. The rest of the text is the reasons.</p>
<blockquote>
  <p><strong>TL;DR:</strong> reverse engineering is a 40-year-old discipline with mature tooling, and AI sped up its grunt work, especially in retro, where the binary is available, tiny, and the target doesn&rsquo;t move. The Adobe clones are alphas with hundreds of open bugs and pretty screenshots. REA is a toolbox that requires the binary in hand, Ghidra or IDA installed, and a lot of tokens. What&rsquo;s worth money today doesn&rsquo;t even have a binary: it&rsquo;s SaaS, cloud, manufacturer partnerships and decades of color science. Rewriting Bun, with the project&rsquo;s author and 64 agents, cost US$ 165K. Jump to the <a href="#reverse-engineering-wasnt-born-last-week">timeline</a>, to <a href="#what-rea-actually-does">REA</a>, to the <a href="#photocraft-pretty-screenshot-alpha-inside">Adobe clones</a>, to the <a href="#the-bun-case-what-it-costs-to-rewrite-big-software">Bun case</a>, to why <a href="#why-retro-moves-so-fast">retro moves fast</a> or to the <a href="#answering-the-list-from-the-top">answers at the end</a>.</p>

</blockquote>
<h2>First of all: I don&rsquo;t like Adobe<span class="hx:absolute hx:-mt-20" id="first-of-all-i-dont-like-adobe"></span>
    <a href="#first-of-all-i-dont-like-adobe" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p>To be clear about where I&rsquo;m speaking from. I hate Adobe&rsquo;s business practices as much as anyone. I was a paying customer for years, used Photoshop and Premiere extensively, plus Lightroom and After Effects, and left for the same reasons everybody leaves: mandatory subscription, cancellation fees, prices going up with nothing in return.</p>
<p>And it&rsquo;s precisely because I used them in depth that I know the size of what&rsquo;s inside those boxes. Whoever thinks Photoshop is layers, crop and text never needed a color proof for a print shop, never opened a camera RAW whose color profile Adobe has maintained for twenty years, never did the conform on cinema footage, the work of gathering the camera&rsquo;s raw material for finishing. I&rsquo;ll get there, after the basics.</p>
<h2>Reverse engineering wasn&rsquo;t born last week<span class="hx:absolute hx:-mt-20" id="reverse-engineering-wasnt-born-last-week"></span>
    <a href="#reverse-engineering-wasnt-born-last-week" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p>Every emulator you&rsquo;ve ever used exists because someone opened up hardware, disassembled a binary, sniffed a protocol and, in some cases, broke cryptography. The discipline has case law, commercial tooling and decades of history. A condensed timeline, with the milestones that matter most:</p>
<ul>
<li><strong>1982 to 1984</strong>: Compaq reverse engineers the IBM PC BIOS, and in 1984 Phoenix sells a licensable BIOS built in a clean room, by a team that only read the specification. The PC compatible industry is born. <a href="https://en.wikipedia.org/wiki/Phoenix_Technologies"target="_blank" rel="noopener">Source</a>.</li>
<li><strong>1992</strong>: Andrew Tridgell creates Samba by sniffing SMB packets. The same year, <a href="https://www.copyright.gov/fair-use/summaries/segaenters-accolade-9thcir1992.pdf"target="_blank" rel="noopener">Sega v. Accolade</a> and <a href="https://www.copyright.gov/fair-use/summaries/atari-nintendo-fedcir1992.pdf"target="_blank" rel="noopener">Atari v. Nintendo</a> establish in the US that disassembling code to reach functional elements is fair use (Atari lost its own case for another reason: it lied to the Copyright Office to get the source).</li>
<li><strong>1993</strong>: Wine begins, which becomes the foundation of Proton and of every Windows game that runs on the Steam Deck today.</li>
<li><strong>1999</strong>: UltraHLE runs commercial N64 games at full speed; bleem! emulates the PS1, Sony sues and loses the injunctions, and bleem! folds anyway in 2001; DeCSS breaks DVD protection.</li>
<li><strong>2000</strong>: <a href="https://law.resource.org/pub/us/case/reporter/F3/203/203.F3d.596.99-15852.html"target="_blank" rel="noopener">Sony v. Connectix</a> rules that copying the PS1 BIOS to build an emulator is fair use.</li>
<li><strong>2002 and 2003</strong>: PCSX2 and Dolphin are born, the two emulators that twenty years later are still the reference.</li>
<li><strong>2007</strong>: the iPhone is opened eleven days after launch. The European Commission forces Microsoft to document its network protocols, and the <a href="https://fsfe.org/news/2007/news-20071220-01.html"target="_blank" rel="noopener">Samba team receives the documentation</a> for 10,000 euros.</li>
<li><strong>2010</strong>: the fail0verflow group shows at 27C3 that Sony signed the PS3 firmware with a fixed nonce, exposing the private key (the nonce is the number that should be random in every signature). Days later, already in 2011, geohot publishes the key, Sony sues and settles in March.</li>
<li><strong>2011 and 2013</strong>: RPCS3 (PS3) and Xenia (Xbox 360) are born, the two hardest emulators ever built, for reasons I&rsquo;ll explain.</li>
<li><strong>2019</strong>: the NSA releases <a href="https://github.com/NationalSecurityAgency/ghidra"target="_blank" rel="noopener">Ghidra</a> as open source. The Super Mario 64 decompilation leaks and goes public, and the PC port appears the following year.</li>
<li><strong>2021 and 2022</strong>: Ocarina of Time 100% decompiled after almost two years of work; Ship of Harkinian becomes the reference port.</li>
<li><strong>2024</strong>: Mr-Wiseguy releases <a href="https://github.com/Zelda64Recomp/Zelda64Recomp/releases"target="_blank" rel="noopener">Zelda 64: Recompiled</a>, the first showcase of N64 static recompilation.</li>
<li><strong>2025</strong>: Sonic Unleashed Recompiled brings the same trick to the Xbox 360, converting PowerPC to C++ and shaders to HLSL.</li>
</ul>
<p>Notice that the current phase, decomp and recomp at scale, starts in 2019, well before any coding agent. AI joined an assembly line that already existed.</p>
<h3>The tools<span class="hx:absolute hx:-mt-20" id="the-tools"></span>
    <a href="#the-tools" class="subheading-anchor" aria-label="Permalink for this section"></a></h3><p>The tooling is mature too, and much of it is free:</p>
<ul>
<li><a href="https://hex-rays.com/ida-pro"target="_blank" rel="noopener">IDA Pro</a> (Hex-Rays), the reference commercial disassembler and decompiler, from one thousand to almost nine thousand euros a year, with a free version limited to x86.</li>
<li><a href="https://github.com/NationalSecurityAgency/ghidra"target="_blank" rel="noopener">Ghidra</a>, the NSA&rsquo;s open answer, with a decompiler and scripting, Apache 2.0.</li>
<li><a href="https://binary.ninja/"target="_blank" rel="noopener">Binary Ninja</a>, with a free edition and licenses from 200 to 3,500 dollars.</li>
<li><a href="https://github.com/radareorg/radare2"target="_blank" rel="noopener">radare2</a> and <a href="https://github.com/rizinorg/cutter"target="_blank" rel="noopener">Cutter</a>, the GUI for rizin, which is a radare2 fork: the open command line and the open interface.</li>
<li><a href="https://github.com/x64dbg/x64dbg"target="_blank" rel="noopener">x64dbg</a> and <a href="https://learn.microsoft.com/en-us/windows-hardware/drivers/debugger/"target="_blank" rel="noopener">WinDbg</a> on Windows, <a href="https://www.sourceware.org/gdb/"target="_blank" rel="noopener">GDB</a> everywhere else.</li>
<li><a href="https://frida.re/"target="_blank" rel="noopener">Frida</a>, to inject code into a live process and watch what it does.</li>
<li><a href="https://github.com/skylot/jadx"target="_blank" rel="noopener">JADX</a> for Android and <a href="https://github.com/icsharpcode/ILSpy"target="_blank" rel="noopener">ILSpy</a> for .NET.</li>
</ul>
<p>Keep this list in mind. REA, which we&rsquo;ll get to shortly, is a wrapper around it.</p>
<h2>How a binary gets taken apart, in practice<span class="hx:absolute hx:-mt-20" id="how-a-binary-gets-taken-apart-in-practice"></span>
    <a href="#how-a-binary-gets-taken-apart-in-practice" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p>In principle, every binary is reversible. The processor has to be able to execute it, so the instructions are in there. The path is always the same:</p>
<ol>
<li><strong>Disassemble</strong>: the binary becomes assembly, one machine instruction per line. This is mechanical.</li>
<li><strong>Decompile</strong>: the assembly becomes something resembling C. Ghidra and IDA do this reasonably well, with a lot of noise.</li>
<li><strong>Recover what the compiler threw away</strong>: variable names, function names, types, structures, comments. None of it survives compilation. This is the real work, and it&rsquo;s human.</li>
<li><strong>Refactor</strong> until it becomes code a person can read, maintain and port.</li>
</ol>
<p>The N64 decomp projects take step 4 all the way: their C code, recompiled, produces the original ROM byte for byte. That&rsquo;s how Super Mario 64 became a project with 135K lines of game C code (around 100K of actual code, plus half a million lines of generated level and model data), and Ocarina of Time passed 430K lines. Static recompilation skips part of this: it translates the original processor&rsquo;s instructions into generic C, without trying to understand them, and replaces only the parts that talk to the hardware. It&rsquo;s faster and the result is less readable.</p>
<h3>&ldquo;But can&rsquo;t the AI just read the binary directly?&rdquo;<span class="hx:absolute hx:-mt-20" id="but-cant-the-ai-just-read-the-binary-directly"></span>
    <a href="#but-cant-the-ai-just-read-the-binary-directly" class="subheading-anchor" aria-label="Permalink for this section"></a></h3><p>Someone always asks: if it&rsquo;s AI, why go through C? Let the model read the binary and build on top of it. The short answer is that an LLM only knows what was in its training corpus, and a corpus of binaries paired with source code is scarce, because no human has written production assembly in decades.</p>
<p>The long answer is that the literature exists, and it&rsquo;s instructive precisely because it&rsquo;s modest. The lineage runs from 2018 neural networks to models like <a href="https://arxiv.org/abs/2305.12520"target="_blank" rel="noopener">SLaDe</a> (200 million parameters, one per architecture and optimization level), <a href="https://arxiv.org/abs/2403.05286"target="_blank" rel="noopener">LLM4Decompile</a> (up to 33 billion) and <a href="https://arxiv.org/abs/2311.13721"target="_blank" rel="noopener">Nova</a>. Meta published an <a href="https://arxiv.org/abs/2407.02524"target="_blank" rel="noopener">LLM Compiler</a> that translates assembly into LLVM IR. The best results, on isolated benchmark functions, hover around 60 to 65% of code that runs again and gives the same result, dropping sharply when the compiler optimized with -O3.</p>
<p>Two recent studies show the real state of things. <a href="https://arxiv.org/abs/2505.11340"target="_blank" rel="noopener">DecompileBench</a>, with 23K real functions, found that LLM-based decompilers produce more readable code with half the functional correctness of commercial decompilers. And a <a href="https://arxiv.org/abs/2609.05370"target="_blank" rel="noopener">September 2026 paper</a> measured that LLM refinement of Ghidra output raises the compilation rate from 75% to 90% and drops behavioral fidelity from 74% to 62%, with up to around 10% of functions with known vulnerabilities no longer reproducing the flaw, meaning the bug vanished without anyone asking.</p>
<blockquote>
  <p>Summing up what exists: small models, function by function, almost only x86-64 Linux, and the best ones are refinement layers on top of Ghidra, which keeps the classic decompiler in the loop. No emulator, no game, no whole program has been neurally recompiled. Until someone invents that, you work with reality, and reality includes the intermediate layer of programming language and compiler.</p>

</blockquote>
<p>The AI assistants that exist for this in production confirm the design: <a href="https://plugins.hex-rays.com/aidapal"target="_blank" rel="noopener">aiDAPal</a>, an IDA plugin by Atredis, Binary Ninja&rsquo;s Sidekick, the MCP servers for Ghidra. All of them are an LLM naming variables and explaining functions on top of what the traditional decompiler produced.</p>
<h2>What REA actually does<span class="hx:absolute hx:-mt-20" id="what-rea-actually-does"></span>
    <a href="#what-rea-actually-does" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p>I cloned <a href="https://github.com/morluto/rea"target="_blank" rel="noopener">REA</a> and read the code. It&rsquo;s an MCP server and a TypeScript CLI that wraps the tools from the list above and exposes them to your coding agent: Ghidra, Hopper, IDA, JADX, Frida, Wakaru for obfuscated JavaScript, Playwright to capture what a website does. The agent asks, REA runs the tool and returns pseudocode, call graphs, strings and IPC traces, each result with an evidence record and a list of limitations.</p>
<p>I had already done that flow by hand, months before REA went viral. In July I <a href="/en/2026/07/08/fable-5-analyze-tiktok-clash-of-kings-govbr-fingerprint/">had Fable 5 analyze the code of TikTok, Clash of Kings and gov.br</a>: I downloaded the APKs, unzipped them (an APK is a zip), ran JADX on the <code>.dex</code> files and let the model read the Java that came out the other side. It was enough to see the endpoints, the permissions, the embedded SDKs and how each app builds the device fingerprint, that persistent identifier that survives clearing data and reinstalling. TikTok came out as industrial-grade collection, armored against auditing; gov.br, as the example of how to do it right.</p>
<p>The three lessons from that post apply to all of REA. Android is far too easy to decompile, and even so the result serves only static analysis, because recompiling the app is out of reach: the names come scrambled by obfuscation, resources and signing keys are missing. The most sensitive part lives in native code, <code>.so</code> files in C and C++, which decompile into nothing readable, and in TikTok that&rsquo;s exactly where the core sits. And what came out of that work was a report on what the app does, with caveats, and no TikTok clone. REA packages that same flow into an MCP server; the walls stay in the same place.</p>
<p>The judgment is supplied by the LLM you already pay for. REA supplies the deterministic plumbing and the provenance. The phrase &ldquo;automates the heuristics of reverse engineering&rdquo;, which circulates out there, appears nowhere in the repository; the description the project itself uses is agent-driven reverse engineering with traceable evidence.</p>
<p>What it requires: the artifact on your machine (native binary, Electron app, .NET assembly, APK, firmware, network capture), Node 22.19 or later, and the heavy tools installed at your own expense. Ghidra is free; IDA, Hopper and JEB the README tells you to buy. There&rsquo;s no REA API key because it runs locally, and the token cost lands entirely on your agent subscription.</p>
<p>And that cost is the detail nobody mentions. REA&rsquo;s MCP tool catalog is 2.3 MB of JSON, which goes into the agent&rsquo;s context. The project itself publishes an <a href="https://github.com/morluto/rea/tree/main/experiments/analysis-efficiency"target="_blank" rel="noopener">experiment</a> in which analyzing SQLite compiled to WASM, on the default path, took 42 tool calls, five minutes and 300K input tokens. A full inventory of an Electron app like Obsidian returns almost 1 MB of JSON.</p>
<p>There&rsquo;s an open issue complaining that inspecting an ordinary Mac app returns 80K to 230K tokens in one go.</p>
<p>The project is serious and goes far: six months, 2,600 commits, a thousand test files, version 6.4 released on October 11. It&rsquo;s also unstable: 190 open issues, several breaking changes per minor release, subsystems marked experimental.</p>
<p>The limits are written in the repository itself. CONTRIBUTING excludes breaking DRM, anticheat, licensing and commercial protections. The DISCLAIMER warns that decompilation, reconstruction and AI-assisted analysis &ldquo;may be incomplete or incorrect&rdquo;. And even the internal instructions for generating the website&rsquo;s figures say, in so many words: &ldquo;never imply REA automatically clones a program&rdquo; and &ldquo;never say full reconstruction, exact game clone, or automatic source recovery&rdquo;.</p>
<blockquote>
  <p>REA is a good toolbox for someone who already knows how to do reverse engineering and wants an agent holding Ghidra. It isn&rsquo;t the &ldquo;copy this app for me&rdquo; button. The people who wrote the project are the first to say so.</p>

</blockquote>
<h2>PhotoCraft: pretty screenshot, alpha inside<span class="hx:absolute hx:-mt-20" id="photocraft-pretty-screenshot-alpha-inside"></span>
    <a href="#photocraft-pretty-screenshot-alpha-inside" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p>The <a href="https://github.com/storytold/photocraft"target="_blank" rel="noopener">PhotoCraft repository</a> was created on September 30. In two weeks, 54K stars, 8 releases and, as I write, more than 800 open issues. The README badge says &ldquo;early alpha&rdquo;, and Brandon Thomas himself, quoted by Gizmodo, said it&rsquo;s nowhere close to ready. The press that tested it reached the same conclusion: Gizmodo called it a &ldquo;glitchy, but real, Photoshop&rdquo;, and OMG Ubuntu &ldquo;a superficial facsimile with pronounced flaws&rdquo;.</p>
<p>The issues tell the technical story:</p>
<ul>
<li>Any image above 8,192 pixels leaves the GPU compositor and falls back to the CPU, with a 6 GB memory peak, because that&rsquo;s the egui-wgpu texture limit (<a href="https://github.com/storytold/photocraft/issues/49"target="_blank" rel="noopener">issue 49</a>, already closed, and the ones that came after it, <a href="https://github.com/storytold/photocraft/issues/1015"target="_blank" rel="noopener">1015</a> and <a href="https://github.com/storytold/photocraft/issues/4017"target="_blank" rel="noopener">4017</a>).</li>
<li>A 12 megapixel photo needs almost 800 MB just to open, adjust and export from the command line (<a href="https://github.com/storytold/photocraft/issues/1637"target="_blank" rel="noopener">issue 1637</a>).</li>
<li>Color management is rudimentary: a global working space only, instead of per document, and no view transform (<a href="https://github.com/storytold/photocraft/issues/321"target="_blank" rel="noopener">issue 321</a>). Eighteen issues mention CMYK, fifteen mention ICC profiles.</li>
<li>Almost a hundred open issues mention PSD. Hue/Saturation layers composite differently from Photoshop, and saving over the file overwrites the original&rsquo;s correct merged image (<a href="https://github.com/storytold/photocraft/issues/4089"target="_blank" rel="noopener">issue 4089</a>).</li>
<li>Fifty open issues mention &ldquo;crash&rdquo;.</li>
</ul>
<p>The interface resembles Photoshop, so the screenshot is shareable, and whoever sees the screenshot assumes it&rsquo;s a carbon copy. That&rsquo;s expected in a two-week-old alpha. With interest, time and contributions, part of this gets fixed. And then the contributors will discover something the N64 projects never faced.</p>
<blockquote>
  <p>PhotoCraft today is that Ferrari replica built on top of a VW Beetle: the body has the right shape, you take a photo and most people say &ldquo;wow, a Ferrari&rdquo;. Then you turn the key and out comes the Beetle engine. If the photo got you hyped, that&rsquo;s on you.</p>

</blockquote>
<h2>The target moves<span class="hx:absolute hx:-mt-20" id="the-target-moves"></span>
    <a href="#the-target-moves" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p>Decompiling 1998&rsquo;s Zelda is aiming at a stationary target. Nintendo isn&rsquo;t going to release Ocarina of Time 2026 with a new file format. Copying a live product is another conversation, and we&rsquo;ve seen this movie before.</p>
<p>In the 90s and 2000s the target was Microsoft Office. StarOffice became OpenOffice in 2000 and LibreOffice in 2010, and all of them spent years chasing a binary format, .doc, that changed from version to version and only got a public specification in 2008, when the game was already over. The proven part of that story is in the court cases: the European Commission fined Microsoft <a href="https://ec.europa.eu/commission/presscorner/detail/en/ip_04_382"target="_blank" rel="noopener">497 million euros in 2004</a> for refusing to supply interoperability information, and <a href="http://news.bbc.co.uk/2/hi/business/7266629.stm"target="_blank" rel="noopener">899 million in 2008</a> for failing to comply. .docx only became an ISO standard in 2008, in a <a href="https://en.wikipedia.org/wiki/Standardization_of_Office_Open_XML"target="_blank" rel="noopener">vote so controversial</a> that countries formally protested.</p>
<p>It took more than ten years. And when the format finally opened, Office no longer mattered the same way. The value moved elsewhere: today it&rsquo;s <a href="https://office365itpros.com/2024/01/31/office-365-reaches-400-million/"target="_blank" rel="noopener">400 million paid Office 365 seats</a>, <a href="https://www.googlecloudpresscorner.com/2025-12-04-Google-Workspace-Study-Reveals-More-Than-90-of-Rising-Leaders-Want-AI-With-Personalization"target="_blank" rel="noopener">3 billion Google Workspace users</a> and around <a href="https://prodesigntools.com/number-of-creative-cloud-subscribers.html"target="_blank" rel="noopener">41 million Creative Cloud subscribers</a>. Nobody wants to install that on a desktop, and so nobody has the binary.</p>
<blockquote>
  <p>Reverse engineering Google Docs means rewriting the product from scratch looking only at the interface, because the code that matters never leaves the server. After the world moved to SaaS, most proprietary software became a walled garden with no binary. No binary, nothing to disassemble.</p>

</blockquote>
<p>You can build versions of it, of course. <a href="https://immich.app/"target="_blank" rel="noopener">Immich</a> replaces Google Photos for a person or a family: phone backup, face recognition, semantic search, all on your server. What it doesn&rsquo;t replicate is the infrastructure and the training corpus that make Google&rsquo;s search Google&rsquo;s search. And Adobe made the same migration, in pieces.</p>
<h2>Photoshop is far more than layers and crop<span class="hx:absolute hx:-mt-20" id="photoshop-is-far-more-than-layers-and-crop"></span>
    <a href="#photoshop-is-far-more-than-layers-and-crop" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p>Here&rsquo;s the part I know from having paid for it. The features that sell subscriptions today don&rsquo;t even run on your computer.</p>
<p>Generative Fill and Generative Expand run on Firefly, in the cloud, and consume <a href="https://helpx.adobe.com/creative-cloud/apps/generative-ai/generative-credits-faq.html"target="_blank" rel="noopener">generative credits</a>. Several Neural Filters, according to <a href="https://helpx.adobe.com/photoshop/using/neural-filters.html"target="_blank" rel="noopener">Adobe&rsquo;s own documentation</a>, need an internet connection because the processing happens on Adobe&rsquo;s servers. AI object selection has had, since 2020, an option to process in the cloud for a refined result. All of this is code that doesn&rsquo;t exist on your machine for anyone to disassemble.</p>
<p>Then comes what is in the binary, but took decades and partnerships to exist. Camera Raw carries <a href="https://helpx.adobe.com/camera-raw/desktop/dng-and-file-formats/supported-lenses.html"target="_blank" rel="noopener">lens correction profiles</a> and per-camera color profiles for hundreds of models, built over twenty years and updated with every release. No clone guesses that. Either you have the data or you don&rsquo;t.</p>
<p>And there&rsquo;s color science. The example I always remember is GIMP and CMYK.</p>
<p>GIMP was born in 1995. The first native support for CMYK files arrived in <a href="https://www.gimp.org/news/2022/08/27/gimp-2-99-12-released/"target="_blank" rel="noopener">2022</a>, and only for import and export, with pixels always in RGB. <a href="https://www.cgchannel.com/2025/03/gimp-3-0-is-out/"target="_blank" rel="noopener">GIMP 3.0, from 2025</a>, still has no CMYK editing mode. It&rsquo;s on the <a href="https://developer.gimp.org/core/roadmap/"target="_blank" rel="noopener">roadmap</a> as work in progress.</p>
<p>Thirty years of an open project, with good and motivated people, and the print shop still asks for Photoshop. That&rsquo;s the size of the color science hole, and no coding agent invents color science: it reproduces what&rsquo;s in the training data.</p>
<p>Why did it take so long, if it was the most requested feature? Because GIMP&rsquo;s core was born with 8-bit-per-channel RGB baked into every layer, blend mode and filter. Supporting another color model meant rewriting the entire pixel engine, the migration to GEGL, which took the better part of a decade and was only finished in <a href="https://www.gimp.org/release-notes/gimp-2.10.html"target="_blank" rel="noopener">GIMP 2.10, in 2018</a>. CMYK could only start after that.</p>
<p>And CMYK is a family of device profiles, with four inks, a per-printer ICC profile, ink limits and black generation rules, and editing in it means the whole pipeline has to compute in a subtractive four-channel model and round-trip through the profiles without drifting. A single developer, however good a programmer, without experience in this specific field will struggle to implement it, because the knowledge lives in print shops and color labs, and almost none of it is in a training corpus. In GIMP, the people who carried it forward were contributors who understand printing, and even then it took years. No new tool shortcuts that kind of knowledge.</p>
<p>And then there&rsquo;s the layer that isn&rsquo;t even technical: commercial licensing. Print-shop color is Pantone, and Pantone is a proprietary library. No open project can ship the palettes; the Inkscape developers <a href="https://lists.inkscape.org/hyperkitty/list/inkscape-devel@lists.inkscape.org/message/DOXDMUAPHORC4HEXPF37LYBQH6SSQ2M5"target="_blank" rel="noopener">reached that conclusion in 2005</a>, and <a href="https://www.linux.com/news/pantone-and-free-software/"target="_blank" rel="noopener">Linux.com explained the legal risk</a> around the same time. Adobe itself felt it in 2022: when Pantone changed its business model, the libraries <a href="https://petapixel.com/2022/10/28/you-have-to-pay-a-subscription-to-use-pantone-colors-in-photoshop-now"target="_blank" rel="noopener">were pulled from Photoshop, Illustrator and InDesign</a>, old files started opening with their Pantone colors replaced by black, and anyone who needs them pays for a separate plugin subscription. If even Adobe, paying, didn&rsquo;t escape, imagine a clone that runs on goodwill.</p>
<h3>Video is worse<span class="hx:absolute hx:-mt-20" id="video-is-worse"></span>
    <a href="#video-is-worse" class="subheading-anchor" aria-label="Permalink for this section"></a></h3><p>In Premiere, After Effects and DaVinci Resolve, the problem multiplies. A cinema camera doesn&rsquo;t deliver video, it delivers raw data on its own logarithmic curve: ARRI&rsquo;s LogC4, RED&rsquo;s IPP2. To turn that into an image you need the manufacturer&rsquo;s transforms, and RED ships its own in an <a href="https://community.acescentral.com/t/red-ipp2-color-workflows/1055"target="_blank" rel="noopener">SDK</a> that the editors integrate and update with every version. ACES, the industry&rsquo;s neutral standard, depends on input transforms supplied by each manufacturer.</p>
<p>Blackmagic gives Resolve away for free and it decodes ARRIRAW and R3D. It does that because it pays for the SDK and the partnership on your behalf. An agent-built clone, &ldquo;guessing&rdquo; how the Alexa&rsquo;s image should look, produces an image that doesn&rsquo;t match the reference monitor, and in cinema that means it&rsquo;s useless. That knowledge isn&rsquo;t in any training corpus: it&rsquo;s in contracts.</p>
<h2>The Bun case: what it costs to rewrite big software<span class="hx:absolute hx:-mt-20" id="the-bun-case-what-it-costs-to-rewrite-big-software"></span>
    <a href="#the-bun-case-what-it-costs-to-rewrite-big-software" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p>For a sense of the order of magnitude, the best public data point there is comes from Bun. In May 2026, Jarred Sumner rewrote the entire runtime from Zig to Rust using agents, and in July <a href="https://bun.com/blog/bun-in-rust"target="_blank" rel="noopener">published the numbers</a>:</p>
<ul>
<li>535K lines of Zig in 1,448 files became a one-million-line Rust diff, in 11 days.</li>
<li>Up to 64 Claude instances in parallel, 24 hours a day, every line reviewed by two adversarial agents and a fixer.</li>
<li>5.9 billion uncached input tokens, 690 million output tokens, 72 billion cache reads: <strong>around US$ 165K</strong> at API prices.</li>
<li>16K compiler errors fixed by 64 agents before CI went green on six platforms.</li>
<li>The existing test suite, with more than a million assertions, passed 100% before the merge.</li>
</ul>
<p>Read again what made it possible:</p>
<ul>
<li>the project&rsquo;s original author at the controls</li>
<li>a complete, working source code as reference</li>
<li>a test suite with a million assertions serving as the oracle</li>
<li>unlimited budget, because Bun has belonged to Anthropic since December 2025, and a pre-release version of Claude Fable 5</li>
</ul>
<p>Sumner estimates three engineers with full context would have needed a year.</p>
<p>Now take each of those advantages away. PhotoCraft doesn&rsquo;t have the Photoshop source to port, it has to invent. It doesn&rsquo;t have a test suite that says &ldquo;this matches Photoshop&rdquo;. It doesn&rsquo;t have Photoshop&rsquo;s author.</p>
<p>And Photoshop is a 36-year-old product whose disk requirements Adobe lists between <a href="https://helpx.adobe.com/photoshop/desktop/get-started/technical-requirements-installation/adobe-photoshop-on-desktop-technical-requirements.html"target="_blank" rel="noopener">10 and 100 GB</a>, against a JavaScript runtime. Even without knowing the size of Adobe&rsquo;s codebase, we&rsquo;re talking about a bigger target, with no reference, no oracle and no owner. Orders of magnitude above US$ 165K, and even then it would be an approximation.</p>
<h2>Why retro moves so fast<span class="hx:absolute hx:-mt-20" id="why-retro-moves-so-fast"></span>
    <a href="#why-retro-moves-so-fast" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p>If it&rsquo;s so hard, why does an old game port ship every day? Because retro stacks up every advantage the rest doesn&rsquo;t have.</p>
<p><strong>The binary is available and tiny.</strong> Super Mario Bros. on the NES: 40 KB. Super Mario 64: 8 MB. Ocarina of Time and Majora&rsquo;s Mask: 32 MB each. A whole PS1 CD: 650 MB.</p>
<p>Compare with <a href="https://store.steampowered.com/app/1086940/Baldurs_Gate_3/"target="_blank" rel="noopener">Baldur&rsquo;s Gate 3</a>, 150 GB, or with the <a href="https://support.activision.com/black-ops-6/articles/pc-system-requirements-for-black-ops-6"target="_blank" rel="noopener">latest Call of Duty</a>, above 100 GB. That&rsquo;s three or four orders of magnitude, and the scope shrinks along with it: a 1996 game has a handful of systems, not a physics engine with networking, a store and anticheat.</p>
<p><strong>The technology is old and documented.</strong> Twenty-five years of community have already mapped the N64, PS1 and SNES hardware instruction by instruction. The agent discovers nothing; it speeds up work that already has a map. It&rsquo;s the same pattern I <a href="/en/2026/09/28/llms-are-good-at-reproducing-what-exists-what-about-new-things/">saw in my retrocomputing projects</a>: where there&rsquo;s a reference and an oracle, AI flies; where there isn&rsquo;t, it spins in brute force.</p>
<p><strong>The target doesn&rsquo;t move.</strong> Nobody is going to update 1998&rsquo;s Zelda.</p>
<p><strong>And the legal side was settled thirty years ago.</strong> Sega v. Accolade and Sony v. Connectix drew the outline. The ports require you to supply your own ROM.</p>
<h3>A modern console is a PC<span class="hx:absolute hx:-mt-20" id="a-modern-console-is-a-pc"></span>
    <a href="#a-modern-console-is-a-pc" class="subheading-anchor" aria-label="Permalink for this section"></a></h3><p>The second half of the explosion, the PS4, PS5, Xbox One and Switch ports, has another explanation: those consoles are PCs or phones in a different case. The <a href="https://www.playstation.com/en-us/ps4/tech-specs/"target="_blank" rel="noopener">PS4</a> uses an AMD Jaguar x86-64, the <a href="https://blog.playstation.com/2020/03/18/unveiling-new-details-of-playstation-5-hardware-technical-specs/"target="_blank" rel="noopener">PS5</a> a Zen 2, the <a href="https://news.xbox.com/en-us/2020/03/16/xbox-series-x-tech/"target="_blank" rel="noopener">Xbox Series</a> another Zen 2, the Switch an NVIDIA <a href="https://www.techinsights.com/blog/nintendo-switch-teardown"target="_blank" rel="noopener">Tegra X1</a> ARM chip. Your PC&rsquo;s processor runs that code natively. So nobody needs to emulate the CPU.</p>
<p>The remaining work is translating the operating system and the GPU. <a href="https://github.com/shadps4-emu/shadPS4"target="_blank" rel="noopener">shadPS4</a> reimplements the PS4&rsquo;s system libraries and recompiles the shaders: games ship from the factory with AMD GPU machine code, which the emulator decodes instruction by instruction and converts to SPIR-V, Vulkan&rsquo;s format.</p>
<p><a href="https://almost-there-games.itch.io/azimuth"target="_blank" rel="noopener">Azimuth</a>, which makes Forza Horizon 2 run on Windows, translates Xbox WinRT calls to Win32 and DirectX 11.X to desktop DirectX 12, with the game&rsquo;s x86 code running directly. AnyPS5 relinks the executable: it takes the PS5 binary and produces a native Linux or Windows binary, linked against reimplemented system libraries. In all three cases, Proton, DXVK, VKD3D and MoltenVK had solved the graphics translation layer years earlier.</p>
<p>The reverse proof is the consoles that weren&rsquo;t PCs. The PS3 uses the Cell, a PowerPC with seven active coprocessors (the SPEs), each with its own local memory and no cache, and RPCS3 has been at it <a href="https://rpcs3.net/about"target="_blank" rel="noopener">since 2011</a>, with SPU emulation still the bottleneck today. The Xbox 360 is PowerPC too, which is why Sonic Unleashed needed XenonRecomp to translate PowerPC into C++. Reverse engineering is case by case, and the architecture decides whether the case is easy.</p>
<h3>AI is in the loop, and there&rsquo;s already a fight<span class="hx:absolute hx:-mt-20" id="ai-is-in-the-loop-and-theres-already-a-fight"></span>
    <a href="#ai-is-in-the-loop-and-theres-already-a-fight" class="subheading-anchor" aria-label="Permalink for this section"></a></h3><p>That the 2026 ports use AI, many of them say outright. The <a href="https://github.com/SlickAmogus/silent-hill-decomp"target="_blank" rel="noopener">Silent Hill decomp</a> writes in its README that development is &ldquo;heavily AI-assisted (Claude Opus 4.6, 4.7 and the newer Fable model), and we&rsquo;re open about that. It is not automated translation of the game&rdquo;. The Pokémon Stadium recomp <a href="https://retrododo.com/a-pokemon-stadium-recomp-has-finally-arrived-but-lists-claude-as-a-contributor/"target="_blank" rel="noopener">lists Claude as a contributor</a>.</p>
<p>The devs of the Zelda and Banjo recomps, who spent years doing this by hand, <a href="https://kotaku.com/zelda-and-banjo-recompiled-devs-go-to-war-with-ai-vibe-coded-slopcomps-2000739936"target="_blank" rel="noopener">went to war</a> with what they call &ldquo;slopcomps&rdquo;, agent-generated ports of alpha quality.</p>
<p>And it&rsquo;s worth separating headline from actual state here too. AnyPS5 has a 0.1 version from September that, according to those who tested it, runs one 2D indie game; the viral claim that &ldquo;the PS5 is 80% ported to PC&rdquo; comes from fans, and no 3D game runs. Astro Bot runs, but in emulators (KytyPS5, SharpEmu), which take the traditional path. Forza Horizon 2 runs, and Azimuth is a closed binary from a studio that declares itself &ldquo;AI assisted&rdquo; without saying anything more.</p>
<h2>&ldquo;But in two years tokens will cost nothing&rdquo;<span class="hx:absolute hx:-mt-20" id="but-in-two-years-tokens-will-cost-nothing"></span>
    <a href="#but-in-two-years-tokens-will-cost-nothing" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p>The standard answer to all of this is: it&rsquo;s hard today, in two years it&rsquo;s trivial, because AI grows exponentially. The numbers say otherwise.</p>
<p>The price of the most expensive tier barely fell. GPT-4 in March 2023 cost US$ 30 and 60 per million input and output tokens; Claude 3 Opus in 2024, 15 and 75; today&rsquo;s frontier models, Fable 5.1 and GPT-6 Astra, <a href="https://claude.com/pricing"target="_blank" rel="noopener">cost</a> <a href="https://developers.openai.com/api/docs/pricing"target="_blank" rel="noopener">10 and 50</a>. In three and a half years, the frontier got between 1.2 and 3 times cheaper, depending on which end you look at.</p>
<p>What really fell was the cost of a fixed quality: Epoch AI measured drops <a href="https://epoch.ai/blog/llm-inference-price-trends"target="_blank" rel="noopener">of 9 to 900 times per year</a> depending on the task, and in a <a href="https://epoch.ai/gradient-updates/how-persistent-is-the-inference-cost-burden"target="_blank" rel="noopener">2026 review</a> sums it up as &ldquo;very roughly 5 to 10 times per year&rdquo;, with the caveat that it might slow down. That&rsquo;s real and it&rsquo;s great.</p>
<p>But apply the math to Bun. US$ 165K divided by 10 is US$ 16K. By 100, US$ 1,650. That&rsquo;s to port a runtime with the source, the tests and the author in hand.</p>
<p>For an amateur trying to clone Photoshop with none of that, the bill starts orders of magnitude higher and falls in the same proportion. Cheap isn&rsquo;t the same as trivial.</p>
<p>And the &ldquo;exponential&rdquo; premise died in 2024. Ilya Sutskever said at NeurIPS that <a href="https://www.globalbankingandfinance.com/ai-with-reasoning-power-will-be-less-predictable-ilya-sutskever-says/"target="_blank" rel="noopener">pre-training as we know it will end</a>, because there&rsquo;s only one internet. Epoch projects that reasoning model scaling <a href="https://epoch.ai/gradient-updates/how-far-can-reasoning-models-scale"target="_blank" rel="noopener">converges to the general frontier rate</a> in about a year.</p>
<p>I&rsquo;ve written about this three times in recent weeks: <a href="/en/2026/09/28/llms-are-good-at-reproducing-what-exists-what-about-new-things/">the limits</a> of what the model reproduces, <a href="/en/2026/10/12/llms-agents-competent-enough/">the convergence</a> of raw models with the gains coming from the harness, and <a href="/en/2026/10/11/are-there-better-languages-for-programming-with-llms/">the languages benchmark</a> where the frontier models tied at the ceiling. The tool we have is the tool we&rsquo;ll have for a good while, with incremental improvement. Plan with it.</p>
<p>Worth recalling the number that opens the limits post: per the <a href="https://github.blog/news-insights/octoverse/octoverse-a-new-developer-joins-github-every-second-as-ai-leads-typescript-to-1/"target="_blank" rel="noopener">Octoverse 2025</a>, GitHub&rsquo;s official report, 81.5% of contributions on the platform happened in private repositories. That&rsquo;s the code that really matters, the code that pays salaries, and no LLM has seen a line of it. The model reproduces what was in the training data, and that code was never there.</p>
<p>Now extend that to every SaaS product and every component it uses. The Adobe code that&rsquo;s actually worth something, the color engine, the profiles, the cloud filters, isn&rsquo;t available anywhere, not even as a binary. Anyone who wants to reproduce it will have to redo the research and development, expensive and slow, over the same years Adobe took. And at the end they still run into third-party licensed intellectual property, Pantone, camera SDKs, manufacturer profiles, that you will never be able to have.</p>
<h2>Answering the list from the top<span class="hx:absolute hx:-mt-20" id="answering-the-list-from-the-top"></span>
    <a href="#answering-the-list-from-the-top" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p><strong>Does PhotoCraft exist?</strong> It does, it&rsquo;s a two-week-old alpha with more than 800 open issues, rudimentary color management, freezing above 8K and opening PSDs wrong. It looks like Photoshop in a screenshot. It can improve a lot, and it will discover that the target moves and that Photoshop&rsquo;s expensive parts live in the cloud or in manufacturer contracts.</p>
<p><strong>Does REA exist?</strong> It does, it&rsquo;s good, and it&rsquo;s a toolbox for people who already know how to use Ghidra, requiring the binary in hand, the tools installed and hundreds of thousands of tokens per analysis. The project itself avoids saying it clones programs.</p>
<p><strong>Did recomps and decomps accelerate?</strong> Yes, for real, and AI has a part in it. They accelerated where the binary exists, is small, has been documented for 25 years and doesn&rsquo;t move. Or where the console is a PC in disguise and the work is API translation, solved by Wine and Vulkan years earlier.</p>
<p><strong>Is Adobe dead?</strong> Adobe has around 40 million subscribers by the most cited estimate, the features that sell subscriptions run on its servers, and thirty years of GIMP still leave the print shop asking for Photoshop. I wish it were otherwise. The data says what will happen is what always happened with clones of a live product: years of chasing, and when you catch up, the value has already moved.</p>
<p><strong>Are programmers dead?</strong> Rewriting Bun required Bun&rsquo;s author. The decomps that work have people who know the hardware driving the agent, and the ones that don&rsquo;t became &ldquo;slopcomps&rdquo;, name and all. Reverse engineering got cheaper and more accessible, as it did with Ghidra in 2019, and it&rsquo;s still an engineer&rsquo;s job. Without us, the tool returns a pretty screenshot.</p>
<p>Proprietary software with a binary in hand will come under pressure, and it should. Most of the software you use has no binary at all, and the software that does already depends on cloud services that don&rsquo;t disassemble. Software engineering with AI has a great road ahead. &ldquo;It&rsquo;s over&rdquo; headlines get clicks and don&rsquo;t compile.</p>
]]></content:encoded><category>artificial-intelligence</category><category>vibe-coding</category><category>retrocomputing</category><category>open-source</category></item><item><title>The Limits of LLMs: Good at Reproducing What Exists. Expensive for What Doesn't</title><link>https://akitaonrails.github.io/en/2026/09/28/llms-are-good-at-reproducing-what-exists-what-about-new-things/</link><guid isPermaLink="true">https://akitaonrails.github.io/en/2026/09/28/llms-are-good-at-reproducing-what-exists-what-about-new-things/</guid><pubDate>Mon, 28 Sep 2026 01:00:00 -0300</pubDate><description>&lt;p&gt;Everyone has noticed by now that LLMs write CRUD with their eyes closed. Forms, reports, REST endpoints, unit tests: it comes out clean, it comes out fast. A lot of people conclude from this that programmers are done for.&lt;/p&gt;
&lt;p&gt;I&amp;rsquo;ve been using LLMs for everything for almost two years, I&amp;rsquo;ve published dozens of projects with them, and my conclusion is different: what they do best is &lt;strong&gt;reproduce what already exists&lt;/strong&gt;. And that covers a giant slice of corporate work, don&amp;rsquo;t kid yourself. But there&amp;rsquo;s a frontier they don&amp;rsquo;t cross easily, and I spent the last few months bumping into it on purpose.&lt;/p&gt;</description><content:encoded><![CDATA[<p>Everyone has noticed by now that LLMs write CRUD with their eyes closed. Forms, reports, REST endpoints, unit tests: it comes out clean, it comes out fast. A lot of people conclude from this that programmers are done for.</p>
<p>I&rsquo;ve been using LLMs for everything for almost two years, I&rsquo;ve published dozens of projects with them, and my conclusion is different: what they do best is <strong>reproduce what already exists</strong>. And that covers a giant slice of corporate work, don&rsquo;t kid yourself. But there&rsquo;s a frontier they don&rsquo;t cross easily, and I spent the last few months bumping into it on purpose.</p>
<p>This article shows where that frontier sits, with evidence from my own projects and from the research that exists on the subject. And there&rsquo;s a hypothesis I&rsquo;ll put up front and defend along the way: if LLMs are so good at code, providers owe a huge debt to the decades of the open source community, which protected the freedom of code and published everything for free. Without that heritage, there would be no Copilot, no Cursor, no Claude Code, none of this.</p>
<p>A disclaimer before we start: what I&rsquo;m going to argue here is speculative, based on observation and on the public data that exists. Nobody outside the labs knows exactly how each provider trains their own models, and that varies from provider to provider and from version to version. What holds today may not hold in the next generation. Take it all with a grain of salt.</p>
<h2>The Training Blind Spot<span class="hx:absolute hx:-mt-20" id="the-training-blind-spot"></span>
    <a href="#the-training-blind-spot" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p>Every LLM was trained on what&rsquo;s public. The entire public internet, and for code, public GitHub. The canonical open code dataset, BigCode&rsquo;s <a href="https://huggingface.co/datasets/bigcode/the-stack-v2"target="_blank" rel="noopener">The Stack v2</a>, is explicit about this: it&rsquo;s derived from Software Heritage, an archive of <em>&ldquo;the source code of all publicly available software&rdquo;</em>. That&rsquo;s 67.5 TB, 3.28 billion unique files, 104.2 million repositories. Huge. And all public.</p>
<p>Now look at the other side. The <a href="https://github.blog/news-insights/octoverse/octoverse-a-new-developer-joins-github-every-second-as-ai-leads-typescript-to-1/"target="_blank" rel="noopener">Octoverse 2025</a>, GitHub&rsquo;s official report, says <strong>81.5% of contributions on the platform happened in private repositories</strong>. That&rsquo;s just GitHub. Outside of it there&rsquo;s:</p>
<ul>
<li>the internal code of every company that never touched a public server;</li>
<li>the source of every proprietary software;</li>
<li>the code of every commercial game;</li>
<li>and that of every embedded system.</li>
</ul>
<p>None of that ever went into training.</p>
<p>Think about what this means: the model deeply knows what the world has already published, and it&rsquo;s blind to what the world keeps closed. When you ask for a React form, it&rsquo;s reproducing patterns it has seen millions of times. When you ask for something nobody has ever done in public, it&rsquo;s operating in territory where its map is blank.</p>
<h2>Why Is Everyone Shipping So Much, So Fast?<span class="hx:absolute hx:-mt-20" id="why-is-everyone-shipping-so-much-so-fast"></span>
    <a href="#why-is-everyone-shipping-so-much-so-fast" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p>Before getting into the limits, it&rsquo;s worth recording the side that works, because it&rsquo;s what explains the feeling that everyone became an app factory.</p>
<p>Look at what&rsquo;s popping up in the community: <a href="https://github.com/crmne/spotifast"target="_blank" rel="noopener">Spotifast</a> and <a href="https://github.com/crmne/zapfast"target="_blank" rel="noopener">ZapFast</a>, native Spotify and WhatsApp clients written in Rust by a single person, running on Linux, macOS, and Windows. Nothing in them is new technology. It&rsquo;s the service that already existed, wrapped in a lean native app, on top of libraries that already existed, doing what the official teams always could have done but never wanted to spend their time on. That work got cheap, because an LLM trained on everything public is really good precisely at this: replicating.</p>
<p>My own projects follow the same pattern. <a href="https://github.com/akitaonrails/FrankMD"target="_blank" rel="noopener">FrankMD</a> is a Markdown note-taking web app with a Visual Studio look and features that already existed in my other apps. <a href="https://github.com/akitaonrails/FrankSherlock"target="_blank" rel="noopener">Frank Sherlock</a> is a local image organizer that, deep down, is a file manager with thumbnails and search, something that exists by the dozen. Neither invents anything: they&rsquo;re mashups of known pieces, assembled the way I always wanted. The LLM does the boring part, and that&rsquo;s where the speed comes from.</p>
<p>The most didactic example is my email client. I&rsquo;ve used Geary for years, and two small gaps always annoyed me: the weak recipient autocomplete and a sidebar I wanted to hide. Trivial stuff, which never justified setting up a build environment, learning the project&rsquo;s toolchain, and studying the code just for two features. This year I finally solved both: an <a href="https://github.com/akitaonrails/geary-email-autocomplete"target="_blank" rel="noopener">autocomplete module</a>, a <a href="https://github.com/akitaonrails/geary-hide-sidebar-module"target="_blank" rel="noopener">module to hide the sidebar</a>, and a <a href="https://github.com/akitaonrails/frank_geary"target="_blank" rel="noopener">whole fork with my patches</a>. I became the maintainer of improvements I had postponed for years, not because I got faster, but because the boring part got cheap.</p>
<p>Notice what all these cases have in common: the problem had already been solved before, somewhere else, some other way. The map existed; what didn&rsquo;t exist was cheap labor to retrace the path. That&rsquo;s reproduction working in our favor, and it&rsquo;s why your feed is full of people shipping a new app every week.</p>
<p>Now hold that thought. The rest of this article is about what happens when the map runs out.</p>
<h2>Four Home Experiments<span class="hx:absolute hx:-mt-20" id="four-home-experiments"></span>
    <a href="#four-home-experiments" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p>I&rsquo;m not theorizing. Over the last few months I ran a marathon of retrocomputing projects that are exactly the pathological case: working with proprietary software from 30 or 40 years ago whose source code was never public. It&rsquo;s the perfect blind spot.</p>
<h3>nes-to-sms: the project I gave up on<span class="hx:absolute hx:-mt-20" id="nes-to-sms-the-project-i-gave-up-on"></span>
    <a href="#nes-to-sms-the-project-i-gave-up-on" class="subheading-anchor" aria-label="Permalink for this section"></a></h3><p><a href="https://github.com/akitaonrails/nes-to-sms"target="_blank" rel="noopener">nes-to-sms</a> is a static recompiler from NES to Master System. The idea: take the binary ROM of a NES game, translate it instruction by instruction from 6502 to Z80, convert the tiles, and generate a Master System ROM that runs on real hardware. Forget emulator or manual port: this is a machine that turns one game into another.</p>
<p>Static NES recompilers exist, <a href="https://github.com/mstan/nesrecomp"target="_blank" rel="noopener">NESRecomp</a> translates to C and runs natively on PC, and I studied it closely. But crossing from one console to another 8-bit console, with a completely different clock and VDP budget, nobody has ever done. There&rsquo;s no public reference, no paper, no abandoned project to copy.</p>
<p>The project numbers: <strong>349 commits, 31 active days spread over almost 4 months, ~110 thousand lines of engine in Rust and Z80, 668 tests passing in the last run recorded in the README</strong>. And the result? Playable Super Mario Bros. (slow, limited audio, but playable), with a byte-for-byte identical RAM trajectory to the NES on <a href="https://github.com/akitaonrails/nes-to-sms/blob/master/docs/completion-plan.md"target="_blank" rel="noopener">one ~4,900-frame route</a> (the diff leaves out audio and part of the VRAM buffer). Castlevania playable on stage 1. SMB3 rendering. And a queue of games that boot three frames and die.</p>
<p>And it wasn&rsquo;t for lack of pushing the models. In this project alone:</p>
<ul>
<li><strong>four generations of Claude</strong> went through it (Opus 4.7, Fable 5, Opus 4.8, Fable 5.1), with 213 co-signed commits and 104 commits linked to sessions in the history, plus Codex sessions in the stretches without co-authorship, complete with documented handoffs between agents;</li>
<li>there was even cross-generation auditing: a new agent session <a href="https://github.com/akitaonrails/nes-to-sms/blob/master/docs/mapper-continuation-review.md"target="_blank" rel="noopener">reviewed the previous 55 commits</a> and reverted conclusions the previous generation had overclaimed;</li>
<li>the Castlevania crash hunt alone consumed 45 commits in 5 days;</li>
<li>the final September sprint was 176 commits in 17 days before I called the pause;</li>
<li>and the regressions are registered by name in the history: <em>&ldquo;H.7 tried and reverted&rdquo;</em>, <em>&ldquo;record the reverted map-bank-hold attempt&rdquo;</em>, <em>&ldquo;correct-but-reverted result&rdquo;</em>, plus three shared-lever hypotheses tested and rejected in the project&rsquo;s last three days.</li>
</ul>
<p>I didn&rsquo;t measure tokens reliably in this project, so I won&rsquo;t make up a number. But 349 commits with 668 tests holding up every step already give an idea of the cost.</p>
<p>Notice the detail that matters: the only game that actually got finished is Super Mario Bros. Why? Because SMB is the most dissected game in history. There&rsquo;s a <a href="https://gist.github.com/1wErt3r/4048722"target="_blank" rel="noopener">complete public disassembly</a> the community has used for over a decade, with every function named and commented. I fed that into the game&rsquo;s profile and the LLM had a complete map to work with. For the other games, there&rsquo;s no map. And without a map, each new game died a few frames after boot from control flow divergence, and each one demanded an instruction-by-instruction forensic hunt that carried nothing over to the next game.</p>
<p>The project itself documented the spinning pattern. There was an entire optimization campaign that lasted weeks trying to cut the cost of emulating 6502 flags on the Z80.</p>
<p>Then in September I stopped to compare with the <a href="https://github.com/lackoftrack27/Super-Mario-Bros.-SMS"target="_blank" rel="noopener">manual port of SMB to Master System made by a hacker named lackoftrack27</a>, written by a human, routine by routine. According to <a href="https://github.com/akitaonrails/nes-to-sms/blob/master/docs/handport-comparison.md"target="_blank" rel="noopener">the analysis we did of his code</a>, the human port runs inside the frame budget, with headroom we estimated at ~90% utilization. My machine, after months of optimization, still needed overclocking.</p>
<p>And the analysis document pinned down why: when we removed 30% of the flag emulation calls, the timing barely moved.</p>
<blockquote>
  <p><strong>The flags were never the bottleneck.</strong></p>

</blockquote>
<p>The right optimization was to redesign the data structure: transposing the object array into RAM pages. It&rsquo;s a trick that depends on knowing that &ldquo;the X register here is always an object index.&rdquo;</p>
<p>That invariant exists in the head of the programmer who wrote the game in 1985. It doesn&rsquo;t exist in the instruction stream. A static translator has no way to discover it. And the LLM, for months, didn&rsquo;t discover it.</p>
<p>The pause banner I wrote in the README is blunt: real-hardware parity &ldquo;may be fundamentally unattainable&rdquo; and, quoting, <em>&ldquo;this may be a limit of the current frontier coding models as much as of the approach&rdquo;</em>.</p>
<h3>gg-to-sms: the pivot to mapped territory<span class="hx:absolute hx:-mt-20" id="gg-to-sms-the-pivot-to-mapped-territory"></span>
    <a href="#gg-to-sms-the-pivot-to-mapped-territory" class="subheading-anchor" aria-label="Permalink for this section"></a></h3><p>The same day I paused nes-to-sms, I started gg-to-sms: converting Game Gear games to Master System with a widened screen. The difference that matters is that this problem <strong>is not new</strong>. The romhacking scene has been converting GG games to SMS by hand for twenty years, and the catalog I built in the project counted ~186 of them. Meaning: there&rsquo;s a corpus, there&rsquo;s ground truth, there&rsquo;s a pattern to learn.</p>
<p>Result: in one day of work,</p>
<ul>
<li>the research phase was complete;</li>
<li>the catalog of the 373 GG games was assembled;</li>
<li>the patch-point scanner was validated against real human patches, hitting addresses within an 8-byte margin;</li>
<li>and on top of that the tool found real bugs in twenty-year-old patches that the entire scene had never noticed.</li>
</ul>
<p>The model was the same; what changed was the problem, which this time has references.</p>
<p>And even so: so far, zero games have passed the viewport acceptance review. The new part of the project (the machine that generates the patches on its own, which is the part nobody has ever done) remains undone.</p>
<h3>super-mario-deluxe-fixed: four days and 436 million tokens<span class="hx:absolute hx:-mt-20" id="super-mario-deluxe-fixed-four-days-and-436-million-tokens"></span>
    <a href="#super-mario-deluxe-fixed-four-days-and-436-million-tokens" class="subheading-anchor" aria-label="Permalink for this section"></a></h3><p>This one was a 4-day sprint, practically a single Codex session that consumed <strong>436 million input tokens</strong>. The goal: run Super Mario Bros. Deluxe for Game Boy Color with a widened screen at NES resolution, something no existing tool does with live sprites.</p>
<p>It got to playable in 4 days. But look at the foundation: a ready-made emulator vendored as a dependency, and a dormant disassembly of the game that someone had published years earlier, which the project&rsquo;s own documentation calls &ldquo;the most important artifact.&rdquo;</p>
<p>The new work was the custom renderer, and it stopped at 21 of 32 stages completed. The missing ones hang on moving-platform timing. The project has been stalled mid-sprint since then, and I haven&rsquo;t given up on it yet.</p>
<p>And one detail that says a lot: I had to direct QA by looking at screenshots, because the agent would deliver things with graphical glitches and not notice on its own.</p>
<h3>super-mario-bros-35: everything that worked had an owner<span class="hx:absolute hx:-mt-20" id="super-mario-bros-35-everything-that-worked-had-an-owner"></span>
    <a href="#super-mario-bros-35-everything-that-worked-had-an-owner" class="subheading-anchor" aria-label="Permalink for this section"></a></h3><p>This is the offline clone of Super Mario Bros. 35, the battle royale Nintendo took offline. What worked in it: everything built on top of an existing artifact.</p>
<ul>
<li>The engine is a C reconstruction made by someone else with Ghidra.</li>
<li>The AI&rsquo;s initial weights came from published checkpoints.</li>
<li>The network rules were inferred from a public reverse engineering of the netcode.</li>
<li>Even the physics: the central bug was diagnosed because I had a recorded reference trajectory to compare frame by frame.</li>
</ul>
<p>What didn&rsquo;t work: the maze castle stages. Reinforcement training stalls on them. 46 million agent steps, training restarted from scratch, anti-loop reward, and in the end the only thing that solved one of the stages was manual bias surgery on the trained model. Out of 32 stages, 19 cleared. The worst ones remain stuck.</p>
<p>And the process degenerated into a pattern I recognize from all these projects: when training doesn&rsquo;t solve it, the flow becomes checkpoint-selection roulette, dozens of bias and output-head variations, throwing permutation and computation at the problem in place of a principled fix.</p>
<h2>The Pattern I Keep Seeing<span class="hx:absolute hx:-mt-20" id="the-pattern-i-keep-seeing"></span>
    <a href="#the-pattern-i-keep-seeing" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p>This is intuition from someone who operated the machine for months, not hard data. But the pattern repeats with Claude, with GPT, with Kimi, with GLM, so it doesn&rsquo;t look like a defect of one model.</p>
<p>The beginning of any project is wonderful. The first milestones fly, because scaffolding the structure, writing harnesses, replicating APIs, all of that is covered territory. Then the project reaches the part nobody has ever done, and the speed collapses. The agent starts spinning: tries a hypothesis, regresses something else, reverts, tries again. The nes-to-sms commit history is full of honest messages like &ldquo;attempt reverted&rdquo; and &ldquo;hypothesis closed with correct result but reverted.&rdquo; Lots of tokens burned, little progress.</p>
<blockquote>
  <p>My reading of what happens inside: token sampling is probabilistic. When the problem resembles the training data, the right tokens have high probability and the answer comes out straight. When the problem is unprecedented, the probability of the right path is low, and the process becomes <strong>directed brute force</strong>: guided trial and error, but trial and error all the same.</p>

</blockquote>
<p>The way out I found for this spinning is always the same: give it an oracle. If I can define &ldquo;the result has to equal X&rdquo; (a reference image, a recorded trajectory, a cycle-accurate emulator as ground truth), the machine can iterate until it hits X. In nes-to-sms, every real unlock came from that: the SMB disassembly, the frame diff, the reference emulator. When I can&rsquo;t define X properly, it spins indefinitely.</p>
<p>The second strategy that works: hunt down an abandoned project, a paper, any material the model never saw but that brings the problem closer, and shove it into the context. That warms up the distribution and improves the result a lot. But it&rsquo;s limited: if nothing similar exists, there&rsquo;s nothing to feed it.</p>
<h2>More Than Anecdote: What the Research Measures<span class="hx:absolute hx:-mt-20" id="more-than-anecdote-what-the-research-measures"></span>
    <a href="#more-than-anecdote-what-the-research-measures" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p>The good part is I don&rsquo;t have to rely on my intuition. There&rsquo;s serious research measuring exactly this.</p>
<p>Apple&rsquo;s <a href="https://arxiv.org/abs/2410.05229"target="_blank" rel="noopener">GSM-Symbolic study</a> took benchmark math problems and did two simple things: swapped only the numbers, and then added a single irrelevant sentence to the problem statement. Result: performance drops just from swapping the numbers, and plummets <strong>up to 65%</strong> with the irrelevant sentence. The authors&rsquo; hypothesis, in the text: <em>&ldquo;current LLMs cannot perform genuine logical reasoning; they replicate reasoning steps from their training data.&rdquo;</em></p>
<p>Scale AI&rsquo;s <a href="https://arxiv.org/abs/2405.00332"target="_blank" rel="noopener">GSM1k</a> created a mirror of GSM8K written from scratch by humans, guaranteed contamination-free, and saw drops of up to 8% across several model families, with signs of systematic overfitting in the worst ones. To be fair to the paper: the authors say frontier models show minimal signs of overfitting and that all of them generalize to some extent to new problems. The signal exists; its size is debatable.</p>
<p><a href="https://arxiv.org/abs/2403.07974"target="_blank" rel="noopener">LiveCodeBench</a> ran the cleanest test of all: evaluating on coding problems published <strong>after</strong> the training cutoff. Inflated performance on pre-cutoff problems and drops on post-cutoff problems across several popular models, the classic contamination signal.</p>
<p>And there&rsquo;s <a href="https://arcprize.org/"target="_blank" rel="noopener">ARC-AGI</a>, François Chollet&rsquo;s benchmark designed specifically to be memorization-proof: every task is unprecedented, nothing similar exists in training. On ARC-AGI-2, released in March 2025, the official leaderboard says: <strong>pure LLMs score 0%</strong>, reasoning systems sit in single digits, and every evaluation task was solved by at least two humans within two attempts. Chollet, by the way, summed up my thesis better than I did, back in February 2024:</p>
<blockquote>
  <p>&ldquo;Reality is that LLMs are not AGI — they&rsquo;re a big curve fit to a very large dataset. They work via memorization and interpolation. But that interpolative curve can be tremendously useful, if you want to automate a known task that&rsquo;s a match for its training data distribution. Memorization works, as long as you don&rsquo;t need to adapt to novelty.&rdquo;</p>

</blockquote>
<p>In the real world, the study that impressed me most was the <a href="https://arxiv.org/abs/2507.09089"target="_blank" rel="noopener">METR RCT</a>: 16 experienced developers, 246 real tasks on their own mature repositories, randomized with and without AI. The devs bet AI would speed them up by 24%. Measured: <strong>it was 19% slower</strong>. Notice where this happened: mature, private code, full of context the model never saw. Exactly the blind spot.</p>
<p>And the industry&rsquo;s favorite benchmark for saying &ldquo;AI already does software engineering,&rdquo; SWE-bench, is Python-only, 12 famous open source repositories, in other words the most covered slice of training. The industry&rsquo;s success metric measures mapped territory.</p>
<p>Even the legacy code literature says the same thing: a <a href="https://arxiv.org/abs/2604.03986"target="_blank" rel="noopener">2026 paper on LLMs generating COBOL</a> states that, in these legacy languages, <em>&ldquo;most production code resides in enterprise systems and is rarely publicly available&rdquo;</em>. It&rsquo;s this article&rsquo;s thesis, said by other people.</p>
<h2>The Steelman: Directed Brute Force Works, at a Steep Price<span class="hx:absolute hx:-mt-20" id="the-steelman-directed-brute-force-works-at-a-steep-price"></span>
    <a href="#the-steelman-directed-brute-force-works-at-a-steep-price" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p>Before wrapping up, it&rsquo;s worth facing the strongest argument against me. That&rsquo;s what steelman means, for anyone unfamiliar with the term: the opposite of a strawman. Instead of attacking the weakest version of the opposing argument, you answer the strongest version it can have. And it exists, and it&rsquo;s a good one.</p>
<p>In May 2025 DeepMind published <a href="https://deepmind.google/discover/blog/alphaevolve-a-gemini-powered-coding-agent-for-designing-advanced-algorithms/"target="_blank" rel="noopener">AlphaEvolve</a>: a system that found an algorithm for multiplying 4x4 complex matrices with 48 scalar multiplications, beating Strassen&rsquo;s 1969 record in that specific scenario. On a list of more than 50 open math problems, it rediscovered the state of the art in ~75% of cases and improved the best known solution in 20%. That&rsquo;s real novelty, not reproduction.</p>
<p>OpenAI&rsquo;s o3-preview jumped to 75.7% on ARC-AGI-1 in December 2024, 22 points above the previous best result on the same evaluation set, and the high-compute configuration reached 87.5% at an estimated cost of $4,560 per task.</p>
<p>And back in 2016 AlphaGo played move 37 against Lee Sedol, a move that DeepMind&rsquo;s own data estimated had a 1 in 10,000 chance of being played by a human, proving that search over a model can transcend imitation.</p>
<p>Now look at the mechanism of the three:</p>
<ul>
<li>AlphaEvolve is an evolutionary loop: the LLM proposes mutations, an automatic evaluator scores them, selection iterates.</li>
<li>o3 does program synthesis at test time, exploring the solution space.</li>
<li>AlphaGo is tree search over reinforcement learning.</li>
</ul>
<p>If there was any &ldquo;insight&rdquo; in any of them, it came from the search system around the model: all three are <strong>directed brute force with a cheap verifier</strong>, the same mechanism I described happening in my projects. The difference is that DeepMind has a perfect oracle and an infinite budget: in the configuration that reached 87.5%, o3-preview spent thousands of dollars per ARC task to do what a human does for free. The ARC Prize itself wrote the caveat:</p>
<blockquote>
  <p><em>&ldquo;We know that brute-force search could eventually solve ARC-AGI (given unlimited resources and time to search). This would not represent true intelligence.&rdquo;</em></p>

</blockquote>
<p>In short: novelty comes out, but it comes out through expensive search over an oracle, on the basis of guided trial and error. If your problem has a cheap verifier and you have tokens to burn, you can go far. That&rsquo;s how nes-to-sms got where it got: 668 tests and emulator ground truth holding up every step. But when there&rsquo;s no oracle, no corpus, and no reference, you&rsquo;re paying for brute force in dollars, with regressions along the way, and the ceiling shows up.</p>
<p>And when brute force wins, you can measure the size of the trial and error. Two recent cases I already covered <a href="/en/2026/09/09/propagandas-enganosas-da-openai-anthropic-nvidia/">in detail here on the blog</a>:</p>
<ul>
<li><strong>OpenAI&rsquo;s Navier-Stokes proof:</strong> about 10 thousand agents running in parallel for 88 hours, burning around <strong>130 billion output tokens</strong> on a single problem. OpenAI&rsquo;s Noam Brown confirmed the result &ldquo;cost millions,&rdquo; and <a href="https://www.newscientist.com/article/2588063-openai-has-solved-the-navier-stokes-millennium-problem-using-15m-of-ai-effort/"target="_blank" rel="noopener">New Scientist estimated some $15 million at list price</a>. And even that mountain of compute didn&rsquo;t start from zero: the proof leaned on the machinery human mathematicians published over decades attacking the problem and its sibling problems. Without the humans&rsquo; map and without OpenAI&rsquo;s budget, there&rsquo;s no proof.</li>
<li><strong>The Hugging Face incident:</strong> the forensic reconstruction counted <strong>~17,600 attacker actions</strong> before the agents managed to execute code on 41 Hugging Face production servers and get root; on top of that, inside OpenAI&rsquo;s own environment, they read 956 secrets from the company&rsquo;s secrets manager. It wasn&rsquo;t one brilliant single-strike insight: it was a swarm executing attempt after attempt, with automatic verification saying what stuck. The headline&rsquo;s &ldquo;intelligence&rdquo; is volume.</li>
</ul>
<p>That&rsquo;s the size of the bill when you force the model outside training territory: trial and error at industrial scale, with no guarantee the search finds what you need. And who can sign that check is half a dozen companies in the world, OpenAI and Anthropic level, with a practically unlimited compute budget. For the average Joe, with a credit card and an API key, the ceiling arrives much, much earlier.</p>
<h2>But Isn&rsquo;t Trial and Error New Learning?<span class="hx:absolute hx:-mt-20" id="but-isnt-trial-and-error-new-learning"></span>
    <a href="#but-isnt-trial-and-error-new-learning" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p>Here&rsquo;s a confusion I see all the time, and it&rsquo;s worth undoing because it contaminates how you read everything I&rsquo;ve written so far.</p>
<p>When you read that Anthropic has datacenters the size of cities, you get the feeling there&rsquo;s one giant AI using all those machines at the same time, thinking, accumulating experience with every interaction. Reality is far more mediocre than that.</p>
<p>A model like Fable or Astra is a computer file. A static file, not even a database: once training and post-alignment are done, that file is locked and read-only. What runs in the datacenter are copies of that file. Every user consuming the model is running a copy of it on a different server, isolated from the others, collaborating with none. Your session doesn&rsquo;t talk to anyone else&rsquo;s session, and nothing that happens in it flows back to the original file.</p>
<p>New learning only enters in one place: the next training batch. When Anthropic had Opus 4.7 and released 4.8, that&rsquo;s when new knowledge got baked into the model, in a process that costs millions and takes weeks. Outside of that, the file doesn&rsquo;t change a single byte.</p>
<blockquote>
  <p>Your agent burning millions of tokens on trial and error is contributing exactly zero new learning to the model it&rsquo;s using.</p>

</blockquote>
<p>That 176-commit marathon on nes-to-sms? From the model&rsquo;s point of view, it never happened. The Opus that ran the last commit knew exactly as much as the one that ran the first. I&rsquo;m the one who learned something, not it. And that&rsquo;s why the &ldquo;intern who learns over time&rdquo; metaphor is wrong: interns accumulate. Models don&rsquo;t. What accumulates over the marathon is your context, your notes, your <code>CLAUDE.md</code>, your tests. The asset you build is yours, and it evaporates if you don&rsquo;t document it.</p>
<p>This is also the answer to whoever thinks &ldquo;just let the agent run and it&rsquo;ll learn the domain.&rdquo; It learns no domain at all: it explores the space with knowledge frozen on training day, and the next morning it wakes up with amnesia. If the domain wasn&rsquo;t in the training, every session of yours restarts from absolute zero, and all the navigation intelligence has to come from you again.</p>
<h3>&ldquo;But What If AI Trains AI?&rdquo;<span class="hx:absolute hx:-mt-20" id="but-what-if-ai-trains-ai"></span>
    <a href="#but-what-if-ai-trains-ai" class="subheading-anchor" aria-label="Permalink for this section"></a></h3><p>That&rsquo;s the amateur&rsquo;s follow-up question, and it starts from a wrong premise: that this would be new. AI training AI has existed for decades and has a name: <strong>reinforcement learning</strong>. AlphaGo was already doing it in 2016, playing millions of matches against itself. <a href="https://arxiv.org/abs/1712.01815"target="_blank" rel="noopener">AlphaZero</a>, in 2017, took the idea to the limit: it learned chess, shogi and Go starting from absolute zero, knowing only each game&rsquo;s rules, and reached superhuman level within hours of self-play, without seeing a single human match.</p>
<p>LLMs already use reinforcement too. The RLHF that turns a base model into an assistant is reinforcement learning, and the reasoning model generation pushed it further: <a href="https://arxiv.org/abs/2501.12948"target="_blank" rel="noopener">DeepSeek-R1-Zero</a> showed in January 2025 that reasoning behavior (self-verification, reflection, long chains of thought) emerges from pure RL, with no supervised fine-tuning. It&rsquo;s AlphaZero applied to math and code.</p>
<p>Now notice what these examples have in common: it only works where there&rsquo;s a <strong>cheap, verifiable reward</strong>. Games have a scoreboard, math has proofs, code has tests. Outside that territory there&rsquo;s nowhere to get the reward signal from. It&rsquo;s the same oracle from the steelman, only institutionalized: effective, brutally expensive, and niche. AlphaZero plays Go better than any human who ever lived and can&rsquo;t do absolutely anything else.</p>
<p>And there&rsquo;s the detail that knocks the question down completely: all of that learning happens <strong>in the lab, during training</strong>. The AlphaZero DeepMind showed the world was already a frozen artifact. The R1 you download is a static file just like the others.</p>
<blockquote>
  <p>AI training AI produces a new file. The file, once released, still learns nothing.</p>

</blockquote>
<p>In other words, the most sophisticated version of the objection doesn&rsquo;t weaken this section&rsquo;s conclusion: it reinforces it. And the market already knows. Since late 2024 the labs admit, on and off the record, that scaling returns are shrinking: <a href="https://www.reuters.com/technology/artificial-intelligence/openai-others-seek-new-path-smarter-ai-current-methods-hit-limitations-2024-11-11/"target="_blank" rel="noopener">Reuters reported in November 2024</a> that OpenAI, Google and Anthropic were reaping smaller gains than expected from pre-training, with OpenAI&rsquo;s Orion disappointing enough to be demoted from GPT-5 to GPT-4.5. Ilya Sutskever, the guy who basically invented the scaling thesis, took the stage at <a href="https://www.youtube.com/watch?v=WQQdd6qGxNs"target="_blank" rel="noopener">NeurIPS 2024</a> to declare that &ldquo;pre-training as we know it will end&rdquo;: public data is fossil fuel, and we&rsquo;ve already scraped the bottom. Post-training RL gains are real, but incremental. The era of an order-of-magnitude leap per generation is behind us.</p>
<h2>Where This Leaves the Profession<span class="hx:absolute hx:-mt-20" id="where-this-leaves-the-profession"></span>
    <a href="#where-this-leaves-the-profession" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p>The question that motivated this article is the one I hear every week: &ldquo;will LLMs replace programmers?&rdquo; My answer got more precise after these months: <strong>they will replace the part of the work that is reproduction</strong>.</p>
<p>And that part is big. Forms, reports, CRUD, integration with documented APIs, framework migration: all of that already exists a thousand times in training, and the machine reproduces it better than most humans. Anyone who only does that really is living on borrowed time.</p>
<p>But the work that is genuinely new stays human:</p>
<ul>
<li>the system nobody has built;</li>
<li>the domain without documentation;</li>
<li>the proprietary code you can&rsquo;t show the model;</li>
<li>the problem where you don&rsquo;t even know how to write the test that defines &ldquo;right&rdquo;.</li>
</ul>
<p>All of that depends on what was never published: the invariant that exists in the head of whoever understands the problem, and not in the instruction stream.</p>
<p>I confess there was a moment when I thought the bill would close on the legacy side: finally a tool capable of dealing with the COBOL that haunts banks and governments to this day. After these months, I think that problem will take much longer than it seemed. There&rsquo;s no giant COBOL open source community. Almost all of that code is private, and truly private: banks, insurers, governments. There&rsquo;s no training material, or very little of it. The model doesn&rsquo;t know what to do with code it has never seen, and production COBOL is almost entirely code it has never seen.</p>
<p>To close the reasoning: <strong>LLMs can replicate what&rsquo;s open, but they can&rsquo;t guess what&rsquo;s private.</strong> And that brings back the hypothesis from the introduction. If these models are good at code, it&rsquo;s because decades of open source community fought to keep code free, public, and reusable, and providers trained on top of that heritage without paying a cent of licensing for it. The least the AI industry owes the world is to acknowledge that: its capability is, to a large extent, our generosity compiled.</p>
<p>The final irony: the programmer who survives is precisely the one who knows how to build oracles, define tests, hunt down obscure references, and recognize when the agent started spinning. In other words, the skill the machine needs most from you is the one it can least learn from its training. For now, that&rsquo;s not a threatened job. It&rsquo;s a different job.</p>
]]></content:encoded><category>llms</category><category>coding-agents</category><category>retrocomputing</category><category>software-engineering</category></item><item><title>AI Challenge: Converting NES ROMs to the Master System/SMS</title><link>https://akitaonrails.github.io/en/2026/09/07/ai-challenge-converting-nes-roms-to-master-system-sms/</link><guid isPermaLink="true">https://akitaonrails.github.io/en/2026/09/07/ai-challenge-converting-nes-roms-to-master-system-sms/</guid><pubDate>Mon, 07 Sep 2026 14:00:00 -0300</pubDate><description>&lt;p&gt;For many years I had a fixed idea in my head, and I always thought it wasn&amp;rsquo;t practical: converting NES games to run on the Master System.&lt;/p&gt;
&lt;p&gt;Let me be precise. I always knew it could be done. Two Turing-complete machines can, in theory, run each other&amp;rsquo;s code. You can always translate a program from one architecture to another. The problem was never possibility, it was cost. The NES runs a 6502, the Master System runs a Z80, and over the years I read in several places that a direct 6502-to-Z80 translation always ended up running much slower, because of the architecture and hardware differences. Slow enough to never pay off in practice.&lt;/p&gt;</description><content:encoded><![CDATA[<p>For many years I had a fixed idea in my head, and I always thought it wasn&rsquo;t practical: converting NES games to run on the Master System.</p>
<p>Let me be precise. I always knew it could be done. Two Turing-complete machines can, in theory, run each other&rsquo;s code. You can always translate a program from one architecture to another. The problem was never possibility, it was cost. The NES runs a 6502, the Master System runs a Z80, and over the years I read in several places that a direct 6502-to-Z80 translation always ended up running much slower, because of the architecture and hardware differences. Slow enough to never pay off in practice.</p>
<p>And that memory has a basis. If you dig into retro-dev forums, like <a href="https://forums.nesdev.org/viewtopic.php?t=17339"target="_blank" rel="noopener">NESdev</a>, the consensus is that translating instruction by instruction is exactly the worst path: &ldquo;each instruction in the source code becomes multiple instructions of object code, and the resulting program runs much slower and takes much more memory.&rdquo; It&rsquo;s not just the CPU. The 6502 has the zero page, a dirt-cheap addressing mode the Z80 has no equivalent for, so you trade a cheap access for an expensive sequence with <code>IX</code>/<code>IY</code>. And the graphics part is even worse: the NES PPU and the Master System VDP are different beasts, with scroll, sprites, and screen mirroring that don&rsquo;t fit into each other without expensive workarounds.</p>
<p>In other words, everyone who ever thought about this reached the same conclusion: it can be done, but it runs too badly to be worth it.</p>
<p>Except now we have frontier LLMs. And I got curious: could a brute-force approach, with a good LLM in the middle of the process, get a better result than the usual naive translation? I started the <a href="https://github.com/akitaonrails/nes-to-sms"target="_blank" rel="noopener">nes-to-sms</a> project in late May, about three months ago, to find out.</p>
<p>The first result was exactly what the theory predicted: bad. A more or less direct translation generated code that runs, but way too slow. I managed to convert the entire Super Mario Bros, with sprites, levels, everything, but to make it minimally playable I had to run the Mednafen emulator at 500% overclock. After banging my head against Claude, GPT, and other models for a while, I got stuck. I worked hard through June and July, and in August I paused the project to let the dust settle.</p>
<h2>Why the Master System, and not the NES?<span class="hx:absolute hx:-mt-20" id="why-the-master-system-and-not-the-nes"></span>
    <a href="#why-the-master-system-and-not-the-nes" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p>Before explaining the technical part, I need to explain the obsession, because it is the reason for everything.</p>
<p>I always thought the Master System was a superior console to the NES. Better CPU, better video chip, a much richer color palette. The NES works with 4 colors per background tile and 3 per sprite. The Master System works with 16-color palettes. That is a huge difference in practice.</p>
<p>The problem is that Nintendo had a brutal monopoly back then and would not let third parties release for other consoles. Anyone who wanted to make a game for the NES signed an exclusivity contract. The result is that the Master System, technically better, ended up starved of games. Basically only Sega itself released for it, and Sega&rsquo;s library never had the weight of a Castlevania, a Mega Man, a Final Fantasy.</p>
<p>Imagine what we lost. We could have had those same NES classics, but with the Master System&rsquo;s superior capability underneath. A Castlevania with more color, better sprites, better sound. We never had that, and it is exactly this historical frustration that made me want to convert NES to SMS in the first place.</p>
<h2>The port that proved the thesis<span class="hx:absolute hx:-mt-20" id="the-port-that-proved-the-thesis"></span>
    <a href="#the-port-that-proved-the-thesis" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p>While my project was paused, another developer, <a href="https://github.com/lackoftrack27/Super-Mario-Bros.-SMS"target="_blank" rel="noopener">lackoftrack27</a>, published a Super Mario Bros port for the Master System that is on another level. It runs at full speed, 60fps, and on top of that with improved sprite art that takes advantage of the console&rsquo;s superior palette. It ended up looking more like the Super Mario All-Stars remaster from the Super Nintendo than the somewhat crude original NES version. The retro community was in awe.</p>


<div class="embed-container">
  <iframe
    src="https://www.youtube.com/embed/igOu1NQL5Ww"
    title="YouTube video player"
    frameborder="0"
    allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share"
    referrerpolicy="strict-origin-when-cross-origin"
    allowfullscreen>
  </iframe>
</div>

<p>That proved my thesis in practice: the Master System is capable of running superior versions of NES games. It always was.</p>
<p>Now, two honest points about this port, because they matter for the rest of the story.</p>
<p>First: lackoftrack27&rsquo;s work is a hand reimplementation, built from the game&rsquo;s disassembly, optimized specifically for Super Mario. It&rsquo;s not a general-purpose automatic translation like the one I&rsquo;m trying to do. He solved one game, beautifully, by hand. Curiously, that reinforces what the forums already said: the path that works is reimplementing by hand, not machine-translating.</p>
<p>Second: as impressive as it is to see Super Mario on the Master System, it&rsquo;s worth remembering it is still a first-generation game, around 40kb. Meaning it is one of the simpler games on the NES. Later-generation stuff, like Super Mario Bros 3 or Kirby, nobody has tried to convert yet, and for good reasons I explain further down.</p>
<p>But the most important thing was the side effect: with the map his port gave me, I finally got my automatic conversion running properly. I came back to the project in early September, loaded lackoftrack27&rsquo;s code into Claude Fable and then the new GPT Astra, and put both of them to study what he did that I wasn&rsquo;t doing.</p>
<h2>The architecture of the solution<span class="hx:absolute hx:-mt-20" id="the-architecture-of-the-solution"></span>
    <a href="#the-architecture-of-the-solution" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p>Since this article is for programmers, let me open the black box.</p>
<p>The first important decision is that <code>nes-to-sms</code> is not an emulator, nor a text-to-text translator of 6502 to Z80. It is a <strong>static recompiler</strong>. It reads the NES ROM, lifts the 6502 code into an intermediate representation with explicit semantics, and from that IR it generates Z80 code. The output is a WLA-DX assembly project that compiles into a real <code>.sms</code> ROM. The core is a Rust workspace with thirteen crates, plus a hand-written Z80 runtime shared across games.</p>
<p>The flow, end to end, goes roughly like this:</p>
<ol>
<li>Parse the ROM header, split the code banks (PRG) from the tile banks (CHR), and read the reset and interrupt vectors.</li>
<li>Load a per-game profile (a TOML with labels, data regions, jump tables, mapper type, and replacements).</li>
<li>Discover the functions, build the control-flow graph, and classify every byte as code or data. A key detail enters here: every memory access is tagged with the region it belongs to (zero page, stack, RAM, PPU registers, sprite DMA, sound, mapper).</li>
<li>Lift each routine into IR, with the 6502 flags explicit. A write to the PPU register <code>$2006</code> doesn&rsquo;t become just some <code>mem[]=</code>, it becomes a first-class &ldquo;PPU write&rdquo; primitive.</li>
<li>Lower the IR to Z80. The 6502 flags are kept in a shadow status byte in RAM, and every hardware access becomes a call into the runtime.</li>
<li>Emit the Z80 bytes and also the readable WLA-DX assembly.</li>
<li>Convert the assets: the NES 2bpp tiles become SMS mode-4 4bpp tiles, the NES palette becomes SMS CRAM, and so on.</li>
<li>Write the whole SMS project, with a Makefile, runtime, and data, ready to compile.</li>
</ol>
<p>The CPU mapping is conservative on purpose. The 6502 accumulator <code>A</code> becomes the Z80 <code>A</code>, the <code>X</code> and <code>Y</code> registers live in RAM or registers, the zero page becomes a fixed block in SMS RAM, and every operation that touches a flag calls a helper. It&rsquo;s safe and correct, but this is exactly where the cost lives.</p>
<h2>Where NES and SMS really diverge<span class="hx:absolute hx:-mt-20" id="where-nes-and-sms-really-diverge"></span>
    <a href="#where-nes-and-sms-really-diverge" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p>The project&rsquo;s central finding is about speed, and it&rsquo;s counterintuitive.</p>
<p>The NES 6502 runs at 1.79 MHz. The Master System Z80 runs at 3.58 MHz, double the clock. You look at that and think &ldquo;so there&rsquo;s plenty of headroom.&rdquo; Except no. The Z80 spends on average about 13 cycles per instruction, while the 6502 spends about 4. In real numbers, a 3.5 MHz Z80 is roughly equivalent to a 1 MHz 6502 for general work. Meaning the SMS Z80 is actually <strong>slower</strong> than the NES 6502 for the same work. The headroom is negative.</p>
<p>Worse: the cheapest 6502 idiom, an <code>LDA table,X</code>, is one of the most expensive to emulate on the Z80. So a faithful translation of a game that already squeezed the NES to the limit simply cannot hit 60fps without overclock. The blame is on the physics of the problem, not on my translator.</p>
<p>And the video is another story. The NES sees video memory in a mapped way, with nametables, hardware scroll, and a sprite table accessed via DMA. The SMS Z80 does not address VRAM as memory: it sets an address latch and streams bytes through VDP ports. So every NES PPU write has to be captured, queued in a buffer, and flushed to the VDP during vblank. The NES flips a sprite for free, just by setting an attribute bit. The Master System has no hardware sprite flipping, so the program has to mirror the tile data in VRAM by hand, burning memory. The mid-frame screen split that NES games do, changing the scroll each scanline, also has no direct equivalent, because the VDP latches the vertical scroll at the top of the frame.</p>
<p>And there&rsquo;s still the VRAM ceiling. Super Mario&rsquo;s 8 KB of tiles become 16 KB in the SMS 4bpp format, which is the console&rsquo;s entire VRAM. Background and sprites can&rsquo;t both stay resident at once. And the code balloons 3 to 6 times in size, which is why the SMS output is already banked from the very first game, even the simplest ones.</p>
<h2>Leveraging what the SMS does best<span class="hx:absolute hx:-mt-20" id="leveraging-what-the-sms-does-best"></span>
    <a href="#leveraging-what-the-sms-does-best" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p>The trick to recover speed is to stop emulating NES behavior and start spending the Master System&rsquo;s strengths. The project&rsquo;s motto became &ldquo;spend ROM to buy CPU.&rdquo;</p>
<p>The SMS accepts cartridges of several megabytes. So instead of mirroring a sprite by hand at runtime, the build already generates pre-flipped variants of each sprite tile, and the flip becomes a table lookup. Instead of emulating the NES attribute table, the assembler already writes the final SMS nametable word, with the flip, palette, and priority bits baked in. The NES attribute table simply stops existing in the program. The copies to the VDP use unrolled <code>OUTI</code> blocks, faster than the generic loop. And the status-bar split, which on the NES depends on sprite-zero, becomes an SMS line interrupt, which is the native way to do it.</p>
<p>None of this is magic. The negative CPU headroom is still there, so these optimizations reduce the cost but don&rsquo;t work miracles on their own. But it&rsquo;s the difference between unplayable and playable.</p>
<h2>The real trick: making the AI run the emulator<span class="hx:absolute hx:-mt-20" id="the-real-trick-making-the-ai-run-the-emulator"></span>
    <a href="#the-real-trick-making-the-ai-run-the-emulator" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p>Here&rsquo;s the part I consider the most important of the whole project, and it&rsquo;s what separated the failed attempt from May from the version that finally moves.</p>
<p>Blind translation doesn&rsquo;t work. The model needs real feedback to know what&rsquo;s broken and what&rsquo;s slow. So the heart of the project is the <strong>differential oracle</strong>, the infrastructure that runs the emulators and measures reality. The translator is just the easy part.</p>
<p>It works in two layers. The first compares instruction by instruction: for each routine, the system generates random initial states, runs the original 6502 in a reference interpreter and runs the generated Z80, and compares the result (accumulator, registers, flags, touched RAM). Any divergence raises a flag. The second layer compares frame by frame: it runs the NES ROM as absolute ground truth and the SMS build side by side, with the same button script, and compares RAM byte by byte on every frame. That was later extended with an oracle that checks the SMS VRAM and palette, and with a visual oracle that compares the output against the real NES frame.</p>
<p>This measurement loop is what unlocked the recent fixes. It wasn&rsquo;t guesswork. Two concrete examples:</p>
<p>In Super Mario, every optimization step was measured in cycles per frame, with the emulator actually running. A frame&rsquo;s budget is 59,736 cycles. The baseline sat at around 370 thousand cycles per frame, something like 6 times over budget, which gave about 10fps and explained the need for that brutal 500% overclock. Measuring step by step, each change validated by the oracle, it dropped to 118,296 cycles per frame, or 1.98 times the budget. It went from 6 times to under 2 times. It now runs at full speed already in the emulator&rsquo;s standard overclock, and it&rsquo;s comfortable in the 200 to 300% range, versus the 500 to 700% from the start.</p>
<p>In Castlevania, the biggest speed win came from a profile only the emulator could reveal: a sprite-zero wait loop, at address <code>$F8C7</code>, was doing 255 status reads and exiting by timeout every single time, consuming almost 23% of the entire CPU. Without running the emulator and measuring, nobody would find this by eye. With the measurement, the fix was surgical.</p>
<p>This is the bigger argument I&rsquo;ve been hammering for a while about agents: an LLM that only generates code in the dark makes big mistakes. An LLM that can actually run the target, collect real data, and react to what it measured plays in another league.</p>
<h2>What I learned studying lackoftrack27&rsquo;s port<span class="hx:absolute hx:-mt-20" id="what-i-learned-studying-lackoftrack27s-port"></span>
    <a href="#what-i-learned-studying-lackoftrack27s-port" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p>With that oracle in place, I put Claude Fable and GPT Astra to dissect lackoftrack27&rsquo;s port, which is a reimplementation of the same game from the same disassembly I translate. That settled once and for all a doubt that was blocking me: Super Mario fits on the Master System. My 6-times overrun on the budget was 100% translation overhead, not a limitation of the game or the hardware.</p>
<p>His wins, in order of impact, were roughly these:</p>
<ul>
<li><strong>The biggest of all: the data representation.</strong> He reorganized the game&rsquo;s object arrays into RAM pages, one per slot, with the same field offsets. Then the 6502&rsquo;s <code>X</code> becomes the register <code>H</code> and the field name becomes <code>L</code>, and an access that cost about 70 time units in my translator now costs 14. The cruel detail is that this only works because the programmer knows, from memory, that this particular <code>X</code> is always an object index between 0 and 6. A static translator has no way to safely discover that invariant. This is the most powerful optimization, and it&rsquo;s precisely the one automatic translation can&rsquo;t prove on its own. It&rsquo;s the residual that holds back the last 2 times in speed.</li>
<li><strong>Flags audited, not emulated.</strong> He checked the code and found only about 10 places that genuinely depend on some 6502 carry quirk. The rest uses the Z80&rsquo;s native flags. That confirmed a measurement of mine: spending energy emulating flags yields almost nothing.</li>
<li><strong>Native calls.</strong> <code>JSR</code> becoming a real <code>CALL</code>, without the expensive emulated-stack bookkeeping. That was the biggest generic win I ported over to my pipeline.</li>
<li><strong>PPU deleted at build time</strong>, not emulated at runtime, exactly as I described in the section on leveraging the SMS.</li>
<li><strong>Frame architected to overrun gracefully</strong>, turning an overrun into a clean lag frame instead of corrupting the screen.</li>
</ul>
<p>I adopted what could be generalized, and Super Mario dropped from 6 times to under 2 times the budget. This is the result running today:</p>
<div class="embed-container">
  <video controls preload="metadata" playsinline style="position:absolute;top:0;left:0;width:100%;height:100%;border:0;background:#000;">
    <source src="https://new-uploads-akitaonrails.s3.us-east-2.amazonaws.com/20260907152243_smb-sms-conversion.mp4" type="video/mp4">
  </video>
</div>
<p>The most honest lesson from this study is twofold. The real wins are in the data representation and the calling convention, not in what I had attacked first. And the deepest win of all is exactly what the automatic translator can&rsquo;t infer. That draws the ceiling of what can be automated pretty clearly.</p>
<h2>Castlevania and the mapper problem<span class="hx:absolute hx:-mt-20" id="castlevania-and-the-mapper-problem"></span>
    <a href="#castlevania-and-the-mapper-problem" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p>With Super Mario moving, I went back to my old target: the first Castlevania. And here we hit the NES&rsquo;s most serious limitation.</p>
<p>The NES is a simple console, with a bunch of limits. One of the main ones is that it doesn&rsquo;t support games bigger than about 40kb of ROM, because the 6502 only sees a 32 KB window of program in its address space. The &ldquo;solution&rdquo; from back then was brilliant and a bit crazy: parts of the console were being upgraded by the cartridge itself.</p>
<p>Many people think a cartridge is just a ROM chip with the game code. In the NES case, it&rsquo;s not. The cartridges came with a variety of extra chips that increased the console&rsquo;s capability, be it a better sound chip or, much more commonly, the <strong>mappers</strong>. There are several different mappers, from Nintendo itself and from third parties like Capcom and Konami. They use a technique called <strong>bank switching</strong>: since the 6502 can&rsquo;t see enough address space, the mapper swaps which pieces of ROM are visible in that 32 KB window, as the game asks. That&rsquo;s how big games fit into a console that, on paper, couldn&rsquo;t handle them.</p>
<p>I already explained this in detail in an old video from my channel, <a href="/2020/06/18/akitando-81-aprendendo-sobre-computadores-com-super-mario-do-jeito-hardcore/">Akitando #81, about learning computing with Super Mario the hardcore way</a>:</p>


<div class="embed-container">
  <iframe
    src="https://www.youtube.com/embed/hYJ3dvHjeOE"
    title="YouTube video player"
    frameborder="0"
    allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share"
    referrerpolicy="strict-origin-when-cross-origin"
    allowfullscreen>
  </iframe>
</div>

<p>Castlevania uses one of the earlier mappers, the UxROM. And here is the scale problem of my project: if I want to be able to translate the majority of NES games, I have to map every mapper, one by one. Today the project implements only two: the NROM, which is Super Mario&rsquo;s bare cartridge, and Castlevania&rsquo;s UxROM. All the others, the MMC1, MMC3, and company, are only planned. Each mapper is quite a bit of work to implement, because it&rsquo;s not enough to understand the NES bank switching, you have to translate that behavior into the Master System&rsquo;s own mapper.</p>
<p>The good news is that the Master System is also a banked system, so the mapping is &ldquo;the same shape one level up.&rdquo; A NES PRG bank becomes a set of SMS banks, a NES bank-switch write becomes a write to the SMS mapper through a shim, and a call that crosses banks uses the &ldquo;gate&rdquo; machinery that already exists. A routine&rsquo;s identity becomes the pair (bank, address), and a dispatch table resolves that at runtime. When it doesn&rsquo;t find it, it fails closed, with a trap, instead of running garbage.</p>
<p>This is where bigger games will hit the wall. The tile bank switching of the more advanced mappers, the scanline interrupt timing of the MMC3 and MMC5, and the SMS&rsquo;s own bank ceiling for a really big NES game, all of that is still unsolved. That&rsquo;s why I still can&rsquo;t say whether a Super Mario Bros 3 is viable or not. It&rsquo;s quite possible the bigger games die exactly at this step.</p>
<p>Either way, I worked a good bit more on Castlevania in this comeback. I fixed a pile of things using the oracle: the sprite-zero loop that ate CPU, the weapon and projectile logic that lost call returns, a scroll glitch in the status bar, the VRAM collision between 8x16 and 8x8 sprites, and the coherence between background, palette, HUD, and sprites. Today Castlevania boots, accepts start, draws a recognizable first stage, responds to the controller, and runs for a good while without crashing. But it&rsquo;s honest to say it still runs slowly, and the path I use to play it is Mednafen at 500% overclock, and even then it&rsquo;s still 2 to 3 times below its own speed target. It&rsquo;s far from pixel-perfect and real-time.</p>
<div class="embed-container">
  <video controls preload="metadata" playsinline style="position:absolute;top:0;left:0;width:100%;height:100%;border:0;background:#000;">
    <source src="https://new-uploads-akitaonrails.s3.us-east-2.amazonaws.com/20260907152243_castlevania-sms-conversion.mp4" type="video/mp4">
  </video>
</div>
<h2>Conclusion<span class="hx:absolute hx:-mt-20" id="conclusion"></span>
    <a href="#conclusion" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p>After so many weeks and so many attempts, I still don&rsquo;t know how much more can be squeezed out of an automatic translation. The ceiling might be close, because the deepest optimizations are precisely the ones a machine can&rsquo;t infer on its own.</p>
<p>But there&rsquo;s a path that excites me. The automatic translation can become a baseline. An SMS conversion that already runs, correct, even if slow, and that can later be optimized by hand, game by game, exactly like lackoftrack27 did with Super Mario and like so many people have been doing with decompilations and ports out there. The oracle guarantees the base is correct, and the human hand steps in to do what the machine can&rsquo;t.</p>
<p>Porting a game to much better hardware, like a PC port, is relatively easy, because there&rsquo;s capacity to spare. The truly hard part is fitting the game into a same-generation console, where nothing is to spare. And it&rsquo;s exactly that difficulty that makes the idea of making better versions of NES games for the Master System so appealing. It&rsquo;s the console that deserved to have had those games, and never did.</p>
<p>I hope more people get excited about this possibility and contribute to the project. It&rsquo;s all open at <a href="https://github.com/akitaonrails/nes-to-sms"target="_blank" rel="noopener">nes-to-sms</a>. If you enjoy 6502, Z80, VDP, and the challenge of squeezing cycles out of 40-year-old hardware, come by. There&rsquo;s plenty of room.</p>
]]></content:encoded><category>retrocomputing</category><category>coding-agents</category><category>gaming</category><category>emulation</category></item><item><title>Computing History and Retro Dev on YouTube</title><link>https://akitaonrails.github.io/en/2025/05/19/computing-history-and-retro-dev-on-youtube/</link><guid isPermaLink="true">https://akitaonrails.github.io/en/2025/05/19/computing-history-and-retro-dev-on-youtube/</guid><pubDate>Mon, 19 May 2025 15:19:00 -0300</pubDate><description>&lt;p&gt;I watch a LOT of YouTube, and I&amp;rsquo;m always sharing cool stuff I watch on my X and Instagram (follow me there). There are several videos I keep coming back to.&lt;/p&gt;
&lt;p&gt;I finally decided to compile a list with the channels I watch the most, along with a list of the main playlists and example videos from each channel that I recommend watching.&lt;/p&gt;
&lt;p&gt;I&amp;rsquo;ll probably keep coming back to this page to update it from time to time. If anyone remembers one I forgot, send it in the comments. There are channels like GameSack, Sega Lord X, Retro Game Corp, Wullfden, Macho Nacho Productions, and several others I didn&amp;rsquo;t list, because they lean more toward &amp;ldquo;reviews&amp;rdquo; and don&amp;rsquo;t overlap as much with &amp;ldquo;dev&amp;rdquo;. I tried to focus on things I think a &amp;ldquo;dev&amp;rdquo; should know.&lt;/p&gt;</description><content:encoded><![CDATA[<p>I watch a LOT of YouTube, and I&rsquo;m always sharing cool stuff I watch on my X and Instagram (follow me there). There are several videos I keep coming back to.</p>
<p>I finally decided to compile a list with the channels I watch the most, along with a list of the main playlists and example videos from each channel that I recommend watching.</p>
<p>I&rsquo;ll probably keep coming back to this page to update it from time to time. If anyone remembers one I forgot, send it in the comments. There are channels like GameSack, Sega Lord X, Retro Game Corp, Wullfden, Macho Nacho Productions, and several others I didn&rsquo;t list, because they lean more toward &ldquo;reviews&rdquo; and don&rsquo;t overlap as much with &ldquo;dev&rdquo;. I tried to focus on things I think a &ldquo;dev&rdquo; should know.</p>
<h2>List (2025-05-19)<span class="hx:absolute hx:-mt-20" id="list-2025-05-19"></span>
    <a href="#list-2025-05-19" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><ul>
<li><a href="https://www.youtube.com/@UsagiElectric"target="_blank" rel="noopener">Usagi Electric</a>
<ul>
<li>Playlists:
<ul>
<li><a href="https://www.youtube.com/watch?v=-RGp-bsYf34&amp;list=PLnw98JPyObn3QSIwUz5Iv6NA1x-uGFqAa&amp;pp=0gcJCV8EOCosWNin"target="_blank" rel="noopener">Bendix G15 Vacuum Tube</a></li>
<li><a href="https://www.youtube.com/watch?v=EbWcgepRmY4&amp;list=PLnw98JPyObn2PqgY1mfzXOtnUXlsXSMch"target="_blank" rel="noopener">Data General Nova</a></li>
<li><a href="https://www.youtube.com/watch?v=SB95dlrS5kU&amp;list=PLnw98JPyObn2Kj-rqrKqEB5xmS_uOV40f"target="_blank" rel="noopener">DEC/PDP-11</a></li>
<li><a href="https://www.youtube.com/watch?v=oPA8dHtf_6M&amp;list=PLnw98JPyObn1GUapiXLlGm8RrpQF-J_c1"target="_blank" rel="noopener">1-Bit Computer</a></li>
</ul>
</li>
</ul>
</li>
<li><a href="https://www.youtube.com/@TechTangents"target="_blank" rel="noopener">Tech Tangents</a>:
<ul>
<li>Playlists:
<ul>
<li><a href="https://www.youtube.com/watch?v=mBssIIRGkOw&amp;list=PLJVwF78cppBgwAHYKMffuhs0jblPHCyvL"target="_blank" rel="noopener">Data Generals</a></li>
</ul>
</li>
<li>Videos:
<ul>
<li><a href="https://www.youtube.com/watch?v=apFLq3-fpL4"target="_blank" rel="noopener">Tandy 1000 RL HD</a></li>
<li><a href="https://www.youtube.com/watch?v=Oa6QPHD6qzw&amp;t=278s"target="_blank" rel="noopener">CP/M on Model 100</a></li>
<li><a href="https://www.youtube.com/watch?v=dqPSVG7zbs4"target="_blank" rel="noopener">KayPro IV</a></li>
<li><a href="https://www.youtube.com/watch?v=vCU4xbHFb58"target="_blank" rel="noopener">HP Series 200 - CAD Monster</a></li>
<li><a href="https://www.youtube.com/watch?v=5WB9d1JM8oo"target="_blank" rel="noopener">8088 PC Networking</a></li>
<li><a href="https://www.youtube.com/watch?v=EOVLlMQs9f8"target="_blank" rel="noopener">FreeDOS on IBM 5150</a></li>
</ul>
</li>
</ul>
</li>
<li><a href="https://www.youtube.com/@The8BitGuy"target="_blank" rel="noopener">The 8-Bit Guy</a>
<ul>
<li>Playlists:
<ul>
<li><a href="https://www.youtube.com/watch?v=ayh0qebfD2g&amp;list=PLfABUWdDse7bKGFshxR0itdHBhjUj86SX"target="_blank" rel="noopener">Commander X16</a></li>
<li><a href="https://www.youtube.com/watch?v=NB_VBl7ut9Y&amp;list=PLfABUWdDse7Z8wmD0bbL0P5upEE1VjMJM"target="_blank" rel="noopener">Game Development - Making of Planet X2</a></li>
<li><a href="https://www.youtube.com/watch?v=mXSdikcUuo0&amp;list=PLfABUWdDse7aKLE00YObaVvP1jSH0YqIE"target="_blank" rel="noopener">Texas Tech History</a></li>
<li><a href="https://www.youtube.com/watch?v=eP9y_7it3ZM&amp;list=PLfABUWdDse7Y6LLPlfsHKcvBCgqaudzVY"target="_blank" rel="noopener">Commodore History</a></li>
</ul>
</li>
</ul>
</li>
<li><a href="https://www.youtube.com/@adriansdigitalbasement"target="_blank" rel="noopener">Adrien&rsquo;s Digital Basement</a>
<ul>
<li>Playlists:
<ul>
<li><a href="https://www.youtube.com/watch?v=x8DfSg7oMWg&amp;list=PL4tFqFVNf5LSckPX988MBvVzKv96eP0es"target="_blank" rel="noopener">TRS-80 Model II Repair Series</a></li>
<li><a href="https://www.youtube.com/watch?v=gkCDdSdSNu0&amp;list=PL4tFqFVNf5LRvKP94x7VOfdXXQHRt_8BR"target="_blank" rel="noopener">Amiga 4000 Repair Series</a></li>
<li><a href="https://www.youtube.com/watch?v=RMG_StQ67kA&amp;list=PL4tFqFVNf5LQeof2oTPFGxZx0SpvICpSv"target="_blank" rel="noopener">ZX Spectrum</a></li>
<li><a href="https://www.youtube.com/watch?v=_CNruhSYC2E&amp;list=PL4tFqFVNf5LRf-gcl5Lyhl2UxbmrGmZCT"target="_blank" rel="noopener">IBM 16-bit machines</a></li>
<li><a href="https://www.youtube.com/watch?v=5qMP6A_U75E&amp;list=PL4tFqFVNf5LT6X3sMRfbRWuTVE5NuEmKj&amp;pp=0gcJCV8EOCosWNin"target="_blank" rel="noopener">Apple Computers - 8-bit</a></li>
<li><a href="https://www.youtube.com/watch?v=H9dxJ7uNXOA&amp;list=PL4tFqFVNf5LRxSdlzuH2MWOZ_5PltbpLv"target="_blank" rel="noopener">Macintosh Machines - 68000</a></li>
<li><a href="https://www.youtube.com/watch?v=0MP93YbINyI&amp;list=PL4tFqFVNf5LRZKtduWSpZjZpJS6mxZx7I"target="_blank" rel="noopener">Commodore - 8 bit</a></li>
<li><a href="https://www.youtube.com/watch?v=0MP93YbINyI&amp;list=PL4tFqFVNf5LR9SvTg1P8r3EPL657qJFsx"target="_blank" rel="noopener">Commodore 64 Repairs</a></li>
<li><a href="https://www.youtube.com/watch?v=QJRXMYmie7I&amp;list=PL4tFqFVNf5LTPlF7iF_pMl5WiiOsSFMf4"target="_blank" rel="noopener">Tandy 1000 Series</a></li>
</ul>
</li>
</ul>
</li>
<li><a href="https://www.youtube.com/@clabretro"target="_blank" rel="noopener">clabretro</a>
<ul>
<li>Playlists:
<ul>
<li><a href="https://www.youtube.com/watch?v=77rVvJBLRhQ&amp;list=PLjeznAUfx0Odrk8qOQJ-_a3xry4PhIxOh"target="_blank" rel="noopener">Home Lab</a></li>
<li><a href="https://www.youtube.com/watch?v=pXuqASXGvgM&amp;list=PLjeznAUfx0OfCseO3gKOvEjw3oHgHLRlK"target="_blank" rel="noopener">Sun Microsystem Stuff</a></li>
</ul>
</li>
<li>Videos:
<ul>
<li><a href="https://www.youtube.com/watch?v=PBvDRJ_rU5w"target="_blank" rel="noopener">Ressurrecting an IBM PS/2 Model 50Z</a></li>
<li><a href="https://www.youtube.com/watch?v=7-ISDVFIVgw"target="_blank" rel="noopener">Windows NT 4.0 on a Compaq Proliant Gen 1</a></li>
<li><a href="https://www.youtube.com/watch?v=4UWibKEjyY8&amp;t=10s"target="_blank" rel="noopener">Token Ring Networking</a></li>
<li><a href="https://www.youtube.com/watch?v=LvLPz72IvAM"target="_blank" rel="noopener">Early 2000s Linksys Wi-Fi Gear</a></li>
<li><a href="https://www.youtube.com/watch?v=gyyhqHBmKg4"target="_blank" rel="noopener">Compaq Proliant Gen 1</a></li>
</ul>
</li>
</ul>
</li>
<li><a href="https://www.youtube.com/@LowSpecGamer"target="_blank" rel="noopener">LowSpecGamer</a>
<ul>
<li>Playlists:
<ul>
<li><a href="https://www.youtube.com/watch?v=lP2ZBp9O0mk&amp;list=PLp-6MMWURCz3x92-dpEsRLEGL3uHToVDR"target="_blank" rel="noopener">All Lore - Chronological</a></li>
<li><a href="https://www.youtube.com/watch?v=lP2ZBp9O0mk&amp;list=PLp-6MMWURCz1bo3T4vmyNUVl3FefnF7CC"target="_blank" rel="noopener">Chip Wars</a><a href="https://www.youtube.com/watch?v=OBlu2mdpiJ0&amp;list=PLp-6MMWURCz0OdcgoSiQOv8C9hn79XdOt"target="_blank" rel="noopener">Nintendo Lore</a></li>
<li><a href="https://www.youtube.com/watch?v=9Ki-kH751_8&amp;list=PLp-6MMWURCz0OB_iioCUqc2Sq21UXE-08"target="_blank" rel="noopener">The Yokoi Saga</a></li>
</ul>
</li>
<li>Videos:
<ul>
<li><a href="https://www.youtube.com/watch?v=nIwdhPOVOUk"target="_blank" rel="noopener">How Amateurs created the world&rsquo;s most popular processor - History of ARM Part 1</a></li>
<li><a href="https://www.youtube.com/watch?v=vx1-6yRAGk0"target="_blank" rel="noopener">ARM&rsquo;s Secret Weapon - History of ARM Part 2</a></li>
<li><a href="https://www.youtube.com/watch?v=PLzTVnQ3gqc"target="_blank" rel="noopener">How IBM Invented the PC, then everyone stole it</a></li>
<li><a href="https://www.youtube.com/watch?v=ztYfJDTjpjk&amp;pp=0gcJCY0JAYcqIYzv"target="_blank" rel="noopener">The Great Calculator Wars of the 70s</a></li>
</ul>
</li>
</ul>
</li>
<li><a href="https://www.youtube.com/@BenEater"target="_blank" rel="noopener">Ben Eater</a>
<ul>
<li>Playlists:
<ul>
<li><a href="https://www.youtube.com/watch?v=LnzuMJLZRdU&amp;list=PLowKtXNTBypFbtuVMUVXNR0z1mu7dp7eH"target="_blank" rel="noopener">Build a 65c02-based computer from scratch</a></li>
<li><a href="https://www.youtube.com/watch?v=HyznrdDSSGM&amp;list=PLowKtXNTBypGqImE405J2565dvjafglHU&amp;pp=0gcJCV8EOCosWNin"target="_blank" rel="noopener">Building an 8-bit breadboard computer</a></li>
<li><a href="https://www.youtube.com/watch?v=XaGXPObx2Gs&amp;list=PLowKtXNTBypH19whXTVoG3oKSuOcw_XeW"target="_blank" rel="noopener">Networking Tutorial</a></li>
<li><a href="https://www.youtube.com/watch?v=eq5YpKHXJDM&amp;list=PLowKtXNTBypFWff2QjXCWuSfJDWcvE0Vm"target="_blank" rel="noopener">Error detection</a></li>
</ul>
</li>
</ul>
</li>
<li><a href="https://www.youtube.com/@javidx9"target="_blank" rel="noopener">javidx9</a>
<ul>
<li>Playlists:
<ul>
<li><a href="https://www.youtube.com/watch?v=nViZg02IMQo&amp;list=PLrOv9FMX8xJHqMvSGB_9G9nZZ_4IgteYf"target="_blank" rel="noopener">NES Emulator from Scratch</a></li>
<li><a href="https://www.youtube.com/watch?v=8OK8_tHeCIA&amp;list=PLrOv9FMX8xJE8NgepZR1etrsU63fDDGxO"target="_blank" rel="noopener">Code-it-Yourself - TETRIS from scratch</a></li>
</ul>
</li>
</ul>
</li>
<li><a href="https://www.youtube.com/@GamingHistorian"target="_blank" rel="noopener">Gaming Historian</a>
<ul>
<li>Playlists:
<ul>
<li><a href="https://www.youtube.com/watch?v=G_6PO3N8fig&amp;list=PLScCWE7AP_PUIOOSwRF_e5jR6e2rLwLoF"target="_blank" rel="noopener">Video Game Hardware</a></li>
<li><a href="https://www.youtube.com/watch?v=2EUYSN5aFcE&amp;list=PLScCWE7AP_PVMZgv83NLwp6wQ93I6o4rr"target="_blank" rel="noopener">The Story of Super Mario - Documentary Series</a></li>
<li><a href="https://www.youtube.com/watch?v=S1qD9JRk5vM&amp;list=PLScCWE7AP_PU4_4b4juK8ZugrmptW4g1v&amp;pp=0gcJCV8EOCosWNin"target="_blank" rel="noopener">History of Wolfenstein</a></li>
<li><a href="https://www.youtube.com/watch?v=M55Bpm38qqE&amp;list=PLScCWE7AP_PVO9xcAsZa7Dv5sgdZMyUbb"target="_blank" rel="noopener">History of Sonic the Hedgehog</a></li>
<li><a href="https://www.youtube.com/watch?v=myhBphil-Uw&amp;list=PLScCWE7AP_PVVYlegzt3REr2n5bBmmQJ2"target="_blank" rel="noopener">History of Super Smash Bros</a></li>
<li><a href="https://www.youtube.com/watch?v=BjRuV52Jk78&amp;list=PLScCWE7AP_PXfCIUjxMjoWPUbNYXz8P6w"target="_blank" rel="noopener">Games</a></li>
<li><a href="https://www.youtube.com/watch?v=8QbjlHeoLdc&amp;list=PL397C52406E483BAB&amp;pp=0gcJCV8EOCosWNin"target="_blank" rel="noopener">Gaming Historian</a></li>
</ul>
</li>
</ul>
</li>
<li><a href="https://www.youtube.com/@ModernVintageGamer"target="_blank" rel="noopener">Modern Vintage Gamer</a>
<ul>
<li>Playlists:
<ul>
<li><a href="https://www.youtube.com/watch?v=SZbC0Hh4lc8&amp;list=PLUbw0IXAmW2rMk5g19MrqcyebecSrrSeJ"target="_blank" rel="noopener">Mistakes Were Made - Game Console Security</a></li>
<li><a href="https://www.youtube.com/watch?v=siOXFGZj_z0&amp;list=PLUbw0IXAmW2p35mZ_Fis31n2L6HPiFoEs"target="_blank" rel="noopener">The Sony Playstation</a></li>
<li><a href="https://www.youtube.com/watch?v=esl6ctg_9JA&amp;list=PLUbw0IXAmW2qJ8e0XtQgQo8ki0mIeIbHP"target="_blank" rel="noopener">The Original XBox</a></li>
<li><a href="https://www.youtube.com/watch?v=F4Dv32-PoU4&amp;list=PLUbw0IXAmW2pDWN4kZ-vNDNAPycFVR_ux"target="_blank" rel="noopener">Doom Switch Port</a></li>
<li><a href="https://www.youtube.com/watch?v=ZOzWS7MQ_qs&amp;list=PLUbw0IXAmW2ofK7Es3w7q5kVMdzK_IfKY"target="_blank" rel="noopener">Retro Reviews</a></li>
</ul>
</li>
<li>Videos:
<ul>
<li><a href="https://www.youtube.com/watch?v=lpOEhtoc3DY"target="_blank" rel="noopener">N64: Decomp vs Recomp vs Ports explained</a></li>
<li><a href="https://www.youtube.com/watch?v=hqpw-QPsdCg"target="_blank" rel="noopener">XenonRecomp</a></li>
<li><a href="https://www.youtube.com/watch?v=nJ9zJ_PDatU"target="_blank" rel="noopener">Game Genie Explained</a></li>
<li><a href="https://www.youtube.com/watch?v=_RVQsqC3A6g"target="_blank" rel="noopener">Super NES Graphics</a></li>
<li><a href="https://www.youtube.com/watch?v=OmKjVpVdHDQ"target="_blank" rel="noopener">N64 Emulation is a Mess</a></li>
<li><a href="https://www.youtube.com/watch?v=8ibEDSfthS0"target="_blank" rel="noopener">The First Amiga Virus</a></li>
<li><a href="https://www.youtube.com/watch?v=ZeaZWBrG__s"target="_blank" rel="noopener">35 Years of Game Boy</a></li>
<li><a href="https://www.youtube.com/watch?v=ockNRSt3Nsk"target="_blank" rel="noopener">Video game piracy in the 80s</a></li>
<li><a href="https://www.youtube.com/watch?v=JqP3ZzWiul0"target="_blank" rel="noopener">Doom SNES Sourcecode</a></li>
<li><a href="https://www.youtube.com/watch?v=zQE1K074v3s"target="_blank" rel="noopener">How Graphics worked on the Game Boy</a></li>
<li><a href="https://www.youtube.com/watch?v=2NF5sU_n0uk"target="_blank" rel="noopener">How UltraHLE changed N64 emulation forever</a></li>
<li><a href="https://www.youtube.com/watch?v=5tADL_fmsHQ"target="_blank" rel="noopener">How Diablo was completely Reverse Engineered without source code</a></li>
<li><a href="https://www.youtube.com/watch?v=Ap3gJT_TMOc&amp;pp=0gcJCY0JAYcqIYzv"target="_blank" rel="noopener">Duke3D on the Amiga 600</a></li>
</ul>
</li>
</ul>
</li>
<li><a href="https://www.youtube.com/@strafefox"target="_blank" rel="noopener">Strafefox</a>
<ul>
<li>Videos:
<ul>
<li><a href="https://www.youtube.com/watch?v=6u37r-Z_Nfo"target="_blank" rel="noopener">Video Game Development Through the 80s</a></li>
<li><a href="https://www.youtube.com/watch?v=5jxYvLYcpZg&amp;t=1441s"target="_blank" rel="noopener">The 3D Revolution in 90s game development</a></li>
<li><a href="https://www.youtube.com/watch?v=69AOVtOUatY"target="_blank" rel="noopener">The Making of Sonic the Hedgehog</a></li>
<li><a href="https://www.youtube.com/watch?v=226Nwq2CN5c"target="_blank" rel="noopener">The Making of Mortal Kombat</a></li>
<li><a href="https://www.youtube.com/watch?v=TYE9GMfr5ug"target="_blank" rel="noopener">The Making of Castlevania Symphony of the Night</a></li>
<li><a href="https://www.youtube.com/watch?v=_LPu7gNzWUE"target="_blank" rel="noopener">The Making of Donkey Kong Country &amp; Killer Instinct</a></li>
<li><a href="https://www.youtube.com/watch?v=kOnUITJqRQQ"target="_blank" rel="noopener">The Making of Aladdin</a></li>
<li><a href="https://www.youtube.com/watch?v=5Z7liHTgnw4"target="_blank" rel="noopener">The Making of Streets of Rage</a></li>
<li><a href="https://www.youtube.com/watch?v=USC6c9Dtak8"target="_blank" rel="noopener">The Making of Street Fighter II</a></li>
<li><a href="https://www.youtube.com/watch?v=KL4l0nMsrMM"target="_blank" rel="noopener">The Making of Super Mario World</a></li>
<li><a href="https://www.youtube.com/watch?v=GDhNT2Qv-Mo"target="_blank" rel="noopener">The Making of Star Fox</a></li>
<li><a href="https://www.youtube.com/watch?v=MJG-OT6S194"target="_blank" rel="noopener">How Video Games were Made - Part 3</a></li>
<li><a href="https://www.youtube.com/watch?v=Yo7UkkGC1AY"target="_blank" rel="noopener">How Video Games were Made - Part 2</a></li>
<li><a href="https://www.youtube.com/watch?v=VDz1IvuWyJw"target="_blank" rel="noopener">MSX Konami Games</a></li>
</ul>
</li>
</ul>
</li>
<li><a href="https://www.youtube.com/@GTV-Japan"target="_blank" rel="noopener">GTV Japan</a>
<ul>
<li>Playlists:
<ul>
<li><a href="https://www.youtube.com/watch?v=_s9fmbcds40&amp;list=PLu4Z50DKq3na663p7gGKgxHOZFGv2eqWO"target="_blank" rel="noopener">The GTV Binge Watch</a></li>
<li><a href="https://www.youtube.com/watch?v=zgtYV41yXbU&amp;list=PLu4Z50DKq3nYnRu-3XhDncP8MRzOsusRm"target="_blank" rel="noopener">GTV&rsquo;s Greatest Hits</a></li>
</ul>
</li>
<li>Videos:
<ul>
<li><a href="https://www.youtube.com/watch?v=KdS34tc37hk"target="_blank" rel="noopener">The Story of Chrono Trigger</a></li>
<li><a href="https://www.youtube.com/watch?v=gNps2YP2e30&amp;t=860s"target="_blank" rel="noopener">The Final 16-bit Fantasy</a></li>
<li><a href="https://www.youtube.com/watch?v=DV3K3Coz1RA"target="_blank" rel="noopener">Sonic Mania Day</a></li>
<li><a href="https://www.youtube.com/watch?v=I2MYvgNf9lU"target="_blank" rel="noopener">The History of Sonic - 30th Anniversary</a></li>
<li><a href="https://www.youtube.com/watch?v=zgtYV41yXbU"target="_blank" rel="noopener">The Super Story of Mario World</a></li>
</ul>
</li>
</ul>
</li>
<li><a href="https://www.youtube.com/@DisplacedGamers"target="_blank" rel="noopener">Displaced Gamers</a>
<ul>
<li>Playlists:
<ul>
<li><a href="https://www.youtube.com/watch?v=55X1KOw_Rhg&amp;list=PLn5sTGew1WGB0-omvT5UtPanoCzRh7A0V"target="_blank" rel="noopener">Game Genie: Uncorked</a></li>
<li><a href="https://www.youtube.com/watch?v=EhO_iHkUkE0&amp;list=PLn5sTGew1WGD5NUstpfwYdLfrmLJOHCSw"target="_blank" rel="noopener">Talkin&rsquo; Code</a></li>
<li><a href="https://www.youtube.com/watch?v=gTfPLl_AJvs&amp;list=PLn5sTGew1WGD2Tnspn9vhpLGf-kqDRbYy"target="_blank" rel="noopener">Behind the Code</a></li>
<li><a href="https://www.youtube.com/watch?v=ssluTgfkdlg&amp;list=PLn5sTGew1WGCMO7Bi-MD7VgFWAoeXbU93"target="_blank" rel="noopener">Gaming Tech Talk</a></li>
</ul>
</li>
</ul>
</li>
<li><a href="https://www.youtube.com/@RGMechEx"target="_blank" rel="noopener">Retro Game Mechanics Explained</a>
<ul>
<li>Playlists:
<ul>
<li><a href="https://www.youtube.com/watch?v=UdD26eFVzHQ&amp;list=PLHQ0utQyFw5IrM_zCFY8fhtByNxVGRUMr"target="_blank" rel="noopener">Super Mario 2</a></li>
<li><a href="https://www.youtube.com/watch?v=1whju31WAPA&amp;list=PLHQ0utQyFw5KxchzQnRcc_uk-NU7FbHNM"target="_blank" rel="noopener">Super Mario Bros.</a></li>
<li><a href="https://www.youtube.com/watch?v=q15yNrJHOak&amp;list=PLHQ0utQyFw5I8qqpOXKXKySBsphqdStdq"target="_blank" rel="noopener">Super Mario World</a></li>
<li><a href="https://www.youtube.com/watch?v=fxZuzos7Auk&amp;list=PLHQ0utQyFw5KoUSkHGq5VtMY0v2e5G_u3"target="_blank" rel="noopener">Super Mario Bros 3</a></li>
<li><a href="https://www.youtube.com/watch?v=FPzuYWbnln4&amp;list=PLHQ0utQyFw5IrotCLCfxKGkUL-WjPDrxh"target="_blank" rel="noopener">Super Mario Land 2</a></li>
</ul>
</li>
</ul>
</li>
<li><a href="https://www.youtube.com/@TheCherno"target="_blank" rel="noopener">The Cherno</a>
<ul>
<li>Playlists:
<ul>
<li><a href="https://www.youtube.com/watch?v=gfW1Fhd9u9Q&amp;list=PLlrATfBNZ98edc5GshdBtREv5asFW3yXl"target="_blank" rel="noopener">Ray Tracing Series</a></li>
<li><a href="https://www.youtube.com/watch?v=W3gAzLwfIP0&amp;list=PLlrATfBNZ98foTJPJ_Ev03o2oq3-GGOS2"target="_blank" rel="noopener">OpenGL</a></li>
<li><a href="https://www.youtube.com/watch?v=9HCboZHTyrw&amp;list=PLlrATfBNZ98f6Z1cDNeMLL3eXaRk1WCxK"target="_blank" rel="noopener">Code Review</a></li>
</ul>
</li>
</ul>
</li>
<li><a href="https://www.youtube.com/@Kosmicd12"target="_blank" rel="noopener">Kosmic</a>
<ul>
<li>Playlists:
<ul>
<li><a href="https://www.youtube.com/watch?v=1wR8x5b_ExM&amp;list=PLbxkd_Hs6FDK2FNWiOAK_LPBMXauJMrlC"target="_blank" rel="noopener">World Record SpeedRuns</a></li>
<li><a href="https://www.youtube.com/watch?v=kyZ4yF3ynsA&amp;list=PLbxkd_Hs6FDKH8YVR82mS2zFDWN_pwkQx"target="_blank" rel="noopener">Super Mario Bros</a></li>
</ul>
</li>
</ul>
</li>
<li><a href="https://www.youtube.com/@KazeN64"target="_blank" rel="noopener">Kaze Emanuar</a>
<ul>
<li>Playlists:
<ul>
<li><a href="https://www.youtube.com/watch?v=dfK4Iuz3mME&amp;list=PLY9TGb7t9kuHx1vP2qCascFrhfnzLn-ME"target="_blank" rel="noopener">SM64: Last Impact - Developer Commentary</a></li>
</ul>
</li>
<li>Videos:
<ul>
<li><a href="https://www.youtube.com/watch?v=DdXLpoNLywg"target="_blank" rel="noopener">Mario 64 breaks after 7 days</a></li>
<li><a href="https://www.youtube.com/watch?v=OHU2onxKm5o&amp;pp=0gcJCY0JAYcqIYzv"target="_blank" rel="noopener">Perfecting Random Number Generation on N64</a></li>
<li><a href="https://www.youtube.com/watch?v=r-2iIBmXULI&amp;t=129s"target="_blank" rel="noopener">Planetary Gravity is Cheap</a></li>
<li><a href="https://www.youtube.com/watch?v=g5u3zW4SLow&amp;pp=0gcJCY0JAYcqIYzv"target="_blank" rel="noopener">The Genius of N64 Cache Instruction</a></li>
<li><a href="https://www.youtube.com/watch?v=DotEVFFv-tk"target="_blank" rel="noopener">The N64 has more RAM than you think</a></li>
<li><a href="https://www.youtube.com/watch?v=f05PwswO7qc&amp;t=344s"target="_blank" rel="noopener">Why Devs need to know about Render Matrices</a></li>
<li><a href="https://www.youtube.com/watch?v=-nhhfYkluT0"target="_blank" rel="noopener">Better engine, Better graphics</a></li>
<li><a href="https://www.youtube.com/watch?v=hffgNRfL1XY"target="_blank" rel="noopener">The Folded Polynomial</a></li>
<li><a href="https://www.youtube.com/watch?v=xFKFoGiGlXQ"target="_blank" rel="noopener">Fastest Sine on N64</a></li>
<li><a href="https://www.youtube.com/watch?v=t_rzYnXEQlE"target="_blank" rel="noopener">Fixing the Entire SM64 source code</a></li>
</ul>
</li>
</ul>
</li>
<li><a href="https://www.youtube.com/@james.lambert"target="_blank" rel="noopener">James Lambert</a>
<ul>
<li>Videos:
<ul>
<li><a href="https://www.youtube.com/watch?v=WDNU9k8uTc4"target="_blank" rel="noopener">Can Portal64 be saved?</a></li>
<li><a href="https://www.youtube.com/watch?v=sb3nHlsBBpg&amp;t=256s"target="_blank" rel="noopener">Portal 64: First Slice, is out of beta</a></li>
<li><a href="https://www.youtube.com/watch?v=r4KGm7ixcqI"target="_blank" rel="noopener">How I optimized Portal to run on the N64</a></li>
<li><a href="https://www.youtube.com/watch?v=Sf036fO-ZUk"target="_blank" rel="noopener">How I implemented MegaTextures on real N64 hardware</a></li>
<li><a href="https://www.youtube.com/watch?v=ao1qVi5Qp3Y&amp;t=58s&amp;pp=0gcJCY0JAYcqIYzv"target="_blank" rel="noopener">I rewrote Portal from scratch and solved the Portal Paradox</a></li>
<li><a href="https://www.youtube.com/watch?v=VqDAxcWnq3g"target="_blank" rel="noopener">How are toon shading and dynamic shadows possible on the N64?</a></li>
<li><a href="https://www.youtube.com/watch?v=yXzoZ2AfWwg&amp;pp=0gcJCY0JAYcqIYzv"target="_blank" rel="noopener">How can Nintendo 64 run Portal?</a></li>
</ul>
</li>
</ul>
</li>
<li><a href="https://www.youtube.com/@veritasium"target="_blank" rel="noopener">Veritasium</a>
<ul>
<li>Playlists:
<ul>
<li><a href="https://www.youtube.com/watch?v=AaZ_RSt0KP8&amp;list=PLkahZjV5wKe8w9GC_n2yyhx6Wj-NKzzeE"target="_blank" rel="noopener">Computing</a></li>
</ul>
</li>
<li>Videos:
<ul>
<li><a href="https://www.youtube.com/watch?v=w5ebcowAJD8&amp;pp=0gcJCY0JAYcqIYzv"target="_blank" rel="noopener">I build a QR code with my bare hands to see how it workds</a></li>
<li><a href="https://www.youtube.com/watch?v=wVyu7NB7W6Y"target="_blank" rel="noopener">Exposing the flaw in out phone system</a></li>
<li><a href="https://www.youtube.com/watch?v=A5w-dEgIU1M"target="_blank" rel="noopener">The Trillion Dollar equation</a></li>
<li><a href="https://www.youtube.com/watch?v=nmgFG7PUHfo&amp;t=40s"target="_blank" rel="noopener">The Most Important Algorithm of All Time</a></li>
<li><a href="https://www.youtube.com/watch?v=HeQX2HjkcNo"target="_blank" rel="noopener">Math&rsquo;s Fundamental Flaw</a></li>
<li><a href="https://www.youtube.com/watch?v=R13BD8qKeTg"target="_blank" rel="noopener">The Bayesian Trap</a></li>
<li><a href="https://www.youtube.com/watch?v=IcrBqCFLHIY&amp;pp=0gcJCY0JAYcqIYzv"target="_blank" rel="noopener">How Does a Transistor Work</a></li>
<li><a href="https://www.youtube.com/watch?v=zNzzGgr2mhk"target="_blank" rel="noopener">How to Make a Quantum Bit</a></li>
</ul>
</li>
</ul>
</li>
<li><a href="https://www.youtube.com/@3blue1brown"target="_blank" rel="noopener">3Blue1Brown</a>
<ul>
<li>Playlists:
<ul>
<li><a href="https://www.youtube.com/watch?v=8rrHTtUzyZA&amp;list=PLZHQObOWTQDMp_VZelDYjka8tnXNpXhzJ"target="_blank" rel="noopener">Convolutions</a></li>
<li><a href="https://www.youtube.com/watch?v=8idr1WZ1A7Q&amp;list=PLZHQObOWTQDOjmo3Y6ADm0ScWAlEXf-fp"target="_blank" rel="noopener">Probabilities of Probabilities</a></li>
<li><a href="https://www.youtube.com/watch?v=p_di4Zn4wz4&amp;list=PLZHQObOWTQDNPOjrT6KVlfJuKtYTftqH6"target="_blank" rel="noopener">Differential equations</a></li>
<li><a href="https://www.youtube.com/watch?v=WUvTyaaNkzM&amp;list=PLZHQObOWTQDMsr9K-rj53DwVRMYO3t5Yr"target="_blank" rel="noopener">Essence of Calculus</a></li>
<li><a href="https://www.youtube.com/watch?v=fNk_zzaMoSs&amp;list=PLZHQObOWTQDPD3MizzM2xVFitgF8hE_ab"target="_blank" rel="noopener">Essence of Linear Algebra</a></li>
<li><a href="https://www.youtube.com/watch?v=aircAruvnKk&amp;list=PLZHQObOWTQDNU6R1_67000Dx_ZCJB-3pi"target="_blank" rel="noopener">Neural Networks</a></li>
</ul>
</li>
<li>Videos:
<ul>
<li><a href="https://www.youtube.com/watch?v=RQWpF2Gb-gU"target="_blank" rel="noopener">But what is a quantum computing - Grover&rsquo;s Algorithm</a></li>
<li><a href="https://www.youtube.com/watch?v=Dlsa9EBKDGI"target="_blank" rel="noopener">Where my explanation of Grover&rsquo;s algorithm failed</a></li>
<li><a href="https://www.youtube.com/watch?v=LPZh9BOjkQs&amp;pp=0gcJCY0JAYcqIYzv"target="_blank" rel="noopener">Large Language Models explained briefly</a></li>
</ul>
</li>
</ul>
</li>
</ul>
]]></content:encoded><category>computing-history</category><category>retrocomputing</category><category>emulation</category><category>off-topic</category></item></channel></rss>