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

{
Can anyone tell me how you would set the baud rate for a speed above 9600 BP
in the bit mask for int 14h. also how you could do a Null modem type
connection.

You can't.  You must program the divisor in the uart your self
for those higher baudrates.  Here's part of a serial routine I
use:
}

Unit SerialIn;
{F+}
Interface
Uses Crt,Dos;
Const  CommPort   = $3F8;   { normally com1 = $3F8 and com2 = $2F8 }
       CommIrq    = 4;      { normally com1 = 4 and com2 = 3 }
       BaudRate   = 9600;   { 300 - 9600 }
       Parameters = $03;    { 7 6 5  4 3  2  1 0
                              +-+-+  +-+  |  +-+--- width 10 = 7 bits
                              don't    |  |               11 = 8 bits
                              care     |  +------- stopbit 0 = 1 bit
                                       |                   1 = 2 bit
                                       +---------- parity X0 = none
                                                          01 = odd
                                                          11 = even    }

       BufferSize = 1000; { Size of receiver buffer }
       IntMask    : Array[2..5] of Byte = ($FB,$F7,$EF,$DF);

Var ComBuffer  : Array[0..Buffersize] of Byte;
    HeadPtr,
    TailPtr    : Integer;
    OldCommInt : Pointer;

Procedure ComInit;                    { Initialize serial port }
Procedure ComDisable;                 { Disable serial port }
Procedure SendChar(Ch:Char);          { Send character to serial port }
Procedure SendString(Message:String); { Send string to serial port}
Function  GetChar:Char;               { Get character from serial port }
Function  GetCharWait:Char;           { Wait for character ready, then get }
Function  CharReady:Boolean;          { Returns true if character has been }
                                      { received through serial port }

Implementation

Procedure ComInit;         { get the serial port ready for use }
Var Divisor : Integer;     { this routine MUST be called before }
    Dummy   : Integer;     { using serial port! }
  Begin
  Case BaudRate of
     300 : Divisor := 384;
    1200 : Divisor := 96;
    2400 : Divisor := 48;
    9600 : Divisor := 12;
   19200 : Divisor := 6;
    3840 : Divisor := 3;
    5760 : Divisor := 2;
   11520 : Divisor := 1;
    Else WriteLn('Illegal Baudrate');
    End;
  Port[CommPort+3] := $80;                 { Set divisor latch bit }
  Port[CommPort] := Lo(Divisor);           { Set lower divisor }

  Port[CommPort+1] := Hi(Divisor);         { set upper divisor }
  Port[CommPort+3] := Parameters;          { clear divisor latch and }
                                           { set data parameters }
  HeadPtr := 0;                            { reset buffer pointers }
  TailPtr := 0;
  GetIntVec(CommIrq+8,OldCommInt);         { Save the old vector }
  SetIntVec(CommIrq+8,@ComIntHandler);     { Install interrupt handler }
  Port[CommPort+1] := 1;                   { Enable receiver interrupt }
  Port[CommPort+4] := 9;                   { Enable DTR and OUT2 }
  Port[$21] := Port[$21] And
                         IntMask[CommIrq]; { Program 8259 Int mask }
  Dummy := Port[CommPort];                 { Read the receiver register }
  End;                                     { to clear status flags }

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