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
53 lines
2.5 KiB
Markdown
53 lines
2.5 KiB
Markdown
# 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.
|