FTN,L 
C 
C     * * *  6 9 4 0  V E R I F I C A T I O N  T E S T  * * * 
C 
C     NAM:  T6940 
C     SOURCE TAPE:         09611-18006  REV A 
C     BINARY RELOCATABLE:  09611-16006  REV A 
C     MANUAL:              09611-90010  JUNE, 1975
C     AUTHOR:  JULIA A. CATES 
C 
C  THE 6940 VERIFICATION TEST, T6940, IS  AN ON-LINE FUNC-
C  TIONAL TEST OF THE 6940A/B MULTIPROGRAMMER I/O CARDS.
C  T6940 RUNS IN RTE OR RTEC.  THE 6940 MAY BE LOCAL OR 
C  REMOTE TO THE CENTRAL SYSTEM.
C 
      PROGRAM T6940 (3,99)
C 
      DIMENSION IPRM(5),IREGS(2)
      EQUIVALENCE (REGS,IREGS(1)) 
      DATA ICOD1/1/,ICOD2/2/,ICOD3/3/,ICOD12/12/
      DATA ICOD13/13/,IZERO/0/,IOFST/-10/ 
C 
C   CONFIGURATION SECTION.  SET THE INPUT DEVICE, OUTPUT
C   DEVICE AND MULTIPROGRAMMER LUS. 
C 
C  T6940 CHECKS TO SEE IF ON STARTING T6940, THE USER ENTERED 
C  LU'S OF INPUT OR OUTPUT DEVICES TO BE USED.
      CALL RMPAR (IPRM) 
      INLU = IPRM(1)
      IOUTLU = IPRM(2)
C  FIND OUT THE MAXIMUM VALID LU #. 
      CALL LUCHK (MAXLU)
      IF (INLU.EQ.0)  GOTO 10 
C  CHECK THE ENTERED LOGICAL UNIT NUMBER FOR THE
C  CORRESPONDING SELECT CODE AND DRIVER.
      IF (INLU.GT.MAXLU.OR.INLU.LT.0)  GOTO 5 
      CALL EXEC (ICOD13,INLU,IEQT5,IEQT4) 
      IDRIVR = IEQT5 / 400B 
      IDRIVR = IAND (IDRIVR,77B)
C  CHECK THAT ENTERED LU IS A VALID INPUT DEVICE LU.
      IF (IDRIVR.EQ.0.OR.IDRIVR.EQ.5.OR.IDRIVR.EQ.1)  GOTO 20 
      ISCODE = IAND (IEQT4,77B) 
      WRITE (1,1010) INLU,IDRIVR,ISCODE 
 1010 FORMAT (" LU # "I2": DRIVER "@2", SELECT CODE "@2)
 5    WRITE (1,1020) INLU 
 1020 FORMAT (" IMPROPER PARAMETER ("I2") ENTERED ON CALLING T6940."
     1/"RESTART T6940.")
      GOTO 999
 10   INLU = 1
 20   IF (IOUTLU.EQ.0) GOTO 30
C  CHECK THAT THE 2ND PARAMETER ENTERED IS A VALID
C  LIST DEVICE LU.
      IF (IOUTLU.GT.MAXLU.OR.IOUTLU.LT.0)  GOTO 25
      CALL EXEC (ICOD13,IOUTLU,IEQT5,IEQT4) 
      IDRIVR = IEQT5 / 400B 
      IDRIVR = IAND (IDRIVR,77B)
      IF (IDRIVR.EQ.0.OR.IDRIVR.EQ.5.OR.IDRIVR.EQ.12B)  GOTO 50 
      ISCODE = IAND (IEQT4,77B) 
      WRITE (1,1010)  IOUTLU,IDRIVR,ISCODE
 25   WRITE (1,1020)  IOUTLU
      GOTO 999
 30   IOUTLU = INLU 
 50   WRITE (IOUTLU,1050) 
 1050 FORMAT (" ENTER THE LU OF THE 6940 UNIT.")
      READ (INLU,*) LU
