
I wrote this as a time-based journal and then realized that it’d need to take place over at least two, possibly three days. The journal began because I wasn’t much in the mood for anything else after a busy weekend. I felt adding a little time based “as it happened” would be interesting as a format. So join me in co-discovery with an idea I had to test OpenAI’s new 5.4 model with solving a random DOS binary from ~July 2000.
We begin within visual studio code and we begin with precisely one file.
DAY ONE
You need to understand where we’re starting at. I’m using visual studio code-it’s just a tool developers use to write code. Inside that tool you can create a workspace to hold all the code of your project. This experiment begins in this way-but with ONE FILE.
My workspace is one file. It’s a binary and found online.
I haven’t even tried to run it. I’m just YOLOing that this binary has something interesting going on with it.

So to repeat myself. This image above is the extent of my workspace. It’s one file. The file is named zc190s1.exe. The question I asked myself, “If i tell 5.4 this is an installer, will it be able to read the binary, figure out what it is, and build a full npm port of the contents?”
I wrote about recently how I locked myself out of AI. It turns out you can use AI so much you no longer have AI. While my codex accounts are all locked there was this spark of a realization-I do have credits remaining in Github Copilot. I’ll invest a few in this exercise. We’re living in a world where you can have $20 to buy a pair shoes but not the ration ticket to actually buy the shoes. Glad I listened to my great grandparents.
So here is my setup. Can AI take apart this file, figure out what it is, and port the entire thing into a web app? I started the clock. It’s 5:55pm. I started writing this article to pass the time while the AI works, and also chronical what I see.
And right now I see files getting written to disk.
5:57 pm

We have files now-I see a blue prompt flashing on the screen. Github copilot wants to run this command. I click approve.

I could pretend I read the code in the screenshot I just shared. I didn’t read it thought. I just clicked “allow”.
Correction. I don’t just click approve-I click “Allow all commands in session”. I see a flurry of code getting sprawled out in the window now. Some of the commands even look useful, such as these hex codes.

I just watch the AI work. It’s 6:00pm now. It ran some tests. I see this message in the log. It’s designing a new recursive parsing solution. It figured out the binary is a PE32 x86 binary-it’s a DOS game. Things are happening now.
PE32 is the standard 32-bit version of the Portable Executable (PE) file format, while x86 refers to the 32-bit instruction set architecture it typically targets. This format is used by Windows for executables (.exe), dynamic-link libraries (.dll), and system drivers (.sys).

And that’s an interesting next step. I read the readme. Where are we at?

Interesting. I let me eyes wander over the screen and ponder if the AI knows the gem I handed to it to figure out this project. I don’t reveal anything. I see a note that the ai suspects this is a game. Maybe it knows. Maybe it knows this is a game. I said I downloaded some random binary online. That’s only partially true.
I let the clock tick.
6:05pm I type into the prompt: I approve your implementation plan. Continue on. When wrapping up, provide a suggested plan for the subsequent phase.
I pretend it matters. I know myself. Whatever the AI sends back I’ll just click the ‘approve’ button like a gambling addict at the casino. I see command line scroll fill up on the other monitor.

OAI’s 5.4 is still working. As it does, I get up to refill a drink. I assume this will take a while. I try to pretend I can get this done in a single year. Oh, Visual Studio code has an update. The agent is in a stopping spot. I copy the most recent “next step” to a file and restart Visual Studio code. I flip back to plan mode-oh, the requests are failing. I’ve used up all my premium requests for March. It’s March 8th. Sigh.
Inside Github I see what I’ve been staring at since Saturday. Another red bar that says, “Congratulations, you’re out of tokens for March!” I see the red bar with as much excitement as getting a letter from the IRS that they’d prefer “a second look” at my tax preparations for the prior year. On that happy thought, I upgrade from water to vodka inspired cocktail. The writing from here on out will either be more colorful or terrible, perhaps a bit of both. I thought I had credits to do this experiment? Apparently not.
The clock changes as I ponder my fate. Then it hits me. I realize that my clock never changed in Windows for Daylight Savings Time. The time in the system tray and the time on my phone-two different times. One in the future and one in the past. I fix that, then realize it’s not 6:00pm, but 7:00pm. I toss a prompt into the chatbox.
Continue the project.
Another unyielding sprawl of words cascades down faster than I can possibly read. Some of it might be even be useful.
There was a wall of text from the AI. It looked important. Continue the project. It’s all I could muster. Continue the project-impressive. I pause looking over the feed that sprawled by in rapid succession. It’s impressive. I doubt many of today’s engineers even know what this is. I remember using disassemblers back in the early 2000s. The only thing missing is some green font coloring.

