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:
- Lines 1–8: Initialization, machine code load, variable setup, observer location
- Lines 10–48: Date/Julian day number setup subroutine
- Lines 1200–1980: Epoch validation, sidereal time, orbital constants, rotation matrix allocation
- Lines 2000–3499: Main orbital computation and display loop
- Lines 3500–3830: Sub-menu handling (fast clock, protocol/logging, restart, screen copy)
- Lines 4000–4210: Doppler shift formatting
- Lines 4500–4650: Calendar (day rollover) subroutine
- Lines 5000–5490: Real-time clock adjustment utility
- Lines 6000–6999: Main menu, satellite selection, and sun/shadow calculation
- Lines 8000–8600: Date/time entry, clock set, UDG definition
- Lines 9000–9550: Satellite Keplerian element data
- 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 factorK2=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 whenABS(M5) < 1E-6 - Construction of a 3×2 rotation matrix
C()from RAAN, argument of perigee, and inclination (lines 2140–2210), stored in aDIM C(PI,2)array — notably usingPI(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 thatPIevaluates to 3 in BASIC, creating a 3×2 matrix without using a numeric literalNOT PIis used throughout as a concise way to produce 0 (false), sinceNOTof 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
XPOScrosses 245–265 (off the right edge of the map) to trigger a display refresh viaGO TO 2000, preventing map artifacts - The epoch age warning at line 1250 compares current date against epoch date using the approximation
Y*366+dayand alerts if elements are more than 2 months old
Bugs and Anomalies
- Line 8520 DATA contains
aaas 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
::afterM0=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=-W5whenX>0 AND Y<0, which is inconsistent with the subsequent line 3170 - Line 5495 references variable
CHh(mixed case) but line 6055 readschh— on this platform variable names are case-insensitive in BASIC, so this is not a runtime error
Content
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.
