#RCVXMT                                           19-OCT-82  11:52:24
C***
C       TITLE   RCVXMT
C
C       Version 1.1     OCT1182
C
C
C    FACILITY:
C   TEST PROGRAMS FOR THE COMMUNICATIONS DRIVER PACKAGE CDPACK
C
C
C    ABSTRACT:
C   PERFORMS MULTIPLE READ AND WRITES ON THE LINK WITH NO-WAIT
C   I/O.
C   PROGRAM IS IMPLEMENTED IN 4 PARTS
C	INITIALISATION - DEFINES WHICH PTC TO USE FOR XMT AND
C                        RECEIVE, HOW MANY WORDS TO XMT/RCV AND
C                        HOW MANY MESSAGES OF EACH TYPE TO XMT
C       STARTING I/O   - FOR EACH PTC, EITHER XMT OR RECEIVE, IF
C                        I/O IS NO LONGER ACTIVE FOR IT STARTS
C                        A NEW I/O OPERATION
C       CHECKING STATUS- CHECKS THE STATUS OF EACH I/O OPERATION
C                        REPORTS ANY ERRORS
C	RESULT SUMMARY - GIVES THE OVERALL PICTURE OF HOW MANY
C                        MESSAGES TRANSMITTED AND RECEIVED AND
C                        HOW MANY ERRORS
C
C
C    AUTHOR     Vicky White
C               Computing Department,
C               Fermi National Accelerator Lab
C
C   CREATION DATE: JUN2282
C
C   MODIFIED BY:
C   VW-OCT1182 - DELAY AFTER ALL OPENS DONE TO SYNCHRONISE WITH PARTNER
C                PUT IN FORM SUITABLE FOR RT TOO, USING PRE INSTEAD OF
C                INCLUDE FILES
C
C***
*RXINCL
	COMMON/CDCM82/ARRAY(350)	!ALLOW PLENTY ROOM FOR MBS
	COMMON/CDCM83/DUM		!FORCE CONTIGUOUS FOR RT11
        DIMENSION RCVBUF(4000),XBUF(4000)
C
C  SET UP PARAMETERS - PTC TO USE, BUFFER SIZES ETC.
C
C
C  ASSIGN CHANNELS TO LINK DEVICE
C
        CALL RXINIT
C
C  OPEN ALL SESSIONS FOR RECEIVE PTCS
C
	DO 10 IR=1,MAXR
        IF(RPTC(IR).EQ.0) GOTO 10
	CALL CDOPEN(RCHAN(IR),RPTC(IR),STAT)
        IF(STAT(1).NE.1) CALL CDERRM(STAT,MERR)
	IF(STAT(1).NE.1) RPTC(IR) = 0
        IF(STAT(1).EQ.1) RBSY(IR) = .FALSE.
10	CONTINUE
C
C  NOW WAIT TO SYNCHRONISE WITH PARTNER IF NECESSARY
C
	CALL DLKEY
C
C  MAIN PART OF CODE - 2 LOOPS ONE FOR INITIATING I/O REQUESTS
C  ONE FOR DEALING WITH COMPLETED I/O
C
15	IF(STOP) GOTO 500
C
C  LOOP OVER ALL RCV PTC - STARTING NEW READ ON ANY IDLE ONES
C
	DO 20 IR=1,MAXR
	IF(RBSY(IR)) GOTO 20
        IF(MODE.NE.RMODE(IR)) CALL CDMODE(RMODE(IR),0,0,0)    ! CHANGE MODE
	MODE=RMODE(IR)
        CALL CDRCV(RCHAN(IR),RPTC(IR),RCVBUF(RINDX(IR)),RWC(IR),STAT)
        IF(STAT(1).EQ.1) GOTO 16
        CALL CDERRM(STAT,MERR)
	ERRTOT=ERRTOT+1
        GOTO 20
16      RMBN(IR) = STAT(2)
	RBSY(IR) = .TRUE.
20	CONTINUE
C
C  LOOP OVER ALL XMT PTCS
C
	DO 30 IX=1,MAXX
	IF(XBSY(IX)) GOTO 30
        IF(MODE.NE.XMODE(IX)) CALL CDMODE(XMODE(IX),0,0,0)
        MODE=XMODE(IR)
	NXMT=NXMT + 1
	TOTXMT(IX) = TOTXMT(IX) + 1
        IF(TOTXMT(IX).LE.XWC(IX)) XBUF(TOTXMT(IX)) = TOTXMT(IX)
	CALL CDXMT(XCHAN(IX),XPTC(IX),XBUF,XWC(IX),STAT)
        IF(STAT(1).EQ.1) GOTO 22
        CALL CDERRM(STAT,MERR)
	TOTXMT(IX) = TOTXMT(IX) - 1
	ERRTOT=ERRTOT+1
        GOTO 30
