Skip to content

Moving to POD Gold ​

2026-10-24, the race-loop session.

POD Gold's menus in English: main menu, options, graphics options with 800 × 600, the track list in miles, the car screen, the pause menu

POD Gold 2.8 in the emulated PC, in English. The first edition had no English at all.

The user decided that the project follows the last version released, the one with the most fixes. That is POD Gold 2.8, seven months newer than the first edition everything had been measured on. Six steps moved the project across.

The two programs, matched ​

Gold's WINPOD.EXE, PODMMX.EXE and the five 3D-card builds were exported with Ghidra. As with the first edition, about a third of the code lay outside any function, so the gaps were filled the same way.

Then the matching. GameFrame's matcher compares decompiled text, and our first byte-level pass found only 374 functions identical between the two editions. Looking at close pairs showed why: Gold was compiled with other settings. Jump targets are padded with nop and lea eax, [eax], registers are chosen differently, the code sits at another address. Most of the "differences" were the compiler's.

The matcher we wrote (run/versions) works in rounds:

  • instructions compared with relocated addresses, call targets and padding masked out;
  • callees and globals paired through the matched functions' calls and references;
  • the closest instruction sequence;
  • GameFrame's decompile matches as extra leads;
  • and, for functions rewritten past recognition, the set of already-matched globals and callees they use.

That last pass found the race loop, the lap line and the physics step. 2,258 of the first edition's 2,942 functions are matched, and 273 of our 309 names now sit at Gold's addresses (labels/gold/). The controllers, reached only through pointers, were paired by hand. Other sessions added their own (sound, AI) within the hour.

To tell real changes from compiler noise, each changed pair was compared by what it uses: constants, strings and mapped references. The race rules' constants are all unchanged: the clock's × 65, the step units, the 5.5-second countdown, the end timers, the 100-unit beacon range, rand and its seed of 1000. Gold reports allocation failures by name, has a new menu system for its 32 tracks and 16 cars, and the Cyrix CPU probe is gone.

Gold in the emulated PC ​

Gold needed its own patch list. The first edition's fixes carried over to new addresses, but two new problems turned up, both silent:

  • Gold quit at once, exit code 0, nothing on screen. A trace of its own calls ended right after the display checks. Gold's CPU check knows Intel, AMD up to the K6, and Cyrix; QEMU's emulated CPU calls itself an AMD family 6, an Athlon, which did not exist in 1997. Any CPU the check does not know makes the game exit. The patch makes it count as a Pentium Pro.
  • Gold went fullscreen and failed although the windowed flag was patched. Gold sets that flag again in code at start-up, which the first edition did not.

Both discs are labelled POD2_0, and the game takes the first such drive it finds. So Gold got its own display (:4), its own Wine prefix with only its own drive, and its disc as a cdemu drive, beside the first edition and the other sessions' games (run/vm/gold.sh). Started over SSH, it died with the session until it was started with setsid.

Gold's files ​

The readers met four new things in Gold's data:

  • lists that keep records after their count, which the game never reads (three "Night" circuit rows, and fifteen cars from the web site, not on the disc);
  • four sound banks with an empty section;
  • two all-zero texture records on the new track Mine;
  • menus with 200 item slots instead of 90.

Every file now reads and writes back byte for byte, and the disc tests read Gold's folder by default. The catalogue decodes 322 of Gold's 423 files completely and none fail; the rest are tracks and cars, which the Rust tests read.

Gold's own versions of the old tracks changed too, and not where one would look: the geometry, sky and beacons are the same, but the computer cars' race paths are new for every difficulty.

Three races on Gold ​

Track list page 2: Gold's fifteen new tracks, Azthec selected

The second page of the track list: Gold's new tracks.

Three reference races were recorded from the countdown with the readers from the race-loop work, now able to tell the two builds apart by the link time in their program header:

RaceWinnerBest lap
Beltane, EASYracer 2, 5'34"96racer 1, 1'48"16
Beltane, MEDIUMracer 7, 5'10"37racer 5, 1'37"32
Azthec, MEDIUMLazer, 5'26"15Lazer, 1'04"17

The Beltane recordings kept racer numbers only; from the Azthec race on, the recorder also stores the drivers' names, read from the game's menu entries.

In every race the cars' lap times add up to their race times, so the race records keep their layout on Gold.

Racing on Azthec: the opponents here are Luigi, Chris, Blaze and Jackal

Azthec has its own opponents. The player's car stayed on the grid.

Our own scripted driver did not get round Gold's Beltane. The VM was busy with five sessions at once, the game ran at a third of its speed, and the car wedged against a tunnel wall twice. So the computer cars' races are the reference: in the MEDIUM and Azthec races the player's car stays on the grid, and the race is left once the seven computer cars are home.

The race HUD on Gold, in English

One race to the end ​

The app session asked for a Gold race that reaches the results screen, so the end of a race could be checked too. Our driver wedged again, on a ledge in Azthec's first lap. This time we gave the player's car to the game itself: the same four writes Gold makes when it sets up a computer car, into the player's driver record. The car drove the rest of the race on its own, slowly, after a lost five minutes.

RANKING, TRACK Azthec: Maverick 5'56"83, Player 1 eighth, best lap Maverick 1'09"89, your best 2'10"23

The results of the whole Gold race. Every line matches the recording.

The end ran as traced on the first edition: the player crossed the line, the three-second end timer started, and the race loop ended 3.5 seconds of game time later. After the ranking, Gold shows a new table, "All time best 5 laps", for the track.

For GameFrame ​

Six know-how entries came out of the move, among them how to move a project to a newer version, almost every function differing between two builds, a CPU check that quits on a modern CPU, and a patched flag set again in code. The matcher and the build-aware memory reader are proposed for GameFrame's toolkit, each with the test it needs (docs/gameframe-lessons.md).

Next ​

  • Match PODMMX.EXE and the 3D builds to their first-edition twins, and export the DOS-extender builds.
  • A Gold race driven to the results screen by a scripted driver of our own, not the game's AI.
  • The race rules re-measured under the FPU word the game actually uses (0x027f), on Gold.

Prose CC0 1.0, code Apache 2.0. POD: Planet of Death is © Ubi Soft; none of its files are on this site.