UART.TXT last updated by Roedy Green 1993 June 11
Detect UART type of serial port
If Errorlevel 5 GoTo SyntaxError
If Errorlevel 4 GoTo PS2TYPE3
If ErrorLevel 3 GoTo AT16550FIFO
If ErrorLevel 2 GoTo AT16450
If ErrorLevel 1 GoTo XT8250
If ErrorLevel 0 GoTo NoSuchPort
UART by itself is considered a syntax error and generates a
Sets errorlevel to type of UART detected.
This code is based on the MASM routines on page 364 Of PC
Magazine May 26, 1992.
In DESQview often ports COM1: and COM2: are not accessible. You
must have access priviledge in your PIF. If UART says there are
no ports, the simplest thing to do is run without DESQview.
Under OS/2 virtualization makes all com ports look like 8250s.
Supports only COM1: .. COM4:. Looks in BIOS Table to find the
corresponding physical addresses.
It expects this pattern COM1: COM2: COM3: COM4:
port: 378 2f8 3e8 2e8
irq: 4 3 4 3
int: C B C B
If for example COM1: has port 2f8, then irq 3 would be
anticipated and its interrupts would be fielded on int vector B.
Port has precedence over com port number in determining irq. So
for example, if someone removed your modem on COM2: without
reconfiguring your machine, DOS would slide COM3: down to COM2:
and COM4: down to COM3:. This is just asking for trouble, since
then you have a pattern COM2: = 3e8 = irq 4. UART treats this
as an error, even though some programs will survive it.
How UART Works
If you are very curious, your best bet is to read the comments
in the source code UART.ASM. Even if you don't understand
assembler, you might be able to learn a fair bit.
The code to discriminate chip types depends on detecting the
presence of the scratch register, added after the 8250. Then we
check for FIFO buffers, added with the 16550AF. Then we check
for the enhanced register and DMA added with the IBM type 3.
To check the IRQ we simple send a NULL character to the port,
then wait on the CORRECT IRQ for an interrupt. If we get
exactly one, we are golden.
Five things can then happen:
1. device accepts the char, and we get a Xmit buffer empty interrupt.
This is the "nice" case. A loopback plug will also simulate this case.
2. device keeps CTS low, so char never goes out. We never get an int.
This is the case for example if a serial mouse is attached that
has not been activated. This is a "nasty" case.
3. device is powered off or missing. Then we get a line status
interrupt instead. This is the normal case when nothing at all
is connected to the port. We can still tell that the irq is correct.
4. IRQ not set properly. We see no interrupt. This is the error UART
was designed to detect.
5. Some other device is also using same IRQ. Then we may see spurious
extra interrupts from that device. Again we can report the problem
to the user.