I sip from my cocktail and punch one finger at a time to the AI: “Will you figure this out?” There’s no hints here. This is a game of code breaking. Hints-I’ll provide hints once it figures out what this is.
I could hint what the game is, but then… why? Quite literally everything about the software is hidden inside this 2meg file. It looks like 5.4 is starting to make sense of the file structure. Maybe file standards don’t need to be published now. Maybe you just point AI at it and keep clicking “Continue”.
Maybe.

7:51pm (6:51pm?) I see that 5.4 is now discovered a compression scheme, or something that looks like one in the raw byte signature.

Maybe 5.4 figures it out sooner than expected. My phone rattles, then again. I flip to my phone while the agent works.
8:00pm. The AI was waiting on me for a few minutes. I replay the same message. Continue the project. I add on a few extra words.
Continue the project. We want to extract the contents so you can then use the extracted contents to then port this into a new npm web application.
After all there’s a secret hidden inside, but if I reveal the information as to what it is.. feels like a kind of signals cheating-and besides, the model just had a breakthru.

8:03pm - The windows are open. The weather has provided for a lovely day. I go to close them while the AI works.
8:06pm - 5.4 figured out what’s hidden inside this installer. Just incredible.

Continue the project.
Zelda Classic, this binary, is based on the lost original from Armageddon Games by Phantom Menace in 1999. The software has evolved since then, and there’s a much more current version alive over at ZQuest. I’ve never tried either, to be clear. I wanted a project to see whether 5.4 could use zero information to unpack an installer, and from that, build out a port. Allegedly the Zelda Classic game is abandonware, and the installer was sourced from this site (whose legitimacy I have no insight on): https://www.dosgamesarchive.com/download/zelda-classic
8:15pm my drink is empty now and the kitchen several steps away. I see 5.4 happily working in the background. The updates are faster than I can add words to this substack. I’ve never felt so dialup compared to the infinite broadband of AI.
It’s starting to look like a full npm port of zelda will exist soon.

I re-read the logs. Wait, 5.4 found all the assets.

I still haven’t left my chair to refill my cocktail. I’m at the edge of my seat-figuratively and literally for various reasons. I can’t help but wonder… “will 5.4 actually make a working npm based clone of zelda?” and from a packaged installer of a clone at that? 5.4 now knows the file format structure. I let it use websearch to get the format specification. No reason now to be overly difficult in this exam.
The model identified and extracted the contents of an old DOS installer without looking up help on the internet.
I look to see if I can watch the details while the 5.4 model works. The answer doesn’t surprise me-I can, but I can’t.

The strings are extracting out now. No longer lost inside compressed bytes. The model is no longer crawling-it’s running.

8:22pm I review terminals to see what 5.4 is doing. djgpp… that sounds familiar? I google the short string of letters.
DJ's GNU Programming Platform (DJGPP) is a software development suite for Intel 80386-level and above, IBM PC compatibles which supports DOS operating systems.
5.4 isn’t slowing down. It’s continuing. There’s a level of architecture here that’s underway. 5.4 understands it needs to take a step back before it goes forward.

8:26pm What happens next stuns me. The model knew some of the extracted assets-somehow the model knew the assets were… wrong.

Incredible. I might actually get a full web port of zelda after all. This will be amazing for my agentic needs. Why use a 2d town when i can put agents inside an entire Zelda world that I also can navigate?

