HPAL,L,B,"VERIF"
BEGIN COMMENT  AUGUST 22,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 ADDR(BOX,CARD,CHANNEL); 
COMMENT 
              THIS PROCEDURE (IN CODES) COMBINES THE BOX, 
              CARD, AND CHANNEL ADDRESSES INTO THE PROPER 
              2313 FORMAT.
; 
  VALUE BOX,CARD; 
  INTEGER BOX,CARD,CHANNEL;                            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.62) 
; 
  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 GNCHK(GAIN,RGAIN);
COMMENT 
              THIS PROCEDURE CHECKS FOR A VALID LLMPX 
              GAIN AND CONVERTS IT TO THE PROPER CODE 
; 
  VALUE RGAIN; INTEGER GAIN; REAL RGAIN;               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 DESCR(START);  INTEGER START; 
COMMENT 
              THIS WRITES THE INSTRUCTIONS IF REQUESTED.
              IT IS DESTROYED, ALONG WITH THE INSTRUCTIONS, 
              BY OPERATION OF THE PROGRAM;             CODE;
PROCEDURE DSPLY(CHANNEL,PACED,RATE,RANGE,EXTSS,S);
COMMENT 
              THIS PROCEDURE OPERATES THE 2313B SUBSYSTEM 
              DIRECTLY, DISPLAYING THE RESULTS IN THE B AND 
              SWITCH REGISTERS
; 
VALUE CHANNEL,PACED,RANGE,EXTSS;
INTEGER CHANNEL,PACED,RANGE,EXTSS,S,RATE;              CODE;
PROCEDURE HISTO(CHANNEL,PACED,RATE,RANGE,EXTSS, 
                RGAIN,HOWMANY,BUCKETS,
                NUMBERBUFFER,READINGBUFFER);
COMMENT 
              THIS PROCEDURE OPERATES THE 2313B SYSTEM
              DIRECTLY TO TAKE UP TO 32767 READINGS AND 
              CATEGORIZE THEM INTO A HISTOGRAM
; 
  VALUE CHANNEL,PACED,RANGE,EXTSS;
  INTEGER CHANNEL,PACED,RANGE,EXTSS,BUCKETS,
          HOWMANY,NUMBERBUFFER,RATE;
  REAL READINGBUFFER,RGAIN;                            CODE;
PROCEDURE INTER(CHANNEL,HOWMANY,VOLTS,DATA,GROUPS,GAIN,GAINC,ABORT);
COMMENT 
              THIS PROCEDURE IS USED TO OPERATE LLMPX CARDS 
              IN INTERLACE MODE 
; 
  VALUE HOWMANY,GROUPS; 
  INTEGER CHANNEL,HOWMANY,GROUPS,GAINC,ABORT; 
  REAL VOLTS,DATA,GAIN;                                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 ISSUE(ON);
COMMENT 
              THIS PROCEDURE IS USED TO SET UP OR CLEAR 
              SS/H MODE 
; 
  VALUE ON; INTEGER ON;                                CODE;
& 
PROCEDURE READ1(IN,NO,P1);
COMMENT 
              READ1 THROUGH READ4 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).  READR READS
              REAL NUMBERS
; 
  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 READ3(IN,NO,P1,P2,P3); COMMENT SEE READ1; 
  VALUE IN,NO; INTEGER IN,NO,P1,P2,P3;                 CODE;
PROCEDURE READ4(IN,NO,P1,P2,P3,P4); COMMENT SEE READ1;
  VALUE IN,NO; INTEGER IN,NO,P1,P2,P3,P4;              CODE;
PROCEDURE READR(IN,NO,P1); COMMENT SEE READ1; 
  VALUE IN,NO; INTEGER IN,NO; REAL P1;                 CODE;
PROCEDURE DELAY; COMMENT DELAY BETWEEN SCANS;          CODE;
INTEGER IN_1,OUT_2,BOX,CARD,CHANNEL,CHANNEL2,GAIN2,RATE,
        RANGE,EXTSS,DONE,LOOP_0,DUMMY_0,I,J,K,MODE,STORAGE, 
        LISTOK,WHERE,HOWMANY,START,FINISH,PACED_0,FIRST,LAD_0,
        ADDRESS,FIRSTCHANNEL,SC,CO,GAIN,FUN,GROUPS_0, 
        TC,RS,BS,SS,HI,DI,USEGAIN_0,NUMBER,REPEATOK,SAVEHOWMANY,
        DIFFERENTIAL,STATUS,BUCKETS,QUANT,SAVE,ABRT1,SAVEGROUPS;
