home *** CD-ROM | disk | FTP | other *** search
/ Nibble Magazine / nib23a.dsk / APRIL.1985 / GAS.MISER.bas < prev    next >
BASIC Source File  |  2023-02-26  |  12KB  |  294 lines

  1. 10  REM  *******5/29/85********
  2. 20  REM  *     GAS.MISER      *
  3. 30  REM  * BY DANIEL WHITNEY  *
  4. 40  REM  * COPYRIGHT (C) 1985 *
  5. 50  REM  * BY MICROSPARC, INC *
  6. 60  REM  * CONCORD, MA  01742 *
  7. 70  REM  **********************
  8. 80  IF  PEEK(104) < >64  THEN  POKE 103,1: POKE 104,64: POKE 16384,0: PRINT  CHR$(4)"RUN GAS.MISER"
  9. 90  GOSUB 2030: REM  OPENING SCREEN AND INSTRUCTIONS
  10. 100 MG = 50
  11. 110 D$ =  CHR$(4)
  12. 120  DEF  FN R(X) =  INT(X *100 +.5)/100
  13. 130  DEF  FN MOD(A) = A - INT(A/8) *8
  14. 140 OS = 18
  15. 150 DT = 0
  16. 160  HOME 
  17. 170  DIM D(60),M(60),MI(60),G(60),YM(12),MN(12),C(63,6)
  18. 180  FOR I = 0 TO 12: READ MN(I): NEXT I
  19. 190  DATA  0,31,28,31,30,31,30,31,31,30,31,30,31
  20. 200  HOME : PRINT "ONE MOMENT...": PRINT : PRINT "READING CHARACTER DEFINITIONS": FOR I = 0 TO 63: FOR J = 0 TO 6: READ C(I,J): NEXT J,I: HOME 
  21. 210  POKE  -16368,0: INPUT "ARE YOU STARTING A NEW FILE? ";Z$:Z$ =  LEFT$(Z$,1): IF Z$ < >"Y"  THEN 270
  22. 220  INPUT "STARTING MILEAGE: ";X$:OM =  VAL(X$): IF OM <0  THEN 220
  23. 230  INPUT "STARTING MONTH: ";X$:MN =  INT( VAL(X$)): IF MN <1  OR MN >12  THEN 230
  24. 240  INPUT "STARTING DAY: ";X$:DP =  INT( VAL(X$)): IF DP <1  OR DP >MN(MN)  THEN 240
  25. 250  GOTO 380
  26. 260  REM  GET DATA FROM EXISTING FILE
  27. 270  PRINT "ENTER FILENAME (? FOR CATALOG):": INPUT " ?";NA$: IF  LEFT$(NA$,1) = "?"  THEN  PRINT D$"CATALOG": GOTO 270
  28. 280  IF  LEN(NA$) = 0  THEN 270
  29. 290  IF  LEN(NA$) >13  THEN NA$ =  LEFT$(NA$,13)
  30. 300  ONERR  GOTO 2200
  31. 310  PRINT D$"VERIFY "NA$
  32. 320  PRINT D$;"OPEN ";NA$: PRINT D$;"READ ";NA$
  33. 330  INPUT DT,OM,MN,DP
  34. 340  FOR DI = 1 TO DT: INPUT M(DI),D(DI),MI(DI),G(DI)
  35. 350  NEXT DI
  36. 360  PRINT D$;"CLOSE ";NA$
  37. 370  POKE 216,0
  38. 380 PM = OM:M = MN:D = DP: HGR 
  39. 390  VTAB 23
  40. 400  GOSUB 1400
  41. 410  FOR II = 0 TO M -1:DA = DA +MN(II): NEXT II
  42. 420 XX = (DA +D) *5/7:Y = 150: HPLOT OS,Y TO XX +OS,Y
  43. 430  IF DT = 0  THEN M(0) = MN:D(0) = DP: GOTO 520
  44. 440 I = DT
  45. 450  FOR DT = 1 TO I
  46. 460 M = M(DT):D = D(DT):G = G(DT):MI = MI(DT)
  47. 470  GOSUB 1300
  48. 480 PM = MI
  49. 490  NEXT DT
  50. 500 DT = I
  51. 510 Y = 23:X = ((40 - LEN(NA$))/2 +1):N$ = NA$: GOSUB 1160
  52. 520 DT = DT +1
  53. 530  HOME : VTAB 21
  54. 540  PRINT "LAST DATE: "M(DT -1)"/"D(DT -1);: HTAB 18: PRINT "LAST MILEAGE: "PM
  55. 550  VTAB 22: CALL  -868
  56. 560  VTAB 22: INPUT "MONTH           ->";X$:M =  VAL(X$): IF M <0  THEN 800: REM  11 SPACES
  57. 570  IF M >12  THEN  GOSUB 1940: GOTO 550
  58. 580  IF M <M(DT -1)  THEN  GOSUB 1950: GOTO 550
  59. 590 M =  INT(M)
  60. 600  VTAB 22: CALL  -868
  61. 610  VTAB 22: INPUT "DAY             ->";X$:D =  VAL(X$): IF D <0  THEN 800: REM  13 SPACES
  62. 620  IF M = M(DT -1)  THEN  IF D <D(DT -1)  THEN  GOSUB 1970: GOTO 600
  63. 630  IF D >MN(M)  THEN  IF D < >29  THEN  GOSUB 1960: GOTO 600
  64. 640 D =  INT(D)
  65. 650  VTAB 22: CALL  -868
  66. 660  VTAB 22: INPUT "GALLONS         ->";G$: IF G <0  THEN 800: REM  9 SPACES
  67. 670  GOSUB 2130: IF GF  THEN  GOSUB 1980: GOTO 650
  68. 680  VTAB 22: CALL  -868
  69. 690  VTAB 22: INPUT "ENDING MILEAGE  ->";X$:MI =  VAL(X$): IF MI <0  THEN 800
  70. 700  IF MI -PM < = 0  THEN  GOSUB 1990: GOTO 680
  71. 710  VTAB 22: CALL  -868: VTAB 22: PRINT "DATE: "M"/"D;: HTAB 12: PRINT "GALS: "G;: HTAB 23: PRINT "MILEAGE: "MI
  72. 720  VTAB 23: CALL  -868: VTAB 23
  73. 730  PRINT  FN R((MI -PM)/G)" MPG  ";: IF (MI -PM)/G >50  THEN  PRINT "> 50 ";: CALL  -198
  74. 740  HTAB 20: INPUT "OK?";OK$
  75. 750  IF  LEFT$(OK$,1) < >"Y"  THEN 530
  76. 760 D(DT) = D:M(DT) = M:G(DT) = G:MI(DT) = MI
  77. 770  GOSUB 1300
  78. 780 PM = MI
  79. 790  GOTO 520
  80. 800  GOSUB 1810: GOSUB 1730: PRINT "PRESS A KEY TO END & STORE FILE": GET A$: TEXT : HOME 
  81. 810  REM  STORE UPDATED FILE
  82. 820  REM 
  83. 830  IF Z$ = "Y"  THEN 870
  84. 840  PRINT "OLD FILENAME IS ";NA$
  85. 850  PRINT "RENAME ";NA$;: INPUT " ?";A$
  86. 860  IF  LEFT$(A$,1) = "N"  THEN A$ = NA$: GOTO 890
  87. 870  INPUT "NEW FILENAME ";NA$: IF  LEN(A$) = 0  THEN 870
  88. 880  IF  LEN(A$) >13  THEN A$ =  LEFT$(A$,13)
  89. 890  ONERR  GOTO 2250
  90. 900  IF Z$ = "Y"  THEN 940
  91. 910  PRINT D$"VERIFY "NA$
  92. 920  PRINT D$"RENAME ";NA$",";A$
  93. 930  PRINT D$"DELETE ";A$
  94. 940 NA$ = A$
  95. 950  PRINT D$;"OPEN ";NA$
  96. 960  PRINT D$;"WRITE ";NA$
  97. 970  PRINT DT -1","OM","MN","DP
  98. 980  FOR DI = 1 TO DT
  99. 990  PRINT M(DI)","D(DI)","MI(DI)","G(DI)
  100. 1000  NEXT DI
  101. 1010  PRINT D$;"CLOSE ";NA$
  102. 1020  REM  WRITE COMPLETE
  103. 1030  POKE 216,0
  104. 1040 H = 0
  105. 1050  PRINT "PLEASE WAIT..."
  106. 1060 Y = 23:X = ((40 - LEN(NA$))/2 +1):N$ = NA$: GOSUB 1160
  107. 1070 N$ = "    J  F  M  A  M  J  J  A  S   O  N  D "
  108. 1080 Y = 20:X = 1: GOSUB 1160:MM =  PEEK( -16304) + PEEK( -16302) + PEEK( -16300): GET A$: TEXT 
  109. 1085  HOME : VTAB 12: PRINT "PRESS ANY KEY WHEN FINISHED VIEWING THE SCREEN": FOR MM = 1 TO 1000: NEXT MM:MM =  PEEK( -16304) + PEEK( -16302) - PEEK( -16300): POKE 49168,0: GET A$: TEXT 
  110. 1090  INPUT "DO YOU WANT TO SAVE THE SCREEN?";AB$
  111. 1100  IF  LEFT$(AB$,1) = "N"  THEN 1140
  112. 1110  ONERR  GOTO 2280
  113. 1120  PRINT D$;"BSAVE P."NA$",A$2000,L$2000"
  114. 1130  POKE 216,0
  115. 1140  INPUT "RUN AGAIN ? ";AB$: IF  LEFT$(AB$,1) = "Y"  THEN  RUN 
  116. 1150  END 
  117. 1160  REM  ROUTINE TO PLOT N$ ON SCREEN
  118. 1170 L9 = D
  119. 1180  FOR I = 1 TO  LEN(N$)
  120. 1190  REM  COMPUTE ADDRESS IN CHAR TABLE
  121. 1200 Z = ( ASC( MID$ (N$,I,1)) -32)
  122. 1210  GOSUB 1270
  123. 1220 X = X +1
  124. 1230  NEXT I
  125. 1240 D = L9
  126. 1250  RETURN 
  127. 1260  REM  PLOTS A CHARACTER
  128. 1270 L = 8192 + FN MOD(Y) *128 +(X -1) + INT(Y/8) *40
  129. 1280  FOR J = 0 TO 6: POKE L +J *1024,C(Z,J): NEXT 
  130. 1290  RETURN 
  131. 1300  REM  PLOTS ONE GAS PURCHASE
  132. 1310 DA = 0
  133. 1320  FOR II = 0 TO M -1:DA = DA +MN(II): NEXT II
  134. 1330 X = (DA +D) *5/7
  135. 1340 Y = (MI -PM)/G
  136. 1350  IF Y >50  THEN PF = 1: RETURN 
  137. 1360  IF DT = 1  OR PF  THEN PF = 0: HPLOT X +OS,150 -3 *Y: RETURN 
  138. 1370  HPLOT  TO X +OS,150 -3 *Y
  139. 1380  RETURN 
  140. 1390  REM 
  141. 1400  REM  PLOT GRID
  142. 1410  HCOLOR= 3: HPLOT OS,0 TO OS,150 TO 279,150
  143. 1420  HPLOT OS,120 TO 279,120
  144. 1430  HPLOT OS,90 TO 279,90
  145. 1440  HPLOT OS,60 TO 279,60
  146. 1450  HPLOT OS,30 TO 279,30
  147. 1460  HCOLOR= 5
  148. 1470  HPLOT OS +1,0 TO OS +1,30: HPLOT OS +1,60 TO OS +1,90
  149. 1480  HPLOT OS +1,120 TO OS +1,150
  150. 1490  HCOLOR= 3
  151. 1500  FOR I = 1 TO 50
  152. 1510  HPLOT OS -2,3 *I TO OS,3 *I: REM  EACH TICK IS 1 MPG
  153. 1520  NEXT I
  154. 1530  FOR I = 1 TO 52
  155. 1540  HPLOT OS +5 *I,150 TO OS +5 *I,147: REM  EACH TICK IS 1 WEEK
  156. 1550  NEXT I
  157. 1560 YM(0) = 0: FOR I = 1 TO 12
  158. 1570 YM(I) = MN(I) +YM(I -1)
  159. 1580  NEXT I
  160. 1590  HCOLOR= 5: FOR I = 1 TO 12  STEP 2
  161. 1600  HPLOT OS +YM(I) *5/7,151 TO OS +YM(I +1) *5/7,151
  162. 1610  NEXT I
  163. 1620  REM  PLOT NUMBERS ON Y AXIS
  164. 1630  HCOLOR= 3
  165. 1640  HPLOT OS,150
  166. 1650 L9 = D
  167. 1660 X = 1:Y = 3:N$ = "40": GOSUB 1160
  168. 1670 X = 1:Y = Y +4:N$ = "30": GOSUB 1160
  169. 1680 X = 1:Y = Y +4:N$ = "20": GOSUB 1160
  170. 1690 X = 1:Y = Y +4:N$ = "10": GOSUB 1160
  171. 1700 X = 2:Y = 0:N$ = "M": GOSUB 1160:X = 2:Y = 1:N$ = "P": GOSUB 1160:N$ = "G":X = 2:Y = 2: GOSUB 1160
  172. 1710 D = L9
  173. 1720  RETURN 
  174. 1730  REM  CALCULATE AND PLOT OVERALL GAS MILEAGE FOR THE YEAR
  175. 1740  FOR I = 1 TO DT:H = H +G(I): NEXT I
  176. 1750 PM = MI(DT -1) -OM
  177. 1760  VTAB 22: CALL  -868
  178. 1770  VTAB 22: PRINT "OVERALL AVERAGE MPG= "; FN R(PM/H)
  179. 1780  HCOLOR= 6: HPLOT OS,150 -3 *(PM/H) TO 279,150 -3 *(PM/H)
  180. 1790  RETURN 
  181. 1800  REM 
  182. 1810  REM  PLOT 3 TERM MOVING AVERAGE MPG
  183. 1820  HCOLOR= 5: HPLOT XX +OS,150
  184. 1830 I = DT
  185. 1840  FOR DT = 1 TO I -1
  186. 1850 M = M(DT):D = D(DT):MI = MI(DT)
  187. 1860  IF DT = 1  THEN G = G(1):PM = OM: GOTO 1900
  188. 1870  IF DT = 2  THEN G = G(1) +G(2):PM = OM: GOTO 1900
  189. 1880  IF DT = 3  THEN G = G(1) +G(2) +G(3):PM = OM: GOTO 1900
  190. 1890 G = G(DT) +G(DT -1) +G(DT -2):PM = MI(DT -3)
  191. 1900  GOSUB 1300
  192. 1910  NEXT DT
  193. 1920  RETURN 
  194. 1930  REM  ERROR HANDLERS
  195. 1940 M$ = "MONTH > 12": GOTO 2000
  196. 1950 M$ = "MONTH < LAST MONTH": GOTO 2000
  197. 1960 M$ = "INVALID DAY": GOTO 2000
  198. 1970 M$ = "DAY < LAST DAY": GOTO 2000
  199. 1980 M$ = "INVALID GALLONS": GOTO 2000
  200. 1990 M$ = "INVALID MILEAGE"
  201. 2000  VTAB 22: CALL  -868
  202. 2010  VTAB 22: PRINT M$;: HTAB 20
  203. 2020  INVERSE : PRINT "ANY KEY WHEN READY";: NORMAL : CALL  -198: GET T$: PRINT : RETURN 
  204. 2030  HOME : VTAB 6: HTAB 10: PRINT "NIBBLE GAS MISER"
  205. 2040  VTAB 8: HTAB 10: PRINT "BY DANIEL WHITNEY"
  206. 2050  VTAB 14: PRINT "* COPYRIGHT 1985 BY MICROSPARC, INC. *"
  207. 2060  VTAB 21: HTAB 7: PRINT "DO YOU WANT INSTRUCTIONS? ";: GET T$: PRINT T$: IF T$ < >"Y"  THEN  RETURN 
  208. 2070  HOME : VTAB 2: PRINT "NIBBLE GAS MISER IS A GAS MILEAGE": PRINT "   RECORDING AND PLOTTING PROGRAM."
  209. 2080  PRINT : PRINT "THE PROGRAM ASKS YOU FOR DATA ON": PRINT "   ON EACH GAS PURCHASE. ENTER THE": PRINT "   MONTH AND DAY NUMERICALLY."
  210. 2090  PRINT : PRINT "THEN ENTER THE NUMBER OF GALLONS.": PRINT "   IF YOUR QUANTITY IS IN LITERS,": PRINT "   PRECEDE THE ENTRY WITH AN 'L':": PRINT "     >L31.2": PRINT "   THE PROGRAM WILL CONVERT IT FOR YOU."
  211. 2100  PRINT : PRINT "TO QUIT, ENTER -1 FOR ANY REQUESTED": PRINT "   DATA ITEM. THE PROGRAM WILL THEN": PRINT "   PLOT A 3-POINT MOVING AVERAGE FOR": PRINT "   YOUR DATA."
  212. 2110  VTAB 22: PRINT "PRESS ANY KEY TO CONTINUE ";: GET T$: PRINT : RETURN 
  213. 2120  REM  GALLON PROCESSOR
  214. 2130 GF = 0:L$ =  LEFT$(G$,1): IF L$ = "L"  THEN G$ =  MID$ (G$,2)
  215. 2140 G =  VAL(G$): IF L$ < >"L" GOTO 2180
  216. 2150 G = G/3.785
  217. 2160 G =  FN R(G)
  218. 2170  VTAB 22: HTAB 30: PRINT G" GALS": FOR I = 1 TO 600: NEXT 
  219. 2180  IF G >MG  OR G = 0  THEN GF = 1
  220. 2190  RETURN 
  221. 2200 ER =  PEEK(222): IF ER = 6  THEN  PRINT "FILE NOT FOUND": GOTO 2230
  222. 2210  IF ER = 13  THEN  PRINT "FILE TYPE MISMATCH": GOTO 2230
  223. 2220  PRINT "ERROR NUMBER "ER
  224. 2230  PRINT D$"CLOSE "N$
  225. 2240  GOSUB 2020: GOTO 270
  226. 2250 ER =  PEEK(222): IF ER = 6  THEN  PRINT "FILE NOT FOUND": GOTO 2270
  227. 2260  PRINT "ERROR #"ER
  228. 2270  POKE 216,0: GOSUB 2020: GOTO 870
  229. 2280 ER =  PEEK(222): PRINT "ERROR #"ER
  230. 2290  POKE 216,0: GOSUB 2020: GOTO 1090
  231. 2300  DATA  0,0,0,0,0,0,0: REM   SPACE
  232. 2310  DATA  8,8,8,8,8,0,8: REM   !
  233. 2320  DATA  20,20,20,0,0,0,0: REM   "
  234. 2330  DATA  20,20,62,20,62,20,20: REM   #
  235. 2340  DATA  8,60,10,28,40,30,8: REM   $
  236. 2350  DATA  6,38,16,8,4,50,48: REM   %
  237. 2360  DATA  4,10,10,4,42,18,44: REM   &
  238. 2370  DATA  8,8,8,0,0,0,0: REM   '
  239. 2380  DATA  8,4,2,2,2,4,8: REM   (
  240. 2390  DATA  8,16,32,32,32,16,8: REM   )
  241. 2400  DATA  8,42,28,8,28,42,8: REM   *
  242. 2410  DATA  0,8,8,62,8,8,0: REM   +
  243. 2420  DATA  0,0,0,0,8,8,4: REM   ,
  244. 2430  DATA  0,0,0,62,0,0,0: REM   -
  245. 2440  DATA  0,0,0,0,0,0,8: REM   .
  246. 2450  DATA  0,32,16,8,4,2,0: REM   /
  247. 2460  DATA  28,34,50,42,38,34,28: REM   0
  248. 2470  DATA  8,12,8,8,8,8,28: REM   1
  249. 2480  DATA  28,34,32,24,4,2,62: REM   2
  250. 2490  DATA  62,32,16,24,32,34,28: REM   3
  251. 2500  DATA  16,24,20,18,62,16,16: REM   4
  252. 2510  DATA  62,2,30,32,32,34,28: REM   5
  253. 2520  DATA  56,4,2,30,34,34,28: REM   6
  254. 2530  DATA  62,32,16,8,4,4,4: REM   7
  255. 2540  DATA  28,34,34,28,34,34,28: REM   8
  256. 2550  DATA  28,34,34,60,32,16,14: REM   9
  257. 2560  DATA  0,0,8,0,8,0,0: REM   :
  258. 2570  DATA  0,0,8,0,8,8,4: REM   ;
  259. 2580  DATA  16,8,4,2,4,8,16: REM   <
  260. 2590  DATA  0,0,62,0,62,0,0: REM   =
  261. 2600  DATA  4,8,16,32,16,8,4: REM   >
  262. 2610  DATA  28,34,16,8,8,0,8: REM   ?
  263. 2620  DATA  28,34,42,58,26,2,60: REM   @
  264. 2630  DATA  8,20,34,34,62,34,34: REM   A
  265. 2640  DATA  30,34,34,30,34,34,30: REM   B
  266. 2650  DATA  28,34,2,2,2,34,28: REM   C
  267. 2660  DATA  30,34,34,34,34,34,30: REM   D
  268. 2670  DATA  62,2,2,30,2,2,62: REM   E
  269. 2680  DATA  62,2,2,30,2,2,2: REM   F
  270. 2690  DATA  60,2,2,2,50,34,60: REM   G
  271. 2700  DATA  34,34,34,62,34,34,34: REM   H
  272. 2710  DATA  28,8,8,8,8,8,28: REM   I
  273. 2720  DATA  32,32,32,32,32,34,28: REM   J
  274. 2730  DATA  34,18,10,6,10,18,34: REM   K
  275. 2740  DATA  2,2,2,2,2,2,62: REM   L
  276. 2750  DATA  34,54,42,34,34,34,34: REM   M
  277. 2760  DATA  34,34,38,42,50,34,34: REM   N
  278. 2770  DATA  28,34,34,34,34,34,28: REM   O
  279. 2780  DATA  30,34,34,30,2,2,2: REM   P
  280. 2790  DATA  28,34,34,34,42,18,44: REM   Q
  281. 2800  DATA  30,34,34,30,10,18,34: REM   R
  282. 2810  DATA  28,34,2,28,32,34,28: REM   S
  283. 2820  DATA  62,8,8,8,8,8,8: REM   T
  284. 2830  DATA  34,34,34,34,34,34,28: REM   U
  285. 2840  DATA  34,34,34,34,34,20,8: REM   V
  286. 2850  DATA  34,34,34,42,42,54,34: REM   W
  287. 2860  DATA  34,34,20,8,20,34,34: REM   X
  288. 2870  DATA  34,34,20,8,8,8,8: REM   Y
  289. 2880  DATA  62,32,16,8,4,2,62: REM   Z
  290. 2890  DATA  0,0,0,0,0,0,0: REM   NONE
  291. 2900  DATA  0,0,0,0,0,0,0: REM   NONE
  292. 2910  DATA  62,48,48,48,48,48,62: REM   R-BKT
  293. 2920  DATA  0,0,8,20,34,0,0: REM   CARET
  294. 2930  DATA  127,127,127,127,127,127,127: REM   DELETE