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