home *** CD-ROM | disk | FTP | other *** search
/ HAM Radio 1 / HamRadio.cdr / satel / sateqv74 / sateq.bas < prev    next >
BASIC Source File  |  1990-09-05  |  40KB  |  838 lines

  1. 10    '**** SATAUS Programm von OE1HSI VERSION 7.4E  4.APRIL 1990
  2. 20    '**** VERSION MIT MEMSTORAGE DER MAP UND SATKEPN.DAT,HELLGRÜN
  3. 30    '**** MIT DRUCKERTEST hsi version **** ohne LOGO, >32k orbits
  4. 40    '**** MA 256 hinzugefügt 11/88, ESC 0,0 bereinigt,<D> enhanced
  5. 50    ' ** QUICKBASIC COMPILER PROBLEM CIRCUMVENTED with DIVISION**
  6. 60    'F10 Auswahl SINGLE DISPLAY REPETITION, Defproblems removed
  7. 70    ON ERROR GOTO 10020
  8. 80    OPEN "SATKEPN.DAT" FOR INPUT AS #1: CLOSE 'TEST FILE PRESENCE
  9. 90    OPEN "SATBODN.DAT" FOR INPUT AS #1: CLOSE
  10. 100    OPEN "SATMAP.DAT" FOR INPUT AS #1: CLOSE
  11. 110   CLEAR
  12. 120   DEFDBL H, N, T: DEFINT J: OPTION BASE 1
  13. 130   '**** defs *****
  14. 140   DIM T$(20), S$(40), CC(3, 2), GG3(20)
  15. 150   DIM C(3, 2), Y1(20), G3(20), SAT(6), SATL(20, 2), K0(20), N0(20), A0(20), F1(20), I$(20)
  16. 160   DIM PKT(6), KEP(6), E0(20), M0(20), Y3(20), W0(20), T0(20), I0(20), O0(20)
  17. 170   DIM WLT(3000)
  18. 180   KEY OFF: SCREEN 0, 1: WIDTH 80: COLOR 14, 1, 0: CLS : PRINT : PRINT 'CLEAR
  19. 190   ON ERROR GOTO 10000
  20. 200   KEY(9) OFF: KEY(10) OFF: KEY(8) OFF: KEY(7) OFF
  21. 210   GOSUB 6120
  22. 220   COLOR 10, 4: LOCATE 3, 20: PRINT "  SELECT ONE of the FOLLOWING ": COLOR 14, 1
  23. 230   LOCATE 7, 20: PRINT "<P> Prediction for ONE satellite"
  24. 240   LOCATE 9, 20: PRINT "<R> Realtime tracking of satellites GRAPH or TABLE"
  25. 250   LOCATE 11, 20: PRINT "<U> Update/add/delete satellite elements"
  26. 260   LOCATE 13, 20: PRINT "<G> change/enter Groundstation data"
  27. 270   COLOR 12, 1, 0: LOCATE 15, 20: PRINT "<Esc> RETURN TO DOS": COLOR 14, 1, 1
  28. 280   GOSUB 9500
  29. 290   LOCATE 19, 20, 0, 0, 7: COLOR 10, 4: PRINT " SELECT    <P,R,U,G,Esc>--> "; : COLOR 30: PRINT STRING$(2, 176):
  30. 300   Z$ = "PpRrUuGg" + CHR$(27)
  31. 310   K$ = INKEY$: IF K$ = "" THEN 310
  32. 320   COLOR 14, 1, 0: LOCATE 12, 60: PRINT SPACE$(2): K = INSTR(Z$, K$)
  33. 330   ON K GOTO 6000, 6000, 3500, 3500, 400, 400, 2500, 2500, 350, 350
  34. 340   GOSUB 9510: COLOR 28, 1, 0: GOTO 280
  35. 350   CLOSE : CLS : END
  36. 400   ' ****** SATFILE.BAS enhanced 12/88 ***********
  37. 410   KEY OFF: SCREEN 0, 1: WIDTH 80: COLOR 14, 1, 0: CLS
  38. 420   GOSUB 6120
  39. 430   OPEN "SATKEPN.DAT" FOR RANDOM AS #1 LEN = 56
  40. 440   FIELD #1, 10 AS I$, 2 AS Y3$, 8 AS T0$, 4 AS I0$, 4 AS O0$, 4 AS E0$, 4 AS W0$, 4 AS M0$, 8 AS N0$, 4 AS K0$, 4 AS F1$
  41. 450   V1$ = "": COLOR 14, 1, 0
  42. 460   LOCATE 2, 16
  43. 470   PRINT "ELEMENTS of the following SATELLITES are AVAILABLE:"
  44. 480   FOR J% = 1 TO 20: GET #1, J%
  45. 490   IF ASC(I$) < 33 THEN 510 ELSE IF ASC(I$) > 90 THEN 510
  46. 500   LOCATE (J% + 2), 10: PRINT I$: NEXT
  47. 510   LOCATE 7, 35: PRINT "(A) Add a satellite"
  48. 520   LOCATE 8, 35: PRINT "(D) Delete a satellite"
  49. 530   LOCATE 9, 35: PRINT "(C) Change elements"
  50. 540   LOCATE 10, 35: PRINT "(L) List satellite elements"
  51. 550   LOCATE 11, 35: PRINT "(R) Return to MAIN MENU"
  52. 560   LOCATE 12, 35: PRINT "select    <A,D,C,L,R> -->"
  53. 570   LOCATE 12, 61: COLOR 30: PRINT STRING$(2, 176)
  54. 580   Z$ = "RrAaCcDdLl"
  55. 590   K$ = INKEY$: IF K$ = "" THEN 590
  56. 600   COLOR 14, 1, 0: LOCATE 12, 61: PRINT SPACE$(2)
  57. 610   K = INSTR(Z$, K$)
  58. 620   ON K GOTO 1900, 1900, 660, 660, 710, 710, 880, 880, 670, 670
  59. 630   GOSUB 9510: GOTO 570
  60. 640   '
  61. 650   ' ****** ADD A NEW RECORD ******
  62. 660   GOSUB 1110: GOSUB 1730: GOSUB 1360: GOSUB 1400: GOTO 1020
  63. 670   ' ****** list A  RECORD ******
  64. 680   GOSUB 1920: CLS : GOTO 450
  65. 690   '
  66. 700   ' ****** CHANGE AN EXISTING RECORD ******
  67. 710   GOSUB 1050:
  68. 720   IF I$ <> U$ THEN
  69. 730   CLS : LOCATE 16, 35: PRINT "SATELLITE not found"
  70. 740   LOCATE 18, 35: PRINT "TRY ONCE MORE": GOSUB 9510
  71. 750   GOTO 450
  72. 760   END IF
  73. 770   GOSUB 1190
  74. 780   PRINT "CHANGE ELEMENTS OF THIS SATELLITE ? (Y/N) "
  75. 790   Z$ = "YyNn"
  76. 800   K$ = INKEY$: IF K$ = "" THEN 800
  77. 810   K = INSTR(Z$, K$)
  78. 820   ON K GOTO 840, 840, 850, 850
  79. 830   GOSUB 9510: GOTO 800
  80. 840   CLS : GOSUB 1410: GOTO 1020
  81. 850   CLS : GOTO 450
  82. 860   '
  83. 870   ' ****** DELETE AN EXISTING RECORD ******
  84. 880   GOSUB 1050
  85. 890   IF I$ <> U$ THEN
  86. 900   CLS : LOCATE 16, 35: PRINT "SATELLITE not found"
  87. 910   LOCATE 18, 35: PRINT "TRY ONCE MORE": GOSUB 9510
  88. 920   GOTO 450
  89. 930   END IF
  90. 940   COLOR 28: LOCATE 22, 25: PRINT "DELETE, are YOU sure ?? (Y/N) "; : COLOR 14
  91. 950   Z$ = "YyNn"
  92. 960   K$ = INKEY$: IF K$ = "" THEN 960
  93. 970   K = INSTR(Z$, K$)
  94. 980   ON K GOTO 1010, 1010, 1000, 1000
  95. 990   GOSUB 9510: GOTO 960
  96. 1000  CLS : GOTO 450
  97. 1010  GOSUB 1360: GOSUB 1610: GOSUB 1670
  98. 1020  LOCATE 18, 31: COLOR 10, 4: PRINT "CHANGES are filed ": SLEEP 3: GOTO 450
  99. 1030  '
  100. 1040  ' ****** FIND SATELLITE RECORD ******
  101. 1050  LOCATE 14, 35:  INPUT "WHICH SATELLITE ? "; V1$
  102. 1060  IF V1$ = "" THEN
  103. 1070  CLS : LOCATE 16, 35: PRINT "NONAME, try again"
  104. 1080  LOCATE 18, 35: PRINT "TRY ONCE MORE": GOSUB 9510
  105. 1090  GOTO 450
  106. 1100  END IF
  107. 1110  U$ = SPACE$(10): V1$ = UCASE$(V1$): LSET U$ = V1$
  108. 1120  FOR J% = 1 TO 20: GET #1, J%
  109. 1130  IF I$ = U$ THEN 1160 ELSE IF ASC(I$) < 33 THEN 1160 ELSE IF ASC(I$) > 90 THEN 1160
  110. 1140  IF LEFT$(I$, 1) = "" THEN 1160
  111. 1150  NEXT
  112. 1160  RETURN
  113. 1170  '
  114. 1180  ' ****** DISPLAY SATELLITE RECORD ******
  115. 1190  CLS : Y3 = CVI(Y3$)
  116. 1200  T0 = CVD(T0$): I0 = CVS(I0$): O0 = CVS(O0$): E0 = CVS(E0$): W0 = CVS(W0$)
  117. 1210  M0 = CVS(M0$): N0 = CVD(N0$): K0 = CVS(K0$): F1 = CVS(F1$)
  118. 1220  PRINT "Satellite       = "; I$
  119. 1230  PRINT "Epoch year      = "; Y3
  120. 1240  PRINT "Epoch day       = "; T0
  121. 1250  PRINT "Inclination     = "; I0
  122. 1260  PRINT "R.A.A.N.        = "; O0
  123. 1270  PRINT "Eccentricity    = "; E0
  124. 1280  PRINT "Arg. of perigee = "; W0
  125. 1290  PRINT "Mean anomaly    = "; M0
  126. 1300  PRINT "Mean motion     = "; N0
  127. 1310  PRINT "Epoch orbit no. = "; K0
  128. 1320  PRINT "Beacon Frequ.   = "; F1
  129. 1330  PRINT : RETURN
  130. 1340  '
  131. 1350  ' ****** SETUP SATELLITE ELEMENTS FOR DELETE ACTION ******
  132. 1360  Q$ = SPACE$(10): Y3 = 0: T0 = 0: I0 = 0: O0 = 0: E0 = 0: W0 = 0: M0 = 0: N0 = 0: K0 = 0: F1 = 0
  133. 1370  CLS : RETURN
  134. 1380  '
  135. 1390  ' ****** UPDATE/DELETE SATELLITE ELEMENTS ******
  136. 1400  PRINT : PRINT "New SATELLITE. Enter following DATA:": PRINT : GOTO 1420
  137. 1410  COLOR 12: LOCATE 2, 26: PRINT "ENTER NEW DATA or "; CHR$(17) + CHR$(196) + CHR$(217); " for unchanged DATA    ": COLOR 14
  138. 1420  INPUT ; "SATELLITE DESIGNATION  = ", U$: IF U$ <> "" THEN Q$ = U$: PRINT :   ELSE Q$ = I$: PRINT Q$
  139. 1430  Q$ = UCASE$(Q$)
  140. 1440  INPUT ; "EPOCH YEAR (YY)        = ", U$: IF U$ <> "" THEN Y3 = VAL(U$): PRINT :   ELSE PRINT Y3
  141. 1450  INPUT ; "EPOCH DAY (DD.DDDD-)   = ", U$: IF U$ <> "" THEN T0 = VAL(U$): PRINT :   ELSE PRINT USING "###.########"; T0
  142. 1460  INPUT ; "INCLINATION (DEG.)     = ", U$: IF U$ <> "" THEN I0 = VAL(U$): PRINT :   ELSE PRINT USING "###.####"; I0
  143. 1470  INPUT ; "R.A.A.N. (DEG.)        = ", U$: IF U$ <> "" THEN O0 = VAL(U$): PRINT :   ELSE PRINT USING "###.####"; O0
  144. 1480  INPUT ; "ECCENTRICITY           = ", U$: IF U$ <> "" THEN E0 = VAL(U$): PRINT :   ELSE PRINT USING ".#######"; E0
  145. 1490  INPUT ; "ARG. OF PERIGEE (DEG.) = ", U$: IF U$ <> "" THEN W0 = VAL(U$): PRINT :   ELSE PRINT USING "###.####"; W0
  146. 1500  INPUT ; "MEAN ANOMALY (DEG.)    = ", U$: IF U$ <> "" THEN M0 = VAL(U$): PRINT :   ELSE PRINT USING "###.####"; M0
  147. 1510  INPUT ; "MEAN MOTION (ORB/DAY)  = ", U$: IF U$ <> "" THEN N0 = VAL(U$): PRINT :   ELSE PRINT USING "###.########"; N0
  148. 1520  INPUT ; "EPOCH ORBIT NO.        = ", U$: IF U$ <> "" THEN K0 = VAL(U$): PRINT :   ELSE PRINT USING "######"; K0
  149. 1530  INPUT ; "BEACON FREQUENCY (Mhz) = ", U$: IF U$ <> "" THEN F1 = VAL(U$): PRINT :   ELSE PRINT USING "###.###"; F1
  150. 1540  PRINT : PRINT "ALL CORRECT ? (Y/N) "
  151. 1550  Z$ = "YyNn"
  152. 1560  K$ = INKEY$: IF K$ = "" THEN 1560
  153. 1570  K = INSTR(Z$, K$)
  154. 1580  ON K GOTO 1610, 1610, 1600, 1600
  155. 1590  GOSUB 9510: GOTO 1560
  156. 1600  CLS : GOTO 1410
  157. 1610  LSET I$ = Q$: RSET Y3$ = MKI$(Y3): RSET T0$ = MKD$(T0): RSET I0$ = MKS$(I0)
  158. 1620  RSET O0$ = MKS$(O0): RSET E0$ = MKS$(E0): RSET W0$ = MKS$(W0): RSET M0$ = MKS$(M0)
  159. 1630  RSET N0$ = MKD$(N0): RSET K0$ = MKS$(K0): RSET F1$ = MKS$(F1)
  160. 1640  PUT #1, J%: CLS : RETURN
  161. 1650  '
  162. 1660  ' ****** ADJUST RECORDS TO FILL DELETED RECORD SPACE ******
  163. 1670  FOR K% = J% TO 19
  164. 1680  GET #1, K% + 1: PUT #1, K%: NEXT
  165. 1690  GOSUB 1360: J% = 20: GOSUB 1610
  166. 1700  RETURN
  167. 1710  '
  168. 1720  ' ****** ADJUST RECORDS TO INSERT NEW RECORD ******
  169. 1730  LOCATE 19, 25: PRINT "Do you wish to insert the record";
  170. 1740  LOCATE 20, 25: PRINT "in a specific position (Y/N) "; : COLOR 30: PRINT STRING$(2, 176)
  171. 1750  Z$ = "YyNn"
  172. 1760  K$ = INKEY$: IF K$ = "" THEN 1760
  173. 1770  COLOR 14, 1, 0: LOCATE 20, 55: PRINT SPACE$(3)
  174. 1780  K = INSTR(Z$, K$)
  175. 1790  ON K GOTO 1810, 1810, 1870, 1870
  176. 1800  GOSUB 9510: GOTO 1740
  177. 1810  LOCATE 21, 25: PRINT "Which position ( 1 TO "; J% - 1; ")";
  178. 1820  INPUT R%: IF R% = 0 THEN GOSUB 9510: LOCATE 21, 25: PRINT SPACE$(40): GOTO 1740
  179. 1830  IF R% > J% - 1 THEN GOSUB 9510: LOCATE 21, 60: PRINT SPACE$(4): GOTO 1810
  180. 1840  J% = R%
  181. 1850  FOR K% = 19 TO R% STEP -1
  182. 1860  GET #1, K%: PUT #1, K% + 1: NEXT
  183. 1870  RETURN
  184. 1880  '
  185. 1890  ' ****** END OF JOB ROUTINE ******
  186. 1900  CLOSE #1: GOTO 70
  187. 1910  ' ****** LIST SATELLITE RECORD ******
  188. 1920  FOR J% = 1 TO 20: GET #1, J%
  189. 1930  IF ASC(I$) < 33 THEN 2040 ELSE IF ASC(I$) > 90 THEN 2040
  190. 1940  IF LEFT$(I$, 1) = "" THEN 2040
  191. 1950  GOSUB 1190
  192. 1960  PRINT : PRINT "ALL CORRECT ? (Y/N) "
  193. 1970  Z$ = "YyNn"
  194. 1980  K$ = INKEY$: IF K$ = "" THEN 1980
  195. 1990  K = INSTR(Z$, K$)
  196. 2000  ON K GOTO 2030, 2030, 2020, 2020
  197. 2010  GOSUB 9510: GOTO 1980
  198. 2020  CLS : GOSUB 1410
  199. 2030  NEXT
  200. 2040  RETURN
  201. 2050  'END PART CHANGE/ADD/DELETE ELEMENTS
  202. 2060  ' ****************************************************************
  203. 2500  ' *****Bodenstations Daten eingeben/ändern v.1.6- OE1HSI  APR. 90*****
  204. 2510  SCREEN 0, 1: WIDTH 80: COLOR 14, 1, 0: CLS
  205. 2520  GOSUB 6120
  206. 2530  COLOR 14, 1, 0
  207. 2540  LOCATE 3, 29: PRINT "  GROUNDSTATION DATA  ": PRINT : GOSUB 2870
  208. 2550  LOCATE 12, 30: PRINT "  CHANGE ? (Y/N)"
  209. 2560  Z$ = "YyNn"
  210. 2570  K$ = INKEY$: IF K$ = "" THEN 2570
  211. 2580  K = INSTR(Z$, K$)
  212. 2590  ON K GOTO 2680, 2680, 2980, 2980
  213. 2600  GOSUB 9510: COLOR 28: GOTO 2550
  214. 2610  LOCATE 12, 18: PRINT STRING$(255, 32): FOR I = 16 TO 21: LOCATE I, 17: PRINT STRING$(55, 32): NEXT: GOSUB 2870
  215. 2620  LOCATE 13, 22: PRINT "Do YOU want to CHANGE AGAIN ? (Y/N) "
  216. 2630  Z$ = "YyNn"
  217. 2640  K$ = INKEY$: IF K$ = "" THEN 2640
  218. 2650  K = INSTR(Z$, K$)
  219. 2660  ON K GOTO 2680, 2680, 2970, 2970
  220. 2670  GOSUB 9510: COLOR 28: GOTO 2620
  221. 2680  COLOR 12: LOCATE 12, 17: PRINT "ENTER NEW DATA or "; CHR$(17) + CHR$(196) + CHR$(217); " for unchanged DATA    ": COLOR 14
  222. 2690  OPEN "SATBODN.DAT" FOR RANDOM AS #1 LEN = 42
  223. 2700  FIELD #1, 10 AS GR$, 20 AS GL$, 4 AS GH$, 4 AS LO$, 4 AS LA$
  224. 2710  LOCATE 16, 17: INPUT "CALLSIGN (max. 10 Characters)   : ", U$: IF U$ <> "" THEN GS$ = U$ ELSE GS$ = GR1$
  225. 2720  LOCATE 17, 17: INPUT "LOCATION (max. 20 Characters)   : ", U$: IF U$ <> "" THEN GC$ = U$ ELSE GC$ = GL1$
  226. 2730  LOCATE 18, 17: INPUT "HEIGHT above sealevel in mtrs.  : ", U$: IF U$ <> "" THEN SH = VAL(U$) ELSE SH = CVS(GH1$)
  227. 2740  LOCATE 13, 19: COLOR 10, 4: PRINT "western +360.00 max.  east -180.00 max. ": COLOR 14, 1
  228. 2750  LOCATE 19, 17: INPUT "LONGITUDE west with decimals     : ", U$: IF U$ <> "" THEN LO = VAL(U$) ELSE LO = CVS(LO1$)
  229. 2760  IF LO < 0 THEN LO = 360 + LO
  230. 2770  LOCATE 13, 19: COLOR 10, 4: PRINT " NORTH of EQUATOR +XX.XX   SOUTH -XX.XX ": COLOR 14, 1
  231. 2780  LOCATE 20, 17: INPUT "LATITUDE +/- (max.) 90 degrs    : ", U$: IF U$ <> "" THEN LA = VAL(U$) ELSE LA = CVS(LA1$)
  232. 2790  LSET GR$ = GS$
  233. 2800  LSET GL$ = GC$
  234. 2810  RSET GH$ = MKS$(SH)
  235. 2820  RSET LO$ = MKS$(LO)
  236. 2830  RSET LA$ = MKS$(LA)
  237. 2840  PUT #1, 1
  238. 2850  CLOSE
  239. 2860  GOTO 2610
  240. 2870  OPEN "SATBODN.DAT" FOR RANDOM AS #1 LEN = 42
  241. 2880  FIELD #1, 10 AS GR$, 20 AS GL$, 4 AS GH$, 4 AS LO$, 4 AS LA$
  242. 2890  GET #1, 1
  243. 2900  LOCATE 5, 22: PRINT "CALLSIGN                   : "; GR$
  244. 2910  LOCATE 6, 22: PRINT "LOCATION                   : "; GL$
  245. 2920  LOCATE 7, 22: PRINT USING "HEIGHT above sealevel      :  #####"; CVS(GH$)
  246. 2930  LOCATE 8, 22: PRINT USING "WESTERN LONGITUDE (dgrs)   : ###.##"; CVS(LO$)
  247. 2940  LOCATE 9, 22: PRINT USING "LATITUDE (dgrs)            : +##.##"; CVS(LA$): PRINT
  248. 2950  GR1$ = GR$: GL1$ = GL$: GH1$ = GH$: LO1$ = LO$: LA1$ = LA$
  249. 2960  CLOSE : RETURN
  250. 2970  COLOR 10, 4: LOCATE 15, 22: PRINT " DATA is saved in file SATBODN.DAT ": SLEEP 2: GOTO 2990
  251. 2980  COLOR 10, 4: LOCATE 15, 30: PRINT "   DATA UNCHANGED  ": SLEEP 2
  252. 2990  SLEEP 4: COLOR 14: GOTO 180'MAIN MENU
  253. 3000  '**** ENDE PROGRAMM BODENSTATION DATEN ÄNDERN/SPEICHERN OE1HSI APR. 1990 **
  254. 3010  '**************************************************************************
  255. 3500  ' ****** ORBITS2 - *************
  256. 3510  CLS : KEY OFF: SCREEN 2, 0: WIDTH 80: NDUR = 25: TTT$ = " ON": NOTON = 1
  257. 3520  OUT 985, 10     ' Set foreground color for high resolution screen
  258. 3530  LOCATE 2
  259. 3540  LOCATE 2, 21: PRINT "This program was originally written by"
  260. 3550  LOCATE 4, 27: PRINT "R. D. Welch, W0SL"
  261. 3560  LOCATE 7, 12: PRINT "The present version 7.4E was written by OE1HSI - April 90"
  262. 3570  LOCATE 9, 27: PRINT "Ing. Herbert F. Strasser "
  263. 3580  LOCATE 10, 27: PRINT "SLATINGASSE 6/B/5"
  264. 3590  LOCATE 11, 27: PRINT "A 1130 VIENNA/AUSTRIA"
  265. 3600  GOSUB 6130
  266. 3610  '
  267. 3620  ' ****** HOUSE KEEPING ITEMS ******
  268. 3630  DEF FNMTH = VAL(LEFT$(D$, 2)): DEF FNDAY = VAL(MID$(D$, 4, 2))
  269. 3640  DEF FNYR = VAL(RIGHT$(D$, 2)): DEF FNHR = VAL(LEFT$(T$, 2))
  270. 3650  DEF FNMIN = VAL(MID$(T$, 4, 2)): DEF FNSEC = VAL(RIGHT$(T$, 2))
  271. 3660  ' ****** SETUP UTC DATE AND TIME ******
  272. 3670  GOSUB 3750
  273. 3680  LOCATE 15, 30, 0: PRINT "UTC DATE  = "; EDAT$
  274. 3690  LOCATE 16, 30: PRINT "UTC TIME  = "; TIME$
  275. 3700  LOCATE 20, 3: PRINT "ENTER NEW UTC-DATE       (DD-MM-YY)?..  or  "; CHR$(17) + CHR$(196) + CHR$(217)
  276. 3710  LOCATE 20, 54: INPUT " ", ED$
  277. 3720  IF ED$ = "" THEN D$ = DATE$: GOTO 3740
  278. 3730  D$ = MID$(ED$, 4, 3) + LEFT$(ED$, 3) + RIGHT$(ED$, 2)
  279. 3740  DATE$ = D$: D$ = DATE$: GOSUB 3750: GOTO 3760'Quick format check
  280. 3750  MM$ = LEFT$(DATE$, 2): DD$ = MID$(DATE$, 4, 2): JJ$ = RIGHT$(DATE$, 4): EDAT$ = DD$ + "." + MM$ + "." + JJ$: RETURN
  281. 3760  LOCATE 20, 50: PRINT SPACE$(13)
  282. 3770  LOCATE 20, 3: PRINT "ENTER NEW UTC-TIME  (HH:MM:SS)?..  or       "; CHR$(17) + CHR$(196) + CHR$(217)
  283. 3780  LOCATE 20, 54: INPUT " ", T$
  284. 3790  IF T$ = "" THEN T$ = TIME$
  285. 3800  TIME$ = T$: T$ = TIME$       ' Quick format check
  286. 3810  CLS
  287. 3820  '
  288. 3830  ' ****** DRAW AND STORE SATELLITE INDICATOR ******
  289. 3840  CLS
  290. 3850  LINE (4, 0)-(4, 4): LINE (0, 2)-(8, 2)
  291. 3860  GET (0, 0)-(8, 4), SAT: PUT (0, 0), SAT
  292. 3870  CLS
  293. 3880  LINE (4, 1)-(4, 3): LINE (3, 2)-(5, 2)
  294. 3890  GET (0, 0)-(8, 4), PKT: PUT (0, 0), PKT
  295. 3900  '
  296. 3910  ' ****** NUMERIC CONSTANTS ******
  297. 3920  GOSUB 6270
  298. 3930  '
  299. 3940  ' ****** GROUND STATION CONSTANTS ******
  300. 3950  GOSUB 6340
  301. 3960  '
  302. 3970  ' ****** DERIVED CONSTANTS ******
  303. 3980  GOSUB 6480
  304. 3990  '
  305. 4000  ' ****** ESTABLISH SIDEREAL TIME TABLE MATRIX ******
  306. 4010  RESTORE 7100: FLG1 = 0: FLG2 = 0: D$ = DATE$: CLS
  307. 4020  FOR I1 = 1 TO 14
  308. 4030  READ Y1(I1), G3(I1)          ' Read sidereal time table
  309. 4040  IF Y1(I1) = FNYR THEN FLG1 = 1
  310. 4050  IF Y1(I1) = FNYR - 1 THEN FLG2 = 1
  311. 4060  IF Y1(I1) = 0 THEN 4080
  312. 4070  NEXT
  313. 4080  IF FLG1 = 1 AND FLG2 = 1 THEN 4110
  314. 4090  PRINT "Requested and/or preceeding YEAR NOT in the SIDERAL TIMETABLES.  ": SLEEP 3: GOTO 180
  315. 4100  ' ****** ESTABLISH SATELLITE ELEMENT MATRIX ******
  316. 4110  Y = FNYR: GOSUB 7250: IF RSFLAG = 1 THEN GOTO 180 ELSE GOTO 4140
  317. 4120  '
  318. 4130  ' ****** SET UP KEY TRAPPING ******
  319. 4140  ON KEY(9) GOSUB 5810: KEY(9) STOP
  320. 4150  ON KEY(8) GOSUB 5600: KEY(8) STOP
  321. 4160  ON KEY(7) GOSUB 5580: KEY(7) STOP
  322. 4170  ON KEY(10) GOSUB 5840: KEY(10) OFF
  323. 4180  FLG9 = 0: FLG10 = 0: GOSUB 5310
  324. 4190  '
  325. 4200  ' ****** ORBIT DETERMINATION LOOP STARTS HERE ******
  326. 4210  FOR J = 1 TO I - 1
  327. 4220  Q$ = INKEY$: IF Q$ = CHR$(27) THEN CLOSE : GOTO 180
  328. 4230  IF FLG10 <> 2 THEN 4250
  329. 4240  IF I$(J) <> I1$ THEN 4310
  330. 4250  GOSUB 4360
  331. 4260  IF FLG9 = 0 THEN 4310
  332. 4270  DISPFL = 0
  333. 4280  GOSUB 5130:
  334. 4290  GOSUB 4810:  GOSUB 4870'      satdis
  335. 4300  DISPFL = 1
  336. 4310  GOSUB 5050
  337. 4320  NEXT
  338. 4330  GOTO 4210
  339. 4340  '
  340. 4350  ' ****** ORBIT CALCULATION SUBROUTINE ******
  341. 4360  A0(J) = ((G0 / (N0(J) * N0(J))) ^ (1 / 3))
  342. 4370  E2 = 1 - E0(J) * E0(J): E1 = SQR(E2): Q0 = M0(J) / 360 + K0(J)
  343. 4380  K2 = 9.95 * ((R0 / A0(J)) ^ 3.5) / (E2 * E2)
  344. 4390  S1 = SIN(I0(J) * P0): C1 = COS(I0(J) * P0): D$ = DATE$
  345. 4400  T = INT(30.55 * (FNMTH + 2)) - 2 * ((FNMTH + 7) \ 10) - 91
  346. 4410  IF FNMTH > 2 THEN IF FNYR / 4 = INT(FNYR / 4) THEN T = T + 1
  347. 4420  IF Y3(J) = FNYR - 1 THEN T = T + 365 ELSE 4440
  348. 4430  IF Y3(J) / 4 = INT(Y3(J) / 4) THEN T = T + 1
  349. 4440  T$ = TIME$: T = T + FNDAY + FNHR / 24 + FNMIN / 1440 + FNSEC / 86400!
  350. 4450  O = O0(J) - (T - T0(J)) * K2 * C1: S0 = SIN(O * P0): C0 = COS(O * P0)
  351. 4460  W = W0(J) + (T - T0(J)) * K2 * (2.5 * (C1 * C1) - .5)
  352. 4470  S2 = SIN(W * P0): C2 = COS(W * P0)
  353. 4480  C(1, 1) = (C2 * C0) - (S2 * S0 * C1): C(1, 2) = -(S2 * C0) - (C2 * S0 * C1)
  354. 4490  C(2, 1) = (C2 * S0) + (S2 * C0 * C1): C(2, 2) = -(S2 * S0) + (C2 * C0 * C1)
  355. 4500  C(3, 1) = (S2 * S1): C(3, 2) = (C2 * S1)
  356. 4510  Q = N0(J) * (T - T0(J)) + Q0: K = INT(Q): M9 = INT((Q - K) * 256): M = (Q - K) * P2
  357. 4520  E = M + E0(J) * SIN(M) + .5 * (E0(J) * E0(J)) * SIN(2 * M)
  358. 4530  S3 = SIN(E): C3 = COS(E): R3 = 1 - E0(J) * C3: M1 = E - E0(J) * S3
  359. 4540  M5 = M1 - M: IF ABS(M5) < .000001 THEN 4560 ELSE E = E - M5 / R3
  360. 4550  GOTO 4530
  361. 4560  X0 = A0(J) * (C3 - E0(J)): Y0 = A0(J) * E1 * S3: R = A0(J) * R3
  362. 4570  X1 = X0 * C(1, 1) + Y0 * C(1, 2): Y1 = X0 * C(2, 1) + Y0 * C(2, 2): Z1 = X0 * C(3, 1) + Y0 * C(3, 2)
  363. 4580  FOR I2 = 1 TO I1: IF Y3(J) = Y1(I2) THEN G2 = G3(I2)
  364. 4590  NEXT
  365. 4600  G7 = T * G1 + G2: G7 = (G7 - INT(G7)) * P2: S7 = -SIN(G7): C7 = COS(G7)
  366. 4610  X = (X1 * C7) - (Y1 * S7): Y = (X1 * S7) + (Y1 * C7): Z = Z1
  367. 4620  X5 = (X - X9): Y5 = (Y - Y9): Z5 = (Z - Z9): R5 = SQR(X5 * X5 + Y5 * Y5 + Z5 * Z5)
  368. 4630  Z8 = (X5 * C8 * C9) + (Y5 * S8 * C9) + (Z5 * S9)
  369. 4640  X8 = -(X5 * C8 * S9) - (Y5 * S8 * S9) + (Z5 * C9): Y8 = (Y5 * C8) - (X5 * S8)
  370. 4650  S5 = Z8 / R5: C5 = SQR(1 - S5 * S5): E9 = ATN(S5 / C5) / P0
  371. 4660  IF X8 < 0 THEN A9 = P1 + ATN(Y8 / X8) ELSE 4680
  372. 4670  GOTO 4710
  373. 4680  IF X8 > 0 AND Y8 >= 0 THEN A9 = ATN(Y8 / X8) ELSE IF X8 > 0 THEN A9 = P2 + ATN(Y8 / X8) ELSE 4700
  374. 4690  GOTO 4710
  375. 4700  IF Y8 < 0 THEN A9 = 3 * P1 / 2 ELSE A9 = P1 / 2
  376. 4710  A9 = A9 / P0
  377. 4720  IF X < 0 THEN W5 = P1 + ATN(Y / X) ELSE 4740
  378. 4730  GOTO 4770
  379. 4740  IF X > 0 AND Y >= 0 THEN W5 = ATN(Y / X) ELSE IF X > 0 THEN W5 = P2 + ATN(Y / X) ELSE 4760
  380. 4750  GOTO 4770
  381. 4760  IF Y < 0 THEN W5 = 3 * P1 / 2 ELSE W5 = P1 / 2
  382. 4770  W5 = 360 - W5 / P0: B5 = Z / R: L5 = ATN(B5 / (SQR(1 - B5 ^ 2))) / P0
  383. 4780  RETURN
  384. 4790  '
  385. 4800  ' ****** LAT./LONG. PLOT ROUTINE ******
  386. 4810  Y6 = CINT(.7111 * (90 - L5) + 3)
  387. 4820  IF W5 <= 270 AND W5 >= 0 THEN X6 = CINT(477 - W5 * 1.7444)
  388. 4830  IF W5 > 270 AND W5 <= 360 THEN X6 = CINT(1105 - W5 * 1.7444)
  389. 4840  RETURN
  390. 4850  '
  391. 4860  ' ****** PUT SATELLITE ON SCREEN ROUTINE ******
  392. 4870  GET (X6 - 4, Y6 - 2)-(X6 + 4, Y6 + 2), KEP
  393. 4880  FOR ID = 1 TO (NDUR * 10): NEXT ID 'ZEILENDELAY
  394. 4890  PUT (X6 - 4, Y6 - 2), SAT, PRESET
  395. 4900  FOR ID = 1 TO (NDUR * 12): NEXT ID 'AUFBLINKDELAY
  396. 4910  PUT (X6 - 4, Y6 - 2), SAT
  397. 4920  PUT (X6 - 4, Y6 - 2), KEP, PSET
  398. 4930  PUT (X6 - 4, Y6 - 2), SAT
  399. 4940  IF FLG0 = 0 THEN 4970
  400. 4950  PUT (SATL(J, 1), SATL(J, 2)), SAT
  401. 4960  PUT (SATL(J, 1), SATL(J, 2)), PKT, OR
  402. 4970  SATL(J, 1) = X6 - 4: SATL(J, 2) = Y6 - 2
  403. 4980  IF J = I - 1 THEN FLG0 = 1
  404. 4990  LOCATE 1, 1: PRINT "[E"; : FOR ID = 1 TO (NDUR * 10): NEXT ID 'NACHBLINKDELAY
  405. 5000  IF NOTON = 1 THEN GOTO 5020
  406. 5010  PLAY "MB N38 L42"
  407. 5020  RETURN
  408. 5030  '
  409. 5040  ' ****** PRINT SATELLITE DETAILS SUBROUTINE ******
  410. 5050  KEY(9) ON: KEY(10) ON: KEY(8) ON: KEY(7) ON
  411. 5060  KEY(10) STOP: KEY(9) STOP: KEY(8) STOP: KEY(7) STOP
  412. 5070  IF FLGK = 1 THEN GOSUB 5290
  413. 5080  IF FLG9 = 0 GOTO 5180
  414. 5090  IF FLG10 = 1 THEN GOSUB 5650
  415. 5100  IF FLG10 = 0 THEN 5130 ELSE V$ = SPACE$(10): LSET V$ = I$(J)
  416. 5110  IF V$ <> U$ THEN 5260
  417. 5120  LOCATE 25, 73: PRINT "SELECTED";
  418. 5130  IF DISPFL = 1 THEN GOTO 5260
  419. 5140  LOCATE 25, 1: PRINT SPACE$(68);
  420. 5150  LOCATE 25, (12 - LEN(I$(J))) / 2 + 1: PRINT I$(J);
  421. 5160  LOCATE 25, 15
  422. 5170  GOTO 5240
  423. 5180  COLOR 3: LOCATE 3, 44: PRINT EDAT$: LOCATE 4, 37: PRINT T$
  424. 5190  IF E9 >= 0 THEN COLOR 12 ELSE 5210
  425. 5200  IF E9 > 0 AND E9 < 1 THEN COLOR 28: BEEP
  426. 5210  LOCATE 1 * J + 8, 15: PRINT SPACE$(50)
  427. 5220  LOCATE 1 * J + 8, (12 - LEN(I$(J))) / 2 + 1: PRINT I$(J)
  428. 5230  LOCATE 1 * J + 8, 15
  429. 5240  PRINT USING "###   ###  #####    #####  ###.#   ###.#    ######    ###"; A9; E9; R5; (R - R0); L5; W5; K; M9;
  430. 5250  IF FLG9 = 0 GOTO 5260 ELSE LOCATE 20, 65: PRINT TIME$;
  431. 5260  RETURN
  432. 5270  '
  433. 5280  ' ****** SET UP SCREEN DISPLAY ROUTINE ******
  434. 5290  CLS : FLG0 = 0: FLGK = 0: FLG10 = 0
  435. 5300  IF FLG9 = 1 THEN 5390
  436. 5310  SCREEN 0, 1: COLOR 2, 0, 0
  437. 5320  LOCATE 1, 40 - LEN(C$) / 2, 0: PRINT C$
  438. 5330  LOCATE 2, 24: PRINT "   REALTIME SATELLITE TRACKING    "
  439. 5340  LOCATE 3, 29: PRINT "COORDINATES ON"
  440. 5350  LOCATE 4, 34: PRINT "AT": LOCATE 4, 46: PRINT "UTC"
  441. 5360  LOCATE 25, 4: PRINT "ESC = END                                      F9 = GRAPH <-> TABLE ";
  442. 5370  L1 = 6: L2 = 7: L3 = 8
  443. 5380  GOTO 5510
  444. 5390  GOSUB 5780: SCREEN 2, 0: OUT 985, 10: IF FLAGM <> 0 THEN GOTO 5430
  445. 5400  DEF SEG = &HB800: BLOAD "SATMAP.DAT", 0: DEF SEG = 0
  446. 5410  W5 = W9: L5 = L9: GOSUB 4810
  447. 5420  CIRCLE (X6, Y6), 2: FLAGM = 1: GOTO 5440
  448. 5430  PUT (0, 0), WLT, PSET: FLG0 = 1
  449. 5440  GOSUB 5750: L1 = 22: L2 = 23: L3 = 24
  450. 5450  LOCATE 20, 2: PRINT "Calculated for                                on "; EDAT$; " at          h-UTC";
  451. 5460  LOCATE 20, 16 + (30 - LEN(C$)) / 2: PRINT C$
  452. 5470  LOCATE 1, 1: PRINT "[ESC]=END"
  453. 5480  LOCATE 1, 15: PRINT "[F7]=SPEED ": LOCATE 1, 32: PRINT "[F8]=BEEP"
  454. 5490  LOCATE 1, 50: PRINT "[F9]=LISTING": LOCATE 1, 66: PRINT "[F10]=SINGLESAT";
  455. 5500  GOSUB 5610: GOSUB 5590
  456. 5510  LOCATE L1, 3
  457. 5520  PRINT "NAME or     AZ    EL    range  height  latid.  longit.   orbit   PHASE"
  458. 5530  LOCATE L2, 3
  459. 5540  PRINT "DESIGNATOR  deg   deg    km      km     deg     deg       No.    <256>"
  460. 5550  LOCATE L3, 3
  461. 5560  PRINT "----------  ---   ---  -----   ------  -----   -----    ------    ---";
  462. 5570  RETURN
  463. 5580  NDUR = NDUR - 8: IF NDUR < 1 THEN NDUR = 73
  464. 5590  LOCATE 1, 26: PRINT USING "#"; (NDUR \ 8); : RETURN
  465. 5600  IF NOTON = 0 THEN NOTON = 1: TTT$ = " ON":  ELSE NOTON = 0: TTT$ = "OFF"
  466. 5610  LOCATE 1, 41: PRINT TTT$: RETURN    'NOTON TOGGELN
  467. 5620  ' ****** SELECT SINGLE SATELLITE ROUTINE ******
  468. 5630  LOCATE 25, 1: PRINT SPACE$(79); : FSOK = 0
  469. 5640  LOCATE 25, 1: INPUT ; "Not found, try again or  <CR> for ALL "; I1$: GOTO 5670
  470. 5650  LOCATE 25, 1: PRINT SPACE$(79); : FSOK = 0
  471. 5660  LOCATE 25, 1: INPUT ; "SELECT stellite or hit <CR> for ALL "; I1$
  472. 5670  IF I1$ = "" THEN FLG10 = 0: GOTO 5730
  473. 5680  FOR JA = 1 TO ITOT
  474. 5690  IF I1$ = I$(JA) THEN FSOK = 1:
  475. 5700  NEXT JA
  476. 5710  IF FSOK = 1 THEN GOTO 5720:  ELSE GOSUB 9510: GOTO 5630
  477. 5720  U$ = SPACE$(10): LSET U$ = I1$: FLG10 = 2
  478. 5730  LOCATE 25, 1: PRINT SPACE$(78);
  479. 5740  RETURN
  480. 5750  WIDTH 80
  481. 5760  LOCATE , , 1, 12, 13
  482. 5770  RETURN
  483. 5780  ' SWITCH TO COLOR
  484. 5790  OUT 980, 2: OUT 981, 85
  485. 5800  RETURN
  486. 5810  IF FLG9 = 0 THEN FLG9 = 1: SOUND 1800, 1: GOTO 5830'FLAG9 TOGGELN
  487. 5820  FLG9 = 0: GET (0, 0)-(639, 144), WLT
  488. 5830  FLGK = 1: RETURN
  489. 5840  IF FLG9 = 1 THEN FLG10 = 1 ELSE FLG10 = 0: GOTO 5060
  490. 5850  SOUND 1800, 1: RETURN
  491. 5860  GOTO 180 'ENDE PROGRAMMTEIL ECHTZEITDISPLAY
  492. 6000  '****** ORBIT2 *************
  493. 6010  KEY OFF: SCREEN 0, 1: WIDTH 80: COLOR 14, 1, 0: CLS
  494. 6020  PRINT " This program originates from publications of the AMSAT JOURNAL"
  495. 6030  PRINT " AMSAT ORBITAL PREDICTION PROGRAM de W3IWI - May,1980"
  496. 6040  PRINT "                by Dr. Thomas A. Clark, W3IWI"
  497. 6050  PRINT
  498. 6060  PRINT " it was first adopted to the IBM-PC by Mr. R. D. Welch, W0SL - Mai, 1983"
  499. 6070  PRINT
  500. 6080  PRINT " The present version 7.4E was written and compiled with QUICKBASIC 4.5"
  501. 6090  PRINT "              by Ing. H.F.STRASSER OE1HSI in April 1990"
  502. 6100  PRINT "                 A 1130 VIENNA/AUSTRIA": PRINT :
  503. 6110  GOSUB 6120: GOTO 6190
  504. 6120  COLOR 1, 2
  505. 6130  LOCATE 23, 5: PRINT "        NON COMMERCIAL USE GRANTED, PROVIDED THAT CREDIT IS GIVEN      ";
  506. 6140  LOCATE 24, 5: PRINT "              TO THE AUTHORS, AMSAT AND THE ORBIT MAGAZINE             ";
  507. 6150  LOCATE 25, 5: PRINT " PROGRAM by OE1HSI, CALCULATION W3IWI, GRAPHS W0SL COPYRIGHT 1980-1990 ";
  508. 6160  RETURN
  509. 6170  '
  510. 6180  ' ****** HOUSEKEEPING ITEMS ******
  511. 6190  COLOR 14, 1, 0: LOCATE 13, 1'CLEAR
  512. 6200  OPEN "SCRN:" FOR OUTPUT AS #3
  513. 6210  C8$ = CHR$(10) + CHR$(10) + CHR$(10) + CHR$(10)
  514. 6220  C9$ = CHR$(12) + CHR$(7)
  515. 6230  DEF FNT$ (D) = CHR$(48 + INT(D / 10)) + CHR$(48 + D - 10 * INT(D / 10))
  516. 6240  YY = 0
  517. 6250  '****** NUMERIC CONSTANTS ******
  518. 6260  GOSUB 6270: GOSUB 6340: GOTO 6470
  519. 6270  P1 = 3.1415926535#            ' Value of PI
  520. 6280  R0 = 6378.16: F = 298.16      ' Earth's radius, 1/Earth flattening coef.
  521. 6290  G0 = 75369793000000#          ' GM of Earth in (orbits/day)^2/km^3
  522. 6300  G1 = 1.0027379093#: C = 299792.5' Sidereal/Solar time rate ratio
  523. 6310  RETURN
  524. 6320  '
  525. 6330  ' ****** GROUND STATION CONSTANTS ******
  526. 6340  OPEN "SATBODN.DAT" FOR RANDOM AS #1 LEN = 42
  527. 6350  FIELD #1, 10 AS TR$, 20 AS TL$, 4 AS GH$, 4 AS LO$, 4 AS LA$
  528. 6360  GET #1, 1
  529. 6370  L9 = CVS(LA$): W9 = CVS(LO$): H9 = CVS(GH$): GL$ = TL$: GR$ = TR$
  530. 6380  CLOSE #1
  531. 6390  'L9=BREITE IN GRD.
  532. 6400  'W9=LÄNGE westl. in Grd.
  533. 6410  'H9=SEEHÖHE IN Mtr.
  534. 6420  'C$=BODENSTAT. RUFZ. & ORT
  535. 6430  C$ = RTRIM$(GR$) + " " + RTRIM$(GL$)
  536. 6440  RETURN '***
  537. 6450  '
  538. 6460  ' ****** DERIVED CONSTANTS ******
  539. 6470  GOSUB 6480: GOTO 6570
  540. 6480  P2 = 2 * P1: P0 = P1 / 180: F = 1 / F: L8 = L9 * P0: S9 = SIN(L8): C9 = COS(L8)
  541. 6490  S8 = SIN(-W9 * P0): C8 = COS(W9 * P0)
  542. 6500  R9 = R0 * (1 - (F / 2) + (F / 2) * COS(2 * L8)) + H9 / 1000
  543. 6510  L8 = ATN((1 - F) ^ 2 * S9 / C9): Z9 = R9 * SIN(L8)
  544. 6520  X9 = R9 * COS(L8) * C8: Y9 = R9 * COS(L8) * S8
  545. 6530  RETURN
  546. 6540  CSRHLT = CSRLIN: LOCATE (CSRHLT - 1), 1
  547. 6550  GOSUB 9510: COLOR 12: PRINT " enter YEAR 1990 or later !": COLOR 14, 1, 0
  548. 6560  ' ****** INPUT DATA ******
  549. 6570  INPUT ; "Start  Year (19YY) = ", Y: IF Y < 1990 GOTO 6540 ELSE YY = Y: Y = Y / 100: Y = INT(100 * (Y - INT(Y)) + .1)
  550. 6580  INPUT ; "  Month  (1-12) = ", M
  551. 6590  IF M > 12 THEN
  552. 6600  CSRHLT = CSRLIN: POSHLT = POS(0): LOCATE (CSRHLT - 1), 1
  553. 6610  COLOR 12: PRINT " MONTHS INVALID, ENTER 1-12 !": COLOR 14, 1, 0: GOSUB 9510
  554. 6620  LOCATE CSRHLT, (POSHLT - 20)
  555. 6630  GOTO 6580
  556. 6640  END IF
  557. 6650  INPUT ; "   Day = ", D
  558. 6660  IF D > 31 THEN
  559. 6670  POSHLT = POS(0): CSRHLT = CSRLIN: LOCATE (CSRHLT - 1), 1
  560. 6680  COLOR 12: PRINT " DAY INVALID, ENTER 1-31 !     ": COLOR 14, 1, 0: GOSUB 9510
  561. 6690  LOCATE CSRHLT, (POSHLT - 11): GOTO 6630
  562. 6700  END IF
  563. 6710  CSRHLT = CSRLIN: POSHLT = POS(0)
  564. 6720  LOCATE (CSRHLT - 1), 1: PRINT STRING$(45, 32); : LOCATE CSRHLT, POSHLT
  565. 6730  T$ = FNT$(Y) + "/" + FNT$(M) + "/" + FNT$(D) + " at "
  566. 6740  TE$ = FNT$(D) + "." + FNT$(M) + "." + FNT$(Y) + " um "
  567. 6750  D8 = D + INT(30.55 * (M + 2)) - 2 * ((M + 7) \ 10) - 91
  568. 6760  IF M > 2 THEN IF Y / 4 = INT(Y / 4) THEN D8 = D8 + 1
  569. 6770  PRINT "   Day No.= "; D8: PRINT
  570. 6780  INPUT ; "Start  UTC Time (HH) = ", H
  571. 6790  INPUT "    Min. = ", M: T7 = D8 + H / 24 + M / 1440
  572. 6800  T$ = T$ + FNT$(H) + FNT$(M) + ":00 H"
  573. 6810  INPUT ; "Timespan in Hours    = ", H1
  574. 6820  INPUT "  + Min. = ", M1: T8 = T7 + H1 / 24 + M1 / 1440
  575. 6830  INPUT ; "Timestep    in Min.  = ", M2: T9 = M2 / 1440
  576. 6840  PRINT USING "   from ###.#######  to ###.#######"; T7; T8
  577. 6850  PRINT : INPUT "MINIMUM ELEVATION ? (Default  0) dgr. = ", E8
  578. 6860  GOTO 6880
  579. 6870  COLOR 28, 1, 0: GOSUB 9510: CSRHLT = CSRLIN: LOCATE (CSRHLT - 2), 1
  580. 6880  PRINT "OUTPUT to Printer (P), to the SCREEN (S) or to FILE (F) ?-->";
  581. 6890  P$ = INKEY$: IF P$ = "" THEN 6890
  582. 6900  IF (P$ = "p" OR P$ = "P" OR P$ = "S" OR P$ = "s" OR P$ = "F" OR P$ = "f") THEN 6910 ELSE 6870
  583. 6910  COLOR 14, 1, 0: IF P$ = "P" OR P$ = "p" THEN P% = 2: GOTO 6930
  584. 6920  IF P$ = "S" OR P$ = "s" THEN P% = 3 ELSE P% = 1
  585. 6930  IF P% = 3 OR P% = 1 THEN C9$ = C8$: GOTO 6990
  586. 6940  GOSUB 9200: IF DRKFLG = 0 GOTO 6980
  587. 6950  CLS : COLOR 12: LOCATE 12, 20: PRINT DRK$: LOCATE 14, 20: PRINT NEUEIN$;
  588. 6960  PRINT : GOTO 6880
  589. 6970  '**** ESTABLISH SIDERAL TIME TABLE MATRIX *******
  590. 6980  OPEN "LPT1:" FOR OUTPUT AS #2
  591. 6990  RESTORE 7100: FLG1 = 0: FLG2 = 0: CLS
  592. 7000  FOR I1 = 1 TO 13
  593. 7010   READ Y1(I1), GG3(I1)
  594. 7020  IF Y1(I1) = Y THEN FLG1 = 1
  595. 7030  IF Y1(I1) = Y - 1 THEN FLG2 = 1
  596. 7040  IF Y1(I1) = 0 THEN 7060
  597. 7050  NEXT
  598. 7060  IF FLG1 = 1 AND FLG2 = 1 THEN 7240
  599. 7070  PRINT "CURRENT AND/OR PRECEEDING YEAR NOT IN SIEDERAL TIMETABLES     ": SLEEP 3: GOTO 180
  600. 7080  '
  601. 7090  ' ****** SIDEREAL TIME TABLE ******
  602. 7100  DATA 89, 0.2767676850
  603. 7110  DATA 90, 0.2761045795
  604. 7120  DATA 91, 0.2754414740
  605. 7130  DATA 92, 0.2747783685
  606. 7140  DATA 93, 0.2768531723
  607. 7150  DATA 94, 0.2761900668
  608. 7160  DATA 95, 0.2755269613
  609. 7170  DATA 96, 0.2748638558
  610. 7180  DATA 97, 0.2769386596
  611. 7190  DATA 98, 0.2762755541
  612. 7200  DATA 99, 0.2756124486
  613. 7210  DATA 0,0
  614. 7220  '
  615. 7230  ' ****** ESTABLISH SATELLITE ELEMENT MATRIX ******
  616. 7240  GOSUB 7250: IF RSFLAG = 1 THEN GOTO 180 ELSE GOTO 7430
  617. 7250  OPEN "SATKEPN.DAT" FOR RANDOM AS #1 LEN = 56
  618. 7260  FIELD #1, 10 AS I$, 2 AS Y3$, 8 AS T0$, 4 AS I0$, 4 AS O0$, 4 AS E0$, 4 AS W0$, 4 AS M0$, 8 AS N0$, 4 AS K0$, 4 AS F1$
  619. 7270  I = 0: RSFLAG = 0
  620. 7280  I = I + 1: ITOT = I: IF I > 20 THEN RETURN
  621. 7290  GET #1, I
  622. 7300  FOR J = 1 TO 10
  623. 7310  IF MID$(I$, J, 1) = SPACE$(1) THEN 7340 ELSE IF J = 10 THEN J = 11
  624. 7320  NEXT
  625. 7330  CLOSE #1
  626. 7340  I$(I) = LEFT$(I$, J - 1): IF I$(I) = "END" THEN RETURN
  627. 7350  IF LEFT$(I$, 1) = SPACE$(1) THEN RETURN
  628. 7360  Y3(I) = CVI(Y3$): T0(I) = CVD(T0$): I0(I) = CVS(I0$): O0(I) = CVS(O0$)
  629. 7370  E0(I) = CVS(E0$): W0(I) = CVS(W0$): M0(I) = CVS(M0$): N0(I) = CVD(N0$)
  630. 7380  K0(I) = CVS(K0$): F1(I) = CVS(F1$)
  631. 7390  IF Y3(I) = Y THEN 7280 ELSE IF Y3(I) = Y - 1 THEN 7280 ELSE PRINT "ELEMENTS of SATELLITE "; I$(I);
  632. 7400  PRINT " NOT FROM CURRENT or PRECEEDING YEAR": SLEEP 3: RSFLAG = 1: RETURN
  633. 7410  '
  634. 7420  ' ****** SELECT SATELLITE FROM MENU ******
  635. 7430  CLS : PRINT " SELECT ONE OF THE FOLLOWING: ": PRINT
  636. 7440  FOR J = 1 TO I - 1
  637. 7450  PRINT "ENTER No.:"; J; " for "; I$(J)
  638. 7460  NEXT
  639. 7470  PRINT : INPUT "SATELLITE No.", J
  640. 7480  IF J < 1 OR J > I - 1 THEN 7430
  641. 7490  LOCATE 12, 33: PRINT "Doppler Frequency calculated for"; F1(J); "MHz";
  642. 7500  LOCATE 14, 33: INPUT "Enter changed Frequ. or <CR> for Default ", D
  643. 7510  IF D <> 0 THEN F1(J) = D
  644. 7520  IF P% <> 1 THEN 7660 ELSE CLOSE #1
  645. 7530  LOCATE 16, 33: PRINT "WHICH DRIVE SHOULD BE USED FOR DATA-OUTPUT ?";
  646. 7540  LOCATE 18, 36: INPUT "==> enter drive identifier (A.....J): "; DR$: LOCATE 16, 33: PRINT SPC(45);
  647. 7550  DRM$ = "ABCDEFGHIJabcdefghij"
  648. 7560  FOR I = 1 TO 20
  649. 7570  IF DR$ = MID$(DRM$, I, 1) THEN 7610 'drive ok?
  650. 7580  NEXT
  651. 7590  LOCATE 17, 36: COLOR 10, 4: PRINT "*** INVALID DRIVE identifier ***  "; : PLAY "AFCEG": SLEEP 1
  652. 7600  COLOR 14, 1: LOCATE 18, 74: PRINT SPACE$(5); : LOCATE 17, 36: PRINT SPACE$(35): : GOTO 7530
  653. 7610  LOCATE 19, 33: PRINT SPACE$(46): LOCATE 20, 33: PRINT SPACE$(46);
  654. 7620  ON ERROR GOTO 7640: OUTP$ = DR$ + ":SATDATA.TXT": OPEN OUTP$ FOR OUTPUT AS #1: LOCATE 20, 12: ON ERROR GOTO 10000
  655. 7630  LOCATE 20, 33: COLOR 10, 4: PRINT "SAVING DATA ON DRIVE "; DR$; ": AS FILE: SATDATA.TXT": COLOR 14, 1: ON ERROR GOTO 10000: GOTO 7660
  656. 7640  LOCATE 18, 33: COLOR 10, 4: PRINT " *** CAN'T OPEN FILE - CHECK DRIVE "; DR$; ":   ***  ": PLAY "CGCGCG"
  657. 7650  LOCATE 18, 33: COLOR 14, 1: PRINT SPACE$(46): RESUME 7530
  658. 7660  IF P% = 3 THEN CLS
  659. 7670  PRINT #P%, : PRINT #P%, "ORBIT DATA for   "; I$(J)
  660. 7680  PRINT #P%,
  661. 7690  PRINT #P%, "Referenz Epoche = "; Y3(J); " +"; T0(J)
  662. 7700  PRINT #P%, "START PERIOD"; Y; " +"; T7; " = "; T$
  663. 7710  PRINT #P%,
  664. 7720  PRINT #P%, "Parameter"; TAB(20); "Reference"; TAB(40); "Start"
  665. 7730  T = T7
  666. 7740  IF Y3(J) = Y - 1 THEN T = T + 365: T8 = T8 + 365 ELSE 7760
  667. 7750  IF Y3(J) / 4 = INT(Y3(J) / 4) THEN T = T + 1: T8 = T8 + 1
  668. 7760  FOR I2 = 1 TO I1: IF Y3(J) = Y1(I2) THEN G2 = GG3(I2)
  669. 7770  NEXT
  670. 7780  GOSUB 8350
  671. 7790  PRINT #P%, "Orbit Number "; TAB(20); K0(J); TAB(40); K
  672. 7800  PRINT #P%, "Mean Anomaly "; TAB(20); M0(J); TAB(40); M / P0
  673. 7810  PRINT #P%, "Inclination  "; TAB(20); I0(J)
  674. 7820  PRINT #P%, "Eccentricity "; TAB(20); E0(J)
  675. 7830  PRINT #P%, "Mean Motion  "; TAB(20); N0(J)
  676. 7840  PRINT #P%, "S.M.A.,km    "; TAB(20); A0(J)
  677. 7850  PRINT #P%, "Arg. Perigee "; TAB(20); W0(J); TAB(40); W
  678. 7860  PRINT #P%, "R. A. A. N.  "; TAB(20); O0(J); TAB(40); O
  679. 7870  PRINT #P%, "Freq.,MHz    "; TAB(20); F1(J): K9 = 9E+07: K8 = 9E+07
  680. 7880  '
  681. 7890  '****** COMPUTATION LOOP ******
  682. 7900   T = T + T9: K7 = INT(T): GOSUB 8350
  683. 7910  IF K7 = K8 THEN 7930
  684. 7920  K8 = 9E+07: K9 = 9E+07
  685. 7930  GOSUB 8520: IF E9 < E8 THEN 8080
  686. 7940  IF K7 = K8 AND K = K9 THEN 8000
  687. 7950  IF K7 = K8 THEN 7990 ELSE GOSUB 8260
  688. 7960  K8 = K7
  689. 7970  PRINT #P%, " U.T.C.    AZ    EL  DOPPLER   RANGE   HEIGHT  LAT.  LONG.  PHASE"
  690. 7980  PRINT #P%, "HHMM:SS   dgr:  dgr:   Hz       km       km    dgr.   dgr.  <256>"
  691. 7990  PRINT #P%, TAB(20); "- - - ORBIT  No."; K; "- - -"
  692. 8000  K9 = K: T4 = T - K7: S4 = INT(T4 * 86400!): H4 = INT(S4 / 3600 + .000001)
  693. 8010  M4 = INT((S4 - H4 * 3600) / 60 + .000001)
  694. 8020  S4 = S4 - 3600 * H4 - 60 * M4
  695. 8030  T$ = FNT$(H4) + FNT$(M4) + ":" + FNT$(S4)
  696. 8040  F9 = -F1(J) * 1000000! * R8 / C
  697. 8050  PRINT #P%, T$;
  698. 8060  PRINT #P%, USING "   ###   ###  #####"; A9; E9; F9;
  699. 8070  PRINT #P%, USING "    #####    #####  ###.#  ###.#  ###"; R5; (R - R0); L5; W5; M9
  700. 8080  IF T < T8 THEN GOTO 7900
  701. 8090  PRINT #P%, C9$
  702. 8100  IF P% = 1 OR P% = 2 THEN LOCATE 19, 60: PLAY "CEGC": COLOR 10: PRINT "END OF CALCULATION!"
  703. 8110  LOCATE 20, 33: IF P% = 1 THEN PRINT "*** DATA SAVED in SATDATA.TXT ON DRIVE "; DR$; ": ***"
  704. 8120  CLOSE : ON ERROR GOTO 10000
  705. 8130  LOCATE 21, 33: PRINT SPACE$(46);
  706. 8140  LOCATE 22, 33: PRINT SPACE$(46);
  707. 8150  LOCATE 23, 33: PRINT SPACE$(46);
  708. 8160  LOCATE 23, 33: PRINT SPACE$(46);
  709. 8170  LOCATE 22, 33: COLOR 14: PRINT "Another REQUEST ?  (Y/N) ";
  710. 8180  LOCATE 23, 33: PRINT "enter <N> to return to the MAIN MENU !";
  711. 8190  Z$ = "YyNn"
  712. 8200  K$ = INKEY$: IF K$ = "" THEN 8200
  713. 8210  K = INSTR(Z$, K$)
  714. 8220  ON K GOTO 6010, 6010, 8240, 8240
  715. 8230  GOSUB 9510: GOTO 8200
  716. 8240  CLOSE : GOTO 180
  717. 8250  '****** PAGE HEADER SUBROUTINE ******
  718. 8260  PRINT #P%, C9$; C$; "  W.LONG.="; W9; " LATITUDE="; L9; "Height="; H9;
  719. 8270  P = P + 1: PRINT #P%, TAB(71); "Page  "; P
  720. 8280  PRINT #P%, TAB(14); " - - Minnimal Ant.Elevation = "; E8; "Degrees-"
  721. 8290  PRINT #P%,
  722. 8300  DN = K7: GOSUB 8800
  723. 8310  PRINT #P%, TAB(14); "- - DAY No."; K7; "- - -  "; DD; ". "; M$; YY; "- - -"
  724. 8320  PRINT #P%, : RETURN
  725. 8330  '
  726. 8340  '****** ORBIT DETERMINATION AND UTILITY ROUTINES ******
  727. 8350  A0(J) = ((G0 / (N0(J) * N0(J))) ^ (1 / 3))
  728. 8360  E2 = 1 - E0(J) * E0(J): E1 = SQR(E2): Q0 = M0(J) / 360 + K0(J)
  729. 8370  K2 = 9.95 * ((R0 / A0(J)) ^ 3.5) / (E2 * E2)
  730. 8380  S1 = SIN(I0(J) * P0): C1 = COS(I0(J) * P0)
  731. 8390  O = O0(J) - (T - T0(J)) * K2 * C1
  732. 8400  S0 = SIN(O * P0): C0 = COS(O * P0)
  733. 8410  W = W0(J) + (T - T0(J)) * K2 * (2.5 * (C1 * C1) - .5)
  734. 8420  S2 = SIN(W * P0): C2 = COS(W * P0)
  735. 8430  CC(1, 1) = (C2 * C0) - (S2 * S0 * C1): CC(1, 2) = -(S2 * C0) - (C2 * S0 * C1)
  736. 8440  CC(2, 1) = (C2 * S0) + (S2 * C0 * C1): CC(2, 2) = -(S2 * S0) + (C2 * C0 * C1)
  737. 8450  CC(3, 1) = (S2 * S1): CC(3, 2) = (C2 * S1)
  738. 8460  Q = N0(J) * (T - T0(J)) + Q0: K = INT(Q): M9 = INT((Q - K) * 256): M = (Q - K) * P2
  739. 8470  IF P% = 3 THEN 8510
  740. 8480  LOCATE 21, 33: PRINT USING "START CALCULATION AT DAY  ###.#######"; T7
  741. 8490  LOCATE 22, 33: PRINT USING "  END CALCULATION AT DAY  ###.#######"; T8
  742. 8500  LOCATE 23, 33: PRINT USING "  NOW CALCULATING AT DAY  ###.#######"; T;
  743. 8510  RETURN
  744. 8520  E = M + E0(J) * SIN(M) + .5 * (E0(J) * E0(J)) * SIN(2 * M)
  745. 8530  S3 = SIN(E): C3 = COS(E): R3 = 1 - E0(J) * C3: M1 = E - E0(J) * S3
  746. 8540  M5 = M1 - M: IF ABS(M5) < .000001 THEN 8560 ELSE E = E - M5 / R3
  747. 8550  GOTO 8530
  748. 8560  X0 = A0(J) * (C3 - E0(J)): Y0 = A0(J) * E1 * S3: R = A0(J) * R3
  749. 8570  X1 = X0 * CC(1, 1) + Y0 * CC(1, 2): Y1 = X0 * CC(2, 1) + Y0 * CC(2, 2): Z1 = X0 * CC(3, 1) + Y0 * CC(3, 2)
  750. 8580  G7 = T * G1 + G2: G7 = (G7 - INT(G7)) * P2: S7 = -SIN(G7): C7 = COS(G7)
  751. 8590  X = (X1 * C7) - (Y1 * S7): Y = (X1 * S7) + (Y1 * C7): Z = Z1
  752. 8600  X5 = (X - X9): Y5 = (Y - Y9): Z5 = (Z - Z9): R5 = SQR(X5 * X5 + Y5 * Y5 + Z5 * Z5)
  753. 8610  IF T6 <> T THEN R8 = ((R6 - R5) / (T6 - T)) / 86400! ELSE R8 = -9000000000#
  754. 8620  R6 = R5: T6 = T
  755. 8630  Z8 = (X5 * C8 * C9) + (Y5 * S8 * C9) + (Z5 * S9)
  756. 8640  X8 = -(X5 * C8 * S9) - (Y5 * S8 * S9) + (Z5 * C9): Y8 = (Y5 * C8) - (X5 * S8)
  757. 8650  S5 = Z8 / R5: C5 = SQR(1 - S5 * S5): E9 = ATN(S5 / C5) / P0
  758. 8660  IF X8 < 0 THEN A9 = P1 + ATN(Y8 / X8) ELSE 8680
  759. 8670  GOTO 8710
  760. 8680  IF X8 > 0 AND Y8 >= 0 THEN A9 = ATN(Y8 / X8) ELSE IF X8 > 0 THEN A9 = P2 + ATN(Y8 / X8) ELSE 8700
  761. 8690  GOTO 8710
  762. 8700  IF Y8 < 0 THEN A9 = 3 * P1 / 2 ELSE A9 = P1 / 2
  763. 8710  A9 = A9 / P0
  764. 8720  IF X < 0 THEN W5 = P1 + ATN(Y / X) ELSE 8740
  765. 8730  GOTO 8770
  766. 8740  IF X > 0 AND Y >= 0 THEN W5 = ATN(Y / X) ELSE IF X > 0 THEN W5 = P2 + ATN(Y / X) ELSE 8760
  767. 8750  GOTO 8770
  768. 8760  IF Y < 0 THEN W5 = 3 * P1 / 2 ELSE W5 = P1 / 2
  769. 8770  W5 = 360 - W5 / P0
  770. 8780  B5 = Z / R: L5 = ATN(B5 / (SQR(1 - B5 ^ 2))) / P0
  771. 8790  RETURN
  772. 8800  ' ****** DATE FROM DAY OF YEAR NUMBER ******
  773. 8810  '
  774. 8820  DD = 0
  775. 8830  YS = Y3(J)
  776. 8840  DN = DN - 31: IF DN <= 0 GOTO 9010
  777. 8850  IF YS = 88 GOTO 9140
  778. 8860  IF YS = 92 GOTO 9140
  779. 8870  IF YS = 96 GOTO 9140
  780. 8880  DN = DN - 28: IF DN <= 0 GOTO 9030
  781. 8890  DN = DN - 31: IF DN <= 0 GOTO 9040
  782. 8900  DN = DN - 30: IF DN <= 0 GOTO 9050
  783. 8910  DN = DN - 31: IF DN <= 0 GOTO 9060
  784. 8920  DN = DN - 30: IF DN <= 0 GOTO 9070
  785. 8930  DN = DN - 31: IF DN <= 0 GOTO 9080
  786. 8940  DN = DN - 31: IF DN <= 0 GOTO 9090
  787. 8950  DN = DN - 30: IF DN <= 0 GOTO 9100
  788. 8960  DN = DN - 31: IF DN <= 0 GOTO 9110
  789. 8970  DN = DN - 30: IF DN <= 0 GOTO 9120
  790. 8980  DN = DN - 31: IF DN <= 0 GOTO 9130
  791. 8990  YS = YS + 1
  792. 9000  GOTO 8840
  793. 9010  M$ = "JANUARY": DD = DN + 31: RETURN
  794. 9020  M$ = "FEBRUARY": DD = DN + 29: RETURN
  795. 9030  M$ = "FEBRUARY": DD = DN + 28: RETURN
  796. 9040  M$ = "MARCH": DD = DN + 31: RETURN
  797. 9050  M$ = "APRIL": DD = DN + 30: RETURN
  798. 9060  M$ = "MAY": DD = DN + 31: RETURN
  799. 9070  M$ = "JUNE": DD = DN + 30: RETURN
  800. 9080  M$ = "JULY": DD = DN + 31: RETURN
  801. 9090  M$ = "AUGUST": DD = DN + 31: RETURN
  802. 9100  M$ = "SEPTEMBER": DD = DN + 30: RETURN
  803. 9110  M$ = "OCTOBER": DD = DN + 31: RETURN
  804. 9120  M$ = "NOVEMBER": DD = DN + 30: RETURN
  805. 9130  M$ = "DECEMBER": DD = DN + 31: RETURN
  806. 9140  DN = DN - 29: IF DN <= 0 THEN 9020 ELSE 8890
  807. 9200  '***** STANDARDSUBROUTINE  FÜR PRINTERTEST**********
  808. 9210  OKDRK$ = "O.K. PRINTER READY"
  809. 9220  NODRK$ = "PRINTER NOT READY ! "
  810. 9230  NOPAP$ = "NO PAPER ! "
  811. 9240  NOEIN$ = "PRINTER IS NOT SWITCHED ON ! "
  812. 9250  NODRA$ = "THERE IS NO PRINTER ADAPTER INSTALLED."
  813. 9260  NEUEIN$ = "CORRECT SITUATION AND REENTER"
  814. 9270  PRNTR = 1: DEF SEG = &H40
  815. 9280  DBAS = (PRNTR * 2) + 6
  816. 9290  IF PEEK(DBAS) = 0 THEN DRK$ = NODRA$: GOTO 9360
  817. 9300  STAT = INP(PEEK(DBAS) + PEEK(DBAS + 1) * 256 + 1) AND 224
  818. 9310  IF STAT = 192 THEN DRK$ = OKDRK$: DRKFLG = 0: RETURN'OK-AUSSTIEG
  819. 9320  IF STAT = 64 THEN DRK$ = NODRK$
  820. 9330  IF STAT = 96 THEN DRK$ = NOPAP$
  821. 9340  IF STAT = 128 THEN DRK$ = NOEIN$
  822. 9350  IF STAT = 224 THEN DRK$ = NOEIN$
  823. 9360  PLAY "MB O2 A8D8G8A8": DRKFLG = 1: RETURN'FEHLERCONDITION
  824. 9370  '***** ENDE SUBROUTINE DRUCKERTEST *******
  825. 9500  SOUND 990, 3: SOUND 32000, 1: SOUND 990, 1: SOUND 32000, 1: SOUND 990, 4: RETURN
  826. 9510  FOR ISI = 1 TO 8
  827. 9520  SOUND 990, 1: SOUND 32000, 1
  828. 9530  NEXT ISI: RETURN
  829. 10000 PRINT ERL, ERR
  830. 10010 STOP
  831. 10020 IF ERR = 53 THEN CLS : GOTO 10030 ELSE GOTO 10000
  832. 10030 IF ERL = 80 THEN PRINT "SATKEPN.DAT NOT FOUND": GOTO 10060
  833. 10040 IF ERL = 90 THEN PRINT "SATBODN.DAT NOT FOUND": GOTO 10060
  834. 10050 IF ERL = 100 THEN PRINT "SATMAP.DAT NOT FOUND"
  835. 10060 PRINT "Files SATKEPN, SATBODN and SATMAP must be in default drive !"
  836. 10070 PLAY "L3 O2 G L5 A L4 GFED L2 C"  'FEHLERCONDITION WO SIND...
  837. 10080 STOP
  838.