Versions of POD
Two editions are known to this project, both with the volume label POD2_0, and a set of official updates, fan files and tools around them. Game files stay out of git: the first disc is in target/ (target/cd, target/disc), POD Gold in target/pod (cd, disc).
| POD (first edition) | POD Gold | |
|---|---|---|
| Source | archive.org item pod-planet-of-death-pc | archive.org item pod-2-0, "POD (1997) (CD ROM) + Extras" |
POD2_0.BIN | 563,877,888 bytes, MD5 cfb69249… | 698,685,120 bytes, MD5 9c427d46… |
| Data track | to 38:37:16 (173,791 sectors) | to 51:22:30 (231,180 sectors) |
| Disc mastered / EXEs linked | 1997-01-13 / 1997-03-07 | EXEs 1997-10-25 to 10-29; README "Version 2.8 (September 29th, 1997)" |
| Languages | French, German, Italian, Spanish (text); menu pictures in French only | English as well; menu pictures in all five |
| Tracks / cars | 16 / 8 | 32 / 16 ("the 16 others distributed on POD Web site", README) |
| Builds | WINPOD, PODMMX, 3dfx, ATI, S3 (each Windows and DOS-extender style) | the same, rebuilt, plus Direct3D (WPODD3D, PODD3DX), PowerVR at 800 × 600 (WPODPVR, PODPVRX) and two "64" builds (PODMAX64, PODFXM64, with MAXI64) |
| Also on the disc | README.TXT (English), manual.doc, FAQS.TXT, PODTHEME.EXE (a desktop theme), Game Service for internet play, mosaico.exe |
Measured 2026-10-24: every file of both downloads checks against archive.org's MD5. File lists from pod-viewer list --image, EXE dates from their PE headers, the rest from README.TXT.
What changed in the data
Gold has 423 data files against 289, and 136 of them are new:
- English:
DICOS/ENGLISH(three text tables) andMIMG/ENGLISH(32 menu pictures). - Menu pictures in every language: three new ones per language, and
10,27and53changed. - 15 new tracks, each
.BL3,.BL4, a picture and a sound bank: Azthec, Babelweb, Factory, Lake, Loon, Magnetic, Megapol, Mine, Parking, Pipeline, Road70, Skyrace, Spin, West, Zed.NUKE___1.BCHis also new. - 7 new cars, each
.BV3,.BV4, a picture and a sound bank: Arakn, Buffo, Frazer, HLRazor, Jaero, Shane, Truck. - Changed:
RESSON/FIX.MEG,SCRIPTS/BETAMNU.BIN(200 item slots a menu),CIRCUITS.BIN(35 rows, of which the game reads the counted 32) andVOITURE2.BIN(23 records, of which it reads the counted 8). The tracks of the first edition changed too, in their race data only (measured 2026-10-24 on Beltane: the same geometry, sky, animations, zones and beacons; different race paths for every difficulty, reverse paths and opponents, entries 1 to 8): Gold retuned the computer cars' lines. - Gone:
POLICES/PVRSHADO.BI2andRECORDS/SPECIAL.BRT.
Every reader handles Gold's files (2026-10-24, measured): the catalogue over Gold's DATA decodes 322 of 423 files completely and none fail; the 101 without a Python decoder are the tracks, cars and chrome (and NUKE___1.BCH), which the Rust disc tests read instead (all 66 tracks and 32 cars). What needed a change: the lists that keep records after their count, four sound banks with an empty section 1 (docs/formats/sounds.md), and two all-zero sub-texture records in MINE.BL3/.BL4 (docs/formats/textures.md). The disc tests now read Gold's folder when it exists and give each count for both editions.
What changed in the code
Gold's WINPOD.EXE (1997-10) against the first edition's (1997-03-07), matched function by function (2026-10-24). The map is labels/pod/map.tsv, the first edition's labels at Gold's addresses are labels/pod/names.tsv (273 of 309), and one note per changed function is in labels/pod/changes.tsv.
Exports (2026-10-24): Gold's WINPOD.EXE, PODMMX.EXE, WPOD3DFX.EXE, WPODATI.EXE, WPODS3D.EXE, WPODD3D.EXE and WPODPVR.EXE in analysis/export/pod/ (2,207 to 2,327 functions each before filling gaps; WINPOD.EXE filled to 3,431). The DOS-extender builds (POD*X.EXE, PODMAX64, PODFXM64) are not exported yet.
How it was matched (run/versions/match_builds.py, what_changed.py). Both exports first had their gaps filled (run/ghidra): Ghidra had left 31% of each build's code outside functions. Then, in rounds:
- equal instructions once relocated words (from
.reloc), call displacements and alignment padding are masked; - the n-th call and the n-th relocated word of two matched functions, aligned with
difflib, pair callees and globals; - closest instruction sequence among functions of similar size;
- GameFrame's decompile matcher (
tools/triage/match_functions.py) as extra leads; - the set of mapped globals and callees a function refers to.
Three hand-checked pairs (the controllers, reached only through pointers) are in labels/pod/manual.tsv.
Result. 2,258 of the first edition's 2,942 functions are matched. Of these, 545 have the same instructions, and 162 more give the same pseudocode with other registers or instruction order. 1,551 differ. Comparing what each of those uses (constants, strings, mapped globals and callees) leaves 267 with the same logic and 1,267 with some difference. The other 684 are unmatched; most are gap-filling candidates that are not real functions, or code rewritten beyond recognition. Gold has 3,447 candidate functions.
Gold was rebuilt with another compiler setting (observed). Gold's code section starts at 0x401000, not 0x410000, and is named AUTO, not BEGTEXT; the import table now comes before the data. Jump targets inside functions are padded with nop, lea r, [r] and mov r, r. Registers are chosen differently and function exits are duplicated. So most "changed" pairs are the compiler's doing, and a byte or pseudocode difference alone says nothing. The notes in changes.tsv are leads: what a function stopped and started using.
Changes seen in the notes (observed in the pseudocode, each a lead to read before relying on it):
Error messages around allocation. Many loaders gained the strings
ALLOCandMEMORY: Gold reports failed allocations by name (the track readers,pod_file_open,pod_file_create,alloc_beacons,smoke_alloc).race_resetgainedNB_MAX_INTER_PAR_TOUR,STATICandMEMORY: the "at most 4 checkpoints" stop now names its cause.load_menusreads\UbiSoft\Ubi.iniand aDIRECTORYkey itself, and the front end (front_end_loop,draw_menu,menu_back,main_menu_enter,goto_menu) changed throughout: the new tracks, cars and English need new menus.front_end_loopgained aBADMODEstring.The Cyrix probe is gone (
cpu_probe_cyrix,0x4a88b8): noout 0x22orin 0x23is left in Gold's code. Gold needs no patch for it under Wine.The car physics (
engine_torque,car_brakes,tyre_forces,wheel_spin,car_step) differ in constants. Part of this is the decompiler showing struct offsets in other ways (+0x4bcagainst[0x12f]). Part may be real:tyre_forcesuses0x4241and0x9471where the first edition used0x4240and0x9470, andengine_torqueandcar_brakesgained0x1cccc(0.45 in 16.16) and0x14000(1.25). Measured on Gold (pod-physics, 2026-10-24): the brake and torque constants are real changes; the tyre thresholds are the same tests as before. Gold's face records are 4 bytes longer, its track globals moved, and the chassis search's counter left the race block (0x4f3310). With those, all 8,327 car steps of a Gold race match word for word (docs/systems/physics.md). pod-physics now follows Gold only (the user's decision, 2026-10-24); what it had for the first edition, kept here as history:What First edition Gold brake and torque lead curve ( car_brakes,engine_torque)0x13fff,0x1cccd0x14000,0x1cccctrack face records quad 0x38, triangle0x1c; corners at+0x28/+0x10, flags+0x32/+0x184 bytes longer, after the normals sector count, sector table, surfaces 0x571f94,0x571f98,0x615ea80x57bf74,0x57bf78,0x62bc0cthe chassis search's counter (every 17th call, FUN_004253f4)race block +0x14(0x502114)0x4f3310, read in0x417884; Gold's race block starts elsewhere (0x4f8d44), its old head moved near0x4f32f0rolling resistance inline in car_stepa call ( 0x417be8), same resultrand()'s seedstatic ( 0x84fe64)the game thread's C library data, through [0x4ed728]the triple-product helper FUN_004dba44used by the face tests gone: the face tests use dot and cross products The first edition's measurements (
beltane-3, 2026-10-24): 20,488 of 20,488 car steps, the player followed through 2,561 steps, the catch-up scale on 2,008 calls and the whole simulation step on 101 steps under Unicorn. Its step log built at0x4e14c0and0x731470.The AI tactics (
ai_steady,ai_settle,ai_aim_if_ahead,ai_cut_in_*) differ in constants (ai_aim_if_ahead:0xd6d8→0xd6d9). Measured the same (2026-10-24): see "Controllers: the first edition against Gold" below.
Unchanged in Gold (observed by reading Gold's pseudocode at the matched addresses):
| Rule | First edition | Gold | What was checked |
|---|---|---|---|
| Frame clock | FUN_004ae894 | FUN_004a9b14 | ms × 65, clamp 700..30000, sum; frame time at 0x621b70 (was 0x60be0c) |
| Step unit | FUN_0049b6a0 | 0x3a8 / 0x444 at 0x621b60 | the same two values |
| Race loop | FUN_0049d4c0 | FUN_0049953c | race clock 0x4f9384 (was 0x502740) += frame time |
| Countdown | FUN_004815e8 | FUN_0047b98c | 0x157c ms of timeGetTime, seconds left = (start + 5500) / 1000 - now / 1000 |
| End of race | FUN_0042c120 | FUN_0041eb90 | 3 s (0x30000), 60 s in a network race |
| Unfinished cars | FUN_0047831c | FUN_00473240 | steps of 3 × step unit, up to 300 s (60 s network) |
| Beacon test | FUN_0042a3ac | FUN_0041cf2c | the same logic; 100 units (0x640000) |
rand | FUN_004d1877 | FUN_004c7f37 | the same bytes |
| Smoke seed | 0x460e90 | 0x45d2fd | srand(1000), then the same table loops |
The race globals moved: the race records from 0x502140 to 0x4f8d84, the order table from 0x502720 to 0x4f9364, the race cars from 0x61aad0 to 0x630838, the drivers from 0x61f870 to 0x6345d8, the chase camera from 0x60bba0 to 0x6218fc, the countdown phase from 0x5920a4 to 0x5a7604 (all in labels/pod/names.tsv). Their strides and layouts are unchanged (measured in a running Gold race, "Running Gold" below).
Running Gold (2026-10-24)
Gold's WINPOD.EXE runs in the emulated PC beside the first edition (run/vm/README.md, "POD Gold"), in English, as far as a recorded race (measured). Its patch list (run/wine/patch_winpod.py, GOLD_PATCHES) is the first edition's at Gold's addresses, found through the map and checked instruction by instruction, with these differences:
| First edition | Gold | |
|---|---|---|
Cyrix probe (ports 0x22/0x23) | patched out | gone from the code |
| CPU check | passes on QEMU's CPU | FUN_004a3dfc knows Intel family 5 and 6, AMD K5/K6 and Cyrix; any other CPU (QEMU's AMD family 6) keeps the kind 0xff, and FUN_004a1460 quits without a message. Patched: unknown CPUs count as kind 4 (Intel P6) |
| Fullscreen flag | in the data only (0x4f7260) | also set to 1 in code at start-up (0x4a147d, FUN_004a1460); both patched |
SuspendThread / ResumeThread calls | 4 and 3 | 1 and 2 |
| Display-mode callback | unbounded table, push ebx first | the same bug, no push ebx: its own cave |
| Resolutions in the graphics options | 640 × 480 and lower | 800 × 600 as well (software build) |
| Start-up | reads [osd] Valid from Ubi.ini and looks for pod2_0\pod2_02.exe (the online service) |
The race globals moved (run/vm/podaddr.py, labels/pod/names.tsv) but the race records, race cars and order table keep their layouts and strides (measured: in Gold's recorded races every car's lap times add up to its race time, and the HUD shows the same lap times).
The race rules (pod-race), first edition as history. pod-race follows Gold only since 2026-10-24. On the first edition (WINPOD.EXE 1997-03-07) it was checked against derived/race/beltane-3.jsonl (Beltane EASY, three laps, from the countdown to the results screen): every sample's records, all final records, the order and the results text (Maverick 5'36"17, best lap Shane 1'48"63), and the order between gates in 99.4% of samples with guessed lanes; and under Unicorn the first edition's FUN_0042a1f0, FUN_0042c264, FUN_0047e4d0, FUN_004b0ec0 and FUN_004afd3c on 20,000 cases each (measure/race_rules.py --first, race_paths.py --first). The same five functions in Gold (FUN_0041cd84, FUN_0041ed00, FUN_00478f7c, FUN_004abec4, FUN_004aad68) are recompiled ("changed" in the map) but give the same answers on every case measured; the record table's address, which the split pointers hold, is the one difference the port carries (pod_race::record::BASE). The first edition's gate measurement ran under 0x037f; the games race under 0x027f.
Updates, patches and fan files (same download, POD (1997) (CD ROM) + Extras/)
| File | What it is (first look) |
|---|---|
POD - Patch/10x21E.exe (35 MB) | A self-installing update; the name suggests 1.0 to 2.1, English. Not unpacked yet |
POD - Patch/updatePOD21_3dfx.exe (24 MB) | The 2.1 update for the 3dfx build. Not unpacked yet |
POD - Patch/pod3dfx.zip | A 3dfx patcher (UsePatch.exe, 1997–98) |
POD - Patch/podcpuid.zip (2004) | A community CPUID fix: compare with our Cyrix-probe patch (docs/running.md) |
POD - Patch/podUsb.zip (2005) | A community patch for USB joysticks |
POD - Patch/POD_nocds.zip, cdpatcher*.zip | No-CD cracks. Not used: the project runs the real disc image |
POD - Extra Cars/ (~50 zips), POD - Extra Tracks/ (~50 zips) | Fan and web-released cars and tracks, many in _3dfx versions. A test set for every reader, writer and the editor |
POD - Tools/ | Era tools: bl4viewer, bl4exp (a 3D Studio Max plug-in for .BL4), podpaint (with source), podpatcher (track .bin files for about 50 tracks), a French "TestEngine" |
PodHacks.exe | A community launcher with hacks. Not looked at yet |
The extra cars and tracks (checked 2026-10-24)
Gold's README says it holds "the 16 basic tracks and the 16 others distributed on POD Web site", and the 8 basic cars with the 8 from the web site. So every official web release is already on the Gold disc (observed, README.TXT). The download's POD - Extra Cars (51 zips) and POD - Extra Tracks (50 zips) hold three other kinds of content:
- 3dfx versions (
*_3dfx.zip): Gold's own tracks and cars, repackaged for the 3dfx build. - OEM versions (
AlderOEM,CityOEM,CanyOEM,GalOEM,PlantOEM,PompOEM,SewerOEM): base tracks in the OEM 1.0 release's form (inferred from the names). - Fan content: for example QBall's cars and tracks, Witnessteam reskins,
Newsance,ForgetitandTron. They install with Ubi Soft's CD Patcher. The game's track screen lists downloaded tracks after its own (README, "If you have downloaded tracks").
Unpacked into derived/extras/ (data files only: .BL3, .BL4, .BV3, .BV4, .IMG, .MEG, .BIN; no programs). Our readers decode 453 of these 474 files. None of the 21 that fail is a 3dfx version. Three are OEM tracks whose animated faces don't add up (CityOEM, CanyOEM, PompOEM). The other 18 are fan files: the F1, F2 and F3 cars (no texture block where expected), two .BV3 files with an impossible vertex count, a picture with bytes left over, and tracks that are cut short or have a gap between entries. Whether the game itself loads these files is not known yet.
Is Gold the latest? (checked 2026-10-24)
A first search found no official version after POD Gold 2.8. What it found, with how each is known:
- The editions. POD came out in February–March 1997 as an OEM version 1.0, much of it bundled with Intel's MMX launch. A retail "POD 2.0" added 3dfx, S3 ViRGE and ATI support. The expansion POD: Back to Hell added 8 cars and 16 tracks, and POD Gold bundles the game, the expansion and a new sound set (Giant Bomb, Wikipedia). That matches Gold's 32 tracks and 16 cars (inferred: our first disc, mastered January 1997, is the OEM 1.0).
- The patches (POD Underground's archive, quoted on Vogons; Ubi Soft's FTP site is gone): an OEM v1.0 to retail v2 patch, a Direct3D (DirectX 5) update, the 3dfx Glide 2.1 update (
updatePOD21_3dfx.exe, for the retail release), a CD-Patcher, force-feedback patches and Game Service 2 for online play. A poster there says POD Gold "is already patched to Version 2.8" and needs no further patch (Vogons, Vogons). - A second search (2026-10-24) found no patch numbered above 2.1 and no PCGamingWiki page for POD. Wikipedia gives a UK release of POD Gold in January 1999, but nothing says that build differs from 2.8. POD 2 (1999) is a different game, not a version of this one.
Decided (the user, 2026-10-24): Gold 2.8 as on the disc is the final version and the one we support. The only exception is an official updated build that turns up later, for example in a zip in an archive.
What it means for the port
POD Gold 2.8 is the only version worked on (the user's decisions, 2026-10-24: always the last version released, which has the most fixes; the first edition is not used for ongoing work). This page keeps the first edition's differences as history. Un-POD's 1:1 work up to that day was measured against the first edition's WINPOD.EXE (1997-03-07); Gold's EXEs are seven months newer and may differ anywhere, so each part is re-checked against Gold (docs/PORT.md, "Moving to POD Gold"). Every patch in run/wine/patch_winpod.py checks the first edition's bytes, so Gold's EXEs need their own patch list.
Sound: first edition against Gold (pod-sound, 2026-10-24)
A first pass, before the label map to Gold's addresses. Measured by comparing the files and, for the code, the first edition's routines byte for byte against Gold's EXEs with relocated addresses and calls to other routines masked.
Code. In Gold's WINPOD.EXE three routines are the first edition's, byte for byte:
| Routine | First edition | Gold |
|---|---|---|
| The mixer | FUN_004df88a | 0x4d85ba |
| The channel gain | FUN_004df859 | 0x4d8589 |
| The vector length (square-root table) | FUN_004db73d | 0x4d43ad |
The C routines of the sound library were all recompiled (registers, stack frames), so their bytes say nothing. They were re-measured instead: every sound measurement of docs/systems/sound.md run on Gold's WINPOD.EXE at Gold's addresses (measure/sound_builds.py, --build gold; the routines found with measure/sound_gold_map.py and Gold's call structure):
| Measurement | Gold against the first edition |
|---|---|
The mixer, 400 cases (measure/sound_mixer.py) | identical results, byte for byte |
The channel calls, 300 sequences (measure/sound_channels.py) | one change: the choice of ten (Gold FUN_004be26c) |
Length and 3D parameters, 5,000 cases each (measure/sound_space.py) | identical |
Events, frames and engine groups on each build's FIX.MEG, 150 cases (measure/sound_events.py) | identical behaviour |
What changed in the sound code (measured where it shows in the results, observed in the code):
- The ten mixed channels. Once ten are chosen, a louder channel now replaces the quietest of them (the first of equals). The first edition replaced the first chosen one quieter than it. pod-sound follows Gold.
- Stereo swapped at start. Gold's swap flag (
0x4E9A24, the first edition's0x698E18) is 1 in the image, the first edition's 0. With the same pan arithmetic, Gold turns the first edition's left and right around unlessUbi.inisetsStereo=0(the setting's default is the flag's current value). The stereo flag moved next to it (0x4E9A28). - An event recorder. The dispatcher (Gold
FUN_004b8d64) can record each fired event with its parameters into a table at0x6C6F20(when0x5829E4is set), and play back the parameters from there (0x5829E0,0x6C7044): inferred, the machinery of Gold's replays. Off in the image. - Refactored, same results: the channel step in a routine of its own (
FUN_004be510), the distance volume too (FUN_004b86b8), the frame update in a new order (it updates the engine groups before moving the listener; the lists and samples come out the same in the 150 cases). - The track loudspeakers, unchanged. "Son Localisé" and "Tue Sons Local" (Gold
0x470934,0x4709dc; the first edition'sFUN_00475b18,FUN_00475bbc) are the same code with the records moved to0x58DA74and the bank's event base read through the circuit row (observed). They start and stop the CD music in both builds (docs/systems/sound.md, "Who starts and stops the music"). - FIX.MEG's gaps. Gold's banks number events by their highest record number + 1, as before, so FIX.MEG's removed events 21 and 22 leave empty slots: firing one plays sound 0 (the tyre squeal), in Gold and in pod-sound.
The labels the map left unmatched are placed in labels/pod/names.tsv: read_bank_sounds004ba808, read_bank_smmh 004bad08, read_bank_events 004bae78, read_bank_sound004ba460, load_music_script 004bd308, sound_engine_start 004be854, sound_thread004bfbfc, play_channel 004bf74c, channel_playing 004bf544, sound_send 004b8888, sound_frame 004b95b0. Gold's PODMMX.EXE holds the length routine at 0x4d502d and no copy of WINPOD's mixer, as in the first edition. Not yet re-done on Gold: the MMX comparison and the recordings of the running game (they wait for Gold in the emulated PC).
FIX.MEG. The events keep their numbers, and the countdown voices, the CD sequence and the repair are the same sounds. The rest changed:
| First edition | Gold | |
|---|---|---|
| Engine group 0 | Monza, three layers (Monzaralb, Monzarap1c, Monzarap2b) | Moteur unique, one layer: hotpors22sb2, fade in 0 .. 1.0, full to 16.7, out at 23.3; pitch slope 6,073, offset 11,724 |
| Events 21, 22 (acceleration, deceleration, kind 9) | play Acc, Retro with the engine value on the pitch | gone |
| Brakes, events 14, 15, 33 | three sounds (Derap1, Derap2, FREIN1b) | one, Skid1, for all three |
| Crash (event 3), "scrash" (sound 3) | IMP_car, Imp2 | Hit3 (flag bit 0 cleared on event 3), Jump |
| Menu sound | pod4 | Menupod, the same length |
| Records 5 and 17 | Derap2, FREIN1b | removed (the numbers are skipped) |
Music. CDAREF.TXT, SCRIPT1.TXT, SCRIPT2.TXT and MIDIREF.TXT are byte-identical. Gold's image also has one audio track, track 2, from 51:22:30.
Banks. Gold adds 15 track banks and 7 car banks (above). Four of them (BABELWEB, FACTORY, SKYRACE, SPIN) have an empty SMMH section, which the game reads as no groups (docs/formats/sounds.md); the readers take it since 2026-10-24, and all 50 of Gold's banks read and write back byte for byte. pod-sound loads FIX.MEG and the 32 circuits' banks in CIRCUITS.BIN order (crates/pod-sound/tests/gold_banks.rs: 33 banks, 134 sounds, 150 event numbers).
Controllers: the first edition against Gold (pod-ai, 2026-10-24)
The controllers were traced, ported and checked on the first edition, then moved to Gold (docs/systems/controllers.md now cites Gold). They are the same in Gold (measured): measure/controllers.py on Gold's WINPOD.EXE with Gold's Beltane gives results equal to crates/pod-ai in every check (2,000 cases per routine, 15,000 steps of eight-car races, the player's controller, every word of the tables). The constant differences the matcher saw in the AI tactics are the compiler's. What changed: Gold reads each opponent's rules from text (FUN_0045f404: %ld, then %ld%ld%ld per rule; "Attaques_Disponibles", "Fich_Conc") instead of the track file's opponent records, and builds the start-up tables in four parts (FUN_004c5e88).
| What | First edition | Gold |
|---|---|---|
| Computer controller | FUN_0042f5f0 | FUN_004221d8 |
| Player controller | FUN_00423b3c | FUN_00415f9c |
| Neighbours | FUN_00472b24, FUN_0047299c | FUN_0046dc04, FUN_0046da4c |
| Lane following | FUN_0042f440, FUN_0042f36c | FUN_00422028, FUN_00421f58 |
| Behaviour step, rule draw | FUN_00462fe4, FUN_00462f40 | FUN_0045f2a0, FUN_0045f1f8 |
| Rule types to behaviours | FUN_00463154 (table 0x463114) | FUN_0045f36c (table 0x45f32c), stored by FUN_0045f3dc |
| Behaviours | 0x462430 .. 0x462f04 | 0x45e7c8 .. 0x45f1c4 (labels/pod/manual.tsv) |
| Steering index | FUN_004728f0 | FUN_0046d990 |
| Troncon lane, line search | FUN_004593fc, FUN_004598e4 | FUN_004559dc, FUN_00455ed0 |
| Buttons, key map | FUN_00474e8c, FUN_0047508c, FUN_00477b4c | FUN_0046fd18, FUN_0046fe80, FUN_004729e4 |
| Tables | FUN_004cfde4 (0x69d4c8 .. 0x6f54c8) | FUN_004c5e88 (0x6d4704 .. 0x72c704) |
| Draw clock, neighbour list | DAT_00572458, 0x5782a8 | DAT_00581e88, 0x58d770 |
Measured on the first edition only (to be repeated on Gold):
- Read from the running game with
run/vm/ctlsnap.py: an EASY race on Beltane (300 snapshots, 2,100 controller steps; racer 0 on the human controller with flags 1, racers 1 to 7 on the computer's with flags 2) and a MEDIUM race (Difficulty=Normal; 750 snapshots, 5,250 steps, 68 rule draws of which 8 took a rule). The port matched every step. - pod-physics' step logs (
beltane-2,beltane-3): 17,402 and 17,927 controller calls, all matching the port.beltane-3matched only after the port rounded at 53 bits: the game raced with the x87 control word 0x027f in all 2,561 steps, not the start-up's 0x037f, and under 0x037f one draft target (step 378) came out one unit off. - The opponent records on the disc: Beltane's EASY opponents had no rules; MEDIUM and HARD 2 to 10 each (
decoders/track_race.py).
Front end: first edition against Gold (pod-ui, 2026-10-24)
History, for the record: pod-ui was first traced and checked on the first edition in French. There, 97 frames captured from the original matched pixel for pixel (main menu, quit, help, race mode, track and car choice, pause and its confirmation, records); those captures (derived/ui/ref, derived/ui/seq) are retired.
What differs in Gold, found so far:
BETAMNU.BIN: a menu is0x374bytes, 200 item slots, against0x1BC(90) (observed in Gold'sload_menus0x428af8, step at0x428e09); items are still0xFC.CIRCUITS.BIN: 35 rows, 32 circuits, then three rows each holding "Night".- English text and pictures (
DICOS/ENGLISH,MIMG/ENGLISH); the track screen's length is in miles ("Miles 4.82": the English table'sINFOS/UNIT). - The menu code changed throughout (the label map's
front_end_loop,draw_menu,goto_menu,menu_back,main_menu_enter,load_menus);draw_outline,outline_box,draw_itemandmove_selectionare not matched yet.
Still from the first edition and to re-trace in Gold: the outline corrections (crates/pod-ui/src/render/outline_table.rs, measured with measure/menu_outline.py on the first edition's 0x43873c), every handler and action port in crates/pod-ui/src/screens/, the main menu's run-time item states, and the addresses the comments cite.