HPAL,L,B,"VERIF"
BEGIN COMMENT  OCTOBER 31,1973
              THIS ALGOL PROGRAM IS PRIMARILY A CONTROL 
              ROUTINE.  MOST OF THE WORK IS DONE IN 
              ASSEMBLY LANGUAGE CODE PROCEDURES.  THE 
              ALGOL WRITES MESSAGES, READS QUANTITIES AND 
              CHANNEL NUMBERS, CHECKS FOR ERROR ENTRIES,
              SETS UP THE REQUESTED TEST AND CALLS THE
              2313B DRIVER (THROUGH THE FTN-ALGOL INTER-
              FACE, V2313), AND LISTS TEST RESULTS. 
; 
PROCEDURE STATPAC(DATA,NUMBERTAKEN,MODE,HOWMANY); 
COMMENT 
              THIS PROCEDURE CALCULATES THE AVERAGE OF ALL
              READINGS TAKEN ON ONE CHANNEL IN THE SI, TW,
              OR HI TESTS.  IT ALSO CALCULATES THE HIGHEST
              AND LOWEST VALUES AND THEIR DIFFERENCE
              (PEAK-TO-PEAK).  FINALLY, IT CALCULATES THE 
              RMS ERROR BETWEEN THE READINGS
              AND THE AVERAGE.  IT THEN PRINTS THESE VALUES 
; 
  VALUE MODE,HOWMANY; 
  INTEGER NUMBERTAKEN,MODE,HOWMANY;  REAL DATA;        CODE;
PROCEDURE I2313(UNIT,TYPE,PACE,MODE,CHANNELBUFFER,NUMBER, 
                DATABUFFER,DIFFERENTIAL); 
COMMENT 
              THIS IS THE ALGOL/FTN-DRIVER INTERFACE WHICH
              CALLS THE 2313B DRIVER (D.62V)
; 
  VALUE UNIT,TYPE,PACE,MODE,NUMBER,DIFFERENTIAL;
  INTEGER UNIT,TYPE,PACE,MODE,NUMBER,CHANNELBUFFER, 
       DIFFERENTIAL; REAL DATABUFFER;                  CODE;
PROCEDURE INTRP(WHERE,SC,TC,RS,BS,SS,HI,DI,ADDRESS,CO,
  LAD,REPEATOK,USEGAIN,LOOP,PACED,RATE,RANGE,EXTSS,LISTOK,IN);
COMMENT 
              THIS PROCEDURE IS THE COMMAND INTERPRETER.
              IT DOES THE COMMUNICATING WITH THE OPERATOR 
              WHEN FIRST CALLING A TEST OR SETTING A
              CONDITION 
; 
  INTEGER WHERE,SC,TC,RS,BS,SS,HI,DI,ADDRESS,LOOP,
   LISTOK,USEGAIN,PACED,RANGE,EXTSS,REPEATOK,CO,IN,RATE,LAD;
                                                       CODE;
PROCEDURE CNVRT(OUTBUFFER,INBUFFER,RGAIN,RGAIN2,START,NUMBER);
COMMENT 
              THIS PROCEDURE CONVERTS THE RAW INTEGER DATA
              IN THE BUFFER INTO REAL VOLTAGES (INCLUDING 
              ADJUSTMENT FOR GAIN); 
  VALUE RGAIN,RGAIN2,START,NUMBER;
  INTEGER START,NUMBER; 
  REAL OUTBUFFER,INBUFFER,RGAIN,RGAIN2;                CODE;
& 
& 
& 
& 
& 
& 
PROCEDURE DSPLY(CHANNEL,PACED,S); 
COMMENT 
              THIS PROCEDURE OPERATES THE 91000A SUBSYSTEM
              DIRECTLY, DISPLAYING THE RESULTS IN THE B AND 
              SWITCH REGISTERS
; 
VALUE CHANNEL,PACED;
INTEGER CHANNEL,PACED,S;                               CODE;
PROCEDURE HISTO(CHANNEL,PACED,RGAIN,HOWMANY,BUCKETS,
                NUMBERBUFFER,READINGBUFFER);
