100 FOR I = 1 TO 8: READ M1$(I): NEXT : FOR I = 1 TO 5: READ M2$(I): NEXT : FOR I = 768 TO 863: READ J: POKE I,J: NEXT : FOR I = 864 TO 911: READ J: POKE I,J: NEXT
160 PRINT D$"OPEN PCODES": PRINT D$"READ PCODES": FOR I = 0 TO 3: GOSUB 5330:PC$(I,1) = PX$: NEXT : PRINT : PRINT D$"CLOSE"
170 HOME : VTAB 12: PRINT "DO YOU WANT TO CHANGE PRINTER CODES? N";: POKE -16368,0: GET Z$: PRINT : ON Z$ < >"Y" AND Z$ < > CHR$(121) AND Z$ < >EX$ GOTO 5200: IF Z$ = EX$ THEN PRINT CHR$(7);: GOTO 170
180 FOR I = 0 TO 3:PP$ = PC$(I,0):PX$ = PC$(I,1): GOSUB 5420:PC$(I,1) = PX$: NEXT
190 EF = 3: ONERR GOTO 1460
200 HOME : VTAB 12: PRINT "SAVING NEW PRINTER CODES"
210 PRINT D$"OPEN PCODES": PRINT D$"CLOSE PCODES": PRINT D$"DELETE PCODES": PRINT D$"OPEN PCODES": PRINT D$"WRITE PCODES": FOR I = 0 TO 3:PX$ = PC$(I,1): GOSUB 5360: NEXT : PRINT : PRINT D$"CLOSE PCODES"
220 GOTO 170
230 REM
240 REM SUBROUTINES
250 REM
260 REM INPUT AND <ESC> SYSTEM
270 REM
280 KB = PEEK( -16384): POKE -16368,0: IF KB < >155 THEN RETURN
700 FOR I = 1 TO SX:L$ = L$ +"--------- ": NEXT I:L$ = L$ +" ": GOTO 760: REM 9 DASHES
710 IF GL$ = "N" OR GL$ = CHR$(110) GOTO 750
720 FOR I = 1 TO SX:L$ = L$ +" !": NEXT I:L$ = L$ +" ": GOTO 760: REM -OTHER LINES BLANK (9 SPACES)
730 IF LN = 0 OR LN = C1 *SY THEN FOR I = 1 TO SX:L$ = L$ +"---------!": NEXT I:L$ = L$ +" ": GOTO 760: REM 9 DASHES
740 L$ = L$ +"- ": FOR I = 1 TO SX -C2:L$ = L$ +LS$: NEXT :L$ = L$ +" -! ": GOTO 760: REM 9/8 SPACES
750 FOR I = 1 TO SX -1:L$ = L$ +LS$: NEXT I:L$ = L$ +" ! ": REM 9 SPACES
760 IF C$ = "N" OR C$ = CHR$(110) GOTO 820
770 IF CU = 1 THEN XV = (YY -AA)/BB:OS = DY/(C2 *BB): GOTO 810
780 IF CU = 2 THEN XV = EXP((YY -AA) *CL/BB):OS = DY *XV *CL/(C2 *BB): GOTO 810
790 IF CU = 3 AND YY >0 THEN XV = LOG(YY/AA)/BB:OS = DY/(C2 *BB *YY): GOTO 810
800 IF CU = 4 AND YY >0 THEN XV = (YY/AA) ^(1/BB):OS = DY *XV/(C2 *BB *YY)
810 IF (XV >X1 AND XV <X2) OR (XV <X1 AND XV >X2) THEN XP = INT(DI +(XV -X1)/DX -OS/DX):L$ = LEFT$(L$,XP +C1) + CHR$(46) + RIGHT$(L$,C1 *SX +1 -XP)
820 IF LG$ = "N" OR LG$ = CHR$(110) GOTO 860
830 IF LN = LY% THEN L$ = LEFT$(L$,LX% +C1) +L1$ + RIGHT$(L$,C1 *SX +C2 -LX% - LEN(L1$))
840 IF LN = LY% +3 THEN L$ = LEFT$(L$,LX% +C1) +L2$ + RIGHT$(L$,C1 *SX +C2 -LX% - LEN(L2$))
850 IF LN = LY% +6 THEN L$ = LEFT$(L$,LX% +C1) +L3$ + RIGHT$(L$,C1 *SX +C2 -LX% - LEN(L3$))
860 YL = YY -DI *DY: REM LINE LOWER BOUNDARY
870 IF UU >TN OR UU <1 GOTO 900: REM LINES WITHOUT POINTS
880 IF SGN(YL -Y(KS(UU),JS(UU))) = SGN(DY) GOTO 900: REM IF PT BELOW YL LINE IS DONE
890 XP = INT(DI +(X(KS(UU),JS(UU)) -X1)/DX):L$ = LEFT$(L$,XP +C1) +SY$(KS(UU)) + RIGHT$(L$,C1 *SX +1 -XP):UU = UU + SGN(DY): GOTO 870: REM INSERT POINT & INC INDEX
900 PRINT SPC( TB);L$;: REM PRINT ASSEMBLED LINE NO LF
910 PRINT : NEXT LN: RETURN
920 REM
930 REM AUTO SCALE ROUTINE
940 REM
950 EX = -3:COL = 1
960 IF COL *C1 ^EX > = MD GOTO 1000
970 IF COL = 1 THEN COL = 2: GOTO 960
980 IF COL = 2 THEN COL = 5: GOTO 960
990 IF COL = 5 THEN EX = EX +1:COL = 1: GOTO 960
1000 MD = COL *C1 ^EX: RETURN
1010 IF Z2 < > INT(Z2/MD) *MD THEN Z2 = ( INT(Z2/MD) +1) *MD
1020 RETURN
1030 REM
1040 REM DUMMY LINE FOR MATH EVAL (135 COLONS AFTER EV=0 IN LINE 1060)
1050 REM
1060 EV = 0:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
1070 LOC = PEEK(25) +256 * PEEK(26) +7: POKE LOC,48: FOR I = 1 TO LEN(EQ$) -1: POKE LOC +I,58: NEXT : RETURN
1080 REM
1090 REM PRINTER CONTROLS
1100 REM
1110 PRINT : PRINT "ADJUST PAPER AND TURN ON PRINTER"
1120 PRINT : PRINT : PRINT "PRESS <RETURN> WHEN READY TO GO": PRINT : PRINT "OR <ESC> TO ESCAPE": GOSUB 360: IF XF THEN ON EF = 7 GOTO 2030: GOTO 5200
1130 PRINT D$"PR#"SL: RETURN : REM TURN PRINTER ON, SCREEN OFF
1140 PRINT PC$(2,1): RETURN : REM CODE FOR 17 CPI
1150 PRINT PC$(0,1): RETURN : REM CODE FOR 18 LPI
1160 PRINT PC$(1,1): PRINT PC$(3,1): RETURN : REM CODES FOR 10 CPI AND 6 LPI
1170 PRINT D$"PR#0": RETURN : REM TURN PRINTER OFF, SCREEN ON
1180 REM
1190 REM FILES CONTROLS
1200 REM
1210 PRINT D$;"OPEN";FI$: PRINT D$;"CLOSE";FI$
1220 PRINT D$;"DELETE";FI$
1230 PRINT D$;"OPEN ";FI$
1240 PRINT D$;"WRITE ";FI$: RETURN
1250 PRINT D$;"VERIFY";FI$
1260 PRINT D$;"OPEN";FI$
1270 PRINT D$;"READ";FI$: RETURN
1280 PRINT D$;"CLOSE";FI$: RETURN
1290 REM
1300 REM DATA STATEMENTS
1310 REM
1320 DATA "TYPE IN X-Y DATA","ENTER MATHEMATICAL RELATION","READ X-Y DATA FROM DISK FILE","EDIT X-Y DATA, SAVE, PRINT LIST","FIT TWO-PARAMETER CURVE","ADD TO EXISTING LIST","PRINT GRAPH","CLEAR AND RERUN"
1330 DATA "LINEAR REGRESSION Y = A + B*X","LOG BASE 10 FIT Y = A + B*LOG(X)","EXPONENTIAL FIT Y = A + EXP(B*X)","POWER CURVE Y = A + X^B","RETURN TO MAIN MENU": REM 5/5/9 SPACES
1340 DATA 32,190,222,32,227,223,165,184,133,29,165,185,133,30,160,2,177,131,133,28,136,177,131,133,27,136,177,131,168,169,0,153,0,2,136,177,27,153,0,2,192,0,208,246
1350 DATA 160,4,132,19,162,255,32,108,213,169,36,133,80,169,4,133,81,32,26,214,165,155,133,25,165,156,133,26,160,6,200,185,249,1,240,4,145,155,208,246,165,29,133,184,165,30,133,185,96,0,0,0
1360 DATA 32,190,222,32,227,223,162,0,134,238,32,12,253,133,238,201,155,240,25,162,0,32,120,253,134,253,32,57,213,165,253,136,145,131,169,0,200,145,131,169,2,200,145,131,96,0,0,0
1370 REM
1380 REM MENU OPERATIONS
1390 REM
1400 PRINT : PRINT : PRINT : PRINT "PRESS <RETURN> FOR MAIN MENU: ";: GOSUB 360: GOTO 5200
1470 IF EF = 1 AND ER = 6 GOTO 180: REM PRINTER FILE NOT FOUND
1480 IF ER = 4 THEN EM$ = "WRITE PROTECTED": GOTO 1550
1490 IF ER = 6 THEN EM$ = "FILE NOT FOUND": GOTO 1550
1500 IF ER = 9 THEN EM$ = "DISK FULL": GOTO 1550
1510 IF ER = 8 THEN EM$ = "I/O ERROR--CHECK DRIVE DOOR": GOTO 1550
1520 IF ER = 10 THEN EM$ = "FILE LOCKED": GOTO 1550
1530 IF EF = 10 THEN HOME : VTAB 12: PRINT "ERROR IN FORMULA OR CHOSEN RANGE.": PRINT "PRESS <RETURN> TO RESTART PROGRAM";: GET Z$: PRINT : RUN 90
1540 EM$ = "ERROR " + STR$(ER) +" IN LINE " + STR$(EL)
1550 IF EF = 11 OR EF = 13 THEN HOME : VTAB 12: PRINT EM$: VTAB 18: PRINT "PRESS <RETURN> TO CLEAR VARIABLES": PRINT " AND RESTART NIBBLE PLOTTER";: GET Z$: PRINT : RUN 90
1560 HOME : VTAB 12: PRINT EM$: VTAB 18: PRINT "PRESS <RETURN> TO TRY AGAIN": PRINT " OR <ESC> FOR MAIN MENU";: GET Z$: PRINT : IF Z$ = EX$ GOTO 5200
1570 ON EF GOTO 130,150,190,1610,1700,1930,2030,2230,3670,3910,4210,4370,4990: GOTO 5200
1580 REM
1590 REM REVIEW X-Y DATA,SAVE
1600 REM
1610 EF = 4: ONERR GOTO 1460
1620 HOME : IF NS = 0 THEN PRINT "NO DATA IN MEMORY": GOSUB 1420: GOTO 5200
1630 M3$(1) = "EDIT X-Y DATA":M3$(2) = "SAVE TO DISK":M3$(3) = "PRINT OUT X-Y LISTS":M3$(4) = "RETURN TO MAIN MENU"
1640 HOME : PRINT "THESE OPERATIONS CAN BE PERFORMED:": FOR MN = 1 TO 4: GOSUB 1410: PRINT M3$(MN): NEXT MN
1650 VTAB 18: PRINT "NUMBER OF YOUR SELECTION ? ";: GET M$: PRINT M$: IF M$ = EX$ GOTO 5200
1660 MS = VAL(M$): ON MS GOTO 1700,1930,2030,5200: GOTO 1610
1670 REM
1680 REM EDIT
1690 REM
1700 K = 0:EF = 5
1710 K = K +1:I = 0
1720 I = 0: HOME : PRINT "THESE ARE ENTRIES FOR SET ";K
1730 I = I +1:N2 = I *20:N1 = N2 -19: IF NP(K) <N2 THEN N2 = NP(K)
1790 VTAB (J +23 -20 *I): PRINT J; TAB( 5)X(K,J); TAB( 20)Y(K,J);: HTAB (5): GOSUB 300: ON XF GOTO 1720: GOSUB 320: ON Z GOTO 1790,1800,1810
1800 X(K,J) = VAL(IN$)
1810 VTAB (J +23 -20 *I): HTAB 5: PRINT X(K,J); TAB( 20)Y(K,J);: HTAB (20): GOSUB 300: ON XF GOTO 380: GOSUB 320: ON Z GOTO 1810,1820,1830
1820 Y(K,J) = VAL(IN$)
1830 VTAB (J +23 -20 *I): HTAB 20: PRINT Y(K,J)
1840 IF J <N2 GOTO 1780
1850 VTAB 2: CALL -958: IF I < INT(NP(K)/20 +.999) GOTO 1730
1860 IF K <NS GOTO 1710
1870 HOME : PRINT "WANT TO REVIEW AGAIN ? Y/N ";: GOSUB 360: ON XF GOTO 380: IF A$ < >"N" AND A$ < > CHR$(110) GOTO 1700
1880 IF NA < >0 GOTO 5200: REM NA FLAGS FILE INPUT
1890 GOTO 1630
1900 REM
1910 REM SAVE TO DISK
1920 REM
1930 EF = 6:FI$ = "": HOME : PRINT "UNDER WHAT FILE NAME IS THE DATA TO BE"; SPC( 42);"SAVED ? WARNING - EXISTING FILE OF"; SPC( 14);"SAME NAME WILL BE ERASED": VTAB 7: PRINT TAB( 3)"? ";FI$;: HTAB 5: GOSUB 300: ON XF GOTO 1610: IF Z = 3 AND LEN(FI$) >0 GOTO 1950
1940 FI$ = IN$: IF FI$ = "" GOTO 1930
1950 VTAB 7: PRINT TAB( 5)FI$: GOSUB 1210
1960 PRINT NS: FOR K = 1 TO NS: PRINT NP(K): NEXT
1970 FOR K = 1 TO NS: FOR J = 1 TO NP(K): PRINT X(K,J): PRINT Y(K,J): NEXT J: NEXT K
1980 GOSUB 1280:SV = 0
1990 GOTO 1640
2000 REM
2010 REM PRINT OUT X-Y LISTING
2020 REM
2030 EF = 7: HOME : PRINT "TITLE FOR THE TABLES WILL BE - ?": VTAB 5: HTAB 5: PRINT FI$: VTAB 5: HTAB 5: GOSUB 300: ON XF GOTO 1610: IF Z = 3 GOTO 2050
2170 GOSUB 280: ON XF GOTO 2190: IF J1 <NP(K) OR J2 <Z GOTO 2140
2180 IF K <NS THEN K = K +1
2190 PRINT : PRINT :K = NS *XF +K *(XF = 0): NEXT K
2200 GOSUB 1160: GOSUB 1170: GOTO 5200
2210 REM
2220 REM INITIALIZE PLOTTER
2230 EF = 8: ONERR GOTO 1460
2240 IF TN AND ZF AND (NS >1) THEN HOME : VTAB 12: PRINT "IF YOU WANT TO CHANGE DATA SET": PRINT "SELECTION, YOU MUST CLEAR AND RERUN.": VTAB 22: PRINT "PRESS <RETURN> TO CONTINUE": PRINT " OR <ESC> FOR MAIN MENU": GET Z$: PRINT : ON Z$ = EX$ GOTO 5200: GOTO 2410
2250 HOME : IF NS = 0 THEN PRINT "NO DATA IN MEMORY": GOSUB 1420: GOTO 5200
2260 D3 = D3 +1: IF D3 = 1 THEN DIM KK(NS),SY$(NS)
2270 IF CU < >0 THEN PRINT "SHOW THE CURVE FIT ON THE PLOT ? Y/N ";: GET C$: PRINT C$: IF C$ = CHR$(27) GOTO 5200: REM CU AND C$ FLAG CURVE FIT ANALYSIS
2280 IF C$ = "Y" OR C$ = CHR$(121) THEN NK = 1:KK(1) = SN: GOTO 2410
2290 IF NS = 1 THEN NK = 1:KK(1) = 1: GOTO 2410
2300 D5 = D5 +1: PRINT "THERE ARE ";NS;" SETS OF X-Y POINTS IN MEMORY. WANT ALL ON THIS GRAPH ? (Y/N):";: GOSUB 360: ON XF GOTO 5200: IF A$ < >"N" AND A$ < > CHR$(110) THEN NK = NS: FOR I = 1 TO NK:KK(I) = I: NEXT : GOTO 2410: REM 7 SPACES
2310 PRINT : PRINT "IDENTIFY (BY NUMBER) THE DATA SET(S) TO BE PLOTTED.": PRINT : PRINT :CV = PEEK(37) +1
2320 NK = 0: FOR I = 1 TO NS:KK(I) = 0: NEXT :I = 1: REM RESET IN CASE <ESC> AND REPEAT
2330 VTAB CV: PRINT "SELECTION NO.";I;" IS SET NO. "; TAB( 34)KK(I);: HTAB 34: GOSUB 300: ON XF GOTO 2250: GOSUB 320: ON Z GOTO 2330,2340,2350
2340 KK(I) = VAL(IN$): VTAB CV +C2: CALL -868
2350 IF KK(I) <1 OR KK(I) >NS THEN VTAB CV +C2: PRINT "NO.";KK(I);" NOT IN MEMORY. ": GOTO 2390
2360 FOR J = 0 TO I -1: IF KK(I) = KK(J) THEN VTAB CV +C2: PRINT "NO.";KK(I);" ALREADY ENTERED. ":J = I -1: GOTO 2390
2370 NEXT J:NK = I:I = I +1:CV = CV +1: IF CV = 20 THEN VTAB 24: PRINT :CV = CV -1
2380 IF I >NS THEN VTAB CV +C2: PRINT "THAT'S ALL THERE ARE IN MEMORY": GOSUB 1420: GOTO 2410
2390 VTAB CV +3: HTAB 5: PRINT "ANY OTHER ? Y/N (N IF NONE): ";: GOSUB 360: ON XF GOTO 2250: IF A$ < >"N" AND A$ > < CHR$(110) THEN VTAB CV +3: CALL -868: GOTO 2330
2400 VTAB CV +5: PRINT "CONFIRM - OK? Y/N (N TO REPEAT) ";: GOSUB 360: ON XF GOTO 2250: IF A$ = "N" THEN VTAB CV +5: CALL -868: HOME : GOTO 2300
2410 TEXT : HOME :I = 0
2420 I = I +1:CV = I: IF CV >22 THEN CV = 22
2430 VTAB CV: PRINT "WHAT SYMBOL FOR SET NO.";KK(I);" ? "; TAB( 31)SY$(KK(I)): VTAB CV: HTAB 31: GOSUB 300: ON XF GOTO 5200: IF Z = 3 GOTO 2450
2440 SY$(KK(I)) = IN$
2450 VTAB CV: HTAB 31: PRINT SY$(KK(I)): IF LEN(SY$(KK(I))) >1 THEN VTAB CV +1: PRINT "MUST BE ONE CHAR": GOTO 2430
2460 IF I <NK GOTO 2420
2470 PRINT : PRINT : PRINT "SYMBOL SELECTION OK ? CONFIRM (Y/N) ";: GOSUB 360: ON XF GOTO 2410: IF A$ = "N" OR A$ = CHR$(110) GOTO 2410
2480 HOME : PRINT "THESE DEFAULT CONDITIONS ARE IN EFFECT:": VTAB 4: PRINT TAB( 3)"PROVIDE FOR INSIDE LEGEND ";LG$: REM 11 SPACES
2490 VTAB 7: PRINT TAB( 3)"INCLUDE GRID LINES ";GL$: VTAB 10: PRINT TAB( 3)"NUMBER OF MAJOR DIVISIONS HORIZ:"; TAB( 38);SX: PRINT TAB( 30)" VERT:"; TAB( 38);SY: REM 18/4 SPACES
2500 VTAB 14: PRINT TAB( 3)"LEFT HAND MARGIN "; INT(DI +TB/1.71)/C1;" INCH (CHARS)"; TAB( 38);TB
2510 VTAB 20: CALL -868: PRINT "ACCEPT DEFAULTS ? (Y/N) ";: GOSUB 360: ON XF GOTO 2480: IF A$ < >"N" AND A$ < > CHR$(110) GOTO 2670
2520 VTAB 20: PRINT "REVISE VALUES (OR PRESS RETN TO KEEP)": VTAB 4: HTAB 39: GOSUB 300: ON XF GOTO 2480: IF Z = 3 GOTO 2540
2530 LG$ = IN$: IF (LG$ < >"Y" AND LG$ < >"N" AND LG$ < > CHR$(121) AND LG$ < > CHR$(110)) GOTO 2520
2540 VTAB 4: HTAB 39: PRINT LG$: VTAB 7: HTAB 39: GOSUB 300: ON XF GOTO 2480: IF Z = 3 GOTO 2560
2550 GL$ = IN$: IF (GL$ < >"Y" AND GL$ < >"N" AND GL$ < > CHR$(110) AND GL$ < > CHR$(121)) GOTO 2540
2560 VTAB 7: HTAB 39: PRINT GL$: VTAB 10: HTAB 38: PRINT SX;: HTAB 38: GOSUB 300: ON XF GOTO 2480: GOSUB 320: ON Z GOTO 2560,2570,2580
2570 SX = VAL(IN$)
2580 VTAB 10: HTAB 38: PRINT SX: VTAB 11: HTAB 38: PRINT SY;: HTAB 38: GOSUB 300: ON XF GOTO 2480: GOSUB 320: ON Z GOTO 2580,2590,2600
2590 SY = VAL(IN$)
2600 VTAB 11: HTAB 38: PRINT SY: VTAB 14: HTAB 38: PRINT TB;: HTAB 38: GOSUB 300: ON XF GOTO 2480: GOSUB 320: ON Z GOTO 2600,2610,2620
2610 TB = VAL(IN$)
2620 VTAB 14: HTAB 38: PRINT TB:W% = (TB +15 +C1 *SX)/1.71: IF W% >85 THEN VTAB 20: CALL -868: PRINT "WIDTH EXCEEDS NORMAL-OK ? Y/N:";: GOSUB 360: ON XF GOTO 2480: IF A$ = "N" OR A$ = CHR$(110) THEN VTAB 20: CALL -868: PRINT "REVISE HORIZ DIVISIONS OR LEFT MARGIN": GOTO 2560
2630 GOTO 2480
2640 REM
2650 REM RANGES AND SCALES
2660 REM
2670 IF TN AND NOT ZF GOTO 2770
2680 PRINT : PRINT "DETERMINING RANGES -":XA = X(KK(1),1):XB = XA:YA = Y(KK(1),1):YB = YA: FOR I = 1 TO NK: FOR J = 1 TO NP(KK(I)): IF XA >X(KK(I),J) THEN XA = X(KK(I),J)
2780 VTAB 17: PRINT "ARE THESE RANGES OK? Y/N (N TO REVISE):";: GOSUB 360: ON XF GOTO 2770: IF A$ < >"N" AND A$ < > CHR$(110) GOTO 2900
2790 VTAB 18: PRINT "REVISE AS REQD (OR HIT RETN TO ACCEPT) ": VTAB 11: HTAB 12: PRINT X1;: HTAB 12: GOSUB 300: ON XF GOTO 2770: GOSUB 320: ON Z GOTO 2790,2800,2810
2800 X1 = VAL(IN$)
2810 VTAB 11: HTAB 12: PRINT X1; TAB( 31)X2;: HTAB 31: GOSUB 300: ON XF GOTO 2770: GOSUB 320: ON Z GOTO 2810,2820,2830
2820 X2 = VAL(IN$)
2830 VTAB 11: HTAB 31: PRINT X2: IF X1 <X2 AND (X2 <XB OR X1 >XA) OR X1 >X2 AND (X1 <XB OR X2 >XA) THEN VTAB 18: CALL -868: VTAB 17: PRINT "RANGE OF X DOES NOT INCLUDE ALL POINTS. IS THAT OK ? Y/N: ";: GOSUB 360: ON XF GOTO 2770: IF A$ = "N" GOTO 2790
2840 VTAB 17: CALL -868: VTAB 18: PRINT "REVISE Y1,Y2 (OR HIT RETN TO ACCEPT) ": VTAB 9: HTAB 6: PRINT Y1; TAB( 12)LL$;: HTAB 6: GOSUB 300: ON XF GOTO 2770: GOSUB 320: ON Z GOTO 2840,2850,2860
2850 Y1 = VAL(IN$)
2860 VTAB 9: HTAB 6: PRINT Y1; TAB( 12)LL$: VTAB 2: HTAB 6: PRINT Y2;: HTAB 6: GOSUB 300: ON XF GOTO 2770: GOSUB 320: ON Z GOTO 2860,2870,2880
2870 Y2 = VAL(IN$)
2880 VTAB 2: HTAB 6: PRINT Y2: IF Y1 <Y2 AND (Y2 <YB OR Y1 >YA) OR Y1 >Y2 AND (Y1 <YB OR Y2 >YA) THEN VTAB 18: CALL -868: VTAB 17: PRINT "RANGE OF Y DOES NOT INCLUDE ALL POINTS. IS THAT OK ? Y/N: ";: GOSUB 360: ON XF GOTO 2770: IF A$ = "N" GOTO 2840
2890 VTAB 17: CALL -868: PRINT : PRINT "VERIFY - OK ? Y/N (N TO REVISE): ";: GOSUB 360: ON XF GOTO 2770: IF A$ = "N" THEN VTAB 18: CALL -868: GOTO 2790
2940 HOME : PRINT "WANT TITLE OF PLOT ABOVE PLOT ? (A)"; SPC( 24);"BELOW ? (B)"; SPC( 24);"NOT AT ALL ? (N) ";TL$: VTAB 3: HTAB 39: GOSUB 300: ON XF GOTO 2940: IF Z = 3 GOTO 2960: REM 3/6 SPACES
2950 TL$ = IN$: IF (TL$ < >"A" AND TL$ < >"B" AND TL$ < >"N") GOTO 2940
2960 VTAB 3: HTAB 39: PRINT TL$: IF TL$ = "N" GOTO 3050
2970 HOME :TL% = (C1 *SX)/1.71: PRINT "ENTER PLOT TITLE (OR <RTN> FOR BLANK)": PRINT "TWO LINES - MAX ";TL%;" CHARS/LINE"
2980 VTAB 4: PRINT "LINE 1: ";T1$: VTAB 4: HTAB 9: GOSUB 300: ON XF GOTO 2940: IF Z = 3 GOTO 3000
2990 T1$ = IN$
3000 VTAB 4: HTAB 9: PRINT T1$: IF LEN(T1$) >TL% THEN PRINT CHR$(7): GOTO 2980
3010 VTAB 7: CALL -868: PRINT "LINE 2: ";T2$: VTAB 7: HTAB 9: GOSUB 300: ON XF GOTO 2940: IF Z = 3 GOTO 3030
3020 T2$ = IN$
3030 VTAB 7: HTAB 9: PRINT T2$: IF LEN(T2$) >TL% THEN PRINT CHR$(7): GOTO 3010
3040 VTAB 10: CALL -868: PRINT "CONFIRM: TITLE OK ? Y/N: ";: GOSUB 360: ON XF GOTO 2940: IF A$ = "N" GOTO 2980
3110 VTAB 18: HTAB 3: PRINT YC$: IF LEN(YC$) >5 *SY THEN PRINT CHR$(7): GOTO 3090
3120 VTAB 21: PRINT "CONFIRM: LABEL OK ? Y/N: ";: GOSUB 360: ON XF GOTO 2940: IF A$ = "N" GOTO 3090
3130 REM
3140 REM LEGEND INSIDE GRID
3150 REM
3160 IF LG$ = "N" GOTO 3380
3170 LG$ = "Y": HOME : PRINT "THE THREE LINES OF LEGEND TO GO INSIDE GRID BOUNDARY ARE:": VTAB 5: HTAB 3: PRINT "LINE 1 = ";L1$: VTAB 8: HTAB 3: PRINT "LINE 2 = ";L2$: VTAB 11: HTAB 3: PRINT "LINE 3 = ";L3$: IF CU < >0 GOTO 3250
3180 VTAB 15: PRINT "ENTER DESIRED LEGEND (RETN FOR BLANK)": VTAB 5: HTAB 12: GOSUB 300: ON XF GOTO 3160: IF Z = 3 GOTO 3200
3190 L1$ = IN$
3200 VTAB 5: HTAB 12: PRINT L1$: VTAB 8: HTAB 12: GOSUB 300: ON XF GOTO 3160: IF Z = 3 GOTO 3220
3210 L2$ = IN$
3220 VTAB 8: HTAB 12: PRINT L2$: VTAB 11: HTAB 12: GOSUB 300: ON XF GOTO 3160: IF Z = 3 GOTO 3240
3230 L3$ = IN$
3240 VTAB 11: HTAB 12: PRINT L3$: IF L1$ = "" AND L2$ = "" AND L3$ = "" GOTO 3380
3250 VTAB 15: CALL -868: PRINT "PLACE LEGEND AT WHAT X,Y VALUE ? ": VTAB 17: PRINT " FIRST CHAR AT X = ";LX;: HTAB 21: GOSUB 300: ON XF GOTO 3160: GOSUB 320: ON Z GOTO 3250,3260,3270
3280 IF LX% <0 OR LX% + LEN(L1$) >C1 *SX OR LX% + LEN(L2$) >C1 *SX OR LX% + LEN(L3$) >C1 *SX THEN VTAB 21: PRINT "LEGEND MUST BE PLACED BETWEEN X= ";X1: PRINT "AND X= ";X2;". REVISE LEGEND - OR LOCATION": GOTO 3180
3290 VTAB 21: CALL -958
3300 VTAB 19: PRINT " FIRST LINE AT Y = ";LY;: HTAB 21: GOSUB 300: ON XF GOTO 3160: GOSUB 320: ON Z GOTO 3300,3310,3320
3330 IF LY% <0 OR LY% +6 >C1 *SY THEN VTAB 21: PRINT "LEGEND MUST BE PLACED BETWEEN Y = ";Y1 +6 *DY: PRINT "AND Y = ";Y2;". REVISE LOCATION": GOTO 3300
3340 VTAB 21: CALL -958: PRINT "CONFIRM - LEGEND OK ? Y/N: ";: GOSUB 360: ON XF GOTO 3160: IF A$ = "N" OR A$ = CHR$(110) GOTO 3180
3350 REM
3360 REM SORT OF A QUICKSORT
3370 REM
3380 HOME : IF TN = 0 THEN FOR I = 1 TO NK:TN = TN +NP(KK(I)): NEXT : DIM KS(TN +1),JS(TN +1),TP(TN +1):ZF = 1
3390 ON NOT ZF GOTO 3450:SW = 0: VTAB 6: PRINT "SORTING POINTS": VTAB 8: PRINT "NUM SWAPS = ";SW
3400 N = 0: FOR I = 1 TO NK: FOR J = 1 TO NP(KK(I)):N = N +1:KS(N) = KK(I):JS(N) = J: NEXT : NEXT : REM FORM 1-D ARRAY OF SUBSCRIPTS
3410 GOSUB 430:ZF = 0
3420 REM
3430 REM START PLOT
3440 REM
3450 UU = 1: IF DY <0 THEN UU = TN: REM START HI OR LO
3460 IF SGN(Y(KS(UU),JS(UU)) -Y2 -DI *DY) = SGN(DY) THEN UU = UU + SGN(DY): GOTO 3460: REM DROP POINTS THAT EXCEED Y2
3470 HOME : PRINT "READY TO PLOT ?": GOSUB 1110
3480 IF TL$ = "A" THEN PRINT SPC( TB/1.7 +6 +TL%/C2 - LEN(T1$)/C2);T1$: PRINT SPC( TB/1.7 +6 +TL%/C2 - LEN(T2$)/C2);T2$
3610 PRINT SPC( TB +11 +5 *SX - LEN(XC$)/C2);XC$: GOSUB 1160: REM PRINTER TO NORMAL MODE
3620 IF TL$ = "B" THEN PRINT SPC( TB/1.7 +4 +TL%/C2 - LEN(T1$)/C2);T1$: PRINT SPC( TB/1.7 +4 +TL%/C2 - LEN(T2$)/C2);T2$
3630 GOSUB 1170: GOTO 5200: REM TURN OFF PRINTER AND RETURN TO MAIN MENU
3640 REM
3650 REM MANUAL DATA INPUT
3660 REM
3670 EF = 9: ONERR GOTO 1460
3680 HOME : IF NS < >0 THEN PRINT "FINISHED WITH THE DATA NOW IN MEMORY ?": PRINT : PRINT "IF SO, RERUN PROGRAM TO CLEAR VARIABLES": GOTO 1400
3690 SV = 1:K = 0:NS = 1: VTAB 5: HTAB 1: PRINT "ENTER NUM DIFFERENT SETS OF X-Y DATA:";NS;: HTAB 38: GOSUB 300: GOSUB 320: ON Z +1 GOTO 3690,3690,3700,3710
3700 NS = VAL(IN$): IF NS <1 THEN PRINT CHR$(7);: GOTO 3690
3710 D1 = D1 +1: IF D1 = 1 THEN DIM NP(NS):PP = 1
3720 VTAB 5: HTAB 38: PRINT NS:K = K +1:CV = 7 +K:NP(K) = NP(K) +(NP(K) = 0): IF CV >23 THEN PRINT :CV = 23
3730 VTAB CV: HTAB 1: PRINT "ENTER NUM OF X-Y POINTS IN SET NO.";K; TAB( 38)NP(K);: HTAB 38: GOSUB 300: GOSUB 320: ON Z GOTO 3730,3740,3740
3740 NP(K) = VAL(IN$): IF NP(K) >PP THEN PP = NP(K)
3750 VTAB CV: HTAB 38: PRINT NP(K): IF K <NS GOTO 3720
3760 D2 = D2 +1: IF D2 = 1 THEN DIM X(NS,PP),Y(NS,PP)
3770 K = 0
3780 K = K +1: HOME : PRINT "ENTER X,Y PAIRS OF SET NO. ";K: PRINT : PRINT "PLOTTER WILL ACCEPT ANY SEQUENCE. PLOT- TING PRECISION IS 2 DIGITS. DON'T STOP FOR ERRORS - USE EDIT TO CORRECT LATER": POKE 34,6
3790 VTAB 6: HTAB 1: CALL -958:J = 0: GOSUB 5380
3800 J = J +1:X(K,J) = X(1,J):CV = 6 +J: IF CV >23 THEN PRINT :CV = 23
3810 VTAB CV: HTAB 1: PRINT "X";J;"="; TAB( 04)X(K,J);: HTAB 4 +(J >9) +(J >99): GOSUB 300: ON XF GOTO 380: GOSUB 320: ON Z GOTO 3810,3820,3830
3920 HOME : IF NP(1) < >0 THEN PRINT "PREVIOUS DATA IS STILL IN MEMORY -": PRINT : PRINT "IF THIS DATA IS TO BE REPLACED,": PRINT : PRINT "RERUN PROGRAM TO CLEAR VARIABLES": GOTO 1400
3930 IF SV THEN HOME : VTAB 12: PRINT "YOUR CURRENT X-Y DATA": PRINT " HAS NOT BEEN SAVED.": PRINT : PRINT "PRESS <ESC> FOR MAIN MENU": PRINT " OR <RETURN> TO CONTINUE": GET Z$: PRINT : ON Z$ = EX$ GOTO 5200
3940 HOME : PRINT "ENTER MATHEMATICAL EXPRESSION IN X": PRINT : PRINT "LEGITIMATE APPLESOFT, 128 CHARS OR LESS"
3950 VTAB 6: HTAB 5: PRINT "Y = ";: INPUT "";EQ$: IF LEN(EQ$) >128 THEN EQ$ = LEFT$(EQ$,128): VTAB 10: PRINT "EXPRESSION CUT OFF AT 128 CHARS": VTAB 6: HTAB 9: PRINT EQ$
3960 VTAB 12: PRINT "IS THAT OK ? N TO REPLACE: ";: GOSUB 360: ON XF GOTO 380: VTAB 10: CALL -868
3970 IF A$ = "N" OR A$ = CHR$(110) THEN VTAB 12: PRINT "RETYPE ENTIRE EXPRESSION ": GOTO 3950
3980 VTAB 10: PRINT "PLOT OVER WHAT RANGE OF X ?": VTAB 12: CALL -868: PRINT TAB( 25)"X MIN = ";XA;: HTAB 33: GOSUB 300: ON XF GOTO 380: GOSUB 320: ON Z GOTO 3980,3990,4000
3990 XA = VAL(IN$)
4000 VTAB 12: HTAB 33: PRINT XA: VTAB 13: PRINT TAB( 25)"X MAX = ";XB;: HTAB 33: GOSUB 300: ON XF GOTO 380: GOSUB 320: ON Z GOTO 4000,4010,4020
4010 XB = VAL(IN$)
4020 VTAB 13: HTAB 33: PRINT XB: VTAB 15: PRINT "HOW MANY POINTS ?"; SPC( 23);"(NO.POINTS = 1 + NO.INTERVALS) ";NP(1);: HTAB 33: GOSUB 300: ON XF GOTO 380: GOSUB 320: ON Z GOTO 4020,4030,4040
4030 NP(1) = VAL(IN$)
4040 VTAB 16: HTAB 33: PRINT NP(1): VTAB 18: PRINT "CONFIRM-IS IT OK? Y/N (N TO REVISE): ";: GET A$: PRINT A$: IF A$ = "N" OR A$ = CHR$(110) GOTO 3890
4120 DX = (XB -XA)/(NP(1) -1): FOR J = 1 TO NP(1):X(1,J) = XA +(J -1) *DX:X = X(1,J): VTAB 20: PRINT X;LS$
4130 GOSUB 1060:Y(1,J) = EV: NEXT
4140 GOSUB 1070
4150 VTAB 22: CALL -868: PRINT "X-Y POINTS ARE IN MEMORY": GOSUB 1420
4160 NS = 1:SN = 1: GOTO 5200
4170 REM
4180 REM
4190 REM DATA INPUT FROM FILE
4200 REM
4210 EF = 11: ONERR GOTO 1460
4220 HOME : IF NS < >0 THEN PRINT "FINISHED WITH THE DATA NOW IN MEMORY ?": PRINT : PRINT "IF SO, RERUN PROGRAM TO CLEAR VARIABLES": GOTO 1400
4230 PRINT "WANT TO SEE THE CATALOG ? Y/N ";: GOSUB 360: ON XF GOTO 5200: IF A$ < >"N" AND A$ < > CHR$(110) THEN HOME : PRINT D$;"CATALOG"
4240 CV = PEEK(37) +1: VTAB CV: PRINT "ENTER NAME OF TEXT FILE TO BE LOADED: ";FI$;: HTAB 7: GOSUB 300: ON XF GOTO 380: IF Z = 3 AND LEN(FI$) >0 GOTO 4260: REM 9 SPACES
4250 FI$ = IN$: IF FI$ = "" GOTO 4220
4260 CV = CV +1: IF CV >23 THEN CV = 23
4270 VTAB CV: HTAB 7: PRINT FI$: GOSUB 1250
4280 INPUT NS: DIM NP(NS):PP = 0: FOR K = 1 TO NS: INPUT NP(K): IF NP(K) >PP THEN PP = NP(K)
4290 NEXT K: DIM X(NS,PP),Y(NS,PP)
4300 FOR K = 1 TO NS: FOR J = 1 TO NP(K): INPUT X(K,J): INPUT Y(K,J): NEXT J: NEXT K
4310 GOSUB 1280: IF IN$ = "" GOTO 4280
4320 HOME : PRINT "WANT TO REVIEW THIS DATA? (Y/N) ";: GOSUB 360: ON XF GOTO 4320: IF A$ = "Y" OR A$ = CHR$(121) GOTO 1700
4330 GOTO 5200
4340 REM
4350 REM CURVE FIT
4360 REM
4370 EF = 12: ONERR GOTO 1460
4380 HOME : IF NS <1 THEN PRINT "X-Y DATA NOT IN MEMORY": GOSUB 1420: GOTO 5200
4390 IF NS >1 THEN PRINT "THERE IS MORE THAN ONE SET OF POINTS IN MEMORY. WHICH SET DO YOU WISH TO ANALYZE ? (PRESS <RETURN> TO REVIEW) ";: GOSUB 300: ON XF GOTO 5200:SN = VAL(IN$): ON SN = 0 GOTO 1590: IF SN <0 OR SN >NS THEN HOME : GOTO 4390
4400 IF NS = 1 THEN SN = 1
4410 HOME : PRINT "THE FOLLOWING ANALYSES ARE AVAILABLE:"
4420 FOR MN = 1 TO 5: GOSUB 1410: PRINT M2$(MN): NEXT MN
4430 VTAB 17: HTAB 5: PRINT "YOUR SELECTION (NUMBER) IS - ? ";: HTAB 36: GET M$: ON M$ = EX$ GOTO 5200: PRINT M$:CU = VAL(M$): IF CU <1 OR CU >5 THEN PRINT CHR$(7);: GOTO 4430
4440 VTAB 20: PRINT "COMPUTER WORKING -": IF CU = 5 GOTO 5200
4450 REM
4460 REM GET LOWER BOUNDS
4470 REM
4480 S1 = 0:S2 = 0:S3 = 0:S4 = 0:S5 = 0
4490 XA = X(SN,1):YA = Y(SN,1)
4500 FOR J = 1 TO NP(SN)
4510 IF (X(SN,J) <XA) THEN XA = X(SN,J)
4520 IF (Y(SN,J) <YA) THEN YA = Y(SN,J)
4530 NEXT J
4540 REM
4550 REM SUM TERMS
4560 REM
4570 ON CU GOTO 4640,4620,4600,4580,5200
4580 IF XA < = 0 OR YA < = 0 THEN VTAB 21: PRINT "POWER FIT CANNOT HANDLE 0 OR NEG VALUES": GOSUB 1420: GOTO 4410
4900 HOME : VTAB 3: PRINT "THE BEST FIT RELATION IS:": PRINT : PRINT TAB( 3)L1$
4910 VTAB 12: PRINT "COEFFICIENT OF CORRELATION ";L2$
4920 PRINT : PRINT "STANDARD ERROR OF ESTIMATE ";L3$
4930 LG$ = "Y": GOTO 1400
4940 REM
4950 REM CHANGE ARRAY SIZE
4960 REM
4970 EF = 13: ONERR GOTO 1460
4980 HOME : IF NS < >0 THEN PRINT "SPACE ALLOCATION CANNOT BE REVISED WHEN": PRINT : PRINT "THERE IS X-Y DATA IN MEMORY": PRINT : PRINT "SAVE THE DATA ON DISK FIRST, RERUN THE": PRINT : PRINT "PROGRAM, THEN SELECT OPTION 6": GOTO 1400
4990 HOME : PRINT "CONFIRM - IS THE DATA TO BE REVISED": PRINT : PRINT "NOW STORED ON DISK? Y/N: ";: GOSUB 360: ON XF GOTO 5200: IF A$ < >"Y" AND A$ < > CHR$(121) THEN VTAB 20: PRINT "USE ENTER DATA OPTION (1) OF MAIN MENU": GOSUB 1420: GOTO 5200
5000 HOME : PRINT "WANT TO SEE THE CATALOG ? Y/N ";: GOSUB 360: ON XF GOTO 5200: IF A$ < >"N" AND A$ < > CHR$(110) THEN HOME : PRINT D$;"CATALOG"
5010 CV = PEEK(37) +1: VTAB CV: PRINT "ENTER NAME OF TEXT FILE HOLDING X-Y DATA ";FI$;: HTAB 7: GOSUB 300: ON XF GOTO 4990: IF Z = 3 GOTO 5030: REM 6 SPACES
5020 FI$ = IN$
5030 CV = CV +1: IF CV >23 THEN CV = 23
5040 VTAB CV: HTAB 7: PRINT FI$: GOSUB 1250
5050 INPUT NA: DIM NB(NA):PP = 0: FOR K = 1 TO NA: INPUT NB(K): IF NB(K) >PP THEN PP = NB(K)
5060 NEXT K: GOSUB 1280
5070 HOME : PRINT "REVISE (OR ACCEPT) FILE PARAMETERS:":NS = NA: VTAB 5: PRINT "NUMBER DIFFERENT SETS OF X-Y DATA: ";NS;: HTAB 36: GOSUB 300: ON XF GOTO 4990: GOSUB 320: ON Z GOTO 5070,5080,5090
5080 NS = VAL(IN$): ON NS <NA GOTO 5070: DIM NP(NS)
5090 VTAB 5: HTAB 36: PRINT NS: FOR K = 1 TO NA:NP(K) = NB(K): NEXT :K = 0
5100 K = K +1:CV = 7 +K: IF CV >23 THEN CV = 23
5110 VTAB CV: PRINT "NUMBER OF POINTS IN SET NO. ";K; TAB( 36)NP(K);: HTAB 36: GOSUB 300: ON XF GOTO 5070: GOSUB 320: ON Z GOTO 5110,5120,5130
5120 NP = VAL(IN$): ON NP <NP(K) GOTO 5110:NP(K) = NP: IF NP(K) >PP THEN PP = NP(K)
5130 VTAB CV: HTAB 36: PRINT NP(K): IF K <NS GOTO 5100
5140 DIM X(NS,PP),Y(NS,PP)
5150 GOSUB 1250: INPUT NA: FOR K = 1 TO NA: INPUT NB(K): NEXT K: FOR K = 1 TO NA: FOR J = 1 TO NB(K): INPUT X(K,J): INPUT Y(K,J): NEXT J: NEXT K: GOSUB 1280
5160 HOME : PRINT "THE X-Y DATA WILL NOW BE DISPLAYED WITH "; SPC( 40);"VALUES OF THE ADDED POINTS SHOWN AS 0,0."; SPC( 40);"CORRECT THEM TO SHOW THE NEW X-Y VALUES": GOSUB 1420:M$ = "1": GOTO 1700
5170 REM
5180 REM MAIN MENU
5190 REM
5200 TEXT : HOME : FOR I = 1 TO 15: PRINT "*";: HTAB 39: PRINT "*": PRINT : NEXT I
5210 HTAB 2: VTAB 1: FOR I = 0 TO 18: PRINT "* ";: NEXT : HTAB 2: VTAB 23: FOR I = 0 TO 18: PRINT "* ";: NEXT