#!/bin/bash # ROADMAP P6a: ask the machine's own MSM6258V which decoder it is. # # tools/bench/adpcm_run.sh # # WHAT A GREEN RUN MEANS: 68000 code programmed HD63450 channel 3 exactly as the # IPL ROM programs it -- dual address, 8-bit port, cycle steal, EXTERNAL request # -- fed the chip a designed nibble stream at the chip's own pace, and exactly # ONE of sixteen candidate decoder models reproduces MAME's capture of the # result SAMPLE-EXACT, with every one of the four axes shown to matter. # # WHAT IT DOES NOT MEAN: anything about an MSM6258. This is MAME's device model # measured end to end through the machine's real transport. It settles the RIG. # The silicon stays on the hardware list. set -e cd "$(dirname "$0")/../.." tools/vasm/vasmm68k_mot -Fbin -o tmp/adpcmgate.bin src/player/adpcmgate.s > /dev/null python3 tools/bench/prep_adpcm.py # -samplerate 15625 is not a preference: it is the chip's own stream rate # (8 MHz / 512), and equal rates are what keep MAME's resampler from filtering # the thing being measured. The first cut of this ran at the default 48000 and # every reconstructed sample arrived as an interpolated pair. ( cd tmp && SDL_VIDEODRIVER=dummy stdbuf -oL timeout -k 5 300 \ mame x68000 -bios ipl10 -ramsize 2M -video soft -window \ -samplerate 15625 -wavwrite adpcm.wav -nothrottle -plugins \ -autoboot_script ../tools/bench/adpcm.lua \ -seconds_to_run 12 > adpcm_run.log 2>&1 ) grep -aq "^\[ADP\] done" tmp/adpcm_run.log || { echo "FAIL: the ADPCM gate did not finish -- no completion marker." tail -8 tmp/adpcm_run.log; exit 1; } grep -a "^\[ADP\]" tmp/adpcm_run.log | sed 's/^\[ADP\] / /' fail() { echo "FAIL: $1"; exit 1; } if grep -aq "^\[ADP\] ERROR" tmp/adpcm_run.log; then fail "the channel reported an error or the gate timed out -- see CSR/CER above." fi grep -aq "bit7 clear = playing" tmp/adpcm_run.log || \ fail "the chip never reported itself playing." # THE FEED RATE IS A GATE, not a note. The chip is the pacemaker: one byte per # #DRQ3 and #DRQ3 at half the sample rate. If the bytes went out at some other # rate then the channel was NOT being paced by the device, and every sample # below is of a stream that arrived faster or slower than it was consumed -- # which is precisely the failure session 33 hit from Lua. RATE=$(sed -n 's/.*= \([0-9.]*\) B\/s .*/\1/p' tmp/adpcm_run.log | head -1) python3 - "$RATE" <<'PY' || fail "the feed was not paced by the chip (see above)." import sys r = float(sys.argv[1]) want = 7812.5 print(f" feed rate {r:,.1f} B/s against the chip's own {want:,.1f} B/s " f"({100*(r-want)/want:+.2f}%)") sys.exit(0 if abs(r - want) / want < 0.02 else 1) PY python3 tools/bench/verify_adpcm_chip.py tmp/adpcm.wav tmp/adpcm_seq.json