CGA, Hercules and similar things

Here is my late tribute to the first crap graphic displays for the PCs. Those old video cards have in common the use of little video memory for graphics (it was expensive at the time !) placed at base address B800h or B000h.

CGA

It is one of the two first graphics board for the PC. Its base address was B800h and its standard resolutions are 320x200 x 4 colours and 640x200 monochrome.
The only tweaked mode I'm aware of is a bewildering 160x100 x 16 colours mode, used in the Styx game, the CompuShow picture viewer and in few demos.
Normally the 160x100x16 mode doesnt work on EGA and VGA boards (might work with some of them forcing a hardware CGA emulaton) and some of the 640x400 "SuperCGA" cards (such as the Olivetti M24 one) fail to display some colors, replacing them with the monochrome text style attributes.
There is a lot of interesting informations here: http://www.seasip.info/VintagePC/cga.html



TANDY graphics card

I know very little about it. It is somehow half-way between the old display cards world and the EGA/VGA one. It uses the B800h base segment for the low resolution modes, and A000h for its highest resolution (640x200 x 16 colours).



"Super" CGA boards (640x400 mode)

Some old CGA based cards wanted to give both the benefits of the color and the high resolution modes.
This was normally obtained by adding an extra 640x400 monochrome graphics mode and a better text quality (often the monochrome style text attributes were supported, too).
The computers adopting this sort of "super CGA" concept I'm aware of are:

Computer BIOS display Mode
Olivetti M24 and M240, and AT&T 6300 family 40h, 48h
Olivetti Quaderno 40h, 48h, C8h
Compaq portable 386 (and family) plasma display 40h
ABC Bicom (B240i, B260i, SL60, SL80..) 4Ah
Toshiba 3100 74h
Toshiba 3200 and similar plasma display models (newer BIOSes) 40h
DEC VAXmate D0h

Probably many of the computers using the CT82C426 extended CGA controller are capable of such extended mode, but the BIOS support could not be present. I investigated a bit on the Zenith Supersport and the Victor Technologies notebooks: officially they do not seem to be able to work in 640x400.

In the above cases the video BIOS hook code to activate the extra 640x400 mode varies, but the video memory was always placed at B800h base address and it always had a two-pass interlaced addressing map.
In very few cases the base video memory is at address B000h:

Computer BIOS display Mode
Olivetti Quaderno C8h
TANDY 2000 09h




HERCULES MONOCHROME


It was the "professional choice", at the very beginning. It didn't have colour, but the text and the graphics definition was much more accurate.
It is quite flexible, but the graphics modes aren't supported directly by BIOS (unless you don't install a software extension, such as the one used by "Derive").
The Hercules card is even capable of two frame buffers, the first one placed at B000h and the second one at B800h.
There is a lot of interesting informations here: http://www.seasip.info/VintagePC/mda.html

As far as I know very few people tried to bring this card up to its limits, probably because of the risk of damaging the video monitor with wrong frequencies, so It was commonly used at its "default" resolution of 720x348, placed at address B000h.   The parameters table used to set the 6845 CRT chip was normally something like:

    35h, 2dh, 2eh, 07h, 5bh, 02h,
    57h, 57h, 02h, 03h, 00h, 00h,

I'm aware of two programs making use of tweaked modes, though:

- A peculiar version of "GWBASIC" I've seen in bundle with a Hunday 286 clone, implementing the BASIC graphics mode 3 on hercules boards (page B800), using this table:
    36h, 28h, 2ch, 08h, 68h, 02h,
    64h ,64h, 00h, 03h, 02h, 01h

- An earlier C64 emulator developed in germany (author unknown).
    31h, 28h, 29h, 08h, 6dh, 00h,
    64h, 67h, 02h, 03h, 00h, 00h

- Yet another table suggested by Sinisa Mikor in a forum.
    34h, 28h, 2Ah, 47h, 69h, 00h,
    64h, 65h, 02h, 03h, 00h, 00h

These gems use a very interesting 640x400 graphics mode, perfectly hooked by the standard Hercules monitors !
Many CGA emulators were written for the Hercules card, all based on the same mechanism: the memory at B800h acts as a buffer for the application, while a clock-driven interrupt copies the picture to B000h, adapting its resolution from 640x200 to 720x348; the color modes are dithered.
- Sinisa Mikor suggests also this table for a full CGA emulation (perhaps a CGA capable monitor is required, though..)
    6Eh, 28h, 2Eh, 07h, 67h, 0Ah,
    64h, 65h, 02h, 01h, 00h, 00h


My own experiments on the tweaked 640x400 mode

As soon as I discovered this incredible featured I realized it was possible to write CGA and AT&T emulators in a totally new manner.
Since the Hercules card could be set natively to work as if it was a "Super CGA" I managed to realize a much simpler emulator with incredible performances..
The sources:
CGA400.ASM is the source of the CGA emulator above. It is not just an emulator, it maps the memory where it is expected to be !
640HERC.ASM is an Olivetti M24 / AT&T 6300 mode emulator for the Hercules graphics card, it uses the tweaked 640x600 mode and itercepts the 'init graphics mode' BIOS call. On the other side it is not able to display text, but it is enough to see windows run with a better fitting resolution !