C   CHECK THAT THE ENTERED 6940 LOGICAL UNIT NUMBER 
C   IS ASSOCIATED WITH DVR61 OR DVA72.
      IF (LU.GT.MAXLU.OR.LU.LE.0)  GOTO 70
      CALL EXEC (ICOD13,LU,IEQT5,IEQT4) 
      IDRIVR = IEQT5 / 400B 
      IDRIVR = IAND (IDRIVR,77B)
      ISCODE = IAND (IEQT4,77B) 
      WRITE (IOUTLU,1010) LU,IDRIVR,ISCODE
      IF (IDRIVR.EQ.61B.OR.IDRIVR.EQ.72B)  GOTO 80
 70   WRITE (IOUTLU,1070) 
 1070 FORMAT (" IMPROPER LU.")
      GOTO 50 
 80   ICNWD = 100B + LU 
      ICWD20 = 2000B + LU 
      ICWD21 = 2100B + LU 
 85   WRITE (IOUTLU,1085) 
 1085 FORMAT (" ENTER THE # OF 6941'S.")
      READ (INLU,*)  I6941
      IF (I6941.LT.0.OR.I6941.GT.15) GOTO 85
      DO 90 I = 0,I6941 
      ITEMP = I + 170000B 
C   SEE IF THE COMPUTER CAN COMMUNICATE WITH THE
C   MULTIPROGRAMMER.
      REGS = EXEC (ICOD2,ICNWD,ITEMP,ICOD1,IZERO) 
      IERR = IAND (IREGS(1),377B) 
      IF (IERR.NE.0)  WRITE (IOUTLU,1090)  I,IERR 
 1090 FORMAT (" UNIT # "I2" HAS STATUS = "@3) 
 90   CONTINUE
C  SERCH CONFIGURES THE ID SEGMENT ADDRESS OF "SENSE" 
C  IN THE 6940 DRIVER'S EQT TABLE.  THUS, "SENSE" WILL
C  BE SCHEDULED ON SENSE MODE INTERRUPTS. 
      CALL SERCH (LU,IOUTLU,ISCODE,IDRIVR,MODE) 
      IF (MODE.EQ.-1)  GOTO 999 
      IF (MODE.EQ.1)  WRITE (IOUTLU,3000) 
C   CONFIGURATION COMPLETED.
C 
C   CONTROL MODE MENU.
C 
 100  WRITE (IOUTLU,1000) 
      WRITE (IOUTLU,1001) 
      WRITE (IOUTLU,1002) 
      WRITE (IOUTLU,1003) 
      WRITE (IOUTLU,1004) 
      WRITE (IOUTLU,1005) 
      WRITE (IOUTLU,1006) 
      WRITE (IOUTLU,1007) 
      WRITE (IOUTLU,1008) 
      WRITE (IOUTLU,1009) 
 1000 FORMAT (/"     * * * TEST MENU * * *")
 1001 FORMAT (" 1. INPUT TEST - NORMAL READ.")
 1002 FORMAT (" 2. INPUT TEST - READ DIRECT WITHOUT GATE.") 
 1003 FORMAT (" 3. SINGLE OUTPUT TEST.")
 1004 FORMAT (" 4. CONTINUOUSLY ROTATED OUTPUT TEST.")
 1005 FORMAT (" 5. EVENT SENSE TEST.")
 1006 FORMAT (" 6. PULSE COUNTER TEST.")
 1007 FORMAT (" 7. PROGRAMMABLE TIMER TEST.") 
 1008 FORMAT (" 8. STEPPER MOTOR CONTROL TEST.")
 1009 FORMAT (" 0. REPEAT PREVIOUS TEST." 
     1/" -1. TERMINATE PROGRAM.") 
 110  WRITE (IOUTLU,1100) 
 1100 FORMAT (" ENTER TEST NUMBER.")
      READ (INLU,*)  IASK 
      IF (IASK.EQ.0)  GOTO 160
      IF (IASK.LT.0)  GOTO 900
      IF (IASK.GT.8)  GOTO 100
      ITEST = IASK
 160  IF (ITEST.LT.5)  GOTO 200 
      GOTO (300,400,500,600),ITEST-4
