Yamaha V6355D Video Chip
The V6355D is a video chip that emulates CGA and MDA displays. It's used in the Olivetti Prodest PC1 and in standalone video cards like the ACV-1030 video card. According to the data sheet, it can drive CRT monitors or LCD panels. I have only tested it in the PC1 and ACV-1030, in which cases it is always driving a CRT monitor.
vgamuseum.info has a data sheet available, which gives a summary of the chip's capabilities but doesn't describe what the registers do. However the manual for the Zenith Z-180 (pages 103-110) does have a fuller description of the chip's extra registers. My thanks to Simone Riminucci, who maintains a Facebook group for the PC1, for providing me with documentation describing the V6335D.
The technical reference manual for the TM-3034 TurbosPort computer includes a register-level description of the similar (but not compatible) V6366, which can provide insight into the designers' choices.
Note that the behaviour of the chip may be different in different systems, depending on the video card it is on. For example, the ACV-1030 has DIP switches which allow the type of monitor in use to be selected.
Registers
Emulation of the 6845 CRTC is partial - video is output at fixed timings and writes to CRTC registers 0-9 have no effect (the PC1 BIOS doesn't even bother to program them.)
The usual CGA mode control register at port 0x3D8 is extended to support two extra modes:
-------Mode register bits-----
Mode 6 5 4 3 2 1 0
--------------------------------------------------------
Text 40×25 0 blink 0 enable b/w 0 0
Text 80×25 0 blink 0 enable b/w 0 1
Graphics 160×200 1 n/a 0 enable b/w 1 0
Graphics 320×200 0 n/a 0 enable b/w 1 0
Graphics 640×200 b/w 0 n/a 1 enable b/w 1 any
Graphics 640×200 16 col 1 n/a 1 enable b/w 1 any
--------------------------------------------------------
Bit 7 is supposed to put the display controller into a low-power standby mode.
I have not been able to activate the two extra modes (160×200 and 640×200×16) on my PC1 or ACV-1030. The V6366 manual says that on that chip, the extra bits in the CGA mode control register can be locked out, and it's possible that the same thing has happened here.
In addition to the usual CGA registers, the V6355D has a bank of registers accessed through ports 0x3DD (register select) / 0x3DE (write data). According to the Z-180 manual (which matches my own observations), these extra registers are write only.
The selected register auto-increments after each write. So a sequence such as:
outportb(0x3DD, 0x42); /* select register 0x42 */ outportb(0x3DE, 0x05); /* write to register 0x42 */ outportb(0x3DE, 0x00); /* write to register 0x43 */
can be used to set multiple registers.
NB: When I tried to use the autoincrement to program a mouse pointer shape, I found that the same code worked reliably on the Prodest PC1 but led to random corruption on the ACV-1030. On the latter it proved necessary to select each register manually before programming it.
The registers thus accessed are:
0x00 - 0x1F: Mouse pointer AND mask.
Registers 0 and 1 define the first line, 2 and 3 define the
second line and so on. Bit 7 of the even-numbered register is
the leftmost pixel, bit 0 of the odd-numbered register is the
rightmost.
0x20 - 0x3F: Mouse pointer XOR mask.
Both pointer masks are initialised to 0 by the Prodest PC1 BIOS.
0x40 - 0x5F: Palette registers. These apply only to composite output (since
CGA digital output doesn't support multiple colour levels.
Even-numbered registers hold the red value in bits 0-2;
odd-numbered registers hold blue in bits 0-2, green in bits 4-6.
0x60: Mouse pointer X position - bit 0 is high bit, bits 7-1 unused.
0x61: Mouse pointer X position - low 8 bits
0x62: Not used
0x63: Mouse pointer Y position
The mouse pointer is positioned on a 512 × 256 grid, of
which 16 <= X <= 335 and 16 <= Y <= 215 correspond
to the visible screen. That is, the pointer is always positioned
using 320×200 resolution. The pointer starts at (0,0) which
is completely off the visible screen, so will not be drawn unless
it is moved onto the screen (and has its bitmap and other
registers set).
0x64: Bits 0-2 control mouse pointer visibility:
Bit 0: Pointer (if drawn) blinks
Bit 1: Apply pointer AND mask
Bit 2: Apply pointer XOR mask
Bits 3-5: Vertical adjustment (number of rows to move the screen up)
Bits 6,7: Reserved, leave as 0.
0x65: Monitor control register.
Bits 0,1: Screen height
0 => 192 lines
1 => 200 lines
2 => 204 lines
3 => 64 lines (LCD output only)
Bit 2: Display is 512 or 256 pixels wide rather than 640 / 320.
Text will output in 64 or 32 columns rather than 80 / 40.
Bit 3: Monitor type. 1 => PAL or SECAM (50Hz refresh),
0 => NTSC (60Hz refresh). On the PC1 the BIOS
initialises this to PAL/SECAM; the supplied utility
CRT.COM changes it to NTSC.
Bit 4: Set to use MDA monitor. I tested this with a PC1 and an
MDA-compatible monitor, with indifferent results; the
monitor synced to the signal (when monitor type was set
to NTSC) but with grey background, blurred text and
visible retrace lines.
Bit 5: Set to use LCD panel.
Bit 6: Set to use static RAM for video RAM. If activated on
a system like the PC1 (which uses dynamic video RAM)
the screen will display solid 0xFF bytes, and the
contents of video RAM may be corrupted as they are no
longer being refreshed.
Bit 7: Pointing device type: 0 => light pen, 1 => mouse.
The PC1 BIOS and utilities always set this to 1.
0x66: Display Control Register.
Bits 0-1: Adjust LCD vertical position (multiply by 2 to get offset)
Bits 2-3: Select LCD driver type:
0=> Dual, 1 bit serial
1=> Dual, four bit parallel
2,3=> Dual, four bit intensity
Bits 4-5: LCD driver shift clock frequency
Bit 6: Text attributes are treated as MDA rather than CGA, and
displayed in greyscale (though the screen border remains in
colour)
Bit 7: If set, underlines are drawn on characters with blue
foreground.
0x67: Configuration Mode Register.
Bits 0-4 adjust horizontal position of display.
Bit 5 adjusts LCD control signal period.
Bit 6 enables 4-page video RAM (if present)
Bit 7 enables 16-bit bus operation. If set on a system with
an 8-bit bus, results in the controller only being able
to access odd-numbered bytes of video RAM.
0x68: Mouse pointer colour.
The low 4 bits control which RGBI lines the AND shape masks off
(bit 0 => blue, bit 1 => green, bit 2 => red, bit 3 => intensity)
They would normally be set to 0, which causes the AND sprite to
mask out everything it passes over.
The high 4 bits control which RGBI lines the XOR shape toggles.
These would normally all be set to 1, but can be changed to give
the pointer a different colour.
The PC1 BIOS initialises this register to 0x0F, meaning that the
pointer is not drawn.
0x69: Control data register. Documentation is obscure.
On systems with 64k video RAM, port 0x3DF is used to select one of four 16k pages. I have not found documentation of the exact method used, since the Z180 did not support this configuration.
John Elliott 7 May 2025