#!/bin/bash # One MB89352 transport run: the 68000 selects a SCSI target and reads the disc # itself (ROADMAP P4, first half). # # tools/bench/scsi_run.sh [container.dlx] # # THE APPARATUS, AND ITS TWO SUBSTITUTIONS, BOTH DELIBERATE AND BOTH LABELLED. # # 1. THE BOARD. `x68000 -exp1 cz6bs1`, which is what FINDINGS 42.5 says to # benchmark and never `x68ksupr` -- the Super/XVI internal SCSI is PIO-only in # MAME (`// TODO: duplicate DMA glue from CZ-6BS1`), so it would measure a # fallback the real machine does not have. # # 2. THE BOOT ROM. MAME refuses to instantiate the card without an 8 KB # `scsiexrom.bin` (CRC 7be488de), which is not in this tree and is not on this # machine. This script writes a ZERO-FILLED placeholder into its own rompath, # so the user's romset is untouched, and MAME prints WRONG CHECKSUMS as it # should. That is honest HERE and would not be everywhere: the player drives # the SPC registers directly and never executes a byte of that ROM -- which # was already the plan in docs/BENCHMARK.md item 4, long before the ROM turned # out to be missing. DO NOT reuse this rompath for anything that boots from # the card or calls SCSI IOCS; those DO execute it. # # WHAT A GREEN RUN MEANS: the 68000 reached the SPC, selected a target, issued # READ(10) twice -- at LBA 0 and at a non-zero LBA -- and both came back byte for # byte identical to the host's copy of the same image. No IOCS, no host in the # transfer path. # # WHAT IT DOES NOT MEAN: anything at all about RATE. MAME's device models are # functional, not transfer-timing accurate (docs/BENCHMARK.md), and 42.5 reads # its DMAC configured in wall-clock attotimes rather than per-operand cycles. # `W` -- clocks stolen per delivered byte, the project's largest open number -- # is untouched by this script. set -e cd "$(dirname "$0")/../.." DLX=${1:-tmp/rc_fr_singe_scsi_span.dlx} # The container's frame records, laid out as a disc. prep_stream.py already # writes exactly this file for the ring rig, so the SCSI volume and the host-file # pipe carry byte-identical bytes and a difference between the two rigs cannot be # a difference in what they are reading. [ -f tmp/stream_disk.bin ] || python3 tools/bench/prep_stream.py "$DLX" > /dev/null if [ ! -f tmp/dlxdisk.chd ] || [ tmp/stream_disk.bin -nt tmp/dlxdisk.chd ]; then python3 - <<'PY' d = open("tmp/stream_disk.bin", "rb").read() n = (len(d) + 511) // 512 open("tmp/dlxdisk.img", "wb").write(d + b"\0" * (n * 512 - len(d))) print(f" disc image: {len(d)} B of records -> {n} sectors") PY rm -f tmp/dlxdisk.chd chdman createhd -i tmp/dlxdisk.img -o tmp/dlxdisk.chd -ss 512 > /dev/null 2>&1 fi mkdir -p tmp/p4roms/x68k_cz6bs1 [ -f tmp/p4roms/x68k_cz6bs1/scsiexrom.bin ] || \ head -c 8192 /dev/zero > tmp/p4roms/x68k_cz6bs1/scsiexrom.bin tools/vasm/vasmm68k_mot -Fbin -o tmp/scsigate.bin src/player/scsigate.s > /dev/null # stdbuf -oL: without it a long MAME run is unobservable until it exits, and a # run that is merely finishing looks exactly like one that is wedged (34.1). ( cd tmp && SDL_VIDEODRIVER=dummy stdbuf -oL timeout -k 5 300 \ mame x68000 -bios ipl10 -exp1 cz6bs1 \ -rompath "$HOME/mame/roms;./p4roms" -hard dlxdisk.chd \ -ramsize 2M -video soft -window -sound none -nothrottle -plugins \ -autoboot_script ../tools/bench/scsi.lua \ -seconds_to_run 60 > scsi_run.log 2>&1 ) # A run that never reached the report must fail as that, not as a missing line. grep -aq "^\[SCSI\] done" tmp/scsi_run.log || { echo "FAIL: the SCSI gate did not finish -- no completion marker." tail -8 tmp/scsi_run.log; exit 1; } grep -a "^\[SCSI\]" tmp/scsi_run.log | grep -avE "^\[SCSI\] +[0-9]+:" \ | sed 's/^\[SCSI\] / /' # THE ASSERTIONS. Printing a result and gating on it are different things, and # this project has already paid once for a stage that printed. grep -aq "ANSWERED 60 of 64" tmp/scsi_run.log || { echo "FAIL: the card's register window is no longer 60 of 64 addresses." echo " The MB89352 omits TMOD (index 3) and EXBF (index 15) where the" echo " MB87030 has them, and MAME leaves HOLES rather than shifting the" echo " later indices down -- which is what puts DREG at \$EA0015. If this" echo " moved, src/player/scsi.i's whole register map moved with it." exit 1; } grep -aq "READ(10) OK: 4096 B from LBA 0" tmp/scsi_run.log || { echo "FAIL: the 68000 did not read LBA 0 off the SCSI volume byte-exact." exit 1; } grep -aq "READ(10) OK: 2048 B from LBA 1000" tmp/scsi_run.log || { echo "FAIL: the read at a NON-ZERO LBA did not match. A driver that emits a" echo " malformed LBA field still passes LBA 0, because zero is what a" echo " malformed field usually is -- so this is the half that matters." exit 1; } grep -aq "scsi_read FAILED" tmp/scsi_run.log && { echo "FAIL: a read reported an error."; exit 1; } exit 0