10 GRAPHICS 2:POSITION 4,1:? #6;"GRAPH E'S ! !":REM Display Program Name›20 POSITION 5,3:? #6;"FORMATTED":POSITION 7,4:? #6;"PLOT":POSITION 6,5:? #6;"PROGRAM!"›30 FOR W=0 TO 1000:NEXT W›40 GRAPHICS 0›50 ? :? :? :? "Loading Machine Language Routine."›60 DIM TEXT$(50),Y(401),X(401),XTITLE$(40),YTITLE$(24),PTITLE$(40),SPACE$(40),T$(40),Y$(24),X$(40),YS$(3)›70 DIM SPACEX$(40),SPACEY$(24),YSCL(20),XSCL(20),V(20),H(20),SIGNYSCL(20),SIGNXSCL(20),YIDX$(20),XIDX$(20)›80 DIM AD$(4),HS(20),A(3),DUM$(3),DUM1$(3),A$(192)›90 TRAP 3740:OPEN #5,8,0,"P:"›100 TRAP 3750:? #5›110 GOSUB 1520:REM MACHINE LANGUAGE ROUTINE TO DRAW GR. 0 TEXT ON GR. 8 SCREEN.›120 GRAPHICS 0:? " Select array size,ND. Large ND's give smoother curves, but are time consuming."›130 ? " ND=10 (Useful to check graph format.)":? ›140 ? " ND=100 (A good starting value)":? ›150 ? " ND=400 (** MAXIMUM **)":? ›160 ? :? ›170 INPUT ND›180 ? "ND=";ND:? :? :FOR W=0 TO 100:NEXT W›190 GOSUB 1720:REM To set graph format and select graph grid/tic arrangement.›200 ? "CLEARING ARRAYS":FOR W=0 TO 300:NEXT W:P=PEEK(559):POKE 559,0:REM DMA off›210 FOR K=0 TO 401:X(K)=0:Y(K)=0:NEXT K:REM To clear out arrays.›220 POKE 559,P›230 GRAPHICS 0:? :? :? :? :? :? ›240 ? "Select plot by number.":? ›250 ? " (1) Sine Wave"›260 ? " (2) Parabola"›270 ? " (3) Circle or ellipse"›280 ? " (4) Discrete Points"›290 ? " (5) Other (Your plot?)"›300 INPUT SELECT:? :? :? :? :? :? :? ›310 ? "COMPUTING ARRAYS":FOR W=0 TO 300:NEXT W:P=PEEK(559):POKE 559,0:REM DMA off›320 ON SELECT GOSUB 2920,2970,3030,3090,3140›330 POKE 559,P:REM Enter title of plot and axis legends. [Alphanumeric or symbols]›340 GRAPHICS 0:? "Enter Title of Plot (40 characters or less)":INPUT T$›350 ? "Enter y axis legend (23 characters or less)":INPUT Y$›360 ? "Enter x axis legend (26 characters or less)":INPUT X$›370 SPACE$=" "›380 SPACEX$=" "›390 SPACEY$=" "›400 REM Imbed titles in the middle of centered blank strings.›410 SPACE$(20-LEN(T$)/2,20+LEN(T$)/2)=T$›420 PTITLE$=SPACE$›430 SPACEX$(20-LEN(X$)/2,20+LEN(X$)/2)=X$›440 XTITLE$=SPACEX$›450 SPACEY$(12-LEN(Y$)/2,12+LEN(Y$)/2)=Y$›460 YTITLE$=SPACEY$›470 REM Choice of auto or manual scaling.›480 ? "DO YOU WANT (A)UTO OR (M)ANUAL SCALING)":INPUT YS$›490 IF YS$="M" THEN 530›500 IF YS$="A" THEN GOSUB 3150›510 IF YS$<>"A" THEN 480›520 GOTO 590›530 ? "ENTER MAXIMUM VALUE OF Y AXIS":INPUT YMAX›540 ? "ENTER MINIMUM VALUE OF Y AXIS":INPUT YMIN›550 ? "ENTER MAXIMUM VALUE OF X AXIS":INPUT XMAX›560 ? "ENTER MINIMUM VALUE OF X AXIS":INPUT XMIN›570 MSDX=(XMAX-XMIN)/10:REM (M)ajor (S)cale (D)ivision›580 MSDY=(YMAX-YMIN)/10›590 GRAPHICS 8+16›600 SETCOLOR 2,8,0›610 SETCOLOR 4,4,8›620 COLOR 1›630 ON GFMT GOSUB 1790,1960,2130,2300:REM To draw axes and grid/tics.›640 REM Plot subroutine. For sequential points only.›650 K=0›660 XPLOT=250*((X(K)-XMIN)/(XMAX-XMIN))+45›670 YPLOT=150-150*((Y(K)-YMIN)/(YMAX-YMIN))+13›680 IF XPLOT<45 OR XPLOT>295 THEN XPLOT=45›690 IF YPLOT<13 OR YPLOT>163 THEN YPLOT=163›700 PLOT XPLOT,YPLOT›710 FOR K=1 TO ND›720 XPLOT=250*((X(K)-XMIN)/(XMAX-XMIN))+45›730 YPLOT=150-150*((Y(K)-YMIN)/(YMAX-YMIN))+13›740 IF XPLOT<45 OR XPLOT>295 THEN 770›750 IF YPLOT<13 OR YPLOT>163 THEN 770›760 DRAWTO XPLOT,YPLOT›770 NEXT K›780 REM Print title subroutine›790 TEXT$=PTITLE$:H=0:V=0›800 GOSUB 1690:REM Causes TEXT$ to be printed on screen @ H,V.›810 REM Print x legend›820 TEXT$=XTITLE$:H=0:V=23›830 GOSUB 1690›840 REM Print y legend›850 FOR J=1 TO LEN(YTITLE$)›860 TEXT$=YTITLE$(J,J):H=0:V=J-1›870 GOSUB 1690›880 NEXT J›890 REM Print y scale.›900 FOR J=1 TO 11›910 YSCL(J)=YMAX-(J-1)*MSDY›920 SIGNYSCL(J)=SGN(YSCL(J)):REM Separate sign and value.›930 YSCL(J)=ABS(YSCL(J))›940 H=2:V(1)=1:V(2)=3:V(3)=5:V(4)=7:V(5)=9:V(6)=11:V(7)=12:V(8)=14:V(9)=16:V(10)=18:V(11)=20›950 IF J=1 THEN GOSUB 2620:REM To select scaling factor,EX.›960 V=V(J)›970 IF EX<0 THEN YSCL(J)=YSCL(J)*(INT((10^-EX)+0.01)):GOTO 990›980 YSCL(J)=YSCL(J)/INT((10^EX)+0.01):REM TO ASSURE MULTIPLES OF 10›990 YIDX$="―±°Ε"›1000 IF J=6 THEN TEXT$=" ":GOTO 1050›1010 TEXT$=STR$(YSCL(J)):AD$="0000"›1020 REM Suppress 0 before decimal pt. and reduce to 3 characters.›1030 IF YSCL(J)<1 THEN TEXT$(LEN(TEXT$)+1)=AD$:TEXT$=TEXT$(2,4)›1040 IF YSCL(J)>1 AND INT(YSCL(J))-YSCL(J)<>0 THEN TEXT$(LEN(TEXT$)+1)=AD$:TEXT$=TEXT$(1,3)›1050 IF TEXT$="000" THEN TEXT$=" 0"›1060 GOSUB 1690:REM Print YSCL(J)›1070 H=1:REM Print sign.›1080 IF J=6 THEN TEXT$=" ":GOTO 1120›1090 IF SIGNYSCL(J)<0 THEN TEXT$="-":GOTO 1120›1100 TEXT$="+"›1110 IF YSCL(J)=0 THEN TEXT$=" "›1120 GOSUB 1690›1130 NEXT J›1140 H=0:V=23:REM Print yaxis scale factor.›1150 GOSUB 3520›1160 YIDX$(LEN(YIDX$)+1)=DUM$:TEXT$=YIDX$›1170 GOSUB 1690›1180 REM Print X scale.›1190 FOR J=1 TO 11›1200 XSCL(J)=XMAX-(J-1)*MSDX›1210 SIGNXSCL(J)=SGN(XSCL(J)):REM Separate sign and value.›1220 XSCL(J)=ABS(XSCL(J))›1230 IF INT(J/2)-J/2=0 THEN V=22:GOTO 1250:REM IF J IS EVEN THEN....›1240 V=21›1250 H(11)=5:H(10)=8:H(9)=11:H(8)=14:H(7)=18:H(6)=21:H(5)=24:H(4)=27:H(3)=30:H(2)=33:H(1)=37›1260 IF J=1 THEN GOSUB 2770›1270 H=H(J)›1280 IF EX<0 THEN XSCL(J)=XSCL(J)*(INT((10^-EX)+0.01)):GOTO 1300›1290 XSCL(J)=XSCL(J)/INT((10^EX)+0.01)›1300 XIDX$="―±°Ε"›1310 REM ›1320 TEXT$=STR$(XSCL(J))›1330 REM See 1020›1340 IF XSCL(J)<1 THEN TEXT$(LEN(TEXT$)+1)=AD$:TEXT$=TEXT$(2,4)›1350 IF XSCL(J)>1 AND INT(XSCL(J))-XSCL(J)<>0 THEN TEXT$(LEN(TEXT$)+1)=AD$:TEXT$=TEXT$(1,3)›1360 IF TEXT$="000" THEN TEXT$="0"›1370 GOSUB 1690:REM Print XSCL(J)›1380 REM Print sign of x scl.›1390 HS(J)=H(J)-1:H=HS(J)›1400 IF INT(J/2)-J/2=0 THEN V=22:GOTO 1420›1410 V=21›1420 IF SIGNXSCL(J)<0 THEN TEXT$="-":GOTO 1450›1430 TEXT$="+"›1440 IF XSCL(J)=0 THEN TEXT$=" "›1450 GOSUB 1690›1460 NEXT J›1470 H=34:V=23:REM Print Xaxis scale factor.›1480 GOSUB 3520›1490 XIDX$(LEN(XIDX$)+1)=DUM$:TEXT$=XIDX$›1500 GOSUB 1690›1510 GOTO 2470›1520 BYTES=166:REM M.L. SUBROUTINE›1530 ML=1620:REM LOCATED TO GIVE ROOM FOR GRAPHIC DUMP PROGRAM.›1540 RESTORE 1610›1550 FOR I=0 TO 165›1560 READ A›1570 POKE ML+I,A›1580 NEXT I›1590 RESTORE ›1600 RETURN ›1610 DATA 104,201,4,240,9,170,240,5,104,104,202,208,251,96,104,133,215,104,133,214,104,104,168›1620 DATA 104,133,217,104,133,216,104,104,240,236,133,212,24,165,214,101,88,133,214,165,89›1630 DATA 101,215,133,215,152,240,15,165,214,105,64,133,214,165,215,105,1,133,215,136,208,241›1640 DATA 132,221,160,0,132,220,177,216,160,0,170,16,1,136,132,213,138,41,96,208,4,169,64›1650 DATA 16,14,201,32,208,4,169,0,16,6,201,64,208,2,169,32,133,218,138,41,31,5,218,133,218›1660 DATA 169,0,162,3,6,218,42,202,208,250,109,244,2,133,219,164,221,177,218,69,213,164,220,145,214›1670 DATA 200,132,220,196,212,208,182,24,165,214,105,40,133,214,144,2,230,215,230,221,169,8›1680 DATA 197,221,208,159,96›1690 A=USR(ML,H,V,ADR(TEXT$),LEN(TEXT$)):REM H=HORIZ. LOC. OF TEXT$ IN GR. 0 COORD.,V=VERT. LOC.›1700 TEXT$=" "›1710 RETURN ›1720 GRAPHICS 0:? "Select graph format from the following:":? ›1730 ? " (1) Tic marks only":? ›1740 ? " (2) Coarse grid with tic marks":? ›1750 ? " (3) Fine grid":? ›1760 ? " (4) Fine grid with double weight major scale divisions":? ›1770 INPUT GFMT›1780 RETURN ›1790 PLOT 45,163:DRAWTO 45,13:REM Axes with tic marks only.›1800 PLOT 37,88:DRAWTO 45,88:REM At omitted yscl value.›1810 PLOT 45,163:DRAWTO 295,163›1820 REM :GRID›1830 FOR YTL=13 TO 163 STEP 15:REM (Y) (T)IC (L)ARGE›1840 PLOT 42,YTL:DRAWTO 50,YTL›1850 NEXT YTL›1860 FOR YTS=16 TO 160 STEP 3:REM (Y) (T)IC (S)MALL›1870 PLOT 45,YTS:DRAWTO 50,YTS›1880 NEXT YTS›1890 FOR XTL=45 TO 295 STEP 25:REM (X) (T)IC (L)ARGE›1900 PLOT XTL,166:DRAWTO XTL,158›1910 NEXT XTL›1920 FOR XTS=45 TO 295 STEP 5:REM (X) (T)IC (S)MALL›1930 PLOT XTS,163:DRAWTO XTS,158›1940 NEXT XTS›1950 RETURN ›1960 PLOT 45,163:DRAWTO 45,13:REM Axes with coarse grid and tic marks.›1970 PLOT 37,88:DRAWTO 45,88:REM At omitted yscl value.›1980 PLOT 45,163:DRAWTO 295,163›1990 REM :GRID›2000 FOR YTL=13 TO 163 STEP 15:REM (Y)(T)IC (L)ARGE›2010 PLOT 42,YTL:DRAWTO 295,YTL›2020 NEXT YTL›2030 FOR YTS=16 TO 160 STEP 3:REM (Y) (T)IC (S)MALL›2040 PLOT 45,YTS:DRAWTO 50,YTS›2050 NEXT YTS›2060 FOR XTL=45 TO 295 STEP 25:REM (X) (T)IC (L)ARGE›2070 PLOT XTL,166:DRAWTO XTL,13›2080 NEXT XTL›2090 FOR XTS=45 TO 295 STEP 5:REM (X) (T)IC (S)MALL›2100 PLOT XTS,163:DRAWTO XTS,158›2110 NEXT XTS›2120 RETURN ›2130 PLOT 45,163:DRAWTO 45,13:REM Fine grid.›2140 PLOT 37,88:DRAWTO 45,88:REM At omitted yscl value.›2150 PLOT 45,163:DRAWTO 295,163›2160 REM :GRID›2170 FOR YTL=13 TO 163 STEP 15:REM (Y)(T)IC (L)ARGE›2180 PLOT 42,YTL:DRAWTO 295,YTL›2190 NEXT YTL›2200 FOR YTS=16 TO 160 STEP 3:REM (Y) (T)IC (S)MALL›2210 PLOT 45,YTS:DRAWTO 295,YTS›2220 NEXT YTS›2230 FOR XTL=45 TO 295 STEP 25:REM (X) (T)IC (L)ARGE›2240 PLOT XTL,166:DRAWTO XTL,13›2250 NEXT XTL›2260 FOR XTS=45 TO 295 STEP 5:REM (X) (T)IC (S)MALL›2270 PLOT XTS,163:DRAWTO XTS,13›2280 NEXT XTS›2290 RETURN ›2300 PLOT 45,163:DRAWTO 45,13:PLOT 44,163:DRAWTO 44,13:REM DOUBLE WEIGHT LINES.›2310 PLOT 37,88:DRAWTO 45,88:REM At omitted yscl value.›2320 PLOT 45,163:DRAWTO 295,163:PLOT 45,164:DRAWTO 295,164›2330 REM :GRID›2340 FOR YTL=13 TO 163 STEP 15:REM (Y)(T)IC (L)ARGE›2350 PLOT 42,YTL:DRAWTO 295,YTL:PLOT 45,YTL+1:DRAWTO 295,YTL+1:REM DOUBLE WEIGHT LINES.›2360 NEXT YTL›2370 FOR YTS=16 TO 160 STEP 3:REM (Y) (T)IC (S)MALL›2380 PLOT 45,YTS:DRAWTO 295,YTS›2390 NEXT YTS›2400 FOR XTL=45 TO 295 STEP 25:REM (X) (T)IC (L)ARGE›2410 PLOT XTL,166:DRAWTO XTL,13:PLOT XTL-1,163:DRAWTO XTL-1,13›2420 NEXT XTL›2430 FOR XTS=45 TO 295 STEP 5:REM (X) (T)IC (S)MALL›2440 PLOT XTS,163:DRAWTO XTS,13›2450 NEXT XTS›2460 RETURN ›2470 REM Returns here from 2520 to suppress "READY" prompt until finished with display.›2480 REM "OPTION" key provides the options shown in 2550 to 2600›2490 POKE 53279,8:P=PEEK(53279):REM READ CONSOLE KEYS.›2500 IF P=3 THEN 2530:REM "OPTION" bypasses hard copy.›2510 IF P=6 THEN GOSUB 3620:REM "START" activates 49 sec. screen dump.›2520 GOTO 2470›2530 GRAPHICS 0›2540 ? "Choose option":? ›2550 ? " (1) New plot?":? ›2560 ? " (2) New plot,current ND":? ›2570 ? " (3) New plot,current ND and grid format":? ›2580 ? " (4) Current plot,new titles and scales":? ›2590 ? " (5) Current plot,new scales":? ›2600 ? " (6) Exit ":? ›2610 INPUT CHSE:ON CHSE GOTO 120,180,200,330,470,3460›2620 REM To scale y axis values to reduce number of digits.›2630 IF YSCL(1)>=1 AND YSCL(1)<=100 THEN EX=0:GOTO 2760›2640 IF YSCL(1)>100 THEN 2660›2650 GOTO 2700›2660 FOR EX=1 TO 10›2670 YPR1=YSCL(1)/INT((10^EX)+0.01)›2680 IF YPR1<100 AND YPR1>1 THEN 2760›2690 NEXT EX›2700 IF YSCL(1)<1 THEN 2720›2710 GOTO 2760›2720 FOR EX=-1 TO -10 STEP -1›2730 YPR1=YSCL(1)*(INT((10^-EX)+0.01))›2740 IF YPR1<100 AND YPR1>1 THEN 2760›2750 NEXT EX›2760 RETURN ›2770 REM To scale X axis values to reduce number of digits.›2780 IF XSCL(1)>=1 AND XSCL(1)<=100 THEN EX=0:GOTO 2910›2790 IF XSCL(1)>100 THEN 2810›2800 GOTO 2850›2810 FOR EX=1 TO 10›2820 XPR1=XSCL(1)/INT((10^EX)+0.01)›2830 IF XPR1<100 AND XPR1>1 THEN GOTO 2910›2840 NEXT EX›2850 IF XSCL(1)<1 THEN 2870›2860 GOTO 2910›2870 FOR EX=-1 TO -10 STEP -1›2880 XPR1=XSCL(1)*(INT((10^-EX)+0.01))›2890 IF XPR1<100 AND XPR1>1 THEN GOTO 2910›2900 NEXT EX›2910 RETURN ›2920 REM Sine Curve›2930 FOR I=0 TO ND›2940 X(I)=3*3.1416*(I/ND):Y(I)=SIN(X(I))›2950 NEXT I›2960 RETURN ›2970 REM Parabola›2980 FOR I=0 TO ND›2990 X(I)=I/(0.1*ND)›3000 Y(I)=X(I)^2›3010 NEXT I›3020 RETURN ›3030 REM Circle or ellipse›3040 FOR I=0 TO ND›3050 THETA=(2*3.1416*I)/ND›3060 X(I)=COS(THETA):Y(I)=SIN(THETA)/0.72›3070 NEXT I›3080 RETURN ›3090 REM Discrete Points›3100 RESTORE 3120›3110 ND=9:FOR J=0 TO ND:READ DUM1,DUM2:X(J)=DUM1:Y(J)=DUM2:ND=J:NEXT J›3120 DATA 0,7,10,25,15,30,30,50,40,60,50,80,70,20,80,32,90,70,100,100›3130 RETURN ›3140 REM Your Selection›3150 REM Auto scaling subroutines›3160 YMIN=Y(0):XMIN=X(0):YMAX=Y(0):XMAX=X(0)›3170 FOR I=1 TO ND›3180 IF Y(I)>YMAX THEN YMAX=Y(I)›3190 IF Y(I)XMAX THEN XMAX=X(I)›3210 IF X(I)255 THEN 100›3790 CLOSE #1›