2026-07-14 08:51:00 +02:00
2026-05-23 09:11:14 +02:00
2026-05-23 09:04:38 +02:00
2026-07-13 22:13:36 +02:00
2026-07-13 22:57:03 +02:00
2026-07-14 08:51:00 +02:00
2026-07-13 22:15:52 +02:00
2026-07-14 08:51:00 +02:00
2026-07-13 22:15:52 +02:00
2026-07-13 22:57:03 +02:00
2026-07-13 22:57:03 +02:00
2026-07-13 22:57:03 +02:00
2026-07-13 22:57:03 +02:00
2026-07-13 22:57:03 +02:00
2026-07-14 08:51:00 +02:00

C64 Demo — Teletype Games slide show

A Commodore 64 slide show written in 6502 assembly (built with the ACME assembler). Five slides rotate automatically, cross-fading through black between switches, and the show can also be driven from the keyboard.

The slides

  1. TTG logo + credits scroller — giant TTG letters built from 8×8 bitmaps with a gold color wash running across them, a pulsing TELETYPE GAMES title, and a smooth pixel scroller with the crew credits.
  2. Our first gameDEFINITELY NOT AN IMPOSTOR in big 3×5 block letters with the gold wash, "introduced on TIC-80".
  3. Our second gameIS COMING in big letters with a drop shadow; raster bars run on the border only, so the text stays readable. A new point and click adventure, will be available on Steam.
  4. Contact — pulsing big CONTACT title, web / BBS / IRC lines.
  5. The assembly confession — a justified-text apology explaining that this slide show was written with a little help from an AI.

Each slide is shown for 6 seconds (SLIDE_TIME in defs.asm, PAL frames).

Controls

Key Action
SPACE next slide immediately
INST/DEL (backspace) previous slide
P pause toggle — the countdown freezes and a white P marker appears in the top-right corner; effects keep running, and SPACE/DEL still work while paused

Keys are read directly from the CIA1 keyboard matrix (the KERNAL is switched off).

Build and run

make build       # produce main.prg
make run         # build + launch in VICE (x64sc)
make rebuildrun  # clean rebuild + run
make deps        # on macOS: install acme + vice via Homebrew

Loading the .prg on a real or emulated C64:

LOAD"*",8,1
RUN

Source layout

File Contents
main.asm BASIC stub, main loop, slide sequencer, fade transition, keyboard scanning; includes the other files via !src
defs.asm hardware registers, colors, layout/timing constants, zero page assignments, the +prtext / +prbig macros
common.asm shared routines (clear_screen, print_text, draw_big), shared tables (row×40 lookup, 3×5 block font, wash/pulse/fade color ramps), shared variables
slide1.asmslide5.asm one file per slide: sN_init (draws the screen), sN_update (runs once per frame), plus slide-local data and variables

Everything is assembled in a single ACME pass, so labels can be referenced freely across files.

How it works

Slide framework

Every slide consists of an init routine (draws the whole screen), an update routine (called once per frame through a vector, must return after exactly one frame), and a duration in frames. The main loop in main.asm calls the current update, counts the frames down, and steps to the next slide when time runs out — or immediately on SPACE/DEL. Adding a slide means writing a new slideN.asm, !src-ing it, adding its entries to the vector tables and bumping NUM_SLIDES.

Timing

There are no interrupts: the code polls the raster line register ($D012) and does all screen updates while the beam is in the lower border (RAS_BOTTOM). Slide 1 additionally splits the frame mid-screen to enable horizontal fine scrolling ($D016) for the scroller row only; slide 3 chases the beam down the frame, recoloring the border every 4 lines to draw the raster bars.

Transition

Slides cross-fade through black. Fading out repeatedly steps every color RAM cell through fadetbl (each color → one shade darker; every chain hits black within 4 steps). The new slide is then drawn with the display switched off ($D011), its color RAM is snapshotted to a buffer at $C000 and blanked, the display is switched back on, and the fade-in walks each cell from black back up to its snapshot color. Works cleanly because every slide sits on a black background.

Text rendering

Normal lines are printed by print_text (row/column/color parameters, driven by the +prtext macro). Big titles use draw_big (+prbig): a 3×5-pixel block font (17 glyphs, only the letters actually used), each letter drawn 3 cells wide + 1 gap from inverse-space blocks — narrow enough to fit "DEFINITELY" (10 letters) on a 40-column row.

Memory map

$0801 .. $080F   BASIC stub (10 SYS 2064)
$0810 .. ...     machine code + fonts + texts + variables
$0400 .. $07E7   screen RAM (written directly)
$C000 .. $C3E7   color RAM snapshot buffer for the fade-in
$D800 ..         color RAM
$D011            display on/off (hidden slide redraw)
$D012            raster line (frame sync, raster bars)
$D016            horizontal fine scroll (slide 1 scroller)
$D020 / $D021    border / background color
$DC00 / $DC01    CIA1 keyboard matrix (SPACE / DEL / P)
$F5 .. $FE       zero page pointers
S
Description
No description provided
Readme
135 KiB
Languages
Assembly 98.2%
Makefile 1.8%