      HED 2311 VERIFICATION TEST SUBROUTINE ADCON (REV D AUG. 71) 
*TEST SUBROUTINE MAY BE CALLED BY A FORTRAN PROGRAM 
* 
*CALL STATEMENT:
* 
*     CALL ADCON(IMODE,IPACE,ICNUM,ICADD,IBUFF,ISCAN,IOLOC) 
* 
*DEFINITION OF CALL PARAMETERS: 
* 
*     IMODE = MODE SELECTION
*                 =0 SEQUENTIAL MODE
*                    STARTS AT CHANNEL 000 AND SEQUENTIALLY 
*                     SCANS THE NUMBER OF CHANNELS REQUESTED. 
* 
*                 =1 RANDOM MODE
*                    SCANS THE NUMBER OF CHANNELS REQUESTED 
*                     IN THE REQUESTED SQUENCE. 
* 
*                 =2 SINGLE CHANNEL MONITOR ONLY MODE 
*                    SCANS ONLY REQUESTED CHANNEL 
* 
*     IPACE = EXTERNAL PACER SELECTION
*               (AVAILABLE IN ONLY SEQUENTIAL OR MONITOR MODES) 
* 
*               =0  EXTERNAL PACER NOT USED IN ENCODE LINE
* 
*               =1  EXTERNAL PACER USED IN ENCODE LINE. 
*                     (FOR   2116    - 50KHZ MAX) 
*                     (FOR 2114/2115 - 40KHZ MAX) 
*                     (FOR   2100    - 53KHZ MAX) 
* 
*     ICNUM = NUMBER OF CHANNELS TO BE SCANNED. 
* 
*     ICADD = TABLE OF MULTIPLEXER CHANNEL ADDRESSES
*             TO BE SCANNED.
* 
*     IBUFF = DATA BUFFER 
* 
*     ISCAN = NUMBER OF SCANS ON EACH REQUESTED 
*             SET OF CHANNELS.
* 
*     IOLOC = COMPUTER I/O LOCATION OF A/D CONVERTER
*             INTERFACE CARD. 
* 
* THROUGHPUT RATES FOR THIS TEST SUBROUTINE (WITHOUT PACER) 
* 
*  COMPUTER ----------------------- 2116    2115/2114   2100
*    RANDOM MODE ------------------ 30KHZ     24KHZ     35KHZ 
*    SEQUENTIAL MODE -------------- 50KHZ     40KHZ     53KHZ 
*    SINGLE CHANNEL MONITOR MODE -- 50KHZ     40KHZ     53KHZ 
* 
* 
* 
      NAM ADCON 
* 
      ENT ADCON 
      EXT .ENTR,.IOC.,ENDIO 
IMODE NOP           MODE- SEQ=0 RAND=1 MONTR=2
IPACE NOP           EXT. PACER. 0=NO 1=YES
ICNUM NOP           NUMBER OF CHANS TO BE SCANNED 
ICADD NOP           TABLE OF CH. ADDRS TO BE SCANNED
IBUFF NOP           DATA BUFFER 
ISCAN NOP           NUMBER OF SCANS FOR EACH CHAN 
IOLOC NOP           INTERFACE CARD I/O LOCATION 
* 
ADCON NOP           ENTER AND EXIT ADCON SUBROUTINE 
      JSB .ENTR     PASS FORTRAN PARAMETERS 
      DEF IMODE 
      JSB ENDIO     WAIT FOR ALL I/O TO BE COMPLETED
      DEF *+1 
      CLF 0         DISABLE INTERRUPT SYSTEM
* 
*CONFIGURE ALL I/O INSTRUCTIONS 
* 
      LDA IOLOC,I   FETCH I/O SELECT CODE 
      IOR STC1      FORM STC SC,C INSTR 
      STA RSTC1 
      STA RSTC2 
      STA SSTC1 
      STA SSTC2 
      STA MSTC1 
      STA MSTC2 
* 
      LDA IOLOC,I   FETCH I/O SELECT CODE 
      IOR SFS1      FORM SFS SC INSTR 
      STA RSFS1 
      STA RSFS2 
      STA SSFS1 
      STA SSFS2 
      STA MSFS1 
      STA MSFS2 
      STA MSFS3 
      STA CSFS1 
* 
      LDA IOLOC,I   FETCH I/O SELECT CODE 
      IOR LIA1      FORM LIA SC INSTR 
      STA RLIA1 
      STA SLIA1 
      STA MLIA1 
