1	!!!	PAM  V04A-2	R. LEAVITT  20-AUG-76    EDIT 4  01-JUL-77
	!!!	PESTICIDE RESEARCH CENTER, MICHIGAN STATE U.
	!!!	PROGRAM WORKS ON GC DATA FILES CREATED BY PAM12
	!!!	DOES OPTIONS 1-8.  COMPANIONS PAM1 & PAM2 HANDLE OPT 9-16,17-25
	!!!
100	PRINT "PAM  V04A-2"
110	PRINT "OPTION"; :
	INPUT LINE A$ :
	GOSUB 14000 :
	GOSUB 26000 :
	IF Q%<26% AND Q%>0% THEN 130	! VALID OPTION SELECTION
120	OPEN "$OPTION.PAM" FOR INPUT AS FILE 1% : 
	FOR K%=1% TO 32% :
	INPUT LINE #1%,A$ :
	GOSUB 14000 :
	PRINT A$ :
	NEXT K% :
	CLOSE 1% :
	GOTO 110	! LIST AVAILABLE OPTIONS
130	IF Q%>8% THEN A$=SYS(CHR$(8%)+A$) :
	IF Q%>16% THEN CHAIN "$PAM2" 25000 ELSE
	CHAIN "$PAM1" 25000	! OPTION SELECTED REQUIRES PAM1 OR PAM2
132	IF Q%=3% THEN K$="KB:"	! KEEP OPTION 3 ON KEYBOARD
134	ON Q% GOTO 140,140,140,142,140,136,136,136
136	PRINT Q%;"IS AN UNUSED OPTION" :
	GOTO 110
140	OPEN K$ FOR OUTPUT AS FILE 5%
	!
	!
	!
	! 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 POSITION IN B FOR EACH RUN
	!
	!
142	DIM #2%,P1%(0),R1%(200),B(15000) :
	ON ERROR GOTO 11010 :
	J%=ASCII(CHR$(PEEK(2056%))) :
	IF Q%=4% THEN PRINT "TAKE FROM ";
145	PRINT "WHICH CHAN OR ACCT"; :
	INPUT LINE A$ :
	GOSUB 14000 :
	IF INSTR(1,A$,",")=0% THEN A$="10,"+A$
150	IF LEFT(A$,1)<>"[" THEN A$="["+A$+"]"
160	ON ERROR GOTO 11020 :
	X$=SYS(CHR$(6)+CHR$(-7))	! SET ^C ERROR TRAP
165	OPEN D$+A$+"PAMNEW" 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
	!
	!
	!
	! SET UP RUNS MATRIX
	!
	!
170	PRINT "WHICH RUN"; :
	PRINT "S"; IF Q%<>3% :
	PRINT " DO YOU WANT"; :
	INPUT LINE A$ :
	DIM R%(200,1)
175	GOSUB 14000 :
	IF A$="" THEN R%(0,0)=1% :
	R%(1,0)=R1%(0) :
	R%(1,1)=R1%(R1%(0)) :
	GOTO 280	! DEFAULT SETS UP LAST RUN ONLY
180	ON ERROR GOTO 11200 :
	M0%,M1%=0% :
	C%=1% :
	FOR I%=1% TO LEN(A$) :
	IF ASCII(MID(A$,I%,1%))=44% OR ASCII(MID(A$,I%,1%))=45% THEN M1%=I%
	ELSE 260	! MARK POSITION OF "," OR "-"
190	IF ASCII(MID(A$,I%,1%))=44% THEN GOSUB 240 :
	R%(C%,0)=V% :
	GOTO 250	! TAKE CARE OF ","
200	IF M1%=LEN(A$) THEN GOSUB 240 :
	FOR J%=V% TO R1%(0) :
	R%(C%,0)=J% :
	C%=C%+1% :
	NEXT J% :
	GOTO 260	! TERMINAL "-" SITUATION
210	GOSUB 240 :
	K%=V% :
	M0%=M1% :
	FOR J%=I%+1% TO LEN(A$) :
	IF ASCII(MID(A$,J%,1%))<>44% THEN 230
