1 !!! PAM2 V04A-2 R. LEAVITT 19-AUG-76 EDIT 4 17-FEB-77 !!! PESTICIDE RESEARCH CENTER, MICHIGAN STATE U. !!! PROGRAM WORKS ON GC DATA FILES CREATED BY PAM12 !!! DOES OPTIONS 17-25. COMPANIONS PAM & PAM1 HANDLE OPT 1-8,9-16 !!! 100 PRINT "PAM V04A-2" 110 PRINT "OPTION"; : A$=FNA$(0%) : GOSUB 26000 : IF Q%<1% OR Q%>25% THEN OPEN "$OPTION.PAM" FOR INPUT AS FILE 1% : FOR K%=1% TO 32% : PRINT FNA$(1%) : NEXT K% : CLOSE 1% : GOTO 110 ! LIST AVAILABLE OPTIONS 130 IF Q%<17% THEN A$=SYS(CHR$(8%)+A$) : IF Q%>8% THEN CHAIN "$PAM1" 25000 ELSE CHAIN "$PAM" 25000 ! OPTION SELECTED REQUIRES PAM OR PAM1 132 IF D$="DK1:" THEN ON ERROR GOTO 11020 : GOSUB 2040 : CHANGE R% TO X$ : X$=SYS(X$) 134 X$=SYS(CHR$(6)+CHR$(-7)) : ON Q%-16% GOTO 1000,2000,3000,4000,5000,6000,2005,8000,136 136 PRINT Q%;"IS AN UNUSED OPTION" : GOTO 110 ! ! ! ! OPTION 17 CREATE A WINDOW FILE (PRIV UNLESS REPLACING) ! ! 1000 ON ERROR GOTO 11400 : PRINT CHR$(12%) : INPUT "WINDOW FILE #";A$ : A$=D$+"$WINDOW."+A$+"<0>" : OPEN A$ FOR INPUT AS FILE 4% : PRINT : PRINT "FILE EXISTS!!!" : PRINT "WINDOW ID: ";W8$(0);", LAST UPDATED ";W9$(0) : INPUT "REPLACE";X$ : IF LEFT(X$,1)<>"Y" THEN 32000 1020 CLOSE 4% : OPEN A$ AS FILE 4% : PRINT "WINDOW ID: (UP TO 32 CHARACTERS)"; : W8$(0)=FNA$(0%) : W9$(0)=DATE$(0%) : INPUT "NUMBER OF RETENTION TIME WINDOWS UP TO 20";M0% : W9(0,0)=M0% : IF M0%=1% THEN W9(1,1)=1 : M1%=1% 1040 INPUT "WINDOW TOLERANCE IN %";X : W9(0,1)=X*.01 : IF M0%>1% THEN INPUT "ARE ALL COMPONENTS OF STD THE SAME REL CONC";A$ : IF LEFT(A$,1)="Y" THEN W9(I%,1)=1 FOR I%=1% TO M0% : M1%=1% 1050 FOR I%=1% TO M0% : PRINT : PRINT "WINDOW #";I%;":" : INPUT "RETENTION TIME";W9(I%,0) : PRINT "NAME"; : W9$(I%)=FNA$(0%) : IF M1%=0% THEN INPUT "RELATIVE CONCENTRATION";C(I%) 1060 PRINT : NEXT I% : IF M1% THEN 32000 ELSE W9(I%,1)=C(I%)/C(1) FOR I%=1% TO M0% : GOTO 32000 ! ! ! ! OPTION 18 PRINT STATUS OF ALL WINDOW FILES ! ! W8$(0)=ID; W9$(0)=UPDATE; W9(0,0)=#WINDOWS ! W9(0,1)=TOLERANCE (DECIMAL) ! ! 2000 DIM #4%,W8$(0)=32%,W9$(20),W9(20,1) : DIM C(20) : PRINT CHR$(12%) : PRINT "WINDOW FILE STATUS [1,2]";D$;TAB(30);TIME$(0);TAB(40);DATE$(0) : PRINT : PRINT "FILE #";TAB(8%);"UPDATED";TAB(19%);"# WIND"; TAB(27%);"% TOL";TAB(34%);"WINDOW ID" 2005 ON ERROR GOTO 11500 : DIM R%(30) : R%(3)=-1%-30%*(VAL(MID(D$,3,1))-1%) : GOSUB 2040 ! LINE 2005 IS ALSO STARTING POINT FOR OPTION 23 2010 R%(3)=R%(3)+1% : IF R%(3)>255% THEN R%(3)=0% : R%(4)=R%(4)+1% 2020 GOSUB 2050 : CHANGE R% TO X$ : CHANGE SYS(X$) TO R% : A$=RAD$(R%(7)+SWAP%(R%(8)))+RAD$(R%(9)+SWAP%(R%(10))) : X$=RAD$(R%(11)+SWAP%(R%(12))) : IF A$<>"WINDOW" THEN 2010 2025 IF Q%=23% THEN W%(M1%)=VAL(X$) : M1%=M1%+1% : GOTO 2010 2030 A$=D$+"$"+A$+"."+X$ : OPEN A$ FOR INPUT AS FILE 4% : PRINT X$;TAB(8);W9$(0);TAB(18);W9(0,0);TAB(26); 100*W9(0,1);TAB(34);W8$(0) : CLOSE 4% : GOTO 2010 2040 R%(5)=2% : R%(6)=1% : R%(23)=68% : R%(24)=75% : R%(25)=VAL(MID(D$,3,1)) : R%(26)=255%*R%(25%) 2050 R%(0)=30% : R%(1)=6% : R%(2)=15% : RETURN ! ! ! ! OPTION 19 LIST CONTENTS OF SPECIFIC WINDOW FILE ! ! 3000 ON ERROR GOTO 11600 : PRINT CHR$(12%) : PRINT "TYPE WINDOW FILE # FOR LISTING OF FILE ELSE "; : IF LEN(FNA$(0%))=0% THEN 32000 3010 X$=D$+"$WINDOW."+A$ : OPEN X$ FOR INPUT AS FILE 4% : PRINT : PRINT : PRINT " I";TAB(6%);"RET. T. ";TAB(22%);"REL. C. "; TAB(39%);"NAME " 3020 FOR I%=1% TO W9(0,0) : PRINT I%;TAB(6%);W9(I%,0);TAB(23%);W9(I%,1);TAB(39%);W9$(I%) : NEXT I% : GOTO 3000 ! ! ! ! OPTION 20 TRANSFER ASCII FORMATTED RUNS DATA TO DISK RUNS MATRIX ! ! 4000 S%=1% : X$="<...."+CHR$(34)+" OPERATION" : GOSUB 13500 : PRINT "INPUT FILE NAME(S)"; : A$=FNA$(0%) 4010 FOR I%=1% TO LEN(A$) : IF ASCII(MID(A$,I%,1))=44% OR ASCII(MID(A$,I%,1))=91% THEN 4020 ELSE 4050 ! CHECK FOR "," & "[" 4020 IF ASCII(MID(A$,I%,1))=91% THEN M0%=1% : GOTO 4050 ! HAVE A "[" SO IGNORE NEXT "," 4030 IF M0% THEN M0%=0% : GOTO 4050 ! "," IGNORED 4040 A$(M1%)=LEFT(A$,I%-1%) : A$=RIGHT(A$,I%+1%) : M1%=M1%+1% : GOTO 4010 ! "," SEPARATES TWO FILE NAMES. KEEP LEFT AND CHECK RIGHT FOR MORE 4050 NEXT I% : A$(M1%)=A$ : FOR M0%=0% TO M1% : A$=A$(M0%) : OPEN A$ FOR INPUT AS FILE 3% : INPUT #3%,X 4060 ON ERROR GOTO 11700 : IF X<5000 THEN J%=1% : PRINT A$;" CONTAINS "; : INPUT "OLD SYSTEM DATA. GIVE 4 DIGIT YEAR";C(0) : C(0)=1000*(C(0)-1970) : GOTO 4500 ! ALL FILES UNDER OLD SYS HAVE X<5000; NEW SYS X=5000 4070 FOR I%=V% TO 15000% : INPUT #3%,X 4080 IF X=-10 THEN K%=K%+1% : GOSUB 19000 ! DO END OF RUN THINGS 4090 B(I%)=X : NEXT I% : GOTO 19000 ! IF WE GET HERE THE FILE'S TOO LARGE 4100 NEXT M0% 4500 FOR I%=V% TO 15000% : INPUT #3%,X : GOTO 4700 4530 IF X=-10 THEN K%=K%+1% : GOSUB 19000 ! DO END OF RUN THINGS 4540 B(I%)=X 4550 NEXT I% : GOTO 19000 ! IF WE GET HERE THE FILE'S TOO LARGE 4700 J%=J%+1% : IF J%=1% OR X=-9 THEN I%=I%-1% : GOTO 4550 ! THROW OUT RUN #'S AND -9'S FROM OLD SYS 4710 IF J%=3% THEN X=X+C(0) : GOTO 4540 ! CONVERT DAY OF YEAR TO ABSOLUTE RSTS DATE 4720 IF J%=4% THEN T=X : I%=I%-1% : GOTO 4550 ! T=OLD SYS HOURS 4730 IF J%=5% THEN X=X+60*T : GOTO 4540 ! COMBINE OLD SYS HOURS AND MINUTES INTO NEW MINUTES 4740 IF X<>-10 THEN 4540 ELSE I%=I%-1% : J%=0% : GOTO 4530 ! ! ! ! OPTION 21 CURRENT RUNS MATRIX FILE STATUS ! ! 5000 PRINT : PRINT : PRINT D$;"PAMNEW FILE STATUS ON ";DATE$(0%);" AT ";TIME$(0%) : PRINT : PRINT : PRINT "ACCOUNT CHAN LAST RUN # MATRIX DATE" : ON ERROR GOTO 11300 5003 IF S9%=1% THEN 5010 ELSE IF S9%>1% THEN J%=S9%-2% : R%(6%)=10% : GOTO 5015 ! ONLY LOOK UP [10,X] REQUESTED AS "PAM/X" FROM NON-LOGGED IN TERMINAL 5006 A$=SYS(CHR$(6)+CHR$(15)) : CHANGE A$ TO R% : IF R%(6)=10% THEN J%=R%(5) : GOTO 5015 ! ONLY LOOK UP [10,X] ACCT 5010 FOR J%=0% TO 12% 5015 IF J%=12% THEN A$=" 1,2" ELSE A$="10,"+RIGHT(NUM$(J%),2%) 5020 OPEN D$+"["+A$+"]PAMNEW" FOR INPUT AS FILE 2% : PRINT A$; : IF J%=12% THEN A$="BCK" ELSE A$=NUM$(J%) : A$=MID(A$,2%,LEN(A$)-2%) 5030 PRINT TAB(12%-LEN(A$));A$; : X=R1%(0) : GOSUB 12000 : PRINT TAB(21%-M0%);X$; : X=P1%(0) : GOSUB 12000 : PRINT TAB(35%-M0%);X$;TAB(37%); : IF R1%(0) THEN PRINT DATE$(B(R1%(R1%(0))+1%)) ELSE PRINT 5040 CLOSE 1% : IF R%(6)=10% THEN 5060 ! ONLY ONE FILE NEEDS TO BE LOOKED UP 5050 NEXT J% 5060 PRINT : PRINT "BYE";CHR$(10);CHR$(13) IF S9% : GOTO 32000 ! ! ! ! OPTION 22 ZERO RUNS MATRIX FILE ! ! 6000 X$=CHR$(34)+" ZERO" : S%=1% : GOSUB 13500 : GOTO 32000 ! ! ! ! OPTION 23: CREATE ASCII FILE OF ALL WINDOW FILES IN NUMERICAL ORDER ! ! ! GET HERE FROM LINE 11500 7000 DIM W%(100) : IF W%(V%)>W%(V%+1%) THEN I%=W%(V%) : W%(V%)=W%(V%+1%) : W%(V%+1%)=I% : V%=0% : GOTO 7000 ! W%'S=LIST OF WINDOW #'S IN ORDER 7020 V%=V%+1% : IF V%" : V%=W9(0,0) : PRINT #5%,V% : PRINT #5%,W8$(0) : PRINT #5%,W9$(J%) FOR J%=0% TO V% 7060 FOR K%=0% TO V% : PRINT #5%,W9(K%,J%) FOR J%=0% TO 1% : NEXT K% : CLOSE 4% : NEXT I% : PRINT #5%,CHR$(26) : GOTO 32000 ! ! ! ! OPTION 24: REBUILD LIBRARY OF WINDOW FILES FROM ASCII ! FILE CREATED BY OPTION 23 ! ! 8000 PRINT "WINDOW STORAGE FILE"; : OPEN FNA$(0%) FOR INPUT AS FILE 5% : V%=VAL(FNA$(5%)) : FOR I%=0% TO V% : OPEN D$+FNA$(5%) FOR OUTPUT AS FILE 4% : INPUT #5%,M1% : W8$(0)=FNA$(5%) : FOR K%=0% TO M1% 8020 W9$(K%)=FNA$(5%) : NEXT K% : FOR K%=0% TO M1% : INPUT #5%,W9(K%,J%) FOR J%=0% TO 1% : NEXT K% : CLOSE 4% : NEXT I% : GOTO 32000 ! ! ! ! ERROR HANDLING SUBROUTINES ! ! 11010 GOSUB 11100 : IF ERR<>10% THEN ON ERROR GOTO 0 ELSE A$="" : IF S% THEN A$=SYS(CHR$(6)+CHR$(15)) : K$=NUM$(ASCII(MID(A$,6,1))) : A$=NUM$(ASCII(MID(A$,5,1))) : A$="["+MID(K$,2,LEN(K$)-2%)+","+MID(A$,2,LEN(A$)-2%)+"]" 11015 RESUME 13590 11020 IF ERR<>21% THEN ON ERROR GOTO 0 ELSE D$="DK0:" : RESUME 134 11100 IF ERR=28% THEN RESUME 32000 ELSE RETURN ! CHECK FOR ^C FIRST SO PAMNEW WON'T BE UNNECESSARILY OPEN 11200 GOSUB 11100 : PRINT "IMPROPER RUNS SPEC" : RESUME 32000 ! TRY AGAIN 11300 GOSUB 11100 : IF ERR=5% OR ERR=10% THEN RESUME 5040 ELSE ON ERROR GOTO 0 11400 GOSUB 11100 : IF ERR=10% THEN PRINT "THE WINDOW REQUESTED CAN'T BE CREATED FROM A NON-PRIVILEGED ACCOUNT" : RESUME 32000 11410 IF ERR<>5% THEN ON ERROR GOTO 0 ELSE RESUME 1020 11500 GOSUB 11100 : IF ERR<>5% THEN ON ERROR GOTO 0 ELSE IF Q%=18% THEN RESUME 32000 ELSE M1%=M1%-1% : RESUME 7000 11600 GOSUB 11100 : IF ERR<>5% THEN ON ERROR GOTO 0 ELSE PRINT A$;TAB(15%);"NO FILE" : RESUME 3000 11700 GOSUB 11100 : IF ERR<>11% THEN ON ERROR GOTO 0 ELSE IF M0%=M1% THEN RESUME 31000 ELSE V%=I% : RESUME 4100 ! GET NEXT INPUT FILE (OPTION 20) ! ! ! ! PSUEDO PRINT USING SUBROUTINE ! ! 12000 X=INT(X*10.^D9%+.5)/10.^D9% : X$=NUM$(X) : X$=LEFT(X$,LEN(X$)-1%) : IF ABS(X)>=10^6 OR ABS(X)<10^-6 THEN IF X<>0 THEN M0%=9% : RETURN ! CHANGES X TO X$ WITH "," AND D9% DECIMAL PLACES ! RETURNS "." AS M0% 12030 IF ABS(X)<1 AND X<>0 THEN X$=LEFT(X$,1%)+"0"+RIGHT(X$,2%) 12040 IF D9%<1% THEN D9%=-1% : GOTO 12070 12050 X=INSTR(1%,X$,".") : IF X<>0 THEN 12060 ELSE X$=X$+"." : GOTO 12050 12060 IF LEN(X$)=X+D9% OR D9%<0% THEN 12070 ELSE X$=X$+"0" : GOTO 12060 12070 IF LEN(X$)>D9%+5% THEN X$=LEFT(X$,LEN(X$)-(D9%+4%))+","+RIGHT(X$,LEN(X$)-(D9%+3%)) 12090 M0%=INSTR(1%,X$,".") : IF M0%=0% THEN M0%=LEN(X$)+1% 12100 D9%=0% : RETURN ! ! ! ! SET UP PAMNEW FILE. [1,X] ACCOUNTS MUST SPECIFY ! ! P1%(0)=NEXT FREE SPOT IN B; R1%(0)=LAST RUN WRITTEN ! R1%(1-200)=STARTING POINT IN B FOR EACH RUN ! ! 13500 DIM #2%,P1%(0),R1%(200),B(15000) : ON ERROR GOTO 11010 : J%=ASCII(CHR$(PEEK(2056%))) : IF Q%=20% THEN PRINT "PUT IN "; 13510 PRINT "WHICH CHAN OR ACCT"; : IF INSTR(1,FNA$(0%),",")=0% THEN A$="10,"+A$ 13520 IF LEFT(A$,1)<>"[" THEN A$="["+A$+"]" 13590 ON ERROR GOTO 0 : A$=D$+A$+"PAMNEW" : IF S% THEN PRINT "CONFIRM ";CHR$(34);A$;X$; : INPUT X$ : IF LEFT(X$,1)<>"Y" THEN 32000 ELSE OPEN A$ FOR OUTPUT AS FILE 2% : P1%(0),R1%(0),R1%(1)=0% : RETURN 13595 OPEN A$ FOR INPUT AS FILE 2% : &"LAST RUN # WAS";R1%(0) : IF R1%(0)=200% OR P1%(0)=15000% THEN &"ACCT FULL. CHECK BCK FILE" ELSE IF R1%(0)=0% THEN 32000 ELSE RETURN ! ! ! ! REMOVE TERMINATORS ! ! 14000 DEF FNA$(C%) : INPUT LINE #C%,A$ 14010 A$=LEFT(A$,LEN(A$)-1%) : J%=ASCII(RIGHT(A$,LEN(A$))) : IF J%=10% OR J%=13% THEN 14010 ELSE FNA$=A$ : FNEND ! ! ! ! CHECK IF PAMNEW CAN HOLD ANY MORE DATA ! ! 19000 IF K%=200% OR I%=15000% THEN PRINT "CAN ONLY ACCEPT THE FIRST 200 RUNS OR 15000 TOTAL NUMBERS" : GOTO 31000 19010 R1%(K%+1%)=I%+1% : RETURN ! ! ! ! CHAIN IN POINT FROM "$LOGIN" WHEN "PAM/X" IS TYPED ON ! NON-LOGGED IN TERMINAL TO GET DEFAULT DISK ! "PAMNEW" FILE STATUS. THE "/X" IS OPTIONAL TO LOOK UP ! ONLY CHANNEL X ! ! 24000 S9%=1% ! ! ! ! CHAIN IN POINT FROM PAM OR PAM1. PASSES OPTION ! NUMBER FROM COMMON CORE ! ! 25000 A$=SYS(CHR$(7%)) : IF S9% THEN J%=INSTR(1,A$,"/") : IF J% THEN S9%=VAL(RIGHT(A$,J%+1%))+2% : A$=LEFT(A$,J%-1%) ! SET UP CHANNEL # FOR OPTION 21 WHEN ENTERED VIA LINE 24000 25010 GOSUB 26000 : GOTO 132 ! ! ! ! DECODE OPTION ANSWER AS FOLLOWS: ! OPTIONAL OUTPUT<2 OR 2 ! ! 26000 K$="KB:" : J%=INSTR(1,A$,"<") : I%=INSTR(J%+1%,A$,"<") : IF I% THEN J%=I% 26005 X$=RIGHT(A$,J%+1%) : IF J% THEN K$=LEFT(A$,J%-1%) ! K$=OUTPUT DEVICE OR FILE 26010 D$="DK1:" : J%=INSTR(1,X$,":") : IF J%=0% THEN Q%=VAL(X$) ELSE D$=LEFT(X$,J%) : Q%=VAL(RIGHT(X$,J%+1%)) ! D$=DEFAULT DISK; Q%=OPTION # 26020 RETURN 31000 P1%(0)=I% : R1%(0)=K% 32000 CLOSE 2%,3%,4%,5% : END