Verified GVRAM is one word-access per pixel in ALL color modes; chose 256-color 256x192 with movem.l bursts (page 1 sacrificed as double-buffer). Measured 8 scenes from the Blu-ray source: blit costs under 8% of the 12fps cycle budget, so I/O is the bottleneck, not CPU. Naive delta+RLE reaches only 3.2:1 (365 KB/s, 470MB) -> decision to use 4x4 vector quantization (~30 KB/s). "Shot on twos" assumption failed: the transfer has zero duplicate frames, so 12fps requires explicit decimation. Documents three false measurement results and their root causes (per-frame Floyd-Steinberg dithering, temporal denoise, exact-match dedupe on noisy source). MAME Lua injection harness works and is reusable for cycle-cost measurement; the IOCS _B_READ disk benchmark is blocked returning -1. Claude-Session: https://claude.ai/code/session_01194oWYW8DQXK1SZ2DnChW6
2.5 KiB
X68000 hardware facts (verified, not assumed)
Target baseline: X68000 ACE/Expert class. 68000 @ 10MHz, 2MB RAM, SCSI HDD.
Cycle budget
Content is cel animation shot on twos -> 12fps effective. 10,000,000 / 12 = 833,333 cycles per frame. This is the wall.
GVRAM layout [verified: JC-000/x68000-dev-guide docs/graphics.md]
- 512KB physical, mapped at $C00000-$DFFFFF as aliased page windows.
- One 16-bit word per pixel position, in EVERY color mode. Bit depth does NOT change VRAM bandwidth. It only subdivides the word.
- Address formula (512-wide page):
addr = page_base + y*1024 + x*2 - Horizontally adjacent pixels are 2 bytes apart in all modes.
| Mode | Pages | Word subdivision | Page aliases |
|---|---|---|---|
| 16 | 4 | nibble per page (P3..P0) | $C00000/$C80000/$D00000/$D80000 |
| 256 | 2 | byte per page (P0=lo,P1=hi) | $C00000 (P0) / $C80000 (P1) |
| 65536 | 1 | whole word | $C00000 |
Writes via a page alias are auto-masked and shifted by hardware into that page's field. No software read-modify-write is needed for 16-color mode.
Chosen mode: 256 colors, 256x192 active area
Rationale: since every mode is one word-access per pixel, low bit depth buys no speed. 256-color halves on-disk data vs 65536-color for identical blit cost.
Coalescing trick: in 256-color mode a move.l spans two pixel positions across
BOTH pages. We sacrifice page 1 as a double-buffer and let it take duplicate
data, which lets us use movem.l bursts:
movem.l d0-d7/a0-a3,(a6) ; 12 regs = 48 bytes = 24 pixels
Full-frame refresh cost: 49,152 px / 24 = 2,048 bursts ~104 cyc/burst + VRAM waits (~1.5x) = ~320k cycles << 833k budget A hard scene cut fits. Delta frames cost far less.
Audio
MSM6258 ADPCM via HD63450 DMAC. ~7.8KB/s at 15.6kHz mono, near-zero CPU. 22 min ~= 10MB.
Storage estimate
~15,800 frames. Target ~3-5KB/frame compressed -> 50-80MB video + 10MB audio. Stream rate ~40-60KB/s. Well within SCSI sustained throughput.
Corrections applied after session-1 measurement
- Storage estimate below was optimistic. Measured naive codec gives ~470MB @24fps. See FINDINGS.md §3. VQ codec targets ~40MB.
- "Content is cel animation shot on twos -> 12fps effective" — the transfer has zero duplicate frames; 12fps requires explicit decimation. See FINDINGS.md §3.
- 10MHz models are SASI, not SCSI. See FINDINGS.md §5.