22      XMBN(IX) = STAT(2)
	XBSY(IX) = .TRUE.
30	CONTINUE
C
C  LOOP OVER ALL RECEIVE PTCS CHECKING FOR COMPLETION
C
	DO 40 IR=1,MAXR
        IF(.NOT.RBSY(IR) .OR. RPTC(IR).EQ.0) GOTO 40
	CALL CDSTAT(RMBN(IR),INF,STAT)
        IF(INF.EQ.2.OR.INF.EQ.0) GOTO 40  ! RECEIVE STILL PENDING
	IF(INF.EQ.4) GOTO 32
	WRITE(5,1000) RMBN(IR),INF,STAT(1),STAT(2)
1000	FORMAT(' ERROR - ILLEGAL STATUS MB=',I2,' INF=',I6,' STAT=',
     &    2(2X,O6))
        GOTO 35
32	NRCV=NRCV+1
	TOTRCV(IR) = TOTRCV(IR) + 1
	IF(STAT(1).EQ.1) GOTO 33
        RERRS(IR) = RERRS(IR) + 1
        WRITE(5,1010) STAT(1)
1010	FORMAT(' RCV ERROR ',I6)
        CALL CDERRM(STAT(1),MERR)
        ERRTOT=ERRTOT+1
	GOTO 35
33      IF(TOTRCV(IR).GT.STAT(2)) GOTO 35
        IF(RCVBUF(RINDX(IR)+TOTRCV(IR)-1).EQ.TOTRCV(IR)) GOTO 35
        WRITE(5,1002) RPTC(IR),NRCV,RCVBUF(RINDX(IR)+NRCV-1)
1002	FORMAT(' ERROR IN DATA RECEIVED, PTC=',I3,' MSG NO ',I6,
     &     'MSG DATA ',I6)
35      RBSY(IR)=.FALSE.
40	CONTINUE
C
C
C  LOOP OVER ALL TRANSMITS CHECKING FOR COMPLETION
C
	DO 50 IX=1,MAXX
        IF(.NOT.XBSY(IX) .OR. XPTC(IX).EQ.0) GOTO 50
        CALL CDSTAT(XMBN(IX),INF,STAT)
        IF(INF.EQ.1) GOTO 50            ! XMT STILL PENDING
        IF(INF.EQ.3) GOTO 45
        WRITE(5,1001) XMBN(IX),INF,STAT(1),STAT(2)
1001    FORMAT(' ERROR - ILLEGAL STATUS MB=',I3,' INF=',I6,' STAT=',
     &    2(2X,O6))
45      XBSY(IX)=.FALSE.
        IF(STAT(1).EQ.1) GOTO 50
        XERRS(IX) = XERRS(IX) + 1
        WRITE(5,1011) STAT(1)
1011	FORMAT(' XMT ERROR ',I6)
	CALL CDERRM(STAT(1),MERR)
        ERRTOT=ERRTOT+1
50      CONTINUE
C
C  CHECK IF TIME TO STOP
C
        IF(NXMT.GE.XMTMAX .OR. NRCV.GE.RCVMAX) STOP = .TRUE.
        IF(ERRTOT.GE.MAXERR) STOP = .TRUE.
	GOTO 15
C
C  GIVE SUMMARY OF RESULTS AND STOP
C
500     CALL RXSUMM
	CALL EXIT
	END
*DLPAK
*PARFIL
#RSXPAK                                           11-OCT-82  16:56:39
*DLPAK
 
*PARFIL
 
*RTINIT
 
#RTPAK                                            15-APR-83  12:20:14 
*DLPAK
	SUBROUTINE DLYENO(STRING,PAR1,PAR2)
	COMMON/ERRCOM/IERR
	INTEGER PAR1,PAR2
	LOGICAL*1 STRING(1)
	CALL DLOUT(' DO YOU WANT TO',)
	CALL DLOUT(STRING,)
	TYPE 13	
13	FORMAT(' YES(NO)',$)
	READ(5,14)TEST