C 
C  1-4.  INPUT/OUTPUT TEST SECTION. 
C    READ OR WRITE DVR61/DVA72 EXEC CALL. 
C 
 200  IF (ITEST.EQ.1) WRITE (IOUTLU,1001) 
      IF (ITEST.EQ.2) WRITE (IOUTLU,1002) 
      IF (ITEST.EQ.3) WRITE (IOUTLU,1003) 
      IF (ITEST.EQ.4) WRITE (IOUTLU,1004) 
      CALL INOUT (I6941,INLU,IOUTLU,ITEST,ICNWD)
      GOTO 110
C 
C  5.  EVENT SENSE TEST SECTION.
C 
 300  IF (MODE.EQ.0)  GOTO 310
      WRITE (IOUTLU,3000) 
 3000 FORMAT (" NO SENSE PROGRAM IN SYSTEM.") 
      GOTO 110
 310  WRITE (IOUTLU,1005) 
      WRITE (IOUTLU,3100) 
 3100 FORMAT (" SET REFERENCE WORDS.")
      CALL INOUT (I6941,INLU,IOUTLU,ITEST,ICNWD)
 340  WRITE (IOUTLU,3400) 
 3400 FORMAT (" CAUSE EVENTS!") 
C 
C    INTERRUPT SECTION. 
C 
 350  REGS = EXEC (ICOD3,ICWD20)
      CALL EXEC (ICOD12,IZERO,ICOD2,IZERO,IOFST)
      REGS = EXEC (ICOD3,ICWD21)
 370  WRITE (IOUTLU,3700) 
 3700 FORMAT (" REPEAT INTERRUPT MODE? (O=NO,1=YES)") 
      READ (INLU,*) IASK
 390  GOTO (370,110,350,370),IASK+2 
C 
C  6.  PULSE COUNTER TEST SECTION.
C 
 400  WRITE (IOUTLU,1006) 
C  OUTPUT 7777B TO THE PULSE COUNTER CARD.
      CALL INOUT (I6941,INLU,IOUTLU,ITEST,ICNWD)
      WRITE (IOUTLU,4000) 
 4000 FORMAT (" CARRY LINE CHECK:  PULSE COUNT UP INPUT ONCE" 
     1/"WHILE WATCHING CARRY LINE.")
      WRITE (IOUTLU,4100) 
 4100 FORMAT (" KEY IN A ""1"" WHEN READY TO CONTINUE.")
      READ (INLU,*) IASK
      ITEST = 11
C  READ THE COUNT ON THE CARD TO CHECK FOR OVERFLOW.
      CALL INOUT (I6941,INLU,IOUTLU,ITEST,ICNWD)
      WRITE (IOUTLU,4200) 
 4200 FORMAT (" BORROW LINE CHECK:  PULSE COUNT DOWN INPUT ONCE"
     1/"WHILE WATCHING BORROW LINE.") 
C  OUTPUT 0000 TO THE PULSE COUNTER CARD. 
      ITEST = 9 
      CALL INOUT (I6941,INLU,IOUTLU,ITEST,ICNWD)
      WRITE (IOUTLU,4100) 
      READ (INLU,*) IASK
      ITEST = 11
C  READ THE COUNT ON THE CARD TO CHECK FOR UNDERFLOW. 
      CALL INOUT (I6941,INLU,IOUTLU,ITEST,ICNWD)
      ITEST = 6 
      GOTO 110
C 
C  7.  PROGRAMMABLE TIMER TEST SECTION. 
C 
 500  WRITE (IOUTLU,1007) 
      WRITE (IOUTLU,5000) 
 5000 FORMAT (" PRESET TIMER COUNT, AND WATCH TIMER OUTPUT.") 
 510  CALL INOUT (I6941,INLU,IOUTLU,ITEST,ICNWD)
      ITEST = 7 
 520  WRITE (IOUTLU,5200) 
 5200 FORMAT (" REPEAT? (0=NO,1=YES)")
      READ (INLU,*)  IASK 
      GOTO (520,110,530,520),IASK+2 
 530  ITEST = 12
      GOTO 510
C 
C  8.  STEPPING MOTOR CONTROL TEST SECTION. 
C 
 600  WRITE (IOUTLU,1008) 
 610  WRITE (IOUTLU,6100) 
 6100 FORMAT (" SET THE # OF PULSES (LESS THAN 4000B)." 
     1/"  WATCH OUTPUT #1.")
