From 6f698ca226258e10f4242f51c3dda0bef05c8c85 Mon Sep 17 00:00:00 2001 From: prosolis <5590409+prosolis@users.noreply.github.com> Date: Tue, 25 Aug 2026 09:10:48 -0700 Subject: [PATCH] Put the player on a real volume, and find the write window is the frame ROADMAP K3. src/player/packed.s (2,898 B) brings up its own display, builds its own 193-entry DMA chain, keeps its own frame clock off V-DISP and fetches every record itself with READ(10) off a CZ-6BS1. The rig writes no picture byte, no palette entry and no CRTC register. 120 of 120 frames pixel-exact, every one compared, in both palette orders -- the gate had to grow to do it, because a packed frame is a LITERAL and the codec's recursion was what made one comparison audit 120. And the write window turns out to be the frame. A packed write requires R20 bit 11, buffer mode blanks the layer, and a DMAC-direct player holds the window open for the whole data phase, so dark fraction of a slot = record bytes / (DATA-PHASE rate x slot) which is 1.0 at the container's own 582.0 KB/s: every frame delivered, on time, pixel-exact, and none of them displayed. The rate in that expression is the BURST rate, a third hardware number B1 has no test for. It reverses 61.5's ranking -- a packed player that DMAs to RAM and paints with the measured 27.3% blit is on screen 72.7% of every slot at any rate, and the two are equal only at 2,131 KB/s = 3.7x the wire. And a held channel costs the frame clock half its ticks without the clock being able to tell: 487 of 1,038 V-DISP edges lost, zero late frames reported, the player believing 12 fps while the screen ran at 6.37. FINDINGS 64. ROADMAP K4 opened and fenced behind B2. check.sh ALL GREEN before and after. Claude-Session: https://claude.ai/code/session_01194oWYW8DQXK1SZ2DnChW6 --- README.md | 54 +++- docs/FINDINGS.md | 178 +++++++++++ docs/ROADMAP.md | 88 ++++- docs/STATUS.md | 224 ++++++++++++- docs/img/packed-player.png | Bin 0 -> 204917 bytes src/player/packed.s | 512 ++++++++++++++++++++++++++++++ tools/analysis/31_display_duty.py | 215 +++++++++++++ tools/bench/check.sh | 32 ++ tools/bench/mkvol.sh | 39 ++- tools/bench/packed.lua | 332 +++++++++++++++++++ tools/bench/packed_run.sh | 158 +++++++++ tools/bench/prep_packed.py | 57 ++++ tools/bench/verify_packed.py | 114 +++++++ tools/media/make_packed_media.py | 111 +++++++ 14 files changed, 2091 insertions(+), 23 deletions(-) create mode 100644 docs/img/packed-player.png create mode 100644 src/player/packed.s create mode 100644 tools/analysis/31_display_duty.py create mode 100644 tools/bench/packed.lua create mode 100755 tools/bench/packed_run.sh create mode 100644 tools/bench/prep_packed.py create mode 100644 tools/bench/verify_packed.py create mode 100644 tools/media/make_packed_media.py diff --git a/README.md b/README.md index 083f8f2..18c62fd 100644 --- a/README.md +++ b/README.md @@ -292,6 +292,53 @@ ships**. The fallback is already a flag: `--scene-palette --no-palette` is 30.79 dB, zero churn, **576.0 KB/s**, and still +2.07 dB on the shipping codec as the display renders both (FINDINGS 63). +**And the packed player runs, end to end, off the disc — the strongest +result in this tree, next to the worst news in it.** `src/player/packed.s` is +2,898 bytes: the 68000 brings up its own display, builds its own 193-entry DMA +chain, keeps its own frame clock off the CRTC's V-DISP, and fetches every record +itself with `READ(10)` off a real volume. The rig writes **no picture byte, no +palette entry and no CRTC register**. **120 of 120 frames are pixel-exact — every +one compared, in both palette orders** — and the gate had to grow to do it, +because a packed frame is a *literal*: the codec's last frame audits all 120 +through its own recursion, and frame 119 here says nothing about frame 60. + +![Blu-ray source next to the packed player's own screen](docs/img/packed-player.png) + +Left, the source. Right, **MAME's own snapshot** of what the 68000 put on +screen with no decoder in the machine at all — the frame whose PSNR is closest +to the mean, so it is not the flattering one. The window's mean is **33.10 dB**, +which is the packed container's predicted GRB555 figure to the digit. + +**And the write window turns out to be the frame.** Free-running — which is what +a 12 fps player becomes once the transfer is longer than the slot — the run +reported a number no budget here has a column for: **the GVRAM write window was +open on 99.5% of the host frames**. Every frame pixel-exact, and almost none of them visible. It is +arithmetic, not an emulator artefact — a packed write *requires* R20 bit 11, +buffer mode blanks the layer, and a DMAC-direct player holds the window open for +the whole data phase, because the packed layout spends both 256-colour pages and +there is no second page to hide behind: + + dark fraction of a slot = record bytes / (DATA-PHASE rate x slot) + +**The rate in that expression is the BURST rate, not the sustained one**, and +that is a third hardware number the acceptance test did not have. At the +container's own **582.0 KB/s the dark fraction is 1.0**: every frame delivered, +on time, pixel-exact, and none of them displayed. It also **reverses the +ranking**: a packed player that DMAs into RAM with the window shut and paints +with the measured 27.3% blit is on screen **72.7% of every slot at any rate**, +and the two are equal only at **2,131 KB/s — 3.7x the wire**. Below that, which +is every rate anyone has proposed, the player with the CPU in the loop is the +one you can see (FINDINGS 64.2). + +**And a held channel costs the frame clock half its ticks, without the clock +being able to tell.** `clock.i` counts V-DISP interrupts; a held channel halts +the 68000; the MFP's pending bit is one bit. Held at 12 fps, **487 of 1,038 +edges are lost** — and the player reports **zero late frames**, because the tick +it grades itself against is advanced by the interrupt the channel stopped it +from taking. It believed it was at 12 fps; the screen was at **6.37**. Only the +host's raster count contradicts it, and the gate asserts on the difference +(FINDINGS 64.3). + **The scene graph is in, and the worst gap between two decision points is zero.** `tools/import/scenegraph.py` imports the arcade scene graph — 40 scenes, 516 sequences, 906 input windows — and 5.4% of the game's 612 branch transitions @@ -317,12 +364,15 @@ on for eight sessions. **Current encode:** 496.7 KB/s at 29.19 dB, 1 frame of 120 over the 12fps budget, and that one is frame 0, the intra frame, late on purpose. -**Green-light check:** `./tools/bench/check.sh` (~4 min, needs the Blu-ray +**Green-light check:** `./tools/bench/check.sh` (~6 min, needs the Blu-ray mounted) re-runs both display regression tests, the rate-control drift gate, the display-path coherency counterexample, a 120-frame 68000 decode on two CPU cores, the ring and paced-ring passes, the DMAC configuration gate and the load-time transforms on both cores, then imports and gates the scene graph -when a DirkSimple checkout is present, then prints `ALL GREEN`. +when a DirkSimple checkout is present, then builds the packed container and +renders it through px68k's own GVRAM model, then **runs the packed player for +120 frames off a real volume and compares every one of them**, then prints +`ALL GREEN`. ## Reproducing this diff --git a/docs/FINDINGS.md b/docs/FINDINGS.md index d231499..a0203d8 100644 --- a/docs/FINDINGS.md +++ b/docs/FINDINGS.md @@ -6590,3 +6590,181 @@ resource the packed branch is short of. The per-frame palette is worth +2.31 dB container by a 68000 or by a channel. That is **K3**, and 63.2 is the strongest statement available without it: the bytes are right, on a second emulator's own GVRAM model, with the harness computing nothing. + +--- + +## 64. The packed player runs end to end off the disc — and the write window is the frame (session 32) + +**ROADMAP K3.** `src/player/packed.s` is **2,898 bytes** of 68000 code that +brings up its own display, builds its own 193-entry DMA chain, keeps its own +frame clock off V-DISP and fetches every record itself with `READ(10)` off a +CZ-6BS1. `tools/bench/packed.lua` writes **no picture byte, no palette entry and +no CRTC register**; it pushes the code and eleven mailbox words and then reads. +`tools/bench/packed_run.sh` is the gate, `tools/bench/verify_packed.py` the +comparison, `tools/analysis/31_display_duty.py` the arithmetic underneath the +result. + +**THE HEADLINE, and it is two facts that point opposite ways.** + +**120 of 120 frames are pixel-exact**, every one of them compared, off a real +volume, on a clock the machine keeps itself — the strongest end-to-end result +this project has. And **the picture was on screen for none of the frame slot it +belongs to**, because the write window that a packed frame requires is the whole +of its transfer, and buffer mode blanks the layer it is written through. + +### 64.1 What was run, and why every frame had to be checked + +`tools/bench/verify_decode.py` checks **one** frame — the last — and that audits +all 120, because the codec is temporally recursive: a SKIP block is a claim that +the previous frame is still in GVRAM. **A packed frame is a LITERAL.** Frame 119 +being right says nothing whatever about frame 60. The simplification that +deleted the ring, the codebooks and the decoder also deleted the gate's free +lunch, so `verify_packed.py` snapshots and compares **every frame**, letterbox +included — the 64 static rows are written once at scene setup and never touched +again, so a picture can be pixel-exact while the screen is not. + +| | | +|---|---| +| container | `tmp/packed_singe.dlxp`, DLXP1, 120 records of 49,664 B = 97 sectors | +| record `i` | at LBA `1 + i*97` — **arithmetic**, no index, nothing walked | +| chain | **193 entries**, built by the 68000: `$E82000`/512 B, then 192 rows of 256 B a 1,024 B stride apart | +| result | **120 of 120 pixel-exact**, 0 frames unsampled, `FLAG=$FF` | +| passes with the palette LAST too | chain starts `$C08000`/256 instead, **120 of 120 pixel-exact** | + +The array is **scene-constant** and the seek is **subtraction**: the packed +layout spends both 256-colour pages, so there is no page to flip, and a record's +length is geometry, so a new pass is `LBA0` again. That is the whole of what K3 +deletes, and it deleted it without incident. + +### 64.2 The write window is the frame, and the rate it needs is not the rate it costs + +The free-running run — the one that asks for record *i+1* the instant record +*i* lands, which is what a 12 fps player becomes the moment the transfer is +longer than the slot — reported a number no budget in this tree has a column +for: **the write window was open on 99.5% of the host frames.** Every frame was +pixel-exact and almost none of them was visible. + +It is **arithmetic, not an emulator artefact**. 256-colour GVRAM masks the high +byte of every write unless R20 bit 11 is set (46.5/47.1), and the packed +layout's entire 1.0 B/pixel claim is that one word carries two pixels — so a +packed write *requires* the bit. If buffer mode blanks the layer while the bit is +set (47.4/B2 — MAME says it does, 48.1's prior leans that way), the layer is dark +for exactly as long as the window is open, and for a DMAC-direct player the +window is open for the whole data phase. There is no second page to hide behind: +the packed layout spends both, which is the same fact that made a frame one +channel start (62). + + dark fraction of a slot = record bytes / (DATA-PHASE rate x slot) + +**And the rate in that expression is the BURST rate, not the sustained one.** +This is the correction the session had to make to itself. 582.0 KB/s is a +*sustained* requirement and it decides whether record *i* arrives before slot +*i*. The dark fraction is set by how fast bytes move **during the data phase**, +which for a drive with a read-ahead cache can be several times the sustained +figure. **They are independent, and a medium can pass one and fail the other:** + +| requirement | figure | status | +|---|---|---| +| sustained, or frames arrive late | **≥ 582.0 KB/s** | B1, known since 63 | +| data phase, or the frame is never displayed | **see below** | **NEW — B1 has no test for it** | + +| data phase | transfer | window open | picture on screen | +|---:|---:|---:|---:| +| 582.0 KB/s (= the wire) | 83.33 ms | 100.0% | **0.0%** | +| 700 KB/s | 69.29 ms | 83.1% | 16.9% | +| 1,164 KB/s | 41.67 ms | 50.0% | 50.0% | +| 2,131 KB/s | 22.75 ms | 27.3% | 72.7% | +| 3,000 KB/s | 16.17 ms | 19.4% | 80.6% | + +**A medium that exactly meets the sustained requirement delivers every frame, on +time, pixel-exact, and displays none of them.** + +**AND THIS REVERSES 61.5's RANKING.** There are two packed players, and the +difference between them is *when* the window is open: + +- **A, DMAC-direct** (the one that is built): one channel start, the CPU halted + or nearly, window open for the whole data phase. +- **B, DMA-to-RAM plus a CPU paint**: the record lands in RAM with the window + shut, and the 68000 paints it with the packed `movem` blit — **227,553 clocks, + 27.3% of a slot, MEASURED** (`blit.s` V8, 61.4) and **independent of the + medium**. On screen **72.7% of every slot at any rate that delivers the record + at all.** + +They are equally visible at a data-phase rate of **2,131 KB/s, which is 3.7x the +container's own wire**. Below that — which is every rate anyone has proposed — +**the player with the CPU in the loop is on screen longer than the one without +it.** 61.5 is not wrong; it ranked them in **clocks**, and this is the column +that table does not have: + +| W (clk per delivered byte) | A: DMAC-direct | B: DMA + CPU paint | +|---:|---:|---:| +| 5 | 31.0% | 58.4% | +| **9 — the dual-address floor** | **54.9%** | **82.2%** | +| 12 | 72.8% | 100.1% | +| 16 | 96.6% | 123.9% | +| 19 | 114.5% | 141.8% | + +Both charge the audio DMA at 10,417 clocks (1.25%, from the IPL ROM's own +channel-3 setup, 52.5); neither has a decoder in it. **B costs 27.3% of a frame +and 99,328 B of RAM** — two record buffers, because at any rate near the wire the +delivery of record *i+1* occupies most of the slot the paint of record *i* +happens in. On a 2 MB machine that is 4.7% of memory, and memory is the resource +the packed branch has spare: the ring it deleted was 256 KB. + +### 64.3 Holding the bus costs the frame clock half its ticks — and the clock cannot tell + +`src/player/clock.i` counts V-DISP interrupts. A held channel **halts the +68000**. The MFP's pending bit is **one bit**, so every edge that falls inside a +transfer spanning two of them is an edge the machine can **never** count. Nothing +in this project had run a transfer and a clock at once, so nothing could have +seen it. + +| configuration, 120 frames | V-DISP edges seen | host frames drawn | lost | +|---|---:|---:|---:| +| **held, paced at 12 fps** | 551 | 1,038 | **487 = 46.9%** | +| stealing, paced at 6 fps | 1,105 | 1,112 | 7 = 0.6% | + +**And the player reported ZERO late frames in both.** That is not a reassurance, +it is the finding: the pace gate compares the frame index against `PACE`, and +`PACE` is advanced by the ISR the held channel stops the CPU from running — so a +clock that loses edges loses them from **both sides of the comparison**. The held +player believed it was running at 12 fps; the screen was at **6.37**. The only +thing in the run that can contradict it is the host's raster count, which is why +`packed.lua` reports both and `packed_run.sh` gates on the difference being +non-zero. + +The CPU's own account says the same thing from the other end: **held, the 68000 +went round its transfer wait 120 times in 120 frames — once each, meaning it +never executed during a single transfer.** Stealing, it went round 1,100,520 +times. A player has to keep a clock, read a stick and feed ADPCM; **which of the +two configurations can do any of that is a design question, and this is the run +that answers it.** + +### 64.4 The channel configuration does not set the transport's time + +Free-running, both configurations delivered the same 49,664 B record within 0.5% +of each other: **90.72 ms stealing, 90.27 ms held** — 534.6 and 537.3 KB/s, +108.9% and 108.3% of a 12 fps slot. + +**That figure is a property of the apparatus and is not `W` and not a medium.** +MAME's device models carry no transfer timing (`docs/BENCHMARK.md`, 42.5). What +the pair of runs *does* establish is a **negative that no arithmetic could +have given**: the transfer time is **not the DMAC configuration's to set**. What +a channel configuration buys is **who owns the CPU**, not when the picture +appears. The mechanism behind MAME's own ceiling is **not diagnosed** — it is not +the DMAC (the two configurations agree) and not the CPU (held, the CPU is halted +throughout) — and no MAME source tree was available on this machine to name it. + +### 64.5 What this does not settle + +- **`W`. Not one clock of it.** Unchanged since 59. +- **B2, whether a real board blanks in buffer mode.** Everything in 64.2 is + conditional on it, and the condition now decides **which of two packed players + is built** rather than how much headroom one has. `probe_bit11_blank.lua` is + still written and still wants a board. +- **The data-phase rate of any real medium.** This is the session's addition to + **B1**, and it is a measurement nobody has planned: throughput and seek time + were the two numbers on the list, and **the burst rate during a data phase is a + third** that decides whether a DMAC-direct packed player shows a picture. +- **Whether B is buildable as described.** It is priced off a measured blit and + a measured ladder, and no line of it has been written. diff --git a/docs/ROADMAP.md b/docs/ROADMAP.md index d423e46..ca4d680 100644 --- a/docs/ROADMAP.md +++ b/docs/ROADMAP.md @@ -56,6 +56,24 @@ pairing. **B2 now decides which packed CONTAINER exists, not only which player** (63.4). The fallback is a flag: `--scene-palette --no-palette` is 30.79 dB, zero churn, 576.0 KB/s and still +2.07 dB on the shipping codec. **K3 is next.** +Amended end of session 32: **K3 IS DONE, AND IT FOUND THE THING THAT DECIDES +THE BRANCH (FINDINGS 64).** `src/player/packed.s` brings up its own display, +builds its own 193-entry chain, keeps its own clock off V-DISP and fetches every +record itself off a CZ-6BS1: **120 of 120 frames pixel-exact, every one +compared, in both palette orders.** Two things came with it. **(1) The write +window is the frame.** A packed write needs R20 bit 11, buffer mode blanks the +layer, and a DMAC-direct player holds the window open for the whole data phase +— so the dark fraction of a slot is `record / (DATA-PHASE rate x slot)` and a +medium that exactly meets the 582.0 KB/s sustained requirement **displays none +of the frames it delivers on time**. The rate that matters here is the BURST +rate, which is a third hardware number **B1 has no test for**. It also +**reverses 61.5's ranking**: a packed player that DMAs to RAM and paints with +the CPU opens the window only for the measured 27.3% blit, so it is on screen +72.7% of every slot at any rate, and the two are equal only at **2,131 KB/s = +3.7x the wire**. **(2) A held channel costs the frame clock half its ticks and +the clock cannot tell** — 46.9% of V-DISP edges lost, zero late frames reported, +the player believing 12 fps while the screen ran at 6.37. **The open item is now +K4.** **THE COMPLETION TARGET IS M3, THE VERTICAL SLICE** (USER DECISION): one scene tree — a decision point, two outcomes, a death clip — with audio, streaming from a real SCSI volume on a stock 2 MB machine, playable. That is the point at which @@ -108,7 +126,16 @@ None of these block M2 or M3 software work, because session 18 forced every rate to be an explicit argument. They set constants, and two of them decide how much headroom the finished player has. -**B1. Measure the BlueSCSI — throughput AND seek time.** **Session 29 gave this +**B1. Measure the BlueSCSI — throughput, seek time AND the DATA-PHASE BURST +RATE.** The third one is session 32's (FINDINGS 64.2) and it is not a refinement +of the first: sustained throughput decides whether record *i* arrives before +slot *i*, and the **burst rate during the data phase** decides how much of the +slot the picture is on screen, because a DMAC-direct packed player holds the +GVRAM write window open for exactly as long as the transfer takes and buffer +mode blanks the layer. A drive with a read-ahead cache can pass the first and +fail the second. The acceptance test is **`record / (burst x slot)` = the dark +fraction**; at the container's own 582.0 KB/s it is 1.0, and the picture is never +displayed. **Session 29 gave this a second acceptance test that is not a codec figure at all: 576 KB/s SUSTAINED, which is what a decoder-free packed literal frame costs and cannot be talked down from (FINDINGS 61.5).** A codec's bitrate is a lever; a literal frame's is @@ -286,9 +313,37 @@ frame is not tied to a scene palette the codec's codewords index into. It costs codec's ceiling, so the whole +2.31 dB is the per-frame palette; 90% of that palette changes every frame; and a mismatched paint is 12.8 dB worse, for roughly half of every frame slot, if buffer mode does not blank. -- **K3. End to end, off the disc.** Palette, page-1 X-scroll 384, priority - `vc1 = 0x0002`, R20 bit 11; one chained DMA a frame. Gated pixel-exact over the - same 120-frame window the decoder is gated on. +- ~~**K3. End to end, off the disc.**~~ **DONE, session 32 — FINDINGS 64.** + `src/player/packed.s`, `tools/bench/packed.lua`, `tools/bench/packed_run.sh`, + `tools/bench/verify_packed.py`, `tools/analysis/31_display_duty.py`. Palette, + page-1 X-scroll 384, priority `vc1 = 0x0002`, R20 bit 11, one chained DMA a + frame, **120 of 120 pixel-exact in both palette orders** — and the gate checks + every frame rather than the last, because a packed frame is a literal and the + codec's recursion was what made one comparison audit 120. + + **What it found is K4's whole content**, and it is in the amendment above: the + window is the frame, the burst rate decides visibility, and a held channel + eats the clock. + +- **K4. THE PACKED PLAYER THAT IS ON SCREEN.** 64.2's option B: DMA the record + into one of two RAM buffers with the window SHUT, then paint it with the + packed `movem` blit (`blit.s` V8, **measured** at 227,553 clocks = 27.3% of a + slot). **82.2% of a frame at the 9 clk/B dual-address floor** against A's + 54.9%, **99,328 B of RAM**, and a picture on screen **72.7% of every slot at + any delivery rate** instead of 0% at the container's own wire. + + It is not a rewrite of K3: `packed.s` keeps its display bring-up, its clock, + its transport and its record arithmetic, and what changes is the chain's + destination and the addition of a paint. **The one thing in it that has never + been run is the overlap** — a channel filling buffer *i+1* while the CPU + paints buffer *i*, which is the first time in this project that the DMAC and + the 68000 have had to want the bus at the same time for a whole scene. + + **K4 is conditional on B2 the same way K3's ranking was**, and the condition + now cuts the other way: if buffer mode does NOT blank, A is on screen the whole + slot and K4 is 27.3% of a frame spent on nothing. **Do not build K4 before B2 + is answered** — that is the same rule 61.7 wrote for the codec, applied to the + branch that replaced it. **What K3 deletes, and why that is a risk and not a win to be banked:** a DMAC-direct packed player has **no ring** — `ring.i`, `xfer.i` and most of @@ -719,17 +774,26 @@ P2 re-encode bundle DONE (60): DLX5, records ARE sectors ─────── E7/E4/C1 PARKED session 29: encoder work waits on B2 ───────────┤ │ K1 palette-register DMA? ─> K2 packed container ─> K3 end to end ──┤ - (61.9; K1/K2 survive a bad B2, K3 does not) │ - K1 DONE s30 (62), K2 DONE s31 (63) ── K3 is the open one │ + K1 DONE s30 (62), K2 DONE s31 (63), K3 DONE s32 (64): │ + 120/120 pixel-exact, both palette orders, off a real volume │ + └─> and K3 found that the WRITE WINDOW IS THE FRAME, so: │ + K4 (DMA to RAM + the measured 27.3% paint) is the player │ + that is ON SCREEN below a 2,131 KB/s BURST rate -- which │ + is 3.7x the wire, so below every rate anyone has proposed │ P4a WIRING (the channel behind ring.i's mailbox) <- THE LAST ITEM ─┤ P1 P2 P3 P4b P5 P7, P6 bus cost (52), G1 scene graph (56) ────────┼─> M2 ─> B1 seek+rate (sets HEADROOM, not fit) ─────────────────────────────┘ M3 ─> M4 -B2 blanking ─┬─ NOT blanked ─> the DECODER-FREE PACKED player is live (61): - │ 55.2% of a frame at the 9 clk/B FLOOR, against - │ the codec's 110.4% -- and then B1 decides it, - │ because it wants 576 KB/s FIXED (61.4, 61.5) - └─ blanked ──────> a 27..113% duty strobe; there is no version of - it that is merely expensive (48.3, 61.6) +B2 blanking ─┬─ NOT blanked ─> K3's DMAC-DIRECT player is the one: 54.9% of a + │ frame at the 9 clk/B floor against the codec's + │ 110.4%, on screen the whole slot, and K4's paint + │ would be 27.3% spent on nothing (61.4, 61.5) + └─ blanked ──────> K3's player is on screen for + 1 - record/(BURST x slot) of every slot, which is + ZERO at the container's own wire -- so K4 is the + player, at 82.2% of a frame and 99,328 B of RAM + (64.2). Neither answer kills the branch and each + picks a different player. +B1 BURST rate (NEW, 64.2) ──> which of the two K3/K4 wins, if B2 blanks ``` **Read that top-left branch as the project's live question.** Everything else diff --git a/docs/STATUS.md b/docs/STATUS.md index f2179b3..1ee2410 100644 --- a/docs/STATUS.md +++ b/docs/STATUS.md @@ -1,4 +1,161 @@ -# Status & next-session handoff — end of session 31 (2026-08-25) +# Status & next-session handoff — end of session 32 (2026-08-25) + +## Session 32: the packed player runs, and the write window turns out to be the frame + +**Green light first and last: `./tools/bench/check.sh` was ALL GREEN before any +of this (`tmp/check_s32_start.log`) and ALL GREEN after** — the same stages, plus +one new one. + +**FINDINGS 64. ROADMAP K3 is done.** `src/player/packed.s` (2,898 B), +`tools/bench/packed.lua`, `tools/bench/prep_packed.py`, +`tools/bench/packed_run.sh`, `tools/bench/verify_packed.py`, +`tools/analysis/31_display_duty.py`. `tools/bench/mkvol.sh` grew a DLXP arm — +for a packed container the file **is** the volume, which is the format's own +claim arriving at the disc. + +**Everything below is EMULATED**: MAME 0.277 `x68000`, `-bios ipl10`, stock +10 MHz / 2 MB, `-exp1 cz6bs1`, a real CHD volume. No real hardware ran. + +**1. THE PLAYER WORKS, AND IT IS THE STRONGEST END-TO-END RESULT IN THE TREE.** +The 68000 brings up its own display (CRTC mode, both scroll register pairs, +priority `vc1 = $0002`, R20 bit 11), builds its own **193-entry** DMA chain, +keeps its own frame clock off V-DISP, and fetches every record itself with +`READ(10)`. The rig writes no picture byte, no palette entry and no CRTC +register. + +| | | +|---|---| +| frames | **120 of 120 pixel-exact**, EVERY ONE COMPARED | +| both palette orders | palette FIRST and `--palette-last`, **120/120 each** | +| chain | `$E82000`/512 B then 192 rows of 256 B at the 1,024 B stride — one start | +| record `i` | LBA `1 + i*97`. Arithmetic. No index, no ring, no decoder | + +The gate had to change shape: `verify_decode.py` checks the LAST frame and that +audits 120 because the codec is temporally recursive. **A packed frame is a +literal**, so `verify_packed.py` compares all of them, letterbox included. + +**2. THE HEADLINE, AND IT IS NOT THE GOOD HALF.** The free-running run — which +is what a 12 fps player becomes once the transfer is longer than the slot — +reported a number no budget in this tree has a column for: **the write window +was open on 99.5% of the host frames.** Every frame was pixel-exact and almost none of them was +visible. It is arithmetic: a packed write needs R20 bit 11, buffer mode blanks +the layer, and a DMAC-direct player holds the window open for the whole data +phase — there is no second page to hide behind, because the packed layout spends +both. + + dark fraction of a slot = record bytes / (DATA-PHASE rate x slot) + +**The rate in that expression is the BURST rate, not the sustained one**, and +that is a third hardware number **B1 has no test for**. At the container's own +582.0 KB/s the dark fraction is **1.0**: every frame delivered, on time, +pixel-exact, and **none of them displayed**. + +**3. AND IT REVERSES 61.5's RANKING.** A packed player that DMAs into RAM with +the window SHUT and paints with the measured `movem` blit (27.3% of a slot) is +on screen **72.7% of every slot at any rate**. The two are equal only at a +data-phase rate of **2,131 KB/s = 3.7x the wire**. Below that — every rate +anyone has proposed — **the player with the CPU in the loop is on screen +longer.** That is ROADMAP **K4**, and it costs 82.2% of a frame at the 9 clk/B +floor against 54.9%, plus 99,328 B of RAM for two record buffers. + +**4. A HELD CHANNEL COSTS THE FRAME CLOCK HALF ITS TICKS, AND THE CLOCK CANNOT +TELL.** `clock.i` counts V-DISP interrupts; a held channel halts the 68000; the +MFP's pending bit is one bit. Held at 12 fps: **487 of 1,038 edges lost +(46.9%)**, and the player reported **zero late frames** — because `PACE` is +advanced by the ISR the channel stops from running, so the loss cancels out of +the comparison. The player believed 12 fps; the screen was at **6.37**. Only the +host's raster count contradicts it, and `packed_run.sh` gates on the difference +being non-zero. Stealing at half rate loses 0.6%. Held, the CPU went round its +transfer wait **120 times in 120 frames** — once each; it never executed during a +transfer. + +**5. THE CHANNEL CONFIGURATION DOES NOT SET THE TRANSPORT'S TIME.** Free-running, +held and stealing delivered the same record within **0.5%** (90.27 vs 90.72 ms). +That figure is the APPARATUS — MAME's device models carry no transfer timing — +but the negative is real and no arithmetic could have given it: **a channel +configuration buys who owns the CPU, not when the picture appears.** + +**RISKS IN THIS SESSION'S RESULT, stated rather than left to be found:** + +- **Everything in 2 and 3 is conditional on B2**, and B2 is still unmeasured on + a board. What changed is the stakes: it now picks WHICH packed player, and + each answer makes the other one's design work wasted. +- **MAME's ~535 KB/s transport ceiling is not diagnosed.** It is not the DMAC + (both configurations agree) and not the CPU (held, it is halted throughout), + and no MAME source tree was on this machine to name it. It bounds nothing in + the arithmetic, which is geometry, but it is the reason the gate is paced at + half rate and that should not be mistaken for a rig limitation being worked + around. +- **The cadence sampler is quantised to one host frame** (17.6 ms). The MEAN + over 120 frames is not (±0.30 ms); the min/median/max are the sampler's. + +## HANDOFF — start here + +**THE TREE IS ALL GREEN**, session 32's stage included (`tmp/check_s33_start.log`, +ALL GREEN, ~6 min). + +### The work, in the order it should be done + +**1. NOT K4 — NOT YET.** ROADMAP K4 is written and priced (82.2% of a frame at +the 9 clk/B floor, 99,328 B of RAM, on screen 72.7% of every slot at any rate), +and it is **conditional on B2**, which is a board question nobody here can +answer. If buffer mode does NOT blank, K3's player is already on screen the +whole slot and K4's paint is 27.3% of a frame spent on nothing. 61.7 wrote that +rule for the codec; it applies to the branch that replaced it. **Do not open +K4 until B2 comes back.** + +**2. WHAT IS NOT BLOCKED IS P6 — AUDIO.** It is the largest unpriced item left +in the project and it is on M3's critical path, which is the completion target. +The bus half closed in session 20 (52: 1.25%..1.48% of a frame, and the unit +error was caught) — **everything else in it is open**: extraction, an encoder, +the container interleave, and what a second stream does to `wire` and therefore +to 51.3's refill climb. It is independent of B2 in the part that matters: both +packed containers and the codec carry the same audio. + +Three things make it a session rather than a chore: +- **No ffmpeg ENCODER exists for this format.** `adpcm_ima_oki` is a decoder + only, so the encoder is ours to write and ours to gate. +- **The two available references DISAGREE, and it was MEASURED not recalled** + (session 33, `tmp/adpcm_probe/`). ffmpeg's `adpcm_ima_oki` is + `((2*delta+1) * step) >> 3`, 12-bit signal clipped to [-2048, 2047], output + x16, **high nibble first** — reproduced sample-exact over 2,268 nibbles. The + OKI datasheet form truncates per term (`step/8 + step + step/2 + step/4`, + selected by nibble bits) and differs on **445 of those 2,268 samples, by up to + 4 in 12-bit units**. Which one the machine runs is not a matter of taste, and + **MAME has an `okim6258` in the x68000 — so it can be asked.** +- **DLXP1 has no room for it.** A packed record is 97 sectors EXACTLY because + 49,664 B is what a literal frame costs; audio does not fit in the slack, + because there is none. What audio does to the packed record's geometry is a + container question, not an encoder one. + +### What is PARKED, so it is not re-derived + +**E7, E4 and C1** (61.8), and **P4a's wiring** for the video path (K3 deletes the +ring from it). Do not delete any of it — B2 is unanswered. + +### Risks that are OURS, not hardware + +1. **A chained transfer has never run back to back at 12 fps and now it has**, + 120 times, pixel-exact — but only at HALF rate, because at full rate there is + nothing to snapshot (64.2). The gate's pacing is a consequence of the finding. +2. **The packed player deletes `ring.i`, `xfer.i` and most of `stream.s`.** + Unchanged: a simplification that large usually hides something, and it has + now run clean for 120 frames without finding out what. +3. **MAME's ~535 KB/s transport ceiling is undiagnosed** (64.4). It bounds + nothing in the arithmetic, which is geometry. +4. **B2 sits over the branch and now picks WHICH PLAYER**, not how much headroom + one has. + +### Reproducing this session + + ./tools/bench/check.sh # ALL GREEN + bash tools/bench/packed_run.sh tmp/packed_singe.dlxp # all four runs + python3 tools/analysis/31_display_duty.py + +**WHAT IS NEXT.** P6: audio, from the disc to a byte count that the container +has to carry. + +--- ## Session 31: the packed container, and the palette that buys 2.31 dB has a price @@ -1704,6 +1861,39 @@ Green light: `./tools/bench/check.sh` **ALL GREEN**, before and after. ## NEXT SESSION, in order +**AS OF SESSION 32 the top of the list is this, and the rest of this section is +the session-19 list kept for its detail.** `docs/ROADMAP.md` is the current +shape; where the two disagree, ROADMAP is the one that was edited last. + +1. **B2, and it is now the fork rather than a headroom question.** + `tools/bench/probe_bit11_blank.lua` is written and settles it in minutes on a + real board. FINDINGS 64.2 is why it moved to the top: **if buffer mode + blanks, the K3 player that now exists shows nothing at the container's own + wire and K4 is the player; if it does not blank, K3 is the player and K4's + 27.3% paint is spent on nothing.** Each answer makes the other branch's work + wasted, so building either before the answer is the one thing to avoid. + +2. **B1 gained a THIRD number: the DATA-PHASE BURST RATE** (64.2). Sustained + throughput decides whether record *i* arrives before slot *i*; the burst rate + decides how much of the slot the picture is on screen. A drive with a + read-ahead cache can pass one and fail the other. The acceptance test is + `record / (burst x slot)` = the dark fraction, and it is **1.0 at 582.0 KB/s** + and 0.273 — the same as K4's paint — only at **2,131 KB/s**. + +3. **K4, and NOT before item 1.** ROADMAP has the shape. The one thing in it + that has never been run is the **overlap**: a channel filling buffer *i+1* + while the CPU paints buffer *i*, which is the first time the DMAC and the + 68000 have had to want the bus at the same time for a whole scene. + +4. **Diagnose MAME's transport ceiling, or stop quoting it.** ~535 KB/s a record + in both channel configurations, mechanism unknown, no MAME source on this + machine. It bounds nothing — the arithmetic in 64.2 is geometry — but it is + why `check.sh`'s packed stage is paced at half rate, and an undiagnosed + apparatus constant is exactly the shape of thing FINDINGS 42.1 caught. + +--- + + **Item 4 is CLOSED (session 19, FINDINGS 51).** The list below is otherwise unchanged, and items 1-3 are all still blocked on hardware this machine does not have. What session 19 adds to item 1 is a SECOND number to measure the medium @@ -2984,6 +3174,38 @@ flattering possible way to state one. **Do not run this alongside another MAME job.** They share `tmp/` logs and snapshot directories and the second run silently truncates the first. +## Reproducing the packed player (session 32) + +``` +python3 tools/encoder/pack.py tmp/fr_singe tmp/packed_singe.dlxp --nframes 120 +./tools/bench/packed_run.sh tmp/packed_singe.dlxp +``` +~4 min, four MAME runs. `DLX_PK_GATE_ONLY=1` runs only the first, which is what +`check.sh` takes. Expected: 120 of 120 pixel-exact; 193 chain entries; 0 late +frames; 0 frames unsampled; a free-running transport of ~90 ms a record; and +**487 of 1,038 V-DISP edges lost in the held configuration**, which is the run's +whole point and is asserted rather than admired. + +The palette-LAST container is a flag and not a re-encode: +``` +python3 tools/encoder/pack.py tmp/fr_singe tmp/packed_singe_last.dlxp \ + --nframes 120 --palette-last +./tools/bench/packed_run.sh tmp/packed_singe_last.dlxp +``` +The chain assertion is read out of the container's own flags, so a run that +built the array the other way round fails instead of painting 192 rows of +picture into the palette registers. + +And the arithmetic underneath the result, which needs no emulator: +``` +python3 tools/analysis/31_display_duty.py tmp/packed_singe.dlxp \ + --rate 582 700 1164 2131 3000 +``` +`--rate` is REQUIRED and has no default, for FINDINGS 50's reason. + +**Do not run this alongside another MAME job.** It shares `tmp/` logs with every +other rig here. + ## Reproducing the decoder result (session 7) ``` diff --git a/docs/img/packed-player.png b/docs/img/packed-player.png new file mode 100644 index 0000000000000000000000000000000000000000..0cedbe00513710460aecdd772c8640d02b01e701 GIT binary patch literal 204917 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%0DP_8oq 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

