home *** CD-ROM | disk | FTP | other *** search
/ Nibble Magazine / nib25a.dsk / OCTOBER.1985 / METERMAN.GRAPH.bas < prev    next >
BASIC Source File  |  2023-02-26  |  10KB  |  183 lines

  1. 10  REM **********************
  2. 20  REM *   METERMAN.GRAPH   *
  3. 30  REM *   BY RUDY A. GUY   *
  4. 40  REM * COPYRIGHT (C) 1985 *
  5. 50  REM * BY MICROSPARC, INC *
  6. 60  REM * CONCORD, MA. 01742 *
  7. 70  REM **********************
  8. 80 EF = 1: ONERR  GOTO 1770
  9. 90  PRINT  CHR$(4);"BLOAD METERMAN.SHAPES,A$3C00": POKE 232,0: POKE 233,60: LOMEM: 24576: SCALE= 1: ROT= 0
  10. 100  REM  INITIALIZE
  11. 110 D$ =  CHR$(4): DIM UN(12),BC(12),CP(12),TC(12),M$(12),T(12):C = 4
  12. 120  FOR I = 1 TO C: READ UT$(I): NEXT : DATA  ELECTRICITY,GAS,OIL,WATER
  13. 130  FOR I = 1 TO 12: READ M$(I): NEXT 
  14. 140  DATA  JAN,FEB,MAR,APR,MAY,JUN,JUL,AUG,SEP,OCT,NOV,DEC
  15. 150  REM  TITLE PAGE
  16. 160  PRINT D$"PR#3": PRINT 
  17. 170  PRINT D$"VERIFY YEARS"
  18. 180  PRINT D$"OPEN YEARS,L5": PRINT D$"READ YEARS,R0": INPUT YR: DIM YR$(YR): FOR I = 1 TO YR: PRINT D$"READ YEARS,R"I: INPUT YR$(I): NEXT : PRINT D$"CLOSE"
  19. 190  IF  PEEK(10) = 18  THEN YR$ =  STR$( PEEK(11)) + STR$( PEEK(12)): GOTO 290
  20. 200  IF YR = 1  THEN YR$ = YR$(1): GOTO 290
  21. 210  GOSUB 1680
  22. 220  HOME : VTAB 5: PRINT "The following years are on the system:": PRINT 
  23. 230  FOR I = 1 TO YR: PRINT YR$(I);"      ";: REM  SIX SPACES"
  24. 240  NEXT : PRINT : PRINT 
  25. 250  PRINT "Please enter the year that you want to graph. <0> or RETURN for the Main Menu.  Please choose :";: INPUT "";YR$
  26. 260  IF  VAL(YR$) = 0  THEN 1420
  27. 270 CH = 0: FOR I = 1 TO YR: IF YR$ = YR$(I)  THEN CH = 1
  28. 280  NEXT : IF   NOT CH  THEN  PRINT  CHR$(7): GOTO 220
  29. 290  HOME : VTAB 3: PRINT "Year :";: INVERSE : PRINT YR$: NORMAL 
  30. 300  IF PL  THEN 360
  31. 310  POKE 216,0:EF = 2: ONERR  GOTO 340
  32. 320 I = 0
  33. 330 I = I +1: PRINT D$"VERIFY"UT$(I)YR$:UT(I) = 1
  34. 340  IF I <C  THEN 330
  35. 350  POKE 216,0:EF = 3: ONERR  GOTO 1770
  36. 360  VTAB 5: PRINT "The following utilities are on the system for "YR$":": PRINT 
  37. 370 U = 0
  38. 380  FOR I = 1 TO C: IF UT(I) = 1  THEN U = U +1: POKE 1403,35: PRINT U". "UT$(I):T$(U) = UT$(I)
  39. 390  NEXT : PRINT 
  40. 400  IF U = 1  THEN  FOR I = 1 TO C: IF UT(I) = 1  THEN UT$ = UT$(I)
  41. 410  IF U = 1  THEN  NEXT : PRINT UT$" has been selected by default.": GOTO 470
  42. 420  INPUT "With what utility do you want to work ?";UT$: IF UT$ = ""  THEN  PRINT  CHR$(7): VTAB 5: PRINT  CHR$(26): GOTO 360
  43. 430  IF  VAL(UT$) <1  OR  VAL(UT$) >U  THEN  PRINT  CHR$(7): VTAB 5: PRINT  CHR$(26): GOTO 360
  44. 440 UT$ = T$( VAL(UT$))
  45. 450  FOR I = 1 TO C: IF UT$ =  LEFT$(UT$(I), LEN(UT$))  AND UT(I) = 1  THEN UT$ = UT$(I): GOTO 470
  46. 460  NEXT : PRINT  CHR$(7): VTAB 5: PRINT  CHR$(26): GOTO 360
  47. 470  IF YR$ = BY$  AND UT$ = BU$  THEN 500
  48. 480  PRINT D$"OPEN "UT$YR$: PRINT D$"READ "UT$YR$: FOR I = 1 TO 12: INPUT UN(I),BC(I),TC(I): NEXT : PRINT D$"CLOSE": IF UT$ < >BU$  THEN PL = 0
  49. 490  REM  MAIN MENU
  50. 500 BY$ = YR$: HOME : PRINT "Year :";: INVERSE : PRINT YR$;: NORMAL : POKE 1403,58: PRINT "Utility :";: INVERSE : PRINT UT$: NORMAL 
  51. 510  IF PL  THEN  VTAB 22: PRINT "There is data plotted. Press <V> to view."
  52. 520  VTAB 3:A$ = "** Copyright (C) 1985 by MicroSPARC, Inc. **": GOSUB 1670
  53. 530  VTAB 7: PRINT "Please select which data you would like plotted.": PRINT 
  54. 540 A$ = "{1} Plot Monthly Unit Usage": GOSUB 1670:A$ = "{2} Plot Monthly Base Cost ": GOSUB 1670:A$ = "{3} Plot Monthly Cost/Unit ": GOSUB 1670:A$ = "{4} Plot Monthly Total Cost": GOSUB 1670
  55. 550 A$ = "{5} Save Current Graph     ": GOSUB 1670:A$ = "{6} Change Year and Utility": GOSUB 1670:A$ = "{7} Return to Main Menu    ": GOSUB 1670: PRINT : REM 5/4 SPACES
  56. 560  POKE 1403,20: INPUT "Please choose one of the above:";S$: IF S$ = "V"  THEN  GOSUB 1600: GOTO 500
  57. 570 S =  VAL(S$)
  58. 580  IF S <1  OR S >7  THEN  PRINT  CHR$(7): GOTO 500
  59. 590  IF S >4  THEN  ON S -4 GOTO 1430,200,1420
  60. 600  IF   NOT PL  THEN SE = S:PL = 1:E = 1: GOTO 670
  61. 610  IF PL = 4  THEN  PRINT : PRINT  CHR$(7)"The maximum number of graphs has been plotted.": GOTO 640
  62. 620  IF BU$ = UT$  AND SE = S  THEN  PRINT : INPUT "Do you want to erase the prior graph? ";YN$: IF  LEFT$(YN$,1) = "Y"  THEN 650
  63. 630  IF BU$ = UT$  AND SE = S  THEN E = 0: GOTO 670
  64. 640  PRINT : INPUT "This selection will destroy the last graph drawn. Do you wish to continue?";YN$: IF  LEFT$(YN$,1) < >"Y"  THEN  HOME : GOTO 500
  65. 650 E = 1:PL = 1:SE = S
  66. 660  REM  SCALE GRAPH
  67. 670  ON SE GOSUB 680,740,800,890: GOTO 960
  68. 680  IF E = 0  THEN PL = PL +1: RETURN 
  69. 690 H = UN(1): FOR I = 2 TO 12: IF UN(I) >H  THEN H = UN(I)
  70. 700  NEXT 
  71. 710 TH =  INT(H)
  72. 720  IF TH/100 < > INT(TH/100)  THEN TH = TH +1: GOTO 720
  73. 730 F =  INT(TH/10): RETURN 
  74. 740  IF E = 0  THEN PL = PL +1: RETURN 
  75. 750 H = BC(1): FOR I = 2 TO 12: IF BC(I) >H  THEN H = BC(I)
  76. 760  NEXT 
  77. 770 TH =  INT(H)
  78. 780  IF TH/100 < > INT(TH/100)  THEN TH = TH +1: GOTO 780
  79. 790 F =  INT(TH/10): RETURN 
  80. 800  FOR I = 1 TO 12: IF UN(I) = 0  THEN CP(I) = 0: GOTO 820
  81. 810 CP(I) = BC(I)/UN(I)
  82. 820  NEXT 
  83. 830  IF E = 0  THEN PL = PL +1: RETURN 
  84. 840 H = CP(1): FOR I = 2 TO 12: IF CP(I) >H  THEN H = CP(I)
  85. 850  NEXT 
  86. 860 TH =  INT(H *1000)
  87. 870  IF TH/100 < > INT(TH/100)  THEN TH = TH +1: GOTO 870
  88. 880 F = TH/10000:TH = TH/1000: RETURN 
  89. 890  IF E = 0  THEN PL = PL +1: RETURN 
  90. 900 H = TC(1): FOR I = 2 TO 12: IF TC(I) >H  THEN H = TC(I)
  91. 910  NEXT 
  92. 920 TH =  INT(H)
  93. 930  IF TH/100 < > INT(TH/100)  THEN TH = TH +1: GOTO 930
  94. 940 F =  INT(TH/10): RETURN 
  95. 950  REM  DRAW GRAPH
  96. 960  IF E = 0  THEN  PRINT  CHR$(12) CHR$(21): PRINT : POKE 49232,0: POKE 49234,0: POKE 49237,0: POKE 49239,0: GOTO 1140
  97. 970  PRINT  CHR$(12); CHR$(21): PRINT : HGR2 : HCOLOR= 3
  98. 980 A$ = "UTILITY : " +UT$:VT = 8:HT = 50: GOSUB 1510
  99. 990  HPLOT 40,10 TO 40,120 TO 279,120
  100. 1000 VT = VT +8:HT = 12: FOR I = TH TO 0  STEP  -F
  101. 1010 A$ =  STR$(I): IF  LEFT$(A$,4) = ".099"  THEN A$ = ".1":I = .1
  102. 1020  IF  LEFT$(A$,4) = "9.99"  THEN A$ = ".01":I = .01
  103. 1030  IF  VAL(A$) <.009  THEN A$ = "0"
  104. 1040  IF  LEN(A$) >4  THEN AA =  VAL(A$) - INT( VAL(A$)):AA$ =  STR$(AA):LA =  LEN(AA$):LP = 10 ^(LA -1):AA =  INT(AA *LP)/LP:A$ =  STR$( INT( VAL(A$))) + STR$(AA)
  105. 1050  GOSUB 1510:VT = VT +11:HT = 12
  106. 1060  NEXT 
  107. 1070  FOR I = 1 TO 12:VT = 122:HT = 40 +(I *18):A$ = M$(I): ROT= 16: GOSUB 1560: NEXT 
  108. 1080  ON SE GOSUB 1090,1100,1110,1120: GOTO 1130
  109. 1090 A$ = "UNITS": RETURN 
  110. 1100 A$ = "BASE COST": RETURN 
  111. 1110 A$ = "COST/UNIT": RETURN 
  112. 1120 A$ = "TOTAL COST"
  113. 1130 VT = 25:HT = 0: ROT= 16: GOSUB 1560
  114. 1140  ON PL GOTO 1150,1160,1170,1180
  115. 1150 VT = 160:HT = 0:A$ = YR$: GOSUB 1510: HCOLOR= 3: HPLOT 35,163 TO 60,163: GOTO 1190
  116. 1160 VT = 160:HT = 70:A$ = YR$: GOSUB 1510: HCOLOR= 1: HPLOT 105,163 TO 130,163: GOTO 1190
  117. 1170 VT = 160:HT = 140:A$ = YR$: GOSUB 1510: HCOLOR= 5: HPLOT 175,163 TO 200,163: GOTO 1190
  118. 1180 VT = 160:HT = 210:A$ = YR$: GOSUB 1510: HCOLOR= 2: HPLOT 245,163 TO 279,163: GOTO 1190
  119. 1190  FOR I = 1 TO 12: ON SE GOSUB 1200,1210,1220,1230: NEXT : GOTO 1240
  120. 1200 T(I) = UN(I): RETURN 
  121. 1210 T(I) = BC(I): RETURN 
  122. 1220 T(I) = CP(I): RETURN 
  123. 1230 T(I) = TC(I): RETURN 
  124. 1240 SX = 58: IF TH = 0  THEN SY = 120: GOTO 1260
  125. 1250 SY = 120 -((104/TH) *T(1))
  126. 1260  FOR I = 2 TO 12
  127. 1270 NX = SX +18: IF TH = 0  THEN NY = 120: GOTO 1300
  128. 1280 NY = 120 -((104/TH) *T(I))
  129. 1290  IF NY <10  THEN NY = 10
  130. 1300  HPLOT SX,SY TO NX,NY:SY = NY:SX = SX +18
  131. 1310  NEXT :BU$ = UT$
  132. 1320 A$ = "<ESC> FOR ANOTHER PLOT <P> TO PRINT GRAPH.":VT = 180:HT = 0: GOSUB 1510
  133. 1330 K =  PEEK( -16384)
  134. 1340  IF K = 155  THEN  POKE  -16368,0: TEXT :VT = 180:HT = 0: GOSUB 1510: PRINT D$"PR#3": GOTO 500
  135. 1350  IF K = 208  THEN  POKE  -16368,0: GOTO 1370
  136. 1360  GOTO 1330
  137. 1370  REM  PRINT GRAPH (EPSON MX-80 & GRAPPLER INTERFACE)
  138. 1380 VT = 180:HT = 0: GOSUB 1510
  139. 1390  PRINT D$"PR#1": PRINT  CHR$(9)"GE2"
  140. 1400  PRINT D$"PR#0"
  141. 1410  GOTO 1320
  142. 1420  PRINT D$"RUN METERMAN"
  143. 1430  REM  SAVE SCREEN
  144. 1440  HOME : VTAB 12: INPUT "Enter name for graph :";NA$
  145. 1450  IF NA$ = ""  THEN 500
  146. 1460  IF  LEN(NA$) >15  THEN  PRINT  CHR$(7): PRINT "File name too long!": PRINT : INPUT "Press RETURN to try again.";YN$: GOTO 1430
  147. 1470  PRINT D$"BSAVE "NA$",A$4000,L$1FFF"
  148. 1480  PRINT : PRINT "File has been saved. Press RETURN for menu.";: INPUT "";YN$
  149. 1490  GOTO 500
  150. 1500  REM  DRAW CHARACTERS ON HIRES SCREEN - NORMAL
  151. 1510  FOR CH = 1 TO  LEN(A$)
  152. 1520  IF  MID$ (A$,CH,1) = " "  THEN HT = HT +6: GOTO 1540
  153. 1530  XDRAW  ASC( MID$ (A$,CH,1)) -32 AT HT,VT:HT = HT +6
  154. 1540  NEXT : RETURN 
  155. 1550  REM  DRAW CHARACTERS ON HIRES SCREEN - ROTATED
  156. 1560  FOR CH = 1 TO  LEN(A$)
  157. 1570  IF  MID$ (A$,CH,1) = " "  THEN 1590
  158. 1580  DRAW  ASC( MID$ (A$,CH,1)) -32 AT HT,VT
  159. 1590 VT = VT +6: NEXT : ROT= 0: RETURN 
  160. 1600  PRINT  CHR$(12) CHR$(21): PRINT : POKE 49232,0: POKE 49234,0: POKE 49237,0: POKE 49239,0
  161. 1610 A$ = "PRESS <ESC> FOR MENU. <P> TO PRINT GRAPH":VT = 180:HT = 0: GOSUB 1510
  162. 1620 S =  PEEK( -16384)
  163. 1630  IF S = 155  THEN  POKE  -16368,0: TEXT :VT = 180:HT = 0: GOSUB 1510: PRINT D$"PR#3": RETURN 
  164. 1640  IF S = 208  THEN  POKE  -16368,0:VT = 180:HT = 0: GOSUB 1370: GOTO 1610
  165. 1650  GOTO 1620
  166. 1660  REM  CENTER ROUTINE
  167. 1670 HT = 40 - LEN(A$)/2: POKE 1403,HT: PRINT A$: RETURN 
  168. 1680  REM  SORT YEARS
  169. 1690  FOR I = 1 TO YR -1
  170. 1700  FOR J = I +1 TO YR
  171. 1710  IF YR$(I) < = YR$(J)  THEN 1730
  172. 1720 T$ = YR$(I):YR$(I) = YR$(J):YR$(J) = T$
  173. 1730  NEXT J
  174. 1740  NEXT I
  175. 1750  RETURN 
  176. 1760  REM  ERROR HANDLING ROUTINE
  177. 1770 ER =  PEEK(222):EL =  PEEK(218) + PEEK(219) *256: TEXT : HOME : VTAB 12
  178. 1780  IF ER = 6  AND EF = 1  THEN  PRINT : PRINT  CHR$(7)"Sorry, there is no data to be graphed.": PRINT D$"RUN METERMAN"
  179. 1790  IF EF = 3  THEN  PRINT "Error number "ER" has occurred.": INPUT "Press RETURN to try again.";YN$: GOTO 1430
  180. 1800  IF ER = 22  THEN 490
  181. 1810  HOME : VTAB 12: PRINT "Error number "ER" has occurred."
  182. 1820  PRINT "The error occurred in line "EL"."
  183. 1830  PRINT "Please refer to your Applesoft Reference Manual."