C  SPECIFY OUTPUT #1 AND OUTPUT THE DESIRED # OF PULSES.
      CALL INOUT (I6941,INLU,IOUTLU,ITEST,ICNWD)
      ITEST = 10
      WRITE (IOUTLU,6200) 
 6200 FORMAT (" KEY IN A ""1"" WHEN READY TO WATCH OUTPUT #2.") 
      READ (INLU,*)  IASK 
C  SPECIFY OUTPUT #2 AND OUTPUT THE SAME # OF PULSES. 
      CALL INOUT (I6941,INLU,IOUTLU,ITEST,ICNWD)
      ITEST = 8 
 640  WRITE (IOUTLU,5200) 
      READ (INLU,*)  IASK 
      GOTO (640,110,680,640),IASK+2 
 680  ITEST = 13
      GOTO 610
C 
C  DSRCH RESTORES THE USER'S INTERRUPT HANDLING PROGRAM 
C  TO THE 6940 DRIVER'S TABLE.
 900  IF (MODE.EQ.0) CALL DSRCH 
 999  STOP  0 
      END 
      SUBROUTINE INOUT (I6941,INLU,IOUTLU,ITEST,ICNWD)
C 
C   INOUT IS A SUBROUTINE CALLED BY THE MAIN PROGRAM OF 
C   T6940.  INOUT IS A COLLECTION OF READ AND WRITE ROUTINES
C   TO THE 6940.
C 
C  T6940 TEST CODES FOR CALLS TO 6940 DRIVER: 
C 
C     ITEST = 1.  NORMAL READ CALL.  USER SPECIFIES UNIT #, 
C  SLOT #, AND TME ON OR OFF.  TEST IS REPEATED UNTIL THE 
C  USER ENTERS A -1 FOR TME.
C     ITEST = 2.  READ DIRECT WITHOUT GATE.  USER SPECIFIES 
C  UNIT # AND SLOT #. 
C     ITEST = 3.  NORMAL WRITE CALL.  USER SPECIFIES UNIT #,
C  SLOT #, AND DTE, SYE, AND TME ON OR OFF.  TEST IS REPEATED 
C  UNTIL USER ENTERS A -1 FOR DTE.
C     ITEST = 4.  NORMAL WRITE CALL - DTE, SYE ON.  USER
C  ENTERS UNIT # AND SLOT #.  THE CALL IS REPEATED 25 TIMES 
C  WHILE ROTATING A SINGLE BIT ON TWICE THROUGH THE 12 BITS.
C  FINAL CALL CLEARS ALL BITS.
C     ITEST = 5.  NORMAL WRITE CALL - SYE ON.  USER INPUTS
C  UNIT # AND SLOT # AND SETS REFERENCE WORD FOR EACH EVENT 
C  SENSE CARD IN THE 6940 UNDER TEST.  HE LEAVES THE
C  OUTPUT MODE BY ENTERING -1 FOR THE UNIT #. 
C     ITEST = 6.  NORMAL WRITE CALL - SYE ON.  USER ENTERS
C  THE UNIT # AND SLOT # OF THE PULSE COUNTER CARD.  000000 
C  IS OUTPUT TO THE CARD. 
C     ITEST = 7.  NORMAL WRITE CALL - SYE ON.  USER ENTERS
C  THE PROGRAMMABLE TIMER CARD UNIT #, SLOT # AND TIME
C  INTERVAL DATA WORD.
C     ITEST = 8.  NORMAL WRITE CALL - SYE, TME ON.  USER
C  SPECIFIES THE STEPPER MOTOR CARD UNIT #, SLOT # AND
C  DESIRED NUMBER OF PULSES.  THE NUMBER OF PULSES MUST BE
C  LESS THAN 4000B. 
C     ITEST = 9.  NORMAL WRITE CALL - SYE ON.  007777 IS
C  OUTPUT TO THE PULSE COUNTER CARD SPECIFIED IN ITEST = 6. 
C     ITEST = 10.  NORMAL WRITE CALL - SYE, TME ON.  THE #
C  OF PULSES AND BIT 11 ON IS OUTPUT TO THE STEPPER CARD
C  SPECIFIED IN ITEST = 8.
C     ITEST = 11.  NORMAL READ CALL - TME OFF.  DATA IS 
C  READ FROM THE PULSE COUNTER CARD SPECIFIED IN ITEST = 6. 
C     ITEST = 12.  NORMAL WRITE CALL - SYE ON.  USER ENTERS 
C  TIME INTERVAL DATA WHICH IS OUTPUT TO THE TIMER
C  CARD SPECIFIED IN ITEST = 7. 
C     ITEST = 13.  NORMAL OUTPUT CALL - SYE ON.  USER ENTERS
C  THE NUMBER OF PULSES TO BE OUTPUT BY THE STEPPER CARD
C  SPECIFIED IN ITEST = 8.  THE NUMBER OF PULSES MUST BE
C  LESS THAN 4000B. 
C 
C 
      DIMENSION IBUFFR (5)
      DIMENSION IREGS(2)
      EQUIVALENCE (REGS,IREGS(1)) 
      DATA IZERO/0/,ICOD1/1/,ICOD2/2/ 
      DATA ICOD12/12/,IOFST/-1/ 
