10 REM W0SL PGM FOR IBM PC XLATED BY N9HR
15 REM UPDATED 6/2006 KG4NIQ
20 CLEAR256:MAXFILES=1
40 CLS:KEY OFF:SCREEN 0,0:DEFINT J,U:DIM C(3,3):DIM N$(17)
50 PRINT "   MODEL 100 SATELLITE TRACKING PROGRAM"
55 PRINT"  TAB=MENU, ESC=EXITS, CTRL-R=RESTART"
60 FOR I=1 TO 1000:NEXT:CLS:D$=DATE$
130 GOSUB 1150
140 LINC=0:L5=0:W5=0
141 PRINT TAB(3);"** SELECT A SATELLITE TO TRACK **"
145 FOR I=1 TO 12
150 INPUT #1,N$(I),DD,DD,DD,DD,DD,DD,DD,DD,DD,DD,DD,DD,DD
151 NEXT I: CLOSE 1: FOR I=1 TO 12 STEP 3
160 IF I<10 THEN PRINT " "I;"= "N$(I)"    "I+1;"= "N$(I+1);"    "I+2;"= "N$(I+2):NEXT I
161 PRINT I;"= "N$(I)"   "I+1;"= "N$(I+1);"   "I+2;"= "N$(I+2):NEXT I
162 REM PRINT " 16 = "N$(16)
165 PRINT "NUMBER";
180 INPUT Q$:IF Q$="" OR VAL(Q$)>16 THEN 180
190 J=VAL(Q$)
195 GOSUB 1150
197 FOR I=1 TO 12
200 IF I=J THEN INPUT #1,I$,Y3,T0,I0,O0,E0,W0,M0,N0,N1,K0,F0,BA,BN:GOTO 210
205 INPUT #1,DD,DD,DD,DD,DD,DD,DD,DD,DD,DD,DD,DD,DD,DD:NEXT I
210 CLOSE 1:U1=VAL(RIGHT$(D$,2))
220 IF Y3=U1 OR Y3=U1-1 THEN 230 ELSE PRINT "DATA FOR ";I$;" IS OBSOLETE":STOP
230 P1=3.1415926535#:R0=6378.16:F=298.25
240 G0=75369793000000#:G1=1.0027379093#
250 P2=2*P1:P0=P1/180:F=1/F:L8=L9*P0:S9=SIN(L8):C9=COS(L8)
260 S8=SIN(-W9*P0):C8=COS(W9*P0)
270 R9=R0*(1-(F/2)+(F/2)*COS(2*L8))+H9/1000
280 L8=ATN((1-F)^2*S9/C9):Z9=R9*SIN(L8)
290 X9=R9*COS(L8)*C8:Y9=R9*COS(L8)*S8
300 R6=0:T6=0:GOSUB 1340:GOSUB 1070
310 GOSUB 390:GOSUB 1000
320 U7=U6+11
330 IF U7=>60 THEN U7=U7-60
340 Q$=INKEY$
350 IF Q$=CHR$(27) THEN CLS:GOSUB 5000
360 IF Q$=CHR$(18) THEN CLS:GOTO 60
365 IF Q$=CHR$(9) THEN CLS:GOSUB 1150:GOTO 140
370 T1=VAL(RIGHT$(TIME$,2)):IF T1=U7 THEN 310 ELSE 340
390 D$=DATE$:U1=VAL(RIGHT$(D$,2)):U2=VAL(LEFT$(D$,2)):U3=VAL(MID$(D$,4,2))
400 T=INT(30.55*(U2+2))-2*(INT(.1*(U2+7)))-91
410 IF U2>2 THEN IF U1/4=INT(U1/4) THEN T=T+1
420 IF Y3=U1-1 THEN T=T+365 ELSE 440
430 IF Y3/4=INT(Y3/4) THEN T=T+1
440 T$=TIME$:U4=VAL(LEFT$(T$,2)):U4=U4+TIME:U5=VAL(MID$(T$,4,2))
445 U6=VAL(RIGHT$(T$,2))
450 T=T+U3+U4/24+U5/1440+U6/86400!
460 AB(1)=COS(BA*P0)*COS(P1+BN*P0)
470 AB(2)=COS(BA*P0)*SIN(P1+BN*P0)
480 AB(3)=-SIN(BA*P0)
490 N=N0+2*(T-T0)*N1:A0=((G0/(N*N))^(1#/3#))
510 E2=1-E0*E0:E1=SQR(E2):Q0=M0/360+K0
520 K2=9.95*((R0/A0)^3.5)/(E2*E2)
530 S1=SIN(I0*P0):C1=COS(I0*P0)
540 O=O0-(T-T0)*K2*C1:S0=SIN(O*P0):C0=COS(O*P0)
550 W=W0+(T-T0)*K2*(2.5*(C1*C1)-.5)
560 S2=SIN(W*P0):C2=COS(W*P0)
570 C(1,1)=+(C2*C0)-(S2*S0*C1):C(1,2)=-(S2*C0)-(C2*S0*C1):C(1,3)=S0*S1
580 C(2,1)=+(C2*S0)+(S2*C0*C1):C(2,2)=-(S2*S0)+(C2*C0*C1):C(2,3)=-C0*S1
590 C(3,1)=+(S2*S1):C(3,2)=+(C2*S1):C(3,3)=C1
600 AX=C(1,1)*AB(1)+C(1,2)*AB(2)+C(1,3)*AB(3)
610 AY=C(2,1)*AB(1)+C(2,2)*AB(2)+C(2,3)*AB(3)
620 AZ=C(3,1)*AB(1)+C(3,2)*AB(2)+C(3,3)*AB(3)
630 Q=(N0+N1*(T-T0))*(T-T0)+Q0:K=INT(Q):M9=INT((Q-K)*256):M=(Q-K)*P2
640 E=M+E0*SIN(M)+.5*(E0*E0)*SIN(2*M)
650 S3=SIN(E):C3=COS(E):R3=1-E0*C3:M1=E-E0*S3
660 M5=M1-M:IF ABS(M5)>.0001 THEN E=E-M5/R3:GOTO 650
680 X0=A0*(C3-E0):Y0=A0*E1*S3:R=A0*R3
690 X1=X0*C(1,1)+Y0*C(1,2):Y1=X0*C(2,1)+Y0*C(2,2):Z1=X0*C(3,1)+Y0*C(3,2)
700 G7=T*G1+G2:G7=(G7-INT(G7))*P2:S7=-SIN(G7):C7=COS(G7)
710 BX=AX*COS(G7)+AY*SIN(G7)
720 BY=-AX*SIN(G7)+AY*COS(G7)
730 X=+(X1*C7)-(Y1*S7):Y=+(X1*S7)+(Y1*C7):Z=Z1
740 X5=(X-X9):Y5=(Y-Y9):Z5=(Z-Z9):R5=SQR(X5*X5+Y5*Y5+Z5*Z5)
750 Z8=+(X5*C8*C9)+(Y5*S8*C9)+(Z5*S9)
760 X8=-(X5*C8*S9)-(Y5*S8*S9)+(Z5*C9):Y8=+(Y5*C8)-(X5*S8)
770 S5=Z8/R5:C5=SQR(1-S5*S5):E9=ATN(S5/C5)/P0
800 IF X8<0 THEN A9=P1+ATN(Y8/X8) ELSE 820
810 GOTO 850
820 IFX8>0ANDY8>0THENA9=ATN(Y8/X8)ELSEIFX8>0THENA9=P2+ATN(Y8/X8)ELSE 840
830 GOTO 850
840 IF Y8<0 THEN A9=3*P1/2 ELSE A9=P1/2
850 A9=A9/P0
860 IFX<0THENW5=P1+ATN(Y/X)ELSE880
870 GOTO910
880 IFX>0ANDY>0THENW5=ATN(Y/X)ELSEIFX>0THENW5=P2+ATN(Y/X)ELSE900
890 GOTO910
900 IFY<0THENW5=3*P1/2ELSEW5=P1/2
910 W5=360-W5/P0:B5=Z/R:L5=ATN(B5/(SQR(1-B5^2)))/P0
920 F8=(R5-R6)/((T6-6)*86400)*F0*1000/299792.5
930 R6=R5:T6=T
940 LA=(BX*X5+BY*Y5+AZ*Z5)/R5
950 LA=-ATN(LA/SQR(-LA*LA+1#))+P1/2
960 LA=(P1-LA)*180/P1:RETURN
1000 GOSUB 4000:PRINT T$;" ";
1010 IF B=0 AND E9>=0 THEN B=1:BEEP:BEEP:BEEP:BEEP:BEEP:BEEP:BEEP:BEEP:BEEP
1020 IF B=1 AND E9<0 THEN B=0:BEEP:BEEP:BEEP:BEEP:BEEP:BEEP:BEEP:BEEP:BEEP
1050 PRINT TAB(10);
1060 PRINT USING"### ### ##### ###.## ### ###";A9,E9,R5,F8,M9,LA:RETURN
1070 CLS:PRINT"QTH: ";C$;"  ";I$;"  ";"LAT: ";
1072 PRINTUSING "### ";L5;
1074 PRINT "LONG:";
1076 PRINTUSING "###";W5
1080 PRINT D$;TAB(10);"AZM ELV RANGE   DPLR PHS PA"
1090 PRINT TAB(10);"--- --- -----  ----- --- ---":RETURN
1100 PRINT "  MODEL 100/102/200 TRACKING PROGRAM   "
1102 PRINT"  TAB=MENU, ESC=EXITS, CTRL R=COLD START"
1103 RETURN
1150 OPEN "RAM:KEPLRN.DO"FOR INPUT AS 1:INPUT #1,L9,W9,H9,C$,TIME:RETURN
1340 SY=Y3+1900
1350 X2=INT((SY-1)/100)
1360 G2=2#-X2+INT(X2/4)+INT(365.25*(SY-1))+INT(30.6001*14)
1370 G2=(G2-730550.5#)/36525!
1380 G2=(G2*(G2*(G2*-7.1759593D-11+.00000107759259#)+100.002139#))+.279057273#
1390 G2=G2-INT(G2):RETURN
4000 IF LINC=3 THEN GOTO 4010 ELSE LINC=LINC+1:RETURN
4010 CLS:LINC=0:GOSUB 1070:RETURN
5000 MENU
5010 END