	SUBROUTINE SETUP_REMOTE(INTERACTIVE)
C
C	This routine is used to setup the remote terminal characteristics.
C	It also sets the REMOTE flag to TRUE if the remote bit is set.
C	During interactive terminal communication, the terminal is setup:
C
C	/VT100, WIDTH=511, PAGE=same, OWNER=SELF
C	SPEED=(user_specified), CRFILL=0, LFFILL=0, NOPARITY
C	PASSALL, NOECHO, TYPEAHEAD, NOESCAPE, HOSTSYNC, TTYSYNC,
C	LOWERCASE, TAB, NOWRAP, SCOPE, REMOTE, NOHOLDCREEN,
C	EIGHTBIT, NOBROADCAST, NOREADSYNC, FORM, FULLDUP
C
C	During file transmission, HOSTSYNC and TTYSYNC will be disabled
C	so the terminal doesn't send XON and XOFF or expect XON or XOFF.
C	This was causing SNDRCV to get hung in a suspend (XON) state which
C	could only be resolved by aborting and restarting the transfer.
C
C	Inputs:
C		INTERACTIVE - .TRUE. to setup for interactive terminal,
C			      .FALSE. to setup for file transmission.
C		BAUD_RATE   - contains the remote baud rate.
C		READ_ONE    - .TRUE. if doing one character reads.
C			    - .FALSE. if using XON and XOFF to control
C			       typeahead buffer overflow.
C
C	Get remote terminal characteristics.
C
	INCLUDE 'COM.INC/NOLIST'
	INCLUDE 'TTDEF.FOR/NOLIST'
	INCLUDE 'TT2DEF.FOR/NOLIST'

	INTEGER*4 SET_REMOTE(3)
	LOGICAL INTERACTIVE

	IF (.NOT. NEED_TO_DEAS) RETURN	! No remote port yet.
C
C	Get the remote terminal characteristics.
C
	REMOTE_STATUS = SYS$QIOW(%VAL(REFN_IN),%VAL(RCHAN_IN),
	1	%VAL(IO$_SENSEMODE),RIOSB,,,REMOTE_CHAR,%VAL(12),,,,)
	CALL CHECK_STATUS('SETUP_TERMINALS',REMOTE_STATUS)
C
C	In VMS version 3.0, we can now determine if a terminal port is
C	enabled for a modem.  If it isn't SET /MODEM, we won't output
C	various messages about dialing the modem, hanging up, etc.
C
	MODEM = .FALSE.			! Presume not a modem line.
	REMOTE = .FALSE.		! 	or modem is dialed up.
	IF ((REMOTE_CHAR(2) .AND. TT$M_MODEM) .NE. 0)
	1	MODEM = .TRUE.		! Port is setup for MODEM.
C
C	If this is a MODEM line, see if it's already dialed up.
C
	IF (MODEM) THEN
		IF ((REMOTE_CHAR(2) .AND. TT$M_REMOTE) .NE. 0)
	1		REMOTE = .TRUE.	! Flag remote (Dialup).
	ENDIF
C
C	If the alternate typeahead buffer is enabled, modify the
C	typeahead buffer size.  The default for our system are:
C
C	TTY_ALTYPAHD = 200	! Alternate typeahead size.
C	TTY_ALTALARM = 64	! Count before XON sent.
C
C	Ideally, we never want the terminal driver to send XON.  Until
C	VAXNET is rewritten with a better method of reading the remote
C	characters, we try to set the typeahead buffer size to a count
C	which allows us to read incoming data before TTY_ALTALARM is
C	reached so XON isn't sent.
C
	IF ((REMOTE_CHAR(3) .AND. TT2$M_ALTYPEAHD) .NE. 0) THEN
		TYPEAHEAD_SIZE = 200-100 ! Should prevent XON ???
	ENDIF
C
C	Copy the current terminal characteristics and add some more.
C	Note, we don't change the extended terminal characteristics.
C
	SET_REMOTE(1) = REMOTE_CHAR(1)
	SET_REMOTE(2) = REMOTE_CHAR(2)

	SET_CHAR =	TT$M_LOWER + TT$M_MECHFORM + TT$M_MECHTAB +
	1		TT$M_NOBRDCST + TT$M_NOECHO + TT$M_PASSALL +
	1		TT$M_EIGHTBIT + TT$M_SCOPE
