10 '-------- HALLEY.BAS COMET EPHEMERIS --------- ADJUSTED TO EPOCH 2000 12 ' 15 ' Modified 7/17/85 and 11/85 by John Williams 214-234-4600 Richardson, TX 75080-4105 16 ' Source program in ASTRONOMY Magazine - February 1985 pp.75-77 17 ' Correct to E2000.0 ASTRONOMY Magazine - March 1985 pp.33 18 ' 20 ' Original program by Roger Browne and Richard Berry 22 ' Original HALLEY.BAS[74206.110] on Compuserve 23 ' 24 ' Original FHALLEY.BAS from Astronomer's RBBS - July 1985 30 ' Mods by Dick Gronberg for CP/M 40 ' Dick Gronberg [70020,216] 919-765-6158 50 ' 60 DEFINT I-J 70 CL$=CHR$(&H1A): 'clear screen, ADM 31 terminal 80 JY$="85":JC=1900: 'Current year 85, Current century 1900 - change as req'd 90 PI=3.14159: 'Dont ask 100 CO$="COMET HALLEY" 110 PH=1986.11:' Orbital elements -- changeable to other comets 120 PL=170.011:' See "Practical Astronomy With Your Calculator" 130 AN=58.1453:' Peter Duffett-Smith, Cambridge University Press 140 PY=76.0081 150 SM=17.9435 160 EO=.967267 170 AO=162.239 180 PRINT CL$ 190 PRINT 200 PRINT " Modified for PC host: Chuck Cole, Astronomer's RBBS" 210 PRINT " 24hr modem, 1200/300, @ (305) 268-8576 " 220 PRINT:PRINT 230 PRINT " ";CO$ 240 PRINT "- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - " 250 PRINT " EPHEMERIS (EPOCH 2000) FOR DATES BETWEEN 1946 AND 2026" 260 PRINT " by Roger Browne - ASTRONOMY Magazine, February 1985":PRINT 270 PRINT"This program has two modes: a single date to the screen, or continuous" 280 PRINT"dates to a diskfile and the screen. Select (O)ne date or (C)ontinuous : "; 290 A$="":LINE INPUT A$ 295 IF A$ = "c" THEN A$ = "C" 300 IF A$<>"C" THEN J9=0:GOTO 490 310 J9=1:'Set continuous flag 320 PRINT:PRINT"Enter start date (e.g. 11/21/1984): ";:GOSUB 2950 330 Y=Y5:M=M5:D=D5:D$=D5$ 340 PRINT:PRINT"Enter end date +1: ";:GOSUB 2950 350 Y4=Y5:M4=M5:D4=D5 360 REM ------ GOSUB 2120: 'Output device dialogue - HDOS (Heath/Zenith H-89) 365 REM ------ GOTO 380 370 GOSUB 2230: 'Output file dialogue - ( CP/M - Microsoft BASIC - IBM ) 380 J7=0:JP=1 390 GOSUB 2310:'Do Heading 400 GOSUB 3190:'Get initial formatted date (DF$) 410 PRINT CL$ 420 GOSUB 2870:'Heading for screen 430 GOTO 510:'On to business 440 GOSUB 2470:'Print formatted data 450 GOSUB 3120:'Bump date 460 IF Y=Y4 AND M=M4 AND D=D4 GOTO 480 470 GOTO 510 480 PRINT: GOTO 1820 485 REM ONE DATE - - - - - - - - - - - - - - - - - - - - - 490 PRINT:PRINT"Enter Date (e.g. 11/21/1984): ";:GOSUB 2950 500 Y=Y5:M=M5:D=D5:DT$=D5$ 510 X=PH:'Calculations for the Comet - Start Roger Browne's program here 520 IF Y>=1986 THEN Z=1984 530 IF Y<1986 THEN Z=1988 540 IF Y>=1986 THEN S=0 550 IF Y<1986 THEN S=1 560 GOSUB 1860 570 DS=N 580 B=(360/PY)*(N/365.25) 590 K=B 600 GOSUB 1990 610 B=(K*PI)/180 620 E=B 630 Y1=EO 640 Q=E-(Y1*SIN(E))-B 650 IF ABS(Q)<=.000017 THEN GOTO 690 660 U=Q/(1-(Y1*COS(E))) 670 E=E-U 680 GOTO 640 690 V=(SQR((1+Y1)/(1-Y1))*TAN(E/2)) 700 V=2*ATN(V) 710 V1=(V*180)/PI 720 L=V1+PL 730 R=SM*(1-(Y1*Y1))/(1+Y1*COS(V)) 740 F=L-AN 750 F2=AO 760 F1=(F*PI)/180 770 F2=(F2*PI)/180 780 ZI=(SIN(F1)*SIN(F2)) 790 ZI=ATN(ZI/SQR(-ZI*ZI+1)) 800 P=ATN(TAN(F1)*COS(F2)) 810 P1=(P*180)/PI+AN 820 IF F>=90 AND F<=270 THEN P1=P1+180 830 IF P1<0 THEN P1=P1+360 840 P=(P1*PI)/180 850 R2=R*COS(ZI) 860 X=1975:'Calculations for the Earth 870 IF Y>=X THEN Z=1972 880 IF Y=X THEN S=0 900 IF Y360 THEN ZJ=ZJ-360 1010 IF ZJ<0 THEN ZJ=ZJ+360 1020 H=((ZJ-102.51044#)*PI)/180 1030 R1=(1-C*C)/(1+C*COS(H)) 1040 U1=((P1-ZJ)*PI)/180:'Compute Ecliptic Coordinates 1050 U2=((ZJ-P1)*PI)/180 1060 IF R2360 THEN Q2=Q2-360 1170 IF Q2<0 THEN Q2=Q2+360 1180 Q4=(Q2*PI)/180 1190 Q5=(R2*TAN(ZI)*SIN(Q4-P)) 1200 Q5=Q5/(R1*SIN(U1)) 1210 Q5=ATN(Q5) 1220 E1=.40893064#:'Convert to Equatorial Coordinates 1230 L1=(SIN(Q5)*COS(E1)) 1240 L1=L1+(COS(Q5)*SIN(E1)*SIN(Q4)) 1250 M1=ATN(L1/SQR(-L1*L1+1)) 1260 Y2=(M1*180)/PI 1270 B1=(TAN(Q4)*COS(E1)) 1280 B1=B1-((TAN(Q5)*SIN(E1))/COS(Q4)) 1290 G=ATN(B1) 1300 H1=(G*180)/PI 1310 Z1=INT(Q2/90) 1320 ZK=INT(H1/90) 1330 IF Z1-ZK=4 OR Z1-ZK=1 THEN H1=H1+360 1340 IF Z1-ZK=2 OR Z1-ZK=3 THEN H1=H1+180 1350 IF Z1-ZK=-4 THEN H1=H1+360 1360 IF Z1-ZK=-2 THEN H1=H1-180 1361 REM 1363 - 1367 ADDED Correction To EPOCH 2000 - March 1985 ASTRONOMY 1363 RP=3.073+1.336*SIN(H1*PI/180)*TAN(M1) 1364 H1=H1+50*15*RP/3600 1365 IF H1>360 THEN H1=H1-360 1366 DP=20.04*COS(H1*PI/180) 1367 Y2=Y2+50*DP/3600 1369 REM -------------------------------------------------------- 1370 N1=H1/15 1380 W=INT((N1-INT(N1))*60+.5) 1390 IF W=60 THEN N1=N1+1 1400 IF W=60 THEN W=0 1410 K1=ABS(Y2) 1420 W1=INT((K1-INT(K1))*60+.5) 1430 IF W1=60 THEN G1=G1+1 1440 IF W1=60 THEN W1=0 1450 G1=INT(K1) 1460 IF Y2<0 AND G1<1 THEN W1=-W1 1470 D1=R1*R1+R2*R2 1480 D1=D1-(2*R1*R2*COS(U1)) 1490 D2=SQR(D1) 1500 R3=D2/COS(ZI) 1510 K9=R 1520 GOSUB 2080 1530 R=K9 1540 K9=R3/10 1550 GOSUB 2080 1560 R3=K9*10 1570 M0=4.1:N=3.1 1580 IF DS<0 THEN M0=5:N=4.44 1590 MA=M0+5*.4343*LOG(R3) 1600 MA=MA+N*2.5*.4343*LOG(R) 1610 MA=(INT(10*MA))/10 1620 IF Y2<0 THEN G1=-G1 1630 IF J9=1 GOTO 440:'Do file/printer output stuff 1640 REM ------------------------------- 1650 REM Print Ephemeris For Date 1660 REM ------------------------------- 1670 PRINT "---------------------------" 1680 PRINT "DATA FOR "+CO$ 1690 PRINT "DATE: ";DT$ 1700 PRINT "DAYS TO PERIHELION ";INT(DS) 1710 PRINT 1720 PRINT "EPOCH 2000 COORDINATES:" 1730 PRINT " RA:";INT(N1);"HRS";W;"MIN" 1740 PRINT "DEC:";G1;"DEG";W1;"MIN" 1750 PRINT 1760 PRINT "DISTANCES:" 1770 PRINT "COMET TO SUN";R;"AU" 1780 PRINT "COMET TO EARTH";R3;"AU" 1790 PRINT 1800 PRINT "PREDICTED MAGNITUDE";MA 1810 PRINT "-------------------------" 1820 A9$="":INPUT " ANOTHER DATE (Y/N ) ";A9$ 1830 IF A9$="n" OR A9$="N" THEN GOTO 1840 1835 GOTO 180 1836 REM - - - - - - - - 1840 PRINT CL$ 1850 CHAIN "ASTRMENU.BAS" 1852 REM - - - - - - - - 1860 A=(Y-Z)/4:'Days to perihelion 1870 A1=INT(A+S) 1880 N=365*(Y-X+S)+A1 1890 IF INT(A)<>A THEN GOTO 1910 1900 IF (M=2 AND D<29) OR M=1 THEN N=N-1 1910 IF M>2 THEN GOTO 1950 1920 M2=M-1 1930 M2=31*M2 1940 GOTO 1970 1950 M2=M+1 1960 M2=INT(30.6*M2)-63 1970 N=N+M2+D-365*S 1980 RETURN 1990 IF K<0 THEN GOTO 2010:'Place between 0 & 360 deg 2000 IF K>360 THEN GOTO 2040 2010 K=K+360 2020 IF K>=0 THEN GOTO 2070 2030 GOTO 2010 2040 K=K-360 2050 IF K<=360 THEN GOTO 2070 2060 GOTO 2040 2070 RETURN 2080 K9=K9*1000:'Round off subr 2090 K9=INT(K9+.5) 2100 K9=K9/1000 2110 RETURN 2120 PRINT CL$:'This subr is intended for HDOS only 2130 PRINT"SPECIFY OUTPUT DEVICE (Printer or Diskfile)" 2140 PRINT"Printer device driver must be loaded (LOAD LP:)" 2150 PRINT"prior to answering 'P'":PRINT 2160 INPUT"Output data to

