Compare commits
1
Commits
3b7f2af27e
..
main
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
91e2e9803d |
@@ -3,15 +3,18 @@
|
||||
Porting Dragon's Lair to a stock X68000 (68000 @ 10MHz, 2MB, SCSI).
|
||||
|
||||
The game logic is a scene table with branching input windows. The difficulty is
|
||||
pushing ~22 minutes of Don Bluth animation through a 10MHz 68000, and for most
|
||||
of this project's life that was read as **a video codec problem**. It is not.
|
||||
Measured on the machine, the codec costs more to *decode* than a literal frame
|
||||
costs to *not decode*, so the live design has **no decoder in it at all**: the
|
||||
disc holds packed 8-bit frames and a DMA channel walks them into GVRAM with the
|
||||
CPU halted. It is a **delivery** problem — bus cycles and bytes off a disc.
|
||||
pushing ~22 minutes of Don Bluth animation through a 10MHz 68000, and it is a
|
||||
**delivery** problem rather than a compression one — bus cycles and bytes off a
|
||||
disc.
|
||||
|
||||
The codec still exists, still works and is **parked** (USER DECISION, session
|
||||
29). Both branches are described below; the packed one is where the work goes.
|
||||
**The live design has no decoder in it.** The disc holds packed 8-bit frames and
|
||||
a DMA channel walks them into GVRAM with the CPU halted. Measured on the machine,
|
||||
decoding 37,585 bytes costs more than not decoding 49,152: at the 9 clk/B
|
||||
dual-address floor the codec is 110.4% of a 12 fps frame and the decoder-free
|
||||
packed player is 54.9%.
|
||||
|
||||
A working codec is in the tree and is **parked** (USER DECISION). Both branches
|
||||
are described below; the packed one is where the work goes.
|
||||
|
||||
## What it looks like
|
||||
|
||||
@@ -143,11 +146,11 @@ difference between them is *when* the window is open:
|
||||
|
||||
B's paint is **measured**: the packed `movem` blit is 227,553 clocks, 27.3% of a
|
||||
slot, independent of the medium. They are equally visible only at **3.7x the
|
||||
wire**. So B2 — *does buffer mode blank the display?* — is not a headroom
|
||||
question any more; it decides which player exists, and **K4 is not being built
|
||||
until it is answered** (FINDINGS 64.2, ROADMAP K4).
|
||||
wire**. So B2 — *does buffer mode blank the display?* — decides which player
|
||||
exists rather than how much headroom one has, and **K4 is not built until it is
|
||||
answered** (FINDINGS 64.2, ROADMAP K4).
|
||||
|
||||
### Other things the machine has said, that a player has to carry
|
||||
### What else a player has to carry
|
||||
|
||||
**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
|
||||
@@ -221,13 +224,12 @@ than trimming it. [`docs/img/modes.webm`](docs/img/modes.webm) is the same windo
|
||||
with the block-mode map beside it — black SKIP, blue V1, amber V4, red RAW —
|
||||
which is what every cost table in FINDINGS is really about.
|
||||
|
||||
**Why it is parked.** At the 9 clk/B dual-address floor the codec is **110.4% of a
|
||||
12 fps frame and the decoder-free packed player is 54.9%**: decoding 37,585 bytes
|
||||
costs more than not decoding 49,152. Reaching a fitting rate needs a 35% byte
|
||||
reduction after two of its three levers were measured and found inert, and the
|
||||
reward on success is a design at ~100% of the frame. **It is kept on disk and not
|
||||
built on** — if B2 comes back "buffer mode blanks", it is the only thing left
|
||||
(FINDINGS 61.8, 48.3).
|
||||
**Why it is parked.** Its remaining path is a conjunction and the packed one is
|
||||
not: reaching a fitting rate needs a 35% byte reduction, two of its three levers
|
||||
measure inert, and the reward on success is a design at ~100% of the frame
|
||||
against the packed player's 54.9%. **It is kept on disk and not built on** — if
|
||||
B2 comes back "buffer mode blanks", it is the only thing left (FINDINGS 61.8,
|
||||
48.3).
|
||||
|
||||
## What is open
|
||||
|
||||
@@ -266,8 +268,8 @@ emulator.**
|
||||
is B1's.
|
||||
|
||||
**Parked, so it is not re-proposed:** the codec's remaining encoder work (E7, E4,
|
||||
C1); `ring.i`, `xfer.i` and most of `stream.s`, which left the video path when a
|
||||
DMAC-direct player deleted the ring, and P4a's wiring with them. **K4 is blocked
|
||||
C1); `ring.i`, `xfer.i` and most of `stream.s`, which a DMAC-direct player has no
|
||||
use for because it has no ring, and P4a's wiring with them. **K4 is blocked
|
||||
on B2**, not parked.
|
||||
|
||||
## Reproducing this
|
||||
@@ -374,7 +376,8 @@ python3 tools/encoder/encode.py tmp/fr_singe out.dlx --profile scsi --preview p.
|
||||
`--kbps` is the quality rate point and `--span-kbps` the ceiling the span pass may
|
||||
draw on; `mu` is bisected per frame against the 68000's own decode budget so a
|
||||
frame also *decodes* in time. One profile, `scsi`; the 110 KB/s `sasi` profile was
|
||||
dropped on capacity rather than bandwidth. The RAW escape means `lam=0` is
|
||||
dropped on capacity rather than bandwidth — a SASI volume is 40 MB and the
|
||||
game is 146 MiB even at that rate. The RAW escape means `lam=0` is
|
||||
pixel-exact against the palettised frame. See FINDINGS 31/41/44 before changing
|
||||
any of it.
|
||||
|
||||
@@ -416,7 +419,7 @@ src/player/ packed.s THE LIVE PLAYER: display bring-up, the 193-entry DM
|
||||
stream.s asserted), the same decoder behind a bounded ring,
|
||||
ring.i the ring producer, the transport under it, and the
|
||||
xfer.i load-time codebook/palette transforms. OUT OF THE
|
||||
load.i VIDEO PATH since the packed player deleted the ring.
|
||||
load.i VIDEO PATH: a DMAC-direct player has no ring.
|
||||
frame.i the block loop and span chain, included by both, so
|
||||
there is exactly ONE copy of the bytes every cycle
|
||||
constant is fitted to. The span pass is blit.s v7
|
||||
|
||||
Reference in New Issue
Block a user