

// C port of original MOONRISE.BAS program from Sky & Telescope magazine
// Done for the Sony Playstation Portabe by Art - Jan 2008 - bmar8190@bigpond.net.au


#include <math.h>

int ivb;				// dummy
float mnbuff;				//
float mnbuffb;				//
float P1 = 3.14159265;			// define Pi
float P2;				//
float K1;				//
float A;				//
float A5;				//
float B;				//
float C;				//
float C0;				//
float D;				//
float D0;				//
float D1;				//
float D2;				//
float D5;				//
float E;				//
float F;				//
float F0;				//
float F1;				//
float F2;				//
float G;				//
float H0;				//
float H2;				//
float H1;				//
float P;				//
float R1;				//
float R5;				//
float T;				//
float T0;				//
float T3;				//
float V0;				//
float V2;				//
float U;				//
float W;				//
float N;				//
float L;				//
float L0;				//
float L2;				//
float A0;				//
float A2;				//
float B5;				//
float L5;				//
float H;				//
float M;				//
float Z0;				//
float M11;				//
float M12;				//
float M13;				//
float M21;				//
float M22;				//
float M23;				//
float M31;				//
float M32;				//
float M33;				//
float M8;				//
float W8;				//
float Y;				//
float J;				//
float J3;				//
float S;				//
float V;				//
float Z;				//
float Z1;				//
float V1;				//
float H7;				//
float N7;				//
float D7;				//
float A7;				//
float H3;				//
float M3;				//
int mnthour;				// rise - set time buffers
int mntminute;				//


void moontimes(void);
void gosub170(void);
void gosub760(void);
void gosub245(void);
void gosub495(void);
void gosub225(void);
void gosub285(void);
void gosub450(void);


int main(void) {
printf("LUNAR port - Art 2008!\n");
printf("C port of original moonrise.BAS from Sky & Telescope\n\n");
moontimes();
} // main

void gosub170() {
P2=2*P1;				// constant defines
R1=P1/180;				//
K1=15*R1*1.0027379;			//
}

void gosub760() {			// CALENDAR --> JD
Y = 2008;				// input year,month,day.
M = 1;					// using constants for input
D = 20;					// the date I did this C port

G=1;
if (Y < 1582) {G = 0;}
D1=floor(D);
F=D-D1-0.5;
J=-floor(7*(floor((M+9)/12)+Y)/4);
if (G == 0) {goto line805;}
mnbuff = M-9;				// for this line: S=SGN(M-9)
if (mnbuff < 0) {mnbuff = -1;}		//
if (mnbuff > 0) {mnbuff = 1;}		//
S = mnbuff;				//
A=fabs(M-9);
J3=floor(Y+S*floor(A/7));
J3=-floor((floor(J3/100)+1)*3/4);
line805:
J=J+floor(275*M/9)+D1+G*J3;
J=J+1721027+2*G+367*Y;
if (F >= 0) {goto line825;}
F=F+1;
J=J-1;
line825:
ivb = 0;				// dummy line for label at end of function
}

void gosub245() {			// LST AT 0H ZONE TIME
T0=T/36525;
S=24110.5+8640184.813*T0;
S=S+86636.6*Z0+86400*L5;
S=S/86400;
S=S-floor(S);
T0=S*360*R1;
}

void gosub495() {			// FUNDAMENTAL ARGUMENTS
L=0.606434+0.03660110129*T;
M=0.374897+0.03629164709*T;
F=0.259091+0.03674819520*T;
D=0.827362+0.03386319198*T;
N=0.347343-0.00014709391*T;
G=0.993126+0.00273777850*T;
L=L-floor(L);
M=M-floor(M);
F=F-floor(F);
D=D-floor(D);
N=N-floor(N);
G=G-floor(G);
L=L*P2;
M=M*P2;
F=F*P2;
D=D*P2;
N=N*P2;
G=G*P2;
V=0.39558*sinf(F+N);
V=V+0.08200*sinf(F);
V=V+0.03257*sinf(M-F-N);
V=V+0.01092*sinf(M+F+N);
V=V+0.00666*sinf(M-F);
V=V-0.00644*sinf(M+F-2*D+N);
V=V-0.00331*sinf(F-2*D+N);
V=V-0.00304*sinf(F-2*D);
V=V-0.00240*sinf(M-F-2*D-N);
V=V+0.00226*sinf(M+F);
V=V-0.00108*sinf(M+F-2*D);
V=V-0.00079*sinf(F-N);
V=V+0.00078*sinf(F+2*D+N);
U=1-0.10828*cosf(M);
U=U-0.01880*cosf(M-2*D);
U=U-0.01479*cosf(2*D);
U=U+0.00181*cosf(2*M-2*D);
U=U-0.00147*cosf(2*M);
U=U-0.00105*cosf(2*D-G);
U=U-0.00075*cosf(M-2*D+G);
W=0.10478*sinf(M);
W=W-0.04105*sinf(2*F+2*N);
W=W-0.02130*sinf(M-2*D);
W=W-0.01779*sinf(2*F+N);
W=W+0.01774*sinf(N);
W=W+0.00987*sinf(2*D);
W=W-0.00338*sinf(M-2*F-2*N);
W=W-0.00309*sinf(G);
W=W-0.00190*sinf(2*F);
W=W-0.00144*sinf(M+N);
W=W-0.00144*sinf(M-2*F-N);
W=W-0.00113*sinf(M+2*F+2*N);
W=W-0.00094*sinf(M-2*D+G);
W=W-0.00092*sinf(2*M-2*D);
S=W/sqrt(U-V*V);			// COMPUTE RA, DEC, DIST
A5=L+atan(S/sqrt(1-S*S));
S=V/sqrt(U);
D5=atan(S/sqrt(1-S*S));
R5=60.40974*sqrt(U);
}

