1 ; See LICENSE file for copyright
and license details.
2 ; azan-nasm is simple muslim prayers calculator.
3 ; print next prayer left duration
or today
's all prayers.
12 sec_inday: dq 0x40f5180000000000 ;double 86400.0
13 jul1970: dq 0x41429ec5c0000000 ;double 2440587.5
14 offset: dq 0xc142b42c80000000 ;double -2451545
15 to_rad: dq 0x3f91df46a2529d39 ;double pi / 180
16 to_deg: dq 0x404ca5dc1a63c1f8 ;double 180 / pi
17 g_1: dq 0x3fef8a099930e901 ;double 0.98560027999999999
18 g_2: dq 0x40765876c8b43958 ;double 357.529
19 e_3: dq 0xbe9828c0be769dc1 ;double -3.5999999999999999E-7
20 e_4: dq 0x403770624dd2f1aa ;double 23.439
21 q_5: dq 0x3fef8a6c5512d6f2 ;double 0.98564735999999997
22 q_6: dq 0x4071875810624dd3 ;double 280.459
23 sing_1: dq 0x3FFEA3D70A3D70A4 ;double 1.915
24 sing_2: dq 0x3F947AE147AE147B ;double 0.020
25 RA_1: dq 0x402E000000000000 ;double 15.0
26 eqt_1: dq 0x4076800000000000 ;double 360.0
27 duhr_1: dq 0x4028000000000000 ;double 12.0
28 pray_1: dq 0x4038000000000000 ;double 24.0
29 neg1: dq 0xBFF0000000000000 ;double -1.0
30 p1: dq 0X3fb1111111111111 ;double 0.066666666666666666
31 sec_inhour: dq 0x40ac200000000000 ;double 3600
32 sec_inmin: dq 0x404e000000000000 ;double 60
48 DIE usage_msg, usage_len
51 mov rcx, [rsp+8] ; argv
58 DIE version_msg, version_len
61 mov rax, SYS_gettimeofday ;sys_gettimeofday(
62 mov rdi, tmp0 ;struct timeval *tv,
63 mov rsi, rsi ;struct timezone* tz
66 ; start_of_day = tstamp - (tstamp % 86400);
70 imul rax, rax, -1037155065
80 movsd xmm14, [time_zone]
81 mulsd xmm14, [sec_inhour]
84 ;tstamp = xmm6 convert tstamp to double
87 ;julian = tstamp / sec_inday) + jul1970 = xmm0
88 movsd xmm0, xmm6 ;copy tstamp to xmm0
89 divsd xmm0, [sec_inday] ;tstamp / sec_inday
90 addsd xmm0, [jul1970] ;div result + jul1970
92 calc_equation_of_time:
93 ;d = julian - offset = xmm0
96 ;g = to_rad * ((d * 0.98560028) + 357.529) = xmm1
102 ;e = to_rad * (23.439 - (d * 0.00000036)) = xmm3
108 ;q = (d * 0.98564736) + 280.459 = xmm4
113 ;sing = 1.915 * sin(g) = xmm5
118 ;sin2g = 0.020 * sin(2.0*g) = xmm1
131 ;L = to_rad(q + sing + sin2g) = xmm5
143 ;RA = to_deg(atan2(cose * sinL, cosL) / 15.0) = xmm7
144 mulsd xmm7, xmm2 ;cose * sinL
145 ATAN2 xmm7, xmm5 ;result in xmm7
146 divsd xmm7, [RA_1] ;atan2 result /15.0
147 mulsd xmm7, [to_deg] ;* to_deg
149 ;D = to_deg(asin(sine * sinL)) = xmm8
154 ;EqT = q / 15.0 - RA = xmm9
155 movsd xmm9, xmm4 ;move q to xmm9
156 divsd xmm9, [RA_1] ;q / 15.0
157 subsd xmm9, xmm7 ;- RA
158 subsd xmm9, [eqt_1] ;EqT = EqT - 360.0
160 get_duhr: ;duhr = 12.0+time_zone-EqT-(longitude/15.0);
161 movsd xmm1, [longitude]
164 addsd xmm0, [time_zone]
169 ;xmm0 - (pray_1 * floor(xmm1 / pray_1));
172 roundsd xmm1, xmm1, ROUND_DOWN ;floor(xmm1)
177 get_fajr: ;fajr = duhr - T(fajr_angle, D);
178 ;calculate T = p1 * p5
179 ;p2 = cos(convert_degrees_to_radians(latitude)) *
180 ; cos(convert_degrees_to_radians(D)) = xmm1
181 movsd xmm1, [latitude]
189 ;p3 = sin(convert_degrees_to_radians(latitude)) *
190 ; sin(convert_degrees_to_radians(D)) = xmm2
191 movsd xmm2, [latitude]
194 movsd xmm3, xmm8, ; xmm8 = D
199 ;p4 = -1.0 * sin(convert_degrees_to_radians(alpha)) = xmm3
200 movsd xmm3, [fajr_angle]
205 ;p5 = convert_radians_to_degrees(acos((p4 - p3) / p2)) = xmm3
206 subsd xmm3, xmm2 ; p4 - p3
207 divsd xmm3, xmm1 ; / p2
209 mulsd xmm3, [to_deg] ; xmm3 = p5
214 ;fajr = duhr - T = xmm3
220 mulsd xmm3, [sec_inhour] ;convert to seconds
221 roundsd xmm3, xmm3, ROUND_DOWN
222 addsd xmm3, xmm15 ;fajr seconds + start_of_day
223 ucomisd xmm3, xmm6 ;if fajr > tstamp
228 mulsd xmm0, [sec_inhour] ;convert to seconds
229 roundsd xmm0, xmm0, ROUND_DOWN
230 addsd xmm0, xmm15 ;duhr seconds + start_of_day
231 ucomisd xmm0, xmm6 ;if duhr > tstamp
236 mov [res_msg], byte 'F
'
241 mov [res_msg], byte 'D
'
257 ; start_of_day: ; xmm15