* 
      LDA IOLOC,I   FETCH I/O SELECT CODE 
      IOR OTA1      FORM OTA SC INSTR 
      STA ROTA1 
      STA ROTA2 
      STA SOTA1 
      STA SOTA2 
      STA MOTA1 
      STA MOTA2 
      STA MOTA3 
* 
      LDA IBUFF     FETCH ADDRESS OF DATA BUFFER
      CMA,INA       SUBTRACT ONE
      CMA           AND 
      STA .DATA     STORE DECREMENTED ADD AS POINTER
      LDA ISCAN,I   FETCH NUMBER OF SCANS REQUESTED 
      CMA           SUBTRACT 1 AND
      STA SCTR      STORE AS NEGATIVE COUNTER 
* 
*TEST FOR MODE SELECTION
* 
      LDA IMODE,I   FETCH REQUESTED MODE
      SLA           RANDOM MODE?
      JMP RAND      YES 
      RAR 
      SLA           MONITOR ONLY MODE?
      JMP MONTR     YES 
      JMP SEQ       SEQUENTIAL MODE 
* 
*RANDOM MODE TEST DRIVER
* 
RAND  LDA ICADD     FETCH CHANNEL BUFFER ADDRESS
      STA .CHAN     STORE AS POINTER
      LDA .CHAN,I   FETCH 1ST CHAN # FROM BUFFER
ROTA1 OTA 0B        OUTPUT CHAN # TO A/D CONV 
      LDA ICNUM,I   FETCH NUMBER OF CHANS IN BUFFER 
      CMA           SUBTRACT 1 AND
      STA CHCTR     STORE AS NEGATIVE COUNTER 
      ISZ SCTR      REQUESTED SCANS COMPLETED?
      JMP *+2       NO
* 
      JMP CLEAN     YES 
* 
RSFS1 SFS 0B        READY FOR SCANNING? 
      JMP *-1       NO
* 
RSTC1 STC 0B,C      YES. ENCODE, START FIRST SCAN 
      LDA A         TIME DELAY
      JMP *+3 
* 
RSTC2 STC 0B,C      START NEXT SCAN 
      STA .DATA,I   STORE DATA IN BUFFER
      ISZ CHCTR     ALL REQUESTED CHANS SCANNED?
      JMP *+2       NO
* 
      JMP RAND      YES 
* 
      ISZ .CHAN     INCR. CHAN BUFFER POINTER 
      LDA .CHAN,I   FETCH NEXT CHANNEL NUMBER 
      AND =B17
ROTA2 OTA 0B        OUTPUT CHAN # TO A/D CONV 
      ISZ .DATA     INCR. DATA BUFFER POINTER 
RSFS2 SFS 0B        DATA READY? 
      JMP *-1       NO
* 
RLIA1 LIA 0B        YES. READ DATA
      JMP RSTC2 
* 
*SEQUENTIAL MODE TEST DRIVER
* 
SEQ   CLA           FORM RESET COMMAND
SSFS1 SFS 0B        READY FOR SCANNING? 
      JMP *-1       NO. 
SOTA1 OTA 0B        YES. RESET A/D
* 
      LDA ICNUM,I   YES. FETCH NUMBER OF CHANS
      CMA           SUBTRACT 1 AND
      STA CHCTR     STORE AS NEGATIVE POINTER 
      ISZ SCTR      REQUESTED SCANS COMPLETED?
      JMP *+2       NO
* 
      JMP CLEAN     YES 
      LDA SQM       FETCH SEQ COMMAND WORD
      LDB IPACE,I   FETCH PACER WORD. 0=NO 1=YES
      RBR,RBR       ROTATE PACER BIT
      RBR,RBR         TO BIT 12 
      ADA B         ADD PACER BIT TO SEQ COMMAND WD 
SOTA2 OTA 0B        OUTPUT SEQ COMMAND WORD 
SSTC1 STC 0B,C      ENCODE. START SCANS ON CH. 000
      LDA A         TIME DELAY
      JMP *+3 
* 
SSTC2 STC 0B,C      START NEXT SCAN 
      STA .DATA,I   STORE DATA IN BUFFER
      ISZ CHCTR     ALL REQUESTED CHS. SCANNED
      JMP *+2       NO
* 
      JMP SEQ       YES 
* 
      ISZ .DATA     INCR DATA BUFFER ADDR POINTER 
SSFS2 SFS 0B        DATA READY? 
      JMP *-1       NO
* 
SLIA1 LIA 0B        YES. READ DATA
      JMP SSTC2 
