8000 REM screen plot program 8010 ' for up to 5 sets of x and y variables 8020 ' Cybersoft Group - Deane Wang - April 1982 8030 ' 8035 KEY OFF 8040 CLS: CLEAR: SCREEN 0,0,0: OPTION BASE 1 8050 DEFINT I: DIM OX(5,100), OY(5,100), IX(5,100), IY(5,100), T(20) 8060 ' 8070 PRINT:PRINT "PLOTTING PROGRAM FOR IBM-PC AND EPSON PRINTER WITH GRAFTRAX OPTION" 8080 PRINT:PRINT "REQUIRES PRTSC.EXE ON THE SAME DISK" 8090 PRINT:PRINT: COLOR 0,7 8100 PRINT:PRINT,"BY CYBERSOFT GROUP - VERSION 11/82 " 8105 LOCATE 24,32: PRINT"by Deane Wang";:COLOR 7,0 8110 FOR ZZ=1 TO 2: SOUND 200,20: NEXT ZZ: CLS 8120 PRINT"THIS PROGRAM REQUIRES INPUTS OF:":PRINT 8130 PRINT" THE NUMBER OF COLUMNS OF DATA (MAX 10 FOR X/Y PAIRS, 6 WITH ONE X" 8140 PRINT" THE NUMBER OF ROWS OF DATA (MAX 100)" 8150 PRINT:PRINT:PRINT"ALL THE COLUMNS OF DATA NEED NOT BE PLOTTED":PRINT:PRINT 8160 GOSUB 8290 'read in data 8170 GOSUB 8700 'min/max subroutine 8180 GOSUB 8930 'scaling subroutine 8190 GOSUB 9130 'bubble sort on x 8200 GOSUB 9320 'label screen 8210 GOSUB 9730 'plot data 8220 D$=INKEY$: IF D$="" THEN GOTO 8220 ELSE CLS 8230 'INPUT "do you want to plot another set in the same dataset";Q$ 8240 'IF Q$="Y" OR Q$="y" THEN FLAG=1 8242 'IF YCOL$="Y" OF YCOL$="y" THEN GOSUB 8530 ELSE GOSUB 8420: GOSUB 8810:GOTO 8180 8250 INPUT "do you want to plot another graph";Q$ 8260 IF Q$="Y" OR Q$="y" THEN CLOSE: GOTO 8040 8270 CLOSE: SYSTEM 8280 ' 8290 REM input subroutine 8300 ' 8310 INPUT "enter filename of data to be plotted";NA$ 8320 OPEN NA$ FOR INPUT AS #1 8330 INPUT "enter number of data points, (100 max)";IM$ 8340 IF IM$="" THEN GOTO 8330 8350 IMX=VAL(IM$): IF IMX>100 THEN IMX=100 8360 IF IMX<3 THEN PRINT "Dataset is too small": GOTO 8310 8370 INPUT "enter number of columns in the dataset";ICOL 8380 INPUT "do the data use one set of x values (Y or N)";QCOL$ 8390 IF QCOL$="y" OR QCOL$="Y" THEN GOTO 8530 ELSE GOTO 8400 8400 INPUT "enter the number of x/y sets in the data";YNUM 8410 FOR I=1 TO YNUM 8420 INPUT "enter the column number for x(i) - (y assumed to be next column)";XCOL(I) 8430 NEXT I:IF FLAG THEN RETURN 8440 FOR I=1 TO IMX 8450 FOR IT=1 TO ICOL: IF EOF(1) THEN GOTO 8670 ELSE INPUT#1,T(IT): NEXT IT 8460 FOR IN=1 TO YNUM 8470 OX(IN,I)=T(XCOL(IN)) 8480 OY(IN,I)=T(XCOL(IN)+1): PRINT OX(IN,I);OY(IN,I);"<>"; 8490 NEXT IN:PRINT 8500 NEXT I 8510 IND=IMX: GOTO 8680 8520 ' 8530 INPUT "enter the column number for x";XCOL 8540 INPUT "enter the number of y variables";YNUM 8550 FOR I=1 TO YNUM: PRINT "enter the column number for y -";I; 8560 INPUT YCOL(I): NEXT I:IF FLAG THEN RETURN 8570 FOR I=1 TO IMX 8580 FOR IT=1 TO ICOL: IF EOF(1) THEN GOTO 8670 ELSE INPUT#1,T(IT): NEXT IT 8590 FOR K=1 TO ICOL: PRINT T(K);"<>";: NEXT K: PRINT 8600 FOR IXN=1 TO YNUM: OX(IXN,I)=T(XCOL): NEXT IXN 8610 FOR IJ=1 TO YNUM 8620 OY(IJ,I)=T(YCOL(IJ)) 8630 NEXT IJ 8640 NEXT I 8650 IND=IMX: GOTO 8680 8660 ' 8670 IND=I-1 ' number of points per variable 8680 IN=YNUM: RETURN 8690 ' 8700 REM min/max subroutine 8710 ' 8720 XMN=999999!: XMX=-999999!: YMN=999999!: YMX=-999999! 8730 FOR IJ=1 TO IN 8740 FOR I=1 TO IND 8750 IF XMN>OX(IJ,I) THEN XMN=OX(IJ,I) 8760 IF YMN>OY(IJ,I) THEN YMN=OY(IJ,I) 8770 IF XMX to use defaults";Q$ 8860 IF Q$="y" OR Q$="Y" THEN GOTO 8870 ELSE GOTO 8910 8870 PRINT: INPUT "x minumum";XMN 8880 INPUT "x maximum";XMX 8890 INPUT "y minimum";YMN 8900 INPUT "y maximum";YMX 8910 RETURN 8920 ' 8930 REM Scaling subroutine 8940 ' 8950 XRAN=XMX-XMN 8960 XSC=XRAN/560 8970 YRAN=YMX-YMN 8980 YSC=YRAN/160 8990 FOR IJ=1 TO IN 9000 FOR I=1 TO IND 9010 IX(IJ,I)=(OX(IJ,I)-XMN)/XSC 9020 IF IX(IJ,I)>560 THEN IX(IJ,I)=560 9030 IF IX(IJ,I)<0 THEN IX(IJ,I)=0 9040 IX(IJ,I)=IX(IJ,I)+68 'offset for drawn y-axis 9050 IY(IJ,I)=(OY(IJ,I)-YMN)/YSC 9060 IF IY(IJ,I)>160 THEN IY(IJ,I)=160 9070 IF IY(IJ,I)<0 THEN IY(IJ,I)=0 9080 IY(IJ,I)=164-IY(IJ,I) 'reversal and offset from x-axis 9090 NEXT I 9100 NEXT IJ 9110 RETURN 9120 ' 9130 REM Sorting subroutine 9140 ' a bubble sort in the x-dimension 9150 ' 9160 PRINT: INPUT "Do the data need sorting (Y or N)"; Q$ 9170 IF Q$="Y" OR Q$="y" THEN GOTO 9180 ELSE GOTO 9300 9180 FOR IJ=1 TO IN 9190 IPAS=1 9200 WHILE IPAS 9210 IPAS=0 9220 FOR I=1 TO (IND-1) 9230 IF IX(IJ,I)>IX(IJ,I+1) THEN GOTO 9240 ELSE GOTO 9270 9240 SWAP IX(IJ,I),IX(IJ,I+1) 9250 SWAP IY(IJ,I),IY(IJ,I+1) 9260 IPAS=1 9270 NEXT I 9280 WEND 9290 NEXT IJ 9300 RETURN 9310 ' 9320 REM Labeling and axis subroutine 9330 ' 9340 PRINT: INPUT "enter y-axis label (12 characters)";YNA$ 9350 INPUT "enter x-axis label (20 characters)";XNA$ 9360 SCREEN 2: CLS 9370 LOCATE 24,30 9380 IF LEN(XNA$)>20 THEN PRINT LEFT$(XNA$,20); ELSE PRINT XNA$; 9390 FOR I=1 TO 12 9400 LOCATE (4+I),1: PRINT MID$(YNA$,I,1); 9410 NEXT I 9420 ' 9430 PSET(68,164) 9440 FOR I=1 TO 5: DRAW "r112d4u4": NEXT I 9450 PSET(68,164) 9460 FOR I=1 TO 5: DRAW "u32l6r6": NEXT I 9470 ' 9480 YINT=YRAN/5 9490 YLB(1)=YMN: YLB(6)=YMX 9500 FOR I=2 TO 5 9510 YLB(I)=(I-1)*YINT+YMN 9520 NEXT I 9530 XINT=XRAN/5 9540 XLB(1)=XMN: XLB(6)=XMX 9550 FOR I=2 TO 5 9560 XLB(I)=(I-1)*XINT+XMN 9570 NEXT I 9580 ' 9590 FOR I=1 TO 6 9600 IP=21-(4*(I-1)) 9610 LOCATE IP,3 9620 PRINT USING "###.#";YLB(I); 9630 NEXT I 9640 FOR I=1 TO 5 9650 IP=6+((I-1)*14) 9660 LOCATE 22,IP 9670 PRINT USING "#####";XLB(I); 9680 PRINT " "; 9690 NEXT I 9700 PRINT USING "#####";XLB(6); 9710 RETURN 9720 ' 9730 REM PLOTTING SUBROUTINE 9740 ' 9750 SYM$(1)="d2l3r6u1l6u1r6u1l6u1r6" 9760 SYM$(4)="u1r1l1d1l1r3d1r1l5" 9770 SYM$(3)="d1r2u1r1l4u1r4l1u1l2" 9780 SYM$(5)="bl2u2r6d4l6u2br2" 9790 SYM$(2)="e3g3h3f6h3g3e3" 9800 FOR IJ=1 TO IN 9810 PSET(IX(IJ,1),IY(IJ,1)): DRAW SYM$(IJ) 9820 FOR I=1 TO IND-1 9830 FOR IA=1 TO IND 9840 IF I+IA>IND THEN GOTO 9910 9850 IF IY(IJ,I+IA)>163 THEN GOTO 9860 ELSE GOTO 9870 9860 NEXT IA 9870 LINE(IX(IJ,I),IY(IJ,I))-(IX(IJ,I+IA),IY(IJ,I+IA)) 9880 I=I+IA-1 9890 DRAW SYM$(IJ) 9900 NEXT I 9910 NEXT IJ 9920 RETURN J,I),IY(IJ,I))-(IX(IJ,I+IA),IY(IJ,I+IA))