home *** CD-ROM | disk | FTP | other *** search
- ' ************************************
- ' * Program STSORBIT Version 9019 *
- ' ************************************
-
- ' by David H. Ransom, Jr.
- ' 7130 Avenida Altisima
- ' Rancho Palos Verdes, CA 90274
-
- ' Requires Microsoft QuickBASIC 4.50 or BASIC COMPILER 7.0:
-
- ' QB STSORBIT
-
- DECLARE SUB Center (Text$, Row%, Column%, Length%)
- DECLARE SUB ClearLine (LineNo%)
- DECLARE SUB UseColor (Colr%)
- DECLARE SUB WaitForKey (K$)
-
- DECLARE FUNCTION DMY2JD# (Day%, Month%, Year1%)
- DECLARE FUNCTION Get2$ (I%)
- DECLARE FUNCTION GetDate$ (Day%, Month%, Year%)
- DECLARE FUNCTION InputDMY# (Flag%, JulianDay#)
- DECLARE FUNCTION InputHMS# (Flag%)
- DECLARE FUNCTION JD2DMY$ (Day%, Month%, Year%, JD#, FracDay#)
- DECLARE FUNCTION LeapYear% (Y%)
- DECLARE FUNCTION Mod2PI# (X#)
- DECLARE FUNCTION Mod360# (Degrees#)
- DECLARE FUNCTION Mod86400# (T#)
- DECLARE FUNCTION String2$ (Value%, Lead$)
- DECLARE FUNCTION SystemDate# (Day%, Month%, Year%, DateString$)
- DECLARE FUNCTION SystemTime# (Hours%, Minutes%, Seconds%, TimeString$)
- DECLARE FUNCTION TimeStr$ (Seconds#, DDigits%, FormatFlag%, LeadZero$)
-
- DEFDBL A-Z
- COMMON SHARED ColorFlag%
-
- CONST PI# = 3.141592653589793#
- CONST TwoPI# = PI * 2#
- CONST HalfPI# = PI / 2#
- CONST Rad2Deg# = 180# / PI#
- CONST Deg2Rad# = 1# / Rad2Deg#
- CONST PlotInterval% = 10
- CONST MarkerInterval = 60
- 'CONST SpotsAhead% = 16200 / MarkerInterval
- 'CONST SpotsBehind% = 5400 / MarkerInterval
- CONST SpotsAhead% = 270
- CONST SpotsBehind% = 90
- CONST NSpots% = SpotsAhead% + SpotsBehind%
-
- REM $DYNAMIC
- DIM MLat%(8210), MLon%(8210)
- DIM Map%(36)
- DIM XSpots%(0 TO NSpots% - 1)
- DIM YSpots%(0 TO NSpots% - 1)
- DIM CSpots%(0 TO NSpots% - 1)
-
- CONST Mu# = 398601200000000#: ' Geocentric Gravitational Constant
- ' AA = 3.98600448E+14
- CONST ERadius# = 6378160: ' Equatorial Radius of Earth
- ' AA = 6378140 or 6378137 (IUGG)
- CONST ERadius2# = ERadius * ERadius / 1000000#
- CONST NM2SM# = 1.1516: ' Convert Nautical Miles to Statute Miles
- CONST SM2Ft# = 5280: ' Convert Statute Miles to Feet
- CONST Ft2M# = .3048006: ' Convert Feet to Meters
- CONST KM2NM# = .53898891695462#: 'Convert KM to NM
-
- ' ******************************
- ' * Initialize Printer Flags *
- ' ******************************
-
- PrintFlag% = -1
- Pages% = 0
- Lines% = 0
-
- ' ****************************
- ' * Determine Monitor Type *
- ' ****************************
-
- ' Overide monitor tests with command line options:
-
- ' /EGA = Force EGA or lower
- ' /CGA = Force CGA
-
- CommandLine$ = COMMAND$
-
- GetMonitor:
- IF INSTR(CommandLine$, "/EGA") <> 0 THEN GOTO TestEGA
- IF INSTR(CommandLine$, "/CGA") <> 0 THEN GOTO TestCGA
-
- TestVGA:
- UseColor -1
- ON ERROR GOTO NoVGA
- Monitor% = 3
- ScreenNum% = 12
- Aspect! = 1
- SCREEN 12
- WIDTH 80, 30
- ColorFlag% = 1
- Delay% = 30
- TRow% = 26
- GOTO LoadINI
-
- TestEGA:
- UseColor -1
- ON ERROR GOTO NoEGA
- Monitor% = 2
- ScreenNum% = 9
- Aspect! = .729
- SCREEN 9
- WIDTH 80, 25
- ColorFlag% = 1
- Delay% = 30
- TRow% = 21
- GOTO LoadINI
-
- TestEGA1:
- ON ERROR GOTO NoEGA1
- Monitor% = 1
- ScreenNum% = 8
- SCREEN 8
- WIDTH 80, 25
- UseColor 0
- ColorFlag% = 0
- Delay% = 60
- TRow% = 21
- GOTO LoadINI
-
- TestHGC:
- ON ERROR GOTO NoHGC
- Monitor% = 4
- ScreenNum% = 3
- SCREEN 3
- WIDTH 80, 25
- UseColor 0
- ColorFlag% = 0
- Delay = 60
- TRow% = 21
- GOTO LoadINI
-
- TestCGA:
- ON ERROR GOTO NoCGA
- Monitor% = 1
- ScreenNum% = 2
- SCREEN 2
- ON ERROR GOTO QBError
- WIDTH 80, 25
- UseColor 0
- ColorFlag% = 0
- Delay% = 60
- TRow% = 21
- GOTO LoadINI
-
- NoVGA: RESUME TestEGA
- NoEGA: RESUME TestEGA1
- NoEGA1: RESUME TestHGC
- NoHGC: RESUME TestCGA
- NoCGA: SCREEN 0
- PRINT CHR$(7)
- PRINT "Sorry, STSORBIT cannot recognize your monitor type ..."
- PRINT
- PRINT "If you are using a Hercules Graphics Card, run MSHERC first!"
- GOTO STSExit
-
- DataError:
- SCREEN 0
- CLS : PRINT CHR$(7)
- UseColor LtRed%
- Center "Cannot find file STSORBIT.DAT!", 5, 1, 80
- UseColor Yellow%
- Center "STSORBIT.DAT must be in the current disk/directory.", 8, 1, 80
- Center "Program STSORBIT is aborted!", 10, 1, 80
- UseColor LtWhite%: LOCATE 14, 1, 1, 5, 7
- PRINT "Press any key to return to DOS: ";
- WaitForKey (K$)
- SYSTEM
-
- QBError:
- UseColor LtRed%
- PRINT
- PRINT "QuickBASIC Error = "; ERR; CHR$(7);
- STSExit:
- PRINT
- PRINT "Press any key to return to DOS ..."
- WaitForKey (K$)
- SYSTEM
-
- ' ********************************
- ' * Load Last Run's Parameters *
- ' ********************************
-
- LoadINI:
- INIFile$ = "STSORBIT.INI"
- GOSUB LoadINI1
- GOTO LoadMap
-
- LoadINI1:
- IF Monitor% = 2 OR Monitor% = 3 THEN GridFlag% = 1 ELSE GridFlag% = 0
- DemoFlag% = 0
- AdjustFlag% = 0
- AdjustLongitude = 0
- AdjustTime = 0
- ON ERROR GOTO NoINI
- ININum% = FREEFILE
- OPEN "I", ININum%, INIFile$
- INPUT #ININum%, LastMission$
- INPUT #ININum%, LastOrbitTime, LastOrbitIncl
- INPUT #ININum%, LastLDate, LastLTime
- INPUT #ININum%, LastGridFlag%
- INPUT #ININum%, LastAdjustL, LastAdjustT
- ON ERROR GOTO OldINI
- INPUT #ININum%, NodeFlag%, TrackStn%
- CLOSE
- RETURN
-
- NoINI:
- LastMission$ = ""
- OldINI:
- CLOSE
- RESUME LoadMap
-
- ' ****************************
- ' * Load Map Coordinates *
- ' * (Courtesy Brian Jones) *
- ' ****************************
-
- ' See Brian Jones' program SUNMAP for an excellent display
- ' of sunlight/sunrise/sunset/night on the globe. SUNMAP is
- ' available on my BBS at (213) 541-7299.
-
- LoadMap:
- ON ERROR GOTO QBError
- SCREEN 0: LOCATE , , 0
- IF LoadFlag% = 1 THEN GOTO Begin
- SELECT CASE Monitor%
- CASE 3
- Equator% = 215
- VFactor! = 5
- Top% = 16
- CASE 2, 4
- Equator% = 155
- VFactor! = 3.5
- Top% = 16
- CASE ELSE
- Equator% = 90
- VFactor! = 2
- Top% = 8
- END SELECT
- Bottom% = 80 * VFactor! - 3
-
- GOSUB SetColors
- GOSUB ShowTitle
-
- IF LastMission$ <> "" THEN
- UseColor LtCyan%
- Center "Last Mission = " + LastMission$, 13, 1, 80
- END IF
-
- UseColor LtRed%
- Center "Loading STSORBIT Map Data", 15, 1, 80
- Center "Please wait ...", 17, 1, 80
- UseColor Cyan%
- Center "Percent processed = 00.0%", 19, 1, 80
- X% = POS(0)
- MapNum% = FREEFILE
- ON ERROR GOTO DataError
- OPEN "I", MapNum%, "STSORBIT.DAT"
- SFactor! = VFactor! / 4!
- N% = 1
- IF INSTR(CommandLine$, "/EUR") <> 0 THEN AdjMapLon% = 0 ELSE AdjMapLon% = 160
- IF INSTR(CommandLine$, "/EUR") <> 0 THEN AdjEUROPE% = 180 ELSE AdjEUROPE% = -90
- WHILE NOT EOF(MapNum%)
- K$ = INKEY$
- IF K$ = CHR$(27) THEN CLOSE : CLS : SYSTEM
- INPUT #MapNum%, MLO%, MLA%
- MLon%(N%) = (MLO% + AdjMapLon%) MOD 640
- MLat%(N%) = Equator% - (175 - MLA%) * SFactor!
- IF N% MOD 100 = 0 THEN
- Percent = N% / 82.1
- LOCATE 19, X% - 5
- PRINT USING "##.#"; Percent;
- END IF
- N% = N% + 1
- WEND
- CLOSE MapNum%
- ON ERROR GOTO QBError
- MPoints% = N% - 1
- Decay = 1#
- LoadFlag% = 1
- IF TrackStn% <> 1 THEN TrackStn% = -1
- IF Monitor% = 1 OR Monitor% = 4 THEN Blink% = 1 ELSE Blink% = -1
-
- ' ****************************
- ' * Select Program Options *
- ' ****************************
-
- Begin:
- SCREEN 0: LOCATE , , 0
- TitleFlag% = 0
- ShuttleColor% = LtWhite%
- CDays = 0
- CatchFlag% = 0
- WaitFlag% = 1
- STime$ = ""
- SDate$ = ""
- ANTime = 0
- ANDays = 0
- ANLongitude = 0
- ANOrbit = 0
- DNTime = 0
- DNDays = 0
- DNLongitude = 0
- DNOrbit = 0
- PriorCDate$ = ""
- PriorSDate$ = ""
- PriorANTime = 0
- PriorDNTime = 0
- PriorANTime$ = ""
- PriorDNTime$ = ""
- SqrMu = SQR(Mu)
- SqrMu1 = SQR(398601.2#)
-
- FOR N% = 0 TO 20: Map%(N%) = 0: NEXT
-
- SaveFlag% = 0
-
- IF INSTR(CommandLine$, "/RESUME") <> 0 AND Mission$ = "" THEN
- Option$ = "R"
- GOTO Wait1A
- END IF
-
- GOSUB ShowTitle1
-
- UseColor Cyan%: LOCATE 11, 1, 1
- PRINT TAB(17); "A Adjust orbital information B Blink shuttle symbol";
- PRINT TAB(17); "D STSORBIT Demonstration (STS-29) L Log to printer [OFF]";
- PRINT TAB(17); "E Enter new orbital information"
- PRINT TAB(17); "F Read data from named INI file"
- IF Monitor% <> 1 THEN
- GRow% = CSRLIN
- PRINT TAB(17); "G Toggle map GRID. [Grid is now ";
- UseColor LtGreen%
- IF GridFlag% = 0 THEN PRINT "OFF"; ELSE PRINT "ON";
- UseColor Cyan%
- PRINT "]"
- END IF
- PRINT TAB(17); "M Change MAP center [Center is now ";
- UseColor LtGreen%
- IF INSTR(CommandLine$, "/EUR") = 0 THEN
- PRINT "-90° = United States";
- ELSE
- PRINT "0° = Europe";
- END IF
- UseColor Cyan%
- PRINT "]"
- NodeRow% = CSRLIN
- PRINT TAB(17); "N Show most recent ascending & descending nodes [";
- UseColor LtGreen%
- IF NodeFlag% = 0 THEN PRINT "OFF"; ELSE PRINT "ON";
- UseColor Cyan%
- PRINT "]"
- IF LastMission$ <> "" THEN
- PRINT TAB(15); " R Resume previous STS mission: ";
- UseColor LtMagenta%
- PRINT LastMission$
- END IF
- UseColor Cyan%
- IF Monitor% <> 1 THEN
- TrackRow% = CSRLIN
- PRINT TAB(17); "T Display NASA Tracking Stations [";
- COLOR LtGreen%
- IF TrackStn% = 1 THEN PRINT "ON"; ELSE PRINT "OFF";
- UseColor Cyan%
- PRINT "]"
- END IF
- PRINT TAB(17); "S DOS Shell (CAUTION: DOS Version 3.x ONLY!)"
- PRINT TAB(15); "ESC Quit Program STSORBIT (save current mission)"
- PRINT TAB(12); "RETURN Resume current mission"
- UseColor Yellow%
- PRINT TAB(20); "Select the function desired: ";
- PriorCDate$ = ""
- Wait1:
- Option$ = INKEY$
- IF LEN(Option$) = 0 THEN
- CTime = SystemTime(H%, M%, Secs%, CTime$)
- CDate = SystemDate(Day%, Month%, Year%, CDate$)
- IF OldSecs% <> Secs% THEN
- OldSecs% = Secs%
- UseColor LtGreen%
- Center "Current time: " + CTime$, 8, 1, 80
- IF PriorCDate$ <> CDate$ THEN
- Center "Current date: " + CDate$, 9, 1, 80
- PriorCDate$ = CDate$
- END IF
- LOCATE , , 0
- END IF
- GOTO Wait1
- END IF
- PriorCDate$ = ""
- Option$ = UCASE$(Option$)
- Wait1A:
- SELECT CASE Option$
- CASE CHR$(27)
- IF DemoFlag% = 1 OR Mission$ = "" THEN CLS : SYSTEM
- ININum% = FREEFILE
- OPEN "O", ININum%, "STSORBIT.INI"
- WRITE #ININum%, Mission$
- WRITE #ININum%, OrbitTime, OrbitIncl
- WRITE #ININum%, LDate, LTime
- WRITE #ININum%, GridFlag%
- WRITE #ININum%, AdjustLongitude, AdjustTime
- WRITE #ININum%, NodeFlag%, TrackStn%
- CLOSE
- CLS
- SYSTEM
- CASE CHR$(13)
- IF Mission$ = "" THEN
- ClearLine 23
- UseColor LtRed%
- PRINT "No mission data! Use 'R' or 'E' command to load data."
- UseColor Yellow%
- PRINT "Press any key to continue ..."; CHR$(7);
- WaitForKey (K$)
- GOTO Begin
- END IF
- SCREEN ScreenNum%
- GOTO Restart
- CASE "A"
- GOTO Adjust
- CASE "B"
- Blink% = Blink% * -1
- GOTO Wait1
- CASE "D"
- DemoFlag% = 1
- SCREEN ScreenNum%
- GOTO Demo
- CASE "E"
- DemoFlag% = 0
- GOTO Manual
- CASE "F"
- GOSUB ShowTitle
- UseColor Yellow%
- LOCATE 17, 1
- PRINT "The following INI files are available:"
- UseColor White%
- FILES "*.INI"
- UseColor Cyan%
- LOCATE 15, 1
- PRINT "(If no filetype is given, .INI will be supplied automatically)";
- UseColor Green%
- LOCATE 14, 1
- PRINT "Enter INI Filename (RETURN=STSORBIT.INI): ";
- UseColor Yellow%
- LINE INPUT INIFile$
- IF INIFile$ = "" THEN INIFile$ = "STSORBIT.INI"
- IF INSTR(INIFile$, ".") = 0 THEN INIFile$ = INIFile$ + ".INI"
- GOSUB LoadINI1
- ON ERROR GOTO QBError
- GOTO ResumeOld
- CASE "G"
- IF Monitor% = 1 THEN GOTO Wait1
- IF GridFlag% = 0 THEN GridFlag% = 1 ELSE GridFlag% = 0
- LastGridFlag% = GridFlag%
- UseColor LtGreen%
- LOCATE GRow%, 50
- IF GridFlag% = 0 THEN PRINT "OFF"; ELSE PRINT "ON";
- UseColor Cyan%
- PRINT "] ";
- GOTO Wait1
- CASE "L"
- PrintFlag% = PrintFlag% * -1
- IF PrintFlag% = -1 THEN
- IF Pages% > 0 OR Lines% > 0 THEN LPRINT CHR$(12);
- Pages% = 0
- Lines% = 0
- LOCATE 12, 75
- UseColor Cyan%
- PRINT "OFF]";
- ELSE
- LOCATE 12, 75
- UseColor LtGreen%
- PRINT "ON";
- UseColor Cyan%
- PRINT "] ";
- NodeFlag% = 1
- LOCATE NodeRow%, 67
- UseColor LtGreen%
- PRINT "ON";
- UseColor Cyan%
- PRINT "] ";
- END IF
- GOTO Wait1
- CASE "M"
- IF INSTR(CommandLine$, "/EUR") = 0 THEN
- CommandLine$ = "/EUR"
- ELSE
- CommandLine$ = ""
- END IF
- LoadFlag% = 0
- GOTO LoadMap
- CASE "N"
- IF NodeFlag% = 0 THEN NodeFlag% = 1 ELSE NodeFlag% = 0
- LOCATE NodeRow%, 67
- UseColor LtGreen%
- IF NodeFlag% = 0 THEN PRINT "OFF"; ELSE PRINT "ON";
- UseColor Cyan%
- PRINT "] ";
- GOTO Wait1
- CASE "O"
- CLS
- LOCATE 3, 1
- PRINT "The Space Shuttle orbit decays approximately one nautical mile"
- PRINT "per day. The Decay Factor can be used to adjust for that factor."
- PRINT "You may enter values from 0.99 to 1.10"
- PRINT : PRINT
- PRINT USING "Decay Factor: ###.####"; Decay
- PRINT
- PRINT "Enter new DECAY or RETURN: ";
- LINE INPUT K$
- IF K$ = "" THEN GOTO Begin
- Decay = VAL(K$)
- IF Decay < .99 OR Decay > 1.1 THEN Decay = 1
- GOTO Begin
- CASE "R"
- ResumeOld:
- IF LastMission$ = "" THEN
- ClearLine 23
- UseColor LtRed%
- PRINT "No previously saved data! Use 'E' command to enter data."
- UseColor Yellow%
- PRINT "Press any key to continue ..."; CHR$(7);
- WaitForKey (K$)
- GOTO Begin
- END IF
- DemoFlag% = 0
- GridFlag% = LastGridFlag%
- Mission$ = LastMission$
- OrbitTime = LastOrbitTime
- OrbitIncl = LastOrbitIncl
- IF AdjustFlag% = 0 THEN
- AdjustLongitude = LastAdjustL
- AdjustTime = LastAdjustT
- END IF
- LDate = LastLDate
- LDate$ = JD2DMY$(Day%, Month%, Year%, LDate, FracDay)
- LTime = LastLTime
- LTime$ = TimeStr(LTime, 0, 1, "0")
- CTime = SystemTime(H%, M%, Secs%, CTime$)
- CDate = SystemDate(Day%, Month%, Year%, CDate$)
- Fast% = 1
- SCREEN ScreenNum%
- GOTO Restart
- CASE "S"
- SCREEN 0: CLS
- UseColor LtRed%
- PRINT "Enter 'EXIT' to return to STSORBIT"
- SHELL
- GOTO Begin
- CASE "T"
- IF Monitor% = 1 THEN GOTO Wait1
- TrackStn% = TrackStn% * -1
- UseColor LtGreen%
- LOCATE TrackRow%, 52
- IF TrackStn% = -1 THEN PRINT "OFF"; ELSE PRINT "ON";
- UseColor Cyan%
- PRINT "] ";
- GOTO Wait1
- CASE ELSE
- PRINT CHR$(7)
- GOTO Wait1
- END SELECT
-
- ' *************************************
- ' * Adjust Orbital Longitude & Time *
- ' *************************************
-
- Adjust:
- GOSUB ShowTitle
-
- IF Mission$ = "" THEN
- ClearLine 11
- UseColor LtRed%
- PRINT "No orbital data available! (Use E or R command)"
- LOCATE 12, 1
- UseColor Yellow%
- PRINT "Press any key to continue ..."
- WaitForKey (K$)
- GOTO Begin
- END IF
-
- UseColor Yellow%
- LOCATE 24, 3
- PRINT "Press RETURN to leave an item unchanged ...";
-
- LOCATE 13, 1
- UseColor Green%
- PRINT "Enter LAUNCH DATE (MM/DD/YYYY)";
- PRINT " ["; LDate$; "]: ";
- X% = POS(0)
- LOCATE 13, X%
- Temp = InputDMY(Flag%, CDate)
- IF Flag% > 0 THEN
- LDate = Temp
- LDate$ = JD2DMY$(Day%, Month%, Year%, LDate, FracDay)
- END IF
- UseColor Yellow%
- LOCATE 13, X%: PRINT LDate$
-
- UseColor Cyan%
- LOCATE 15, 3
- PRINT "[Use launch time corresponding to your LOCAL TIME]";
- UseColor Green%
- LOCATE 14, 1
- PRINT "Enter LAUNCH TIME (HH:MM:SS) ";
- PRINT "["; TimeStr$(LTime, 0, 1, "0"); "]: ";
- X% = POS(0)
- XTime = InputHMS(Flag%) * 3600
- IF Flag% <> 0 THEN LTime = XTime
- LOCATE 14, X%: UseColor Yellow%
- PRINT TimeStr$(LTime, 0, 1, "0")
- ClearLine 15
-
- UseColor Cyan%
- LOCATE 16, 3
- PRINT "[Add 'km' for altitude in kilometers.]";
- UseColor Green%
- LOCATE 15, 1
- PRINT "Enter ORBITAL ALTITUDE (nm) ";
- GOSUB ConvOrbitTime
- PRINT USING "[####.##]: "; OrbitAlt;
- X% = POS(0)
- LINE INPUT "", K$
- K$ = UCASE$(K$)
- IF LEN(K$) > 0 THEN
- OrbitAlt = VAL(K$)
- IF INSTR(K$, "K") THEN OrbitAlt = OrbitAlt * KM2NM
- GOSUB ConvOrbitAlt
- OrbitTime = OrbitTime * 60#
- END IF
- GOSUB ConvOrbitTime
- LOCATE 15, X%: UseColor Yellow%
- PRINT USING "#####.## nm"; OrbitAlt;
- PRINT USING " (#####.## km)"; OrbitAlt / KM2NM;
- ClearLine 16
-
- UseColor Green%
- LOCATE 16, 1
- PRINT "Enter LONGITUDE adjust (deg) ";
- PRINT USING "[####.###]: "; AdjustLongitude;
- X% = POS(0)
- LINE INPUT "", K$
- IF LEN(K$) > 0 THEN AdjustLongitude = VAL(K$)
- LOCATE 16, X%: UseColor Yellow%
- PRINT USING "####.###"; AdjustLongitude;
-
- UseColor Green%
- LOCATE 17, 1
- PRINT "Enter TIME adjust (min) ";
- PRINT USING "[###.###]: "; AdjustTime / 60#;
- X% = POS(0)
- LINE INPUT K$
- IF LEN(K$) > 0 THEN
- AdjustTime = VAL(K$)
- AdjustTime = AdjustTime * 60#
- END IF
- LOCATE 17, X%: UseColor Yellow%
- PRINT USING "####.###"; AdjustTime / 60#;
-
- ClearLine 24
- UseColor Yellow%
- LOCATE 21, 1
- PRINT "Press RETURN to accept data, any other key to start over: ";
- Adjust1:
- K$ = INKEY$
- IF LEN(K$) = 0 THEN GOTO Adjust1
- IF K$ <> CHR$(13) THEN GOTO Adjust
-
- AdjustFlag% = 1
- SCREEN ScreenNum%
- GOTO Restart
-
- ' ***********************
- ' * Manual Data Entry *
- ' ***********************
-
- Manual:
- AdjustLongitude = 0
- AdjustTime = 0
- GOSUB ShowTitle1
- LOCATE 11, 1
- UseColor Green%
- PRINT "Enter mission title: ";
- X% = POS(0)
- INPUT "", Mission$
- Mission$ = UCASE$(Mission$)
- IF LEN(Mission$) > 23 THEN
- Mission$ = LEFT$(Mission$, 23)
- ClearLine 11
- UseColor Green%
- PRINT "Enter mission title: ";
- END IF
- IF Mission$ = "" THEN Mission$ = "STS Mission Simulation"
- UseColor Yellow%
- LOCATE 11, X%: PRINT Mission$
-
- Wait2:
- CTime = SystemTime(H%, M%, Secs%, CTime$)
- Center "Current time: " + CTime$, 8, 1, 80
- UseColor Cyan%
- LOCATE 13, 3
- PRINT "[Add 'km' for altitude in kilometers.]";
- UseColor Green%
- LOCATE 12, 1
- PRINT "Enter orbit altitude (nm): ";
- X% = POS(0)
- LINE INPUT "", OrbitAlt$
- IF OrbitAlt$ = "" THEN
- OrbitAlt = 160
- ELSE
- OrbitAlt$ = UCASE$(OrbitAlt$)
- OrbitAlt = VAL(OrbitAlt$)
- IF INSTR(OrbitAlt$, "K") THEN OrbitAlt = OrbitAlt * KN2NM
- END IF
- GOSUB ConvOrbitAlt
- UseColor Yellow%
- TOT = OrbitTime
- OrbitTime = TOT * 60
- GOSUB ConvOrbitTime
- OrbitTime = TOT
- LOCATE 12, X%
- PRINT USING "#####.## nm"; OrbitAlt;
- PRINT USING " (#####.## km)"; OrbitAlt / KM2NM;
- Wait3:
- CTime = SystemTime(H%, M%, Secs%, CTime$)
- Center "Current time: " + CTime$, 8, 1, 80
- ClearLine 13
- UseColor Green%
- PRINT "Enter orbit inclination (deg): ";
- X% = POS(0)
- LINE INPUT "", OrbitIncl$
- IF OrbitIncl$ = "" THEN OrbitIncl$ = "28.45"
- OrbitIncl = VAL(OrbitIncl$)
- UseColor Yellow%
- LOCATE 13, X%
- PRINT USING "####.### degrees"; OrbitIncl
- MaxIncl = 70
- IF OrbitIncl > MaxIncl THEN
- LOCATE 14, 1
- PRINT " Maximum inclination for this program is "; MaxIncl - 5; " degrees"
- PRINT CHR$(7)
- ClearLine 13
- GOTO Wait3
- END IF
-
- Wait4:
- CTime = SystemTime(H%, M%, Secs%, CTime$)
- CDate = SystemDate(Day%, Month%, Year%, CDate$)
- Center "Current time: " + CTime$, 8, 1, 80
- CDate = SystemDate(Day%, Month%, Year%, CDate$)
- LOCATE 14, 1
- UseColor Green%
- PRINT "Enter Launch Date (MM/DD/YYYY): ";
- X% = POS(0)
- UseColor Cyan%
- LOCATE 15, 2: PRINT "[or press RETURN for TODAY]";
- UseColor Green%
- LOCATE 14, X%
- LDate = InputDMY(TimeFlag%, CDate)
- LDate$ = JD2DMY$(Day%, Month%, Year%, LDate, FracDay)
- IF TimeFlag% = 0 THEN
- LDate = SystemDate(Day%, Month%, Year%, LDate$)
- END IF
- UseColor Yellow%
- LOCATE 14, X%: PRINT LDate$
-
- Wait5:
- CTime = SystemTime(H%, M%, Secs%, CTime$)
- Center "Current time: " + CTime$, 8, 1, 80
- LOCATE 15, 1
- UseColor Green%
- PRINT "Enter Launch Time (HH:MM:SS): ";
- X% = POS(0)
- UseColor Cyan%
- LOCATE 16, 2: PRINT "[or press RETURN for ASAP]";
- UseColor Green%
- LOCATE 15, X%
- LTime = InputHMS(TimeFlag%)
- LTime = LTime * 3600
- IF TimeFlag% = 0 THEN
- LTime = SystemTime(Hours%, Mins%, Secs%, LTime$) + Delay%
- END IF
- LTime$ = TimeStr(LTime, 0, 1, "0")
- UseColor Yellow%
- LOCATE 15, X%: PRINT LTime$
-
- Wait6:
- TTime = INT(SystemTime(Hours%, Mins%, Secs%, TTime$))
- IF CDate <> LDate OR TTime > LTime THEN GOTO Wait7
- CTime = SystemTime(H%, M%, Secs%, CTime$)
- Center "Current time: " + CTime$, 8, 1, 80
- UseColor Green%
- LOCATE 16, 1
- LINE INPUT "Normal or fast time (N,f): ", K$
- IF K$ = "" THEN K$ = "N"
- K$ = UCASE$(K$)
- SELECT CASE K$
- CASE "F"
- Fast% = 10
- CASE "N"
- Fast% = 1
- CASE ELSE
- PRINT CHR$(7)
- GOTO Wait6
- END SELECT
-
- Wait7:
- OrbitTime = OrbitTime * 60#
- SCREEN ScreenNum%
- GOTO Restart
-
- ' *************************************
- ' * Set Parameters for Program Demo *
- ' *************************************
-
- Demo:
- Duration = 0
- OrbitTime = 90# * 60#
- OrbitIncl = 28#
- Mission$ = "STS-29 Discovery (DEMO)"
- AdjustFlag% = 0
- AdjustLongitude = 0
- AdjustTime = 0
- Fast% = 1
- LTime = INT((SystemTime(Hours%, Mins%, Secs%, LTime$) + Delay%) / 10#) * 10#
- LDate = SystemDate(Day%, Month%, Year%, LDate$)
- CDate = LDate
-
- ' **********************************
- ' * Initialize Plot & Parameters *
- ' **********************************
-
- Restart:
- CLS : LOCATE 1, 1, 0
- LLongitude = -80.7#
- LLatitude = 28.47#
- RadiansPerSecond = TwoPI / OrbitTime
- GOSUB ConvOrbitTime
- IF OrbitIncl <= LLatitude THEN
- DeltaOrbit = HalfPI
- ELSE
- UseColor LtGreen%
- Center "Calculating Initial Launch Trajectory", 5, 1, 80
- UseColor LtRed%
- Center "Please wait ...", 8, 1, 80
- CLatitude = 0
- DeltaOrbit = 0
- CalcTime = 0
- IF Monitor% = 2 OR Monitor% = 3 THEN Delta = .005 ELSE Delta = .01
- WHILE CLatitude < LLatitude
- GOSUB CalcPosition
- DeltaOrbit = DeltaOrbit - Delta
- WEND
- CLS
- END IF
- Count = 0
-
- GOSUB ShowGrid
- GOSUB ShowMap
-
- ' Clear XSpots array
-
- FOR N% = 0 TO NSpots% - 1
- XSpots%(N%) = -1
- NEXT N%
-
-
- ' **********************************
- ' * Catch up if past launch time *
- ' **********************************
-
- Duration = AdjustTime
- WaitFlag% = 1
- TTime = INT(SystemTime(Hours%, Mins%, Secs%, TTime$))
- IF CDate < LDate OR (CDate = LDate AND TTime <= LTime) THEN
- GOSUB PlotPredicted
- GOSUB ShowTitles
- GOTO Sync1
- END IF
-
- CDays = CDate - LDate
- Duration = CDays * 86400# + TTime - LTime
- IF Duration > 7200# THEN
- Duration = Duration - 7200#
- ELSE
- Duration = 0
- END IF
- IF TTime - LTime < 0 THEN CDays = CDays - 1
-
- Duration = INT(Duration / 60#) * 60#
- STime = Mod86400(LTime + Duration)
- SDate = LDate + INT((LTime + Duration) / 86400)
-
- METime$ = TimeStr(Duration, 0, 1, "0")
- CTime$ = TimeStr(TTime, 0, 1, "0")
- STime$ = TimeStr(STime, 0, 1, "0")
- SDate$ = JD2DMY$(D%, M%, Y%, SDate, FracDay)
- CalcTime = Duration
- GOSUB CalcPosition
- GOSUB PlotPredicted
- WaitFlag% = 0
- GOSUB ShowTitles
-
- AddInterval% = MarkerInterval
- CatchFlag% = 1
- Fast% = 1
-
- CatchUp:
- K$ = UCASE$(INKEY$)
- IF K$ = CHR$(13) THEN GOTO Begin
- IF K$ = "P" THEN
- WHILE LEN(INKEY$) = 0: WEND
- END IF
- TTime = INT(SystemTime(Hours%, Mins%, Secs%, TTime$))
- IF CDate = SDate AND STime + 3 * AddInterval% > TTime THEN
- IF AddInterval% = PlotInterval% THEN AddInterval% = 1
- IF AddInterval% = MarkerInterval THEN AddInterval% = PlotInterval%
- END IF
-
- Duration = Duration + AddInterval%
- STime = STime + AddInterval%
- IF STime >= 86400# THEN
- CDays = CDays + 1
- SDate = SDate + 1
- STime = Mod86400(STime)
- END IF
- METime$ = TimeStr(Duration, 0, 1, "0")
- CTime$ = TimeStr(TTime, 0, 1, "0")
- STime$ = TimeStr(STime, 0, 1, "0")
- SDate$ = JD2DMY$(D%, M%, Y%, SDate, FracDay)
- CalcTime = Duration
- GOSUB CalcPosition
- GOSUB ShowData
- GOSUB DoPlot
-
- IF SDate = CDate AND STime >= TTime THEN
- CatchFlag% = 0
- CTime = SystemTime(H%, M%, Secs%, CTime$)
- CDate = SystemDate(Day%, Month%, Year%, CDate$)
- STime = CTime
- SDate = CDate
- CDays = CDate - LDate
- Duration = CTime - LTime + CDays * 86400#
- Fast% = 1
- GOTO Sync3
- END IF
- GOTO CatchUp
-
- ' **********************
- ' * Begin simulation *
- ' **********************
-
- Sync1:
- IF INKEY$ = CHR$(13) THEN GOTO Begin
- TTime = SystemTime(Hours%, Mins%, OldSecs%, TTime$)
- Sync2:
- TTime = SystemTime(Hours%, Mins%, Secs%, TTime$)
- IF Secs% = OldSecs% THEN GOTO Sync2
- IF CDate <> LDate OR TTime < LTime THEN
- CTime = SystemTime(H%, M%, OldSecs%, CTime$)
- CDate = SystemDate(Day%, Month%, Year%, CDate$)
- LTime$ = TimeStr(LTime, 0, 1, "0")
- METime$ = TimeStr(LTime - TTime, 0, 1, "0")
- GOSUB ShowData
- GOTO Sync1
- END IF
-
- Sync3:
- WaitFlag% = 0
- CalcTime = Duration
- GOSUB CalcPosition
- GOSUB ShowTitles
- GOSUB ShowData
- GOSUB DoPlot
- PRINT CHR$(7);
-
- ' ***********************
- ' * Main Program Loop *
- ' ***********************
-
- Recalculate:
- IF Blink% = -1 THEN GOTO Recal1
-
- ' Flash shuttle icon if CGA or HGC
-
- ChkTime = TIMER
- IF ChkTime - INT(ChkTime) < .2 AND SaveFlag% = 1 AND CatchFlag% = 0 THEN
- GOSUB RestoreMap
- DO
- WaitTime = TIMER - ChkTime
- LOOP UNTIL WaitTime > .3
- GOSUB DrawShuttle
- END IF
-
- Recal1:
- CTime = INT(SystemTime(Hours%, M%, Secs%, CTime$))
- CDate = SystemDate(Day%, Month%, Year%, CDate$)
- IF Secs% = OldSecs% THEN GOTO Recalculate
- OldSecs% = Secs%
- IF Hours% < OldHours% THEN
- CDays = CDays + 1
- END IF
- OldHours% = Hours%
- Duration = Duration + Fast%
- METime$ = TimeStr(Duration, 0, 1, "0")
- STime = LTime + Duration MOD 86400#
- STime$ = TimeStr(STime, 0, 1, "0")
- SDate = LDate + INT((LTime + Duration) / 86400#)
- SDate$ = JD2DMY$(D%, M%, Y%, SDate, FracDay)
- GOSUB DoPlot
-
- ' *******************************
- ' * Test for Operator Request *
- ' *******************************
-
- TestKeyboard:
- K$ = UCASE$(INKEY$)
- IF LEN(K$) = 0 THEN GOTO Recalculate
- SELECT CASE K$
- CASE CHR$(13)
- GOTO Begin
- CASE "B"
- Blink% = Blink% * -1
- CASE "C"
- CLS
- GOSUB ShowGrid
- GOSUB ShowMap
- GOSUB ShowTitles
- CASE "F"
- LOCATE TRow%, 70
- UseColor LtGreen%
- PRINT "MET";
- IF Fast% = 60 THEN
- Fast% = 1
- PRINT SPACE$(6);
- ELSEIF Fast% = 1 THEN
- Fast% = 10
- Duration = INT(Duration / 10!) * 10!
- UseColor LtRed%
- PRINT " (x10)";
- ELSE
- Fast% = 60
- Duration = INT(Duration / 60!) * 60!
- UseColor LtRed%
- PRINT " (x60)";
- END IF
- CASE "L"
- PrintFlag% = PrintFlag% * -1
- UseColor LtRed%
- IF PrintFlag% = 1 THEN
- LOCATE TRow% + 1, 77: PRINT "LOG";
- ELSE
- LOCATE TRow% + 1, 77: PRINT " ";
- END IF
- IF PrintFlag% = -1 THEN
- LPRINT CHR$(12);
- Pages% = 0
- Lines% = 0
- END IF
- GOTO TestKeyboard
- CASE "P"
- LOCATE TRow% + 4, 42
- UseColor LtMagenta%
- PRINT ">> PAUSE: Press any key ... << ";
- CTime = SystemTime(H%, M%, OldSecs%, CTime$)
- DO UNTIL LEN(INKEY$) <> 0
- CTime = SystemTime(H%, M%, Secs%, CTime$)
- CDate = SystemDate(Day%, Month%, Year%, CDate$)
- IF Secs% <> OldSecs% THEN
- OldSecs% = Secs%
- UseColor Yellow%
- LOCATE TRow% + 4, 17
- PRINT CDate$; SPACE$(2); CTime$;
- END IF
- LOOP
- LOCATE TRow% + 4, 42
- UseColor LtRed%
- PRINT ">> RETURN=STOP F=FAST P=PAUSE <<";
- CASE "R"
- STime = CTime
- SDate = CDate
- CDays = CDate - LDate
- Duration = CTime - LTime + CDays * 86400#
- Fast% = 1
- CASE ELSE
- 'PRINT CHR$(7);
- GOTO TestKeyboard
- END SELECT
- GOTO Recalculate
-
- ' ************************************
- ' * DoPlot: Plot Orbit and Shuttle *
- ' ************************************
-
- RestoreMap:
-
- ' Restore prior pixels (except first time)
-
- IF SaveFlag% = 0 THEN RETURN
- FOR N% = 0 TO 16
- PSET (MapLon% + N% - 8, MapLat%), Map%(N%)
- NEXT N%
- PSET (MapLon% - 8, MapLat% - 1), Map%(17)
- PSET (MapLon% - 9, MapLat% - 1), Map%(18)
- PSET (MapLon% - 9, MapLat% - 2), Map%(19)
- PSET (MapLon% - 10, MapLat% - 2), Map%(20)
- IF Monitor% = 1 THEN RETURN
- FOR N% = 0 TO 15
- PSET (MapLon% + N% - 7, MapLat% + 1), Map%(N% + 21)
- NEXT N%
- RETURN
-
- DrawShuttle:
-
- ' Draw shuttle symbol at current position
-
- FOR N% = 0 TO 16
- PSET (MapLon% + N% - 8, MapLat%), ShuttleColor%
- NEXT N%
- PSET (MapLon% - 8, MapLat% - 1), ShuttleColor%
- PSET (MapLon% - 9, MapLat% - 1), ShuttleColor%
- PSET (MapLon% - 9, MapLat% - 2), ShuttleColor%
- PSET (MapLon% - 10, MapLat% - 2), ShuttleColor%
- IF Monitor% = 1 THEN RETURN
- FOR N% = 0 TO 15
- PSET (MapLon% + N% - 7, MapLat% + 1), ShuttleColor%
- NEXT N%
- RETURN
-
- DoPlot:
- CalcTime = Duration
- GOSUB CalcPosition
- IF NodeFlag% = 1 THEN GOSUB CheckNodes
-
- IF Duration MOD PlotInterval% <> 0 THEN GOTO ShowNumbers
-
- GOSUB RestoreMap
-
- IF Duration MOD MarkerInterval <> 0 THEN GOTO ShowShuttle
-
- ' Change trailing spots from green to red
-
- IF Monitor% > 1 THEN
- N% = Count MOD NSpots%
- PSET (XSpots%(N%), YSpots%(N%)), LtRed%
- PSET (XSpots%(N%) + 1, YSpots%(N%)), LtRed%
- END IF
-
- ' Remove plotted orbit SpotsBehind back
-
- IF Count >= SpotsBehind% THEN
- N% = (Count - SpotsBehind%) MOD NSpots%
- PSET (XSpots%(N%), YSpots%(N%)), CSpots%(N%) AND &HF
- PSET (XSpots%(N%) + 1, YSpots%(N%)), (CSpots%(N%) AND &HF0) / 16
- END IF
-
- ' Plot predicted orbit SpotsAhead forward
-
- N% = (Count + SpotsAhead%) MOD NSpots%
- CalcTime = Duration + SpotsAhead% * MarkerInterval
- GOSUB CalcPosition
- OverWrite% = POINT(X%, Y%) + 16 * POINT(X% + 1, Y%)
- FOR M% = 1 TO SpotsAhead% - 1
- L% = (N% + M%) MOD NSpots%
- IF XSpots%(L%) = X% THEN
- IF YSpots%(L%) = Y% THEN
- OverWrite% = CSpots%(L%)
- EXIT FOR
- END IF
- END IF
- NEXT M%
- XSpots%(N%) = X%
- YSpots%(N%) = Y%
- CSpots%(N%) = OverWrite%
- PSET (X%, Y%), LtGreen%
- PSET (X% + 1, Y%), LtGreen%
- Count = Count + 1
- CalcTime = Duration
- GOSUB CalcPosition
-
- ShowShuttle:
-
- ' Save pixels under shuttle symbol
-
- SaveFlag% = 1
- FOR N% = 0 TO 16
- Map%(N%) = POINT(X% + N% - 8, Y%)
- NEXT N%
- Map%(17) = POINT(X% - 8, Y% - 1)
- Map%(18) = POINT(X% - 9, Y% - 1)
- Map%(19) = POINT(X% - 9, Y% - 2)
- Map%(20) = POINT(X% - 10, Y% - 2)
- IF Monitor% > 1 THEN
- FOR N% = 0 TO 15
- Map%(N% + 21) = POINT(X% + N% - 7, Y% + 1)
- NEXT N%
- END IF
-
- MapLon% = X% 'Save map coords for next time
- MapLat% = Y%
- GOSUB DrawShuttle
-
- 'CalcTime = Duration
- 'GOSUB CalcPosition
-
- ShowNumbers:
- METime$ = TimeStr(Duration, 0, 1, "0")
- GOSUB ShowData
- RETURN
-
- ' **********************************************
- ' * CalcPosition: Calculate Current Position *
- ' **********************************************
-
- CalcPosition:
- IF CalcTime > 10000 THEN
- CalcTime = CalcTime + AdjustTime
- ELSEIF CalcTime >= 480 THEN
- CalcTime = CalcTime + AdjustTime * CalcTime / 10000
- END IF
- IF CalcTime >= 480# THEN
- CalcTime = CalcTime - 240#
- TLongitude = LLongitude - 5#
- ELSE
- TLongitude = LLongitude - CalcTime / 96#
- CalcTime = CalcTime - SIN(CalcTime / 480# * HalfPI) * 240#
- END IF
- OrbitAngle = -CalcTime * RadiansPerSecond * Decay
- OLongitude = TLongitude - OrbitAngle * Rad2Deg
- CLongitude = OLongitude - (CalcTime - AdjustTime) / 3600# * 15# + AdjustLongitude
-
- ' Added code for J2 Perturbations
-
- K1 = ERadius2 * ((ERadius + OrbitAlt) / 1000#) ^ -3.5 * SqrMu1
- N1 = -1.5 * K1 * .001082616# * COS(OrbitIncl * Deg2Rad)
- N1 = N1 * Rad2Deg * CalcTime
- CLongitude = CLongitude + N1
-
- CLongitude = Mod360(CLongitude)
- IF CLongitude > 180# THEN CLongitude = CLongitude - 360#
- OrbitNum = INT(-(OrbitAngle + DeltaOrbit) / TwoPI * 100) / 100 + 1.5
- X% = Mod360(CLongitude + AdjEUROPE%) / 360 * 640
- CLatitude = SIN(OrbitAngle + DeltaOrbit) * OrbitIncl
- IF CalcTime < 30 * MarkerInterval AND LLatitude > OrbitIncl THEN
- LatFactor! = CalcTime / (30 * MarkerInterval)
- CLatitude = CLatitude + (1 - LatFactor!) * (LLatitude - OrbitIncl)
- END IF
- Y% = Equator% - CLatitude * VFactor! / 2
- RETURN
-
- CheckNodes:
- DeltaT = Duration - LDuration
- IF CLatitude - LLat = 0 THEN
- Ratio = 0
- ELSE
- Ratio = CLatitude / (CLatitude - LLat)
- END IF
- IF CLatitude >= 0 AND PLatitude < 0 THEN
- ANLongitude = CLongitude - (CLongitude - LLong) * Ratio
- ANTime = Duration - DeltaT * Ratio
- ANDays = INT(ANTime / 86400#)
- ANOrbit = OrbitNum
- PLatitude = CLatitude
- END IF
- IF CLatitude < 0 AND PLatitude >= 0 THEN
- DNLongitude = CLongitude - (CLongitude - LLong) * Ratio
- DNTime = Duration - DeltaT * Ratio
- DNDays = INT(DNTime / 86400#)
- DNOrbit = OrbitNum
- PLatitude = CLatitude
- END IF
- LLat = CLatitude
- LLong = CLongitude
- LDuration = Duration
- RETURN
-
- ' **********************************
- ' * ShowTitles: Show Data Titles *
- ' **********************************
-
- ShowTitles:
- TitleFlag% = 0
- UseColor Cyan%
- LOCATE TRow%, 1
- PRINT " Mission:"
- PRINT " Orbit:"
- PRINT " Launch Date:"
- PRINT " Simul Date:";
- LOCATE TRow% + 4, 1
- PRINT " Local Date:";
- LOCATE TRow%, 42: PRINT "Mission Time:";
- UseColor LtRed%
- LOCATE TRow% + 4, 42: PRINT ">> RETURN=STOP F=FAST P=PAUSE <<";
- IF WaitFlag% = 1 THEN RETURN
- UseColor Cyan%
- LOCATE TRow% + 1, 42: PRINT "Orbit Number:";
- LOCATE TRow% + 2, 42: PRINT "Longitude (deg):";
- LOCATE TRow% + 3, 42: PRINT "Latitude (deg):";
- UseColor LtRed%
- IF PrintFlag% = 1 THEN
- LOCATE TRow% + 1, 77: PRINT "LOG";
- ELSE
- LOCATE TRow% + 1, 77: PRINT " ";
- END IF
- RETURN
-
- ' ***********************************
- ' * ShowData: Update Current Data *
- ' ***********************************
-
- ShowData:
- UseColor Yellow%
- IF TitleFlag% = 1 THEN GOTO ShowData1
- LOCATE TRow%, 17: PRINT Mission$;
- LOCATE TRow% + 1, 17: PRINT USING "##.## deg"; OrbitIncl;
- 'PRINT USING " ###.## min"; OrbitTime / 60#;
- PRINT USING " #####.## nm"; OrbitAlt;
- LOCATE TRow% + 2, 17: PRINT LDate$; SPACE$(2); LTime$;
- UseColor LtGreen%
- LOCATE TRow%, 70: PRINT "MET";
- TitleFlag% = 1
- ShowData1:
- UseColor LtGreen%
- IF PriorSDate$ <> SDate$ THEN
- LOCATE TRow% + 3, 17
- PRINT SDate$;
- PriorSDate$ = SDate$
- END IF
- IF CatchFlag% = 1 THEN
- UseColor LtRed%
- ELSE
- UseColor LtGreen%
- END IF
- LOCATE TRow% + 3, 29: PRINT STime$;
- UseColor Yellow%
- IF PriorCDate$ <> CDate$ THEN
- LOCATE TRow% + 4, 17
- PRINT CDate$;
- PriorCDate$ = CDate$
- END IF
- LOCATE TRow% + 4, 29: PRINT CTime$;
- LOCATE TRow%, 57
- IF WaitFlag% = 0 OR CatchFlag% = 1 THEN
- MissionDay% = INT(Duration / 86400#)
- UseColor LtGreen%
- PRINT USING "###/"; MissionDay%;
- ELSE
- MissionDay% = CDate - LDate
- IF CTime > LTime THEN MissionDay% = MissionDay% + 1
- UseColor LtRed%
- IF MissionDay% <> 0 THEN
- PRINT USING "###/"; MissionDay%;
- ELSE
- PRINT " -0/";
- END IF
- END IF
- PRINT METime$;
- IF WaitFlag% = 1 THEN RETURN
- UseColor Yellow%
- LOCATE TRow% + 1, 58: PRINT USING "#####.##"; OrbitNum;
- LOCATE TRow% + 2, 58: PRINT USING "#####.##"; CLongitude;
- IF CLongitude >= 0 THEN PRINT "°E"; ELSE PRINT "°W";
- LOCATE TRow% + 3, 58: PRINT USING "#####.##"; CLatitude;
- IF CLatitude >= 0 THEN PRINT "°N"; ELSE PRINT "°S";
-
- IF NodeFlag% = 0 THEN RETURN
- IF PriorANTime = ANTime AND PriorDNTime = DNTime THEN RETURN
-
- NRow% = TRow% - 2
- LOCATE NRow%, 1
- ANTime$ = TimeStr(ANTime, 0, 1, "0")
- UseColor Cyan%
- PRINT " Ascend Node:";
- UseColor LtMagenta%
- PRINT USING "#### "; INT(ANOrbit);
- PRINT USING "####.## "; ANLongitude;
- PRINT USING "###/"; ANDays;
- PRINT ANTime$; " ";
- LOCATE NRow% + 1, 1
- DNTime$ = TimeStr(DNTime, 0, 1, "0")
- UseColor Cyan%
- PRINT " Dscend Node:";
- UseColor LtMagenta%
- PRINT USING "#### "; INT(DNOrbit);
- PRINT USING "####.## "; DNLongitude;
- PRINT USING "###/"; DNDays;
- PRINT DNTime$; " ";
-
- ' Print Node Information if PrintFlag is Enabled
-
- IF PrintFlag% = 1 AND Lines% = 0 THEN
- LPRINT TAB(5); "STSORBIT: Space Shuttle Tracking Program, Version 9019 ";
- LPRINT TAB(70); "Page "; Pages% + 1
- LPRINT
- LPRINT TAB(5); "ORBITAL DATA for "; Mission$
- LPRINT
- IF Pages% = 0 THEN
- LPRINT TAB(15); "Launch Date: "; LDate$
- LPRINT TAB(15); "Launch Time: "; LTime$
- LPRINT TAB(15); "Orbit Inclination: ";
- LPRINT USING "#####.####°"; OrbitIncl
- LPRINT TAB(15); "Orbit Altitude: ";
- LPRINT USING "#####.## nm"; OrbitAlt
- LPRINT
- LPRINT TAB(15); "Adjust Longitude: ";
- LPRINT USING "#####.##°"; AdjustLongitude
- LPRINT TAB(15); "Adjust Orbit Time: ";
- LPRINT USING "#####.## min"; AdjustTime / 60
- LPRINT
- Lines% = 15
- ELSE
- Lines% = 7
- END IF
- LPRINT TAB(71); "ORBITAL"
- LPRINT TAB(5); "LOCAL DATE TIME";
- LPRINT TAB(39); "ORBIT LONG"; SPACE$(11); "MET TIME"
- END IF
- IF PriorANTime <> ANTime AND ANTime > 0 AND PrintFlag% = 1 THEN
- LPRINT TAB(5);
- LPRINT SDate$; " "; STime$;
- LPRINT " Ascend Node: ";
- LPRINT USING "#### "; INT(ANOrbit);
- LPRINT USING "####.##° "; ANLongitude;
- LPRINT USING "###/"; ANDays;
- LPRINT ANTime$; " ";
- IF PriorANTime > 0 THEN
- Delta = ANTime - PriorANTime
- OTFrac = Delta - INT(Delta)
- LPRINT TimeStr$(Delta, 0, 1, " ");
- LPRINT USING ".##"; OTFrac
- ELSE
- LPRINT
- END IF
- Lines% = Lines% + 1
- END IF
- IF PriorDNTime <> DNTime AND DNTime > 0 AND PrintFlag% = 1 THEN
- LPRINT TAB(5);
- LPRINT SDate$; " "; STime$;
- LPRINT " Dscend Node: ";
- LPRINT USING "#### "; INT(DNOrbit);
- LPRINT USING "####.##° "; DNLongitude;
- LPRINT USING "###/"; DNDays;
- LPRINT DNTime$; " ";
- IF PriorDNTime > 0 THEN
- Delta = DNTime - PriorDNTime
- OTFrac = Delta - INT(Delta)
- LPRINT TimeStr$(Delta, 0, 1, " ");
- LPRINT USING ".##"; OTFrac
- ELSE
- LPRINT
- END IF
- Lines% = Lines% + 1
- END IF
- IF PrintFlag% = 1 AND Lines% >= 60 THEN
- LPRINT CHR$(12);
- Pages% = Pages% + 1
- Lines% = 0
- END IF
-
- PriorANTime = ANTime
- PriorDNTime = DNTime
- RETURN
-
- ' ********************************************
- ' * Plot predicted orbit prior to "launch" *
- ' ********************************************
-
- PlotPredicted:
- FOR N% = 0 TO SpotsAhead%
- CalcTime = N% * MarkerInterval + Duration
- GOSUB CalcPosition
- OverWrite% = POINT(X%, Y%) + 16 * POINT(X% + 1, Y%)
- FOR M% = 0 TO SpotsAhead% - 1
- L% = (N% + M%) MOD NSpots%
- IF XSpots%(L%) = X% THEN
- IF YSpots%(L%) = Y% THEN
- OverWrite% = CSpots%(L%)
- EXIT FOR
- END IF
- END IF
- NEXT M%
- XSpots%(N%) = X%
- YSpots%(N%) = Y%
- CSpots%(N%) = OverWrite%
- PSET (X%, Y%), LtGreen%
- PSET (X% + 1, Y%), LtGreen%
- NEXT N%
- RETURN
-
- ' **********************************************
- ' * Convert Orbital Altitude to Orbital Time *
- ' **********************************************
-
- ' Tp = TwoPI * a^(3/2)/SQR(µ)
- '
- ' where: a = semi-major axis = radius for circular orbit
- ' µ = Earth's gravitational constant (m^3/s^2)
-
- ConvOrbitAlt:
- OrbitAlt = OrbitAlt * NM2SM * SM2Ft * Ft2M: ' convert to meters
- GeoRadius = ERadius + OrbitAlt
- OrbitTime = TwoPI * GeoRadius ^ (3 / 2) / SqrMu
- OrbitTime = OrbitTime / 60: ' convert to minutes
- RETURN
-
- ConvOrbitTime:
- OrbitAlt = (OrbitTime * SqrMu / TwoPI) ^ (2 / 3) - 6378160
- OrbitAlt = OrbitAlt / Ft2M / SM2Ft / NM2SM
- RETURN
-
-
- ' ******************************
- ' * ShowMap: Plot Map Points *
- ' ******************************
-
- ShowMap:
- FOR N% = 1 TO MPoints%
- SLon% = MLon%(N%)
- SLat% = MLat%(N%)
- IF SLon% > 0 AND SLon% < 639 THEN
- IF SLat% > Top% AND SLat% < Bottom% THEN
- PSET (SLon%, SLat%), Cyan%
- END IF
- END IF
- NEXT
- RETURN
-
- ' ***********************************************
- ' * ShowGrid: Plot Equator & Prime Longitudes *
- ' ***********************************************
-
- ShowGrid:
- UseColor Blue%
- IF Monitor% = 4 THEN G% = 2 ELSE G% = 0
- IF INSTR(CommandLine$, "/EUR") THEN
- ColorA% = LtBlue%
- ColorB% = Blue%
- LOCATE 1, 19 - G%: PRINT "-90";
- LOCATE 1, 39 - 2 * G%: PRINT " 0 ";
- LOCATE 1, 59 - 3 * G%: PRINT "+90";
- ELSE
- ColorA% = Blue%
- ColorB% = LtBlue%
- LOCATE 1, 19 - G%: PRINT "180";
- LOCATE 1, 39 - 2 * G%: PRINT "-90";
- LOCATE 1, 59 - 3 * G%: PRINT " 0";
- END IF
- LINE (0, Equator%)-(639, Equator%), LtBlue%
- LINE (0, Top%)-(639, Bottom%), LtBlue%, B
- LINE (159, Top% + 1)-(159, Bottom% - 1), Blue%
- LINE (319, Top% + 1)-(319, Bottom% - 1), ColorA%
- LINE (479, Top% + 1)-(479, Bottom% - 1), ColorB%
- IF Monitor% <> 1 THEN
- IF GridFlag% = 0 THEN GOTO ShowGrid1
- LINE (52, Top% + 1)-(52, Bottom% - 1)
- LINE (106, Top% + 1)-(106, Bottom% - 1)
- LINE (212, Top% + 1)-(212, Bottom% - 1)
- LINE (266, Top% + 1)-(266, Bottom% - 1)
- LINE (372, Top% + 1)-(372, Bottom% - 1)
- LINE (426, Top% + 1)-(426, Bottom% - 1)
- LINE (532, Top% + 1)-(532, Bottom% - 1)
- LINE (586, Top% + 1)-(586, Bottom% - 1)
- FOR L% = -80 TO 80 STEP 10
- LY% = Equator% - L% * VFactor! / 2
- IF L% <> 0 AND LY% < Bottom% THEN
- LINE (1, LY%)-(638, LY%)
- END IF
- NEXT L%
- ShowGrid1:
- IF INSTR(CommandLine$, "/EUR") <> 0 THEN AdjEUROPE% = 180 ELSE AdjEUROPE% = -90
- TX% = -171
- TY% = Equator%
- GOSUB ShowTDRS
- TX% = -41
- GOSUB ShowTDRS
- IF TrackStn% = 1 THEN GOSUB ShowTDS
- END IF
- RETURN
-
-
- ShowTDRS:
- TX% = Mod360(TX% + AdjEUROPE%) / 360 * 640
- PSET (TX%, TY%), Yellow%
- CIRCLE (TX%, TY%), 3, Yellow%
- RETURN
-
- ShowTDS:
- RESTORE
- FOR N% = 1 TO 14
- READ TDS$, TX%, TY%
- TY% = Equator% - TY% * VFactor! / 2
- TX% = Mod360(TX% + AdjEUROPE%) / 360 * 640
- CIRCLE (TX%, TY%), 17 * VFactor! / 2, Brown%, , , Aspect! * 1.4
- PSET (TX%, TY%), Yellow%
- CIRCLE (TX%, TY%), 3, Yellow%
- NEXT
- RETURN
-
- ' NASA Tracking Stations
-
- DATA "MIL",-81,28: 'Merritt Island
- DATA "BDA",-64,32: 'Bermuda
- DATA "DKR",-17,14: 'Dakar
- DATA "ACN",-14,-8: 'Ascension Island
- DATA "MAX",-5,41: 'Central Spain
- DATA "IOS",56,-5: 'Indian Ocean
- DATA "HAW",-156,20: 'Hawaii
- DATA "GWM",145,14: 'Gwam
- DATA "VAN",-122,35: 'Vandenberg, CA
- DATA "YAR",115,-29: 'Yargidy, Australia
- DATA "CAN",149,-36: 'Canberra, Australia
- DATA "GDX",-116,34: 'Goldstone, CA
- DATA "CTS",-105,38: 'Colorado Springs, CO
- DATA "AGO",-71,-34: 'Santiago, Chile
-
- ' ********************************************
- ' * SetColors: Set Colors for Monitor Type *
- ' ********************************************
-
- SetColors:
-
- ' 0 = Monochrome
- ' 1 = Color
- ' 2 = Red
- ' 3 = Green
-
- IF INSTR(CommandLine$, "/M") <> 0 THEN ColorFlag% = 0
- SELECT CASE ColorFlag%
- CASE 2, 4
- Normal = 4
- Bright = 12
- CASE 3
- Normal = 2
- Bright = 10
- CASE ELSE
- Normal = 7
- Bright = 15
- END SELECT
-
- IF ColorFlag% = 1 THEN
- Black% = 0: Gray% = 8: BBlack = 0
- Blue% = 1: LtBlue% = 9: BBlue = 1
- Green% = 2: LtGreen% = 10: BGreen = 2
- Cyan% = 3: LtCyan% = 11: BCyan = 3
- Red% = 4: LtRed% = 12: BRed = 4
- Magenta% = 5: LtMagenta% = 13: BMagenta = 5
- Brown% = 6: Yellow% = 14: BBrown = 6
- White% = 7: LtWhite% = 15: BWhite = 7
-
- ELSE
- Black% = 0: Gray% = Normal: BBlack = 0
- Blue% = Normal: LtBlue% = Bright: BBlue = 0
- Green% = Normal: LtGreen% = Bright: BGreen = 0
- Cyan% = Normal: LtCyan% = Bright: BCyan = 0
- Red% = Normal: LtRed% = Bright: BRed = 0
- Magenta% = Normal: LtMagenta% = Bright: BMagenta = 0
- Brown% = Normal: Yellow% = Bright: BBrown = 0
- White% = Normal: LtWhite% = Bright: BWhite = 0
- END IF
- RETURN
-
- ' ************************
- ' * Show Program Title *
- ' ************************
-
- ShowTitle:
- GOSUB ShowTitle0
- UseColor LtWhite%
- Center "by David H. Ransom, Jr.", 8, 1, 80
- UseColor LtGreen%
- Center "Current time: " + CTime$, 10, 1, 80
- Center "Current date: " + CDate$, 11, 1, 80
- RETURN
-
- ShowTitle1:
- GOSUB ShowTitle0
- UseColor LtGreen%
- Center "Current time: " + CTime$, 8, 1, 80
- Center "Current date: " + CDate$, 9, 1, 80
- RETURN
-
- ShowTitle0:
- CLS
- UseColor LtMagenta%
- Center "Program STSORBIT", 3, 1, 80
- UseColor Yellow%
- Center "Space Shuttle Orbit Simulation", 5, 1, 80
- UseColor Brown%
- Center "Version 9019 ", 6, 1, 80
- CTime = SystemTime(H%, M%, Secs%, CTime$)
- CDate = SystemDate(Day%, Month%, Year%, CDate$)
- RETURN
-
- REM $STATIC
- DEFINT A-Z
- SUB Center (Text$, Row%, Column%, Length%)
-
- ' Centers Text$ on the screen in a line of length Length%.
-
- DEFINT A-Z
- LOCATE Row, Column
- T$ = Text$
- IF LEN(Text$) > Length% THEN T$ = LEFT$(Text$, Length%)
- PRINT SPC((Length% - LEN(T$)) / 2); T$;
- END SUB
-
- SUB ClearLine (LineNo%)
- LOCATE LineNo, 1
- PRINT SPACE$(80);
- LOCATE LineNo, 1
- END SUB
-
- FUNCTION DMY2JD# (Day%, Month%, Year1%)
-
- ' =====> NOTE: This function calculates the Julian Date at 12:00:00 <=====
-
- ' DMY2JD# converts the given date into JD, the number of Julian days
- ' elapsed since -4713 January 1.5. Note: DJD = JD - 2415020. Method
- ' adapted from Roger Minnott, Sky & Telescope, May 1984, p 455.
-
- DEFINT A-Z
- IF Year1 < 0 THEN Year = Year1 + 1 ELSE Year = Year1
- J# = -INT(7 * (INT((Month + 9) / 12) + Year) / 4)
-
- SELECT CASE CalendarFlag
- CASE 1
- IF Year > 1582 OR (Year = 1582 AND Month > 10) OR (Year = 1582 AND Month = 10 AND Day > 4) THEN
- S = SGN(Month - 9)
- A = ABS(Month - 9)
- J1 = INT(Year + S * INT(A / 7))
- J1 = -INT((INT(J1 / 100) + 1) * .75)
- G = 1
- END IF
- CASE 2
- IF Year > 1752 OR (Year = 1752 AND Month > 9) OR (Year = 1752 AND Month = 9 AND Day > 1) THEN
- S = SGN(Month - 9)
- A = ABS(Month - 9)
- J1 = INT(Year + S * INT(A / 7))
- J1 = -INT((INT(J1 / 100) + 1) * .75)
- G = 1
- END IF
- CASE ELSE
- J1 = 0
- G = 0
- END SELECT
-
- J# = J# + INT(275 * Month / 9) + Day + G * J1
- Y# = 367# * Year
- DMY2JD# = 1721027# + J# + 2 * G + Y# - .5#
- END FUNCTION
-
- FUNCTION Get2$ (I%)
- DEFINT A-Z
- Digit2 = INT(I% / 10)
- Digit1 = I% - Digit2 * 10
- Get2$ = CHR$(Digit2 + 48) + CHR$(Digit1 + 48)
- END FUNCTION
-
- FUNCTION GetDate$ (Day%, Month%, Year%)
- DEFINT A-Z
- AYear = ABS(Year%)
- HYear% = INT(AYear% / 100)
- UYear% = AYear% - HYear% * 100
- GetDate$ = Get2$(Month%) + "/" + Get2$(Day%) + "/" + Get2$(HYear%) + Get2$(UYear%)
- END FUNCTION
-
- FUNCTION InputDMY# (Flag%, JulianDay#)
-
- ' Flag% is set as follows on return:
-
- ' <0 = Error Number
- ' 0 = RETURN (No data entered)
- ' 1 = Local date input, output is LOCAL JD ===> USE CAUTION! <===
- ' 2 = UT date input, output is JD
- ' 3 = +/-/JD/DJD/MJD/TJD/GSD input, output is JD
-
- InputDMY0:
- Flag% = 0
- LINE INPUT K$
- LD = 1: LM = 1: LY = 1988
- IF LEN(K$) = 0 THEN EXIT FUNCTION
- K$ = UCASE$(K$)
- IF LEFT$(K$, 1) = "#" THEN
- InputDMY# = INT(JulianDay#) + .5#
- Flag% = 3
- EXIT FUNCTION
- END IF
- IF LEFT$(K$, 1) = "*" THEN
- InputDMY# = JulianDay#
- Flag% = 3
- EXIT FUNCTION
- END IF
- IF LEFT$(K$, 1) = "+" THEN
- InputDMY# = JulianDay# + VAL(MID$(K$, 2))
- Flag% = 3
- EXIT FUNCTION
- END IF
- IF LEFT$(K$, 1) = "-" THEN
- InputDMY# = JulianDay# - VAL(MID$(K$, 2))
- Flag% = 3
- EXIT FUNCTION
- END IF
- IF LEFT$(K$, 2) = "JD" THEN
- InputDMY# = VAL(MID$(K$, 3))
- Flag% = 3
- EXIT FUNCTION
- ELSEIF LEFT$(K$, 3) = "DJD" THEN
- InputDMY# = VAL(MID$(K$, 4)) + 2415020#
- Flag% = 3
- EXIT FUNCTION
- ELSEIF LEFT$(K$, 3) = "MJD" THEN
- InputDMY# = VAL(MID$(K$, 4)) + 2400000.5#
- Flag% = 3
- EXIT FUNCTION
- ELSEIF LEFT$(K$, 3) = "TJD" THEN
- InputDMY# = VAL(MID$(K$, 4)) + 2440000.5#
- Flag% = 3
- EXIT FUNCTION
- ELSEIF LEFT$(K$, 3) = "GSD" THEN
- InputDMY# = (VAL(MID$(K$, 4)) - .671104312#) / 1.00273790934#
- Flag% = 3
- EXIT FUNCTION
- END IF
- IF RIGHT$(K$, 1) = "U" THEN Flag% = 2 ELSE Flag% = 1
- LM = VAL(K$)
- LDF# = 0
- Test = INSTR(K$, "/"): 'find first slash
- IF Test = 0 THEN GOTO InputDMY1
- IF INSTR(LEFT$(K$, Test), ".") THEN Flag% = 3: 'Force UT if decimal pt
- K$ = MID$(K$, Test + 1)
- LD = VAL(K$)
- Test = INSTR(K$, "/"): 'find second slash
- IF Test = 0 THEN GOTO InputDMY1
- K$ = MID$(K$, Test + 1)
- LY = VAL(K$)
-
- InputDMY1:
- CalendarFlag = 1 'Force Gregorian Calendar
- SELECT CASE CalendarFlag
- CASE 1
- IF LY = 1582 AND LM = 10 AND LD > 4 AND LD < 15 THEN
- ErrorNum = 24
- GOTO ShowDMYError
- END IF
- CASE 2
- IF LY = 1752 AND LM = 9 AND LD > 2 AND LD < 14 THEN
- ErrorNum = 24
- GOTO ShowDMYError
- END IF
- CASE ELSE
- END SELECT
-
- IF LM < 0 OR LM > 12 THEN
- ErrorNum = 26
- GOTO ShowDMYError
- END IF
-
- IF LeapYear(LY) = 0 AND LM = 2 AND LD = 29 THEN
- ErrorNum = 25
- GOTO ShowDMYError
- END IF
-
- SELECT CASE LM
- CASE 2
- TestDays = 28
- CASE 4, 6, 9, 11
- TestDays = 30
- CASE ELSE
- TestDays = 31
- END SELECT
-
- IF LeapYear(LY) = 1 AND LM = 2 THEN TestDays = 29
-
- IF LD < 0 OR LD > TestDays THEN
- ErrorNum = 26
- GOTO ShowDMYError
- END IF
-
- InputDMY# = DMY2JD#(LD, LM, LY) + LDF#
- EXIT FUNCTION
-
- ShowDMYError:
- 'ErrorWindow ErrorNum
- Flag = -ErrorNum
- EXIT FUNCTION
- END FUNCTION
-
- DEFDBL A-Z
- FUNCTION InputHMS# (Flag%)
-
- ' Returns the time input and sets Flag% as follows:
-
- ' 0 = No time input (CR pressed)
- ' 1 = Local time requested
- ' 2 = UT time requested (No conversions performed)
- ' 3 = ET or TDT time requested (No conversions performed)
-
- LINE INPUT K$
- Flag% = 0
- InputHMS# = 0
- IF K$ = "" THEN EXIT FUNCTION
- K$ = UCASE$(K$)
- SELECT CASE RIGHT$(K$, 1)
- CASE "U"
- Flag% = 2
- CASE "E", "T"
- Flag% = 3
- CASE ELSE
- Flag% = 1
- END SELECT
- Test# = VAL(K$)
- InputHMS# = Test#
- Test% = INSTR(K$, ":"): 'Find first colon
- IF Test% = 0 THEN Test% = INSTR(K$, ","): 'Try comma instead
- IF Test% = 0 THEN EXIT FUNCTION
- K$ = MID$(K$, Test% + 1)
- Test# = Test# + VAL(K$) / 60
- InputHMS# = Test#
- Test% = INSTR(K$, ":"): 'Find second colon
- IF Test% = 0 THEN Test% = INSTR(K$, ","): 'Try comma instead
- IF Test% = 0 THEN EXIT FUNCTION
- K$ = MID$(K$, Test% + 1)
- InputHMS# = Test# + VAL(K$) / 3600
- END FUNCTION
-
- FUNCTION JD2DMY$ (Day%, Month%, Year%, JD#, FracDay#)
-
- ' JD2DMY$ converts a given Julian Date (JD#), days elapsed since -4713
- ' JAN 1.5, into Gregorian date format. It returns a string in the format
- ' DD-MM-YYYY; the Day, Month, and Year; and the fractional day.
-
- ' Method adapted from Roger Sinnott, Sky & Telescope, May 1984, p 455.
-
- DEFDBL A-Z
- SELECT CASE CalendarFlag%
- CASE 1: 'Automatic @ 1582 OCT 15
- IF JD >= 2299160.5# THEN G% = 1 ELSE G% = 0
- CASE 2: 'Automatic @ 1752 SEP 13
- IF JD >= 2361209.5# THEN G% = 1 ELSE G% = 0
- CASE ELSE: 'Julian Calendar
- G% = 0
- END SELECT
-
- J = FIX(JD#)
- F# = JD# - J + .5#
- IF F# >= 1# THEN F# = F# - 1#: J = J + 1
- FracDay# = F#
-
- IF G% = 0 THEN
- A = J
- ELSE
- A1 = INT((J / 36524.25#) - 51.12264#)
- A = J + 1# + A1 - INT(A1 / 4#)
- END IF
-
- B = A + 1524#
- C = INT((B / 365.25#) - .3343#)
- D = INT(365.25# * C)
- E% = INT((B - D) / 30.61#)
- Day% = B - D - INT(30.61# * E%)
- IF E% > 13 THEN Month% = E% - 13 ELSE Month% = E% - 1
- IF Month% > 2 THEN Year% = C - 4716 ELSE Year% = C - 4715
- IF Year% <= 0 THEN Year% = Year% - 1
- JD2DMY$ = GetDate$(Day%, Month%, Year%)
- END FUNCTION
-
- DEFINT A-Z
- FUNCTION LeapYear% (Y%)
-
- ' Function LeapYear determines if Year% is a Leap Year (LeapYear=1)
- ' or not (LeapYear=0).
-
- DEFINT A-Z
- IF Y > 0 THEN Year = Y ELSE Year = Y + 1
- IF Year MOD 4 = 0 THEN IsLeap = 1 ELSE IsLeap = 0
- CalendarFlag = 0
- SELECT CASE CalendarFlag
- CASE 1
- IF Year MOD 100 = 0 AND Year > 1582 THEN
- IsLeap = 0
- IF Year MOD 400 = 0 THEN IsLeap = 1
- END IF
- CASE 2
- IF Year MOD 100 = 0 AND Year > 1752 THEN
- IsLeap = 0
- IF Year MOD 400 = 0 THEN IsLeap = 1
- END IF
- CASE ELSE
- END SELECT
- LeapYear = IsLeap
- END FUNCTION
-
- DEFDBL A-Z
- FUNCTION Mod2PI# (X#)
- Mod2PI# = X - INT(X / TwoPI) * TwoPI
- END FUNCTION
-
- DEFINT A-Z
- FUNCTION Mod360# (Degrees#)
- D# = Degrees#
- IF ABS(D#) >= 1440# THEN
- D# = D# - FIX(D# / 360#) * 360#
- END IF
- WHILE D# >= 360#: D# = D# - 360#: WEND
- WHILE D# < 0#: D# = D# + 360#: WEND
- Mod360# = D#
- END FUNCTION
-
- FUNCTION Mod86400# (T#)
-
- ' Mod86400# returns an adjusted value of T# such that 0<=T#<86400
-
- CheckTime# = T#
- IF ABS(CheckTime#) >= 432000# THEN
- CheckTime# = CheckTime# - FIX(CheckTime# / 86400#) * 86400#
- END IF
- WHILE CheckTime# >= 86400#: CheckTime# = CheckTime# - 86400#: WEND
- WHILE CheckTime# < 0#: CheckTime# = CheckTime# + 86400#: WEND
- Mod86400# = CheckTime#
-
- END FUNCTION
-
- FUNCTION String2$ (Value%, Lead$)
- IF Value > 99 THEN
- String2$ = "%%"
- EXIT FUNCTION
- END IF
- Tens = Value \ 10
- Units = Value MOD 10
- IF Tens = 0 THEN
- Temp$ = Lead$
- ELSE
- Temp$ = CHR$(Tens + 48)
- END IF
- String2$ = Temp$ + CHR$(Units + 48)
- END FUNCTION
-
- DEFDBL A-Z
- FUNCTION SystemDate# (Day%, Month%, Year%, DateString$)
-
- ' SystemDate# returns the following information from the system clock:
-
- ' SystemDate# = Julian date
- ' Day% = Current integer day of month
- ' Month% = Current integer month of year
- ' Year% = Current integer year
- ' DateString$ = ASCII date as DD-MM-YYYY (string)
-
- Temp$ = DATE$
- Day% = VAL(MID$(Temp$, 4, 2))
- Month% = VAL(MID$(Temp$, 1, 2))
- Year% = VAL(MID$(Temp$, 7, 4))
- DateString$ = GetDate$(Day%, Month%, Year%)
- SystemDate# = DMY2JD#(Day%, Month%, Year%)
- END FUNCTION
-
- FUNCTION SystemTime# (Hours%, Minutes%, Seconds%, TimeString$)
-
- ' SystemTime# returns the following information from the system clock:
-
- ' SystemTime# = Current time in seconds since midnight
- ' Hours% = Current integer hours (0-23)
- ' Minutes% = Current integer minutes (0-59)
- ' Seconds% = Current integer seconds (0-59)
- ' TimeString$ = ASCII time as HH:MM:SS (string, 24-hour notation)
-
- ' NOTE: When used in combination with the Julian date, SystemTime# as
- ' calculated in this function must be divided by 86400 to yield
- ' the fractional part of a day.
-
- ReadSystemTime:
- ElapsedTime# = INT(TIMER)
- Hours% = INT(ElapsedTime# / 3600#)
- Minutes% = INT((ElapsedTime# - Hours% * 3600#) / 60#)
- Seconds% = ElapsedTime# - Hours% * 3600# - Minutes% * 60#
- TimeString$ = String2$(Hours%, "0") + ":" + String2$(Minutes%, "0") + ":" + String2$(Seconds%, "0")
- SystemTime# = ElapsedTime#
- END FUNCTION
-
- FUNCTION TimeStr$ (Seconds#, DDigits%, FormatFlag%, LeadZero$)
-
- ' This function returns a string of the form HH:MM:SS.SSSS
- ' where the number of digits to the right of the decimal point
- ' is determined by DDigits%.
-
- ' FormatFlag% determines the format of the resulting string:
- ' -1 HH.HHHHHH
- ' 0 HH:MM.MMMM
- ' +1 HH:MM:SS.SS
-
- DEFINT A-Z
- LocalSeconds# = Mod86400(Seconds# + .5# * 10 ^ (-DDigits%))
- ITime& = INT(LocalSeconds#)
- THours = ITime& \ 36000
- JTime& = ITime& - THours * 36000
- UHours = JTime& \ 3600&
- JTime& = JTime& - UHours * 3600&
- IF THours = 0 THEN
- TT$ = LeadZero$ + CHR$(UHours + 48)
- ELSE
- TT$ = CHR$(THours + 48) + CHR$(UHours + 48)
- END IF
- IF FormatFlag% = -1 THEN
- DTime# = (LocalSeconds# - (THours * 10# + UHours) * 3600#) / 3600#
- GOTO DoDecimals
- END IF
- TMinutes = JTime& \ 600&
- JTime& = JTime& - TMinutes * 600&
- UMinutes = JTime& \ 60&
- JTime& = JTime& - UMinutes * 60&
- TT$ = TT$ + ":" + CHR$(TMinutes + 48) + CHR$(UMinutes + 48)
- IF FormatFlag% = 0 THEN
- DTime# = (LocalSeconds# - (THours * 10# + UHours) * 3600# - (TMinutes * 10# + UMinutes) * 60#) / 60#
- GOTO DoDecimals
- END IF
- TSeconds = JTime& \ 10&
- USeconds = JTime& - TSeconds * 10&
- TT$ = TT$ + ":" + CHR$(TSeconds + 48) + CHR$(USeconds + 48)
- DTime# = LocalSeconds# - ITime&
-
- DoDecimals:
- IF DDigits% < 1 THEN TimeStr$ = TT$: EXIT FUNCTION
- TT$ = TT$ + "."
- FOR N = 1 TO DDigits%
- DTime# = DTime# * 10#
- IDT = INT(DTime#)
- TT$ = TT$ + CHR$(IDT + 48)
- DTime# = DTime# - IDT
- NEXT N
- TimeStr$ = TT$
-
- END FUNCTION
-
- SUB UseColor (Colr%) STATIC
- IF Colr% = 0 THEN
- ColorFlag = 0
- EXIT SUB
- ELSEIF Colr% = -1 THEN
- ColorFlag = 1
- EXIT SUB
- END IF
- IF ColorFlag = 0 THEN EXIT SUB
- COLOR Colr%
- END SUB
-
- SUB WaitForKey (K$)
- DO
- K$ = INKEY$
- LOOP UNTIL LEN(K$) <> 0
- END SUB
-
-