PICALC DSK(PICALCXB  l PICALC1-C ,P,,PICALD  XPICALE  xPICALF pPICALC  o.,t7V6L6B686./$471111$/*181H1V01e0111/<z1p1f1\2R2H2'>242*2 2W.x 22/N232133*3H35555v4l4b5X6N6D5:606&4686>6Y6h6l645,57767478/0|7.r7\h0@^0dT0J4@7|67,5O"5k747747645.4.../`4(x3n7d7(000 0ZFLAG0205Term 1 iteration #N 205Term 2 iteration #N LL1L64 >ITRϷD1.4DϷD82D5200jSUM13SUM220000000TERM10TERM220000000S0DENOM13TBASE25MULT16շSUM$8շSUM$8շSUM$8 i102# of decimals (mult. of 8)112(Maximum of 5200 decimals)1312鶵D'DIVIDENDREMAINDER 100000000TERMI)SUMISUMI·QUOTIENT1 100000000#QUOTIENTϷSUMI 1000000001#SUMISUMIQUOTIENT 100000000QUOTIENTϷSUMI 100000000-SUMI 100000000^SUMI0 AUGUST 2007 BY WALID MAALOULI PI CALCULATOR1FL$8011I1SUM$ SUM$0SUM$SUM$۷SUMI I2D11Pi=3.6221Enter path.filename:241FL$K48ڳ\I1SUM$ SUM$0SUM$SUM$۷SUMI I2D11Pi=3. 1PIOCLEARPi=3./241End. Press any key to exit4241Press any key to continueL0KEY0KSTST0RI CLEARKEY0KSTST0* SUM$ SUM$0SUM$SUM$۷SUMI I2D1K49K51KEY0KSTST0n53Send results to:85 1- Screen1052- Printer (PIO)1253- File/CLEAR23Calculations complete!0SUM652SUM1652TERM652TEMP652N1ITR1V18 Pi Calculator36By Walid Maalouli59 August 2007 I1D I1D I1D I1DID21 I1DI1DTEMPITERMIII1DTERMITEMPII"Finalizing calculations...FLAG1l"TBASE57121DENOM13MULT4SUMISUMIMULTTERMI SUMISUMIMULTTERMI6 N1(DENOM239TERM11REMAINDER0J FLAG2I&SUM1ISUM1ISUMISUMISUM1IFLAG1S0ISUMITERMITERMI0DENOM239REMAINDER0TERM14ISUMI0TERMI0SUM1ISUMIFLAG2DENOMTBASEREMAINDER0!REMAINDERDIVIDENDTERMIDENOMITERMIϷDIVIDENDDENOM DIVIDE SUBROUTINENDENOM1DENOM12I#SUMI1SUMI1QUOTIENT1SUMI1SUMI1QUOTIENTS0S1S0 S0,IDENOMDENOM1REMAINDER01 CLEAR?ICALC2 ./* * PICALC1 V1.0 09/08/2007 * * F.G.Kaal * De Dadelboom 81 * 1911 KK Uitgeest ** * Adapted from the Extended basic program * PiCalc by Walid Maalouli * * Remarks:5 * 1)Number of decimals that fit in a 32bit number is' * INT( LOG(SQR(2^31)) / LOG(10)) = 4 * * 2)TI/EX Basic INT() function:+ * INT(3.2)=3, INT(-3.2)=-4, INT(-0.2)=-1 *" * 3) Some magic numbers explained, * Number of decimals per long value is 49 * Therefore max number of decimals is 4*arraysize-2*4 * =4*652-8=2600% * PI=16*ATAN(1/5) - 4*ATAN(1/239)A * 1/5 = 0.2000, the number 2000 is exactly that in 4 decimals * 25=5^2 and 57121=239^2 *  */#include ".\..\TILIB\CGLOB_H"#include ".\..\TILIB\MISC_H"#include ".\..\TILIB\CONV_H"#include ".\..\TILIB\CTYPE_H"#include ".\..\TILIB\LONG_H"#include ".\..\TILIB\SPRINTF_H"#include "PICALC_H"-extern getyxts(),getkey(),waitkey(),clearw();entry SUM,SUM1,TERM,TEMP;5#define SIGNED 1 /* SIGNED OR UNSIGNED MPY AND DIV */ #ifdef SIGNED#define LMPY lsmpyl#define LDIV lsdivl#endif#ifdef UNSIGNED#define LMPY lmpyl#define LDIV ldivl#endif#define LONGSIZE 4#define ARRSIZE 652char inpline[40];'int N,I,D,S,ITR,DENOM1,TBASE,MULT,FLAG; int CPYBYTES;/* long variables */"int L10000[2] = {0x0000, 0x2710};"int L0[2] = {0x0000, 0x0000};%int SUM[ARRSIZE][2],SUM1[ARRSIZE][2];&int TERM[ARRSIZE][2],TEMP[ARRSIZE][2]; int lval[2]; )int DIVIDEND[2], REMAINDER[2], LDENOM[2];int QUOTIENT[2];char *lp1,*lp2;main(){' locate(1,8); puts("Pi Calculator");+ locate(3,8); puts("By Walid Maalouli");% locate(5,8); puts("August 2007");* locate(7,8); puts("Converted to C99");) locate(9,8); puts("By Fred G. Kaal");$ memset(SUM ,0,ARRSIZE*LONGSIZE);$ memset(SUM1,0,ARRSIZE*LONGSIZE);$ memset(TERM,0,ARRSIZE*LONGSIZE);$ memset(TEMP,0,ARRSIZE*LONGSIZE); do {: locate(12,2); puts("# of decimals (mult. of 4)");: locate(13,2); puts("(Maximum of 2600 decimals)");* getyxts(14,12,CT_DIGIT,4,inpline); D=atoi(inpline); }+ while ((D<=0) || (D>2600) || (D%4!=0));"/*160 ITR=INT(D/1.4) :: D=D/5+2 */ ITR=(D*10)/14+1; D=D/4+2;=/*170 SUM(1)=3 :: SUM(2)=20000 :: TERM(1)=0 :: TERM(2)=20000 - :: S=0 :: DENOM1=3 :: TBASE=25 :: MULT=16*/1 lcpys(&SUM[1][0],3); lcpys(&SUM[2][0],2000);2 lcpys(&TERM[1][0],0); lcpys(&TERM[2][0],2000);; CPYBYTES=D*LONGSIZE+LONGSIZE; /* Array size in bytes */ CalcPi(); OutScreen(); exit(0);}CalcPi(){,/*170*/ DENOM1=3; TBASE=25; MULT=16; FLAG=0;/*180*/ Iterate();/*460 IF FLAG=1 THEN 620*/&/*470*/ DENOM1=3; TBASE=57121; MULT=4; /*480 FOR I=1 TO D*//*490 SUM1(I)=SUM(I)*//*500 SUM(I)=0 :: TERM(I)=0*//*510 NEXT I*/ memcpy(SUM1,SUM,CPYBYTES); memset(SUM, 0, CPYBYTES); memset(TERM, 0, CPYBYTES);/*520 TERM(1)=4*/ lcpys(&TERM[1][0],4); /*530 DENOM=239 :: REMAINDER=0*//*540 GOSUB 1050*/ SubDivide(239);/*550 FOR I=1 TO D*/#/*560 SUM(I)=TERM(I) :: TERM(I)=0*//*570 NEXT I*/ memcpy(SUM,TERM,CPYBYTES); memset(TERM, 0, CPYBYTES);-/*580 DENOM=239 :: TERM(1)=1 :: REMAINDER=0*//*590 GOSUB 1050*/ lcpys(&TERM[1][0],1); SubDivide(239);/*600 FLAG=1 :: S=0*//*610 GOTO 180*/ Iterate();=2; --I) {/*340 IF SUM(I)==0 420*/ if (ltst(lp1)!=0) {#/*350 QUOTIENT=INT(SUM(I)/100000)*/ lcpyl(QUOTIENT,lp1);" LDIV(QUOTIENT,L10000); lgsmod(REMAINDER);/ if (REMAINDER[0]<0) ldec(QUOTIENT); "/*370 SUM(I-1)=SUM(I-1)+QUOTIENT*/ laddl(lp2,QUOTIENT); %/*360 SUM(I)=SUM(I)-QUOTIENT*100000*/" LMPY(QUOTIENT,L10000); lsubl(lp1,QUOTIENT);/*380 GOTO 420*/ }+ lp1=lp1-LONGSIZE; lp2=lp2-LONGSIZE;/*420 NEXT I*/ }/*430 IF FLAG=2 THEN 680*/}/* DIVIDE SUBROUTINE */SubDivide(DENOM) int DENOM;{int I; lclr(REMAINDER); lcpys(LDENOM,DENOM);  lp1 = &TERM[1][0]; for (I=1; I<=D; ++I) {,/* DIVIDEND=REMAINDER*100000+TERM[I];*/" lcpyl(DIVIDEND,REMAINDER); LMPY(DIVIDEND,L10000); laddl(DIVIDEND,lp1);&/* TERM[I]=INT(DIVIDEND/DENOM);*/ lcpyl(lp1,DIVIDEND); LDIV(lp1,LDENOM);lgsmod(REMAINDER);if (REMAINDER[0]<0) ldec(lp1);+/* REMAINDER=DIVIDEND-TERM[I]*DENOM;*/" lcpyl(REMAINDER,DIVIDEND);B/*printf("1 L=%08lX D=%08lX R=%08lX\n",LVAL,DIVIDEND,REMAINDER);*/ lcpyl(lval,lp1);B/*printf("2 L=%08lX D=%08lX R=%08lX\n",LVAL,DIVIDEND,REMAINDER);*/ LMPY(lval,LDENOM);B/*printf("3 L=%08lX D=%08lX R=%08lX\n",LVAL,DIVIDEND,REMAINDER);*/ lsubl(REMAINDER,lval);B/*printf("4 L=%08lX D=%08lX R=%08lX\n",LVAL,DIVIDEND,REMAINDER);*/G/*printf("%d T=%08lX D=%08lX R=%08lX\n",DENOM, lp1,DIVIDEND,REMAINDER); waitkey();*/  lp1=lp1+LONGSIZE; }}/* Output to screen */ OutScreen(){ int ix,jx,kx; putchar('\f');0 locate(1,1); puts("Calculations complete!");! locate(3,1); printf("Pi=3."); locate(4,1);% for(ix=2, jx=0, kx=4; ix4) { putchar('\n'); jx = 0; if (++kx >= 22) {@ locate(24,1); puts("Press any key to continue"); waitkey(); kx=4; clearw(kx,20); } } }5 locate(24,1); puts("End. Press any key to exit"); waitkey();}/* test output */Out(){ Out1("SUM ", SUM); Out1("SUM1 ", SUM1); Out1("TERM ", TERM); Out1("TEMP ", TEMP); waitkey();}Out1(n, lp) char *n, *lp;{int ix; puts(n); for(ix=1; ix<=D; ++ix) {- lp=lp+LONGSIZE; printf(" %5ld", lp); } putchar('\n');} #ifdef SIGNED#asm)*lsmpyl(long1, long2) int *long1, *long2;** unsigned multiply*D* long1 *= long2 = (LOW(long2) * LOW(long1)) overflow if:F* + (HOW(long2) * LOW(long1)) 0000 HOW(result)!=0F* + (LOW(long2) * HOW(long1)) 0000 HOW(result)!=0F* + (HOW(long2) * HOW(long1)) 0000 0000 result !=0*7* returns &long1, if overflow occured long1=0xFFFFFFFF * REF LMPY#S *LSMPYL CLR 0 Sign of the result STWP 1 AI 1,2*6 R1=&R6 % MOV @2(8),@2(1) R7=LOW(long2)% MOV *8,*1 R6=HOW(long2) BL @LABS$19 INC R0 Set sign flag, <>0 means negative ! MOV @4(14),8 R8=&long1 MOV 8,1 MOV *1,3 BL @LABS$19 DEC 0 Set sign flag, <>0 means negative' BL @LMPY#S Signed multiply JMP LDIV#Q#endasm#asm)* lsdivl(long1, long2) int *long1,*long2;** signed divide** long1 = long1 / long2* returns &long1** R0 = sign of the result* R4,5 = long1 / long2* R2,3 = long1 % long2* REF LDIV#S *LSDIVL CLR R0 Sign of the result! MOV @2(14),2 R2=&long2 STWP R1 AI 1,2*6 R1=&R6 BL @LABS$2 INC 0!LDIV#A MOV @4(14),2 R2=&long1 STWP R1 AI 1,2*8 R1=&R8 BL @LABS$2 DEC 0 % BL @LDIV#S Signed divide !LDIV#B MOV 4,*8 R8=&long1 MOV 5,@2(8)0LDIV#Q MOV 0,1 Must result be negative? JEQ LDIV#C No! MOV 8,1 BL @LNEG$LDIV#C B *13 #endasm #asm* lgumod(long) int *long;* lgsmod(long) int *long;*/* get unsigned or signed modulo, returns &long;*-* call the apropriate function directly after,* ldivl() or lsdivl() to retrieve the modulo* (remainder) of the division.** R1 = sign of the result* R2,3 = long1 % long2*$LGUMOD CLR 1 Clear sign flagLGSMOD MOV 2,*8 R8=&long1 MOV 3,@2(8)- MOV 1,1 Must result be negative? JEQ LGSMD# No! MOV 8,1 BL @LNEG$LGSMD# B *13#endasm#asm$* LABS$2 R1=&long dest, R2=&long src1* LABS$1 R1=&long dest, ST according to HOW(long)*.* LABS$: if (long<0) abs(long) returns to *R11&* if (long>=0) returns to R11+2*%* LNEG$: long = -long returns to *R11*LABS$2 MOV @2(2),@2(1) LOW MOV *2,*1 HOWLABS$1 JGT LABS$# Long>=0 JEQ LABS$#!LNEG$ INV *1 /HOW->HOW! NEG @2(1) -LOW->LOW JNC LNEG$# INC *1 HOW+CLNEG$# B *11 LABS$# INCT 11 B *11#endasm#endifP^p| ڍb:> R.Nb:> R.~b:> R.ͮb:> R. ڝ ڸ  `B.    ( `  :> ( (9Ȣ>p.9Ȣ>p.~9Ȣ>bp.~9Ȣ>p. :> (vbp]Pi CalculatorBy Walid MaalouliAugust 2007Converted to C99By Fred G. Kaal# of decimals (mult. of 4)(Maximum of 2600 decimals) bܒ !Na hR.~a hR.~9Ȣ>p.pD~~a hR.~9Ȣ>p.pDܒt9Ȣ>N9Ȣ> `n`. ` l. l. ( (`"4] Finalizing calculations... (b  `` `ܬ h. ~ͮ pDͮ~ pD9Ȣ>~9Ȣ> ``| `\ l. l.  l.`l. ( (`p `b4 ( `]Term %u iteration #%u  9Ȣ> (9Ȣ>  `B`ސ  `p p`& l.l.ppl.l.l. ( (`ބ]Np.l.~9Ȣ>Lj`r`ߚ`߂l.l. l.l.l.p pl. l.l.l. (`ߔ]. pˈbˈLj.`n``.9Ȣ>..`j bˈ`jLjlP.`.]Calculations complete!Pi=3. %04luPress any key to continueEnd. Press any key to exit4lL.:NlL.@~lL.FͮlL.]SUM SUM1 TERM TEMP NnLj``t`\(.(~H.l.`n ] %5ld! hX..H.! &!&@H2]AH2]bRQ![[.ˈbˈ.H`.`( (.~H~Hˮ .``..H Z`..HbZ.bˈ( ..~Hbˈ.h.n. (~H.`ˈ`.`J.. `.  `.HbZˈ`ˮ bˈ`( . .b.>~Hˮ `. ` ....(>...(>H Z..HbZ`. n.  `.lX^B>`.H@`n.8~H.H`.H~H...~Z.  . `  ``,, , 8N f|``T.p..]. ]Nbl~Hb.`2 .` ,H ,bl~H` , ,``l` ,H`2.]0bpH`]Nn.p(~H]1.```].]n.n3. !].ˮ. .~H.``j.p`zn.]n](  ! [n.l.].\|u|X2|20A||D|||qW@ Z!(#"Zq&v?8(@ : 9640 AS 0061DSK2. g  " pu{P{N#LL?0O:?0?H{:$$( qd . ! ! ! ! " " " "( " # 0`I ` * P&F?8J  " "  0[!"`X I >   B  `s ~ I 0[  ":-":1"@`"@`]-a@ m[J@#@@d'@< @<   E[~S V@) !   !܁ ROT 6V V 8  , 2 @  r`U    : 4 2  !  A  0  !$ 0[ "` "S V ! 2  !  . $G%$#F&.: . ! % "&FNà "@ %#&b t ,%d#@ $ &` $ $ ( * ` ( ( &. ̠ " ,   %f&P $ *%f&– –SFbD†*CJƓI$ *D `$2`$‹  *& ( *&.ݠ  ŀ@Z‹ &. &.Z &.% @ Z# #[ `$2 20p0T0VP @  .  !p P  < ! [ `$2?@!` *[ [-RQcdU\[_^G.\|u|X2|20A||D|||qW ?  $`,PP?NLj[NNjWW (F8` `@H, ! !àǀ€* ,L-1B`  0:A_YN,|`& F8࠶[ c99 exit-Rerun? (Y/N)  [[ s   Hs;K8r`jQ>> >  > >>[b[>>>>>[> [WW~IA B<I[[NNjWb[[;;P[: A ]   ]nP: PA A]n]`,n`,u]n,@`.u.]( . !* !|B d`*_  ! `* ! `u[A  . ! 2 .[ '4a0. 0. 20 !` !4B `4f  `.``20<`.[  2.`4`B `f\ . ! 4.[b@[.n.] ! u ]`.n@A A  !]8`0 6[.`@` 0-$` c99 err=X19--++ %%..00llddPuunxx XXppccss oo  `[८६४\C  %`#W#7#0[[ [@% 8% <BH[ 0% `S^]^ € B]^1][^ 0b].]b]br]^1].n1]0b[.n]^].n[ȈА @ 8<bGB]bA( ]bA(]b]hl[.]]b]]@ @Ah`H((("[K7 b B C ĠY.]]-+K 7 bA  (98@BYNǁNǂNǃNDŽNDžNdžNLJNLj;NNjP](]](]hX]]X(]H.]n.1].H|ȌpP]]H.1@F@J]H.1]H.(1̀(Ā].X    C].X    ]H.]H.!]H.j]H.j!f].h8F.]h8G8ƠD C 8ǠDC[([Hb>]H.<(<]H=]t]t].0P.FG[       ``.['