* 
*MONITOR ONLY TEST DRIVER 
* 
MONTR LDA ICADD,I   FETCH CHANNEL # FROM BUFFER 
MOTA3 OTA 0         SET ADC CHANNEL ADDRESS 
      LDB IPACE,I   FETCH PACER WORD. 0=NO 1=YES
      RBR,RBR       ROTATE PACER BIT
      RBR,RBR         TO BIT 12 
      ADA B         ADD PACER BIT TO COMMAND WORD 
MSFS1 SFS 0B        READY FOR SCANNING? 
      JMP *-1       NO
* 
MOTA1 OTA 0B        YES. OUTPUT COMMAND WORD
MSTC1 STC 0B,C      START SCANS 
      LDA A         TIME DELAY
      JMP *+3 
* 
MSTC2 STC 0B,C      START NEXT SCAN 
      STA .DATA,I   STORE DATA IN BUFFER
      ISZ SCTR      REQUESTED SCANS COMPLETED?
      JMP MONT1     NO. 
* 
      CLA           YES. FORM RESET COMMAND 
MSFS3 SFS 0B        SCANNING COMPLETED? 
      JMP *-1       NO. 
MOTA2 OTA 0B        YES. RESET A/D
      INA           SET REQUESTED # OF CHANNELS TO 1
      JMP CLEAN+1 
* 
MONT1 ISZ .DATA     INCR DATA BUFFER POINTER
MSFS2 SFS 0B        DATA READY? 
      JMP *-1       NO
* 
MLIA1 LIA 0B        YES. READ DATA
      JMP MSTC2 
* 
*EXIT SUBROUTINE
* 
CLEAN LDA ICNUM,I   FETCH NUMBER OF CHANNELS IN BUFF
      CMA,INA       STORE AS A
      STA CHCTR                NEGATIVE COUNTER 
      LDA .DATA     FETCH END ADDRESS OF DATA BUFFR 
      INA           INCR. 
      STA CDATA     STORE AS START ADDR OF CH BUFFR 
      LDA IBUFF     FETCH START ADDR OF DATA BUFFER 
      STA .DATA     STORE AS POINTER
* 
LOOP  LDA .DATA,I   FETCH FIRST OR NEXT DATA WORD 
      AND =B17      MASK OUT BCD CH. NUMBER 
      ADA =D-10     CONVERT 
      SSA,RSS               CH. # 
      ADA =B366                   TO
      ADA =A0:                       ASCII
      STA CDATA,I   STORE ASCII CH. NUMBER
      ISZ CDATA     INCR CH. BUFFER POINTER 
      ISZ .DATA     INCR DATA BUFFER POINTER
      ISZ CHCTR     ALL CH. # CONVERTED?
      JMP LOOP      NO
* 
CSFS1 SFS 0B        YES. A/D OPERATION COMPLETED
      JMP *-1       NO
* 
      CLC 0         YES.
      JMP ADCON,I   EXIT SUBROUTINE.
* 
* 
* 
*CONSTANTS AND WORKING AREA 
* 
* 
A     EQU 0 
B     EQU 1 
CDATA NOP           ASCII CH # BUFFER POINTER 
CHCTR NOP           REQUESTED # OF CHS. COUNTER 
LIA1  LIA 0         LIA 
OTA1  OTA 0         OTA 
SCTR  NOP           REQUESTED # OF SCANS COUNTER
SQM   OCT 040000    SEQ. MODE COMMAND WORD
SFS1  SFS 0         SFS 
STC1  STC 0,C       STC 
.CHAN NOP           CHANNEL BUFFER POINTER
.DATA NOP           DATA BUFFER POINTER 
      END 
FTN,B,L 
      PROGRAM TEST
      DIMENSION IBUFF(128),ICADD(16),OUT(7),IN(7) 
C 
C 
    5 PAUSE 
C 
C REPEAT SAME TEST PARAMETERS? YES-48, NO-10
      IF(ISSW(3)) 48,10 
C 
C SUPPRESS INITIAL PRINTOUT? YES-20, NO-15
C 
   10 IF(ISSW(0)) 20,15 
   15 WRITE(2,100)
C 
C BYPASS INITIALIZING OF IOLOC AND F.S. VOLTS? YES-30,NO-25 
C 
   20 IF(ISSW(2)) 30,25 
   25 WRITE(2,200)
      READ(1,*)IOLOC
      WRITE(2,930)
      READ(1,*)VOLT 