rinter or ile";A$ 2170 IF A$="P" THEN 2210 2180 INPUT"Specify filename (SYx:fname.)";A8$ 2190 IF LEFT$(A8$,2)<>"SY" THEN A8$="SY"+A8$ 2200 OPEN "O",1,A8$:GOTO 2220 2210 OPEN "O",1,"LST" 2220 RETURN 2230 PRINT CL$:'This subr is intended for CP/M & IBM-PC/DOC only 2240 PRINT"SPECIFY FILENAME: Be sure enough disk space is available." 2250 PRINT"Two years of ephemeris requires about 60k." 2260 PRINT:'GET OUTPUT ON DISKFILE AND PRINT LATER 2270 PRINT:INPUT"Specify filename (e.g. B:HALLEY.DAT)";A8$ 2280 OPEN "O",1,A8$ 2290 RETURN 2300 'Heading 2310 PRINT#1," EPHEMERIS FOR ";CO$;" STARTING ";D$ 2320 PRINT#1, 2330 PRINT#1,TAB(5)"PAGE ";JP; 2340 PRINT#1,TAB(17)"DAYS FROM"; 2350 PRINT#1,TAB(30)"EPOCH 2000 CORD'S:"; 2360 PRINT#1,TAB(50)"DISTANCES (AU):"; 2370 PRINT#1,TAB(67)"PREDICTED" 2380 PRINT#1,TAB(8)"DATE"; 2390 PRINT#1,TAB(17)"PERIHELION"; 2400 PRINT#1,TAB(31)"RA DEC"; 2410 PRINT#1,TAB(51)"SUN EARTH"; 2420 PRINT#1,TAB(67)"MAGNITUDE" 2430 PRINT#1,"----+----+----+----+----+----+----+----+----+----+----+"; 2440 PRINT#1,"----+----+----+----+----+" 2450 JP=JP+1 2460 RETURN 2470 PRINT#1,TAB(5);DF$;TAB(20)INT(DS);TAB(30);:'Format data for printing 2480 F1$=STR$(INT(N1)) 2490 F2$=RIGHT$(F1$,2) 2500 IF LEFT$(F2$,1)=" " THEN F2$="0"+RIGHT$(F1$,1) 2510 RA$=F2$+":" 2520 F1$=STR$(W) 2530 F2$=RIGHT$(F1$,2) 2540 IF LEFT$(F2$,1)=" " THEN F2$="0"+RIGHT$(F1$,1) 2550 RA$=RA$+F2$ 2560 PRINT#1,RA$;" "; 2570 F1$=STR$(G1) 2580 JL=LEN(F1$) 2590 IF JL=2 THEN DC$=LEFT$(F1$,1)+"0"+RIGHT$(F1$,1) ELSE DC$=F1$ 2600 DC$=DC$+":" 2610 F1$=STR$(W1) 2620 JL=LEN(F1$) 2630 IF JL=2 THEN F2$=LEFT$(F1$,1)+"0"+RIGHT$(F1$,1) ELSE F2$=F1$ 2640 IF LEFT$(F2$,1)="-" GOTO 2650 ELSE GOTO 2660 2650 DC$="-"+RIGHT$(DC$,3)+RIGHT$(F2$,2):GOTO 2670 2660 DC$=RIGHT$(DC$,4)+RIGHT$(F2$,2) 2670 PRINT#1,DC$; 2680 PRINT#1,TAB(50) 2690 PRINT#1,USING"##.##";R; 2700 PRINT#1," "; 2710 PRINT#1,USING"##.##";R3; 2720 PRINT#1,TAB(69)MA 2730 'The following sends data to the screen just to let you know something 2740 'is going on. 2750 PRINT TAB(5);DF$;TAB(20)INT(DS);TAB(30); 2760 PRINT RA$; 2770 PRINT " "; 2780 PRINT DC$; 2790 PRINT TAB(50) 2800 PRINT USING"##.##";R; 2810 PRINT " "; 2820 PRINT USING"##.##";R3; 2830 PRINT TAB(69)MA 2840 J7=J7+1:' Line counting 2850 IF J7=55 THEN J7=0:PRINT#1,CHR$(12):GOSUB 2310 2860 RETURN 2870 PRINT TAB(8)"DATE";:'For the screen only 2880 PRINT TAB(17)"PERIHELION"; 2890 PRINT TAB(31)"RA DEC"; 2900 PRINT TAB(51)"SUN EARTH"; 2910 PRINT TAB(67)"MAGNITUDE" 2920 PRINT "----+----+----+----+----+----+----+----+----+----+----+"; 2930 PRINT "----+----+----+----+----+" 2940 RETURN 2950 LINE INPUT DT$:'Date catching routine (input in mm/dd/yy format) 2960 J1=INSTR(DT$,"/") 2970 J2=INSTR(J1+1,DT$,"/") 2980 J3=LEN(DT$) 2990 IF J1=0 THEN M5$=DT$:D5$="1":Y5$=JY$:GOTO 3070 3000 M5$=LEFT$(DT$,J1-1) 3010 IF J2=0 GOTO 3050 3020 D5$=MID$(DT$,J1+1,(J2-1)-J1) 3030 Y5$=RIGHT$(DT$,J3-J2) 3040 GOTO 3070 3050 Y5$=JY$ 3060 D5$=RIGHT$(DT$,J3-J1) 3070 M5=VAL(M5$):D5=VAL(D5$):Y5=VAL(Y5$) 3080 IF Y5<100 THEN Y5=Y5+JC:Y5$=RIGHT$(STR$(Y5),4) 3090 D5$=M5$+"/"+D5$+"/"+Y5$ 3100 IF Y5<1946 OR Y5>2026 THEN GOTO 2950 3110 RETURN:' With date in M5, D5, Y5 and D5$ 3120 D=D+1:'Bump date 3130 IF D<29 GOTO 3190 3140 IF Y/4=INT(Y/4) AND M=2 AND D=30 THEN D=1:M=3:GOTO 3190 3150 IF Y/4<>INT(Y/4) AND M=2 AND D=29 THEN D=1:M=3:GOTO 3190 3160 IF (M=9 OR M=4 OR M=6 OR M=11) AND D=31 THEN D=1:M=M+1:GOTO 3190 3170 IF D=32 THEN D=1:M=M+1 3180 IF M=13 THEN M=1:D=1:Y=Y+1 3190 MF$=STR$(M):DF$=STR$(D):YF$=STR$(Y):'Get date into proper string format 3200 DF$=RIGHT$(MF$,2)+"/"+RIGHT$(DF$,2)+"/"+RIGHT$(YF$,2) 3210 RETURN:'Does not work for 2/28/2000 but then neither will I 3220 END