Designing retro interfaces for the ZX Spectrum using BASIC
With high-resolution displays and responsive interfaces, it’s hard to imagine designing usable, attractive UIs with just a 32x24 character grid and eight colors (with restrictions!). And for the enthusiasts of the ZX Spectrum that was exactly the challenge in the 80s and 90s.
The ZX Spectrum, released in 1982, is one of the most popular 8-bit home computers had limited resources and minimalist design turned interface designing into a careful balancing act between creativity and constraint. Building interfaces in its native Sinclair BASIC programming language might seem so very archaic today, but it could offer a surprising insight into what makes UIs functional, readable, and engaging.
Interesting fact: Remembering even more previous interfaces like the Apple I, Commodore PET, TRS-80 Model 1, BBC Micro — all of them very mostly had a “dark mode” of black screen with only a single or a few colors to design with. Almost all modern UIs began in “dark mode” — black screens with glowing pixels, not light backgrounds.
In my early school years we had quite already oudated ZX Spectrum Z80 at home. I liked those so very nicely done oldy games, and also occassionaly was using elementary BASIC to program drawings and create interfaces for my first software development tries.
Interesting UI challenge on the ZX Spectrum
Have a look at these original limitations developers faced:
- Resolution: 256×192 pixels (like pre-smartphone mobiles)
- Text grid: 32 columns × 24 rows (each character cell is 8×8 pixels)
- Colors: 8 base colors, with bright/dark variations (total 15, plus “transparent”)
- Attribute clash: Only one foreground and one background color per 8x8 block
- No mouse or pointer: All interaction is via keyboard or joystick
- No UI libraries: All UI components had to be hand-drawn in BASIC or assembly
These constraints may seem crippling today, but they encourage extremely deliberate design choices and models.
Most typical ZX menu:
Elements in ZX Spectrum BASIC that teach you ultimate UI thinking
1. Text-based layouts
Since the default display in BASIC uses character items, most interfaces are essentially text grids. This can be leveraged to create menus, frames, labels, and basic navigation.
My favourite was a vertical menu of centered items that had solid color stripe on key press hovers. Black background, white texts, and hover color e.g. blue or red. Imho, blue was prettier with white text. Smth like that:
[ See live example ]
And that’s how to code initial menu in BASIC. Easy:
10 CLS
20 PRINT AT 1,10;"ZX MENU"
30 PRINT AT 3,5;"1. Start Game"
40 PRINT AT 4,5;"2. Options"
50 PRINT AT 5,5;"3. Exit"This simplicity is part of the charm — users appreciate clear layouts that just work.
2. Color usage and highlighting
BASIC allows setting color attributes using:
'INK color: sets text color
'PAPER color: sets background color
'BRIGHT 1: makes colors more intense
60 PAPER 0: INK 7: PRINT AT 3,5;"1. Start Game" ' white on black
70 PAPER 6: INK 0: PRINT AT 4,5;"2. Options" ' black on yellow highlight3. Box drawing with characters
ZX Spectrum’s character set includes box-drawing pseudo-graphic characters (CHR$ 128–143) and block characters (CHR$ 144–143).
'Example to draw a simple frame:
100 FOR I=0 TO 20
110 PRINT AT 10,I;CHR$ 143 ' Top border
120 PRINT AT 14,I;CHR$ 143 ' Bottom border
130 NEXT I
140 FOR J=11 TO 13
150 PRINT AT J,0;CHR$ 143 ' Left border
160 PRINT AT J,20;CHR$ 143 ' Right border
170 NEXT JThis creates a UI component, useful for dialogs, messages, option panels.
Building a real good UI on the Spectrum.
Despite the technical challenges, many Spectrum UIs were elegant and user-friendly. Here are some purposeful principles for building good UI — then and now.
1. Clarity above all
Due to the character limitations, clarity comes first. Don’t overload the screen. Use whitespace (empty character cells) to separate sections. Label everything.
'Not cool:
PRINT "NAME: SCORE: LEVEL: TIME: LIFE:"
'Better:
PRINT AT 0,0;"NAME:";AT 1,0;"SCORE:";AT 2,0;"LEVEL:"...2. Feedback matters
Always it’s needed to show that the program is listening.
- Highlight selected options.
- Use inverse text to mark active items.
- Print “Loading…” or “Please wait” for long operations.
- Provide confirmations like “Y / N” (“Yes” / “No”).
- Play a sound (BEEP) or blink text as feedback.
'Example:
PRINT AT 10,10;"Loading...": BEEP 0.5,103. Use of color as communication
Don’t use colors randomly. Reserve color changes for:
- Alerts (e.g., red background)
- Selections (e.g., yellow highlight)
- Game states (e.g., green = safe, red = danger)
Also consider color blindness (even back then!). Avoid using color alone to convey state — pair it with position, shape, or label.
4. Consistent layout and navigation
If you have a multi-screen UI (e.g., Options, Main Menu, Game Screen), keep a consistent structure.
- Keep headers in the same row.
- Navigation keys should always work the same (e.g., 1 = Select, 0 = Back).
- Maintain the same color schemes across screens.
'Example:
IF choice=1 THEN GOTO 200 ' Start game
IF choice=2 THEN GOTO 300 ' Options5. Input design
Text input on the Spectrum is slow and awkward. Minimize it where possible.
- Use number choices (1,2,3…) over text typing.
- If you must collect text (e.g., a name), offer clear guidance:
PRINT "ENTER NAME: "
INPUT a$- Use number choices (1,2,3…) over text typing.
PRINT "HELLO ";a$6. Progressive disclosure
Avoid dumping all information at once. Show just what’s needed now. For example:
- Show just the current menu.
- Hide advanced options unless selected.
- Display help or tooltips in a separate section (e.g., last row).
This keeps the interface tidy and reduces cognitive load.
Some interface types to try like it’s 1982
Here are a few types of the ZX interfaces to think about:
✅ Main menu system
- Numbered choices
- Highlighted current selection
- BEEP for feedback
- Menu items loop
✅ Form or input screen
- Each input labeled
- Clear instruction
- Minimal typing
✅ HUD for game
- SCORE, TIME, LIFE showed in consistent layout
- Top/bottom rows
- Efficientl updates (not a full screen redraw)
✅ Dialog box
- Box drawing characters
- Displayed in screen center
- Requires key press to dismiss
Tips for optimizing UI code in BASIC
Although BASIC is easy to write, it’s relatively slow. Here’s how to make it feel responsive:
- CLS have to be used sparingly to clear only what’s needed.
- Reusing the same row/column positions to overwrite old content.
- Menu data should be stored in arrays or DATA statements:
DATA "Start","Options","Exit"Proper loops over them should be used for quality rendering.
- Avoid unnecessary loops; use hardcoded positions for static layouts.
- Use PAUSE to give breathing room after updates:
PRINT "Saving...": PAUSE 50UX wisdom from the 8-bit era
Designing interfaces on the ZX Spectrum might sound like a retro hobby, but it instills deep respect for minimalist UX. Every byte matters. Every pixel counts. Every color has purpose.
What can today’s designers learn from it?
- Constraints drive clarity: Limited space forces better structure.
- Function over form: A UI is only good if it’s usable.
- Feedback is vital: Users need reassurance and response.
- Consistency builds trust: Predictable navigation wins.
Conclusion
Building user interfaces on the ZX Spectrum using BASIC is a rewarding mix of design and engineering. It’s an ultimate course in the fundamentals of human-computer interaction — without distractions. When every screen must be drawn manually, and every character position is deliberate, you quickly learn what matters.
Whether you’re a retro computing fan, a hobbyist developer, or a modern UI designer looking for inspiration, creating UIs in Spectrum BASIC shows timeless lessons about intentional, user-focused design. This could be great jumpstart for the new trends of “dark/night mode” for UIs of now.
Tools to try
- Fuse ZX Spectrum Emulator
- BASin (Windows) — a full-featured BASIC editor
- ZX-Editor — modern Windows editor with UI previews
References
- Dev Ieffe. (2025, June 23). Why the digital world should switch devices to dark screen mode — Medium
- Johan Berndtsson. (2024, Oct 16). How My Sinclair ZX Spectrum 48k and a Stack of Magazines Taught Me to Love Friction — johanberndtsson.com
- Rich Pelley. (2023, Jul 6). ‘It’s fun to cook up the stupidest idea’: the people competing to make the worst computer games possible — www.theguardian.com
- T. Heikinnen. (2017, Apr 30). Icon driven — oldmachinery.blogspot.com
Thanks for reading! Meanwhile, you can search for my other links, visit my website, or try to study some meaningful UX — this is a short referral link, which adds no extra, besides great opportunity to study best practices of so many various aspects of modern user experience science like usability, accessibility, user psychology, gestalt, augmented reality, customer experiences, and so many more in perfectly done courses, articles, and masterclasses. Stay tuned.
