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.
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.