SkiFree, 16-bit (Entertainment Pack 3)
Registered as wep16_ski (wep16('WEP3', 'SKI')). The 32-bit build is
skifree.md.
Route and controls (headless)
The start screen is up by ~1500 batches: skier standing, HUD all zero.
Holding Down (keydown:0x28 ... keyup:0x28, ~200 batches) sends the skier
downhill; the scenery scrolls and the HUD distance rises (986 m by batch 1800
in the evidence run). The HUD Time stays 0:00:00.00 in free skiing; see below.
Frame counter
--trace-win16, windowed with --input=B:set-win16-trace:1/0: each game
frame makes one GetTickCount (USER.13) call and redraws the four HUD lines
(TextOut x4). Over 100 batches: 23 frames skiing, 34 idle. The rate is
interpreter-bound: 23 frames per 100 batches at both 200 ms and 20 ms per
batch, while the guest time between frames scales with the tick. Evidence
scratch/runs/20261010T0920Z-wep16_ski-control-frames-w6.
The HUD Time is a slalom course timer (2026-10-10)
GetTickCount (USER.13) is SKI.EXE's only clock. HUD Time is DS:0xbb4 =
tick - DS:0xbb0, updated only while DS:0xbc6 is set (seg1:0x1c12) and
frozen at the finish (Y > 0x21c0). seg1:0x1d60 sets DS:0xbc6 only when
the skier crosses the start line with relative X in [-576, -320]: the slalom
gate. --trace-at=0x101d56 prints that crossing X in AX: straight down is 0
and down-left -311 (Time stays 0); Left for ~20 batches then down-left is -331
and the Time runs (0:00:36.86). Evidence
scratch/runs/20261010T1000Z-skifree16-hud-time-w6.