[Back to COMM SWAG index] [Back to Main SWAG index] [Original]
{
> I'm looking for a small pascal V6 program to detect
> the UART-type installed.
Sure. How small do you need it? Here's one that'll compile to something just
below 3kb, will that do?
}
function UART(Port: word): word; assembler;
{ Checks for UART, and, if one is present, what type. }
{ Returns 0 if no UART, 1 if UART but no 16550, 2 if 16550 }
{ Donated to the public domain by Bj”rn Felten @ 2:203/208 }
{ Partly from an asm program by Anders Danielsson @ 2:203/101 }
asm
mov cx,Port {1..4}
push ds
mov ds,seg0040 {Use BIOS table to find port addr}
xor si,si {Offset 0 in BIOS table segment}
rep lodsw {Get the right one}
pop ds
or ax,ax {Test port address}
jz @no_uart {If zero --> no port}
mov dx,ax {Base address}
add dx,4 {Base+4}
cli
in al,dx {Modem Control Register}
and al,11100000b {Check bit 5-7}
jnz @no_uart {Non-zero --> no UART}
sub dx,2 {Base+2}
jmp @1 {Give hardware some time}
@1:
in al,dx {Interrupt Identification Register}
and al,11110000b {Check bit 4-7}
cmp al,11000000b {FIFO enabled?}
jz @is16550 {Yes, it is a 16550}
and al,00110000b {Check reserved bits}
jnz @no_uart {Non-zero --> No UART}
mov al,00000111b {16550 FIFO enable}
out dx,al {FIFO control register}
jmp @2
@2:
in al,dx {FIFO control register}
and al,11110000b {Check bit 4-7}
mov ah,al {Save for later}
jmp @3
@3:
mov al,00000110b {16550 FIFO disable}
out dx,al {FIFO control register}
cmp ah,11000000b {FIFO still not enabled?}
jz @is16550 {Yes, it is a 16550}
mov ax,1
jmp @quit
@is16550:
mov ax,2
jmp @quit
@no_uart:
xor ax,ax
@quit:
sti
end;
var P: word;
begin
for P:=1 to 4 do
case UART(P) of
0: writeln('No UART on port COM',P);
1: writeln('UART, but not 16550, on port COM',P);
2: writeln('16550 UART on port COM',P);
end
end.
[Back to COMM SWAG index] [Back to Main SWAG index] [Original]