Put the palette on the channel, and find one start paints a whole frame
ROADMAP K1, the packed player's one open structural item. A frame is a picture
AND a palette, and no run in this tree had pointed a DMA channel at the palette
registers. dmagate.s runs 7-9, gated by dma_run.sh and check.sh:
7. 512 B off the disc into $E82000, bus held -- byte-exact in 256 register
words, read back OUT OF the registers by the 68000;
8. the SAME transfer aimed at RAM -- byte-exact at $2C000, and 256 of 256
palette words still read the poison the CPU wrote, which is what attributes
run 7 to the channel's MAR rather than to the readback path;
9. ONE array-chained start across two kinds of destination -- the palette and
six picture rows at the 1,024 B line stride, 2,048 B byte-exact.
So a packed frame is one channel start: a 193-entry array, palette first, CPU
halted from the first byte to the last. The array is scene-constant, because
the packed layout spends both 256-colour pages and there is no page to flip.
What is left on the CPU per frame in the video path is the channel start and the
READ(10) -- no per-frame PAINT, which is not the same claim as no per-frame CPU.
The destination is POISONED first (62.1). Runs 4-6 wrote into RAM that was zero
and GVRAM that was stale against a record that is mostly pad; "it matches the
disc" was weaker than it read as. The host counts whether the poison actually
discriminates instead of assuming it: 511 of 512, and the gate refuses under 500.
And it opened a hardware item (62.4, ROADMAP B4). MAME maps the palette to
palette_device over memory_array, whose write16 is a plain COMBINE_DATA -- RAM
that honours mem_mask, with no handler that could refuse a byte write. Unlike
GVRAM's 256-colour arm there is nothing here to be wrong about, so the run
bounds the model and not the board. What a real palette register does with a
byte write is unmeasured. A negative costs 0.28% of a frame and nothing else.
29_packed_player.py now also prints the two rows with the per-frame palette
charged -- 55.7% of a frame on the chain, 582 KB/s -- alongside the picture-only
figures the codec comparison is quoted against.
check.sh ALL GREEN before (tmp/check_s30_start.log) and after
(tmp/check_s30_end.log).
Claude-Session: https://claude.ai/code/session_01194oWYW8DQXK1SZ2DnChW6
This commit is contained in:
+12
-1
@@ -550,6 +550,16 @@ echo "--- session 27: the DMAC drives the data phase, and holds the bus (FINDING
|
||||
# again, so the run asserts the contrast and not just the held value;
|
||||
# * the channel's own CSR/CER/MTC/MAR, which must say it moved every byte
|
||||
# without error;
|
||||
# * THE PALETTE REGISTERS AT $E82000 (session 30, ROADMAP K1): the same
|
||||
# transfer aimed at the palette, byte-exact into 256 register words read
|
||||
# back by the 68000; the SAME transfer aimed 20 KB away leaving the palette
|
||||
# as the CPU poisoned it, which is what attributes the first run to the
|
||||
# channel's MAR; and ONE array-chained start crossing from the registers
|
||||
# into GVRAM, which is the shape of a whole frame -- a palette entry and
|
||||
# 192 row entries, started once. What this does NOT settle is the board:
|
||||
# MAME models the palette as a generic palette_device over memory_array,
|
||||
# whose write16 is a plain COMBINE_DATA, so it cannot tell a register file
|
||||
# that takes byte writes from one that does not (FINDINGS 62.4);
|
||||
# * and a WINDOWED read through the channel REFUSED. 117 of 120 records start
|
||||
# part way into a sector (58.3); a channel writes a contiguous run and cannot
|
||||
# drop the bytes in front of one, so it would write the neighbouring records
|
||||
@@ -565,7 +575,8 @@ if command -v chdman > /dev/null; then
|
||||
bash tools/bench/dma_run.sh "$DLX" > tmp/dma_gate.log 2>&1 || {
|
||||
echo "FAIL: the DMAC did not drive the SCSI data phase."
|
||||
tail -16 tmp/dma_gate.log; exit 1; }
|
||||
grep -aE "BYTES OK|MTC one instruction|trips round|REFUSED" tmp/dma_gate.log \
|
||||
grep -aE "BYTES OK|MTC one instruction|trips round|REFUSED|PALETTE|ONE START" \
|
||||
tmp/dma_gate.log \
|
||||
| sed 's/^ *//;s/^/ /'
|
||||
else
|
||||
echo " SKIPPED: no chdman (ships with mame-tools) -- cannot build the volume"
|
||||
|
||||
Reference in New Issue
Block a user