Last night I watched Claude write TMS9900 assembly, compile it into a cartridge ROM, run it on a TI-99/4A emulator, see the result, and iterate—eventually rendering the Claude Code logo in 1980s graphics.
Claude has read every TI-99/4A programming manual ever written. It can explain the VDP register architecture, recite memory maps, describe the TMS9918A color palette. Perfect accuracy. Total confidence.
It had never run code on one.
The Pipeline
I've been building an MCP (Model Context Protocol) bridge connecting Claude Desktop to MAME. The architecture:
Claude Desktop → MCP Server → File Bridge → MAME Lua Plugin → TI-99/4A Emulator
Claude can check emulator status, compile TMS9900 assembly, launch cartridges, capture screenshots, and iterate based on what it sees. A complete development loop. The same cycle any programmer uses, just with an AI writing the code and a 44-year-old computer running it.
The Datamux Problem (Or: The Documentation Was Technically Correct)
My first approach seemed obvious: inject code directly into RAM via MAME's Lua scripting, then execute it. Claude knows the TI-99/4A memory map. The 32K expansion RAM sits at $A000-$FFFF. Write some bytes, jump to them, done.
It didn't work. The bytes we wrote weren't the bytes that appeared in memory.
We tried the scratchpad RAM at $8300. Same problem—plus the console's firmware kept overwriting it. We tried the debugger's load command. Still corrupted.
Here's what the documentation doesn't emphasize: the TI-99/4A has a 16-bit CPU but an 8-bit external data bus. A chip called the "datamux" sits between them, converting 16-bit operations to pairs of 8-bit transfers. When you write to expansion RAM through MAME's memory API, you're going through that datamux—and it mangles the data because it expects specific timing sequences that external writes don't provide.
Claude knew about the datamux. It's in the documentation. But knowing "there's a bus width converter" and knowing "this will corrupt your direct memory writes" are different things.
The pivot: Cartridge ROM at $6000-$7FFF sits directly on the 16-bit bus. No datamux. We switched to compiling actual cartridge images, and suddenly everything worked.
This is the kind of thing you can't learn from reading. The documentation is technically accurate. It just doesn't tell you what will actually bite you.
First Success
With the cartridge workflow running, the first real test was simple: display "HELLO" on screen.
Claude wrote the assembly—set up VDP write address, loop through characters, write to video RAM. Compiled clean. Launched the emulator.
It worked. First try. Text appeared exactly where expected.
Too easy. "Now display 'HELLO CLAUDE' and change the background to green."
The Color Table Incident
Claude knew that VDP register 7 controls the backdrop color. It wrote confident code. The code compiled. The emulator ran.
The background turned purple.
Not green. Purple.
Claude adjusted the color table writes. Purple with a cyan screen area. It rewrote the initialization sequence. Still wrong.
After several iterations—different color values, different registers, different timing—we finally got green. The issue: the TI-99/4A's GPL startup routine initializes VDP registers in a specific order. Claude's code was fighting with the console's own initialization. The documentation describes what the registers do. It doesn't describe the dance you have to do with the firmware.
The Logo
With text and colors working, I pushed it: recreate the Claude Code logo on TI-99/4A hardware.
This meant Graphics II mode, custom 8x8 pixel character patterns, color tables for each character group, tiles arranged in grids to form larger images. Claude's first starburst had the right idea—thin spidery lines instead of thick chunky rays. It could describe what the logo should look like. It couldn't see that its code didn't produce that.
But now it could see. After each compile, I'd capture a screenshot. Claude would analyze it: "The rays are too thin. The diagonal patterns aren't connecting. The indexing is off—character 136 falls into color group 17, not 16."
Then it would fix the code and try again.
We went through a dozen iterations. Some were disasters—one 7x7 grid attempt produced what I can only describe as a digital sneeze. Pattern data loading into wrong addresses. Characters appearing in wrong positions. But each failure taught something the documentation couldn't.
The blocky text was its own challenge. I fed Claude reference images of the logo style. First attempt: too thin. "You might be able to use multiple characters to represent one letter," I suggested. It rebuilt the entire alphabet as 3-character-tall block letters with proper spacing.
The Result
After an hour of iteration: a recognizable Claude Code logo on TI-99/4A hardware.
Orange starburst with radiating rays—well, "light red," since the 15-color palette doesn't include true orange. Blocky text. Dark background. Proper alignment.
Is it pixel-perfect? No. 256×192 resolution with 8×8 character tiles has limits. But it works. An AI that never touched this hardware wrote assembly code that runs on it—not by luck, but by iterating through failures until success.
What Actually Happened Here
There's a question that haunts AI development: does the model actually understand, or is it just sophisticated pattern matching?
I don't have the answer. But I watched something interesting.
When the memory writes failed, Claude didn't randomly try new approaches. It reasoned about the datamux architecture, hypothesized about bus timing, systematically tested the hypothesis. When the colors were wrong, it traced through the VDP initialization sequence. When the starburst patterns weren't connecting, it diagnosed indexing errors in the character definitions.
Was that understanding? Pattern matching? Does the distinction matter if the output is working code on real (emulated) hardware?
What I know: reading documentation isn't doing. Claude has absorbed more TI-99/4A technical material than any human could memorize. Turning that into working code required a feedback loop—write, run, see, fix. Theory meeting reality, repeatedly, until the gap closes.
What's Next
This is pilot work for a larger project. Next: real hardware. A physical TI-99/4A with a FinalGROM 99 flash cartridge and PICO9918 VGA output, so Claude can see its code run on actual vintage silicon and debug issues that only appear on real hardware.
Then more platforms. Commodore 64. Intellivision. Vectrex. Atari 800. Each with their own architectures, quirks, and gaps between documentation and reality.
The project is called "Claude Codes on Classic Computers." Apparently I'm going to spend 2026 teaching an AI to program machines that have been obsolete for 40 years.
Texas Instruments lost half a billion dollars on the TI-99/4A in 1983. Last night, an AI made it do something new.
More updates coming as the project develops. The MCP bridge code will be open-sourced once it's stable.