14	FORMAT(A1)
	IF(TEST.EQ.'Y') PAR2=1
	IF(TEST.EQ.'N') PAR2=0
	IF(TEST.NE.'Y'.AND.TEST.NE.'N') PAR2=PAR1
	IERR=1
	RETURN
	END
	SUBROUTINE DLOUT(STRING,NUMBER)
	COMMON/ERRCOM/IERR
	INTEGER*2 NUMBER
	LOGICAL*1 STRING(1)
	IF(IADDR(NUMBER).EQ.-1)TYPE 11,(STRING(I),I=1,80)
	IF(IADDR(NUMBER).NE.-1) TYPE 12,NUMBER
	IF(IADDR(NUMBER).NE.-1)TYPE 13,(STRING(I),I=1,80)
11	FORMAT(' ',80A1,$)
12	FORMAT(' ',70X,I8)
13	FORMAT('+',80A1)
	IERR=1
	RETURN
	END
	SUBROUTINE DLDEC(STRING,CPAR,NPAR,MINPAR,MAXPAR)
	COMMON/ERRCOM/IERR
	LOGICAL*1 STRING(1)
	INTEGER IUND
	DATA IUND/-1/
	INTEGER CPAR,NPAR,MINPAR,MAXPAR
	INTEGER NINPAR,NAXPAR
2	CONTINUE
	CALL DLOUT(STRING,)
	IF(IADDR(CPAR).NE.-1)	TYPE 13,CPAR
	IF(IADDR(CPAR).EQ.-1) TYPE 13,IUND
13	FORMAT(' CURRENT VALUE=',I8,' NEW VALUE=',$)
	READ(5,14)LENANS,NPAR
14	FORMAT(Q,I8)
	IF(LENANS.LE.0) GOTO 900
	IF(IADDR(MINPAR).EQ.-1.AND.IADDR(MAXPAR).EQ.-1) RETURN
	IF(IADDR(MINPAR).EQ.-1) NINPAR=-32000
	IF(IADDR(MAXPAR).EQ.-1) NAXPAR=+32000
	IF(IADDR(MAXPAR).NE.-1) NAXPAR=MAXPAR
	IF(IADDR(MINPAR).NE.-1) NINPAR=MINPAR
	IF(NPAR.GT.NAXPAR) CALL DLOUT(' MAXIMUM EXCEEDED',)
	IF(NPAR.LT.NINPAR) CALL DLOUT(' LESS THAN MINIMUM',)
	IF(NPAR.GT.NAXPAR.OR.NPAR.LT.NINPAR) GOTO 2
	IERR=1
	RETURN
900	CONTINUE
	IERR=2
	IF(IADDR(CPAR).NE.-1) NPAR=CPAR
	RETURN
	END
        SUBROUTINE DLTXT(STRING,OLDSTR,NEWSTR,LENSTR)
	COMMON/ERRCOM/IERR
	LOGICAL*1 STRING(1),OLDSTR(1),NEWSTR(1)
	INTEGER LENSTR
	CALL DLOUT(STRING,)
	IF(IADDR(OLDSTR).NE.-1) TYPE 12,(OLDSTR(I),I=1,80)
12	FORMAT(' OLD VALUE WAS=',80A1)
	READ(5,13)LENSTR,(NEWSTR(I),I=1,LENSTR)
13	FORMAT(Q,80A1)
	IERR=1
	IF(LENSTR.NE.0) NEWSTR(LENSTR+1)=0
	RETURN
	END
	CALL DLOUT(STRING)
	IF(IADDR(OLDSTR).NE.-1) TYPE 12,(OLDSTR(I),I=1,80)
12	FORMAT(' OLD VALUE WAS=',80A1)
	READ(5,13)LENSTR,(NEWSTR(I),I=1,LENSTR)
13	FORMAT(Q,80A1)
	IERR=1
	IF(LENSTR.NE.0) NEWSTR(LENSTR+1)=0
	RETURN
	END
*PARFIL
	SUBROUTINE PARFIL(INFILE)
	LOGICAL*1 FLNAM
	COMMON/FILENM/FLNAM(32)
	COMMON/ERRCOM/IERR
	LOGICAL*1 INFILE(1)
	DO 11	I=1,32
11	FLNAM(I)=0
	DO 12 I=1,32
	FLNAM(I)=INFILE(I)
