Dual-Head Operation on a Vintage PC
This document is aimed at PCs too old to have a PCI bus. I don't cover getting a dual monitor system by use of multiple PCI/AGP cards. If you do have multiple PCI video cards, there's a utility at asm32.com (in the 'Legacy' section) which allows a PCI card to emulate a secondary MDA card under DOS.
In the Beginning
The original IBM PC was supplied with a choice of Monochrome (MDA) or Colour (CGA) graphics cards. These cards use the following system resources:
|Card||Memory usage||I/O Ports|
|MDA||B0000 to B0FFF||3B0 to 3BB|
|CGA||B8000 to BBFFF||3D0 to 3DF|
Since these areas don't overlap, the two cards can both be put in the same system. The DIP switches on the motherboard select which display will be used as the primary display (the one used at system startup).
For the purposes of this discussion, Plantronics cards should be treated just like CGA.
Hercules cards are a superset of MDA, and can usually be treated the same way. The card will need to be switched into 'half graphics' mode, which stops it trying to use memory above B8000h. Some Herc cards don't have this mode; they are unsuitable for use in a dual-head system.
For the purposes of dual-head operation, a Hercules InColor card can be treated just like a mono Hercules card.
When IBM invented the EGA, they gave it a setting which allowed it to change which I/O addresses it uses. The EGA BIOS associates the two settings with monochrome and colour modes:
|Mode||Memory usage||I/O Ports|
|Mono text||B0000 to B7FFF||3B0 to 3BB, 3C0 to 3CF|
|Mono graphics||A0000 to AFFFF||3B0 to 3BB, 3C0 to 3CF|
|Colour text||B8000 to BFFFF||3C0 to 3CF, 3D0 to 3DF|
|Colour graphics||A0000 to AFFFF or B8000 to BFFFF||3C0 to 3CF, 3D0 to 3DF|
In practice, this means that while an EGA is in a monochrome mode, it allows a CGA card to be present; similarly, when it's in a colour mode, an MDA can be present. Depending on the EGA type, it may need configuring with switches, jumpers or a firmware utility so that it starts up in the correct mode.
Maybe you could get an EGA 16-colour graphics mode to coexist with a CGA card by manually programming the registers. I haven't tried.
Note that you can't have two EGA cards in a system, even if one is colour and one is mono, because they both use the I/O range 3C0 to 3CF, and they both have BIOS ROMs at 0C000h.
VGA is pretty much a superset of EGA, and has the same ability to use different memory ranges for mono/colour displays. The ATI appnote (below) suggests that if a VGA card is present, it must be the primary display. I have managed to get a Paradise VGA card working as the second head of a system with CGA on the motherboard, but it can't (or won't) do 640x480 mono mode, only 640x350.
IBM Professional Graphics Controller
The PGC is a rather unusual colour card (or, strictly speaking, trio of cards). There are two possible ways it can be used - either with CGA emulation turned on, or off.
With CGA emulation on, the PGC can be used in tandem with a mono card in the usual way. With CGA emulation off, you can have a triple-head system - mono, colour and PGC. Note, however, that any VGA or EGA card sharing with a PGC cannot have a ROM larger than 24k - the PGC uses memory at 0C6000h.
IBM 5271 (3270 PC)
The display card in this PC (I've never seen its name abbreviated, but it would be a 3270PCDA) occupies both CGA and MDA address space (plus bits of the VGA framebuffer). The only possible dualhead configuration would be to have a PGC with its CGA emulation turned off. You could end up with a PC containing 5 full-length display cards!
The IBM 8514/A card (8514 is the monitor; 8514/A is the card) can coexist with a VGA. This isn't quite the same as the other dual-head configurations because of the very different design of the 8514/A. In normal use the VGA acts as a slave of the 8514/A, and a special driver is needed to use them separately.
Texas Instruments Graphics Architecture (TIGA)
I can find almost no information on how these work, but some sources say that they can coexist with other cards in a similar way to the 8514/A.
To have a dual-head system, you therefore use one colour card and one mono (or Hercules InColor, or 8514/A) card. If your PC has video hardware on its motherboard, that will usually count as one of the cards; if it can't be disabled then it certainly will.
If both cards are on the ISA bus, then they need to be both 8-bit or both 16-bit; since all known CGA, MDA and Hercules cards are 8-bit this means that both cards must be 8-bit. The ATI appnote explains why. This restriction may not apply if the VGA card uses MCA, VESA, PCI or AGP; I haven't tried.
IBM's manual warns that on an original PC with both MDA and CGA, the MDA card must be set as the primary display (so that the BIOS initialises it) or the mono monitor may be damaged. How much of this applies to non-IBM BIOSes, non-IBM mono cards and non-IBM monitors, I don't know.
How to use a Dual-Head system
The main uses for having a dual-head vintage PC (other than 'because I can') are:
- Debugging programs. The debugger runs on one display and the (usuall graphical) program being debugged is shown on the other.
- Using a high-quality mono monitor for text-processing tasks, and switching to a low-quality colour display or television for playing games.
If you are using an extended memory manager such as EMM386, you need to make sure that it isn't using the video RAM for its own purposes. Check for options such as "INCLUDE=B000-B7FF" in the EMM386 line in CONFIG.SYS, and remove them if they are present.
Switch between the two monitors using MODE commands (MODE CO80 for the CGA, MODE MONO for the MDA). Under DOS Plus, you can also use DEVICE CONOUT:=CO80 or DEVICE CONOUT:=MONO.
Borland's Turbo Debugger can use two monitors. See this USENET posting for setup instructions.
RHIDE supports dual-monitor debugging.
GEMSID can be used to debug a GEM program on a dual-head system. To do this:
- If only one of your cards can do graphics, set it as the secondary display. For example, if your system has MDA and CGA, then set CGA as secondary and MDA as primary.
- Set up GEM to use the correct driver for the secondary display.
- Run GEM and start GEMSID. Type YME. The application will be shown on the secondary monitor; the debugger will display on the primary.
GEM/1 and GEM/2 (but not later versions) can load multiple display drivers. If both your cards can do graphics (eg: CGA and EGA mono, or VGA and Hercules) then you could add entries for both drivers to ASSIGN.SYS. The entry for the primary screen should start 01; for the secondary, it should be 02. This isn't much use unless you can find a program which supports both screens.
Alternatively, set up the second driver as number 11 or 21 (ie, as a plotter or printer driver) and use OUTPUT.APP to print to it.
In version 3.x in 386 enhanced mode, there is a 'DualDisplay' option in the [386Enh] section of SYSTEM.INI. The documentation is not clear about what it should be set to if there are actually two video cards in the system; the consensus is that it should be 'DualDisplay=on'.
The CodeView debugger supports dual-monitor operation. Set up your system so that the secondary display is the monochrome one. Then start CodeView with the /2 option. (On a system with a VGA and an 8514/A, use /8).
The SoftICE/W debugger also supports these configurations. To use it with a secondary monochrome monitor, add the string
INIT "ALTSCR ON; X;"to the WINICE.DAT file. If you have a VGA+8514/A setup, SoftICE will handle this automatically.
There are at least two kernel patches for dual-display support under Linux. One (mda) allows a secondary MDA display as a separate device (/dev/mono) to which system logs (for instance) could be sent. The other (multimon) supports either monitor being used as the system console.
If the secondary display card is a Hercules, David Given's site (below) describes how you can get X to work on it.
- ATI Technical Note 044 describes possible valid combinations of video cards.
- ATI describe how to set up their 8514/A card.
- DUALMON (scroll down to find it) allows DOS to direct output to both displays in a dual-head system.
- The Linux console patches include a multiple-monitor patch for Linux 2.0.36.
- David Given describes how to run X on a secondary Hercules display under Linux.
John Elliott 24 April 2011