C
C	For interactive mode, we want to set the bits for HOSTSYNC and
C	TTSYNC so XON and XOFF are used by the terminal driver to control
C	incoming data.  These bits MUST be set when operating at high
C	baud rates otherwise the typeahead buffer is overflowed.  This
C	could be solved by using muliple buffers and multiple QIO's.
C
C Note:
C	Currently these bits are only enabled if the READ_ONE flag is
C	set false when setting up the system type (i.e., DEC or EASYLINK).
C
C	IF (INTERACTIVE) THEN
C		IF (.NOT. READ_ONE)
C	1		SET_CHAR = SET_CHAR + TT$M_HOSTSYNC + TT$M_TTSYNC
C	ENDIF
C
C	In VMS V3.0, if HOSTSYNC and TTSYNC are disabled, the terminal
C	driver is returning a data overrun error on the remote read.
C	If these bits are enabled, everything seems to work Ok. Why ???
C
	SET_CHAR = SET_CHAR + TT$M_HOSTSYNC + TT$M_TTSYNC
C
	CALL LIB$INSV(TT$_VT100,8,8,SET_REMOTE(1))
	CALL LIB$INSV(511,16,16,SET_REMOTE(1))
	CALL LIB$INSV(SET_CHAR,0,(TT$V_HALFDUP+1),SET_REMOTE(2))
C
C	Setup the remote terminal characteristics.
C
	REMOTE_STATUS = SYS$QIOW(%VAL(REFN_IN),%VAL(RCHAN_IN),
	1	%VAL(IO$_SETMODE),RIOSB,,,SET_REMOTE,,%VAL(BAUD_RATE),,,)
	CALL CHECK_STATUS('SETUP_TERMINALS',REMOTE_STATUS)

	RETURN
	END

	SUBROUTINE SETUP_LOCAL(INTERACTIVE)
C
C	This routine is used to setup the local terminal characteristics.
C
C	Inputs:
C		INTERACTIVE - logical .TRUE. for interactive mode.
C				else .FALSE. for normal mode.
C
	INCLUDE 'COM.INC/NOLIST'
	INCLUDE 'TTDEF.FOR/NOLIST'
	INCLUDE 'TT2DEF.FOR/NOLIST'

	INTEGER*4 SET_LOCAL(2)
	LOGICAL INTERACTIVE
	CHARACTER*(*) MODULE_NAME
	PARAMETER (MODULE_NAME = 'SETUP_LOCAL')
C
C	Get the local terminal characteristics and set the terminal
C	to full duplex to allow simultanious reads and writes.
C
	IF (BATCH_MODE) RETURN		! No local terminal in batch.
	STATUS = SYS$QIOW(%VAL(LEFN_IN),%VAL(LCHAN_IN),
	1		%VAL(IO$_SENSEMODE),LIOSB,,,LOCAL_CHAR,,,,,)
	IF (.NOT. CHECK_STATUS(MODULE_NAME,STATUS)) RETURN
C
C	For interactive mode, we must enable full duplex (if not enabled)
C	and put the terminal in binary passall mode.  The terminal must
C	be in passall mode to prevent control characters (CTRL/C, CTRL/S,
C	CTRL/Q, CTRL/X, and CTRL/Y) from being processed by the terminal
C	driver when a read is not active.
C
	SET_LOCAL(1) = LOCAL_CHAR(1)	! Copy the current
	SET_LOCAL(2) = LOCAL_CHAR(2)	!   terminal characteristics.
	IF (INTERACTIVE) THEN
	    CALL LIB$INSV(1,TT$V_PASSALL,1,SET_LOCAL(2))! Passall mode.
	    CALL LIB$INSV(0,TT$V_HALFDUP,1,SET_LOCAL(2))! Full duplex.
	ELSE
	    CALL LIB$INSV(0,TT$V_PASSALL,1,SET_LOCAL(2))! No passall mode.
	ENDIF
	STATUS = SYS$QIOW(%VAL(LEFN_IN),%VAL(LCHAN_IN),
	1		%VAL(IO$_SETMODE),LIOSB,,,SET_LOCAL,,,,,)
	CALL CHECK_STATUS(MODULE_NAME,STATUS)
	RETURN
	END
