The device drivers built into MS-DOS and FreeDOS can only access hardware which is compatible with the hardware of the original IBM PC. In the case of the serial port this means that it must be backwards compatible with the 8250/16450 and, what later became the standard, the 16550A. Modern operating systems require driver software to be written for any hardware before it can be utilised. When a manufacturer develops a new UART chip to be used to provide a PC serial port any differences from the specification of the 16450/16550A can be hidden within the driver. This can become a problem when these UART chips are used with MS-DOS or FreeDOS as I have found when testing PrtAdd and StagView.
It has been necessary for me to modify my serial port handling code to work around these differences and I have also created a DOS utility PrtList which requires PrtAdd to be run first and lists the serial and parallel ports on a PC showing the type of each.
Super I/O, South bridge ICs and ISA cards
These ICs will normally provide serial ports which are completely compatible with either the 16450 or the 16550A.
PCI/PCIe expansion cards
Please note that if you use a PCI/PCIe serial port card you will need to obtain the I/O address and IRQ no. from PrtAdd and provide these values to the DOS software.
Manufacturer | IC | Compatible with | FIFO size | Extended features | Multi-function | Re-mappable | Design errors | Notes |
Brainboxes | BB16PCI958 | 16C750 | 64 | No | No | |||
Exar | 17V258 | 16550A | 64 | No | No | (X) | ||
17V358 | 16550A | 256 | No | No | (X) | |||
MOXA | MU860 | 16C650 | 128 | No | No | |||
NetMos/MosChip/ASIX | NM9835 | 16550A | 17 | h/w flow ctl | No | Yes | TEMT bit | (1) |
NM9845 | 16550A | 17/33 | h/w flow ctl | No | Yes | TEMT bit | (1)(9) | |
MCS9865 | 16C950 | 253 | Yes | Yes | (2)(3)(6) | |||
MCS9900 | 16C950 | 253 | Yes | No | (2)(3)(6) | |||
MCS9901 | 16C950 | 253 | Yes | No | (2)(3)(6) | |||
MCS9922 | 16C950 | 253 | Yes | No | (2)(3)(6) | |||
AX99100 | 16C950 | 253 | Yes | No | (2)(6) | |||
Oxford Semiconductor | OX16PCI952 | 16C950 | 128 | Yes | No | (4)(8) | ||
OX16PCI954 | 16C950 | 128 | Yes | No | (8) | |||
OX16PCI958 | 16C950 | 128 | No | No | ||||
OXmPCI952 | 16C950 | 128 | Yes | No | ||||
OXuPCI952 | 16C950 | 128 | Yes | No | ||||
OXuPCI954 | 16C950 | 128 | Yes | No | ||||
OXPCIe952 | 16C950 | 128 | Yes | No | (7) | |||
OXPCIe954 | 16C950 | 128 | Yes | No | (X) | |||
OXPCIe958 | 16C950 | 128 | Yes | No | (X) | |||
PCI | PCI60806 | 16550A | 17 | No | Yes | no loopback | (5) | |
Sunix | SUN1699 | 16550A | 32 | h/w flow ctl, lrg fifo | No | No | ||
SUN1889 | 16550A | 32 | h/w flow ctl, lrg fifo | No | No | |||
SUN1989 | 16550A | 128 | h/w flow ctl, lrg fifo | No | No | |||
SUN2410 | 16550A | 128 | h/w flow ctl, lrg fifo | No | No | |||
SystemBase | SB16C1052PCI | 16C1050 | 256 | No | No | |||
TXIC | TX382B | 16550A | 17 | No | No | no loopback | (5) | |
Winchip | CH351 | 16550A | 16 | No | Yes | |||
CH352 | 16550A | 16 | h/w flow ctl | No | Yes | |||
CH353 | 16550A | 16 | h/w flow ctl | No | Yes | |||
CH355 | 16550A | 16 | h/w flow ctl | No | Yes | |||
CH382 | 16C750 | 256 | No | No | ||||
Notes :
(1) TEMT bit fault may mean it does not function correctly with some DOS software
(2) Larger FIFO but spec states it should be 256 bytes !
(3) Multifunction design causes port ghosting in some configurations
(4) Dual port design causes port ghosting in single serial port configuration
(5) Loopback mode not implemented
(6) Does not support all 16C950 indexed registers
(7) Multimode device and only modes 0, 2 & 4 can be used with MS-DOS, so
the card must have mode jumpers to be certain of compatibility. If not it is
still possible to modify it to work, see here
for details. Also the second port cannot be used with MS-DOS because of the
interrupt configuration of the card.
(8) This is a multifunction device but all UARTs share the same IRQ.
(9) FIFO size is either 17 or 33 depending on config
(X) Not usable with MS-DOS as legacy UART mode is not supported
The original IBM parallel port design used discrete buffers with open-collector outputs for the control pins (Strobe, AutoLF, Initialise & Select) which allowed the output to be read back to check the status of the pins not the value written to them. By driving these pins high to +5V the value at the pins can be pulled low externally and so they can be treated as input pins instead.
When the IBM parallel port design was duplicated in what is called a "Super I/O chip", along with serial ports, floppy disk and hard disk interfaces, improvements were made. The PS2 (Bi-directional), EPP and ECP modes were added to the original mode which was named SPP. Each of the new modes required that the parallel port control pins were implemented using push-pull outputs, which can be driven high or low. This change was required so that the port can handle high speed transfer. Some manufacturers of Super I/O chips (and later Southbridge and PCI/PCIe communication ICs) made the decision not to support the original output pin design when in Normal/Compatible/SPP mode.
The Stag programmer parallel protocol requires that a fully IBM compatible parallel port is used because the control pins are used as inputs and so will not communicate with a parallel port which uses push-pull outputs in SPP mode. Fortunately, some manufacturers decided to switch between open-collector (later open-drain) and push-pull outputs depending on the mode and the purpose of this page is to list some common ICs providing parallel ports and indicate whether they work with the Stag parallel protocol. As the practice of using the control outputs in this way was quite common in the 1980s before the PS2, EPP and ECP modes were implemented, this page may be of benefit to anyone attempting to use old software to connect using a PC parallel port.
Interrupt handling is another area where parallel ports can differ in operation. The port should be able to generate an interrupt on the low (0V) to high (+5V) transition of the nACK pin, however, many of the Super I/O, Southbridge and interface ICs generate interrupts while the nACK pin is either low or high (level triggered) rather than on the low to high transition (edge triggered). Some parallel port implementations cannot generate interrupts at all. Although the Stag parallel protocol does not use interrupts, I am designing a interrupt driven parallel port interface for another project and so I have added this information to the tables below
Super I/O, South bridge ICs and ISA cards
Manufacturer | Super I/O | Supports fully IBM compatible port in SPP mode | nACK signal generating interrupt in SPP mode | Notes |
California Micro Devices | CM16C552 | Yes | Broken | |
HMC | HM83740 | Yes | Broken | |
ITE | IT8671 | No | Lo -> Hi | |
IT8703 | No | Lo -> Hi | ||
IT8705 | Yes | Lo -> Hi | ||
IT8712 | Yes | Lo -> Hi | ||
IT8712-A | Yes | Lo -> Hi | ||
IT8716 | Yes | Lo level | ||
IT8718 | Yes | Lo -> Hi | ||
IT8720 | Yes | Lo level | ||
IT8728 | Yes | Lo -> Hi | ||
National Semiconductor | PC87307-IBU | Yes | Lo -> Hi | |
PC87417-IBU | Yes | Lo -> Hi | ||
PC87417-ICK | No | Lo -> Hi | ||
PC97317-ICK | Yes | Lo -> Hi | ||
SMC/SMSC/Microchip | FDC37C669 | Yes | Lo -> Hi | |
LPC47M102 | Yes | Lo -> Hi | ||
LPC47M182 | Yes | Lo -> Hi | ||
LPC47M192 | Yes | Lo -> Hi | ||
SCH5127 | Yes | Lo -> Hi | ||
Winbond | W83627F | Yes | Lo -> Hi | |
W83627F-AW | No | Lo -> Hi | ||
W83627HF-AW | No | Lo -> Hi | ||
W83757F | Yes | Lo -> Hi | ||
W83877F | Yes | Lo -> Hi | ||
W83977EF-AW | No | Lo -> Hi | ||
Southbridge | ||||
ALi | M1543C | No | Lo -> Hi | |
VIA | VT82C686B | Yes | Hi level | |
ISA cards | ||||
A?? | A3203 | Yes | Lo -> Hi | |
ASP | AP138(B) | Yes | Broken | (1) |
SIIG | Cyber P1000 | Yes | ? | |
SUNIX | SUN1688 | Yes | Switchable | |
SUN1689 | No | Lo level |
Notes :
(1) ECP control register supported but not ECP mode
PCI/PCIe expansion cards
Please note that if you use a PCI/PCIe parallel port card you will need to obtain the I/O address and IRQ no. from PrtAdd and provide these values to the DOS software.
Manufacturer | IC | Supports fully IBM compatible port in SPP mode | nACK signal generating interrupt in SPP mode | Microsoft Standard ECP register layout | Multi-function | Re-mappable | Notes |
Brainboxes | BB16PCI958 | No | Hi level | No | No | No | (4) |
ITE | IT8875 | Yes | Hi level | Yes | No | No | (5) |
NetMos/MosChip/ASIX | NM9715 | Yes | Lo level | Yes | No | Yes | |
NM9805 | Yes | Lo level | Yes | No | Yes | ||
NM9815 | Yes | Lo level | Yes | No | Yes | ||
NM9835 | Yes | Lo level | Yes | No | Yes | ||
MCS9865 | Yes | Broken | Yes | Yes | Yes | (1) | |
MCS9901 | No | Lo -> Hi | Yes | Yes | No | (1) | |
AX99100 | No | Lo -> Hi | Yes | Yes | No | (1) | |
Oxford Semiconductor | OX12PCI840 | Yes | Lo -> Hi | Yes | No | Yes | |
OX16PCI954 | Yes | Broken | Yes | Yes | No | ||
OXuPCI952 | Yes | Broken | Yes | Yes | No | ||
OXPCIe952 | Yes | Hi level | Yes | Yes | No | ||
Sunix | SUN1689 | No | Lo level | No | No | No | (2) |
SUN1989 | No | Broken | Yes | No | No | ||
SUN2410 | No | Broken | Yes | No | No | ||
TXIC | TX382B | Yes | Lo -> Hi | No | No | No | (3) |
Winchip | CH351 | No | Hi level | No | No | Yes | (3) |
CH352 | No | Hi level | No | No | Yes | (3) | |
CH353 | No | Hi level | No | No | Yes | (3) | |
CH382 | No | Hi level | No | No | No | (3) | |
Notes :
(1) Multifunction design causes port ghosting in some configurations
(2) Only SPP/PS2 modes supported with MS-DOS/Win98/Linux!
(3) Only SPP/PS2 modes supported with MS-DOS!
(4) Only SPP/PS2 modes supported
(5) Not fully IBM compatible if SPP function used while in EPP or ECP mode so
PRTADD currently disables EPP and ECP.
So a motherboard with a ITE, Winbond or SMC/SMSC Super I/O IC is likely to work with the Stag parallel protocol in SPP mode. A PCI parallel card with a NetMos/MosChip/ASIX or Oxford Semi IC or a PCIe parallel card with a TXIC IC will also work (TXIC ICs do not seem to use the standard parallel port register layout but should be ok).
Some PC motherboards have ACPI BIOS bugs which will cause the extended registers of a parallel port to be located at an address which is incompatible with the standard. (see Q0010 here)
The TXIC and Winchip ICs do not follow the Microsoft standard for register layout and use one group of 4 registers instead of two groups of 8 & 3 registers where the second group is offset from the first by 0400h (although the ACPI BIOS problem mentioned above can locate it elsewhere). This means that MS-DOS apps which follow the Microsoft standard can only use SPP and PS2 modes with these devices. They can be used in EPP and ECP modes with Windows because drivers have been written for this condensed register layout. At this time I have not seen any Linux drivers for these devices that support EPP and ECP modes.
The I/O addresses and IRQ no.s used by a PCI or PCIe card are allocated automatically by the PnP or ACPI BIOS to ensure that there are no conflicts with other devices. The range of addresses available for this purpose is limited and does not include the legacy addresses 03f8, 03e8, 02f8, 02e8, used for serial ports, and 0378, 0278, 0778, 0678, and 03bc, used for parallel ports. Some PCI serial and parallel cards do allow the I/O addresses to be re-mapped to legacy addresses, however, they do not allow the IRQ no to be re-mapped to the associated legacy IRQ.
In the case of parallel ports very few applications use interrupts for communication and so this re-mapping is likely to work. For serial ports it has been necessary to use interrupts for many years to allow reliable communication at baud rates higher than 9600 baud so re-mapping serves no purpose for serial ports because the IRQ no cannot be changed to that expected by the legacy software and associated with the re-mapped address.
The tables above for serial and parallel devices indicate if they are re-mappable but please note that devices on PCIe cards cannot be re-mapped to use legacy addresses. This means that a PCI device, which is indicated as re-mappable, on a PCIe card with a PCIe-to-PCI bridge IC cannot be re-mapped to a legacy address.
I have discovered that some motherboards do not allow PCI cards to be accessed
at legacy addresses preventing any re-mapping and they are listed here. The
tests were carried out using PrtAdd v1.0.4 and a NetMos NM9805.
Manufacturer | Model | BIOS | BIOS version |
Gigabyte | GA-MA69VM-S2 | Award Modular BIOS v6.00PG | F8 |
Gigabyte | GA-770T-D3L | Award Modular BIOS v6.00PG | |
Asus | K8N-E Deluxe | AMIBIOS | 1010 |
I have a Gigabyte GA-H97-D3H and an Epox EP-9NPA+Ultra, which uses the Award Modular BIOS v6.00PG, and they both allow PCI cards to be accessed at legacy addresses so this problem must be caused by bugs in individual releases of BIOS.
Some of these devices are either multifunction, which usually means that they allocate separate interrupts for each function, or are single function, multiport devices where unused ports cannot be disabled but the card manufacturer has not fitted some components or connectors. With some configurations of these devices what I have called ghost ports will appear which, although fully functional and assigned addresses and interrupts, cannot be used. There is no way to predict if a partially populated board will have unusable ghost ports as it depends on whether a single pcb design is used for all configurations and if the mode selection pins of the device, if any, are set correctly for that configuration. For these devices I recommend obtaining only cards with no missing components. e.g. NM9865 with 2x serial ports and 1x parallel port or OX16PCI952 with 2x serial ports.
Of the other devices you should probably avoid the NM9835/9845, the TXIC TX382B and the PCI60806 because of their problems with serial ports. The OXPCIe952 has been shown to have problems with interrupts and DOS and should be avoided. If you need to use the EPP or ECP modes of a parallel port then you should avoid the Sunix, TXIC and Winchip ICs because of their non-standard register layout.
Please note that any problems with these devices relate to their use with DOS (or Linux for parallel ports) and, as far as I know, all of these devices work correctly with Windows if you use the manufacturer's drivers.
home contact