Skip to content

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.

#Book (year)MachineWhat it gives KN-86
1COMPUTE!‘s First Book of Atari Graphics (1982)8-bitchar-set redefinition (→ soft-glyph, shipped), glyph-cycle, font-banks/zones, P/M overlay, fine scroll, artifacting→dither
2Atari Sound and Graphics (1982)8-bitgenerative chance music, “endless song” (random-walk-in-thirds), SFX sweeps, audio-reactive visuals
3The Creative Atari (1983)8-bitparametric/trig 2D demos, multi-cell sprite animation, glyph-editor tool, the SFX cue library (Kruse), “random within form” + “alive”
4Atari ST 3-D Graphic Programming (1986)ST/68000the line primitive (keystone), 3D transform pipeline, perspective, hidden-line/painter’s, dither-shading, sin/cos tables
5The Atari Book of Games (1983)8-bitpursuit-AI, ELIZA dialogue engine, cell-scroll dodge, a catalog of arcade/puzzle minigame skeletons

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.

Everything converges on ~5 threads. Each is a backlog task under [GWP-653].

ThreadBooksKN-86 fitPerf / riskTiesTask
Line-draw primitive (keystone)SHIPPED (render/half-block-line)3, 4Bresenham over half-block 128×150 + clipping; a render-tier FFILow; smallenables the two below[GWP-654]
Generative A/V attract2, 3parametric motion + stochastic variation (“random within form”) on the shipped soft-glyph + idle-timer substrateLow (substrate exists)GWP-651/644, ADR-0052[GWP-655]
PSG sound-effects + ambient library2, 3named SFX cues on a percussive-envelope + detune + noise primitive; generative ambient (random-walk-in-thirds)Low–Medextends sfx-boot + music.md[GWP-656]
Vector/3D wireframe engine (low-poly wireframe PROTOTYPED)3, 4low-poly amber wireframe: transforms + perspective + backface cull (hidden-line) + painter’s API; sin/cos hoisted. Shaded-fill still aheadre-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-fillgated on GWP-654 (consumes render/half-block-line)[GWP-657]
Gameplay mechanics modules — pursuit-AI + ELIZA SHIPPED (trace, echo); arcades enumerated5pursuit-AI; ELIZA dialogue; arcade skeletons (dodge/defense/gamble/paddle)Low–Med; Lisp-nativeADR-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)”
  1. 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.
  2. 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.
  3. “Alive” = layered planes + smooth motion + interaction (Ted Nelson, book 3). The aesthetic target for attract/gameplay.
  4. Monochrome → dither, not color. Every “color” trick (artifacting, palette cycling, shaded faces) becomes a dither-density trick on the single amber phosphor.
  • 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.

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. See runtime/programs/linelab/linelab.lsp for the worked 2D reference, and runtime/programs/wirelab/wirelab.lsp for the 3D wireframe engine (m3d/… — reusable, mesh-agnostic; lift it into a shared render/mesh3d.lsp when 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) and runtime/programs/echo/ (the CIPHER-voice ELIZA, adapted from GNU Emacs doctor.el) — and the arcade skeletons are enumerated as experience-tier candidates in atari-arcade-skeletons.md.
  • Always: monochrome → dither; animate the lookup, not the pixels; honest perf on the Pi Zero.