{ Donated by Warren Smith, Feb 1982 }

Program Terminal;

Var
	Modem_Mode : byte;	{ must be used to hold modem's mode }
	I	: integer;
	Number	: string;
	Xoff	: boolean;
	ESC_Char,
	Answer	: char;

{ ** Found in CRT.PAS ** }
External Procedure ScreenClr;

External Function ConIn : char;

External Procedure ConOut (Out_Char : char);

External Function KeyPressed : boolean;

External Function Get_Console : char;

External Procedure GotoXY (X, Y : integer);

{ ** Found in UTILITY.PAS ** }
External Function Upper (In_Char : char) : char;

{ ** Found in either DCMODEM.PAS or ACOUSTIC.PAS ** }
External Procedure Init_Modem;

External Procedure Set_Modem (Modebyte : byte);

External Procedure Go_Onhook (Var Modem_Mode : byte);

External Procedure Go_Offhook (Var Modem_Mode : byte);

External Procedure Set_Ans_Mode (Var Modem_Mode : byte);

External Procedure Set_Org_Mode (Var Modem_Mode : byte);

External Procedure Set_110bps (Var Modem_Mode : byte);

External Procedure Set_300bps (Var Modem_Mode : byte);

External Procedure Enable_Xmit (Var Modem_Mode : byte);

External Procedure Disable_Xmit (Var Modem_Mode : byte);

External Function Carrier_Present : boolean;

External Function Ringing : boolean;

External Function Modem_Char_Rdy : boolean;

External Function Modem_In : char;

External Function Modem_Out (OutChar : char) : boolean;

External Procedure Delay;	{ delay's for 10 millisecond }

External Procedure Dial_a_Number (Var Modem_Mode : byte; Number : string);

Procedure Dumb;

  Var
	Terminator, In_Char, In_Mod,
	Control_Char, Dummy_Char	: char;
	Half_Duplex, Dummy_Boolean,
	Test_Line			: boolean;

  begin { Dumb }
  In_Char := chr(0);
  Terminator := chr(26);

  Half_Duplex := TRUE;
  Test_Line := FALSE;

  While In_Char <> Terminator do
    begin
    If KeyPressed then
      begin
      In_Char := ConIn;
      If In_Char = chr(13) then	{ carriage return }
	In_Char := chr(19);	{ control-S used by X-off protocols  }
      If In_Char = ESC_char then
	begin
	Control_Char := Get_Console;
	Dummy_Char := Get_Console;
	Case Control_Char of
	  'A' : begin	{ Toggle between Full and Half Duplex	}
		Half_Duplex := not Half_Duplex;
		If Half_Duplex then
		  Writeln ('Half_Duplex')
		else
		  Writeln ('Full Duplex')
		end;
	  'B' : In_Char := Terminator;	{ Terminates session }
	  'C' : Test_Line := not Test_Line;	{ Causes display of control }
						{ characters coming in on   }
						{ the modem.		    }
	  else
	  end
	end
      else
	If Modem_Out (In_Char) then
	  begin
	  If Half_Duplex then
	    ConOut (In_Char)
	  end
	else
	  begin
	  Writeln ('Carrier Lost');
	  In_Char := Terminator
	  end
      end;

    If Modem_Char_Rdy then
      begin
      In_Mod := Modem_In;
      If Test_Line then
	If (In_Mod >= ' ') AND (In_Mod <= '~') then
	  ConOut (In_Mod)
	else
	  begin
	  WriteHex (Output, In_Mod, 1);	{ This routine outputs in hex }
	  Writeln
	  end
      else
	ConOut (In_Mod)
      end;

    If not Carrier_Present then
      begin
      Writeln ('Carrier Lost');
      In_Char := Terminator
      end
    end
  end;  { Dumb }

begin { Main }

ESC_Char := chr(01);	{ Used by escape sequences, you may want to	}
			{ change it to the ASCII ESC character		}

ScreenClr;

Write('Will you be using X-Off (carriage return = cntl-S) (Y or N)? ');
Read (Answer);
Writeln;
Xoff := Upper(Answer)='Y';

Modem_Mode := 0;

Init_Modem;

Write ('Number Please - ');
Readln (Number);

Writeln ('Dialing');

Dial_a_Number (Modem_Mode, Number);

Set_300bps (Modem_Mode);

Set_Org_Mode (Modem_Mode);

Enable_Xmit (Modem_Mode);

I := 0;		{ Set up for 20 second timeout }
While (I < 2000) AND (not Carrier_Present) do
  begin
  Delay;
  I := I + 1
  end;

If Carrier_Present then
  begin
  Writeln ('Connection made');
  Dumb
  end
else
  Writeln ('No carrier found, check number - ', Number);

Go_Onhook (Modem_Mode);

Writeln ('Hanging Up');

Writeln ('Program terminated')

end.