12	IF(INFILE(I).EQ.0) GOTO 122
122	CONTINUE
	IERR=1
	RETURN
	END
	SUBROUTINE PARRD
	COMMON/ERRCOM/IERR
	INTEGER ARRAY
	LOGICAL*1 FLNAM
	COMMON/FILENM/FLNAM(32)
	COMMON/OPPARS/ARRAY(1)
	COMMON/OPPART/END
	INTEGER END,COMLEN
	OPEN(UNIT=1,NAME=FLNAM,TYPE='OLD')
	COMLEN=IADDR(END)-IADDR(ARRAY(1))
	COMLEN=COMLEN/2
	READ(1,30)(ARRAY(I),I=1,COMLEN)
30	FORMAT(8I8)
	IERR=1
	CLOSE(UNIT=1)
	RETURN
	END
	SUBROUTINE PARWT
	COMMON/ERRCOM/IERR
	INTEGER ARRAY
	LOGICAL*1 FLNAM
	COMMON/FILENM/FLNAM(32)
	COMMON/OPPARS/ARRAY(1)
	COMMON/OPPART/END
	INTEGER END,COMLEN
	OPEN(UNIT=1,TYPE='NEW',NAME=FLNAM)
	COMLEN=IADDR(END)-IADDR(ARRAY(1))
	COMLEN=COMLEN/2
	TYPE 12,COMLEN
12	FORMAT(' COMLEN=',I8)
	WRITE(1,30)(ARRAY(I),I=1,COMLEN)
30	FORMAT(8I8)
	CLOSE(UNIT=1)
	IERR=1
	RETURN
	END
#RXINCL                                           11-OCT-82  17:09:06
*RXINCL
C	INCLUDE FILE FOR RCVXMT TEST PROGRAM
C
C       VICKY WHITE, FNAL       JUN2282
C
	IMPLICIT INTEGER(A-Z)
        LOGICAL*1 RBSY,XBSY,STOP
	COMMON/CHANN/CHAN
	COMMON/ERRCOM/IERR
C
C  ARRAYS OF RECEIVER PTCS AND PARAMETERS FOR EACH RECEIVER PTC
C
        COMMON/OPPARS/
     &  RPTC(20),TOTRCV(20),RBSY(20),RWC(20),RDEV(20),RUNT(20),
     &  RCHAN(20),RMBN(20),RINDX(20),RERRS(20),RMODE(20),
     &  XPTC(20),TOTXMT(20),XBSY(20),XWC(20),XDEV(20),XUNT(20),
     &  XCHAN(20),XMBN(20),XNUM(20),XERRS(20),XMODE(20),
     &  XMTMAX,RCVMAX,NXMT,NRCV,MAXR,MAXX,MAXERR,ERRTOT,
     &  STOP                          !STOP ALWAYS AT END - 1 BYTE
C
	DATA RDEV,XDEV/40*'CD'/
	DATA RUNT,XUNT/40* 0  /
        DATA RBSY,XBSY/40*.TRUE./
	DATA RMODE/20*1/
	DATA RCHAN,XCHAN/40*2/
	DATA XWC/20*1000/
	DATA RWC/20*1000/
	DATA RCVLEN,XMTLEN/8000,4000/
	DATA RCVMAX,XMTMAX/1000,1000/
	DATA MAXR,MAXX/20,20/
	DATA MAXERR/5/
C
	DIMENSION STAT(2)
#RXINIT                                           19-OCT-82  11:49:38
C***
C       TITLE   RXINIT
C
C       Version 1.1     OCT1182
C
C
C    FACILITY:
C   TEST PROGRAMS FOR THE COMMUNICATIONS DRIVER PACKAGE CDPACK
C
C
C    ABSTRACT:
C   INITIALISATION SUBROUTINE FOR THE PARAMETERS OF THE TASK
C   RCVXMT
C
C
	SUBROUTINE RXINIT
*RXINCL
C
C  EACH RECEIVE PTC WILL BE ALLOCATED A PIECE OF THE BIG RCVBUF
C  RECEIVER BUFFER - STARTING AT THE CURRENT INDEX VALUE
C
C
C  READ IN SAVED SET OF PARAMETERS IF NEEDED
C
	CALL DLYENO(' USE PREDEFINED PARAMETERS ',PARS,PARS)
	IF(PARS.NE.1) GOTO 1
        CALL DLTXT(' FILE NAME ',,INFILE,32)
        CALL PARFIL(INFILE)
	CALL PARRD
	IF(IERR.NE.1) CALL DLOUT(' FILE READ ERROR ',IERR)
