Vintage PC pages
Home -> Vintage PCs -> Olivetti Prodest PC1

The Olivetti Prodest PC1

Hardware

The Olivetti PC1 is an XT clone, probably intended for use as a home computer, manufactured in the late 1980s.

Its specification and form factor are similar to the Amstrad PC20 (aka Sinclair PC200) or Schneider Euro PC:

[PC1 with one-slot expansion unit]

The following connectors are on the back panel:

There is no internal expansion. There is a slot on the right-hand side of the case, into which an external expansion unit can be plugged (illustrated above). According to the manual, the pinout of this slot is ISA-ish, but with the following lines missing:

There is a further connector on the underside of the computer (apparently it's supposed to have a plastic cover, but this is missing on my PC1). This is a 34-way socket which allows an external floppy drive to be connected. Beside the connector is a switch. Moving the switch to the left disables the second internal floppy drive, so that an external drive can be used instead. There is also a slider on the underside which is a volume control for the internal speaker.

Although the video hardware behaves like CGA, I have not been able to get my PC1 to produce a stable picture on a CGA monitor. The PC1 may be defective; or it may need an EGA monitor.

BIOS

The PC1's BIOS is in a 16k ROM, which is mapped into memory at 0xFC000 (it repeats at 0xF0000, 0xF4000 and 0xF8000). In structure it appears to be a cut-down version of the ROM from the Olivetti M24 (aka AT&T 6300); I'll point out similarities and differences. My thanks to Knut Roll-Lund for providing information on the M24 BIOS.

At the start of the ROM is a table of entry points, possibly for expansion ROMs to use.

FC000:   DB      46h	;'F'	;On the M24, this is a ROM checksum
FC001:   DB	 49h	;'I'	;On the M24, ROM revision number
FC002:   DW      offset of master data table
FC004:   entry   Far subroutine to print string at DS:SI
FC008:   DD      V40 NMI handler. On the M24, this was 
		 a far subroutine to print CR/LF.
FC00C:   entry   Far subroutine to print a ':'
FC010:   entry   Far subroutine to print as hex the DWORD value DS:AX
FC014:   entry   Far subroutine to print as hex the WORD value AX
FC018:   entry   Far subroutine to print as hex the BYTE value AL
FC01C:   entry   Far subroutine to print as hex the NIBBLE value AL
FC020:   entry   Far subroutine to print as decimal the WORD value in AX
FC024:   entry   Far subroutine to print as decimal the WORD value in AX,
                 with BX = number of columns to right-align it in.
FC028:   entry   Checksum 16k of memory starting at DS:SI. Returns AH=checksum
                 with flags reflecting AH.
FC02C:   entry   On the M24: Test the real time clock
FC030:   entry   Test 512k of RAM starting at DX:0
FC034:   entry   Hard drive initialisation
FC038:   entry   No-op. On the M24, format hard drive (also a no-op).
FC03C:   DW      offset of 'Resident Diagnostics' ASCIIZ message
FC03E:   DW      0
FC040:   RS      20h     ;ASCIIZ copyright message

The supplied PC1 utilities use the word at FFFFD as an installation check. They require it to equal 0FE44h (machine type XT, subtype 0x44).

Memory variables

The PC1 BIOS uses the following locations in the BIOS data segment at 40h:

0018:	BYTE	Keyboard status. On a normal XT, the low 4 bits of this
		are unused. On the PC-1, they have these meanings:
			Bit 0 set for alternative keyboard layout.
			Bit 1 does not appear to be used.
			Bit 2 set while handling scancode 0xFF.
			Bit 3 set if pausing.
0084:	DWORD	pointer to BIOS master data
0088:	BYTE	Not used on the PC-1. The M24 uses it to support an optional
                Z8000 coprocessor.
		(nb: Subsequent bytes do not appear in the M24 BIOS listing).
0089:	BYTE	Last value written to port 0x68. Low bit seems to be 0 to
		enable the built-in CGA chipset.
008A:	BYTE	BIOS flags:
			Bit 0 set for Turbo mode
			Bit 1 set if video hardware has been initialised
			Bit 2 set if expansion unit is present. If more
			      than 512k RAM is present, or there is an MDA,
			      or there is a ROM between 0xC0000 and 0xEFFFF, 
			      this bit will be set.
008B:	BYTE	Used by keyboard handler
008C:	BYTE	0x40 if video mode 0x40 selected, else 0.
008D:	BYTE	The number of the expansion board causing an I/OCHECK eror.
008E:	BYTE	Used by hard drive controller.
008F:	WORD	The 'real' equipment word - returned by INT 0x11. On an IBM
		BIOS (or an M24) the word at 0040:0010h would be returned.
0091:	BYTE	The last value returned by a read of port 0x62.

The V40 chip, DMA, and the Non-Maskable Interrupt

The V40 processor, like the 80188 it emulates, contains a DMA controller which is not compatible with the 8237 controller used in IBM-compatible PCs. A USENET posting explains that an NMI handler could be used to simulate the PC DMA controller using the onboard controller. This appears to be what the PC1 BIOS does.

The NMI vector for this is at address FC008 rather than 00008. I don't know whether the support chipset ensures that control passes to this vector, or whether it's done by programming the CPU itself.

As well as translating DMA requests, the handler also emulates ports 61h and 62h (Keyboard controller ports B and C).

Display

The PC1's onboard display chipset emulates CGA. Like Amstrad's PC1512, it omits most of the 6845 CRTC which you'd find in a real CGA or a true emulation thereof. The BIOS doesn't even bother to program the first 10 CRTC registers. You can switch between video modes just by tweaking bits in the mode control register (0x3D8).

Judging by the BIOS ROM, there seems to be an additional video controller of some kind at 0x3DD (address) / 0x3DE (data). If bit 1 of 0040:008A is zero, then it is set to 1 and 106 bytes of data are written to this controller.

Video Modes

The BIOS supports the standard CGA modes 0-6. It also responds to requests for mode 7 (this comes out the same as mode 3) and mode 64 (this comes out the same as mode 6, but can be set to use a different font for the second 128 characters). The mode number passed to INT 0x10 function 0 is not range-checked; other values will cause junk data to be written to the CGA controller.

Mode 64 (0x40) is a vestige of the M24. On the M24, though, it's a 640x400 mode.

Master Data Table

This table can be used to redefine the font used in CGA graphics modes. The BIOS gets its address from the DWORD at 0040:0084. The default version is in ROM, but a RAM version could doubtless be created.

+0      DW      16h             ; Length of this table
+2      DD      BIOS:C467	; Keyboard layout
+6      DD      BIOS:FA6E       ; -> Font for characters 0-127 in modes 4-6
+A      DD      BIOS:0000       ; Never used. On the M24, this is the address
				; of an 8x16 font containing characters 0-127.
+E      DD      BIOS:0000       ; -> Font for characters 128-255 in mode 
				; 0x40. (modes 4-6 use INT 0x1F for this).
				; On the M24, this points to the second
				; half of the 8x16 font.
+12     DD      0000:0000       ; Never used. On the M24, this is described
				; as 'soft font utility offset/segment'.

(Note that the PC1 ROM is hardcoded to use its internal keyboard layout; it doesn't use this table to translate keys. So the table can't be used to redefine the keyboard).

Immediately before this table are three other hardware configuration tables:


-10	DW	03BCh		; LPT port on mono card
-E	DW	0378h		; LPT port on motherboard
-C	DW	0278h		; LPT port on expansion card
-A	DW	0		; No LPT4

-8	DW	52h		; [M24] RS232 SCC channel B
-6	DW	50h		; [M24] RS232 SCC channel A

-4	DD	0		; On the M24, this is the address of a 
				; function which passes control to the Z8000 
				; coprocessor.

Font ROM

The CGA font ROM contains two fonts. The first is the standard codepage 437 font, and this is the one that is (as far as I can see) always used. The second appears to be designed for displaying Teletext; it's got top and bottom halves of double-height characters, and both contiguous and separated block graphics.

[CGA font]

Keyboard

In hardware, the keyboard mainly has XT-like features, but with some extensions. For example, the BIOS controls the LEDs by writes to port 0x60 (bits 0-2 select the LEDs, bit 7 is 1 for on and 0 for off).

The keyboard layout table at F000:C467 has 4 words per key (respectively: unshifted, shift, ctrl, alt). The high byte is used in the UK layout; the low byte in an alternative (bit-paired) layout. Bit 0 of byte 40:18 selects which layout is used.

Key tokens between C0 and D8 have the following meanings:

C0
Insert
C1
Caps Lock
C2
Num Lock
C3
Scroll Lock
C4
Alt
C5
Ctrl
C6
Left Shift
C7
Right Shift
C8
Ctrl-Alt-Del
C9
Ctrl-Break
CA
Pause
CB
Print Screen
CC
Control-@
CD
Ignore key
CE-D7
ALT + keypad number 9-0
D8
SysRq

The layout table actually has entries for 103 keys, though only keys up to DEL are present on the keyboard. DEL is key 0x53; the subsequent entries are:

54
SysRq
55
Print Screen
56
Pause
57
Enter
58
Left Arrow
59
Down Arrow
5A
Right Arrow
5B
Up Arrow
5C
Break
5D
Break
5E
Num Lock
5F
Grey /
60-67
Ctrl+F1 - Ctrl+F8

The extra key entries (and the entire alternative keyboard map) appear to be for compatibility with the M24. This has two alternative keyboard layouts ("IBM" and "deluxe"). The M24 BIOS contains a similar keyboard table at CC67h.

Turbo

By default, the machine comes up in turbo mode (8Mhz). However, if you press a key during the RAM test, it will ask whether to use turbo or normal (4.77Mhz) mode. Once turbo mode has been set it cannot be changed.

The sequence to turn turbo mode off is:

	OUT 0xFFF5, 0xFF
	OUT 0xFFF6, 0x0F
	OUT 0xFFF2, 0x84

(at cold boot, these are initialised to 0xCC, 0x0F and 0x8D respectively).

Links

The manual and boot disc (Spanish)


John Elliott 12 Feb 2007