INTEGER ARRAY CHANNELBUFFER[1:200],N[1:25]; 
COMMENT 
              CHANNELBUFFER IS USED TO STORE THE CHANNEL
              CODES 
; 
REAL ARRAY DATA[1:200],G[1:25],Q[1:13]; 
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,QUEST,TURNOFF,
      HISTLIST,SINGLECHANNEL,TWOCHANNEL,DISPLAY,
      TAKEREADINGS,WAIT,HISTOGRAM,INTERLACE,
      ABORT,TERM,RITEABORT,READIN,FIND,DUOVER,
      PACEFAST,ENDLIST,LISTER,GROUPIN,AGAIN,
      REPEAT,READDIFF,NORMALIZE,FORM,DODISPLAY, 
      GETREADINGS,DISABLELIST,INABORT,STATREAD; 
SWITCH OPERATE_INITIALIZE,INITIALIZE,INITIALIZE,
               INITIALIZE,INITIALIZE,INITIALIZE,
               DISPLAY,REPEAT,LISTER,NORMALIZE; 
COMMENT 
              THE FIRST SIX VALUES OF 'WHERE' WANT TO GO
              THROUGH INITIALIZE.  DISPLAY IS FOR DISPLAY 
              MODE (SKIPS NUMBER OF READINGS REQUEST).
; 
SWITCH DOIT_SINGLECHANNEL,TWOCHANNEL,INTERLACE, 
            SINGLECHANNEL,SINGLECHANNEL,HISTOGRAM;
COMMENT 
              AGAIN, 'WHERE' IS THE ARGUMENT.  ONLY THE 
              FIRST 6 VALUES OF 'WHERE' CAN GET TO THIS 
              SWITCH. THE 2ND & 3RD REFERENCES FOR SINGLE-
              CHANNEL ARE USED BY SS/H & SEQUENTIAL SCAN
; 
FORMAT F1(/" 2313B VERIF  8/22/73"),
       F2(" LAST CH"),
       F3(A2),F4(" NO= _"),F5(" NO OF GPS= _"), 
       F6(" BX,CD,CH_"),F7(" BX,CD_"),
       F9(" "),F10(" NO CH'S= _"),F11(" = _"),
       F12(" ??"),F13(" NO CDS= _"),
       F14(" DIFF? _"),F15(" PACE FAST"), 
       F16(" STATUS? _"),F17(" CH'S/GP= _"),
       F18(" 1ST CH"),F19(" 2ND CH"), 
       F20(" ABORT"),F21(",GAIN_"), 
       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(" GROUP",I4); 
PROCEDURE READNUM; BEGIN
READIN: WRITE(OUT,F6);
   IF RS OR USEGAIN AND (NOT SS OR FIRSTCHANNEL) THEN 
      WRITE(OUT,F21);    WRITE(OUT,F11);
      BOX_CARD_CHANNEL_201; RGAIN_GAIN_8; 
   IF RS OR USEGAIN AND (NOT SS OR FIRSTCHANNEL) THEN BEGIN 
      READ3(IN,3,BOX,CARD,CHANNEL);READR(IN,0,RGAIN); 
            GNCHK(GAIN,RGAIN);END ELSE BEGIN
      READ3(IN,3,BOX,CARD,CHANNEL); RGAIN_GAIN_1; END;
   IF BOX OR CARD OR CHANNEL OR GAIN THEN GO INABORT; 
   IF BOX>7 OR CARD>11 OR CHANNEL>31 OR GAIN=8 OR (BOX+CARD)=0
        THEN BEGIN WRITE(OUT,F12); GO READIN; END;
COMMENT 
              CONSTRUCT CHANNEL CODE; 
   IF NOT RS THEN ADDR(BOX,CARD,CHANNEL); 
END;
COMMENT 
              CLEAR OUT ANY ABORT MODES (FOR RESTART);
  EXIT(0,GETOUT); 
  WRITE(OUT,F1);
  CO_-1;
  IF FIRSTTIME THEN BEGIN DESCR(CHANNELBUFFER[1]);
COMMENT 
              IF THE PROGRAM WAS JUST LOADED, ALLOW THE 
              INSTRUCTIONS TO BE PRINTED. 
C 
              DON'T ALLOW THE INSTRUCTIONS TO BE REQUESTED
              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     INTERLACE          INITIALIZE   GET NO OF READINGS
    4     SS/H               INITIALIZE   GET NO OF READINGS
    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_FUN_GAIN2_RGAIN2_1; IF BS THEN SS_-1; 
  J_NUMBER_STATUS_GROUPS_0; IF SS AND USEGAIN THEN FUN_-1 ; 