220	M1%=J% :
	GOSUB 240 :
	I%=J% :
	FOR J%=K% TO V% :
	R%(C%,0)=J% :
	C%=C%+1% :
	NEXT J% :
	M0%=M1% :
	GOTO 260
230	NEXT J% :
	J%=J%+1% :
	GOTO 220	!  GOT TO END OF A$
240	V%=VAL(MID(A$,M0%+1%,M1%-M0%-1%)) :
	IF V%>R1%(0) THEN V%=1%/0% ELSE RETURN
	! NON-EXISTENT RUN #'S NOT ALLOWED
250	M0%=M1% :
	C%=C%+1%	! MARK LAST POSITION
260	NEXT I% :
	IF M1%<LEN(A$) THEN M1%=LEN(A$)+1% :
	GOSUB 240 :
	R%(C%,0)=V% :
	C%=C%+1%
270	R%(0,0)=C%-1% :
	FOR C%=1% TO R%(0,0) :
	R%(C%,1)=R1%(R%(C%,0)) :
	NEXT C%	! STARTING POSITIONS SET
280	ON ERROR GOTO 11100 :
	ON Q% GOTO 1000,2000,3000,4000,5000,6000,7000,8000	! STARTING 
	POINTS FOR OPTIONS 1-8
	!
	!
	!
	! OPTION 1	PRINT ALL GC DATA
	!
	!
1000	FOR I%=1% TO R%(0,0) :
	PRINT #5% FOR J%=1% TO 5% :
	A,T,S5%=0% :
	V%=R%(I%,1) :
	PRINT #5%,"RUN #";R%(I%,0);TAB(12%);DATE$(B(V%+1%));
1020	PRINT #5%,TAB(23%);TIME$(1440-B(V%+2%));TAB(34%);"CHAN";B(V%);TAB(44%);
	"METH";B(V%+4%);TAB(54%);"AC";B(V%+5%);TAB(61%);"PEAKS";B(V%+3%) :
	PRINT #5%:
	PRINT #5%
1030	IF B(V%+3%)=0 OR B(V%+6%)=-4 THEN 1140	! THERE ARE NO
	PEAKS OR PEAKS WITH NO AREA SO GET NEXT RUN
1050	IF B(V%+5%)=0 THEN A$="AREA" ELSE A$="CONC"
1060	PRINT #5%,"PEAK";TAB(11%);A$;TAB(19%);"RET TIME";TAB(33%);"HEIGHT";
	TAB(43%);"TYPE"; :
	IF Q%=2% OR Q%=3% THEN PRINT #5%,TAB(48%);"NAME"; :
	IF Q%=3% THEN PRINT #5%,TAB(60%);"OLD RT  UPDT";
1070	C%=0% :
	PRINT #5% :
	FOR K%=V%+6% TO 15000% :
	C%=C%+1% :
	IF C%=6% THEN
	IF Q%=2% OR Q%=3% THEN PRINT #5%,TAB(48);LEFT(A$,24%-4%*Q%); :
	IF Q%=3% AND A$<>"" THEN GOSUB 21000
1080	IF C%=6% THEN C%=1% :
	PRINT #5%
1090	X=B(K%) :
	IF B(K%+1%)=-10 THEN
	GOSUB 12000 :
	PRINT #5% :
	PRINT #5%,"TOTAL AREA =";TAB(17%-M0%);X$ :
	GOTO 1140
1095	IF C%=1% AND Q%=5% AND S5%<>-1% THEN GOSUB 22000
	! SEE IF IT'S PART OF A GROUPIE
1100	IF C%=3% THEN D9%=3% :
	IF Q%=2% OR Q%=3% THEN GOSUB 17000 :
	X1=X	! GET PEAK NAME AND RET TIME
1110	IF X>=-8 AND X<=-5 THEN X$=MID("BBVBVVBV",-2*X-9,2) :
	M0%=8% :
	GOTO 1130
1120	GOSUB 12000 :
	IF C%=3% THEN M0%=M0%+4%
