home *** CD-ROM | disk | FTP | other *** search
/ Nibble Magazine / nib31b.dsk / JOGGER.bas < prev    next >
BASIC Source File  |  2023-02-26  |  15KB  |  453 lines

  1. 10  REM **********************
  2. 20  REM *       JOGGER       *
  3. 30  REM *   BY BRIAN FLYNN   *
  4. 40  REM * COPYRIGHT (C) 1987 *
  5. 50  REM * BY MICROSPARC, INC *
  6. 60  REM * CONCORD, MA  01742 *
  7. 70  REM **********************
  8. 80  REM 
  9. 90  REM  TITLE
  10. 100  GOSUB 210
  11. 110  REM  INITIAL VALUES
  12. 120  GOSUB 260
  13. 130  REM  READ LOGBOOK NAMES
  14. 140  GOSUB 440
  15. 150  REM  SELECT FROM MENU
  16. 160  GOSUB 580
  17. 170  REM  CONTINUE
  18. 180  IF PICK < >4  THEN 160
  19. 190  HOME 
  20. 200  END 
  21. 210  REM  TITLE
  22. 220  PRINT  CHR$(21): TEXT : HOME 
  23. 230  VTAB 12: HTAB 9: PRINT "JOGGER BY BRIAN FLYNN": PRINT : HTAB 3: PRINT "COPYRIGHT 1987 BY MICROSPARC, INC."
  24. 240  VTAB 22: HTAB 8: PRINT "PRESS RETURN TO CONTINUE";: GET Z$: PRINT 
  25. 250  RETURN 
  26. 260  REM  INITIAL VALUES
  27. 270 X = 366:BY = 1978:D$ =  CHR$(4):BELL$ =  CHR$(7)
  28. 280  DIM MILES(X),TIME(X),LC$(X),CM$(X),MT$(12),M$(12),DAY(12),FILE(25)
  29. 290  DATA  JANUARY,FEBRUARY,MARCH,APRIL,MAY,JUNE,JULY,AUGUST,SEPTEMBER,OCTOBER,NOVEMBER,DECEMBER
  30. 300  DATA  31,28,31,30,31,30,31,31,30,31,30,31
  31. 310  DATA  SUN,MON,TUE,WED,THR,FRI,SAT
  32. 320  FOR I = 1 TO 12
  33. 330  READ MT$(I)
  34. 340 M$(I) =  LEFT$(MT$(I),1)
  35. 350  NEXT 
  36. 360  FOR I = 1 TO 12: READ DAY(I): NEXT 
  37. 370  FOR I = 1 TO 7: READ DW$(I): NEXT 
  38. 380 MT$ = "J F M A M J J A S O N D"
  39. 390 C$(1) = "DATES":C$(2) = "MILES":C$(3) = "MIN/MILE":C$(4) = "EXIT"
  40. 400  DATA  START A NEW LOGBOOK, OPEN AN OLD ONE
  41. 410  DATA  VIEW LOGBOOK NAMES, EXIT
  42. 420  FOR I = 1 TO 4: READ PICK$(I): NEXT 
  43. 430  RETURN 
  44. 440  REM  READ LOGBOOK NAMES
  45. 450 NFILES = 0
  46. 460 EF = 1: ONERR  GOTO 4440
  47. 470  PRINT D$;"VERIFY JOGCAT": GOTO 490
  48. 480  HOME : VTAB 12: HTAB 10:NFILES = 0: PRINT "NO LOGBOOKS ON THIS DISK": VTAB 22: PRINT "PRESS RETURN FOR MENU";: GET Z$: PRINT : RETURN 
  49. 490 EF = 2: HOME : VTAB 12: HTAB 10: PRINT "READING LOGBOOK NAMES": ONERR  GOTO 4440
  50. 500  PRINT D$;"OPEN JOGCAT"
  51. 510  PRINT D$;"READ JOGCAT"
  52. 520  INPUT NFILES
  53. 530  FOR I = 1 TO NFILES
  54. 540  INPUT FILE(I)
  55. 550  NEXT 
  56. 560  PRINT D$;"CLOSE"
  57. 570  RETURN 
  58. 580  REM  MENU
  59. 590 EF = 3: HOME : VTAB 7: HTAB 11: PRINT "WOULD YOU LIKE TO": ONERR  GOTO 4440
  60. 600  FOR I = 1 TO 4
  61. 610  VTAB I *2 +8: HTAB 12: INVERSE : PRINT I;: NORMAL : PRINT  CHR$(32);PICK$(I)
  62. 620  NEXT 
  63. 630  VTAB 19: HTAB 11: PRINT "CHOICE = ? ";
  64. 640  GET S$
  65. 650  PRINT :PICK =  VAL(S$)
  66. 660  IF PICK <1  OR PICK >4  THEN 630
  67. 670 : REM  NO FILES
  68. 680  IF (PICK = 2  OR PICK = 3)  AND NFILES = 0  THEN  HOME : VTAB 12: HTAB 1: PRINT "THERE AREN'T ANY LOGBOOKS ON FILE.": VTAB 22: PRINT "PRESS RETURN FOR MENU";: GET Z$: PRINT : GOTO 590
  69. 690  ON PICK GOSUB 710,2540,4330
  70. 700  RETURN 
  71. 710  REM  NEW BOOK
  72. 720 : REM  ENTER YEAR
  73. 730  GOSUB 910
  74. 740 : REM  CHECK FOR DUPLICATE & ASK TO CONTINUE
  75. 750 DUP$ = "":CNT$ = ""
  76. 760  IF NFILES >0  THEN  GOSUB 1030
  77. 770  IF DUP$ = "YES"  THEN  GOSUB 1080
  78. 780  IF CNT$ = "NO"  THEN 900
  79. 790 : REM  SET VALUES TO 0
  80. 800  GOSUB 1210
  81. 810 : REM  ENTER NO. OF JOGS
  82. 820  GOSUB 1280
  83. 830 : REM  LOG JOGS
  84. 840  FOR I = 1 TO N
  85. 850  GOSUB 1360
  86. 860  NEXT I
  87. 870 : REM  SAVE FILE
  88. 880  IF DUP$ = ""  THEN NFILES = NFILES +1:FILE(NFILES) = YEAR
  89. 890  GOSUB 4110
  90. 900  RETURN 
  91. 910  REM  YEAR
  92. 920  HOME 
  93. 930  PRINT "PLEASE ENTER A FOUR-DIGIT YEAR FOR"
  94. 940  PRINT "YOUR LOGBOOK."
  95. 950  VTAB 4: HTAB 10: PRINT  SPC( 20)
  96. 960  VTAB 4: HTAB 1: INPUT "YEAR = ? ";Y$
  97. 970 YEAR =  INT( VAL(Y$))
  98. 980  IF YEAR <BY  OR YEAR >2100  THEN  VTAB 22: HTAB 6: PRINT "PLEASE ENTER ";BY;" TO 2100 !": GOTO 950
  99. 990 DY = 365:DAY(2) = 28
  100. 1000  IF YEAR/4 =  INT(YEAR/4)  THEN DY = 366:DAY(2) = 29
  101. 1010 FILE$ = "JOG" + STR$(YEAR)
  102. 1020  RETURN 
  103. 1030  REM  CHECK FOR DUPLICATE
  104. 1040  FOR I = 1 TO NFILES
  105. 1050  IF FILE(I) = YEAR  THEN DUP$ = "YES"
  106. 1060  NEXT 
  107. 1070  RETURN 
  108. 1080  REM  DUPLICATE
  109. 1090  HOME 
  110. 1100  INVERSE : PRINT FILE$;: NORMAL : PRINT " IS ALREADY ON FILE.  IT WILL"
  111. 1110  PRINT "BE WRITTEN OVER IF YOU CONTINUE."
  112. 1120  VTAB 9: HTAB 13: PRINT "WOULD YOU LIKE TO"
  113. 1130  VTAB 12: HTAB 14: INVERSE : PRINT "1";: NORMAL : PRINT " CONTINUE"
  114. 1140  VTAB 14: HTAB 14: INVERSE : PRINT "2";: NORMAL : PRINT " RETURN TO MENU"
  115. 1150  VTAB 17: HTAB 13: PRINT "CHOICE = ? ";
  116. 1160  GET S$
  117. 1170 CH =  VAL(S$): IF CH <1  OR CH >2  THEN 1150
  118. 1180  IF CH = 2  THEN CNT$ = "NO"
  119. 1190  HOME 
  120. 1200  RETURN 
  121. 1210  REM  SET VALUES TO 0
  122. 1220  VTAB 12: HTAB 13: PRINT "INITIALIZING ..."
  123. 1230  FOR I = 1 TO X
  124. 1240 MILES(I) = 0:TIME(I) = 0
  125. 1250 LC$(I) = "":CM$(I) = ""
  126. 1260  NEXT 
  127. 1270  RETURN 
  128. 1280  REM  JOGS
  129. 1290  HOME 
  130. 1300  PRINT "HOW MANY JOGS DO YOU INITIALLY WANT"
  131. 1310  VTAB 2: HTAB 13: PRINT  SPC( 20)
  132. 1320  VTAB 2: HTAB 1: INPUT "TO RECORD ? ";S$
  133. 1330 N =  INT( VAL(S$))
  134. 1340  IF N <1  OR N >DY  THEN 1310
  135. 1350  RETURN 
  136. 1360  REM  LOG A JOG
  137. 1370  REM  DRAW BOX
  138. 1380  GOSUB 1600
  139. 1390  REM  ENTER MONTH
  140. 1400  GOSUB 1720
  141. 1410  REM  ENTER DATE
  142. 1420  GOSUB 1880
  143. 1430  REM  COMPUTE DAY OF YEAR
  144. 1440  GOSUB 1960
  145. 1450  REM  ENTER MILES
  146. 1460  GOSUB 2030
  147. 1470  REM  ENTER MINUTES
  148. 1480  IF MILES(K) < >0  THEN  GOSUB 2130
  149. 1490  REM  ENTER LOCATION
  150. 1500  IF MILES(K) < >0  THEN  GOSUB 2250
  151. 1510  REM  ENTER COMMENTS
  152. 1520  IF MILES(K) < >0  THEN  GOSUB 2490
  153. 1530  REM  CORRECTIONS
  154. 1540  VTAB 22: HTAB 12: PRINT "CHANGES (Y/N) ? ";
  155. 1550  GET S$
  156. 1560  IF S$ = "Y"  OR S$ =  CHR$(121)  THEN 1450
  157. 1570  IF S$ < >"N"  AND S$ < > CHR$(110)  THEN 1540
  158. 1580  IF MILES(K) = 0  THEN TIME(K) = 0:LC$(K) = "":CM$(K) = ""
  159. 1590  RETURN 
  160. 1600  REM  BOX
  161. 1610  HOME : INVERSE 
  162. 1620  VTAB 1: HTAB 1: PRINT  SPC( 39)
  163. 1630  VTAB 2: HTAB 1: PRINT  SPC( 39)
  164. 1640  VTAB 3: HTAB 1: PRINT  SPC( 39)
  165. 1650  VTAB 24: HTAB 1: PRINT  SPC( 39);
  166. 1660  FOR R = 4 TO 23
  167. 1670  VTAB R: HTAB 1: PRINT  SPC( 1)
  168. 1680  VTAB R: HTAB 39: PRINT  SPC( 1)
  169. 1690  NEXT R
  170. 1700  NORMAL 
  171. 1710  RETURN 
  172. 1720  REM  MONTH
  173. 1730 COL = 10:M = 1
  174. 1740  VTAB 5: HTAB 3: PRINT "MONTH: ";MT$
  175. 1750  VTAB 22: HTAB 2: PRINT "USE ARROWS TO MOVE; THEN PRESS ";: INVERSE : PRINT "RETURN"
  176. 1760  VTAB 5: HTAB COL: INVERSE : PRINT M$(M); CHR$(8);:SOUND =  PEEK( -16336)
  177. 1770  GET S$
  178. 1780 A =  ASC(S$)
  179. 1790  NORMAL : PRINT M$(M); CHR$(8);
  180. 1800  IF A = 8  THEN M = M -1
  181. 1810  IF A = 21  THEN M = M +1
  182. 1820  IF M = 0  THEN M = 12
  183. 1830  IF M = 13  THEN M = 1
  184. 1840 COL = 8 +2 *M
  185. 1850  IF A < >13  THEN 1760
  186. 1860  HTAB 10: PRINT  SPC( 23);: HTAB 10: PRINT MT$(M)
  187. 1870  RETURN 
  188. 1880  REM  DATE
  189. 1890  VTAB 22: HTAB 2: PRINT  SPC( 37)
  190. 1900  VTAB 6: HTAB 4: PRINT "DATE: "; SPC( 20)
  191. 1910  VTAB 6: HTAB 9: INPUT " ";S$
  192. 1920  VTAB 6: HTAB 39: INVERSE : PRINT  SPC( 1): NORMAL 
  193. 1930 D =  INT( VAL(S$))
  194. 1940  IF D <1  OR D >DAY(M)  THEN 1900
  195. 1950  RETURN 
  196. 1960  REM  DAY OF THE YEAR
  197. 1970 K = 0
  198. 1980  FOR J = 1 TO M
  199. 1990 K = K +DAY(J)
  200. 2000  NEXT J
  201. 2010 K = K -(DAY(M) -D)
  202. 2020  RETURN 
  203. 2030  REM  MILES
  204. 2040  VTAB 22: HTAB 12: PRINT  SPC( 15)
  205. 2050  VTAB 10: HTAB 3: INVERSE : PRINT "MILES JOGGED:": NORMAL 
  206. 2060  VTAB 10: HTAB 17: PRINT MILES(K)
  207. 2070  VTAB 10: HTAB 16: INPUT " ";S$
  208. 2080  VTAB 10: HTAB 39: INVERSE : PRINT  SPC( 1): NORMAL 
  209. 2090  IF S$ < >""  THEN MILES(K) =  VAL(S$)
  210. 2100  IF MILES(K) <0  THEN 2060
  211. 2110  VTAB 10: HTAB 17: PRINT MILES(K)
  212. 2120  RETURN 
  213. 2130  REM  MINUTES
  214. 2140  VTAB 12: HTAB 8: INVERSE : PRINT "MINUTES:": NORMAL 
  215. 2150  VTAB 12: HTAB 17: PRINT  SPC( 11);: HTAB 17: PRINT TIME(K)
  216. 2160  VTAB 12: HTAB 16: INPUT " ";S$
  217. 2170  VTAB 12: HTAB 39: INVERSE : PRINT  SPC( 1): NORMAL 
  218. 2180  IF S$ < >""  THEN TIME(K) =  VAL(S$)
  219. 2190 MM = TIME(K)/MILES(K):W$ = ""
  220. 2200  IF MM < >0  AND MM <3.5  THEN W$ = "SLOW DOWN !"
  221. 2210  IF MM >99.9  THEN W$ = "SPEED UP !"
  222. 2220  IF W$ < >""  THEN  VTAB 12: HTAB 17: CALL  -868: VTAB 12: HTAB 17: GOTO 2150
  223. 2230  VTAB 12: HTAB 17: PRINT TIME(K)
  224. 2240  RETURN 
  225. 2250  REM  LOCATION
  226. 2260  VTAB 16: HTAB 3: PRINT "LOCATION:"
  227. 2270 ROW = 16:PH$ = LC$(K): GOSUB 2300
  228. 2280  IF COL < >13  THEN LC$(K) = P$
  229. 2290  RETURN 
  230. 2300  REM  PHRASE
  231. 2310 COL = 13:P$ = "": INVERSE 
  232. 2320  VTAB ROW: HTAB COL: PRINT  SPC( 24);: HTAB COL: PRINT PH$
  233. 2330  VTAB ROW: HTAB COL
  234. 2340  GET L$
  235. 2350 A =  ASC(L$)
  236. 2360  IF A >96  THEN A = A -32:L$ =  CHR$(A)
  237. 2370  IF (COL = 13  AND A = 8)  OR (COL = 37  AND A < >8  AND A < >13)  THEN  PRINT BELL$: GOTO 2330
  238. 2380  IF A = 8  THEN  GOSUB 2430
  239. 2390  IF A < >8  AND A < >13  THEN  PRINT L$;:P$ = P$ +L$:COL = COL +1
  240. 2400  IF A < >13  THEN 2330
  241. 2410  NORMAL 
  242. 2420  RETURN 
  243. 2430  REM  MOVE CURSOR LEFTWARD
  244. 2440  IF  LEN(P$) = 1  THEN P$ = ""
  245. 2450  IF  LEN(P$) >1  THEN P$ =  LEFT$(P$, LEN(P$) -1)
  246. 2460 COL = COL -1
  247. 2470  PRINT  CHR$(8); SPC( 1)
  248. 2480  RETURN 
  249. 2490  REM  COMMENTS
  250. 2500  VTAB 18: HTAB 3: PRINT "COMMENTS:"
  251. 2510 ROW = 18:PH$ = CM$(K): GOSUB 2300
  252. 2520  IF COL < >13  THEN CM$(K) = P$
  253. 2530  RETURN 
  254. 2540  REM  OLD BOOK
  255. 2550  REM  ENTER YEAR
  256. 2560  GOSUB 910
  257. 2570 : REM  CHECK FOR YEAR ON FILE
  258. 2580 DUP$ = "": GOSUB 1030
  259. 2590  IF DUP$ = ""  THEN  HOME : INVERSE : PRINT FILE$;: NORMAL : PRINT " IS NOT ON FILE.": VTAB 22: HTAB 3: PRINT "PRESS RETURN FOR MENU";: GET Z$: PRINT : GOTO 2680
  260. 2600  REM  READ DATA
  261. 2610  GOSUB 2690
  262. 2620  REM  SELECT FROM MENU
  263. 2630  GOSUB 2780
  264. 2640  ON CHOICE GOSUB 1360,2930,3900
  265. 2650  IF CHOICE < >4  THEN 2630
  266. 2660 : REM  SAVE DATA
  267. 2670  GOSUB 4110
  268. 2680  RETURN 
  269. 2690  REM  READ
  270. 2700 EF = 4: HOME : VTAB 12: HTAB 12: PRINT "READING DATA ...": ONERR  GOTO 4440
  271. 2710  PRINT D$;"OPEN" +FILE$
  272. 2720  PRINT D$;"READ" +FILE$
  273. 2730  FOR I = 1 TO DY
  274. 2740  INPUT MILES(I),TIME(I),LC$(I),CM$(I)
  275. 2750  NEXT 
  276. 2760  PRINT D$;"CLOSE" +FILE$
  277. 2770  RETURN 
  278. 2780  REM  MENU
  279. 2790  HOME 
  280. 2800  VTAB 7: HTAB 10: PRINT "WOULD YOU LIKE TO"
  281. 2810  INVERSE :ROW = 10
  282. 2820  FOR I = 1 TO 4: VTAB ROW: HTAB 11: PRINT I:ROW = ROW +2: NEXT 
  283. 2830  NORMAL 
  284. 2840  VTAB 10: HTAB 13: PRINT "LOG OR REVIEW A JOG
  285. 2850  VTAB 12: HTAB 13: PRINT "REVIEW MONTHLY RUNS"
  286. 2860  VTAB 14: HTAB 13: PRINT "TALLY TOTALS"
  287. 2870  VTAB 16: HTAB 13: PRINT "RETURN TO MAIN MENU"
  288. 2880  VTAB 19: HTAB 10: PRINT "CHOICE = ? ";
  289. 2890  GET S$
  290. 2900 CHOICE =  VAL(S$)
  291. 2910  IF CHOICE <1  OR CHOICE >4  THEN 2880
  292. 2920  RETURN 
  293. 2930  REM  MONTHLY MILEAGE
  294. 2940  REM  DRAW BOX & ENTER MONTH
  295. 2950  GOSUB 1600: GOSUB 1720
  296. 2960  REM  DAY OF YEAR CORRESPONDING TO FIRST OF MONTH
  297. 2970 D = 1: GOSUB 1960
  298. 2980  REM  NO. DAYS FROM 1JAN78 (BASE DATE) TO FIRST OF MONTH
  299. 2990  GOSUB 3090
  300. 3000  REM  DAY OF THE WEEK (SUN=1 & SAT=7) THAT 1ST IS ON
  301. 3010 DW = ND -7 * INT(ND/7): IF DW = 0  THEN DW = 7
  302. 3020  REM  DRAW SHELL
  303. 3030  GOSUB 3180
  304. 3040  REM  LABEL
  305. 3050  GOSUB 3260
  306. 3060  REM  CHOOSE ACTION
  307. 3070  GOSUB 3390
  308. 3080  RETURN 
  309. 3090  REM  DAYS SINCE BASE DATE
  310. 3100 ND = 0
  311. 3110  FOR I = BY TO YEAR
  312. 3120 INC = 365
  313. 3130  IF (I/4) =  INT(I/4)  THEN INC = 366
  314. 3140 ND = ND +INC
  315. 3150  NEXT 
  316. 3160 ND = ND -(INC -K)
  317. 3170  RETURN 
  318. 3180  REM  SHELL
  319. 3190  HOME 
  320. 3200 S$ = ""
  321. 3210  FOR I = 1 TO 36:S$ = S$ + CHR$(45): NEXT 
  322. 3220  FOR R = 5 TO 17  STEP 3
  323. 3230  VTAB R: HTAB 1: PRINT S$
  324. 3240  NEXT 
  325. 3250  RETURN 
  326. 3260  REM  LABEL
  327. 3270 C = 2:M$ = MT$(M): INVERSE 
  328. 3280  FOR I = 1 TO 7
  329. 3290  VTAB 1: HTAB C: PRINT DW$(I):C = C +5
  330. 3300  NEXT 
  331. 3310  FOR I = 1 TO  LEN(M$)
  332. 3320  VTAB I +7: HTAB 38: PRINT  MID$ (M$,I,1)
  333. 3330  NEXT 
  334. 3340  VTAB 21: HTAB 1
  335. 3350  FOR I = 1 TO 4
  336. 3360  INVERSE : PRINT I;: NORMAL : PRINT C$(I); SPC( 3);
  337. 3370  NEXT 
  338. 3380  RETURN 
  339. 3390  REM  ACTION
  340. 3400 R = 4:C = DW: GOSUB 3490: REM  DATES
  341. 3410  VTAB 23: HTAB 15: PRINT "CHOICE = ? ";
  342. 3420  GET S$
  343. 3430 ACTN =  VAL(S$)
  344. 3440  IF ACTN <1  OR ACTN >4  THEN 3410
  345. 3450 R = 4:C = DW
  346. 3460  ON ACTN GOSUB 3490,3610,3700
  347. 3470  IF ACTN < >4  THEN 3410
  348. 3480  RETURN 
  349. 3490  REM  DATES
  350. 3500  FOR I = 1 TO DAY(M)
  351. 3510  INVERSE : GOSUB 3570: NORMAL 
  352. 3520  VTAB R: HTAB 5 *C -2: PRINT I
  353. 3530 C = C +1
  354. 3540  IF C = 8  THEN R = R +3:C = 1
  355. 3550  NEXT 
  356. 3560  RETURN 
  357. 3570  REM  CLEAR BLOCK
  358. 3580  VTAB R -1: HTAB 5 *C -3: PRINT  SPC( 4)
  359. 3590  VTAB R: HTAB 5 *C -3: PRINT  SPC( 4)
  360. 3600  RETURN 
  361. 3610  REM  MILES
  362. 3620  FOR I = 1 TO DAY(M)
  363. 3630 MS = MILES(K +I -1)
  364. 3640  IF MS >0  THEN  NORMAL : GOSUB 3570: INVERSE : VTAB R: HTAB 5 *C -3: PRINT  INT(10 *MS +0.5)/10
  365. 3650 C = C +1
  366. 3660  IF C = 8  THEN R = R +3:C = 1
  367. 3670  NEXT 
  368. 3680  NORMAL 
  369. 3690  RETURN 
  370. 3700  REM  TIME
  371. 3710  FOR I = 1 TO DAY(M)
  372. 3720 MS = MILES(K +I -1):MIN = TIME(K +I -1)
  373. 3730  IF MS = 0  THEN 3770
  374. 3740  NORMAL : GOSUB 3570: INVERSE 
  375. 3750  IF MIN = 0  THEN  VTAB R: HTAB 5 *C -2: PRINT "NA"
  376. 3760  IF MIN >0  THEN  GOSUB 3820
  377. 3770 C = C +1
  378. 3780  IF C = 8  THEN R = R +3:C = 1
  379. 3790  NEXT 
  380. 3800  NORMAL 
  381. 3810  RETURN 
  382. 3820  REM  MINUTES/MILE
  383. 3830 MM = MIN/MS:MN =  INT(MM)
  384. 3840 SC =  INT(MM *60 -MN *60 +.5)
  385. 3850 M$ =  STR$(MN) +" M": IF  LEN(M$) = 3  THEN M$ = " " +M$
  386. 3860 S$ =  STR$(SC) +" S": IF  LEN(S$) = 3  THEN S$ = " " +S$
  387. 3870  VTAB R -1: HTAB 5 *C -3: PRINT M$
  388. 3880  VTAB R: HTAB 5 *C -3: PRINT S$
  389. 3890  RETURN 
  390. 3900  REM  TOTALS
  391. 3910  GOSUB 1600
  392. 3920  NORMAL : VTAB 2: HTAB 11: PRINT " MONTHLY MILEAGE "
  393. 3930 TL = 0:CNT = 1
  394. 3940  FOR I = 1 TO 12
  395. 3950  GOSUB 4020
  396. 3960  VTAB I +4: HTAB 5: PRINT MT$(I); TAB( 22)"="; TAB( 35 - LEN( STR$(SUM)))SUM
  397. 3970  NEXT I
  398. 3980  VTAB 18: HTAB 5: INVERSE : PRINT "TOTAL";: NORMAL : PRINT  TAB( 22)"="; TAB( 35 - LEN( STR$(TL)))TL
  399. 3990  VTAB 22: HTAB 14: PRINT "PRESS RETURN ";
  400. 4000  GET S$: PRINT 
  401. 4010  RETURN 
  402. 4020  REM  SUM
  403. 4030 SUM = 0
  404. 4040  FOR J = 1 TO DAY(I)
  405. 4050 SUM = SUM +MILES(CNT)
  406. 4060 CNT = CNT +1
  407. 4070  NEXT J
  408. 4080 SUM =  INT(SUM +0.5)
  409. 4090 TL = TL +SUM
  410. 4100  RETURN 
  411. 4110  REM  SAVE DATA
  412. 4120  HOME : VTAB 12: HTAB 12: PRINT "SAVING DATA ..."
  413. 4130 : REM  LOGBOOK
  414. 4140 EF = 5: ONERR  GOTO 4440
  415. 4150  PRINT D$;"OPEN"FILE$: PRINT D$"CLOSE"FILE$: PRINT D$"DELETE"FILE$: PRINT D$"OPEN"FILE$
  416. 4160  PRINT D$;"WRITE" +FILE$
  417. 4170  FOR I = 1 TO DY
  418. 4180  PRINT MILES(I);",";TIME(I);",";LC$(I);",";CM$(I)
  419. 4190  NEXT I
  420. 4200  PRINT D$;"CLOSE"
  421. 4210 : REM  CATALOG
  422. 4220 EF = 6: ONERR  GOTO 4440
  423. 4230  PRINT D$;"OPEN JOGCAT": PRINT D$"CLOSE JOGCAT": PRINT D$"DELETE JOGCAT": PRINT D$"OPEN JOGCAT"
  424. 4240  PRINT D$;"WRITE JOGCAT"
  425. 4250  PRINT NFILES
  426. 4260  FOR I = 1 TO NFILES
  427. 4270  PRINT FILE(I)
  428. 4280  NEXT 
  429. 4290  PRINT D$;"CLOSE"
  430. 4300  HOME 
  431. 4310  INVERSE : PRINT FILE$;: NORMAL : PRINT " IS SAVED."
  432. 4320  RETURN 
  433. 4330  REM  LOGBOOK NAMES
  434. 4340  HOME 
  435. 4350  VTAB 1: HTAB 12: INVERSE : PRINT "LOGBOOKS ON FILE": NORMAL 
  436. 4360  FOR I = 1 TO NFILES
  437. 4370  VTAB I +2: HTAB 16: PRINT "JOG";FILE(I)
  438. 4380  NEXT 
  439. 4390  VTAB 24: HTAB 14: PRINT "PRESS RETURN ";
  440. 4400  GET S$: PRINT 
  441. 4410  HOME 
  442. 4420  RETURN 
  443. 4430  REM  ERROR-HANDLING ROUTINE
  444. 4440 E =  PEEK(222):EL =  PEEK(218) +256 * PEEK(219): CALL  -3288: PRINT D$"CLOSE"
  445. 4450  IF E = 4  THEN M$ = "DISK IS WRITE-PROTECTED": GOTO 4500
  446. 4460  IF E = 6  AND EF = 1  THEN 4510
  447. 4470  IF E = 8  THEN M$ = "I/O ERROR--CHECK DRIVE DOOR": GOTO 4500
  448. 4480  IF E = 9  THEN M$ = "DISK FULL--TRY ANOTHER": GOTO 4500
  449. 4490 A$ = "ERROR " + STR$(E) +" IN LINE " + STR$(EL)
  450. 4500  HOME : VTAB 12: PRINT A$: VTAB 22: PRINT "RETURN TO TRY AGAIN, ESCAPE TO QUIT";: GET Z$: PRINT : IF Z$ =  CHR$(27)  THEN  END 
  451. 4510  ON EF GOTO 480,490,560,2700,4140,4220,4520
  452. 4520  HOME : VTAB 12: PRINT "UNANTICIPATED ERROR--PROGRAM TERMINATED"
  453. 4530  END