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.
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 asin_1: dq 0x3FF0000000000000 ;double 1
27 eqt_1: dq 0x4076800000000000 ;double 360.0
28 duhr_1: dq 0x4028000000000000 ;double 12.0
29 pray_1: dq 0x4038000000000000 ;double 24.0
30 neg1: dq 0xBFF0000000000000 ;double -1.0
31 one: dq 0x3FF0000000000000 ;double 1
32 p1: dq 0X3fb1111111111111 ;double 0.066666666666666666
33 hours_to_sec: dq 0x40ac200000000000 ;double 3600
56 mov rax, SYS_gettimeofday ;sys_gettimeofday(
57 mov rdi, tstamp ;struct timeval *tv,
58 mov rsi, rsi ;struct timezone* tz
61 ; start_of_day: ; = tstamp - (tstamp % 86400);
65 imul rax, rax, -1037155065
75 movsd xmm14, [time_zone]
76 mulsd xmm14, [hours_to_sec]
79 ; calc_julian:;(tstamp / sec_inday) + jul1970
80 cvtsi2sd xmm0, [tstamp] ;convert tstamp to double
81 divsd xmm0, [sec_inday] ;tstamp / sec_inday
82 addsd xmm0, [jul1970] ;div result + jul1970
85 ; calc_equation_of_time:
86 addsd xmm0, [offset] ;d = julian - offset
90 movsd xmm1, [g_1] ;g = to_rad * ((d * 0.98560028) + 357.529)
97 movsd xmm3, [e_3] ;e = to_rad * (23.439 - (d * 0.00000036))
103 movsd xmm4, [q_5] ;q = (d * 0.98564736) + 280.459
108 ; sing: ;sing = 1.915 * sin(g);
118 ; sin2g: ;sin2g = 0.020 * sin(2.0*g)
141 ; L: ;L = to_rad(q + sing + sin2g);
142 addsd xmm5, xmm6 ;sing + sin2g
143 addsd xmm5, xmm4 ;+ q
144 mulsd xmm5, xmm2 ;* to_rad
159 ; RA: ;RA = to_deg(atan2(cose * sinL, cosL) / 15.0);
163 fld qword [cose] ;load cose
164 fld qword [cosL] ;load cosL
165 fpatan ;calc atan2 (cose / cosL)
166 fstp qword [RA_2] ;save angle
168 divsd xmm7, [RA_1] ;atan2 result /15.0
169 mulsd xmm7, [to_deg] ;* to_deg
172 ; D: ;D = to_deg(asin(sine * sinL));
173 ; asin = arctan(x / sqrt(1 - x * x))
179 movsd xmm9, xmm8 ; xmm8 = x
180 mulsd xmm9, xmm8 ; xmm9 = x * x
181 movsd xmm10, [asin_1] ; xmm10 = 1
182 subsd xmm10, xmm9 ; 1 - xmm9
183 movsd [asin_1], xmm10 ; asin_1 = (1-x*x)
184 movsd [asin_x], xmm8 ; asin_1 = (1-x*x)
197 ; Eqt ;EqT = q / 15.0 - RA;
198 movsd xmm9, xmm4 ; move q to xmm9
199 divsd xmm9, [RA_1] ; q / 15.0
200 subsd xmm9, xmm7 ; - RA
207 ; get_duhr: duhr = 12.0 + time_zone - EqT - (longitude / 15.0);
208 ; xmm0 - (pray_1 * floor(xmm1 / pray_1));
209 movsd xmm1, [longitude]
212 addsd xmm0, [time_zone]
219 roundsd xmm1, xmm1, ROUND_DOWN ;floor(xmm1)
224 ; get_fajr:; fajr = duhr - T(fajr_angle, D);
226 ; p2 = cos(convert_degrees_to_radians(latitude)) *
227 ; cos(convert_degrees_to_radians(D));
228 movsd xmm1, [latitude]
246 ; p3 = sin(convert_degrees_to_radians(latitude)) *
247 ; sin(convert_degrees_to_radians(D));
248 movsd xmm2, [latitude]
256 movsd xmm3, xmm8, ; xmm8 = D
266 ; p4 = -1.0 * sin(convert_degrees_to_radians(alpha));
267 movsd xmm3, [fajr_angle]
276 ; p5 = convert_radians_to_degrees(acos((p4 - p3) / p2));
277 subsd xmm3, xmm2 ; p4 - p3
278 divsd xmm3, xmm1 ; / p2
282 mulsd xmm3, [to_deg] ; xmm3 = p5
283 mulsd xmm3, [p1] ; xmm3 = T
286 movsd xmm3, xmm0 ; xmm3 = duhr
287 subsd xmm3, xmm4 ; xmm3 = duhr - T
289 ; convert_fajr_to_sec:
290 mulsd xmm3, [hours_to_sec] ; convert to seconds
291 roundsd xmm3, xmm3, ROUND_DOWN ;floor(xmm1)
300 ; start_of_day: ; xmm15