Sat-Bahn is a satellite orbit tracking program that computes and displays the real-time ground track and visibility data for a selection of amateur, weather, and crewed spacecraft including OSCAR, RS, NOAA, METEOR, MIR, Salyut 7, and Space Shuttle. The program loads a companion machine code block (“Sat-Bahn C”) at address 56000 and relies on hardware clock routines accessed via PEEK at addresses 63675–63677 to obtain current time in BCD format. Orbital mechanics are handled entirely in BASIC using Keplerian two-line element parameters (inclination, RAAN, eccentricity, mean motion, argument of perigee, mean anomaly), with iterative Kepler’s equation solving at lines 2310–2370 and J2 nodal/apsidal precession corrections applied at line 2100. Doppler shift and beacon frequency display are computed from the slant-range rate, and a sun/shadow determination routine at lines 6700–6999 calculates solar declination and hour angle to classify the satellite and observer as illuminated or in shadow. A simple calendar rollover subroutine at lines 4500–4650 advances the date day-by-day without leap-year correction for February.
Program Structure
The program is organized into clearly delineated functional blocks, each announced by a REM header in inverse video. The top-level flow is: initialization (lines 1–8), date/time setup via GO SUB 8000, main menu (GO SUB 6000), satellite data selection (lines 9100–9550), and the main computation loop starting at line 2000. The main loop runs continuously, jumping back to line 2040 or 2000 depending on whether the satellite has crossed the display boundary.
- Lines 1–8: Initialization, machine code load, variable setup
- Lines 10–48: Date-to-Julian-day-number conversion subroutine
- Lines 1200–1308: Epoch validation, sidereal time calculation
- Lines 1500–1980: Physical constants, observer coordinates, orbital parameter setup
- Lines 2000–3499: Main orbit computation and display loop
- Lines 3500–3830: Submenu (fast-clock, protocol, end, copy)
- Lines 4000–4210: Doppler shift and distance formatting
- Lines 4500–4650: Calendar day rollover
- Lines 5000–5495: Clock adjustment utility
- Lines 6000–6999: Main and sub-menus; sun/shadow subroutine
- Lines 8000–8600: Time/date entry; clock read; UDG definition
- Lines 9000–9550: Satellite orbital element database and “News” entry
- Line 9999: Save routine
Machine Code Usage
A binary code block, “Sat-Bahn C”, is loaded at address 56000 via LOAD "Sat-Bahn C" CODE in line 3. Multiple entry points are called with RANDOMIZE USR:
| Address | Purpose |
|---|---|
| 63000 | Called at start of each main loop pass (line 2010) |
| 63679 | Called at initialization and start of loop; likely screen/map setup |
| 63702 | Satellite position plotting on the map (lines 3400, 6070) |
The machine code routine at 63702 is passed satellite screen coordinates via POKE 63826, XPOS and POKE 63827, (175-YPOS) immediately before the call. A sentinel value of 255 in POKE 63826 signals the routine that the satellite is off-screen. Clock data is read from BCD-encoded bytes at addresses 63675, 63676, and 63677 (hours, minutes, seconds). Speed adjustment for fast-clock mode is done by POKEing addresses 63604 and 63493. Address 63772 is used as a flag byte, set to 201 (RET instruction) to suppress a routine during initialization and cleared to 0 during the main loop.
Keplerian Orbit Propagation
The orbital model uses standard Keplerian elements stored per satellite: Y2 (epoch year), T0 (epoch day), I0 (inclination), O0 (RAAN), E0 (eccentricity), W0 (argument of perigee), M0 (mean anomaly), N0 (mean motion in rev/day), and K0 (revolution number). J2 secular perturbations are applied at line 2100: nodal regression to O and apsidal rotation to W using the precomputed constant K2.
Kepler’s equation is solved iteratively at lines 2250–2370. The initial estimate uses the two-term expansion E = M + E0*SIN(M) + 0.5*E0²*SIN(2M), then Newton–Raphson iteration refines it until ABS(M5) < 1E-6. The rotation from orbital plane to Earth-centered inertial (ECI) coordinates uses a 3×2 direction-cosine matrix C(3,2) (note: PI evaluates to 3 as an array index, giving effectively row 3). Greenwich Sidereal Time is computed from the Julian date at lines 2660–2670 and used to rotate ECI to Earth-fixed coordinates.
Observer and Visibility Calculations
The observer’s geocentric Cartesian coordinates (X9, Y9, Z9) are computed once at lines 1840–1850, accounting for Earth’s oblateness via the flattening parameter F = 1/298.25. The geodetic latitude is converted to geocentric using the standard approximation at line 1850. Azimuth (A9) and elevation (E9) are derived from the satellite-to-observer vector rotated into the local topocentric south-east-zenith frame using the observer’s latitude and longitude sines and cosines (lines 2980–3050). The sub-satellite point longitude (W5) and latitude (L5) are computed from the ECI position vector at lines 3090–3190, with careful quadrant correction.
Sun/Shadow and Doppler Subroutines
The sun/shadow subroutine (lines 6700–6999) implements a full solar position algorithm: it computes Julian Date, mean longitude, mean anomaly, equation of center, and the Sun’s right ascension and declination. It then checks whether the angular separation between the satellite and the anti-solar point exceeds the combined Earth-shadow cone half-angle, setting J$ (“Sun” or “Shadow”) for the satellite and F$ for the observer’s illumination state. Solar distance RE uses a full elliptical orbit formula including eccentricity variation (line 6908).
The Doppler subroutine (lines 4000–4210) computes the great-circle distance from observer to sub-satellite point using the haversine-style formula at line 4004, formats the slant range as kilometers, and applies the Doppler shift DS4 = RSF / (300000/V - 1) where V is the range rate in km/s derived from successive R5 values. Beacon frequencies below 1 MHz are formatted in kHz; those at or above 1 MHz are formatted in MHz.
Display and Map Projection
Lines 3342–3344 implement a simple cylindrical (equirectangular) map projection. The sub-satellite longitude is mapped to an X pixel coordinate with scale factor 0.88757143 pixels per degree, and latitude is mapped to Y with scale factor 16/14 pixels per degree offset by 7.5. The previous satellite position (XALT, YALT) is erased by the machine code at 63702 before the new position is plotted with PLOT BRIGHT 1. When the satellite position is off-map or near the right edge (XPOS > 245), a full screen redraw is triggered by jumping to line 2000.
Satellite Database
Orbital elements for 18 satellites are hardcoded in the 9100–9550 block. The beacon frequency RSF is set in Hz for each satellite (e.g., 145825000 for OSCAR 9). The Space Shuttle entries lack an RSF assignment, so RSF remains at its initialized value of NOT PI (0), which suppresses the Doppler display line via the IF RSF THEN guard at line 3475.
Notable Idioms and Techniques
NOT PIevaluates to 0 (since PI is non-zero, NOT PI = 0 in Sinclair BASIC), used pervasively as a readable zero initializer.- Array dimension
DIM C(PI,2)uses the numeric value ofPI(3) to create a 3×2 matrix for the direction-cosine rotation. - BCD clock decoding: hours/minutes/seconds bytes are split into high and low nibbles with
INT(PEEK/16)andPEEK - 16*INT(PEEK/16). - String-building with
DIM Y$(34)and fixed-offset slice assignment produces formatted output lines of fixed width for the status bar. - The submenu at line 3500 uses
PAUSE 0followed byINKEY$as the standard efficient keypress-wait idiom. - Computed
GO TOexpressions likeGO TO (6000+CH0*100)dispatch to satellite submenu sections without IF-chains. - The
SZEITsynchronization at lines 3496–3497 waits for specific second values (0, 21, 48, 69 in normal mode; even seconds in fast mode) to pace computation updates.
Bugs and Anomalies
- The calendar subroutine at lines 4510–4565 uses a fixed 28-day February with no leap-year check, causing a one-day error in leap years after February 28.
- Line 9451 (Salyut 7) contains a double colon
::beforeLET N0=..., which is syntactically valid (empty statement) but appears to be a typographical artifact. - Line 5495 is unreachable in normal flow (it follows
GO TO 9999at line 5450 with no other path), yet it is called as a subroutine from menu lines — it appears the line was intended to be a standalone input helper but its placement after the clock-adjust routine’s terminalGO TOmakes it dead code in that context; it is only reachable viaGO SUB 5495. - The
DATAstatement at line 8520 containsaaas literal data items, while the loop variable is also namedaa. TheREAD aaat line 8505 reads numeric values; the two occurrences ofaainside theDATAstatement are treated as variable references at parse time in Sinclair BASIC, meaning the UDG definition for the degree symbol will read the current value ofaa(the last value read) for those positions rather than fixed constants.
Source Code
1 REM \{20}\{1}Satellitenflugbahnen\{20}\{0}
2 REM \* 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 \{20}\{1}L9=Lat., W9=Long. West, H9=High\{20}\{0}
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;"\{18}\{1}ATTENTION !\{18}\{0}":PRINT "\{20}\{1}Kep. Elements old. than 2 months\{20}\{0}":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 \{20}\{1}INITIALISIERUNG\{20}\{0}
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 \{20}\{1}Berechnungsschleife\{20}\{0}
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)="\{20}\{1}Az="+ STR$ A9+"\a":LET Y$(11 TO 14+ LEN STR$ E9)="El="+ STR$ E9+"\a":LET Y$(21 TO )="Stat.: "+J$\{20}\{0}
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)="\{20}\{1}SSP: L="+ STR$ W5+"\a":LET Z$(15 TO 17+ LEN STR$ L5)="B="+ STR$ L5+"\a":LET Z$(22 TO )="Sat.: "+F$\{20}\{0}
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$="\{20}\{1}Dist.: "+K$\{20}\{0}
3475 IF RSF THEN LET T$=\{20}\{1}T$+"\{20}\{1}Beac: "+R$\{20}\{0}\{20}\{0}
3476 BRIGHT 0:PRINT #1; AT 1,0;T$
3489 LET SR1=R5
3490 IF INKEY$ <>"" THEN PRINT #1; AT 1,0;" \{20}\{1}F\{20}\{0}ast-Clock \{20}\{1}P\{20}\{0}rotokoll \{20}\{1}E\{20}\{0}nd \{20}\{1}C\{20}\{0}opy ":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 \{20}\{1}Untermenue\{20}\{0}
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 \{20}\{1}Zeitraffer\{20}\{0}
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 \{20}\{1}NEUSTART\{20}\{0}
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 \{20}\{1}PROTOKOLL\{20}\{0}
3810 IF PROTOKOLL=1 THEN LET PROTOKOLL= NOT PI:PRINT #1; AT 1,0;" \{20}\{1}PROTOKOLL OFF\{20}\{0}",:GO TO 3491
3820 IF PROTOKOLL=0 THEN LET PROTOKOLL=1:PRINT #1; AT 1,0;" \{20}\{1}PROTOKOLL ON\{20}\{0}",:LPRINT :LPRINT "Objekt: ";G$
3830 GO TO 3491
4000 REM \{20}\{1}DOPPLER-FORMATIEREN\{20}\{0}
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 \{20}\{1}KALENDER\{20}\{0}
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 \{20}\{1}UHR STELLEN\{20}\{0}
5010 CLS :PRINT "\{20}\{1}Adjustment of the Clock\{20}\{0}"
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;"\{20}\{1}Coarse\{20}\{0}"
5310 PRINT "1...faster","2...slower"
5330 PRINT AT 18,13;"\{20}\{1}Fine\{20}\{0}"
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 \{20}\{1}Hauptmenue\{20}\{0}
6001 PAPER NOT PI:BORDER NOT PI:INK 7:BRIGHT NOT PI:CLS
6005 PRINT " \{20}\{1}SATELLITE-GROUP\{20}\{0}"
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 \{20}\{1}OSCAR\{20}\{0}
6110 PRINT AT 0,4;"\{20}\{1}OSCAR-Satellites\{20}\{0}"
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 \{20}\{1}RS\{20}\{0}
6210 PRINT AT 0,4;"\{20}\{1}RS-Satellites\{20}\{0}"
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 \{20}\{1}Wettersatelliten\{20}\{0}
6310 PRINT AT 0,4;"\{20}\{1}Weathersatellites\{20}\{0}"
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 \{20}\{1}Shuttle/Salyut\{20}\{0}
6410 PRINT AT 0,2;"\{20}\{1}Space-Shuttle/-Station\{20}\{0}"
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 \{20}\{1}Aktuell\{20}\{0}
6510 LET CH2=1
6590 GO TO (9500+CH2*10)
6700 REM \{20}\{1}Sonne/Schatten\{20}\{0}
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 \{20}\{1}Uhr & Datum stellen\{20}\{0}
8010 PAPER NOT PI:BORDER NOT PI:INK 7:CLS
8020 PRINT " \{20}\{1}Adjust hour and date\{20}\{0}"
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 \{20}\{1}AKTUELLE ZEIT LESEN\{20}\{0}
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 \{20}\{1}Grad-Zeichen definieren\{20}\{0}
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 \{20}\{1}Satellitendaten\{20}\{0}
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 \{20}\{1}OSCAR\{20}\{0}
9110 REM \{20}\{1}OSCAR 9\{20}\{0}
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 \{20}\{1}OSCAR 10\{20}\{0}
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 \{20}\{1}OSCAR 11\{20}\{0}
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 \{20}\{1}JAS 1\{20}\{0}
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 \{20}\{1}RS-SATELLITEN\{20}\{0}
9210 REM \{20}\{1}RS 5\{20}\{0}
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 \{20}\{1}RS 7\{20}\{0}
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 \{20}\{1}RS 8\{20}\{0}
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 \{20}\{1}WETTERSATELLITEN\{20}\{0}
9310 REM \{20}\{1}NOAA 6\{20}\{0}
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 \{20}\{1}NOAA 7\{20}\{0}
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 \{20}\{1}NOAA 8\{20}\{0}
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 \{20}\{1}NOAA 9\{20}\{0}
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 \{20}\{1}METEOR 2-10\{20}\{0}
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 \{20}\{1}METEOR 2-11\{20}\{0}
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 \{20}\{1}RAUMFAEHRE/-STATION\{20}\{0}
9410 REM \{20}\{1}SHUTTLE AEQUATOR\{20}\{0}
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 \{20}\{1}SHUTTLE 50\a\{20}\{0}
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 \{20}\{1}SHUTTLE POLAR\{20}\{0}
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 \{20}\{1}MIR\{20}\{0}
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 \{20}\{1}SALYUT 7\{20}\{0}
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 \{20}\{1}AKTUELL\{20}\{0}
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.
