--- title: "Sat-Bahn" id: 71406 type: "computer_media" slug: "sat-bahn" url: "http://localhost/computer_media/sat-bahn/" markdown_url: "http://localhost/computer_media/sat-bahn.md" published_at: "2026-09-03T09:00:04+00:00" modified_at: "2026-09-03T09:00:04+00:00" author: "David Anderson" featured_image: url: "http://localhost/wp-content/uploads/2026/09/sat-bahn.png" excerpt: "A full Keplerian orbit propagator tracks real satellites in real time, computing azimuth, elevation, Doppler shift, and sun/shadow status for over a dozen spacecraft." category: - name: "Archived Media" slug: "archived-media" taxonomy: "category" url: "http://localhost/category/archived-media/" post_tag: - name: "1986" slug: "year-1986" taxonomy: "post_tag" url: "http://localhost/tag/year-1986/" - 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: "Ham Radio" slug: "ham-radio" taxonomy: "genre" url: "http://localhost/type/ham-radio/" media_type: "Program" download_url: "https://archive.org/download/timex-sinclair-software-archive/Sat-Bahn%20(1986)(-)(TS2068)(US)(Program).zip" mediadate: "1986" images: - url: "http://localhost/wp-content/uploads/2026/09/sat-bahn.png" media_type_tags: "Ham Radio" --- # Sat-Bahn 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 PI` evaluates 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 of `PI` (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)` and `PEEK - 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 0` followed by `INKEY$` as the standard efficient keypress-wait idiom. - Computed `GO TO` expressions like `GO TO (6000+CH0*100)` dispatch to satellite submenu sections without IF-chains. - The `SZEIT` synchronization 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 `::` before `LET 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 9999` at 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 terminal `GO TO` makes it dead code in that context; it is only reachable via `GO SUB 5495`. - The `DATA` statement at line 8520 contains `aa` as literal data items, while the loop variable is also named `aa`. The `READ aa` at line 8505 reads numeric values; the two occurrences of `aa` inside the `DATA` statement are treated as variable references at parse time in Sinclair BASIC, meaning the UDG definition for the degree symbol will read the current value of `aa` (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 ```