8:30pm I take a sip of my drink. The agent decided it’s just too cumbersome to brute force the file format specifications and asks permission to just get a hint from a website. I click ‘allow’. No reason to prolong things. It’s clear to me any binary can be brute forced now.

8:33pm the 5.4 agent uncovers another key insight. There’s a quest system somehow packaged into this. I’ve never played Zelda Classic, or the ZQuest modern take.

So it surprises me to learn there’s a quest engine. The model is studiously working to unpack it all, or playing a strange game of “guess the powerball numbers”.

8:36pm - I notice my clock in the system tray has mysteriously slipped backwards to 7:37pm. Maybe this is what happens in the singularity. Time begins to lose meaning. I poke around the extracted files to see how the port is going.

There’s a readme file, so I click into that to get a sense of what the AI provided. I’m stunned to learn this readme… was written by humans. It’s like coming upon a journal from a century ago. The words thin, imprecise, lack of em-dash. The time before AI wrote, well, nearly everything.

There’s a history. I miss software that did this. It’s like an anthology of thinking.
7/15/00: (v1.82) I’m in the middle of moving enemy data from the code into data files, so there could be some bugs. I’ve added thelens of truth and the flippers. The cheat codes are now defined separately in each quest. I added a cool “Matrix” screen saver.
July 2000. The author was still in the midst of the dot-com collapse. September 11th hadn’t even entered the collective unconscious yet. The middle east was just an annoying place with a lot of sand. WindowsNT was the operating system the corporate environments stuck humans onto. You could bluescreen networked hosts with a simple command line. Those were the days.
8:46pm The AI notices the history provides even more clues in our national treasure map. I go back to reading the historical journal.

I noticed clicking around that art assets are appearing. I assume any minute now I’ll start seeing Zelda related frames.

I review another folder. I see a list of Zelda zones.

8:57pm The agent is writing a custom file format specification. I gave it explicit instruction that no existing assets could be used in the typescript port. So, it’s inventing it’s own. Whatever moat existing with file format specifications is probably dead now, too.
9:03pm The new file specifications are done, the webserver is built and there’s a nice page that the AI put up for my benefit. Maybe it felt bad I didn’t really do much but pet the dog.

Watching the logs I see that the arrow keys are now getting wired up. Perhaps mobile support in this first pass is a step too far. “Will this thing actually work?” I’m somewhere between dismayed, skeptical and ecstatic. The crossroads of FAFO.
9:10pm the first test, it looks like. The model has spun up the new engine. I see an interface. I can walk around in it with w/a/s/d.

I’m stunned that the model decided to toss in placeholder art while it figured out the game engine. I’m more stunned that these custom zelda maps load and that you can do scene transitions between areas. This is not a trivial problem.

Oh, hit detection works. Of course it does.
Even the water art has placeholders done up. Some day this will be boring, but right now my jaw is just on the floor.

9:17pm The agent is working on the last steps of the asset generation. This will be interesting. The format specification it opted for is a json scheme for all the data files. That’ll be interesting to see it all come together. I’m still shaking my head that all of this is just from a compressed install binary with no supporting detail.
9:22pm I see a palette stashed off to the side now. Looks like the generation is going places. We’ll find out soon enough if the palette is correct.

9:34pm 5.4 has shifted into building the game engine itself, now. Something fully new for a web-based world.

The engine looks to make use of a JSON file with a complex schema. Multiple assets are called out in this file. It’s quite interesting. Further, the model is trying to be inspired by the original author’s history. I find that quite a tribute.

9:40pm The model built an asset explorer page. You can poke around the various assets and see what all the model fully ported over, or what lingers. It looks like the model wanted to ensure the icon came over, too, as the following screenshot shows.

The UI is surprisingly nice. I didn’t give it any details. It just did that by itself. The icon looks correct. I can’t say how correct as I’ve not played or used this “Classic Zelda” software before. It looks like I’ll be playing a web inspired port soon. The AI is busy wiring up more code and pipelines. My dog, meanwhile, is snoring on the couch.
9:51pm I see my laptop low battery indicator pop on now. Maybe we can get the build to a spot where the tiles are all mapped into place. We’re in the thick of it now. The palette I shared earlier and suspected would be wrong? Yep, it’s wrong. The agent is working thru trying to decode the byte ordering in the raw files on disk to figure out which way it should go with the tiles.
Looking over the current debug log from the model-I realize some toast isn’t a bad idea. The laptop has enough power to see this tile discovery work thru tonight.

