home *** CD-ROM | disk | FTP | other *** search
/ Oakland CPM Archive / oakcpm.iso / cpm / plot33 / plot33.lbr / HANDPLOT.BQS / HANDPLOT.BAS
Encoding:
BASIC Source File  |  1985-02-10  |  22.0 KB  |  530 lines

  1. 100  REM     COPYRIGHT (C) 1984 BY THOMAS E. SPEER. ALL RIGHTS RESERVED
  2. 101  REM     RELEASED TO THE PUBLIC DOMAIN FOR NON-COMMERCIAL USE ONLY.
  3. 102 REM-----------PLOT PACKAGE-------------
  4. 103 REM VARIABLES:
  5. 104 REM CX      CHARACTER SIZE
  6. 105 REM LY      LINE SIZE IN Y DIRECTION
  7. 106 REM ML      LEFT MARGIN
  8. 107 REM MR      RIGHT MARGIN
  9. 108 REM MB      BOTTOM MARGIN
  10. 109 REM MT      TOP MARGIN
  11. 110 REM NY%     NUMBER OF CHARACTERS IN Y AXIS LABELS
  12. 111 REM NX%     NUMBER OF CHARACTERS IN X AXIS LABELS
  13. 112 REM LX%     NUMBER OF LINES OF X AXIS LABELS
  14. 113 REM DX,DY   REAL INCREMENTS BETWEEN GRID TIC MARKS
  15. 114 REM XL,XR   REAL VALUES FOR ENDS OF X AXIS
  16. 115 REM YB,YT   REAL VALUES FOR ENDS OF Y AXIS
  17. 116 REM GD      PLOTTER INCREMENT BETEEN DOTS IN GRID LINES
  18. 117 REM X1,Y1   STARTING PLOTTER COORDINATES FOR LINE SEGMENTS OR STRINGS
  19. 118 REM X2,Y2   ENDING PLOTTER COORDINATES FOR LINE SEGMENTS
  20. 119 REM G1-G7   GRAPHICS PACKAGE TEMPORARY VARIABLES
  21. 120 REM GF$     FILE NAME FOR VECTOR FILE
  22. 121 REM GB$     BUFFER STRING FOR VECTOR FILE
  23. 122 REM GC$     GRAPHIC COMMAND STRING
  24. 123 REM GC%    COLOR VALUE 0=WHITE, 1-63=PATTERNED, 64-127=GREY,NEG=XOR
  25. 124 REM GL$     LABEL STRING
  26. 125 REM --------------------------------
  27. 126 REM ------------------------------------------------------------------------
  28. 127 REM !                              ^                                       !
  29. 128 REM !                              MT                                      !
  30. 129 REM !                              !                                       !
  31. 130 REM !                              V                                       !
  32. 131 REM !          --------------------------------------------------          !
  33. 132 REM !          !                                                !          !
  34. 133 REM !<--ML---->!                                                !<---MR--->!
  35. 134 REM !          !   1000 I    .    .    .    .    .    .    .    !          !
  36. 135 REM !          !        I         .         .         .         !          !
  37. 136 REM !          !        I         .         .         .         !          !
  38. 137 REM !          !    950 I    .    .    .    .    .    .    .    !          !
  39. 138 REM !          !        I         !<-->!    .         .         !          !
  40. 139 REM !          !        I         . GD      .         .         !          !
  41. 140 REM !          !    900 I    .    .    .    .    .    .    .    !          !
  42. 141 REM !          !        I         .         .         .         !          !
  43. 142 REM !          !        I         .         .         .         !          !
  44. 143 REM !          !    850 I    .    .    .    .    .    .    .    !          !
  45. 144 REM !          !        I         .         .         .         !          !
  46. 145 REM !          !        I         .         .         .         !          !
  47. 146 REM !          !    800 I=======================================!          !
  48. 147 REM !          !      10.01     10.02     10.03     10.04       !          !
  49. 148 REM !          !                                                !          !
  50. 149 REM !          --------------------------------------------------          !
  51. 150 REM !                              ^                                       !
  52. 151 REM !                              !                                       !
  53. 152 REM !                              MB                                      !
  54. 153 REM !                              !                                       !
  55. 154 REM !                              V                                       !
  56. 155 REM ------------------------------------------------------------------------
  57. 156 REM XL=10.01, XR=10.05, DX=.01, YB=800, YT=1000, DY=50
  58. 157 REM NX%=5, LX%=1, NY%=4
  59. 158 REM WHEN LX%<=0, ADDITIONAL LINES WILL BE ADDED AUTOMATICALLY TO AVOID 
  60. 159 REM OVERLAP IN THE X AXIS LABELS.
  61. 160 REM
  62. 161 REM
  63. 162  REM  SCALING & CONVERSION FUNCTIONS
  64. 163 CX=1/80:LY=1/82: REM VALUES FOR MX-80
  65. 164 GK=32767: REM CONVERSION CONSTANT FOR COORDINATES
  66. 165  DEF  FN RX(X) =  ML + NY% * CX + (1 - ML - MR - NY% * CX) * (X - XL) / (XR - XL)
  67. 166  DEF  FN RY(Y) =  MB + LX% * LY +(1 - MT - MB - LX% * LY) * (Y - YB) / (YT - YB)
  68. 167  DEF  FN UX(X) = (X - ML - NY% * CX) * (XR - XL) / (1 - ML - MR - NY% * CX) + XL
  69. 168 DEF FN UY(Y) = (Y - MB - LX% * LY) * (YT - YB)/(1 - MT - MB - LX% * LY) + YB
  70. 169 REM OPEN .VEC FILE
  71. 170 GOSUB 204
  72. 171  GOTO 277: REM  TRANSFER TO USER PROGRAM
  73. 172 REM WRITE COMMAND STRING SUBROUTINE ****************************************
  74. 173 IF LEN(GB$)+LEN(GC$)<=126 THEN 176
  75. 174 GB$=GB$+STRING$(126-LEN(GB$),"N")
  76. 175 PRINT #1, GB$: GB$=MKS$(FRE(0)):GB$=""
  77. 176 GB$=GB$+GC$: RETURN
  78. 177 REM DRAW LINE SEGMENT               ****************************************
  79. 178 GC$="D"+MKI$(INT(X1*GK))+MKI$(INT(Y1*GK))+MKI$(INT(X2*GK))+MKI$(INT(Y2*GK))
  80. 179 GOSUB 173: RETURN
  81. 180 REM PLOT POINT                      ****************************************
  82. 181 GC$="P"+MKI$(INT(X1*GK))+MKI$(INT(Y1*GK)): GOSUB 173: RETURN
  83. 182 REM PLOT INCREMENTAL SEGMENT        ****************************************
  84. 183 GC$="I"+MKI$(INT(X1*GK))+MKI$(INT(Y1*GK)): GOSUB 173: RETURN
  85. 184 REM SET COLOR CODE                  ****************************************
  86. 185 GC$="C"+LEFT$(MKI$(GC%),1)
  87. 186 GOSUB 173: RETURN
  88. 187 REM ERASE PICTURE                   ****************************************
  89. 188 GC$="C"+LEFT$(MKI$(GC%),1)+"E"
  90. 189 GOSUB 173: RETURN
  91. 190 REM PLOT PRINTED STRING             ****************************************
  92. 191 GC$="S"+MKI$(INT(X1*GK))+MKI$(INT(Y1*GK))+GL$+CHR$(13): GOSUB 173: RETURN
  93. 192 REM SEND TEXT DIRECTLY TO PRINTER    ****************************************
  94. 193 GC$="T"+GL$+CHR$(0): GOSUB 173: RETURN
  95. 194 REM PLOT FILLED SEGMENT             ****************************************
  96. 195 GC$="F"+MKI$(INT(X1*GK))+MKI$(INT(Y1*GK))+MKI$(INT(X2*GK))+MKI$(INT(Y2*GK))
  97. 196 GC$=GC$+MKI$(INT(YF*GK))
  98. 197 GOSUB 173:RETURN
  99. 198 REM SEND PRINT PICTURE COMMAND      ****************************************
  100. 199 GC$="O": GOSUB 173: RETURN
  101. 200 REM QUIT PLOTTING, PRINT GRAPH      ****************************************
  102. 201 GC$="OQ":GOSUB 173
  103. 202 GB$=GB$+GC$: GB$=GB$+STRING$(126-LEN(GB$),"N")
  104. 203 PRINT #1,GB$: CLOSE #1: RETURN
  105. 204 REM OPEN NEW OUTPUT FILE            ****************************************
  106. 205 INPUT "ENTER PLOT OUTPUT FILENAME: ",GF$
  107. 206 IF INSTR(GF$,".")=0 THEN GF$=GF$+".VEC"
  108. 207 OPEN "O",#1,GF$:GB$="":GC$="C"+CHR$(0)+"EC"+CHR$(127): GOSUB 173: RETURN
  109. 208  REM  SET DEFAULT VALUES            ****************************************
  110. 209 GC%=127
  111. 210 MT = 0:MB = 0:MR = 0:ML = 0
  112. 211 XL = 0:XR = 1:YB = 0:YT = 1:DX = 1:DY = 1
  113. 212 NX% = 0:NY% = 0:LX% = 0: GD = .01
  114. 213  RETURN 
  115. 214  REM  CALCULATE GRID                ****************************************
  116. 215 G1 =  FRE (0):G1 = 1 - ML - MR - CX * NX%: REM  PLOTTER LENGTH OF X AXIS
  117. 216  IF G1 > CX THEN 218
  118. 217  PRINT "GRAPH TOO NARROW": RETURN 
  119. 218 G3 =  ABS ( FN RX(XL) -  FN RX(XL + DX)): REM  PLOTTER DX
  120. 219  IF LX% > 0 THEN 221
  121. 220 LX% = INT(NX% * CX/ G3) + 1
  122. 221 G2 = 1 - MT - MB - LY * LX%: REM  PLOTTER LENGTH OF Y AXIS
  123. 222  IF G2 > CX THEN 224
  124. 223  PRINT "GRAPH TOO SHORT": RETURN 
  125. 224  RETURN 
  126. 225  REM  DRAW GRID                     ****************************************
  127. 226 REM
  128. 227  Y1=FN RY(YB):Y2=FN RY(YT)
  129. 228  GC$="C"+CHR$(8): GOSUB 173
  130. 229  FOR G4 = XL TO XR STEP DX
  131. 230 X1 =  FN RX(G4): X2=X1
  132. 231  GOSUB 178
  133. 232 NEXT G4
  134. 233 GC$="C"+CHR$(1): GOSUB 173
  135. 234  X1=FN RX(XL):X2=FN RX(XR)
  136. 235  FOR G4 = YB TO YT STEP DY
  137. 236  Y1=FN RY(G4):Y2=Y1
  138. 237  GOSUB 178
  139. 238 NEXT G4
  140. 239  GOSUB 184: RETURN 
  141. 240 IF NX%=0 THEN GOTO 245 ELSE G6 =  FN RY(YB)
  142. 241  FOR G4 = XL TO XR STEP DX
  143. 242 G5 =  FN RX(G4)
  144. 243 X1=G5:Y1=G6:X2=G5:Y2=G6-CX:GOSUB 178
  145. 244  NEXT G4:  X1=FN RX(XR):Y1=FN RY(YB):X2=FN RX(XL): Y2=Y1: GOSUB 178
  146. 245 IF NY%=0 THEN GOTO 250 ELSE G5 =  FN RX(XL)
  147. 246  FOR G4 = YB TO YT STEP DY
  148. 247 G6 =  FN RY(G4)
  149. 248  X1=G5:Y1=G6:X2=G5-CX:Y2=G6:GOSUB 178
  150. 249  NEXT G4: X1=FN RX(XL):Y1=FN RY(YT):X2=X1: Y2=FN RY(YB): GOSUB 178
  151. 250  RETURN 
  152. 251  REM  LABEL X AXIS                  ****************************************
  153. 252 IF NX%=0 THEN RETURN ELSE G7 =  FRE (0):G7 = 0
  154. 253 G6=FN RY(YB)-2*LY
  155. 254  FOR G4 = XL TO XR STEP DX
  156. 255 G5 =  FN RX(G4):G7 = G7 + 1
  157. 256 Y1=G6- (-INT (G7 / LX%) * LX% + G7)*LY
  158. 257 X1= INT((G5-NX%*CX/2)/CX)*CX
  159. 258 GL$ = LEFT$( STR$ (G4),NX%)
  160. 259 GOSUB 191
  161. 260 NEXT G4: X1=FN RX(XR):Y1=FN RY(YB): X2=FN RX(XL): Y2=Y1: GOSUB 178
  162. 261  RETURN 
  163. 262  REM  LABEL Y AXIS                  ****************************************
  164. 263 IF NY%=0 THEN RETURN ELSE G7 =  FRE (0):G7 = 0
  165. 264 X1=ML
  166. 265  FOR G4 = YB TO YT STEP DY
  167. 266 Y1=FN RY(G4)
  168. 267 GL$ =  LEFT$( STR$ (G4), NY% )
  169. 268 GOSUB 191
  170. 269  NEXT G4: X1=FN RX(XL):Y1=FN RY(YT):X2=X1: Y2=FN RY(YB): GOSUB 178
  171. 270  RETURN 
  172. 271  REM  DO WHOLE GRID                 ****************************************
  173. 272  GOSUB 214
  174. 273  GOSUB 226
  175. 274  GOSUB 251
  176. 275  GOSUB 262
  177. 276  RETURN 
  178. 277  GOSUB 208
  179. 278 REM -------- TOP OF USER PROGRAM -------------------------------------------
  180. 280 REM     COPYRIGHT (C) 1984 BY THOMAS E. SPEER. ALL RIGHTS RESERVED
  181. 290 INPUT "Enter Maximum number of data points:",MPTS%
  182. 300 INPUT "Enter Maximum number of Variables:",MV%
  183. 310 DIM X(MPTS%,MV%),NAMES%(20,MV%),XMIN(MV%),XMAX(MV%),SYMBOL%(10,5)
  184. 320 NV%=0:NPTS%=0:SYMB%=1:X%=1:Y%=2:ATOSCALE%=-1
  185. 330 DATA 78,79,78,69,32,32,32,32,32,32
  186. 340 DATA 43,32,32,32,32,32,32,32,32,32
  187. 350 DATA 88,32,32,32,32,32,32,32,32,32
  188. 360 DATA 83,81,85,65,82,69,32,32,32,32
  189. 370 DATA 68,73,65,77,79,78,68,32,32,32
  190. 380 FOR I=1 TO 5:FOR ICHAR%=1 TO 10:READ J:SYMBOL%(ICHAR%,I)=J:NEXT ICHAR%:NEXT
  191. 390 FOR I=1 TO MV%
  192. 400 FOR ICHAR%=1 TO 20:NAMES%(ICHAR%,I)=32:NEXT ICHAR%
  193. 410 NEXT I
  194. 420 FOR I=1 TO NV%:NAMES%(1,I)=I+48:NEXT I
  195. 430 GOSUB 2180   :REM ---------------------------------- DISPLAY MENU
  196. 440 INPUT OPT%
  197. 450 IF OPT% < 1 THEN 430 ELSE IF OPT% > 35 THEN 430: REM FILTER BAD INPUTS
  198. 460 REM ------------------------------------------------- DATA SETTINGS
  199. 470 IF OPT%>1 THEN 500
  200. 480 INMODE%=NOT INMODE%
  201. 490 GOTO 430
  202. 500 IF OPT%>2 THEN 550
  203. 510 INPUT "Enter Input file Name:",INFILE$
  204. 520 CLOSE #2
  205. 530 OPEN "I",#2, INFILE$
  206. 540 GOTO 430
  207. 550 IF OPT%>3 THEN 600
  208. 560 CLOSE #3
  209. 570 INPUT "Enter Ouput file Name:",OUTFILE$
  210. 580 OPEN "O",#3,OUTFILE$
  211. 590 GOTO 430
  212. 600 IF OPT%>4 THEN 660
  213. 610 PRINT "NO.         VARIABLE NAME"
  214. 620 FOR I=1 TO NV%:PRINT I;"          ";
  215. 630 FOR ICHAR%=1 TO 20:PRINT CHR$(NAMES%(ICHAR%,I));:NEXT ICHAR%
  216. 640 PRINT:NEXT I
  217. 650 INPUT "Enter Number of Variable for X axis:",X%:GOTO 430
  218. 660 IF OPT%>5 THEN 720
  219. 670 PRINT "NO.         VARIABLE NAME"
  220. 680 FOR I=1 TO NV%:PRINT I;"       ";
  221. 690 FOR ICHAR%=1 TO 20:PRINT CHR$(NAMES%(ICHAR%,I));:NEXT ICHAR%
  222. 700 PRINT:NEXT I
  223. 710 INPUT "Enter Number of Variable for Y axis:",Y%:GOTO 430
  224. 720 IF OPT%>6 THEN 790
  225. 730 PRINT "NO.       SYMBOL"
  226. 740 FOR I=1 TO 5:PRINT I;"       ";
  227. 750 FOR ICHAR%=1 TO 10:PRINT CHR$(SYMBOL%(ICHAR%,I));:NEXT ICHAR%
  228. 760 PRINT:NEXT I
  229. 770 INPUT "Enter Number of Symbol:",SYMB%:IF SYMB%>5 THEN SYMB%=1
  230. 780 GOTO 430
  231. 790 IF OPT%>7 THEN 820
  232. 800 CONNECTED%=NOT CONNECTED%
  233. 810 GOTO 430
  234. 820 IF OPT%>8 THEN 860
  235. 830 PRINT "Actual range is from ";XMIN(X%);" to ";XMAX(X%)
  236. 840 INPUT "Enter X Min:",XL
  237. 850 GOTO 430
  238. 860 IF OPT%>9 THEN 900
  239. 870 PRINT "Actual range is from ";XMIN(X%);" to ";XMAX(X%)
  240. 880 INPUT "Enter X Max:",XR
  241. 890 GOTO 430
  242. 900 IF OPT%>10 THEN 940
  243. 910 INPUT "Enter Delta-X:",DX
  244. 920 NDX%=(XR-XL)/DX
  245. 930 GOTO 430
  246. 940 IF OPT%>11 THEN 970
  247. 950 INPUT "Enter Number of Characters in X axis Labels (incl. sign & . ):",NX%
  248. 960 GOTO 430
  249. 970 IF OPT%>12 THEN 1030
  250. 980 INPUT "Enter the approximate no. of intervals for X axis:",NDX%
  251. 990 DX=(XR-XL)/NDX%
  252. 1000 GOSUB 1980: XL=INT(XL/DX)*DX:XR=(INT(XR/DX)+1)*DX
  253. 1010 NDX%=(XR-XL)/DX
  254. 1020 GOTO 430
  255. 1030 IF OPT%>13 THEN 1070
  256. 1040 PRINT "Actual range is from ";XMIN(Y%);" to ";XMAX(Y%)
  257. 1050 INPUT "Enter Y Min:",YB
  258. 1060 GOTO 430
  259. 1070 IF OPT%>14 THEN 1110
  260. 1080 PRINT "Actual range is from ";XMIN(Y%);" to ";XMAX(Y%)
  261. 1090 INPUT "Enter Y Max:",YT
  262. 1100 GOTO 430
  263. 1110 IF OPT%>15 THEN 1150
  264. 1120 INPUT "Enter Delta-Y:",DY
  265. 1130 NDY%=(YT-YB)/DY
  266. 1140 GOTO 430
  267. 1150 IF OPT%>16 THEN 1180
  268. 1160 INPUT "Enter No. of Characters for Y axis Labels (incl. sign & . ):",NY%
  269. 1170 GOTO 430
  270. 1180 IF OPT%>17 THEN 1240
  271. 1190 INPUT "Enter approx. No. of Intervals for Y axis:",NDY%
  272. 1200 DY=(YT-YB)/NDY%
  273. 1210 GOSUB 2080:YB=INT(YB/DY)*DY:YT=(INT(YT/DY)+1)*DY
  274. 1220 NDY%=(YT-YB)/DY
  275. 1230 GOTO 430
  276. 1240 IF OPT%>18 THEN 1290
  277. 1250 INPUT "Enter Left Margin (0 => 1):",ML
  278. 1260 IF ML < 0 THEN ML=0
  279. 1270 IF ML > 1 THEN ML=1
  280. 1280 GOTO 430
  281. 1290 IF OPT%>19 THEN 1340
  282. 1300 INPUT "Enter Right Margin (0 => 1):",MR
  283. 1310 IF MR < 0 THEN MR=0
  284. 1320 IF MR > 1 THEN MR=1
  285. 1330 GOTO 430
  286. 1340 IF OPT%>20 THEN 1390
  287. 1350 INPUT "Enter Bottom Margin (0 => 1):",MB
  288. 1360 IF MB<0 THEN MB=0
  289. 1370 IF MB>1 THEN MB=1
  290. 1380 GOTO 430
  291. 1390 IF OPT%>21 THEN 1440
  292. 1400 INPUT "Enter Top Margin (0 => 1):",MT
  293. 1410 IF MT<0 THEN MT=0
  294. 1420 IF MT>1 THEN MT=1
  295. 1430 GOTO 430
  296. 1440 IF OPT%>22 THEN 1490
  297. 1450 INPUT "Enter Color Value (-127 to 127; 0=white, 127=black):",GC%
  298. 1460 IF GC%<-127 THEN GC%=127
  299. 1470 IF GC%>127 THEN GC%=127
  300. 1480 GOSUB 185: GOTO 430
  301. 1490 IF OPT%>23 THEN 1520
  302. 1500 ATOSCALE%=NOT ATOSCALE%
  303. 1510 GOTO 430
  304. 1520 IF OPT%>24 THEN 1550
  305. 1530 FILLPLT%=NOT FILLPLT%
  306. 1540 GOTO 430
  307. 1550 IF OPT%>25 THEN 1590
  308. 1560 CLOSE #1
  309. 1570 GOSUB 204
  310. 1580 GOTO 430
  311. 1590 IF OPT%>26 THEN 1630
  312. 1600 IF INMODE% THEN GOSUB 3270
  313. 1610 IF NOT INMODE% THEN GOSUB 2780
  314. 1620 GOTO 430
  315. 1630 IF OPT%>27 THEN 1660
  316. 1640 GOSUB 2930
  317. 1650 GOTO 430
  318. 1660 IF OPT%>28 THEN 1690
  319. 1670 GOSUB 3660
  320. 1680 GOTO 430
  321. 1690 IF OPT%>29 THEN 1780
  322. 1700 IF NOT FILLPLT% THEN 1720 ELSE GC2%=GC%:GC%=0:GOSUB 184
  323. 1710 X1=ML:X2=1-MR:Y1=MB:Y2=MB:YF=1-MT:GOSUB 194:GC%=GC2%:GOSUB 184
  324. 1720 IF NOT ATOSCALE% THEN 1770 ELSE XL=XMIN(X%):XR=XMAX(X%):YB=XMIN(Y%):YT=XMAX(Y%)
  325. 1730 IF NDX%=0 THEN NDX%=10
  326. 1740 IF NDY%=0 THEN NDY%=10
  327. 1750 GOSUB 1980:GOSUB 2080:XL=INT(XL/DX)*DX:XR=(INT(XR/DX)+1)*DX
  328. 1760 YB=INT(YB/DX)*DX:YT=(INT(YT/DY)+1)*DY:NDX%=(XR-XL)/DX:NDY%=(YT-YB)/DY
  329. 1770 GOSUB 271:GOTO 430
  330. 1780 IF OPT%>30 THEN 1840
  331. 1790 X1=FN RX(X(1,X%)):Y1=FN RY(X(1,Y%)):GOSUB 181:IF SYMB%>1 THEN GOSUB 2600
  332. 1800 FOR I=2 TO NPTS%:X1=FN RX(X(I,X%)):Y1=FN RY(X(I,Y%))
  333. 1810 IF CONNECTED% THEN GOSUB 183
  334. 1820 IF SYMB%>1 THEN GOSUB 2600
  335. 1830 NEXT I: GOTO 430
  336. 1840 IF OPT%>31 THEN 1890
  337. 1850 PRINT "Enter Title:":INPUT GL$
  338. 1860 PRINT "The title occupies ";LEN(GL$)*CX;" of the width of the frame."
  339. 1870 INPUT "Enter X,Y of starting coordinate for title:",X1,Y1
  340. 1880 GOSUB 191:GOTO 430
  341. 1890 IF OPT%>32 THEN 1930
  342. 1900 GOSUB 199:GC2%=GC%:GC%=0:GOSUB 188
  343. 1910 GC%=GC2%:GOSUB 185
  344. 1920 GOTO 430
  345. 1930 IF OPT%>33 THEN 430
  346. 1940 GOSUB 201
  347. 1950 GOTO 1960
  348. 1960 END
  349. 1970 REM ***********************************  X AXIS SCALE FACTORS
  350. 1980 DX=LOG((XR-XL)/NDX%)/LOG(10):DXE=INT(DX)
  351. 1990 DX=DX-DXE
  352. 2000 IF DX < .1761 THEN DX=0
  353. 2010 IF DX>=.1761 THEN IF DX < .5441 THEN DX=.30103
  354. 2020 IF DX>=.5441 THEN IF DX < .8751 THEN DX=.69897
  355. 2030 IF DX>=.8751 THEN DX=1
  356. 2040 DX=DXE+DX
  357. 2050 DX=10^DX
  358. 2060 RETURN
  359. 2070 REM ***********************************  Y AXIS SCALE FACTORS
  360. 2080 DY=LOG((YT-YB)/NDY%)/LOG(10):DYE=INT(DY)
  361. 2090 DY=DY-DYE
  362. 2100 IF DY < .1761 THEN DY=0
  363. 2110 IF DY>=.1761 THEN IF DY < .5441 THEN DY=.30103
  364. 2120 IF DY>=.5441 THEN IF DY < .8751 THEN DY=.69897
  365. 2130 IF DY>=.8751 THEN DY=1
  366. 2140 DY=DYE+DY
  367. 2150 DY=10^DY
  368. 2160 RETURN
  369. 2170 REM ***********************************  DISPLAY MENU
  370. 2180 GOSUB 3750:PRINT "DATA SETTINGS" 
  371. 2190 PRINT "No. of Variables ";NV%;
  372. 2200 PRINT TAB(35);:PRINT "No. of Points ";NPTS%
  373. 2210 PRINT "1> Data Entry ";
  374. 2220 IF INMODE% THEN PRINT "DISK"; ELSE PRINT "KEYBOARD";
  375. 2230 PRINT TAB(35);: PRINT "2> Input File ";INFILE$;
  376. 2240 PRINT TAB(35);:PRINT "3> Output File ";OUTFILE$
  377. 2250 PRINT "4> X Variable ";
  378. 2260 FOR ICHAR%=1 TO 20:PRINT CHR$(NAMES%(ICHAR%,X%));:NEXT ICHAR%
  379. 2270 PRINT TAB(35);:PRINT "5> Y Variable ";
  380. 2280 FOR ICHAR%=1 TO 20:PRINT CHR$(NAMES%(ICHAR%,Y%));:NEXT ICHAR%
  381. 2290 PRINT:PRINT "6> Symbol ";
  382. 2300 FOR ICHAR%=1 TO 10:PRINT CHR$(SYMBOL%(ICHAR%,SYMB%));:NEXT ICHAR%
  383. 2310 PRINT TAB(35);:PRINT "7> Connect points ";
  384. 2320 IF CONNECTED% THEN PRINT "TRUE" ELSE PRINT "FALSE"
  385. 2330 PRINT:PRINT "GRAPHIC SETTINGS" 
  386. 2340 PRINT "X Axis    8> Min ";XL;
  387. 2350 PRINT TAB(35);:PRINT " 9> Max ";
  388. 2360 PRINT XR;:PRINT TAB(55);:PRINT "10> DeltaX ";DX
  389. 2370 PRINT TAB(10);:PRINT "11> Label Chars";NX%;:PRINT TAB(35);
  390. 2380 PRINT "12> Divisions ";NDX%
  391. 2390 PRINT "Y Axis   13> Min ";YB;
  392. 2400 PRINT TAB(35);:PRINT "14> Max ";
  393. 2410 PRINT YT;:PRINT TAB(55);:PRINT "15> DeltaY ";DY
  394. 2420 PRINT TAB(10);:PRINT "16> Label Chars ";NY%;:PRINT TAB(35);
  395. 2430 PRINT "17> Divisions ";NDY%
  396. 2440 PRINT "Margins  18> Left ";ML;:PRINT TAB(35);:PRINT "19> Right ";MR;
  397. 2450 PRINT TAB(10);:PRINT "20> Bottom ";MB;:PRINT TAB(35);:PRINT "21> Top ";:PRINT MT
  398. 2460 PRINT "22> Color Value ";GC%;:PRINT TAB(35);
  399. 2470 PRINT "23> Auto-Scale ";:PRINT TAB(51);
  400. 2480 IF ATOSCALE% THEN PRINT "TRUE" ELSE PRINT "FALSE"
  401. 2490 PRINT "24> Clear Plot Area First ";
  402. 2500 IF FILLPLT% THEN PRINT "TRUE" ELSE PRINT "FALSE"
  403. 2510 PRINT "25> Plot Output File Name ";GF$
  404. 2520 PRINT:PRINT "ACTIONS";SPACE$(72) 
  405. 2530 PRINT "26> Read New Data";:PRINT TAB(25);:PRINT "27> Edit data";
  406. 2540 PRINT TAB(50);:PRINT "28> Write Data"
  407. 2550 PRINT "29> Plot Graph Axes";:PRINT TAB(25);:PRINT "30> Plot Data";
  408. 2560 PRINT TAB(50);:PRINT "31> Title Plot"
  409. 2570 PRINT "32> Advance Page";:PRINT TAB(25);:PRINT "33> End Program"
  410. 2580 PRINT:PRINT "Enter Number of SETTING or ACTION";SPACE$(7); 
  411. 2590 RETURN
  412. 2600 REM ******************************  PLOT SYMBOL
  413. 2610 ON SYMB% GOTO 2630,2640,2680,2720,2750
  414. 2620 SYMB%=1
  415. 2630 RETURN
  416. 2640 XSYMB=X1:YSYMB=Y1
  417. 2650 X1=XSYMB-.01:Y1=YSYMB:X2=XSYMB+.01:Y2=YSYMB:GOSUB 178
  418. 2660 X1=XSYMB:Y1=YSYMB-.01:X2=XSYMB:Y2=YSYMB+.01:GOSUB 178
  419. 2670 X1=XSYMB:Y1=YSYMB:GOSUB 181:RETURN
  420. 2680 XSYMB=X1:YSYMB=Y1
  421. 2690 X1=XSYMB-.01:Y1=YSYMB-.01:X2=XSYMB+.01:Y2=YSYMB+.01:GOSUB 178
  422. 2700 Y1=YSYMB+.01:Y2=YSYMB-.01:GOSUB 178
  423. 2710 X1=XSYMB:Y1=YSYMB:GOSUB 181:RETURN
  424. 2720 XSYMB=X1:YSYMB=Y1:X1=XSYMB-.01:Y1=YSYMB-.01:X2=X1:Y2=YSYMB+.01:GOSUB 178
  425. 2730 X1=XSYMB+.01:Y1=Y2:GOSUB 182:Y1=YSYMB-.01:GOSUB 182:X1=XSYMB-.01:GOSUB 182
  426. 2740 X1=XSYMB:Y1=YSYMB:GOSUB 181:RETURN
  427. 2750 XSYMB=X1:YSYMB=Y1:X1=XSYMB-.01:X2=XSYMB:Y2=YSYMB+.01:GOSUB 178
  428. 2760 X1=XSYMB+.01:GOSUB 182:X1=XSYMB:Y1=YSYMB-.01:GOSUB 182
  429. 2770 X1=XSYMB-.01:Y1=YSYMB:GOSUB 182:X1=XSYMB:GOSUB 181:RETURN
  430. 2780 REM ******************************************* MANUAL DATA ENTRY
  431. 2790 INPUT "Enter Number of Variables:",NV%:IF NV%>MV% THEN NV%=MV%
  432. 2800 FOR J=1 TO NV%:PRINT "Enter the Name of the ";J;"th Variable";
  433. 2810 INPUT ":",GL$:L=LEN(GL$):IF L>20 THEN L=20
  434. 2820 FOR ICHAR%=1 TO L:NAMES%(ICHAR%,J)=ASC(MID$(GL$,ICHAR%,1)):NEXT ICHAR%
  435. 2830 NEXT J
  436. 2840 GOSUB 3750:PRINT"ENTER 999 FOR ALL FIELDS TO INDICATE END OF DATA"
  437. 2850 L=1
  438. 2860 FOR I=L TO MPTS%
  439. 2870 PRINT "Enter ";NV%;" Values for the ";I;"th Record (1 at a time):"
  440. 2880 FOR J=1 TO NV%:INPUT X(I,J):NEXT J
  441. 2890 CHECK%=(X(I,1)=999):FOR J=2 TO NV%:CHECK%=CHECK% AND (X(I,J)=999):NEXT J
  442. 2900 IF CHECK% THEN GOTO 2930
  443. 2910 NPTS%=I
  444. 2920 NEXT I
  445. 2930 REM ------------------------------------------ CORRECT MISTAKES
  446. 2940 FOR L=1 TO NPTS% STEP 15
  447. 2950 GOSUB 3750;
  448. 2960 PRINT "HIT RETURN TO CONTINUE"
  449. 2970 PRINT "PT";:FOR J=1 TO NV%:PRINT TAB(J*10-5);:PRINT "X";J;:NEXT J:PRINT
  450. 2980 FOR I=L TO L+14
  451. 2990 IF I>NPTS% THEN 3080
  452. 3000 PRINT I;:FOR J=1 TO NV%:PRINT TAB(J*10-5);:PRINT X(I,J);:NEXT J:PRINT
  453. 3010 IF I>1 THEN 3030
  454. 3020 FOR J=1 TO NV%:XMIN(J)=X(I,J):XMAX(J)=X(I,J):NEXT J
  455. 3030 FOR J=1 TO NV%
  456. 3040 IF X(I,J)<XMIN(J) THEN XMIN(J)=X(I,J)
  457. 3050 IF X(I,J)>XMAX(J) THEN XMAX(J)=X(I,J)
  458. 3060 NEXT J
  459. 3070 NEXT I
  460. 3080 PRINT "Please Note Incorrect Points":INPUT A$
  461. 3090 NEXT L
  462. 3100 PRINT:INPUT"IS DATA CORRECT";Y$
  463. 3110 IF LEFT$(Y$,1)="Y" THEN RETURN
  464. 3120 IF LEFT$(Y$,1)="y" THEN RETURN
  465. 3130 INPUT "Enter Option (A> Add  D> Delete  C> Correct  Entry):",Y$
  466. 3140 IF LEFT$(Y$,1)<>"A" THEN 3160
  467. 3150 L=NPTS%+1:GOTO 2860
  468. 3160 IF LEFT$(Y$,1)<>"D" THEN 3200
  469. 3170 INPUT "Enter Line Number to be Deleted:",L
  470. 3180 NPTS%=NPTS%-1:IF L>NPTS% THEN 3240
  471. 3190 FOR I=L TO NPTS%:FOR J=1 TO NV%:X(I,J)=X(I+1,J):NEXT J:NEXT I
  472. 3200 IF LEFT$(Y$,1)<>"C" THEN 3240
  473. 3210 INPUT "Input Number of Point:",L
  474. 3220 PRINT "Enter ";NV%;" Values for the Corrected Record:"
  475. 3230 FOR J=1 TO NV%:INPUT X(L,J):NEXT J
  476. 3240 INPUT"MORE CORRECTIONS";Y$
  477. 3250 IF LEFT$(Y$,1)="Y" THEN 3130
  478. 3260 GOTO 2940
  479. 3270 REM ******************************************** DISK DATA ENTRY
  480. 3280 IF EOF(2) THEN PRINT "Null File":RETURN
  481. 3290 INPUT #2,NV%
  482. 3300 IF EOF(2) THEN PRINT "No Names":RETURN
  483. 3310 I=1
  484. 3320 LINE INPUT#2,INBUF$
  485. 3330 FOR J=1 TO NV%
  486. 3340 FOR ICHAR%=1 TO 20:NAMES%(ICHAR%,J)=32:NEXT ICHAR%
  487. 3350 IF NOT (I>LEN(INBUF$)) THEN 3400
  488. 3360 IF NOT EOF(2) THEN 3390
  489. 3370 PRINT "End of File before all Names were read"
  490. 3380 FOR I=1 TO 500:NEXT I:RETURN
  491. 3390 LINE INPUT#2,INBUF$:I=1
  492. 3400 K=INSTR(I,INBUF$,","):IF K=0 THEN K=LEN(INBUF$)+1
  493. 3410 GL$=MID$(INBUF$,I,K-I):L=LEN(GL$):IF L>20 THEN L=20
  494. 3420 FOR ICHAR% = 1 TO L:NAMES%(ICHAR%,J)=ASC(MID$(GL$,ICHAR%,1)):NEXT ICHAR%
  495. 3430 I=K+1
  496. 3440 NEXT J
  497. 3450 IF EOF(2) THEN PRINT "No Data":RETURN
  498. 3460 I=1:LINE INPUT#2,INBUF$
  499. 3470 FOR NPTS%=1 TO MPTS%
  500. 3480 FOR J=1 TO NV%
  501. 3490 IF NOT (I>LEN(INBUF$)) THEN 3540
  502. 3500 IF NOT EOF(2) THEN 3530
  503. 3510 PRINT "End of File before all Data was read"
  504. 3520 FOR I=1 TO 500:NEXT I:RETURN
  505. 3530 LINE INPUT#2,INBUF$:I=1
  506. 3540 K=INSTR(I,INBUF$,","):IF K=0 THEN K=LEN(INBUF$)+1
  507. 3550 GL$=MID$(INBUF$,I,K-I)
  508. 3560 X(NPTS%,J)=VAL(GL$)
  509. 3570 IF NPTS%=1 THEN XMIN(J)=X(1,J):XMAX(J)=X(1,J)
  510. 3580 IF X(NPTS%,J)<XMIN(J) THEN XMIN(J)=X(NPTS%,J)
  511. 3590 IF X(NPTS%,J)>XMAX(J) THEN XMAX(J)=X(NPTS%,J)
  512. 3600 I=K+1:NEXT J
  513. 3610 IF EOF(2) THEN RETURN
  514. 3620 NEXT NPTS%
  515. 3630 NPTS%=50
  516. 3640 RETURN
  517. 3650 REM ****************************************  DISK OUTPUT
  518. 3660 PRINT #3,NV%
  519. 3670 FOR J=1 TO NV%
  520. 3680 FOR ICHAR%=1 TO 20:PRINT #3,CHR$(NAMES%(ICHAR%,J));:NEXT ICHAR%:PRINT #3,""
  521. 3690 NEXT J
  522. 3700 FOR I=1 TO NPTS%
  523. 3710 PRINT #3,X(I,1);:FOR J=2 TO NV%:PRINT #3,",";X(I,J);:NEXT J
  524. 3720 PRINT #3,""
  525. 3730 NEXT I
  526. 3740 REM
  527. 3750 REM ************************************************* CLEAR SCREEN
  528. 3760 HOME
  529. 3770 RETURN
  530.