^h)&%BQ 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 literal 0 HcmV?d00001 diff --git a/src/player/packed.s b/src/player/packed.s new file mode 100644 index 0000000..24557ef --- /dev/null +++ b/src/player/packed.s @@ -0,0 +1,512 @@ +; --------------------------------------------------------------------------- +; packed.s -- THE PLAYER WITH NO DECODER, END TO END, OFF THE DISC. ROADMAP K3. +; +; WHAT THE OTHER FRONT-ENDS IN THIS DIRECTORY DO, AND WHY THIS ONE IS DIFFERENT. +; decode.s parses a DLX record and draws 4x4 blocks; stream.s does the same out +; of a bounded ring that ring.i fills through xfer.i. Both are CODECS: a record +; is a program the 68000 executes against GVRAM, and every cost table in +; docs/FINDINGS.md from 24 to 45 is a cost of executing it. FINDINGS 61 priced +; the alternative and it won: at the 9 clk/B dual-address floor the shipping +; codec is 110.4% of a 12 fps frame and a decoder-free packed literal frame is +; 55.2%. Decoding 37,585 bytes costs more than not decoding 49,152. +; +; So THERE IS NO DECODER BELOW. There is no ring either, and that is the same +; fact rather than a second one: a ring exists because DLX records are +; variable-length and the block loop needs the next one whole and contiguous +; (49.2). A packed record's length is GEOMETRY -- 512 B of palette and 192 rows +; of 256 B, 97 sectors exactly -- so record `i` is at LBA0 + i*97 and there is +; nothing to place, nothing to wrap and nothing to index (tools/encoder/dlxp.py). +; +; WHAT THE 68000 DOES PER FRAME, IN FULL: +; +; 1. wait for its own frame tick (src/player/clock.i, off the CRTC's V-DISP) +; 2. set CRTC R20 bit 11 -- the GVRAM write window +; 3. issue one READ(10) whose DATA IN phase is an HD63450 channel walking a +; 193-entry chain: the palette registers at $E82000, then 192 GVRAM rows a +; 1,024 B line stride apart (FINDINGS 62) +; 4. clear R20 bit 11 +; +; That is the whole video path. There is no per-frame PAINT: between the +; channel start and the channel's COC the 68000 executes nothing at all in the +; held configuration, and in the stealing one it executes only its own wait +; loop. The array is SCENE-CONSTANT -- the packed layout spends both 256-colour +; pages, so there is no page to flip and no destination that changes. +; +; THE TWO THINGS THIS FILE EXISTS TO FIND OUT, neither of which any earlier run +; could ask: +; +; a. DOES A CHAINED TRANSFER RUN BACK TO BACK AT 12 fps? 61.7.2 named this as +; the specific untested thing behind K3's large simplification, and it is +; the reason the frame clock is in here rather than a host tick: a chain +; that has to be restarted 120 times in ten seconds is a different claim +; from one that ran once in a gate. +; b. WHAT DOES HOLDING THE BUS COST THE CLOCK? A held channel halts the +; 68000, and the frame clock is an INTERRUPT off V-DISP. Edges that fall +; while the CPU is halted are not counted twice by the MFP -- the pending +; bit is one bit -- so a transfer long enough to span two V-DISPs makes the +; player's own clock LOSE TIME. Nothing in this project has run a transfer +; and a clock at once before, so nothing could have seen it. CLK_VDISP is +; the machine's count and the host's raster count is the truth; the gate +; compares them rather than trusting either. +; +; BOTH CONFIGURATIONS ARE SELECTABLE (PG_HELD) FOR EXACTLY THAT REASON. 59.3 +; already showed that an auto-requested channel is charged by TIME rather than +; by byte, so "held" and "stealing" are not two speeds of the same thing: held +; is the CPU stopped for as long as the record takes to arrive, and stealing is +; the CPU running against a channel taking its share. A player has to keep a +; clock, read a joystick and feed ADPCM, so which of the two is survivable is a +; design question and not a benchmark. +; +; AND IT IS STILL NOT A RATE. MAME's HD63450 is configured in wall-clock +; attotimes (42.5) and its held mode halts the CPU rather than charging it +; cycles per operand, so nothing below measures `W`. What it measures is +; whether the SHAPE works: one start, 193 destinations, 120 times, on a clock +; the machine keeps itself, with every frame pixel-exact off a real volume. +; --------------------------------------------------------------------------- + +; ---- inputs, written by the rig before the CPU is launched +PG_FLAG = $18900 ; 0 idle / 1 running / $FF done / $Exx failed +PG_NFR = $18904 ; frames in the scene +PG_FPS = $18908 ; frame rate the clock is asked for +PG_LBA0 = $1890C ; LBA of record 0. A WORD AND NOT A CONSTANT: + ; a shipping volume has a filesystem in front of + ; the stream, and this is the one number that + ; changes when it does (xfer.i says the same). +PG_RECS = $18910 ; sectors in a record -- 97, and the container + ; is what says so +PG_PALL = $18914 ; 1 = the palette is LAST in the record. It is + ; a CONTAINER property (dlxp.py flags bit 1) and + ; the player reads it rather than assuming it: + ; FINDINGS 62.5/63.4 priced both orders at + ; -12.8 dB for one paint and could not choose + ; between them, so K3 runs both. +PG_HELD = $18918 ; 1 = DM_HELD_* (burst, bus held), 0 = DM_STEAL_* +PG_PACEON = $1891C ; 1 = obey the frame clock. 0 free-runs, which + ; tests the CHAIN without the clock in the way. +PG_ITER = $18920 ; passes over the scene; >1 exercises the SEEK, + ; which for this container is arithmetic + +; ---- outputs +PG_SHOWN = $18930 ; frames displayed. Bumped AFTER bit 11 is + ; cleared, so a rig that snapshots on a change + ; is snapshotting a frame that is on screen. +PG_ERR = $18934 ; SC_ERR of the first failed read, 0 = none +PG_ERRAT = $18938 ; ...and the frame it failed on +PG_LATE = $1893C ; frames that reached the gate with their tick + ; already past -- the previous frame overran +PG_LATE1 = $18940 ; the first of them +PG_LATEM = $18944 ; the worst, in whole ticks +PG_VDISP = $18948 ; CLK_VDISP as the machine counted it +PG_VD0 = $1894C ; ...and as it stood when frame 0 started, so a + ; rig can charge only the frames it ran +PG_TSPIN = $18950 ; total DM_SPIN over the run: the CPU's own trips + ; round the transfer wait. Held, this is one per + ; frame and the CPU did nothing else all scene. +PG_GSPIN = $18954 ; total pace-gate polls: what the CPU had LEFT +PG_LOSTV = $18958 ; V-DISP edges the machine did not see, summed + ; per frame -- see pg_frame +PG_ARRN = $1895C ; entries the array was built with (an assertion + ; the rig reads back rather than a comment) + +; ---- the array chain. 193 x 6 B = 1,158 B, built once at scene setup. +; $1B000 and not $19000: dmagate.s's two arrays live at $19000/$19100 and +; ring.i's disc-offset table at $19400, and a front-end that shares an address +; with another front-end is how DM_USE landed on ring.i's mailbox (dma.i). +PG_ARR = $1B000 +PG_MAXE = 256 ; the chain cannot be longer than this + +; ---- geometry. The container's, not the screen's: the screen is 256x256 and +; the picture is 256x192, so the difference is letterbox and is STATIC SETUP. +PG_W = 256 +PG_H = 192 +PG_ROWB = PG_W/2 ; 128 words = 256 BYTES a row. THE WHOLE POINT: + ; 1.0 B/pixel, because bit 11 stops GVRAM + ; masking the high byte away and the two + ; 256-colour pages are scrolled 384 apart + ; (FINDINGS 46.5/47.1, dlxp.py). +PG_STRIDE = 1024 ; GVRAM line stride, in bytes +PG_PALB = 512 ; 256 GRB555+I words -- and exactly one sector + +SCRW = 256 +SCRH = 256 +GVRAM = $C00000 +GPAL = $E82000 +VC0 = $E82400 +VC1 = $E82500 +VC2 = $E82600 +CONTRAST = $E8E001 +; The graphic scroll registers, named rather than written as CRTC+n*2.l: a +; 256-colour page is assembled from TWO nibble planes with independent scroll +; registers (px68k Grp_DrawLine8 reads scroll sets page*2 and page*2+1), so both +; of a page's registers have to agree or the page tears between its low and high +; nibble. Naming them is what makes the pairing visible at the write. +CR_P0X0 = CRTC+12*2 +CR_P0Y0 = CRTC+13*2 +CR_P0X1 = CRTC+14*2 +CR_P0Y1 = CRTC+15*2 +CR_P1X0 = CRTC+16*2 +CR_P1Y0 = CRTC+17*2 +CR_P1X1 = CRTC+18*2 +CR_P1Y1 = CRTC+19*2 +PG_YOFF = (SCRH-PG_H)/2 ; 32 +PG_TOP = GVRAM+PG_YOFF*PG_STRIDE +PG_BLACK = $FFFF ; letterbox: index 255 in BOTH bytes. NOT 0 -- + ; index 0 is page 1's transparency key and black + ; lives at 255 (dlxp.py, vq.frame_palette). + +; R20. bit 11 = G-VRAM set to buffer, i.e. the WRITE WINDOW; bits 9-8 = 01 +; 256 colours; bit 4 = 31.5 kHz; bits 3-0 = 256 lines, 256 dots. The two +; values differ in EXACTLY bit 11, which is what makes the window a window. +PG_R20D = $0110 ; displaying +PG_R20B = $0910 ; the write window open + + include "src/player/geom.i" + + org $10000 +start: + move.l #1,PG_FLAG.l + clr.l PG_SHOWN.l + clr.l PG_ERR.l + move.l #-1,PG_ERRAT.l + clr.l PG_LATE.l + move.l #-1,PG_LATE1.l + clr.l PG_LATEM.l + clr.l PG_TSPIN.l + clr.l PG_GSPIN.l + clr.l PG_LOSTV.l + +; ---- 1. the display. THE PLAYER OWNS IT, and that is a change from every +; other rig in this tree: tools/bench/stream.lua and decode.lua call +; crtc_mode.lua's MODE.apply from the host, which is fine for a decoder gate and +; is not a player. A player boots into a machine the IPL left in 768x512 +; 16-colour and has to get to 256x256 256-colour packed by itself, and the +; scroll registers and the priority word are load-bearing rather than cosmetic: +; 47.5 measured VC1 = $0000 putting page 0 on top and blacking the right half of +; the screen. + bsr pg_video + +; ---- 2. the static half of the picture (FINDINGS 47.2). Words 128..511 of +; every row, and the letterbox rows entire, are written ONCE and never again -- +; which is what makes the per-frame payload exactly the picture. Page 1's +; storage at 384..511 is what the +384 scroll puts under screen columns 0..127, +; and it must read 0 so that the opaque page 0 shows through there. + bsr pg_static + +; ---- 3. the chain the channel will walk, 193 entries of it (FINDINGS 62). + bsr pg_array + +; ---- 4. the transport. ONCE, not per frame: scsi_init resets the SPC and +; clears DM_USE, so a per-frame call would quietly put the data phase back on +; the CPU and the run would still deliver every byte -- 87 clocks each (58). + bsr scsi_init + bsr pg_dmacfg + +; ---- 5. the clock. AFTER the SPC, because clk_init lowers the interrupt mask +; to $2500 and the bring-up should not be the first thing running with level 6 +; open. It also CLEARS PACE, so tick 0 is the instant the scene starts. + move.l PG_FPS.l,CLK_FPS.l + tst.l PG_PACEON.l + beq.s .noclk + bsr clk_init + tst.l CLK_ERR.l + beq.s .noclk + move.l #$E1,PG_FLAG.l ; the mode is not one HFREQ describes + bra pg_hold +.noclk: + move.l CLK_VDISP.l,PG_VD0.l + +; ---- 6. the scene. + move.l PG_ITER.l,d6 + tst.l d6 + bne.s .it + moveq #1,d6 +.it: +pg_pass: + moveq #0,d7 ; d7 = frame index within the pass +pg_loop: + bsr pg_gate ; wait for tick d7 + bsr pg_frame ; and paint it + tst.l d0 + bmi.s pg_failed + addq.l #1,d7 + move.l PG_NFR.l,d0 + cmp.l d0,d7 + bcs.s pg_loop +; ---- a pass boundary. For this container a SEEK IS ARITHMETIC: there is no +; ring to discard, no index to walk and no prefill to climb, so the next pass's +; first record is simply LBA0 again. That is the whole of what K3 deletes, and +; it is worth one line of code and four of comment because it is the largest +; simplification in the project (ROADMAP K3) and it does not look like one. + subq.l #1,d6 + bne.s pg_pass + + move.l CLK_VDISP.l,PG_VDISP.l + bsr clk_stop + move.l #$FF,PG_FLAG.l + bra.s pg_hold +pg_failed: + move.l CLK_VDISP.l,PG_VDISP.l + bsr clk_stop + move.l #$E2,PG_FLAG.l +pg_hold: + bra.s pg_hold + +; ---------------------------------------------------------------- pg_gate +; Frame d7 may not START before tick d7 (the rule is stream.s's, unchanged, and +; deliberately so: the same gate against the same clock is what makes a paced +; packed run comparable with a paced codec run). A frame that arrives with its +; tick ALREADY past did not idle for a single poll, which means the previous +; frame used its whole slot and then some -- that is the underrun this player +; can have, and it is counted rather than absorbed. +pg_gate: + movem.l d0-d1,-(sp) + tst.l PG_PACEON.l + beq.s .out + move.l CLK_PACE.l,d0 + cmp.l d7,d0 + bcs.s .wait ; PACE < d7: early, the common case + tst.l d7 + beq.s .out ; frame 0 starts AT tick 0 by definition + tst.l PG_LATE.l + bne.s .nf + move.l d7,PG_LATE1.l +.nf: addq.l #1,PG_LATE.l + sub.l d7,d0 ; whole ticks overrun + cmp.l PG_LATEM.l,d0 + bls.s .out + move.l d0,PG_LATEM.l + bra.s .out +.wait: addq.l #1,PG_GSPIN.l + move.l CLK_PACE.l,d0 + cmp.l d7,d0 + bcs.s .wait +.out: movem.l (sp)+,d0-d1 + rts + +; ---------------------------------------------------------------- pg_frame +; ONE FRAME. Open the write window, hand the record to the channel, close it. +; Returns d0 < 0 on a transport failure. +; +; THE WINDOW IS OPENED ROUND THE TRANSFER AND NOT ROUND THE SCENE, and that is +; not tidiness. R20 bit 11 blanks the graphics layer while it is set (measured, +; tools/bench/crtc_mode.lua) -- 47.4/ROADMAP B2 is exactly the question of +; whether a real board does too -- so a scene-long window would show nothing at +; all. Held round the transfer it is a shutter: the screen is dark for as long +; as the record takes to land and shows a COMPLETE frame the rest of the time. +; That is also why this player cannot tear the way FINDINGS 41's decoder does: +; there is no instant at which a half-written picture is displayable. +; +; CLK_VDISP IS SAMPLED EITHER SIDE OF THE TRANSFER. The difference is the +; V-DISP edges the machine SAW; the raster produced its own number regardless. +; In the held configuration the CPU is stopped for the whole transfer, so any +; edge that falls inside it is one the MFP can only remember once -- and a frame +; clock built on counting them loses time it can never get back. The subtraction +; here is what makes that visible without a host in the loop. +pg_frame: + movem.l d1-d5/a1,-(sp) + move.l CLK_VDISP.l,d5 + + move.w #PG_R20B,CRTC_R20.l ; the write window opens + +; LBA = PG_LBA0 + d7 * PG_RECS. Arithmetic, not a lookup: a packed record's +; length is geometry, so this player carries no record index at all (dlxp.py). + move.l d7,d3 + move.l PG_RECS.l,d0 + mulu d0,d3 ; frames * sectors, both small + add.l PG_LBA0.l,d3 + move.l PG_RECS.l,d4 + lea GVRAM,a1 ; IGNORED under chaining -- the channel + ; takes MAR from the array's first entry + ; -- and passed so that this call site + ; reads like every other one in the tree + bsr scsi_read + move.l d0,d1 + + move.w #PG_R20D,CRTC_R20.l ; ...and closes. The frame is up. + + move.l DM_SPIN.l,d0 + add.l d0,PG_TSPIN.l + move.l CLK_VDISP.l,d0 + sub.l d5,d0 ; edges seen across the transfer + beq.s .nolost + subq.l #1,d0 ; one edge per frame slot is expected; + add.l d0,PG_LOSTV.l ; what is counted is the SURPLUS, and a +.nolost: ; deficit cannot be seen from in here -- + ; the host's raster count is what says + ; how many there really were + move.l d1,d0 + bmi.s .err + addq.l #1,PG_SHOWN.l + movem.l (sp)+,d1-d5/a1 + rts +.err: tst.l PG_ERR.l + bne.s .err2 + move.l SC_ERR.l,PG_ERR.l + move.l d7,PG_ERRAT.l +.err2: moveq #-1,d0 + movem.l (sp)+,d1-d5/a1 + rts + +; ---------------------------------------------------------------- pg_dmacfg +; The channel's configuration, and the choice between the only two rows of the +; ladder MAME has a code path for (dma.i: no EXREQ wiring, no single-address +; path, and only burst modelled as held). OCR gets CHAIN = %10 on top, which is +; sequential array chaining and is what makes 193 destinations one start. +pg_dmacfg: + move.l #DM_STEAL_DCR,d0 + move.l #DM_STEAL_OCR,d1 + tst.l PG_HELD.l + beq.s .set + move.l #DM_HELD_DCR,d0 + move.l #DM_HELD_OCR,d1 +.set: move.l d0,DM_DCRV.l + ori.l #$08,d1 ; OCR CHAIN = %10, array chain + move.l d1,DM_OCRV.l + move.l #PG_ARR,DM_BARV.l + move.l PG_ARRN.l,DM_BTCV.l + move.l #1,DM_USE.l ; AFTER scsi_init, which clears it + rts + +; ---------------------------------------------------------------- pg_array +; The 193 {u32 MAR, u16 MTC} entries, built once. SCENE-CONSTANT: the packed +; layout spends both 256-colour pages, so there is no page to flip and no +; destination that changes from frame to frame (FINDINGS 62). +; +; THE ORDER IS THE CONTAINER'S. Palette first or 193rd is one paint of +; mismatch either way and 63.4 priced both at -12.8 dB without being able to +; choose; so the format records it (dlxp.py flags bit 1) and this reads it. An +; array built the other way round from the record it is fed would not fail -- it +; would paint 192 rows of picture into the palette registers and 512 B of +; palette across the top two rows of the screen, which is a picture, and a gate +; that only checked for errors would pass it. +pg_array: + movem.l d0-d2/a0-a1,-(sp) + lea PG_ARR,a0 + tst.l PG_PALL.l + bne.s .rows + bsr .pal +.rows: + lea PG_TOP,a1 + move.w #PG_H-1,d0 +.r: move.l a1,(a0)+ + move.w #PG_ROWB*2,(a0)+ + lea PG_STRIDE(a1),a1 + dbra d0,.r + tst.l PG_PALL.l + beq.s .done + bsr .pal +.done: + move.l a0,d0 + sub.l #PG_ARR,d0 + divu #6,d0 + andi.l #$FFFF,d0 + move.l d0,PG_ARRN.l + movem.l (sp)+,d0-d2/a0-a1 + rts +.pal: move.l #GPAL,(a0)+ + move.w #PG_PALB,(a0)+ + rts + +; ---------------------------------------------------------------- pg_video +; 256x256, 256 colours, 31.5 kHz, the two pages scrolled 384 apart, page 1 on +; top. Every value here is tools/bench/crtc_mode.lua's, which derives them from +; the dot clocks rather than recalling them; this is the same table in the place +; a player would keep it. +pg_video: + movem.l d0-d1/a0-a1,-(sp) + lea pg_crtc(pc),a0 + lea CRTC,a1 + moveq #0,d0 +.c: move.w (a0)+,d0 + bmi.s .cdone + move.w (a0)+,d1 + move.w d1,0(a1,d0.w) + bra.s .c +.cdone: + move.w #PG_R20D,CRTC_R20.l + move.w #$0001,VC0.l ; 256 colours +; PAGE 1 ON TOP. MEASURED (tools/bench/probe_page1.lua): $0000 puts page 0 on +; top, its zeros then cover page 1 and the right half of the screen is black -- +; which was the first failure of the packed layout and does not look like a +; priority bug from the outside. + move.w #$0002,VC1.l + move.w #$001F,VC2.l ; graphics on, all four pages + move.b #15,CONTRAST.l ; the IPL leaves 14, i.e. 7% dark +; The scroll. Both registers of each page, for the reason named at CR_P0X0. +; move.w #0 and not clr.w: CLR on a 68000 READS the destination before writing +; it, and a write-only register read back is a machine-dependent value this code +; has no reason to depend on. + move.w #0,CR_P0X0.l + move.w #0,CR_P0Y0.l + move.w #0,CR_P0X1.l + move.w #0,CR_P0Y1.l + move.w #384,CR_P1X0.l ; X = 384 = -128 mod 512 + move.w #0,CR_P1Y0.l + move.w #384,CR_P1X1.l + move.w #0,CR_P1Y1.l + movem.l (sp)+,d0-d1/a0-a1 + rts + +; register number * 2, value; -1 ends it +pg_crtc: + dc.w 0*2,45 ; H total: 46 chars = 368 dots = 31500 Hz + dc.w 1*2,5 ; H sync end + dc.w 2*2,10 ; H disp begin + dc.w 3*2,42 ; H disp end -> 256 dots + dc.w 4*2,567 ; V total: 568 lines -> 55.4577 Hz + dc.w 5*2,5 ; V sync end + dc.w 6*2,40 ; V disp begin + dc.w 7*2,552 ; V disp end -> 512 lines, double-scanned + dc.w 8*2,27 ; H sync adjust + dc.w -1,0 + +; ---------------------------------------------------------------- pg_static +; The half of the screen the container does not carry (FINDINGS 47.2). Two +; regions, and they are static for two different reasons: +; +; words 128..511 of EVERY row. Page 1's storage at 384..511 sits under screen +; columns 0..127 after the +384 scroll and must read 0 so the opaque page 0 +; shows through; the rest is off-screen storage. Zero, once. +; the LETTERBOX rows, 0..31 and 224..255. The picture is 192 rows of a +; 256-row screen. $FFFF is index 255 in both bytes, and 255 is black in +; every frame's palette (vq.frame_palette reserves it), so these rows stay +; correct across a per-frame palette without being rewritten. +; +; Written with the WRITE WINDOW OPEN, because that is the only mode in which a +; word write lands both bytes -- outside it gvram_w takes `data & 0x00ff` and +; the high byte is thrown away, which is the whole 2.0 B/pixel problem (46.5). +pg_static: + movem.l d0-d3/a0-a1,-(sp) + move.w #PG_R20B,CRTC_R20.l + lea GVRAM,a0 + move.w #SCRH-1,d0 ; y + moveq #0,d3 +.row: + movea.l a0,a1 + move.w d3,d1 + cmp.w #PG_YOFF,d1 + bcs.s .letter + cmp.w #PG_YOFF+PG_H,d1 + bcc.s .letter + lea PG_ROWB*2(a1),a1 ; a picture row: leave words 0..127 to + move.w #SCRW-PG_ROWB-1,d1 ; the channel, zero 128..511 + bra.s .z +.letter: + move.w #PG_ROWB-1,d1 ; words 0..127 <- black +.lb: move.w #PG_BLACK,(a1)+ + dbra d1,.lb + move.w #SCRW-PG_ROWB-1,d1 ; ...and 128..511 <- 0, as everywhere +.z: clr.w (a1)+ + dbra d1,.z + lea PG_STRIDE(a0),a0 + addq.w #1,d3 + dbra d0,.row + move.w #PG_R20D,CRTC_R20.l + movem.l (sp)+,d0-d3/a0-a1 + rts + + include "src/player/clock.i" +; scsi.i includes src/player/dma.i itself, at its foot -- so it is NOT included +; here. The DMAC constants and sc_in_dma come in with the transport that uses +; them, which is also why dmagate.s includes only scsi.i. + include "src/player/scsi.i" diff --git a/tools/analysis/31_display_duty.py b/tools/analysis/31_display_duty.py new file mode 100644 index 0000000..3f80156 --- /dev/null +++ b/tools/analysis/31_display_duty.py @@ -0,0 +1,215 @@ +#!/usr/bin/env python3 +"""HOW LONG IS THE PICTURE ACTUALLY ON SCREEN? ROADMAP K3, FINDINGS 64. + + python3 tools/analysis/31_display_duty.py [container.dlxp] [--rate KB/s ...] + +THE QUESTION NOTHING IN THIS TREE HAD ASKED. Every budget in docs/FINDINGS.md +asks what a frame COSTS -- clocks, bus cycles, bytes on the wire. Session 32 +built the packed player and ran it (src/player/packed.s), and the run reported a +number no budget has a column for: the write window was open on 99.5% of the +host frames, so the graphics layer was DARK for 99.5% of the scene. Every frame +was pixel-exact and almost none of them was visible. + +WHY THAT IS ARITHMETIC AND NOT AN EMULATOR ARTEFACT. 256-colour GVRAM masks the +high byte of every write unless CRTC R20 bit 11 is set (46.5/47.1), and the +packed layout's whole 1.0 B/pixel claim is that one word carries two pixels -- +so a packed write REQUIRES the bit. If buffer mode blanks the layer while the +bit is set (47.4/ROADMAP B2 -- MAME says it does, and 48.1's prior leans that +way), then the layer is dark for exactly as long as the window is open, and for +a DMAC-direct player the window is open for the whole transfer. There is no +second page to hide behind: the packed layout SPENDS both 256-colour pages, +which is the same fact that made a frame one channel start (FINDINGS 62). + + dark fraction of a slot = record bytes / (data-phase rate x slot) + +AND THE RATE IN THAT EXPRESSION IS THE BURST RATE, NOT THE SUSTAINED ONE. This +is the correction the session had to make to itself. The container's 582.0 KB/s +is a SUSTAINED requirement -- it decides whether record i arrives before slot i. +The dark fraction is set by how fast bytes move DURING THE DATA PHASE, which for +a drive with a read-ahead cache can be several times the sustained figure. The +two are independent, and a medium can pass one and fail the other: + + sustained >= 582.0 KB/s or frames arrive late (B1, known) + data phase >> 582.0 KB/s or the frame is never displayed (NEW, and B1 has + no test for it) + +THE OTHER PLAYER IN THE FAMILY DOES NOT HAVE THIS PROPERTY. A packed player +that DMAs the record into RAM and paints it with the CPU opens the window only +for the paint -- tools/bench/blit.s V8, MEASURED, not assumed -- which is a +fixed share of the slot no matter what the medium does. It costs more clocks +and 49 KB of RAM and it buys a picture that is on screen. FINDINGS 61.5 already +priced both in CLOCKS and ranked DMAC-direct first; this file is the column that +was missing from that table, and it reverses the ranking under B2-blanks. +""" +import argparse, os, re, sys +sys.path.insert(0, "tools/encoder") +sys.path.insert(0, os.path.dirname(os.path.abspath(__file__))) +from dlxp import DLXP +import buscost as B + +CPUHZ = 10e6 # stock X68000, MAME 0.277 x68k.cpp:1133 + +ap = argparse.ArgumentParser() +ap.add_argument("container", nargs="?", default="tmp/packed_singe.dlxp") +ap.add_argument("--blit-log", default="tmp/blit_v8.log", + help="tools/bench/blit.lua's log -- the MEASURED packed paint. " + "Not a constant in this file: 47.6.1 filed the movem shape " + "as an assumption and session 29 measured it, and a second " + "copy of a measured number is how one of them goes stale.") +ap.add_argument("--rate", type=float, nargs="*", default=None, + help="data-phase rates to price, KB/s. REQUIRED to mean " + "anything: this project has no delivery figure and will " + "not default to one (FINDINGS 50).") +ap.add_argument("--run-log", default="tmp/packed_free_steal.log", + help="a free-running tools/bench/packed.lua log, for the " + "measured corroboration section") +a = ap.parse_args() + +d = DLXP(a.container) +SLOT_S = 1.0 / d.fps +FRAME_CLK = CPUHZ * SLOT_S +wire = d.kbps() # KB/s, and fixed by geometry + +blit = {} +if os.path.exists(a.blit_log): + for line in open(a.blit_log, errors="replace"): + m = re.search(r"V(\d+)\s+(\d+) cyc", line) + if m: + blit[int(m.group(1))] = int(m.group(2)) +if 8 not in blit: + sys.exit(f"{a.blit_log} has no V8 result. The packed paint is a MEASUREMENT " + f"(tools/bench/blit.lua) and this tool will not substitute a " + f"constant for it -- run the blit bench, or point --blit-log at " + f"its log.") +PAINT_CLK = blit[8] +PAINT_FRAC = PAINT_CLK / FRAME_CLK + +print(f"""THE CONTAINER (tools/encoder/dlxp.py) + {a.container}: {d.W}x{d.H} {d.fps} fps, {d.nframes} frames + record {d.rec_bytes:,} B = {d.rec_bytes // 512} sectors, palette \ +{'LAST' if d.palette_last else 'FIRST'} + slot {SLOT_S*1000:.2f} ms = {FRAME_CLK:,.0f} clocks + wire {wire:.1f} KB/s -- FIXED by geometry. A codec's bitrate is a lever and a + literal frame's is not (61.6), so nothing an encoder does moves this. + +THE TWO PACKED PLAYERS, and the difference is WHEN the write window is open + + A. DMAC-DIRECT (src/player/packed.s, ROADMAP K3, and the one that is built). + One channel start, 193 destinations, the CPU halted or nearly. The window + must be open for the WHOLE data phase, because the channel writes when the + bytes arrive and the CPU cannot know when that is -- and a packed write + that lands with the bit clear is masked to its low byte and silently wrong. + B. DMA-TO-RAM + CPU PAINT. The record lands in RAM with the window shut; the + 68000 then paints it with the packed movem blit. The window is open for the + PAINT and nothing else: {PAINT_CLK:,} clocks, {100*PAINT_FRAC:.1f}% of a slot, + MEASURED by tools/bench/blit.lua (V8), and INDEPENDENT of the medium. + + Under 47.4-blanks the dark interval IS the open window, so B is on screen for + {100*(1-PAINT_FRAC):.1f}% of every slot at ANY rate that delivers the record at all, + and A's visibility is a function of the rate. +""") + +rates = a.rate +if not rates: + print("""NO RATES GIVEN, so no table. This project retired its delivery +constant outright (FINDINGS 50, USER DECISION) and every tool requires an +explicit rate; a default here would be the same mistake in a new place. Pass +--rate with the figures you want priced. The three thresholds already derived +elsewhere, for reference and NOT as defaults: + 453.6 KB/s the DLX5 codec gate container needs no prefill (49.5/60) + 576.0 KB/s a packed container with no per-frame palette (61.5) + 582.0 KB/s THIS container, palette included (63) +and note that all three are SUSTAINED figures. The dark fraction below is set by +the DATA-PHASE rate, which is a different measurement nothing has taken.""") + sys.exit(0) + +print("A's VISIBILITY, against the DATA-PHASE rate\n") +print(f" {'data phase':>12} | {'transfer':>9} | {'window open':>11} | " + f"{'PICTURE ON SCREEN':>17} | vs B") +print(f" {'KB/s':>12} | {'ms':>9} | {'% of slot':>11} | " + f"{'% of slot':>17} |") +print(" " + "-"*12 + "-+-" + "-"*9 + "-+-" + "-"*11 + "-+-" + "-"*17 + "-+-----") +for R in sorted(rates): + t_ms = d.rec_bytes / (R * 1024) * 1000 + openf = min(1.0, t_ms / (SLOT_S * 1000)) + vis = 1.0 - openf + verdict = ("A wins" if vis > 1 - PAINT_FRAC else + "B wins" if vis < 1 - PAINT_FRAC else "equal") + late = " LATE" if R < wire else "" + print(f" {R:>12.1f} | {t_ms:>9.2f} | {100*openf:>11.1f} | " + f"{100*vis:>17.1f} | {verdict}{late}") + +# The crossover, stated as a rate rather than left to be read off the table: it +# is the one number in here a hardware acceptance test can be written against. +cross = d.rec_bytes / (PAINT_FRAC * SLOT_S) / 1024 +print(f""" + A and B show the picture for the same share of the slot at a data-phase rate + of {cross:,.0f} KB/s. Below that, THE PLAYER WITH THE CPU IN THE LOOP IS ON + SCREEN LONGER than the one without it -- which is the reverse of FINDINGS + 61.5's ranking, and 61.5 is not wrong: it ranked them in CLOCKS, and this is + the column that table does not have. + + {cross:,.0f} KB/s is {cross/wire:.1f}x the container's own wire. So a medium that exactly + meets the sustained requirement puts the DMAC-direct player's picture on + screen for {100*max(0.0, 1-wire/wire):.0f}% of every slot: it delivers every frame, on time, + pixel-exact, and displays none of them.""") + +print(f""" +THE CPU SIDE, so the trade is priced on both axes (FINDINGS 61.5's ladder) + + W is clocks stolen per delivered byte. Only the dual-address rungs have a code + path on this machine (59.2), and 9 is the floor: a 4-clock read of the device + plus a 5-clock write to memory. +""") +print(f" {'W':>3} | {'A: DMAC-direct':>15} | {'B: DMA + CPU paint':>19}") +print(" " + "-"*3 + "-+-" + "-"*15 + "-+-" + "-"*19) +AUDIO = B.ADPCM_BYTES_PER_S / d.fps * B.ADPCM_CLK_BYTE_BEST +for W in (5, 9, 12, 16, 19): + xfer = d.rec_bytes * W + ca = (xfer + AUDIO) / FRAME_CLK + cb = (xfer + AUDIO + PAINT_CLK) / FRAME_CLK + print(f" {W:>3} | {100*ca:>14.1f}% | {100*cb:>18.1f}%") +print(f""" + Both include the audio DMA at {AUDIO:,.0f} clocks a frame ({100*AUDIO/FRAME_CLK:.2f}%), charged from + the IPL ROM's own channel-3 setup (21_iplrom_dmac.py, 52.5). Neither includes + a decoder, because neither has one. + + So B costs the paint -- {100*PAINT_FRAC:.1f}% of a frame -- and TWO record buffers, + {2*d.rec_bytes:,} B of RAM. Two and not one: at any rate near the wire the delivery + of record i+1 occupies most of the slot the paint of record i happens in, so + they overlap by construction. On a 2 MB machine that is {200*d.rec_bytes/(2*1024*1024):.1f}% of memory and + it is the resource this design has spare -- the ring the packed branch deleted + was 256 KB (FINDINGS 49). That is what a visible picture costs if 47.4 blanks.""") + +# ---- the measured corroboration. It is a SEPARATE section and it is bounded +# on purpose: MAME's device models carry no transfer timing (docs/BENCHMARK.md, +# 42.5), so the run cannot supply a rate for the table above -- what it can do +# is show that the mechanism is real and that the arithmetic predicts it. +if os.path.exists(a.run_log): + txt = open(a.run_log, errors="replace").read() + m_rate = re.search(r"record lands in ([\d.]+) ms, i\.e\. ([\d.]+) KB/s", txt) + m_open = re.search(r"WRITE WINDOW OPEN on (\d+) of (\d+) host frames", txt) + if m_rate and m_open: + ms, kbps = float(m_rate.group(1)), float(m_rate.group(2)) + op, tot = int(m_open.group(1)), int(m_open.group(2)) + pred = min(1.0, d.rec_bytes / (kbps * 1024) / SLOT_S) + print(f""" +MEASURED, on the emulated machine (tools/bench/packed_run.sh, free-running) + + {a.run_log}: a {d.rec_bytes:,} B record landed in {ms:.2f} ms = {kbps:.1f} KB/s, and the + write window was open on {op} of {tot} host frames = {100*op/tot:.1f}%. + The expression above predicts {100*pred:.1f}% at that rate. + + THIS IS NOT A RATE MEASUREMENT AND {kbps:.0f} KB/s IS NOT A MEDIUM. MAME's + device models carry no transfer timing (42.5); the figure is a property of the + apparatus. What the run DOES establish is that the mechanism is the one the + arithmetic describes -- and one thing more that no arithmetic could have + given: the DMAC CONFIGURATION DOES NOT MOVE IT. Held and stealing delivered + the same record within 0.5% of each other, so what a channel configuration + buys is who owns the CPU, not when the picture appears.""") +else: + print(f""" +NO MEASURED SECTION: {a.run_log} is absent. Run +tools/bench/packed_run.sh to produce it. The arithmetic above stands without +it -- it is geometry -- but the run is what showed the effect was there to be +derived at all.""") diff --git a/tools/bench/check.sh b/tools/bench/check.sh index 9d86c3a..63ca83b 100755 --- a/tools/bench/check.sh +++ b/tools/bench/check.sh @@ -703,4 +703,36 @@ else echo " SKIPPED: no px68k at $PX68K -- the container's bytes were not rendered" fi +echo "--- session 32: the PACKED PLAYER, end to end off the disc (FINDINGS 64) ---" +# ROADMAP K3. src/player/packed.s brings up its own display, builds its own +# 193-entry DMA chain, keeps its own frame clock off V-DISP and fetches every +# record itself with READ(10) off a CZ-6BS1. This script writes no picture byte +# and no palette entry. +# +# WHY EVERY FRAME IS COMPARED AND THE CODEC'S GATE COMPARES ONE. The codec is +# temporally recursive -- a SKIP block is a claim about the previous frame -- so +# its last frame audits all 120. A packed frame is a LITERAL and frame 119 says +# nothing about frame 60. The simplification that deleted the ring also deleted +# the gate's free lunch. +# +# AND WHY IT IS PACED AT HALF RATE. The write window has to be OPEN for the +# whole transfer and buffer mode blanks the graphics layer, so at the +# container's own 12 fps there is no instant at which a complete frame is +# displayable and there is nothing to snapshot (FINDINGS 64.2 -- that is the +# session's finding, not a rig limitation being worked around). Half rate opens +# a display interval without changing one byte of the transfer. +# +# GATE ONLY: runs 2-4 of packed_run.sh measure the apparatus rather than gate +# it, and they are three more MAME jobs for numbers that cannot change unless +# MAME does. tools/bench/packed_run.sh with no DLX_PK_GATE_ONLY runs all four. +if [ -f "$HOME/mame/roms/x68000.zip" ] || [ -d "$HOME/mame/roms/x68000" ]; then + DLX_PK_GATE_ONLY=1 DLX_PK_NFR="$NF" bash tools/bench/packed_run.sh \ + tmp/packed_singe.dlxp > tmp/packed_gate_stage.log 2>&1 \ + || { cat tmp/packed_gate_stage.log; exit 1; } + grep -aE "^ (FLAG|array|chain|frame clock|late frames|WRITE WINDOW)|^OK " \ + tmp/packed_gate_stage.log +else + echo " SKIPPED: no x68000 romset -- the player was not run" +fi + echo "ALL GREEN" diff --git a/tools/bench/mkvol.sh b/tools/bench/mkvol.sh index b30e92a..2be3953 100755 --- a/tools/bench/mkvol.sh +++ b/tools/bench/mkvol.sh @@ -3,7 +3,21 @@ # instantiate the card. Sourced-by-calling from tools/bench/scsi_run.sh and # tools/bench/pace_run.sh so there is ONE copy of the layout. # -# tools/bench/mkvol.sh [container.dlx] +# tools/bench/mkvol.sh [container.dlx | container.dlxp] +# +# TWO CONTAINERS, ONE VOLUME BUILDER. A DLX volume is tools/bench/prep_stream.py's +# disk image -- the codec's records, laid down from sector 0. A DLXP volume +# (ROADMAP K2/K3) needs no preparation at all: the container is ALREADY a +# sector-aligned image of itself -- a 512 B header, then fixed 97-sector records +# -- so the file IS the volume and copying it is the whole build. That is not a +# convenience, it is the format's central claim (tools/encoder/dlxp.py) arriving +# at the disc, and a builder that transformed it on the way would be hiding the +# claim rather than testing it. +# +# The two get DIFFERENT CHD NAMES. Alternating between the packed rig and the +# codec rig would otherwise rebuild the volume on every run, and -- much worse -- +# a stale CHD under the name the other rig expected would serve one container's +# bytes to the other's gate, which reads as a decode failure and is not one. # # ONE COPY, ON PURPOSE. The volume is tmp/stream_disk.bin -- byte for byte the # file the host-file ring rig reads -- laid out as 512 B sectors. If two scripts @@ -22,15 +36,24 @@ set -e cd "$(dirname "$0")/../.." DLX=${1:-tmp/rc_fr_singe_scsi_span.dlx} -[ -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() +case "$DLX" in + *.dlxp) SRC="$DLX" + IMG=tmp/dlxpdisk.img; CHD=tmp/dlxpdisk.chd ;; + *) SRC=tmp/stream_disk.bin + IMG=tmp/dlxdisk.img; CHD=tmp/dlxdisk.chd + [ -f "$SRC" ] || python3 tools/bench/prep_stream.py "$DLX" > /dev/null ;; +esac + +if [ ! -f "$CHD" ] || [ "$SRC" -nt "$CHD" ]; then + SRC="$SRC" IMG="$IMG" python3 - <<'PY' +import os +src, img = os.environ["SRC"], os.environ["IMG"] +d = open(src, "rb").read() n = (len(d) + 511) // 512 -open("tmp/dlxdisk.img", "wb").write(d + b"\0" * (n * 512 - len(d))) +open(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 + rm -f "$CHD" # -c none IS LOAD-BEARING, and it was found by a gate rather than by taste. # Session 28, on the DLX5 volume: with the default (lzma/zlib/huff/flac) MAME # 0.277 served the CHD FILE'S OWN BYTES as sector data -- the destination @@ -45,7 +68,7 @@ PY # disc space: the failure is SILENT at the transport layer -- every READ(10) # reports success and returns the wrong bytes -- and only the byte comparison # in tools/bench/scsi.lua catches it. - chdman createhd -i tmp/dlxdisk.img -o tmp/dlxdisk.chd -ss 512 -c none > /dev/null 2>&1 + chdman createhd -i "$IMG" -o "$CHD" -ss 512 -c none > /dev/null 2>&1 fi mkdir -p tmp/p4roms/x68k_cz6bs1 diff --git a/tools/bench/packed.lua b/tools/bench/packed.lua new file mode 100644 index 0000000..5326987 --- /dev/null +++ b/tools/bench/packed.lua @@ -0,0 +1,332 @@ +-- Drive src/player/packed.s: THE DECODER-FREE PACKED PLAYER, END TO END, +-- OFF A REAL VOLUME. ROADMAP K3. +-- +-- WHAT THIS SCRIPT DOES NOT DO IS THE POINT OF IT. tools/bench/stream.lua +-- pushes expanded codebooks and a packed palette into RAM, plays a transport at +-- a modelled byte rate, and writes the frame tick. This one pushes 2,898 bytes +-- of 68000 code and eleven mailbox words, and then READS. It moves no picture +-- byte, models no rate, sets no CRTC register and writes no palette entry: the +-- machine brings up its own display, builds its own chain, keeps its own clock +-- off V-DISP and fetches every record itself with READ(10) off a CZ-6BS1. +-- +-- SO THE GATE IS NOT THE ONE THE CODEC USES, AND IT HAD TO CHANGE. +-- tools/bench/verify_decode.py checks ONE frame -- the last -- and that audits +-- the whole run because the codec is temporally recursive: a SKIP block is a +-- claim about the previous frame still being on screen, so the final frame is +-- only right if all 120 were. A packed frame is a LITERAL. Frame 119 being +-- pixel-exact says nothing whatever about frame 60. This script therefore +-- snapshots EVERY frame and tools/bench/verify_packed.py compares all of them; +-- the simplification that deleted the ring also deleted the gate's free lunch. +-- +-- WHEN A SNAPSHOT IS TAKEN, and why not on the frame it changed. PG_SHOWN is +-- bumped by the 68000 after it clears R20 bit 11, so a change means "a complete +-- frame is now displayable". But MAME's screen bitmap for the host frame in +-- progress was drawn partly before that instant, so snapshotting immediately +-- would sample the write window -- which BLANKS the graphics layer -- for part +-- of the picture. A 12 fps frame lasts 4 or 5 host refreshes at 56.69 Hz, so +-- waiting SNAP_DELAY whole host frames is safely inside the slot and safely +-- after the window closed. +-- +-- Env: +-- DLX_PK_HELD 1 = the channel HOLDS THE BUS (burst, max rate), 0 = it +-- steals cycles. Not two speeds of one thing: 59.3 showed an +-- auto-requested channel is charged by TIME, so held is the +-- 68000 stopped for as long as the record takes to arrive. +-- Default 1. +-- DLX_PK_PACE 1 = the machine holds itself to the container's fps off +-- V-DISP (default). 0 free-runs, which tests the CHAIN with +-- the clock out of the way. +-- DLX_PK_ITER passes over the scene (default 1). >1 exercises the seek, +-- which for this container is arithmetic and nothing else. +-- DLX_PK_NFR play only the first N frames (default: all of them) +-- DLX_PK_FPS pace at this rate instead of the container's. NOT a +-- cosmetic knob and not a way to make a number look better: +-- under MAME the emulated transport takes about a whole 12 fps +-- slot to deliver a 49,664 B record, and the write window has +-- to be OPEN for all of it -- so at 12 fps there is no instant +-- at which a complete frame is displayable and nothing can be +-- snapshotted. Pacing slower opens a display interval without +-- changing one byte of the transfer, which is what lets the +-- PIXEL-EXACTNESS of all 120 frames be gated separately from +-- the RATE the emulated transport happens to run at. The two +-- are different questions and this is the knob that separates +-- them. +-- DLX_PK_CSV write the per-frame arrival series here + +M = manager.machine +SP = M.devices[":maincpu"].spaces["program"] + +local function findfile(n) + for _,p in ipairs{"../tools/bench/"..n, "tools/bench/"..n, n} do + local f = io.open(p,"rb"); if f then f:close(); return p end + end + error(n.." not found") +end +local META = loadfile("packed_meta.lua")() + +-- src/player/packed.s. Inputs first, then outputs; the split is the file's. +local PG_FLAG, PG_NFR, PG_FPS, PG_LBA0 = 0x18900, 0x18904, 0x18908, 0x1890C +local PG_RECS, PG_PALL, PG_HELD = 0x18910, 0x18914, 0x18918 +local PG_PACEON, PG_ITER = 0x1891C, 0x18920 +local PG_SHOWN, PG_ERR, PG_ERRAT = 0x18930, 0x18934, 0x18938 +local PG_LATE, PG_LATE1, PG_LATEM = 0x1893C, 0x18940, 0x18944 +local PG_VDISP, PG_VD0, PG_TSPIN = 0x18948, 0x1894C, 0x18950 +local PG_GSPIN, PG_LOSTV, PG_ARRN = 0x18954, 0x18958, 0x1895C +local PG_ARR = 0x1B000 +-- src/player/clock.i and src/player/scsi.i, read for diagnosis only. +local CLK_PACE, CLK_VDISP, CLK_ERR = 0x18034, 0x18064, 0x1806C +local SC_ERR = 0x18200 +local CRTC_R20 = 0xE80028 + +local HELD = (os.getenv("DLX_PK_HELD") or "1") == "1" +local PACED = (os.getenv("DLX_PK_PACE") or "1") == "1" +local ITERS = tonumber(os.getenv("DLX_PK_ITER") or "") or 1 +local NFR = tonumber(os.getenv("DLX_PK_NFR") or "") or META.nframes +local FPS = tonumber(os.getenv("DLX_PK_FPS") or "") or META.fps +local CSV = os.getenv("DLX_PK_CSV") +local SNAP_DELAY = 2 + +local SCERRNAME = {[0]="OK", "SELECTION TIMEOUT -- no target answered", + "UNEXPECTED PHASE", "POLL TIMEOUT -- a phase never arrived", + "NON-ZERO SCSI STATUS", + "WINDOWED READ REFUSED -- a channel cannot drop bytes"} + +local code do local f=assert(io.open("packed.bin","rb")); code=f:read("a"); f:close() end + +local function T() local t=M.time; return t.seconds + t.attoseconds/1e18 end +local function P(s) print("[PK] "..s) end + +local function setup() + for i = 1, #code do SP:write_u8(0x10000+i-1, string.byte(code,i)) end + SP:write_u32(PG_FLAG, 0) + SP:write_u32(PG_NFR, NFR) + SP:write_u32(PG_FPS, FPS) + SP:write_u32(PG_LBA0, META.lba0) + SP:write_u32(PG_RECS, META.rec_sectors) + SP:write_u32(PG_PALL, META.palette_last) + SP:write_u32(PG_HELD, HELD and 1 or 0) + SP:write_u32(PG_PACEON, PACED and 1 or 0) + SP:write_u32(PG_ITER, ITERS) + SP:write_u32(PG_SHOWN, 0) + P(string.format("packed.bin=%d B, %dx%d %d fps, %d of %d frames, %d passes", + #code, META.W, META.H, META.fps, NFR, META.nframes, ITERS)) + P(string.format("record %d B = %d sectors at LBA %d + i*%d, palette %s", + META.rec_bytes, META.rec_sectors, META.lba0, + META.rec_sectors, META.palette_last == 1 and "LAST" or "FIRST")) + P(string.format("channel: %s, %s", + HELD and "BUS HELD (burst, max rate)" or "CYCLE STEALING", + PACED and ("SELF-PACED at "..FPS.." fps off V-DISP" + ..(FPS ~= META.fps and (" -- NOT the container's " + ..META.fps..", see DLX_PK_FPS") or "")) + or "FREE-RUNNING (tests the chain, not the clock)")) + P("this script writes NO picture byte, NO palette entry and NO CRTC register: " + .."the machine brings up its own display and fetches its own records.") +end + +local function launch() + local cpu = M.devices[":maincpu"] + cpu.state["SR"].value = 0x2700 -- supervisor, all interrupts masked; + cpu.state["SP"].value = 0x8000 -- clk_init lowers it to $2500 itself + cpu.state["PC"].value = 0x10000 +end + +local st, t0 = "boot", nil +local shown, pending, snaps = 0, nil, 0 +local arrive, hostfr, missed = {}, 0, 0 +-- WHICH FRAME EACH SNAPSHOT IS. MAME numbers snapshots 0000, 0001, ... in the +-- order they were taken, and a frame that could not be sampled leaves no gap in +-- that sequence -- so the file name is NOT the frame index and a verifier that +-- assumed it was would compare frame 61 against record 60 and report a codec +-- bug that is really a bookkeeping one. This is the map, written out for it. +local snapfr = {} +local r20seen = {} + +SUB = emu.add_machine_frame_notifier(function() + local ok, err = pcall(function() + local t = T() + if st == "boot" then + if t < 3.0 then return end + setup(); launch(); t0 = t; st = "running"; return + end + if st ~= "running" then return end + hostfr = hostfr + 1 + + -- WHAT THE SCREEN MODE WAS, sampled every host frame. R20 bit 11 blanks + -- the graphics layer, so this is the only way to see the shutter the player + -- is running: the fraction of host frames that found the window OPEN is the + -- fraction of the scene the display spent dark, and it is a MEASUREMENT of + -- 47.4's cost under MAME rather than a restatement of the prior. + local r20 = SP:read_u16(CRTC_R20) + r20seen[#r20seen+1] = ((r20 >> 11) & 1) + + local s = SP:read_u32(PG_SHOWN) + if s > shown then + -- Only the LAST change matters if several landed in one host frame; that + -- cannot happen at 12 fps on a 56.69 Hz raster, and if it ever does the + -- gate below catches it as a missing snapshot rather than a wrong one. + arrive[#arrive+1] = {n = s, t = t - t0} + shown = s + pending = SNAP_DELAY + end + if pending then + pending = pending - 1 + if pending <= 0 then + pending = nil + if (SP:read_u16(CRTC_R20) >> 11) & 1 == 0 then + M.video:snapshot(); snaps = snaps + 1 + snapfr[#snapfr+1] = shown - 1 + else + -- The window was open again when the delay expired: the frame we + -- meant to sample is being overwritten. COUNTED, NOT PRINTED -- when + -- the transfer is longer than the slot EVERY frame misses, and 119 + -- identical lines bury the four numbers the run exists to report. + -- The count is reported once at the end and the gate reads it there. + missed = missed + 1 + end + end + end + + local flag = SP:read_u32(PG_FLAG) + if flag ~= 1 and pending then + -- THE LAST FRAME IS STILL PENDING. packed.s spins in pg_hold with the + -- window CLOSED once the scene is over, so the delay can simply run out; + -- returning here rather than reporting is what stops the final frame + -- being the one frame the gate never sees. + return + end + if flag ~= 1 then + st = "done" + local wall = t - t0 + P(string.format("FLAG=$%02X after %.3f s, %d frames shown, %d snapshots, " + .."%d frames NOT SAMPLED (the write window had reopened " + .."-- the transfer is longer than the display interval)", + flag, wall, shown, snaps, missed)) + local err = SP:read_u32(PG_ERR) + if err ~= 0 then + P(string.format("TRANSPORT FAILED on frame %d: %s", + SP:read_u32(PG_ERRAT), SCERRNAME[err] or ("code "..err))) + end + P(string.format("array: the 68000 built %d entries (the container wants " + .."%d)", SP:read_u32(PG_ARRN), META.entries)) + -- The first entry, read back out of the machine's own RAM. It is the one + -- place palette-first and palette-last are visible as a FACT rather than + -- as a flag the rig passed in and the rig read back. + P(string.format("chain[0] = MAR $%06X MTC %d ; chain[1] = MAR $%06X MTC %d", + SP:read_u32(PG_ARR), SP:read_u16(PG_ARR+4), + SP:read_u32(PG_ARR+6), SP:read_u16(PG_ARR+10))) + if PACED then + local vd = SP:read_u32(PG_VDISP) - SP:read_u32(PG_VD0) + -- THE CLOCK, AGAINST THE RASTER THAT DROVE IT. CLK_VDISP counts the + -- edges the 68000's ISR SAW. hostfr counts the frames MAME actually + -- drew. A held channel halts the CPU, and the MFP's pending bit is one + -- bit, so an edge that falls inside a transfer long enough to span two + -- of them is an edge the machine can never count. Nothing in this + -- project has ever run a transfer and a clock at once, so nothing could + -- have seen this before. + P(string.format("frame clock: PACE=%d ticks, V-DISP edges SEEN=%d, " + .."host frames drawn=%d -> %d edges LOST (%.1f%%)", + SP:read_u32(CLK_PACE), vd, hostfr, hostfr - vd, + hostfr > 0 and (hostfr-vd)*100/hostfr or 0)) + local nlate = SP:read_u32(PG_LATE) + P(string.format("late frames (tick already past at the gate): %d%s", + nlate, nlate > 0 and string.format(", first %d, worst " + .."%d ticks", SP:read_u32(PG_LATE1), + SP:read_u32(PG_LATEM)) or "")) + -- AND WHY `late = 0` IS NOT `on time`. The gate compares the frame + -- index against PACE, and PACE is advanced by the ISR that the held + -- channel stops the CPU from running. A clock that loses edges loses + -- them from BOTH sides of the comparison, so a player whose own clock + -- has halved still reports every frame early. The LOST figure above is + -- the only thing in this run that can contradict it, and it comes from + -- the host's raster count rather than from the machine. + if hostfr - vd > 0 then + P(string.format(" ...and %d of those ticks were never " + .."issued, so `late=%d` is measured against a clock " + .."running at %.1f%% of the raster. The player " + .."believes it is at %d fps and the screen is at " + .."%.2f.", hostfr - vd, nlate, vd*100/hostfr, FPS, + FPS * vd / hostfr)) + end + end + P(string.format("CPU: %d trips round the TRANSFER wait in total, %d round " + .."the PACE gate", SP:read_u32(PG_TSPIN), + SP:read_u32(PG_GSPIN))) + local open = 0 + for _,v in ipairs(r20seen) do open = open + v end + P(string.format("WRITE WINDOW OPEN on %d of %d host frames (%.1f%%) -- " + .."buffer mode blanks the graphics layer, so that is the " + .."share of the scene the display spent DARK under MAME", + open, #r20seen, #r20seen > 0 and open*100/#r20seen or 0)) + if #arrive >= 2 then + local dts, first, last = {}, arrive[1].t, arrive[#arrive].t + for i = 2, #arrive do dts[#dts+1] = arrive[i].t - arrive[i-1].t end + table.sort(dts) + -- CADENCE, AND THE GRANULARITY IT IS MEASURED AT. PG_SHOWN is sampled + -- once per host frame, so a single inter-frame figure is quantised to + -- 1/56.69 s = 17.6 ms and the min/median/max below are multiples of it. + -- The MEAN over the whole run is not: the quantisation error is bounded + -- by one host frame at each END, so over n-1 intervals it is 35 ms/(n-1) + -- -- 0.30 ms a frame over 120. Read the mean; the spread is the + -- sampler's, not the player's. + local mean = (last-first)/(#arrive-1) + P(string.format("cadence: %d frames in %.3f s = %.3f fps, mean " + .."%.2f ms/frame (+/- %.2f ms, the sampler's); " + .."inter-frame min %.1f median %.1f max %.1f ms", + #arrive, last-first, (#arrive-1)/(last-first), + mean*1000, 35.3/(#arrive-1), + dts[1]*1000, dts[math.ceil(#dts/2)]*1000, + dts[#dts]*1000)) + -- THE TRANSPORT'S TIME IS ONLY READABLE OFF A FREE-RUNNING RUN. + -- Paced, the mean inter-frame IS THE PACE PERIOD: the player waits for + -- its tick and the record's delivery hides inside the slot, so dividing + -- the record by that mean reports the clock rather than the transport + -- and reports it as a rate. The first cut of this script printed + -- "297.4 KB/s" off a 6 fps gate run, which is the pace and not the + -- disc. Free-running there is no gate and the loop is transfer-bound, + -- so the mean is the transfer. + if not PACED then + P(string.format(" -> FREE-RUNNING, so the mean IS the " + .."transport: a %d B record lands in %.2f ms, i.e. " + .."%.1f KB/s and %.1f%% of a %d fps slot. MAME's " + .."device models carry no transfer timing " + .."(docs/BENCHMARK.md, 42.5), so this is a property " + .."of the APPARATUS -- it is not W and it is not a " + .."measurement of any medium.", + META.rec_bytes, mean*1000, + META.rec_bytes/mean/1024, + mean*META.fps*100, META.fps)) + else + -- What a paced run CAN say about the transfer, and it says it from + -- the display rather than from the clock: the window is open for + -- exactly as long as the record takes, so the open fraction times the + -- slot is the transfer time, sampled at the host's frame rate. + P(string.format(" -> PACED, so this mean is the PACE and " + .."NOT the transport. What the run does bound is the " + .."transfer: the window was open %.1f%% of a " + .."%.2f ms slot = %.1f ms a record.", + open*100/#r20seen, mean*1000, + open/#r20seen*mean*1000)) + end + end + if CSV then + local f = io.open(CSV, "w") + f:write("frame,t_s\n") + for _,a in ipairs(arrive) do f:write(string.format("%d,%.6f\n", a.n-1, a.t)) end + f:close() + P("arrivals -> "..CSV) + end + do + local f = assert(io.open("packed_snaps.csv", "w")) + f:write("snapshot,frame\n") + for i, fr in ipairs(snapfr) do + f:write(string.format("%04d,%d\n", i-1, fr)) + end + f:close() + P(string.format("%d snapshots -> tmp/packed_snaps.csv", #snapfr)) + end + P("done") + M:exit() + end + end) + if not ok then print("[PK] LUA ERROR: "..tostring(err)); M:exit() end +end) diff --git a/tools/bench/packed_run.sh b/tools/bench/packed_run.sh new file mode 100755 index 0000000..c47a0aa --- /dev/null +++ b/tools/bench/packed_run.sh @@ -0,0 +1,158 @@ +#!/bin/bash +# THE PACKED PLAYER, END TO END, OFF A REAL VOLUME. ROADMAP K3. +# +# tools/bench/packed_run.sh [container.dlxp] +# +# Four runs of src/player/packed.s, and each answers a different question. They +# are separate runs because the questions interfere: the write window has to be +# OPEN for the whole transfer and buffer mode blanks the graphics layer, so at +# the container's own 12 fps there is no instant at which a complete frame is +# displayable and the pixel gate has nothing to sample. Pacing slower opens a +# display interval without changing one byte of the transfer. Reporting the +# rate off the gate run instead would have been the flattering shortcut, and it +# reports the PACE rather than the disc -- the first cut of packed.lua did +# exactly that and printed 297 KB/s off a 6 fps run. +# +# 1. GATE, stealing, paced at half rate: 120 records, 120 snapshots, every one +# compared. A packed frame is a LITERAL, so unlike the codec's gate the last +# frame audits nothing and all 120 have to be checked (verify_packed.py). +# 2. RATE, stealing, FREE-RUNNING: the loop is transfer-bound, so the mean +# inter-frame IS the emulated transport's time for a record. +# 3. RATE, held, FREE-RUNNING: the same, with the bus held. +# 4. CLOCK, held, paced at the container's fps: what holding the bus does to a +# frame clock built on counting V-DISP interrupts. +# +# DLX_PK_GATE_ONLY=1 runs 1 alone. That is what tools/bench/check.sh takes: the +# green light's job is to catch a regression in the PLAYER, and runs 2-4 measure +# the apparatus rather than gate it -- three more MAME jobs for numbers that +# cannot change unless MAME does. +# +# THE APPARATUS is tools/bench/dma_run.sh's -- `x68000 -exp1 cz6bs1` and a +# zero-filled scsiexrom.bin on a private rompath -- and the volume is +# tools/bench/mkvol.sh's, which for a DLXP container is the container itself. +# +# WHAT NO RUN HERE MEASURES: `W`, and any rate a real medium would deliver. +# MAME's device models carry no transfer timing (docs/BENCHMARK.md, 42.5). What +# is measured is the SHAPE -- one channel start, 193 destinations, 120 times, +# on a clock the machine keeps itself, with every frame pixel-exact. +set -e +cd "$(dirname "$0")/../.." +DLXP=${1:-tmp/packed_singe.dlxp} +NFR=${DLX_PK_NFR:-120} +GATE_FPS=${DLX_PK_GATE_FPS:-6} + +bash tools/bench/mkvol.sh "$DLXP" +python3 tools/bench/prep_packed.py "$DLXP" +# WHICH ORDER THIS CONTAINER USES, read out of the container rather than +# assumed. FINDINGS 62.5/63.4 priced palette-first and palette-last at -12.8 dB +# for one paint apiece and could not choose between them, so the format records +# it (dlxp.py flags bit 1) and BOTH have to pass this gate. The chain assertion +# below is the only place the difference is visible from outside the machine, +# and hard-coding either order there would turn "K3 ran both" into "K3 ran one +# and the other could not have failed". +PALLAST=$(sed -n 's/.*palette_last = \([01]\),.*/\1/p' tmp/packed_meta.lua) +if [ "$PALLAST" = "1" ]; then + CHAIN0='chain\[0\] = MAR \$C08000 MTC 256' + ORDER="palette LAST -- the 193rd entry" +else + CHAIN0='chain\[0\] = MAR \$E82000 MTC 512 ; chain\[1\] = MAR \$C08000 MTC 256' + ORDER="palette FIRST -- entry 0, then 192 rows" +fi +echo " container order: $ORDER" +tools/vasm/vasmm68k_mot -Fbin -o tmp/packed.bin src/player/packed.s > /dev/null + +# One run. $1 names the log, the rest are environment. +run() { + local tag=$1; shift + rm -rf "tmp/snap_packed_$tag"; mkdir -p "tmp/snap_packed_$tag" + # 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 && env SDL_VIDEODRIVER=dummy "$@" stdbuf -oL timeout -k 5 900 \ + mame x68000 -bios ipl10 -exp1 cz6bs1 \ + -rompath "$HOME/mame/roms;./p4roms" -hard dlxpdisk.chd \ + -ramsize 2M -video soft -window -sound none -nothrottle -plugins \ + -autoboot_script ../tools/bench/packed.lua \ + -snapshot_directory "./snap_packed_$tag" -snapview native \ + -seconds_to_run "$SECS" > "packed_$tag.log" 2>&1 ) + grep -aq "^\[PK\] done" "tmp/packed_$tag.log" || { + echo "FAIL: the $tag run did not finish -- no completion marker." + tail -12 "tmp/packed_$tag.log"; exit 1; } + grep -a "^\[PK\]" "tmp/packed_$tag.log" | sed 's/^\[PK\] / /' +} +fail() { echo "FAIL: $1"; exit 1; } + +echo "--- 1. THE GATE: $NFR records, paced at $GATE_FPS fps, channel stealing ---" +SECS=$(( NFR / GATE_FPS + 25 )) +run gate DLX_PK_HELD=0 DLX_PK_PACE=1 DLX_PK_FPS=$GATE_FPS DLX_PK_NFR=$NFR +cp tmp/packed_snaps.csv tmp/packed_snaps_gate.csv + +# THE ASSERTIONS. Printing a result and gating on it are different things. +grep -aq "^\[PK\] FLAG=\$FF" tmp/packed_gate.log || \ + fail "the player did not reach the end of the scene. FLAG=\$E1 is a CRTC mode + the frame clock cannot divide, \$E2 is a transport failure -- and the + TRANSPORT FAILED line above names which." +grep -aq "array: the 68000 built 193 entries (the container wants 193)" \ + tmp/packed_gate.log || \ + fail "the 68000 built a chain of the wrong length. One entry short delivers a + picture with its last row missing, which looks like a decode bug and is a + layout bug; the container's geometry and the player's arithmetic are two + independent statements of one number and they have to agree." +grep -aq "$CHAIN0" tmp/packed_gate.log || \ + fail "the chain does not have the shape this container asks for ($ORDER). + The crossing from the palette registers into GVRAM IS the packed frame + (FINDINGS 62) -- a palette entry and 192 row entries, one start, the CPU + halted throughout -- and an array built the other way round from the + record feeding it does not fail: it paints 192 rows of picture into the + palette registers and 512 B of palette across the top of the screen." +grep -aq "late frames (tick already past at the gate): 0$" tmp/packed_gate.log || \ + fail "a frame missed its slot in the GATE run, which is paced at half rate on + purpose. That is not a rate result -- it means the transfer did not fit in + a slot twice as long as the container's, and the pixel comparison below is + then sampling frames the player was still overwriting." + +grep -aq "0 frames NOT SAMPLED" tmp/packed_gate.log || \ + fail "the gate run could not sample every frame: the write window reopened + before the snapshot on at least one. At half the container's rate the + transfer must fit inside the display interval with room to spare, and if + it does not the comparison below is checking frames the player was still + overwriting." + +python3 tools/bench/verify_packed.py "$DLXP" --snap tmp/snap_packed_gate \ + --map tmp/packed_snaps_gate.csv --min-frames "$NFR" + +if [ "${DLX_PK_GATE_ONLY:-0}" = "1" ]; then exit 0; fi + +echo +echo "--- 2/3. THE RATE: free-running, both channel configurations ---" +SECS=$(( NFR / 8 + 25 )) +run free_steal DLX_PK_HELD=0 DLX_PK_PACE=0 DLX_PK_NFR=$NFR +run free_held DLX_PK_HELD=1 DLX_PK_PACE=0 DLX_PK_NFR=$NFR +for t in free_steal free_held; do + grep -aq "FREE-RUNNING, so the mean IS the transport" "tmp/packed_$t.log" || \ + fail "the $t run did not report a transport time, so there is no rate here + to read -- and a rate read off a PACED run is the pace." +done + +echo +echo "--- 4. THE CLOCK: held, paced at the container's own rate ---" +SECS=$(( NFR / 12 + 25 )) +run held_paced DLX_PK_HELD=1 DLX_PK_PACE=1 DLX_PK_NFR=$NFR +# THE FINDING THIS RUN EXISTS FOR, asserted rather than admired. A held channel +# halts the 68000, and the frame clock is an INTERRUPT off V-DISP whose pending +# bit is ONE BIT -- so every edge that falls inside a transfer spanning two of +# them is an edge the machine can never count. If this ever comes back at zero, +# either the transfer got short enough to fit between two rasters or the held +# configuration stopped halting the CPU, and both change what the run means. +LOST=$(sed -n 's/.*-> \([0-9]*\) edges LOST.*/\1/p' tmp/packed_held_paced.log | head -1) +[ -n "$LOST" ] && [ "$LOST" -gt 0 ] || \ + fail "the held run lost no V-DISP edges (${LOST:-none}). Either the bus is no + longer being held for the transfer, or the transfer now fits between two + rasters -- and the comparison with the stealing run below is then a + comparison of two configurations that do the same thing." +LOSTS=$(sed -n 's/.*-> \([0-9]*\) edges LOST.*/\1/p' tmp/packed_gate.log | head -1) +echo +echo " V-DISP edges lost: $LOST held at 12 fps, $LOSTS stealing at $GATE_FPS fps." +echo " A player keeps a clock, reads a stick and feeds ADPCM. Which of the two" +echo " configurations can do any of that is a DESIGN question, and it is the" +echo " one this run answers; neither figure is W." +exit 0 diff --git a/tools/bench/prep_packed.py b/tools/bench/prep_packed.py new file mode 100644 index 0000000..3df1cd1 --- /dev/null +++ b/tools/bench/prep_packed.py @@ -0,0 +1,57 @@ +#!/usr/bin/env python3 +"""Everything tools/bench/packed.lua needs to know about a DLXP container. + + python3 tools/bench/prep_packed.py -> tmp/packed_meta.lua + +THERE IS NO BLOB TO PREPARE, and that is the whole difference from +`prep_stream.py`. The codec's rig has to hand the machine expanded codebooks, a +packed palette and a record index, because a DLX record cannot be found or drawn +without them; `prep_dlx.py` and `prep_stream.py` exist for that and FINDINGS +49.7.5 records what it cost to have two copies of one of those transforms. A +packed container carries no such thing: record `i` is at sector 1 + i*97 by +geometry and its bytes are already in the order GVRAM wants them (dlxp.py). So +this file emits METADATA ONLY -- six numbers the rig would otherwise have to +hard-code, every one of them read out of the container's own header. + +The volume is the container itself; tools/bench/mkvol.sh copies it. +""" +import os, sys +sys.path.insert(0, os.path.join(os.path.dirname(os.path.abspath(__file__)), + "..", "encoder")) +from dlxp import DLXP, SECTOR + +if len(sys.argv) != 2: + sys.exit(__doc__) +d = DLXP(sys.argv[1]) + +# The record's sector count, and the array chain's entry count, DERIVED here and +# asserted by the 68000 (PG_ARRN). Two independent statements of one geometry +# is the only way a container and a player can be caught disagreeing about it -- +# a chain one entry short delivers a picture with its last row missing, which +# looks like a decode bug and is a layout bug. +recs = d.rec_bytes // SECTOR +rows = d.H +entries = rows + (1 if d.has_palette else 0) + +out = "tmp/packed_meta.lua" +with open(out, "w") as fh: + fh.write("-- generated by tools/bench/prep_packed.py; do not edit\n") + fh.write("return {\n") + for k, v in [("W", d.W), ("H", d.H), ("fps", d.fps), ("nframes", d.nframes), + ("rec_bytes", d.rec_bytes), ("rec_sectors", recs), + ("pal_bytes", d.pal_bytes), ("pic_bytes", d.pic_bytes), + ("lba0", d.off_frm // SECTOR), + ("palette_last", int(d.palette_last)), + ("has_palette", int(d.has_palette)), + ("entries", entries)]: + fh.write(f" {k} = {v},\n") + fh.write("}\n") + +print(f"{sys.argv[1]}: DLXP1 {d.W}x{d.H} {d.fps}fps {d.nframes} frames") +print(f" record {d.rec_bytes:,} B = {recs} sectors, palette " + f"{'LAST' if d.palette_last else 'FIRST'}, {d.pal_bytes} B") +print(f" record i is at LBA {d.off_frm // SECTOR} + i*{recs} -- ARITHMETIC. " + f"There is no index in this container and none can be needed.") +print(f" the chain the 68000 must build: {entries} entries " + f"({rows} rows{' + 1 palette' if d.has_palette else ''})") +print(f" wire {d.kbps():.1f} KB/s, FIXED by geometry -> {out}") diff --git a/tools/bench/verify_packed.py b/tools/bench/verify_packed.py new file mode 100644 index 0000000..c518ce2 --- /dev/null +++ b/tools/bench/verify_packed.py @@ -0,0 +1,114 @@ +#!/usr/bin/env python3 +"""Is EVERY frame the packed player put on screen pixel-exact? ROADMAP K3. + + python3 tools/bench/verify_packed.py [--snap tmp/snap_packed] + [--map tmp/packed_snaps.csv] + [--min-frames N] + +WHY THIS CHECKS ALL OF THEM AND tools/bench/verify_decode.py CHECKS ONE. The +codec is temporally recursive: a SKIP block is a claim that the previous frame is +still in GVRAM, so the last frame of a sequential run is only correct if every +frame before it was, and one comparison audits 120. A packed frame is a +LITERAL -- 192 rows of picture and a whole new palette, written over whatever +was there. Frame 119 being right says nothing at all about frame 60. The +simplification that deleted the ring, the codebooks and the decoder also deleted +the gate's free lunch, and this is the bill. + +WHAT IS COMPARED. MAME's own screen, through MAME's own video code: the +snapshot is what the display produced out of GVRAM and the palette REGISTERS. +Nothing here re-implements the packed interleave -- that is deliberate and it is +the same rule tools/bench/gvpack/verify_dlxp.py was built on, because a +container round-trips against its own inverse whether or not its byte order is +the one the hardware wants. The reference is dlxp.render(i), which is the +palette in the record applied to the indices in the record. + +THE LETTERBOX IS CHECKED TOO, and it is not padding. The picture is 192 rows of +a 256-row screen; the other 64 rows are STATIC SETUP the 68000 wrote once at +scene start (packed.s pg_static) and the channel never touches again. If they +were wrong -- or if they decayed as the per-frame palette moved under them -- +the picture would still be pixel-exact and the screen would not be. Index 255 +is black in every frame's palette by construction (vq.frame_palette), so this +also gates that reservation across all 120 records. +""" +import argparse, csv, os, sys +sys.path.insert(0, "tools/encoder") +import numpy as np +from PIL import Image +from dlxp import DLXP + +ap = argparse.ArgumentParser() +ap.add_argument("container") +ap.add_argument("--snap", default="tmp/snap_packed") +ap.add_argument("--map", default="tmp/packed_snaps.csv") +ap.add_argument("--min-frames", type=int, default=1, + help="fail if fewer than this many frames were sampled -- a " + "run that displayed nothing must not pass as a run with " + "no mismatches in it") +a = ap.parse_args() + +d = DLXP(a.container) +if not d.has_palette: + # A --no-palette container leaves the palette registers holding whatever the + # scene setup put there, and this rig's player writes none -- so there is no + # reference for what the screen should show. Say so rather than compare + # against an assumption. + sys.exit(f"{a.container} carries no palette; this gate has no reference " + f"for what the display should have produced.") + +with open(a.map) as fh: + pairs = [(r["snapshot"], int(r["frame"])) for r in csv.DictReader(fh)] +if len(pairs) < a.min_frames: + print(f"FAIL 0. only {len(pairs)} frames were sampled, --min-frames is " + f"{a.min_frames}. A player whose write window never closed displays " + f"nothing, and an empty comparison is not a pass.") + sys.exit(1) + +SCRH, SCRW = 256, 256 +YOFF = (SCRH - d.H) // 2 +fails, checked = [], 0 +for name, fr in pairs: + path = f"{a.snap}/x68000/{name}.png" + if not os.path.exists(path): + fails.append(f"snapshot {name} (frame {fr}) is missing from {a.snap}") + continue + s = np.asarray(Image.open(path).convert("RGB")).astype(int) + if s.shape[:2] != (2 * SCRH, SCRW): + fails.append(f"frame {fr}: geometry {s.shape[1]}x{s.shape[0]}, " + f"expected {SCRW}x{2*SCRH}") + continue + if not all(np.array_equal(s[i], s[i + 1]) for i in range(1, s.shape[0] - 1, 2)): + fails.append(f"frame {fr}: double-scan pairing (1,2),(3,4),... broken") + continue + g = s[0::2] + pal = d.palette_rgb(fr) + exp = np.empty((SCRH, SCRW, 3), int) + exp[:] = pal[255] # the letterbox, and the reservation + exp[YOFF:YOFF + d.H] = d.render(fr) + checked += 1 + if np.array_equal(g, exp): + continue + bad = (g != exp).any(2) + by, bx = np.where(bad) + inpic = ((by >= YOFF) & (by < YOFF + d.H)).sum() + fails.append(f"frame {fr} (snapshot {name}): {bad.sum()} px differ " + f"({inpic} in the picture, {bad.sum()-inpic} in the " + f"letterbox), first at y={by[0]} x={bx[0]}, maxdiff " + f"{abs(g-exp).max()}") + +for f in fails[:12]: + print("FAIL " + f) +if len(fails) > 12: + print(f"FAIL ... and {len(fails)-12} more") +if fails: + print(f" {checked-len([f for f in fails])} of {len(pairs)} sampled " + f"frames compared clean") + sys.exit(1) +lo, hi = min(f for _, f in pairs), max(f for _, f in pairs) +print(f"OK {checked} frames of {a.container} pixel-exact on the emulated " + f"68000, frames {lo}..{hi} of {d.nframes}") +print(f" every one of them a LITERAL: no decoder, no codebook, no ring. " + f"Screen {SCRW}x{SCRH}, picture {d.W}x{d.H} at y={YOFF}, letterbox on " + f"the reserved index 255.") +print(f" palette {'LAST' if d.palette_last else 'FIRST'} in the record, " + f"{d.pal_bytes} B, compared as the DISPLAY renders it (GRB555+I out of " + f"the palette registers)") diff --git a/tools/media/make_packed_media.py b/tools/media/make_packed_media.py new file mode 100644 index 0000000..c46faaa --- /dev/null +++ b/tools/media/make_packed_media.py @@ -0,0 +1,111 @@ +#!/usr/bin/env python3 +"""The README still for the PACKED player -- ROADMAP K3, FINDINGS 64. + + python3 tools/media/make_packed_media.py [container.dlxp] + [--snap tmp/snap_packed_gate] [--map tmp/packed_snaps_gate.csv] + [--src tmp/fr_singe] [--frame N] [--out docs/img/packed-player.png] + +Blu-ray source | what the emulated 68000 actually put on screen. The right-hand +panel is MAME's own snapshot, de-double-scanned and cropped to the picture -- not +a re-render, not `dlxp.render`. It is the same rule the codec's still is built on +(tools/media/make_readme_media.py) and it is the only reason the picture is worth +printing: an encoder can be checked against its own inverse, and a screen cannot. + +THE FRAME IS CHOSEN, NOT PICKED. --frame defaults to the one whose PSNR against +the source is CLOSEST TO THE MEAN over the whole gated window, so the still is +representative rather than flattering. The chosen frame and its distance from the +mean are printed, so a reader can see it was not the best one. +""" +import argparse, csv, os, sys +sys.path.insert(0, "tools/encoder") +import numpy as np +from PIL import Image, ImageDraw +from dlxp import DLXP + +ap = argparse.ArgumentParser() +ap.add_argument("container", nargs="?", default="tmp/packed_singe.dlxp") +ap.add_argument("--snap", default="tmp/snap_packed_gate") +ap.add_argument("--map", default="tmp/packed_snaps_gate.csv") +ap.add_argument("--src", default="tmp/fr_singe") +ap.add_argument("--frame", type=int, default=None) +ap.add_argument("--out", default="docs/img/packed-player.png") +a = ap.parse_args() + +d = DLXP(a.container) +SNAP_W, SNAP_H = 256, 512 +with open(a.map) as fh: + shot = {int(r["frame"]): r["snapshot"] for r in csv.DictReader(fh)} +if not shot: + sys.exit(f"{a.map} is empty -- run tools/bench/packed_run.sh first") + + +def screen(fr): + """The 256x192 picture out of one MAME native snapshot.""" + p = f"{a.snap}/x68000/{shot[fr]}.png" + s = np.asarray(Image.open(p).convert("RGB")) + if s.shape[:2] != (SNAP_H, SNAP_W): + sys.exit(f"{p}: expected {SNAP_W}x{SNAP_H}, got {s.shape[1]}x{s.shape[0]}") + g = s[0::2] # undo the double scan + y = (g.shape[0] - d.H) // 2 # the picture is centred + return g[y:y + d.H] + + +def source(fr): + p = f"{a.src}/f{fr+1:04d}.png" + if not os.path.exists(p): + sys.exit(f"missing {p} -- re-extract the frames the container was built " + f"from, or point --src at them") + return np.asarray(Image.open(p).convert("RGB")) + + +def psnr(x, y): + e = ((x.astype(float) - y.astype(float)) ** 2).mean() + return float("inf") if e == 0 else 10 * np.log10(255.0 ** 2 / e) + + +frames = sorted(shot) +scores = {f: psnr(source(f), screen(f)) for f in frames} +mean = float(np.mean(list(scores.values()))) +if a.frame is None: + pick = min(scores, key=lambda f: abs(scores[f] - mean)) +else: + pick = a.frame + if pick not in scores: + sys.exit(f"frame {pick} was not sampled by that run") + +# THE PANEL IS GATED, not just drawn. A still of the player is a claim that the +# player drew it, and the snapshot has to still be pixel-exact against the +# container for that claim to hold -- verify_packed.py checks all of them and +# this checks the one being printed, so the picture cannot outlive the result. +ref = d.render(pick) +if not np.array_equal(screen(pick), ref): + sys.exit(f"frame {pick} is NOT pixel-exact against {a.container}. The still " + f"is not being written: it would be a picture of a failure with a " + f"caption saying otherwise.") + +Z, BAR = 2, 22 + + +def captioned(img, text): + up = np.repeat(np.repeat(img, Z, 0), Z, 1) + out = Image.new("RGB", (up.shape[1], up.shape[0] + BAR), (16, 16, 18)) + out.paste(Image.fromarray(up), (0, BAR)) + ImageDraw.Draw(out).text((6, 6), text, fill=(190, 190, 196)) + return out + + +left = captioned(source(pick), "Blu-ray source, cropped 256x192") +right = captioned(screen(pick), + "emulated 68000, MAME's own snapshot, no decoder") +out = Image.new("RGB", (left.width + right.width + 8, left.height), (16, 16, 18)) +out.paste(left, (0, 0)) +out.paste(right, (left.width + 8, 0)) +os.makedirs(os.path.dirname(a.out), exist_ok=True) +out.save(a.out) +print(f"{a.out}: frame {pick} of {d.nframes}, {scores[pick]:.2f} dB against the " + f"24-bit source") +print(f" chosen as the frame CLOSEST TO THE MEAN ({mean:.2f} dB over " + f"{len(frames)} gated frames), {abs(scores[pick]-mean):.3f} dB from it -- " + f"best in the window is {max(scores.values()):.2f}, worst " + f"{min(scores.values()):.2f}") +print(f" and it is pixel-exact against {a.container}, checked before writing")