MDSI Genius Display
The MDSI Genius (or 'TheGenius', 'Genius VHR') display system is one of those things that seems to have left only the vaguest footprints in computing history: a full-page A4 display for IBM-compatible PCs, from the days when a top-end system had a 286 and EGA. The only reason I came across it was because a driver for it was included in the GEM/3 source tree.
The hardware
I don't have one of these cards; my information comes from the GEM driver source tree, disassembly of the Windows 1.04 driver GENIUS.DRV, the Interrupt List, a brochure for the card and a review of it in Volume 6 issue 10 of PC Magazine.
The latter source includes a picture of the original monitor, which looks exactly like an MDA monitor that's been stretched in the vertical direction.
Memory Map
According to the review, there are three modes in which the card can be used:
- In native text mode, the card produces an 80×66 screen. This would match the brochure, which gives the character cell size as 15 pixels high and 9 wide, for a 720×990 pixel resolution. The framebuffer for this is at 0B0000h, as on a real MDA, but would have to be at least 2940h bytes long (the brochure says 16k).
- There is a dual-head mode, in which the top half of the screen shows a 25-line MDA display, and the bottom half the contents of the CGA framebuffer (graphical modes only?)
- Finally, there is the native graphics mode, 728×1008 pixels. Here, the framebuffer is divided into two segments. The first 512 lines live between 0A0000h and 0AFFFFh, the second 496 between 0B8000h and 0C7FFFh. Each line is 128 bytes long, though only the first 91 bytes are displayed. The reason for this slightly idiosyncratic split in the memory mapping is that the text in the MDA framebuffer (at 0B0000h) can optionally be superimposed on the graphic display.
Register I/O
Registers appear to be based on the standard MDA / CGA register set, with the following differences:
03B0h: Select graphics mode
The GEM and Windows drivers write 01h to this port to select the native graphics mode, 00h to return to text mode. They don't appear to do any sort of CRTC programming, which makes me think that perhaps this card doesn't have a reprogrammable CRTC — just a fixed set of timings.
GMC.COM (below) accesses the following bits of this register:
Bit 2: Set with GMC /M. Cleared by mode set or GMC /I. Bits 4-5: Values are: 00: Normal video 01: 640x200 CGA-compatible graphics 10: Reverse video 11: 80x25 MDA-compatible text My guess at the meanings of these bits is: Bit 0: Set to map the full graphics framebuffer into memory. Bit 2: Possibly connected with the '512-character font' that the brochure advertises? Bit 4: Set for CGA-compatible graphics, clear for native graphics Bit 5: Set for reverse video (black text on white). Clear for normal.
03B1h: Written by GMC.COM
GMC.COM writes the following values to this port when selecting video mode:
00h: 66 lines text, or GMC /H 81h: 70 lines text 83h: 82 lines text 90h: MDA-compatible, or GMC /S 93h: 41 lines text My interpretation: Bits 0-1 are character cell height 00: 15 pixels 01: 14 pixels 02: 13 pixels 03: 12 pixels Bit 4 is set to double scanlines. I don't know the purpose of bit 7.
03B4h-03B5h / 03D4h-03D5h: Emulated CRTC
GMC.COM and GMC_ANSI.SYS write to these CRTC registers:
0Ah: Cursor shape and blink rate (as on a real 6845): Bits 4-0: Top scanline Bits 6-5: Blink rate
03B8h / 03D8h: MDA and CGA Mode Control Registers
The GEM and Windows video drivers access these registers when switching in and out of the native graphics mode.
mov dx, 3D8h ;CGA Mode Control mov al, 8 ;Enable display out dx, al mov dx, 3B8h ;MDA Mode Control mov al, 0 ;Disable display out dx, al mov dx, 3B0h mov al, 1 ;Switch to graphics mode out dx, al
and when switching back to text mode:
mov dx, 3D8h ;CGA Mode Control mov al, 0 ;Disable display out dx, al mov dx, 3B8h ;MDA Mode Control mov al, 8 ;Enable display out dx, al mov dx, 3B0h mov al, 0 ;Switch to text mode out dx, al
In other words, to select graphics mode, disable the MDA display, enable the CGA display, and write 1 to 3B0h. To change back, disable the CGA, enable the MDA and write 0 to 3B0h. Windows skips enabling the MDA, and instead relies on a full mode set (INT 10h / AH=0) to re-enable it.
My guess is that enabling the MDA display shows the text framebuffer at B0000h, and enabling the CGA display shows the graphics framebuffer (either in native mode, or in CGA mode). The dual-head mode would then be achieved by enabling both displays simultaneously.
Driver
The Interrupt List documents a number of interrupts provide by VHRBIOS.SYS, a loadable driver which appears to serve as the card's BIOS ROM. It describes the driver as providing functions on INT 10h, including:
- AH=0F0h
- Installation check. Call with BX=0; returns BX=4F4Bh ('OK') if VHRBIOS.SYS is loaded. The Windows 1.04 driver checks that this call works before attempting to set the video mode. It does not appear to make any other calls to VHRBIOS.
- AH=0F1h
- Set reverse video. Call with AL=new video state; bit 5 set for black on white, clear for white on black.
- AH=0F4h
- Get driver version. Returns AX=driver version; AH=major, AL=minor.
- AH=0F5h
- Get vendor ID. Returns AX=4D44h ('MD'), BX=5349h ('SI').
This copyright registration also refers to a VHR_ANSI.ASM, the source code for a driver which (presumably) provides ANSI terminal emulation.
GMC_ANSI.SYS / INS_ANSI.SYS
What appear to be drivers for an MCA version of the card can be found at mpoli.fi. Two drivers are included which appear to be the equivalent of VHRBIOS.SYS: GMC_ANSI.SYS and INS_ANSI.SYS. The difference between them is that GMC_ANSI includes the full functionality of ANSI.SYS, while INS_ANSI (contrary to its name) is a minimal video BIOS with no support for ANSI escape codes.
Of the above calls, both drivers implement only AH=0F0h, but in different ways:
- AH=0F0h (GMC_ANSI)
- Installation check / disable mode changes. Call with BX=0, AL = 0 (enable mode changes) or AL nonzero (disable mode changes). Returns BX=4F4Bh ('OK') if GMC_ANSI.SYS is loaded.
- AH=0F0h (INS_ANSI)
- Installation check. Call with BX=0; returns BX=4F4Bh ('OK').
GMC.COM
GMC.COM is used to select the video mode. Its help screen does not list the full syntax, which is:
GMC {mode{*}}{/options} mode is one of: OFF: Disable Genius card, enable motherboard VGA ON: Enable Genius card, disable motherboard VGA IBM: Select MDA-compatible text mode, 80 x 25 text CGA: Select CGA-compatible graphics mode, 640 x 200 graphics DUAL: Select both of the above modes, displayed one above the other MDS: Select native mode, 66 text lines M41: Select native mode, 41 text lines M70: Select native mode, 70 text lines M82: Select native mode, 82 text lines
If mode is followed by a *, attempts to change the video mode with INT 10h / AH=00h will be ignored until the next time GMC is used.
options are: 0-6: Set cursor blink rate D: Disable CGA-style graphics (implied by selecting MDA or native mode) G: Enable CGA-style graphics (implied by selecting CGA or DUAL mode) H: Write 00h to port 03B1h (single-height text; implied by selecting CGA, DUAL or MDS mode) I: Clear bit 2 of port 03B0h (implied by selecting any mode) M: Set bit 2 of port 03B0h N: Select black on white video R: Select white on black video (implied by selecting DUAL or native mode) S: Write 90h to port 03B1h (double-height text; implied by selecting MDA mode)
John Elliott 18 March 2017