home *** CD-ROM | disk | FTP | other *** search
/ Nibble Magazine / nib28a.dsk / JULY.1986 / WS.GRAPHICS.bas < prev   
BASIC Source File  |  2023-02-26  |  23KB  |  439 lines

  1. 1  REM  **********************
  2. 2  REM  * WS.GRAPHICS        *
  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) < >64  THEN  POKE 103,1: POKE 104,64: POKE 16384,0: PRINT  CHR$(4)"RUN WS.GRAPHICS": REM  RELOCATE PROGRAM ABOVE PG. 1 GRAPHICS
  10. 30  REM  ****
  11. 40  REM  VARIABLES
  12. 50  REM  **
  13. 60  REM  LOC 960 HOLDS ERROR INDEX 1-6 FOR ONERR HANDLING
  14. 70 D$ =  CHR$(4): POKE 230,32:DV$ = ",D1"
  15. 80  FOR I = 1 TO 39:L$ = L$ +"-": NEXT 
  16. 90 OP$ = "OPEN ":CL$ = "CLOSE ":RD$ = "READ ":WR$ = "WRITE ":U$ = "UNLOCK ":BL$ = "BLOAD ":BS$ = "BSAVE ":VF$ = "VERIFY ":AD$ = ",A$2000":LN$ = ",L$2000"
  17. 100 M1$ = "PLOT DAILY PARAMETERS":M2$ = "PLOT MONTHLY PARAMETERS":M3$ = "CONFIGURE  SYSTEM":M4$ = "GRAPHIC UTILITIES":M5$ = "RUN  WEATHER.STATION":M6$ = " SELECT DISK DRIVE":M7$ = "CATALOG DISK":M8$ = "QUIT"
  18. 110 UL$ =  CHR$(95) + CHR$(95): REM  UNDERLINE
  19. 120 CUR = 768: REM  CURSOR ROUTINE ADDRESS
  20. 130  DIM M$(13),D$(13)
  21. 140  DIM W$(31,9)
  22. 150  REM 
  23. 160  REM  ** DEFINED FUNCTIONS
  24. 170  REM 
  25. 180  DEF  FN Y(Y) = (150 -A2) *((HI -Y)/(HI -LO)) +A2: REM  SCALE VALUE FOR PLOT VALUE
  26. 190  DEF  FN X(A) = 7 *A +B: REM  X COORD FOR PLOT
  27. 200  DEF  FN W(W) = B +1 +W *((D -B)/(X -(X >1))): REM  HORIZONTAL POINT FOR MONTH PLOTS
  28. 210  REM 
  29. 220  REM  HEADINGS,MENUS,ETC
  30. 230  REM 
  31. 240  FOR I = 1 TO 13: READ M$(I),D$(I): NEXT : REM  MONTHS AND DAYS
  32. 250  FOR I = 1 TO 9: READ RP$(I): NEXT : REM  PLOT PARAMETER OPTIONS
  33. 260  FOR I = 1 TO 9: READ TIC%(I): NEXT : REM  # OF SCALE DIVISIONS
  34. 270  REM  READ IN BINARY FILES
  35. 280  POKE 960,1: ONERR  GOTO 3960
  36. 290  PRINT D$BL$"CURSOR.BAR.III": REM  A$0300
  37. 300  PRINT D$BL$"WEATHER.SHAPES": REM  A$0800
  38. 310  POKE 232,3: POKE 233,8: REM  SHAPES ADDRESS ($0803)
  39. 320  REM 
  40. 330  REM  ** CONFIGURE **
  41. 340  REM 
  42. 350 F$ = "WS.CONFIG"
  43. 360  POKE 960,2: ONERR  GOTO 4180
  44. 370  PRINT D$U$F$DV$
  45. 380  PRINT D$OP$F$
  46. 390  PRINT D$RD$F$
  47. 400  INPUT PT: INPUT GP: INPUT GP$: INPUT CL
  48. 410  PRINT D$CL$
  49. 420  POKE 216,0: POKE 960,0
  50. 430  GOTO 1130: REM  MAIN MENU
  51. 440  REM 
  52. 450  REM  SUBROUTINES
  53. 460  REM 
  54. 470  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": PRINT "   UP OR DOWN ARROW KEYS MAY BE USED"
  55. 480  VTAB 24: PRINT L$;: RETURN 
  56. 490  VTAB 3: HTAB 1: PRINT "PRINTER IN SLOT #1": RETURN 
  57. 500  VTAB 3: HTAB 1: PRINT "NO PRINTER        ": RETURN 
  58. 510  VTAB 3: HTAB 21: PRINT "WITH GRAPHICS DUMP": RETURN 
  59. 520  VTAB 3: HTAB 21: PRINT "  NO GRAPHICS DUMP": RETURN 
  60. 530  VTAB 5: HTAB 21: PRINT "DUMP STRING="S$;: CALL  -868: VTAB 6: HTAB 1: PRINT L$: RETURN 
  61. 540  VTAB 5: HTAB 21: CALL  -868: RETURN 
  62. 550  VTAB 5: HTAB 1: PRINT "COLOR MONITOR     ": RETURN 
  63. 560  VTAB 5: HTAB 1: PRINT "MONOCHROME MONITOR": RETURN 
  64. 570 S$ = "": FOR I = 1 TO  LEN(GP$): IF  ASC( MID$ (GP$,I,1)) <32  THEN S$ = S$ +"^" + CHR$( ASC( MID$ (GP$,I,1)) +64): NEXT : GOTO 590
  65. 580 S$ = S$ + MID$ (GP$,I,1): NEXT 
  66. 590  RETURN 
  67. 600  HOME : PRINT  TAB( 12)"SELECT DISK DRIVE": PRINT L$: GOSUB 470: VTAB 6: HTAB 13: PRINT "ACTIVE DRIVE=";: INVERSE : PRINT  RIGHT$(DV$,1): NORMAL 
  68. 610  VTAB 11: HTAB 16: PRINT "DRIVE #1": HTAB 16: PRINT "DRIVE #2":
  69. 620  CALL CUR,11,12,15,24:LINE =  PEEK(4):DV$ = ",D" + STR$(LINE):F$ = "": RETURN : REM  NEW DRIVE/NULL FILE NAME
  70. 630  VTAB 21: CALL  -958: VTAB 21: PRINT L$;: VTAB 22: HTAB 1: PRINT "    INPUT LAST TWO DIGITS OF YEAR": PRINT "  ";: INVERSE : PRINT "RETURN";: NORMAL : PRINT " TO QUIT WITHOUT A SELECTION": CALL  -958
  71. 640  PRINT L$;: RETURN 
  72. 650  REM 
  73. 660  REM  GET MONTH
  74. 670  REM 
  75. 680  GOSUB 470: REM  BOTTOM PROMPT
  76. 690  FOR I = 1 TO 12: VTAB 4 +I: HTAB 18: PRINT "  ";M$(I): NEXT : PRINT  TAB( 18)" ";M$(13): VTAB 5: HTAB 1
  77. 700  CALL CUR,5,17,19,23
  78. 710 LINE =  PEEK(4): RETURN 
  79. 720  REM 
  80. 730  REM  GET YEAR
  81. 740  REM 
  82. 750  GOSUB 630: POKE 33,15: POKE 32,23: POKE 34,11: POKE 35,13: REM  INPUT WINDOW
  83. 760  HOME 
  84. 770  VTAB 12: PRINT "YEAR "UL$" (19"UL$")";: HTAB 6
  85. 780  INPUT "";I$: IF I$ = ""  THEN  PRINT  CHR$(7);: GOTO 1130
  86. 790  IF  VAL(I$) <80  OR  VAL(I$) >99  THEN  PRINT  CHR$(7);: GOTO 760
  87. 800  HOME : TEXT : RETURN 
  88. 810  POKE  -16368,0: VTAB V: HTAB 1: PRINT "PRESS <RETURN> TO CONTINUE...";: GET X$: PRINT : RETURN 
  89. 820  IF LINE = 13  THEN  POP : HOME : GOTO 1130: REM  'QUIT' CHOICE MADE-BACK TO MAIN MENU
  90. 830  RETURN 
  91. 840  IF A$ = ""  THEN  RETURN 
  92. 850  FOR I = 1 TO  LEN(A$): DRAW  ASC( MID$ (A$,I,1)) -31 AT H +(I *6),V: NEXT : RETURN 
  93. 860 H = 64:V = 185:H1 = 155: HCOLOR= 0: IF  LEN(A$) <15  THEN H = 101:H1 = 75
  94. 870  FOR I = 0 TO 6: HPLOT H,V +I TO H +H1,V +I: NEXT : RETURN 
  95. 880  PRINT D$"PR#0": TEXT : HOME :ER =  PEEK(222): POKE 216,0: RETURN 
  96. 890  IF Y1(J) >190  THEN Y1(J) =  FN Y(LO)
  97. 900  RETURN 
  98. 910  IF Y2(J) >190  THEN Y2(J) =  FN Y(LO)
  99. 920  RETURN 
  100. 930  REM 
  101. 940  REM  DISK ACCESS
  102. 950  REM 
  103. 960  POKE 960,3: ONERR  GOTO 4000
  104. 970  HOME : VTAB 10: PRINT  TAB( 4)"READING FILES - DO NOT INTERRUPT": PRINT 
  105. 980  PRINT D$U$F$DV$
  106. 990  PRINT D$OP$F$
  107. 1000  PRINT D$RD$F$
  108. 1010  INPUT D$(M%)
  109. 1020  FOR I = 1 TO  VAL(D$(M%))
  110. 1030  FOR J = 1 TO 9
  111. 1040  INPUT W$(I,J)
  112. 1050  NEXT 
  113. 1060  NEXT 
  114. 1070  PRINT D$CL$
  115. 1080  POKE 216,0: POKE 960,0: REM  CLEAR ONERR
  116. 1085 HK = 0: FOR I = 1 TO  VAL(D$(M%)):HK = ( VAL(W$(I,6)) >HK) * VAL(W$(I,6)) +( VAL(W$(I,6)) < = HK) *HK: NEXT :HK = ( INT(HK/6) *6) +( INT(HK/6) < >HK/6) *6:S1 = HK/12
  117. 1087 HH = 0: FOR I = 1 TO  VAL(D$(M%)):HH = ( VAL(W$(I,7)) >HH) * VAL(W$(I,7)) +( VAL(W$(I,7)) < = HH) *HH: NEXT :HH = ( INT(HH/3) *3) +( INT(HH/3) < >HH/3) *6:S2 = HH/6
  118. 1088  IF PL = 2  THEN HH = 72:S2 = HH/6:HK = 30:S1 = HK/12
  119. 1090  ON PL GOTO 1680,2200,1130: REM  PL=MENU SELECTION
  120. 1100  REM 
  121. 1110  REM  MAIN MENU
  122. 1120  REM 
  123. 1130  TEXT : HOME : PRINT  TAB( 6)"WEATHER GRAPHICS - MAIN MENU": PRINT L$
  124. 1140  VTAB 6: HTAB 10: PRINT M1$: VTAB 8: HTAB 9: PRINT M2$: VTAB 10: HTAB 12: PRINT M3$
  125. 1150  VTAB 12: HTAB 12: PRINT M4$
  126. 1160  VTAB 14: HTAB 11: PRINT M5$
  127. 1170  VTAB 16: HTAB 11: PRINT M6$
  128. 1180  VTAB 18: HTAB 15: PRINT M7$: VTAB 20: HTAB 18: PRINT M8$
  129. 1190  GOSUB 470
  130. 1200  CALL CUR,6,20,8,32
  131. 1210 LINE = ( PEEK(4) +1)/2
  132. 1220 PL = LINE: REM  FLAG FOR PLOT ROUTINE
  133. 1230  ON LINE GOTO 1310,1730,2420,3470,1260,1250,1280
  134. 1240  TEXT : HOME : VTAB 11: HTAB 13: PRINT "SESSION OVER": END 
  135. 1250  GOSUB 600: GOTO 1130: REM  CHANGE DRIVE?
  136. 1260  HOME : POKE 960,3: ONERR  GOTO 4220
  137. 1270  PRINT : PRINT D$VF$"WEATHER.STATION"DV$: POKE 216,0: PRINT : PRINT D$"RUN WEATHER.STATION": REM  RESET LOAD ADDRESS,RUN WEATHERSTATION
  138. 1280  POKE 960,6: ONERR  GOTO 4000
  139. 1290  HOME : PRINT :CA$ = "CATALOG":PR = 4 *( PEEK(48896) = 76): PRINT  CHR$(4); LEFT$(CA$,7 -PR);DV$: GET CH$: POKE 216,0: POKE 960,0: GOTO 1130
  140. 1300  REM  DAILY PLOTTING
  141. 1310  HOME : PRINT  TAB( 10)M1$
  142. 1320  PRINT L$
  143. 1330  VTAB 6: HTAB 1: PRINT "CHOOSE MONTH": PRINT "TO GRAPH :"
  144. 1340  GOSUB 680: REM  GET MONTH
  145. 1350  IF LINE = 13  THEN  HOME : GOTO 1130: REM  GOTO MAIN MENU
  146. 1360 M% = LINE: REM  # OF MONTH 
  147. 1370 MS$ = M$(M%): REM  STARTING MONTH
  148. 1380  REM 
  149. 1390  REM  GET YEAR
  150. 1400  REM 
  151. 1410  GOSUB 750: REM  GET YEAR
  152. 1420 Y% =  VAL(I$):YS$ = I$: REM  START YEAR
  153. 1430  HOME 
  154. 1440  REM 
  155. 1450  REM  SELECT PLOT PARMS
  156. 1460  REM 
  157. 1470  PRINT  TAB( 9)"SELECT PLOT PARAMETERS": PRINT L$
  158. 1480  VTAB 3: HTAB 6: INVERSE : PRINT "SELECTIONS": NORMAL 
  159. 1490  VTAB 20: HTAB 3: PRINT "SELECT ANY 2 -- 'QUIT' AT ANY TIME"
  160. 1500  GOSUB 470
  161. 1510  FOR I = 1 TO 2
  162. 1520  FOR J = 1 TO 9: VTAB 7 +J: HTAB 22: PRINT "  "RP$(J): NEXT 
  163. 1530  CALL CUR,8,16,23,35
  164. 1540 LINE =  PEEK(4)
  165. 1550  IF LINE = 9  THEN  HOME : GOTO 1580: REM  QUIT
  166. 1560 RP%(I) = LINE
  167. 1570  VTAB 4 +I: HTAB 2: PRINT I"."RP$(RP%(I));: NEXT 
  168. 1580  IF LINE = 9  AND I = 1  THEN I = 2: NEXT : GOTO 1130: REM  NO SELECTIONS
  169. 1590 P = I -1: REM  # OF SELECTIONS
  170. 1600  VTAB 7: CALL  -958
  171. 1610  VTAB 11: HTAB 4: PRINT "SELECTIONS OKAY (Y/N)? ";: POKE  -16368,0: GET X$: IF X$ = "Y"  OR X$ =  CHR$(121)  THEN 1640
  172. 1620  IF X$ = "N"  OR X$ =  CHR$(110)  THEN  HOME : GOTO 1470
  173. 1630  GOTO 1600
  174. 1640  IF PL = 2  THEN  VTAB 20: HTAB 1: PRINT "PRESSING <ESC> WILL ABORT ROUTINE...": CALL  -958:V = 23: GOSUB 810
  175. 1650  ON PL GOTO 1660,2910
  176. 1660  REM  THIS LINE REMOVED
  177. 1670 F$ = MS$ +"." +YS$: GOTO 960
  178. 1680  GOTO 2910: REM  PLOT GRAPHICS ROUTINE
  179. 1690  REM 
  180. 1700  REM  MONTHLY PLOT
  181. 1710  REM 
  182. 1720  REM 
  183. 1730  TEXT : HOME : REM  MONTH TO MONTH
  184. 1735  IF PL = 2  THEN HK = 30:S1 = HK/12:HH = 72:S2 = HH/6
  185. 1740  PRINT  TAB( 10)"PLOT MONTHLY AVERAGES": PRINT L$: PRINT 
  186. 1750  PRINT : PRINT "SELECT RANGE : ": VTAB 12: HTAB 1: PRINT "FROM:": VTAB 14: HTAB 1: PRINT "  TO:"
  187. 1760  GOSUB 680: REM  GET MONTH "FROM"
  188. 1770  GOSUB 820: REM  CHECK 'QUIT'
  189. 1780 M% = LINE:A% = M%:MS$ = M$(M%): VTAB 12: HTAB 7: PRINT M$(M%)
  190. 1790  REM  GET YEAR "FROM"
  191. 1800  GOSUB 750
  192. 1810  GOSUB 820
  193. 1820 YS$ = I$:B% =  VAL(I$): VTAB 12: HTAB 11: PRINT "19"YS$
  194. 1830  REM  GET MONTH "TO"
  195. 1840  GOSUB 680
  196. 1850  GOSUB 820
  197. 1860 M% = LINE:C% = M%:ME$ = M$(M%): VTAB 14: HTAB 7: PRINT M$(M%)
  198. 1870  REM  GET YEAR "TO"
  199. 1880  GOSUB 750
  200. 1890  GOSUB 820
  201. 1900 YE$ = I$:E% =  VAL(I$): VTAB 14: HTAB 11: PRINT "19"YE$
  202. 1910  VTAB 18: CALL  -958
  203. 1920 X = 1 +12 *E% +C% -B% *12 -A%: IF X >24  THEN 1950: REM  LIMIT DISPLAY TO 24 MONTHS
  204. 1930  IF 12 *B% +A% >12 *E% +C%  THEN 1950: REM  RANGE INCORRECT
  205. 1940  GOTO 1960: REM  SKIP ERROR MSG
  206. 1950  VTAB 18: HTAB 7: FLASH : PRINT "INVALID OR TOO LARGE RANGE": PRINT  CHR$(7);: NORMAL :V = 20: GOSUB 810: GOTO 1730: REM  CHECK RANGE TO/FROM
  207. 1960  VTAB 19: CALL  -958: PRINT "RANGE OK? (Y/N) ";: POKE  -16368,0: GET X$: IF X$ = "N"  OR X$ =  CHR$(110)  THEN 1730: REM  CHOOSE AGAIN <
  208. 1970  HOME : GOTO 1470: REM  SELECT PARAMETERS
  209. 1980  REM 
  210. 1990  REM  A%=START MONTH #
  211. 2000  REM  B%=START YEAR
  212. 2010  REM  C%=END MONTH #
  213. 2020  REM  E%=END YEAR
  214. 2030  REM  MS$=START MONTH
  215. 2040  REM  ME$=END MONTH
  216. 2050  REM  YS$=YEAR START
  217. 2060  REM  YE$=YEAR END
  218. 2070  REM 
  219. 2080 QT = 0:H = 0:W = 0:V = C +10:T = A%: REM  ZERO HORIZONTAL AND COUNTERS
  220. 2090  FOR Z = T TO 12: IF W = X  THEN Z = 12: NEXT : GOTO 2120
  221. 2100 A$ =  LEFT$(M$(Z),1)
  222. 2110  DRAW  ASC(A$) -31 AT  FN W(W),V: HPLOT  FN W(W),C TO  FN W(W),C +4:W = W +1: NEXT Z:T = 1: GOTO 2090: REM  PUT LETTERS OF MONTHS ON X-AXIS
  223. 2120  HCOLOR= 3 +3 *CL:A$ = MS$ +"-" +YS$:H = 2:V = V +10: GOSUB 840:A$ = ME$ +"-" +YE$:H = D -19: GOSUB 840
  224. 2130  HCOLOR= 2 *CL +3:A$ = "( MONTHS )":H = 109: GOSUB 840: HCOLOR= 3
  225. 2140 C1 = 10: GOTO 3060
  226. 2150 Y% =  VAL(YS$):M% = A%: REM  SET FILE NAME PARAMETERS
  227. 2160 X% = 0: REM  MONTH COUNTER
  228. 2170 F$ = M$(M%) +"." + STR$(Y%)
  229. 2180  IF  PEEK( -16384) = 155  THEN 1730: REM  -ESC-HIT, STOP!
  230. 2190  GOTO 960: REM  READ FILE
  231. 2200 X% = X% +1: REM  MONTH COUNTER
  232. 2210  IF Y% *12 +M% = E% *12 +C%  THEN QT = 1: REM  LAST FILE READ THEN QUIT READING FILES
  233. 2220  FOR J = 1 TO P:SUM(J) = 0:COUNT = 0: REM  # OF SELECTIONS-ZERO COUNTERS
  234. 2230 Q = J:FL = 1: GOSUB 3100:FL = 0
  235. 2240  FOR I = 1 TO  VAL(D$(M%)): IF W$(I,RP%(J)) = ""  THEN  NEXT : GOTO 2270
  236. 2250 SUM(J) = SUM(J) + VAL(W$(I,RP%(J))):COUNT = COUNT +1
  237. 2260  NEXT 
  238. 2270  IF (RP%(J) = 6  OR RP%(J) = 7)  THEN COUNT = 0: REM  TOTALS ONLY FOR RAIN/SNOW
  239. 2280 AV(J) = SUM(J)/(COUNT +(COUNT = 0))
  240. 2290  IF X% = 1  THEN X1(J) =  FN W(0):Y1(J) =  FN Y(AV(J)):X2(J) = X1(J): GOSUB 890:Y2(J) = Y1(J): GOTO 2305: REM  INITIAL PLOT POINTS
  241. 2300 X2(J) =  FN W(X% -1):Y2(J) =  FN Y(AV(J)): GOSUB 910
  242. 2305  IF ((Y1(J) <0) +(Y2(J) <0))  THEN  HCOLOR= 3:A$ = "PLOT OUT OF RANGE. EDIT DATA.":H = 50:V = 90: GOSUB 840:J = P: NEXT : GOTO 2380
  243. 2310  HPLOT X1(J),Y1(J) TO X2(J),Y2(J): IF Y2(J) >150  THEN 2330: REM  DON'T PLOT CHARACTER
  244. 2320  DRAW 57 -9 *(J = 2) AT X2(J),Y2(J): REM  PLOT INDICATING CHARACTER
  245. 2330 X1(J) = X2(J):Y1(J) = Y2(J): REM  SAVE LAST PLOT POINT
  246. 2340  NEXT : REM  READ NEXT PARAMETER
  247. 2350 M% = M% +1: IF M% = 13  THEN M% = 1:Y% = Y% +1
  248. 2360  IF QT = 1  THEN QT = 0: GOTO 2380
  249. 2370  GOTO 2170: REM  READ NEXT FILE
  250. 2380  HOME : POKE  -16368,0: HCOLOR= 3 +CL *2:A$ = "PRESS RETURN":H = 101:V = 188: GOSUB 840: PRINT  CHR$(7): WAIT  -16384,128: GOTO 3470: REM  GRAPHIC OPTIONS
  251. 2390  REM 
  252. 2400  REM 
  253. 2410  REM 
  254. 2420  TEXT : HOME : PRINT  TAB( 12)M3$: PRINT L$: REM  PUT HEADING
  255. 2430  VTAB 6: PRINT L$
  256. 2440  IF PT  THEN  GOSUB 490: GOTO 2460
  257. 2450  GOSUB 500: GOTO 2500
  258. 2460  IF GP  THEN  GOSUB 510: GOTO 2480
  259. 2470  GOSUB 520: GOSUB 540: GOTO 2500
  260. 2480  GOSUB 570: GOSUB 530
  261. 2490  IF CL  THEN  GOSUB 550: GOTO 2510
  262. 2500  GOSUB 560
  263. 2510  VTAB 8: PRINT "PRESS <";: INVERSE : PRINT "ESC";: NORMAL : PRINT "> TO ACCEPT ABOVE DEFAULTS."
  264. 2520  HTAB 1: VTAB 10: PRINT "PRESS <RETURN> TO ENTER NEW PARAMETERS";: CALL  -958: POKE  -16368,0: GET X$
  265. 2530  IF X$ =  CHR$(27)  THEN 2820: REM  WRITE DISK
  266. 2540  IF X$ < > CHR$(13)  THEN 2520
  267. 2550  VTAB 7: HTAB 1: CALL  -958
  268. 2560  GOSUB 470: HTAB 1
  269. 2570  VTAB 8: PRINT "DO YOU HAVE A PRINTER CONNECTED?": PRINT "(SLOT 1 IS ASSUMED)": VTAB 8: HTAB 36: PRINT "YES": HTAB 36: PRINT "NO"
  270. 2580 A = 8:B = 9:C = 36:D = 38: GOSUB 2760
  271. 2590  IF LINE = 1  THEN PT = 1: GOSUB 490: GOTO 2610
  272. 2600 PT = 0:GP = 0:GP$ = "": GOSUB 500: GOSUB 520: GOSUB 540: GOTO 2730: REM  SKIP CARD QUES.
  273. 2610  VTAB 12: PRINT "PRINTER CARD HAVE GRAPHICS DUMP?   YES": HTAB 36: PRINT "NO"
  274. 2620 A = 12:B = 13: GOSUB 2760: IF LINE = 1  THEN GP = 1: GOSUB 510: GOTO 2640
  275. 2630 GP = 0: GOSUB 520: GOSUB 540: GOTO 2730: REM  NO GRAPHICS DUMP ON CARD
  276. 2640 GP$ = "": VTAB 15: HTAB 1: PRINT "ENTER CODE FOR PAGE 1 GRAPHICS DUMP": PRINT "TERMINATE WITH <RETURN> :";: HTAB 26
  277. 2650  POKE  -16368,0: GET X$: IF X$ =  CHR$(13)  AND  LEN(GP$) = 0  THEN GP = 0: GOTO 2690
  278. 2660  IF  ASC(X$) = 13  THEN 2700
  279. 2670  IF  ASC(X$) <32  THEN  PRINT "^"; CHR$( ASC(X$) +64);:GP$ = GP$ +X$: GOTO 2650
  280. 2680  PRINT X$;:GP$ = GP$ +X$: GOTO 2650
  281. 2690  GOSUB 520: GOSUB 540: GOTO 2730
  282. 2700  GOSUB 570: GOTO 2720
  283. 2710 S$ = S$ + MID$ (GP$,I,1): NEXT 
  284. 2720  GOSUB 530
  285. 2730  VTAB 19: HTAB 1: PRINT "WHICH TYPE OF MONITOR ?" TAB( 34)"COLOR": PRINT  TAB( 35)"MONO"
  286. 2740 A = 19:B = 20:C = 34:D = 38: GOSUB 2760: IF LINE = 1  THEN CL = 1: GOSUB 550: GOTO 2770
  287. 2750 CL = 0: GOSUB 560: GOTO 2770
  288. 2760  CALL CUR,A,B,C,D:LINE =  PEEK(4): RETURN 
  289. 2770  VTAB 7: CALL  -958: GOSUB 470
  290. 2780  VTAB 10: HTAB 5: PRINT " SET-UP OKAY ?": VTAB 14: HTAB 19: PRINT "YES": HTAB 19: PRINT "NO"
  291. 2790  CALL CUR,14,15,18,22
  292. 2800 LINE =  PEEK(4)
  293. 2810  IF LINE = 2  THEN  HOME : GOTO 2420
  294. 2820  HOME : VTAB 10: PRINT  TAB( 5)"DISK WRITE - DO NOT INTERRUPT"
  295. 2830  POKE 960,4: ONERR  GOTO 4000
  296. 2840 T$ = F$:F$ = "WS.CONFIG"
  297. 2850  PRINT D$OP$F$
  298. 2860  PRINT D$WR$F$
  299. 2870  PRINT PT: PRINT GP: PRINT GP$: PRINT CL: REM  PRINTER,CARD,STRING,MONITOR
  300. 2880  PRINT D$
  301. 2890  PRINT D$CL$
  302. 2900 F$ = T$: GOTO 1130: REM  MAIN MENU
  303. 2910 C1 = 0: FOR I = 1 TO P: IF RP%(I) = 8  THEN RP%(I) = 9: REM  C1 IS OFFSET FOR MONTHLY PLOT
  304. 2920  NEXT : HOME : CALL 62450: HGR 
  305. 2930  POKE  -16302,0
  306. 2940  HCOLOR= 3 +2 *CL: SCALE= 1: ROT= 0: REM  INITIALIZE SCREEN PARAMETERS
  307. 2950 A = 16:B = 31:C = 150:D = 249: REM  GRID
  308. 2960  HPLOT B,A TO B,C TO D,C TO D,A: HPLOT B +1,A TO B +1,C -1 TO D -1,C -1 TO D -1,A
  309. 2970  HCOLOR= 3
  310. 2980 A$ = "WEATHER STATION GRAPHICS":H = 60:V = 3: GOSUB 840
  311. 2990  HPLOT 60,8 TO 209,8
  312. 3000  IF PL = 2  THEN 2080
  313. 3010  IF PL = 1  THEN  FOR I = 0 TO 223  STEP 7: HPLOT B +1 +I,C TO B +1 +I,C +4 +2 *( INT(I/10) = I/10): NEXT : REM  DAILY TIC MARKS ON X-AXIS
  314. 3020  FOR J = 0 TO 30  STEP 10:A$ =  STR$(J):V = C +10:H = B +70 *( INT(J/10)) -7: GOSUB 840: NEXT : REM  PUT TICS EVERY 10 DAYS
  315. 3030  HCOLOR= 2 *CL +3:A$ = "( DAYS )":H = 111:V = V +2: GOSUB 840: HCOLOR= 3
  316. 3040 A$ = F$:H = 118:V = V +9: HCOLOR= 3 +CL *3: GOSUB 840: HCOLOR= 3
  317. 3050  IF P = 1  THEN A$ = RP$(RP%(1) -(RP%(1) = 9)):V = C +18:H = B -7: GOSUB 840: GOTO 3080: REM  NO PLOT CHARACTERS WITH ONLY ONE PLOTTABLE
  318. 3060 A$ = "X= " +RP$(RP%(1) -(RP%(1) = 9)):V = C +C1 +18:H = B -17: GOSUB 840: REM  WRITE HORIZONTAL ON LEFT
  319. 3070  IF P = 2  THEN A$ = RP$(RP%(2) -(RP%(2) = 9)) +" =O":H = D -70: GOSUB 840: REM  WRITE HORIZONTAL ON RIGHT
  320. 3080  FOR Q = 1 TO P: REM  FOR EACH PLOTTABLE CHOICE
  321. 3090 K = 0: REM  COUNT STEPS
  322. 3100  ON RP%(Q) GOTO 3110,3110,3120,3120,3130,3140,3150,3160,3160
  323. 3110 LO =  -30:HI = 120:STP = 30:A2 = A: GOTO 3170
  324. 3120 LO = 28:HI = 31.5:STP = .5:A2 = A: GOTO 3170
  325. 3130 LO = 0:HI = 100:STP = 10:A2 = A +9: GOTO 3170
  326. 3140 LO = 0:HI = HK:STP = S1:A2 = A +4: GOTO 3170
  327. 3150 LO = 0:HI = HH:STP = S2:A2 = A: GOTO 3170
  328. 3160 LO = 0:HI = 100:A2 = A +9:STP = 10
  329. 3170  IF FL = 1  THEN  RETURN : REM  REASSIGN HI/LO VALUES
  330. 3180  FOR J = C -1 -150/TIC%(RP%(Q)) TO A  STEP  -150/TIC%(RP%(Q))
  331. 3190  HPLOT B +(Q = 2) *(D -B +4) -4,J TO B +(Q = 2) *(D -B +4),J: NEXT 
  332. 3200  POKE 960,7: ONERR  GOTO 4200
  333. 3210  FOR J = LO TO HI  STEP STP
  334. 3220 A$ =  STR$(J)
  335. 3230  IF (RP%(Q) = 3  OR RP%(Q) = 4  OR RP%(Q) = 6  OR RP%(Q) = 7)  AND  LEN(A$) <3  AND  VAL(A$) > = 1  THEN A$ = A$ +".0"
  336. 3240 V = C -1 -K *(3 -(RP%(Q) = 3) -(RP%(Q) = 4) -(RP%(Q) = 6) +2 *((RP%(Q) = 7)) -2 *((RP%(Q) = 5)) -2 *((RP%(Q) = 9))) *(150/TIC%(RP%(Q))):H = (B -7 * LEN(A$) -7) +(Q = 2) *D +5 -4 *(( LEN(A$) <4)): REM  SCALE NUMBER VALUES
  337. 3250  GOSUB 840:K = K +1: NEXT 
  338. 3260  IF PL = 2  THEN  NEXT : GOTO 2150
  339. 3270  REM 
  340. 3280  REM  PLOT POINTS
  341. 3290  REM 
  342. 3300 Y1 =  FN Y( VAL(W$(1,RP%(Q)))): IF W$(1,RP%(Q)) = ""  THEN Y1 = C:N1 = 1: REM  Y COORD
  343. 3310 X1 =  FN X(1): REM  X-COORD
  344. 3320  DRAW 48 +9 *(Q = 1) AT X1,Y1: REM  PUT MARKER AT POINT
  345. 3330  FOR I = 2 TO  VAL(D$(M%)): REM  EACH DAY
  346. 3340 X2 =  FN X(I): REM  GET NEXT POINT
  347. 3350 Y2 =  FN Y( VAL(W$(I,RP%(Q)))): IF W$(I,RP%(Q)) = ""  THEN Y2 =  FN Y(LO):N2 = 1: REM  NULL VALUE FLAG=N2
  348. 3360  REM 
  349. 3370  REM 
  350. 3380  IF N1  OR N2  THEN 3390
  351. 3390  HPLOT X1,Y1 TO X2,Y2
  352. 3400  REM 
  353. 3410  DRAW 48 +9 *(Q = 1) AT X2,Y2: REM  PUT MARKER AT POINT
  354. 3420 Y1 = Y2:X1 = X2:N1 = N2:N2 = 0: REM  HOLD LAST PLOT POINT--GET NEXT POINT
  355. 3430  NEXT I: REM  NEXT DAY VALUE
  356. 3440  NEXT Q: REM  FOR NEXT PLOTTABLE CHOICE ON RIGHT AXIS
  357. 3450  HCOLOR= 3 +CL *2:A$ = "PRESS RETURN TO CONTINUE..":H = 63:V = 188: GOSUB 840: PRINT  CHR$(7)
  358. 3460  WAIT  -16384,128: REM  WHAT TO DO?
  359. 3470  TEXT : HOME : PRINT  TAB( 12)"GRAPHIC UTILITIES": PRINT L$: HTAB 1
  360. 3480  VTAB 6: PRINT  TAB( 14)" VIEW GRAPHIC ": PRINT : PRINT  TAB( 14)" SAVE GRAPHIC"
  361. 3490  PRINT : PRINT  TAB( 14)" LOAD GRAPHIC"
  362. 3500  PRINT : PRINT  TAB( 14)"  PLOT AGAIN"
  363. 3510  PRINT : PRINT  TAB( 11)M6$
  364. 3520  IF (PT = 1  AND GP = 1  AND GP$ < >"")  THEN  PRINT : PRINT  TAB( 14)"PRINT  GRAPHIC"
  365. 3530  PRINT : PRINT  TAB( 11)"RETURN TO MAIN MENU"
  366. 3540  GOSUB 470
  367. 3550  CALL CUR,6,20,10,30
  368. 3560 LINE = ( PEEK(4) +1)/2
  369. 3570 S% = LINE: REM  LOAD FILE FLAG
  370. 3580  ON LINE +(LINE = 6  AND PT = 0  AND GP = 0) GOTO 3590,3610,3800,3850,3600,3870,3900
  371. 3590  POKE  -16300,0: POKE  -16297,0: POKE  -16302,0: POKE  -16304,0: GOTO 3460
  372. 3600  GOSUB 600: GOTO 3470: REM  DISK DRIVE CHANGE?
  373. 3610  HOME : GOSUB 860: HTAB 11: PRINT "SAVE GRAPHIC FILE": PRINT L$: GOSUB 470
  374. 3620  VTAB 9: HTAB 12: PRINT "  ENTER PIC NAME": HTAB 12: PRINT "     CATALOG": HTAB 12: PRINT " GRAPHIC OPTIONS"
  375. 3630  CALL CUR,9,11,12,28
  376. 3640 LINE =  PEEK(4): ON LINE GOTO 3650,3740,3790
  377. 3650  HOME 
  378. 3660 X$ = "": VTAB 3: CALL  -958: VTAB 10: HTAB 11: PRINT "ENTER GRAPHIC NAME": PRINT  TAB( 6)"(10 CHARACTERS MAX + '.PIC')": VTAB 12: FOR I = 1 TO 10:X$ = X$ + CHR$(95): NEXT 
  379. 3670  PRINT : PRINT "NAME -> ";X$: VTAB 13: HTAB 9: INPUT "";N$: IF  LEN(N$) >10 +4 *(S% = 3) +4 *( RIGHT$(N$,4) = ".PIC"  AND S% = 2)  THEN 3660
  380. 3680  IF N$ = ""  THEN 3470
  381. 3690  IF  ASC(N$) <65  OR  ASC(N$) >90  THEN  PRINT  CHR$(7): GOTO 3660
  382. 3700  IF S% = 3  THEN S% = 0: GOTO 3810: REM  FROM MO/MO PLOT
  383. 3710  POKE 960,5: ONERR  GOTO 4000: REM  DISK ERROR?
  384. 3720  VTAB 15: IF  RIGHT$(N$,4) < >".PIC"  THEN N$ = N$ +".PIC"
  385. 3730 X$ = N$: PRINT "FILE NAME=";X$: PRINT : PRINT D$BS$X$AD$LN$: GOTO 3470
  386. 3740  POKE 960,7: ONERR  GOTO 4000
  387. 3750  HOME : PRINT :CA$ = "CATALOG":PR = 4 *( PEEK(48896) = 76): PRINT  CHR$(4); LEFT$(CA$,7 -PR);DV$: GET CH$: POKE 216,0: POKE 960,0: GOTO 3610
  388. 3760  IF S% = 2  THEN 3610
  389. 3770  IF S% = 3  THEN 3800
  390. 3780  GOTO 3610
  391. 3790  HOME : GOTO 3470
  392. 3800  HOME : HTAB 11: PRINT "LOAD GRAPHIC FILE": PRINT L$: GOSUB 470: GOTO 3620
  393. 3810  POKE 960,5: ONERR  GOTO 4110
  394. 3820  VTAB 15: PRINT :X$ = N$: IF  RIGHT$(X$,4) < >".PIC"  THEN X$ = X$ +".PIC"
  395. 3830  PRINT "FILE NAME=";X$: PRINT : PRINT D$BL$X$AD$: GOTO 3470
  396. 3840  VTAB 20: INVERSE : PRINT "DISK ERROR OR BAD FILE NAME-TRY AGAIN": NORMAL :V = 22: GOSUB 810: POKE 216,0: POKE 960,0: GOTO 3610
  397. 3850  HOME : ON PL GOTO 1470,1730: REM  PLOT AGAIN
  398. 3860  GOTO 1130: REM  FOR PL<>1 OR 2
  399. 3870  IF GP = 0  THEN 1130: REM  MAIN MENU
  400. 3880  HOME : GOSUB 860: VTAB 10: PRINT  TAB( 5)"BE SURE PRINTER IS ON.."
  401. 3890 V = 23: GOSUB 810: PRINT : PRINT D$"PR#1": PRINT GP$: PRINT : PRINT D$"PR#0": GOTO 3470
  402. 3900  GOTO 1130: REM  MAIN MENU
  403. 3910  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$()
  404. 3920  DATA  " HIGH TEMP."," LOW  TEMP.","HI PRESSURE","LO PRESSURE"," %  CLOUDY ","RAIN  (IN.)","SNOW  (IN.)","WIND  SPEED","   QUIT"
  405. 3930  DATA  17,17,16,16,12,28,34,12,12
  406. 3940  REM  ONERR ROUTINES
  407. 3950  REM 
  408. 3960  IF  PEEK(222) = 6  THEN  TEXT : HOME : VTAB 10: PRINT "BINARY FILE NOT FOUND ON DISK...": PRINT : PRINT  TAB( 10)"CANNOT CONTINUE": POKE 216,0: END : REM  NO CURSOR OR SHAPE TABLE FILE
  409. 3970  REM 
  410. 3980  REM  ERROR HANDLING
  411. 3990  REM 
  412. 4000  GOSUB 880: REM  CLEAR ONERR
  413. 4010  IF ER = 6  THEN X$ = "NO DATA IN FILE " + LEFT$(F$,3) +"." + STR$(Y%):Y$ = "CREATE DATA IN 'WEATHER STATION' PROGRAM":F$ = "": GOTO 4060
  414. 4020  IF ER = 4  THEN X$ = "DISK WRITE PROTECTED":Y$ = "REMOVE WRITE-PROTECT TAB": GOTO 4060
  415. 4030  IF ER = 8  THEN X$ = "DISK I/O PROBLEM":Y$ = "CHECK DRIVE DOOR OR DISK POSITION":F$ = "": GOTO 4060
  416. 4040  IF ER = 9  THEN X$ = "THIS DISK IS FULL":Y$ = "INSERT OTHER DISK OR CHANGE DRIVES": GOTO 4060
  417. 4050  VTAB 10: PRINT " ERROR #"; PEEK(222)" IN LINE "; PEEK(219) *256 + PEEK(218): PRINT : PRINT "TAKE APPROPRIATE ACTION ": GOTO 4080
  418. 4060  PRINT  TAB( 10)"*** DISK ERROR ***": PRINT L$
  419. 4070  VTAB 6: INVERSE : PRINT "PROBLEM:": NORMAL : PRINT : PRINT X$: VTAB 13: INVERSE : PRINT "POSSIBLE SOLITION:": NORMAL : PRINT : PRINT Y$
  420. 4080 V = 23: GOSUB 810
  421. 4090  ON  PEEK(960) GOTO 4140,4140,1130,2420,3470,3470,3610
  422. 4100  POKE 960,0: GOTO 1130: REM  MAIN MENU
  423. 4110  GOSUB 880: IF ER = 6  THEN X$ = "FILE NAME DOESN'T EXIST":Y$ = "RE-CATALOG AND TRY AGAIN": GOTO 4060
  424. 4120  IF ER = 13  THEN X$ = "FILE NAME IS NOT A PICTURE FILE":Y$ = "RE-CATALOG AND TRY AGAIN": GOTO 4060
  425. 4130  GOTO 4020
  426. 4140  RUN : REM  RE-RUN PROGRAM
  427. 4150  REM 
  428. 4160  REM  NO CONFIGURE FILE
  429. 4170  REM 
  430. 4180  IF  PEEK(222) = 6  THEN 2420: REM  NOT CONFIGURED
  431. 4190  GOTO 3980: REM  OTHER ERROR, NOT 'NOT FOUND'
  432. 4200  GOSUB 880: IF ER < >77  THEN 4080
  433. 4210  PRINT : VTAB 10: PRINT "CLEARING OLD STRINGS...ONE MOMENT..":X =  FRE(0):V = 23: GOSUB 810: POKE 216,0: GOTO 2910
  434. 4220 ER =  PEEK(222): IF ER = 6  THEN 4240
  435. 4230  GOTO 4020
  436. 4240  VTAB 10: PRINT "  WEATHER STATION PROGRAM NOT ON THIS DISK"
  437. 4250  VTAB 12: PRINT  TAB( 11)"TRY AGAIN (Y/N)";: INPUT G$: IF G$ < >"N"  AND G$ < >"Y"  THEN  VTAB 11: CALL  -958: PRINT  CHR$(7): GOTO 4250
  438. 4260  IF G$ = "Y"  THEN 1260
  439. 4270  GOTO 4100