C	SNDRCV11M.FOR - VAXNET REMOTE SLAVE PROGRAM (RSX11M/V3.1 VERSION)
C
C	FORTRAN IV PLUS
C
C	PDP10 VERSION  - ROGER LIPSETT  INTERMETRICS  APRIL 27, 1979
C	VAX VERSION    - JOHN THOMPSON  INTERMETRICS  MAY 15, 1979
C	RSX11M VERSION - JOHN THOMPSON  INTERMETRICS  MAY 22, 1979
C
	PROGRAM SNDRCV
	IMPLICIT INTEGER*4 (A-Z)
	INTEGER*4 FLOW		! 1 FOR TO10, 2 FOR TOVAX.
	INTEGER*4 MODE		! 1 FOR ASCII, 2 FOR SYSGEN.
	INTEGER*4 TYPE(6), ASCII(5), SYSGEN(6)
	INTEGER*4 DIRCTN(5), TO10(4), TOVAX(5)
	LOGICAL*1 IB(200)
	LOGICAL COMP
	DATA ASCII/1HA,1HS,1HC,1HI,1HI/, SYSGEN/1HS,1HY,1HS,1HG,1HE,1HN/
	DATA TO10/1HT,1HO,1H1,1H0/, TOVAX/1HT,1HO,1HV,1HA,1HX/

C	SET UP FOR READ/NOECHO QIO FROM TERMINAL
	CALL SETUP	!ENTRY IN READIT

C	GET THE DIRECTION OF TRANSFER.
1	CALL READIT(IB,NCHAR,IERR)	!READ TERMINAL WITH NO ECHO
	DECODE(NCHAR,9901,IB) DIRCTN
	IF ( .NOT. COMP(DIRCTN,TO10,4)) GO TO 2
	FLOW = 1
	GO TO 10
2	IF (.NOT. COMP(DIRCTN,TOVAX,5)) GO TO 3
	FLOW = 2
	GO TO 10
3	CALL SNAK
	GO TO 1

C	GET THE TYPE OF TRANSFER.
10	CALL SACK
11	CALL READIT(IB,NCHAR,IERR)
	DECODE(NCHAR,9901,IB) TYPE
9901	FORMAT (10A1)
	IF (.NOT. COMP(TYPE,ASCII,5)) GO TO 20
	MODE = 1
	GO TO 40
20	IF (.NOT. COMP(TYPE,SYSGEN,6)) GO TO 30
	MODE = 2
	GO TO 40
30	CALL SNAK
	GO TO 11

C	DISPATCH ON THIS INFORMATION.
40	CALL SACK
	GO TO (41,42), FLOW
41	CALL GETA
	STOP
42	GO TO (421,422), MODE
421	CALL SENDA
	STOP
422	CALL SENDB
	STOP
	END
	LOGICAL FUNCTION COMP(OP1,OP2,LEN)
C	COMPARES TWO ARRAYS EACH LEN WORDS LONG.
	INTEGER*4 OP1(1), OP2(1), LEN
	COMP = .FALSE.
	DO 10 I=1,LEN
10	IF (OP1(I) .NE. OP2(I)) RETURN
	COMP = .TRUE.
	RETURN
	END
	SUBROUTINE SACK
C	SENDS 1HY FOR ACK, 1HN FOR NAK.
	INTEGER*4 ACK, NAK
	DATA ACK/1HY/, NAK/1HN/
	WRITE (6,10) ACK
10	FORMAT (1H+,A1)
	RETURN
	ENTRY SNAK
	WRITE (6,10) NAK
	RETURN
	END
	SUBROUTINE SENDA
C	TRANSMITS AN ASCII FILE TO THE VAX.
	IMPLICIT INTEGER*4 (A-Z)
	LOGICAL*1 IB(200)
	INTEGER*4 LINE(50), BLANKS
	INTEGER*4 LINECT, CHECK
	EQUIVALENCE (IB(1),LINE(1))
	DATA BLANKS/4H    /

C	WHAT FILE
	CALL READIT(IB,NCHAR,IERR)
	IB(NCHAR+1)="40
	OPEN (UNIT=1, NAME=IB, TYPE='OLD', ERR=1000)
	CALL SACK

C	SYNCHRONIZE WITH VAX
5	CALL READIT(IB,NCHAR,IERR)
	IF(IB(1).EQ.1HZ)GO TO 7
	CALL SNAK
	GO TO 5
7	CALL SACK

10	READ (1,9901,END=200,ERR=200) LINE	! READ THE NEXT LINE.
9901	FORMAT (50A4)
	CHECK = 0				! INITIALIZE CHECKSUM.
C	STRIP TRAILING BLANKS FROM THE LINE.
	LINECT = 200
	DO 20 I = 50,1,-1
	IF (LINE(I) .NE. BLANKS) GO TO 30
20	LINECT = LINECT-4
	GO TO 70