COMMENT 
              THIS PROCEDURE OPERATES THE 91000A SYSTEM 
              DIRECTLY TO TAKE UP TO 32767 READINGS AND 
              CATEGORIZE THEM INTO A HISTOGRAM
; 
  VALUE CHANNEL,PACED;
  INTEGER CHANNEL,PACED,BUCKETS,HOWMANY,NUMBERBUFFER; 
  REAL READINGBUFFER,RGAIN;                            CODE;
PROCEDURE EXIT(TEST,WHERETO); 
COMMENT 
              THIS PROCEDURE IS USED TO ABORT THE TEST OR 
              TO GET OUT OF LOOP OR DISPLAY.  IT SETS UP A
              SPECIAL TTY INTERRUPT AND JUMPS OPERATION 
              DIRECTLY TO THE SPECIFIED LABEL UPON TTY
              INTERRUPT 
; 
  VALUE TEST; INTEGER TEST; LABEL WHERETO;             CODE;
PROCEDURE READ1(IN,NO,P1);
COMMENT 
              READ1 AND READ2 ARE REALLY THE SAME PRO-
              CEDURE BUT WITH DIFFERENT LENGTH CALLS.  THE
              READX PROCEDURE, WHICH THESE CALL, READS THE
              TTY OR PHOTO-READER DEPENDING UPON WHAT IS
              SPECIFIED (TAPE OR KEYBOARD). 
; 
  VALUE IN,NO; INTEGER IN,NO,P1;                       CODE;
PROCEDURE READ2(IN,NO,P1,P2); COMMENT SEE READ1;
  VALUE IN,NO; INTEGER IN,NO,P1,P2;                    CODE;
PROCEDURE DELAY; COMMENT DELAY BETWEEN SCANS;          CODE;
INTEGER IN_1,OUT_2,CHANNEL,CHANNEL2,GAIN2,RATE, 
        RANGE,EXTSS,DONE,LOOP_0,DUMMY_0,I,J,K,MODE, 
        LISTOK,WHERE,HOWMANY,START,FINISH,PACED_0,FIRST,LAD_0,
        ADDRESS,FIRSTCHANNEL,SC,CO,GAIN,ANSR, 
        TC,RS,BS,SS,HI,DI,USEGAIN_0,NUMBER,REPEATOK,SAVEHOWMANY,
        DIFFERENTIAL,STATUS,BUCKETS,QUANT,SAVE,ABRT1; 
INTEGER ARRAY CHANNELBUFFER[1:200],N[1:25]; 
COMMENT 
              CHANNELBUFFER IS USED TO STORE THE CHANNEL
              CODES 
; 
& 
& 
& 
& 
& 
& 
& 
REAL ARRAY DATA[1:200]; 
COMMENT 
              DATA IS USED IN TWO WAYS.  THE DRIVER FILLS 
              THE SECOND HALF OF DATA WITH INTEGERS 
              (CONVERSION DATA).  CNVRT TAKES THESE 
              INTEGERS AND PUTS REAL VOLTAGES INTO DATA 
              IN A NORMAL WAY.  THAT IS, READING ONE IS IN
              DATA [1] AND IS THE FIRST TWO COMPUTER WORDS
              IN THE ARRAY; 
REAL RDUMMY_0.0,RGAIN,RGAIN2; 
BOOLEAN FIRSTTIME_TRUE; 
LABEL INITIALIZE,BACK,NUMBERIN,GETOUT,
      HISTLIST,SINGLECHANNEL,TWOCHANNEL,DISPLAY,
      TAKEREADINGS,WAIT,HISTOGRAM,
      ABORT,TERM,RITEABORT,READIN,
      ENDLIST,LISTER,DIRECTIONS,INFO, 
      REPEAT,READDIFF,NORMALIZE,DODISPLAY,
      GETREADINGS,DISABLELIST,INABORT,STATREAD; 
SWITCH OPERATE_INITIALIZE,INITIALIZE,DIRECTIONS,
               BACK,INITIALIZE,INITIALIZE,
               DISPLAY,REPEAT,LISTER,NORMALIZE; 
