Skip to content

Install Pictures Once, Use Them Many Times

Reusable glyph upload, replacement and cell selection on sixteen qualified targets, including native C64, NES CHR-RAM and Sega Mode 4. Separate the picture from its code, placement and colours.

A character does not have to be a letter. It can be a wall, a door, a brick or a piece of a larger picture. Give that picture a slot number, and the screen can use it in many places.

Two screen cells containing code one share the same eight-row cross picture
Replacing a glyph changes every cell that uses it. Changing one cell’s code changes only that instance.

Sixteen machines, distinct access contracts

Machine Code and display Owned resources
Unexpanded PAL VIC-20 CPU writes to an allocated 1 KB RAM font and 22×23 screen VIC character/screen bases and high-resolution colour bits
MSX1 Graphics I Ported uploads to 256 patterns and a 32×24 name table VDP ports/latch and colours shared by groups of eight patterns
Game Boy DMG 2bpp tiles and 32×32 background map, LCD off Unsigned tile addressing, background map and safe LCD-stop policy
ColecoVision Graphics I, 256 patterns and 32×24 names Data/control $BE/$BF; read $BE; private RAM and VDP latch
Sord M5 Graphics I, 256 patterns and 32×24 names Data/control $10/$11; read $10; private RAM and VDP latch
Memotech MTX Graphics I, 256 patterns and 32×24 names Data/control $01/$02; read $01; private RAM and VDP latch
Tatung Einstein Graphics I, 256 patterns and 32×24 names Data/control $08/$09; read $08; private RAM and VDP latch
SVI-328 Graphics I, 256 patterns and 32×24 names Data/control $80/$81; read $84; private RAM and VDP latch
SG-1000 Graphics I, 256 patterns and 32×24 names Data/control $BE/$BF; read $BE; private RAM and VDP latch
C64 hi-res text CPU-visible RAM font, 40×25 names Separate colour RAM, VIC bank/base and CPU mapping
NES CHR-RAM Two-plane tiles, 32×30 names Explicit CHR-RAM cartridge, PPU latch, rendering-off transfers
Master System Mode 4 Four-plane patterns, two-byte names Word indices/counts, flips, palette and priority flags
Game Gear Mode 4 Same encoding, 160×144 viewport Two-byte CRAM entries, separately verified crop
Jupiter Ace 128 write-only shapes and normal/inverse names TV-priority aliases, private RAM; corrected emulator source build
Oric Atmos TEXT Six-dot characters, 37×28 drawable allocation Three reserved serial-attribute columns; standard/inverse codes
Atari 800XL ANTIC 2 128 aligned shapes, 40×24 names CHBASE, CHACTL, display list, DMA/NMI and screen codes

The byte-indexed components have glyph_init, glyph_install, glyph_replace and glyph_select. Sega Mode 4 uses pattern_ entries and a word-sized context, preserving its ninth pattern-index bit. The entries show how to reserve the context, establish video, include the real code and call it. They preserve differences in colour and access; an identical calling name does not make hardware identical.

Picture, number, place

Install a picture in slot 1. Put code 1 in two cells. Replacing slot 1 changes both cells; selecting code 2 in only one cell leaves the other alone. That can make a wall change everywhere, or make one door open, depending on which operation you choose.

A single cell selection writes one name byte, or two on Sega Mode 4. A glyph replacement writes eight bytes on Ace, Oric, Atari, C64, VIC and the seven TMS targets, sixteen on DMG/NES, or thirty-two on Sega Mode 4. Every TMS port also needs two control-port writes to choose its VRAM address. The native checks exercise both operations, compare the complete pattern/name memory and check their visible effects independently.

Turn the sketch into bytes

Eight dots have weights 128, 64, 32, 16, 8, 4, 2 and 1. Row 10000001 is therefore 129: light the two outer dots. Stack eight such rows to make an 8×8 glyph. DMG adds a second bitplane, so two bits choose a palette index for each pixel.

Crates turns a sketch into four user-defined characters. The same powers-of-two arithmetic applies to these machines, with different upload rules. At cell (2,2), local dot (3,5) becomes screen pixel (2*8+3, 2*8+5) = (19,21). Place a point explores the coordinate idea further.

These routines handle fixed-grid character pictures. The basic upload routines do not implement proportional text, arbitrary pixel placement, runtime scaling or a running-game upload queue. Fixed-ROM systems such as PET and Aquarius also need a different route: screen codes can select existing ROM pictures, but cannot upload new ones into ROM. A software bitmap or writable display mode is a different capability to investigate, not something to hide behind a common API.

For a pixel-addressed display, pixels and boxes starts with individual bits. For map-to-screen transfers, use native regions.

For labels away from the character grid, bitmap text supplies callable fixed-width glyph/string routines on five qualified displays. It draws into bitmap memory rather than redefining shared character cells.

The six additional TMS callers reuse the MSX include unchanged, with 24 calls per target and independent full 16 KiB VRAM/native-picture checks. SVI-328 has separate data read and write ports; ColecoVision and SG-1000 fit the diagnostic buffer into their small RAM allocations. Shared silicon does not replace separate execution or make a Sega Mode 4 pattern a one-bit glyph.

The Ace, Oric and Atari XL show why stored slots and selectable codes differ. Ace/ANTIC 2 use 128 shapes with inverse forms. Oric’s lower codes are serial attributes rather than pictures; its six-dot rows and reserved screen columns need their own placement maths. The Ace capture uses the explicitly identified corrected emulator build, not an unchanged release.

When the font stays in ROM

PET, Aquarius, ZX80 and ZX81 can select installed characters and build larger pictures from them. Their span components do not upload pictures. The Sinclair display file also makes row allocation and CPU refresh part of the contract.

Bigger pictures on an ordinary character grid

A 16×16 letter can be four ordinary 8×8 tiles. Prepare those four pictures once, then place their numbers in a 2×2 rectangle. The ColecoVision, Sord M5, MTX, Einstein, SVI-328 and SG-1000 entries supply reusable placement, an offline dot-doubling converter, editable original assets and independently executed normal/custom/wrong/fixed examples.

The four tiles cost 32 pattern bytes and four slots. An instance costs four name writes; placement still follows the machine’s grid, colour groups and video-access rules. The routine rejects a whole 2×2 picture at an edge rather than silently wrapping the bottom tiles into the wrong row. This is a precomposed-size alternative to runtime bitmap scaling, not a hardware character-size switch or a qualification of every character system in the table.