home *** CD-ROM | disk | FTP | other *** search
/ Nibble Magazine / nib28a.dsk / JULY.1986 / WEATHER.STATION.bas < prev    next >
BASIC Source File  |  2023-02-26  |  30KB  |  541 lines

  1. 1  REM   **********************
  2. 2  REM   * WEATHER.STATION    *
  3. 3  REM   * BY MARK CRAVEN     *
  4. 4  REM   * COPYRIGHT (C) 1986 *
  5. 5  REM   * BY MICROSPARC, INC *
  6. 6  REM   * CONCORD, MA  01742 *
  7. 7  REM   **********************
  8. 10  TEXT : HOME 
  9. 20  IF  PEEK(104) < >8  THEN  POKE 103,1: POKE 104,8: POKE 2048,0: PRINT  CHR$(4)"RUN WEATHER.STATION": REM   SET PROGRAM POINTER
  10. 30 D$ =  CHR$(4):DV$ = ",D1": POKE 230,32: ONERR  GOTO 5060
  11. 40  POKE 960,1: REM   ERROR FLAG FOR ONERRS
  12. 50  PRINT D$"BLOAD CURSOR.BAR.III"
  13. 60  POKE 960,0: POKE 216,0: REM   CLEAR ONERR
  14. 70  INVERSE : HTAB 1: FOR I = 1 TO 37: PRINT "*";: NEXT 
  15. 80  PRINT 
  16. 90  HTAB 1: PRINT "*" TAB( 37)"*"
  17. 100  HTAB 1: PRINT "*"; SPC( 4);"THE NIBBLE WEATHER STATION"; SPC( 5);"*"
  18. 110  FOR I = 1 TO 5: HTAB 1: PRINT "*" TAB( 37)"*": NEXT 
  19. 120  HTAB 1: FOR I = 1 TO 37: PRINT "*";: NEXT 
  20. 130  VTAB 4: HTAB 18: PRINT "BY": VTAB 5: HTAB 12: PRINT "MARK R. CRAVEN": VTAB 7: HTAB 3: PRINT "COPYRIGHT 1986 BY MICROSPARC, INC.": VTAB 12
  21. 140  NORMAL 
  22. 150  PRINT : PRINT "A PROGRAM TO TRACK WEATHER CONDITIONS"
  23. 160  GOSUB 720
  24. 170  REM  
  25. 180  REM   DIMENSIONS
  26. 190  REM  
  27. 200  DIM M$(13),D$(13): REM   MONTHS,DAYS
  28. 210  DIM W$(31,10): REM   WEATHER DAY,ITEMS
  29. 220  DIM I$(10): REM   INPUT
  30. 230  DIM MR$(17): REM   MONTHLY SUMMARY REPORTS
  31. 240 HP% = 13
  32. 250  REM  
  33. 260  REM   READ DATA
  34. 270  REM  
  35. 280  FOR I = 1 TO 13: READ M$(I),D$(I): NEXT 
  36. 290  FOR I = 1 TO 9: READ IN$(I): NEXT : REM   INPUT TITLES
  37. 300  FOR I = 1 TO 9: READ L%(I): NEXT : REM   INPUT LENGTHS
  38. 310  FOR I = 1 TO 6: READ RP$(I): NEXT : REM   REPORT OPTIONS
  39. 320  FOR I = 1 TO 5: READ R%(I): NEXT : REM   LENGTHS OF RP$()
  40. 330  FOR I = 1 TO 5: READ HD$(I): NEXT : REM   SCREEN HEADING FOR DISPLAY
  41. 340  FOR I = 1 TO 5: READ HD%(I): NEXT : REM   SPACES REQ'D FOR HEADINGS
  42. 350  FOR I = 1 TO 5: READ H2$(I): NEXT : REM   HEADINGS SECOND LINES
  43. 360  FOR I = 1 TO 5: READ HR$(I): NEXT : REM   PRINTER SECOND ROW HEADINGS
  44. 370 CUR = 768: REM   CURSOR BAR CALL LOC.
  45. 380  FOR I = 1 TO 39:L$ = L$ +"=": NEXT 
  46. 390 WD$ = "  N - NE -  E - SE -  S - SW -  W - NW ": REM   WIND DIRECTIONS
  47. 400 DW$ = "N NEE SES SWW NW": REM   CONVERSION STRING
  48. 410 UL$ =  CHR$(95) + CHR$(95): REM   TWO UNDERLINES
  49. 420  GOTO 1310: REM   MAIN MENU
  50. 430  REM  
  51. 440  REM   ** DISK READ **
  52. 450  REM  
  53. 460  TEXT : HOME : VTAB 10:X$ = "DISK READ - DO NOT INTERRUPT": GOSUB 730
  54. 470  ONERR  GOTO 5080
  55. 480  PRINT  CHR$(13);: PRINT D$;"UNLOCK"F$DV$: REM   CHECK FOR FILE
  56. 490  PRINT D$;"OPEN "F$
  57. 500  PRINT D$;"READ "F$
  58. 510  INPUT D$(M%): FOR I = 1 TO  VAL(D$(M%)): FOR J = 1 TO 9: INPUT W$(I,J): NEXT : NEXT 
  59. 520  PRINT D$"CLOSE"F$
  60. 530  POKE 960,0: POKE 216,0
  61. 540  ON FLAG GOTO 1950,2740,3290,3780,4200
  62. 550  REM  
  63. 560  REM   ** DISK WRITE **
  64. 570  REM  
  65. 580  TEXT : HOME : VTAB 10:X$ = "DISK WRITE - DO NOT INTERRUPT": GOSUB 730
  66. 590  ONERR  GOTO 5140: POKE 960,3
  67. 600  GOSUB 750: REM   FILE NAME
  68. 610  PRINT D$;"OPEN"F$DV$
  69. 620  PRINT D$;"WRITE"F$
  70. 630  PRINT D$(M%)
  71. 640  FOR I = 1 TO  VAL(D$(M%)): FOR J = 1 TO 9: PRINT W$(I,J): NEXT : NEXT 
  72. 650  PRINT D$
  73. 660  PRINT D$;"CLOSE"F$
  74. 670  POKE 960,0: POKE 216,0: REM   CLEAR ONERRS
  75. 680  ON FLAG GOTO 2630,2700,2710
  76. 690  REM  
  77. 700  REM   SUBROUTINES
  78. 710  REM  
  79. 720  VTAB 23: PRINT "PRESS <RETURN> TO CONTINUE...";: POKE  -16368,0: GET Y$: PRINT : RETURN 
  80. 730  HTAB 20 - LEN(X$)/2: PRINT X$: RETURN 
  81. 740  TEXT : HOME :X$ = "**  INPUT WEATHER DATA  **": GOSUB 730: PRINT L$: RETURN 
  82. 750 F$ = M$(M%) +"." + STR$(Y%): RETURN : REM   FILE NAME TO WRITE
  83. 760 LINE = ( PEEK(4) +1)/2: RETURN 
  84. 770  HTAB 1: FOR I = 1 TO 9: VTAB 4 +I +(I >2) +(I >4) +(I >5) +(I >7): PRINT IN$(I): NEXT : RETURN 
  85. 780  VTAB 3: HTAB 15: PRINT M$(M%)" "D%"  19";Y%" ";: RETURN 
  86. 790  IF  LEFT$(I$(I),1) = " "  THEN I$(I) =  RIGHT$(I$(I), LEN(I$(I)) -1)
  87. 800  RETURN 
  88. 810 ER = 0:DC = 0: ON I GOTO 830,830,840,840,850,860,860,870,960: REM   CLEAR FLAGS
  89. 820  RETURN 
  90. 830 H = 120:L =  -30: GOTO 970
  91. 840 H = 31.5:L = 28: GOTO 1050
  92. 850 H = 100:L = 0: GOTO 970
  93. 860 H = 30:L = 0: GOTO 1050
  94. 870  IF I$(I) = "N"  OR I$(I) = " N"  THEN I$(I) = " N": RETURN 
  95. 880  IF I$(I) = "NE"  THEN  RETURN 
  96. 890  IF I$(I) = "E"  OR I$(I) = " E"  THEN I$(I) = " E": RETURN 
  97. 900  IF I$(I) = "SE"  THEN  RETURN 
  98. 910  IF I$(I) = "S"  OR I$(I) = " S"  THEN I$(I) = " S": RETURN 
  99. 920  IF I$(I) = "SW"  THEN  RETURN 
  100. 930  IF I$(I) = "W"  OR I$(I) = " W"  THEN I$(I) = " W": RETURN 
  101. 940  IF I$(I) = "NW"  THEN  RETURN 
  102. 950 ER = 1: RETURN : REM   NONE OF THE ABOVE
  103. 960 H = 150:L = 0
  104. 970  GOSUB 790
  105. 980  FOR K = 1 TO  LEN(I$(I)): IF  ASC( MID$ (I$(I),K,1)) <45  OR  ASC( MID$ (I$(I),K,1)) >57  OR  ASC( MID$ (I$(I),K,1)) = 46  OR  ASC( MID$ (I$(I),K,1)) = 47  THEN ER = 1:K =  LEN(I$(I)): NEXT : RETURN 
  106. 990  NEXT 
  107. 1000 X =  INT( VAL(W$(D%,I))):I$(I) =  STR$(X): REM   MAKE INTEGER
  108. 1010  IF  VAL(I$(I)) <L  OR  VAL(I$(I)) >H  THEN ER = 1: RETURN 
  109. 1020  IF  VAL(I$(2)) > VAL(I$(1))  AND I$(2) < >""  THEN ER = 1: RETURN 
  110. 1030  IF  LEN(I$(I)) = 1  THEN I$(I) = " " +I$(I)
  111. 1040  RETURN : REM   NO ERRORS
  112. 1050  IF  VAL(I$(I)) >H  OR  VAL(I$(I)) <L  THEN ER = 1: RETURN 
  113. 1060  REM   IF (I = 6 OR I = 7) AND EC = 1 THEN  EC = 0: IF I$(I) <  > "" THEN  RETURN :REM CHECK LIMITS ON 'ACCEPT' FROM EDIT
  114. 1070  GOSUB 790
  115. 1080  FOR K = 1 TO  LEN(I$(I)): IF  ASC( MID$ (I$(I),K,1)) <48  OR  ASC( MID$ (I$(I),K,1)) >57  THEN DC = DC +1:D1 = K
  116. 1090  NEXT : IF DC >1  THEN ER = 1: RETURN 
  117. 1100  IF DC = 1  THEN  IF  MID$ (I$(I),D1,1) < >"."  THEN ER = 1: RETURN 
  118. 1110  IF I <6  OR I >7  THEN 1140
  119. 1120  IF DC = 0  THEN I$(I) = I$(I) +".00": GOTO 1140: REM   NO DECIMALS,DC=0
  120. 1130 I$(I) = I$(I) +"00": IF  VAL(I$(I)) <1  THEN I$(I) = " 0" + MID$ (I$(I),D1,3): RETURN 
  121. 1140  IF  INT( VAL(I$(I))) <10  THEN I$(I) = " " +I$(I)
  122. 1150  IF  VAL(I$(4)) > VAL(I$(3))  THEN ER = 1: RETURN 
  123. 1160  IF  LEN(I$(I)) = 2  THEN I$(I) = I$(I) +".00": RETURN 
  124. 1170  IF  LEN(I$(I)) <5  THEN I$(I) = I$(I) +"0": GOTO 1170
  125. 1180 I$(I) =  LEFT$(I$(I),2) +"." + MID$ (I$(I),4,2)
  126. 1190  RETURN : REM   NO ERRORS
  127. 1200  FOR I = 1 TO 9
  128. 1210  VTAB 4 +I +(I >2) +(I >4) +(I >5) +(I >7): HTAB 16: FOR J = 1 TO L%(I): PRINT  CHR$(95);: NEXT : CALL  -868: HTAB 16: PRINT W$(D%,I);: IF W$(D%,I) < >""  THEN  CALL  -868
  129. 1220  HTAB 16: NEXT : RETURN : REM   INPUT LINE
  130. 1230  REM   CURSOR SELECTION PROMPTS
  131. 1240  VTAB 21: PRINT L$;: VTAB 22: HTAB 1: INVERSE : PRINT "<-";: NORMAL : PRINT " ";: INVERSE : PRINT "->";: NORMAL : PRINT " TO SELECT .... ";: INVERSE : PRINT "RETURN";: NORMAL : PRINT " TO EXECUTE"
  132. 1250  VTAB 23: PRINT "   UP OR DOWN ARROW KEYS MAY BE USED"
  133. 1260  VTAB 24: PRINT L$;: RETURN 
  134. 1270  VTAB 21: HTAB 1: CALL  -958: VTAB 21: PRINT L$: VTAB 22: PRINT "  ENTER APPROPRIATE DATE INFORMATION": PRINT L$: RETURN 
  135. 1280  REM  
  136. 1290  REM   MAIN MENU
  137. 1300  REM  
  138. 1310  POKE 960,0: TEXT : HOME :PD = 0:MS = 0: REM   CLEAR FLAGS
  139. 1320 X$ = "** WEATHER STATION--MAIN MENU **"
  140. 1330  VTAB 2: GOSUB 730
  141. 1340  VTAB 4: PRINT L$
  142. 1350  VTAB 7:X$ = "ENTER/EDIT WEATHER DATA": GOSUB 730
  143. 1360  VTAB 9:X$ = "SCREEN/PRINTER REPORTS": GOSUB 730
  144. 1370  VTAB 11:X$ = "RUN WEATHER STATION GRAPHICS": GOSUB 730
  145. 1380  VTAB 13:X$ = "SELECT DRIVE/CATALOG": GOSUB 730
  146. 1390  VTAB 15:X$ = "QUIT PROGRAM": GOSUB 730
  147. 1400  GOSUB 1240: REM  CURSOR PROMPTS
  148. 1410  CALL CUR,7,17,6,33: REM  T,B,L,R
  149. 1420  GOSUB 760: REM  GET LINE #
  150. 1430  ON LINE GOTO 1580,2780,1440,1460,4890
  151. 1440  HOME : PRINT : POKE 960,4: ONERR  GOTO 5280
  152. 1450  PRINT D$"VERIFY WS.GRAPHICS"DV$: POKE 216,0: PRINT D$"RUN WS.GRAPHICS"
  153. 1460  HOME :X$ = "SELECT DISK DRIVE": GOSUB 730: PRINT L$
  154. 1470  GOSUB 1240: REM  PROMPTS
  155. 1480  VTAB 6: HTAB 12: PRINT "ACTIVE DRIVE=";: INVERSE : PRINT  RIGHT$(DV$,1): NORMAL : VTAB 10:X$ = "DRIVE 1": GOSUB 730:X$ = "DRIVE 2": GOSUB 730:X$ = "CATALOG DISK": GOSUB 730:X$ = "MAIN MENU": GOSUB 730
  156. 1490  CALL CUR,10,15,13,25:LINE =  PEEK(4)
  157. 1500  ON LINE GOTO 1510,1510,1530,1310
  158. 1510 DV$ = ",D" + STR$(LINE)
  159. 1520  GOTO 1460
  160. 1530  TEXT : HOME : POKE 960,5: ONERR  GOTO 5160
  161. 1540 CA$ = "CATALOG":PR = 4 *( PEEK(48896) = 76): PRINT  CHR$(4); LEFT$(CA$,7 -PR);DV$: POKE 216,0: POKE 960,0: PRINT : PRINT : GOSUB 720: GOTO 1460
  162. 1550  REM  
  163. 1560  REM   INPUT DATA
  164. 1570  REM  
  165. 1580  POKE 960,2: GOSUB 740: REM   HEADING
  166. 1590 RP = 0
  167. 1600  REM   GET MONTH
  168. 1610  VTAB 5: CALL  -958: GOSUB 1240: REM   CLEAR & PUT INSTR.
  169. 1620  VTAB 8: HTAB 1: PRINT "SELECT MONTH.."
  170. 1630  FOR I = 1 TO 12: VTAB 3 +I: HTAB 18: PRINT "  ";M$(I): NEXT : PRINT  TAB( 18)" ";M$(13)
  171. 1640  CALL CUR,4,16,19,23
  172. 1650 LINE =  PEEK(4)
  173. 1660  IF LINE = 13  THEN 1310
  174. 1670  ON RP GOTO 2930,2970: REM   REPORT ROUTINE
  175. 1680 M% = LINE: REM   GET MONTH
  176. 1690  IF RP = 1  OR RP = 2  THEN 1840: REM   YEAR
  177. 1700  IF MS = 1  THEN 1840: REM   YEAR
  178. 1710  GOSUB 1270: REM   PROMPTS
  179. 1720  VTAB 10: HTAB 25 -ED *24
  180. 1730  PRINT "DATE "UL$" (1-"D$(M%)")";: HTAB 30 -ED *24
  181. 1740  INPUT "";I$: IF  LEN(I$) >2  AND ED = 1  THEN  PRINT  CHR$(7): HOME : GOTO 1720: REM   DO IT ALL AGAIN
  182. 1750  IF ED = 1  THEN 1770
  183. 1760  IF  LEN(I$) >2  THEN  PRINT  CHR$(7): GOTO 1580: REM   DO IT ALL AGAIN
  184. 1770  IF ( VAL(I$) <1  OR  VAL(I$) > VAL(D$(M%)))  AND ED = 1  THEN  PRINT  CHR$(7);: HOME : GOTO 1720
  185. 1780  IF  VAL(I$) <1  OR  VAL(I$) > VAL(D$(M%))  THEN  PRINT  CHR$(7);: GOTO 1720
  186. 1790 D% =  VAL(I$): REM   DAY
  187. 1800  IF ED = 1  THEN ED = 0: RETURN : REM   EDIT DAY
  188. 1810  REM  
  189. 1820  REM   GET YEAR
  190. 1830  REM  
  191. 1840  GOSUB 1270: TEXT : POKE 33,15: POKE 32,23: POKE 34,11: POKE 35,13
  192. 1850  HOME : PRINT "YEAR "UL$" (19"UL$")";: HTAB 6
  193. 1860  INPUT "";I$
  194. 1870  IF I$ = ""  AND MS = 1  THEN  POP : GOTO 4110
  195. 1880  IF ( LEN(I$) < >2  AND (RP = 1  OR RP = 2))  THEN  PRINT  CHR$(7): GOTO 2780: REM   DO IT ALL AGAIN
  196. 1890  IF I$ = ""  THEN 1580: REM   INPUT
  197. 1900  IF  VAL(I$) <80  OR  VAL(I$) >99  THEN  PRINT  CHR$(7);: GOTO 1850
  198. 1910  IF MS = 1  THEN Y% =  VAL(I$): HOME : TEXT : GOTO 1960: REM   CLEAR THE SCREEN & RETURN
  199. 1920  HOME : TEXT : ON RP GOTO 2950,2990
  200. 1930  HOME :Y% =  VAL(I$): IF M$(M%) +"." +I$ = F$  THEN 1950
  201. 1940 FLAG = 1: HOME : VTAB 10: HTAB 14: PRINT "READING FILE";: GOSUB 750: GOTO 470: REM   GET YEAR-READ FILE
  202. 1950 FLAG = 0: REM   RESET READ/WRITE FLAG
  203. 1960  IF MS = 1  THEN  RETURN : REM   BACK TO MONTHLY STATS AREA
  204. 1970  HOME : GOSUB 730: PRINT L$: REM   HEADING
  205. 1980  GOSUB 780: REM   PRINT DATE
  206. 1990  VTAB 21: HTAB 1: CALL  -958: VTAB 21: PRINT L$: FOR I = 1 TO 9:I$(I) = "": NEXT 
  207. 2000  PRINT "^Q=QUIT   <ESC>=BACK UP   ";: INVERSE : PRINT "<--";: NORMAL : PRINT "=BACKSPACE"
  208. 2010  PRINT "  ^C=CLEAR DATA     ^E=EDIT ANY DAY ";: REM   2 SPACES,5 SPACES
  209. 2020  VTAB 24: HTAB 1: PRINT L$;
  210. 2030  GOSUB 770: REM   INPUT LINES
  211. 2040  REM  
  212. 2050  REM   START OF INPUT
  213. 2060  REM  
  214. 2070 FLAG = 0: GOSUB 1200: FOR I = 1 TO 9
  215. 2080  VTAB 20: HTAB 1: CALL  -868
  216. 2090  IF I = 8  THEN  VTAB 20: HTAB 1: PRINT WD$
  217. 2100  VTAB 4 +I +(I >2) +(I >4) +(I >5) +(I >7): HTAB 16: REM   INPUT LINE
  218. 2110  FOR J = 1 TO L%(I): PRINT  CHR$(95);: NEXT : CALL  -868: HTAB 16: PRINT W$(D%,I);: HTAB 16
  219. 2120 I$ = "":I$(I) = "": REM   NULL INPUT STRINGS
  220. 2130  POKE  -16368,0: GET I$: REM   INPUT A CHARACTER
  221. 2140  IF I$ > CHR$(31)  THEN 2510
  222. 2150  REM   ** CHECK FOR <ESC> **
  223. 2160  IF I$ < > CHR$(27)  THEN 2200
  224. 2170  IF I = 1  THEN  PRINT  CHR$(7);: HTAB 16: PRINT W$(D%,I);: CALL  -868: GOTO 2080: REM   BACK UP WITH NO PLACE TO GO?
  225. 2180  HTAB 16: PRINT W$(D%,I);: CALL  -868:I = I -1: GOTO 2080: REM   BACK UP TO LAST INPUT
  226. 2190  REM   ** CHECK FOR <-- **
  227. 2200  IF I$ < > CHR$(8)  THEN 2270
  228. 2210  IF I$(I) = ""  THEN  PRINT  CHR$(7);: GOTO 2080
  229. 2220  IF  LEN(I$(I)) = 1  THEN I$(I) = "": GOTO 2080: REM   <-- WITH NO PLACE TO GO
  230. 2230  POKE 36, PEEK(36) -1: PRINT  CHR$(95); CHR$(8);:I$(I) =  LEFT$(I$(I), LEN(I$(I)) -1): GOTO 2130: REM   <--
  231. 2240  REM  
  232. 2250  REM   ** CHECK FOR <RTN> **
  233. 2260  REM  
  234. 2270  IF I$ < > CHR$(13)  THEN 2400
  235. 2280  IF I$(I) = ""  THEN  HTAB 16: PRINT W$(D%,I);: CALL  -868:I$(I) = W$(D%,I):EC = 1: REM   ERROR CHECK
  236. 2290 W$(D%,I) = I$(I): REM   NON-NULL INPUT
  237. 2300  IF W$(D%,I) = ""  THEN 2330: REM   NO ENTRY MADE
  238. 2310  CALL  -868:I$ = "": GOSUB 810:EC = 0: REM   ERROR TRAP INPUT
  239. 2320  IF ER  THEN  PRINT  CHR$(7);:ER = 0: GOTO 2100
  240. 2330 EC = 0: HTAB 16: PRINT I$(I);: CALL  -868
  241. 2340 W$(D%,I) = I$(I): REM   ASSIGN STRING
  242. 2350  IF I < = 9  THEN  NEXT : REM   ADVANCE TO NEXT FIELD
  243. 2360 D% = D% +1: GOTO 2560: REM   INCREMENT DAY-WHAT NEXT?
  244. 2370  REM  
  245. 2380  REM   ** CHECK FOR ^ CHAR **
  246. 2390  REM  
  247. 2400  IF I$ < > CHR$(17)  THEN 2430
  248. 2410  IF  LEN(I$(I)) >0  THEN I$(I) = "": REM   NULL ENTRY WHEN QUIT
  249. 2420  GOTO 2560: REM   ^Q=QUIT TO MENU OR DISK
  250. 2430  IF I$ < > CHR$(3)  THEN 2450: REM   CLEAR ENTRIES (^C)
  251. 2440 I = 9: NEXT : FOR I = 1 TO 9:W$(D%,I) = "":I$(I) = "": NEXT : GOTO 2070: REM   BLANK ENTRIES
  252. 2450  IF I$ < > CHR$(5)  THEN 2500: REM   EDIT
  253. 2460  IF  LEN(I$(I)) >0  THEN I$(I) = "": REM   NULL ENTRY IF ^E
  254. 2470 ED = 1: GOSUB 1270: POKE 35,10: POKE 34,9: POKE 33,15: POKE 32,24: HOME : GOSUB 1730: TEXT : REM   GET DAY TO EDIT
  255. 2480  GOSUB 780: REM   PRINT NEW DATE HEADING
  256. 2490  GOTO 1990: REM   PROMPTS & INPUT
  257. 2500  PRINT  CHR$(7);: GOTO 2130: REM   CONTROL CHARACTERS?
  258. 2510  PRINT I$;: CALL  -868:I$(I) = I$(I) +I$: IF  LEN(I$(I)) >L%(I)  THEN I$(I) = "":I$ = "": HTAB 16: PRINT W$(D%,I) CHR$(7);: CALL  -868: HTAB 16: REM   DISPLAY AND BUILD INPUT STRING
  259. 2520  GOTO 2130
  260. 2530  REM  
  261. 2540  REM   ** INPUT COMPLETE **
  262. 2550  REM  
  263. 2560  GOSUB 740: GOSUB 1240
  264. 2570  VTAB 10: HTAB 11: PRINT "   ENTER MORE DATA": PRINT : HTAB 12: PRINT " SAVE DATA TO DISK": PRINT : HTAB 12: PRINT " BACK TO MAIN MENU"
  265. 2580  CALL CUR,10,18,11,31
  266. 2590  GOSUB 760: REM   LINE
  267. 2600  ON LINE GOTO 2630,2620
  268. 2610  GOTO 1310: REM   MAIN MENU
  269. 2620 FLAG = 1: GOTO 580: REM   SET WRITE FLAG-GO WRITE
  270. 2630 FLAG = 0: HOME : REM   CLEAR SCREEN
  271. 2640  IF D% < =  VAL(D$(M%))  THEN 2730: REM   STILL IN SAME MONTH
  272. 2650  GOSUB 740: GOSUB 1240: REM   HEADING & PROMPTS
  273. 2660  VTAB 9: HTAB 8: PRINT " ** END OF THE MONTH **": VTAB 12: HTAB 8: PRINT " SAVE--GO TO NEXT MONTH": HTAB 8: PRINT "    SAVE-STAY IN "M$(M%): HTAB 8: PRINT "     RETURN TO EDIT": HTAB 8: PRINT "   QUIT TO MAIN MENU"
  274. 2670  CALL CUR,12,15,8,31
  275. 2680 LINE =  PEEK(4): ON LINE GOTO 2690,2690,2710,2720
  276. 2690 FLAG = LINE +1: GOTO 580: REM   WRITE FILE
  277. 2700 M% = M% +1 -12 *(M% = 13):Y% = Y% +(M% = 1):D% = 1: GOSUB 750: POKE 960,2: GOTO 460: REM   INCREMENT MONTH, YEAR IF NECESSARY, MAKE FILE NAME,READ FILE
  278. 2710 D% =  VAL(D$(M%)): GOTO 1970: REM   EDIT/ENTRY
  279. 2720  GOTO 1310: REM   MAIN MENU
  280. 2730  GOSUB 740: GOSUB 780: GOSUB 770: GOTO 1990: REM   INPUT AGAIN
  281. 2740  GOSUB 780: GOTO 1970: REM   NEW MONTH FOR EDIT/ENTRY
  282. 2750  REM  
  283. 2760  REM   ** REPORTS **
  284. 2770  REM  
  285. 2780  TEXT : HOME 
  286. 2790 X$ = " WEATHER REPORTS ": VTAB 2: GOSUB 730: PRINT : PRINT L$
  287. 2800  VTAB 8:X$ = "SCREEN REPORTS": GOSUB 730: PRINT :X$ = "PRINTER REPORTS": GOSUB 730: PRINT :X$ = "MONTHLY STATISTICS": GOSUB 730: PRINT :X$ = "RETURN TO MAIN MENU": GOSUB 730
  288. 2810  GOSUB 1240: REM   PROMPTS
  289. 2820  CALL CUR,8,14,7,32: REM   T,B,L,R
  290. 2830  GOSUB 760: REM   GET 'LINE'
  291. 2840  ON LINE GOTO 2880,3610,4110,1310
  292. 2850  REM  
  293. 2860  REM   ** SCREEN DISPLAY **
  294. 2870  REM  
  295. 2880 X$ = "SCREEN DISPLAY"
  296. 2890  HOME : GOSUB 730: PRINT L$: PRINT 
  297. 2900  PRINT : PRINT "SELECT RANGE : ": VTAB 12: HTAB 1: PRINT "FROM:": VTAB 14: HTAB 1: PRINT "  TO:"
  298. 2910  GOSUB 1240:DC = 0: REM   ITEM COUNTER IN DISPLAY
  299. 2920 RP = 1: GOTO 1630: REM   SELECT MONTH
  300. 2930 M% = LINE:A% = M%:MS$ = M$(M%): VTAB 12: HTAB 7: PRINT M$(M%)
  301. 2940  GOTO 1690: REM   GET YEAR 'FROM'
  302. 2950 YS$ = I$:B% =  VAL(I$): VTAB 12: HTAB 11: PRINT "19"YS$
  303. 2960 RP = 2: GOSUB 1240: GOTO 1630: REM   GET MONTH 'TO'
  304. 2970 M% = LINE:C% = M%:ME$ = M$(M%): VTAB 14: HTAB 7: PRINT M$(M%)
  305. 2980  GOTO 1690: REM   GET YEAR 'TO'
  306. 2990 YE$ = I$:E% =  VAL(I$): VTAB 14: HTAB 11: PRINT "19"YE$
  307. 3000  VTAB 17: CALL  -958
  308. 3010 RP = 0: REM   CLEAR FLAG
  309. 3020  IF 12 *B% +A% >12 *E% +C%  THEN  VTAB 18: HTAB 14: FLASH : PRINT "INVALID RANGE": PRINT  CHR$(7);: NORMAL : GOSUB 720: ON PD GOTO 2890: GOTO 2880
  310. 3030  VTAB 19: HTAB 1: PRINT "RANGE OK? (Y/N) ";: POKE  -16368,0: GET A$: IF A$ = "N"  OR A$ =  CHR$(110)  THEN  ON PD GOTO 2890: GOTO 2880
  311. 3040  IF A$ < >"Y"  AND A$ < > CHR$(121)  THEN 3030
  312. 3050  IF PD  THEN PD = 0: RETURN : REM   PRINTER REPORTS ROUTINE RETURN
  313. 3060  HOME :D1 = 0:X$ = "SELECT DISPLAY PARAMETERS": GOSUB 730: PRINT L$
  314. 3070  VTAB 3: HTAB 6: INVERSE : PRINT "SELECTIONS": NORMAL 
  315. 3080  VTAB 18: HTAB 1: PRINT "SELECT UP TO 3 -- 'QUIT' AT ANY TIME"
  316. 3090  GOSUB 1240: FOR I = 1 TO 3
  317. 3100  FOR J = 1 TO 6: VTAB 7 +J: HTAB 25
  318. 3110  PRINT "  "RP$(J): NEXT 
  319. 3120  CALL CUR,8,13,26,40
  320. 3130 LINE =  PEEK(4)
  321. 3140  IF LINE = 6  THEN 3170: REM   QUIT
  322. 3150 RP%(I) = LINE
  323. 3160  VTAB 4 +I: HTAB 2: PRINT I"."RP$(RP%(I));: NEXT 
  324. 3170 LL = I -1: IF LINE = 6  AND I = 1  THEN I = 3: NEXT : GOTO 2780: REM   NO SELECTIONS
  325. 3180  CALL  -958: VTAB 15: HTAB 1: PRINT "SELECTIONS OKAY (Y/N)? ";: POKE  -16368,0: GET X$: IF X$ = "Y"  OR X$ =  CHR$(121)  THEN 3210
  326. 3190  IF X$ = "N"  OR X$ =  CHR$(110)  THEN 3060
  327. 3200  GOTO 3180
  328. 3210 I = LL: HOME : FOR J = 1 TO I:D1 = D1 +HD%(RP%(J)): NEXT : IF D1 < = 30  THEN 3230: REM   CHECK SPACE REQUIRED
  329. 3220  VTAB 10: HTAB 1: PRINT  CHR$(7);: PRINT "TOO MUCH DATA FOR SCREEN...RESELECT.": GOSUB 720: GOTO 3060
  330. 3230  VTAB 1: HTAB 8: INVERSE : PRINT "FROM:";: NORMAL : PRINT M$(A%)" "YS$"   ";: INVERSE : PRINT "TO:";: NORMAL : PRINT M$(C%)" "YE$:D1 = I: PRINT L$: VTAB 3: PRINT "  DATE    ";: FOR J = 1 TO I: PRINT HD$(RP%(J));: NEXT : HTAB 1: VTAB 4: PRINT "MM/DD/YY  ";:
  331. 3240  FOR J = 1 TO I: PRINT H2$(RP%(J));: NEXT : HTAB 1: VTAB 5: PRINT L$: POKE 34,5: HOME : REM   PRINT HEADINGS,CLEAR WINDOW
  332. 3250  VTAB 23: PRINT L$: PRINT "  <ESC> TO EXIT     <RTN> TO CONTINUE  ";: VTAB 6: POKE 35,22: HOME 
  333. 3260 FLAG = 3:Y% =  VAL(YS$):M% = A%
  334. 3270  GOSUB 750: REM   GET FILE NAME
  335. 3280  POKE 960,4: GOTO 470: REM   READ FILE
  336. 3290  FOR I = 1 TO  VAL(D$(M%)): REM   EACH DAY
  337. 3300 DC = DC +1: IF DC/16 =  INT(DC/16)  THEN  GOSUB 3550
  338. 3310 TB = 10: PRINT  TAB( 2 -(M% >9))M%"/" TAB( 5 -(I >9))I"/"Y%;
  339. 3320  FOR J = 1 TO D1: REM   # OF REPORTABLES
  340. 3330  HTAB TB: ON RP%(J) GOSUB 3380,3410,3440,3460,3480: REM   EACH WEATHER TYPE CHOICE
  341. 3340  HTAB TB:TB = TB +HD%(RP%(J)): NEXT J: PRINT 
  342. 3350  NEXT I: GOTO 3520: REM   INCREMENT
  343. 3360  REM  
  344. 3370  REM   PRINT SELECTED PARAMETERS ON THE SCREEN
  345. 3380  PRINT  SPC( 1 +( VAL(W$(I,1)) <100) +( VAL(W$(I,1)) <10) -( VAL(W$(I,1)) <0) -( VAL(W$(I,1)) < -9))W$(I,1); SPC( (W$(I,1) = ""));
  346. 3390  PRINT  SPC( 1 +( VAL(W$(I,2)) <100) +( VAL(W$(I,2)) <10) -( VAL(W$(I,2)) <0) -( VAL(W$(I,2)) < -9))W$(I,2);: IF J = 3  THEN  RETURN 
  347. 3400  PRINT  SPC( 4 +(W$(I,2) = ""));: RETURN 
  348. 3410  IF W$(I,3) = ""  THEN W$(I,3) = "     "
  349. 3420  IF W$(I,4) = ""  THEN W$(I,4) = "     "
  350. 3430  PRINT W$(I,3)"  "W$(I,4);: RETURN 
  351. 3440  PRINT  SPC( 1 +( VAL(W$(I,5)) <100) +( VAL(W$(I,5)) <10))W$(I,5) SPC( (W$(I,5) = ""));: IF J = 3  THEN  RETURN 
  352. 3450  RETURN 
  353. 3460  PRINT  SPC( ( VAL(W$(I,6)) <10))W$(I,6) SPC( 1 +( VAL(W$(I,7)) <10))W$(I,7);: IF J = 3  THEN  RETURN 
  354. 3470  PRINT  SPC( 1 +5 *(W$(I,6) = "") +5 *(W$(I,7) = ""));: RETURN 
  355. 3480  IF W$(I,8) = ""  THEN  PRINT  SPC( 3);: GOTO 3500
  356. 3490  PRINT  SPC( PD)W$(I,8) SPC( PD +( LEN(W$(I,8)) = 1))" " SPC(  VAL(W$(I,9)) <10)W$(I,9) SPC( PD *(12 - LEN(W$(I,8)) - LEN(W$(I,9))));: RETURN 
  357. 3500  PRINT  SPC( ( VAL(W$(I,9)) <100) +( VAL(W$(I,9)) <10))W$(I,9);: IF J = 3  THEN  RETURN 
  358. 3510  PRINT  SPC( 1 +2 *(W$(I,8) = "") +3 *(W$(I,9) = ""));: RETURN 
  359. 3520 M% = M% +1: IF M% = 13  THEN M% = 1:Y% = Y% +1
  360. 3530  IF F$ = ME$ +"." +YE$  THEN  GOSUB 3550: TEXT : GOTO 2880
  361. 3540  GOTO 3270: REM   READ NEXT MONTH
  362. 3550  POKE  -16368,0: GET X$: IF X$ =  CHR$(27)  THEN I =  VAL(D$(M%)): POP : TEXT : GOTO 2880: REM   EXIT
  363. 3560  IF X$ =  CHR$(13)  THEN  RETURN 
  364. 3570  PRINT  CHR$(7);: GOTO 3550
  365. 3580  REM  
  366. 3590  REM   ** PRINTER REPORT **
  367. 3600  REM  
  368. 3610 PD = 1: REM   USE FLAG FOR SAME ROUTINES AS SCREEN
  369. 3620 DC = 0: REM   LINE COUNTER
  370. 3630 X$ = "PRINTER REPORTS": GOSUB 2890
  371. 3640  HOME :X$ = "PRINT FULL DATA REPORT": GOSUB 730: PRINT L$
  372. 3650  GOSUB 1240
  373. 3660  VTAB 11: HTAB 13
  374. 3670  PRINT "  PRINT REPORT": HTAB 13: PRINT "      QUIT": REM   6 SPACES BEFORE QUIT
  375. 3680  CALL CUR,11,12,13,28
  376. 3690 LINE =  PEEK(4)
  377. 3700  IF LINE = 2  THEN  HOME : GOTO 3610: REM   QUIT
  378. 3710 I% = 5:D1 = I%
  379. 3720  TEXT : HOME : VTAB 10: HTAB 8: PRINT "<ESC> TO CANCEL PRINTING"
  380. 3730  FOR K = 1 TO 5:RP%(K) = K: NEXT : REM   SELECTED ALL DATA
  381. 3740  GOSUB 4070: PRINT  SPC( 29)"** WEATHER SUMMARY **": PRINT D$;"PR#0"; CHR$(13);:DC% = 1: REM    COUNT HEADING LINE
  382. 3750 FLAG = 4:Y% =  VAL(YS$):M% = A%
  383. 3760  GOSUB 750: REM   GET FILE NAME
  384. 3770  POKE 960,0: GOTO 470: REM   READ FILE
  385. 3780  IF DC% = 1  THEN  GOSUB 4070: GOSUB 4050:DC% = 0:DC = 6: REM   USED LINES
  386. 3790 DC = DC +1: REM   BREAK LINE FOR NEW MONTH
  387. 3800  FOR I = 1 TO  VAL(D$(M%)): REM   EACH DAY
  388. 3810 DC = DC +1: IF DC/62 =  INT(DC/62)  THEN DC = 5: PRINT : PRINT : PRINT : PRINT : PRINT : PRINT : GOSUB 4050
  389. 3820  REM   PRINTER DISPLAY
  390. 3830 PD = 1: PRINT  TAB( 2 -(M% >9))M%"/" TAB( 2 -(I >9))I"/"Y%"   ";
  391. 3840  PRINT  SPC( ( VAL(W$(I,1)) <100) +( VAL(W$(I,1)) <10) -( VAL(W$(I,1)) <0) -( VAL(W$(I,1)) < -9))W$(I,1);
  392. 3850  PRINT  SPC( 1 +( VAL(W$(I,2)) <100) +( VAL(W$(I,2)) <10) -( VAL(W$(I,2)) <0) -( VAL(W$(I,2)) < -9))W$(I,2);
  393. 3860  PRINT  SPC( PD *(8 - LEN(W$(I,1)) - LEN(W$(I,2))) +(( LEN(W$(I,2)) + LEN(W$(I,1))) >4) +(( LEN(W$(I,2)) + LEN(W$(I,1))) >5) -(( LEN(W$(I,1)) + LEN(W$(I,2))) <4) -(( LEN(W$(I,1)) + LEN(W$(I,2))) <3));
  394. 3870  PRINT W$(I,3)"  "W$(I,4) SPC( PD *(11 - LEN(W$(I,3)) - LEN(W$(I,4))));
  395. 3880  PRINT  SPC( 5 +( VAL(W$(I,5)) <100) +( VAL(W$(I,5)) <10))W$(I,5) SPC( 7 +3 *((W$(I,5) = "")));
  396. 3890  PRINT W$(I,6)"  "W$(I,7) SPC( PD *(11 - LEN(W$(I,6)) - LEN(W$(I,7))));
  397. 3900  IF W$(I,8) = ""  THEN  PRINT  SPC( 3);: GOTO 3920
  398. 3910  PRINT  SPC( PD)W$(I,8) SPC( 4 - LEN(W$(I,8)))
  399. 3920  PRINT  SPC( ( VAL(W$(I,9)) <100) +( VAL(W$(I,9)) <10))W$(I,9);
  400. 3930  PRINT 
  401. 3940  IF  PEEK( -16384) = 155  THEN  PRINT L$L$: PRINT "PRINT CANCELLED :": PRINT :I =  VAL(D$(M%)): NEXT : GOTO 4000
  402. 3950  NEXT I: REM   INCREMENT
  403. 3960 PD = 0
  404. 3970 M% = M% +1: IF M% = 13  THEN M% = 1:Y% = Y% +1
  405. 3980  IF F$ = ME$ +"." +YE$  THEN  PRINT : PRINT L$L$: PRINT "END OF REPORT:": FOR I = 1 TO 62 -DC: PRINT : NEXT : GOTO 4000
  406. 3990  GOTO 3760: REM   READ NEXT FILE
  407. 4000  PRINT D$;"PR#0": GOTO 3610
  408. 4010  REM  
  409. 4020  REM   PRINT HEADING
  410. 4030  REM  
  411. 4040  PRINT  SPC( 30)"** WEATHER SUMMARY **"
  412. 4050  PRINT L$L$: PRINT "  DATE  ";: FOR J = 1 TO D1: PRINT RP$(RP%(J));: NEXT : PRINT : PRINT "MM/DD/YY ";:
  413. 4060  FOR J = 1 TO D1: PRINT HR$(RP%(J));: NEXT : PRINT : PRINT L$L$: RETURN : REM   PRINT HEADINGS
  414. 4070  PRINT D$;"PR#1": PRINT  CHR$(9)"80N": RETURN 
  415. 4080  REM  
  416. 4090  REM   MONTHLY STATS
  417. 4100  REM  
  418. 4110 W1 = 0:H = 0:MS = 1: TEXT : HOME :X$ = "**  MONTHLY STATISTICS  **": GOSUB 730: REM   HEADING AND STATS FLAG
  419. 4120  FOR I = 1 TO 8:W%(I) = 0: NEXT 
  420. 4130  PRINT L$: GOSUB 1240: REM   HEADING/INSTRUCTIONS
  421. 4140  VTAB 8: HTAB 1: PRINT "SELECT MONTH:"
  422. 4150  GOSUB 1630: REM   GET MONTH/YEAR
  423. 4160  IF F$ = M$(M%) +"." + STR$(Y%)  THEN 4200: REM   DON'T READ AGAIN
  424. 4170  GOSUB 750: REM   MAKE FILE NAME
  425. 4180 FLAG = 5: REM   READ FILE FLAG
  426. 4190  POKE 960,4: GOSUB 460: REM   READ FILE
  427. 4200  HOME : VTAB 8: HTAB 3: FLASH : PRINT "**";: NORMAL : PRINT " PLEASE WAIT -- COLLATING DATA ";: FLASH : PRINT "**": NORMAL 
  428. 4210 V = 1:HI$ = "-30":LW$ = "150": GOSUB 4700:MR$(1) = HI$:MR$(4) = LW$: REM   GET HI,LO-HI TEMPS
  429. 4220  GOSUB 4810:MR$(5) =  STR$( INT(SUM/COUNT)): REM   AVG HI
  430. 4230 V = 2:HI$ = "-30":LW$ = "150": GOSUB 4700:MR$(3) = HI$:MR$(2) = LW$: REM   GET LO, HI-LO TEMPS
  431. 4240  GOSUB 4810:MR$(6) =  STR$( INT(SUM/COUNT)): REM   AVG LO
  432. 4250 V = 3:HI$ = "28.00": GOSUB 4700:MR$(7) = HI$: REM   HI BAROMETER
  433. 4260  GOSUB 4810:MR$(9) =  STR$( INT((SUM/COUNT) *100)/100): REM   AVG HI
  434. 4270 V = 4:LW$ = "35.00": GOSUB 4700:MR$(8) = LW$: REM   LO BAROMETER
  435. 4280  GOSUB 4810:MR$(10) =  STR$( INT((SUM/COUNT) *100)/100): REM   AVG LO
  436. 4290 V = 5: GOSUB 4810:MR$(11) =  STR$( INT(SUM/COUNT)): REM   AVG CLDY
  437. 4300  FOR K = 1 TO 2:V = 5 +K: GOSUB 4810:MR$(K +11) =  STR$(SUM): NEXT : REM   RAIN/SNOW TOTALS
  438. 4310  FOR I = 1 TO  VAL(D$(M%)): IF  LEN(W$(I,8)) = 1  THEN W$(I,8) = W$(I,8) +" "
  439. 4320  IF  LEN(W$(I,8)) = 0  THEN  NEXT I: GOTO 4360
  440. 4330  FOR II = 1 TO 8: IF  MID$ (DW$,(2 *II) -1,2) = W$(I,8)  THEN W1 = II:II = 8: NEXT II: GOTO 4350
  441. 4340  NEXT II
  442. 4350 W%(W1) = W%(W1) +1: NEXT I
  443. 4360 W% = 1:H = W%(1): FOR I = 2 TO 8: IF W%(I) >H  THEN H = W%(I):W% = I: NEXT : GOTO 4380: REM   H=# OF DAYS, W%=DIRECTION
  444. 4370  NEXT 
  445. 4380 MR$(14) =  MID$ (DW$,(2 *W%) -1,2)
  446. 4390 V = 9: GOSUB 4810:MR$(15) =  STR$( INT(SUM/COUNT))
  447. 4400  FOR I = 1 TO 13: IF MR$(I) = ""  THEN MR$(I) = "***"
  448. 4410  IF (I = 5  OR I = 6  OR I = 9  OR I = 10)  AND  VAL(MR$(I)) = 0  THEN MR$(I) = "***"
  449. 4420  NEXT 
  450. 4430  IF  VAL(MR$(15)) = 0  THEN MR$(15) = "***":H = 0: REM   NO WIND/NO DIRECTION!
  451. 4440  IF MR$(15) = "***"  THEN MR$(14) = "***": REM   NO/WIND/NO DIRECTION
  452. 4450  HOME : VTAB 2:X$ = "** SUMMARY DATA DISPLAY **": GOSUB 730: PRINT L$: GOSUB 1240
  453. 4460  VTAB 8: HTAB 1: PRINT "SEND DATA TO:": VTAB 11: HTAB 20: PRINT " MONITOR": HTAB 20: PRINT " PRINTER": HTAB 20: PRINT "  QUIT";
  454. 4470  CALL CUR,11,13,20,28
  455. 4480 LINE =  PEEK(4)
  456. 4490  HOME 
  457. 4500  ON LINE GOTO 4550,4510,4110
  458. 4510  PRINT : PRINT D$;"PR#1"
  459. 4520  REM  
  460. 4530  REM   MONITOR DISPLAY
  461. 4540  REM  
  462. 4550  TEXT : HOME :X$ = "* MONTHLY WEATHER SUMMARY -" +M$(M%) +" 19" + STR$(Y%) +" *": GOSUB 730: PRINT L$
  463. 4560  PRINT "HIGH TEMPERATURE = "MR$(1)" DEGREES.": PRINT "LOW  TEMPERATURE = "MR$(2)" DEGREES.": PRINT "LOWEST  HI TEMP  = "MR$(4)" DEGREES.": PRINT "HIGHEST LO TEMP  = "MR$(3)" DEGREES."
  464. 4570  PRINT "AVERAGE HIGH TEMPERATURE = "MR$(5)" DEGREES.": PRINT "AVERAGE  LO  TEMPERATURE = "MR$(6)" DEGREES."
  465. 4580  PRINT : PRINT "HIGHEST PRESSURE = "MR$(7)" INCHES.": PRINT "LOWEST  PRESSURE = "MR$(8)" INCHES.": PRINT "AVERAGE HI PRESS.= "MR$(9)" INCHES.": PRINT "AVERAGE LO PRESS.= "MR$(10)" INCHES.": PRINT 
  466. 4590  PRINT "TOTAL RAINFALL = "MR$(12)" INCHES.": PRINT "TOTAL SNOWFALL = "MR$(13)" INCHES.": PRINT 
  467. 4600  PRINT "AVERAGE CLOUDINESS = "MR$(11)"%"
  468. 4610  PRINT : PRINT "PREVAILING WIND FROM THE "MR$(14)" ("H" DAYS)"
  469. 4620  PRINT "AVERAGE WIND SPEED = "MR$(15)" MPH."
  470. 4630  PRINT L$
  471. 4640  IF LINE = 2  THEN  HOME : PRINT : PRINT D$;"PR#0": VTAB 22:LINE = 0: GOTO 4630
  472. 4650  VTAB 24: PRINT "PRESS <RETURN> TO CONTINUE...";: POKE  -16368,0: GET X$: GOTO 4450
  473. 4660  REM  
  474. 4670  REM   HIGHEST VALUE
  475. 4680  REM   V=DATA ITEM (TEMP,WIND,ETC)
  476. 4690  REM  
  477. 4700 X% = 0: FOR I = 1 TO  VAL(D$(M%))
  478. 4710  IF W$(I,V) = ""  THEN  NEXT : GOTO 4750
  479. 4720  IF  VAL(W$(I,V)) > =  VAL(HI$)  THEN HI$ = W$(I,V)
  480. 4730  IF  VAL(W$(I,V)) < =  VAL(LW$)  THEN LW$ = W$(I,V)
  481. 4740 X% = 1: NEXT : REM   AT LEAST ONE NON NULL-VALUE
  482. 4750  IF X% = 0  THEN LW$ = "":HI$ = ""
  483. 4760  REM   LOWEST VALUE=LW$--HIGHEST VALUE=HI$
  484. 4770  RETURN 
  485. 4780  REM  
  486. 4790  REM   SUM OF VALUES
  487. 4800  REM  
  488. 4810 X% = 0:SUM = 0:COUNT = 0
  489. 4820  FOR I = 1 TO  VAL(D$(M%))
  490. 4830  IF W$(I,V) = ""  THEN  NEXT : GOTO 4860
  491. 4840 COUNT = COUNT +1:SUM = SUM + VAL(W$(I,V))
  492. 4850 X% = 1: NEXT : REM   AT LEAST ONE NON-NULL VALUE
  493. 4860  IF COUNT = 0  THEN COUNT = 1: REM   PREVENT DIVISION BY ZERO
  494. 4870  IF X% = 0  THEN SUM = 0: REM   NO VALUES
  495. 4880  RETURN : REM   SUM=TOTAL OF VALUES
  496. 4890  TEXT : HOME : VTAB 10: PRINT "CONFIRM EXIT WITH 'Y'...";: POKE  -16368,0: GET X$: IF X$ = "Y"  OR X$ =  CHR$(121)  THEN  TEXT : HOME : END 
  497. 4900  GOTO 1310: REM   MAIN MENU
  498. 4910  REM  
  499. 4920  REM   DATA STATEMENTS
  500. 4930  REM  
  501. 4940  DATA   JAN,31,FEB,29,MAR,31,APR,30,MAY,31,JUN,30,JUL,31,AUG,31,SEP,30,OCT,31,NOV,30,DEC,31,QUIT,0: REM   M$(),D$()
  502. 4950  DATA   HI  TEMP  (F),LO  TEMP  (F),HI  BAROMETER,LO  BAROMETER,% CLOUDY,RAIN (INCHES),SNOW (INCHES),WIND DIRECTION,WIND VELOCITY
  503. 4960  DATA   3,3,5,5,3,4,5,2,3
  504. 4970  DATA   " TEMPERATURE ","   PRESSURE  ","  CLOUDINESS  ","PRECIPITATION","  WIND SPEED ","     QUIT   "
  505. 4980  DATA   13,11,12,14,12
  506. 4990  DATA   " TEMP.   "," PRESSURE    ","CLDY ","  PRECIP.   ","WIND   ": REM   TEMP SPACES=3,PRESS SPACES=4,PRECIP SPACES=3,WIND SPACES=3
  507. 5000  DATA   9,13,5,12,7
  508. 5010  DATA   "HI - LO  "," HI -- LO    "," %   ","RAIN  SNOW  ","D  V   ": REM   SPACES=1,1,2,1,1,1,4,1,3,2,2,2,3
  509. 5020  DATA   "  HI -- LO   ","  HI -- LO   ","      %       "," RAIN--SNOW  "," DIR - VEL   ": REM   SPACES = 2,1,1,3,2,1,1,3,6,7,1,2,1,1,1,3
  510. 5030  REM  
  511. 5040  REM   ONERR ROUTINES
  512. 5050  REM  
  513. 5060  IF  PEEK(222) = 6  THEN  TEXT : HOME : VTAB 10: PRINT "BINARY FILE NOT FOUND ON DISK...": PRINT : PRINT  TAB( 10)"CANNOT CONTINUE": END : REM   NO CURSOR FILE
  514. 5070  GOTO 5160: REM   OTHER ERROR
  515. 5080  IF  PEEK(960) < >2  THEN 5140
  516. 5090  IF  PEEK(222) = 6  THEN  VTAB 10: HTAB 1: PRINT "             CREATING FILE             ": PRINT D$;"OPEN "F$: PRINT D$;"WRITE"F$: REM   13 SPACES BEFORE AND AFTER 'CREATING FILE'
  517. 5100  IF  PEEK(222) < >6  THEN 5140
  518. 5110  PRINT D$(M%): FOR I = 1 TO  VAL(D$(M%)): FOR J = 1 TO 9: PRINT "": NEXT : NEXT 
  519. 5120  PRINT D$: PRINT D$;"CLOSE"F$: POKE 216,0: GOTO 490: REM   CREATE NEW FILE
  520. 5130  REM  
  521. 5140  REM   DISK ERROR HANDLING
  522. 5150  REM  
  523. 5160  TEXT : HOME :ER =  PEEK(222): POKE 216,0
  524. 5170  IF ER = 4  THEN X$ = "DISK WRITE PROTECTED":Y$ = "REMOVE WRITE-PROTECT TAB": GOTO 5220
  525. 5180  IF ER = 6  THEN X$ = "FILE '" +F$ +"' DOES NOT EXIST":Y$ = "CREATE FILE IN 'ENTER/EDIT WEATHER DATA'":F$ = "": GOTO 5220
  526. 5190  IF ER = 8  THEN X$ = "DISK I/O PROBLEM":Y$ = "CHECK DRIVE DOOR OR DISK POSITION": GOTO 5220
  527. 5200  IF ER = 9  THEN X$ = "THIS DISK IS FULL":Y$ = "INSERT OTHER DISK OF CHANGE DRIVES": GOTO 5220
  528. 5210  VTAB 10: PRINT "ERROR #"; PEEK(222)" IN LINE "; PEEK(219) *256 + PEEK(218): PRINT : PRINT "TAKE APPROPRIATE ACTION ": GOTO 5240
  529. 5220  PRINT  TAB( 10)"*** DISK ERROR ***": PRINT L$
  530. 5230  VTAB 6: INVERSE : PRINT "PROBLEM:": NORMAL : PRINT : PRINT X$: VTAB 13: INVERSE : PRINT "POSSIBLE SOLUTION:": NORMAL : PRINT : PRINT Y$
  531. 5240  GOSUB 720
  532. 5250  ON  PEEK(960) GOTO 5270,1310,1580,1310,1460
  533. 5260  GOTO 1310: REM   MAIN MENU
  534. 5270  POKE 960,0: RUN 
  535. 5280 ER =  PEEK(222): IF ER = 6  THEN 5300
  536. 5290  GOTO 5190
  537. 5300  VTAB 10: HTAB 1: PRINT "WS.GRAPHICS PROGRAM NOT ON THIS DISK"
  538. 5310  VTAB 12: PRINT  TAB( 11)"TRY AGAIN (Y/N)";: INPUT G$
  539. 5320  IF G$ < >"Y"  AND G$ < >"N"  THEN  VTAB 11: CALL  -985: PRINT  CHR$(7): GOTO 5310
  540. 5330  IF G$ = "Y"  THEN 1440
  541. 5340  GOTO 1310