[Back to COMM SWAG index]  [Back to Main SWAG index]  [Original]


{
 Here's a TP function that will report the current UART baud rate for
 any serial port device (modem, mouse, etc.) ...
}

(*************************** GETBAUD.PAS ***************************)
PROGRAM GetBaud;                      { compiler: Turbo Pascal 4.0+ }
                                      { Mar.23.94 Greg Vigneault    }

(*-----------------------------------------------------------------*)
{ get the current baud rate of a serial i/o port (reads the UART)...}

FUNCTION SioRate (ComPort :WORD; VAR Baud :LONGINT) :BOOLEAN;
  CONST DLAB = $80;                   { divisor latch access bit    }
  VAR   BaseIO,                       { COM base i/o port address   }
        BRGdiv,                       { baud rate generator divisor }
        regDLL,                       { BRG divisor, latched LSB    }
        regDLM,                       { BRG divisor, latched MSB    }
        regLCR :WORD;                 { line control register       }
  BEGIN
    Baud := 0;                                { assume nothing      }
    IF (ComPort IN [1..4]) THEN BEGIN         { must be 1..4        }
      BaseIO := MemW[$40:(ComPort-1) SHL 1];  { fetch base i/o port }
      IF (BaseIO <> 0) THEN BEGIN             { has BIOS seen it?   }
        regDLL := BaseIO;                     { BRGdiv, latched LSB }
        regDLM := BaseIO + 1;                 { BRGdiv, latched MSB }
        regLCR := BaseIO + 3;                 { line control reg    }
        Port[regLCR] := Port[regLCR] OR DLAB;         { set DLAB    }
        BRGdiv := WORD(Port[regDLL]);                 { BRGdiv LSB  }
        BRGdiv := BRGdiv OR WORD(Port[regDLM]) SHL 8; { BRGdiv MSB  }
        Port[regLCR] := Port[regLCR] AND NOT DLAB;    { reset DLAB  }
        IF (BRGdiv <> 0) THEN
          Baud := 1843200 DIV (LONGINT(BRGdiv) SHL 4);  { calc bps  }
      END; {IF BaseIO}
    END; {IF ComPort}
    SioRate := (Baud <> 0);                   { success || failure  }
  END {SioRate};

(*-----------------------------------------------------------------*)

VAR ComPort : WORD;                         { will be 1..4          }
    Baud    : LONGINT;                      { as high as 115200 bps }

BEGIN {GetBaud}

  REPEAT
    WriteLn; Write ('Read baud rate for which COM port [1..4] ?: ');
    ReadLn (ComPort);
    IF NOT SioRate (ComPort, Baud) THEN BEGIN
      Write ('!',CHR(7)); {!beep}
      CASE ComPort OF
        1..4 : WriteLn ('COM',ComPort,' is absent; try another...');
        ELSE WriteLn ('Choose a number: 1 through 4...');
      END; {CASE}
    END; {IF}
  UNTIL (Baud <> 0);

  WriteLn ('-> COM',ComPort,' is set for ',Baud,' bits-per-second');

END {GetBaud}.

[Back to COMM SWAG index]  [Back to Main SWAG index]  [Original]