The Olivetti Prodest PC1
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:
- System unit contains motherboard, keyboard, power supply and floppy drives.
- 512k RAM.
- CPU: NEC V40 (80188-compatible).
- One or two floppy drives.
- XT-style keyboard (82 keys).
- Integrated CGA-compatible video. Allegedly can output to TV or monitor.
The following connectors are on the back panel:
- Video 1: 8-pin DIN; can output to a TV or a composite monitor. (Pinout)
- Video 2: 9-pin D (same pinout as CGA/EGA)
- Mouse: 9-pin D. This looks like a serial port, but isn't — it's for a quadrature mouse (or a joystick); similar to the PC1512 mouse, but with a different pinout. (Pinout)
- Serial: 25-pin D. Apparently it doesn't use the standard pinout.
- Parallel: 25-pin D.
- Audio: 3.5mm jack.
- Reset button.
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:
- B05: -5v
- B06: DRQ2
- B07: -12v
- B21: IRQ7
- B22: IRQ6
- B26: DACK2
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.
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).
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 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).
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.
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.
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.
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.
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:
- Caps Lock
- Num Lock
- Scroll Lock
- Left Shift
- Right Shift
- Print Screen
- Ignore key
- ALT + keypad number 9-0
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:
- Print Screen
- Left Arrow
- Down Arrow
- Right Arrow
- Up Arrow
- Num Lock
- Grey /
- 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.
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).
John Elliott 12 Feb 2007