home *** CD-ROM | disk | FTP | other *** search
/ Nibble Magazine / nib36b.dsk / ORBIT.bas < prev    next >
BASIC Source File  |  2023-02-26  |  11KB  |  228 lines

  1. 10  REM   *************************
  2. 20  REM   * ORBIT                 *
  3. 30  REM   * BY ROY PLUM           *
  4. 40  REM   * COPYRIGHT(C) 1989     *
  5. 50  REM   * MINDCRAFT PUBL. CORP. *
  6. 60  REM   * CONCORD, MA 01742     *
  7. 70  REM   *************************
  8. 80  IF  PEEK(104) < >96  THEN  POKE 103,1: POKE 104,96: POKE 24576,0: PRINT  CHR$(4)"RUN ORBIT"
  9. 90  PRINT  CHR$(21): GOTO 250
  10. 100  IF TRCE  THEN  HPLOT X1,Y1 TO X3,Y3: HPLOT X2,Y2 TO X4,Y4: GOTO 120
  11. 110  XDRAW 1 AT X3,Y3: XDRAW 2 AT X4,Y4
  12. 120  DRAW 1 AT X1,Y1: DRAW 2 AT X2,Y2
  13. 130 X3 = X1:X4 = X2:Y3 = Y1:Y4 = Y2
  14. 140 D2 = ((X2 -X1) ^2 +(Y2 -Y1) ^2):D =  SQR(D2)
  15. 150 GT = M1 *M2/D2:G1 = GT *M2/(M1 +M2):G2 = GT *M1/(M1 +M2)
  16. 160 XG(1) = G1 *(X2 -X1)/D:YG(1) = G1 *(Y2 -Y1)/D
  17. 170 XV(1) = XV(1) +XG(1):YV(1) = YV(1) +YG(1)
  18. 180 XG(2) = G2 *(X1 -X2)/D:YG(2) = G2 *(Y1 -Y2)/D
  19. 190 XV(2) = XV(2) +XG(2):YV(2) = YV(2) +YG(2)
  20. 200 X1 = X1 +XV(1):Y1 = Y1 +YV(1) *F
  21. 210 X2 = X2 +XV(2):Y2 = Y2 +YV(2) *F
  22. 220  IF  PEEK( -16384) >127  THEN 1460
  23. 230  GOTO 100
  24. 240  REM  SET UP SHAPE TABLE
  25. 250  POKE 232,0: POKE 233,3
  26. 260  FOR ADR = 768 TO 785
  27. 270  READ BYTE: POKE ADR,BYTE: NEXT 
  28. 280  DATA  2,0,6,0,9,0,44,62,0,44,54,63,36,44,45,54,54,0
  29. 290  ONERR  GOTO 1380
  30. 300  PRINT  CHR$(4)"BLOAD TRACE.SAVER"
  31. 310  REM  SET UP SAMPLE VALUES
  32. 320  DIM D(3,9)
  33. 330  FOR AN = 0 TO 2: FOR V = 0 TO 9
  34. 340  READ D(AN,V)
  35. 350  NEXT : NEXT 
  36. 360  DATA  5,5.5,0,140,15,500,0,0,140,100
  37. 370  DATA  5,3.5,0,140,15,500,0,0,140,100
  38. 380  DATA  100,5,0,140,15,100,-5,0,140,100
  39. 390 F = .82: HGR2 
  40. 400  REM  MENU
  41. 410  TEXT : HOME 
  42. 420  GOSUB 1650
  43. 430  HTAB 9: VTAB 1: POKE 1403,8: PRINT "ORBIT BY ROY PLUM"
  44. 440  PRINT "COPYRIGHT (C) 1989 MINDCRAFT PUBL. CORP."
  45. 450  PRINT "--------------------------------------": REM  38 -'s
  46. 460  PRINT  TAB( 14)"PRESET ORBITS"
  47. 470  PRINT 
  48. 480  PRINT "1. CIRCULAR ORBIT (PLANETARY)"
  49. 490  PRINT "2. ELLIPTICAL ORBIT (COMETARY)"
  50. 500  PRINT "3. EQUAL MASSES (BINARY STARS)
  51. 510  PRINT "--------------------------------------": REM  38 -"s
  52. 520  PRINT 
  53. 530  PRINT "4. ENTER YOUR OWN.";
  54. 540  PRINT  TAB( 20)"7. ERASE TRACES."
  55. 550  PRINT "5. TOGGLE TRACE.";
  56. 560  PRINT  TAB( 20)"8. LIST PRESET VALS."
  57. 570  PRINT "6. VIEW TRACES.";
  58. 580  PRINT  TAB( 20)"9. EXIT"
  59. 590  GOSUB 2250
  60. 600  VTAB 16: POKE 1403,0: HTAB 1: INVERSE : PRINT "ENTER YOUR CHOICE AND PRESS RETURN.": NORMAL : PRINT 
  61. 610  GOSUB 1960:AN = KB -48: IF (AN <1  OR AN >9)  THEN 610
  62. 620  IF AN >9  OR AN <1 GOTO 600
  63. 630  IF AN = 4  THEN  GOSUB 2200: GOSUB 800: IF I =  -1  THEN 410
  64. 640  IF AN = 5  THEN TRCE =   NOT TRCE: GOTO 590
  65. 650  IF AN = 6  THEN 1580
  66. 660  IF AN = 7  THEN  HGR2 : TEXT : GOTO 600
  67. 670  IF AN = 8  THEN 1780
  68. 680  IF AN = 9  THEN 1530
  69. 690 AN = AN -1: GOSUB 1340
  70. 700  POKE 34,19: HOME 
  71. 710  VTAB 21: POKE 1403,0: HTAB 1: PRINT "THE ORBIT WILL STOP IF THE BODIES"
  72. 720  PRINT "LEAVE THE SCREEN, OR YOU CAN STOP"
  73. 730  PRINT "IT BY PRESSING RETURN.";
  74. 740  POKE 34,15
  75. 750  HGR : HCOLOR= 3: ROT= 0: SCALE= 1
  76. 760  XDRAW 1 AT X1,Y1: XDRAW 2 AT X2,Y2
  77. 770  VTAB 24: POKE 1403,0: HTAB 1: PRINT "PRESS RETURN TO START";: GOSUB 1960
  78. 780  POKE  -16302,0: GOTO 130
  79. 790  REM  INPUT STARTING VALUES
  80. 800  VTAB 24: POKE 1403,0: HTAB 1: INVERSE : PRINT "PRESS RETURN AFTER EACH ENTRY";: NORMAL 
  81. 810  POKE 34,19: POKE 35,23
  82. 820  VTAB 22:HT = 3:I =  LEN( STR$(M1))
  83. 830 KB$ =  STR$(M1)
  84. 840  GOSUB 1970: IF I =  -1  THEN  RETURN 
  85. 850 M1 = KB:D(3,0) = M1
  86. 860  GOSUB 1650
  87. 870  VTAB 22:HT = 14:I =  LEN( STR$(XV(1)))
  88. 880 KB$ =  STR$(XV(1))
  89. 890  GOSUB 1970: IF I =  -1  THEN  RETURN 
  90. 900 XV(1) = KB:D(3,1) = XV(1)
  91. 910  GOSUB 1650
  92. 920  VTAB 22:HT = 25:KB$ =  STR$(YV(1)):I =  LEN(KB$)
  93. 930  GOSUB 1970: IF I =  -1  THEN  RETURN 
  94. 940 YV(1) = KB:D(3,2) = YV(1)
  95. 950  GOSUB 1650
  96. 960  VTAB 22:HT = 30:KB$ =  STR$(X1):I =  LEN(KB$)
  97. 970  GOSUB 1970: IF I =  -1  THEN  RETURN 
  98. 980  IF KB >275  OR KB <0  THEN 960
  99. 990 X1 = KB:D(3,3) = X1
  100. 1000  GOSUB 1650
  101. 1010  VTAB 22:HT = 34:KB$ =  STR$(Y1):I =  LEN(KB$)
  102. 1020  GOSUB 1970: IF I =  -1  THEN  RETURN 
  103. 1030  IF KB >188  OR KB <0  THEN 1010
  104. 1040 Y1 = KB:D(3,4) = Y1
  105. 1050  GOSUB 1650
  106. 1060  VTAB 23:HT = 3:KB$ =  STR$(M2):I =  LEN(KB$)
  107. 1070  GOSUB 1970: IF I =  -1  THEN  RETURN 
  108. 1080 M2 = KB:D(3,5) = M2
  109. 1090  GOSUB 1650
  110. 1100  VTAB 23:HT = 14:KB$ =  STR$(XV(2)):I =  LEN(KB$)
  111. 1110  GOSUB 1970: IF I =  -1  THEN  RETURN 
  112. 1120 XV(2) = KB:D(3,6) = XV(2)
  113. 1130  GOSUB 1650
  114. 1140 HT = 25: VTAB 23:KB$ =  STR$(YV(2)):I =  LEN(KB$)
  115. 1150  GOSUB 1970: IF I =  -1  THEN  RETURN 
  116. 1160 YV(2) = KB:D(3,7) = YV(2)
  117. 1170  GOSUB 1650
  118. 1180 HT = 30: VTAB 23:KB$ =  STR$(X2):I =  LEN(KB$)
  119. 1190  GOSUB 1970: IF I =  -1  THEN  RETURN 
  120. 1200  IF KB >275  OR KB <0  THEN 1180
  121. 1210 X2 = KB:D(3,8) = X2
  122. 1220  GOSUB 1650
  123. 1230  VTAB 23:HT = 34:KB$ =  STR$(Y2):I =  LEN(KB$)
  124. 1240  GOSUB 1970: IF I =  -1  THEN  RETURN 
  125. 1250  IF KB >188  OR KB <0  THEN 1230
  126. 1260 Y2 = KB:D(3,9) = Y2
  127. 1270  GOSUB 1650
  128. 1280  POKE 35,24
  129. 1290  VTAB 24: POKE 1403,0: HTAB 1: CALL  -958
  130. 1300  VTAB 24: HTAB 1: POKE 1403,0: PRINT "DO YOU WANT TO CHANGE ANYTHING?";: INVERSE : PRINT " ";: NORMAL : GOSUB 1960: REM  1 SPACE IN " "
  131. 1310  IF KB = 89  OR KB = 121  THEN  HTAB 1: VTAB 24: POKE 1403,0: CALL  -958: GOTO 800
  132. 1320  POKE 1403,0: HTAB 1: RETURN 
  133. 1330  REM   RESTORE STARTING VALUES
  134. 1340 M1 = D(AN,0):XV(1) = D(AN,1):YV(1) = D(AN,2):X1 = D(AN,3):Y1 = D(AN,4)
  135. 1350 M2 = D(AN,5):XV(2) = D(AN,6):YV(2) = D(AN,7):X2 = D(AN,8):Y2 = D(AN,9)
  136. 1360  RETURN 
  137. 1370  REM  ERROR HANDLING
  138. 1380 DE =  PEEK(222): IF DE = 6  OR DE = 7  THEN  POKE 34,0: HOME : VTAB 22: PRINT "FILE NOT FOUND...ORBIT AND": PRINT "TRACE.SAVER MUST BE ON THIS DISK": END 
  139. 1390  IF DE = 8  THEN  POKE 34,15: HOME : VTAB 22: PRINT "I/O ERROR...CHECK DISK DRIVE.": PRINT "AND PRESS RETURN TO CONTINUE": GOSUB 1960: GOTO 300
  140. 1400  IF DE = 133  THEN  POKE 34,14: TEXT : HOME : VTAB 22: PRINT "ERROR...CHECK MASS VALUES AND MAKE SURE": PRINT "THEY HAVE DIFFERENT STARTING POINTS": PRINT "PRESS RETURN TO CONTINUE";: GOSUB 1960: HOME : GOTO 420
  141. 1410  IF DE < >53  THEN  TEXT : HOME : VTAB 22: PRINT "UNEXPECTED ERROR #"DE" AT LINE " PEEK(218) +256 * PEEK(219): END 
  142. 1420  POKE  -16301,0: POKE  -16368,0
  143. 1430  GOSUB 1340: VTAB 15: POKE 1403,0: HTAB 1: CALL  -958: VTAB 24
  144. 1440  IF TRCE  THEN 1540
  145. 1450  POKE 34,15: VTAB 16: POKE 1403,0: HTAB 1: CALL  -958: VTAB 24: PRINT "PRESS RETURN TO CONTINUE";: GOSUB 1960: GOTO 1520
  146. 1460  POKE  -16301,0: POKE 34,15: VTAB 15: CALL  -958: VTAB 22: HTAB 1: POKE 1403,0: IF TRCE  THEN  PRINT "DO YOU WANT TO SAVE THIS TRACE?";: INVERSE : PRINT " ";: NORMAL : GOSUB 1960: POKE 1403,0: HTAB 1: VTAB 22: CALL  -958
  147. 1470  IF   NOT TRCE  THEN 1500
  148. 1480  IF (KB = 89  OR KB = 121)  THEN  CALL 789
  149. 1490  IF (KB < >110  AND KB < >78  AND KB < >89  AND KB < >121)  THEN 1460
  150. 1500  VTAB 24: POKE 1403,0: HTAB 1: PRINT "PRESS RETURN TO CONTINUE, ESC FOR MENU";
  151. 1510  GOSUB 1960: IF KB < >27  THEN  VTAB 14: CALL  -958: POKE  -16302,0: GOTO 100
  152. 1520  TEXT : VTAB 15: CALL  -958: GOSUB 1340: GOSUB 1650: GOTO 590
  153. 1530  TEXT : HOME : END 
  154. 1540  PRINT "DO YOU WANT TO SAVE THIS TRACE?";: INVERSE : PRINT " ";: GOSUB 1960: NORMAL 
  155. 1550  IF KB = 89  OR KB = 121  THEN  CALL 789
  156. 1560  GOTO 1450
  157. 1570  REM VIEW TRACES
  158. 1580  VTAB 17: INVERSE : PRINT "PRESS A KEY TO VIEW TRACES & TO RETURN";: NORMAL 
  159. 1590  GOSUB 1960
  160. 1600  POKE 34,15: HOME : GOSUB 1650
  161. 1610  POKE  -16297,0: POKE  -16299,0: POKE  -16302,0: POKE  -16304,0
  162. 1620  VTAB 17: GOSUB 1960
  163. 1630  POKE  -16300,0: POKE  -16303,0
  164. 1640  GOTO 590
  165. 1650  REM  DISPLAY CURRENT STARTING VALUES
  166. 1660 TM =  PEEK(34): POKE 34,19
  167. 1670  HOME :T = VT:VT = 22
  168. 1680  HTAB 10: VTAB 19: POKE 1403,9: PRINT "STARTING VALUES"
  169. 1690  PRINT "MASS";: HTAB 12: POKE 1403,11: PRINT "VELOCITIES";: HTAB 28: POKE 1403,27: PRINT "STARTING AT"
  170. 1700  PRINT "--------------------------------------": REM  39 -"s
  171. 1710  VTAB VT: PRINT "M1="M1;: HTAB 9: PRINT "XV(1)="XV(1);: HTAB 20: PRINT "YV(1)="YV(1);: HTAB 31: PRINT X1;: HTAB 34: PRINT ",";: PRINT Y1;
  172. 1720 VT = VT +1
  173. 1730  HTAB 1: POKE 1403,0: VTAB VT: PRINT "M2="M2;: HTAB 9: PRINT "XV(2)="XV(2);: HTAB 20: PRINT "YV(2)="YV(2);: HTAB 31: PRINT X2;: HTAB 34: PRINT ",";: PRINT Y2;
  174. 1740  POKE 34,TM: POKE 1403,0:VT = T: HTAB 1
  175. 1750  RETURN 
  176. 1760  VTAB VT: HTAB HT: RETURN 
  177. 1770  REM  DISPLAY PRESET VALUES
  178. 1780  POKE 35,19: POKE 34,0: HOME 
  179. 1790  PRINT  TAB( 14)"PRESET VALUES"
  180. 1800  PRINT "-------------------------------------": REM  38 -"s
  181. 1810  PRINT "1. CIRCULAR ORBIT (PLANETARY):"
  182. 1820 AN = 0: GOSUB 1340:VT = 4:TM = 0: GOSUB 1710
  183. 1830  PRINT 
  184. 1840  PRINT : PRINT "2. ELLIPTICAL ORBIT (COMETARY):"
  185. 1850 AN = 1: GOSUB 1340:VT = 8: GOSUB 1710
  186. 1860  PRINT 
  187. 1870  PRINT : PRINT "3. EQUAL MASSES (BINARY STAR):"
  188. 1880 AN = 2: GOSUB 1340:VT = 12: GOSUB 1710
  189. 1890  PRINT 
  190. 1900  PRINT : PRINT "4. YOUR OWN VALUES (LAST USED):"
  191. 1910 AN = 3: GOSUB 1340:VT = 16: GOSUB 1710
  192. 1920  PRINT : INVERSE 
  193. 1930  PRINT "PRESS RETURN FOR MENU.";
  194. 1940  GOSUB 1960: NORMAL : HOME : POKE 35,24
  195. 1950  VTAB 19: PRINT  TAB( 10)"STARTING VALUES": VTAB 1: GOTO 430
  196. 1960  POKE  -16368,0: WAIT  -16384,128:KB =  PEEK( -16384) -128: POKE  -16368,0: RETURN 
  197. 1970  FOR I = 0 TO 4:T$(I) = "": NEXT : FOR I = 0 TO  LEN(KB$):T$(I) =  MID$ (KB$,I +1,1): NEXT :I = 0:DF$ = KB$
  198. 1980  GOSUB 2180
  199. 1990  GOSUB 1960
  200. 2000  IF KB = 13  THEN 2160
  201. 2010  IF KB = 27  THEN I =  -1: RETURN 
  202. 2020  IF ((KB = 127  OR KB = 8)  AND I = 0)  THEN 1990
  203. 2030  IF ((KB = 127  OR KB = 8)  AND I = 1)  THEN T$(I) = "": NORMAL : GOSUB 2280: PRINT  CHR$(8);:I = I -1: GOSUB 2180:KB$ =  LEFT$(KB$,1): GOTO 1990
  204. 2040  IF ((KB = 127  OR KB = 8)  AND I >1)  THEN T$(I) = "": NORMAL : GOSUB 2280: PRINT  CHR$(8);:I = I -1: GOSUB 2180:KB$ =  LEFT$(KB$,I): GOTO 1990
  205. 2050  IF KB = 45  AND I >1  THEN 1990
  206. 2060  IF I = 4  THEN 1990
  207. 2070  IF KB = 21  AND T$(I) < >""  THEN 2220
  208. 2080  IF KB >57  THEN 1990
  209. 2090  IF KB <48  AND KB < >45  AND KB < >46  THEN 1990
  210. 2100 T$(I) =  CHR$(KB)
  211. 2110  IF I = 0  THEN KB$ =  CHR$(KB): GOTO 2130
  212. 2120 KB$ = KB$ + CHR$(KB)
  213. 2130  POKE 1403,HT +I: HTAB HT +I +1: PRINT  CHR$(KB);
  214. 2140 I = I +1
  215. 2150  GOTO 1980
  216. 2160 KB =  VAL(KB$): NORMAL : GOSUB 2280
  217. 2170  RETURN 
  218. 2180  POKE 1403,HT +I: HTAB HT +I +1: INVERSE : IF T$(I) = ""  THEN 2210
  219. 2190  PRINT T$(I);: NORMAL : RETURN 
  220. 2200  VTAB 16: HTAB 1: POKE 1403,0: PRINT "                                        ";: RETURN : REM  40 " "'s
  221. 2210  PRINT " ";: NORMAL : RETURN 
  222. 2220  IF I = 0  THEN KB$ = T$(I): GOTO 2240
  223. 2230 KB$ = KB$ +T$(I)
  224. 2240  POKE 1403,HT +I: HTAB HT +I +1: PRINT T$(I);:I = I +1: GOTO 1980
  225. 2250  IF TRCE  THEN  VTAB 17: POKE 1403,0: HTAB 1: INVERSE : PRINT "TRACE IS ON.";: NORMAL : PRINT " ";: GOTO 2270
  226. 2260  VTAB 17: POKE 1403,0: HTAB 1: PRINT "TRACE IS OFF."
  227. 2270  POKE 34,15: RETURN 
  228. 2280  POKE 1403,HT +I: HTAB HT +I +1: PRINT " ";: RETURN