Skip to content

To the finish line ​

2026-10-23, tenth session.

CLASSEMENT, Circuit Beltane: eight drivers, Joueur 1 eighth

The results screen after three laps of Beltane. Every key press in the race came from a script.

The goal for this session was the first target on the new road to playing POD: a full race under the keyboard, from the menu to the results. It took most of the day, and almost none of it was about POD's own code.

The wall on the Mac ​

The game had reached its demo race in a window under Wine on the Mac. But as soon as the menu appeared, the menu froze. Wine said "nested exception on signal stack" under Wine 11.0. Under Wine 11.18 it said nothing, and the game ran at 100% CPU with nothing moving.

We tried, one at a time:

  • no sound;
  • no CD audio;
  • a bigger stack;
  • stopping the game from suspending its own thread;
  • stopping the Watcom runtime from reloading segment registers;
  • two newer Wine builds.

None helped. A register dump explained why: the fault was not in POD at all. When a 32-bit program makes a system call, Wine on Apple silicon jumps into 64-bit code, and now and then the jump happens without the switch to 64-bit mode. The 64-bit code then runs as 32-bit code and wrecks the thread's stack pointer. We recorded it as an open problem with every attempt listed, and moved on. We will report it to Wine only if a test program with no POD in it shows the same thing.

An emulated PC ​

The next route avoided Rosetta entirely: Debian 13 for x86-64 under QEMU's emulator, with Wine 10 and real 32-bit libraries inside it. On an M3 Max the game keeps up with real time.

MENU PRINCIPAL in rust and orange

The main menu in its real colours. On the Mac it had been blue and green: a colour bug in that route, not the game's look.

Three more lessons, each found from a trace rather than by guessing:

  • A folder is not a CD. Under Wine on Linux a folder mapped as D: is a fixed drive, and the game asks for its CD. So we cut the disc image's data track into an ISO and attached it to the virtual machine as a real CD-ROM drive. Wine must also be allowed to open the device, because it reads the disc's label from it.
  • No window manager, no keyboard. With a bare X display, Wine never brings the game's window to the front, and DirectInput ignores the keys. A small window manager (openbox) fixed it.
  • Cancel means quit. The "insert the CD" box quits the game on Cancel. A blank row in the pause menu is skipped by the arrow keys, which once took us to "Quit" instead of "Main menu".

The track list: Beltane, 7.71 km, three laps

The car screen: GAMMA, acceleration 49, brakes 25, grip 95, steering 82, speed 49

The track and car screens. The car's five figures are a check for the car-parameter decoder.

Driving it ​

The race does not end until the player's car finishes. After all seven computer cars had crossed the line, the race carried on with us two laps down. A first driver that steered by the yellow edge lines in the picture drove into walls, so we read the game instead:

  • A memory diff while accelerating found the player's position. The car-parameter session had already worked out that the eight race cars sit at 0x61aad0 + racer × 0x558, and the first three words of each are the car's position.
  • The chase camera, at 0x60bba0, and the point it looks at, at 0x60bbd0, give the car's heading, even when the car stands still or reverses.
  • One of the computer's cars, recorded for a lap, gave a racing line in the game's own coordinates. It was back at its start after 112 seconds and 7.7 km, and Beltane's lap is 7.71 km.

Lap 3 of 3 at 150 km/h

The line follower steers toward a point 45 units ahead on that line. It is no racer: laps of 2:58 and 2:31 against the record 1:47.75. But it finished.

What it taught GameFrame ​

Every wall above is now an entry in docs/gameframe-lessons.md, with its symptom, cause, evidence and status: solved, worked around, or a dead end. A separate session has turned these into GameFrame's failure-mode catalogue and ./gameframe advise. The next agent that sees "nested exception on signal stack" or a game that asks for its CD should find our answer before it starts.

Next ​

The user's next aim follows Un-Banished: a wrapper around every build of POD (software, MMX, 3dfx, ATI, S3) with modern rendering and upscaling, and then an exact reimplementation with a track editor, a vehicle creator and a mod layer on top. See the plan.

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