“The TMS9918 from Texas Instruments and its derivatives were widely used video chips in the 1980s. So they were built into many popular home computers and game consoles of the time, such as the ColecoVision, CreatiVision, Memotech MTX, MSX, SG-1000/SC-3000, Spectravideo, Sord M5, Tatung Einstein, Texas Instruments TI-99/4, Casio PV-2000, and Tomy Tutor. The original TMS9918/9918A outputs NTSC composite video, but there is also a variant for PAL (TMS9928/TMS9928A). All these variants are referred to as Video Display Processor (VDP).
The VDP has its own video RAM, which is separate from the system RAM. It was originally intended for use with 4116 DRAM chips, but these are rare nowadays and also require three different supply voltages, making them more cumbersome to handle.
But luckily I found a simple replacement circuit on Hackaday, based on a static RAM chip and some D-latches that mimics the dynamic RAMs.
The Arduino library works with a slightly modified version of this circuit. It supports all four video modes of the VDP:
- A text mode with 40x24 characters
In Text mode we can choose between 15 background and character colors. All the characters have the same color.
- Graphic mode 1 with 256x192 pixels at 16 colors
In graphic mode 1, colors can only be assigned to groups of 8 symbols each. For example, the characters “0” through “7” or “A” through “G” will all have the same color. This makes it pretty much useless.
- Graphic mode 2 with 256x192 pixels at 16 colors
Graphic mode 2 has the same resolution like graphic mode 1, but every individual 8x8 tile can have two out of 16 colors. This allows the display of bitmapped images. Mode 2 was introduced with the A versions and made mode 1 obsolete.
- A “multicolor” mode with 64x48 pixels at 16 colors
This mode allows to assign an individual color to each of its 64x48 pixels. Because of its “blockiness” it was rarely used, though.
The VDP can display up to 32 sprites at the same time. The sprites can have a resolution of 8x8 or 16x16 pixels. They can be scaled up by a factor of two, which results into a size of 32x32 pixels. Only one out of 15 colors per sprite can be used.”