COMMENT       GET NO. OF READINGS;
NUMBERIN: HOWMANY_0;
IF RS THEN WRITE(OUT,F13)ELSE IF FUN THEN WRITE(OUT,F17) ELSE 
  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 OR (FUN OR RS) AND HOWMANY>25 
      THEN BEGIN WRITE(OUT,F12); GO TO NUMBERIN; END; 
GROUPIN: IF FUN OR RS THEN BEGIN IF RS THEN WRITE(OUT,F10) ELSE 
           WRITE(OUT,F5);READ1(IN,1,GROUPS);
           IF GROUPS THEN GO INABORT ELSE 
           IF GROUPS=0 OR GROUPS>25 OR GROUPS*HOWMANY>200 OR RS AND 
              GROUPS>16 THEN BEGIN WRITE(OUT,F12);
              GO TO GROUPIN;END;END;
  SAVEGROUPS_GROUPS; SAVEHOWMANY_HOWMANY; 
  IF SS AND NOT USEGAIN THEN BEGIN WRITE(OUT,F18);READNUM END ELSE
  IF SS THEN BEGIN FOR I_1 TO GROUPS DO BEGIN 
        WRITE(OUT,F33,I);READNUM;G[I]_RGAIN;
        CHANNELBUFFER[I]_CHANNEL+GAIN*8192;END; 
        DIFFERENTIAL_-1;MODE_2;RGAIN_RGAIN2_G[1];GO TAKEREADINGS;END
        ELSE READNUM; 
  GO DOIT[WHERE];  COMMENT
              THIS SWITCH DETERMINES WHICH TEST TO BE CON-
              STRUCTED (SEE DEFINITION OF WHERE ABOVE); 
SINGLECHANNEL: COMMENT ALSO SEQUENTIALSCAN; 
  IF NOT FIRSTCHANNEL  THEN GO READDIFF;
  RGAIN2_RGAIN; GAIN2_GAIN;  MODE_0;
  CHANNELBUFFER[1]_CHANNEL+GAIN2*8192;
COMMENT 
              FOR SEQUENTIAL SCAN ASK IF CHANNELS ARE 
              DIFFERENTIAL OR SINGLE-ENDED AND SET THE
              INDICATOR;
  IF SS THEN BEGIN MODE_2; FIRSTCHANNEL_DIFFERENTIAL_0; 
    IF LAD THEN BEGIN WRITE(OUT,F2); READNUM; GO DOIT[WHERE];END; 
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; RGAIN2_RGAIN; 
    GAIN2_GAIN;  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+GAIN2*8192; 
    CHANNELBUFFER[I+1]_CHANNEL+GAIN*8192; END; MODE_1;
TAKEREADINGS:  EXIT(-1,GETOUT);I_K_1; STORAGE_PACED;
  IF BS THEN BEGIN IF PACED THEN I2313(8,6,-EXTSS,EXTSS,
     RATE,RANGE,RDUMMY,0);
AGAIN:  I2313(8,1,STATUS,0,DUMMY,0,RDUMMY,0); 
  IF STATUS THEN GO AGAIN; ISSUE(1);PACED_0;END;
  IF LAD AND SS AND NOT USEGAIN THEN
     I2313(8,7,0,1,ADDRESS,CHANNEL,RDUMMY,0); 
GETREADINGS:  COMMENT 
              SET PACER (IF USED) AND INITIATE READINGS;
  IF PACED THEN I2313(8,6,-EXTSS,EXTSS,RATE,RANGE,RDUMMY,0);
  IF FUN THEN I2313(8,2,PACED,MODE,CHANNELBUFFER[I],HOWMANY,
                    Q[1],DIFFERENTIAL) ELSE 
  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 AND 3)>1 THEN GO PACEFAST; COMMENT PACE ERROR; 
  IF STATUS THEN GO WAIT; COMMENT NOT DONE; 
COMMENT 
              DONE -- SO TURN OFF PACER;
  IF PACED THEN I2313(8,6,0,0,DUMMY,0,RDUMMY,0);
  IF LOOP AND NOT FUN THEN GO TURNOFF;
  IF LAD AND SS AND NOT USEGAIN THEN
  I2313(8,7,0,0,ADDRESS,0,RDUMMY,0);
& 
& 
COMMENT 
              CONVERT THE DATA FROM SINGLECHANNEL,
              TWOCHANNEL, OR SEQUENTIALSCAN.  HERE
              ALL GAIN INFORMATION IS PASSED IN ONE CALL
              AND ALL DATA CONVERTED
