[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]