I'm considering creating a retro system but without requiring the sacrifice of any retro machine in order to get parts. The TMS9918 chip seems the only "generic" retro graphic chip, all other chips are system specific, it seems unfortunately.

By connecting video out of one chip to video in to the next chip, it should be possible to create multiple layers of graphics, getting better graphics.

Another possibility is to use a passive resistive divider (or a more advanced analog filter) to change the intensity of the video signal and alter colours, so that we can get more than 16 colours in total, for example we could have a system with 2 chips would be dedicated to darker colours and 2 other chips dedicated to light colours.

  • ... it sounds like you've answered your own question?
    – Tommy
    Oct 2, 2017 at 20:02
  • 3
    At the specs of a 9918, a higher resolution might be more desirable than finer colour grades. Maybe take a look at the 9958 as it's improved in many ways, while still compatible. Or go for the Thomson 936x Series controllers, where planes and colorgeneration is external anyway. They are early 80s machine independant chips with next to unlimited colour levels.
    – Raffzahn
    Oct 2, 2017 at 21:39
  • 1
    If want to create a really retro video graphics system, you can build one out of TTL chips: counters, shift registers, comparators, and some logic. Those are the parts that Lancaster, Felsenstein and Woz (et.al.) used. The Amiga graphics system emulator boards were built out of those (74C equivalents) plus some PALs.
    – hotpaw2
    Oct 3, 2017 at 0:08
  • 4
    Why not use a micro-controller like the Propeller that can emulate the TMS9918? The benefit is that it has enough on-board RAM for 16K which matches what the '9918 had. Plus, you won't have to deal with DRAM or converting DRAM to SRAM for the '9918. However, if you're dead-set on using pure vintage (which, I certainly understand) then I'd suggest using ONE TMS9918/28 and get that working before any advanced stuff like dividers and genlocking, etc.
    – cbmeeks
    Oct 3, 2017 at 14:40
  • 1
    @Raffzahn Thanks for the info! I guess I'll consider asking more about selecting a chip in a different question since this is a different question than chaining up chips, the topic of this question.
    – Bregalad
    Oct 4, 2017 at 13:15

2 Answers 2


Assuming that the chip starts in a well-defined state upon reset, an alternative would be to use the 9928 rather than the 9918; the primary difference is that you get component outputs rather than composite. You also lose video in, so each would be running individually. But the option it brings is running three of them simultaneously and e.g. taking only Y from each to form the triplet of R, G, B.

It's not completely scientific, as these things often come from consensus wisdom of visual colour matching rather than from hardware analysis, but I grabbed an image of the TMS palette from the web, desaturated by converting to luminance value, and sampled the results. Sorted into order and divided into close tiers as per the unscientific nature of the experiment, I got potential Y outputs of:

205 204 199 
190 183 
134 130 
126 125 

So I make that probably ten usable levels of output per channel — the hypothetical machine would support 1,000 colours.

Have them sit at the same addresses, but add bus logic so that you can enable or disable any combination of them and you could even save time by pushing the same graphics to each, then diverging for a palette set.

As to your resistor network idea, that's approximately how the SAM Coupé's Kaleidoscope add-on works. One programmatically sets a multiplier of video levels, in 256 steps. It's a terrible implementation so in practise it's often hard to see the difference, but in principle one puts an ordinary image on screen, then runs a busy loop on the CPU to race the raster (or do it once per scan line, that being the resolution of interrupts), tweaking output levels in much the same way as you might dynamically swap palettes. A user without a Kaleidoscope just seems the normal image.

On the one hand, if you could automate that then it might be a workable solution. But on the other hand, if you are willing to create a circuit that can grab a value from memory and then transcribe it into an analogue level, you should probably just use a 6845 and implement the complete colour output yourself. With one of those you programmatically set timing, then it gives you current pixel address to output plus information about the correct placement of syncs. So all you need do is grab the value indicated and output, using whatever size of source data and mapping to colours you desire.

  • The Kaleidoscope modifies RGB signals though, I don't think you can as easily linearly combine the composite outputs of two TMS9918 chips as the colour is QAM modulated. I think the idea of using a CRTC like the 6845 is the way to go you want better colour or resolution than a TMS9918.
    – user722
    Oct 3, 2017 at 17:41
  • @RossRidge I was still thinking of the 9928 and its component outputs with the Kaledoscope comments. Obviously you can scale those channels before they reach the colour encoder and get expected results. It strikes me you could scale composite, but you'd desaturate simultaneously with making things darker, and you'd have to go to some effort not to move the sync or blanking levels, or affect the colour burst.
    – Tommy
    Oct 3, 2017 at 17:44
  • 1
    "Have them sit at the same addresses, but add bus logic so that you can enable or disable any combination of them and you could even save time by pushing the same graphics to each, then diverging for a palette set." So you're suggesting something similar to how EGA or the planar modes in VGA work?
    – ssokolow
    Apr 25 at 3:45

Yes, the datasheet explains how to do it in section 3.5.

You need to share the clock and reset circuit. The two VDPs will then stay synchronized in an open loop (i.e. they’re both just counting cycles on XTAL, there’s no synchronization logic other than reset).

You need separate VRAM and CPU control. A “video matching circuit” between COMVID#0 and EXTVDP#1 is not provided. VDP#1 will need its External VDP Enable bit, and also set its background color to transparent.

Then you will get almost double the video display processing power: sprites1, FG1, sprites0, FG0, BG0. The two VDPs will not be able to check for sprite collisions with each other.

You must log in to answer this question.

Not the answer you're looking for? Browse other questions tagged .