1       INDEX = 1
C
        DO 10 I=1,MAXR
        CALL DLDEC(' ENTER RCV PTC [CR=NO MORE]',,RPTC(I),1,256)
	IF(IERR.EQ.2) GOTO 20
	IF(IERR.EQ.3) GOTO 40
        CALL DLDEC(' ENTER CD UNIT NUMBER',0,RUNT(I),0,7)
11      CALL DLDEC(' MAX RCV BUF WC ',RWC(I),RWC(I))
	IF(INDEX+RWC(I) .LE. RCVLEN) GOTO 12
	CALL DLOUT(' NOT ENOUGH RCV BUFFER SPACE')
	GOTO 11
12	RINDX(I)=INDEX
	INDEX=INDEX+RWC(I)
C
C  ADD HERE ANY OTHER PARAMETERS FOR EACH RCV PTC
C
	CALL DLYENO(' Q RECEIVE QIOS',RMODE(I),RMODE(I))
10	CONTINUE
C
C  XMT PTC PARAMETERS
C
20	DO 30 I=1,MAXX
        CALL DLDEC(' ENTER XMT PTC [CR = NO MORE] ',,XPTC(I),1,256)
	IF(IERR.EQ.2) GOTO 40
        IF(IERR.EQ.3) GOTO 40
        CALL DLDEC(' ENTER CD UNIT NUMBER',0,XUNT(I),0,7)
        XBSY(I) = .FALSE.
	CALL DLDEC(' XMT BUF WC ',XWC(I),XWC(I),1,XMTLEN)
30      CONTINUE
40      CALL DLDEC(' MAX NO OF MSGS TO XMT ',XMTMAX,XMTMAX)
	CALL DLDEC(' MAX NO OF MSGS TO RCV ',RCVMAX,RCVMAX)
        CALL DLDEC(' MAX NO OF ERRORS ',MAXERR,MAXERR,1)
	CALL DLYENO(' SAVE CURRENT PARAMETERS ',SAV,SAV)
	IF(SAV.NE.1) GOTO 100
	CALL DLTXT(' FILE NAME ',INFILE,OUTFIL,32)
	CALL PARFIL(OUTFIL)
	CALL PARWT
	IF(IERR.NE.1) CALL DLOUT(' FILE WRITE ERROR ',IERR)
C
C  ASSIGN CHANNELS TO CD DRIVER.
100	CONTINUE
        DO 110 I=1,MAXR
        CALL CDASGN(RCHAN(I),'CD',RUNT(I),STAT)
        IF(STAT(1).NE.1) CALL CDERRM(STAT,MERR)
110	CONTINUE
	DO 120 I=1,XMAX
        CALL CDASGN(XCHAN(I),'CD',XUNT(I),STAT)
	IF(STAT(1).NE.1) CALL CDERRM(STAT,MERR)
120	CONTINUE
*RTINIT
	END
#RXSUMM                                           11-OCT-82  16:56:39
C***
C       TITLE   RXSUMM
C
C       Version 1.0     JUN2282
C
C
C    FACILITY:
C   TEST PROGRAMS FOR THE COMMUNICATIONS DRIVER PACKAGE CDPACK
C
C
C    ABSTRACT:
C   SUMMARY SUBROUTINE FOR THE TASK
C   RCVXMT
        SUBROUTINE RXSUMM
*RXINCL
        WRITE(5,2000) NXMT,NRCV
2000    FORMAT(' TOTAL XMTS = ',I6,' TOTAL RCVS = ',I6)
        WRITE(5,2001)
2001	FORMAT(' RPTC      NO.MSGS.      NO. ERRORS')
	DO 10 IR=1,MAXR
	IF(RPTC(IR).EQ.0) GOTO 15
	WRITE(5,2002) RPTC(IR),TOTRCV(IR),RERRS(IR)
2002	FORMAT(I6,5X,I6,8X,I6)
10	CONTINUE
C
15	WRITE(5,2003)
2003	FORMAT(' XPTC      NO.MSGS.      NO. ERRORS')
	DO 20 IX=1,MAXX
        IF(XPTC(IX).EQ.0) GOTO 25
        WRITE(5,2002) XPTC(IX),TOTXMT(IX),XERRS(IX)
20	CONTINUE
C
25	RETURN
	END