; 
  IF FUN THEN CNVRT(DATA[K],Q[1],G[I],G[I],0,HOWMANY) ELSE
         CNVRT(DATA[1],DATA[101],RGAIN2,RGAIN,0,HOWMANY); 
  DONE_2; 
  IF FUN AND (I-GROUPS) THEN BEGIN I_I+1;K_K+HOWMANY; 
     GO GETREADINGS;END;
TURNOFF: IF BS THEN BEGIN ISSUE(0);PACED_STORAGE; 
  IF PACED THEN I2313(8,6,0,0,DUMMY,0,RDUMMY,0);END;
  IF  LOOP THEN BEGIN DELAY;  GO TAKEREADINGS;END;
  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; 
& 
INTERLACE: IF CHANNEL+ 2*(GROUPS-1)>30 THEN BEGIN WRITE(OUT,F12); 
              READNUM; GO INTERLACE;END;I_1;
FORM: SAVE_CHANNEL; ADDR(BOX,CARD,SAVE);CHANNELBUFFER[I]_SAVE;
      G[I]_RGAIN; N[I]_GAIN; IF (HOWMANY-I)#0 THEN BEGIN I_I+1; 
QUEST: BOX_CARD_RGAIN_201; WRITE(OUT,F7); WRITE(OUT,F21); 
       WRITE(OUT,F11); READ2(IN,2,BOX,CARD); READR(IN,0,RGAIN); 
       GNCHK(GAIN,RGAIN); IF BOX OR CARD OR GAIN THEN GO INABORT; 
       IF BOX>7 OR CARD>11 OR GAIN=8 THEN BEGIN WRITE(OUT,F12); 
       GO QUEST;END; GO FORM; END;
DUOVER: INTER(CHANNELBUFFER[1],HOWMANY,DATA[1],DATA[101],GROUPS,
        G[1],N[1],ABRT1); IF ABRT1 THEN GO GETOUT;
        WRITE(OUT,F28); GO BACK;
& 
DISPLAY: READNUM; IF USEGAIN THEN I2313(8,7,0,0,CHANNEL,
         GAIN,RDUMMY,0);
COMMENT 
           ASK IF STATUS BITS ARE 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,RATE,RANGE,EXTSS,STATUS); 
GO DISABLELIST;  COMMENT  NOTHING TO LIST AFTER DISPLAY;
REPEAT: IF RS THEN GO DUOVER; 
          IF DI THEN GO DODISPLAY;
            IF NOT HI THEN GO TAKEREADINGS; 
& 
HISTOGRAM:
  NUMBER_HOWMANY; N[1]_USEGAIN; 
  IF USEGAIN THEN I2313(8,7,0,0,CHANNEL,GAIN,RDUMMY,0); 
  HISTO(CHANNEL,PACED,RATE,RANGE,EXTSS,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 OF BUCKETS (CATEGORIES) IS SET 
              NEGATIVE (TRUE) IF A PACER ERROR IS DETECTED; 
  IF BUCKETS THEN GO TO PACEFAST; 
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; GROUPS_SAVEGROUPS; 
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 NOT (FUN OR RS) THEN BEGIN 
IF START>FINISH OR START=0 OR START>HOWMANY THEN GO TO LISTER;
  IF FINISH>HOWMANY THEN FINISH_HOWMANY;END ELSE
  BEGIN IF START>FINISH OR START > HOWMANY*GROUPS OR START=0
           THEN GO TO LISTER; IF FINISH>HOWMANY*GROUPS THEN 
           FINISH_HOWMANY*GROUPS;END; 
  WRITE(OUT,F9); IF NOT TC THEN 
          BEGIN FIRST_HOWMANY;
COMMENT 
               FIND GROUP CONTAINING START; 
  FIND: WHILE START>FIRST DO
            FIRST_FIRST+HOWMANY;
             K_FIRST+1 -START;
COMMENT 
               START LISTING GROUPS;
        FOR J_START TO FINISH DO BEGIN
          IF K=0 THEN BEGIN 
COMMENT 
               NEXT GROUP SO INSERT LINEFEED; 
        WRITE(OUT,F9); K_HOWMANY;END; 
        WRITE(OUT,F29,DATA[J]);WRITE(OUT,F9); K_K-1;
        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 
              CLEAR ABORT FEATURE AND PRINT 'PACE FAST';
PACEFAST: EXIT(0,GETOUT); WRITE(OUT,F15); 
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 BS THEN PACED_STORAGE; 
    IF LOOP THEN GO DISABLELIST;
  GO ABORT; 
END$
                                                                                                                                                                                                                                                              