home *** CD-ROM | disk | FTP | other *** search
/ Nibble Magazine / nib38a.dsk / JUNE.1990 / APPLE.ODOMETER.bas next >
BASIC Source File  |  2023-02-26  |  23KB  |  353 lines

  1. 10  REM  ******************************
  2. 20  REM  * APPLE.ODOMETER             *
  3. 30  REM  * BY MATT COX                *
  4. 40  REM  * COPYRIGHT(C) 1990          *
  5. 50  REM  * MINDCRAFT PUBL. CORP.      *
  6. 60  REM  * CONCORD, MA 01742          *
  7. 70  REM  ******************************
  8. 80  PRINT  CHR$(21):D$ =  CHR$(4): DIM LN$(25)
  9. 90  ONERR  GOTO 870
  10. 100  PRINT D$"VERIFY CAR.NAMES"
  11. 110  ONERR  GOTO 3480
  12. 120  HOME :DN = 0:B$ = "BY MATT COX": GOSUB 3280: VTAB 5: HTAB 6: PRINT "(C) 1990 MINDCRAFT PUBL. CORP."
  13. 130 CH$(1) = "ENTER MILEAGE/EXPENSE":CH$(2) = "PRINTED REPORTS MENU":CH$(3) = "CONFIGURE SYSTEM/START OR DELETE CAR":CH$(4) = "SELECT A  CAR":CH$(5) = "EXIT  PROGRAM":NC = 5: GOSUB 3150
  14. 140  ON C GOTO 150,890,2220,2960,3100
  15. 150  ONERR  GOTO 870
  16. 160 FL = 0:CO$ = "":AM$ = "":GL$ = "":MI$ = "":DT$ = ""
  17. 170  POKE 34,23
  18. 180  TEXT 
  19. 190  IF NC$ = ""  THEN RT = 1: GOSUB 2960
  20. 200 B$ = "ENTER FILL-UP/EXPENSES": GOSUB 3280
  21. 210  POKE 34,23: PRINT D$;"OPEN CAR.";NC$;",L55": PRINT D$;"READ CAR.";NC$;",R0": INPUT A$,NE: PRINT D$;"CLOSE CAR.";NC$: TEXT 
  22. 220  INVERSE : FOR X = 1 TO 40: VTAB 8: HTAB X: PRINT " ";: VTAB 22: HTAB X: PRINT " ";: NEXT X
  23. 230  FOR X = 8 TO 21: VTAB X: PRINT " ";: NORMAL : HTAB 40: INVERSE : PRINT " ": NEXT X: NORMAL 
  24. 240 A$ = NC$: VTAB 7: GOSUB 3110
  25. 250  VTAB 7: PRINT "ENTRY # ";NE +1: VTAB 10: HTAB 3: PRINT "ENTRY TYPE ";:NU = 1: GOSUB 3310: VTAB 10: HTAB 25: PRINT "DATE ";:NU = 8: GOSUB 3310: VTAB 11: HTAB 13: PRINT "AMOUNT ";:NU = 8: GOSUB 3310: VTAB 15: HTAB 3: PRINT "MILES ON LAST TANK ";:NU = 6: GOSUB 3310
  26. 260  VTAB 16: HTAB 3: PRINT "GALLONS TAKEN ";:NU = 5: GOSUB 3310: HTAB 28: INVERSE : PRINT "MPG:": NORMAL : VTAB 20: HTAB 6: PRINT "COMMENTS ";:NU = 20: GOSUB 3310: PRINT : VTAB 13: INVERSE : FOR X = 1 TO 39: PRINT " ";: NEXT X: VTAB 17: FOR X = 1 TO 40: PRINT " ";: NEXT X: NORMAL 
  27. 270  POKE 34,22: HOME : TEXT : VTAB 23: HTAB 2: PRINT "ENTER: 1-GAS FILL UP";: HTAB 29: PRINT "M-MAIN MENU": VTAB 24: HTAB 9: PRINT "2-ANY OTHER EXPENSE";
  28. 280  VTAB 10: HTAB 14: GET I$: PRINT I$
  29. 290  IF I$ = "1"  OR I$ = "2"  OR I$ = "M"  THEN 310
  30. 300  PRINT  CHR$(7): GOTO 280
  31. 310  POKE 34,22: HOME : TEXT : VTAB 23: HTAB 3: PRINT "<";: INVERSE : PRINT "RETURN";: NORMAL : PRINT "> TO VERIFY  <";: INVERSE : PRINT "ESC";: NORMAL : PRINT "> TO CORRECT": WAIT  -16384,128:A =  PEEK( -16384): POKE  -16368,0: IF A -128 = 13  THEN 340
  32. 320  IF A -128 < >27  THEN 310
  33. 330  GOTO 270
  34. 340  IF I$ = "M"  THEN 120
  35. 350  ON  VAL(I$) GOTO 550,370
  36. 360  PRINT  CHR$(7): GOTO 270
  37. 370 TY = 2
  38. 380  POKE 34,22: HOME : TEXT : VTAB 23:A$ = "ENTER DATE OF TRANSACTION": GOSUB 3110
  39. 390 VP = 10:HP = 30:LN = 8: FOR X = 1 TO  LEN(DT$):LN$(X) =  MID$ (DT$,X,1): NEXT X:MP =  LEN(DT$) +1: GOSUB 3330:DT$ = IN$
  40. 400  IF DT$ = ""  THEN  PRINT  CHR$(7): GOTO 390
  41. 410  FOR Q = 1 TO  LEN(DT$): IF  MID$ (DT$,Q,1) = "/"  THEN NS = NS +1
  42. 420  NEXT Q
  43. 430  IF NS < >2  THEN  PRINT  CHR$(7);:NS = 0: GOTO 390
  44. 440 NS = 0
  45. 450  IF QU = 1  AND DN = 1  THEN 840
  46. 460  POKE 34,22: HOME : TEXT : VTAB 23:A$ = "ENTER AMOUNT OF TRANSACTION": GOSUB 3110:VP = 11:HP = 20:LN = 8: FOR X = 1 TO  LEN(AM$):LN$(X) =  MID$ (AM$,X,1): NEXT X:MP =  LEN(DT$) +1: GOSUB 3330
  47. 470  IF IN$ = "0"  THEN 510
  48. 480  IF  VAL(IN$) = 0  THEN  PRINT  CHR$(7): GOTO 460
  49. 490 AM =  VAL(IN$):AM =  INT(AM *100 +.5)/100:AM$ =  STR$(AM): VTAB 11: HTAB 20: PRINT AM$;: IF  LEN(AM$) < >8  THEN  FOR X = 1 TO 8 - LEN(AM$): PRINT  CHR$(95);: NEXT X
  50. 500  IF QU = 1  AND DN = 1  THEN 840
  51. 510  POKE 34,22: HOME : TEXT : VTAB 23:A$ = "ENTER ANY IMPORTANT COMMENTS": GOSUB 3110
  52. 520 VP = 20:HP = 15:LN = 20:FL = 1: FOR X = 1 TO  LEN(CO$):LN$(X) =  MID$ (CO$,X,1): NEXT X:MP =  LEN(CO$) +1: GOSUB 3330:CO$ = IN$:FL = 0
  53. 530  IF QU = 1  AND DN = 1  THEN 840
  54. 540 DN = 1: GOTO 380
  55. 550 TY = 1
  56. 560  POKE 34,22: HOME : TEXT : VTAB 23:A$ = "ENTER DATE OF TRANSACTION": GOSUB 3110
  57. 570 VP = 10:HP = 30:LN = 8: FOR X = 1 TO  LEN(DT$):LN$(X) =  MID$ (DT$,X,1): NEXT X:MP =  LEN(DT$) +1: GOSUB 3330:DT$ = IN$
  58. 580  FOR Q = 1 TO  LEN(DT$): IF  MID$ (DT$,Q,1) = "/"  THEN NS = NS +1
  59. 590  NEXT Q
  60. 600  IF NS < >2  THEN  PRINT  CHR$(7);:NS = 0: GOTO 570
  61. 610 NS = 0
  62. 620  IF DT$ = ""  THEN  PRINT  CHR$(7): GOTO 570
  63. 630  IF QU = 1  AND DN = 1  THEN 840
  64. 640  POKE 34,22: HOME : TEXT : VTAB 23:A$ = "ENTER AMOUNT OF TRANSACTION": GOSUB 3110
  65. 650 VP = 11:HP = 20:LN = 8: FOR X = 1 TO  LEN(AM$):LN$(X) =  MID$ (AM$,X,1): NEXT X:MP =  LEN(AM$) +1: GOSUB 3330
  66. 660  IF IN$ = "0"  THEN 690
  67. 670  IF  VAL(IN$) >.001  THEN 690
  68. 680  PRINT  CHR$(7): GOTO 650
  69. 690 AM =  VAL(IN$):AM =  INT(AM *100 +.5)/100:AM$ =  STR$(AM): HTAB 20: VTAB 11: PRINT AM$;: IF  LEN(AM$) < >8  THEN  FOR X = 1 TO 8 - LEN(AM$): PRINT  CHR$(95);: NEXT X
  70. 700  IF QU = 1  AND DN = 1  THEN 840
  71. 710  POKE 34,22: HOME : TEXT : VTAB 23:A$ = "ENTER MILES ON TRIP ODOMETER": GOSUB 3110:VP = 15:HP = 22:LN = 6: FOR X = 1 TO  LEN(MI$):LN$(X) =  MID$ (MI$,X,1): NEXT X:MP =  LEN(MI$) +1: GOSUB 3330:MI$ = IN$
  72. 720  IF MI$ = ""  OR  VAL(MI$) = 0  THEN  POKE 34,22: HOME : VTAB 23:A$ = "INCORRECT ENTRY!!" + CHR$(7) + CHR$(7): GOSUB 3110: FOR X = 1 TO 1000: NEXT X: GOTO 710
  73. 730 MI =  VAL(MI$):MI =  INT(MI *10 +.5)/10:MI$ =  STR$(MI): VTAB 15: HTAB 22: PRINT MI$;: IF  LEN(MI$) < >6  THEN  FOR X = 1 TO 6 - LEN(MI$): PRINT  CHR$(95);: NEXT X
  74. 740  IF QU = 1  AND DN = 1  THEN 840
  75. 750  POKE 34,22: HOME : TEXT : VTAB 23:A$ = "ENTERS GALLONS TAKEN AT FILL-UP": GOSUB 3110:HP = 17:VP = 16:LN = 5: FOR X = 1 TO  LEN(GL$):LN$(X) =  MID$ (GL$,X,1): NEXT X:MP =  LEN(GL$) +1: GOSUB 3330:GL$ = IN$
  76. 760  IF GL$ = ""  OR  VAL(GL$) = 0  THEN  POKE 34,22: HOME : VTAB 23:A$ = "INCORRECT ENTRY!!" + CHR$(7) + CHR$(7): GOSUB 3110: FOR X = 1 TO 1000: NEXT X: GOTO 750
  77. 770 GL =  VAL(GL$):GL =  INT(GL *10 +.5)/10:GL$ =  STR$(GL): VTAB 16: HTAB 17: PRINT GL$;: IF  LEN(GL$) < >5  THEN  FOR X = 1 TO 5 - LEN(GL$): PRINT  CHR$(95);: NEXT X
  78. 780  IF QU = 1  AND DN = 1  THEN 840
  79. 790 MP = MI/GL:MP =  INT(MP *100 +.5)/100:MP$ =  STR$(MP): VTAB 16: HTAB 33: PRINT "      ": VTAB 16: HTAB 33: PRINT  LEFT$(MP$,6);" "
  80. 800  POKE 34,22: HOME : TEXT : VTAB 23:A$ = "ENTER ANY IMPORTANT COMMENTS": GOSUB 3110
  81. 810 FL = 1:VP = 20:HP = 15:LN = 20: FOR X = 1 TO  LEN(CO$):LN$(X) =  MID$ (CO$,X,1): NEXT X:MP =  LEN(CO$) +1: GOSUB 3330:CO$ = IN$:FL = 0
  82. 820  IF QU = 1  AND DN = 1  THEN 840
  83. 830 DN = 1: GOTO 560
  84. 840  PRINT : POKE 34,23: HOME :QU = 0: PRINT D$;"OPEN CAR.";NC$;",L55": PRINT D$;"READ CAR.";NC$;",R0": INPUT A$: INPUT R$: PRINT D$;"WRITE CAR.";NC$;",R0": PRINT A$: PRINT  VAL(R$) +1: PRINT D$;"WRITE CAR.";NC$;",R"; VAL(R$) +1
  85. 850  PRINT TY: PRINT DT$: PRINT AM$: PRINT MI$: PRINT GL$: PRINT CO$: PRINT D$;"CLOSE CAR.";NC$
  86. 860 QU = 0:TY = 0:DN = 0:DT$ = "":AM$ = "":MI$ = "":MP$ = "":GL$ = "":CO$ = "": TEXT : GOTO 110: TEXT : PRINT 
  87. 870  IF  PEEK(222) = 6  THEN  PRINT D$"OPEN CAR.NAMES": PRINT D$"WRITE CAR.NAMES": PRINT 0: PRINT D$"CLOSE CAR.NAMES": GOTO 110
  88. 880  GOTO 3480
  89. 890  ONERR  GOTO 2200
  90. 900  POKE 34,23: HOME : PRINT D$;"VERIFY CAR.CONFIG"
  91. 910  PRINT D$;"OPEN CAR.CONFIG": PRINT D$;"READ CAR.CONFIG": INPUT PS,EC: PRINT D$;"CLOSE CAR.CONFIG": TEXT :AC = 1
  92. 920  IF NC$ = ""  THEN RT = 1: GOSUB 2960
  93. 930  PRINT D$;"OPEN CAR.";NC$;",L55": PRINT D$;"READ CAR.";NC$;",R0": INPUT A$,R$: PRINT D$;"CLOSE CAR.";NC$:R =  VAL(R$): IF R = 0  THEN  HOME : VTAB 11:A$ = "NO DATA FOR CAR SELECTED": GOSUB 3110: GOSUB 3510:NC$ = "": GOTO 120
  94. 940 B$ = "REPORTS": GOSUB 3280:CH$(1) = "COST & MILEAGE REPORT":CH$(2) = "MILEAGE REPORT":CH$(3) = "COST REPORT":CH$(4) = "RETURN TO MAIN MENU":NC = 4: GOSUB 3150
  95. 950 XM = 0:TG = 0:TM = 0:TC = 0:CP = 0:PM = 0:AP = 0:MP = 0
  96. 960  ON C GOTO 970,1780,1980,110
  97. 970  IF EC = 0  AND PS = 0  THEN  HOME : VTAB 11:A$ = "EIGHTY COLUMN CARD OR PRINTER REQUIRED": GOSUB 3110: GOSUB 3510: GOTO 940
  98. 980 B$ = "MILEAGE & COST REPORT": GOSUB 3280
  99. 990  IF PS = 0  THEN MO = 1: GOTO 1050
  100. 1000  IF EC = 0  THEN MO = 2: GOTO 1050
  101. 1010  GOSUB 1380
  102. 1020  IF A$ = "S"  OR A$ = "s"  THEN MO = 1: GOTO 1050
  103. 1030  IF A$ < >"P"  AND A$ < >"p"  THEN 1010
  104. 1040 MO = 2
  105. 1050  VTAB 13: PRINT "ENTER YEAR (A FOR ALL) --> ";:NU = 2: GOSUB 3310:HP = 28:VP = 13:LN = 2: GOSUB 3330:PY$ = IN$: IF PY$ = "A"  OR PY$ = "a"  THEN 1070
  106. 1060  IF  VAL(PY$) = 0  AND PY$ < >"0"  AND PY$ < >"00"  THEN 1050
  107. 1070  IF MO = 1  THEN  PRINT D$;"PR#";EC: PRINT  CHR$(12)
  108. 1080  IF MO = 2  THEN  PRINT D$;"PR#";PS: PRINT  CHR$(9);"80N"
  109. 1090 A$ = "MILEAGE & COST REPORT FOR " +NC$: PRINT  SPC( (74 - LEN(A$))/2);A$: PRINT 
  110. 1100  PRINT "                                             COST PER": PRINT "  DATE    MILEAGE  GALLONS   MPG     COST      MILE         COMMENTS"
  111. 1110  PRINT "--------  -------  -------  -----  --------  -------- --------------------"
  112. 1120 CN = 0
  113. 1130  PRINT D$;"OPEN CAR.";NC$;",L55": PRINT D$;"READ CAR.";NC$;",R0": INPUT SM$: INPUT R$:R =  VAL(R$)
  114. 1140  FOR RN = 1 TO R
  115. 1150  PRINT D$;"READ CAR.";NC$;",R";RN
  116. 1160 CO$ = "": INPUT TY: INPUT DT$: INPUT AM$: INPUT MI$: INPUT GL$
  117. 1170  FOR X = 1 TO 25: GET A$: IF A$ =  CHR$(13)  THEN 1190
  118. 1180 CO$ = CO$ +A$: NEXT X
  119. 1190  PRINT : ON TY GOTO 1200,1350
  120. 1200  GOSUB 1390: IF PY$ = "A"  THEN 1220
  121. 1210  IF YR$ < > RIGHT$(PY$,2)  THEN 1260
  122. 1220  GOSUB 1470: GOSUB 1520: GOSUB 1570: GOSUB 1640: GOSUB 1700
  123. 1230 TM = TM + VAL(MI$):TG = TG + VAL(GL$):PM = PM + VAL(MP$):AP = AP + VAL(CP$)
  124. 1240  PRINT DT$;"  ";MI$;"  ";GL$;"  ";MP$;"  ";AM$;"  ";CP$;" ";CO$:NP = 1
  125. 1250 TC = TC + VAL(AM$)
  126. 1260  IF TY = 1  THEN XM = XM + VAL(MI$)
  127. 1270  NEXT RN
  128. 1280  PRINT D$;"CLOSE CAR.";NC$
  129. 1290  FOR X = 1 TO 74: PRINT "-";: NEXT X: PRINT 
  130. 1300  IF NP = 0  THEN 1330
  131. 1310 MI$ =  STR$(TM): GOSUB 1470:TM$ = MI$:GL$ =  STR$(TG): GOSUB 1520:GA$ = GL$:MI$ = TM$:GL$ = GA$: GOSUB 1570:AM$ =  STR$(TC): GOSUB 1640:AS$ = AM$:AM$ = AS$:MI$ = TM$: GOSUB 1700
  132. 1320  PRINT "TOTALS    ";TM$;"  ";GA$;"         ";AS$:MI = XM + VAL(SM$):MI$ =  STR$(MI): GOSUB 1470: PRINT "AVERAGES                    ";MP$;"            ";CP$: PRINT : PRINT "CURRENT ODOMETER READING:  ";MI$
  133. 1330 NP = 0: IF MO = 2  THEN  PRINT D$;"PR#0": GOTO 940
  134. 1340  PRINT : PRINT : PRINT  SPC( 30);"HIT ANY KEY FOR MENU": WAIT  -16384,128: POKE  -16368,0: PRINT  CHR$(21): GOTO 940
  135. 1350  GOSUB 1390:MI$ = "       ":GL$ = "       ":MP$ = "     ": IF PY$ = "A"  THEN 1370
  136. 1360  IF YR$ < > RIGHT$(PY$,2)  THEN 1260
  137. 1370  GOSUB 1640:CP$ = "        ": GOTO 1240
  138. 1380  VTAB 11: PRINT "PRINT TO SCREEN OR PRINTER (S/P) --> *"; CHR$(8);: GET A$: PRINT A$: RETURN 
  139. 1390  FOR Q = 1 TO  LEN(DT$): IF  MID$ (DT$,Q,1) = "/"  THEN MN$ =  LEFT$(DT$,Q -1): GOTO 1410
  140. 1400  NEXT Q
  141. 1410 T = Q +1:X = 0: FOR X = T TO  LEN(DT$): IF  MID$ (DT$,X,1) = "/"  THEN DY$ =  MID$ (DT$,T,X -T):YR$ =  RIGHT$(DT$, LEN(DT$) -X): GOTO 1430
  142. 1420  NEXT X
  143. 1430  IF  LEN(MN$) = 1  THEN MN$ = "0" +MN$
  144. 1440  IF  LEN(DY$) = 1  THEN DY$ = "0" +DY$
  145. 1450  IF  LEN(YR$) = 1  THEN YR$ = "0" +YR$
  146. 1460 DT$ = MN$ +"/" +DY$ +"/" +YR$:DT$ =  LEFT$(DT$,9): RETURN 
  147. 1470  FOR X = 1 TO  LEN(MI$): IF  MID$ (MI$,X,1) = "."  THEN 1490
  148. 1480  NEXT X:MI$ = MI$ +".0"
  149. 1490  IF  LEN(MI$) = 7  THEN 1510
  150. 1500  FOR X = 1 TO 7 - LEN(MI$):MI$ = " " +MI$: NEXT X
  151. 1510 MI$ =  LEFT$(MI$,7): RETURN 
  152. 1520  FOR X = 1 TO  LEN(GL$): IF  MID$ (GL$,X,1) = "."  THEN 1540
  153. 1530  NEXT X:GL$ = GL$ +".0"
  154. 1540  IF  LEN(GL$) = 7  THEN 1560
  155. 1550  FOR X = 1 TO 7 - LEN(GL$):GL$ = " " +GL$: NEXT X
  156. 1560 GL$ =  LEFT$(GL$,7): RETURN 
  157. 1570 MP =  VAL(MI$)/ VAL(GL$):MP =  INT(MP *100 +.5)/100:MP$ =  STR$(MP)
  158. 1580  FOR X = 1 TO  LEN(MP$): IF  MID$ (MP$,X,1) = "."  THEN 1600
  159. 1590  NEXT X:MP$ = MP$ +".00": GOTO 1610
  160. 1600  IF X =  LEN(MP$) -1  THEN MP$ = MP$ +"0"
  161. 1610  IF  LEN(MP$) = 5  THEN 1630
  162. 1620  FOR X = 1 TO 5 - LEN(MP$):MP$ = " " +MP$: NEXT X
  163. 1630 MP$ =  LEFT$(MP$,5): RETURN 
  164. 1640  FOR X = 1 TO  LEN(AM$): IF  MID$ (AM$,X,1) = "."  THEN 1660
  165. 1650  NEXT X:AM$ = AM$ +".00": GOTO 1670
  166. 1660  IF X =  LEN(AM$) -1  THEN AM$ = AM$ +"0"
  167. 1670  IF  LEN(AM$) = 8  THEN 1690
  168. 1680  FOR X = 1 TO 8 - LEN(AM$):AM$ = " " +AM$: NEXT X
  169. 1690 AM$ =  LEFT$(AM$,8): RETURN 
  170. 1700 CP =  VAL(AM$)/ VAL(MI$):CP =  INT(CP *1000 +.5)/1000:CP$ =  STR$(CP)
  171. 1710  FOR X = 1 TO  LEN(CP$): IF  MID$ (CP$,X,1) = "."  THEN 1730
  172. 1720  NEXT X:CP$ = CP$ +".000": GOTO 1750
  173. 1730  IF X =  LEN(CP$) -2  THEN CP$ = CP$ +"0"
  174. 1740  IF X =  LEN(CP$) -1  THEN CP$ = CP$ +"00"
  175. 1750  IF  LEN(CP$) = 8  THEN 1770
  176. 1760  FOR X = 1 TO 8 - LEN(CP$):CP$ = " " +CP$: NEXT X
  177. 1770 CP$ =  LEFT$(CP$,8): RETURN 
  178. 1780 B$ = "MILEAGE REPORT": GOSUB 3280: VTAB 9: IF PS = 0  THEN MO = 1: GOTO 1830
  179. 1790  GOSUB 1380
  180. 1800  IF A$ = "S"  OR A$ = "s"  THEN MO = 1: GOTO 1830
  181. 1810  IF A$ < >"P"  AND A$ < >"p"  THEN 1790
  182. 1820 MO = 2
  183. 1830  IF MO = 2  THEN  PRINT D$;"PR#";PS
  184. 1840  HOME :A$ = "MILEAGE REPORT FOR " +NC$: GOSUB 3110: PRINT : PRINT "     DATE    MILEAGE  GALLONS   MPG": PRINT "   --------  -------  -------  -----"
  185. 1850  IF MO = 1  THEN  POKE 34,4
  186. 1860  PRINT D$;"OPEN CAR.";NC$;",L55": PRINT D$;"READ CAR.";NC$;",R0": INPUT SM$,R:SM =  VAL(SM$)
  187. 1870  FOR RN = 1 TO R
  188. 1880  PRINT D$;"READ CAR.";NC$;",R";RN: INPUT TY,DT$,X$,MI$,GL$
  189. 1890  IF TY = 2  THEN 1930
  190. 1900  GOSUB 1390: GOSUB 1470: GOSUB 1520: GOSUB 1570
  191. 1910  PRINT "   ";DT$;"  ";MI$;"  ";GL$;"  ";MP$
  192. 1920 TM = TM + VAL(MI$):TG = TG + VAL(GL$)
  193. 1930  NEXT RN: PRINT D$;"CLOSE CAR.";NC$
  194. 1940 MI$ =  STR$(TM): GOSUB 1470:GL$ =  STR$(TG): GOSUB 1520: GOSUB 1570
  195. 1950  PRINT "   ";: FOR X = 1 TO 33: PRINT "-";: NEXT X: PRINT : PRINT "   TOTALS    ";MI$;"  ";GL$: PRINT "   AVERAGE                     ";MP$
  196. 1960  IF MO = 2  THEN  PRINT D$;"PR#0": GOTO 940
  197. 1970  PRINT : PRINT :A$ = "HIT ANY KEY": GOSUB 3110: WAIT  -16384,128: POKE  -16368,0: GOTO 940
  198. 1980 B$ = "COST REPORT": GOSUB 3280
  199. 1990  IF PS = 0  THEN MO = 1: GOTO 2030
  200. 2000  GOSUB 1380: IF A$ = "P"  OR A$ = "p"  THEN MO = 2: GOTO 2030
  201. 2010  IF A$ < >"S"  AND A$ < >"s"  THEN 2000
  202. 2020 MO = 1
  203. 2030  IF MO = 2  THEN  PRINT D$;"PR#";PS
  204. 2040  HOME :A$ = "COST REPORT FOR " +NC$: GOSUB 3110
  205. 2050  PRINT : PRINT "  DATE     AMOUNT        COMMENTS": PRINT "--------  -------- --------------------"
  206. 2060  IF PM = 1  THEN  POKE 34,4
  207. 2070  PRINT D$;"OPEN CAR.";NC$;",L55": PRINT D$;"READ CAR.";NC$;",R0": INPUT X,R
  208. 2080  FOR RN = 1 TO R
  209. 2090  PRINT D$;"READ CAR.";NC$;",R";RN
  210. 2100  INPUT X,DT$,AM$,X$,X$:CO$ = "": FOR X = 1 TO 20: GET A$: IF A$ =  CHR$(13)  THEN 2120
  211. 2110 CO$ = CO$ +A$: NEXT X
  212. 2120  PRINT : GOSUB 1390: GOSUB 1640
  213. 2130  PRINT DT$;"  ";AM$;" ";CO$
  214. 2140 TC = TC + VAL(AM$)
  215. 2150  NEXT RN
  216. 2160  PRINT D$;"CLOSE CAR.";NC$
  217. 2170  FOR X = 1 TO 39: PRINT "-";: NEXT X: PRINT 
  218. 2180 AM$ =  STR$(TC): GOSUB 1640: PRINT "TOTAL     ";AM$
  219. 2190  GOTO 1960
  220. 2200  IF  PEEK(222) = 6  THEN  HOME : VTAB 11:A$ = "SYSTEM NOT CONFIGURED": GOSUB 3110: WAIT  -16384,128: POKE  -16368,0: GOTO 110
  221. 2210  GOTO 3480
  222. 2220  HOME : VTAB 3:B$ = "CONFIGURE/START/DELETE": GOSUB 3110: GOSUB 3280
  223. 2230 CH$(1) = "CONFIGURE/RE-CONFIGURE SYSTEM":CH$(2) = "START A NEW CAR":CH$(3) = "DELETE A CAR":CH$(4) = "RETURN TO MAIN MENU":NC = 4: GOSUB 3150
  224. 2240  ON C GOTO 2250,2420,2790,110
  225. 2250  ONERR  GOTO 2400
  226. 2260  PRINT D$;"VERIFY CAR.CONFIG": GOSUB 3050
  227. 2270 B$ = "RE-CONFIGURE SYSTEM"
  228. 2280  GOSUB 3280
  229. 2290  VTAB 9: PRINT "PRINTER IN SYSTEM? : ";PS$: VTAB 11: PRINT "EIGHTY COLUMN IN SYSTEM? : ";EC$
  230. 2300  VTAB 9: HTAB 22: GET PS$: PRINT PS$: IF PS$ < >"Y"  AND PS$ < >"y"  AND PS$ < >"n"  AND PS$ < >"N"  AND PS$ < > CHR$(13)  THEN  PRINT  CHR$(7): GOTO 2300
  231. 2310  IF PS$ = "N"  OR PS$ = "n"  THEN PS = 0
  232. 2320  IF PS$ = "Y"  OR PS$ = "y"  THEN PS = 1
  233. 2330  VTAB 11: HTAB 28: GET EC$: PRINT EC$: IF EC$ < >"Y"  AND EC$ < >"N"  AND EC$ < >"y"  AND EC$ < >"n"  AND EC$ < > CHR$(13)  THEN  PRINT  CHR$(7): GOTO 2330
  234. 2340  IF EC$ = "Y"  OR EC$ = "y"  THEN EC = 3
  235. 2350  IF EC$ = "N"  OR EC$ = "n"  THEN EC = 0
  236. 2360  VTAB 20: GOSUB 3470: IF A$ = "Y"  OR A$ = "y"  THEN 2390
  237. 2370  IF A$ < >"N"  AND A$ < >"n"  THEN 2360
  238. 2380  GOTO 2290
  239. 2390  PRINT D$;"OPEN CAR.CONFIG": PRINT D$;"WRITE CAR.CONFIG": PRINT PS: PRINT EC: PRINT D$;"CLOSE CAR.CONFIG":AC = 1: GOTO 2220
  240. 2400  IF  PEEK(222) = 6  THEN B$ = "CONFIGURE SYSTEM": GOTO 2280
  241. 2410  GOTO 3480
  242. 2420  ONERR  GOTO 2460
  243. 2430  PRINT D$;"OPEN CAR.NAMES": PRINT D$;"READ CAR.NAMES": INPUT NC: PRINT D$;"CLOSE CAR.NAMES": IF NC = 0  THEN ND = 1
  244. 2440  IF NC >0  THEN  PRINT D$;"OPEN CAR.NAMES": PRINT D$;"READ CAR.NAMES": INPUT NC: FOR X = 1 TO NC: INPUT CN$(X): NEXT X: PRINT D$;"CLOSE CAR.NAMES"
  245. 2450  IF NC = 6  THEN  HOME : VTAB 11: HTAB 2: PRINT "I CAN'T HOLD ANY MORE CAR NAMES. SORRY.": GOSUB 3510: GOTO 2220
  246. 2460 B$ = "START A NEW CAR": GOSUB 3280
  247. 2470 CR$ = "": VTAB 9:A$ = "ENTER CAR NAME":LN = 11: GOSUB 3320
  248. 2480 CR$ = IN$: IF CR$ = ""  THEN  VTAB 11: PRINT  CHR$(7): GOTO 2470
  249. 2490  ONERR  GOTO 3520
  250. 2500  PRINT D$"VERIFY CAR."CR$
  251. 2510  VTAB 11: GOSUB 3470
  252. 2520  IF A$ = "Y"  OR A$ = "y"  THEN 2550
  253. 2530  IF A$ < >"N"  AND A$ < >"n"  THEN 2510
  254. 2540  GOTO 2470
  255. 2550  ONERR  GOTO 2770
  256. 2560  FOR C = 1 TO NC: IF CN$(C) = CR$  THEN 2580
  257. 2570  NEXT C: GOTO 2620
  258. 2580  VTAB 13: PRINT "THAT CAR ALREADY EXISTS. DO YOU WANT": PRINT "TO REPLACE IT (Y/N) --> *"; CHR$(8);: GET A$: PRINT A$
  259. 2590  IF A$ = "Y"  OR A$ = "y"  THEN DC$ = CR$:RT = 1: GOSUB 2890: POKE 34,10: HOME : TEXT : GOTO 2620
  260. 2600  IF A$ < >"N"  AND A$ < >"n"  THEN 2580
  261. 2610  POKE 34,10: HOME : TEXT :IN$ = "":CR$ = "": GOTO 2470
  262. 2620 ML$ = "": VTAB 11:A$ = "ENTER MILEAGE TO DATE":LN = 10: GOSUB 3320:ML$ = IN$: IF ML$ = ""  THEN  PRINT  CHR$(7): GOTO 2620
  263. 2630  VTAB 13: GOSUB 3470
  264. 2640  IF A$ = "Y"  OR A$ = "y"  THEN 2670
  265. 2650  IF A$ < >"N"  AND A$ < >"n"  THEN 2630
  266. 2660  GOTO 2620
  267. 2670 ML =  VAL(ML$):ML =  INT(ML *100 +.5)/100:ML$ =  STR$(ML)
  268. 2680  PRINT D$"OPEN CAR."CR$",L55": PRINT D$"WRITE CAR."CR$",R0":: PRINT ML$: PRINT 0: PRINT D$"CLOSE CAR."CR$
  269. 2690  ONERR  GOTO 2750
  270. 2700  PRINT D$"OPEN CAR.NAMES": PRINT D$"READ CAR.NAMES": INPUT NC: PRINT D$"CLOSE CAR.NAMES": ON NC = 0 GOTO 2710: PRINT D$"OPEN CAR.NAMES": PRINT D$"READ CAR.NAMES": INPUT NC: FOR X = 1 TO NC: INPUT NC$(X): NEXT X: PRINT D$"CLOSE CAR.NAMES"
  271. 2710  PRINT D$;"OPEN CAR.NAMES": PRINT D$;"WRITE CAR.NAMES": IF ND = 1  THEN ND = 0: PRINT NC +1: PRINT CR$: GOTO 2730
  272. 2720  PRINT NC +1: FOR X = 1 TO NC: PRINT NC$(X): NEXT X: PRINT CR$
  273. 2730  PRINT D$;"CLOSE CAR.NAMES"
  274. 2740 NC$ = CR$: GOTO 2220
  275. 2750  PRINT D$"CLOSE CAR.NAMES": IF  PEEK(222) = 5  THEN NC = 1:ND = 1: GOTO 2710
  276. 2760  GOTO 3480
  277. 2770  IF  PEEK(222) = 6  THEN 2620
  278. 2780  GOTO 3480
  279. 2790  ONERR  GOTO 2940
  280. 2800 B$ = "DELETE A CAR": GOSUB 3280: PRINT D$"VERIFY CAR.NAMES"
  281. 2810  PRINT D$;"OPEN CAR.NAMES": PRINT D$;"READ CAR.NAMES": INPUT NC: IF NC = 0  THEN  PRINT D$"CLOSE CAR.NAMES": POKE 222,6: GOTO 2940
  282. 2820  FOR X = 1 TO NC: INPUT CN$(X): NEXT X: PRINT D$;"CLOSE CAR.NAMES"
  283. 2830  FOR X = 1 TO NC:CH$(X) = CN$(X): NEXT X: GOSUB 3150
  284. 2840 DC$ = CN$(C)
  285. 2850  POKE 34,8: HOME : TEXT : VTAB 9: FLASH : PRINT "DELETE ";DC$: NORMAL 
  286. 2860  VTAB 11: PRINT "ARE YOU SURE (Y/N) --> *"; CHR$(8);: GET A$: PRINT A$
  287. 2870  IF A$ = "N"  OR A$ = "n"  THEN 2220
  288. 2880  IF A$ < >"Y"  AND A$ < >"y"  THEN 2860
  289. 2890  PRINT D$;"DELETE CAR.";DC$
  290. 2900  FOR X = C +1 TO NC:CN$(X -1) = CN$(X): NEXT X:NC = NC -1
  291. 2910  IF NC = 0  THEN  PRINT D$"OPEN CAR.NAMES": PRINT D$"WRITE CAR.NAMES": PRINT 0: PRINT D$"CLOSE CAR.NAMES": GOTO 2220
  292. 2920  PRINT D$;"OPEN CAR.NAMES": PRINT D$;"WRITE CAR.NAMES": PRINT NC: FOR X = 1 TO NC: PRINT CN$(X): NEXT X: PRINT D$;"CLOSE CAR.NAMES":NC$ = "": IF RT = 1  THEN RT = 0: RETURN 
  293. 2930  GOTO 2220
  294. 2940  IF  PEEK(222) = 6  THEN  HOME : VTAB 11:A$ = "NO CARS ON FILE": GOSUB 3110: GOSUB 3510: GOTO 2220
  295. 2950  GOTO 3480
  296. 2960  ONERR  GOTO 3030
  297. 2970  PRINT D$;"OPEN CAR.NAMES": PRINT D$;"READ CAR.NAMES": INPUT NC: IF NC = 0  THEN  PRINT D$"CLOSE CAR.NAMES": GOTO 3030
  298. 2980  FOR X = 1 TO NC: INPUT NC$(X): NEXT X: PRINT D$;"CLOSE CAR.NAMES"
  299. 2990  IF NC = 1  THEN C = 1: GOTO 3010
  300. 3000 B$ = "SELECT A CAR": GOSUB 3280: FOR X = 1 TO NC:CH$(X) = NC$(X): NEXT X: GOSUB 3150
  301. 3010 NC$ = NC$(C): IF RT = 1  THEN RT = 0: RETURN 
  302. 3020  GOTO 110
  303. 3030  IF  PEEK(222) = 6  OR NC = 0  THEN  TEXT : HOME : VTAB 11:A$ = "NO CARS ON FILE": POKE 49168,0: GOSUB 3110: GOSUB 3510: GOTO 120
  304. 3040  GOTO 3480
  305. 3050  POKE 34,23: PRINT D$;"OPEN CAR.CONFIG": PRINT D$;"READ CAR.CONFIG":
  306. 3060  INPUT PS: INPUT EC: INPUT EO$: PRINT D$;"CLOSE CAR.CONFIG": TEXT :EC$ = "N":PS$ = "N"
  307. 3070  IF PS = 1  THEN PS$ = "Y"
  308. 3080  IF EC = 3  THEN EC$ = "Y"
  309. 3090  RETURN 
  310. 3100  HOME : PRINT "GOODBYE...": GOTO 3500
  311. 3110  NORMAL : PRINT  SPC( (40 - LEN(A$))/2);A$: IF DN = 1  THEN  VTAB 24: HTAB 2: INVERSE : PRINT "PRESS <CTRL-S> TO SAVE OR ESC TO EXIT";: NORMAL 
  312. 3120  RETURN 
  313. 3130  HTAB ((40 - LEN(A$))/2 +1): INVERSE : PRINT A$: RETURN 
  314. 3140  NORMAL : HTAB ((40 - LEN(A$))/2 +1): PRINT A$: RETURN 
  315. 3150  POKE  -16368,0:Z =  FRE(0): PRINT :VT = 13 -NC:: FOR DI = 1 TO NC: VTAB (VT +DI *2):A$ = CH$(DI): GOSUB 3110:SP(DI) = VT +DI *2: NEXT DI:C = 1
  316. 3160  POKE 34,21: HOME : TEXT : VTAB 22: HTAB 8: INVERSE : PRINT "<--";: NORMAL : PRINT "  ";: INVERSE : PRINT "-->";: NORMAL : PRINT "  <";: INVERSE : PRINT "RETURN";: NORMAL : PRINT ">  <";: INVERSE : PRINT "ESC";: NORMAL : PRINT ">"
  317. 3170 A$ = CH$(C): VTAB (SP(C)): GOSUB 3130
  318. 3180  WAIT  -16384,128:A =  PEEK( -16384) -128: POKE  -16368,0
  319. 3190  IF A = 27  THEN 120
  320. 3200  IF A = 13  THEN  NORMAL : RETURN 
  321. 3210  IF A = 21  OR A = 10  THEN OC = C:C = C +1: GOTO 3240
  322. 3220  IF A = 8  OR A = 11  THEN OC = C:C = C -1: GOTO 3240
  323. 3230  GOTO 3180
  324. 3240  VTAB (SP(OC)):A$ = CH$(OC): GOSUB 3140
  325. 3250  IF C = NC +1  THEN C = 1
  326. 3260  IF C = 0  THEN C = NC
  327. 3270  GOTO 3170
  328. 3280  TEXT : HOME : VTAB 3:A$ = "THE APPLE ODOMETER": GOSUB 3110: VTAB 4:A$ = B$: GOSUB 3110
  329. 3290  FOR X = 1 TO 6: NORMAL : VTAB X: HTAB 4: INVERSE : PRINT " ";: NORMAL : HTAB 37: INVERSE : PRINT " ";: NEXT X: NORMAL 
  330. 3300  VTAB 1: HTAB 4: INVERSE : PRINT "                                 ": NORMAL : VTAB 6: HTAB 4: INVERSE : PRINT "                                 ": NORMAL : RETURN : REM  33 AND 33 SPACES
  331. 3310  FOR X = 1 TO NU: PRINT  CHR$(95);: NEXT X: RETURN 
  332. 3320  PRINT A$;"  ->";::HP =  PEEK(36) +1:VP =  PEEK(37) +1: PRINT  SPC( LN);"<-"
  333. 3330 IN$ = "": HTAB HP: VTAB VP:P = 1
  334. 3340  HTAB HP +P -1: GET I$: PRINT I$;
  335. 3350  IF I$ =  CHR$(27)  AND DN = 1  THEN 120
  336. 3360  IF I$ =  CHR$(32)  AND FL = 1  THEN 3420
  337. 3370  IF I$ =  CHR$(32)  THEN  PRINT  CHR$(8);: GOTO 3340
  338. 3380  IF I$ =  CHR$(13)  THEN MP = MP -(EL = 0): GOTO 3450
  339. 3390  IF I$ =  CHR$(8)  OR I$ =  CHR$(127)  THEN P = P -1: IF P = 0  THEN P = 1: HTAB HP: PRINT  CHR$(7);
  340. 3400  IF I$ =  CHR$(8)  OR I$ =  CHR$(127)  THEN 3340
  341. 3410  IF I$ =  CHR$(19)  THEN QU = 1: GOTO 3450
  342. 3420  IF  ASC(I$) < >95  AND  ASC(I$) >31  THEN LN$(P) = I$:P = P +1: IF P = LN +1  THEN  PRINT  CHR$(7);:P = P -1:EL = 1: HTAB (HP +LN -1)
  343. 3430  IF P >MP  THEN MP = P
  344. 3440  GOTO 3340
  345. 3450  FOR T = 1 TO MP:IN$ = IN$ +LN$(T): NEXT T:EL = 0
  346. 3460  FOR Q = 1 TO MP:LN$(Q) = "": NEXT :MP = 0: RETURN 
  347. 3470  PRINT "IS THIS CORRECT (Y/N) --> *"; CHR$(8);: GET A$: PRINT A$: RETURN 
  348. 3480  IF  PEEK(222) = 255  THEN  RESUME 
  349. 3490  PRINT : PRINT "ERROR # "; PEEK(222);" IN LINE "; PEEK(218) + PEEK(219) *256;".": PRINT "PROGRAM TERMINATED"
  350. 3500  END 
  351. 3510  VTAB 23: HTAB 8: PRINT "PRESS RETURN TO CONTINUE";: GET ZZ$: HTAB 1: VTAB 23: PRINT "";: CALL  -958: RETURN 
  352. 3520  IF  PEEK(222) = 16  THEN 2470
  353. 3530  GOTO 2510