Align the container to the disc, and find the decoder-free packed player fits
Two sessions, unrecorded until now, committed together because their edits share files and cannot be split cleanly after the fact. Session 28 (FINDINGS 60): the container is DLX5 -- every record sector-aligned, 120/120 starting on a boundary where 3/120 did, +0.48% on the wire and zero clocks -- and the ring's release rounds to RECALN so no pad is stranded. Two encoder levers measured and refused: `--spans all` buys +0.19 dB for +67% of the wire, and joint span/lam selection emits byte-identical containers because `lam` never leaves its floor on any of 120 frames. Session 29 (FINDINGS 61): the packed full-frame blit is 27.3% of a 12 fps frame, a channel fills GVRAM in buffer mode off the disc with the CPU halted, and it walks the 1,024 B line stride itself through array chaining. At the 9 clk/B dual-address floor the codec is 110.4% of a frame and a decoder-free packed literal player is 55.2%, at +4.89 dB -- 2.75 dB past a ceiling the codec's scene-wide palette cannot cross. Encoder work is parked; the codec is kept and not built on. check.sh is ALL GREEN before and after, plus one new stage that gates the ORDER of the measured paint costs rather than their values. Claude-Session: https://claude.ai/code/session_01194oWYW8DQXK1SZ2DnChW6
This commit is contained in:
+208
-52
@@ -14,6 +14,24 @@ made sector-aligned records a precondition the transport enforces rather than a
|
||||
preference (FINDINGS 59). **And 59.7 re-ranks what is left: the frame affords
|
||||
6.74 clocks a byte, a dual-address byte costs 9, so B3 stopped being a constant
|
||||
to look up and became the question of whether the design fits at all.**
|
||||
Amended end of session 28: **THE RE-ENCODE BUNDLE IS DONE — all four items, one
|
||||
re-measurement (FINDINGS 60).** The container is DLX5, sector-aligned, and the
|
||||
disc now moves exactly the records. Two of the four closed as NEGATIVES: E2's
|
||||
`--spans all` default is refused on measurement, and E3's joint span/lam
|
||||
selection emits byte-identical containers because `lam` never leaves its floor.
|
||||
**What is left of M2 is P4a's wiring** — the DMA channel behind `ring.i`'s
|
||||
mailbox — and the budget did not move: headroom 6.74 -> 6.69 clk/B, so every
|
||||
conclusion in 59.7 stands.
|
||||
Amended end of session 29: **THE DECODER-FREE PACKED PLAYER IS BACK, MEASURED,
|
||||
AND IT FITS THE CLOCK BUDGET THE CODEC MISSES (FINDINGS 61).** The packed
|
||||
full-frame blit is **27.3%** of a 12 fps frame — measured, not assumed — a
|
||||
channel fills GVRAM in buffer mode off the disc with the CPU halted, and it
|
||||
walks the 1,024 B line stride itself through array chaining. At the 9 clk/B
|
||||
floor the codec is 110.4% and a decoder-free packed player is **55.2%**. It asks
|
||||
**576 KB/s, fixed**, against E7's 327 KB/s target. **So B1 stopped setting how
|
||||
much headroom the player has and started deciding WHICH PLAYER EXISTS**, and B2
|
||||
stopped being a nice-to-have. The codec cannot be packed: 47.6.4 is closed and
|
||||
the answer is no, both ways (61.3).
|
||||
|
||||
**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
|
||||
@@ -41,7 +59,7 @@ these units:
|
||||
| **Delivery rate** | **no working figure, deliberately** (FINDINGS 50, USER DECISION). Every tool REQUIRES an explicit rate. |
|
||||
| **Seek time** | **no figure at all, and never had one.** 51.3/51.4 made it matter. |
|
||||
| **W, clocks stolen per delivered byte** | 5 single-address held, 9 dual held, 12 single arbitrated; the IPL ROM's own disk channel is **16..19** (52.5). **The largest open number in the project.** Session 27 added the row underneath it: with **no external request line** on the card (59.2) the channel is auto-requested and is charged **by time rather than by byte**, so at 460 KB/s a 50% bus share costs **10.61 clk/B** and a smaller share cannot carry the rate at all (59.3). |
|
||||
| **The frame's headroom for a transport** | **6.74 clk/B** — 30.2% of a 12 fps frame, after the MEASURED decode (68.5%) and best-case audio (1.25%), at the gate container's 37,403 B record. **New in session 27, 59.7, and it is the number every row above is now read against.** A dual-address byte's floor is 9. |
|
||||
| **The frame's headroom for a transport** | **6.69 clk/B** — 30.2% of a 12 fps frame, after the MEASURED decode (68.6%) and best-case audio (1.25%), at the DLX5 gate container's **37,585 B delivered record** (session 28: the sector pad is delivered, so `15_bus_occupancy.py` charges it). **It is the number every row above is read against**, and a dual-address byte's floor is 9. It was 6.74 against the DLX4 container; the bundle moved it by 0.05 and moved no conclusion. |
|
||||
|
||||
---
|
||||
|
||||
@@ -67,10 +85,18 @@ 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.**
|
||||
**B1. Measure the BlueSCSI — throughput AND seek time.** **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
|
||||
geometry. So the measurement now has three thresholds to be read against —
|
||||
453.6 KB/s (the gate container needs no prefill), 327 KB/s (E7's target at the
|
||||
dual-address floor) and 576 KB/s (no decoder at all) — and which of them the
|
||||
medium clears decides which player gets built.
|
||||
Throughput has an acceptance test already derived from real record sizes:
|
||||
**513.2 KB/s** for the session-14 candidate, **451.4 KB/s** for the gate
|
||||
container (`19_ring_stream.py`, FINDINGS 49.5). Seek time has nothing.
|
||||
**513.2 KB/s** for the session-14 candidate, **453.6 KB/s** for the DLX5 gate
|
||||
container (`19_ring_stream.py`, FINDINGS 49.5; the figure was 451.4 before
|
||||
session 28's re-encode and the sector pad raised it). Seek time has nothing.
|
||||
51.3/51.4 is why the second half matters: slack is *accumulated* out of
|
||||
`pipe - wire`, so what a branch point costs is set by the rate and the time since
|
||||
the last branch, not by the ring size. At 460 KB/s every ring from 192 KB to
|
||||
@@ -83,6 +109,16 @@ and settles it in minutes on a real board. FINDINGS 48 shifted the prior toward
|
||||
MAME and toward "unusable" — **do not pre-build on 1.0 B/pixel**. Same sitting:
|
||||
the priority register `0xE82500` at `0x0000` (47.3).
|
||||
|
||||
> **Session 29 raised what this is worth, and gave it a number to be worth
|
||||
> (FINDINGS 61).** It used to gate a derived halving. It now gates a player that
|
||||
> has been measured to fit a budget the shipping design misses — 55.2% of a frame
|
||||
> against 110.4% at the 9 clk/B floor. And 61.6 found an asymmetry worth carrying
|
||||
> to the board: the black interval is the PAINT, not the frame, so a CPU-painted
|
||||
> packed player is dark for **27.3%** of a frame while the cheaper DMAC-direct one
|
||||
> is dark for **30..113%**. Under MAME's reading the cheap architecture is the
|
||||
> dark one. **B2 and B1 are now the same decision from two sides, and B2 is the
|
||||
> five-minute half.**
|
||||
|
||||
**B3. Single-address vs dual-address DMA — and now, first, DOES THE CARD DRIVE
|
||||
`#EXREQ`?** 242 KB/s and 0.69 dB was the old framing. **Session 27 promoted this
|
||||
to the item that decides whether the design fits at all (59.7).** The frame
|
||||
@@ -105,9 +141,38 @@ is still the cheapest paper route to the same answer, because whatever Sharp's
|
||||
own driver programs into DCR's DTYP is a statement about what the card supports.
|
||||
FINDINGS 48.4. Not on this machine (checked, session 18).
|
||||
|
||||
**Ranking, stated because B1 used to outrank this:** B1 (throughput and seek)
|
||||
sets how much headroom the finished player has. **B3 decides whether there is
|
||||
any.** If the card drives `#EXREQ`, the ladder applies and the design fits with
|
||||
**Ranking, amended session 29.** It was: B1 sets how much headroom the player
|
||||
has, B3 decides whether there is any. FINDINGS 61 adds a third reading — **B1
|
||||
and B2 together decide which player exists.** If the medium clears 576 KB/s
|
||||
sustained and buffer mode does not blank, the decoder-free packed literal fits at
|
||||
the dual-address floor B3 cannot get under, and B3 stops mattering for video at
|
||||
all. If it does not, B3 is still the question. The three hardware facts are no longer
|
||||
independent, and B2 is by far the cheapest of them.
|
||||
|
||||
> **ENCODER WORK IS PARKED — USER DECISION, session 29.** The first draft of this
|
||||
> amendment said "nothing here is a reason to stop work on the codec". That does
|
||||
> not survive its own arithmetic. It rested on comparing the packed player's
|
||||
> 576 KB/s against **E7's 327 KB/s target, which does not exist**: the codec that
|
||||
> exists is 440 KB/s and 110.4% of a frame, so the real gap is 1.31x, not 1.76x.
|
||||
> And the branches are not symmetric. **Packed needs two facts** — buffer mode
|
||||
> does not blank, medium clears 576 KB/s. **The codec needs E7 to succeed** —
|
||||
> unproven, and 60.4/60.5 measured two of its three levers inert — **AND** the
|
||||
> medium to clear 327, **AND** it ships at ~100% of the frame with no margin,
|
||||
> which is where 55.2% is now.
|
||||
>
|
||||
> **E7 and E4 are both parked**, E4 included: `H.build`'s k-means builds VQ
|
||||
> codebooks and a literal player has no VQ. C1 is gated by E4 and follows.
|
||||
>
|
||||
> **The codec is KEPT AND NOT BUILT ON.** That is inventory, not work. B2 is
|
||||
> unanswered and 48.1's prior leans against packing — an assertion against a
|
||||
> silence — and if buffer mode blanks there is no version of the packed player
|
||||
> that is merely expensive (48.3), at which point the codec is the only path
|
||||
> left. Keeping a working decoder on disk costs nothing; building on it costs
|
||||
> sessions.
|
||||
|
||||
**The older ranking, which still holds inside the codec branch:** B1 (throughput
|
||||
and seek) sets how much headroom the finished player has. **B3 decides whether
|
||||
there is any.** If the card drives `#EXREQ`, the ladder applies and the design fits with
|
||||
room. If it does not, the fallback is limited-rate auto-request at a share the
|
||||
player picks (P4c), and the container has to come down to **328 KB/s of payload**
|
||||
to fit at the 9 clk/B floor — 34% below where the gate container sits (59.7).
|
||||
@@ -124,6 +189,43 @@ to fit at the 9 clk/B floor — 34% below where the gate container sits (59.7).
|
||||
|
||||
---
|
||||
|
||||
## The packed branch — what building it means (session 29, USER DECISION)
|
||||
|
||||
**This is where the work goes now.** FINDINGS 61: a decoder-free packed literal
|
||||
player is **55.2% of a frame at the 9 clk/B dual-address floor** against the
|
||||
codec's 110.4%, and **+4.89 dB** on the shipping container because a literal
|
||||
frame is not tied to a scene palette the codec's codewords index into. It costs
|
||||
**582 KB/s, fixed, with no lever.** Three items, in order.
|
||||
|
||||
- **K1. Can a DMA channel write the palette registers at `$E82000`?** (61.9.)
|
||||
The cheapest item in the project and the one with the largest structural
|
||||
payoff: if the palette takes a byte-wide DMA the way GVRAM does in buffer mode,
|
||||
it becomes a **193rd array-chain entry** and one channel start paints a whole
|
||||
frame — palette included, CPU halted throughout, **no per-frame CPU work in the
|
||||
video path at all**. Same shape as 61.2's three runs: a run in `dmagate.s`, a
|
||||
host comparison in `dma.lua`, an assertion in `dma_run.sh`, **and a negative
|
||||
control.**
|
||||
- **K2. A packed container.** Quantise to **254** colours (index 0 is the
|
||||
transparency key, black at 255 — 47.2), interleave column *i* with *i+128*,
|
||||
emit a per-frame palette, sector-align the record. Simpler than a coded one:
|
||||
no VQ, no rate control, no mode map, no `lam`. `encode.py` already aligns
|
||||
(DLX5) and `prep_frame.py --pack-transparent` already emits the layout.
|
||||
**Re-derive 61.9's 34.08 dB against `vq.scene_palette` here** — the measured
|
||||
figure is PIL's MEDIANCUT and is a direction, not the player's number.
|
||||
- **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.
|
||||
|
||||
**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
|
||||
`stream.s` leave the video path, and **P4a's wiring is parked with them.** A
|
||||
simplification that large usually hides something, and 61.7.2 names the specific
|
||||
untested thing: a chained transfer has never run back to back at 12 fps.
|
||||
|
||||
**K1 and K2 survive a bad answer to B2. K3 does not.** Do K1 first.
|
||||
|
||||
---
|
||||
|
||||
## M2 — a player, as opposed to a decoder
|
||||
|
||||
`decode.s` draws pixel-exact frames from RAM Lua pre-loaded; `stream.s` decodes
|
||||
@@ -145,32 +247,57 @@ Shipping the codebooks pre-expanded was considered and refused: it trades
|
||||
9.26 ms of CPU for 5,120 more header bytes, which is a wash in milliseconds and
|
||||
not a wash in kind (53.6).
|
||||
|
||||
**P2. Palette packing on the 68000. HALF DONE, session 21 — FINDINGS 53.**
|
||||
~~**P2. Palette packing on the 68000.**~~ **DONE, session 28 — FINDINGS 60.**
|
||||
The half that was open was the encoder's, and it closed with the whole bundle
|
||||
below. Session 21 — FINDINGS 53 — did the packing itself:
|
||||
~~The encoder still emits RGB888; the X68000 word packing is Lua-side.~~ The
|
||||
packing is on the 68000: `pal_pack` writes 256 words straight into `$E82000`
|
||||
with `I` chosen per entry by minimum squared error (**1.96 dB**, 23.3), gated on
|
||||
the words read back **out of the palette registers**. 9.70 ms per scene, plus
|
||||
5.29 ms of scene-independent table build hoisted to boot (53.3).
|
||||
|
||||
**What is left is the other half of the sentence: reserve index 0 as black with
|
||||
`I = 0` (23.4).** That is ENCODER-side, it changes the container, and it moves
|
||||
every constant fitted to the gate container, so it is a re-encode plus a
|
||||
re-measurement rather than an edit.
|
||||
~~**What is left is the other half of the sentence: reserve index 0 as black with
|
||||
`I = 0` (23.4).**~~ **DONE, session 28 — 60.3.** `VQ.scene_palette` quantises
|
||||
the picture into 255 entries and holds index 0 at (0,0,0); `pack_palette` gives
|
||||
it `I = 0` by its own minimum-squared-error rule, so 23.3's "the bars sit at
|
||||
RGB (4,4,4)" needed no special case. **0.04 dB** on the Singe window, palette
|
||||
ceiling unmoved. Black is reserved, not withheld — the mapper may still spend
|
||||
index 0 on genuinely black pixels; what it buys is that index 0 is black
|
||||
whatever the scene contains.
|
||||
|
||||
**THE RE-ENCODE BUNDLE, collected here because it is now four items and they
|
||||
share one re-measurement.** Nothing below is worth a container revision on its
|
||||
own; together they are one:
|
||||
1. reserve palette index 0 as black, `I = 0` (23.4, this item);
|
||||
2. `--spans all` as the default (E2, and it is the loaded lever on the byte
|
||||
side);
|
||||
3. re-derive span selection jointly with `lam` (E3);
|
||||
4. **sector-align every record (58.3; PROMOTED TO A PRECONDITION in session
|
||||
27, 59.4 — `sc_in_data` refuses a windowed read under the DMAC, so this is
|
||||
what the channel is waiting for)** — +0.43% on the
|
||||
wire, zero clocks, and it is what lets P4a's DMA channel write straight
|
||||
into the ring with no window and no bounce copy. Until then the letterbox gets the palette's
|
||||
closest thing to black (index 255 on the gate container); `load.i` reports
|
||||
whichever index that is and needs no change when it becomes 0.
|
||||
~~**THE RE-ENCODE BUNDLE, collected here because it is now four items and they
|
||||
share one re-measurement.**~~ **DONE, session 28 — FINDINGS 60. Two of the four
|
||||
closed as NEGATIVES, which is the more useful half.** The four were:
|
||||
1. ~~reserve palette index 0 as black, `I = 0`~~ **DONE** (23.4, 60.3);
|
||||
2. ~~`--spans all` as the default~~ **MEASURED AND REFUSED** (E2, 60.4).
|
||||
267.9 KB/s / 28.88 dB / 2 frames late at `need`, against 448.2 KB/s /
|
||||
29.07 dB / 1 late at `all`: **+67% of the wire for +0.19 dB and one frame
|
||||
of 120**, against a container the budget already says is 35% too big.
|
||||
`need` stays the default. **It was called "the loaded lever on the byte
|
||||
side" and it is — it is just loaded the wrong way**, and E7 is why. The
|
||||
GATE container keeps `all`: it is a fixture, not a recipe;
|
||||
3. ~~re-derive span selection jointly with `lam`~~ **IMPLEMENTED, MEASURED,
|
||||
NO-OP** (E3, 60.5). `--joint-spans` hands the span pass's freed bytes back
|
||||
to the lam search and re-spans; all four cells of `{need,all} x
|
||||
{greedy,joint}` are BYTE-IDENTICAL, and so is `--rc-floor open`. **`lam`
|
||||
never leaves its floor on any of 120 frames at either floor the encoder
|
||||
offers** (44.3), so there is nothing to spend the freed bytes on. The code
|
||||
stays, defaulted off, because a container that moved `lam` off its floor
|
||||
would make the question live again;
|
||||
4. ~~**sector-align every record**~~ **DONE — the container is DLX5** (58.3
|
||||
option C, promoted to a precondition by 59.4; 60.1). Realised cost
|
||||
**+0.48%** on the wire against the +0.43% predicted, zero clocks, and
|
||||
**120/120 records start on a sector boundary** where 3/120 did. The disc
|
||||
and the ring now move the SAME 4,510,208 B and check.sh gates on that
|
||||
identity, both figures read out of the container instead of written into
|
||||
the script — the old literals went red on the re-encode, correctly.
|
||||
**The consumer had to be told too** (60.2): `stream.s` released the ring
|
||||
to the last byte it READ, which strands up to 511 B of pad a record, and
|
||||
the ring's own audit caught it on frame 0 while every frame still decoded
|
||||
pixel-exact. The release rounds to `RECALN` now.
|
||||
|
||||
The letterbox no longer gets the palette's closest thing to black — item 1 put
|
||||
true black at index 0, and `load.i` needed no change, as it said it would not.
|
||||
|
||||
~~**P3. A real frame clock.**~~ **DONE, session 22 — FINDINGS 54.**
|
||||
`src/player/clock.i` derives the tick from the CRTC's own V-DISP through the
|
||||
@@ -244,11 +371,15 @@ the ladder exactly one, dual address held, has a code path here, and it is the
|
||||
one demonstrated. The slot pinout has `#EXREQ` at B36, so a real card plausibly
|
||||
drives it — **that is now B3's sharpest form**.
|
||||
|
||||
**What is left of P4a is downstream of the container, not of the DMAC** (59.4):
|
||||
`sc_in_data` **refuses** a windowed read when the data phase is the channel's,
|
||||
because a channel writes a contiguous run and cannot drop the 300 B in front of
|
||||
a record. So putting the channel behind `ring.i`'s mailbox waits on the
|
||||
re-encode bundle.
|
||||
~~**What is left of P4a is downstream of the container, not of the DMAC**
|
||||
(59.4)~~ — **and that block is GONE as of session 28.** `sc_in_data` refused a
|
||||
windowed read because a channel cannot drop the 300 B in front of a record; the
|
||||
container is DLX5 now and no record asks for a window. `xfer.i`'s sector
|
||||
arithmetic already degenerates correctly — `SC_WSKIP` is 0 and `SC_WKEEP` is the
|
||||
whole record on every one of the 120 — so **what is left of P4a is the wiring:
|
||||
which loop moves the bytes.** `dma_run.sh`'s windowed-read refusal stays as a
|
||||
negative control rather than as a description of the container. **This is the
|
||||
next item, and it is the last one before M2** (60.9).
|
||||
|
||||
**P4c (new, and it is a DESIGN CHOICE the tree had not named).** Auto-request is
|
||||
charged **by time, not by byte** — the channel spends its share of the bus
|
||||
@@ -305,7 +436,9 @@ container). The last one wins on both axes and is a **re-encode**; see the
|
||||
bundle under P2. **P4a should be attempted against a sector-aligned container,
|
||||
not against this one.** *(Session 27: it was, in the only sense that mattered —
|
||||
the transport now REFUSES the windowed case rather than being trusted not to
|
||||
reach it, so the bundle is a precondition rather than a plan. 59.4.)*
|
||||
reach it, so the bundle is a precondition rather than a plan. 59.4. Session 28:
|
||||
the container IS one — the realised wire cost is +0.48% against the +0.43%
|
||||
predicted here, and 120/120 records start on a sector boundary. 60.1.)*
|
||||
|
||||
*(original item, still the standing description of the `W` question:)*
|
||||
Drive the MB89352 instead of a host file. **Session 23
|
||||
@@ -408,11 +541,14 @@ interaction to price next, and it is E2's question with a second consumer in it.
|
||||
on P6's answer and on P5's index.
|
||||
|
||||
**E7. A BYTE TARGET, AND IT COMES OUT OF THE BUS BUDGET RATHER THAN OUT OF
|
||||
TASTE (new, session 27, FINDINGS 59.7).** The frame affords **6.74 clocks a
|
||||
byte** after the measured decode and the audio, and a dual-address byte costs
|
||||
**9**. So *if* B3 comes back saying the card cannot drive `#EXREQ`, the container
|
||||
has to reach **27,995 B a frame — 328 KB/s of payload** to fit at 12 fps, where
|
||||
the gate container sits at 37,403 B and 438 KB/s: **34% too big.**
|
||||
TASTE (new, session 27, FINDINGS 59.7; re-measured session 28, 60.7).** The
|
||||
frame affords **6.69 clocks a byte** after the measured decode and the audio,
|
||||
and a dual-address byte costs **9**. So *if* B3 comes back saying the card
|
||||
cannot drive `#EXREQ`, the container has to reach **27,924 B a frame — 327 KB/s
|
||||
of payload** to fit at 12 fps, where the DLX5 gate container delivers 37,585 B
|
||||
and 440 KB/s: **35% too big.** (It was 6.74 / 328 / 34% against the DLX4
|
||||
container. **The bundle moved the target by one KB/s and moved no conclusion**,
|
||||
which is what a precondition is supposed to do.)
|
||||
|
||||
Three things make this less alarming than the number looks, and one makes it
|
||||
worse:
|
||||
@@ -465,15 +601,24 @@ Listed for completeness; past M3 these are scope, not risk.
|
||||
not menu vs content: the two largest streams are bonus material and look like
|
||||
content by size, duration and bitrate alike (25.1). Run
|
||||
`07_motion_survey.py` per stream first for a hot-window shortlist.
|
||||
**Gated by E4.**
|
||||
- **E4. `H.build` k-means**, 51 s of a 55 s run, once per scene. The thing to
|
||||
attack before C1, and not anything in the per-frame path (27.6).
|
||||
- **E2. `--spans all` as default.** *(re-encode bundle item 2; see P2.)* Still a recommendation, not a measurement
|
||||
(43.6.1), and the only loaded lever on the encoder's byte side (44.3). **It
|
||||
spends every profitable byte, which raises `wire`, which shrinks `pipe - wire`,
|
||||
which lengthens the refill climb after every branch.** That interaction is not
|
||||
priced, and M3 is where it becomes measurable.
|
||||
- **E3. Re-derive span selection jointly with `lam`** (39.3). *(bundle item 3.)*
|
||||
**Gated by E4, and parked with it (session 29).**
|
||||
- ~~**E4. `H.build` k-means**, 51 s of a 55 s run, once per scene.~~ **PARKED,
|
||||
session 29 (USER DECISION).** It was the thing to attack before C1. It builds
|
||||
**VQ codebooks**, and a decoder-free packed player has no VQ — so this is
|
||||
encoder work on the branch that is no longer being built on. It comes back if
|
||||
and only if B2 goes MAME's way. C1 is gated by it and is parked with it.
|
||||
- ~~**E2. `--spans all` as default.**~~ **MEASURED AND REFUSED, session 28 —
|
||||
60.4.** It was "a recommendation, not a measurement" since 43.6.1 and it is a
|
||||
measurement now: **+67% of the wire for +0.19 dB and one frame of 120.** It
|
||||
IS the loaded lever on the byte side (44.3) — it is loaded the wrong way, and
|
||||
E7 is why. What the entry predicted is exactly what it does: it raises `wire`,
|
||||
which shrinks `pipe - wire`, which lengthens the refill climb. `need` stays
|
||||
the default; the GATE container keeps `all` because it is a fixture.
|
||||
- ~~**E3. Re-derive span selection jointly with `lam`** (39.3).~~
|
||||
**IMPLEMENTED, MEASURED, NO-OP, session 28 — 60.5.** `--joint-spans` emits
|
||||
byte-identical containers in all four `{need,all} x {greedy,joint}` cells and
|
||||
at both lam floors, because **`lam` never leaves its floor on any of 120
|
||||
frames**. Kept and defaulted off.
|
||||
- **C2. Framing** — crop vs squash vs wide (FINDINGS 12). Needs an eyeball
|
||||
against arcade reference, not a measurement. Cheap; blocks only final encodes.
|
||||
- **C3. Disk image packaging**, ~1.09 GiB at the candidate rate.
|
||||
@@ -487,15 +632,26 @@ Listed for completeness; past M3 these are scope, not risk.
|
||||
P4a DONE (59): the channel drives the data phase and
|
||||
holds the bus -- 391.7% of a frame becomes 40..95%
|
||||
│
|
||||
B3 #EXREQ? ──┬─ YES ─> single address, 5 clk/B, 92.2% ── FITS ──┐
|
||||
B3 #EXREQ? ──┬─ YES ─> single address, 5 clk/B, 92.4% ── FITS ──┐
|
||||
│ │
|
||||
└─ NO ──> auto-request, 9 clk/B FLOOR, 110.2% ──> E7 byte target
|
||||
(the frame affords 6.74; 59.7) 328 KB/s
|
||||
└─ NO ──> auto-request, 9 clk/B FLOOR, 110.4% ──> E7 byte target
|
||||
(the frame affords 6.69; 59.7, 60.7) 327 KB/s
|
||||
│
|
||||
P2 re-encode bundle (sector alignment is now a PRECONDITION, 59.4) ┤
|
||||
P1 P3 P4b P5 P7, P6 bus cost (52), G1 scene graph (56) ────────────┼─> M2 ─>
|
||||
P2 re-encode bundle DONE (60): DLX5, records ARE sectors ─────────┤
|
||||
E2 refused on measurement, E3 a no-op -- 60.4, 60.5 │
|
||||
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) │
|
||||
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 ─> (page 1; do not pre-build on it)
|
||||
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)
|
||||
```
|
||||
|
||||
**Read that top-left branch as the project's live question.** Everything else
|
||||
|
||||
Reference in New Issue
Block a user