1130	PRINT #5%,TAB(12%*(C%-1%)+4%-M0%);X$; :
	PRINT #5%,"*"; IF S4% AND C%=1% :
	NEXT K%
1140	NEXT I% :
	IF Q%=3% THEN RETURN ELSE PRINT #5%,CHR$(26) :
	GOTO 32000
	!
	!
	!
	! OPTION 2	PRINT ALL GC DATA AND NAME PEAKS IN
	!		ACCORDANCE WITH SPECIFIED WINDOW FILE
	!
	!
2000	GOSUB 19000 :
	GOTO 1000
	!
	!
	! OPTION 3	UPDATE WINDOW FILE USING SPECIFIED RUN #
	!
	!
3000	GOSUB 2000 :
	PRINT FOR J%=1% TO 5% :
	I%=0% :
	X$="T TIME" :
	INPUT "ANY WINDOWS TO REASSIGN";A$ :
	GOTO 3020
3010	PRINT :
	PRINT :
	INPUT "ANY REL CONCS TO CHANGE";A$ :
	I%=1% :
	X$="L CONC"
3020	IF LEFT(A$,1)<>"Y" THEN IF I% THEN 32000 ELSE 3010
3030	PRINT :
	PRINT :
	PRINT "TYPE <CR> IF RE";X$;" IS OK ELSE NEW VALUE" :
	PRINT :
	FOR K%=1% TO W9(0,0) :
	PRINT W9$(K%); :
	D9%=3% :
	X=W9(K%,I%)
3040	GOSUB 12000 :
	PRINT TAB(23%-M0%);X$;TAB(32%); :
	INPUT LINE A$ :
	GOSUB 14000 :
	IF LEN(A$)<>0% THEN W9(K%,I%)=VAL(A$) :
	W9$(0)=DATE$(0%)
3050	NEXT K% :
	IF I%=0% THEN 3010 ELSE
	X=W9(1,1) :
	W9(I%,1)=W9(I%,1)/X FOR I%=1% TO W9(0,0) :
	GOTO 32000
	!
	!
	!
	! OPTION 4	TRANSFER SPECIFIED RUNS IN ASCII FORMAT (EG. TO DEC TAPE)
	!
	!
4000	ON ERROR GOTO 0 :
	PRINT "OUTPUT FILE NAME"; :
	INPUT LINE A$ :
	GOSUB 14000 :
	OPEN A$ FOR OUTPUT AS FILE 3% :
	PRINT #3%,5000
4010	FOR I%=1% TO R%(0,0) :
	V%=R%(I%,1%) :
	FOR J%=V% TO 15000% :
	PRINT #3%,B(J%) :
	IF B(J%)=-10 THEN 4030
4020	NEXT J%
4030	NEXT I% :
	PRINT #3%,CHR$(26%) :
	GOTO 32000
	!
	!
	!
	! OPTION 5	OPTION 1 WITH GROUP PEAK
	!
	!
5000	INPUT "INPUT LOW,HIGH RET TIMES FOR GROUP OF PEAKS";L,H :
	IF L>H THEN R=L :
	L=H :
	H=R
5010	GOTO 1000
	!
	!
	!
	! ERROR HANDLING SUBROUTINES
	!
	!
11010	GOSUB 11100 :
	IF ERR<>10% THEN ON ERROR GOTO 0 ELSE
	A$="" :
	RESUME 160
11020	GOSUB 11100 :
	IF ERR<>21% THEN ON ERROR GOTO 0 ELSE
	D$="DK0:" :
	ON ERROR GOTO 32000 :
	RESUME 165	! NOW ASSUME FILES ON DK0:
11100	IF ERR=28% THEN RESUME 32000 ELSE RETURN	! CHECK FOR ^C FIRST
	SO THAT PAMNEW WON'T REMAIN UNNECESSARILY OPEN