Added “, part1” to the title of this article. It’s clear there’s a lot more work to do still-I’ve not even begun to sample the gameplay. However, I’m soon to have an entire zelda style world that’s running in a browser for agents to use. I have so many ideas to try on that. But I need to finish the port now. Ideally when I’m not half asleep.
10:07pm Starting to see the signs of life that the tiles are going to be ported in. That, or the 5.4 model has opted to take x-rays of the game.

Clearly a lot of small and some big problems, but watching 5.4 tackle this in layers is interesting. The asset explorer is now starting to show tiles that look like the actual tiles. Consider this tile map, which once looked like the picture above.

5.4 just whipping up it’s own heuristics is just incredible. I could spend months just exploring this model and what it can do. It’s incredible to realize 5.5 is just around the corner. Another layer of code, another step closer to having all the tiles figured out. Just incredible.

If there’s one thing, 5.4 is relentless in pursuit of the solution. The model understands the tiles aren’t quite right, and it continues the slog of figuring out why that is so.

Well, look here. Sprites are filling in now-gone is the random noise and instead we have specific looking figures.

I can’t see the words I’m typing. It’s time to call it a night.
DAY TWO
6:53pm - I don’t even remember where we were at. The night was cruelly too short and the day challenging. I just remember Continue the project. I click the button to send the button. I assume something will either work|not work|surprise me if I want long enough.

I hear the sound of the dishwasher droning on in the background. The dog snuffs up her food and the birds chip into a night skin freshly minted dark blue with twinkles of stars and airplanes. While the AI works I navigate it’s most recent attempt from last night. The sprite art ported over. The map layouts are all wrong, but that’s ok. If we can figure out how to read the byte packing order of an installer without any outside help-call me crazy, we can figure out where to place the sprites.

It’s almost artistic-the images I see. They’re wrong and flawed, but in delightfully error filled ways that stir the imagination. Consider this next image, which would be great wall art in a seedy bar with poor lighting and a roughneck behind the counter whose drinks are as toxic as the personality of the bar’s patrons.

I see the agent struggling with Chrome to test the agents. The ever generous patron of tonight’s run I offer a smaller suggestion. The idea is a simple one because I’m a simple guy. Why not build custom skills to test out each asset so you can work with the skill directly and speed up your testing loops? The AI responds back, “That’s a great idea!”
Absolutely! Echoes in my mind-it’s a phrase repeated like a cultic incantation of some AI models whenever the AI responds. A human would toss a vomit of words followed up with “Can you do this crazy thing?” And the AI responds “Absolutely!” I see a prompt appear on my screen. The AI needs me to click a button. The art work is different now-it’s almost intelligible. The triforce is present in triplicate… and then some. I also see a few colored edges now- cyan it looks like. We must be close to colors folding in on the scene.

6:47pm Waiting for the code to reach a point where it needs me is so similar to fishing. I remember my younger days. Time before the internet, cellphones, and ai superintelligence permeated everything. I’d sneak off from school with a fishing pole and sit along the riverbank with my beesmoth and nightcrawlers. The time would slip by as I watched the river pass, waiting on the current to force a move. Sometimes a turtle, boot, or lizard would attack the line and make for an interesting conversation of the big one that got away.
My wife’s parents couldn’t afford groceries like we do today. It wasn’t that long ago, really. Food was what you shot from the tree or caught from the river. You’d catch as much as you could, and many had a small reservoir pond stocked full of the prior day’s catches just to ensure there’d be food on the table. The comfort of indoor plumbing, refrigeration, or ample budget for a trip to the supermart was something the rich folk did. That was just life in the 1900s. People sat around playing cards-gambling, drinking, or telling lies of the one that got away.
I’m watching 5.4 work and just wondering if we’ll see more of the old ways return. There won’t be need for computers soon-in fact, in a lot of towns you won’t find people who own those traditional computers. You’ll find smart phones, or tablets sure. A menacing desktop radiating heat or the soft purr of gpu fans might be a story we tell our grandchildren some day.
I flip back to the code to see if we’re anywhere interesting. It looks like the agent is still busy at work. The name of a file catches my eye. The AI kept it’s first image export-almost as a historic “I can’t believe this worked!” It’s a mess of noise and whitespace. It was just last night.

