FINDINGS 71, ROADMAP P6d. 70.3 named exactly what was missing -- packed.s starts
PG_AK/PG_AKF at lump 0 and has no audio seek path -- and priced its absence at a
mean 416.5 ms of silence over the arcade's 409 within-container seek targets.
pg_aseek is that path: the lump index, the stream position, the remainder
accumulator and the byte offset into the group, then the second READ(10) at the
lump's own LBA and a re-arm part way into the buffer. Measured off a real volume:
132,162 B of spliced stream accounted for byte by byte in MAME's own capture,
across a branch at frame 37 -- four frames into lump 3, deliberately NOT on a
group boundary -- in both chip configurations. Skip computed 2,604 B, cadence
says 2,604.
THE PREDICTOR DOES NOT SEEK, AND THE ERROR IS DC. The MSM6258's accumulator is a
pure integrator with no leakage term, so a branch that hands the chip bytes chosen
for a state it is not in produces an offset that does not decay. Playing through:
DC -355 of 511 with AC 0.00 -- the right shape from the wrong ground -- still -108
four seconds later. STOP and re-PLAY: all 62,500 post-seek samples are EXACTLY a
decode from the container's own init, and the whole error is the single constant
-65. A re-PLAY is 5.5x better and neither is zero, so PG_ARST is a mailbox with a
number under it. The host computes -65 out of the container's bytes and the gate
asserts the equality rather than printing both.
AND THE ONLY FIX THAT REACHES ZERO IS THE ENCODER'S. A player cannot set the
chip's accumulator, only reset it. Resetting the encoder's predictor every frame
makes all 119 of the container's branch points exact for 0.33 dB (21.99 -> 21.66),
because the step table's floor is a constant 16. That is a DLXP3 and it is
deliberately not in tools/encoder.
TWO SILENT BUGS, BOTH CAUGHT BY THE CAPTURE. pg_udiv32 trashes d4 and pg_aseek
held hz there, so the offset came out 1 byte instead of 2,604 -- 166 ms of the
wrong part of the scene at exactly the right rate, every counter agreeing. And
one already in the tree that had passed this gate three times: pg_ainit waited on
a READ-BACK MTC before PLAY, which is the same test as "a byte has left RAM" only
if no byte leaves in between. One does, and the chip then plays the scene one
byte in, forever. Found by locating the capture's opening samples in the
container image: sector 1 + 1. The witness is now the count that was written.
ALL GREEN, two new stages included.
Claude-Session: https://claude.ai/code/session_01194oWYW8DQXK1SZ2DnChW6