--- title: "Satellite Orbits" id: 69515 type: "computer_media" slug: "satellite-orbits" url: "http://localhost/computer_media/satellite-orbits/" markdown_url: "http://localhost/computer_media/satellite-orbits.md" published_at: "2026-04-13T22:17:02+00:00" modified_at: "2026-04-13T22:19:14+00:00" author: "David Anderson" featured_image: url: "http://localhost/wp-content/uploads/2026/04/SCR-20260413-pslt.png" excerpt: "A real-time satellite tracker that plots orbital ground tracks, computes azimuth and elevation for your location, and calculates Doppler-shifted beacon frequencies for over a dozen named satellites." category: - name: "Archived Media" slug: "archived-media" taxonomy: "category" url: "http://localhost/category/archived-media/" post_tag: - name: "Downloadable" slug: "downloadable" taxonomy: "post_tag" url: "http://localhost/tag/downloadable/" - name: "TS 2068" slug: "ts2068" taxonomy: "post_tag" url: "http://localhost/tag/ts2068/" model: - name: "Timex/Sinclair 2068" slug: "ts-2068" taxonomy: "model" url: "http://localhost/model/ts-2068/" genre: - name: "Science" slug: "science" taxonomy: "genre" url: "http://localhost/type/science/" media_type: "Program" download_url: "https://archive.org/download/timex-sinclair-software-archive/Satellite%20Orbits%20%281986%29%28TS2068%29%28DE%29%28Program%29.zip" mediadate: "1986" images: - url: "http://localhost/wp-content/uploads/2026/04/SCR-20260413-pslt.png" media_type_tags: "Science" --- This program calculates and displays satellite orbital tracks in real time, supporting a catalog of amateur radio, weather, and space station satellites including OSCAR, RS, NOAA, METEOR, Shuttle, MIR, and Salyut 7. It uses Keplerian orbital elements (inclination, eccentricity, mean motion, RAAN, argument of perigee, mean anomaly) together with an iterative Kepler equation solver to compute satellite position in Earth-centered inertial coordinates, then transforms to topocentric azimuth and elevation for a configurable observer location (hardcoded to approximately Los Angeles). A companion machine code block loaded from “Sat-Bahn C” at address 56000 handles real-time clock reads via BCD-encoded PEEKs at addresses 63675–63677 and satellite ground-track plotting via RANDOMIZE USR calls to routines at 63000, 63679, and 63702. The program also computes Doppler shift for each satellite’s beacon frequency and determines whether the satellite is in sunlight or Earth’s shadow using solar position calculations. *** ## Program Analysis ### Program Structure The program is organized into clearly delineated sections indicated by REM statements. The top-level flow is: 1. Lines 1–8: Initialization, machine code load, variable setup, observer location 2. Lines 10–48: Date/Julian day number setup subroutine 3. Lines 1200–1980: Epoch validation, sidereal time, orbital constants, rotation matrix allocation 4. Lines 2000–3499: Main orbital computation and display loop 5. Lines 3500–3830: Sub-menu handling (fast clock, protocol/logging, restart, screen copy) 6. Lines 4000–4210: Doppler shift formatting 7. Lines 4500–4650: Calendar (day rollover) subroutine 8. Lines 5000–5490: Real-time clock adjustment utility 9. Lines 6000–6999: Main menu, satellite selection, and sun/shadow calculation 10. Lines 8000–8600: Date/time entry, clock set, UDG definition 11. Lines 9000–9550: Satellite Keplerian element data 12. Line 9999: Save and restart ### Machine Code Integration A companion code block is loaded at line 3 with `LOAD "Sat-Bahn C" CODE` into address 56000. Several machine code entry points are used: | Address | Usage | | --- | --- | | 63000 | Called at line 2010 via `RANDOMIZE USR 63000` — likely clears or resets the map display area | | 63679 | Called at lines 6 and 2010 via `RANDOMIZE USR 63679` — probable screen or map initialization | | 63702 | Called at lines 3400 and 6070 via `RANDOMIZE USR 63702` — plots the satellite position on the map using coordinates previously POKEd into 63826/63827 | | 63826–63827 | POKEd with `XPOS` and `175-YPOS` before calling 63702; act as parameter passing for the plot routine | | 63675–63677 | Real-time clock registers in BCD format: hours, minutes, seconds | | 63522, 63545 | Coarse and fine clock rate adjustment values | | 63604, 63493 | POKEd in fast-clock (time-lapse) mode to alter tick rate | | 63772 | POKEd 201 (RET opcode) to disable an interrupt handler, then 0 to re-enable | The clock is read by PEEKing BCD-encoded bytes: `INT (PEEK 63675/16)` extracts the tens digit and `PEEK 63675 - 16*I` gives the units digit, converting BCD to decimal without string conversion. ### Orbital Mechanics The program implements a standard SGP-style two-body propagator with first-order secular perturbations. Key steps include: - Secular drift of RAAN (`O`) and argument of perigee (`W`) due to J2 oblateness, using the perturbation factor `K2=9.95*((R0/A0)^3.5)/(E2*E2)` at line 1970 - Iterative Kepler equation solution (lines 2250–2370) using Newton-Raphson iteration: `E=E-M5/R3`, terminating when `ABS(M5) < 1E-6` - Construction of a 3×2 rotation matrix `C()` from RAAN, argument of perigee, and inclination (lines 2140–2210), stored in a `DIM C(PI,2)` array — notably using `PI` (evaluated as 3) as the first dimension - Rotation from orbital plane to Earth-centered inertial (ECI) frame (lines 2440–2460) - Conversion from ECI to Earth-fixed frame using Greenwich Sidereal Time (lines 2660–2750) - Topocentric transformation to azimuth and elevation for the observer site (lines 2980–3090) ### Observer Location and Coordinate Transform The observer location is set at line 8: latitude `L9=34.1`°, west longitude `W9=118`°, height `H9=0` km — corresponding to the Los Angeles area. The geodetic-to-ECEF conversion at lines 1840–1850 applies an oblateness correction using flattening factor `F=1/298.25` and computes the observer’s geocentric Cartesian coordinates `X9`, `Y9`, `Z9`. The parametric latitude correction uses `ATN((1-F)^2*S9/C9)`. ### Sun Position and Shadow Detection The subroutine at line 6700 implements a full solar position calculation to determine whether the satellite is in sunlight or Earth’s shadow. It computes Julian Date, mean solar longitude `WS`, solar equation of center `CS`, solar declination `DC`, and Earth-Sun distance `RE`. The shadow check at line 6955 compares the angular separation between satellite and Sun against the combined umbra angles of Earth as seen from the satellite and Earth as seen from the Sun (`DZ2`). The result is displayed as either `"Sun "` or `"Shadow"` in string `J$`. ### Map Projection The satellite ground track is mapped to screen pixel coordinates at lines 3342–3344. Latitude is linearly scaled to Y: `YPOS=(L5+60)*16/14+7.5`, covering approximately ±60° latitude. Longitude is mapped with a scale factor of 0.88757143 pixels per degree. The wrap-around at 180° is handled by the conditional at line 3342: `IF W5>180 THEN LET W5=180-W5`, with separate left/right half-plane cases. ### Display and Status Lines Line 3320 builds a 34-character string `Y$` containing azimuth (`Az=`), elevation (`El=`), and satellite status (sun/shadow). The degree symbol is provided by UDG character `\a`, defined in the subroutine at line 8500 using `POKE USR "a"` with DATA values for a degree-symbol bitmap. Line 3335 builds `Z$` for sub-satellite point longitude/latitude and satellite name. These are printed to the lower screen (channel `#1`) and main screen respectively. ### Doppler Calculation The Doppler shift is computed at line 3450 as `DS4=RSF/(300000/V-1)`, where `V` is the range-rate in km/s derived from successive range values `R5` and `SR1` (lines 3440–3445). The time interval between samples differs between normal mode (÷15) and fast-clock mode (÷120). Frequencies below 1 MHz are displayed in kHz; those ≥1 MHz are displayed in MHz (lines 4020–4110). ### Satellite Database Keplerian elements for 19 satellites are stored as assignment statements in the 9100–9550 range, organized by category: - OSCAR group: OSCAR 9, 10, 11, JAS 1 (OSCAR 12) - RS group: RS 5, RS 7, RS 8 - Weather: NOAA 6, 7, 8, 9, METEOR 2-10, METEOR 2-11 - Crewed/Space Station: Shuttle (3 orbital inclinations), MIR, Salyut 7 - Current (line 9500): D1 Mission (Spacelab D1) Each entry stores: epoch year `Y2`, epoch day `T0`, inclination `I0`, revolution number `K0`, mean anomaly `M0`, eccentricity `E0`, mean motion `N0` (rev/day), argument of perigee `W0`, RAAN `O0`, and beacon frequency `RSF` in Hz. ### Notable Techniques and Idioms - `DIM C(PI,2)` at line 1980 exploits the fact that `PI` evaluates to 3 in BASIC, creating a 3×2 matrix without using a numeric literal - `NOT PI` is used throughout as a concise way to produce 0 (false), since `NOT` of any non-zero value returns 0 - The menu dispatch at line 6090 uses computed `GO TO (6000+CH0*100)`, and similarly at lines 6190, 6290, 6390, 6490 — an efficient dispatch table idiom - String padding loops at lines 4015 and 4200 ensure fixed-width right-aligned numeric output by prepending spaces - The PROTOKOLL logging feature (lines 3491–3492) sends formatted passes to a printer at 30-second intervals using `LPRINT` - Time-lapse (Zeitraffer) mode is toggled at lines 3610–3620, altering machine code clock divisors via POKE to accelerate orbital simulation - Line 3498 detects when `XPOS` crosses 245–265 (off the right edge of the map) to trigger a display refresh via `GO TO 2000`, preventing map artifacts - The epoch age warning at line 1250 compares current date against epoch date using the approximation `Y*366+day` and alerts if elements are more than 2 months old ### Bugs and Anomalies - Line 8520 DATA contains `aa` as a literal token in what should be numeric DATA — this is likely a tokenization artifact where the value 0 was intended at those positions in the UDG bitmap - Line 9451 contains a double colon `::` after `M0=318.4556`, which is a harmless redundant statement separator - The calendar subroutine at lines 4510–4565 does not account for leap years; February is always treated as having 28 days - Line 3150: the azimuth quadrant corrections at lines 3150–3190 and 3220–3250 use non-standard sign conventions that may produce errors near the cardinal axes; specifically, line 3160 sets `W5=-W5` when `X>0 AND Y<0`, which is inconsistent with the subsequent line 3170 - Line 5495 references variable `CHh` (mixed case) but line 6055 reads `chh` — on this platform variable names are case-insensitive in BASIC, so this is not a runtime error ## Source Code ``` 1 REM Satellitenflugbahnen 2 REM RESET R.St. 3/1986 3 CLEAR 55999: LOAD "Sat-Bahn C"CODE 4 LET D$="" 5 POKE 63772,201: LET T$="": LET ZEITRAFF=NOT PI: LET PROTOKOLL=NOT PI: LET TAGFLAG=NOT PI: LET SZEIT=NOT PI: LET XPOS=254: LET YPOS=174 6 GO SUB 8000: RANDOMIZE USR 63679: GO SUB 8500 7 REM L9=Lat., W9=Long. West, H9=High 8 LET L9=34.1: LET W9=118: LET H9=0 10 GO SUB 6000: CLS : LET DM=NOT PI: LET MN=1 20 LET YN=Y2: GO SUB 40 30 LET T0=T0+DN: GO TO 1200 40 LET TT1=YN: LET TT2=MN 42 IF TT2>2.5 THEN GO TO 46 44 LET TT1=TT1-1: LET TT2=TT2+12 46 LET DN=INT (365.25*(TT1-80))-INT ((1900+TT1)/100)+INT ((1900+TT1)/400)-16 48 LET DN=DN+DM+30*TT2+INT (.6*TT2-.3): RETURN 1200 LET YN=VAL D$(7 TO 8): LET MN=VAL D$(4 TO 5): LET DM=VAL D$( TO 2) 1210 GO SUB 40 1250 IF (Y2*366+T0+60)<(YN*366+DN) THEN PRINT AT 20,12;"ATTENTION !": PRINT "Kep. Elements old. than 2 months": BEEP .05,30: FOR i=1 TO 300: NEXT i 1306 LET T1=YN-1: LET DE=INT (365.25*(T1-80))-INT (T1/100)+INT (T1/400+.75)+366 1308 LET T1=(DE+29218.5)/36525: LET T1=6.6460656+T1*(2400.0513+T1*2.581E-5): LET SE=T1/24-YN 1500 REM INITIALISIERUNG 1640 LET G0=7.5369793E13 1650 LET G1=1.00273791 1740 LET P1=3.1415927 1750 LET P2=2*P1 1760 LET P0=P1/180 1830 LET R0=6378.16: LET F=1/298.25 1840 LET L8=L9*P0: LET S9=SIN (L8): LET C9=COS (L8): LET S8=SIN (-W9*P0): LET C8=COS (W9*P0): LET R9=R0*(1-(F/2)+(F/2)*COS (2*L8))+H9/1000 1850 LET L8=ATN ((1-F)^2*S9/C9): LET Z9=R9*SIN (L8): LET X9=R9*COS (L8)*C8: LET Y9=R9*COS (L8)*S8 1880 LET A0=((G0/(N0*N0))^(1/3)) 1890 LET E2=1-E0*E0 1900 LET E1=SQR (E2) 1920 LET Q0=M0/360+K0 1940 IF LEN G$>11 THEN LET G$=G$( TO 11) 1945 IF LEN G$<11 THEN FOR i=11 TO LEN G$ STEP -1: LET G$=G$+" ": NEXT i 1970 LET K2=9.95*((R0/A0)^3.5)/(E2*E2): LET S1=SIN (I0*P0): LET C1=COS (I0*P0) 1980 DIM C(PI,2) 2000 REM Berechnungsschleife 2010 LET FLAG=NOT PI: RANDOMIZE USR 63000: RANDOMIZE USR 63679: PRINT AT 0,1; INVERSE 1; BRIGHT 0;G$;" ";D$;" "; INVERSE 0: POKE 63772,0 2040 LET I=INT (PEEK 63675/16): LET H$( TO 3)=STR$ (I)+STR$ (PEEK 63675-16*I)+":" 2050 LET I=INT (PEEK 63676/16): LET H$(4 TO 6)=STR$ (I)+STR$ (PEEK 63676-16*I)+":" 2060 LET I=INT (PEEK 63677/16): LET H$(7 TO )=STR$ (I)+STR$ (PEEK 63677-16*I) 2070 LET T=VAL (H$( TO 2))/24+VAL (H$(4 TO 5))/1440+VAL (H$(7 TO ))/86400+DN 2100 LET O=O0-(T-T0)*K2*C1: LET S0=SIN (O*P0): LET C0=COS (O*P0): LET W=W0+(T-T0)*K2*(2.5*(C1*C1)-.5): LET S2=SIN (W*P0): LET C2=COS (W*P0) 2140 LET C(1,1)=(C2*C0)-(S2*S0*C1) 2150 LET C(1,2)=-(S2*C0)-(C2*S0*C1) 2160 LET C(2,1)=(C2*S0)+(S2*C0*C1) 2200 LET C(2,2)=-(S2*S0)+(C2*C0*C1) 2210 LET C(PI,1)=(S2*S1): LET C(PI,2)=(C2*S1): LET Q=N0*(T-T0)+Q0: LET K=INT Q 2250 LET M=(Q-K)*P2: LET E=M+E0*SIN M+.5*(E0*E0)*SIN (2*M) 2310 LET S3=SIN E: LET C3=COS E: LET R3=1-E0*C3: LET M1=E-E0*S3: LET M5=M1-M 2360 IF ABS (M5)<1E-6 THEN GO TO 2410 2370 LET E=E-M5/R3: GO TO 2310 2410 LET X0=A0*(C3-E0) 2420 LET Y0=A0*E1*S3 2430 LET R=A0*R3 2440 LET X1=X0*C(1,1)+Y0*C(1,2) 2450 LET Y1=X0*C(2,1)+Y0*C(2,2) 2460 LET Z1=X0*C(3,1)+Y0*C(3,2) 2660 LET G7=(T-DE)*G1+SE 2670 LET G7=(G7-(INT G7))*P2 2680 LET S7=-SIN G7 2690 LET C7=COS G7 2700 LET X=(X1*C7)-(Y1*S7) 2740 LET Y=(X1*S7)+(Y1*C7) 2750 LET Z=Z1 2890 LET X5=X-X9 2900 LET Y5=Y-Y9 2940 LET Z5=Z-Z9 2950 LET R5=SQR (X5*X5+Y5*Y5+Z5*Z5) 2960 LET DZ=R0/R 2970 LET DZ=57.3*(-ATN (DZ/SQR (-DZ*DZ+1))+P1/2) 2980 LET Z8=(X5*C8*C9)+(Y5*S8*C9)+(Z5*S9) 2990 LET X8=-(X5*C8*S9)-(Y5*S8*S9)+(Z5*C9) 3000 LET Y8=(Y5*C8)-(X5*S8) 3030 LET S5=Z8/R5 3040 LET C5=SQR (1-S5*S5) 3050 LET E9=(ATN (S5/C5))/P0 3080 LET A9=(ATN (Y8/X8))/P0 3090 LET B5=Z/R 3100 LET L5=(ATN (B5/(SQR (1-B5*B5))))*57.3 3140 LET W5=(ATN (Y/X))*57.3 3150 IF X<0 THEN LET W5=180-W5 3160 IF X>0 AND Y<0 THEN LET W5=-W5 3170 IF X>0 AND Y>0 THEN LET W5=360-W5 3180 IF X=0 AND Y>=0 THEN LET W5=270 3190 IF X=0 AND Y<0 THEN LET W5=90 3220 IF X8<0 THEN LET A9=A9+180 3230 IF X8>0 AND Y8<0 THEN LET A9=360+A9 3240 IF X8=0 AND Y8>=0 THEN LET A9=90 3250 IF X8=0 AND Y8<0 THEN LET A9=270 3300 GO SUB 6710 3310 LET A9=INT (A9+.5): LET E9=INT (E9+.5) 3320 DIM Y$(34): LET Y$( TO 6+LEN STR$ A9)="Az="+STR$ A9+"\a": LET Y$(11 TO 14+LEN STR$ E9)="El="+STR$ E9+"\a": LET Y$(21 TO )="Stat.: "+J$ 3325 PRINT AT 21,0;Y$ 3330 LET W5=INT (W5+.5): LET L5=INT (L5+.5) 3335 DIM Z$(34): LET Z$( TO 10+LEN STR$ W5)="SSP: L="+STR$ W5+"\a": LET Z$(15 TO 17+LEN STR$ L5)="B="+STR$ L5+"\a": LET Z$(22 TO )="Sat.: "+F$ 3340 PRINT #1;AT 0,0;Z$ 3341 LET XALT=XPOS: LET YALT=YPOS: IF XALT<0 OR XALT>255 OR YALT<8 OR YALT>167 THEN LET XALT=254: LET YALT=174 3342 LET YPOS=(L5+60)*16/14+7.5: IF W5>180 THEN LET W5=180-W5 3343 IF W5>=0 THEN LET XPOS=114.5-W5*0.88757143 3344 IF W5<0 THEN LET XPOS=114.5+(180+W5)*0.88757143 3345 IF XPOS<0 OR XPOS>255 OR YPOS<8 OR YPOS>167 THEN POKE 63826,255: POKE 63827,0: GO TO 3400 3360 POKE 63826,XPOS: POKE 63827,(175-YPOS) 3400 RANDOMIZE USR 63702: PLOT BRIGHT 1;XALT,YALT 3430 IF NOT FLAG THEN LET FLAG=1: GO TO 3480 3440 IF NOT ZEITRAFF THEN LET V=(SR1-R5)/15: IF V=0 THEN LET V=.0001 3445 IF ZEITRAFF THEN LET V=(SR1-R5)/120: IF V=0 THEN LET V=.0001 3450 LET DS4=RSF/(300000/V-1) 3460 GO SUB 4000 3470 LET T$="Dist.: "+K$ 3475 IF RSF THEN LET T$=T$+"Beac: "+R$ 3476 BRIGHT 0: PRINT #1;AT 1,0;T$ 3489 LET SR1=R5 3490 IF INKEY$<>"" THEN PRINT #1;AT 1,0;" Fast-Clock Protokoll End Copy ": GO TO 3500 3491 IF PROTOKOLL AND (SZEIT=0 OR ZEITRAFF) AND E9>=-2 THEN LPRINT : LPRINT D$+" "+H$( TO 6)+"00 "+Y$( TO 19): LPRINT Z$( TO 21)+" "+T$() 3492 IF PROTOKOLL AND (SZEIT=48 AND NOT ZEITRAFF) AND E9>=-2 THEN LPRINT : LPRINT D$+" "+H$( TO 6)+"30 "+Y$( TO 19): LPRINT Z$( TO 21)+" "+T$() 3493 IF (PEEK 63675=0) AND (NOT TAGFLAG) THEN GO SUB 4500 3494 IF PEEK 63675<>0 THEN LET TAGFLAG=0 3495 IF XPOS<245 THEN LET GELOESCHT=0 3496 IF NOT ZEITRAFF THEN LET SZEIT=PEEK 63677: IF SZEIT<>0 AND SZEIT<>21 AND SZEIT<>48 AND SZEIT<>69 THEN GO TO 3496 3497 IF ZEITRAFF THEN LET SZEIT=PEEK 63676: IF (SZEIT/2)<>INT (SZEIT/2) THEN GO TO 3497 3498 IF (XPOS>245 AND XPOS<265) AND NOT GELOESCHT THEN LET GELOESCHT=1: GO TO 2000 3499 GO TO 2040 3500 REM Untermenue 3505 PAUSE 0: LET I$=INKEY$ 3510 IF I$="F" OR I$="f" THEN GO TO 3600 3520 IF I$="P" OR I$="p" THEN GO TO 3800 3530 IF I$="E" OR I$="e" THEN GO TO 3700 3540 IF I$="C" OR I$="c" THEN PRINT #1;AT 1,0;T$: POKE 23326,2: POKE 23325,3: POKE 23345,-16: COPY /: GO TO 3491 3550 GO TO 3505 3600 REM Zeitraffer 3610 IF ZEITRAFF=0 THEN LET ZEITRAFF=1: LET FLAG=NOT PI: POKE 63604,199: POKE 63493,5: PRINT #1;AT 1,0;T$: GO TO 3491 3620 IF ZEITRAFF=1 THEN LET ZEITRAFF=NOT PI: POKE 63604,71: POKE 63493,50: PRINT #1;AT 1,0;T$: GO TO 3491 3700 REM NEUSTART 3710 FOR I=1 TO 8: POKE (64000+I ),CODE (D$(I)): NEXT I 3720 POKE 63604,71: POKE 63493,50: CLEAR 3730 DIM D$(8): FOR I=1 TO 8: LET D$(I)=CHR$ (PEEK (64000+I)): NEXT I 3740 GO SUB 8400 3799 GO TO 5 3800 REM PROTOKOLL 3810 IF PROTOKOLL=1 THEN LET PROTOKOLL=NOT PI: PRINT #1;AT 1,0;" PROTOKOLL OFF",: GO TO 3491 3820 IF PROTOKOLL=0 THEN LET PROTOKOLL=1: PRINT #1;AT 1,0;" PROTOKOLL ON",: LPRINT : LPRINT "Objekt: ";G$ 3830 GO TO 3491 4000 REM DOPPLER-FORMATIEREN 4001 IF W5<0 THEN LET W5=ABS (W5)+180 4002 LET DIF=ABS (W5-W9): IF DIF>180 THEN LET DIF=360-DIF 4004 LET DZ1=(SIN (L9*P0))*(SIN (L5*P0))+(COS (L9*P0))*(COS (L5*P0))*(COS (DIF*P0)) 4006 LET DZ1=57.3*(-ATN (DZ1/SQR (1-DZ1*DZ1))+P1/2) 4008 LET KM=111.31989*DZ1 4010 LET KM=INT KM: LET K$=STR$ (KM)+"km " 4015 IF LEN K$<8 THEN LET K$=" "+K$: GO TO 4015 4020 IF RSF>=1000000 THEN GO TO 4100 4030 LET FREQ=INT ((DS4+RSF)*10)/10 4040 LET R$=STR$ (FREQ)+"KHz" 4050 GO TO 4200 4100 LET FREQ=(INT ((DS4+RSF)/100))/10000 4110 LET R$=STR$ (FREQ)+"MHz" 4200 IF LEN R$<11 THEN LET R$=" "+R$: GO TO 4200 4210 RETURN 4500 REM KALENDER 4505 LET DM=DM+1 4510 IF MN=1 AND DM>31 THEN LET MN=2: LET DM=1 4515 IF MN=2 AND DM>28 THEN LET MN=3: LET DM=1 4520 IF MN=3 AND DM>31 THEN LET MN=4: LET DM=1 4525 IF MN=4 AND DM>30 THEN LET MN=5: LET DM=1 4530 IF MN=5 AND DM>31 THEN LET MN=6: LET DM=1 4535 IF MN=6 AND DM>30 THEN LET MN=7: LET DM=1 4540 IF MN=7 AND DM>31 THEN LET MN=8: LET DM=1 4545 IF MN=8 AND DM>31 THEN LET MN=9: LET DM=1 4550 IF MN=9 AND DM>30 THEN LET MN=10: LET DM=1 4555 IF MN=10 AND DM>31 THEN LET MN=11: LET DM=1 4560 IF MN=11 AND DM>30 THEN LET MN=12: LET DM=1 4565 IF MN=12 AND DM>31 THEN LET MN=1: LET DM=1: LET YN=YN+1 4600 IF DM<10 THEN LET D$( TO 3)="0"+STR$ (DM)+"." 4610 IF DM>9 THEN LET D$( TO 3)=STR$ (DM)+"." 4620 IF MN<10 THEN LET D$(4 TO 6)="0"+STR$ (MN)+"." 4630 IF MN>9 THEN LET D$(4 TO 6)=STR$ (MN)+"." 4640 LET D$(7 TO )=STR$ (YN) 4645 LET TAGFLAG=1: PRINT AT 0,15; INVERSE 1; BRIGHT 0;D$ 4650 RETURN 5000 REM UHR STELLEN 5010 CLS : PRINT "Adjustment of the Clock" 5020 LET GROB=PEEK 63522: LET FEIN=PEEK 63545 5030 PRINT '"Changes:" 5100 PRINT AT 7,0;"Coarse adjustment:" 5110 PRINT " ";(6-INT (GROB*12)/10);" seconds per hour" 5200 PRINT '"Fine adjustment:" 5210 PRINT " ";(0.08-INT (FEIN*2)/100);" seconds per hour" 5300 PRINT AT 15,13;"Coarse" 5310 PRINT "1...faster","2...slower" 5330 PRINT AT 18,13;"Fine" 5340 PRINT "9...faster","0...slower" 5350 PRINT AT 21,5;"Spacebar = End" 5400 PAUSE 0: LET I$=INKEY$ 5410 IF I$="2" AND GROB<255 THEN POKE 63522,(GROB+1) 5420 IF I$="1" AND GROB>0 THEN POKE 63522,(GROB-1) 5430 IF I$="0" AND FEIN<255 THEN POKE 63545,(FEIN+1) 5440 IF I$="9" AND FEIN>0 THEN POKE 63545,(FEIN-1) 5450 IF I$=" " THEN GO TO 9999 5490 GO TO 5000 5495 PRINT AT 21,0;"Please enter Choise ": LET CHh=CODE INKEY$-48: RETURN 6000 REM Hauptmenue 6001 PAPER NOT PI: BORDER NOT PI: INK 7: BRIGHT NOT PI: CLS 6005 PRINT " SATELLITE-GROUP" 6010 PRINT AT 4,4;"1. OSCAR 9-12" 6020 PRINT '" 2. RS-Satelliten" 6030 PRINT '" 3. Weathersatellite" 6040 PRINT '" 4. Space-Shuttle/-Station" 6050 PRINT '" 5. News" 6055 GO SUB 5495: LET ch0=chh 6060 IF CH0<1 OR CH0>5 THEN GO TO 6055 6065 CLS : FOR N=1 TO 40: NEXT N 6070 LET RSF=NOT PI: LET GELOESCHT=NOT PI: POKE 63826,254: POKE 63827,0: RANDOMIZE USR 63702 6090 GO TO (6000+CH0*100) 6100 REM OSCAR 6110 PRINT AT 0,4;"OSCAR-Satellites" 6120 PRINT AT 4,4;"1...OSCAR 9" 6130 PRINT '" 2...OSCAR 10" 6140 PRINT '" 3...OSCAR 11" 6150 PRINT '" 4...JAS 1 (OSCAR 12)" 6170 GO SUB 5495: LET ch2=chh 6180 IF CH2<1 OR CH2>4 THEN GO TO 6170 6190 GO TO (9100+CH2*10) 6200 REM RS 6210 PRINT AT 0,4;"RS-Satellites" 6220 PRINT AT 4,4;"1...RS 5" 6230 PRINT '" 2...RS 7" 6240 PRINT '" 3...RS 8" 6270 GO SUB 5495: LET ch2=chh 6280 IF CH2<1 OR CH2>3 THEN GO TO 6270 6290 GO TO (9200+CH2*10) 6300 REM Wettersatelliten 6310 PRINT AT 0,4;"Weathersatellites" 6320 PRINT AT 4,4;"1...NOAA 6" 6330 PRINT '" 2...NOAA 7" 6340 PRINT '" 3...NOAA 8" 6345 PRINT '" 4...NOAA 9" 6350 PRINT '" 5...METEOR 2-10" 6355 PRINT '" 6...METEOR 2-11" 6370 GO SUB 5495: LET ch2=chh 6380 IF CH2<1 OR CH2>6 THEN GO TO 6370 6390 GO TO (9300+CH2*10) 6400 REM Shuttle/Salyut 6410 PRINT AT 0,2;"Space-Shuttle/-Station" 6420 PRINT AT 4,4;"1...Shuttle (Aequator)" 6430 PRINT '" 2...Shuttle (50\a Inkl.)" 6440 PRINT '" 3...Shuttle (Polar)" 6450 PRINT '" 4...MIR" 6460 PRINT '" 5...Salyut 7" 6470 GO SUB 5495: LET ch2=chh 6480 IF CH2<1 OR CH2>5 THEN GO TO 6470 6490 GO TO (9400+CH2*10) 6500 REM Aktuell 6510 LET CH2=1 6590 GO TO (9500+CH2*10) 6700 REM Sonne/Schatten 6710 LET YS=YN: LET MS=MN 6715 IF MN<3 THEN LET YS=YN-1: LET MS=MN+12 6720 LET JA=INT (YS/100): LET JB=2-JA+INT (JA/4) 6725 LET JD=INT (365.25*YS)+INT (30.6001*(MS+1))+T-(INT T)+DM+1720994.5+JB 6730 LET JE=INT (365.25*YS)+INT (30.6001*(MS+1))+DM+1720994.5+JB 6735 LET TJ=(JD-2415020)/36525 6740 LET TE=(JE-2415020)/36525 6745 LET SD=.2769194+100.00214*TE+1.075E-06*TE*TE 6750 LET SD=(SD-(INT SD))*24 6755 LET SD=SD+(T-(INT T))*24.06571 6760 IF SD>24 THEN LET SD=SD-24 6765 LET LT=SD+(-W9/15) 6770 LET LT=LT+24*(LT<0)-24*(LT>24) 6775 LET WS=279.69668+36000.76892*TJ+.0003025*TJ*TJ 6780 LET WS=(WS/360-INT (WS/360))*360 6785 LET MU=358.47583+35999.04975*TJ-.00015*TJ*TJ-.0000033*TJ*TJ*TJ 6790 LET MU=(MU/360-INT (MU/360))*360 6810 LET RO=1.675104E-02-.0000418*TJ-1.26E-07*TJ*TJ 6815 LET CS=(1.91946-.004789*TJ-.000014*TJ*TJ)*SIN (MU*P1/180)+(.020094-.0001*TJ)*SIN (MU*P1/90)+.000293*SIN (MU*P1/60) 6820 LET WT=WS+CS 6825 LET LR=WT+180 6830 IF WT>180 THEN LET LR=WT-180 6835 LET NS=MU+CS 6840 LET UP=SIN (WT*P1/180)*0.91746859 6845 LET DW=COS (WT*P1/180) 6850 LET RS=ATN (UP/DW)*180/P1 6855 IF UP>0 AND DW>0 THEN LET RS=RS 6860 IF UP>0 AND DW<0 THEN LET RS=RS+180 6865 IF UP<0 AND DW>0 THEN LET RS=RS+360 6870 IF UP<0 AND DW<0 THEN LET RS=RS+180 6875 LET RS=RS/15 6880 LET HS=(LT-RS)*15 6885 LET DC=.39780824*SIN (WT*P1/180) 6890 LET DC=ATN (DC/SQR (1-DC*DC))*180/P1 6900 LET LOM=HS+W9 6905 LET LOM=LOM+(LOM<0)*360-(LOM>360)*360 6908 LET RE=(149674000*(1.0000002*(1-RO*RO)/(1+RO*COS (NS*P1/180)))) 6910 LET DZ2=ACS (R0/RE) 6915 LET SLAT=DC*P1/180 6920 LET DZ2=DZ2+ACS (R0/R) 6930 LET ZA4=ABS (LOM-W5): IF ZA4>180 THEN LET ZA4=ABS (360-ZA4) 6935 LET ZA5=ABS (LOM-W9): IF ZA5>180 THEN LET ZA5=ABS (360-ZA5) 6940 LET DZ3=ACS (SIN (L5*P1/180)*SIN SLAT+COS (L5*P1/180)*COS SLAT*COS (ZA4*P1/180)) 6945 LET DZ4=ACS (SIN (L9*P1/180)*SIN SLAT+COS (L9*P1/180)*COS SLAT*COS (ZA5*P1/180)) 6950 LET STOS=SQR (R*R+RE*RE-2*R*RE*COS DZ3) 6955 LET J$="Sun ": IF DZ4>(DZ2-(ACS (R0/R))) THEN LET J$="Shadow" 6960 LET INSOL=(ASN ((RE*SIN DZ3)/STOS))*180/P1 6970 IF DZ3<(P1/2) THEN LET INSOL=180-INSOL 6980 LET FO=NOT PI: IF DZ3>=DZ2 THEN LET FO=1 6985 LET F$="Sun " 6988 IF DZ3>DZ2 THEN LET F$="Shadow " 6999 RETURN 8000 REM Uhr & Datum stellen 8010 PAPER NOT PI: BORDER NOT PI: INK 7: CLS 8020 PRINT " Adjust hour and date" 8030 PRINT AT PI,0;"Date of observation","Date (DD.MM.YY): "; 8040 INPUT "Please enter date: ";I$ 8042 IF LEN I$=0 AND LEN D$<>0 THEN GO TO 8050 8043 IF LEN I$<>8 THEN GO TO 8040 8045 DIM D$(8): LET D$=I$ 8050 LET DM=VAL D$( TO 2): IF DM<1 OR DM>31 THEN GO TO 8040 8060 LET MN=VAL D$(4 TO 5): IF MN<1 OR MN>12 THEN GO TO 8040 8070 LET YN=VAL D$(7 TO 8): IF YN<84 THEN GO TO 8040 8080 PRINT D$ 8100 PRINT AT 7,0;"Time of observation","Time (HH.MM.SS): "; 8105 INPUT "Please enter time: ";I$ 8110 IF I$="" THEN GO SUB 8400: PRINT H$: GO TO 8300 8115 LET H$=I$: IF LEN I$<>8 THEN GO TO 8105 8120 LET HH=VAL H$( TO 2): IF HH<0 OR HH>23 THEN GO TO 8110 8130 LET MI=VAL H$(4 TO 5): IF MI<0 OR MI>59 THEN GO TO 8110 8140 LET A$=H$( TO 2)+H$(4 TO 5) 8160 PRINT H$ 8170 POKE 63675,VAL H$(1)*16+VAL H$(2) 8180 POKE 63676,VAL H$(4)*16+VAL H$(5) 8190 POKE 63677,VAL H$(7)*16+VAL H$(8) 8300 RETURN 8400 REM AKTUELLE ZEIT LESEN 8410 DIM H$(8): LET H$(1)=STR$ (INT (PEEK 63675/16)) 8420 LET H$(2 TO 3)=STR$ (PEEK 63675-16*VAL (H$(1)))+":": LET H$(4)=STR$ (INT (PEEK 63676/16)): LET H$(5 TO 6)=STR$ (PEEK 63676-16*VAL (H$(4)))+":" 8430 LET H$(7)=STR$ (INT (PEEK 63677/16)): LET H$(8)=STR$ (PEEK 63677-16*VAL (H$(7))) 8450 RETURN 8500 REM Grad-Zeichen definieren 8505 RESTORE 8510: FOR f=0 TO 7 8510 READ aa: POKE USR "a"+f,aa 8520 DATA 24,36,aa,24,0,aa,aa,aa 8600 RETURN 9000 REM Satellitendaten 9010 REM G$=OBJEKTNAME 9011 REM Y2=JAHR 9012 REM T0=EPOCH ZEIT 9013 REM I0=INKLINATION 9014 REM K0=UMLAUFNUMMER 9015 REM M0=MEAN ANOMALY 9016 REM N0=MEAN MOTION 9017 REM E0=EXZENTRIZITAET 9018 REM W0=ARGUMENT DES PERIG. 9019 REM O0=RAAN 9020 REM RSF=BAKENFREQUENZ 9100 REM OSCAR 9110 REM OSCAR 9 9111 LET G$="OSCAR 9": LET Y2=86: LET T0=66.43480683: LET I0=97.6517: LET K0=24542: LET M0=282.9868: LET E0=.0004096: LET N0=15.28154898: LET W0=77.1959: LET O0=65.6189: LET RSF=145825000 9115 RETURN 9120 REM OSCAR 10 9121 LET G$="OSCAR 10": LET Y2=86: LET T0=62.88133564: LET I0=26.1922: LET K0=2049: LET M0=333.879: LET E0=.6005656: LET N0=2.05853397: LET W0=91.0093: LET O0=91.8901: LET RSF=145810000 9125 RETURN 9130 REM OSCAR 11 9131 LET G$="OSCAR 11": LET Y2=86: LET T0=66.75676743: LET I0=98.161: LET K0=10754: LET M0=244.347: LET E0=.0014126: LET N0=14.62032819: LET W0=115.9196: LET O0=135.0944: LET RSF=145826000 9135 RETURN 9140 REM JAS 1 9141 LET G$="JAS 1": LET Y2=86: LET T0=225.396462: LET I0=50.0082: LET K0=7: LET M0=442.0484: LET E0=.0011644: LET N0=12.44378049: LET W0=221.0709: LET O0=251.4714: LET RSF=435795000 9145 RETURN 9200 REM RS-SATELLITEN 9210 REM RS 5 9211 LET G$="RS 5": LET Y2=86: LET T0=67.18901475: LET I0=82.9555: LET K0=18570: LET M0=111.8447: LET E0=.0008304: LET N0=12.05051506: LET W0=248.1681: LET O0=161.5035: LET RSF=29450 9215 RETURN 9220 REM RS 7 9221 LET G$="RS 7": LET Y2=86: LET T0=59.66057011: LET I0=82.9628: LET K0=18535: LET M0=176.2727: LET E0=.0022375: LET N0=12.0869565: LET W0=183.8165: LET O0=159.6531: LET RSF=29501 9225 RETURN 9230 REM RS 8 9231 LET G$="RS 8": LET Y2=85: LET T0=274.03973838: LET I0=82.9531: LET K0=16636: LET M0=86.5464: LET N0=12.02955854: LET E0=.0017936: LET W0=273.3515: LET O0=250.3508: LET RSF=29502 9235 RETURN 9300 REM WETTERSATELLITEN 9310 REM NOAA 6 9311 LET G$="NOAA 6": LET Y2=84: LET T0=303.3457992: LET I0=98.5465: LET K0=27694: LET M0=340.1805: LET N0=14.24787164: LET E0=.0012461: LET W0=19.986: LET O0=325.1564: LET RSF=137500000 9315 RETURN 9320 REM NOAA 7 9321 LET G$="NOAA 7": LET Y2=85: LET T0=71.65806892: LET I0=99.0862: LET K0=19177: LET M0=298.9786: LET N0=14.13145626: LET E0=.0014132: LET W0=61.2798: LET O0=52.4364: LET RSF=137620000 9325 RETURN 9330 REM NOAA 8 9331 LET G$="NOAA 8": LET Y2=85: LET T0=306.13057229: LET I0=98.6532: LET K0=13497: LET M0=320.2196: LET N0=14.22476506: LET E0=.0017597: LET W0=40.0275: LET O0=335.4894: LET RSF=137500000 9335 RETURN 9340 REM NOAA 9 9341 LET G$="NOAA 9": LET Y2=86: LET T0=55.45565659: LET I0=98.9826: LET K0=6193: LET M0=251.6804: LET N0=14.11410499: LET E0=.0016327: LET W0=108.6136: LET O0=13.9014: LET RSF=137500000 9345 RETURN 9350 REM METEOR 2-10 9351 LET G$="METEOR 2-10": LET Y2=83: LET T0=328.6205573: LET I0=81.1627: LET K0=373: LET M0=172.872: LET N0=14.21513391: LET E0=.009535: LET W0=187.1111: LET O0=168.9035: LET RSF=137400000 9355 RETURN 9360 REM METEOR 2-11 9361 LET G$="METEOR 2-11": LET Y2=84: LET T0=325.2762071: LET I0=82.5329: LET K0=1907: LET M0=115.5296: LET N0=13.83455366: LET E0=.0011853: LET W0=244.4623: LET O0=254.0746: LET RSF=137300000 9365 RETURN 9400 REM RAUMFAEHRE/-STATION 9410 REM SHUTTLE AEQUATOR 9411 LET G$="SHUTTLE": LET Y2=84: LET T0=280.8534722: LET I0=27.2007: LET K0=23: LET M0=14.1415: LET N0=15.97849766: LET E0=.0010544: LET W0=346.2766: LET O0=73.828 9415 RETURN 9420 REM SHUTTLE 50\a 9421 LET G$="SHUTTLE": LET Y2=84: LET T0=281.84930555: LET I0=57.1942: LET K0=39: LET M0=17.6465: LET N0=16.16455877: LET E0=.0007995: LET W0=345.432: LET O0=69.1449 9425 RETURN 9430 REM SHUTTLE POLAR 9431 LET G$="SHUTTLE": LET Y2=84: LET T0=352.4229: LET I0=97: LET K0=55: LET M0=207.5436: LET N0=15.65978125: LET E0=.0008229: LET W0=152.4947: LET O0=330.3691 9435 RETURN 9440 REM MIR 9441 LET G$="MIR": LET Y2=86: LET T0=68.93390168: LET I0=51.6266: LET K0=286: LET M0=217.2731: LET N0=15.77905815: LET E0=.0005499: LET W0=142.8454: LET O0=27.1524: LET RSF=143625000 9445 RETURN 9450 REM SALYUT 7 9451 LET G$="SALYUT 7": LET Y2=85: LET T0=352.88110415: LET I0=51.6288: LET K0=0: LET M0=318.4556:: LET N0=15.720563652: LET E0=.000197: LET W0=41.6602: LET O0=82.9791: LET RSF=142420000 9455 RETURN 9500 REM AKTUELL 9510 LET G$="D1 Mission": LET Y2=85: LET T0=309.375: LET I0=56.98606: LET K0=89: LET M0=285.03636: LET N0=15.818037: LET E0=.00082953284: LET W0=317.773182: LET O0=168.307742: LET RSF=145550000 9550 RETURN 9999 CLEAR : SAVE "Sat-Bahn" LINE 1: SAVE "Sat-Bahn C"CODE 56000,9100: RUN 4 ```