COMMENT 
              THIS SWITCH USES 'WHERE' TO DETERMINE WHAT
              INFORMATION (IF ANY) MUST BE ENTERED BY THE USER. 
; 
SWITCH DOIT_SINGLECHANNEL,TWOCHANNEL,BACK,
            BACK,SINGLECHANNEL,HISTOGRAM; 
COMMENT 
              AGAIN, 'WHERE' IS THE ARGUMENT.  ONLY THE 
              FIRST 6 VALUES OF 'WHERE' CAN GET TO THIS 
              SWITCH. THE 2ND  REFERENCE FOR SINGLE-
              CHANNEL IS USED BY SEQUENTIAL SCAN
; 
FORMAT F1(/" 91000A VERIF 10/31/73"), 
       F3(A2),F4(" NO= _"), 
       F6(" CHANNEL_"), 
       F9(" "),F11(" = _"), 
       F12(" ??"),F13(" WANT DIRECTIONS? _"), 
       F14(" DIFF? _"), 
       F16(" AVERAGE? _"),
       F18(" 1ST CH"),F19(" 2ND CH"), 
       F20(" ABORT"), 
       F24(I10),F25(" START,FINISH= _"),F26(7X,F10.6," _"), 
       F28(" RDGS TAKEN"),F29(F11.6,"   _"),
       F30(" NO FINISH:",I7," RDGS"), 
       F31(I6),F32(14X,"_"),
       F33(//"1-200 RDGS TOTAL UNLESS NOTED"//
            "A PROMPTER IS ISSUED:"// 
            ">"//"RESPOND WITH:"//
            "   SINGLE CH = ONE CH"/, 
            "      TWO CH = ALTERNATING CHS"/,
            "  SEQUENTIAL = FROM START CH"/,
            "   HISTOGRAM = 1-32767 RDGS ON 1 CH ARE CATEGORIZED"/, 
            "     DISPLAY = LOOP ON 1 CH, DISPLAY RDGS IN B OR SW REG"/ 
                "               AVERAGE=YES: 16 WD AVG; BIT 0", 
                " (LSB)=0.3125MV"/, 
            "               AVERAGE=NO: DISPLAY EACH RDG;", 
                    " BIT 4 (LSB)=5.0MV"/,
            "      REPEAT = REPEAT LAST TEST AS SPECIFIED"/ 
            "        LIST = LIST ANY PART OF DATA BUFFER"/
            "   NORMALIZE = ISSUE SYSTEM NORMALIZE"/
            "  CONDITIONS = LIST COND THAT ARE SET"/
            "INSTRUCTIONS = GIVE BRIEF INSTRUCTIONS"/ 
            "        TAPE = INPUT COMMANDS FROM TAPE-RDR"/
            "    KEYBOARD = INPUT COMMANDS FROM KEYBD"/ 
            "           * = COMMENT - IGNORE LINE"//
            "CONDITIONS:"// 
            "SET DELAY   (LIMITS SCAN RATE)"/ 
            "SET PACER   (OVERRIDES DELAY)"/ "SET REPEAT"// 
            "CLEAR DELAY"/,"CLEAR PACER"/,"CLEAR REPEAT"/,
            "CLEAR ALL   (CLEARS ALL COND)",//"NOTES:",// 
            "SW15 = 1 CAUSES EXIT FROM LIST",// 
            "ABORT REQUEST WITH NEG # (REPEAT DISABLED)",// 
            "ABORT A TEST; EXIT REPEAT OR DISPLAY WITH ANY KEYBD KEY ", 
            "(LIST DISABLED)",///); 
PROCEDURE READNUM; BEGIN
READIN: WRITE(OUT,F6);WRITE(OUT,F11);CHANNEL_201; 
       READ1(IN,1,CHANNEL); 
    IF CHANNEL THEN GO INABORT; IF CHANNEL>15 
      THEN BEGIN WRITE(OUT,F12);GO READIN;END;CHANNEL_CHANNEL+16; 
END;
COMMENT 
              CLEAR OUT ANY ABORT MODES (FOR RESTART);
  EXIT(0,GETOUT);WRITE(OUT,F1); CO_-1;
  IF FIRSTTIME THEN BEGIN 
INFO:  WRITE(OUT,F13); READ1(IN,-1,ANSR); 
       IF ANSR= "YE" THEN WRITE(OUT,F33) ELSE 
         IF ANSR# "NO" THEN GO TO INFO; 
COMMENT 
              IF THE PROGRAM WAS JUST LOADED, ALLOW THE 
              INSTRUCTIONS TO BE PRINTED. 
C 
              DON'T PRINT THE INSTRUCTIONS ON RESTART;
  CO_FIRSTTIME_FALSE; WRITE(OUT,F9);  END;
COMMENT 
              INITIALLY NO DATA IS AVAILABLE TO LIST
              AND NO VALID TEST IS DEFINED
              (NO REPEAT ALLOWED);
  REPEATOK_0; 
& 
COMMENT 
              LIST MUST, ALSO, BE DISABLED WHEN LOOPING;
DISABLELIST: LISTOK_0;
NORMALIZE:  COMMENT ISSUE SYSTEM NORMALIZE; 
      I2313(8,0,0,0,DUMMY,0,RDUMMY,0);
BACK:  COMMENT
              THE DESIRED TEST AND CONDITIONS ARE TO BE ENTERED;
  INTRP(WHERE,SC,TC,RS,BS,SS,HI,DI,ADDRESS,CO,LAD,
      REPEATOK,USEGAIN,LOOP,PACED,RATE,RANGE,EXTSS,LISTOK,IN);
  REPEATOK_LISTOK_FIRSTCHANNEL_-1;
& 
& 
& 
& 
  GO OPERATE[WHERE];  COMMENT 
              THIS SWITCH DETERMINES WHETHER OR NOT A TEST
              REQUIRING INPUT HAS BEEN ENTERED
 <
 <<<<<<<<<<<<<<<<<<<<<<<<<<<<<>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
 VALUE OF 
  WHERE     TEST ENTERED    DESTINATION         WHY 
  -----     ------------    -----------         --- 
    1     SINGLE CHANNEL     INITIALIZE   GET NO OF READINGS
    2     TWO CHANNEL        INITIALIZE   GET NO OF READINGS
    3     INSTRUCTIONS       DIRECTIONS   GIVE INSTRUCTIONS 
    4     NONE               BACK         SPARE 
    5     SEQUENTIAL SCAN    INITIALIZE   GET NO OF READINGS
    6     HISTOGRAM          INITIALIZE   GET NO OF READINGS
    7     DISPLAY            DISPLAY      SKIP TO CHANNEL NO
    8     REPEAT             REPEAT       DO TEST OVER
    9     LIST               LISTER       LIST DATA 
   10     NORMALIZE          NORMALIZE    ISSUE SYS NORM
 <<<<<<<<<<<<<<<<<<<<<<<<<<<<<>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
; 
INITIALIZE: I_GAIN2_RGAIN2_1; J_NUMBER_STATUS_0;
COMMENT       GET NO. OF READINGS;
NUMBERIN: HOWMANY_0;
  WRITE(OUT,F4); READ1(IN,1,HOWMANY); 
COMMENT 
              NEGATIVE NO. ABORTS;
  IF HOWMANY THEN GO INABORT ELSE 
COMMENT 
              IS IT A VALID NUMBER?;
    IF HOWMANY=0 OR NOT HI AND HOWMANY>200
      OR TC AND HOWMANY=1 
      THEN BEGIN WRITE(OUT,F12); GO TO NUMBERIN; END; 
SAVEHOWMANY_HOWMANY;
  IF SS THEN WRITE(OUT,F18);READNUM;
  GO DOIT[WHERE];  COMMENT
              THIS SWITCH DETERMINES WHICH TEST TO BE CON-
              STRUCTED (SEE DEFINITION OF WHERE ABOVE); 
SINGLECHANNEL: COMMENT ALSO SEQUENTIALSCAN; 
  CHANNELBUFFER[1]_CHANNEL; MODE_0; 
COMMENT 
              FOR SEQUENTIAL SCAN ASK IF CHANNELS ARE 
              DIFFERENTIAL OR SINGLE-ENDED AND SET THE
              INDICATOR;
  IF SS THEN BEGIN MODE_2; DIFFERENTIAL_0;
READDIFF: WRITE(OUT,F14); DONE_0; READ1(IN,-1,DONE);
      IF DONE="AB" THEN GO INABORT; 
      IF DONE="YE" THEN DIFFERENTIAL_-1 ELSE
        IF DONE#"NO" THEN GO READDIFF; END; GO TAKEREADINGS;
TWOCHANNEL:  COMMENT
              ON FIRST TIME THROUGH (ON EACH CALL TO 2C)
              SAVE FIRST CHANNEL INFORMATION AND GO BACK TO 
              INPUT SECTION;
  IF FIRSTCHANNEL  THEN BEGIN CHANNEL2_CHANNEL; 
      FIRSTCHANNEL_0; READNUM;GO DOIT[WHERE]; END;
& 
& 
& 
COMMENT 
              FORM OUTPUT BUFFER CONTAINING ALTERNATING 
              CHANNEL NUMBERS;
  FOR I_1 STEP 2 UNTIL 199 DO BEGIN 
    CHANNELBUFFER[I]_CHANNEL2;
    CHANNELBUFFER[I+1]_CHANNEL; END; MODE_1;
TAKEREADINGS:  EXIT(-1,GETOUT); 
GETREADINGS:  COMMENT 
                       INITIATE READINGS; 
  I2313(8,2,PACED,MODE,CHANNELBUFFER[1],HOWMANY,
        DATA[101],DIFFERENTIAL);
WAIT:  COMMENT
              MAKE STATUS CALL TO SEE IF READINGS HAVE ALL
              BEEN TAKEN; 
      I2313(8,1,STATUS,0,DUMMY,0,RDUMMY,0); 
  IF STATUS THEN GO WAIT; COMMENT NOT DONE; 
COMMENT 
                       DONE;
  IF LOOP THEN BEGIN DELAY; GO GETREADINGS;END; 
& 
COMMENT 
              CONVERT THE DATA FROM SINGLECHANNEL,
              TWOCHANNEL, OR SEQUENTIALSCAN.  HERE
              ALL GAIN INFORMATION IS PASSED IN ONE CALL
              AND ALL DATA CONVERTED
; 
         CNVRT(DATA[1],DATA[101],1.0,1.0,0,HOWMANY);
  DONE_2; 
  EXIT(0,GETOUT);  COMMENT  CLEAR ABORT FEATURE;
  IF TC THEN BEGIN DONE_4;
COMMENT 
              CALL STATPAC TO OPERATE ON FIRST CHANNEL
              DATA ON TWOCHANNEL (STATPAC MODE = 3);
    WRITE(OUT,F18); STATPAC(DATA[1],N[1],3,HOWMANY);
    WRITE(OUT,F19); END 
    ELSE IF NOT SC THEN BEGIN WRITE(OUT,F28); GO BACK;  END;
COMMENT 
              CALL STATPAC FOR SECOND CHANNEL DATA ON 
              TWOCHANNEL (MODE = 4) OR FOR ALL DATA ON
              SINGLECHANNEL (MODE = 2); 
  STATPAC(DATA[1],N[1],DONE,HOWMANY); 
  GO BACK;  COMMENT  ALL DONE, GO LOOK FOR A NEW COMMAND; 
& 
DISPLAY: READNUM; 
COMMENT 
           ASK IF AVERAGE IS DESIRED; 
STATREAD: WRITE(OUT,F16); DONE_0; READ1(IN,-1,DONE);
          STATUS_0; IF DONE="AB" THEN GO INABORT; 
                      IF DONE="YE" THEN STATUS_-1 ELSE
                        IF DONE#"NO" THEN GO STATREAD;
DODISPLAY:
DSPLY(CHANNEL,PACED,STATUS);
GO DISABLELIST;  COMMENT  NOTHING TO LIST AFTER DISPLAY;
REPEAT: 
          IF DI THEN GO DODISPLAY;
            IF NOT HI THEN GO TAKEREADINGS; 
& 
HISTOGRAM:
  NUMBER_HOWMANY; RGAIN_1.0;
  HISTO(CHANNEL,PACED,RGAIN,
        NUMBER,BUCKETS,N[1],DATA[1]); 
COMMENT 
              N[21] IS TRUE IF AN ABORT WAS MADE; 
  IF N[21] THEN GO GETOUT;
COMMENT 
              THE NUMBER IS NEGATIVE IF THE HISTOGRAM TERM- 
              INATES EARLY AND GIVES THE NUMBER OF READINGS 
              YET TO TAKE;
  IF NUMBER THEN WRITE(OUT,F30,HOWMANY+NUMBER); 
COMMENT 
              CALL STATPAC FOR THE HISTOGRAM CATEGORIES 
              (STATPAC MODE = 1); 
  STATPAC(DATA[1],N[1],1,BUCKETS);
HISTLIST: COMMENT LIST ALL CATEGORIES FOUND IN HISTOGRAM; 
  FOR I_1 TO BUCKETS DO BEGIN 
COMMENT 
              CHECK SWITCH 15 TO ESCAPE FROM LIST;
    IF KEYS THEN GO TERM; 
    WRITE(OUT,F29,DATA[I]); 
    WRITE(OUT,F24,N[I]);   END; 
TERM: IF LOOP THEN BEGIN WRITE(OUT,F9); GO TO HISTOGRAM; END; 
  GO ENDLIST; 
COMMENT 
              THIS IS THE LISTER CALLED BY THE LIST 
              COMMAND;
LISTER: IF HI THEN GO HISTLIST;  START_FINISH_0;
        HOWMANY_SAVEHOWMANY;
COMMENT 
              READ THE FIRST AND LAST READING NUMBERS TO BE 
              LISTED; 
  WRITE(OUT,F25); READ2(IN,2,START,FINISH); 
COMMENT 
              GET OUT IF EITHER IS NEGATIVE;
  IF START OR FINISH THEN GO BACK;
COMMENT 
              VALID FIRST AND LAST?;
IF START>FINISH OR START=0 OR START>HOWMANY THEN GO TO LISTER;
  IF FINISH>HOWMANY THEN FINISH_HOWMANY;
  WRITE(OUT,F9); IF NOT TC THEN 
         BEGIN
COMMENT 
               START LISTING GROUPS;
        FOR J_START TO FINISH DO BEGIN
        WRITE(OUT,F29,DATA[J]);WRITE(OUT,F9); 
        IF KEYS THEN GO ENDLIST;END;END;
COMMENT 
              PRINT TWO COLUMNS FOR TWOCHANNEL; 
  IF TC THEN BEGIN DONE_1;
    IF START MOD 2=0 THEN BEGIN DONE_-1; WRITE(OUT,F32); END; 
    FOR I_START TO FINISH DO BEGIN
      WRITE(OUT,F29,DATA[I]); 
      IF DONE THEN WRITE(OUT,F9); 
      DONE_-DONE; 
& 
COMMENT 
              ESCAPE?;
  IF KEYS THEN GO ENDLIST; END; 
    IF NOT DONE THEN WRITE(OUT,F9); END;
ENDLIST: WRITE(OUT,F9); GO BACK;
COMMENT       PRINT 'ABORT' AND DISABLE LIST.  ALSO 
              WILL DO A SYSTEM NORMALIZE; 
ABORT: LISTOK_0;
RITEABORT: WRITE(OUT,F20);
  GO NORMALIZE; 
INABORT:  COMMENT 
              THIS IS WHERE A NEGATIVE INPUT SENDS
              YOU FOR ABORT;
    REPEATOK_0;  GO RITEABORT;
GETOUT:  COMMENT
              THIS IS WHERE ABORT FEATURE SENDS YOU WHEN A
              TTY KEY IS PRESSED.  WHEN LOOPING THIS IS A 
              NORMAL EXIT AND IT IS NOT DESIRED THAT ABORT
              BE PRINTED; 
    IF LOOP THEN GO DISABLELIST;
  GO ABORT; 
DIRECTIONS: REPEATOK_LISTOK_0;
            WRITE(OUT,F33); WRITE(OUT,F9); GO BACK; 
END$
                                  