void gosub225() {			// 3-POINT INTERPOLATION
A=F1-F0;
B=F2-F1-A;
F=F0+P*(2*A+B*(2*P-1));
}

void gosub285() {			// TEST AN HOUR FOR AN EVENT
L0=T0+C0*K1;
L2=L0+K1;
if (A2 < A0) {A2=A2+2*P1;}
H0=L0-A0;
H2=L2-A2;
H1=(H2+H0)/2;				// HOUR ANGLE
D1=(D2+D0)/2;		// DEC
if (C0 > 0) {goto line325;}
V0=S*sinf(D0)+C*cosf(D0)*cosf(H0)-Z;
line325:
V2=S*sinf(D2)+C*cosf(D2)*cosf(H2)-Z;
if (V0 < 0) {mnbuff = -1;}		// for this line: IF SGN(V0)=SGN(V2) THEN 440
if (V0 > 0) {mnbuff = 1;}		//
if (V2 < 0) {mnbuffb = -1;}		//
if (V2 > 0) {mnbuffb = 1;}		//
if (mnbuff == mnbuffb) {goto line440;}	//
V1=S*sinf(D1)+C*cosf(D1)*cosf(H1)-Z;
A=2*V2-4*V1+2*V0;
B=4*V1-3*V0-V2;
D=B*B-4*A*V0;
if (D < 0) {goto line440;}
D=sqrt(D);
if (V0 < 0) {
if (V2 > 0) {
printf("MOONRISE AT ");
M8=1;
}
}
if (V0 > 0) {
if (V2 < 0) {
printf(" MOONSET AT ");
W8=1;
}
}
E=(-B+D)/(2*A);
if (E > 1) {E=(-B-D)/(2*A);}
if (E < 0) {E=(-B-D)/(2*A);}
T3=C0+E+1/120;				// ROUND OFF
H3=floor(T3);
M3=floor((T3-H3)*60);

mnthour = H3;
mntminute = M3;
printf("%d:%d",mnthour,mntminute);	// print time

H7=H0+E*(H2-H0);
N7=-cosf(D1)*sinf(H7);
D7=C*sinf(D1)-S*cosf(D1)*cosf(H7);
A7=atan(N7/D7)/R1;
if (D7 < 0) {A7=A7+180;}
if (A7 < 0) {A7=A7+360;}
if (A7 > 360) {A7=A7-360;}
printf("   AZIMUTH: %f\n",A7);		// print azimuth
line440:
ivb = 0;				// dummy line for label at end of function
}

void gosub450() {			// SPECIAL MESSAGES
if (M8 == 0) {
if (W8 == 0) {
goto line475;
}
}
if (M8 == 0) {
printf("NO MOONRISE THIS DATE");	// 
}
if (W8 == 0) {
printf("NO MOONSET THIS DATE");		// 
}
goto line485;
line475:
if (V2 < 0) {
printf("MOON DOWN ALL DAY");		// 
}
if (V2 > 0) {
printf("MOON UP ALL DAY");		// 
}
line485:
ivb = 0;				// dummy line for label at end of function
}

void moontimes() {
gosub170();
B5 = -27;				// input lat,long,TZoffset.
L5 = 152;				// I'll just test with constants
H = -10;				// time zone -10 hours for Australia

L5=L5/360;
Z0=H/24;
gosub760();
T=(J-2451545)+F;
gosub245();
T=T+Z0;
gosub495();
M11=A5;
M12=D5;
M13=R5;
T=T+0.5;
gosub495();
M21=A5;
M22=D5;
M23=R5;
T=T+0.5;
gosub495();
M31=A5;
M32=D5;
M33=R5;
T=T+0.5;
if (M21 > M11) {goto line85;}
M21=M21+P2;
line85:
if (M31 > M21) {goto line95;}
M31=M31+P2;
line95:
Z1=R1*(90.567-41.685/M23);
S=sinf(B5*R1);
C=cosf(B5*R1);
Z=cosf(Z1);
M8=0;
W8=0;
A0=M11;
D0=M12;
for(C0=0; C0<23; C0++) {
P=(C0+1)/24;
F0=M11;
F1=M21;
F2=M31;
gosub225();
A2=F;
F0=M12;
F1=M22;
F2=M32;
gosub225();
D2=F;
gosub285();
A0=A2;
D0=D2;
V0=V2;
} // next C0
gosub450();
}

