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$