C 
      IFUNC = 0 
      IF (ITEST.EQ.9)  IDATA = 0
      ITME = 0
      GOTO (20,50,600,130,320),ITEST-7
 20   WRITE (IOUTLU,1020) 
 1020 FORMAT (" UNIT #, SLOT # ? (-1 TO EXIT)") 
      READ (INLU,*)  IUNIT,ISLOT
      IF (IUNIT.LT.0)  GOTO 999 
      IF (IUNIT.GT.I6941)  GOTO 20
      IF (ISLOT.LT.0.OR.ISLOT.GT.14)  GOTO 20 
 40   BTEMP = ISLOT * 10000B
      GOTO (100,200,300,400,50),ITEST 
 50   IBUFFR(1) = 170040B + IUNIT 
      IF (ITEST.EQ.8)  IBUFFR(1) = IBUFFR(1) + 20B
      GOTO (320,500,320,320,350),ITEST-4
C 
C   INPUT CALL - NORMAL READ. 
C 
 100  WRITE (IOUTLU,1000) 
 1000 FORMAT (" TME? (0=OFF,1=ON,-1 TO EXIT)")
      READ (INLU,*) ITME
      IF (ITME.EQ.-1)  GOTO 999 
      IF (ITME.NE.0.AND.ITME.NE.1)  GOTO 100
 130  IBUFFR(1) = 2 
      IBUFFR(2) = 170240B + IUNIT + ITME*20B
      IBUFFR(3) = BTEMP 
      IBUFFR(4) = 1 
      IBUFFR(5) = 0 
      IBUFFL = 5
      REGS = EXEC (ICOD1,ICNWD,IBUFFR,IBUFFL,IFUNC) 
      IFUNC = 0 
      IERR = IAND (IREGS(1),377B) 
      IF (IERR.NE.0)  GOTO 370
 150  WRITE (IOUTLU,1500)  ISLOT,IBUFFR(5)
 1500 FORMAT (" SLOT # "I2" HAS DATA "@6) 
C  IN NORMAL READ TEST KEEP INPUTTING DATA UNTIL USER 
C  ENTERS -1 FOR TME. 
      IF (ITEST.EQ.1)  GOTO 100 
      GOTO 999
C 
C  INPUT - READ DIRECT WITHOUT GATE.
C 
 200  IFUNC = 2 
      GOTO 130
C 
C  OUTPUT CALLS TO MULTIPROGRAMMER. 
C 
C  SINGLE OUTPUT ENTRY POINT. 
 300  IDTE = 0
      ISYE = 0
      ITME = 0
      WRITE (IOUTLU,3000) 
 3000 FORMAT (" DTE, SYE, TME? (-1 TO EXIT)") 
      READ (INLU,*)   IDTE,ISYE,ITME
      IF (IDTE.EQ.-1)  GOTO 999 
      IF (IDTE.NE.0.AND.IDTE.NE.1)  GOTO 300
      IF (ISYE.NE.0.AND.ISYE.NE.1)  GOTO 300
      IF (ITME.NE.0.AND.ITME.NE.1)  GOTO 300
 310  IBUFFR(1) = 170000B + IUNIT 
      IBUFFR(1) = IBUFFR(1) + ITME*20B + ISYE*40B + IDTE*100B 
