Character Graphics
Building worlds from 8×8 blocks
Character graphics used redefined text characters as game graphics, enabling colourful displays with minimal memory on systems designed primarily for text.
Overview
Before dedicated graphics hardware, computers displayed text using character sets—grids of 8×8 pixel patterns. Programmers realised they could redefine these characters to create game graphics, building entire worlds from 256 small tiles. The technique was memory-efficient and surprisingly flexible.
How it works
Standard text mode
| Element | Description |
|---|---|
| Screen memory | One byte per character position |
| Character ROM | 256 pre-defined 8×8 patterns |
| Display | ROM pattern at screen position |
Custom characters
| Change | Result |
|---|---|
| Point to RAM | Use custom definitions |
| Define 8 bytes | Create 8×8 tile |
| Reference by number | Display anywhere |
Memory efficiency
| Display method | Memory for 40×25 screen |
|---|---|
| Bitmap (mono) | 8,000 bytes |
| Bitmap (colour) | 8,000 + 1,000 colour RAM |
| Character mode | 1,000 (screen) + 1,000 (colour RAM at $D800-$DBE7) + 2,048 (charset) = 4,048 bytes |
Character mode uses far less RAM. The C64 has dedicated colour RAM at $D800-$DBE7 (one nibble per cell, hard-wired and not configurable) that holds the per-character colour for text and multicolour modes.
C64 implementation
Pointing to custom charset
lda #$1c ; Bits 1-3 select charset
sta $d018 ; Character at $3000
Defining a character
; Character 0 = solid block
lda #$ff
sta $3000 ; Row 0
sta $3001 ; Row 1
; ... continue for 8 rows
Building game screens
Tile-based levels
| Tile number | Represents |
|---|---|
| 0 | Empty space |
| 1 | Ground |
| 2 | Brick |
| 3 | Ladder |
| 4-7 | Decorations |
Screen composition
Level data: 32 × 8 = 256 bytes per screen
Charset: 64 tiles × 8 = 512 bytes
Total: 768 bytes vs 8KB bitmap
Multicolour character mode
On C64:
- Each character uses 4 colours
- Half horizontal resolution
- Richer graphics
- 160×200 effective pixels
Animation techniques
Character cycling
Animate by changing character definitions:
- Water ripples
- Fire flickering
- Blinking lights
Character swapping
Change which character displays:
- Player animation frames
- Different tiles same position
Platform variations
| Platform | Characters | Colours | Custom-character method |
|---|---|---|---|
| C64 | 256 | Per-character (text mode) or per-cell colour RAM | Point $D018 bits 1-3 to RAM-based charset |
| Spectrum | 256 | Per-8×8 attribute block | Point CHARS to RAM, OR use the 21 UDGs (codes 144-164) — the cleaner approach for small sets |
| BBC Micro | 256 | Mode-dependent | OSWORD calls or direct VDU 23 redefine commands |
| VIC-20 | 256 | Per-character | Point character pointer to RAM |
The Spectrum's UDG (User-Defined Graphics) system gives 21 redefinable characters in the upper printable range — sufficient for small games without disturbing the rest of the character set. Larger graphics need full charset replacement.
Limitations
| Limitation | Workaround |
|---|---|
| 8×8 grid alignment | Sprite overlay |
| 256 character max | Bank switching |
| Colour restrictions | Careful palette |
Notable uses
| Game | Character graphics use |
|---|---|
| Boulder Dash | Entire playfield |
| Impossible Mission | Backgrounds |
| Manic Miner | Level tiles |
| Most platformers | Background scenery |