Satellite Orbits

Date: 1986
Type: Program
Platform(s): TS 2068
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:

AddressUsage
63000Called at line 2010 via RANDOMIZE USR 63000 — likely clears or resets the map display area
63679Called at lines 6 and 2010 via RANDOMIZE USR 63679 — probable screen or map initialization
63702Called at lines 3400 and 6070 via RANDOMIZE USR 63702 — plots the satellite position on the map using coordinates previously POKEd into 63826/63827
63826–63827POKEd with XPOS and 175-YPOS before calling 63702; act as parameter passing for the plot routine
63675–63677Real-time clock registers in BCD format: hours, minutes, seconds
63522, 63545Coarse and fine clock rate adjustment values
63604, 63493POKEd in fast-clock (time-lapse) mode to alter tick rate
63772POKEd 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

Content

Appears On

Related Products

Related Articles

Related Content

Image Gallery

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

Note: Type-in program listings on this website use ZMAKEBAS notation for graphics characters.

People

No people associated with this content.

Scroll to Top