25 Years of Programming
An open source source for C, C++, OWL, BASIC, MDB, XLS, DOT, and more...
Home   Projects   Up   Sitemap   Search   Blog   Forum+Chat   About Us   Privacy   Terms of Use   Feedback   FAQ   Images   Services   Payments   Humor   Music  

High-resolution data graphing program for the Heathkit H-100 computer, GWBASIC

The AUTOHIRE.BAS program reads data from files you specify and creates a graph. It is called "auto" because it automatically scales the axes to fit on the screen.

It would need some modifications for use with IBM BASICA, to accommodate the different screen resolution of a PC. The likely graphics mode to use is SCREEN 12.

10 'AUTOHIRE 11-24-85
11 '(C)COPYRIGHT 1985 STEVEN WHITNEY. 
12 'Published under GNU GPL (General Public License) Version 3, with ABSOLUTELY NO WARRANTY.
13 'Initially published by http://25yearsofprogramming.com.
20 'AutoHiResGraph. Auto because it can automatically scale the axes to fit on the screen.
30 'Plots the points from data files to an on-screen graph in graphics mode (640 x 225).
40 VIEW PRINT: CLS
50 SCL = 6
60 'HIGH RESOLUTION (PIXEL-LEVEL) GRAPHING PROGRAM
70 OPEN "O", 1, "SCOLOR": PRINT #1, SCL: CLOSE #1
80 '9-19-85 MAJOR REVISIONS TO ACCOMODATE WINDOWS (I.E. VIEWPORTS).
90 'PRINT CHR$(27)"F" : REM H-100, Z-100 GRAPHICS MODE
100 CLEAR
110 OPEN "I", 1, "SCOLOR": INPUT #1, SCL: CLOSE #1
120 SCL = (SCL + 1) MOD 8: IF SCL = 0 THEN SCL = 1 ELSE IF SCL = 3 THEN SCL = 4
130 ON ERROR GOTO 2100
140 Q$ = STRING$(75, "=")
150 DIM X(1000), Y(1000): 'MAXIMUM NUMBER OF POINTS TO PLOT
160 VIEW PRINT 24 TO 25
170 CLS
180 REM GOTO 400 : 'ENABLE TO SKIP INSTRUCTIONS
190 PRINT "AUTOHIRE.BAS"
200 PRINT "(C)COPYRIGHT 1985 STEVEN WHITNEY"
201 PRINT "Published under GNU GPL (General Public License) Version 3,"
202 PRINT "with ABSOLUTELY NO WARRANTY."
210 PRINT
220 REM lines left in, in case any were entry points.
230 REM 
240 REM 
250 REM 
260 REM 
270 REM 
280 REM 
290 REM 
300 REM 
310 REM 
320 REM 
330 REM 
340 REM 
350 REM 
360 REM 
370 CLS : PRINT Q$: PRINT "This program will plot in graph form a series of points.": PRINT "The points are referred to in the form (X,Y), where X is the ": PRINT "horizontal value, and Y is the vertical."
380 PRINT : PRINT "The values for X must already be stored in a disk file."
390 PRINT "The corresponding values for Y must be stored in a separate disk file,": PRINT "in the same order as the X values.": PRINT
400 PRINT "That is, the program will read the first value stored in the X file,": PRINT "and match it up with the first value stored in the Y file to make"
410 PRINT "the first ordered pair (X1,Y1).  The second numbers from each file will be": PRINT "paired to make the second ordered pair (X2,Y2), and so on."
420 PRINT Q$: PRINT
430 PRINT "If you use manual scaling of the Y axis, interpolation is made"
440 PRINT "easiest if the range is a number divisible by 16, 8, or 4, in"
450 PRINT "decreasing order of preference."
460 PRINT "Examples would be 0-4,0-16,32-64, etc.": PRINT STRING$(75, "-")
470 PRINT "If the X-axis numbers overprint each other, see the REM line"
480 PRINT "in the 'PRINT X-AXIS NUMBERS' program section to shorten labels"
490 PRINT Q$
500 N$ = "#####.##"
510 PRINT : PRINT "Do you want a (P)oint graph or (L)ine graph (P/L)"; : PL$ = INPUT$(1): PRINT PL$
520 IF PL$ = "p" THEN PL$ = "P"
530 IF PL$ = "l" THEN PL$ = "L"
540 IF PL$ <> "P" AND PL$ <> "L" THEN 510
550 PRINT "Do you want horizontal grid lines? (Y/N) "; : HORIZ$ = INPUT$(1): IF HORIZ$ = "n" THEN HORIZ$ = "N"
560 PRINT : PRINT "For vertical grid lines,"
570 PRINT "Do you want (A)ll grids, (C)oarse only, or (N)o grids (A/C/N)"; : GRIDF$ = INPUT$(1): PRINT GRIDF$
580 IF GRIDF$ = "a" THEN GRIDF$ = "A"
590 IF GRIDF$ = "c" THEN GRIDF$ = "C"
600 IF GRIDF$ = "n" THEN GRIDF$ = "N"
610 IF GRIDF$ <> "A" AND GRIDF$ <> "C" AND GRIDF$ <> "N" THEN 570
620 PRINT : INPUT "What file holds the   X   axis values (or AUTO)"; F$
630 IF F$ = "auto" THEN F$ = "AUTO"
640 INPUT "               What will its title be"; X$
650 PRINT
660 PRINT "Do you want to scale the X axis manually? (Y/N)"; : S1$ = INPUT$(1): PRINT S1$
670 IF S1$ = "y" THEN S1$ = "Y"
680 IF S1$ = "n" THEN S1$ = "N"
690 IF S1$ <> "N" AND S1$ <> "Y" THEN 660
700 IF S1$ <> "Y" THEN 740
710 PRINT
720 INPUT "What will the   LOW   value be"; LX
730 INPUT "What will the   HIGH   value be"; HX
740 PRINT Q$: PRINT
750 INPUT "What file holds the   Y   axis values (or AUTO)"; G$
760 IF G$ = "auto" THEN G$ = "AUTO"
770 INPUT "               What will its title be"; Y$
780 IF LEN(Y$) > 20 THEN PRINT : PRINT , "==> Please limit title to 20 characters": GOTO 770
790 PRINT
800 PRINT "Scale  Y  axis manually? (Y/N)"; : S2$ = INPUT$(1): PRINT S2$
810 IF S2$ = "y" THEN S2$ = "Y"
820 IF S2$ = "n" THEN S2$ = "N"
830 IF S2$ <> "Y" AND S2$ <> "N" THEN 800
840 IF S2$ <> "Y" THEN 900
850 PRINT
860 INPUT "What will the   LOW  value be"; LY
870 INPUT "What will the   HIGH  value be"; HY
880 SWAP LY, HY: REM Y AXIS INVERTED
890 LY = -LY: HY = -HY: REM Y AXIS & VALUES INVERTED
900 IF F$ = "AUTO" THEN XN = -1: GOTO 1000
910 IF G$ = "AUTO" THEN YN = -1
920 OPEN "I", 1, F$
930 XN = -1
940 WHILE NOT EOF(1)
950	XN = XN + 1
960	IF G$ = "AUTO" THEN YN = YN + 1: Y(YN) = -XN
970	INPUT #1, X(XN)
980 WEND
990 CLOSE
1000 IF G$ = "AUTO" THEN GOTO 1100
1010 OPEN "I", 1, G$
1020 YN = -1
1030 WHILE NOT EOF(1)
1040	YN = YN + 1
1050	IF F$ = "AUTO" THEN XN = XN + 1: X(XN) = YN
1060	INPUT #1, Y(YN)
1070	Y(YN) = -Y(YN): REM INVERT FOR LATER PLOTTING HIGH MUST BE LOWEST!
1080 WEND
1090 CLOSE
1100 IF XN = YN THEN GOTO 1150
1110 CLS : PRINT CHR$(7): PRINT Q$: PRINT "==>WARNING: The two data files do not contain the same # of points."
1120 PRINT "I will try to plot points for which there are X values, but the"
1130 PRINT "graphing may be erratic or erroneous.": PRINT Q$
1140 PRINT "Press any key to acknowledge and continue": Z$ = INPUT$(1)
1150 PRINT "Calculating..."
1160 REM -----------------------------------
1170 IF S1$ = "Y" THEN 1300
1180 REM FIND HIGH X VALUE
1190 HX = -1.70141E+38
1200 FOR I = 0 TO XN
1210	IF X(I) >= HX THEN HX = X(I)
1220 NEXT I
1230 REM ---------------------------------
1240 REM FIND LOW X VALUE
1250 LX = 1.70141E+38
1260 FOR I = 0 TO XN
1270	IF X(I) <= LX THEN LX = X(I)
1280 NEXT I
1290 REM FIND HIGH Y VALUE ------------------
1300 IF S2$ = "Y" THEN 1410
1310 HY = -1.70141E+38
1320 FOR I = 0 TO YN
1330	IF Y(I) >= HY THEN HY = Y(I)
1340 NEXT I
1350 REM FIND LOW Y VALUE --------------------
1360 LY = 1.70141E+38
1370 FOR I = 0 TO YN
1380	IF Y(I) <= LY THEN LY = Y(I)
1390 NEXT I
1400 REM ------------------------------
1410 REM SCALE X VALUES TO THE EXACT VALUES TO BE PLOTTED (76 TO 635 GOING UP)
1420 FOR I = 0 TO XN
1430	X(I) = ((X(I) - LX) * (559 / (HX - LX))) + 76
1440 NEXT I
1450 REM SCALE Y VALUES TO THE EXACT VALUES TO BE PLOTTED (148 TO 4 GOING UP)
1460 FOR I = 0 TO YN
1470	Y(I) = ((Y(I) - LY) * (144 / (HY - LY))) + 4
1480 NEXT I
1490 REM PRINT GRAPH SKELETON---------------------
1500 CLS
1510 REM
1520 VIEW PRINT
1530 LOCATE 23, (10 + ((80 - LEN(X$)) / 2)): PRINT X$; : REM PRINT X LABEL
1540 'PRINT
1550 IF HORIZ$ = "N" THEN GOTO 1590
1560 FOR I = 0 TO 16: LINE (76, I * 9 + 4)-(635, I * 9 + 4), 4: NEXT I: REM PRINT Y AXIS
1570 'PRINT
1580 REM PRINT X AXIS
1590 LOCATE 17, 10
1600 IF GRIDF$ = "N" THEN 1720
1610 'UNDER SOME CONDITIONS, GRID LINES AREN'T ALIGNED WITH NUMBERS OR
1620 'MAJOR GRID LINES ARE INCORRECT.  USUALLY, IT CAN BE RECTIFIED BY
1630 'MANUAL SCALING.
1640 'UNDER OTHER CONDITIONS, DISPLAY GOES *WAY* OUT OF BOUNDS AND NO
1650 'GRAPH PRINTS AT ALL.  NOT SURE WHY, AND IT REQUIRES UNUSUAL CONDITIONS.
1660 LCOUNT = -1
1670 FOR I = LX + 76 TO 639 STEP 559 / (HX - LX): 'WAS LX+75 IN A PREVIOUS VERSION?
1680	LCOUNT = LCOUNT + 1
1690	IF LCOUNT MOD 5 = 0 THEN LINE (I, 17 * 9 - 2)-(I, 4), 4 ELSE IF GRIDF$ = "A" THEN LINE (I, 17 * 9 - 5)-(I, 4), 4: 'THIS LINE SHOULD BE WHERE THE POINT ACTUALLY FALLS
1700	IF LCOUNT MOD 5 = 0 THEN LINE (I + 1, 17 * 9 - 5)-(I + 1, 4), 4
1710 NEXT I
1720 REM PRINT Y LABEL-------------
1730 FOR I = 1 TO LEN(Y$)
1740	LOCATE (11 - LEN(Y$) / 2 + I), 1: PRINT MID$(Y$, I, 1);
1750 NEXT I
1760 REM PRINT Y AXIS NUMBERS----------------------------
1770 FOR I = 1 TO 17
1780	LOCATE I, 2: PRINT MID$(STR$(-(LY + (I - 1) * (HY - LY) / 16)), 1, 8)
1790 NEXT I
1800 REM PRINT X AXIS NUMBERS ----------------------------------
1810 LOCATE 18, 5
1820 '
1830 FOR I = 0 TO (HX - LX) / 10
1840	TB = (LX + I * 10): 'IF OVERPRINTING IS A PROBLEM, USE INT(LX+I*10)
1850	'IF OVERPRINTING STILL A PROBLEM, DISABLE THE NUMBER PRINTING ENTIRELY
1860	'IF LEN(STR$(TB))/2>=5 THEN 1580 :'DON'T PRINT IF STRING TOO LONG
1870	IF ((75 + I * 10 * 559 / (HX - LX)) / 8) + 1 - LEN(STR$(TB)) / 2 > 75 THEN GOTO 1890: 'DON'T PRINT IF TOO CLOSE TO RIGHT MARGIN
1880	LOCATE 18, ((75 + I * 10 * 559 / (HX - LX)) / 8) + 1 - LEN(STR$(TB)) / 2: PRINT TB;
1890 NEXT I
1900 LOCATE 19, 5
1910 FOR I = .5 TO (HX - LX) / 10
1920	TB = (LX + I * 10): 'IF OVERPRINTING OCCURS, USE INT(LX+I*10)
1930	'IF OVERPRINTING STILL A PROBLEM, BYPASS THIS LOOP ENTIRELY
1940	'IF LEN(STR$(TB))/2>=5 THEN 1650:'DON'T PRINT IF STRING TOO LONG
1950	IF ((75 + I * 10 * 559 / (HX - LX)) / 8) + 1 - LEN(STR$(TB)) / 2 > 75 THEN GOTO 1970: 'DON'T PRINT IF TOO CLOSE TO RIGHT MARGIN
1960	LOCATE 19, ((75 + I * 10 * 559 / (HX - LX)) / 8) + 1 - LEN(STR$(TB)) / 2: PRINT TB;
1970 NEXT I
1980 LOCATE 1, 1
1990 REM PLOT POINTS ------------------------------------------
2000 FOR I = 0 TO XN
2010	IF PL$ = "P" THEN PSET (X(I), Y(I)), SCL: GOTO 2030
2020	IF LINEF = 0 THEN LINEF = 1: PSET (X(I), Y(I)), SCL: GOTO 2030 ELSE LINE -(X(I), Y(I)), SCL
2030 NEXT I
2040 'PRINT CHR$(27)"G" : REM EXIT GRAPHICS
2050 VIEW PRINT 24 TO 25
2060 LOCATE 25, 1
2070 PAUSE$ = INPUT$(1)
2080 GOTO 60
2090 END
2100 IF ERR = 53 AND (ERL = 900 OR ERL = 1000) THEN PRINT CHR$(7): PRINT STRING$(75, "="): PRINT "ONLY THESE FILES ARE AVAILABLE: ": PRINT : FILES: PRINT STRING$(75, "="): PRINT  ELSE GOTO 2130
2110 IF ERL = 900 THEN RESUME 620
2120 IF ERL = 1000 THEN RESUME 750
2130 ON ERROR GOTO 0

 


 

Valid HTML 4.01 Transitional
Yahoo! Search
Search the web Search this site
Valid CSS