30	J = LINECT
	DO 40 I=J,1,-1
	IF (IB(I) .NE. "40) GO TO 50
40	LINECT = LINECT-1
	GO TO 70

C	COMPUTE THE CHECKSUM.  DO ANY FUNNY CHARACTER CONVERSION
50	DO 60 I=1,LINECT

	IF(IB(I) .EQ. "11) IB(I)="134 !USE 	 FOR HT ON SEND

60	CHECK = CHECK + IB(I)

C	AND WRITE OUT THE LINE.
70	CALL WRITIT( LINECT, CHECK .AND. "777, IB )
	GO TO 10

C	WRITE OUT THE TERMINATOR.
200	CALL WRTEND
	RETURN

C	SEND THE ERRSNS MESSAGE BACK TO THE VAX.
1000	CALL OPERR
	RETURN
	END
	SUBROUTINE SENDB
	STOP '*** SNDRCV FOR REMOTE HAS NO "GETS" COMMAND ***'
	END
	SUBROUTINE WRITIT(COUNT,CHECK,IB)
	INTEGER*4 COUNT, CHECK
	INTEGER*4 NCHAR, IERR
	LOGICAL*1 IB(1)
10	IF (COUNT .EQ. 0) GO TO 20
		WRITE (6,9901) COUNT,CHECK,(IB(I),I=1,COUNT)
9901		FORMAT (1H+,I4,I3,200A1)
		GO TO 30
20	WRITE (6,9901) COUNT, CHECK

30	CALL READIT(IB,NCHAR,IERR)
	IF (IB(1) .EQ. 1HY) RETURN
	IF (IB(1) .EQ. 1HC) STOP 'SNDRCV ABORTED'
	GO TO 10

	END
	SUBROUTINE WRTEND
	INTEGER*4 MONE, NCHAR, IERR
	LOGICAL*1 IB(200)
	DATA MONE/-1/

	WRITE (6,9901) MONE,MONE
9901	FORMAT(1H+,I4,I3)
	CALL READIT (IB,NCHAR,IERR)
	IF (IB(1) .EQ. 1HY) RETURN
	STOP 'WRTEND PROBLEM'
	END
	SUBROUTINE GETA
C	GETA GETS AN ASCII FILE TRANSMITTED FROM VAXNET
	IMPLICIT INTEGER*4 (A-Z)
	LOGICAL*1 IB(200),IC(256)
	INTEGER*4 DSIZE, CHECK, LINE(50)
	INTEGER*4 SUM
	EQUIVALENCE (IB(1),IC(8))

C	WHAT FILE
	CALL READIT(IC,NCHAR,IERR)
	IC(NCHAR+1)="40
	OPEN (UNIT=1, NAME=IC, TYPE='NEW',
	1 CARRIAGECONTROL='LIST', ERR=1000)
	CALL SACK

10	CALL READIT(IC,NCHAR,IERR)		! READ THE NEXT LINE
	IF (NCHAR .EQ. 0) GO TO 100
	IF (IC(1) .EQ. 1HC) STOP 'SNDRCV ABORTED'
	DECODE (7,9902,IC,ERR=100) DSIZE,CHECK
9902	FORMAT (I4,I3)
	IF (DSIZE .LT. 0) GO TO 99		! CHECK FOR EOT.
	SUM = 0
	IF (DSIZE .EQ. 0) GO TO 30		! SPECIAL CASE EMPTY LINE.
		DO 20 I=1,DSIZE
20		SUM = SUM + (IB(I) .AND. "177)
		SUM = SUM .AND. "777
30	IF (SUM .NE. CHECK) GO TO 100
	IF (DSIZE .EQ. 0) GO TO 40
		WRITE (1,9903) (IB(I),I=1,DSIZE)
9903		FORMAT (200A1)
		GO TO 50
40	WRITE (1,9903)
50	CALL SACK
	GO TO 10

100	CALL SNAK
	GO TO 10

99	CALL SACK
	CLOSE (UNIT=1)
	RETURN

1000	CALL OPERR
	RETURN
	END
	SUBROUTINE GETS
C	NOT IMPLEMENTED
	RETURN
	END
	SUBROUTINE OPERR
	INTEGER*2 I,J,K,L
	CALL ERRSNS(I,J,K,L)
	WRITE (6,9901) I,J,K,L
9901	FORMAT('+ERROR - ERRSNS NUMBERS ARE: ',
	1   I5,1X,O6,1X,O6,1X,I5)
	RETURN
	END
	SUBROUTINE READIT(IB,NCHAR,IERR)
C	READS TERMINAL WITH NO ECHO
	INTEGER*4  NCHAR,IERR,SIZE
	INTEGER*2  IPR(6),ISW(2),IORNE
	LOGICAL*1  IB(1),ISB(4)
	COMMON/RCOMM/	IPR,ISW,IORNE
	EQUIVALENCE	(ISB(1),ISW(1))

C***************************************************
C	THE FOLLOWING STATEMENTS CAN BE USED FOR VAX
C	IERR=0
C	NCHAR=0
C	READ(5,9901,ERR=400) SIZE,(IB(I), I=1,SIZE)
C9901	FORMAT(Q,<SIZE+1>A1)
C	NCHAR=SIZE
C	RETURN
C	ERROR PROBLEM
C400	IERR=1
C	NCHAR=1
C	RETURN
C***************************************************

C		CODE FOR RSX11M

C	USE QIO TO GET THE TERMINAL INPUT
	IERR=0
	NCHAR=0
	IB(1)=0
	CALL GETADR(IPR,IB)
	CALL WTQIO (IORNE,5,5,,ISB,IPR) !READ WITH NO ECHO
	IF(ISB(1).LT.0) STOP 'SNDRCV ERROR' !ERRORS
	NCHAR=ISW(2)
	RETURN

	ENTRY SETUP
	IORNE="001020	!IO.RNE
	IPR(2)=200	!MAX NUMBER OF BYTES TO READ
	CALL ASSIGN(5,'TI:')
	CALL ASSIGN(6,'TI:')
	RETURN
	END
