
(*$S+*)

{ This unit contains the subroutines necessary for
  accessing/using the RS232 interface of the Magiscan }

Unit RS232;

 Written by H Balen 1-Aug-85 
 Modified by H Balen 23-Sep-85 

Interface


Uses
  M2Types,M2IpRoot,M2Sys;

var
  MuxDelay    : integer;
 
  procedure InitM;
 
  function ISTATR : boolean;
 
  function ISTBRR : boolean;
 
  function ISTBOR : boolean;

  function ISTBFE : boolean;

  function ISTBTR : boolean;
 
  procedure SNDBBT( BT : char );
 
  procedure SNDABT( BT : char );
 
  function RCVBBT : Char;
 
 

Implementation

{ All the routines below have the same function as those
  in the text file WDPROCS for the UCM version of kermit }

const
  RxBit   = 4;
  TxBit   = 5;
  Uart    = 56;
  Control = 57;
  Status  = 57;
 
  { RS232 dependant constants for the status registar }
  OverError = 4;
  FrameError = 5;

type
  RegByte = record
               case Boolean of
                 True : ( Value : integer );
 
(* ---------------------------------------------------- *)

function ISTBOR;
  Is it true that data OverRun occurred ?,

var
  Byte : RegByte;

begin
Byte.Value := IORead(Status);
ISTBOR := Byte.B[OverError]
end{ISTBOR};

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

function ISTBFE;
 Is it true that Framing-Error occured? 

var
  Byte  : RegByte;

begin
Byte.Value := IORead(Status);
ISTBFE := Byte.B[FrameError]
end{ISTBFE};

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

function ISTBTR;
 Is it true that transmit is ready ? 

begin
ISTBTR := not IOStatus(TxBit)
end{ISTBR};

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

procedure InitM;
 This initialises the RS232 port 

begin
IOWrite(64,Control); { Internal Reset }
IOWrite(78,Control); { Set the mode }
IOWrite(55,Control); { Error Reset }
BaudRate(1200);
MuxDelay := 0;
end{RSInit};

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

procedure SNDBBT;
{ After getting back a TRUE result from isttr, this function
  SNDBBT is used to actually send the byte of data from the
  CPU to the device. Note that any attempt to call SNDBBT before
  getting TRUE from isttr can result in clobering the previous
  data }

var
  i   : integer;

begin
for i := 0 to (10 * MuxDelay) do;
[UnitWrite(8,i,1);
IOWrite(ord(BT),Uart);
end{SendToUART};

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

procedure SNDABT;
 Same as the SNDBBT except this is for the keyboard 

const
  Ret  = 13;
  LF   = 10;

begin
if ord(BT) <> Ret then
  if ord(BT) = LF then{ If we have a LF then }
    write(chr(Ret)) { send a CR instead }
   else
     write(BT) { else send the character itself }
end{SNABT};

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

function RCVBBT;

var
  Ch    : char;

begin
RCVBBT := chr( IORead(Uart) )
{UnitRead(7,Ch,1);
RCVBBT := Ch}
end{RxUART};

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

end{RS232}.