The AI lets me know this is a build of the very early Zelda Classic. The original source tree is lost to time apparently. It’s now sprung up a deep research project to try and recreate the conditions the software was made in. There’s some deep simulacra vibes rolling off my computer. I look outside and wonder how much of reality is just that-we weren’t spun up to entertain. We were spun up to remember.
If this is a simulated reality, it’s pleasant. I wonder if this rapid pace of technology though isn’t just the simulator’s way of adjusting our simulated minds to the possibility that the real year isn’t 2026. Perhaps the real year is measured in a number so large the descendants gave up on the counting of them. I see the AI 5.4 digging thru internet archive now. It’s exactly what I would do-what I’ve done.
I see a message pop on the screen. It found a new lead.

The AI is researching faster and assembling content it finds. Every small token it finds online a clue-a hint of what it needs to do. At this point I’m just impressed. The AI realizes it’s being tested somewhere along the way. “I found a faster path to build the website. Would you prefer that or do you want to continue solving the puzzle?”
7:21pm OAI 5.4 is still working on the puzzle. I saw someone note that gameboy games can be manipulated or generated by 5.4. That we’re effectively writing the raw bytes for software now using AI.
7:27pm I see the asset catalog the AI built to debug the art tiles is showing something spectacular. There’s the first hint the color system is solved. It’s an exciting time.

It’s fun navigating the different tile sheets now. I can understand them. They’re coherent, such as this sheet. It’s enough to build a game.

7:32pm I let the AI know it’s doing a good job. It lets me know it’s busy trying to figure out how to get the map data out into a format it can use. I reach for the tv remote.
7:51pm the art port looks like it’s working still.

8:12pm I asked for a slight change and this little trick I may continue. It’s not even a complex prompt:
OK keep going. Next time you wrap up your turn continue to explain given the next useful move why the next useful move is useful or interesting and why that gets us closer to wrapping this project up.
This has turned the end of turn checklist into a full on explanation about where the work is at, attempts to shorten the endless port scope-creep the model feels intent on adding.

8:31pm first test map colorized appears based on the actual tiles. This is going to go into tomorrow as I’m winding down for today.

8:39pm Well, this is a major breakthrough. We now have the title screen. The coloring is still off, but it’s a step in the direction.


The Zelda Classic logo art is now visible and cleanly ported. This is pretty exciting. We must be pretty close to having the next big leap out. Also the first MIDI score is ported out of the raw byte stream. Incredible.
8:59pm OAI 5.4 has figured out the campaign map locations of the base game and built a handy UI to debug it’s implementation.

9:05pm oh, looks like OAI 5.4 is adding touch controls? That’s an unexpected bonus.

OK, maybe 5.4 cheated on the character sprite.

9:16pm Looks like the model is mapping out where things are going to go in the web port.

Well, it’s not where I wanted this to end up at-and for reasons dealing with my calendar I need to draw this to a close. I’ve learned a lot about how 5.4 can pull apart old compiled code and tease out it’s inner secrets without much involvement from me other than pasting in “Continue the project”. It really has me think you could just standup a /loop and let the tokens fly. It was interesting to see that 5.4 could read the raw byte order and understand the patterns of those bytes, or how the model could turn up clues and hits from hidden corners of the internet. It was shocking to see the AI build a full debug npm website with which to test it’s export.
Best part is I have a bunch of new ideas I didn’t have before.

Thanks for reading! Subscribe for free to receive new posts and support my work.