home *** CD-ROM | disk | FTP | other *** search
- 100 DEFINT I-N: CALL MY.COLOR( 14, 0)
- 110 DIM LEGEND$(10), MENU$(20), MONTH$(12), XDAT(5), YDAT(5), X(1000), Y(1000), XS(400), YS(400), XI(3), XT(3), XU(3), PREFIX$(30), COUNTRY$(30), XLAT(30), XLONG(30)
- 120 DIM FREQ(10), WAVE.LEN(10), TX.LOSS(10), RX.LOSS(10), REF.LOSS(10), ABSORB.LOSS(10), PR(10)
- 130 DIM GT(10), GR(10), H.TXANT(10), H.RXANT(10), TX.POL$(10), RX.POL$(10), TX.POL%(10), RX.POL%(10)
- 140 DIM SHARED NX.BEGIN,NX.END,NY.BEGIN,NY.END,MAX.VERT,SCR.MODE%
- 150 DATA Jan,Feb,Mar,Apr,May,Jun,Jul,Aug,Sep,Oct,Nov,Dec
- 160 FOR I = 0 TO 11: READ MONTH$(I): NEXT
- 170 DATA " Menu Options "," ","1*-Select DX Prefix ","2- Specify Country Name","3- Specify Lat/Lon ","4- Change Sunspot # "
- 180 DATA "5- Select Date/Time ","6- Use Real Time ","7- Select Short Path ","8- Select Long Path ","9- Quit "
- 190 DATA " "," Choose One "
- 200 N.MENU = 13: FOR I = 1 TO N.MENU: READ MENU$(I): NEXT I
- 210 DATA 3.5,7,10.1,14,18.1,21,24.5,28.5: NFREQ = 8
- 220 FOR I = 1 TO NFREQ: READ FREQ(I): WAVE.LEN(I) = 300 / FREQ(I): NEXT I
- 230 DATA Prfx,Ctry,Lat/Lon,Dat/Tim,R Time,ShPth,LngPth,ChParams,Quit
- 240 FOR I = 1 TO 9: READ LEGEND$(I): NEXT I
- 250 '$DYNAMIC
- 260 DIM NSTORE1(32500),NSTORE2(32500), ZPREFIX$(500), ZCOUNTRY$(500), ZLAT(500), ZLONG(500)
- 270 '$STATIC
- 280 DEF FNASIN (X)
- 290 IF ABS(X) >= .999999 THEN FNASIN = SGN(X) * 2 * ATN(1): EXIT DEF
- 300 FNASIN = ATN(X / SQR(1 - X * X))
- 310 END DEF
- 320 DEF FNACOS (X)
- 330 FNACOS = 2 * ATN(1) - FNASIN(X)
- 340 END DEF
- 350 DEF FNATN2 (X, Y)
- 360 IF ABS(X) < .00001 THEN FNATN2 = SGN(Y) * 2 * ATN(1): EXIT DEF
- 370 IF ABS(Y) < .00001 THEN FNATN2 = 2 * ATN(1) * (1 - SGN(X)): EXIT DEF
- 380 IF Y >= 0 AND X > 0 THEN FNATN2 = ATN(Y / X): EXIT DEF
- 390 IF Y >= 0 AND X < 0 THEN FNATN2 = 2 * ATN(1) - ATN(X / Y): EXIT DEF
- 400 IF X > 0 THEN FNATN2 = ATN(Y / X): EXIT DEF
- 410 FNATN2 = -2 * ATN(1) - ATN(X / Y)
- 420 END DEF
- 430 DEF FNT.MOD (T, T0) = T - .5 * T0 * (1 + SGN(T - T0)) * SGN(ABS(T - T0))
- 440 DEF FNXFORM (X)
- 450 XFORM = X - HOME.LON: IF XFORM > 180 THEN XFORM = XFORM - 360
- 460 IF XFORM < -180 THEN XFORM = 360 + XFORM
- 470 FNXFORM = XFORM
- 480 END DEF
- 490 DEF FNDIG$ (X)
- 500 KX = X: AA$ = MID$(STR$(KX), 2): FNDIG$ = AA$: IF LEN(AA$) = 1 THEN FNDIG$ = "0" + AA$
- 510 END DEF
- 520 DEF FNDB (X) = 10 * LOG(X) / LOG(10)
- 530 DEF FNDBI (X) = 10 ^ (.1 * X)
- 540 DEF FNSUN.SPOT (SF) : REM CALCULATION OF SUNSPOT NUMBER FROM SOLAR FLUX
- 550 IF SF > 0 THEN FNSUN.SPOT = SF: EXIT DEF
- 560 SF = ABS(SF)
- 570 SSQ = -103.7767 + 1.797429 * SF - (3.384356E-03) * SF ^ 2 + (4.525515E-06) * SF ^ 3
- 580 FNSUN.SPOT = INT(100 * SSQ + .5) / 100
- 590 END DEF
- 600 PI = 4 * ATN(1): CNV = 180 / PI: RE = 6364
- 610 T.DRAW = 20
- 620 'CALL CLOCKON(0)
- 630 ON KEY(1) GOSUB 11000: ON KEY(2) GOSUB 11010: ON KEY(3) GOSUB 11020: ON KEY(4) GOSUB 11030:
- 640 ON KEY(5) GOSUB 11040: ON KEY(6) GOSUB 11050: ON KEY(7) GOSUB 11060: ON KEY(8) GOSUB 11070: ON KEY(9) GOSUB 11080
- 1000 PRINT : PRINT
- 1105 print " MAPPER86 "
- 1010 PRINT " DX Mapping and HF Propagation Prediction Program "
- 1020 PRINT " Adapted from MINIMUF 3.5 "
- 1030 PRINT " by Dennis Murray "
- 1035 print " for computers without 80x87 Math Coprocessers"
- 1040 PRINT : PRINT
- 1050 PRINT " This program is in the Public Domain for non-commercial "
- 1060 PRINT " use only by anyone who wants to use it or adapt it to"
- 1070 PRINT " suit their needs. The author takes no responsibility for "
- 1080 PRINT " guaranteeing that it will work on your machine, nor for "
- 1090 PRINT " supporting this software. It should work on all PC compatibles"
- 1100 PRINT " with CGA or EGA graphics Cards without a Math Coprocessor."
- 1130 PRINT " This program is designed to be compiled using Microsoft "
- 1140 PRINT " Quick Basic v3.0 in order to speed up the computations for "
- 1142 PRINT " computers without 80x87 Math processors. If you have a math "
- 1143 print " coprocessor, use a Hercules Graphics Adapter, or can stand "
- 1144 print " the slow speed then use the MAPPER87 version of this program."
- 1160 PRINT : PRINT
- 1170 PRINT " You are on your own if it doesn't work on your machine!"
- 1180 PRINT " ( What do you want for free? )"
- 1190 PRINT : PRINT " Hit any key to proceed"; : A$ = INPUT$(1): CLS
- 1500 'READ ATLAS
- 1510 PRINT : LOCATE 13, 16, 0: CALL MY.COLOR( 20, 14): PRINT " Fetching DX Atlas .. Wait a While ";
- 1520 OPEN "I", 2, "MAPPER.ATL": K = 0
- 1530 IF EOF(2) THEN N.ATL = K: CLOSE 2: GOTO 1600
- 1540 K = K + 1: INPUT #2, ZPREFIX$(K), ZLAT(K), ZLONG(K), ZCOUNTRY$(K)
- 1550 GOTO 1530
- 1600 CALL MY.COLOR( 14, 0): CLS : PRINT : PRINT
- 1610 PRINT USING " ### DX Atlas Entries Loaded"; N.ATL: PRINT
- 1620 PRINT
- 2000 OPEN "I", 2, "MAPPER.DEF"
- 2010 INPUT #2,VIDEO$
- 2020 INPUT #2, HOME.LAT, HOME.LON, SSN, T.DRAW
- 2030 FOR I = 1 TO NFREQ: INPUT #2, H.TXANT(I), TX.POL$(I), GT(I): NEXT I
- 2040 FOR I = 1 TO NFREQ: INPUT #2, H.RXANT(I), RX.POL$(I), GR(I): NEXT I
- 2050 INPUT #2, PT, E.MIN: CLOSE 2
- 2060 'RENTRY POINT
- 2070 CLS 0: CALL MY.COLOR( 14,0)
- 2080 PRINT " Default Values Which Will Be Used Unless Changed"
- 2090 PRINT :
- 2100 PRINT USING " 1- Sunspot Number = ### "; SSN
- 2110 PRINT USING " 2- Home Latitude/Longitude = ###.# N / ####.# W"; HOME.LAT; -HOME.LON
- 2120 PRINT USING " 3- Auto Redraw of Solar Terminator Every ### min"; T.DRAW
- 2130 PRINT USING " 4- Home Transmitter Power Output=#### Watts"; PT
- 2140 PRINT USING " 5- Minimum Elevation Angle=###.# deg"; E.MIN
- 2150 PRINT USING " 6- Graphics Mode &";VIDEO$
- 2160 PRINT " 7- Home Antenna .."
- 2170 PRINT "Band Freq(MHz) Ht(ft) Pol Gain(dBi) .. Band Freq(MHz) Ht(ft) Pol Gain(dBi)"
- 2180 FOR I = 1 TO NFREQ / 2
- 2190 PRINT USING " ## ##.# ###.# \ \ ###.# ## ##.# ###.# \ \ ###.#"; I; FREQ(I); H.TXANT(I) * 3.28; TX.POL$(I); GT(I); I + NFREQ / 2; FREQ(I + NFREQ / 2); H.TXANT(I+NFREQ/2)*3.28; TX.POL$(I+NFREQ/2); GT(I+NFREQ/2)
- 2200 NEXT I
- 2210 PRINT " 8- DX Antenna .."
- 2220 PRINT "Band Freq(MHz) Ht(ft) Pol Gain(dBi) .. Band Freq(MHz) Ht(ft) Pol Gain(dBi)"
- 2230 FOR I = 1 TO NFREQ / 2
- 2240 PRINT USING " ## ##.# ###.# \ \ ###.# ## ##.# ###.# \ \ ###.#"; I; FREQ(I); H.RXANT(I) * 3.28; RX.POL$(I); GR(I); I + NFREQ / 2; FREQ(I + NFREQ / 2); H.RXANT(I+NFREQ/2)*3.28;RX.POL$(I+NFREQ/2);GR(I+NFREQ/2)
- 2250 NEXT I
- 2260 PRINT
- 2270 PRINT " Enter (1-8) to change ... Anything else to accept";
- 2280 A$ = INPUT$(1): N = VAL(A$): PRINT : PRINT
- 2290 IF N = 1 THEN INPUT "Enter New Sunspot Number (negative for Solar Flux)"; SF: SSN = FNSUN.SPOT(SF): CLS : GOTO 2060
- 2300 IF N = 3 THEN INPUT "Enter Auto Redraw Interval (Minutes)"; T.DRAW: CLS : GOTO 2060
- 2310 IF N = 7 THEN INPUT "Enter Band #, Home Ant Ht (ft), Pol (H/V), and Gain (dBi)"; I, H.TXANT(I), TX.POL$(I), GT(I): H.TXANT(I) = H.TXANT(I) / 3.28
- 2320 IF N = 7 THEN A$ = LEFT$(TX.POL$(I), 1): IF A$ = "H" OR A$ = "h" THEN TX.POL$(I) = "Hor": CLS : GOTO 2060 ELSE TX.POL$(I) = "Vert": CLS : GOTO 2060
- 2330 IF N = 8 THEN INPUT "Enter Band #, DX Ant Ht (ft), Pol (H/V), and Gain (dBi)"; I, H.RXANT(I), RX.POL$(I), GR(I): H.RXANT(I) = H.RXANT(I) / 3.28
- 2340 IF N = 8 THEN A$ = LEFT$(RX.POL$(I), 1): IF A$ = "H" OR A$ = "h" THEN RX.POL$(I) = "Hor": CLS : GOTO 2060 ELSE RX.POL$(I) = "Vert": CLS : GOTO 2060
- 2350 IF N = 4 THEN INPUT "Enter Home Transmit Power Output (W)"; PT: CLS : GOTO 2060
- 2360 IF N = 5 THEN INPUT "Enter Min Elevation Launch Angle (deg)"; E.MIN: CLS : GOTO 2060
- 2370 IF N = 6 THEN
- 2380 INPUT "Enter Graphics Type (CGA,EGA,MONO)"; VIDEO$
- 2390 CALL UPPER.CASE(VIDEO$): MAP.FLAG%=-1
- 2400 CLS : GOTO 2060
- 2410 END IF
- 2420 IF N <> 2 THEN 3000
- 2430 INPUT "Enter Home Lat/Lon (+ For North Lat and West Lon) "; HOME.LAT, HOME.LON: HOME.LON = -HOME.LON
- 2440 HOME.LON = HOME.LON MOD 360: IF HOME.LON > 180 THEN HOME.LON = HOME.LON - 360
- 2450 IF HOME.LON < -180 THEN HOME.LON = 360 + HOME.LON
- 2460 CLS : MAP.FLAG% = -1: GOTO 2060
- 3000 OPEN "O", 2, "MAPPER.DEF":
- 3010 PRINT #2,VIDEO$
- 3020 PRINT #2, HOME.LAT, HOME.LON, SSN, T.DRAW
- 3030 FOR I = 1 TO NFREQ: PRINT #2, H.TXANT(I); ",", TX.POL$(I); ",", GT(I): NEXT I
- 3040 FOR I = 1 TO NFREQ: PRINT #2, H.RXANT(I); ",", RX.POL$(I); ",", GR(I): NEXT I
- 3050 PRINT #2, PT; ",", E.MIN
- 3060 CLOSE 2: CLS 0:GOSUB SCRN.MODE
- 3070 FOR I = 1 TO NFREQ
- 3080 IF LEFT$(TX.POL$(I), 1) = "V" THEN TX.POL%(I) = -1
- 3090 IF LEFT$(RX.POL$(I), 1) = "V" THEN RX.POL%(I) = -1
- 3100 NEXT I
- 3110 ON TIMER(60 * T.DRAW) GOSUB REDRAW
- 3120 IF MAP.FLAG% THEN GOSUB LAT.LON.SCRN: GOSUB FETCH.MAP:MAP.FLAG%=0:OP%=1:GOTO RESTORE.SCREEN
- 3130 'NSEG = VARSEG(NSTORE1(0)): NOFF = VARPTR(NSTORE1(0))
- 3140 CALL PTR86(NSEG,NOFF,VARPTR(NSTORE1(0)) )
- 3150 DEF SEG = NSEG: BLOAD "MAPPER1.SCR", NOFF: DEF SEG
- 3160 'NSEG = VARSEG(NSTORE2(0)): NOFF = VARPTR(NSTORE2(0))
- 3170 CALL PTR86(NSEG,NOFF,VARPTR(NSTORE2(0)) )
- 3180 DEF SEG = NSEG: BLOAD "MAPPER2.SCR", NOFF: DEF SEG
- 3500 RESTORE.SCREEN:
- 3510 TIMER ON
- 3520 GOSUB GET.DATE: GOSUB LAT.LON.SCRN
- 3530 CLS : IF PAINT.FLAG% THEN PAINT (0, 0), 0, 7
- 3540 GOSUB DRAW.TERMINATOR
- 3550 PUT (-180,-90), NSTORE1, OR
- 3555 PUT (0,-90), NSTORE2, OR
- 3560 GOSUB PAINT.OCEANS
- 3570 GOSUB DRAW.LAT.LON
- 3580 LOCATE MAX.LINE, 1: FOR I = 1 TO 9: CALL MY.COLOR( 2,0): PRINT " F" + CHR$(48 + I); : CALL MY.COLOR( 14,0): PRINT LEGEND$(I); : NEXT I
- 4000 MENU:
- 4010 FOR I = 1 TO 9: KEY(I) ON: NEXT I
- 4020 A$ = INKEY$: IF A$ = "" THEN 4020
- 4030 FOR I = 1 TO 9: KEY(I) OFF: NEXT I
- 4040 ON OP% GOTO 4100, 4200, 4300, 4500, 4600, 4700, 4800, 4400, 4900
- 4100 'LOCATION BY PREFIX
- 4110 GOSUB GET.PREFIX: IF K > 0 THEN GOTO PATH.CALCULATION
- 4120 GOSUB DELAY: GOTO MENU
- 4200 'LOCATION BY COUNTRY NAME
- 4210 GOSUB GET.COUNTRY: IF K > 0 THEN GOTO PATH.CALCULATION
- 4220 GOSUB DELAY: GOTO MENU
- 4300 'LAT/LON
- 4310 GOSUB CLEAR.TEXT: PRINT "Enter DX Lat/Long "
- 4320 INPUT XLAT, XLONG: XLONG = -XLONG: K = 1: XLAT(1) = XLAT: XLONG(1) = XLONG
- 4330 PREFIX$(1) = "": COUNTRY$(1) = "Lat= " + STR$(XLAT) + " .. Long= " + STR$(-XLONG)
- 4340 GOTO 5010
- 4400 'NEW SSN
- 4405 CLS 0: GOTO 2000
- 4410 GOSUB CLEAR.TEXT: INPUT "Enter Sunspot Num "; SSN: GOSUB 9220: GOTO MENU
- 4500 'NEW DATE
- 4510 TIMER OFF: GOSUB CLEAR.TEXT: GOSUB GET.NEW.DATE: GOTO 3530
- 4600 'REAL TIME MODE
- 4610 GOTO RESTORE.SCREEN
- 4700 'SET SHORT PATH
- 4710 PATH% = 0: GOTO MENU:
- 4800 'SET LONG PATH
- 4810 PATH% = -1: GOTO MENU
- 4900 END
- 5000 PATH.CALCULATION:
- 5010 XLAT = XLAT(K): XLONG = XLONG(K):
- 5020 LOCATE 1, 26: PRINT SPACE$(54); : LOCATE 1, 26
- 5030 CALL MY.COLOR( 14,0): A$ = LEFT$(" " + PREFIX$(K) + " " + COUNTRY$(K), 48) + " ": L = LEN(A$): B$ = A$: IF L < 48 THEN B$ = " " + STRING$(47, "*") + " ": MID$(B$, (49 - L) / 2) = A$
- 5040 PRINT B$; : EXTRA% = 0
- 5050 CALL MINIMUF(HOME.LAT, HOME.LON, XLAT, XLONG, PATH%, M0 + 1, D0, T0, SSN, NHOPS, EXTRA%, F.MUF, F.LUF, E.CUTOFF)
- 5060 LOCATE 2, 26: PRINT SPACE$(54): LOCATE 2, 26
- 5070 PRINT USING "Fmuf=##.# Fluf=##.# F-Ecof=##.# MHz ## Hops"; F.MUF; F.LUF; E.CUTOFF; NHOPS
- 5080 CALL TRANSFORM(XLAT, XLONG, X, Y, -1)
- 5090 IF PATH% THEN PATH$ = "Long " ELSE PATH$ = "Short"
- 5100 LOCATE 1, 1: PRINT USING "Predicting \ \ Path to"; PATH$
- 5110 RNG = SQR(X ^ 2 + Y ^ 2) * PI * RE: IF PATH% THEN RNG = 2 * PI * RE - RNG: X = -X: Y = -Y
- 5120 AZIM = FNATN2(Y, X) * CNV
- 5130 IF AZIM < 0 THEN AZIM = 360 + AZIM
- 5140 LOCATE 2, 1: PRINT SPACE$(24); : LOCATE 2, 1
- 5150 PRINT USING "Range=#####km,#####nm"; RNG; RNG / 1.85;
- 5160 LOCATE 3, 1: PRINT SPACE$(24); : LOCATE 3, 1
- 5170 PRINT USING "Az=#### El=###.# deg"; AZIM; ELEV; : CALL MY.COLOR( 14,0)
- 5180 GOSUB PRINT.STRENGTH
- 5190 CLAT = COS(XLAT / CNV): SLAT = SIN(XLAT / CNV)
- 5200 XLONG = FNXFORM(XLONG)
- 5210 CLONG = COS(XLONG / CNV): SLONG = SIN(XLONG / CNV)
- 5220 XT(1) = CLAT * CLONG: XT(2) = CLAT * SLONG: XT(3) = SLAT
- 5230 XI(1) = COS(HOME.LAT / CNV): XI(2) = 0: XI(3) = SIN(HOME.LAT / CNV)
- 5240 IF ERASE.FLAG% THEN NCOLOR = 2: CALL MYLINE(NCOLOR, X(), Y(), IPTS, XDAT(), YDAT())
- 5250 IPTS = 101: IF PATH% THEN DPATH = -270 / (CNV * (IPTS - 1)) ELSE DPATH = 90 / (CNV * (IPTS - 1))
- 5260 J = 0: FOR JJ = 1 TO IPTS: RHO = COS((JJ - 1) * DPATH): RHO1 = SIN((JJ - 1) * DPATH)
- 5270 SUM = 0: FOR K = 0 TO 3: XU(K) = XT(K) * RHO1 + XI(K) * RHO: SUM = SUM + XU(K) ^ 2: NEXT K
- 5280 SUM = SQR(SUM): FOR K = 1 TO 3: XU(K) = XU(K) / SUM: NEXT K
- 5290 J = J + 1: Y(J) = CNV * ATN(XU(3) / SQR(XU(1) ^ 2 + XU(2) ^ 2))
- 5300 XU(1) = XU(1) / COS(Y(J) / CNV): XU(2) = XU(2) / COS(Y(J) / CNV)
- 5310 IF XU(1) <> 0 THEN X(J) = CNV * ATN(XU(2) / XU(1)) ELSE X(J) = 90 * SGN(XU(2))
- 5320 IF XU(1) < 0 THEN IF X(J) < 0 THEN X(J) = 180 + X(J) ELSE X(J) = -180 + X(J)
- 5330 NEXT JJ: ERASE.FLAG% = -1: CALL MYLINE(14, X(), Y(), IPTS, XDAT(), YDAT())
- 5340 GOTO MENU
- 6000 GET.PREFIX: 'FETCH COUNTRY DATA
- 6010 CALL MY.COLOR( 14,0)
- 6020 GOSUB CLEAR.TEXT
- 6030 INPUT "Enter DX Prefix"; PF$: L2 = LEN(PF$): CALL UPPER.CASE(PF$)
- 6040 LOCATE 5, 1: PRINT SPACE$(24); : LOCATE 5, 1: JP = 0
- 6050 K = 1
- 6060 IF JP > N.ATL THEN GOTO 6120
- 6070 JP = JP + 1: PREFIX$(K) = ZPREFIX$(JP): COUNTRY$(K) = ZCOUNTRY$(JP): XLAT(K) = ZLAT(JP): XLONG(K) = ZLONG(JP)
- 6080 L1 = LEN(PREFIX$(K)): A$ = PF$: IF L2 > L1 THEN A$ = LEFT$(A$, L1)
- 6090 IF INSTR(PREFIX$(K), A$) = 0 THEN 6060
- 6100 PRINT USING "## "; K; : PRINT LEFT$(PREFIX$(K) + " " + COUNTRY$(K), 20): K = K + 1
- 6110 IF K < MAX.LINE - 7 THEN 6060
- 6120 PRINT : IF K = 1 THEN PRINT PF$ + " Not Found "; : K = -1: RETURN
- 6130 INPUT "Select one "; K
- 6140 IF K = 0 THEN K = 1: IF JP = N.ATL THEN PRINT PF$ + " Not Found "; : K = -1: RETURN ELSE GOSUB CLEAR.TEXT: GOTO 6060
- 6150 GOSUB CLEAR.TEXT
- 6160 XLONG(K) = -XLONG(K): RETURN
- 7000 GET.COUNTRY: 'FETCH COUNTRY DATA
- 7010 CALL MY.COLOR( 14,0)
- 7020 GOSUB CLEAR.TEXT
- 7030 PRINT "Enter Country Name ": INPUT CTY$: L2 = LEN(CTY$): CALL UPPER.CASE(CTY$)
- 7040 LOCATE 5, 1: PRINT SPACE$(24); : LOCATE 6, 1: PRINT SPACE$(24); : LOCATE 5, 1: JP = 0
- 7050 K = 1
- 7060 IF JP > N.ATL THEN GOTO 7130
- 7070 JP = JP + 1: PREFIX$(K) = ZPREFIX$(JP): COUNTRY$(K) = ZCOUNTRY$(JP): XLAT(K) = ZLAT(JP): XLONG(K) = ZLONG(JP)
- 7080 L1 = LEN(COUNTRY$(K)): A$ = CTY$: IF L2 > L1 THEN A$ = LEFT$(A$, L1)
- 7090 COUNTRY$ = COUNTRY$(K): CALL UPPER.CASE(COUNTRY$)
- 7100 IF INSTR(COUNTRY$, A$) = 0 THEN 7060
- 7110 PRINT USING "## "; K; : PRINT LEFT$(PREFIX$(K) + " " + COUNTRY$(K), 20): K = K + 1
- 7120 IF K < MAX.LINE - 7 THEN 7060
- 7130 PRINT : IF K = 1 THEN PRINT CTY$ + " Not Found "; : K = -1: RETURN
- 7140 INPUT "Select one "; K
- 7150 IF K = 0 THEN K = 1: IF JP = N.ATL THEN PRINT CTY$ + " Not Found "; : K = -1: RETURN ELSE GOSUB CLEAR.TEXT: GOTO 7060
- 7160 GOSUB CLEAR.TEXT
- 7170 XLONG(K) = -XLONG(K): RETURN
- 8000 PAINT.OCEANS: 'PAINT OCEANS
- 8010 IF NOT PAINT.FLAG% THEN RETURN
- 8020 NCOLOR = 7
- 8030 PAINT (FNXFORM(6), 0), 1, 7 'PAINT OCEANS BLUE
- 8040 PAINT (FNXFORM(45), -5), 1, 7 'PAINT OCEANS BLUE
- 8050 PAINT (FNXFORM(60), 0), 1, 7 'PAINT OCEANS BLUE
- 8060 PAINT (FNXFORM(75), 0), 1, 7 'PAINT OCEANS BLUE
- 8070 PAINT (FNXFORM(90), 0), 1, 7 'PAINT OCEANS BLUE
- 8080 PAINT (FNXFORM(105), -15), 1, 7 'PAINT OCEANS BLUE
- 8090 PAINT (FNXFORM(120), -15), 1, 7 'PAINT OCEANS BLUE
- 8100 PAINT (FNXFORM(135), 15), 1, 7 'PAINT OCEANS BLUE
- 8110 PAINT (FNXFORM(150), 0), 1, 7 'PAINT OCEANS BLUE
- 8120 PAINT (FNXFORM(180), 88), 1, 7 'PAINT OCEANS BLUE
- 8130 PAINT (FNXFORM(90), 88), 1, 7 'PAINT OCEANS BLUE
- 8140 PAINT (FNXFORM(0), 88), 1, 7 'PAINT OCEANS BLUE
- 8150 PAINT (FNXFORM(-90), 88), 1, 7 'PAINT OCEANS BLUE
- 8160 PAINT (FNXFORM(-180), 88), 1, 7 'PAINT OCEANS BLUE
- 8170 PAINT (FNXFORM(165), 0), 1, 7 'PAINT OCEANS BLUE
- 8180 PAINT (FNXFORM(180), 0), 1, 7 'PAINT OCEANS BLUE
- 8190 PAINT (FNXFORM(-165), 0), 1, 7 'PAINT OCEANS BLUE
- 8200 PAINT (FNXFORM(-150), 0), 1, 7 'PAINT OCEANS BLUE
- 8210 PAINT (FNXFORM(-135), 0), 1, 7 'PAINT OCEANS BLUE
- 8220 PAINT (FNXFORM(-120), 0), 1, 7 'PAINT OCEANS BLUE
- 8230 PAINT (FNXFORM(-105), 0), 1, 7 'PAINT OCEANS BLUE
- 8240 PAINT (FNXFORM(-90), 0), 1, 7 'PAINT OCEANS BLUE
- 8250 PAINT (FNXFORM(-45), 5), 1, 7 'PAINT OCEANS BLUE
- 8260 PAINT (FNXFORM(-30), 0), 1, 7 'PAINT OCEANS BLUE
- 8270 PAINT (FNXFORM(-15), 0), 1, 7 'PAINT OCEANS BLUE
- 8280 PAINT (FNXFORM(58), -5), 1, 7 'PAINT OCEANS BLUE
- 8290 PAINT (FNXFORM(-124), 34), 1, 7 'PAINT OCEANS BLUE
- 8300 PAINT (FNXFORM(-70), 32), 1, 7 'PAINT OCEANS BLUE
- 8310 PAINT (FNXFORM(5), 40), 1, 7 'PAINT MED SEA BLUE
- 8320 PAINT (FNXFORM(-95), 45), 2, 7 'PAINT USA YELLOW
- 8330 PAINT (FNXFORM(-120), 42), 2, 7 'PAINT USA YELLOW
- 8340 PAINT (FNXFORM(-76), 42), 2, 7 'PAINT USA YELLOW
- 8350 PAINT (FNXFORM(-150), 65), 2, 7 'PAINT ALASKA YELLOW
- 8360 PAINT (FNXFORM(51.5), 43), 1, 7 'CASPIAN SEA
- 8370 PAINT (FNXFORM(-90), 60), 1, 7 'HUDSONS BAY
- 8380 PAINT (FNXFORM(-90), 23), 1, 7 'GULF OF MEXICO
- 8390 RETURN
- 8400 DRAW.LAT.LON: 'DRAW LAT/LON LINES
- 8410 FOR XLAT = -90 TO 90 STEP 30
- 8420 LINE (-180, XLAT)-(180, XLAT), 6: NEXT
- 8430 FOR XLON = -180 TO 180 STEP 60
- 8440 LINE (XLON, -90)-(XLON, 90), 6: NEXT
- 8450 RETURN
- 9000 DRAW.TERMINATOR: 'CALCULATE TERMINATOR
- 9010 M0 = VAL(D$) - 1: D0 = VAL(MID$(D$, 4)): T0 = VAL(T$) + VAL(MID$(T$, 4)) / 60
- 9020 D0$ = FNDIG$(D0): H0$ = FNDIG$(INT(T0)): M0$ = FNDIG$(60 * (T0 - INT(T0)))
- 9030 YR.ANG = .0172 * (10 + 30.4 * M0 + D0): TILT = -.409 * COS(YR.ANG)
- 9040 T.NOON = 12 + .13 * SIN(YR.ANG) + .156 * SIN(2 * YR.ANG)
- 9050 IF M0 + 1 >= 4 AND M0 + 1 <= 10 THEN T.NOON = T.NOON + 1'DAYLIGHT SAVINGS TIME
- 9060 DT = -2 * PI * (T0 - T.NOON) / 24 + HOME.LON / CNV
- 9070 CP = COS(TILT): SP = SIN(TILT): CD = COS(DT): SD = SIN(DT)
- 9080 LL = 0: FOR L = 1 TO 363: XL = L: CL = COS(XL / CNV): SL = SIN(XL / CNV)
- 9090 X1 = -(SP * CD * CL + SD * SL)
- 9100 Y1 = -(SP * SD * CL - CD * SL)
- 9110 Z1 = CP * CL
- 9120 LL = LL + 1: XS(LL) = CNV * FNASIN(Z1): YS0 = CNV * FNATN2(X1, Y1): YS(LL) = YS0 - HOME.LON
- 9130 YSS = 360 * SGN(YS(LL)): IF ABS(YS(LL)) > 180 THEN YS(LL) = YS(LL) - YSS
- 9140 IF LL > 1 AND ABS(YS(LL) - YS(LL - 1)) > 60 THEN GOSUB 9260
- 9150 NEXT L
- 9160 CALL MYLINE(7, YS(), XS(), LL, XDAT(), YDAT())
- 9170 X1 = CP * CD: Y1 = CP * SD: Z1 = -SP
- 9180 X2 = CNV * FNASIN(Z1): Y2 = CNV * FNATN2(X1, Y1) - HOME.LON
- 9190 IF ABS(Y2) > 180 THEN Y2 = Y2 - 360 * SGN(Y2)
- 9200 IF ABS(Y2) > 178 THEN Y2 = 178 * SGN(Y2)
- 9205 LINE (-179.5, -89.5)-(179.5, 89.5), 7, B
- 9210 IF PAINT.FLAG% THEN PAINT (Y2, X2), 4, 7
- 9220 CALL MY.COLOR( 14,0): LOCATE 3, 1: PRINT SPACE$(79); : LOCATE 3, 26:
- 9230 PRINT USING "\\ \ \ \\:\\ Local .. Sunspot Number = ####"; D0$; MONTH$(M0); H0$; M0$; SSN;
- 9240 CALL MY.COLOR( 14,0)
- 9250 RETURN
- 9260 YS = YS(LL): YSS = 185 * SGN(YS(LL - 1)): YS(LL) = YSS: CALL MYLINE(7, YS(), XS(), LL, XDAT(), YDAT())
- 9270 YS(1) = 185 * SGN(YS): YS(2) = YS:
- 9280 XS(1) = XS(LL): XS(2) = XS(LL): LL = 2: RETURN
- 10000 SUB TRANSFORM (X0, Y0, X2, Y2, POLAR%) STATIC
- 10010 STATIC CT0, ST0, NFLAG
- 10020 SHARED CNV, PI, HOME.LAT, HOME.LON
- 10030 IF NOT NFLAG THEN GOTO INITIALIZE
- 10040 NORMAL:
- 10050 X = X0: Y = Y0
- 10060 Y = FNXFORM(Y): IF NOT POLAR% THEN X2 = X: Y2 = Y: EXIT SUB
- 10070 CT = COS(X / CNV): ST = SIN(X / CNV): CP = COS(Y / CNV): SP = SIN(Y / CNV)
- 10080 X1 = CT0 * ST - ST0 * CT * CP
- 10090 Y1 = CT * SP: Z1 = ST0 * ST + CT0 * CT * CP
- 10100 LAM! = FNACOS(Z1): PSI = FNATN2(X1, Y1)
- 10110 R = LAM! / PI: X2 = R * SIN(PSI): Y2 = R * COS(PSI)
- 10120 EXIT SUB
- 10130 INITIALIZE:
- 10140 CT0 = COS(HOME.LAT / CNV): ST0 = SIN(HOME.LAT / CNV)
- 10150 NFLAG = -1: GOTO NORMAL
- 10160 END SUB
- 11000 OP% = 1: RETURN 4030
- 11010 OP% = 2: RETURN 4030
- 11020 OP% = 3: RETURN 4030
- 11030 OP% = 4: RETURN 4030
- 11040 OP% = 5: RETURN 4030
- 11050 OP% = 6: RETURN 4030
- 11060 OP% = 7: RETURN 4030
- 11070 OP% = 8: RETURN 4030
- 11080 OP% = 9: RETURN 4030
- 12000 FETCH.MAP: 'WORLD MAP DATA INPUT
- 12010 OPEN "I", 1, "WORLDMAP.DAT":
- 12020 INPUT #1, X, Y: J = 1
- 12030 I = 0
- 12040 INPUT #1, X, Y: J = J + 1: Y = FNXFORM(Y)
- 12050 IF ABS(X) > 900 THEN CLOSE : GOTO 12120
- 12060 IF ABS(X) > 91 THEN GOSUB DRAW.LINE: GOTO 12030
- 12070 IF ABS(X - Y(I)) > 20 THEN GOSUB DRAW.LINE: I = 0: GOTO 12100
- 12080 IF ABS(Y - X(I)) > 20 AND ABS(X(I)) < 170 THEN GOSUB DRAW.LINE: I = 0: GOTO 12100
- 12090 IF ABS(Y - X(I)) > 20 THEN I = I + 1: XSS = X(I - 1): X(I) = 181 * SGN(XSS): Y(I) = X: GOSUB DRAW.LINE: Y(1) = X: XSS = X(I - 1): X(1) = -181 * SGN(XSS): I = 1
- 12100 I = I + 1: Y(I) = X: X(I) = Y
- 12110 GOTO 12040
- 12120 GET (-180, -90)-(0, 89), NSTORE1
- 12130 'NSEG = VARSEG(NSTORE1(0)): NOFF = VARPTR(NSTORE1(0))
- 12140 CALL PTR86(NSEG,NOFF,VARPTR(NSTORE1(0)) )
- 12150 DEF SEG = NSEG: BSAVE "MAPPER1.SCR", NOFF, 65000!: DEF SEG
- 12160 GET (0, -90)-(179, 89), NSTORE2
- 12170 'NSEG = VARSEG(NSTORE2(0)): NOFF = VARPTR(NSTORE2(0))
- 12180 CALL PTR86(NSEG,NOFF,VARPTR(NSTORE2(0)))
- 12190 DEF SEG = NSEG: BSAVE "MAPPER2.SCR", NOFF, 65000!: DEF SEG
- 12200 RETURN
- 13000 LAT.LON.SCRN:
- 13020 XBEGIN = -180: XEND = 180: YBEGIN = -90: YEND = 90
- 13030 CALL SCALE(XBEGIN, XEND, YBEGIN, YEND, XDAT(), YDAT())
- 13040 NCOLOR = 7: XTIC = 30: YTIC = 15
- 13050 CALL AXES(NCOLOR, NX.BEGIN, NX.END, NY.BEGIN, NY.END, XDAT(), YDAT(), XTIC, YTIC)
- 13060 LINE (-179.5, -89.5)-(179.5, 89.5), 7, B: CALL MY.COLOR( 14,0)
- 13070 RETURN
- 14000 REDRAW:
- 14010 GOSUB GET.DATE: GOSUB LAT.LON.SCRN
- 14020 CLS : IF PAINT.FLAG% THEN PAINT (0, 0), 0, 7
- 14030 GOSUB DRAW.TERMINATOR
- 14040 PUT (-180, -90), NSTORE1, OR
- 14045 PUT (0, -90), NSTORE2, OR
- 14050 GOSUB PAINT.OCEANS
- 14060 GOSUB DRAW.LAT.LON
- 14070 TIMER ON
- 14080 RETURN
- 15000 GET.NEW.DATE: 'ENTER NEW DATE AND TIME
- 15010 INPUT "Date (MM-DD) "; D$
- 15020 INPUT "Time (HH:MM) "; T$
- 15030 IF D$ = "" THEN D$ = DATE$
- 15040 IF T$ = "" THEN T$ = TIME$
- 15050 RETURN
- 16000 GET.DATE: D$ = DATE$: T$ = TIME$
- 16010 RETURN
- 17000 DRAW.LINE: CALL MYLINE(NCOLOR, X(), Y(), I, XDAT(), YDAT()): CALL MY.COLOR( 14,0): LOCATE 1, 1: PRINT "RECORD "; JJ, J; : 'A$=INPUT$(1)
- 17010 JJ = J: RETURN
- 18000 CLEAR.TEXT: FOR J = 5 TO MAX.LINE - 1: LOCATE J, 1: PRINT SPACE$(24); : NEXT J: LOCATE 5, 1: RETURN
- 19000 DELAY:
- 19010 FOR KK = 1 TO 10000: NEXT KK: RETURN
- 20000 PRINT.STRENGTH:
- 20010 LOCATE 5, 1: CALL MY.COLOR( 14,0)
- 20020 PRINT "Signal Predictions (dB)": PRINT : PRINT "Freq Lref Labs Prcv": PRINT " Ltx Lrx "
- 20030 S.COUNT% = 0: PR.BEST = -1000: N.BEST = 1: NO.PATH% = -1: FOR I = NFREQ TO 1 STEP -1: IF FREQ(I) < 1.2 * F.MUF AND PR(I) > PR.BEST THEN PR.BEST = PR(I): N.BEST = I
- 20040 IF S.COUNT% >= 7 THEN 20070
- 20050 IF PR(I) > -20 AND FREQ(I) > .8 * F.LUF AND FREQ(I) < 1.2 * F.MUF THEN NO.PATH% = 0: S.COUNT% = S.COUNT% + 1: PRINT USING "##.# ###.# ###.# #### "; FREQ(I); -REF.LOSS(I); ABSORB.LOSS(I); PR(I)
- 20060 IF PR(I) > -20 AND FREQ(I) > .8 * F.LUF AND FREQ(I) < 1.2 * F.MUF THEN NO.PATH% = 0: PRINT USING " ###.# ###.# "; -TX.LOSS(I); -RX.LOSS(I)
- 20070 NEXT I: I = N.BEST
- 20080 IF NO.PATH% THEN PRINT USING "##.# ###.# ###.# #### "; FREQ(I); -REF.LOSS(I); ABSORB.LOSS(I); PR(I)
- 20090 IF NO.PATH% THEN PRINT USING " ###.# ###.# "; -TX.LOSS(I); -RX.LOSS(I)
- 20100 IF NO.PATH% THEN PRINT : PRINT "No Feasible Freq"
- 20110 IF NO.PATH% THEN PRINT "Best of Bad Lot is Shown"
- 20120 RETURN
- 22000 SCRN.MODE:
- 22010 IF VIDEO$="VGA" THEN
- 22020 SCR.MODE%=12
- 22030 ELSEIF VIDEO$="EGA" THEN
- 22040 SCR.MODE%=9
- 22050 ELSEIF VIDEO$="MCGA" THEN
- 22060 SCR.MODE%=11
- 22070 ELSEIF VIDEO$="CGA" THEN
- 22080 SCR.MODE%=2
- 22090 ELSEIF VIDEO$="HERC" THEN
- 22100 SCR.MODE%=3
- 22110 ELSEIF VIDEO$="MONO" THEN
- 22120 SCR.MODE%=10
- 22130 END IF
- 22140 IF SCR.MODE%=12 THEN
- 22150 SCREEN SCR.MODE%:RESTORE 23010:READ MAX.LINE,MAX.VERT,NX.BEGIN,NX.END,NY.BEGIN,NY.END,PAINT.FLAG%
- 22160 ELSEIF SCR.MODE%=9 THEN
- 22170 SCREEN SCR.MODE%:RESTORE 23020:READ MAX.LINE,MAX.VERT,NX.BEGIN,NX.END,NY.BEGIN,NY.END,PAINT.FLAG%
- 22180 ELSEIF SCR.MODE%=11 THEN
- 22190 SCREEN SCR.MODE%:RESTORE 23030:READ MAX.LINE,MAX.VERT,NX.BEGIN,NX.END,NY.BEGIN,NY.END,PAINT.FLAG%
- 22200 ELSEIF SCR.MODE%=2 THEN
- 22210 SCREEN SCR.MODE%:RESTORE 23040:READ MAX.LINE,MAX.VERT,NX.BEGIN,NX.END,NY.BEGIN,NY.END,PAINT.FLAG%
- 22220 ELSEIF SCR.MODE%=10 THEN
- 22230 SCREEN SCR.MODE%:RESTORE 23050:READ MAX.LINE,MAX.VERT,NX.BEGIN,NX.END,NY.BEGIN,NY.END,PAINT.FLAG%
- 22240 ELSEIF SCR.MODE%=3 THEN
- 22250 SCREEN SCR.MODE%:RESTORE 23060:READ MAX.LINE,MAX.VERT,NX.BEGIN,NX.END,NY.BEGIN,NY.END,PAINT.FLAG%
- 22260 END IF
- 22270 RETURN
- 23000 'GRAPHICS PARAMETERS
- 23010 DATA 30,479,200,600,20,400,-1 : 'VGA
- 23020 DATA 25,349,200,600,20,300,-1 : 'EGA
- 23030 DATA 30,479,200,600,20,400, 0 : 'MCGA
- 23040 DATA 25,199,200,600,10,175, 0 : 'CGA
- 23050 DATA 25,349,200,600,20,300, 0 : 'EGA-MONO
- 23060 DATA 25,347,225,675,20,300, 0 : 'HERCULES
- 35000 SUB REFLECT (ELEV, WAVE.LEN, SEA%, RMAGV, VPHASE, RMAGH, HPHASE, REFLECT.LOSS) STATIC
- 35010 'REFLECTION COEFFICIENT CALCULATION
- 35020 SHARED CNV, PI
- 35030 IF SEA% THEN ER = 80: EI = -60 * WAVE.LEN * 4: DH = 4 ELSE ER = 15: EI = -60 * WAVE.LEN * .01: DH = 10
- 35040 RHO = EXP(-2 * (2 * PI * DH * SIN(ELEV / CNV) / WAVE.LEN) ^ 2)
- 35050 CA = COS(ELEV / CNV) ^ 2: SA = SIN(ELEV / CNV): SQ1 = ER - CA: PQ1 = .5 * ATN(EI / SQ1): SMAG = SQR(SQ1 ^ 2 + EI ^ 2)
- 35060 SMAG = SQR(SMAG): SQ1 = SMAG * COS(PQ1): SQ2 = SMAG * SIN(PQ1):
- 35070 DENH = (SQR((SA + SQ1) ^ 2 + SQ2 ^ 2)): PHASE1 = SQ2: PHASE2 = SA + SQ1: GOSUB 35150: HPHASE = PHASE
- 35080 NUMH! = (SQR((SA - SQ1) ^ 2 + SQ2 ^ 2)): PHASE1 = -SQ2: PHASE2 = SA - SQ1: GOSUB 35150: HPHASE1 = PHASE
- 35090 RMAGH = NUMH! / DENH: HPHASE = HPHASE1 - HPHASE
- 35100 DENV = SQR((SA * ER + SQ1) ^ 2 + (EI * SA + SQ2) ^ 2): PHASE1 = (EI * SA + SQ2): PHASE2 = (ER * SA + SQ1): GOSUB 35150: VPHASE = PHASE
- 35110 NUMV! = SQR((SA * ER - SQ1) ^ 2 + (EI * SA - SQ2) ^ 2): PHASE1 = (EI * SA - SQ2): PHASE2 = (ER * SA - SQ1): GOSUB 35150: VPHASE1 = PHASE
- 35120 RMAGV = NUMV! / DENV: VPHASE = VPHASE1 - VPHASE
- 35130 REFLECT.LOSS = FNDB(.5 * (RMAGH ^ 2 + RMAGV ^ 2) * RHO ^ 2)
- 35140 EXIT SUB
- 35150 '4 QUADRANT ARC TANGENT
- 35160 IF PHASE2 > 0 THEN PHASE = ATN(PHASE1 / PHASE2): RETURN
- 35170 IF PHASE1 < 0 THEN PHASE = -PI + ATN(PHASE1 / PHASE2) ELSE PHASE = PI + ATN(PHASE1 / PHASE2)
- 35180 RETURN
- 35190 END SUB
- 36000 SUB MULTIPATH (ELEV, WAVE.LEN, H.ANTENNA, XMULTV, XMULTH) STATIC
- 36010 ' MULTIPATH CALCULATION
- 36020 SHARED CNV, PI
- 36030 CALL REFLECT(ELEV, WAVE.LEN, 0, RMAGV, VPHASE, RMAGH, HPHASE, REFLECT.LOSS)
- 36040 ALPHAV = VPHASE - 4 * PI * H.ANTENNA * SIN(ELEV / CNV) / WAVE.LEN: XMULTV = FNDB((1 + RMAGV * COS(ALPHAV)) ^ 2 + (RMAGV * SIN(ALPHAV)) ^ 2)
- 36050 ALPHAH = HPHASE - 4 * PI * H.ANTENNA * SIN(ELEV / CNV) / WAVE.LEN: XMULTH = FNDB((1 + RMAGH * COS(ALPHAH)) ^ 2 + (RMAGH * SIN(ALPHAH)) ^ 2)
- 36060 XMULT = FNDB(.5 * (FNDBI(XMULTV) + FNDBI(XMULTH)))
- 36070 END SUB
- 39000 SUB MINIMUF (TLAT, TLON, RLAT, RLON, LPATH%, MONTH, DAY, TIME, SSN, NHOPS, EXTRA.HOPS%, F.MUF, F.LUF, E.CUTOFF) STATIC
- 39010 WIDTH LPRINT 128
- 39020 DIM M$(37), A$(4), M(12)
- 39030 SHARED H.TXANT(), H.RXANT(), TX.POL%(), RX.POL%(), FREQ(), WAVE.LEN(), NFREQ, TX.LOSS(), RX.LOSS(), REF.LOSS(), ABSORB.LOSS(), PT, GT(), GR(), PR(), E.MIN, ELEV
- 39040 RE = 6364: PI = 3.141593: RPD = PI / 180: PI2 = 2 * PI: CNV = 180 / PI: PI.D2 = PI / 2: X$ = STRING$(79, 61)
- 39045 HEIGHT.F2 = 300: HEIGHT.E = 110: HEIGHT.D = 90: POL.LAT = 78.3 / CNV: POL.LON = 69 / CNV
- 39050 GMT = TIME - TLON / 15: GMT = FNT.MOD(GMT, 24)
- 39060 T.LAT = TLAT * RPD: T.LON = -TLON * RPD: R.LAT = RLAT * RPD: R.LON = -RLON * RPD:
- 39070 PHI = CNV * FNASIN(RE * COS(E.MIN / CNV) / (RE + HEIGHT.F2)): TH = 180 - PHI - 90 - E.MIN: GR.MAX = 2 * TH * RE / CNV
- 39080 GOSUB 40000: REM TO MAIN CALCULATION LOOP
- 39090 EXIT SUB
- 40000 REM MINIMUF 4.1 CALCULATION LOOP
- 40010 COS.GRNG = SIN(T.LAT) * SIN(R.LAT) + COS(T.LAT) * COS(R.LAT) * COS(R.LON - T.LON)
- 40020 GRNG = FNACOS(COS.GRNG): IF LPATH% THEN GRNG = 2 * PI - GRNG
- 40030 MIN.NHOPS = 1 + FIX(RE * GRNG / GR.MAX)'NUMBER OF 3500 KM HOPS
- 40035 NHOPS = MIN.NHOPS + EXTRA.HOPS%
- 40040 HOP.INV = 1! / NHOPS
- 40050 F.MUF = 100: E.CUTOFF = 0: F.LUF = 0
- 40060 ANG = .5 * GRNG / CSNG(NHOPS): R.SLANT = SQR(RE ^ 2 + (RE + HEIGHT.F2) ^ 2 - 2 * RE * (RE + HEIGHT.F2) * COS(ANG))
- 40070 ELEV = CNV * FNACOS((RE + HEIGHT.F2) * SIN(ANG) / R.SLANT)
- 40080 PHID = CNV * FNASIN(RE * COS(ELEV / CNV) / (RE + HEIGHT.D))' INCIDENCE ANGLE ON D LAYER AT 90 KM
- 40090 PATH.LOSS = 2 * FNDB(4 * PI * R.SLANT * 2 * NHOPS * 1000)
- 40100 ANG = GRNG / (1 + NHOPS): EL.MAX = ATN(1 / TAN(ANG) - (RE / (RE + HEIGHT.F2)) / SIN(ANG)): IF EL.MAX < 18 / CNV THEN EL.MAX = 18 / CNV
- 40110 SEC.EINC = 1 / SQR(1 - ((RE / (RE + HEIGHT.E)) * COS(EL.MAX)) ^ 2)
- 40120 FOR I = 1 TO NFREQ
- 40130 CALL MULTIPATH(ELEV, WAVE.LEN(I), H.TXANT(I), XMULTV, XMULTH): IF TX.POL%(I) THEN TX.LOSS(I) = XMULTV ELSE TX.LOSS(I) = XMULTH
- 40140 CALL MULTIPATH(ELEV, WAVE.LEN(I), H.RXANT(I), XMULTV, XMULTH): IF RX.POL%(I) THEN RX.LOSS(I) = XMULTV ELSE RX.LOSS(I) = XMULTH
- 40150 REF.LOSS(I) = 0: ABSORB.LOSS(I) = 0: NEXT I
- 40160 FOR KHOP = 1 TO NHOPS: PATH.FRAC = (KHOP - .5) / NHOPS:
- 40170 REFL.PATH.FRAC = CSNG(KHOP - 1!) / NHOPS
- 40180 SIN.RLAT = SIN(R.LAT)
- 40190 COS.RLAT = COS(R.LAT)
- 40200 COS.RAZIM = (SIN(T.LAT) - SIN.RLAT * COS(GRNG)) / (COS.RLAT * SIN(GRNG))
- 40210 CTRL.RNG = GRNG * PATH.FRAC: REFL.RNG = GRNG * REFL.PATH.FRAC
- 40220 SIN.CLAT = SIN.RLAT * COS(CTRL.RNG) + COS.RLAT * SIN(CTRL.RNG) * COS.RAZIM
- 40230 SIN.RFLAT = SIN.RLAT * COS(REFL.RNG) + COS.RLAT * SIN(REFL.RNG) * COS.RAZIM
- 40240 COS.CLON = (COS(CTRL.RNG) - SIN.CLAT * SIN.RLAT) / (COS.RLAT * SQR(1 - SIN.CLAT ^ 2))
- 40250 COS.RFLON = (COS(REFL.RNG) - SIN.RFLAT * SIN.RLAT) / (COS.RLAT * SQR(1 - SIN.RFLAT ^ 2))
- 40260 CLON = FNACOS(COS.CLON): RFLON = FNACOS(COS.RFLON)
- 40270 C.LON = R.LON + SGN(SIN(T.LON - R.LON)) * CLON
- 40280 IF C.LON < 0 THEN C.LON = C.LON + PI2
- 40290 IF C.LON >= PI2 THEN C.LON = C.LON - PI2
- 40300 C.LAT = PI.D2 - FNACOS(SIN.CLAT)
- 40310 RF.LON = R.LON + SGN(SIN(T.LON - R.LON)) * RFLON
- 40320 IF RF.LON < 0 THEN RF.LON = RF.LON + PI2
- 40330 IF RF.LON >= PI2 THEN RF.LON = RF.LON - PI2
- 40340 RF.LAT = (PI.D2 - FNACOS(SIN.RFLAT)) * CNV: RFL = CNV * RF.LON: RF.LON = FNXFORM(-CNV * RF.LON): IF REFL.PATH.FRAC = 0 THEN 40380
- 40350 IF POINT(RF.LON, RF.LAT) = 1 THEN SEA% = -1 ELSE SEA% = 0
- 40360 FOR I = 1 TO NFREQ: CALL REFLECT(ELEV, WAVE.LEN(I), SEA%, RMV, VP, RMH, HP, REFLECT.LOSS)
- 40370 REF.LOSS(I) = REF.LOSS(I) + REFLECT.LOSS: NEXT I
- 40380 YR.ANGLE = .0172 * (10 + (MONTH - 1) * 30.4 + DAY)
- 40390 TILT.ANGLE = .409 * COS(YR.ANGLE): COSX1 = -1: COSX2 = -1: COSX3 = -1
- 40400 T.NOON = 3.82 * C.LON + 12 + .13 * (SIN(YR.ANGLE) + 1.2 * SIN(2 * YR.ANGLE))
- 40410 T.NOON = FNT.MOD(T.NOON, 24)
- 40420 IF COS(C.LAT + TILT.ANGLE) > -.26 THEN GOTO SUN.LIGHT
- 40430 T.SUN = 0
- 40440 COSX = 0
- 40450 M.FACT! = 2.5 * GRNG * HOP.INV
- 40460 IF M.FACT! > PI.D2 THEN M.FACT! = PI.D2
- 40470 M.FACT! = SIN(M.FACT!)
- 40480 M.FACT! = 1 + 2.5 * M.FACT! * SQR(M.FACT!)
- 40490 GOTO MUF.CALC
- 40500 SUN.LIGHT:
- 40510 T.SUN = (-.26 + SIN(TILT.ANGLE) * SIN(C.LAT)) / (COS(TILT.ANGLE) * COS(C.LAT) + 9.999999E-04)
- 40520 T.SUN = 12 - ATN(T.SUN / SQR(ABS(1 - T.SUN * T.SUN))) * 7.639437
- 40530 T.RISE = T.NOON - T.SUN / 2 + 12 * (1 - SGN(T.NOON - T.SUN / 2)) * SGN(ABS(T.NOON - T.SUN / 2))
- 40540 T.SET = T.NOON + T.SUN / 2 - 12 * (1 + SGN(T.NOON + T.SUN / 2 - 24)) * SGN(ABS(T.NOON + T.SUN / 2 - 24))
- 40550 COS.ZEN = ABS(COS(C.LAT + TILT.ANGLE))
- 40560 T.RELAX = 9.7 * COS.ZEN ^ 9.600001
- 40570 IF T.RELAX < .1 THEN T.RELAX = .1
- 40580 M.FACT! = 2.5 * GRNG * HOP.INV
- 40590 IF M.FACT! > PI.D2 THEN M.FACT! = PI.D2
- 40600 M.FACT! = SIN(M.FACT!)
- 40610 M.FACT! = 1 + 2.5 * M.FACT! * SQR(M.FACT!)
- 40620 IF T.SET < T.RISE THEN GOTO CHECK.TIME
- 40630 IF (GMT - T.RISE) * (T.SET - GMT) > 0 THEN GOTO DAY.TIME
- 40800 NITE.TIME:
- 40810 GMT0 = GMT + 12 * (1 + SGN(T.SET - GMT)) * SGN(ABS(T.SET - GMT))
- 40820 U0 = PI * T.RELAX / T.SUN
- 40830 U = (T.SET - GMT0) / 2
- 40840 U1 = -T.SUN / T.RELAX
- 40850 FRAC.SUN = PI * (GMT0 - T.SET) / (24 - T.SUN)
- 40860 COSX = COS.ZEN * (U0 * (EXP(U1) + 1)) * EXP(U) / (1 + U0 * U0): COSX1 = COSX
- 40870 FRAC.SUN = 0
- 40880 GOTO MUF.CALC
- 40900 CHECK.TIME:
- 40910 IF (GMT - T.SET) * (T.RISE - GMT) > 0 THEN GOTO NITE.TIME
- 41000 DAY.TIME:
- 41010 GMT0 = GMT + 12 * (1 + SGN(T.RISE - GMT)) * SGN(ABS(T.RISE - GMT))
- 41020 TAU0 = PI * (GMT0 - T.RISE) / T.SUN
- 41030 U0 = PI * T.RELAX / T.SUN
- 41040 U = (T.RISE - GMT0) / T.RELAX
- 41050 FRAC.SUN = PI * (GMT0 - T.RISE) / T.SUN
- 41060 COSX = COS.ZEN * (SIN(TAU0) + U0 * (EXP(U) - COS(TAU0))) / (1 + U0 * U0): COSX2 = COSX
- 41070 ALT.COSX = COS.ZEN * (U0 * (EXP(-T.SUN / T.RELAX) + 1)) * EXP((T.SUN - 24) / 2) / (1 + U0 * U0): COSX3 = ALT.COSX
- 41080 IF COSX >= ALT.COSX THEN GOTO MUF.CALC
- 41090 COSX = ALT.COSX
- 42000 MUF.CALC:
- 42010 MUF! = (1 + SSN / 250) * SQR(6 + 58 * SQR(COSX))
- 42020 FVERT = MUF!
- 42030 MUF! = MUF! * (1 - .1 * EXP((T.SUN - 24) / 3))
- 42040 MUF! = MUF! * (1 + (1 - SGN(T.LAT) * SGN(R.LAT)) * .1)
- 42050 MUF! = MUF! * (1 - .1 * (1 + SGN(ABS(SIN(C.LAT)) - COS(C.LAT))))
- 42060 FVERT1 = MUF!: MUF! = M.FACT! * MUF!:
- 43000 IF MUF! < F.MUF THEN F.MUF = MUF!
- 43010 GOSUB ECUTOFF: GOSUB D.LOSS: GOSUB SIGNAL.STRENGTH:
- 43020 'GOSUB PRINT.STUFF
- 43030 NEXT KHOP
- 43040 RETURN
- 45000 ECUTOFF: 'CALCULATE E LAYER CUTOFF FREQ
- 45010 E.FACT = .2: IF T.SUN = 0 THEN GOTO ESCREEN
- 45020 IF T.SUN * FRAC.SUN = 0 THEN GOTO ESCREEN
- 45030 E.COSX = COS.ZEN * SIN(PI * (GMT0 - T.RISE) / T.SUN)
- 45040 IF E.COSX > .174 THEN E.FACT = E.COSX ^ .3 ELSE E.FACT = (FNACOS(E.COSX) * CNV - 76) ^ -.4
- 45050 ESCREEN:
- 45060 E.SCREEN = (3.4 + .00544 * SSN) * E.FACT * SEC.EINC
- 45070 IF E.SCREEN > 7 THEN E.LUF = (1.33 * E.SCREEN - 3.31) ^ 2 / 7 ELSE E.LUF = .91 * E.SCREEN - .37
- 45080 IF F.LUF < E.LUF THEN F.LUF = E.LUF
- 45090 IF E.CUTOFF < E.SCREEN THEN E.CUTOFF = E.SCREEN
- 45100 RETURN
- 46000 D.LOSS: ' CALCULATE D REGION ABSORPTION
- 46002 MAG.LAT! = FNASIN(COS(POL.LAT) * COS(C.LAT) * COS(POL.LON - C.LON) + SIN(POL.LAT) * SIN(C.LAT))
- 46004 F.GYRO = .8 * SQR(1 + 3 * SIN(MAG.LAT!) ^ 2)
- 46010 CHI = CNV * FNACOS(COS.ZEN * SIN(PI * (GMT0 - T.RISE) / T.SUN))
- 46020 IF CHI < 102 THEN XLOSS = 1.5 * 430 * (1 + .0035 * SSN) * COS(.881 * CHI / CNV) ^ .75 / (COS(PHID / CNV)) ELSE XLOSS = 0
- 46025 IF CHI < 102 THEN XINDEX = (1 + .0037 * SSN) * COS(.881 * CHI / CNV) ^ 1.3 ELSE XINDEX = 0
- 46026 IF XINDEX < .1 THEN XINDEX = .1
- 46027 XLOSS = 677.2 * XINDEX / (COS(PHID / CNV))
- 46030 FOR I = 1 TO NFREQ: ABSORB.LOSS(I) = ABSORB.LOSS(I) + XLOSS / ((FREQ(I) + F.GYRO) ^ 2 + 10.2): NEXT I
- 46040 RETURN
- 46500 SIGNAL.STRENGTH: 'CALCULATE SIGNAL STRENGTH
- 46510 FOR I = 1 TO NFREQ
- 46520 PR(I) = FNDB(PT) + GT(I) + TX.LOSS(I) + GR(I) + RX.LOSS(I) + REF.LOSS(I) - ABSORB.LOSS(I) + 2 * FNDB(WAVE.LEN(I)) - PATH.LOSS
- 46530 PR(I) = PR(I) - FNDB(.0000005 ^ 2 / 50)
- 46540 NEXT I: RETURN
- 47000 PRINT.STUFF:
- 47010 LPRINT USING "KHOP = ### GMT= ### Fv=#####.# Fv1=#####.# Mf= ##.### MUF= #####.# "; KHOP; GMT; FVERT; FVERT1; M.FACT!; MUF!
- 47020 LPRINT USING " E.SCREEN=#####.# E.LUF=#####.# E.CUTOFF=#####.# F.LUF= #####.# "; E.SCREEN; E.LUF; E.CUTOFF; F.LUF
- 47030 LPRINT USING " C.LAT=####.# C.LON=####.# YR.ANGLE=####.# TILT.ANGLE=####.# COS.ZEN=##.###"; C.LAT * CNV; C.LON * CNV; YR.ANGLE * CNV; TILT.ANGLE * CNV; COS.ZEN
- 47040 LPRINT USING " R.LAT=####.# R.LON=####.# ELEV=####.# PHID=####.# R.SLANT=##### PATH.LOSS=####.#"; RF.LAT; RFL; ELEV; PHID; R.SLANT; PATH.LOSS
- 47050 FOR I = 1 TO NFREQ
- 47060 LPRINT USING " F= ###.# TX.LOSS=###.# RX.LOSS=###.# REF.LOSS=###.# ABSORB=###.# PR= ###.# ###"; FREQ(I); TX.LOSS(I); RX.LOSS(I); REF.LOSS(I); ABSORB.LOSS(I); PR(I); SEA%
- 47070 NEXT I
- 47080 LPRINT "": RETURN
- 47090 LPRINT USING " T.NOON=###.# T.SUN=###.# T.RISE=###.# T.SET=###.# T.RELAX=###.# "; T.NOON; T.SUN; T.RISE; T.SET; T.RELAX
- 47100 LPRINT USING " COSX=###.## COSX1=###.## COSX2=###.## COSX3=###.##"; COSX; COSX1; COSX2; COSX3
- 47110 LPRINT USING " TLAT=###.# TLON=###.# RLAT=###.# RLON=###.# GRNG=##### SSN=#### "; TLAT; TLON; RLAT; RLON; RE * GRNG; SSN
- 47120 LPRINT "": RETURN
- 48000 REM CALCULATION OF SUNSPOT NUMBER FROM SOLAR FLUX
- 48010 SSN = -103.7767 + 1.797429 * SF - (3.384356E-03) * SF ^ 2 + (4.525515E-06) * SF ^ 3
- 48020 SSN = INT(100 * SSN + .5) / 100
- 48030 RETURN
- 50000 END SUB
- 51000 ' VIDEO GRAPHICS FOR QUICK BASIC
- 51010 ' EMULATION OF CALCOMP ROUTINES
- 51020 '
- 52000 SUB SCALE (XBEGIN, XEND, YBEGIN, YEND, XDAT(1), YDAT(1)) STATIC
- 52010 ' SCALING ROUTINE TO SCALE PLOTS TO THE UNITS OF
- 52020 ' THE DATA TO BE PLOTTED
- 52030 WINDOW (XBEGIN, YBEGIN)-(XEND, YEND)
- 52040 XDAT(1) = XEND - XBEGIN: YDAT(1) = YEND - YBEGIN
- 52050 XDAT(2) = XBEGIN: YDAT(2) = YBEGIN
- 52060 XDAT(3) = XEND: YDAT(3) = YEND
- 52070 END SUB
- 52080 '
- 53000 SUB AXES (NCOLOR, NX.BEGIN, NX.END, NY.BEGIN, NY.END, XDAT(1), YDAT(1), XTIC, YTIC) STATIC
- 53010 ' DRAW BOX WITH AXES AND TIC MARKS
- 53020 ' NX..,NY.. ARE DOT VALUES WHICH DEFINE THE BEGINNING & END
- 53030 ' OF EACH AXIS IN VIDEO DOT UNITS 0<=DX<=639, 0<=DY<=MAX.VERT
- 53040 ' Y VALUES ARE DEFINED WITH 0 AT BOTTOM OF SCREEN.
- 53050 ' XTIC,YTIC ARE THE TIC SPACINGS IN UNITS OF THE DATA TO BE
- 53060 ' PLOTTED VIA SCALE AND MYLINE. XDAT AND YDAT ARE SCALING DATA IN
- 53070 ' SAME UNITS FROM SCALE ROUTINE.
- 53080 ' NCOLOR IS THE FOREGROUND COLOR
-
- 53090 DEFINT I-N: CALL MY.COLOR( NCOLOR,0)
- 53100 IF NX.BEGIN < 0 THEN NX.BEGIN = 0
- 53110 IF NX.END < 0 THEN NX.END = 0
- 53120 IF NY.BEGIN < 0 THEN NY.BEGIN = 0 ELSE IF NY.BEGIN > MAX.VERT THEN NY.BEGIN = MAX.VERT
- 53130 IF NY.END < 0 THEN NY.END = 0 ELSE IF NY.END > MAX.VERT THEN NY.END = MAX.VERT
- 53140 VIEW (NX.BEGIN, MAX.VERT - NY.BEGIN)-(NX.END, MAX.VERT - NY.END), , NCOLOR
- 53150 DY.TIC = .01 * ABS(XDAT(1)): DX.TIC = .01 * ABS(YDAT(1))
- 53160 FOR X = XDAT(2) TO XDAT(3) STEP XTIC
- 53170 LINE (X, YDAT(2))-STEP(0, DX.TIC)
- 53180 LINE (X, YDAT(3))-STEP(0, -DX.TIC)
- 53190 NEXT X
- 53200 FOR Y = YDAT(2) TO YDAT(3) STEP YTIC
- 53210 LINE (XDAT(2), Y)-STEP(DY.TIC, 0)
- 53220 LINE (XDAT(3), Y)-STEP(-DY.TIC, 0)
- 53230 NEXT Y
- 53240 END SUB
- 53250 '
- 54000 SUB MYLINE (NCOLOR, X(1), Y(1), NPTS, XDAT(1), YDAT(1)) STATIC
-
- 54010 DEFINT I-N
- 54015 IF SCR.MODE% =2 OR SCR.MODE%=3 OR SCR.MODE%=10 THEN
- 54016 IF NCOLOR= 2 THEN NCOLOR=0
- 54017 END IF
- 54020 FOR I = 2 TO NPTS
- 54030 IF ABS(X(I) - X(I - 1)) > .3 * XDAT(1) OR ABS(Y(I) - Y(I - 1)) > .3 * YDAT(1) THEN 54050
- 54040 LINE (X(I - 1), Y(I - 1))-(X(I), Y(I)), NCOLOR
- 54050 NEXT I
- 54060 END SUB
- 55000 SUB UPPER.CASE (A$) STATIC
- 55010 L = LEN(A$): IF L = 0 THEN EXIT SUB
- 55020 FOR I = 1 TO L
- 55030 K = ASC(MID$(A$, I, 1))
- 55040 IF K >= 97 AND K <= 122 THEN MID$(A$, I, 1) = CHR$(K - 32)
- 55050 NEXT I
- 55060 END SUB
- 56000 SUB MY.COLOR(N,M) STATIC
- 56010 IF SCR.MODE%>=12 THEN
- 56020 COLOR N
- 56030 ELSEIF SCR.MODE%> 7 AND SCR.MODE% <10 THEN
- 56040 COLOR N,M
- 56050 ELSEIF SCR.MODE%=0 THEN
- 56060 COLOR N,M
- 56070 END IF
- 56080 END SUB
-