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 BACKSLASH 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,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