C 
   30 WRITE(2,300)
      READ(1,*)IMODE
      WRITE(2,400)
      READ(1,*)ISCAN
      ISN1=ISCAN
      DO 32 IC=1,16 
   32 ICADD(IC)=0 
C 
C CHECK REQUESTED MODE. SEQ. TO 45, RAND. TO 40, MONT. TO 35
C 
      IF(IMODE-1)45,40,35 
   35 WRITE(2,500)
      READ(1,*)ICADD(1) 
      ICNUM=ISN1
      ISN1=1
      WRITE(2,920)
      READ(1,*)IPACE
      GO TO 55
C 
   40 WRITE(2,500)
      READ(1,*)ICADD
      GO TO 47
C 
   45 WRITE(2,920)
      READ(1,*)IPACE
   47 WRITE(2,600)
      READ(1,*)ICNUM
   48 DO 50 I=1,7 
   50 IN(I)=I 
C ZERO DATA BUFFER
C 
   55 DO 60 IO=1,128
   60 IBUFF(IO)=0 
C 
C CALL ADCON SUBROUTINE TO READ DATA
C 
   65 CALL ADCON(IMODE,IPACE,ICNUM,ICADD,IBUFF,ISCAN,IOLOC) 
C 
C BYPASS DATA PRINTOUT? YES-95, NO-66 
C 
      IF(ISSW(1)) 95,66 
   66 IF(IMODE-2)67,68
   67 WRITE(2,700)(IN(I),I=1,ISCAN) 
      GO TO 69
C 
   68 WRITE(2,910)
   69 DO 90 K=1,ICNUM 
      IY=K
      DO 80 I=1,ISN1
   70 IA=177700B
      ID=IAND(IBUFF(IY),IA) 
      OUT(I)=FLOAT(ID)*VOLT/32768.
      IF(IMODE-2)75,80
   75 IY=IY+ICNUM 
   80 IX=IY 
      IF(IMODE-2)90,85
   85 IX=ICNUM+1
   90 WRITE(2,800)(IBUFF(IX),(OUT(I),I=1,ISN1)) 
   95 WRITE(2,900)
      GO TO 5 
C 
C 
  100 FORMAT(23X"2311A VERIFICATION TEST"// 
     1/"PARAMETERS TO BE ENTERED:"//3X"1) I/O LOCATION OF A/D 
     1 INTERFACE CARD"/8X"IOLOC=@XX (2 DIGIT OCTAL #)"//3X"2) 
     1 FULL SCALE INPUT VOLTS"/8X"F.S. VOLTS=XX.X (3
     1 DIGIT DEC #)"//3X"3) MODE"/8X"SEQUENTIAL------------ 
     1IMODE=0"/8X"RANDOM----------------IMODE=1"/8X"SINGLE
     1 CHAN MONITOR---IMODE=2"//3X"4) PACER"/8X"
     1NOT USED--IPACE=0"/8X"USED------IPACE=1"//3X
     1"5) # OF SCANS ON EACH SET OF CHANS"/8X"ISCAN=XXX (3
     1 DIGIT DEC #)"/15X"7 MAX FOR SEQUENTIAL OR
     1 RANDOM MODES"/15X"112 MAX FOR CHAN MONITOR 
     1 MODE"//3X"6) CHAN ADDRESSES TO BE SCANNED"/8X"ICADD
     1=XX,XX,--,(16 MAX, 2 DIGIT DEC #, 0-15)"//3X
     1"7) # OF CHANS TO BE SCANNED"/8X"ICNUM=XX (2 DIGIT DEC
     1 #)"///"COMPUTER SWITCH OPTIONS"//3X"SW(0)=1  BYPASS THIS 
     1 PRINTOUT"/3X"SW(1)=1  BYPASS DATA PRINTOUT"
     1/3X"SW(2)=1  BYPASS INITIALIZING IOLOC AND F.S. 
     1 VOLTS"/3X"SW(3)=1  REPEAT TEST"
     1//) 
  200 FORMAT("IOLOC= _")
  300 FORMAT("IMODE= _")
  400 FORMAT("ISCAN= _")
  500 FORMAT("ICADD= _")
  600 FORMAT("ICNUM= _")
  700 FORMAT(//"CHAN#",3X,7(I1," SCAN",3X)) 
  800 FORMAT(2X,A2,1X,7F9.4)
  900 FORMAT("END OF TEST") 
  910 FORMAT("CHAN #   VALUE")
  920 FORMAT("IPACE= _")
  930 FORMAT("F.S. VOLTS= _") 
      END 
      END$
                                                                                