╔═══════════════════════════════════════════════════╗
║ ║
║ ┌────────────────────────┐ ║
║ │ │ ║
║ │ ████ ████ ████ │ ║
║ │ █ █ █ █ │ ║
║ │ █ █ █ █ │ ║
║ │ ██ ████ ████ │ ║
║ │ │ ║
║ │ VIC-20 TEST │ ║
║ │ WATCH I BLINK! │ ║
║ │ │ ║
║ └────────────────────────┘ ║
║ ║
║ V I C - 2 0 V I D E O ║
╚═══════════════════════════════════════════════════╝
Introduction
Welcome to the VIC-20 Graphics demonstration on the Emulator.ca Systems network.
The Commodore VIC-20 holds a special place in computing history. Released in 1981, it was the first computer of any kind to sell one million units. At a launch price of US$299.95, it brought colour computing to households that had never dreamed of owning a computer. Jack Tramiel's vision of "computers for the masses, not the classes" found its purest expression in this cheerful little machine with its 22-column display and 5 kilobytes of RAM.
The VIC (Video Interface Chip, the MOS 6560 in NTSC markets and MOS 6561 in PAL) was the VIC-20's namesake and its defining component. Unlike the later VIC-II in the Commodore 64, the original VIC chip produced a smaller display---22 columns by 23 rows in its standard configuration. It offered 8 foreground colours, a configurable background and border, and shared the same PETSCII character set as its successors. What it lacked in resolution it made up for in charm; the VIC-20's chunky graphics and vivid colour palette gave it a distinctive personality that C64 owners would quietly envy.
This demonstration emulates the VIC-20's text mode through a MOS 6502 CPU core. Screen RAM, colour RAM, and VIC registers are faithfully mapped to their original addresses. The demo renders the word "VIC" in large block graphics using PETSCII solid block characters, with an animated blinking "I"---a small tribute to the machine's playful spirit.
This is a video-mode backend. The display is rendered from emulated video memory at 30 frames per second, not through ANSI escape sequences. The 22x23 character grid reflects the authentic VIC-20 screen dimensions.
Features
- MOS 6502 CPU emulation
- 22x23 text mode matching the VIC-20's standard display
- 8 foreground colours per the original VIC palette
- Screen RAM at $1000-$11F9 (506 bytes)
- Colour RAM at $9600-$97F9 (506 nybbles)
- VIC registers at $9000-$900F
- PETSCII block graphics demonstration
- Animated blinking letter in the "VIC" display
Quick Start
- Dial
555-6520from the EC-TTY main menu - The VIC-20 video display initialises automatically
- Watch the "VIC" block art with blinking "I" animation
- Type characters to write to the VIC-20 screen
- Hang up to disconnect
ATDT555-6520
CONNECT 14400
**** VIC-20 VIDEO TEST ****
Getting Connected
Dialling In
ATDT555-6520
Upon connection, the following initialisation sequence occurs:
- The MOS 6502 WASM emulator module is loaded
- The CPU is created and reset
- A 22x23 virtual terminal is initialised
- Video memory is cleared (spaces with green foreground)
- VIC registers are configured for standard text mode
- The "VIC" block letter display is drawn to screen RAM
- The blinking animation timer begins (toggling every 500ms)
- The VIC-20 text adapter begins rendering at 30 fps
Modem Profile
VIC-20 Graphics uses the V.32bis modem profile (14,400 baud) for smooth framebuffer streaming.
The VIC Display
Screen Layout
The VIC-20 displays 22 columns by 23 rows---noticeably smaller than the C64's 40x25 grid. This was a deliberate design choice by Commodore to reduce memory requirements. At just 506 bytes for screen RAM, the VIC-20 could devote more of its limited 5 KB to programme storage.
Row 0: ┌────── 22 columns ──────┐
Row 1: │ │
... │ Screen RAM: $1000-$11F9 │
Row 21: │ Colour RAM: $9600-$97F9 │
Row 22: └──────────────────────────┘
The VIC Colour Palette
The VIC-20 supports 8 foreground colours per character cell:
| Index | Colour | Notes |
|---|---|---|
| 0 | Black | |
| 1 | White | |
| 2 | Red | Used for "V" in the demo |
| 3 | Cyan | Used for "I" in the demo, background |
| 4 | Purple | |
| 5 | Green | Default foreground, border |
| 6 | Blue | |
| 7 | Yellow | Used for "C" in the demo |
The default configuration sets the background to cyan and the border to green, approximating the VIC-20's classic power-on appearance.
The VIC-20 supports only 8 foreground colours compared to the C64's 16. The extended colours (orange, brown, light red, greys, light green, light blue) were introduced with the VIC-II chip. If you want to see the full 16-colour palette, dial 555-6502 for the C64 Graphics demo.
PETSCII and Block Graphics
The VIC-20 shares the same PETSCII character encoding as the C64. The demo makes particular use of the solid block character ($A0), which fills an entire character cell with the foreground colour. By arranging these blocks in patterns, the demo creates large "VIC" lettering---a technique widely used in the 8-bit era for title screens and decorative displays.
Each letter in the demo is 4 characters wide by 5 characters tall:
V: █ █ I: ████ C: ████
█ █ ██ █
█ █ ██ █
██ ██ █
██ ████ ████
VIC Registers
The emulation provides the key VIC chip registers:
| Address | Register | Function |
|---|---|---|
| $9000 | Screen Origin H | Horizontal screen origin |
| $9001 | Screen Origin V | Vertical screen origin |
| $9002 | Columns | Number of display columns (bits 0-6) |
| $9003 | Rows | Number of display rows (bits 1-6), char height (bit 0) |
| $9005 | Character Address | Video and character memory addresses |
| $900E | Auxiliary Colour | Auxiliary colour (bits 4-7), volume (bits 0-3) |
| $900F | Background/Border | Background (bits 4-7), reverse (bit 3), border (bits 0-2) |
Background/Border Register ($900F)
Bits 7-4: Background colour (0-15, but VIC-20 only has 8 distinct colours)
Bit 3: Reverse mode
Bits 2-0: Border colour (0-7)
The demo sets this register to $35, giving cyan (3) background and green (5) border.
The Blinking Animation
The centrepiece of this demonstration is the blinking "I" in the "VIC" display. Every 500 milliseconds, the "I" letter alternates between visible (drawn in cyan block characters) and invisible (replaced with space characters). This simple animation demonstrates how the VIC-20's screen RAM can be manipulated in real time to produce visual effects.
The animation runs entirely through JavaScript timer callbacks that write directly to the emulated screen and colour RAM---the same approach a VIC-20 programme would take, except that on original hardware, the programme would be running on the 6502 and writing to memory-mapped I/O.
Memory Map
| Address Range | Contents |
|---|---|
| $0000-$0FFF | System RAM (4 KB) |
| $1000-$11F9 | Screen RAM (506 bytes, 22x23) |
| $1200-$1FFF | User programme area |
| $9000-$900F | VIC chip registers |
| $9600-$97F9 | Colour RAM (506 nybbles) |
Input
Characters typed on your terminal are sent to the emulated UART and echoed to the screen at the current cursor position.
Supported Input
| Key | Behaviour |
|---|---|
| Printable characters | Written to screen RAM at cursor position |
ENTER / Return |
Carriage return (cursor to column 0) |
| Line Feed | Cursor moves down, scrolls if at bottom |
BACKSPACE / DEL |
Erases character behind cursor |
TAB |
Advances cursor to next 8-column boundary |
When the cursor reaches the bottom of the 22x23 display, the screen scrolls up by one line. The scroll implementation reads all screen and colour RAM, shifts the data up by one row, and clears the bottom line. This matches the VIC-20's native scrolling behaviour.
Command Reference
| Command | Description |
|---|---|
| Any printable key | Write character to screen at cursor |
ENTER |
Carriage return |
BACKSPACE / DEL |
Erase previous character |
TAB |
Advance to next tab stop |
| Hang up | Disconnect from the demo |
Quick Reference Card
╔══════════════════════════════════════════════════════════════════════╗
║ VIC-20 Graphics - QUICK REFERENCE Emulator.ca Systems ║
╠══════════════════════════════════════════════════════════════════════╣
║ ║
║ DIAL: 555-6520 CATEGORY: Vintage Hardware ║
║ ║
║ DISPLAY: 22x23 text mode ENCODING: PETSCII ║
║ COLOURS: 8 foreground REFRESH: 30 fps ║
║ CPU: MOS 6502 ANIMATION: 500ms blink cycle ║
║ ║
║ VIDEO MEMORY: ║
║ Screen RAM: $1000-$11F9 (506 bytes) ║
║ Colour RAM: $9600-$97F9 (506 nybbles) ║
║ BG/Border: $900F ║
║ ║
║ DEFAULT COLOURS: Green on cyan (classic VIC-20 appearance) ║
║ ║
║ DEMO: "VIC" in block letters with blinking I animation ║
║ INPUT: Type characters to write to screen. Hang up to disconnect. ║
║ ║
╚══════════════════════════════════════════════════════════════════════╝
Troubleshooting
Problem: Screen appears blank
The VIC-20 display is smaller than most terminal windows (22x23 characters). Ensure your terminal window is large enough to display the rendered output. If the display remains blank after several seconds, disconnect and redial.
Problem: Block graphics appear as wrong characters
PETSCII block characters ($A0) are mapped to Unicode block elements for display. If your terminal font does not include these Unicode characters, the blocks may render as question marks or empty squares. Use a font with full Unicode block element support (most modern monospace fonts include these).
Problem: Animation is not visible
The blinking "I" animation toggles every 500ms. If your connection is very slow, frame updates may not arrive frequently enough to show the animation. At 14,400 baud (V.32bis), the animation should be clearly visible.
Problem: Colours look different from a real VIC-20
The VIC-20 colour palette is approximated using ANSI terminal colours. The exact shade of each colour depends on your terminal emulator's colour scheme. For the most authentic experience, use a terminal with a colour scheme modelled on the VIC-20's NTSC or PAL output.
Problem: Typed characters do not appear
Characters are written to screen RAM at the current cursor position. If the demo programme has written content to the screen, your typed characters will overwrite it. The cursor starts at position (0, 0)---the top-left corner. If the demo has drawn over this area, your input may be hidden behind the animation.
See Also
- C64 Graphics (555-6502) -- The Commodore 64 successor with 40x25 display and 16 colours
- Z80 CPU Reference (555-4355) -- Z80 emulation for architecture comparison
- TI CC-40 (555-0040) -- Another vintage hardware emulation
- ANSI Art Gallery (555-0900) -- Terminal graphics and artwork
VIC-20 Graphics -- Commodore VIC-20 Video Demonstration
Emulator.ca Systems
Document Revision 1.0