C C RSX-11M CAMAC TEST PROGRAM -- DESIGNED TO WORK WITH CA: DRIVERS C COMPATIBLE WITH P. CANNON'S 3912/3992 DRIVER. C C A LIST OF CAMAC AND DRIVER COMMANDS MAY BE INPUT, EDITED, AND C EXECUTED. DATA READ IN MAY BE LISTED. MULTIPLE PASSES MAY BE C PERFORMED. C C COMMANDS: C C I INSERT COMMANDS INTO THE LIST C D DELETE COMMANDS FROM THE LIST C R REPLACE COMMANDS IN THE LIST (SAME AS D FOLLOWED BY I) C P PRINT THE CURRENT COMMAND LIST C S SAVE THE CURRENT COMMAND LIST C G GET A SAVED COMMAND LIST C X EXECUTE THE COMMAND LIST AND PRINT DATA THAT IS READ C Q EXECUTE THE COMMAND LIST AND DO NOT PRINT DATA THAT IS READ C L LIST INPUT AND OUTPUT ON THE HARDCOPY TERMINAL C O OVERWRITE CURRENT COMMAND LIST WITH SAVED COMMAND LIST C C COMMAND FORMATS: C C (mm AND nn REPRESENT DECIMAL COMMAND NUMBERS IN THE RANGE 1 TO 99 C name IS A STANDARD RSX-11M FILENAME C crate IS A DECIMAL CRATE NUMBER: 0 FOR MASTER, 1 TO 62 FOR SERIAL C count IS A DECIMAL ITERATION COUNT IN THE RANGE 1 TO 32767 INCLUSIVE C F IS THE FUNCTION CODE TO BE EXECUTED C N IS THE MODULE (STATION) NUMBER C A IS THE SUBADDRESS C DATA IS THE OCTAL DATA TO BE WRITTEN, IN THE RANGE 0 TO 77777777) C C I INSERT COMMANDS AT THE END OF THE LIST C C Inn INSERT COMMANDS BEFORE COMMAND #nn C THE PROGRAM WILL PROMPT YOU FOR CAMAC COMMANDS OF THE FORM: C F,N,A C F,N,A,DATA C -F C OR -F,,,DATA (THREE COMMAS REQUIRED IF DATA PRESENT) C NEGATIVE F VALUES INDICATE FUNCTIONS THAT ARE PERFORMED BY THE C CAMAC DRIVER SOFTWARE; THE FOLLOWING FUNCTIONS ARE DEFINED: C C F=-1 START OF DRIVER DO-LOOP FOR 'DATA' ITERATIONS C F=-2 END OF DRIVER DO-LOOP C F=-3 SET UP MODULE NUMBER 'DATA' FOR LAM WAIT C F=-4 WAIT FOR A LAM C F=-5 SET NEW SERIAL HIGHWAY CRATE NUMBER 'DATA' C C THE DATA FIELD MUST BE SPECIFIED IF F IS -1, -3, -5, OR BETWEEN C 16 AND 23 INCLUSIVE (I.E. IT IS A WRITE COMMAND); DATA SPECIFIED C WITH OTHER F VALUES WILL BE IGNORED. C C Dmm DELETE COMMAND #mm FROM THE LIST C C Dmm,nn DELETE COMMANDS #mm THROUGH #nn INCLUSIVE C C Rmm REPLACE COMMAND #mm (SAME AS Dmm FOLLOWED BY Imm ) C C Rmm,nn REPLACE COMMANDS #mm THROUGH #nn INCLUSIVE (SAME AS Dmm,nn C FOLLOWED BY Imm ) C C P PRINT THE ENTIRE CURRENT COMMAND LIST ON THE TERMINAL C C Pmm PRINT COMMAND STEP #mm ON THE TERMINAL C C Pmm,nn PRINT COMMAND STEPS #mm THROUGH #nn INCLUSIVE C C Sname SAVE CURRENT COMMAND LIST AS A FILE CALLED name C C Gname GET COMMANDS FROM FILE name AND APPEND THEM TO THE LIST C C Xcrate,count C EXECUTE THE CURRENT COMMAND LIST FOR COUNT ITERATIONS, AND C PRINT ANY DATA READ BY THE COMMANDS IN THE LIST C C Qcrate,count C "QUIETLY" EXECUTE THE CURRENT COMMAND LIST FOR COUNT C ITERATIONS (DO NOT PRINT DATA READ BY COMMANDS IN THE LIST) C C Lflag C LIST INPUT AND OUTPUT ON HARDCOPY TERMINAL (flag=1) OR ONLY ON C SCREEN (flag=0) C C Oname OVERWRITE CURRENT COMMAND LIST WITH LIST STORED IN FILE name C (EQUIVALENT TO D1,99 FOLLOWED BY Gname ) C BYTE BITS(24),TIMDAT(18) INTEGER*2 L(100),F(100),N(100),A(100),IDATA(2,100) INTEGER*4 JDATA(100),DATALC INTEGER*2 FNABUF(301),DATBUF(2048) INTEGER*4 DATA(1024) INTEGER*2 DRVRF(5),DRVRL(5),DELRTN,FLEN,ITDATA(2),IPARM(6) INTEGER*2 DSW,IOSB(2) INTEGER*4 JTDATA,JEXTSG LOGICAL*1 COMAND,FNAME(30),STRING(79),QUIET,DIDASN,LISTIT,INFILE LOGICAL*1 ISFILE,MINUS EQUIVALENCE (IDATA,JDATA),(DATBUF,DATA),(FNAME,STRING),(ITDATA,JTDATA) DATA DRVRF/1,0,0,2,2/,DRVRL/1,0,1,0,1/,LEN/0/,DIDASN/.FALSE./ DATA DATA/1024*-1/,LISTIT/.FALSE./,INFILE/.TRUE./,ISFILE/.FALSE./ LTFNA(NL,NT,NF,NN,NA)=(((NL*2+NT)*32+NF)*32+NN)*16+NA CALL ERRSET(29,.TRUE.,.FALSE.,.TRUE.,.FALSE.) CALL ERRSET(30,.TRUE.,.FALSE.,.TRUE.,.FALSE.) CALL ERRSET(43,.TRUE.,.FALSE.,.FALSE.,.FALSE.) CALL ERRSET(63,.TRUE.,.FALSE.,.TRUE.,.FALSE.) CALL ERRSET(64,.TRUE.,.FALSE.,.TRUE.,.FALSE.) CALL TIME(TIMDAT(11)) CALL DATE(TIMDAT) TIMDAT(10)=' ' 1000 WRITE(5,1001) 1001 FORMAT('$TST> ') READ(5,1002,END=9990,ERR=1003)COMAND,STRING,N1,N2 1002 FORMAT(80A1,T2,2I10) IF(LISTIT)WRITE(3,9002)COMAND,STRING 9002 FORMAT(' TST> ',80A1) 1003 IF(COMAND.EQ.'S'.OR.COMAND.EQ.'G'.OR.COMAND.EQ.'O')GOTO1100 GOTO1900 1100 DO 1110 I=30,1,-1 1110 IF(FNAME(I).GT.' ')GOTO1120 WRITE(5,1115)COMAND IF(LISTIT)WRITE(3,1115)COMAND 1115 FORMAT(' *** ',A1,' COMMAND REQUIRES A FILENAME') GOTO1000 1120 FNAME(I+1)=0 FLEN=I 1900 NCMD=COMAND-64 IF(NCMD.LT.1.OR.NCMD.GT.26)GOTO1950 GOTO(1950,1950,1950,2000,1950,1950,2100,1950,2200,1950,1950,2800, 1 1950,1950,2900,2300,2400,2500,2600,1950,1950,1950,1950,2700, 2 1950,1950),NCMD 1950 WRITE(5,1955)COMAND IF(LISTIT)WRITE(3,1955)COMAND 1955 FORMAT(' *** "',A1,'" COMMAND IS NOT IMPLEMENTED') GOTO1000 C C Delete C 2000 ASSIGN 1000 TO DELRTN 2001 IF(N1.EQ.99)N1=LEN IF(N2.EQ.0)N2=N1 IF(N2.EQ.99)N2=LEN IF(N1.GT.0.AND.N1.LE.LEN)GOTO2010 WRITE(5,2002)N1 IF(LISTIT)WRITE(3,2002)N1 2002 FORMAT(' *** LINE NUMBER ',I6,' IS OUT OF RANGE') GOTO1000 2010 IF(N2.GE.N1.AND.N2.LE.LEN)GOTO2020 WRITE(5,2002)N2 IF(LISTIT)WRITE(3,2002)N2 GOTO1000 2020 N1T=N1 IF(N2.NE.LEN)GOTO2030 LEN=N1-1 GOTO2099 2030 K=LEN-N2 DO 2035 I=1,K N2=N2+1 L(N1)=L(N2) F(N1)=F(N2) N(N1)=N(N2) A(N1)=A(N2) JDATA(N1)=JDATA(N2) N1=N1+1 2035 CONTINUE LEN=N1-1 2099 GOTO DELRTN,(1000,2100,2510) C C Get C 2100 OPEN(UNIT=4,NAME=FNAME,TYPE='OLD',READONLY,ERR=2190) 2110 READ(4,2115,ERR=21990,END=2180)ITL,ITF,ITN,ITA,JTDATA 2115 FORMAT(I2,2X,3I3,O9) IF(LEN.LT.99)GOTO2130 WRITE(5,2120) IF(LISTIT)WRITE(3,2120) 2120 FORMAT(' *** COMMAND LIST FULL; REMAINDER OF INPUT FILE IGNORED') GOTO2180 2130 LEN=LEN+1 L(LEN)=ITL F(LEN)=ITF N(LEN)=ITN A(LEN)=ITA JDATA(LEN)=JTDATA GOTO2110 2180 CLOSE(UNIT=4) GOTO1000 2190 WRITE(5,2195)(FNAME(I),I=1,FLEN) IF(LISTIT)WRITE(3,2195)(FNAME(I),I=1,FLEN) 2195 FORMAT(' *** UNABLE TO OPEN INPUT FILE: ',A1) GOTO1000 21990 WRITE(5,21991)(FNAME(I),I=1,FLEN) IF(LISTIT)WRITE(3,21991)(FNAME(I),I=1,FLEN) 21991 FORMAT(' *** INPUT ERROR WHILE READING FILE: ',A1) GOTO1000 C C Insert C 2200 IF(N2.NE.0)WRITE(5,2205)'I',N2 IF(N2.NE.0.AND.LISTIT)WRITE(3,2205)'I',N2 2205 FORMAT(' *** "',A1,'" COMMAND TAKES AT MOST ONE PARAMETER; ', 1 I6,' IGNORED') IF(N1.EQ.0.OR.N1.EQ.99.OR.N1.GT.LEN+1)N1=LEN+1 2210 NLEFT=99-LEN IF(NLEFT.GT.0)GOTO2214 WRITE(5,2212) IF(LISTIT)WRITE(3,2212) 2212 FORMAT(' *** COMMAND LIST FULL; INSERT COMMAND IGNORED') GOTO1000 2214 WRITE(5,2215)NLEFT IF(LISTIT)WRITE(3,2215)NLEFT 2215 FORMAT(' THERE IS ROOM FOR ',I2,' MORE COMMAND(S) IN THE LIST'/ 1' ENTER COMMANDS AS F,N,A,DATA OR -F,,,DATA AND', 2' TYPE A CONTROL-Z TO END INPUT') IF(NLEFT.LE.0)GOTO2270 LC=N1-1 N2=99 IF(N1.GT.LEN)GOTO2219 DO 2218 I=LEN,N1,-1 LF=99-LEN+I L(LF)=L(I) F(LF)=F(I) N(LF)=N(I) A(LF)=A(I) JDATA(LF)=JDATA(I) L(I)=0 F(I)=0 N(I)=0 A(I)=0 JDATA(I)=0 2218 CONTINUE N2=98-LEN+N1 2219 LEN=99 2220 IF(LC.GE.N2)GOTO2270 LC=LC+1 2227 WRITE(5,2225)LC 2225 FORMAT('$#',I2,': ') READ(5,2230,END=2280,ERR=2290)F(LC),N(LC),A(LC),STRING 2230 FORMAT(3I10,T1,79A1) IF(LISTIT)WRITE(3,9230)LC,STRING 9230 FORMAT(' #',I2,': ',79A1) NCOMMA=0 DO 2231 I=1,79 IF(STRING(I).EQ.',')NCOMMA=NCOMMA+1 IF(NCOMMA.EQ.3)GOTO22319 2231 CONTINUE I=80 22319 NPOS=I+1 JDATA(LC)=0 MINUS=.FALSE. IF(NPOS.GT.79)GOTO2237 DO 2232 I=NPOS,79 2232 IF(STRING(I).GT.' ')GOTO2233 GOTO2237 2233 IF(STRING(I).NE.'-')GOTO22335 MINUS=.TRUE. I=I+1 GOTO22339 22335 IF(STRING(I).EQ.'+')I=I+1 22339 NPOS=I IF(NPOS.GT.79)GOTO22345 DO 2234 I=NPOS,79 2234 IF(STRING(I).LE.' ')GOTO2235 22345 I=80 2235 LLL=I-NPOS IF(LLL.LE.0)GOTO2237 I=I-1 IF(STRING(I).EQ.'.')GOTO2236 DECODE(LLL,22350,STRING(NPOS),ERR=22355)JDATA(LC) 22350 FORMAT(O) GOTO2237 22355 WRITE(5,22356)(STRING(I),I=NPOS,NPOS+LLL-1) IF(LISTIT)WRITE(3,22356)(STRING(I),I=NPOS,NPOS+LLL-1) 22356 FORMAT(' *** BAD OCTAL NUMBER: "',A1,'"') GOTO2227 2236 LLL=LLL-1 DECODE(LLL,22360,STRING(NPOS),ERR=22365)JDATA(LC) 22360 FORMAT(I) GOTO2237 22365 WRITE(5,22366)(STRING(I),I=NPOS,NPOS+LLL-1) IF(LISTIT)WRITE(3,22366)(STRING(I),I=NPOS,NPOS+LLL-1) 22366 FORMAT(' *** BAD DECIMAL NUMBER: "',A1,'"') GOTO2227 2237 IF(MINUS)JDATA(LC)=-JDATA(LC) JDATA(LC)=JDATA(LC).AND."77777777 IF(F(LC).GE.0)GOTO2240 IF(F(LC).LT.-5)GOTO2238 L(LC)=DRVRL(-F(LC)) GOTO2220 2238 WRITE(5,2239)F(LC) IF(LISTIT)WRITE(3,2239)F(LC) 2239 FORMAT(' *** INVALID DRIVER COMMAND NUMBER ',I6) LC=LC-1 GOTO2220 2240 L(LC)=0 IF(F(LC).GE.16.AND.F(LC).LE.23)L(LC)=1 IF(F(LC).LT.0.OR.F(LC).GT.31.OR.N(LC).LT.0.OR.N(LC).GT.31.OR. 1A(LC).LT.0.OR.A(LC).GT.15)GOTO2290 GOTO2220 2270 WRITE(5,2275) IF(LISTIT)WRITE(3,2275) 2275 FORMAT(' *** COMMAND LIST IS NOW FULL; ENDING INPUT MODE') GOTO2285 2280 CLOSE(UNIT=5) OPEN(UNIT=5,NAME='TI:') LC=LC-1 2285 N1=LC+1 IF(N1.GT.N2)GOTO1000 GOTO2000 2290 WRITE(5,2295) IF(LISTIT)WRITE(3,2295) 2295 FORMAT(' *** BAD CAMAC COMMAND; RE-ENTER') GOTO2227 C C Print C 2300 IF(LEN.GT.0)GOTO2303 WRITE(5,2301) IF(LISTIT)WRITE(3,2301) 2301 FORMAT(' *** COMMAND LIST IS EMPTY') GOTO1000 2303 IF(N1.EQ.0.AND.N2.EQ.0)N2=99 IF(N1.EQ.0)N1=1 IF(N1.EQ.99)N1=LEN IF(N2.EQ.0)N2=N1 IF(N2.EQ.99)N2=LEN IF(N1.GT.0.AND.N1.LE.LEN)GOTO2310 WRITE(5,2002)N1 IF(LISTIT)WRITE(3,2002)N1 GOTO1000 2310 IF(N2.GE.N1.AND.N2.LE.LEN)GOTO2320 WRITE(5,2002)N2 IF(LISTIT)WRITE(3,2002)N2 GOTO1000 2320 WRITE(5,2325) IF(LISTIT)WRITE(3,2325) 2325 FORMAT(' # F N A OCTAL DATA DECIMAL DATA') DO 2340 I=N1,N2 IF(L(I).EQ.1.AND.F(I).GE.0) 1 WRITE(5,2330)I,F(I),N(I),A(I),JDATA(I),JEXTSG(JDATA(I)) IF(L(I).EQ.1.AND.F(I).GE.0.AND.LISTIT) 1WRITE(3,2330)I,F(I),N(I),A(I),JDATA(I),JEXTSG(JDATA(I)) 2330 FORMAT(1X,I2,': ',I2,1X,I2,1X,I2,3X,O8,4X,I9,'.') IF(L(I).EQ.0.AND.F(I).GE.0) 1 WRITE(5,2333)I,F(I),N(I),A(I) IF(L(I).EQ.0.AND.F(I).GE.0.AND.LISTIT) 1WRITE(3,2333)I,F(I),N(I),A(I) 2333 FORMAT(1X,I2,': ',I2,1X,I2,1X,I2) IF(L(I).EQ.1.AND.F(I).LT.0) 1 WRITE(5,2335)I,F(I),JDATA(I),JEXTSG(JDATA(I)) IF(L(I).EQ.1.AND.F(I).LT.0.AND.LISTIT) 1WRITE(3,2335)I,F(I),JDATA(I),JEXTSG(JDATA(I)) 2335 FORMAT(1X,I2,': ',I2,9X,O8,4X,I9,'.') IF(L(I).EQ.0.AND.F(I).LT.0)WRITE(5,2338)I,F(I) IF(L(I).EQ.0.AND.F(I).LT.0.AND.LISTIT) 1WRITE(3,2338)I,F(I) 2338 FORMAT(1X,I2,': ',I2) 2340 CONTINUE GOTO1000 C C Quiet C 2400 QUIET=.TRUE. GOTO2710 C C Replace C 2500 ASSIGN 2510 TO DELRTN GOTO2001 2510 N1=N1T N2=0 GOTO2200 C C Save C 2600 IF(LEN.GT.0)GOTO2610 WRITE(5,2605) IF(LISTIT)WRITE(3,2605) 2605 FORMAT(' *** COMMAND LIST IS EMPTY; SAVE COMMAND IGNORED') GOTO1000 2610 OPEN(UNIT=4,NAME=FNAME,TYPE='NEW',CARRIAGECONTROL='LIST',ERR=2690) DO 2620 I=1,LEN 2620 WRITE(4,2115)L(I),F(I),N(I),A(I),JDATA(I) CLOSE(UNIT=4) GOTO1000 2690 WRITE(5,2695)(FNAME(I),I=1,FLEN) IF(LISTIT)WRITE(3,2695)(FNAME(I),I=1,FLEN) 2695 FORMAT(' *** UNABLE TO OPEN OUTPUT FILE: ',A1) GOTO1000 C C eXecute C 2700 QUIET=.FALSE. 2710 IF(LEN.GT.0)GOTO2712 WRITE(5,2711) IF(LISTIT)WRITE(3,2711) 2711 FORMAT(' *** CANNOT EXECUTE EMPTY COMMAND LIST') GOTO1000 2712 IF(N1.GE.0.AND.N1.LE.62)GOTO2714 WRITE(5,2713)N1 IF(LISTIT)WRITE(3,2713)N1 2713 FORMAT(' *** BAD INITIAL CRATE NUMBER ',I6) GOTO1000 2714 IF(N2.EQ.0)N2=1 IF(N2.GT.0)GOTO2720 WRITE(5,2715)N2 IF(LISTIT)WRITE(3,2715)N2 2715 FORMAT(' *** BAD REPEAT COUNT VALUE ',I6) GOTO1000 2720 LF=0 LC=0 2725 LC=LC+1 IF(LC.GT.LEN)GOTO2750 ITL=L(LC) ITT=0 IF(F(LC).LT.0)ITT=1 ITF=F(LC) ITN=N(LC) ITA=A(LC) JTDATA=JDATA(LC) IF(ITT.NE.0)ITT=1 IF(ITT.EQ.0)GOTO2730 ITF=DRVRF(-ITF) 2730 LF=LF+1 FNABUF(LF)=LTFNA(ITL,ITT,ITF,ITN,ITA) IF(ITL.EQ.0)GOTO2725 LF=LF+1 FNABUF(LF)=ITDATA(1) LF=LF+1 FNABUF(LF)=ITDATA(2) GOTO2725 2750 FNABUF(LF+1)=0 IF(DIDASN)GOTO2760 CALL ASNLUN(1,'CA',0) CALL ASNLUN(2,'CA',1) DIDASN=.TRUE. 2760 LUN=1 IF(N1.NE.0)LUN=2 CALL GETADR(IPARM(1),FNABUF(1)) IPARM(2)=LF*2 CALL GETADR(IPARM(3),DATBUF(1)) IPARM(4)=4096 IPARM(5)=ISHFT(N1,8)+3 IPARM(6)=0 IOSB(1)=0 IOSB(2)=0 ITER=0 2765 ITER=ITER+1 IF(ITER.GT.N2.OR.ITER.LT.0)GOTO1000 DSW=0 CALL QIO("1000,LUN,17,,IOSB,IPARM,DSW) IF(DSW.NE.1)GOTO2790 CALL STOPFR(17,) IF(DATA(1).EQ.-1)GOTO2775 IF((.NOT.QUIET).OR.(IOSB(1).NE.1))WRITE(5,2770)ITER IF(((.NOT.QUIET).OR.(IOSB(1).NE.1)).AND.LISTIT)WRITE(3,2770)ITER 2770 FORMAT(' PASS',I6,' OCTAL DATA DECIMAL DATA BINARY DATA') GOTO2779 2775 IF((.NOT.QUIET).OR.(IOSB(1).NE.1))WRITE(5,2776)ITER IF(((.NOT.QUIET).OR.(IOSB(1).NE.1)).AND.LISTIT)WRITE(3,2776)ITER 2776 FORMAT(' PASS',I6,' COMPLETE') 2779 IF(QUIET)GOTO2765 LC=0 2780 LC=LC+1 IF(LC.GT.1024)GOTO2765 IF(DATA(LC).EQ.-1)GOTO2765 DATALC=DATA(LC) IF(DATA(LC).GT."37777777)DATA(LC)=DATA(LC)-"100000000 CALL TOBITS(DATALC,BITS) WRITE(5,2785)LC,DATALC,DATA(LC),BITS IF(LISTIT)WRITE(3,2785)LC,DATALC,DATA(LC),BITS 2785 FORMAT(' [',I4,']: ',O13,2X,I13,2X,6(4I1,1X)) DATA(LC)=-1 GOTO2780 2790 WRITE(5,2795)DSW IF(LISTIT)WRITE(3,2795)DSW 2795 FORMAT(' *** INTERNAL ERROR ON CALL QIO; DSW=',O6,' OCTAL') STOP '-- INTERNAL ERROR; NOTIFY JOHN OSUDAR' C C List C 2800 LISTIT=(N1.NE.0) IF(.NOT.LISTIT)GOTO1000 IF(ISFILE)GOTO1000 OPEN(UNIT=3,NAME='CATEST.DAT',TYPE='NEW',ERR=2810) GOTO2820 2810 CALL ASNLUN(3,'CL',0) INFILE=.FALSE. 2820 ISFILE=.TRUE. WRITE(3,2829)TIMDAT 2829 FORMAT('1*** START OF CAMAC TEST RUN: ',18A1,' ***') GOTO1000 C C Overwrite C 2900 IF(LEN.LT.1)GOTO2100 N1=1 N2=LEN ASSIGN 2100 TO DELRTN GOTO2001 C 9990 WRITE(5,9995) IF(ISFILE)WRITE(3,9997) 9995 FORMAT(' CAMAC TEST COMPLETE.') 9997 FORMAT(' CAMAC TEST COMPLETE.'/'1') IF(ISFILE)CLOSE(UNIT=3) IF(INFILE.AND.ISFILE)WRITE(5,9996) 9996 FORMAT(' TO GET YOUR HARDCOPY RECORD, TYPE: PRNT') CALL EXIT END INTEGER*4 FUNCTION JEXTSG(JDATA) INTEGER*4 JDATA JEXTSG=JDATA IF((JDATA.AND."40000000).NE.0)JEXTSG=JDATA.OR."37700000000 RETURN END