home *** CD-ROM | disk | FTP | other *** search
/ Play and Learn 2 / 19941.ZIP / 19941 / EDUCMATH / ALGEBRA / CBS.BAS (.txt) < prev    next >
Encoding:
GW-BASIC  |  1994-02-04  |  40.3 KB  |  812 lines

  1. 1  DEF SEG=0:POKE 108,&H39:POKE 109,&HE7:POKE 110,&H0:POKE 111,&HF0
  2. 2  DEF SEG=64:POKE 23,&H40 OR PEEK(23)
  3. 3  KEY OFF:CLEAR ,&HF000
  4. 4  KEY (9) ON:KEY(10) ON: ON KEY(9) GOSUB 55000: ON KEY(10) GOSUB 55020
  5. 5  COMMON N$,CHN.LOC!
  6. 6  GOSUB 55100
  7. 8  CLS:FOR I=1 TO 10:KEY I,"":NEXT
  8. 9   '
  9. 10  '*******************************
  10. 11  '*  Graphing Linear Functions  *
  11. 12  '*                             *
  12. 13  '*  By the Owego Translators   *
  13. 14  '*                             *
  14. 15  '*      Copyright 1984         *
  15. 16  '*  Microcomputer Workshops    *
  16. 17  '*-----------------------------*
  17. 18  '*  Extensively Revised &      *
  18. 19  '*  Debugged by Kevin Vessio   *
  19. 20  '*           2/8/85            *
  20. 21  '*******************************
  21. 22  '
  22. 100  GOSUB 50000         ' Introduction
  23. 120  GOSUB 47100         ' Data
  24. 150  GOSUB 51000         ' Get name
  25. 790  ' ***************
  26. 792  ' *  Main Menu  *
  27. 794  ' ***************
  28. 800  CLS:LOCATE 4,16:DEF SEG:POKE &H4E,1:PRINT"M E N U":PRINT TAB(16)STRING$(7,174):LOCATE 8,2:POKE &H4E,3:PRINT"<1> Instructions":PRINT:PRINT" <2> Easy problems (in the form y=mx+b)"
  29. 805  PRINT:PRINT" <3> Hard problems (other forms)":PRINT:PRINT" <4> Mixed problems":PRINT:PRINT" <5> Exit the program"
  30. 809  LOCATE 20,3:POKE &H4E,1:PRINT"Your selection:  ";:POKE &H4E,3
  31. 810  IN$=" "
  32. 830  WHILE INSTR("12345",IN$)=0:GOSUB 28900:WEND
  33. 831  LOCATE ,POS(0)-1:PRINT IN$;
  34. 840  K%=VAL(IN$)
  35. 845  ON K% GOSUB 850,900,900,900,1300
  36. 850  CHN.LOC!=855
  37. 852  CHAIN"INSTR.BAS"
  38. 855  GOSUB 47000 ' restore data
  39. 860  GOTO 800
  40. 892  ' **************************
  41. 894  ' * Get number of problems *
  42. 896  ' **************************
  43. 900  CLS:LOCATE 3,1:PRINT N$",":LOCATE 5,1:PRINT"you may try up to 9 problems.":PRINT :PRINT:PRINT "How many would you like?  ";
  44. 905  GOSUB 28900:IF IN$<"1" OR IN$>"9" THEN 905
  45. 910  N%=VAL(IN$):PRINT CHR$(29)IN$;
  46. 935  DEF SEG=0:POKE 1052,PEEK(1050):DEF SEG    ' Clear Keyboard Buffer
  47. 990  ' **************************
  48. 992  ' *  Do a set of problems  *
  49. 996  ' **************************
  50. 1000  P%=1: K%=K%-1:QT%=0
  51. 1010  WHILE P% <= N% AND NOT QT%
  52. 1020    GOSUB 10000                      ' solve and graph
  53. 1030    GOSUB 2000                       ' error analysis
  54. 1040    P%=P%+1
  55. 1050  WEND
  56. 1192  ' *************************
  57. 1194  ' *  Final error summary  *
  58. 1196  ' *************************
  59. 1200  P%=P%-1
  60. 1210  CLS:POKE &H4E,1:PRINT TAB(10);"Total Error Analysis":PRINT TAB(10);STRING$(19,174):POKE &H4E,3
  61. 1220  LOCATE 3,33:PRINT "Average":LOCATE 4,35:PRINT "per":LOCATE 5,8:PRINT "Error";:LOCATE 5,26:PRINT "Total";:LOCATE 5,33:PRINT "Problem";
  62. 1221  LOCATE 6,1:PRINT TAB(8);STRING$(5,174);TAB(26);STRING$(5,174);TAB(33);STRING$(7,174)
  63. 1230  LOCATE 9:PRINT "Solving for a Variable .. ";USING"###";E5%;:LOCATE ,33:PRINT USING"###.##";E5%/P%
  64. 1235  LOCATE 11:PRINT "Selecting Points ........ ";USING"###";E6%;:LOCATE ,33:PRINT USING"###.##";E6%/P%
  65. 1240  LOCATE 13:PRINT "Plotting Points ......... ";USING"###";E7%;:LOCATE ,33:PRINT USING"###.##";E7%/P%
  66. 1245  LOCATE 15:PRINT "Calculation ............. ";USING"###";E8%;:LOCATE ,33:PRINT USING"###.##";E8%/P%
  67. 1250  LOCATE 17:PRINT "Total ................... ";USING"###";E5%+E6%+E7%+E8%;:LOCATE ,33:PRINT USING"###.##";(E5%+E6%+E7%+E8%)/P%
  68. 1255  E5%=0:E6%=0:E7%=0:E8%=0
  69. 1258  LOCATE 20,8:DEF SEG:POKE &H4E,1:PRINT"You completed"P%"problem";:IF P%=1 THEN PRINT".":ELSE PRINT"s."
  70. 1260  POKE &H4E,3:GOSUB 15000:GOTO 800
  71. 1290  ' ***************
  72. 1292  ' * End program *
  73. 1294  ' ***************
  74. 1300  LOCATE 16,1:SYSTEM
  75. 1330  END
  76. 1990  ' ***********************************
  77. 1992  ' *  Single problem error analysis  *
  78. 1994  ' ***********************************
  79. 2000  CLS:POKE &H4E,1:PRINT TAB(6)"Error Summary for Problem #";USING"#";P%:PRINT TAB(6)STRING$(28,174);
  80. 2010  POKE &H4E,3
  81. 2020  LOCATE 5,8:PRINT "Error";TAB(33);"Number"
  82. 2030  LOCATE 6,8:PRINT STRING$(5,174);TAB(33);STRING$(6,174)
  83. 2040  LOCATE 7,1 :PRINT "Solving for a variable ......... ";USING "###";E1%
  84. 2050  LOCATE 9,1 :PRINT "Selecting points ............... ";USING "###";E2%
  85. 2060  LOCATE 11,1:PRINT "Plotting Points ................ ";USING "###";E3%
  86. 2070  LOCATE 13,1:PRINT "Calculation .................... ";USING "###";E4%
  87. 2075  ZZ%=E1%+E2%+E3%+E4%
  88. 2080  LOCATE 15,1:PRINT "Total .......................... ";USING "###";ZZ%
  89. 2090  IF ZZ%=0 THEN ZZ%=FN R(4)-1:ELSE IF ZZ%=1 THEN ZZ%=FN R(4)+3:ELSE ZZ%=FN R(4)+7
  90. 2100  POKE &H4E,1:LOCATE 20,1:PRINT TAB(FN MID(ME$(ZZ%)))ME$(ZZ%):POKE &H4E,3
  91. 2110  E5%=E5%+E1%:E6%=E6%+E2%:E7%=E7%+E3%:E8%=E8%+E4%
  92. 2120  E1%=0:E2%=0:E3%=0:E4%=0
  93. 2130  IF P%=N% THEN GOSUB 15000:GOTO 2170
  94. 2140  DEF SEG:LOCATE 25,6:PRINT "Press ";:POKE &H4E,1:PRINT "ENTER";:POKE &H4E,3:PRINT " for more, ";:POKE &H4E,1:PRINT "Q";:POKE &H4E,3:PRINT " to quit.";
  95. 2150  ZZ%=ASC(INPUT$(1)):IF ZZ%<>13 AND ZZ%<>81 AND ZZ%<>113 THEN 2150
  96. 2160  QT%=ZZ%<>13:CLS
  97. 2170  RETURN
  98. 9090  ' ********************
  99. 9095  ' *  Do one problem  *
  100. 9098  ' ********************
  101. 10000  GOSUB 45000               ' create problem
  102. 10020  GOSUB 46000               ' set up equation
  103. 10030  CLS
  104. 10040  VP%=1:START%=1:GOSUB 20000:START%=0
  105. 10050  LOCATE 1,1:POKE &H4E,1:PRINT "Graph:";:LOCATE 2,1:PRINT STRING$(6,174);:POKE &H4E,3
  106. 10100  LINE (0,12)-(320,12),1
  107. 10120  LOCATE 10,1:IF TY%<>1 AND B%<>0 THEN PRINT "   The first step in graphing this":PRINT :PRINT "equation is to solve it for y.":SV$="y":GOTO 10160
  108. 10130  IF B%=0 AND TY%<>1 THEN LOCATE 5,1:PRINT "   Well, "N$", this problem is an":PRINT :PRINT "unusual one.  Normally, you would solve":PRINT :PRINT "the original equation for Y; but Y":PRINT :PRINT "doesn't appear in this equation, so you":PRINT
  109. 10140  IF B%=0 AND TY%<>1 THEN PRINT "solve for x instead.":SV$="x"
  110. 10150  IF LS$="x" THEN 10170
  111. 10160  IF TY%<>1 THEN GOSUB 15000: LOCATE 3,1:GOSUB 35000:LOCATE 4,1:GOSUB 25000
  112. 10170  GOSUB 15000
  113. 10180  GOSUB 23000       ' graph equation
  114. 10190  RETURN
  115. 10990  ' ****************************
  116. 10992  ' *  Solve for three values  *
  117. 10994  ' ****************************
  118. 11000  GOSUB 30000:PRINT "  Now you must find three points on":PRINT :PRINT "the line.  Don't forget to choose points":PRINT "that fit on our graph and have integral":PRINT :PRINT "coordinates.":GOSUB 15000:GOSUB 30000
  119. 11010  FOR PP=1 TO 3:WR=0
  120. 11020  GOSUB 30000:PRINT "Enter the ";IV$;" coordinate:  ";:GOSUB 22000
  121. 11030  GOSUB 30000
  122. 11040  T5%=VAL(ZZ$)
  123. 11050  IF ABS(T5%)>= TC% THEN GOSUB 30000:PRINT"  I'm sorry, ";N$;", but the graph":PRINT:PRINT"we use only fits points with":PRINT:PRINT "coordinates between ";1-TC%;"and ";FN NUMSIGN$(TC%-1,1);".":GOSUB 15000:GOSUB 30000:E2%=E2%+1:GOTO 11020
  124. 11060  IF (PP>1 AND T5%=P%(1,1-(B%=0))) OR (PP=3 AND T5%=P%(2,1-(B%=0))) THEN GOSUB 30000:PRINT "  Choose a different value.  You":PRINT :PRINT "already used that one.":GOSUB 15000:GOSUB 30000:GOTO 11020
  125. 11070  IF A%=0 THEN 11220
  126. 11080  IF B%=0 THEN 11230
  127. 11090  VA$="":TE$=FN NUMSIGN$(T5%,1):IF RX%(0)<>RX%(1) THEN CO%(0)=RX%(0):CO%(1)=RX%(1):GOSUB 19000:TE$="("+FN SIGNSTR$(RE$)+")("+TE$+")"
  128. 11100  IF C% THEN TE$=TE$+S.SIGNS$(FN NEG(C%/B%))+FN RIGHTOF$(STR$(C%/B%))
  129. 11110  IF NOT FN WH(T5%*A%/B%) THEN GOSUB 30000:PRINT "  That's a poor choice, ";N$;".":PRINT :PRINT "If ";IV$;" is ";FN NUMSIGN$(T5%,1);", then ";DV$;" will not be":PRINT :PRINT "an integer.":GOTO 11140
  130. 11120  IF ABS ((C%-A%*T5%)/B%)>= TC% THEN GOSUB 30000:PRINT "  We can't plot that, "N$".":PRINT :PRINT "If "IV$" is ";FN NUMSIGN$(T5%,1);", then "DV$" will not be in the":PRINT :PRINT "range "1-TC%"to "FN NUMSIGN$(TC%-1,1)".":GOTO 11140
  131. 11130  GOTO 11150
  132. 11140  PRINT :PRINT TE$" = ";:CO%(0)=C%-A%*T5%:CO%(1)=B%:RD%=1:GOSUB 19000:RD%=1:PRINT FN SIGNSTR$(RE$):GOSUB 15000:GOSUB 30000:E2%=E2%+1:WR=WR+1:IF WR=1 THEN 11020
  133. 11142  IF FN WH(T5% * A% / B%) THEN 11020
  134. 11145  GOSUB 30000:PRINT"   Use zero or a number that is":PRINT:PRINT"divisible by the denominator of the":PRINT:PRINT"coefficient of x.":GOSUB 15000:GOTO 11020
  135. 11150  P%(PP,1)=T5%:LOCATE 6+2*PP,6-LEN(STR$(P%(PP,1))),0:PRINT P%(PP,1);:LOCATE ,HP%:PRINT DV$" = "TE$:IF RX%(0)=RX%(1) THEN 11180
  136. 11160  GOSUB 30000:VA$="":CO%(0)=RX%(0):CO%(1)=RX%(1):GOSUB 19000:PRINT FN SIGNSTR$(RE$)" * ";FN NUMSIGN$(P%(PP,1),1);" =  ";:GOSUB 22000
  137. 11170  IF VAL(ZZ$)<>RX%(0)*P%(PP,1)/RX%(1) THEN GOSUB 30000:PRINT "  That is incorrect, "N$".":PRINT :PRINT FN SIGNSTR$(RE$)" * ";FN NUMSIGN$(P%(PP,1),1)" = "FN NUMSIGN$(RX%(0)*P%(PP,1)/RX%(1),1):GOSUB 15000:E4%=E4%+1:GOTO 11160
  138. 11180  IF C%=0 THEN 11240
  139. 11190  LOCATE 19,1:GOSUB 35000:PRINT FN NUMSIGN$(RX%(0)*P%(PP,1)/RX%(1),1);S.SIGNS$(FN NEG(C%/B%));FN NUMSIGN$(C%/B%,0);" =  ";:GOSUB 22000
  140. 11200  P%(PP,2)=(C%-A%*P%(PP,1))/B%
  141. 11205  IF VAL(ZZ$)<>P%(PP,2) THEN LOCATE 19,1:GOSUB 35000:PRINT "  That is incorrect, "N$".":PRINT :PRINT FN NUMSIGN$(RX%(0)*P%(PP,1)/RX%(1),1);S.SIGNS$(FN NEG(C%/B%));FN NUMSIGN$(C%/B%,0);" = ";FN NUMSIGN$(P%(PP,2),1):GOSUB 15000:E4%=E4%+1:GOTO 11190
  142. 11210  LOCATE 6+2*PP,33:PRINT SPC(7);:LOCATE ,36-LEN(STR$(P%(PP,2))):PRINT P%(PP,2);SPC(40-(36-LEN(STR$(P%(PP,2)))));:GOTO 11240
  143. 11220  P%(PP,1)=T5%:P%(PP,2)=C%/B%:LOCATE 6+2*PP,6-LEN(STR$(P%(PP,1))):PRINT P%(PP,1);:LOCATE ,HP%:PRINT DV$" = "FN NUMSIGN$(P%(PP,2),1);:LOCATE ,33:PRINT SPC(7);:LOCATE ,36-LEN(STR$(P%(PP,2))):PRINT P%(PP,2):GOTO 11240
  144. 11230  P%(PP,2)=T5%:P%(PP,1)=C%/A%:LOCATE 6+2*PP,6-LEN(STR$(P%(PP,2))):PRINT P%(PP,2);:LOCATE ,HP%:PRINT DV$" = "FN NUMSIGN$(P%(PP,1),1);:LOCATE ,33:PRINT SPC(7);:LOCATE ,36-LEN(STR$(P%(PP,1))):PRINT P%(PP,1):GOTO 11240
  145. 11240  GOSUB 30000: ON FN R(3) GOTO 11250,11260,11270
  146. 11250  PRINT "  Excellent, "N$".":GOTO 11280
  147. 11260  PRINT "  Nice work, "N$".":GOTO 11280
  148. 11270  PRINT "  That's it, "N$"."
  149. 11280  GOSUB 15000:GOSUB 30000
  150. 11290  NEXT PP
  151. 11300  RETURN
  152. 11990  ' ************************************
  153. 11992  ' *  Plot three points screen setup  *
  154. 11994  ' ************************************
  155. 12000  PRINT "  Now that you've found three points,":PRINT :PRINT "it's time to plot them.":GOSUB 15000:CLS
  156. 12010  MG%=-1:GOSUB 17000
  157. 12020  LINE(201,10)-(292,10),1:LINE(201,12)-(292,12),1:LINE(245,0)-(245,40),1:LINE(247,0)-(247,40),1:LOCATE 1,28:PRINT "x";:LOCATE ,35:PRINT "y"
  158. 12030  FOR ZZ=1 TO 3:LOCATE ZZ+2,29-LEN(STR$(P%(ZZ,1))):PRINT P%(ZZ,1);:LOCATE ,36-LEN(STR$(P%(ZZ,2))):PRINT P%(ZZ,2):NEXT ZZ
  159. 12040  LOCATE 8,32:PRINT CHR$(24):LOCATE ,32:PRINT "I":LOCATE ,30:PRINT CHR$(27)"J K"CHR$(26):LOCATE ,32:PRINT "M":LOCATE ,32:PRINT CHR$(25)
  160. 12050  LOCATE 13,24:PRINT "Press ";:DEF SEG:POKE &H4E,1:PRINT "ENTER";:POKE &H4E,3:PRINT " when";:LOCATE 14,24:PRINT "the cursor is on":LOCATE ,24:PRINT "the right point."
  161. 12060  RETURN
  162. 12990  ' ********************
  163. 12992  ' *  Position Cursor *
  164. 12994  ' ********************
  165. 13000  X%=0:Y%=0:PL%=0
  166. 13010  PUT(FN HC(X%)-4,FN VC(Y%)-4),X.MARK#:PL%=NOT PL%
  167. 13023  FREQ=45-(ABS(CX%-X%)+ABS(CY%-Y%))
  168. 13025  IF H2% THEN PLAY"mbmnt200;l32;n=freq;"
  169. 13030  IF H1% THEN LOCATE 19,31:DX%=X%:DY%=Y%:GOSUB 36000:IF X%<>-10 OR Y%<>-10 THEN PRINT SPC(40-POS(0));
  170. 13040  ZZ$=INKEY$:CU.K=0:IF ZZ$="" THEN 13010
  171. 13050  IF LEN(ZZ$)>1 THEN ZZ$=MID$(ZZ$,2,1):CU.K=1
  172. 13060  ZZ%=ASC(ZZ$)
  173. 13070  IF ZZ%<>13 AND INSTR(ACCEPT.KEYS$,ZZ$)=0 THEN 13010
  174. 13080  IF PL% THEN PUT(FN HC(X%)-4,FN VC(Y%)-4),X.MARK#:PL%=0
  175. 13090  IF ZZ%=13 THEN 13160
  176. 13100  ON ((INSTR(4*CU.K+1,ACCEPT.KEYS$,ZZ$)-1) MOD 4)+1 GOTO 13120,13130,13140,13150
  177. 13110  GOTO 13010
  178. 13120  Y%=Y%+ABS(Y%<>TC%-1):GOTO 13010
  179. 13130  X%=X%-ABS(X%<>1-TC%):GOTO 13010
  180. 13140  X%=X%+ABS(X%<>TC%-1):GOTO 13010
  181. 13150  Y%=Y%-ABS(Y%<>1-TC%):GOTO 13010
  182. 13160  IF NOT PL% THEN PUT(FN HC(X%)-4,FN VC(Y%)-4),X.MARK#:PL%=-1
  183. 13170  RETURN
  184. 13990  ' *****************************
  185. 13992  ' *  Plot a point at CX%,CY%  *
  186. 13994  ' *****************************
  187. 14000  GOSUB 31000:LOCATE 17,24:POKE &H4E,2:PRINT "Plot:  ";:POKE &H4E,3:DX%=CX%:DY%=CY%:GOSUB 36000
  188. 14010  H1%=0:H2%=0
  189. 14020  GOSUB 13000:IF X%=CX% AND Y%=CY% THEN 14230
  190. 14030  FOR ZZ=13 TO 15:LOCATE ZZ,24:PRINT STRING$(16,32);:NEXT:GOSUB 31000:E3%=E3%+1
  191. 14040  IF X%=CY% AND Y%=CX% THEN PRINT "  That's close, ";N$;"; but it looks":LOCATE 22,1:PRINT "like you've mixed up x and y.  You":PRINT "plotted ";:DX%=X%:DY%=Y%:GOSUB 36000:PRINT ".":GOTO 14080
  192. 14050  IF ABS(X%)=ABS(CX%) AND ABS(Y%)=ABS(CY%) THEN PRINT "  You're not too far off, ";N$;".":PRINT "You just have to keep better track of":PRINT "signs.  You found ";:DX%=X%:DY%=Y%:GOSUB 36000:PRINT ".":GOTO 14080
  193. 14060  PRINT "  You've made a mistake, ";N$;".":PRINT "The point you plotted is ";:DX%=X%:DY%=Y%:GOSUB 36000:PRINT "."
  194. 14080  GOSUB 15000:GOSUB 31000:PUT(FN HC(X%)-4,FN VC(Y%)-4),X.MARK#
  195. 14090  PRINT:PRINT"Do you want sound clues (Y or N)?  ";
  196. 14095  GOSUB 28900:IF IN$="Y" OR IN$="y" THEN TH%=2:PRINT CHR$(29)"Y";:ELSE TH%=1:IF IN$<>"N" AND IN$<>"n" THEN 14095:ELSE PRINT CHR$(29)"N";
  197. 14100  GOSUB 31000:PRINT "  Try it again.  This time I'll help":IF TH%=1 THEN PRINT "by keeping track of the cursor's":PRINT "position.":H1%=1:GOTO 14120
  198. 14110  PRINT "by beeping.  The closer you get to the":PRINT "right point, the higher I'll beep.":H2%=1
  199. 14120  LOCATE 17,24:POKE &H4E,2:PRINT "Plot:  ";:POKE &H4E,3:DX%=CX%:DY%=CY%:GOSUB 36000
  200. 14130  IF H1% THEN LOCATE 19,24:POKE &H4E,1:PRINT "Cursor:";:POKE &H4E,3
  201. 14140  GOSUB 12050:GOSUB 13000: IF X%=CX% AND Y%=CY% THEN 14230
  202. 14150  E3%=E3%+1:FOR ZZ=13 TO 15:LOCATE ZZ,24:PRINT STRING$(16,32);:NEXT
  203. 14160  GOSUB 31000:PRINT "  Sorry ";N$;", that's still not":PRINT "right.  You plotted ";:DX%=X%:DY%=Y%:GOSUB 36000:PRINT ".":GOSUB 15000:GOSUB 31000
  204. 14170  PUT(FN HC(X%)-4,FN VC(Y%)-4),X.MARK#:PRINT "  Let me show you the point you should":PRINT "be plotting.":GOSUB 15000
  205. 14180  GOSUB 31000:PRINT:PRINT "  Look carefully and you'll see it."
  206. 14190  FOR ZZ=1 TO 30:PUT(FN HC(CX%)-4,FN VC(CY%)-4),P.POINT#
  207. 14200  FOR ZZZ=1 TO 20:NEXT ZZZ
  208. 14210  NEXT ZZ
  209. 14220  GOSUB 31000:PRINT:PRINT "  Okay ";N$;", now you find it.":GOTO 14120
  210. 14230  PUT(FN HC(X%)-4,FN VC(Y%)-4),X.MARK#:GOSUB 31000: ON FN R(3) GOTO 14240,14250:PRINT "  Good work, ";N$;".":PRINT "You found the right point.":GOTO 14260
  211. 14240  PRINT "  Brilliant job, ";N$;".":PRINT "That's the point you were looking for.":GOTO 14260
  212. 14250  PRINT "  Excellent, ";N$;".":PRINT "There's the point you wanted."
  213. 14260  PRESET(FN HC(CX%),FN VC(CY%)):DRAW"c2"+OBJ.THR$
  214. 14265  LOCATE 17,24:PRINT SPC(16);:LOCATE 19,24:PRINT SPC(16);
  215. 14270  RETURN
  216. 14990  ' *********************
  217. 14992  ' *  Wait for RETURN  *
  218. 14994  ' *********************
  219. 15000  LOCATE 25,9:PRINT "Press ";:POKE &H4E,1:PRINT "ENTER";:POKE &H4E,3:PRINT " to continue.";
  220. 15010  DEF SEG=0:POKE 1052,PEEK(1050):DEF SEG
  221. 15020  WHILE INKEY$<>CHR$(13):WEND
  222. 15030  LOCATE 25,1:GOSUB 35000:RETURN
  223. 15990  ' ********************
  224. 15992  ' *  Set up T graph  *
  225. 15994  ' ********************
  226. 16000  LOCATE 3,1:GOSUB 35000
  227. 16010  IF B%=0 AND (LS$="y" OR LS$="x") THEN E$=LS$+" = "+E$:GOTO 16025
  228. 16020  IF B%=0 AND (E$="y" OR E$="x") THEN E$=E$+" = "+LS$:RX%(0)=LX%(0):RX%(1)=LX%(1):RC%(0)=LC%(0):RC%(1)=LC%(1):LX%(0)=0:LX%(1)=1:LC%(0)=0:LC%(1)=0
  229. 16025  IF B%=0 THEN LOCATE 6,5:PRINT"y";:HP%=FN MID(E$):LOCATE ,HP%:PRINT E$;:LOCATE ,35:PRINT"x":GOTO 16060
  230. 16045  IF E$="y" THEN E$=E$+" = "+LS$:RX%(0)=LX%(0):RX%(1)=LX%(1):RC%(0)=LC%(0):RC%(1)=LC%(1):LX%(0)=0:LX%(1)=1:LC%(0)=0:ELSE E$=LS$+" = "+E$
  231. 16050  POKE &H4E,3:LOCATE 6,5:PRINT "x";:HP%=FN MID(E$):LOCATE ,HP%:PRINT E$;:LOCATE ,35:PRINT "y"
  232. 16060  LINE(14,49)-(298,49),2:LINE(14,51)-(298,51),2:LINE(56,40)-(56,103),2:LINE(58,40)-(58,103),2:LINE(253,40)-(253,103),2:LINE(255,40)-(255,103),2
  233. 16070  LINE(0,113)-(319,116),1,BF
  234. 16080  IV$="x":DV$="y":IF B%=0 THEN IV$="y":DV$="x"
  235. 16090  RETURN
  236. 16990  ' **************************
  237. 16992  ' *  Set up axis and Grid  *
  238. 16994  ' **************************
  239. 17000  LINE(0,0)-(160,200),0,BF:LOCATE 6,20:GOSUB 35000
  240. 17050  IF NOT MG% THEN 17080
  241. 17060  LINE (FN HC(-TC%)+2, FN VC(0)+1)-( FN HC(TC%) - 2, FN VC(0)+1),3
  242. 17070  LINE (FN HC(0)-1, FN VC(-TC%)-2)-( FN HC(0) - 1, FN VC(TC%)+2),3
  243. 17080  LINE (FN HC(-TC%),FN VC(0))-(FN HC(TC%),FN VC(0)),3:LINE (FN HC(0),FN VC(-TC%))-(FN HC(0),FN VC(TC%)),3
  244. 17090  PRESET(FN HC(-TC%),FN VC(0)):DRAW "c3a0"+OBJ.ONE$:PRESET(FN HC(0), FN VC(TC%)):DRAW"c3a3"+OBJ.ONE$:PRESET(FN HC(TC%),FN VC(0)):DRAW"c3a2"+OBJ.ONE$:PRESET(FN HC(0),FN VC(-TC%)):DRAW"c3a1"+OBJ.ONE$
  245. 17100  IF NOT MG% THEN FOR ZZ=1-TC% TO TC%-1:LINE(FN HC(ZZ),FN VC(0)-4)-(FN HC(ZZ),FN VC(0)+4),1:LINE (FN HC(0)-4,FN VC(ZZ))-(FN HC(0)+4,FN VC(ZZ)),1:NEXT ZZ:GOTO 17120
  246. 17110  FOR ZZ=1 TO TC%: LINE (FN HC(-ZZ),FN VC(TC%))-(FN HC(ZZ),FN VC(-TC%)),1,B:LINE(FN HC(-TC%),FN VC(ZZ))-(FN HC(TC%),FN VC(-ZZ)),1,B:NEXT ZZ
  247. 17120  LOCATE 2,9:PRINT "y":LOCATE 9,19:PRINT "x"
  248. 17130  DRAW"c3a0;bm1,83"+NEG$+"bl1"+TEN$:DRAW"c3a0;bm39,83"+NEG$+"br1"+FIVE$
  249. 17140  DRAW"c3a0;bm81,4"+TEN$:DRAW"c3a0;bm86,39"+FIVE$
  250. 17150  DRAW"c3a0;bm114,80"+FIVE$:DRAW"c3a0;bm144,80"+TEN$
  251. 17160  DRAW"c3a0;bm81,111"+NEG$+"br1"+FIVE$:DRAW"c3a0;bm78,146"+NEG$+"bl1"+TEN$
  252. 17170  IF MG% THEN LINE(FN HC(0),14)-(FN HC(TC%),14),1:LINE (FN HC(0),0)-(FN HC(TC%),0),1:LINE (FN HC(1),FN VC(TC%))-(FN HC(1),FN VC(-TC%)),1
  253. 17180  IF MG% THEN LINE(FN HC(-TC%),FN VC(TC%))-(FN HC(-TC%),FN VC(-TC%)),1:LINE (FN HC(1),FN VC(-4))-(FN HC(4),FN VC(-4)),1:LINE (FN HC(1),FN VC(-6))-( FN HC(4),FN VC(-6)),1
  254. 17190  RETURN
  255. 17990  ' ****************************
  256. 17992  ' *  Enter monomial routine  *
  257. 17994  ' ****************************
  258. 18000  REM Get monomial from user.
  259. 18010  G$="":G1$="":VA$=""
  260. 18020  T3%=CSRLIN:T4%=POS(0)
  261. 18100  LOCATE T3%,T4%:PRINT G$;"  ";CHR$(29);
  262. 18110  GOSUB 28900:G1$=IN$
  263. 18115  IF G1$>="A" AND G1$<="Z" THEN G1$=CHR$(ASC(G1$)+32)
  264. 18120  IF ((G1$<"0" OR G1$>"9") AND G1$<>CHR$(13) AND G1$<> CHR$(8) AND (G1$<>"-" OR G$<>"") AND (G1$<>"x" AND G1$<>"y" OR VA$<>"") AND (G1$<>"/" OR G$="")) OR (VA$<>"" AND G1$<>"/" AND G1$<> CHR$(13) AND G1$<>CHR$(8)) THEN 18110
  265. 18125  IF ABS( VAL (G$+G1$)) > 1000 THEN 18110
  266. 18126  IF G$="-" AND G1$="0" THEN 18110:ELSE IF G$="0" AND G1$<>CHR$(8) AND G1$<>CHR$(13) THEN 18110
  267. 18130  IF G1$<>CHR$(13) THEN 18160
  268. 18135  IF G$="" OR G$="-" THEN 18110
  269. 18140  IF G$="x" OR G$="y" THEN NU%=1:DE%=NU%:RETURN
  270. 18142  IF G$="-x" OR G$="-y" THEN NU%=-1:DE%=1:RETURN
  271. 18145  IF G$="" THEN 18110
  272. 18150  NU%=VAL(LEFT$(G$,LEN(G$))):DE%=1:RETURN
  273. 18160  IF G1$<>"/" THEN 18185
  274. 18165  IF G$="" OR G$="-" THEN 18110
  275. 18170  IF G$="x" OR G$="y" THEN NU%=1:GOTO 18500
  276. 18172  IF G$="-x" OR G$="-y" THEN NU%=-1:DE%=1:GOTO 18500
  277. 18180  NU%=VAL(LEFT$(G$,LEN(G$))):GOTO 18500
  278. 18185  IF G1$="x" OR G1$="y" THEN VA$=G1$
  279. 18190  IF G1$<>CHR$(8) THEN G$=G$+G1$:GOTO 18100
  280. 18200  IF LEN(G$)<2 THEN G$="":VA$="":GOTO 18100
  281. 18220  IF RIGHT$(G$,1)="x" OR RIGHT$(G$,1)="y" THEN VA$=""
  282. 18230  G$=LEFT$(G$,LEN(G$)-1):GOTO 18100
  283. 18500  D$=""
  284. 18510  LOCATE T3%,T4%:DE%=VAL(D$):IF DE% THEN IF LEFT$(G$,1)="-" THEN PRINT "-";
  285. 18515  IF DE% THEN GOSUB 18700:PRINT "/";:GOSUB 18800:PRINT " ";:GOTO 18530
  286. 18520  IF LEFT$(G$,1)="-" THEN PRINT "-";
  287. 18525  GOSUB 18700:PRINT "/ ";
  288. 18530  GOSUB 28900:G1$=IN$
  289. 18532  G1$=CHR$(ASC(G1$)-32*(G1$>="A" AND G1$<="Z"))
  290. 18535  IF (G1$<"0" OR G1$>"9") AND (G1$<>CHR$(13) OR DE%=0) AND (G1$<>"-" OR G$<>"") AND G1$<>CHR$(8) AND (G1$<>"x" AND G1$<>"y" OR DE%=0 OR VA$<>"") THEN 18530
  291. 18540  IF G1$=CHR$(13) THEN RETURN
  292. 18545  IF ABS(VAL(D$+G1$))>1000 THEN 18530
  293. 18547  IF G1$="x" OR G1$="y" THEN VA$=G1$:GOTO 18600
  294. 18549  IF G1$="0" AND D$="" THEN 18530
  295. 18550  IF G1$<> CHR$(8) THEN D$=D$+G1$:GOTO 18510
  296. 18560  IF D$="" THEN 18100
  297. 18570  IF LEN(D$) = 1 THEN PRINT CHR$(29)" "CHR$(29);:D$="":GOTO 18510
  298. 18580  PRINT CHR$(29)" "CHR$(29);:D$=LEFT$(D$,LEN(D$)-1):GOTO 18510
  299. 18600  LOCATE T3%,T4%:PRINT "(";:IF VAL(G$)<0 THEN PRINT "-";
  300. 18605  GOSUB 18700:PRINT "/";:GOSUB 18800:PRINT ")"VA$" ";
  301. 18610  GOSUB 28900:G1$=IN$
  302. 18615  IF G1$<>CHR$(13) AND G1$<>CHR$(8) THEN 18610
  303. 18620  IF G1$=CHR$(13) THEN RETURN
  304. 18630  VA$="":PRINT STRING$(3,29)"   ";:GOTO 18510
  305. 18700  REM Print out G$ in upper chars
  306. 18705  FOR I=1 TO LEN(G$)
  307. 18707  IF MID$(G$,I,1)="-" THEN 18750
  308. 18710  IF MID$(G$,I,1)="y" THEN PRINT CHR$(175);:GOTO 18750
  309. 18715  IF MID$(G$,I,1)="x" THEN PRINT CHR$(ASC(MID$(G$,I,1))+75);:GOTO 18750
  310. 18720  PRINT CHR$(VAL(MID$(G$,I,1))+185);
  311. 18750  NEXT
  312. 18760  RETURN
  313. 18800  REM Print out DE% in lower chars
  314. 18805  TEMP$=STR$(DE%):FOR I=1 TO LEN(TEMP$)
  315. 18810  IF INSTR(" -",MID$(TEMP$,I,1))<>0 THEN 18850
  316. 18815  IF MID$(TEMP$,I,1)="0" THEN PRINT CHR$(137);:GOTO 18850
  317. 18820  PRINT CHR$(VAL(MID$(TEMP$,I,1))+127);
  318. 18850  NEXT
  319. 18860  RETURN
  320. 18989  ' ****************************************
  321. 18990  ' * Make fraction from CO%(0-1) into RE$ *
  322. 18992  ' * Reduce if RD% is non-zero            *
  323. 18994  ' ****************************************
  324. 19000  IF CO%(0)*CO%(1) >= 0 THEN SI$=" + " ELSE SI$=" - "
  325. 19010  IF CO%(0)/CO%(1) <> INT(CO%(0)/CO%(1)) THEN 19100
  326. 19020  RE$="":TEMP%=ABS(CO%(0)/CO%(1))
  327. 19030  IF VA$="" THEN RE$=FN RIGHTOF$(STR$(TEMP%)): ELSE IF TEMP%=1 THEN RE$=VA$: : ELSE IF TEMP% > 0 THEN RE$=FN RIGHTOF$(STR$(TEMP%))+VA$:ELSE RE$=STR$(TEMP%)+VA$
  328. 19040  RETURN
  329. 19100  IF RD%=0 THEN 19130
  330. 19110  FOR ZZ=ABS(CO%(1)) TO 2 STEP -1:IF CO%(0)/ZZ=CO%(0)\ZZ AND CO%(1)/ZZ=CO%(1)\ZZ THEN CO%(0)=CO%(0)/ZZ:CO%(1)=CO%(1)/ZZ
  331. 19120  NEXT ZZ
  332. 19125  ' Make a fraction
  333. 19130  T1%=ABS(CO%(0)):T2%=ABS(CO%(1))
  334. 19135  IF T1%>9 OR T2%>9 THEN 19170
  335. 19139  RE$=CHR$(ABS(T1%)+137)+"/"+CHR$(T2%+127)
  336. 19145  IF VA$<>"" THEN RE$="("+RE$+")"+VA$
  337. 19150  RETURN
  338. 19160  ' Make fraction if more than 2 digits
  339. 19170  RE$="":N.O.D%=137:TEMP$=FN NUMSIGN$(T1%,0):GOSUB 19200
  340. 19180  RE$=RE$+"/":N.O.D%=127:TEMP$=FN NUMSIGN$(T2%,0):GOSUB 19200
  341. 19190  GOTO 19145
  342. 19200  FOR I%=1 TO LEN(TEMP$)
  343. 19205  IF D%=137 AND MID$(TEMP$,I%,1)="0" THEN RE$=RE$+CHR$(185):GOTO 19220
  344. 19210    RE$=RE$+CHR$(VAL(MID$(TEMP$,I%,1))+N.O.D%)
  345. 19220  NEXT I%
  346. 19230  RETURN
  347. 19990  ' ***********************
  348. 19992  ' *  Print an equation  *
  349. 19994  ' ***********************
  350. 20000  CX%(0)=LX%(0):CX%(1)=LX%(1):CY%(0)=LY%(0):CY%(1)=LY%(1):CC%(0)=LC%(0):CC%(1)=LC%(1):MP%=LMP%:GOSUB 20500:LS$=E$ ' Make left side
  351. 20010  CX%(0)=RX%(0):CX%(1)=RX%(1):CY%(0)=RY%(0):CY%(1)=RY%(1):CC%(0)=RC%(0):CC%(1)=RC%(1):MP%=RMP%:GOSUB 20500 ' Make right side
  352. 20015  IF EXIT.TOG% THEN 20040
  353. 20020  LOCATE VP%,1:PRINT STRING$(40,32);
  354. 20025  PROB$=LS$+" = "+E$:IF START%=1 THEN TBP=INSTR(PROB$,"=")+FN MID(PROB$)-2
  355. 20026  IF LO%=1 THEN LOCATE VP%,TBP-LEN(LS$):ELSE LOCATE VP%,FN MID(PROB$)
  356. 20030  PRINT PROB$
  357. 20040  RETURN
  358. 20400  ' ***********************************
  359. 20410  ' * Create one side of the equation *
  360. 20420  ' ***********************************
  361. 20500  E$="":O.P%=0 ' signifies open parenthesis if true
  362. 20503  ' ** Put multiplier in position 1
  363. 20510  IF MP%=1 THEN IF DIV% THEN E$="(":O.P%=-1:ELSE VA$="":CO%(0)=MC%(0):CO%(1)=MC%(1):GOSUB 19000:E$="("+FN SIGNSTR$(RE$)+")(":O.P%=-1
  364. 20515  ' ** Create old X term (plus added X term if present)
  365. 20520  IF CX%(0)<>0 THEN VA$="x":CO%(0)=CX%(0):CO%(1)=CX%(1):GOSUB 19000:E$=E$+FN SIGNSTR$(RE$)
  366. 20530  IF AX%(0)<>0 THEN VA$="x":CO%(0)=AX%(0):CO%(1)=AX%(1):GOSUB 19000:IF CX%(0)<>0 THEN E$=E$+SI$+RE$:ELSE E$=E$+FN SIGNSTR$(RE$)
  367. 20540  ' ** Put multiplier in position 2
  368. 20600  IF MP%=2 THEN IF DIV% AND E$<>"" THEN E$=E$+"+(":O.P%=-1:ELSE IF DIV% THEN E$="(":O.P%=-1:ELSE VA$="":CO%(0)=MC%(0):CO%(1)=MC%(1):GOSUB 19000:IF E$="" THEN E$="("+RE$+")(":O.P%=-1:ELSE E$=E$+"+("+FN SIGNSTR$(RE$)+")(":O.P%=-1
  369. 20620  ' ** Put in the Y term
  370. 20630  IF CY%(0)<>0 THEN VA$="y":CO%(0)=CY%(0):CO%(1)=CY%(1):GOSUB 19000:IF E$="" OR RIGHT$(E$,1)="(" THEN E$=E$+FN SIGNSTR$(RE$):ELSE E$=E$+SI$+RE$
  371. 20640  ' ** Put in the added Y term if present
  372. 20650  IF AY%(0)<>0 THEN VA$="y":CO%(0)=AY%(0):CO%(1)=AY%(1):GOSUB 19000:IF E$="" OR RIGHT$(E$,1)="(" THEN E$=E$+FN SIGNSTR$(RE$):ELSE E$=E$+SI$+RE$
  373. 20700  ' ** Put divisor or constant multiplier on the end
  374. 20710  IF MP%=3 THEN IF DIV% AND E$<>"" THEN E$=E$+"+(":O.P%=-1:ELSE IF DIV% THEN E$="(":O.P%=-1:ELSE VA$="":CO%(0)=MC%(0):CO%(1)=MC%(1):GOSUB 19000:IF E$="" THEN E$="("+FN SIGNSTR$(RE$)+")(":O.P%=-1:ELSE E$=E$+"+("+FN SIGNSTR$(RE$)+")(":O.P%=-1
  375. 20720  ' ** Add in constant factor
  376. 20730  IF CC%(0)<>0 THEN VA$="":CO%(0)=CC%(0):CO%(1)=CC%(1):GOSUB 19000:IF E$="" OR RIGHT$(E$,1)="(" THEN E$=E$+FN SIGNSTR$(RE$):ELSE E$=E$+SI$+RE$
  377. 20735  ' ** Tag on added constant factor if present
  378. 20740  IF AC%(0)<>0 THEN VA$="":CO%(0)=AC%(0):CO%(1)=AC%(1):GOSUB 19000:IF E$="" OR RIGHT$(E$,1)="(" THEN E$=E$+FN SIGNSTR$(RE$):ELSE E$=E$+SI$+RE$
  379. 20750  IF RIGHT$(E$,1)="(" THEN E$=E$+"0":O.P%=-1
  380. 20770  IF MP% AND DIV% THEN CO%(0)=MC%(0):CO%(1)=MC%(1):VA$="":GOSUB 19000:E$=E$+")/("+FN SIGNSTR$(RE$)+")":O.P%=0:GOTO 20800
  381. 20780  IF O.P% THEN E$=E$+")"
  382. 20800  IF E$="" THEN E$="0"
  383. 20805  RETURN
  384. 20990  ' ***********************************
  385. 20992  ' *  Plot points and Draw the line  *
  386. 20994  ' ***********************************
  387. 21000  FOR P=1 TO 3:CX%=P%(P,1):CY%=P%(P,2):GOSUB 14000:GOSUB 15000:GOSUB 31000:NEXT P
  388. 21010  PRINT "  Good job, ";N$;".  You found all":PRINT "three points.  Now it's time to draw theline.":GOSUB 15000:GOSUB 31000
  389. 21020  LOCATE 7,24:LINE(144,55)-(144,200),0,BF
  390. 21030  MG%=0:GOSUB 17000:FOR ZZ=1 TO 3:PRESET(FN HC(P%(ZZ,1)),FN VC(P%(ZZ,2))):DRAW "c2"+OBJ.FOU$:NEXT ZZ
  391. 21040  GOSUB 31000:PRINT "  Okay, ";N$;".  Now I'm ready to":PRINT "finish the graph by drawing a line":PRINT "through the three points you plotted.":GOSUB 15000:GOSUB 31000
  392. 21050  IF A%=0 THEN LINE( FN HC(-TC%),FN VC(C%/B%))-( FN HC(TC%), FN VC(C%/B%)),2:PRESET(FN HC(-TC%), FN VC(C%/B%)):DRAW "a0c2"+OBJ.ONE$:PRESET(FN HC(TC%), FN VC(C%/B%)):DRAW "c2a2"+OBJ.ONE$+"a0":GOTO 21300
  393. 21060  IF B%=0 THEN LINE(FN HC(C%/A%), FN VC(-TC%))-(FN HC(C%/A%), FN VC(TC%)),2:PRESET(FN HC(C%/A%), FN VC(-TC%)):DRAW "c2a1"+OBJ.ONE$:PRESET(FN HC(C%/A%), FN VC(TC%)):DRAW "a3c2"+OBJ.ONE$:GOTO 21300
  394. 21070  P=1:X= - TC%:Y = (C%-A%*X)/B%:IF ABS(Y)<= TC% THEN X(P)=X:Y(P)=Y:P=2
  395. 21080  Y=-TC%:X=(C%-B%*Y)/A%: IF ABS(X)<= TC% THEN X(P)=X:Y(P)=Y:P=P+1:IF P=3 THEN 21110
  396. 21090  Y=TC%:X=(C%-B%*Y)/A%:IF ABS(X)<=TC% THEN X(P)=X:Y(P)=Y:P=P+1:IF P=3 THEN 21110
  397. 21100  X(P)=TC%:Y(P)=(C%-A%*X(P))/B%
  398. 21110  LINE(FN HC(X(1)), FN VC(Y(1)))-(FN HC(X(2)), FN VC(Y(2))),2
  399. 21120  AS%=4:M=-A%/B%:XI=COS(ATN(M))/(FN HC(1)-FN HC(0)):YI=SIN(ATN(M))/(FN VC(1)-FN VC(0))
  400. 21130  IF ABS(X(1))=TC% THEN XI=-ABS(XI)*SGN(X(1)):YI=-ABS(YI)*SGN(X(1))*SGN(M)
  401. 21140  IF ABS(Y(1))=TC% THEN YI=- ABS(YI)*SGN(Y(1)):XI=- ABS(XI)*SGN(Y(1))*SGN(M)
  402. 21150  X=X(1)+AS%*XI:Y=Y(1)+AS%*YI:YA=XI:XA=-YI
  403. 21160  FOR ZZ=AS% TO 1 STEP -1:IF ABS(X+ZZ*XA)>TC% OR ABS(Y+ZZ*YA)>TC% THEN NEXT ZZ
  404. 21170  LINE(FN HC(X+ZZ*XA), FN VC(Y+ZZ*YA))-(FN HC(X(1)), FN VC(Y(1))),2
  405. 21180  XA=-XA:YA=-YA
  406. 21190  FOR ZZ=AS% TO 1 STEP -1:IF ABS(X+ZZ*XA)>TC% OR ABS(Y+ZZ*YA)>TC% THEN NEXT ZZ
  407. 21200  LINE(FN HC(X+ZZ*XA),FN VC(Y+ZZ*YA))-(FN HC(X(1)), FN VC(Y(1))),2
  408. 21210  IF ABS (X(2))=TC% THEN XI=-ABS(XI)*SGN(X(2)):YI=- ABS(YI)*SGN(X(2))*SGN(M)
  409. 21220  IF ABS(Y(2))=TC% THEN YI=-ABS(YI)*SGN(Y(2)):XI=-ABS(XI)*SGN(Y(2))*SGN(M)
  410. 21230  X=X(2)+AS%*XI:Y=Y(2)+AS%*YI:YA=XI:XA=-YI
  411. 21240  FOR ZZ=AS% TO 1 STEP -1: IF ABS(X+ZZ*XA)>TC% OR ABS(Y+ZZ*YA)>TC% THEN NEXT ZZ
  412. 21250  LINE(FN HC(X+ZZ*XA),FN VC(Y+ZZ*YA))-(FN HC(X(2)), FN VC(Y(2))),2
  413. 21260  XA=-XA:YA=-YA
  414. 21270  FOR ZZ=AS% TO 1 STEP -1:IF ABS(X+ZZ*XA)>TC% OR ABS (Y+ZZ*YA)>TC% THEN NEXT ZZ
  415. 21280  LINE( FN HC(X+ZZ*XA), FN VC(Y+ZZ*YA))-(FN HC(X(2)), FN VC(Y(2))),2
  416. 21290  FOR ZZ=1 TO 2:NEXT ZZ     ' Fix prematurely exited FOR loops.
  417. 21300  GOSUB 31000:PRINT "   Great, "N$".  You have graphed:":GOSUB 46000:EXIT.TOG%=-1:GOSUB 20000:EXIT.TOG%=0:LOCATE 23,1:IN$=LS$+" = "+E$+".":PRINT TAB(1+FN MID(IN$))IN$;:GOSUB 15000:GOSUB 30000
  418. 21310  RETURN
  419. 21990  ' ***************************
  420. 21992  ' *  Get a number into ZZ$  *
  421. 21994  ' ***************************
  422. 22000  ZZ$="":DEF SEG=0:POKE 1050,PEEK(1052):DEF SEG
  423. 22010  GOSUB 28900
  424. 22015  IF IN$=CHR$(13) AND LEN(ZZ$)>0 AND ZZ$<>"-" THEN PRINT CHR$(29)" ";:RETURN
  425. 22020  IF MID$(IN$,2,1)="K" THEN IN$=CHR$(8)
  426. 22022  IF ZZ$="0" AND IN$<>CHR$(8) THEN 22010
  427. 22025  IF IN$=CHR$(8) THEN 22050
  428. 22030  IF IN$="-" AND ZZ$="" THEN 22040:ELSE IF IN$<"0" OR IN$>"9" THEN 22010
  429. 22035  IF IN$="0" AND ZZ$="-" THEN 22010
  430. 22036  IF LEN(ZZ$)>=4 THEN 22010
  431. 22040  PRINT CHR$(29);IN$" ";:ZZ$=ZZ$+IN$:GOTO 22010
  432. 22050  IF ZZ$="" THEN 22010:ELSE PRINT CHR$(29)" "CHR$(29);:IF LEN(ZZ$)=1 THEN ZZ$="":GOTO 22010:ELSE ZZ$=LEFT$(ZZ$,LEN(ZZ$)-1):GOTO 22010
  433. 22990  ' *************************************
  434. 22992  ' *  Coordinate graphing of equation  *
  435. 22994  ' *************************************
  436. 23000  GOSUB 16000                       ' set up T graph
  437. 23010  GOSUB 11000                       ' Find 3 points
  438. 23020  GOSUB 12000                       ' Plot 3 points screen setup
  439. 23030  GOSUB 21000                       ' Plot 3 points and draw line
  440. 23900  RETURN
  441. 24990  ' ***********************
  442. 24992  ' *  Solve an equation  *
  443. 24994  ' ***********************
  444. 25000  FOR ZZ=0 TO 1:AX%(ZZ)=ZZ:AY%(ZZ)=ZZ:AC%(ZZ)=ZZ:MC%(ZZ)=ZZ:NEXT ZZ
  445. 25010  LMP%=0:RMP%=0
  446. 25040  LO%=1:VP%=3:GOSUB 20000:LO%=0
  447. 25050  IV%=0
  448. 25060  OV$="x":IF SV$=OV$ THEN OV$="y"
  449. 25100  IF SV$="y" AND LX%(0)=0 AND LY%(0)<>0 AND LC%(0)=0 OR SV$="x" AND LX%(0)<>0 AND LY%(0)=0 AND LC%(0)=0 THEN IV%=-1
  450. 25110  IF SV$="y" AND RX%(0)=0 AND RY%(0)<>0 AND RC%(0)=0 OR SV$="x" AND RX%(0)<>0 AND RY%(0)=0 AND RC%(0)=0 THEN IV%=1
  451. 25120  IF SV$="y" AND IV%=-1 AND LY%(0)/LY%(1)=1 OR SV$="y" AND IV%=1 AND RY%(0)/RY%(1)=1 THEN 25500
  452. 25121  IF SV$="x" AND IV%=-1 AND LX%(0)/LX%(1)=1 OR SV$="x" AND IV%=1 AND RX%(0)/RX%(1)=1 THEN 25500
  453. 25125  IF VP%>12 THEN GOSUB 30000:GOSUB 15000:VP%=3:LINE(0,16)-(319,122),0,BF:GOSUB 20000
  454. 25130  LSV%(0)=LY%(0):LSV%(1)=LY%(1):RSV%(0)=RY%(0):RSV%(1)=RY%(1):LOV%(0)=LX%(0):LOV%(1)=LX%(1):ROV%(0)=RX%(0):ROV%(1)=RX%(1)
  455. 25140  IF SV$="x" THEN LSV%(0)=LX%(0):LSV%(1)=LX%(1):RSV%(0)=RX%(0):RSV%(1)=RX%(1):LOV%(0)=LY%(0):LOV%(1)=LY%(1):ROV%(0)=RY%(0):ROV%(1)=RY%(1)
  456. 25150  LINE (0,125)-(320,125),1
  457. 25155  GOSUB 30000:LOCATE 20,1:PRINT "1) Add same value to both sides":PRINT "2) Subtract same value from both sides"
  458. 25160  PRINT "3) Multiply both sides by same value":PRINT "4) Divide both sides by same value"
  459. 25170  LOCATE 18,1:POKE &H4E,1:PRINT "Enter your choice:  ";:POKE &H4E,3
  460. 25175  GOSUB 28900
  461. 25176  IF IN$<"1" OR IN$>"4" THEN 25175
  462. 25180  GOSUB 30000
  463. 25185  CH=VAL(IN$)
  464. 25190  ON CH GOTO 25200,25200,25300,25300
  465. 25192  ' ******************************************
  466. 25194  ' *  Set up variables for ADD or SUBTRACT  *
  467. 25196  ' ******************************************
  468. 25200  IF IV% THEN PRINT "   That's not a good idea, ";N$;".":PRINT :PRINT "Now that you have the ";SV$;" term alone,":PRINT :PRINT "you should eliminate the coefficient of":PRINT :PRINT SV$;" by using multiplication or division."
  469. 25210  IF IV% THEN GOSUB 15000:GOSUB 30000:E1%=E1%+1:GOTO 25100
  470. 25220  IF CH=1 THEN OP$=" add ":COP$="Add":PR$="Add to both sides: ":TF$=" to ":SI%=1: ELSE OP$=" subtract ": COP$="Subtract":PR$="Subtract from both sides: ":TF$=" from ":SI%=-1
  471. 25230  GOSUB 26000
  472. 25240  GOTO 25100
  473. 25290  ' *****************************************
  474. 25292  ' *  Set up variables for MULT or DIVIDE  *
  475. 25294  ' *****************************************
  476. 25300  IF CH=3 THEN DEF FN MD(X)=X:OP$=" multiply ":COP$="Multiply":PR$="Multiply both sides by: ":ELSE DEF FN MD(X)=1/X:OP$=" divide ":COP$="Divid":PR$="Divide both sides by: "
  477. 25310  GOSUB 28100
  478. 25320  GOTO 25100
  479. 25390  ' ************************
  480. 25392  ' *  Done with equation  *
  481. 25394  ' ************************
  482. 25400  ' Finished with equation
  483. 25500  GOSUB 30000:LOCATE 18,1:PRINT "   Nice going, ";N$;".":PRINT
  484. 25510  PRINT "You have solved the original equation":PRINT
  485. 25515  PRINT "for "SV$;:PRINT ".  You're done with the first step.";
  486. 25520  RETURN
  487. 25590  ' ******************************
  488. 25592  ' *  Addition and Subtraction  *
  489. 25594  ' ******************************
  490. 26000  LOCATE 18,1:PRINT PR$;:GOSUB 18000:IF G$="" THEN GOSUB 30000:GOTO 26000
  491. 26110  IF NU%=0 THEN GOSUB 30000:LOCATE 18,1:PRINT "    ";COP$;"ing zero";TF$;"both sides":PRINT :PRINT "will have no effect on the equation.":GOSUB 15000:GOSUB 30000:E1%=E1%+1:RETURN
  492. 26120  IF VA$=SV$ AND (RX%(0) OR RY%(0) OR RC%(0)) THEN GOSUB 30000:GOTO 26122
  493. 26121  GOTO 26130
  494. 26122  LOCATE 18,1:PRINT "   I disagree, ";N$;".  Moving the":PRINT :PRINT SV$" term will not help to simplify":PRINT :PRINT "the equation.":GOSUB 15000:GOSUB 30000:E1%=E1%+1:GOTO 26000
  495. 26130  IF NOT((VA$=SV$ AND ABS(LSV%(0)/LSV%(1)+SI%*NU%/DE%)>9.9999E-05) OR (VA$=OV$ AND ABS(LOV%(0)/LOV%(1)+SI%*NU%/DE%)>9.9999E-05)) THEN 26170
  496. 26140  IF (VA$="x" AND (LX%(0)=0)) OR (VA$="y" AND (LY%(0)=0)) THEN GOSUB 30000 :LOCATE 18:PRINT "   I wouldn't do that, ";N$;".":PRINT :PRINT "There's no "VA$" term on the left side for":PRINT :PRINT "you to move."
  497. 26141  IF (VA$="x" AND (LX%(0)=0)) OR (VA$="y" AND (LY%(0)=0)) THEN GOSUB 15000:GOSUB 30000:E1%=E1%+1:GOTO 26000
  498. 26150  GOSUB 30000:LOCATE 18:PRINT "   That won't work, ";N$;". To move":PRINT :PRINT "the ";VA$;" term, you must";OP$;:CO%(0)=-SI%*LSV%(0):CO%(1)=LSV%(1):IF VA$=OV$ THEN CO%(0)=-SI%*LOV%(0):CO%(1)=LOV%(1)
  499. 26160  GOSUB 19000:PRINT FN SIGNSTR$(RE$):PRINT :PRINT MID$(TF$,2);"both sides.":GOSUB 15000:GOSUB 30000:E1%=E1%+1:GOTO 26000
  500. 26170  IF VA$<>"" OR ABS (LC%(0)/LC%(1)+SI%*NU%/DE%)<9.9999E-05 THEN 26500
  501. 26180  IF NOT (LC%(0)<>0) THEN GOSUB 30000:LOCATE 18:PRINT "   That won't do much good, ";N$;".":PRINT :PRINT "There's no constant term on the left":PRINT :PRINT "side for you to move.":GOSUB 15000:GOSUB 30000:E1%=E1%+1:GOTO 26000
  502. 26190  GOSUB 30000:LOCATE 18,1:PRINT "   That's not right, "N$".":PRINT:PRINT"To move the constant term, you must":PRINT:PRINT MID$(OP$,2);:CO%(0)=-SI%*LC%(0):CO%(1)=LC%(1):GOSUB 19000:PRINT FNSIGNSTR$(RE$);TF$"both sides.":GOSUB 15000:GOSUB 30000
  503. 26195  E1%=E1%+1:GOTO 26000
  504. 26500  IF VA$="x" THEN AX%(0)=SI%*NU%:AX%(1)=DE%:L%(0)=LX%(0):L%(1)=LX%(1):R%(0)=RX%(0):R%(1)=RX%(1):GOTO 26550
  505. 26510  IF VA$="y" THEN AY%(0)=SI%*NU%:AY%(1)=DE%:L%(0)=LY%(0):L%(1)=LY%(1):R%(0)=RY%(0):R%(1)=RY%(1):GOTO 26550
  506. 26520  IF VA$="" THEN AC%(0)=SI%*NU%:AC%(1)=DE%:L%(0)=LC%(0):L%(1)=LC%(1):R%(0)=RC%(0):R%(1)=RC%(1):GOTO 26550
  507. 26550  LO%=1:S$=VA$:VP%=VP%+2:GOSUB 20000:LO%=0:AX%(0)=0:AY%(0)=0:AC%(0)=0
  508. 26560  GOSUB 30000:LOCATE 18,1:PRINT "   Now you must simplify by combining":PRINT :PRINT "any like terms.":GOSUB 15000:GOSUB 30000
  509. 26580  A%(0)=SI%*NU%:A%(1)=DE%
  510. 26590  S%(1)=L%(1)*A%(1):S%(0)=L%(0)*A%(1)+A%(0)*L%(1):FOR ZZ=S%(1) TO 2 STEP -1:IF FN WH(S%(0)/ZZ) AND FN WH(S%(1)/ZZ) THEN S%(0)=S%(0)/ZZ:S%(1)=S%(1)/ZZ
  511. 26595  NEXT ZZ
  512. 26600  VA$=S$:RD%=1:CO%(0)=L%(0):CO%(1)=L%(1):GOSUB 19000:LOCATE 18,1:PRINT FN SIGNSTR$(RE$);:CO%(0)=A%(0):CO%(1)=A%(1):GOSUB 19000
  513. 26610  PRINT SI$;RE$;" = ";:GOSUB 18000
  514. 26615  IF INSTR(G$,"x")>0 OR INSTR(G$,"y")>0 THEN 26630:ELSE IF VAL(G$)<>0 THEN 26630
  515. 26620  IF VA$=S$ AND ABS(NU%/DE%-S%(0)/S%(1))<9.9999E-05 OR NOT NU% AND NOT S%(0) THEN 26650
  516. 26630  GOSUB 30000:LOCATE 18:PRINT "   Sorry, ";N$;".":PRINT :VA$=S$:RD%=1:CO%(0)=L%(0):CO%(1)=L%(1):GOSUB 19000:PRINT FN SIGNSTR$(RE$);:CO%(0)=A%(0):CO%(1)=A%(1):GOSUB 19000
  517. 26640  PRINT SI$;RE$;" = ";:CO%(0)=S%(0):CO%(1)=S%(1):VA$=S$:GOSUB 19000:PRINT "0":GOSUB 15000:GOSUB 30000:E4%=E4%+1:GOTO 26600
  518. 26650  GOSUB 30000:LOCATE 19:PRINT "   That's right, ";N$;".":GOSUB 15000:GOSUB 30000
  519. 26660  IF S$="x" THEN LX%(0)=S%(0):LX%(1)=S%(1):GOTO 26700
  520. 26670  IF S$="y" THEN LY%(0)=S%(0):LY%(1)=S%(1):GOTO 26700
  521. 26680  LC%(0)=S%(0):LC%(1)=S%(1)
  522. 26700  IF NOT R%(0) THEN S%(0)=A%(0):S%(1)=A%(1):GOTO 26770
  523. 26701  LO%=1:VP%=VP%+2:GOSUB 20000:LO%=0:GOSUB 30000
  524. 26702  S%(1)=R%(1)*A%(1):S%(0)=R%(0)*A%(1)+A%(0)*R%(1):FOR ZZ=S%(1) TO 2 STEP -1:IF FN WH(S%(0)/ZZ) AND FN WH(S%(1)/ZZ) THEN S%(0)=S%(0)/ZZ:S%(1)=S%(1)/ZZ
  525. 26703  NEXT ZZ
  526. 26705  PRINT "   Now combine like terms on the right":PRINT :PRINT "side of the equation.":GOSUB 15000:GOSUB 30000
  527. 26710  RD%=1:CO%(0)=R%(0):CO%(1)=R%(1):GOSUB 19000:LOCATE 18,1:PRINT FN SIGNSTR$(RE$);:CO%(0)=A%(0):CO%(1)=A%(1):GOSUB 19000
  528. 26720  PRINT SI$;RE$;" = ";:GOSUB 18000
  529. 26730  IF VA$=S$ AND ABS(NU%/DE%-S%(0)/S%(1))<9.9999E-05 OR NOT NU% AND NOT S%(0) THEN GOSUB 30000:PRINT "   Excellent, ";N$;".":GOSUB 15000:GOSUB 30000:GOTO 26770
  530. 26740  GOSUB 30000:LOCATE 18,1:PRINT "   Good try, ";N$;".":PRINT :RD%=1:CO%(0)=L%(0):CO%(1)=L%(1):GOSUB 19000:PRINT RE$;:CO%(0)=A%(0):CO%(1)=A%(1):GOSUB 19000
  531. 26750  PRINT SI$;RE$;" = ";:CO%(0)=S%(0):CO%(1)=S%(1):VA$=S$:GOSUB 19000:PRINT FN SIGNSTR$(RE$):GOSUB 15000:GOSUB 30000:E4%=E4%+1:GOTO 26710
  532. 26770  IF S$="x" THEN RX%(0)=S%(0):RX%(1)=S%(1):GOTO 26800
  533. 26780  IF S$="y" THEN RY%(0)=S%(0):RY%(1)=S%(1):GOTO 26800
  534. 26790  RC%(0)=S%(0):RC%(1)=S%(1)
  535. 26800  LO%=1:VP%=VP%+2:LOCATE VP%:GOSUB 20000:LO%=0:RETURN
  536. 28000  ' *************************
  537. 28010  ' *  Multiply and Divide  *
  538. 28020  ' *************************
  539. 28100  GOSUB 30000:LOCATE 18,1:PRINT PR$;:GOSUB 18000:IF G$="" THEN 28100
  540. 28105  IF G$="0" AND COP$="Multiply" THEN GOSUB 30000:LOCATE 18:PRINT"Multiplying by zero will make each term":PRINT:PRINT"in the equation equal to zero.":E1%=E1%+1:GOSUB 15000:GOSUB 30000:RETURN
  541. 28110  GOSUB 30000:IF VA$<>"" AND NU% THEN PRINT "    That's a mistake, "N$".":PRINT :PRINT COP$"ing by a term which has an":PRINT :PRINT VA$" in it will only make the equation":PRINT :PRINT "more complicated.":GOSUB 15000:GOSUB 30000:E1%=E1%+1:RETURN
  542. 28115  IF NU%=0 AND FN MD(2)=0.5 THEN LOCATE 18:PRINT "   You can't do that, ";N$;".":PRINT :PRINT "Division by zero is not allowed.":GOSUB 15000:GOSUB 30000:E1%=E1%+1:RETURN
  543. 28120  IF NU%=DE% THEN LOCATE 18:PRINT "   ";COP$;"ing both sides by one will":PRINT :PRINT "have no effect on the equation.":GOSUB 15000:GOSUB 30000:E1%=E1%+1:RETURN
  544. 28125  IF ABS(FN MD(NU%/DE%))>1 THEN LOCATE 18:PRINT "   That won't help, ";N$;".":PRINT :PRINT COP$;"ing by the number you have":PRINT :PRINT "chosen will only make the coefficients":PRINT :PRINT "bigger.";:GOSUB 15000:GOSUB 30000:E1%=E1%+1:RETURN
  545. 28130  IF NOT ((IV%=-1 AND ABS(FN MD(DE%/NU%)-LSV%(0)/LSV%(1))>9.9999E-05) OR (IV%=1 AND ABS(FN MD(DE%/NU%)-RSV%(0)/RSV%(1))>9.9999E-05)) THEN 28200
  546. 28140  LOCATE 18:PRINT "   That's not right, "N$".":PRINT :PRINT "To eliminate the coefficient of "SV$", you":PRINT :PRINT "should"OP$"by ";:VA$=""
  547. 28150  ON (2 * ABS(IV%=1)+ABS(FN MD(2)=0.5)) GOTO 28160,28170,28180
  548. 28155  CO%(0)=LSV%(1):CO%(1)=LSV%(0):GOTO 28190
  549. 28160  CO%(0)=LSV%(0):CO%(1)=LSV%(1):GOTO 28190
  550. 28170  CO%(0)=RSV%(1):CO%(1)=RSV%(0):GOTO 28190
  551. 28180  CO%(0)=RSV%(0):CO%(1)=RSV%(1)
  552. 28190  RD%=1:GOSUB 19000:PRINT FN SIGNSTR$(RE$);".":GOSUB 15000:E1%=E1%+1:GOTO 28100
  553. 28200  ZZ=FN MD(NU%/DE%):IF IV% OR (FN WH(LX%(0)/LX%(1)*ZZ) AND FN WH(LY%(0)/LY%(1)*ZZ) AND FN WH(LC%(0)/LC%(1)*ZZ) AND FN WH(RX%(0)/RX%(1)*ZZ) AND FN WH(RY%(0)/RY%(1)*ZZ) AND FN WH(RC%(0)/RC%(1)*ZZ)) THEN 28500
  554. 28202  IF DE%=1 THEN XX%=NU%:GOTO 28210
  555. 28203  IF NU%>DE% THEN XX%=NU%/DE%:GOTO 28210
  556. 28204  XX%=DE%/NU%
  557. 28210  IF ABS(XX%)=ABS(B%) THEN 28220
  558. 28212  LOCATE 18:PRINT "   I don't agree, ";N$;".":PRINT :PRINT "The number you have chosen would give":PRINT :PRINT "you fractions in the equation.":GOSUB 15000:GOSUB 30000:E1%=E1%+1:RETURN
  559. 28220  GOSUB 30000:LOCATE 18:PRINT"   Although ";:IF COP$="Multiply" THEN PRINT"multiplication";:ELSE PRINT"division";
  560. 28225  PRINT" by ";:IF DE%=1 THEN IF NU%<0 THEN PRINT STR$(NU%):GOTO 28230:ELSE PRINT RIGHT$(STR$(NU%),LEN(STR$(NU%))-1):GOTO 28230
  561. 28227  FOR XX%=1 TO LEN(G$):IN$=MID$(G$,XX%,1):IF IN$="-" THEN PRINT"-";:ELSE PRINT CHR$(ASC(IN$)+137);
  562. 28228  NEXT:PRINT"/";:FOR XX%=1 TO LEN(D$):IN$=MID$(D$,XX%,1):IF IN$="0" THEN PRINT CHR$(137);:ELSE PRINT CHR$(ASC(IN$)+79);
  563. 28229  NEXT:PRINT
  564. 28230  PRINT:PRINT"is not incorrect, we prefer that you":PRINT:PRINT"isolate the y term first.";:GOSUB 15000:GOSUB 30000:RETURN
  565. 28500  F2%(0)=NU%:F2%(1)=DE%:DIV%=(FN MD(2)=0.5):VP%=VP%+2:MC%(0)=F2%(0):MC%(1)=F2%(1):LMP%=1:RMP%=1:LO%=1:GOSUB 20000:LO%=0:VP%=VP%+2:NF%=0
  566. 28503  IF CH=4 THEN COP$="Divide"
  567. 28505  G2$=G$:GOSUB 30000:LOCATE 18:PRINT "   ";COP$;" the equation by ";:VA$="":CO%(0)=NU%:CO%(1)=DE%:GOSUB 19000:PRINT FN SIGNSTR$(RE$);",":PRINT :PRINT "term by term.":GOSUB 15000:GOSUB 30000
  568. 28508  IF CH=4 THEN COP$="Divid"
  569. 28510  FOR MT=1 TO 6:LMP%=ABS(MT<4)*MT:RMP%=1+ABS(MT>4)*(MT-4):ON MT GOTO 28520,28530,28540,28550,28560,28570
  570. 28520  F1%(0)=LX%(0):F1%(1)=LX%(1):S$="x":GOTO 28580
  571. 28530  F1%(0)=LY%(0):F1%(1)=LY%(1):S$="y":GOTO 28580
  572. 28540  F1%(0)=LC%(0):F1%(1)=LC%(1):S$="":GOTO 28580
  573. 28550  F1%(0)=RX%(0):F1%(1)=RX%(1):S$="x":GOTO 28580
  574. 28560  F1%(0)=RY%(0):F1%(1)=RY%(1):S$="y":GOTO 28580
  575. 28570  F1%(0)=RC%(0):F1%(1)=RC%(1):S$=""
  576. 28580  IF NOT (F1%(0)<>0) AND (MT<>6 OR RX%(0) OR RY%(0)) THEN 28790
  577. 28590  IF NF% THEN LO%=1:GOSUB 20000:LO%=0
  578. 28595  NF%=-1
  579. 28600  S%(0)=F1%(0)*F2%(-DIV%):S%(1)=F1%(1)*F2%(-(NOT DIV%))
  580. 28605  FOR ZZ=S%(1) TO 2 STEP -1:IF FN WH(S%(0)/ZZ) AND FN WH(S%(1)/ZZ) THEN S%(0)=S%(0)/ZZ:S%(1)=S%(1)/ZZ
  581. 28610  NEXT ZZ
  582. 28620  GOSUB 30000:VA$=S$:CO%(0)=F1%(0):CO%(1)=F1%(1):GOSUB 19000:LOCATE 18,1:PRINT FN SIGNSTR$(RE$);" ";:IF DIV% THEN 28640
  583. 28630  PRINT "* ";:GOTO 28650
  584. 28640  PRINT "/ ";
  585. 28650  CO%(0)=F2%(0):CO%(1)=F2%(1):VA$="":GOSUB 19000:PRINT FN SIGNSTR$(RE$);" = ";
  586. 28655  GOSUB 18000:IF G$="" THEN 28655: GOSUB 30000
  587. 28660  IF VA$=S$ AND ABS(NU%/DE%-S%(0)/S%(1))<9.9999E-05 THEN 28700
  588. 28665  GOSUB 30000:LOCATE 17,1
  589. 28670  PRINT "   Sorry, ";N$;".":PRINT :VA$=S$:CO%(0)=F1%(0):CO%(1)=F1%(1):RD%=1:GOSUB 19000:PRINT FN SIGNSTR$(RE$);" ";:IF DIV% THEN 28685
  590. 28680  PRINT "* ";:GOTO 28690
  591. 28685  PRINT "/ ";
  592. 28690  CO%(0)=F2%(0):CO%(1)=F2%(1):VA$="":GOSUB 19000:PRINT FN SIGNSTR$(RE$);" = ";:VA$=S$:CO%(0)=S%(0):CO%(1)=S%(1):GOSUB 19000:PRINT FN SIGNSTR$(RE$)
  593. 28691  XX%=INSTR(RE$,"/"):IF XX%=0 THEN 28698:ELSE PRINT:PRINT"Enter ";:IF (CO%(0)<0 AND CO%(1)>0) OR (CO%(0)>0 AND CO%(1)<0) THEN PRINT "-";
  594. 28692  PRINT RIGHT$(STR$(CO%(0)),LEN(STR$(CO%(0)))-1)"/"RIGHT$(STR$(CO%(1)),LEN(STR$(CO%(1)))-1)"x and I will insert the":PRINT:PRINT"parentheses for you, or enter ";
  595. 28693  IF CO%(0)=1 THEN PRINT"x";:ELSE IF CO%(0)=-1 THEN PRINT"-x";:ELSE IF CO%(0)<0 AND CO%(1)>0 THEN PRINT STR$(CO%(0))"x";:ELSE PRINT RIGHT$(STR$(CO%(0)),LEN(STR$(CO%(0)))-1)"x";
  596. 28694  PRINT"/"RIGHT$(STR$(CO%(1)),LEN(STR$(CO%(1)))-1)"."
  597. 28698  GOSUB 15000:E4%=E4%+1:GOTO 28620
  598. 28700  ON MT GOTO 28710,28720,28730,28740,28750,28760
  599. 28710  LX%(0)=S%(0):LX%(1)=S%(1):GOTO 28790
  600. 28720  LY%(0)=S%(0):LY%(1)=S%(1):GOTO 28790
  601. 28730  LC%(0)=S%(0):LC%(1)=S%(1):GOTO 28790
  602. 28740  RX%(0)=S%(0):RX%(1)=S%(1):GOTO 28790
  603. 28750  RY%(0)=S%(0):RY%(1)=S%(1):GOTO 28790
  604. 28760  RC%(0)=S%(0):RC%(1)=S%(1)
  605. 28790  NEXT MT
  606. 28800  LMP%=0:RMP%=0:LO%=1:GOSUB 20000:LO%=0:RETURN
  607. 28890  ' ***************************************
  608. 28892  ' *  Flash psuedo cursor for key input  *
  609. 28894  ' ***************************************
  610. 28900  LOCATE CSRLIN,POS(0)-1:PRINT CHR$(22);
  611. 28902  FOR I=1 TO 25
  612. 28904  IN$=INKEY$:IF IN$<>"" THEN RETURN
  613. 28905  XC=XC+1:IF XC>32000 THEN XC=0
  614. 28906  NEXT
  615. 28910  PRINT CHR$(29)" ";
  616. 28912  FOR I=1 TO 25
  617. 28914  IN$=INKEY$:IF IN$<>"" THEN RETURN
  618. 28915  XC=XC+1:IF XC>32000 THEN XC=0
  619. 28916  NEXT
  620. 28920  GOTO 28900
  621. 29990  ' ****************************
  622. 29992  ' *  Clear bottom of screen  *
  623. 29994  ' ****************************
  624. 30000  LOCATE 17,1:GOSUB 35000:RETURN
  625. 30990  ' **********************************
  626. 30992  ' *  Clear bottom during Graphing  *
  627. 30994  ' **********************************
  628. 31000  LOCATE 21,1:GOSUB 35000: RETURN
  629. 34990  ' ****************************************
  630. 34992  ' *  Clear from cursor to end of screen  *
  631. 34994  ' ****************************************
  632. 35000  LINE ((POS(0)-1)*8,(CSRLIN-1)*8)-(319,199),0,BF
  633. 35020  RETURN
  634. 35990  ' ***************************
  635. 35992  ' *  Print an ordered pair  *
  636. 35994  ' ***************************
  637. 36000  PRINT "(";FN NUMSIGN$(DX%,1);
  638. 36010  PRINT ",";FN NUMSIGN$(DY%,1);")";
  639. 36020  RETURN
  640. 39990  ' ***********************
  641. 39992  ' *  Create a problem.  *
  642. 39994  ' * K%=1:easy; =2:hard  *
  643. 39996  ' ***********************
  644. 45000  CLS:LOCATE 10,15:PRINT"Problem #";USING"#";P%:MV%=8:MC%=18
  645. 45010  RANDOMIZE FN TI
  646. 45020  A%=FN SIGN(0)*FN R(MV%)*(-(FN R(6)<>1)):B%=FN SIGN(0)*FN R(MV%)*(-(FN R(6)<>1)):IF A%=0 AND B%=0 THEN 45010
  647. 45022  RANDOMIZE FN TI
  648. 45025  IF B%=0 THEN C%=FN SIGN(0)*A%*FN R(INT(MV%/ABS(A%))):GOTO 45050
  649. 45030  C%=FN SIGN(0)*B%*FN R(INT(MV%/ABS(B%)))
  650. 45050  IF K%=2 THEN TY%=1+FN R(3):GOTO 45100
  651. 45060  IF K%=1 THEN TY%=1:GOTO 45100
  652. 45065  RANDOMIZE FN TI
  653. 45070  TY%=FN R(4)
  654. 45100  IF (TY%=4 AND ABS (B%)<2) OR (TY%=2 AND ABS(A%)+ABS(B%)=1) THEN 45010
  655. 45105  IF C%=0 AND ((A% AND B%)=0) THEN 45010
  656. 45110  IF A%=0 OR B%=0 THEN RETURN
  657. 45120  OK%=0:FOR ZZ=-10 TO 10:OK%=OK%-(A%*ZZ/B%=INT(A%*ZZ/B%) AND ABS(A%*ZZ/B%)<11):NEXT ZZ:IF OK%<3 THEN 45010
  658. 45200  RETURN
  659. 45990  ' ************************
  660. 45992  ' *  Set up an equation  *
  661. 45994  ' ************************
  662. 46000  LX%(0)=0:LY%(0)=0:LC%(0)=0:RX%(0)=0:RY%(0)=0:RC%(0)=0:AX%(0)=0:AY%(0)=0:AC%(0)=0:LX%(1)=1:LY%(1)=1:LC%(1)=1:RX%(1)=1:RY%(1)=1:RC%(1)=1:AX%(1)=1:AY%(1)=1:AC%(1)=1:LMP%=0:RMP%=0:MC%(0)=0:MC%(1)=1
  663. 46010  ON TY% GOTO 46100,46200,46300,46400
  664. 46100  IF B% THEN LY%(0)=1:RX%(0)=-A%*SGN(B%+0.05):RX%(1)=ABS(B%):RC%(0)=C%/B%:RC%(1)=1
  665. 46110  IF ABS(B%)<2 THEN 46140
  666. 46120  FOR ZZ=ABS(B%) TO 2 STEP -1:IF FN WH(RX%(0)/ZZ) AND FN WH(RX%(1)/ZZ) THEN RX%(0)=RX%(0)/ZZ:RX%(1)=RX%(1)/ZZ
  667. 46130  NEXT ZZ
  668. 46140  IF B%=0 THEN LX%(0)=1:RC%(0)=C%/A%
  669. 46150  RETURN
  670. 46200  LX%(0)=A%:LY%(0)=B%:RC%(0)=C%:RETURN
  671. 46300  LX%(0)=A%:LY%(0)=B%:LC%(0)=-C%:RETURN
  672. 46400  LY%(0)=B%:RX%(0)=-A%:RC%(0)=C%:RETURN
  673. 47000  ' *******************************************
  674. 47002  ' *  Define user functions and set up data  *
  675. 47004  ' *******************************************
  676. 47100  DEF FN R(X)    = INT (X*RND(1)+1)
  677. 47110  DEF FN SIGN(X) = -3+2*FN R(2)
  678. 47120  DEF FN WH(X)   = ABS(X-INT(X))<9.9999E-05
  679. 47130  DEF FN TI=-XC+VAL(RIGHT$(TIME$,2))
  680. 47132  DEF FN NEG(X)  = -(ABS(X)<>X)
  681. 47133  DEF FN MID(I$)=INT((40-LEN(I$))/2)
  682. 47135  DIM ME$(11),S.SIGNS$(1):S.SIGNS$(0)=" + ":S.SIGNS$(1)=" - "
  683. 47140  DIM B.SIGNS$(1):B.SIGNS$(0)="":B.SIGNS$(1)="-"
  684. 47150  DEF FN RIGHTOF$(X$)   = RIGHT$(X$,LEN(X$)-1)
  685. 47155  DEF FN NUMSIGN$(X,T%) = B.SIGNS$(-(ABS(X)<>X)*T%)+FN RIGHTOF$(STR$(X))
  686. 47160  DEF FN SIGNSTR$(X$)   = (B.SIGNS$(-(SI$=" - "))+X$)
  687. 47170  DIM P.POINT#(8),X.MARK#(8)
  688. 47190  OBJ.ONE$="ne3nf3"
  689. 47200  OBJ.TWO$="bh1h2bf3;be1e2bg3;bf1f2bh3;bg1g2be3"
  690. 47210  OBJ.THR$="nu3nd3nr3nl3;d2r1u4d1r1d2l4u2r1u1d4"
  691. 47220  OBJ.FOU$="nu2nd2nr2l2;r1u1r2d2l2u2"
  692. 47230  FIVE$="nr3;d2;r2br1;bd1d2bd1;bl1l2u1"
  693. 47240  NEG$="r2bu3br2"
  694. 47250  ONE$="bd1r1u1d6l1r2bu6br3"
  695. 47260  ZERO$="br1r1br1bd1d4bd1bl1l1bl1bu1u4"
  696. 47270  TEN$=ONE$+ZERO$
  697. 47280  PI=3.14159
  698. 47300  ACCEPT.KEYS$="IJKMHKMP8462"
  699. 47310  TC%=11:SS%=154
  700. 47320  DEF FN HC(X) = INT (X*SS% / (2 * TC%) + SS% / 2 + 0.5)
  701. 47330  DEF FN VC(Y)=INT(-Y * SS% / (2 * TC%) + SS% / 2 + 0.5)
  702. 47335  CR$=CHR$(13)
  703. 47340  CLS
  704. 47400  PRESET(5,4):DRAW"c2"+OBJ.TWO$
  705. 47410  PRESET(4,4):DRAW"c2"+OBJ.TWO$
  706. 47420  PRESET(3,4):DRAW"c2"+OBJ.TWO$:GET(0,0)-(8,8),X.MARK#
  707. 47430  PUT(0,0),X.MARK#:CIRCLE(4,4),4,3:PAINT(4,4),3,3:GET(0,0)-(8,8),P.POINT#
  708. 47440  PUT(0,0),P.POINT#
  709. 47450  ME$(0)="Very impressive!":ME$(1)="I see you've been doing your homework!":ME$(2)="Too bad your teacher can't see this!":ME$(3)="The math department is proud of you!":ME$(4)="Well, we can't all be perfect."
  710. 47460  ME$(5)="You almost made it on that one.":ME$(6)="That was a good try.":ME$(7)="Keep trying.  You're doing well.":ME$(8)="Keep trying.  You'll get it.":ME$(9)="You'll do better on the next one."
  711. 47470  ME$(10)="These problems are not so easy.":ME$(11)="Try again.  Practice makes perfect."
  712. 47500  RETURN
  713. 49990  ' ****************
  714. 49992  ' *  Title Page  *
  715. 49994  ' ****************
  716. 50000  OUT &H3D8,10:DEF SEG=&H40:POKE &H65,14
  717. 50010  DEF SEG=&H50
  718. 50030  A1=PEEK(&H10):A2=PEEK(&H11):SEGMENT!=A1+256*A2
  719. 50040  DEF SEG=SEGMENT!:BLOAD"xtraset",&HF000
  720. 50045  DEF SEG=SEGMENT!:BASE!=&HF178:POKE BASE!,0:POKE BASE!+1,18:POKE BASE!+2,18:POKE BASE!+3,30:POKE BASE!+4,2:POKE BASE!+5,28:POKE BASE!+6,0:POKE BASE!+7,0
  721. 50050  DEF SEG=0
  722. 50060  POKE &H7F,A2
  723. 50070  POKE &H7E,A1
  724. 50080  POKE &H7D,&HF0
  725. 50090  POKE &H7C,0
  726. 50120  LOCATE 6,8:A$="GRAPHING LINEAR FUNCTIONS":DEF SEG:POKE &H4E,1:PRINT A$;
  727. 50130  LOCATE 10,10:A$="Designed by Don Ross":POKE &H4E,2:PRINT A$;
  728. 50140  LOCATE 14,9:A$="Microcomputer Workshops":POKE &H4E,1:PRINT A$;
  729. 50150  LOCATE 16,15:A$="Courseware":POKE &H4E,1:PRINT A$;
  730. 50160  LOCATE 19,13:A$="Copyright 1984":POKE &H4E,2:PRINT A$;
  731. 50310  FOR I=1 TO 10
  732. 50320  IF I=1 OR I=10 THEN C=1 ELSE C=2
  733. 50330  LINE(I,I)-(319-I,199-I),C,B
  734. 50340  NEXT I
  735. 50350  FOR I=1 TO 3000:NEXT :POKE &H4E,3:RETURN
  736. 50990  ' **************************
  737. 50992  ' *  Enter student's name  *
  738. 50994  ' **************************
  739. 51000  CLS:COLOR 0,1:XC=0:DEF SEG=0:POKE 1050,PEEK(1052):DEF SEG
  740. 51020  PRINT "   Please type in your first name (up":PRINT :PRINT "   to 10 letters) and press ENTER.":PRINT
  741. 51030  LOCATE 6,12:PRINT "Name:  ";
  742. 51040  GOSUB 28900
  743. 51045  IF IN$=CHR$(13) AND LEN(N$)>0 THEN PRINT CHR$(29)" ";:GOTO 52000
  744. 51050  IF MID$(IN$,2,1)="K" THEN IN$=CHR$(8)
  745. 51060  IF IN$=CHR$(8) AND LEN(N$)> 1 THEN PRINT CHR$(29);" ";CHR$(29);:N$=LEFT$(N$,LEN(N$)-1):GOTO 51040
  746. 51070  IF IN$=CHR$(8) AND LEN(N$)=1 THEN PRINT CHR$(29);" ";CHR$(29);:N$="":GOTO 51040
  747. 51080  IF ASC(IN$)>96 THEN IN$=CHR$(ASC(IN$)-32)
  748. 51090  IF IN$<"A" OR IN$>"Z" THEN 51040
  749. 51100  IF LEN(N$)=0 THEN L=ASC(IN$):IF L>=97 THEN L=ASC(IN$)-32:IN$=CHR$(L)
  750. 51110  IF LEN(N$)>0 THEN L=ASC(IN$):IF L<=97 THEN L=ASC(IN$)+32:IN$=CHR$(L)
  751. 51120  IF LEN(N$)>=10 THEN 51040
  752. 51130  N$=N$+IN$:PRINT CHR$(29);IN$" ";:GOTO 51040
  753. 51990  ' *******************
  754. 51992  ' *  Center screen  *
  755. 51994  ' *******************
  756. 52000  RANDOMIZE -XC:IF KOLOR = TRUE THEN LOCATE 12,1:PRINT "<"STRING$(38,"-")">";"    To center your screen, use the F9":PRINT :PRINT "    and F10 keys.":GOSUB 15000
  757. 52010  RETURN
  758. 54000  ' *************************************
  759. 54010  ' * Adjust horizontal screen position *
  760. 54020  ' *************************************
  761. 55000  IF KOLOR=TRUE THEN IF INDENT<45 THEN INDENT=INDENT+1:OUT 980,2:OUT 981,INDENT
  762. 55010  RETURN
  763. 55020  IF KOLOR=TRUE THEN IF INDENT>40 THEN INDENT=INDENT-1:OUT 980,2:OUT 981,INDENT
  764. 55030  RETURN
  765. 55040  REM
  766. 55050  REM
  767. 55060      '   ***************************
  768. 55070      '   ***  CHOOSE  &  SWITCH  ***
  769. 55080      '   ***      MONITORS       ***
  770. 55090      '   ***************************
  771. 55100  TRUE=-1:FALSE=0
  772. 55110  '*** find out which adapters exist ***
  773. 55120  DEF SEG=&HB000
  774. 55130  POKE 0,32
  775. 55140  MONO=(PEEK(0)=32)
  776. 55150  POKE 0,0
  777. 55160  MONO=(PEEK(0)=0) AND MONO
  778. 55170  DEF SEG=&HB800
  779. 55180  POKE 0,32
  780. 55190  KOLOR=(PEEK(0)=32)
  781. 55200  POKE 0,0
  782. 55210  KOLOR=(PEEK(0)=0) AND KOLOR
  783. 55220  IF MONO AND KOLOR GOTO 55280
  784. 55230  IF KOLOR THEN GOSUB 55360:RETURN
  785. 55240  IF NOT MONO THEN 55250
  786. 55242  GOSUB 55410 ' switch to monochrome
  787. 55244  LOCATE 10,1:PRINT "Sorry, but you must have color graphics";:PRINT :PRINT "   to run GRAPHING LINEAR FUNCTIONS   "
  788. 55246  GOTO 55246
  789. 55250  '*** if we reach here there is a problem ***
  790. 55260  CLS:LOCATE 1,2,0:PRINT "SOMETHING WRONG -- NO ADAPTERS ..."
  791. 55270  GOTO 55270
  792. 55280  REM  *** both adapters exist ***
  793. 55290  GOSUB 55410: LOCATE 10,3:PRINT "Please turn on your color monitor."
  794. 55300  GOSUB 55350 ' switch back to color
  795. 55340  RETURN
  796. 55350  '*** switch to color graphics adapter ***
  797. 55360  DEF SEG=&H40:I=PEEK(&H10):POKE &H10,(I AND &HCF) OR &H20
  798. 55370  SCREEN 1,0
  799. 55380  KOLOR=TRUE:MONO=FALSE:X=12:INDENT=45:SEGMENT=&HB800
  800. 55390  COLOR ,1
  801. 55395  BLOAD"CBSLOGO.PIC":FOR I=1 TO 7000:NEXT:CLS
  802. 55400  RETURN
  803. 55410  '*** switch to monochrome adapter ***
  804. 55420  DEF SEG=0:I=PEEK(&H410):POKE &H410,I OR &H30
  805. 55421  SCREEN 1:LOCATE 9,28:PRINT STRING$(25,219):LOCATE 17,28:PRINT STRING$(25,219):FOR IIX=10 TO 16:LOCATE IIX,28:PRINT CHR$(219);SPACE$(23);CHR$(219):NEXT:LOCATE 12,39:PRINT"CBS":LOCATE 14,37:PRINT"PRESENTS":FOR IIX=1 TO 7000:NEXT
  806. 55430  SCREEN 0,0,0,0:WIDTH 40:LOCATE ,,0,12,13
  807. 55440  OUT &H3B4,2:OUT &H3B5,&H3E
  808. 55450  KOLOR=FALSE:MONO=TRUE:X=26:SEGMENT=&HB000
  809. 55460  COLOR 7,0
  810. 55461  SCREEN 0,0,0,0
  811. 55470  RETURN
  812.