home *** CD-ROM | disk | FTP | other *** search
/ Nibble Magazine / nib40b.dsk / LOG.PLOTTER.bas < prev    next >
BASIC Source File  |  2023-02-26  |  17KB  |  287 lines

  1. 10  REM *************************
  2. 20  REM * LOG PLOTTER           *
  3. 30  REM * BY EDWARD MIENKO      *
  4. 40  REM * COPYRIGHT(C) 1991     *
  5. 50  REM * MINDCRAFT PUBL. CORP. *
  6. 60  REM * CONCORD, MA  01742    *
  7. 70  REM *************************
  8. 80  IF  PEEK(104) < >64  THEN  POKE 103,1: POKE 104,64: POKE 16384,0: PRINT  CHR$(4);"RUN LOG.PLOTTER"
  9. 90  PRINT  CHR$(12); CHR$(21): TEXT : HOME 
  10. 100  VTAB 10: HTAB 14: PRINT "LOG PLOTTER": HTAB 12: PRINT "BY EDWARD MIENKO": PRINT 
  11. 110  PRINT  TAB( 3)"(C) 1991 MINDCRAFT PUBLISHING CORP.": PRINT 
  12. 120  GOSUB 2690
  13. 130 CL% = 0:CT% = 0:CB% = 191:CR% = 279:S$ = "6":D1$ = "1": GOSUB 2530: GOTO 1710
  14. 140  REM  GET A KEYPRESS ROUTINE
  15. 150  GET A$: IF A$ > CHR$(96)  THEN A$ =  CHR$( ASC(A$) -32)
  16. 160  RETURN 
  17. 170  REM  THIS LINE GETS ERASED  BY THE LOAD A GRAPH ROUTINE
  18. 180  GOSUB 2690:CL% = 0:CT% = 0:CB% = 191:CR% = 279: POKE  -16297,0: POKE  -16304,0: POKE  -16301,0
  19. 190 IT% = 1:S$ =  CHR$( PEEK(4135)):D1$ =  CHR$( PEEK(4136)): GOSUB 2530:Q% = T%: GOTO 870
  20. 200  REM  >>> WARNING <<<
  21. 210  REM  TYPE LINES 230 + 240        EXACTLY AS SHOWN
  22. 220  REM BELOW LINES HAVE 200 *'S
  23. 230 Y = 0: REM  ********************************************************************************************************************************************************************************************************
  24. 240 Z = 0: REM  ********************************************************************************************************************************************************************************************************
  25. 250  RETURN 
  26. 260  TEXT : HOME 
  27. 270  PRINT "THE EQUATIONS ARE:"
  28. 280  VTAB 3: LIST 230: VTAB 4: HTAB 1: PRINT "   ": VTAB 20: HTAB 1: PRINT "<SPACE> TO SEE 'Z' EQUATION": PRINT "<P> TO PLOT EQUATIONS": PRINT "<ESC> FOR MAIN MENU ";: GOSUB 150
  29. 290  IF A$ =  CHR$(27)  THEN 1710
  30. 300  IF A$ = "P"  THEN 360
  31. 310  VTAB 2: CALL  -958
  32. 320  VTAB 3: LIST 240: CALL  -958: VTAB 4: HTAB 1: PRINT "   ": VTAB 20: HTAB 1: PRINT "<SPACE> TO SEE 'Y' EQUATION"
  33. 330  PRINT "<P> TO PLOT THE EQUATIONS": PRINT "<ESC> FOR MAIN MENU ";: GOSUB 150: IF A$ = " "  THEN 260
  34. 340  IF A$ =  CHR$(27)  THEN 1710
  35. 350  IF A$ < >"P"  THEN 320
  36. 360  IF TZ% = 0  THEN 430
  37. 370  TEXT : HOME : VTAB 5
  38. 380  PRINT "TYPE OF GRAPH = ";T$(T%): PRINT "LEFT EDGE     = ";LZ: PRINT "RIGHT EDGE    = ";RZ: PRINT "TOP EDGE      = ";TZ: PRINT "BOTTOM EDGE   = ";BZ: REM  SPACES BEFORE EQUAL SIGNS 1,5,4,6,3
  39. 390  VTAB 18: HTAB 1: PRINT "USE THESE VALUES FOR SCREEN (Y/N) ?";: GOSUB 150: PRINT A$
  40. 400  IF A$ =  CHR$(27)  THEN 260
  41. 410  IF A$ = "Y"  THEN T% = TZ%:XI = LZ:XF = RZ:YI = TZ:YF = BZ: GOTO 660
  42. 420  IF A$ < >"N"  THEN 390
  43. 430  TEXT : HOME : VTAB 5: PRINT "CHOOSE TYPE OF GRAPH: ": PRINT 
  44. 440  INVERSE : PRINT " 1) CARTESIAN": PRINT " 2) SEMI-LOG ": PRINT " 3) LOG-LOG  ": NORMAL 
  45. 450  PRINT " 4) RETURN TO MAIN MENU": PRINT " 5) SEE EQUATIONS AGAIN"
  46. 460  VTAB 14: PRINT " >";: GET Q$: PRINT Q$:Q% =  VAL(Q$): IF Q$ =  CHR$(27)  OR Q% = 5  THEN 260
  47. 470  IF Q% <1  OR Q% >4  THEN 460
  48. 480  IF Q% = 4  THEN 1710
  49. 490 T% = Q%
  50. 500  VTAB 16: HTAB 1: CALL  -958: INVERSE : VTAB 16: HTAB 1: PRINT "TYPE OF PLOT = ";T$(T%): NORMAL 
  51. 510  PRINT "INPUT THE EDGES OF THE GRAPH:": VTAB 18: HTAB 1: CALL  -958
  52. 520  VTAB 18: HTAB 1: PRINT "LEFT EDGE ";: IF T% >1  THEN  PRINT "(MUST BE >0) ";
  53. 530  PRINT " =";:L = 15: GOSUB 2680: GOSUB 2710: IF  LEN(EQ$) = 0  OR EQ$ =  CHR$(27)  THEN 430
  54. 540 XI =  VAL(EQ$): IF T% >1  AND XI < = 0  THEN  INVERSE : PRINT  CHR$(7);"LEFT EDGE <0": NORMAL : GOTO 520
  55. 550  VTAB 19: HTAB 1: CALL  -958
  56. 560  VTAB 19: HTAB 1: PRINT "RIGHT EDGE (MUST BE >";XI;" )=";: GOSUB 2710: IF  LEN(EQ$) = 0  OR EQ$ =  CHR$(27)  THEN 500
  57. 570 XF =  VAL(EQ$): IF XF < = XI  THEN  INVERSE : PRINT  CHR$(7);"RIGHT < LEFT": NORMAL : GOTO 560
  58. 580  VTAB 20: HTAB 1: CALL  -958
  59. 590  VTAB 20: PRINT "BOTTOM EDGE ";: IF T% = 3  THEN  PRINT "(MUST BE >0)";
  60. 600  PRINT " =";: GOSUB 2710: IF  LEN(EQ$) = 0  OR EQ$ =  CHR$(27)  THEN 550
  61. 610 YF =  VAL(EQ$): IF T% = 3  AND YF < = 0  THEN : INVERSE : PRINT  CHR$(7);"BOTTOM <=0": NORMAL : GOTO 590
  62. 620  HTAB 1: VTAB 21: PRINT "TOP EDGE (MUST BE >";YF;")  =";: GOSUB 2710: IF  LEN(EQ$) = 0  OR EQ$ =  CHR$(27)  THEN 580
  63. 630 YI =  VAL(EQ$): IF YI < = YF  THEN  INVERSE : PRINT  CHR$(7);"BOTTOM > TOP": NORMAL : GOTO 620
  64. 640  VTAB 17: HTAB 1: CALL  -958: VTAB 18: HTAB 1: PRINT "LEFT EDGE = ";XI: PRINT "RIGHT EDGE = ";XF: PRINT "BOTTOM EDGE = ";YF: PRINT "TOP EDGE = ";YI
  65. 650 TZ% = T%:LZ = XI:RZ = XF:BZ = YF:TZ = YI: PRINT : PRINT "O.K. TO GRAPH (Y/N) ?";: GOSUB 150: PRINT A$: IF A$ < >"Y"  THEN 500
  66. 660  IF T% = 1  THEN XS = (XF -XI)/CR%:YS = (YI -YF)/CB%
  67. 670  IF T% = 2  THEN XS = ( LOG(XF/XI))/(CR% * LOG(10)):YS = (YI -YF)/CB%
  68. 680  IF T% = 3  THEN XS = ( LOG(XF/XI))/(CR% * LOG(10)):YS = ( LOG(YF/YI))/(CB% * LOG(10))
  69. 690  HGR : POKE  -16302,0: HCOLOR= 3
  70. 700  IF YI =  >0  AND YF < = 0  THEN Y = CB% +YF/YS: HPLOT CL%,Y TO CR%,Y
  71. 710  IF XI =  <0  AND XF > = 0  THEN X = CR% -XF/XS: HPLOT X,CT% TO X,CB%
  72. 720 XP% = CL%:X = XI -XS
  73. 730 IT% = 1: ONERR  GOTO 1660
  74. 740  REM >>>MAIN PLOTTING LOOP<<<
  75. 750 X = X +XS: IF T% >1  THEN X = XI *(10 ^(XS *XP%))
  76. 760  REM  EVALUATE THE EQUATIONS
  77. 770  GOSUB 230
  78. 780  IF Y >YI  OR Y <YF  THEN 820
  79. 790  IF T% <3  THEN YP = CB% -(Y -YF)/YS
  80. 800  IF T% = 3  THEN YP =  LOG(Y/YI)/(YS * LOG(10))
  81. 810  HPLOT XP%,YP
  82. 820  IF Z >YI  OR Z <YF  THEN 860
  83. 830  IF T% <3  THEN ZP = CB% -(Z -YF)/YS
  84. 840  IF T% = 3  THEN ZP =  LOG(Z/YI)/(YS * LOG(10))
  85. 850  HPLOT XP%,ZP
  86. 860  IF XP% <CR%  THEN XP% = XP% +1: GOTO 750
  87. 870  PRINT  CHR$(7)
  88. 880  POKE 216,0
  89. 890  REM  CURSOR CONTROLLER
  90. 900  SCALE= 1: ROT= 0:K% = 0: POKE  -16301,0:XC% = CR%/2:YC% = CB%/2: XDRAW 1 AT XC%,YC%:X9% = XC%:Y9% = YC%: GOSUB 1280:Z% = 10
  91. 910  REM >>>CURSOR LOOP HERE<<<
  92. 920  IF T% <3  THEN Y = (CB% -YC%) *YS +YF
  93. 930  IF T% = 3  THEN Y = YI *(10 ^(YS *YC%))
  94. 940  VTAB 22: HTAB 13: PRINT Y; SPC( 13)
  95. 950  IF T% = 1  THEN X = XC% *XS +XI
  96. 960  IF T% >1  THEN X = XI *(10 ^(XS *XC%))
  97. 970  VTAB 23: HTAB 13: PRINT X; SPC( 13);
  98. 980  VTAB 1: HTAB 1: GOSUB 150
  99. 990  IF A$ < >" "  THEN 1020
  100. 1000  IF Z% = 1  THEN Z% = 10: GOTO 980
  101. 1010 Z% = 1: GOTO 980
  102. 1020  IF A$ =  CHR$(27)  THEN  TEXT : HOME : GOTO 500
  103. 1030 Y9% = YC%:X9% = XC%
  104. 1040  IF A$ = "I"  THEN YC% = YC% -Z%: GOTO 1150
  105. 1050  IF A$ = "M"  THEN YC% = YC% +Z%: GOTO 1150
  106. 1060  IF A$ = "J"  THEN XC% = XC% -Z%: GOTO 1150
  107. 1070  IF A$ = "K"  THEN XC% = XC% +Z%: GOTO 1150
  108. 1080  IF A$ = "V"  THEN  GOSUB 1250
  109. 1090  IF A$ = "H"  THEN  GOSUB 1220
  110. 1100  IF A$ = "D"  THEN  GOSUB 1310
  111. 1110  IF A$ = "S"  AND K% = 0  THEN  POKE  -16302,0:K% = 1:A$ = ""
  112. 1120  IF A$ = "S"  AND K% = 1  THEN  POKE  -16301,0:K% = 0
  113. 1130  IF A$ = "Z"  THEN 1350
  114. 1140  GOTO 920
  115. 1150  XDRAW 1 AT X9%,Y9%
  116. 1160  IF YC% >CB%  THEN YC% = CT%: GOTO 1200
  117. 1170  IF YC% <CT%  THEN YC% = CB%: GOTO 1200
  118. 1180  IF XC% >CR%  THEN XC% = CL%: GOTO 1200
  119. 1190  IF XC% <CL%  THEN XC% = CR%
  120. 1200  XDRAW 1 AT XC%,YC%: GOTO 910
  121. 1210  REM  HORIZONTAL LINE DRAW
  122. 1220  GOSUB 1330: PRINT "HORIZONTAL LINE AT CURSOR ? (Y/N) ";: GOSUB 150: IF A$ < >"Y"  THEN 1280
  123. 1230  XDRAW 1 AT XC%,YC%: HPLOT CL%,YC% TO CR%,YC%: XDRAW 1 AT XC%,YC%: GOTO 1280
  124. 1240  REM  VERTICAL LINE DRAW
  125. 1250  GOSUB 1330: PRINT "VERTICAL LINE AT CURSOR ? (Y/N) ";: GOSUB 150: IF A$ < >"Y"  THEN 1280
  126. 1260  XDRAW 1 AT XC%,YC%: HPLOT XC%,CT% TO XC%,CB%: XDRAW 1 AT XC%,YC%: GOTO 1280
  127. 1270  REM  CURSOR SCREEN OUTPUT
  128. 1280  HOME : INVERSE : VTAB 21: PRINT "(I,J,K,M,SPACE)(D,H,V)(S,Z)(<ESC>)     "
  129. 1290  PRINT "Y POSITION = ": PRINT "X POSITION = ";: NORMAL : RETURN 
  130. 1300  REM  DRAW CURSOR ROUTINE
  131. 1310  GOSUB 1330: PRINT "DRAW A CURSOR ? (Y/N) ";: GOSUB 150: IF A$ < >"Y"  THEN 1280
  132. 1320  XDRAW 1 AT XC%,YC%: GOTO 1280
  133. 1330 K% = 0: POKE  -16301,0: HOME : VTAB 21: RETURN 
  134. 1340  REM  <<ZOOM>>
  135. 1350  GOSUB 1330: PRINT "ZOOM MENU:  (B,CNTL-Z)(S,<ESC>)": XDRAW 1 AT XC%,YC%:S% = 12: SCALE= S%: XDRAW 2 AT XC%,YC%
  136. 1360  PRINT "SIZE FACTOR = ";S%;" "
  137. 1370  VTAB 1: HTAB 1: GOSUB 150
  138. 1380  IF A$ =  CHR$(27)  THEN  XDRAW 2 AT XC%,YC%: SCALE= 1: ROT= 0: XDRAW 1 AT XC%,YC%: GOSUB 1280: GOTO 920
  139. 1390  IF A$ < >"B"  THEN 1430
  140. 1400  XDRAW 2 AT XC%,YC%:S% = S% -1: IF S% <1  THEN S% = 12
  141. 1410  SCALE= S%: XDRAW 2 AT XC%,YC%
  142. 1420  VTAB 22: HTAB 15: PRINT S%;" ": GOTO 1370
  143. 1430  IF A$ =  CHR$(26)  THEN 1480
  144. 1440  IF A$ < >"S"  THEN 1370
  145. 1450  IF A$ = "S"  AND K% = 0  THEN  POKE  -16302,0:K% = 1: GOTO 1370
  146. 1460  IF A$ = "S"  AND K% = 1  THEN  POKE  -16301,0:K% = 0: GOTO 1370
  147. 1470  REM  FIGURE CURSOR EDGES%
  148. 1480  VTAB 24: HTAB 1: PRINT "ERASE GRAPH AND ZOOM IN ? (Y/N) ";: GOSUB 150: IF A$ =  CHR$(27)  OR A$ = "N"  THEN  VTAB 24: HTAB 1: PRINT  SPC( 34);: GOTO 1370
  149. 1490  IF A$ < >"Y"  THEN 1480
  150. 1500 Y9% = 3 *S% -1:X9% = 5 *S% -1
  151. 1510 Y1% = YC% -Y9%:Y2% = YC% +Y9%:X1% = XC% -X9%:X2% = XC% +X9%
  152. 1520  IF Y1% <CL%  THEN Y = YI: GOTO 1550
  153. 1530  IF T% <3  THEN Y = (CB% -Y1%) *YS +YF
  154. 1540  IF T% = 3  THEN Y = YI *(10 ^(YS *Y1%))
  155. 1550  IF Y2% >CB%  THEN 1580
  156. 1560  IF T% <3  THEN YF = (CB% -Y2%) *YS +YF
  157. 1570  IF T% = 3  THEN YF = YI *(10 ^(YS *Y2%))
  158. 1580  IF X1% <CL%  THEN X = XI: GOTO 1610
  159. 1590  IF T% = 1  THEN X = X1% *XS +XI
  160. 1600  IF T% >1  THEN X = XI *(10 ^(XS *X1%))
  161. 1610  IF X2% >CR%  THEN 1640
  162. 1620  IF T% = 1  THEN XF = X2% *XS +XI
  163. 1630  IF T% >1  THEN XF = XI *(10 ^(XS *X2%))
  164. 1640 XI = X:YI = Y: GOTO 660
  165. 1650  REM  MAIN PLOTTING LOOP ERROR
  166. 1660 S% =  PEEK(222): IF S% = 255  THEN 870
  167. 1670  TEXT : HOME : INVERSE : PRINT  CHR$(7);"ERROR IN MAIN PLOTTING LOOP": NORMAL : PRINT "ERROR NUMBER = ";S%
  168. 1680  PRINT "ERROR OCCURS WHEN X= ";X
  169. 1690  PRINT : PRINT "CONTINUE AT NEXT PIXEL ? (Y/N) ";: GOSUB 150: IF A$ = "Y"  THEN  POKE  -16304,0: GOTO 860
  170. 1700  REM  MAIN MENU DRIVER
  171. 1710  TEXT : HOME : VTAB 3: PRINT  SPC( 8)">>>   LOG PLOTTER   <<<": PRINT  SPC( 12)"BY EDWARD MIENKO": PRINT  SPC( 8)"(C)1991 MINDCRAFT PUBL.": PRINT : INVERSE : HTAB 14: PRINT "> MAIN MENU <": NORMAL 
  172. 1720  PRINT : PRINT " 1) SAVE GRAPH TO DISK": PRINT " 2) LOAD GRAPH": PRINT " 3) CATALOG": PRINT " 4) RETURN TO GRAPH": PRINT " 5) PLOT THE GRAPH"
  173. 1730  PRINT " 6) CHANGE EQUATIONS": PRINT " 7) CHANGE SLOT OR DRIVE": PRINT " 8) QUIT"
  174. 1740  VTAB 18: HTAB 1: PRINT ">";: GET Q$: PRINT Q$:Q% =  VAL(Q$): IF Q% <1  OR Q% >8  THEN 1740
  175. 1750 D$ =  CHR$(4)
  176. 1760  IF Q% = 4  AND IT% < >0  THEN  POKE  -16304,0: XDRAW 1 AT XC%,YC%: GOTO 900
  177. 1770  IF Q% < >7  THEN 1870
  178. 1780  REM  CHANGE SLOT AND DRIVE
  179. 1790  VTAB 19: HTAB 1: PRINT "ENTER SLOT NUMBER : ";: FLASH : PRINT S$;: NORMAL : GET Q$: HTAB 21: PRINT Q$: IF Q$ =  CHR$(13)  THEN Q$ = S$: GOTO 1820
  180. 1800  IF Q$ =  CHR$(27)  THEN 1710
  181. 1810 Q% =  ASC(Q$): IF Q% <48  OR Q% >56  THEN  PRINT  CHR$(7): GOTO 1790
  182. 1820 S$ = Q$: VTAB 20: PRINT "ENTER DRIVE NUMBER : ";: FLASH : PRINT D1$;: GET Q$: HTAB 22: NORMAL : PRINT Q$: IF Q$ =  CHR$(13)  THEN Q$ = D1$: GOTO 1850
  183. 1830  IF Q$ =  CHR$(27)  THEN  VTAB 19: HTAB 1: CALL  -958: GOTO 1790
  184. 1840 Q% =  VAL(Q$): IF Q% <1  OR Q% >2  THEN  PRINT  CHR$(7): GOTO 1820
  185. 1850 D1$ = Q$: VTAB 22: PRINT "O.K. ? (Y/N) ";: GOSUB 150: IF A$ < >"Y"  THEN 1790
  186. 1860  GOTO 1710
  187. 1870  IF Q% = 2  THEN 2190
  188. 1880  IF Q% = 5  THEN 260
  189. 1890  IF Q% < >3  THEN 1940
  190. 1900  REM  CATALOG ROUTINE
  191. 1910  ONERR  GOTO 2510
  192. 1920  PRINT : PRINT D$; LEFT$("CATALOG",7 -4 *( PEEK(48896) = 76));",S";S$;",D";D1$: POKE 216,0
  193. 1930  INVERSE : PRINT ">>CATALOG OVER<<";: GET A$: NORMAL : PRINT 
  194. 1940  IF Q% = 8  THEN  VTAB 20: HTAB 1: PRINT "QUIT THE PROGRAM (Y/N) ? ";: GOSUB 150: PRINT A$;: IF A$ = "Y"  THEN  END 
  195. 1950  IF Q% = 6  THEN 2320
  196. 1960  IF Q% < >1  OR T% = 0  THEN 1710
  197. 1970  REM  SAVE GRAPH ROUTINE
  198. 1980  TEXT : HOME 
  199. 1990  INVERSE : HTAB 13: PRINT "SAVE THE GRAPH": HTAB 13: PRINT "--------------": NORMAL : REM 15 -'S 
  200. 2000  VTAB 5: PRINT "ENTER THE GRAPH NAME:": INPUT "";N$:NF = 1: IF  LEN(N$) = 0  THEN 1710
  201. 2010  FOR NC = 1 TO  LEN(N$):NA =  ASC( MID$ (N$,NC,1))
  202. 2020 NF = ((NA >64  AND NA <91)  OR (NA = 46)  OR (NA >47  AND NA <58  AND NC >1))  AND NF = 1: NEXT : IF  LEN(N$) >11  OR NF = 0  OR  LEFT$(N$,1) = "."  THEN  PRINT "INVALID NAME": GOTO 2000
  203. 2030  PRINT : PRINT "INSERT DISK INTO SLOT ";S$;" ,DRIVE ";D1$: PRINT 
  204. 2040  PRINT "O.K. TO SAVE ? (Y/N) ";: GOSUB 150: IF A$ < >"Y"  THEN 1710
  205. 2050  XDRAW 1 AT XC%,YC%
  206. 2060  PRINT :BE$ = "TXT." +N$
  207. 2070  ONERR  GOTO 2510
  208. 2080  PRINT D$;"OPEN ";BE$;",S";S$;",D";D1$
  209. 2090  PRINT D$;"CLOSE ": PRINT D$;"DELETE ";BE$: PRINT D$;"OPEN ";BE$: PRINT D$;"WRITE ";BE$
  210. 2100  PRINT "DEL 230,240"
  211. 2110  PRINT "170 XI=";XI;":XF = ";XF;":YI = ";YI;":YF = ";YF;":T%=";T%;":XS=";XS;":YS=";YS
  212. 2120  LIST 230,240
  213. 2130  PRINT "RUN 170"
  214. 2140  PRINT D$;"CLOSE"
  215. 2150  PRINT D$;"BSAVE GPH.";N$;",A$2000,L$2000"
  216. 2160  POKE 216,0
  217. 2170  XDRAW 1 AT XC%,YC%: GOTO 1710
  218. 2180  REM  LOAD A GRAPH ROUTINE
  219. 2190  TEXT : HOME : HTAB 14: PRINT "LOAD A GRAPH": HTAB 14: PRINT "------------": PRINT : REM 13 -'S
  220. 2200  VTAB 5: PRINT "INPUT THE GRAPH NAME, WITHOUT GPH OR TXT"
  221. 2210  INPUT "";N$:NF = 1: IF  LEN(N$) = 0  THEN 1710
  222. 2220  FOR NC = 1 TO  LEN(N$):NA =  ASC( MID$ (N$,NC,1))
  223. 2230 NF = ((NA >64  AND NA <91)  OR (NA = 46)  OR (NA >47  AND NA <58  AND NC >1))  AND NF = 1: NEXT : IF  LEN(N$) >11  OR NF = 0  OR  LEFT$(N$,1) = "."  THEN  PRINT "INVALID NAME": GOTO 2210
  224. 2240  PRINT : PRINT "INSERT DISK INTO SLOT ";S$;" DRIVE ";D1$
  225. 2250  PRINT : PRINT "O.K. TO LOAD ? (Y/N) ";: GOSUB 150: PRINT : IF A$ < >"Y"  THEN 1710
  226. 2260 N$ = N$ +",S" +S$ +",D" +D1$
  227. 2270  ONERR  GOTO 2510
  228. 2280  HGR : POKE  -16302,0: PRINT D$;"BLOAD GPH.";N$
  229. 2290  PRINT D$;"EXEC TXT.";N$: POKE 216,0: POKE  -16301,0
  230. 2300  POKE 4135, ASC(S$): POKE 4136, ASC(D1$): END 
  231. 2310  REM  CHANGE FORMULA ROUTINE
  232. 2320  TEXT : HOME 
  233. 2330  INVERSE : PRINT  SPC( 8);"CHANGE FORMULA ROUTINE"; SPC( 8): NORMAL 
  234. 2340 L = 180: GOSUB 2680
  235. 2350  VTAB 3: LIST 230: VTAB 4: HTAB 1: PRINT "   "
  236. 2360  VTAB 24: HTAB 1: PRINT "CHANGE THIS EQUATION ? (Y/N) ";: GOSUB 150: IF A$ =  CHR$(27)  THEN 1710
  237. 2370  IF A$ = "N"  THEN 2420
  238. 2380  IF A$ < >"Y"  THEN 2360
  239. 2390  VTAB 2: HTAB 1: CALL  -958: VTAB 5: HTAB 5: PRINT "Y = ";: GOSUB 2710: IF  LEN(EQ$) = 0  OR EQ$ =  CHR$(27)  THEN  VTAB 2: CALL  -958: GOTO 2350
  240. 2400  VTAB 5: HTAB 5: PRINT "Y = ";EQ$;: CALL  -958: VTAB 20: HTAB 1: PRINT "EQUATION O.K. ? (Y/N) ";: GOSUB 150: PRINT A$: IF A$ < >"Y"  THEN 2320
  241. 2410 EQ$ = EQ$ +":REM": CALL 768,EQ$
  242. 2420  VTAB 2: HTAB 1: CALL  -958: VTAB 3: LIST 240: VTAB 4: HTAB 1: PRINT "   "
  243. 2430  VTAB 24: HTAB 1: PRINT "CHANGE THIS EQUATION ? (Y/N) ";: GOSUB 150: IF A$ =  CHR$(27)  THEN 2320
  244. 2440  IF A$ = "N"  THEN 1710
  245. 2450  IF A$ < >"Y"  THEN 2430
  246. 2460  VTAB 2: HTAB 1: CALL  -958: VTAB 5: HTAB 5: PRINT "Z = ";: GOSUB 2710: IF  LEN(EQ$) = 0  OR EQ$ =  CHR$(27)  THEN 2420
  247. 2470  VTAB 2: HTAB 1: CALL  -958
  248. 2480  VTAB 5: HTAB 5: PRINT "Z = ";EQ$: VTAB 20: HTAB 1: PRINT "EQUATION O.K. ? (Y/N) ";: GOSUB 150: PRINT A$: IF A$ < >"Y"  THEN 2420
  249. 2490 EQ$ = EQ$ +":REM": POKE 835,240: CALL 768,EQ$: POKE 835,230: GOTO 1710
  250. 2500  REM  DISK ERROR HANDLER
  251. 2510  TEXT : HOME : POKE 216,0:Q% =  PEEK(222): PRINT : PRINT "ERROR NUMBER ";Q%: PRINT "HAS OCCURED DURING DISK ACCESS": GET A$: GOTO 1710
  252. 2520  REM  SHAPE TABLE POKER
  253. 2530  POKE 232,0: POKE 233,16: RESTORE : FOR I = 1 TO 39: READ Q%: POKE 4095 +I,Q%: NEXT 
  254. 2540  DATA 2,0,6,0,19,0,24,8
  255. 2550  DATA 54,27,43,45,41,45
  256. 2560  DATA 26,27,51,6,0,24,8
  257. 2570  DATA 56,63,63,54,54,54
  258. 2580  DATA 45,45,45,45,45,36
  259. 2590  DATA 36,36,63,63,7,0
  260. 2600  FOR I = 1 TO 3: READ Q$:T$(I) = Q$: NEXT 
  261. 2610  DATA  "CARTESIAN"
  262. 2620  DATA  "SEMI-LOG"
  263. 2630  DATA  "LOG-LOG"
  264. 2640  FOR I = 768 TO 873: READ Q%: POKE I,Q%: NEXT : RETURN 
  265. 2650  DATA  32,190,222,32,227,223,165,184,133,29,165,185,133,30,160,2,177,131,133,28,136,177,131,133,27,136,177,131,72,169,0,160,200,153,0,2,169,42,136,153,0,2,136,208,250,104,168,136,177,27,153 
  266. 2660  DATA    0,2,192,0,208,246,160,4,132,19,162,255,32,108,213,169,230,133,80,169,0,133,81,32,26,214,165,155,133,25,165,156,133,26,160,5,200,185,250,1,240,4,145,155,208,246,165,29,133,184,165,30,133,185,96
  267. 2670  REM  ROUTINES FOR INPUT
  268. 2680 BB$ =  LEFT$(XB$,L):UU$ =  LEFT$(XU$,L): RETURN 
  269. 2690  PRINT "PLEASE WAIT...":B$ =  CHR$(136):U$ =  CHR$(223):XB$ = "":XU$ = XB$: FOR I = 1 TO 255:XB$ = XB$ + CHR$(136):XU$ = XU$ + CHR$(95): NEXT : RETURN 
  270. 2700  REM  INPUT ROUTINE
  271. 2710  PRINT  LEFT$(UU$,L); LEFT$(BB$,L);:LI = 0:EQ$ = "": POKE  -16368,0: INVERSE : PRINT " ";: NORMAL : PRINT B$;
  272. 2720  POKE  -16368,0
  273. 2730 K =  PEEK( -16384): IF K <128  THEN 2730
  274. 2740  IF K >159  AND K < >255  THEN 2860
  275. 2750  IF K = 141  THEN  FOR K = LI TO L: PRINT " ";: NEXT : POKE  -16368,0: RETURN 
  276. 2760  IF K < >155  THEN 2800
  277. 2770  IF LI = 0  THEN EQ$ =  CHR$(27): PRINT U$;: POKE  -16368,0: RETURN 
  278. 2780  IF LI = L  THEN  PRINT " ";: PRINT B$;
  279. 2790  PRINT  LEFT$(BB$,LI);: GOTO 2710
  280. 2800  IF (K < >136  AND K < >255)  THEN 2850
  281. 2810  IF LI = 0  THEN  PRINT  CHR$(7);: GOTO 2720
  282. 2820  IF LI = 1  THEN  PRINT B$;: PRINT U$;U$;: PRINT B$;: PRINT B$;: INVERSE : PRINT " ";: NORMAL : PRINT B$;:LI = LI -1:EQ$ = "": GOTO 2720
  283. 2830  IF LI = L  THEN  PRINT B$;: PRINT U$" ";: PRINT B$;B$;: INVERSE : PRINT " ";: NORMAL : PRINT B$;:LI = LI -1:EQ$ =  LEFT$(EQ$,LI): GOTO 2720
  284. 2840  PRINT B$;: PRINT U$;U$;: PRINT B$;: PRINT B$;: INVERSE : PRINT " ";: NORMAL : PRINT B$;:LI = LI -1:EQ$ =  LEFT$(EQ$,LI): GOTO 2720
  285. 2850  IF K <160  THEN 2720
  286. 2860  IF LI = L  THEN  PRINT  CHR$(7);: GOTO 2720
  287. 2870  PRINT  CHR$(K);: INVERSE : PRINT " ";: NORMAL : PRINT B$;:EQ$ = EQ$ + CHR$(K -128):LI = LI +1: GOTO 2720