\def\date{19 Nov 2011}\def\source{V1F1, p.\ 49}\def\author{Udo Wermuth}\input mmix =4 !\gts Computation of Easter Sunday t IS $255 yascii GREG 0 ! Year $y$ as ASCII string acc GREG 0 ! Accumulator ext GREG 0 ! Second accumulator LOC Data_Segment !\gts The table lists all possible values for the Easter Sunday and leaves room for the year !\gts Each entry in the table consists of 32 bytes BYTE "22 March ",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 BYTE "23 March ",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 BYTE "24 March ",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 BYTE "25 March ",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 _np26 GREG @ ! Base address for this table BYTE "26 March ",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 BYTE "27 March ",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 BYTE "28 March ",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 BYTE "29 March ",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 BYTE "30 March ",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 BYTE "31 March ",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 BYTE "01 April ",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 BYTE "02 April ",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 BYTE "03 April ",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 BYTE "04 April ",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 BYTE "05 April ",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 BYTE "06 April ",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 BYTE "07 April ",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 BYTE "08 April ",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 BYTE "09 April ",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 BYTE "10 April ",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 BYTE "11 April ",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 BYTE "12 April ",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 BYTE "13 April ",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 BYTE "14 April ",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 BYTE "15 April ",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 BYTE "16 April ",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 BYTE "17 April ",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 BYTE "18 April ",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 BYTE "19 April ",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 BYTE "20 April ",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 BYTE "21 April ",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 BYTE "22 April ",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 BYTE "23 April ",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 BYTE "24 April ",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 BYTE "25 April ",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 LOC #100 !\gts Compute Easter Sunday for a given year $y$; $1582 < y < 100000$ !\gts Calling sequence: {\tt PUSHJ \$0,Easter} !\gts Entry conditions: the year is stored in global register \mb{yascii} as ASCII digits !\gts Exit conditions: string of form {\tt dd mmmmm, yyyyy} is written to \mb{StdOut} !\gts Changed global registers: \mmm acc, \mmm ext; new global registers are defined !\gts Changed special registers: y GREG 0 ! Year $y$ in binary yh GREG 0 ! $y_h = \lfloor y/10000\rfloor$ ym GREG 0 ! $y_m = \lfloor (y-10^5y_h)/100\rfloor$ yasc GREG 0 ! $y$ as ASCII digits _lfmask GREG #0f0f0f0f0f _format GREG #2c2000000000000a Easter AND t,yascii,_lfmask ! Extract the digits. MOR yh,t,16 MOR acc,t,8 MOR ext,t,4 4ADDU acc,acc,acc 2ADDU ym,acc,ext ! $\mm ym = \mm ym = 10*\mmm ymh + \mmm yml$. 4ADDU acc,yh,yh ! Compute the century number minus 1 as $100*\mm yh + \mm ym$. 4ADDU acc,acc,acc c GREG 0 ! Century Number E2a 4ADDU c,acc,ym ! \step E2. Century. $\m c \gets C-1 = \lfloor Y/100\rfloor$. MOR ext,t,2 ! Two digits remain for conversion. 4ADDU acc,c,c 2ADDU acc,acc,ext MOR ext,t,1 4ADDU acc,acc,acc 2ADDU y,acc,ext ! \m y is the binary code of the year $y$. SL yasc,yascii,8 OR yasc,yasc,_format ! Generate the output format. _f19 GREG #4033000000000000 ! 19 as float gm1 GREG 0 ! Golden Number minus 1 E1 FLOT acc,y ! \step E1. Compute golden number. FREM acc,acc,_f19 FIX gm1,acc ADD ext,gm1,19 CSN gm1,gm1,ext ! $\mmm gm1 \gets G-1$ E2b ADD c,c,1 ! \step E2. Century. $\m c \gets C-1 +1$. xp12 GREG 0 ! Number of dropped leap years plus 12 E3X 2ADDU acc,c,c ! \step E3. Corrections. Compute dropped leap years. SR xp12,acc,2 ! $\mb{xp12} \gets X+12$ zp43 GREG 0 ! Moon orbit correction plus 43 as $43-11-12=20$ (see E5). _zsum GREG 67+((43-5)<<7) ! Adjustment used in calculation of $Z$ E3Z 4ADDU acc,ym,ym ! Compute moon orbit correction using a trick: 8ADDU acc,acc,ym ! \quad we have $Z = y_h\ll 5 + \lfloor (8*y_m +13)/25 \rfloor - 5$ ADDU acc,acc,_zsum ! \quad and $\lfloor (8*y_m +13)/25\rfloor = (41*y_m +67)\gg 7$ SRU acc,acc,7 ! $\mmm acc\gets (41*y_m + 67+((43-5)\ll 7))\gg 7$. SL yh,yh,2 8ADDU zp43,yh,acc ! $\mb{zp43} \gets Z + 43$. dm2 GREG 0 ! Sunday minus 2 E4 4ADDU acc,y,y ! \step E4. Find Sunday. SR acc,acc,2 SUB dm2,acc,xp12 ! $\mb{dm2} \gets D-2$. _f30 GREG #403e000000000000 ! 30 as float e GREG 0 ! Epact E5 2ADDU acc,gm1,gm1 ! \step E5. Epact. 8ADDU acc,gm1,acc ! $\mmm acc \gets 11G - 11$. ADD acc,acc,zp43 ! $\mmm acc \gets 11G + Z + 32$. SUB acc,acc,xp12 ! $\mmm acc \gets 11G + Z - X + 20$. FLOT acc,acc FREM acc,acc,_f30 FIX e,acc ADD ext,e,30 CSN e,e,ext ! $\m e \gets \mmm acc \bmod 30$. E5e25 CMP t,e,25 ! Is $\rb{Epact} = 25$? PBNZ t,E5e24 ! No, go to test if $\rb{epact} = 24$. CMP t,gm1,10 ! Yes, test $G$. !\gts Step E6 results in 3 cases: $N=48$, $N=49$, and $N$ not yet known E6_4849 BP t,E7_N48 ! \step E6. Find full moon. $N \gets \ite(\m t>0?48:49)$. n GREG 0 ! Day of Full Moon _low9bit GREG #1FF _octm GREG #6b1a2358d11ac688 ! 6543210 repeated as octals (remainders for dvision by 7) E7_N49 ADD acc,dm2,49+2 ! \step E7. Advance to Sunday. $N=49$, $\mmm acc \gets D+N = D+49$. AND ext,acc,_low9bit ! Compute $(D+N) \bmod 7$ by a digit sum. SRU acc,acc,9 ! \quad (see ``Hacker's Delight'', 10--18 (add-on to the book)). ADDU acc,acc,ext ! Compute digit sum (9 bits). AND ext,acc,#3F SRU acc,acc,6 ADDU acc,acc,ext ! Compute digit sum (6 bits). AND ext,acc,#7 ! $\mmm ext \gets \mmm acc \bmod 8$. SRU acc,acc,3 ! $\mmm acc \gets \mmm acc \rb{ div } 8$. ADDU acc,acc,ext 2ADDU acc,acc,acc ! 3 digits for each entry in look-up register \mb{\l\_octm}. SRU acc,_octm,acc AND acc,acc,#7 ! $\mmm acc \gets (D+N) \bmod 7$. NEG n,49+7-26,acc ! $\m n \gets N-26$. SL acc,n,5 ! Get month. LDA t,_np26,acc STO yasc,t,8 ! Store $y$ in ASCII form. TRAP 0,Fputs,StdOut ! Output POP 0,0 ! \quad and return. E5e24 CMP t,e,24 ! Is $\rb{Epact} = 24$? E6_49XX BZ t,E7_N49 ! \step E6. Find full moon. $N = \ite(\m t=0?49:\rb{unknown})$ E6 NEG n,25,e ! \step E6. Find full moon. Case $N$ is unknown. ADD acc,n,30 CSN n,n,acc ! $\m n \gets N-19$. E7 ADD acc,dm2,n ! \step E7. Advance to Sunday. $\mmm acc = D+N-21$. AND ext,acc,_low9bit ! Compute $(D+N) \bmod 7 = (D+N-21) \bmod 7$ as above; SRU acc,acc,9 ! \quad the code is repeated to avoid a \mb{JMP}. ADDU acc,acc,ext AND ext,acc,#3F SRU acc,acc,6 ADDU acc,acc,ext AND ext,acc,#7 SRU acc,acc,3 ADDU acc,acc,ext 2ADDU acc,acc,acc SRU acc,_octm,acc AND acc,acc,#7 SUB n,n,acc SL acc,n,5 LDA t,_np26,acc STO yasc,t,8 TRAP 0,Fputs,StdOut POP 0,0 E7_N48 ADD acc,dm2,48+2 ! \step E7. Advance to Sunday. $\mmm acc \gets D+N = D+48$. AND ext,acc,_low9bit ! Compute $(D+N) \bmod 7$ as above. SRU acc,acc,9 ADDU acc,acc,ext AND ext,acc,#3F SRU acc,acc,6 ADDU acc,acc,ext AND ext,acc,#7 SRU acc,acc,3 ADDU acc,acc,ext 2ADDU acc,acc,acc SRU acc,_octm,acc AND acc,acc,#7 NEG n,48+7-26,acc SL acc,n,5 LDA t,_np26,acc STO yasc,t,8 TRAP 0,Fputs,StdOut POP 0,0 _byear GREG #3031393530 ! 1950 as ASCII string _eyear GREG #3032303030 ! 2000 as ASCII string _incr GREG #c6c6c6c6c7 _amask GREG #3030303030 Main SET yascii,_byear ! Init \mb{yascii}. JMP 2F 1H ADD acc,yascii,_incr ! Increment \mb{yascii}. AND ext,acc,_amask SR ext,ext,3 SUBU ext,acc,ext AND ext,ext,_lfmask OR yascii,ext,_amask 2H PUSHJ $0,Easter CMP t,yascii,_eyear ! Compare to end value. PBNZ t,1B TRAP 0,Halt,0 ! \eop !\endprogram\bye