C  EVENT SENSE REFERENCE WORD, PROGRAMMABLE TIMER AND 
C   STEPPER MOTOR ENTRY POINT.
 320  WRITE (IOUTLU,3200) 
 3200 FORMAT (" ENTER DATA (OCTAL).") 
      READ (INLU,3300)  IDATA 
 3300 FORMAT (@4) 
      IF (IDATA)  999,330 
 330  IF (IDATA-10000B)  340,320
 340  IF (IDATA-4000B)  350,345 
 345  IF (ITEST.EQ.8.OR.ITEST.EQ.13)  GOTO 320
C  PULSE COUNTER TEST ENTRY POINT.
 350  IBUFFR(2) = BTEMP + IDATA 
 360  REGS = EXEC (ICOD2,ICNWD,IBUFFR,ICOD2,IFUNC)
      IERR = IAND (IREGS(1),377B) 
      IF (IERR.EQ.0)  GOTO 380
 370  WRITE (IOUTLU,3700)  IERR 
 3700 FORMAT ("ERROR RETURN FROM DRIVER.  STATUS = "@3) 
      IERR = IAND (IREGS(1),4)
      IF (IERR.EQ.0.OR.ITME.EQ.0)  GOTO 380 
      IBUFFR(1) = 170000B + IUNIT 
      IBUFFR(2) = BTEMP 
      REGS = EXEC (ICOD2,ICNWD,IBUFFR,ICOD2,IFUNC)
      IERR = IAND (IREGS(1),377B) 
      IF (IERR.NE.0)  WRITE (IOUTLU,3600)  IERR 
 3600 FORMAT (" ERROR IN DISARMING CARD.  STATUS = "@3) 
C  IN OUTPUT TEST KEEP REPEATING OUTPUT CALL UNTIL THE
C  USER ENTERS A NEGATIVE NUMBER FOR DTE. 
 380  IF (ITEST.EQ.3)  GOTO 300 
C  IN EVENT SENSE TEST ASK FOR UNIT & SLOT OF NEXT CARD 
C  IN ORDER TO SET ITS REFERENCE WORD.
      IF (ITEST.EQ.5)  GOTO 20
      GOTO 999
C 
C  CONTINUOUSLY ROTATED OUTPUT. 
C  T6940 SUSPENDS FOR A SECOND AND THEN OUTPUTS A 
C  WORD WITH THE NEXT CONSECUTIVE BIT TURNED ON.
 400  IBUFFR(1) = 170140B + IUNIT 
      DO 450 I = 1,2
      DO 440 J = 0,11 
      WRITE (IOUTLU,4200) J 
 4200 FORMAT (" BIT "I2)
      IDATA = 2 ** J
 410  IBUFFR(2) = BTEMP + IDATA 
      REGS = EXEC (ICOD2,ICNWD,IBUFFR,ICOD2,IFUNC)
      IERR = IAND (IREGS(1),377B) 
      IF (IERR.NE.0)  WRITE (IOUTLU,3700)  IERR 
      CALL EXEC (ICOD12,IZERO,ICOD2,IZERO,IOFST)
 440  CONTINUE
 450  CONTINUE
      IF (IDATA.EQ.0)  GOTO 460 
C  IN FINAL OUTPUT CLEAR ALL THE BITS.
      IDATA = 0 
      GOTO 410
 460  GOTO 999
C 
C  PULSE COUNTER OVERFLOW CHECK.
 500  IBUFFR(2) = BTEMP + 7777B 
      GOTO 360
C 
C  STEPPER MOTOR - ACTIVATE OUTPUT # 2. 
 600  IBUFFR(2) = BTEMP + 4000B + IDATA 
      GOTO 360
C 
C 
 999  RETURN
      END 
      END$
                                                                            