Atari Graphics/Sound/3D/Games — Synthesis → KN-86 Roadmap
Related canon: ADR-0052 (soft-glyph, shipped), ADR-0036 (renderer), ADR-0005 (FFI), ADR-0045 (background pursuit), ADR-0047 (experience tier), ADR-0015 (CIPHER), GWP-644 (animation substrate). Authoring companion: software/cartridges/authoring/animation.md.
0. Why these books, and what already shipped
Section titled “0. Why these books, and what already shipped”The Atari 8-bit and ST were shaped by the same constraint KN-86 lives under: a slow CPU that can’t rewrite the framebuffer every frame, so the era’s whole craft is “change a lookup, not the pixels.” That philosophy ports cleanly onto a tree-walking Lisp on a Pi Zero 2 W driving a 1024×600 amber surface (128×75 cells / 128×150 half-block).
Already shipped from this study: book 1’s signature trick — character-set redefinition — became the soft-glyph plane (ADR-0052, GWP-651): redefine one mutable 8×8 glyph and tile it across a field at O(1) caller cost. Its complement, glyph-cycling (per-cell render/glyph), was already what the fireplace screen does. The two-style animation model is canonized in animation.md. Everything else below is banked as roadmap, not yet built.
1. The five books in one line
Section titled “1. The five books in one line”| # | Book (year) | Machine | What it gives KN-86 |
|---|---|---|---|
| 1 | COMPUTE!‘s First Book of Atari Graphics (1982) | 8-bit | char-set redefinition (→ soft-glyph, shipped), glyph-cycle, font-banks/zones, P/M overlay, fine scroll, artifacting→dither |
| 2 | Atari Sound and Graphics (1982) | 8-bit | generative chance music, “endless song” (random-walk-in-thirds), SFX sweeps, audio-reactive visuals |
| 3 | The Creative Atari (1983) | 8-bit | parametric/trig 2D demos, multi-cell sprite animation, glyph-editor tool, the SFX cue library (Kruse), “random within form” + “alive” |
| 4 | Atari ST 3-D Graphic Programming (1986) | ST/68000 | the line primitive (keystone), 3D transform pipeline, perspective, hidden-line/painter’s, dither-shading, sin/cos tables |
| 5 | The Atari Book of Games (1983) | 8-bit | pursuit-AI, ELIZA dialogue engine, cell-scroll dodge, a catalog of arcade/puzzle minigame skeletons |
2. Transferable techniques, per book
Section titled “2. Transferable techniques, per book”Book 1 — graphics primitives. Char-set redefinition is the deep idea (shipped as soft-glyph). Still on the table: font-banks per zone (a region uses a different glyph table — a declarative “display list” of vertical zones, extends per-region scale); a Player/Missile-style pixel overlay (a small bitmap floating at sub-cell resolution over the grid, with collision/priority — a cursor/reticle/spark/Null-cart CIPHER ghost; deferred to its own ADR); fine scrolling (sub-cell pixel offset on a region — smooth marquees/starfields/map-pan, generalizes the CIPHER-LINE ticker); artifacting → dither (can’t get color from one phosphor, but spatial/temporal dither fakes mid-brightness — the monochrome analog).
Book 2 — sound + the generative turn. SFX = sweep a voice’s pitch through a loop, parameterized by start/end/step/pause (bomb-drop, siren, laser, bird-chirp). Chance music: RNG-driven notes across voices, round-robin, = ever-changing ambient pad. Endless song: a scale array walked randomly but constrained to consonant intervals (thirds), with random durations. Stated principle: “random elements within form” — improvisation is bounded structure with randomized detail (their “always 12 peaks, random placement”).
Book 3 — parametric demos + craft. A pile of tiny programs (WHIRL, HYPNO, MELONS, ROLL, RING, BALL, the “Hexrotate” cover) draw mesmerizing motion from SIN/COS + polar coords — spirals, Lissajous, rotating wireframes, bouncing balls. This is deterministic generative art (sibling to book 2’s random). Plus: multi-cell sprite animation (a figure from several glyphs, animated by swapping frames + repositioning — Animath’s gorilla → an animated mascot/λ); an interactive glyph/sprite editor (authoring tool); and Kruse’s “Atari Library of Sound” — 12 named SFX (doorbell, ring, alarm, explosion, two sirens, tick, klaxon, whistle…) all on one percussive-envelope primitive + detune (two registers slightly apart) + noise. Ted Nelson’s opening essay frames the north-star: layered planes + smooth motion + object/background interaction = “alive.”
Book 4 — vector & 3D. A full pipeline: translate/scale/rotate-about-any-axis (matrices+trig), orthographic + perspective projection (x' = x·d/z), clipping, hidden-line removal + backface culling (cross-product normals), painter’s algorithm (depth-sorted filled polys), face shading from normal·light, and precomputed sin/cos tables for speed. The code is 68000 asm — only the algorithms transfer. The keystone observation: books 3 and 4 both need one missing runtime primitive — a line-draw (Bresenham over the half-block 128×150 canvas) — and it unlocks the entire vector family (2D demos and 3D wireframe). Shipped (GWP-654) as the render-tier FFI render/half-block-line (integer Bresenham, endpoint-symmetric, clipped to the surface), with the on-glass reference at runtime/programs/linelab/linelab.lsp — record it with tools/record-demo.sh --screen linelab. The wireframe engine is now prototyped (GWP-657): a mesh-agnostic pure-Fe pipeline (rotate/translate + perspective + cross-product backface cull → hidden-line) drawing a tumbling cube via the line FFI (runtime/programs/wirelab/wirelab.lsp), characterised at ~1 % of the on-device frame budget — see prototype/wireframe-engine.md. Shading maps to dither density (darker face = denser dither), so we get “solid” shaded 3D in mono amber — still ahead (it’s the one piece that wants a C fill primitive).
Book 5 — game mechanics. 21 type-in games with “how it works” writeups. The two richest systems: a grid pursuit/evasion mini-AI (Capture the Quark: heuristic goal-bias + RNG + blocked-square checks, ~8 lines) → a trace/hunt/corner mechanic; and a full ELIZA conversation engine (Smalltalker: tokenize → pronoun/tense reflection via a DATA table → priority keyword spotting → templated/echoing reply → random filler fallback) → NPC/contact dialogue, interrogation, CIPHER personality. Plus ready arcade skeletons: cell-scroll dodge (collision = test next cell’s occupancy), wave-defense, reel+payout gamble, paddle-ball, aim+power projectile, hidden-grid memory, herding/flock steering, timing/rhythm, board-AI.
3. The buildable threads (the roadmap)
Section titled “3. The buildable threads (the roadmap)”Everything converges on ~5 threads. Each is a backlog task under [GWP-653].
| Thread | Books | KN-86 fit | Perf / risk | Ties | Task |
|---|---|---|---|---|---|
Line-draw primitive (keystone) — SHIPPED (render/half-block-line) | 3, 4 | Bresenham over half-block 128×150 + clipping; a render-tier FFI | Low; small | enables the two below | [GWP-654] |
| Generative A/V attract | 2, 3 | parametric motion + stochastic variation (“random within form”) on the shipped soft-glyph + idle-timer substrate | Low (substrate exists) | GWP-651/644, ADR-0052 | [GWP-655] |
| PSG sound-effects + ambient library | 2, 3 | named SFX cues on a percussive-envelope + detune + noise primitive; generative ambient (random-walk-in-thirds) | Low–Med | extends sfx-boot + music.md | [GWP-656] |
| Vector/3D wireframe engine (low-poly wireframe PROTOTYPED) | 3, 4 | low-poly amber wireframe: transforms + perspective + backface cull (hidden-line) + painter’s API; sin/cos hoisted. Shaded-fill still ahead | re-measured LOW for wireframe: pure-Fe cube ≈ ~1 % of the 16 fps budget on-device (est.) — no C core needed; C is a later lever for dense meshes or dither-fill | gated on GWP-654 (consumes render/half-block-line) | [GWP-657] |
Gameplay mechanics modules — pursuit-AI + ELIZA SHIPPED (trace, echo); arcades enumerated | 5 | pursuit-AI; ELIZA dialogue; arcade skeletons (dodge/defense/gamble/paddle) | Low–Med; Lisp-native | ADR-0045 (pursuit), ADR-0015 (dialogue = CIPHER voice), ADR-0047 (arcade); roster in atari-arcade-skeletons.md | [GWP-658] |
Recommended order: GWP-654 (line) → GWP-655 (attract) + GWP-656 (sound) in parallel (both ride shipped substrates) → GWP-658 (mechanics, mostly Lisp) → GWP-657 (3D, the heavy one) last.
4. Cross-cutting principles (worth keeping)
Section titled “4. Cross-cutting principles (worth keeping)”- Animate the lookup, not the pixels. Soft-glyph, font-banks, palette/glyph-cycling, scroll-offset, sprite overlay — the expensive framebuffer never gets rewritten. The right instinct on this hardware.
- Random within form (book 2). Procedural generation = a bounded skeleton (the “form”) with randomized detail. Already the World-Engine instinct; name it and reuse it for attract, audio, missions.
- “Alive” = layered planes + smooth motion + interaction (Ted Nelson, book 3). The aesthetic target for attract/gameplay.
- Monochrome → dither, not color. Every “color” trick (artifacting, palette cycling, shaded faces) becomes a dither-density trick on the single amber phosphor.
5. What does NOT transfer (honest)
Section titled “5. What does NOT transfer (honest)”- Color, everywhere — KN-86 is single-foreground amber. Palette cycling, GTIA hues, multicolor players, SETCOLOR frames → dither analogs only.
- POKEY ≠ YM2149. The Atari’s 4-voice distortion model and note numbers don’t map 1:1 to our 3-tone+noise+envelope PSG. SFX/music recipes transfer as design patterns; register values don’t.
- 8-bit graphics that book 1 already did better. Book 2’s and book 5’s graphics are intro-level; mine them for mechanics/sound/generative, not pixels.
- Real-time 3D perf. Book 4’s pipeline is the heaviest thing here on a Pi Zero tree-walking interpreter; expect transform math in C and/or pre-baked frames.
- 68000 asm / Atari OS POKEs — algorithms transfer, listings don’t.
6. How agents should use this guide
Section titled “6. How agents should use this guide”This is the reference layer; the work is the backlog ([GWP-654]…[GWP-658]) and the per-thread spec/ADR each will produce.
- Building an attract / idle / ambient visual? Use the two shipped animation styles (
animation.md) and §3’s generative-attract thread. Lead with “random within form.” - Adding audio / SFX? §2 (book 2/3) + the sound-library thread — build on a percussive-envelope primitive; recipes-not-register-values from POKEY.
- Anything vector or 3D? The line primitive (GWP-654) is the prerequisite — and it has shipped: draw with the render-tier FFI
render/half-block-line(integer Bresenham over the 128×150 half-block canvas), never a hand-rolled per-cart line. Seeruntime/programs/linelab/linelab.lspfor the worked 2D reference, andruntime/programs/wirelab/wirelab.lspfor the 3D wireframe engine (m3d/…— reusable, mesh-agnostic; lift it into a sharedrender/mesh3d.lspwhen a second caller lands). Pure-Fe transform math is fast enough for low-poly — don’t reach for a C transform core without a perf reason (prototype/wireframe-engine.md§3). - Designing a cart/mission mechanic? §2 (book 5) is a pattern catalog; check whether a mechanic already maps to an ADR (pursuit→0045, dialogue→CIPHER voice/0015, arcade→0047) before inventing. The two book-5 systems shipped as Fe-Lisp labs in GWP-658 —
runtime/programs/trace/(pursuit) andruntime/programs/echo/(the CIPHER-voice ELIZA, adapted from GNU Emacsdoctor.el) — and the arcade skeletons are enumerated as experience-tier candidates inatari-arcade-skeletons.md. - Always: monochrome → dither; animate the lookup, not the pixels; honest perf on the Pi Zero.