home *** CD-ROM | disk | FTP | other *** search
/ Nibble Magazine / nib19a.dsk / APRIL.1984 / A.F.P..bas next >
BASIC Source File  |  2023-02-26  |  19KB  |  337 lines

  1. 1  REM   **********************
  2. 2  REM   * AUTOMATIC FUNCTION *
  3. 3  REM   *       PLOTTER      *
  4. 4  REM   * BY  DAVID L. STORM *
  5. 5  REM   * COPYRIGHT (C) 1984 *
  6. 6  REM   * BY MICROSPARC, INC *
  7. 7  REM   * LINCOLN, MA. 01773 *
  8. 8  REM   **********************
  9. 10  LOMEM: 24576:X = 1.23456789
  10. 20  ONERR  GOTO 2830: GOSUB 50
  11. 30  GOTO 120
  12. 40  REM ** CURRENT FUNCTION **
  13. 50 Y =  SIN(X/1)
  14. 60  RETURN 
  15. 120 JX = 1:JY = 1: GOSUB 50
  16. 130 T$(0) = "...":T$(1) = "............":SP$ = "                                        ":E$ = "          ": REM T$(1)=12 PERIODS, SP$=40 SPACES,E$=10 SPACES
  17. 140  DIM P$(12),P(12),V(12):AX = 0:AU = 0:CS = 3:CP = 0:IE = 2
  18. 150 AX$(0) = "YES":AX$(1) = " NO":AU$(0) = "OFF":AU$(1) = " ON":IE$(0) = " ":IE$(1) = "TOO SMALL":IE$(2) = "TOO LARGE":IE$(3) = "TOO LONG "
  19. 160  IF  PEEK(31999) < >10  THEN  GOSUB 2780: POKE 31999,10: GOSUB 1290: GOTO 200
  20. 170  FOR A = 0 TO 4:P(A) =  PEEK(32000 +A):P$(A) =  STR$(P(A)): NEXT A: FOR A = 5 TO 12:PA = 31990 +3 *A:P(A) = (100 * PEEK(PA) + PEEK(PA +1)) *10 ^(100 - PEEK(PA +2)):P(A) =  -1 ^(A = 5  OR A = 7) *P(A):NI = P(A): GOSUB 2370
  21. 180  IF CH = 0  THEN P$(A) = NI$:P(A) =  VAL(P$(A)): NEXT : GOTO 200
  22. 190 P$(A) =  STR$(P(A)): NEXT 
  23. 200  GOSUB 3080
  24. 210 V(0) = 6:V(1) = 7:V(2) = 8:V(3) = 9:V(4) = 10:V(5) = 12:V(6) = 13:V(7) = 15:V(8) = 16:V(9) = 17:V(10) = 18:V(11) = 19:V(12) = 20
  25. 220 RS =  INT(10/(PS ^1.7) *120)
  26. 230 O2 = OY -H/2:O1 = OX +W/2:R1 =  INT(W/2 +2):R2 =  INT(275 -W/2):R3 =  INT(H/2 +10):R4 =  INT(178 -H/2):R4 = R4 +(R4 <R3): GOTO 240
  27. 240 N$ = "": INVERSE : TEXT : HOME : HTAB 8: PRINT "AUTOMATIC FUNCTION PLOTTER": NORMAL 
  28. 250  VTAB 3: HTAB 1: PRINT "THIS PROGRAM WILL PLOT ANY FUNCTION     INPUT ON LINE '50'....LINE '50' NOW     HOLDS THE FOLLOWING FUNCTION:"
  29. 260 DS = 0: VTAB 7: HTAB 1: LIST 50
  30. 270  VTAB 12: HTAB 1: INVERSE : PRINT "CHOOSE:": NORMAL 
  31. 280  PRINT "(P)=PLOT THIS FUNCTION-ON NEW GRAPH     (L)=PLOT THIS FUNCTION-ON LAST GRAPH"
  32. 290  PRINT "(E)=EDIT OR CHANGE THIS FUNCTION        (G)=SHOW LAST GRAPH"
  33. 300  PRINT "(S)=SHOW PARAMETER SPREADSHEET          (R)=RECOVER GRAPH FROM DISK"
  34. 310  PRINT "(V)=SAVE GRAPH ON DISK": PRINT "(Q)=QUIT THE PROGRAM": PRINT : PRINT "** COPYRIGHT 1984 BY MICROSPARC, INC. **"
  35. 320  IF  PEEK( -16384) >127  THEN  GET N$: POKE  -16368,0:T = 1
  36. 330  IF N$ = "Q"  THEN  HOME : END 
  37. 340  IF N$ = "P"  THEN  ON AS = 1 GOSUB 1290: GOTO 1310
  38. 350  IF N$ = "L"  THEN DS = 1: GOTO 1310
  39. 360  IF N$ = "E"  THEN 420
  40. 370  IF N$ = "G"  THEN  GOSUB 1410: GOTO 2060
  41. 380  IF N$ = "S"  THEN 470
  42. 390  IF N$ = "R"  THEN 3130
  43. 400  IF N$ = "V"  THEN 3220
  44. 410  GOTO 320
  45. 420  HOME : INVERSE : HTAB 8: PRINT "EDIT OF CURRENT FUNCTION": NORMAL 
  46. 430  PRINT : PRINT : PRINT "TO CHANGE CURRENT FUNCTION SHOWN BELOW, ERASE AS NEEDED WITH <SPACE BAR>, TYPE  DIRECTLY OVER PARTS TO BE CHANGED, AND  PASS OVER PARTS NOT TO BE CHANGED WITH  '-->' KEY."
  47. 440  VTAB 20: PRINT "REMEMBER TO TYPE: ";: FLASH : PRINT "'RUN <RETURN>'": NORMAL 
  48. 450  POKE 32,2: VTAB 10: LIST 50: POKE 32,0: VTAB 10: HTAB 1
  49. 460  END 
  50. 470  REM ** SET UP SPREADSHEET **
  51. 480  TEXT : HOME : VTAB 1: HTAB 6: PRINT "SELECTION OF PLOT CONDITIONS"
  52. 490  INVERSE : VTAB 1: HTAB 1: LIST 50
  53. 500 AS = 0
  54. 510  VTAB 5: HTAB 1: PRINT "AXIS(SWITCH=A)";: NORMAL : PRINT AX$(AX);: HTAB 20: INVERSE : PRINT "AUTO(SWITCH=<ESC>)";: NORMAL : PRINT AU$(AU)
  55. 520  VTAB 6: HTAB 1: INVERSE : PRINT "SPEED(1-5)";: NORMAL : PRINT ".................."
  56. 530  VTAB 7: HTAB 1: INVERSE : PRINT "GRAPH SIZE";: NORMAL : PRINT "*WIDTH(10-255)...."
  57. 540  VTAB 8: HTAB 10: PRINT "*HEIGHT(10-169)..."
  58. 550  VTAB 9: HTAB 1: INVERSE : PRINT "GRAPH LOC";: NORMAL : PRINT "*X("R1"-"R2")........"
  59. 560  VTAB 10: HTAB 10: PRINT "*Y("R3"-"R4")........."
  60. 570  INVERSE :: VTAB 11: HTAB 1: PRINT "X-AXIS LIMITS:": NORMAL : VTAB 12: HTAB 3: PRINT "*LOWER...................."
  61. 580  VTAB 13: HTAB 3: PRINT "*UPPER...................."
  62. 590  INVERSE : VTAB 14: HTAB 1: PRINT "Y-AXIS LIMITS:": NORMAL : VTAB 15: HTAB 3: PRINT "*LOWER...................."
  63. 600  VTAB 16: HTAB 3: PRINT "*UPPER...................."
  64. 610  INVERSE : VTAB 17: HTAB 1: PRINT "TIC INTV:";: NORMAL : PRINT "*X-AXIS............"
  65. 620  VTAB 18: HTAB 10: PRINT "*Y-AXIS............"
  66. 630  INVERSE : VTAB 19: HTAB 1: PRINT "NUM INTV:";: NORMAL : PRINT "*X-AXIS............"
  67. 640  VTAB 20: HTAB 10: PRINT "*Y-AXIS............"
  68. 650  FOR II = 0 TO 12: GOSUB 3110: NEXT II: NORMAL 
  69. 660  GOSUB 2960
  70. 670  VTAB 22: HTAB 1: PRINT  CHR$(91)"P]=PLOT  " CHR$(91)"<--]=UP " CHR$(91)"-->]=DOWN " CHR$(91)"M]=MENU"
  71. 680  HTAB 1: PRINT  CHR$(91)"L]=PLOT ON LAST GR " CHR$(91)"G]=SHOW LAST GR"
  72. 690 I = 5 *(E >0) *(X < >X1) +6 *(E >0) *(X = X1):HZ = 30:T = 0
  73. 700  VTAB V(I): HTAB HZ: GET L$
  74. 710  IF L$ =  CHR$(8)  THEN I = I -1 +13 *(I = 0): GOTO 700
  75. 720  IF L$ =  CHR$(21)  THEN I = I +1 -13 *(I = 12): GOTO 700
  76. 730  IF L$ = "P"  THEN DS = 0: ON AS = 1 GOSUB 1290: GOTO 1310
  77. 740  IF L$ =  CHR$(27)  THEN  NORMAL :AS = 1:AU = 1 -AU: GOSUB 3040: ON AU = 1 GOSUB 1280: GOTO 700
  78. 750  IF L$ = "A"  THEN  NORMAL :AX = 1 -AX: GOSUB 3040: GOTO 700
  79. 760  IF (L$ =  >"0"  AND L$ < = "9")  OR L$ = "-"  OR L$ = "."  OR L$ = "+"  THEN  GOSUB 810
  80. 770  IF L$ = "M"  THEN  ON AS = 1 GOSUB 1290: GOTO 240
  81. 780  IF L$ = "G"  THEN  GOSUB 1410: GOTO 2060
  82. 790  IF L$ = "L"  THEN DS = 1: ON AS = 1 GOSUB 1290: GOTO 1310
  83. 800  GOTO 700
  84. 810  REM ** INPUT VARIABLES **
  85. 820 HL = 31: IF E < >0  THEN  VTAB 23: HTAB 28: PRINT E$
  86. 830 V$ = "":N$ = L$
  87. 840 V$ = V$ +N$: NORMAL 
  88. 850  VTAB V(I): HTAB 30: PRINT E$;: HTAB 30: PRINT V$;: HTAB HL: GET N$
  89. 860  IF N$ =  CHR$(13)  THEN P =  VAL(V$): ON I +1 GOTO 920,940,960,980,1000,1020,1040,1060,1080,1100,1120,1140,1160
  90. 870  IF N$ =  CHR$(8)  THEN HL = HL -1 +(HL = 30):V$ =  LEFT$(V$, LEN(V$) -1 +(HL = 30)): IF HL = 30  THEN IE = 0: GOTO 1270
  91. 880  IF HL = 37  OR HL = 38  THEN  PRINT  CHR$(7)
  92. 890  IF (N$ <"0"  OR N$ >"9")  AND N$ < >"-"  AND N$ < >"E"  AND N$ < >"+"  AND N$ < >"."  THEN 850
  93. 900 HL = HL +1: IF HL = 40  THEN  PRINT  CHR$(7):IE = 3: GOTO 1270
  94. 910  GOTO 840
  95. 920  IF P <1  OR P >5  THEN IE = (P <1) *1 +(P >5) *2: GOTO 1270
  96. 930 P =  INT(P):RS =  INT(10/(P ^1.7) *120): GOTO 1260
  97. 940  IF P <10  OR P >255  THEN IE = (P <10) *1 +(P >255) *2: GOTO 1270
  98. 950 R1 =  INT(P/2 +2):R2 =  INT(275 -P/2):W = P:O1 = OX +W/2: VTAB V(3): HTAB 13: PRINT T$(1);: HTAB 13: PRINT R1"-"R2")": GOTO 1260
  99. 960  IF P <10  OR P >169  THEN IE = (P <10) *1 +(P >169) *2: GOTO 1270
  100. 970 R3 =  INT(P/2 +10):R4 =  INT(178 -P/2):R4 = R4 +(R4 <R3):H = P:O2 = OY -H/2: VTAB V(4): HTAB 13: PRINT T$(1);: HTAB 13: PRINT R3"-"R4")": GOTO 1260
  101. 980  IF P <R1  OR P >R2  THEN IE = (P <R1) *1 +(P >R2) *2: GOTO 1270
  102. 990 OX = P:O1 = OX +W/2: GOTO 1260
  103. 1000  IF P <R3  OR P >R4  THEN IE = (P <R3) *1 +(P >R4) *2: GOTO 1270
  104. 1010 OY = P:O2 = OY -H/2: GOTO 1260
  105. 1020  IF P >0  THEN P =  -P
  106. 1030 X2 = P: GOSUB 2960: ON AU GOSUB 1280:P = X2: GOTO 1260
  107. 1040 P =  ABS(P)
  108. 1050 X1 = P: GOSUB 2960: ON AU GOSUB 1280:P = X1: GOTO 1260
  109. 1060  IF P >0  THEN P =  -P
  110. 1070 Y2 = P:AU = 0: GOSUB 3040: GOTO 1260
  111. 1080 P =  ABS(P)
  112. 1090 Y1 = P:AU = 0: GOSUB 3040: GOTO 1260
  113. 1100 P =  ABS(P):XI = P: IF XI >( ABS(X2) > =  ABS(X1)) * ABS(X2) +( ABS(X1) > ABS(X2)) * ABS(X1)  THEN 1270
  114. 1110 AU = 0: GOSUB 3040: GOTO 1260
  115. 1120 P =  ABS(P):YI = P: IF YI >( ABS(Y2) > =  ABS(Y1)) * ABS(Y2) +( ABS(Y1) > ABS(Y2)) * ABS(Y1)  THEN 1270
  116. 1130 AU = 0: GOSUB 3040: GOTO 1260
  117. 1140 P =  ABS(P):NX = P: IF NX >( ABS(X2) > =  ABS(X1)) * ABS(X2) +( ABS(X1) > ABS(X2)) * ABS(X1)  THEN 1270
  118. 1150 AU = 0: GOSUB 3040: GOTO 1260
  119. 1160 P =  ABS(P):NY = P: IF NY >( ABS(Y2) > =  ABS(Y1)) * ABS(Y2) +( ABS(Y1) > ABS(Y2)) * ABS(Y1)  THEN 1270
  120. 1170 AU = 0: GOSUB 3040: GOTO 1260
  121. 1180  REM  ** POKE IN PARAMETERS **
  122. 1190 P =  ABS(P): ON I >4 GOTO 1200: POKE (32000 +I),P: GOTO 1250
  123. 1200 PA = 31990 +3 *I
  124. 1210  IF P = 0  THEN  POKE PA,0: POKE PA +1,0: POKE PA +2,100: GOTO 1240
  125. 1220 E1 =  INT( LOG(P)/ LOG(10)) -3:E2 = E1 +2:M1 =  INT(P/10 ^E1 +.5):M2 =  INT(M1/100):M3 = M1 -M2 *100
  126. 1230  POKE PA,M2: POKE PA +1,M3: POKE PA +2,100 -E1
  127. 1240  IF I = 5  OR I = 7  THEN P =  -P
  128. 1250  RETURN 
  129. 1260 E = 0:NI = P: GOSUB 2370:P$(I) = NI$:P(I) = P: VTAB V(I): HTAB 30: PRINT E$:II = I: GOSUB 3110: ON AU < >1 GOSUB 3080:AS = 1: RETURN 
  130. 1270  PRINT  CHR$(7): VTAB V(I): HTAB 30: INVERSE : PRINT IE$(IE);: FOR S = 0 TO 1000: NEXT : NORMAL : HTAB 30: PRINT E$:IE = 2: RETURN 
  131. 1280  GOSUB 2490: FOR II = 7 TO 12: GOSUB 3110: NEXT II: NORMAL : RETURN 
  132. 1290  FOR I = 0 TO 12:P = P(I): GOSUB 1190:: NEXT I: NORMAL : RETURN 
  133. 1300  REM ** CALCULATE LOCATION OF GRAPH **
  134. 1310 YY = H/(Y1 -Y2):XX = W/(X1 -X2)
  135. 1320 OX = (OX > = R1  AND OX < = R2) *OX +(OX <R1) *R1 +(OX >R2) *R2:P(3) = OX:P$(3) =  STR$(OX):O1 = OX +W/2
  136. 1330 OY = (OY > = R3  AND OY < = R4) *OY +(OY <R3) *R3 +(OY >R4) *R4:P(4) = OY:P$(4) =  STR$(OY):O2 = OY -H/2
  137. 1340 YC = O2 +Y1 *YY:XC = O1 -X1 *XX
  138. 1350  REM ** CHOOSE PLOTTING MODE **
  139. 1360  IF DS = 1  AND AX = 1  THEN  GOSUB 1410: GOTO 1820
  140. 1370  IF AX = 1  THEN  HGR2 : HCOLOR= CS: HGR2 : HPLOT 0,0: CALL 62454: GOTO 1820
  141. 1380  IF DS = 1  AND AS = 0  THEN  GOSUB 1410: GOTO 1820
  142. 1390  IF DS = 1  THEN  GOSUB 1410: GOTO 1440
  143. 1400  GOTO 1420
  144. 1410  POKE  -16297,0: POKE  -16299,0: POKE  -16302,0: POKE  -16304,0: RETURN 
  145. 1420  HGR2 : HCOLOR= CS: HPLOT 0,0: CALL 62454: HCOLOR= CP
  146. 1430  REM ** HPLOT AXES **
  147. 1440  FOR L = 1 TO 2
  148. 1450  HPLOT O1 -W +JX -1,YC -L +JY TO O1 -1 +JX,YC -L +JY: HPLOT XC -L +JX,O2 +JY -1 TO XC -L +JX,O2 +H +JY -1
  149. 1460  NEXT L
  150. 1470  REM  ** DRAW X-AXIS TICS AND NUMBERS **
  151. 1480  SCALE= 1: ROT= 0
  152. 1490  IF X1 > ABS(X2)  THEN  FOR R = X1 TO X2 +X2/1000  STEP  -XI: GOTO 1510
  153. 1500  FOR R = X2 TO X1 +X1/1000  STEP XI
  154. 1510 AD = R *XX
  155. 1520  IF R = 0  AND Y2 = 0  THEN 1550
  156. 1530  IF  ABS(R) <X1/100  THEN 1550
  157. 1540  DRAW 2 AT XC +AD +JX,YC +JY -2
  158. 1550  NEXT R
  159. 1560  IF X1 > ABS(X2)  THEN  FOR R = X1 TO X2 +X2/1000  STEP  -NX: GOTO 1580
  160. 1570  FOR R = X2 TO X1 +X1/100  STEP NX
  161. 1580 AD = R *XX: IF  ABS(R) <.01  THEN XD = R: GOTO 1600
  162. 1590 XD =  INT(10000 *R +.5)/10000
  163. 1600  IF  ABS(XD) < = X1/1E5  AND  ABS(Y2) <Y1/50  THEN XD = 0: GOTO 1620
  164. 1610  IF  ABS(XD) < = X1/50  THEN 1630
  165. 1620  GOSUB 2100
  166. 1630  NEXT R
  167. 1640  REM ** DRAW Y-AXIS TICS AND NUMBERS **
  168. 1650  ROT= 16
  169. 1660  IF Y1 > ABS(Y2)  THEN  FOR R = Y1 TO Y2 +Y2/1000  STEP  -YI: GOTO 1680
  170. 1670  FOR R = Y2 TO Y1 +Y1/1000  STEP YI
  171. 1680 BD = R *YY
  172. 1690  IF (R = O  AND X2 <0)  OR  ABS(R) <Y1/100  THEN 1710
  173. 1700  DRAW 2 AT XC -1 +JX,YC -BD +JY
  174. 1710  NEXT R
  175. 1720  IF Y1 > ABS(Y2)  THEN  FOR R = Y1 TO Y2 +Y2/1000  STEP  -NY: GOTO 1740
  176. 1730  FOR R = Y2 TO Y1 +Y1/100  STEP NY
  177. 1740 BD = R *YY: IF  ABS(R) <.01  THEN YD = R: GOTO 1760
  178. 1750 YD =  INT(10000 *R +.5)/10000
  179. 1760  IF  ABS(YD) < = Y1/1E5  AND  ABS(X2) <X1/50  THEN YD = 0: GOTO 1790
  180. 1770  IF  ABS(YD) <Y1/50  THEN 1800
  181. 1780  IF  ABS(YD) < ABS(Y2/50)  THEN 1800
  182. 1790  GOSUB 2230
  183. 1800  NEXT R
  184. 1810  REM ** PLOT FUNCTION **
  185. 1820  HCOLOR= CP
  186. 1830 ST =  ABS(X1 -X2)/RS: ROT= 0:YU = O2 +H +JY +11:YL = O2 +JY -9:XO = 0:YO = 0
  187. 1840 LY = O2:UY = O2 +P(2): REM  UPPER & LOWER Y-PLOT LIMITS
  188. 1850  FOR X3 = X2 TO X1  STEP ST:X = X3
  189. 1860  GOSUB 50
  190. 1870 XP = XC +X3 *XX:YP = YC -Y *YY: IF XP <O1 -W  OR XP >O1  THEN 2040
  191. 1880  IF YP >LY  AND YP <UY  AND YO >LY  AND YO <UY  THEN 1970
  192. 1890  IF YP <LY  AND YO > = UY  THEN YP = LY: GOTO 1980
  193. 1900  IF YP <LY  AND YO < = LY  THEN YP = LY: GOTO 1980
  194. 1910  IF YP >UY  AND YO > = UY  THEN YP = UY: GOTO 1980
  195. 1920  IF YP >UY  AND YO < = LY  THEN YP = UY: GOTO 1980
  196. 1930  IF YP <LY  AND YO >LY  AND YO <UY  THEN YP = LY: GOTO 1970
  197. 1940  IF YP >UY  AND YO >LY  AND YO <UY  THEN YP = UY: GOTO 1970
  198. 1950  IF XO = 0  AND YO = 0  THEN  HPLOT XP,YP: GOTO 2000
  199. 1960  IF YP >UY  THEN 2040
  200. 1970  HPLOT XO,YO TO XP,YP: GOTO 2000
  201. 1980  DRAW 13 AT XP +1,(YP = LY) *YL +(YP = UY) *YU:S =  PEEK( -16336)
  202. 1990  XDRAW 13 AT XP +1,(YP = LY) *YL +(YP = UY) *YU
  203. 2000 XO = XP:YO = YP
  204. 2010 R$ = "": IF  PEEK( -16384) >127  THEN  GET R$: POKE  -16368,0: IF R$ =  CHR$(32)  THEN 2050
  205. 2020  ON (R$ = "S"  AND T = 1) GOTO 470: IF R$ = "S"  THEN  GOSUB 2090: GOTO 690
  206. 2030  IF R$ = "M"  THEN 240
  207. 2040  NEXT X3
  208. 2050 XO = 0:YO = 0
  209. 2060 NU = 0: GET H$: ON (H$ = "S"  AND T = 1) GOTO 470: IF H$ = "S"  THEN  GOSUB 2090: GOTO 690
  210. 2070  IF H$ = "M"  THEN 240
  211. 2080  ON  ABS(X3) >X1  OR X3 = 0 GOTO 2060: ON H$ =  CHR$(32) GOTO 1980: GOTO 2060
  212. 2090  POKE  -16303,0: POKE  -16300,0: RETURN : REM SWITCH TO TEXT
  213. 2100  REM ** DRAW X-AXIS NUMBERS **
  214. 2110 NU = 1
  215. 2120  IF XD = 0  THEN 2140
  216. 2130  DRAW 2 AT XC +AD +JX,YC +JY -5
  217. 2140 NI = XD: GOSUB 2370:XD$ = NI$
  218. 2150 PO = 0: FOR LE =  LEN(XD$) TO 1  STEP  -1:DI$ =  MID$ (XD$,LE,1):X = XC +AD +PO:Y = YC +8 +AA: IF X <1  THEN 2220
  219. 2160  IF DI$ = "."  THEN  DRAW 11 AT X,Y: GOTO 2210
  220. 2170  IF DI$ = "-"  THEN  DRAW 13 AT X,Y: GOTO 2210
  221. 2180  IF DI$ = "+"  THEN  DRAW 12 AT X,Y: GOTO 2210
  222. 2190  IF DI$ = "E"  THEN  DRAW 14 AT X,Y: GOTO 2210
  223. 2200  DRAW  VAL(DI$) +1 AT X,Y
  224. 2210 PO = PO -6:AA = 0: NEXT LE
  225. 2220 DI$ = "": RETURN 
  226. 2230  REM ** DRAW Y-AXIS NUMBERS **
  227. 2240  IF X1 < ABS(X2)/10  THEN 2270
  228. 2250  IF YD = 0  THEN 2270
  229. 2260  DRAW 2 AT XC +5 +JX,YC -BD +JY
  230. 2270  ROT= 0
  231. 2280 NI = YD: GOSUB 2370:YD$ = NI$
  232. 2290 PO = 0: FOR LE =  LEN(YD$) TO 1  STEP  -1:DI$ =  MID$ (YD$,LE,1):X = XC +PO -8:Y = YC -BD +AA: IF X <1  THEN 2360
  233. 2300  IF DI$ = "."  THEN  DRAW 11 AT X,Y: GOTO 2350
  234. 2310  IF DI$ = "-"  THEN  DRAW 13 AT X,Y: GOTO 2350
  235. 2320  IF DI$ = "+"  THEN  DRAW 12 AT X,Y: GOTO 2350
  236. 2330  IF DI$ = "E"  THEN  DRAW 14 AT X,Y: GOTO 2350
  237. 2340  DRAW  VAL(DI$) +1 AT X,Y
  238. 2350 PO = PO -6:AA = 0: NEXT LE
  239. 2360  ROT= 16: RETURN 
  240. 2370  REM ** ROUND OFF EXPONENTIAL VALUES **
  241. 2380 CH = 0
  242. 2390  IF (NI > -1E +9  AND NI < -.0099999)  OR (NI >.009999  AND NI <1E +9)  OR (NI = 0)  THEN NI$ =  STR$(NI):CH = 1: RETURN 
  243. 2400  IF NI > = .01  AND NI <1E +9  THEN NI$ =  STR$(NI): RETURN 
  244. 2410 XY = NI
  245. 2420 N = 0: IF NI <0  THEN N = 1
  246. 2430 AB =  ABS(NI):AB$ =  STR$(AB):LG$ =  RIGHT$(AB$,3):LG =  VAL(LG$)
  247. 2440 A1 = AB/10 ^LG:A1 =  INT(100/10 ^NU *A1 +.5)/(100/10 ^NU)
  248. 2450 NI$ =  STR$(A1) +"E" +LG$
  249. 2460  IF N = 1  THEN NI$ = "-" +NI$
  250. 2470 NI =  VAL(NI$)
  251. 2480  RETURN 
  252. 2490  REM ** CALCULATE AUTO MAX & MIN VALUES FOR Y-AXIS **
  253. 2500 X = X2: GOSUB 50
  254. 2510  IF A = 0  OR A >0  THEN Y2 = 0: GOTO 2570
  255. 2520  IF A = Y  THEN Y2 = A: GOTO 2540
  256. 2530 Y = A: GOSUB 2640:Y2 = YY: IF  ABS(Y2) >10  THEN Y2 =  - INT( ABS(Y2))
  257. 2540 X = X1: GOSUB 50
  258. 2550  IF B = 0  OR B <0  THEN Y1 = 0: GOTO 2580
  259. 2560  IF B = Y  THEN Y1 = B: GOTO 2580
  260. 2570 Y = B: GOSUB 2640:Y1 = YY
  261. 2580  GOSUB 2690
  262. 2590 P(5) = X2:P(6) = X1:P(7) = Y2:P(8) = Y1:P(9) = XI:P(10) = YI:P(11) = NX:P(12) = NY
  263. 2600  FOR II = 5 TO 12:NI = P(II)
  264. 2610  GOSUB 2370:P(II) = NI:P$(II) = NI$
  265. 2620  NEXT II: GOSUB 3080
  266. 2630  RETURN 
  267. 2640 YA =  ABS(Y):N =  INT( LOG(YA)/ LOG(10))
  268. 2650  IF YA = 10 ^N  THEN YY = YA: GOTO 2670
  269. 2660 YY = (10 ^N) * INT((YA/10 ^N) +1)
  270. 2670  IF Y <0  THEN YY =  -YY
  271. 2680  RETURN 
  272. 2690  IF X1 = 0  THEN XI =  ABS(X2)/10: GOTO 2710
  273. 2700  IF X1 < =  ABS(X2)  THEN XI =  ABS(X2)/10:X1 = XI * INT(X1/XI +.5)
  274. 2710  IF X2 = 0  THEN XI = X1/10: GOTO 2730
  275. 2720  IF X1 > ABS(X2)  THEN XI = X1/10:X2 = XI * INT(X2/XI +.5)
  276. 2730  IF Y1 = 0  THEN YI =  ABS(Y2)/10: GOTO 2750
  277. 2740  IF Y1 < =  ABS(Y2)  THEN YI =  ABS(Y2)/10:Y1 = YI * INT(Y1/YI +.5)
  278. 2750  IF Y2 = 0  THEN YI = Y1/10: GOTO 2770
  279. 2760  IF Y1 > ABS(Y2)  THEN YI = Y1/10:Y2 = YI * INT(Y2/YI +.5)
  280. 2770 NY = 5 *YI:NX = 5 *XI: RETURN 
  281. 2780  REM ** LOAD SHAPE TABLE AND INITIAL PLOTTING DATA **
  282. 2790  FOR A = 768 TO 923: READ D: POKE A,D: NEXT : POKE 232,0: POKE 233,3
  283. 2800  FOR I = 0 TO 12: READ P(I):P$(I) =  STR$(P(I)): NEXT 
  284. 2810  RETURN 
  285. 2820  REM  ** SYNTAX ERROR IN FUNCTION OR DOS ERROR **
  286. 2830 ER =  PEEK(222): IF ER >15  THEN 2850
  287. 2840  TEXT : HOME : VTAB 5: PRINT "DISK ACCESS ERROR NO. "ER: VTAB 7: PRINT "CONSULT THE DOS MANUAL BEFORE PROCEEDING": GOTO 2860
  288. 2850  TEXT : HOME : VTAB 5: HTAB 1: PRINT "THE FUNCTION HAS A SYNTAX ERROR.": PRINT : PRINT "YOU MUST CORRECT IT BEFORE PROCEEDING."
  289. 2860  FOR A = 1 TO 3: CALL  -1059: NEXT : VTAB 20: HTAB 8: PRINT "PRESS ANY KEY TO CONTINUE": GET B$: PRINT : GOTO 240
  290. 2870  REM ** ILLEGAL QUANTITY OR OVERFLOW ERROR **
  291. 2880  POKE 216,0
  292. 2890  IF E > = 2  THEN  RUN 
  293. 2900  VTAB 21: HTAB 1: PRINT SP$: VTAB 22: HTAB 1: PRINT SP$
  294. 2910  TEXT : HOME : HTAB 1: VTAB 21: FLASH : PRINT "ILLEGAL QUANTITY OR OVERFLOW ERROR": INVERSE : HTAB 16:: PRINT "TRY AGAIN";: NORMAL 
  295. 2920  PRINT  CHR$(7); CHR$(7); CHR$(7)
  296. 2930  FOR S = 1 TO 1000: NEXT 
  297. 2940 E = E +1
  298. 2950  GOTO 670
  299. 2960  REM  ** CALCULATE Y AXIS LIMITS FOR DISPLAY **
  300. 2970  ONERR  GOTO 2870
  301. 2980  VTAB 21: HTAB 1: PRINT SP$
  302. 2990  FLASH : VTAB 21: HTAB 15: PRINT "STAND BY": NORMAL :X = X1: GOSUB 50:A = Y:B = Y:SP = (X1 -X2)/25: FOR X = X2 TO X1  STEP SP: GOSUB 50: IF B <Y  THEN B = Y
  303. 3000  IF A >Y  THEN A = Y
  304. 3010  NEXT X
  305. 3020  VTAB 21: PRINT SP$: VTAB 21: PRINT "CALC Y LIMITS: ";: INVERSE : PRINT A" TO "B: NORMAL 
  306. 3030  RETURN 
  307. 3040  REM  ** DISPLAY STATUS OF AXIS AND AUTO SWITCHES **
  308. 3050  VTAB 5: HTAB 15: PRINT AX$(AX)
  309. 3060  VTAB 5: HTAB 38: PRINT AU$(AU)
  310. 3070  RETURN 
  311. 3080 PS = P(0):W = P(1):H = P(2):OX = P(3):OY = P(4):X2 = P(5):X1 = P(6):Y2 = P(7):Y1 = P(8):XI = P(9):YI = P(10):NX = P(11):NY = P(12)
  312. 3090  RETURN 
  313. 3100  REM ** UPDATE SPREADSHEET **
  314. 3110  NORMAL :HT = 29 - LEN(P$(II)): VTAB V(II): HTAB 17 +8 *(II <5): PRINT T$(II >4);: INVERSE : HTAB HT: PRINT P$(II): RETURN 
  315. 3120  REM ** BLOAD GRAPH **
  316. 3130  HOME : HTAB 9: INVERSE : PRINT "RECOVER GRAPH FROM DISK": NORMAL 
  317. 3140  VTAB 5: INPUT "WHAT IS NAME OF GRAPH? ";G$
  318. 3150  VTAB 8: HTAB 1: PRINT "YOU CHOSE: ";: INVERSE : PRINT G$: NORMAL 
  319. 3160  VTAB 10: HTAB 1: PRINT "OK? (Y/N) ";: GET Y$: PRINT : IF Y$ = "N"  THEN 3130
  320. 3170  VTAB 15: HTAB 1: PRINT "PUT PROPER DISK IN THE DRIVE AND        HIT ANY KEY ";: GET R$: PRINT 
  321. 3180  FLASH : VTAB 18: HTAB 16: PRINT "LOADING": NORMAL 
  322. 3190  HGR2 : PRINT  CHR$(4);"BLOAD ";G$",A$4000"
  323. 3200  GOTO 2060
  324. 3210  REM ** BSAVE GRAPH **
  325. 3220  HOME : INVERSE : HTAB 11: PRINT "SAVE GRAPH TO DISK"
  326. 3230  NORMAL : VTAB 5: INPUT "WHAT IS NAME OF GRAPH? ";N$
  327. 3240  VTAB 8: HTAB 1: PRINT "YOU CHOSE: ";: INVERSE : PRINT N$
  328. 3250  NORMAL 
  329. 3260  VTAB 10: HTAB 1: PRINT "OK?(Y/N) ";: GET Y$: IF Y$ = "N"  THEN 3220
  330. 3270  VTAB 15: HTAB 1: PRINT "INSERT PROPER DISK IN DRIVE             AND HIT ANY KEY TO SAVE ";: GET R$
  331. 3280  FLASH : VTAB 18: HTAB 17: PRINT "SAVING": NORMAL 
  332. 3290  PRINT : PRINT  CHR$(4);"BSAVE "N$;",A$4000,L$2000"
  333. 3300  GOTO 240
  334. 3310  DATA 14,0,30,0,40,0,46,0,56,0,69,0,78,0,90,0,100,0,107,0,119,0,129,0,133,0,141,0,145,0,36,60,63,54,54,54,45,37,36,0,147,34,36,36,36,0,146,63,39,36,45
  335. 3320  DATA 37,36,63,39,0,59,15,24,8,24,45,53,54,54,62,63,4,0,59,39,36,77,54,54,54,4,0,8,24,56,63,54,46,45,54,62,63,4,0,27,45,54,62,63,36,36,36,4,0,146,36
  336. 3330  DATA 36,36,63,39,0,32,60,63,54,46,45,54,62,63,36,4,0,146,36,36,36,63,55,54,45,4,0,18,55,37,0,63,63,12,88,49,22,38,0,63,63,4,0,59,39,36,45,181,146,58,63,36,4,0
  337. 3340  DATA  3,240,169,140,94,-10,10,-1,1,1,.1,5,.5