home *** CD-ROM | disk | FTP | other *** search
/ 17 Bit Software 3: The Continuation / 17-Bit_The_Continuation_Disc.iso / files / arug23.dms / arug23.adf / Satellite / tracker8 < prev    next >
Text File  |  1993-12-02  |  22KB  |  803 lines

  1. '         "TRACKER8"       Satellite tracking program with graphics
  2. '         ---------
  3. '
  4. 'Version 1.03 : Last mod 7th May 1990 by ACH
  5. '
  6. '(C) 1988 Mr J R Miller G3RUH
  7. '(C) 1988 Mr A C Hewat  G8NTH
  8. '
  9. 'V 1.00: First version ; original concept with limited graphics.
  10. 'V 1.01: Multi satellite display and better graphics.
  11. 'V 1.02: Most of the bugs fixed!
  12. 'V 1.03: Minor changes to itteration routine. Display changed.
  13.  
  14. 'Saderial Time  (Not for this program, the only place I could find to
  15. '1988 0.27469296                       put it so it wont get lost!)
  16. '1989 0.27676777
  17. '1990 0.27610467
  18. '1991 0.27544157
  19. '1992 0.27477847
  20. '1993 0.27685328
  21. '1994 0.27619018
  22. '1995 0.27552708
  23. '1996 0.27486399
  24. '1997 0.27693880
  25. '1998 0.27627570
  26. '1999 0.27561260
  27.  
  28. DEFDBL a-z
  29. CLEAR,80000&,8000&
  30. DIM C1,C2,C3,C4,C5,C6,C7,C8,C9,C10,C11,C12,C13(16),SatName$(16),stepSize(16),ObjectShape$(16)
  31. DIM days&(12)
  32.  
  33. Main:
  34. predictionTime = 0
  35. echo = 0              
  36. lastChoise = 1
  37. menuItem = 1
  38. oldSatellite = 1
  39. oldChoise1 = 1
  40. oldChoise2 = 1
  41. GOSUB ScreenSetup
  42. GOSUB Ephemeris
  43. GOSUB Constants
  44. GOSUB TodayDate
  45. FOR satellite = 1 TO 10
  46.  GOSUB ObjectShape
  47. NEXT satellite
  48. OPEN "scrn:" FOR OUTPUT AS #2
  49. OPEN "com1:1200,n,7,2" FOR OUTPUT AS #4
  50. LOCATE 27,1: PRINT SPACE$(78): PRINT SPACE$(78): PRINT SPACE$(78): PRINT SPACE$(78);
  51. LOCATE 28,1
  52. PRINT "Satellite  Lat  Long  Height   MA  EL   AZ   Range       Mode  Squint  Orbit";
  53.                                                                           
  54. Quit = -1
  55. realTimeFlag = -1
  56. WHILE Quit
  57.     FOR satellite = 1 TO 10
  58.       GOSUB SatelliteConstants 
  59.       GOSUB DisplayTimePos
  60.       GOSUB CalcthenDisplay
  61.       GOSUB DisplaySatInfo
  62.       IF echo = 1 THEN GOSUB SerialEcho
  63.     NEXT satellite
  64. WEND
  65.  
  66. MENU OFF: MOUSE OFF: TIMER OFF
  67. WINDOW CLOSE 2: WINDOW CLOSE 3
  68. SCREEN CLOSE 2
  69. CLOSE #2
  70. MENU RESET 
  71. CLS
  72. STOP
  73.  
  74. DisplayTimePos:
  75. csrY = CSRLIN: csrX = POS(0):LOCATE 26,70
  76. PRINT LEFT$(TIME$,5);" UTC";
  77. LOCATE csrY,csrX
  78. RETURN
  79.  
  80. CalcthenDisplay:
  81. GOSUB TimeNow
  82. TN = DY + (hour+minutes/60)/24
  83. GOSUB SatVec
  84. GOSUB RangeVec
  85. GOSUB SunVec
  86. GOSUB Satpos
  87. LOCATE 27,1: PRINT "                                                                        ";
  88. RETURN
  89.  
  90. DisplaySatInfo:  
  91. satLat1 = CINT(satLat1): satLong1 = CINT(satLong1): ssrr = FNRN(ssrr-RE): SQ = FNRN(SQ)
  92. EL = CINT(EL): AZ = CINT(AZ): R = FNRN(R): m = INT(m*128/pi): ILL = FNRN(100*ILL)
  93. IF satellite = 1 THEN 
  94.   mode$ = "B"
  95. ELSEIF satellite = 3  THEN
  96.   IF m > 59 AND m < 165 THEN mode$ = "B"
  97.   IF m > 164 AND m < 195 THEN mode$ = "JL"
  98.   IF m > 194 AND m < 200 THEN mode$ = "S"
  99.   IF m > 199 AND m < 205 THEN mode$ = "BS"
  100.   IF m > 204 AND m < 240 THEN mode$ = "B"
  101.   IF m < 60 OR m > 239 THEN mode$ = "B Omi"
  102. ELSE 
  103.   mode$ = "     "
  104. END IF
  105. LOCATE 29,1
  106. PRINT SatName$(satellite);TAB(12);satLat1;TAB(17);satLong1;TAB(23);
  107. PRINT USING "#####";ssrr;
  108. PRINT TAB(31) USING "###";m;
  109. PRINT " ";
  110.  IF EL > -3 THEN 
  111.    PRINT TAB(35);EL;TAB(40);AZ;TAB(46);
  112.    PRINT USING "#####";R;
  113. '  PRINT TAB(52);RR;
  114.    PRINT TAB(59);mode$;
  115.    PRINT TAB(65);SQ;
  116.  ELSE 
  117.    PRINT TAB(35)"                                   ";
  118.  END IF
  119. PRINT TAB(72) USING "#####";RN;
  120. RETURN
  121.  
  122. SerialEcho:
  123. PRINT #4,USING "\      \";SatName$(satellite);
  124. PRINT #4,"  MA ";
  125. PRINT #4,USING "###";m;
  126. PRINT #4,"  EL ";
  127. PRINT #4,USING "###";EL;
  128. PRINT #4,"  AZ ";
  129. PRINT #4,USING "###";AZ;
  130. PRINT #4,"  Mode ";
  131. PRINT #4,USING "\   \";mode$;
  132. PRINT #4,"  Rate ";
  133. PRINT #4,USING "###";RR;
  134. PRINT #4,"  Squint ";
  135. PRINT #4,USING "###";SQ
  136. PRINT #4,CHR$(10)
  137. RETURN
  138.  
  139. CheckMenu:
  140. menuId = MENU(0)
  141. menuItem = MENU(1)
  142. ON menuId GOTO Project,SatelliteChoise,Predictions,Display
  143. RETURN
  144.  
  145. Project:
  146. MENU 1,lastChoise,1
  147. IF menuItem = 3 AND echo = 1 THEN Jump
  148. MENU 1,menuItem,2
  149. Jump:
  150. IF menuItem = 3 THEN GOSUB EchoSet
  151. IF menuItem = 4 THEN Quit = 0
  152. lastChoise = menuItem
  153. RETURN
  154.  
  155. SatelliteChoise:
  156. MENU 2,oldSatellite,1
  157. whichSatellite = menuItem
  158. MENU 2,whichSatellite,2
  159. oldSatellite = whichSatellite
  160. RETURN
  161.  
  162. Predictions:
  163. MENU 3,oldChoise1,1
  164. choise1 = menuItem
  165. MENU 3,choise1,2
  166. IF choise1 = 1 THEN predictionTime = 0
  167. IF choise1 = 2 THEN predictionTime = 60
  168. IF choise1 = 3 THEN predictionTime = 180
  169. IF choise1 = 4 THEN predictionTime = 360
  170. IF choise1 = 5 THEN predictionTime = 720
  171. IF choise1 = 6 THEN predictionTime = 1440
  172. IF choise1 = 7 THEN predictionTime = 2880
  173. IF choise1 = 8 THEN predictionTime = 10080
  174. oldChoise1 = choise1
  175. RETURN
  176.  
  177. Display:
  178. MENU 4,oldChoise2,1
  179. choise2 = menuItem
  180. IF choise2 = 1 THEN 
  181.   satellite = whichSatellite
  182.   GOSUB SatelliteConstants
  183.   LOCATE 27,26
  184.   PRINT "    ";
  185.   GOSUB TimeNow
  186.   dayNo = DY + (hour+minutes/60)/24
  187.   starMinutes = minutes-stepSize(satellite): starHour = hour
  188.   FOR min = 0 TO predictionTime STEP stepSize(satellite)
  189.    TN = dayNo + (min/60)/24
  190.    starMinutes = starMinutes + stepSize(satellite)
  191.    IF starMinutes > 59 THEN 
  192.      starHour = starHour + 1 
  193.      starMinutes = starMinutes - 60
  194.    END IF
  195.    IF starHour > 23 THEN starHour = 0
  196.    GOSUB SatVec
  197.    GOSUB RangeVec
  198.    GOSUB SunVec
  199.    GOSUB Satpos
  200.    LOCATE 27,1: PRINT "Prediction time = ";
  201.    clockHour = INT(starHour+.001)
  202.    clockMin = INT(starMinutes+.1)
  203.    clock$ = RIGHT$(STR$(10000+clockHour*100+clockMin),4)
  204.    PRINT clock$;
  205.    GOSUB DisplaySatInfo
  206.   NEXT min
  207.   LOCATE 27,26
  208.   PRINT "End";
  209. END IF
  210. IF choise2 = 2 THEN 
  211.   saveId = WINDOW(1)
  212.   WINDOW 3,"Prediction",(20,0)-(620,225),8,2
  213.   TIMER OFF
  214.   path = 2
  215.   GOSUB DataOutput
  216.   PRINT #path, "CR to continue"
  217.   INPUT"",dummy
  218.   WINDOW saveId
  219. END IF
  220. IF choise2 = 3 THEN
  221.   path = 3
  222.   LOCATE 27,1: PRINT "Calculating";
  223.   OPEN "Prt:" FOR OUTPUT AS #3
  224.   GOSUB DataOutput
  225.   CLOSE #3
  226. END IF
  227. IF choise2 = 4 THEN
  228.   path = 4
  229.   GOSUB DataOutput
  230. END IF  
  231. predictionTime = 0
  232. MENU 3,oldChoise1,1
  233. MENU 3,1,2 
  234. oldChoise1 = 1
  235. oldChoise2 = choise2
  236. TIMER ON 
  237. RETURN
  238.  
  239. DataOutput:
  240. satellite = whichSatellite
  241. GOSUB SatelliteConstants
  242. IF choise2 = 4 THEN PRINT #path,CHR$(10)
  243. PRINT #path, SatName$(satellite),DATE$
  244. IF choise2 = 4 THEN PRINT #path,CHR$(10)
  245. PRINT #path,"Date         Range     EL      ";
  246. PRINT #path,"AZ    Range rate   Squint   MA   Mode  Orbit"
  247. IF choise2 = 4 THEN PRINT #path,CHR$(10)
  248. PRINT #path,"DDD.HHMM     km       deg      ";
  249. PRINT #path,"deg     km/sec      deg"
  250. IF choise2 = 4 THEN PRINT #path,CHR$(10)
  251. FOR i = 1 TO 79
  252.   PRINT #path,"-";
  253. NEXT i
  254. 'IF choise2 = 4 THEN PRINT #path,CHR$(10)
  255. PRINT
  256. GOSUB TodayDate
  257. GOSUB TimeNow
  258. dayNo = DY + (hour+minutes/60)/24
  259. starMinutes = minutes-stepSize(satellite): starHour = hour
  260. FOR min = 0 TO predictionTime STEP stepSize(satellite)
  261.   TN = dayNo + (min/60)/24
  262.   starMinutes = starMinutes + stepSize(satellite)
  263.   starDay = INT(TN)
  264.   remander = TN - starDay
  265.   starHour = INT(remander*24+.001)
  266.   remander = (remander*24)-starHour
  267.   starMinutes = INT(remander*60+.1)
  268.   dat$ = STR$(starDay) + "." '+ STR$(starHour) + ":" + STR$(starMinutes)
  269.   clock$ = RIGHT$(STR$(10000+starHour*100+starMinutes),4)
  270.   GOSUB SatVec
  271.   GOSUB RangeVec
  272.   IF EL < 0 THEN LT = 0: GOTO Skip
  273.   IF LT = 0 THEN PRINT #path,CHR$(10)
  274.   RR = R
  275.   TN = TN+1/86400&
  276.   GOSUB SatVec
  277.   GOSUB RangeVec
  278.   GOSUB SunVec
  279.   RR = R - RR: m = INT(m*128/pi)
  280.   IF satellite = 3 THEN
  281.       IF m > 59 AND m < 165 THEN mode$ = "B"
  282.       IF m > 164 AND m < 195 THEN mode$ = "JL"
  283.       IF m > 194 AND m < 200 THEN mode$ = "S"
  284.       IF m > 199 AND m < 205 THEN mode$ = "BS"
  285.       IF m > 204 AND m < 240 THEN mode$ = "B"
  286.       IF m < 60 OR m > 239 THEN mode$ = "B Omi"
  287.   ELSEIF satellite = 1 THEN
  288.     mode$ = "B"
  289.   ELSE 
  290.     mode$ = "     "
  291.   END IF
  292.   EL = CINT(EL): AZ = CINT(AZ): R = FNRN(R): RR = FNRN(RR*10)/10: SQ = FNRN(SQ)
  293.   PRINT #path,dat$;clock$;TAB(13);R;TAB(23);EL;TAB(30);AZ;TAB(42);RR;TAB(52);SQ;TAB(59);m;TAB(65);mode$;TAB(72);RN
  294.   IF choise2 = 4 THEN PRINT #path,CHR$(10)
  295.   LT = 1 
  296.   Skip:
  297. NEXT min
  298. PRINT #path, :IF choise2 = 4 THEN PRINT #path,CHR$(10)
  299. PRINT #path, "End"
  300. IF choise2 = 3 THEN PRINT #path,CHR$(13)
  301. IF choise2 = 4 THEN PRINT #path,CHR$(10)
  302. RETURN
  303.  
  304. EchoSet:
  305. IF echo = 0 THEN echo = 1 ELSE echo = 0
  306. RETURN
  307.  
  308. SatelliteConstants:
  309. YE = C1(satellite)         'Epoch year
  310. TE = C2(satellite)         'Epoch time
  311. IN = C3(satellite)         'Inclination
  312. RA = C4(satellite)         'R.A.A.N.
  313. EC = C5(satellite)         'Eccentricity
  314. WP = C6(satellite)         'Arg of perigee
  315. MA = C7(satellite)         'Mean anomaly
  316. MM = C8(satellite)         'Mean motion
  317. M2 = C9(satellite)         'Decay rate
  318. RV = C10(satellite)        'Epoch rev
  319. a  = C11(satellite)        'Semi-major axis.  0 if not known
  320. ALAT = C12(satellite)      'Sat att, deg.  0 = in plain, + = below
  321. ALON = C13(satellite)      'Sat att, deg CCW from SMA dir. 180 = Normal
  322.  
  323. IF a = 0 THEN a = (8681668.016000001#/MM)^(2/3)
  324.  
  325. RA = RAD*RA
  326. MA = RAD*MA
  327. IN = RAD*IN
  328. MM = MM*2*pi
  329. WP = RAD*WP
  330. M2 = M2*2*pi
  331. ALAT = RAD*ALAT
  332. ALON = RAD*ALON
  333.                                   
  334. B = a*SQR(1-EC*EC)               
  335. SI = SIN(IN): CI = COS(IN)
  336. PC = RE*a/(B*B): PC = 1.5*J2*PC*PC*MM  
  337. QD = -PC*CI                      
  338. WD = PC*(5*CI*CI-1)/2      
  339. DC = (M2/MM)/3       
  340.               
  341. TEG = FNDO(YE)-FNDO(YG) + TE  
  342. GHAE = RAD*GO + TEG*WE   
  343. MRSE = RAD*GO + TEG*WW + pi  
  344. MASE = RAD*(MASO + MASD*TEG) 
  345. RETURN
  346.  
  347.  
  348. SatVec:
  349. T = (FNDO(YR)-FNDO(YE)) + (TN-TE) 
  350. DT = DC*T/2   
  351. KD = 1-4*DT  
  352. KDP = 1+7*DT    
  353. m = MA + MM*T*(1+3*DT) 
  354. DR = INT(m/(2*pi)) 
  355. m = m - DR*2*pi     
  356. RN = RV + DR   
  357.  
  358. EA = m
  359. Loop:
  360.   C = COS(EA)
  361.   s = SIN(EA)
  362.   DNOM = 1-EC*C
  363.   DE = (EA - EC*s - m)/DNOM    
  364.   EA = EA - DE       
  365. IF ABS(DE) > .002 THEN GOTO Loop   
  366.  
  367. C = COS(EA)
  368. s = SIN(EA)
  369. RGC = a*(1-EC*C)*KD
  370.  
  371. SX = a*(C-EC)*KD:  TA = -COS(ALAT):   XA = TA*COS(ALON)  
  372. SY = B*s*KD:    YA = TA*SIN(ALON):  ZA = -SIN(ALAT)
  373. W = WP + WD*T*KDP:  C = COS(W):   s = SIN(W)
  374. X = SX*C - SY*s:    TA = XA:      XA = TA*C - YA*s
  375. Y = SX*s + SY*C:                  YA = TA*s + YA*C
  376. z = Y*SI: TA = ZA: ZA = YA*SI+TA*CI: ANTZ = ZA
  377. Y = Y*CI:          YA = YA*CI-TA*SI: ANTY = YA
  378.                                      ANTX = XA
  379.  
  380. RAAN = RA + QD*T*KDP
  381. GHAA = GHAE + WE*T   
  382. Q = RAAN - GHAA               
  383. C = COS(Q): s = SIN(Q)
  384. SX = X*C - Y*s:    TA = XA:     XA = TA*C - YA*s
  385. SY = X*s + Y*C:                 YA = TA*s + YA*C
  386. SZ = z
  387.  
  388. C = COS(RAAN): s = SIN(RAAN)
  389. SATX = X*C - Y*s:   TA = ANTX:  ANTX = TA*C - ANTY*s
  390. SATY = X*s + Y*C:               ANTY = TA*s + ANTY*C
  391. SATZ = z
  392. NMX = s*SI: NMY = -C*SI: NMZ = CI
  393. RETURN
  394.  
  395. SunVec:
  396. MAS = MASE + RAD*(MASD*T)  
  397. TAS = MRSE + WW*T + EQC1*SIN(MAS) + EQC2*SIN(2*MAS) + EQC3*SIN(3*MAS)
  398. C = COS(TAS):  s = SIN(TAS)     
  399. SUNX = C:  SUNY = s*CNS:  SUNZ = s*SNS   
  400.  
  401. CSA = ANTX*SUNX + ANTY*SUNY + ANTZ*SUNZ  
  402. ILL = SQR(1-CSA*CSA)   
  403. SATX = SATX/RGC:  SATY = SATY/RGC:  SATZ = SATZ/RGC 
  404. CUA = -(SATX*SUNX + SATY*SUNY + SATZ*SUNZ) 
  405. UMD = RGC*SQR(1-CUA*CUA)/RE    
  406. SEL = (SUNX*NMX + SUNY*NMY + SUNZ*NMZ) 
  407. SEL = ATN(SEL/SQR(-SEL*SEL+1))
  408. IF CUA >= 0 THEN ECL$ = "    +" ELSE ECL$ = "    -"
  409. IF UMD <= 1 AND CUA >= 0 THEN ECL$ = "   ECL"
  410. RETURN
  411.  
  412. RangeVec:
  413. RX = SX - OX:  RY = SY - OY:  RZ = SZ - OZ  
  414. R = SQR(RX*RX + RY*RY + RZ*RZ)   
  415. RX = RX/R: RY = RY/R:  RZ = RZ/R   
  416. U = RX*UX + RY*UY + RZ*UZ   
  417. E = RX*EX + RY*EY + RZ*EZ  
  418. N = RX*NX + RY*NY + RZ*NZ   
  419. AZ = DEG*(ATN(E/N))       
  420. IF N < 0 THEN AZ = AZ + 180              
  421. IF AZ < 0 THEN AZ = AZ + 360
  422. EL = DEG*(ATN(U/SQR(-U*U+1)))
  423. srr = SQR(SX*SX+SY*SY)     
  424. ssrr = SQR(SX*SX+SY*SY+SZ*SZ)    
  425. szrr = SZ/ssrr: syr = SY/srr
  426. satLat1 = DEG*(ATN(szrr/SQR(-szrr*szrr+1))) 
  427. satLong1 = DEG*(ATN(syr/SQR(-syr*syr+1))) 
  428. SQ =  -(XA*RX + YA*RY + ZA*RZ) 
  429. SQ = DEG*(-ATN(SQ/SQR(-SQ*SQ+1))+1.5708)
  430. RETURN
  431.  
  432. Satpos:
  433. IF SX < 0 AND SY > 0 THEN satLong1 = 180 - satLong1 
  434. IF SX < 0 AND SY < 0 THEN satLong1 = -(180+satLong1)
  435. satPsnX = 1.75*satLong1+309       
  436. satPsnY = 117-1.33*satLat1
  437. satPsnX = CINT(satPsnX)
  438. satPsnY = CINT(satPsnY)
  439. OBJECT.OFF satellite
  440. IF predictionTime > 0 THEN IF satLat1 >= -60 THEN PSET(satPsnX+5,satPsnY+5),3
  441. OBJECT.X satellite,satPsnX: OBJECT.Y satellite,satPsnY
  442. IF satLat1 >= -60 THEN OBJECT.ON satellite
  443. RETURN
  444.  
  445. TodayDate:
  446. day = VAL(MID$(DATE$,4,2))
  447. month = VAL(LEFT$(DATE$,2))
  448. YR = VAL(RIGHT$(DATE$,4))  
  449. 'DY = INT(YR/4)-INT((YR-1)/4)+212+day+(SGN(month-8)*(INT(.5+(ABS((month-8)*30.5)))))
  450. DY = day+days&(month): IF month > 2 THEN DY = DY + (INT(YR/4)-INT((YR-1)/4))
  451. RETURN
  452.  
  453. TimeNow:
  454. hour = VAL(LEFT$(TIME$,2))
  455. minutes = VAL(MID$(TIME$,4,2))
  456. RETURN
  457.  
  458.  
  459. ScreenSetup:
  460. LOCATE 10,20
  461. PRINT "Setting up map display and arrays, please wait!"
  462. GOSUB MainPicture
  463. ON MENU GOSUB CheckMenu: MENU ON
  464.  
  465. MENU 1,0,1,"Project "
  466. MENU 1,1,2,"  Map Display "
  467. MENU 1,2,1,"              "
  468. MENU 1,3,1,"  Serial Echo "
  469. MENU 1,4,1,"  Quit        "
  470. MENU 2,0,1,"Satellite "
  471. MENU 2,1,1,"  OSCAR-10s "
  472. MENU 2,2,1,"  OSCAR-11  "
  473. MENU 2,3,1,"  OSCAR-13s "
  474. MENU 2,4,1,"  OSCAR-14  "
  475. MENU 2,5,1,"  OSCAR-15  "
  476. MENU 2,6,1,"  OSCAR-16  "
  477. MENU 2,7,1,"  OSCAR-17  "
  478. MENU 2,8,1,"  OSCAR-18  "
  479. MENU 2,9,1,"  OSCAR-19  "
  480. MENU 2,10,1,"  OSCAR-20  "
  481. MENU 2,11,1,"  RS-10/11  "
  482. MENU 3,0,1,"Predictions"
  483. MENU 3,1,2,"  Real Time "
  484. MENU 3,2,1,"  One hour  "
  485. MENU 3,3,1,"  3 hours   "
  486. MENU 3,4,1,"  6 hours  "
  487. MENU 3,5,1,"  12 hours  "
  488. MENU 3,6,1,"  24 hours  "
  489. MENU 3,7,1,"  48 hours  "
  490. MENU 3,8,1,"  7 days    "
  491. MENU 4,0,1,"Display "
  492. MENU 4,1,1,"  Screen, Map  "
  493. MENU 4,2,1,"  Screen, Text "
  494. MENU 4,3,1,"  Printer      "
  495. MENU 4,4,1,"  Serial       "
  496. RETURN
  497.  
  498. ObjectShape:
  499. saveId = WINDOW(1)
  500. WINDOW 2
  501. OPEN objShape$(satellite) FOR INPUT AS satellite
  502. OBJECT.SHAPE satellite,INPUT$(LOF(satellite),satellite)
  503. CLOSE satellite
  504. OBJECT.CLIP (0,0)-(631,199)
  505. WINDOW saveId
  506. RETURN
  507.  
  508. Constants:
  509. days&(0)=0:days&(1)=0:days&(2)=31:days&(3)=59:days&(4)=90:days&(5)=120:days&(6)=151
  510. days&(7)=181:days&(8)=212:days&(9)=243:days&(10)=273:days&(11)=304:days&(12)=334
  511. LA =  51.268333#           ' Latitude of QTH, + north, - south
  512. LO = -.563333              ' Longitude of QTH, + deg east, - deg west
  513. HT = 35                    ' Height of QTH above mean sea level
  514. pi = 3.141592654#
  515. DEG = 180/pi                           
  516. RAD = 1/DEG               
  517. DEF FNRN(X) = INT(X+.5)
  518. LA = RAD*LA
  519. LO = RAD*LO
  520. HT = HT/1000
  521. CL = COS(LA)
  522. SL = SIN(LA)
  523. CO = COS(LO)
  524. SO = SIN(LO)
  525.  
  526. RE = 6378.14
  527. FL = 1/298.256      
  528. RP = RE*(1-FL)
  529. XX = RE*RE
  530. ZZ = RP*RP
  531. D = SQR(XX*CL*CL + ZZ*SL*SL)
  532. RX = XX/D + HT
  533. RZ = ZZ/D + HT
  534.  
  535. UX = CL*CO:       EX = -SO:       NX = -SL*CO
  536. UY = CL*SO:       EY = CO:        NY = -SL*SO
  537. UZ = SL:          EZ = 0:         NZ = CL
  538. OX = RX*UX:       OY = RX*UY:     OZ = RZ*UZ
  539.  
  540. YG = 1988:    GO = 98.8897
  541. MASO = 356.1611:   MASD = .9856002671#
  542. INS = RAD*23.4408:  CNS = COS(INS):   SNS = SIN(INS)
  543. EQC1 = .03342715297#:  EQC2 = .00034917#:  EQC3 = .00000506#
  544.  
  545. YM = 365.25
  546. YT = 365.2421938#
  547. DEF FNDO(Y) = INT((Y-1)*YM)
  548. WW = 2*pi/YT
  549. WE = 2*pi + WW
  550. J2 = .00108263#
  551. RETURN
  552.  
  553. Ephemeris:
  554.  
  555. SatName$(1)="OSCAR 10s ": SatName$(2)="OSCAR 11  "
  556. stepSize(1)=20:           stepSize(2)=5
  557. objShape$(1)="oscar10":   objShape$(2)="oscar11"
  558. C1(1)=1989:               C1(2)=1990
  559. C2(1)=330.318#:           C2(2)=86.14190031#
  560. C3(1)=25.9:               C3(2)=97.963
  561. C4(1)=232:                C4(2)=141.366
  562. C5(1)=.6:                 C5(2)=.0012026
  563. C6(1)=96:                 C6(2)=141.7015
  564. C7(1)=331:                C7(2)=218.5388
  565. C8(1)=2.0588#:            C8(2)=14.65066797#:      ' AO 10 ALAT,ALONG
  566. C9(1)=0:                  C9(2)=.00002602#:        '
  567. C10(1)=4855:              C10(2)=32395:            ' Jan     Apr
  568. C11(1)=0:                 C11(2)=0:                '
  569. C12(1)=-11:               C12(2)=0:                '-17     -11
  570. C13(1)=28:                C13(2)=180:              ' 38      28
  571.  
  572. SatName$(3)="OSCAR 13s ": SatName$(4)="OSCAR 14  "
  573. stepSize(3)=20:           stepSize(4)=5
  574. objShape$(3)="oscar13":   objShape$(4)="oscar14"
  575. C1(3)=1990:               C1(4)=1990
  576. C2(3)=28.47497#:          C2(4)=32.22728814#
  577. C3(3)=57.04:              C3(4)=98.7119
  578. C4(3)=171.28:             C4(4)=108.6771
  579. C5(3)=.6886:              C5(4)=.0011164
  580. C6(3)=220.03964#:         C6(4)=187.8659
  581. C7(3)=0:                  C7(4)=172.2355
  582. C8(3)=2.09699529#:        C8(4)=14.2847692#
  583. C9(3)=0:                  C9(4)=.00000487#
  584. C10(3)=1244:              C10(4)=145
  585. C11(3)=25783:             C11(4)=0
  586. C12(3)=2.9:               C12(4)=0
  587. C13(3)=207.1:             C13(4)=180
  588.  
  589. SatName$(5)="OSCAR 15  ": SatName$(6)="OSCAR 16  "
  590. stepSize(5)=5:            stepSize(6)=5
  591. objShape$(5)="oscar15":   objShape$(6)="oscar16"
  592. C1(5)=1990:               C1(6)=1990
  593. C2(5)=39.65469092#:       C2(6)=34.60805519#
  594. C3(5)=98.7132:            C3(6)=98.7153
  595. C4(5)=116.0954:           C4(6)=111.0642
  596. C5(5)=.0010392#:          C5(6)=.0011537
  597. C6(5)=165.098:            C6(6)=181.1074
  598. C7(5)=195.0505:           C7(6)=179.0106
  599. C8(5)=14.28262878#:       C8(6)=14.28568377#
  600. C9(5)=.00000474#:         C9(6)=.00000853#
  601. C10(5)=251:               C10(6)=179
  602. C11(5)=0:                 C11(6)=0
  603. C12(5)=0:                 C12(6)=0
  604. C13(5)=180:               C13(6)=180
  605.  
  606. SatName$(7)="OSCAR 17  ": SatName$(8)="OSCAR 18  "
  607. stepSize(7)=5:            stepSize(8)=5
  608. objShape$(7)="oscar17":   objShape$(8)="oscar18"
  609. C1(7)=1990:               C1(8)=1990
  610. C2(7)=29.63506009#:       C2(8)=36.28755853#
  611. C3(7)=98.7166:            C3(8)=98.7153
  612. C4(7)=106.0985:           C4(8)=112.745
  613. C5(7)=.0011558:           C5(8)=.0012351
  614. C6(7)=194.931:            C6(8)=176.1527
  615. C7(7)=165.2835:           C7(8)=183.9742
  616. C8(7)=14.2859#:           C8(8)=14.28715751#
  617. C9(7)=.00000887#:         C9(8)=.00000649#
  618. C10(7)=108:               C10(8)=203
  619. C11(7)=0:                 C11(8)=0
  620. C12(7)=0:                 C12(8)=0
  621. C13(7)=180:               C13(8)=180
  622.  
  623. SatName$(9)="OSCAR 19  ": SatName$(10)="OSCAR 20  "
  624. stepSize(9)=5:            stepSize(10)=5
  625. objShape$(9)="oscar19":   objShape$(10)="oscar20"
  626. C1(9)=1990:               C1(10)=1990
  627. C2(9)=30.68451259#:       C2(10)=85.20385752#
  628. C3(9)=98.7165:            C3(10)=99.052
  629. C4(9)=107.1491:           C4(10)=147.3503
  630. C5(9)=.0012456:           C5(10)=.0540825
  631. C6(9)=193.4736:           C6(10)=236.3713
  632. C7(9)=166.6115:           C7(10)=118.4676
  633. C8(9)=14.28775079#:       C8(10)=12.83121017#
  634. C9(9)=.00000738#:         C9(10)=9.59999999999D-07
  635. C10(9)=123:               C10(10)=610
  636. C11(9)=0:                 C11(10)=0
  637. C12(9)=0:                 C12(10)=0
  638. C13(9)=180:               C13(10)=180
  639. RETURN
  640.  
  641. MainPicture:
  642.  
  643. DIM bPlane&(5), cTabWork%(32), cTabSave%(32)
  644. DECLARE FUNCTION xOpen&  LIBRARY
  645. DECLARE FUNCTION xRead&  LIBRARY
  646. DECLARE FUNCTION xWrite& LIBRARY
  647. DECLARE FUNCTION AllocMem&() LIBRARY
  648. LIBRARY "dos.library"
  649. LIBRARY "exec.library"
  650. LIBRARY "graphics.library"
  651.  
  652. GetNames:
  653. ACBMname$  = "World6"   ' World1 of political map
  654. loadError$ = ""
  655. GOSUB LoadACBM
  656. IF loadError$ <> "" THEN GOTO Mcleanup
  657.  
  658. Mcleanup:
  659. Mcleanup2:
  660. LIBRARY CLOSE
  661. IF loadError$ <> "" THEN PRINT loadError$
  662. RETURN   
  663.  
  664. LoadACBM:
  665. f$ = ACBMname$
  666. fHandle& = 0
  667. mybuf& = 0
  668. foundBMHD = 0
  669. foundCMAP = 0
  670. foundCAMG = 0
  671. foundCCRT = 0
  672. foundABIT = 0
  673. filename$ = f$ + CHR$(0)
  674. fHandle& = xOpen&(SADD(filename$),1005)
  675. IF fHandle& = 0 THEN
  676.    loadError$ = "Can't open/find pic file"
  677.    GOTO Lcleanup
  678. END IF
  679. ClearPublic& = 65537&
  680. mybufsize& = 360
  681. mybuf& = AllocMem&(mybufsize&,ClearPublic&)
  682. IF mybuf& = 0 THEN
  683.    loadError$ = "Can't alloc buffer"
  684.    GOTO Lcleanup
  685. END IF
  686. inbuf& = mybuf&
  687. cbuf& = mybuf& + 120
  688. ctab& = mybuf& + 240
  689. rLen& = xRead&(fHandle&,inbuf&,12)
  690. tt$ = ""
  691. FOR kk = 8 TO 11
  692.    tt% = PEEK(inbuf& + kk)
  693.    tt$ = tt$ + CHR$(tt%)
  694. NEXT
  695. IF tt$ <> "ACBM" THEN 
  696.    loadError$ = "Not an ACBM pic file"
  697.    GOTO Lcleanup
  698. END IF
  699.  
  700. ChunkLoop: 
  701.  rLen& = xRead&(fHandle&,inbuf&,8)
  702.  icLen& = PEEKL(inbuf& + 4)
  703.  tt$ = ""
  704.  FOR kk = 0 TO 3
  705.     tt% = PEEK(inbuf& + kk)
  706.     tt$ = tt$ + CHR$(tt%)
  707.  NEXT       
  708. IF tt$ = "BMHD" THEN  
  709.    foundBMHD = 1
  710.    rLen& = xRead&(fHandle&,inbuf&,icLen&)
  711.    iWidth%  = PEEKW(inbuf&)
  712.    iHeight% = PEEKW(inbuf& + 2)
  713.    iDepth%  = PEEK(inbuf& + 8)  
  714.    iCompr%  = PEEK(inbuf& + 10)
  715.    scrWidth%  = PEEKW(inbuf& + 16)
  716.    scrHeight% = PEEKW(inbuf& + 18)   
  717.    iRowBytes% = iWidth% /8
  718.    scrRowBytes% = scrWidth% / 8
  719.    nColors%  = 2^(iDepth%)
  720.    AvailRam& = FRE(-1)
  721.    NeededRam& = ((scrWidth%/8)*scrHeight%*(iDepth%+1))+5000
  722.    IF AvailRam& < NeededRam& THEN
  723.       loadError$ = "Not enough free ram."
  724.       GOTO Lcleanup
  725.    END IF
  726.    kk = 1
  727.    IF scrWidth% > 320 THEN kk = kk + 1
  728.    IF scrHeight% > 320  THEN kk = kk + 2
  729.    SCREEN 2,scrWidth%,scrHeight%,iDepth%,kk
  730.    WINDOW 2,"Map Display",,16,2
  731.    WINDOW OUTPUT 2
  732.    GOSUB GetScrAddrs
  733.    CALL LoadRGB4&(sViewPort&,ctab&,nColors%)
  734. ELSEIF tt$ = "CMAP" THEN 
  735.    foundCMAP = 1
  736.    rLen& = xRead&(fHandle&,cbuf&,icLen&)
  737.    ' Build Color Table
  738.    FOR kk = 0 TO nColors% - 1
  739.       red% = PEEK(cbuf&+(kk*3))
  740.       gre% = PEEK(cbuf&+(kk*3)+1)
  741.       blu% = PEEK(cbuf&+(kk*3)+2)
  742.       regTemp% = (red%*16)+(gre%)+(blu%/16)
  743.       POKEW(ctab&+(2*kk)),regTemp%
  744.    NEXT
  745. ELSEIF tt$ = "ABIT" THEN 
  746.    foundABIT = 1    
  747.    plSize& = (scrWidth%/8) * scrHeight%
  748.    FOR pp = 0 TO iDepth% -1
  749.       rLen& = xRead&(fHandle&,bPlane&(pp),plSize&)   
  750.    NEXT
  751. ELSE 
  752.    FOR kk = 1 TO icLen&
  753.       rLen& = xRead&(fHandle&,inbuf&,1)
  754.    NEXT
  755.    IF (icLen& OR 1) = icLen& THEN  
  756.       rLen& = xRead&(fHandle&,inbuf&,1)
  757.    END IF     
  758. END IF
  759. IF foundBMHD AND foundCMAP AND foundABIT THEN
  760.    GOTO GoodLoad
  761. END IF
  762. IF rLen& > 0 THEN GOTO ChunkLoop
  763. IF rLen& < 0 THEN  'Read error
  764.    loadError$ = "Read error"
  765.    GOTO Lcleanup
  766. END IF   
  767. IF (foundBMHD=0) OR (foundABIT=0) OR (foundCMAP=0) THEN
  768.    loadError$ = "Needed ILBM chunks not found"
  769.    GOTO Lcleanup
  770. END IF
  771.  
  772. GoodLoad:
  773. loadError$ =""
  774. IF foundCMAP THEN 
  775.    CALL LoadRGB4&(sViewPort&,ctab&,nColors%)
  776. END IF
  777.  
  778. Lcleanup:
  779. IF fHandle& <> 0 THEN CALL xClose&(fHandle&)
  780. IF mybuf& <> 0 THEN CALL FreeMem&(mybuf&,mybufsize&)
  781. ERASE bPlane&,cTabWork%,cTabSave%
  782.  
  783. RETURN
  784.  
  785. GetScrAddrs: 
  786.    sWindow&   = WINDOW(7)
  787.    sScreen&   = PEEKL(sWindow& + 46)
  788.    sViewPort& = sScreen& + 44
  789.    sRastPort& = sScreen& + 84
  790.    sColorMap& = PEEKL(sViewPort& + 4)
  791.    colorTab&  = PEEKL(sColorMap& + 4)
  792.    sBitMap&   = PEEKL(sRastPort& + 4)
  793.    ' Get screen parameters
  794.    scrWidth%  = PEEKW(sScreen& + 12)
  795.    scrHeight% = PEEKW(sScreen& + 14)
  796.    scrDepth%  = PEEK(sBitMap& + 5)
  797.    nColors%   = 2^scrDepth%
  798.    ' Get addresses of Bit Planes 
  799.    FOR kk = 0 TO scrDepth% - 1
  800.       bPlane&(kk) = PEEKL(sBitMap&+8+(kk*4))
  801.    NEXT
  802. RETURN
  803.