TSB 2027 BASE [STANDARD] — Update #2: 35 Years, One Gap, 29 Bytes

Whew.
Weekend’s almost over and it was a productive one. Let me tell you the ways.
We found the freeze. The real one, the one that’s been in Tecmo since 1991 — the one where the music dies and everybody on the field locks up and you just reset and pretend it didn’t happen. We know what it is. It’s patched. It held up in every test we could throw at it this weekend.
The ROM expansion is finished and verified, with a quarter-megabyte of clean space sitting in it. The test rig got rebuilt and it now plays complete games by itself, all night, picking its own matchups. We caught a bug in our own test code before it wasted a night of data. And three separate scares turned out to be nothing at all.
Football’s back this week. Good timing. Here’s how all of it went.
We know what the freeze is.
Tecmo has a little traffic cop inside it that keeps track of everything happening at once — the animations, the clock, the music. When something new needs to happen, the game grabs an empty slot on the cop’s clipboard and writes it down.
Grabbing the slot and writing it down are two separate motions. And there’s a split second between them where the slot looks empty but isn’t.
If the game gets interrupted right there — and it gets interrupted sixty times a second, every second — two different things can walk off believing they own the same slot. The clipboard turns to nonsense and everything stops.
That gap is about twelve millionths of a second wide. That’s the whole bug. Thirty-five years of people resetting their consoles over twelve millionths of a second.
It also explains why nobody could ever make it happen on purpose. It isn’t a play, or a screen, or a bad cart. It’s a coin flip with terrible odds that the game flips thousands of times a game, and once in a great while it comes up wrong.
And we got it without ever catching one in the act.
Last update I said a test rig was rebooting the game over and over, waiting to catch one in the act. It’s still running. It still hasn’t caught one.
So we went at it the other way. Claude built a little test bench that runs the real game code and then interrupts it at every single possible moment inside that routine — not randomly, every one, on purpose. Ten of them broke the game, and broke it in exactly the way the theory said they would. Then we put the patch in and ran all of it again. Nothing broke.
The fix is 29 bytes. It makes the game finish writing on the clipboard before it lets anything interrupt. That’s it. The actual bytes and addresses are in the project notes for anyone who wants them.
Two things I want to be straight about. First, this is an original 1991 bug — that part of the game is untouched from the day it shipped, so nobody’s hack caused it. Second, it isn’t officially closed. The patch is in, it holds up in testing, and three ROMs booted and played clean for me this weekend. The long season test is still running. And if that rig ever does catch a real one, we can replay that exact freeze against the patched game and watch it not happen. That’s the last box.
The rig plays the game by itself now.
The old test rig booted the game and watched the intro. Over and over. Fine as far as it went, but the game does a lot more than boot.
So it got rebuilt, and this was the fun part of the weekend. It boots the game, sits through the whole intro, sets both teams to COM, picks a random matchup, and then just watches football. When the game ends it clicks through the stats screen, resets, and does it again with a different matchup.
Overnight it played twenty-some complete games without a hiccup. That’s five times more of the game getting exercised per cycle than the old rig managed, and it covers the parts that actually happen during play instead of just the title screen.
It hasn’t caught a freeze yet. Worth being clear that this doesn’t prove anything on its own — it’s running an unpatched build on purpose, because we’re trying to catch one, not confirm a fix. Zero so far just means the odds really are as long as everybody always said. That’s the whole reason it got rebuilt. Every night it runs now covers more ground than the entire hunt did before it.
We caught a bug in our own test code.
Quick story on this one. The first version was supposed to pick a random matchup and it kept landing on the same teams. I watched it a while and told Claude: it just hits up.
It was. The random number generator it was using isn’t actually random in the small way we were asking for — the part we were reading off it just counts up, over and over. So the cursor went up, down, left, right, back to where it started, forever. Same two teams every time, guaranteed, by accident.
Fixed, and then fixed again when it turned out that even with real random numbers, poking one direction at a time barely moves you anywhere. It picks a direction and holds it now, and it wanders three times as far.
The lesson is one worth passing on. Your tools need testing too. We nearly spent a night gathering data that would have all been the same game.
Three scares that turned out to be nothing.
Three separate times this week the game looked dead on screen. Frozen, stuck, nothing responding.
None of them were. Every time, it was the test script that had died, not the game. The game was sitting there perfectly happy on a menu, waiting for a button press from a script that wasn’t around to press it anymore.
That one cost us a day, and it’s now a rule around here: “the game froze” is a claim, and it has to be proven before anybody believes it. Three quick checks settle it. Is the emulator still counting? Can I move around the menu with my own controller? Did the log stop at a suspiciously convenient moment?
Still open, and I’d rather say it than skip it: we know the scripts died, we don’t know why. The new rig avoids the problem instead of explaining it. It’s on the list.
The expansion is done, and it turned out to be the thing in the way.
Program space is doubled, checked, and clean. That is the piece everything else has been waiting on, and here is the part we didn’t see coming — it’s also what the freeze fix was waiting on.
The patch has to live in a specific part of the ROM, and that part is full. The 2pt conversion patch is sitting in it.
So the freeze fix can’t go into the base until 2pt moves somewhere else. The bug picked our build order for us.
Good news is that work is already done. We expanded using the same approach the classic 2007 expanded ROMs used, and we check ourselves by running our tool on an untouched 1991 ROM and comparing the result to a known-good expanded ROM from back then, byte for byte. It comes out identical, so the transform is provably right. Run it on our build and there’s a quarter-megabyte of verified empty space waiting.
Next job is moving 2pt into that space and putting the original parts of the ROM back the way the master list says they should be. That’s the long one, and it’s now the only thing standing between here and a base that takes the freeze fix cleanly.
One note for anyone editing an expanded ROM: TSB Tool handles most of it fine but quietly misses a few things that moved. So we do all the tool editing before expanding, and expansion is the last step. There’s a patch written to teach the tool about the new layout, and it stays in the vault until the base is done — no sense handing the author a moving target. When the layout is final he gets one patch against one stable thing, with the reference ROMs behind it.
Credit where it’s due.
bruddog, for the disassembly — none of the freeze work happens without it. cx_rom for the 32-team foundation and the expansion approach this build follows. Suede Wade for the 2pt conversion patch, which this whole base is built around and which the next stage is about carefully rehoming. BAD-AL for TSB Tool. Knobbe, whose read on PA/PC matched where we landed on our own. jstout, whose work keeps turning up underneath everything.
Where things stand:
- The freeze: we know what it is, and it’s original 1991, not anybody’s hack
- The fix: written, holds up in testing, three ROMs played clean; season test running
- The test rig: playing full games by itself, twenty-plus overnight
- The expansion: done and verified, a quarter-megabyte of clean space in it
- Moving 2pt into that space: next, and the last thing in the way
- Why our old test scripts kept dying: still don’t know
A week ago the freeze was a ghost story and the expansion was a plan. Tonight the freeze has a name and a patch, and the space is sitting there ready. Not a bad weekend.
Enjoy the games this week. More when there’s more.