11200	GOSUB 11100 :
	PRINT "IMPROPER RUNS SPEC" :
	RESUME 32000	! TRY AGAIN
	!
	!
	!
	! 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
	!
	!
	!
	! REMOVE TERMINATORS FROM INPUT LINE STATEMENTS
	!
	!
14000	A$=LEFT(A$,LEN(A$)-1%) :
	J%=ASCII(RIGHT(A$,LEN(A$))) :
	IF J%=10% OR J%=13% THEN 14000 ELSE RETURN
	!
	!
	!
	! CHECK FOR PEAK RETENTION TIME MATCH WITH GIVEN
	! WINDOW FILE COMPONENT (OPTION 3)
	!
	!
17000	FOR J%=1% TO W9(0,0) :
	W1=W9(J%,0)*(1-W9(0,1)) :
	W2=W9(J%,0)*(1+W9(0,1)) :
	IF X>=W1 AND X<=W2 THEN A$=W9$(J%) :
	RETURN	! GOT PEAK NAME
17030	NEXT J% :
	A$="" :
	RETURN
	!
	!
	!
	! SET UP WINDOW FILE FOR OPTIONS 2 AND 3
	!
	! W8$(0)=ID; W9$(0)=UPDATE; W9(0,0)=# WINDOWS;
	! W9(0,1)=TOLERANCE (DECIMAL)
	!
	!
19000	ON ERROR GOTO 0 :
	DIM #3%,W8$(0)=32%,W9$(20),W9(20,1) :
	INPUT "WINDOW FILE #";A$ :
	J%=INSTR(1%,A$,":") :
	IF J%=0% THEN A$=D$+"$WINDOW."+A$ ELSE
	A$=LEFT(A$,J%)+"$WINDOW."+RIGHT(A$,J%+1%)
19010	OPEN A$ FOR INPUT AS FILE 3% :
	PRINT "WINDOW ID:  ";W8$(0);", LAST UPDATED ";W9$(0) :
	IF Q%=3% THEN PRINT "TOLERANCE IS";W9(0,1)*100;
	"%.  TYPE NEW VALUE TO CHANGE ELSE <CR>"; :
	INPUT X :
	IF X<>0 THEN W9(0,1)=X/100
19020	RETURN
	!
	!
	!
	! SUBROUTINE TO UPDATE WINDOW FILE RETENTION TIME
	! DATA (OPTION 3)
	!
	!
21000	X=W9(J%,0) :
	D9%=2% :
	GOSUB 12000 :
	PRINT TAB(64%-M0%);X$;TAB(67); :
	INPUT A$ :
	IF LEFT(A$,1)="Y" THEN W9(J%,0)=X1 :
	W9$(0)=DATE$(0)
21010	RETURN
	!
	!
	!
	! SEE IF PEAK IS PART OF GROUP PEAK (OPTION 5)
	!
	!
22000	R=B(K%+2%) :
	S4%=0% :
	IF R<L THEN RETURN	! NOT TO WINDOW YET
22010	IF R>=L AND R<=H THEN S4%=1% :
	S5%=S5%+1% :
	PRINT #5% IF S5%=1% :
	A=A+B(K%+1%) :
	T=T+B(K%+3%) :
	RETURN	! PEAK WAS PART OF GROUP; AREA & HEIGHT ACCUM
22020	PRINT #5%,"*TOT"; :
	X=A :
	GOSUB 12000 :
	PRINT #5%,TAB(16%-M0%);X$; :
	X=T :
	GOSUB 12000 :
	PRINT #5%,TAB(40%-M0%);X$;TAB(43);"GROUP" :
	X=B(K%) :
	S5%=-1% :
	PRINT #5% :
	RETURN	! END OF GROUP PEAK
25000	A$=SYS(CHR$(7%)) :
	GOSUB 26000 :
	GOTO 134
	!
	!
	!
	! DECODE OPTION ANSWER AS FOLLOWS:
	! OPTIONAL OUTPUT<OPTIONAL DISK:OPTION #   EGS. KB0:<DK1:2
	! OR DK1:[1,5]PAMDUP.001<40><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
32000	CLOSE 2%,3%,5% :
	END

