Programmable Character Sets: A Simple Alternative to Bitmap Displays

Programmable or reconfigurable character sets were a simple alternative to fully bitmappable displays. The main driving force behind their creation was a desire to keep the cost of computers low: RAM was expensive and bitmappable displays need more complex hardware. Programmable character sets were a half-way house between the preceding extended character sets, which contained most of the 7-bit ASCII characters plus extra graphic characters, and bitmappable displays.

By creating your own character set you could create different fonts, software sprites and even simulate a bitmap. They gave a much greater degree of control than a fixed extended character set at the same time as reducing the cost of the computer. With careful planning you could create very quick and compact code because a single write to memory would allow you to output a character which would typically contain a group of 8x8 pixels. Two machines that really captured how well this could be done are the Commodore Vic-20 and the Jupiter ACE.

The Commodore Vic-20

The unexpanded machine had 5KB of RAM and the character set would typically approach the screen memory. Therefore if you wanted to reduce the memory taken up by the character set to just 64 or 128 characters this could easily be done by overlapping the screen memory. In addition this could be reduced further or used more flexibly by storing other data or code in the character set memory.

A lot of Vic-20 software was distributed as cartridges, which meant that additional character sets could be stored in ROM and used as needed. This further enhanced the power of the method.

The Vic-20 was quite a flexible machine; you could change the character set as the raster line moves down the screen, giving additional possibilities; you could even simulate a bitmap display by using 8x16 characters, but this would of course use twice as much memory so wasn't suitable for the unexpanded Vic-20.

Below you can see how much memory various configurations use:

Text Screen + 256 8x8 Character set + colour attributes:
(22x23) + (256x8) + (22x23) = 3060 bytes

Text Screen + 128 8x8 Character set + colour attributes:
(22x23) + (128x8) + (22x23) = 2036 bytes

Text Screen + 64 8x8 Character set + colour attributes:
(22x23) + (64x8) + (22x23) = 1524 bytes

176x184 nearest bitmap equivalent + colour attributes:
(176x184/8) + (22x23) = 4554 bytes

Text Screen (Simulated bitmap) + 8x16 Character set + colour attributes:
(23x11) + (256x16) + (23x11) = 4602 bytes

184x176 nearest bitmap equivalent + colour attributes:
(184x176/8) + (23x11) = 4301 bytes

You can see that the simulated bitmap takes more memory than a real bitmap, but if you can can work with the 256, 128 or 64 programmable characters you make a saving of 1494, 2518 or 3030 bytes respectively. On a 5KB machine this is a considerable saving.

The Jupiter ACE

The ACE's character set had 256 characters where the first 128 were definable and the second 128 were the inverse of the first 128. Unlike the Vic-20, the ACE's video sub-system had its own 2KB of SRAM used to store the text display screen and character set. Therefore a programmable character set didn't effect the 1KB of RAM that the machine had. The ACE's screen was 32 columns by 24 rows using an 8x8 font. This naturally meant that a simulated bitmap of the whole screen wasn't straightforward, however in practise with a good design the 128+inverse characters can be enough.

Below you can see a comparison of the RAM used by the character set vs a bitmap equivalent. The programmable character set saves 4352 bytes.

ACE Text Screen + 128 8x8 Character Set:
(32*24) + (128x8) = 1792 bytes

ACE 256x192 bitmap equivalent:
256x192/8 = 6144 bytes

A bitmap image can often be made to fit into the restricted character set by matching and altering tiles to conform to the 128+inverse characters. Below you can see a picture that has been converted using TextPix so that it can be displayed using the ACE's programmable character set.

Other Machines

There were other machines that used a programmable character set such as the Commodore 64 and Sinclair Spectrum, but these machines also had access to a bitmappable display. Where these machines used the programmable character set instead of a bitmappable display, this was mainly to reduce RAM usage, speed up certain routines and make things simpler.

Alternative Low RAM Displays

Beyond the extended and programmable character sets already mentioned, there were two other notable examples of low RAM displays:

Vector Graphics : To create a picture on this type of display you had to specify the points of the vector and then keep redrawing them to keep the display stable. This required no RAM to hold the picture, but did require a special Vector monitor and therefore increased the cost as it couldn't be used with a TV.

Atari 2600 TIA : The Television Interface Adapter was designed as a RAM-less way of outputting graphics to a Television. Instead of using a framebuffer in RAM to create a bitmappable display, the TIA chip was controlled through a few registers which provided five movable graphic objects and a static playfield object, which you could change for each raster line.


You should now see why the Vic-20, Jupiter ACE and other machines used a programmable character set instead of a bitmappable display. Both of these machines seemed to get along just fine like this and importantly it kept the cost down so that more people could afford them.

Creative Commons License
Programmable Character Sets: A Simple Alternative to Bitmap Displays by Lawrence Woodman is licensed under a Creative Commons Attribution 4.0 International License.

Share This Post


Related Articles

Introducing TextPix v0.1 - A program to convert an image into a character set and text mode screen data

I have today released TextPix v0.1 This is a program to take an image and convert it into a redefined character set and the associated text mode screen data referencing that character set. The program...   Read More

Getting Colour ANSI Emulation to Work Properly When Connecting to a BBS With Telnet Under Linux

I have noticed that the number of people interested in using telnet to access BBSs seems to be growing, which I'm really pleased to see. However lots of people seem to be having trouble getting colour...   Read More

My Top 10 Classic Text Mode BSD Games

Recently, I have been playing a collection of text mode games that were commonly found on Unix Systems during the 70s and 80s. These games are surprisingly playable and, for me, they really show that ...   Read More

Modula-2 Compilers on CP/M

Modula-2 is a great language in general and is a good choice for programming on CP/M. There are three good compilers available for CP/M which all require a Z80 processor and we'll compare each in turn...   Read More

XCCP: A Shell Extension for CP/M

XCCP describes itself as an Extended Console Command Processor for CP/M. It supports the 8080 and v1.0 was released by Anton R. Fleig in 1984. Like EPEX, XCCP doesn't require installing so we can begi...   Read More