home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
HAM Radio 1
/
HamRadio.cdr
/
cw
/
g3zczdoc
/
whatson.bas
< prev
next >
Wrap
BASIC Source File
|
1986-07-18
|
13KB
|
276 lines
10 KEY OFF:WIDTH "LPT1:",132:W$ = "WHATSON- HF propagation Prediction Program Version 1.91"
20 ON ERROR GOTO 600
30 DIM W$(500),A3(500),A4(500),L(1),T1(1),T3(1),T4(1),C0(1),T9(1),M(1),G6(1),G7(1),G8(1)
40 WIDTH 80:CLS:LOCATE 2,9:PRINT W$
50 BLANK$ = " ":FOR I = 1 TO 80:BLANK$ = BLANK$+" ":NEXT:LA$ = "LAT.":NA$ = " LON."
60 C1$ = CHR$(10)+CHR$(10)+CHR$(10):C2$ = CHR$(12)
70 D$ = "YyNnQq":X$ = "SsLl":Z$ = "PpSs":LA$ = "LAT.":NA$ = "LON.":P$ = "SHORT"
80 P1 = 3.14159266#
90 LOCATE 5,17:PRINT "BASED ON MINIMUF-3 PROGRAM DEVISED BY:"
100 LOCATE 7,18:PRINT "P.H LEVINE, R.B. ROSE J.N. MARTIN"
110 LOCATE 9,15:PRINT"MODIFIED BY G3CCZ,G4LH,G4GKO,4X4AS and G3ZCZ"
120 OPEN "G3ZCZ.DAT" FOR INPUT AS 1 ' GET STATION DATA
130 INPUT#1,G3ZCZ$,L5,W5:CLOSE#1
140 I% = 1:OPEN "WHATSON.DAT" FOR INPUT AS 1
150 GOSUB 700:GOSUB 2710:LOCATE 21,10:PRINT "PLEASE STANDBY WHILE PREFIX DATA ARE LOADED "
160 IF EOF(1) THEN 180
170 INPUT#1, W$(I%),A3(I%),A4(I%):I% = I%+1:GOTO 160
180 CLOSE#1:PX = I%-1
190 CR=0:GOSUB 410:LL$=Y$
200 IF M1 = 1 THEN 230 ELSE CLS
210 ' MAIN LOOP STARTS HERE
220 J9=P1/180: LN8=99:FOR CH9 = 1 TO PX: J9=P1/180: PX$ = W$(CH9):L6 = A3(CH9):W6 = A4(CH9):GOSUB 960 :NEXT CH9:GOTO 320
230 J9=P1/180:I = 1:CLS:LOCATE 1,32:PRINT "PREFIX MENU":PRINT:FOR C = 1 TO 4:PRINT " NBR PX";TAB(1+C*20);:NEXT: GOTO 250
240 FOR R = 4 TO 20:LOCATE R,1:PRINT BLANK$:NEXT
250 FOR C = 1 TO 4:FOR R = 4 TO 20:LOCATE R,(C-1)*20+1:PRINT I;:LOCATE R,(C-1)*20+6:PRINT "- ";W$(I):I = I+1:IF I>PX THEN I = 1
260 NEXT:NEXT
270 LOCATE 22,1:PRINT BLANK$:LOCATE 22,1:INPUT "Pick a number corresponding to a prefix (0 will give you further choices )";CH9:IF CH9 = 0 THEN 240
280 IF CH9 = 999 THEN GOSUB 490: GOTO 230
290 IF CH9<0 OR CH9>PX THEN 270
300 PX$ = W$(CH9):L6 = A3(CH9):W6 = A4(CH9) 'SET UP DESTINATION CO-ORDINATES
310 GOSUB 960
320 IF C2$= C1$ THEN 340
330 PRINT CHR$(12):IF P%=2 THEN LPRINT CHR$(12);CHR$(18)
340 PRINT:PRINT TAB(20)"DO YOU WANT ANOTHER QTH Y/N ?"
350 K$ = INKEY$:IF K$ = "" THEN 350
360 K = INSTR(D$,K$):IF K>0 THEN 380
370 BEEP:GOTO 350
380 IF K = 1 OR K = 2 THEN GOSUB 700: GOSUB 2710:GOTO 200
390 IF K = 3 OR K = 4 THEN 690
400 BEEP:GOTO 210
410 ' CALCULATE QRA SQUARE
420 IF CR = 0 THEN P = W5:R = L5 ELSE P = W6:R = L6
430 IF P>180 THEN P = P-360
440 P = (P+180)/20:R = (R+90)/10
450 Y = INT(P):X = INT(R):P = (P-Y)*10:R = (R-X)*10:C = INT(P):D = INT(R)
460 Y$ = CHR$(Y+65)+CHR$(X+65)+CHR$(C+48)+CHR$(D+48)
470 Y$ = Y$+CHR$(INT((P-C)*24)+65)+CHR$(INT((R-D)*24)+65)
480 Y$ = Y$:FOR K = 0 TO 5: Y(K) = ASC(MID$(Y$,K+1,1)):NEXT K:RETURN
490 ' SET UP G3ZCZ FOR YOUR STATION
500 CLS: LOCATE 2,9:PRINT W$:LOCATE 5,1: INPUT "What is your Call ";AA$
510 IF LEN(AA$) = 0 THEN 520 ELSE G3ZCZ$ = AA$
520 INPUT "What is your lattitude in degrees North ";J9: IF J9 = 0 THEN 530 ELSE L5 = J9
530 INPUT "What is your Longitude in degrees East ";J9: IF J9 = 0 THEN 540 ELSE W5 = J9
540 CLS:LOCATE 2,9: PRINT W$:LOCATE 8,1: PRINT "CALL SIGN ";TAB(30);G3ZCZ$:
550 LOCATE 10,1: PRINT "LATITUDE (Degrees North)";TAB(30);L5
560 LOCATE 12,1: PRINT "LONGITUDE (Degrees East)";TAB(30);W5
570 LOCATE 18,1: INPUT "Are the data correct (Y/N) ";AA$
580 IF LEFT$(AA$,1) = "Y" THEN 590 ELSE 500
590 OPEN "G3ZCZ.DAT" FOR OUTPUT AS 1: PRINT #1,G3ZCZ$;",";L5;",";W5: CLOSE #1: RETURN
600 ' ERROR TRAPPING ROUTINES
605 IF ERR = 62 AND ERL = 170 THEN RESUME 180
610 IF ERR <> 53 THEN 670
620 IF ERL =140 THEN BEEP:PRINT:PRINT "ERROR- WHATSON.DAT IS NOT ON LOGGED IN DRIVE":GOTO 690
630 BEEP:PRINT "ERROR- ":PRINT "G3ZCZ.DAT FILE Which holds your Geographical data IS NOT ON LOGGED IN DRIVE":PRINT:PRINT
640 INPUT " Do you want to create the file now ";AA$: IF LEN(AA$)=0 THEN 640
650 IF LEFT$(AA$,1) = "N" THEN 690 ELSE IF LEFT$(AA$,1) = "Y" THEN 660 ELSE 640
660 GOSUB 490:RESUME 140
670 IF ERR = 27 THEN PRINT "PRINTER OUT OF PAPER"
680 PRINT "ERROR ";ERR;" ON LINE ";ERL
690 END
700 CLS:LOCATE 2,10:PRINT "Are predictions for today (Y/N) "
710 K$ = INKEY$:IF K$ = "" THEN 710
720 K = INSTR(D$,K$): IF K = 1 OR K = 2 THEN 750
730 IF K = 3 OR K = 4 THEN 760
740 BEEP:GOTO 710
750 M0 = VAL(MID$(DATE$,1,2)):D0 = VAL(MID$(DATE$,4,2)): GOTO 800
760 LOCATE 4,10:INPUT "DAY";D0
770 IF D0<1 OR D0>31 THEN BEEP:GOTO 760
780 LOCATE 6,10:INPUT "MONTH(1...12) ";M0
790 IF M0<1 OR M0>12 THEN BEEP:GOTO 780
800 M0$=MID$("JanFebMarAprMayJunJulAugSepOctNovDec",(M0-1)*3+1,3)
810 LOCATE 8,10:INPUT "SUNSPOT NUMBER ";S0
820 IF ABS(W5-W6)<80 THEN K = 1: GOTO 870
830 LOCATE 10,20:PRINT"LONG OR SHORT PATH (L/S) ?"
840 K$ = INKEY$:IF K$ = "" THEN 840
850 K = INSTR(X$,K$):IF K>0 THEN 870
860 BEEP:GOTO 840
870 IF K = 1 OR K = 2 THEN P$ = "SHORT"
880 IF K = 3 OR K = 4 THEN P$ = "LONG"
890 LOCATE 12,10:PRINT"Output to printer (P) or Screen (S) ?"
900 K$ = INKEY$:IF K$ = "" THEN 900
910 K = INSTR(Z$,K$):IF K>0 THEN 930
920 BEEP:GOTO 900
930 IF K = 1 OR K = 2 THEN P% = 2:PL=55:C2$ = CHR$(12):GOTO 950
940 C2$ = C1$:PL=20
950 RETURN
960 IF P% = 2 THEN LPRINT CHR$(15);
970 W1 = -(W5-180*(1+SGN(W5-.001)))*J9
980 W2 = -(W6-180*(1+SGN(W6-.001)))*J9
990 L1 = L5*J9:L2 = L6*J9
1000 IF M1 = 1 THEN CLS:PRINT "G3ZCZ "+W$:PRINT " DAY:";D0;" MONTH:";M0;" SUN SPOT NUMBER:";S0
1010 IF M1 = 1 THEN IF P%=2 THEN LPRINT "G3ZCZ "+W$:LPRINT " DAY:";D0;" MONTH:";M0;" SUN SPOT NUMBER:";S0
1020 ' ROTATE LONGITUDE
1030 W3 = W2-W1+.001
1040 W3 = P1*(1-SGN(W3))+W3
1050 ' PATH LENGTH
1060 H1 = SIN(L1)*SIN(L2)+COS(L1)*COS(L2)*COS(W3)
1070 G1 = ATN (SQR(1 - H1*H1)/H1)+P1/2*(1-SGN(H1))
1080 IF P$ = "LONG" THEN G1 = P1+P1-G1
1090 IF M1= 2 THEN 1140
1100 N$ = "N":IF L5<0 THEN N$ = "S" ELSE IF L5 = 0 THEN N$ = " "
1110 IF W5 = 360 OR W5 = 0 THEN E$ = " " ELSE E$="E"
1120 PRINT:PRINT G3ZCZ$;" LOCAL QTH IS:";LA$;L5;N$;"/";NA$;W5;ES$;" = ";LL$:PRINT
1130 IF P%=2 THEN LPRINT:LPRINT G3ZCZ$;" LOCAL QTH IS:";LA$;L5;N$;"/";NA$;W5;ES$;" = ";LL$:LPRINT
1140 ' PATH LENGTH IN 4000 KM UNITS.
1150 H0 = INT(1.59*G1)+1
1160 ' BEARINGS.
1170 H9 = (SIN(L2)-H1*SIN(L1))/SIN(G1)/COS(L1)
1180 IF H9 < -.99999 THEN H9 = ATN(P1/2*(1-SGN(H9))):GOTO 1200
1190 H9 = ATN(SQR(1-H9*H9)/H9)+P1/2*(1-SGN(H9))
1200 H9 = H9*SGN(W3-P1)*SGN(P1-G1)
1210 H9 = H9+P1*(1-SGN(H9))
1220 BEARING=INT(H9/J9+.5):DISTANCE=INT(6356.775#*G1+.5)
1230 IF M1 = 1 THEN 1270
1240 LN8=LN8+1:IF LN8>PL THEN GOSUB 2630:LN8=1
1250 PRINT PX$;TAB(8);:IF P%=2 THEN LPRINT PX$;TAB(9);:LPRINT USING " ###";BEARING;:LPRINT USING " ##,### ";DISTANCE;
1260 GOTO 1330
1270 PRINT P$;" PATH TO ";PX$;", BEARING:";INT(H9/J9+.5);"deg. ";" DISTANCE:";INT(6356.775#*G1+.5);" KM ":PRINT
1280 IF P%=2 THEN LPRINT P$;" PATH TO ";PX$;", BEARING:";BEARING;"deg. ";" DISTANCE:";DISTANCE;" KM ":LPRINT
1290 PRINT "DATE & TIME OF PRINTOUT:";DATE$;"/";TIME$:PRINT
1300 IF P%=2 THEN LPRINT "DATE & TIME OF PRINTOUT:";DATE$;"/";TIME$:LPRINT
1310 PRINT TAB(3)"GMT" TAB(9)"HPF" TAB(16)"FOT" TAB(23)"LUF" TAB(41)"GMT" TAB(47)"HPF" TAB(54)"FOT" TAB(61)"LUF"
1320 IF P%=2 THEN LPRINT TAB(3)"GMT" TAB(9)"HPF" TAB(16)"FOT" TAB(23)"LUF" TAB(41)"GMT" TAB(47)"HPF" TAB(54)"FOT" TAB(61)"LUF"
1330 Y6 = ATN(1/TAN(G1/(H0+1))-.952/SIN(G1/(H0+1)))
1340 IF Y6<.314 THEN Y6 = .314
1350 Y6 = 1/SQR(1-.9650001*COS(Y6)^2)
1360 Y1 = .0172*(10+(M0-1)*30.4+D0)
1370 Y2 = .409*COS(Y1)
1380 Y1 = .13*SIN(Y1)+.156*SIN(Y1+Y1)
1390 ' DIRECTION COSINE.
1400 H9 = (SIN(L1)-COS(G1)*SIN(L2))/SIN(G1)/COS(L2)
1410 ' "M" FACTOR.
1420 M9 = SIN(2.5*G1/H0)
1430 M9 = 1+2.5*M9*SQR(M9)
1440 K1 = 1-.5/H0
1450 FOR N = 0 TO 1
1460 ' CONTROL POINT
1470 L9 = COS(G1*K1)*SIN(L2)+SIN(G1*K1)*COS(L2)*H9
1480 L0 = P1/2-(ATN(SQR(1-L9*L9)/L9)+P1/2*(1-SGN(L9)))
1490 W0 = (COS(G1*K1)-SIN(L2)*L9)/COS(L2)/COS(L0)
1500 IF W0 = 0 THEN W0 = .0000001
1510 W0 = ATN(SQR(1-W0*W0)/W0)+P1/2*(1-SGN(W0))
1520 W0 = P1-SGN(P1-G1*K1)*(P1-W0)
1530 W0 = W3+W0*SGN (W3-P1)*SGN(P1-G1)+W1-.001
1540 W0 = W0-P1*(1-SGN(P1+P1-W0))
1550 ' LOCAL NOON.
1560 T0 = 3.82*W0+12+Y1
1570 T0 = T0-12*(1+SGN(T0-24))*SGN(ABS(T0-24))
1580 IF COS(L0+Y2)>-.26 THEN 1620
1590 T1(N) = 0
1600 GOTO 1740
1610 ' DURATION OF SUNLIGHT.
1620 T1(N) = (-.26+SIN(Y2)*L9)/(COS(Y2)*COS(L0)+.001)
1630 T1(N) = 12-ATN(T1(N)/SQR(ABS(1-T1(N)*T1(N))))*24/P1
1640 ' T(dawn)
1650 T7 = T0-T1(N)/2
1660 T3(N) = T7+12*(1-SGN(T7))*SGN(ABS(T7))
1670 ' T(sunset)
1680 T7 = T0+T1(N)/2
1690 T4(N) = T7-12*(1+ SGN(T7-24))*SGN(ABS(T7-24))
1700 C0(N) = ABS(COS(L0+Y2))
1710 ' RELAXATION TIME.
1720 T9(N) = 9.7*(C0(N)^8)
1730 IF T9(N)<.1 THEN T9(N) = .1
1740 K1 = 1-K1
1750 ' F0F 2 MULTIPLIER.
1760 M(N) = M9*.75*((12/T1(N)-1)*SGN(INT(12/T1(N)))+1)
1770 M(N) = M(N)*(1+S0/100*(1-(T1(N)/12-1)*SGN(INT(T1(N)/12))))
1780 L9 = ABS(L0+.21*SIN(W0+.35))
1790 G2 = .5
1800 IF L9<P1/4 THEN 1830
1810 M(N) = M(N)*(1-.1*(1+COS(L9*4)))
1820 G2 = .2
1830 L(N) = SIN(L9*4)*G2
1840 ' EFECTIVE COS(X) PRESETS.
1850 G8(N) = P1*T9(N)/T1(N)
1860 T7 = T1(N)/T9(N)
1870 IF T7>85 THEN T7 = 85
1880 G7(N) = C0(N)*G8(N)*(EXP(-T7)+1)
1890 G6(N) = G7(N)*EXP ((T1(N)-24)/2)
1900 NEXT N
1910 FOR T5 = 0 TO 23
1920 J9 = 100
1930 K9 = 0
1940 FOR N = 0 TO 1
1950 G0 = 0
1960 G3 = P1/2
1970 IF T1(N) = 0 THEN 2160
1980 IF T4(N)<T3(N) THEN 2030
1990 ' DAY TIME?
2000 IF (T5-T3(N))*(T4(N)-T5)>0 THEN 2050
2010 GOTO 2210
2020 ' NIGHT TIME?
2030 IF (T5-T4(N))*(T3(N)-T5)>0 THEN 2210
2040 ' EFECTIVE COS(X)(day)
2050 T6 = T5+12*(1+SGN(T3(N)-T5))*SGN(ABS(T3(N)-T5))
2060 G4 = P1*(T6-T3(N))/T1(N)
2070 T8 = (T3(N)-T6)/T9(N)
2080 IF ABS(T8)>85 THEN T8 = 85*SGN(T8)
2090 G0 = C0(N)*(SIN(G4)+G8(N)*(EXP(T8)-COS(G4)))
2100 G3 = P1/2
2110 IF T6-T3(N)>T1(N)/2+3 THEN 2130
2120 G3 = (T6-T3(N))/(T1(N)/2+3)*G3
2130 G3 = G3*(1+SGN(L(N)))
2140 IF G0<G6(N) THEN G0 = G6(N)
2150 ' F0F 2
2160 G2 = SQR(7+45*SQR(G0/(1+G8(N)*G8(N))))
2170 ' HPF
2180 G2 = G2*M(N)*1.27*(1+SIN(G3)*L(N))
2190 GOTO 2270
2200 ' EFECTIVE COS(X)(night)
2210 T6 = T5+12*(1+SGN(T4(N)-T5))*SGN(ABS(T4(N)-T5))
2220 G4 = P1*(T6-T4(N))/(24-T1(N))
2230 G0 = G7(N)*EXP((T4(N)-T6)/2)
2240 G3 = G4+(P1-G4)/4*(1+SGN(L(N)))
2250 G4 = 0
2260 GOTO 2160
2270 IF G2<J9 THEN J9 = G2
2280 ' E LAYER.
2290 Y8 = .2: IF T1(N) = 0 THEN 2360
2300 IF T1(N)*G4 = 0 THEN 2360
2310 Y9 = C0(N)*SIN(P1*(T6-T3(N))/T1(N))
2320 IF Y9 > .174 THEN 2350
2330 Y8 = (ATN(SQR(1-Y9*Y9)/Y9)*180/P1-76)^(-.4)
2340 GOTO 2360
2350 Y8 = Y9 ^ (.3)
2360 Y9 = (3.4+.00544*S0)*Y8*Y6
2370 IF Y9>7 THEN 2400
2380 Y9 = .9099999*Y9-.37
2390 GOTO 2410
2400 Y9 = (1.33*Y9-3.31)^(2)/7
2410 IF K9<Y9 THEN K9 = Y9
2420 NEXT N
2430 F1=(J9+.5):F2=((J9/1.27)*.8499999)+5 :F3=K9+.5
2440 IF M1 = 1 THEN GOSUB 2540 ELSE GOSUB 2480 ' PRINT LINE OF DATA
2450 NEXT T5 :IF M1=1 THEN 2470
2460 PRINT :IF P%=2 THEN LPRINT
2470 RETURN
2480 IF F1<F2 THEN PRINT "-- "; :GOTO 2500
2490 IF F3<F2 THEN PRINT USING "## ";F2; ELSE PRINT "++ ";
2500 IF P%=2 THEN 2510 ELSE 2530
2510 IF F1<F2 THEN LPRINT "-- "; :GOTO 2530
2520 IF F3<F2 THEN LPRINT USING "## ";F2; ELSE LPRINT "++ ";
2530 RETURN
2540 PRINT USING" ##";T5;:IF F1< F2 THEN PRINT " ------------ ";:GOTO 2570
2550 IF F2< F3 THEN PRINT " ++++++++++++ ";:GOTO 2570
2560 PRINT USING"###### ";INT(F1);INT(F2);INT(F3);:PRINT " ";
2570 IF P%=2 THEN 2580 ELSE 2610
2580 LPRINT USING" ##";T5;:IF F1< F2 THEN LPRINT " ------------ ";:GOTO 2610
2590 IF F2< F3 THEN LPRINT " ++++++++++++ ";:GOTO 2610
2600 IF P%=2 THEN LPRINT USING"###### ";INT(F1);INT(F2);INT(F3);:LPRINT " ";
2610 IF T5/2<>INT(T5/2) THEN PRINT :IF P%=2 THEN LPRINT
2620 RETURN
2630 PRINT P$;" PATH OPTIMAL FREQUENCY PREDICTIONS FOR ";G3ZCZ$;" ON ";D0;M0$:PRINT
2640 IF P%=2 THEN LPRINT C2$:LPRINT:LPRINT P$;" PATH OPTIMAL FREQUENCY PREDICTIONS FOR ";G3ZCZ$;" ON ";D0;M0$
2650 PRINT "SUNSPOT NUMBER ";S0:PRINT:IF P%=2 THEN LPRINT "SUNSPOT NUMBER ";S0:LPRINT
2660 PRINT "PX 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24"
2670 IF P%=2 THEN LPRINT " PX BEARING DISTANCE 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24"
2680 PRINT "------------------------------------------------------------------------------"
2690 IF P%=2 THEN LPRINT "------------------------------------------------------------------------------------------"
2700 RETURN
2710 LOCATE 17,1:PRINT "Which Mode, Single Px or Contest Sheet (S/C) ? "
2720 K$ = INKEY$:IF K$ = "" THEN 2720
2730 M1= INSTR("SC",K$):IF M1=0 THEN BEEP: GOTO 2720
2740 RETURN