-- file: MFMathImpl1.mesa -- Pascal-to-Mesa translator output, translated at October 31, 1985 4:28:00 pm PST DIRECTORY PascalBasic, PascalWizardFiles, MFTypes, MFInteraction, MFMath; MFMathImpl1: PROGRAM IMPORTS PascalBasic, MFInteraction EXPORTS MFMath = PUBLIC BEGIN OPEN PascalBasic, PascalWizardFiles, MFTypes, MFInteraction, MFMath; --:91----97:-- ArithError: PascalBoolean; --:97----129: TwoToThe: LONG POINTER TO ARRAY PascalInteger[0..30] OF PascalInteger _ PascalStaticZone.NEW[ARRAY PascalInteger[0..30] OF PascalInteger]; SpecLog: LONG POINTER TO ARRAY PascalInteger[1..28] OF PascalInteger _ PascalStaticZone.NEW[ARRAY PascalInteger[1..28] OF PascalInteger]; --:129 --137:--SpecAtan: LONG POINTER TO ARRAY PascalInteger[1..26] OF Angle _ PascalStaticZone.NEW[ARRAY PascalInteger[1..26] OF Angle]; --:137----144:-- NSin: Fraction; NCos: Fraction; --:144----148:--Randoms: LONG POINTER TO ARRAY PascalInteger[0..54] OF Fraction _ PascalStaticZone.NEW[ARRAY PascalInteger[0..54] OF Fraction]; JRandom: PascalInteger[0..54]; ClearArith: PROCEDURE = BEGIN BEGIN IF Interaction=3 THEN NULL;PrintNl[133];Print[173]; END; BEGIN HelpPtr_4;HelpLine^[3]_174;HelpLine^[2]_175;HelpLine^[1]_176; HelpLine^[0]_177; END;Error[];ArithError_FALSE; END;--:99----100: RoundDecimals: PROCEDURE[K: SmallNumber] RETURNS[RoundDecimalsResult: Scaled] = BEGIN A:PascalInteger; A_0; WHILE INT[K]>0 DO BEGIN K_K-1;A_ (A+Dig^[K]*131072)/10; END ENDLOOP ; RoundDecimalsResult_ PascalDIVPower2[(A+1),1]; END;--:102----107: MakeFraction: PROCEDURE[P,Q: PascalInteger] RETURNS[MakeFractionResult: Fraction] = BEGIN F:PascalInteger;N:PascalInteger; Negative:PascalBoolean;BeCareful:PascalInteger; IF P>=0 THEN Negative_FALSE ELSE BEGIN P_-P;Negative_TRUE; END; IF Q<=0 THEN BEGIN IF Q=0 THEN Confusion[47];Q_-Q; Negative_ NOT Negative; END;N_ P /Q;P_ P MOD Q; IF N>=8 THEN BEGIN ArithError_TRUE; IF Negative THEN MakeFractionResult_-2147483647 ELSE MakeFractionResult_ 2147483647; END ELSE BEGIN N_(N-1)*268435456;--108:--F_1; DO BeCareful_P-Q;P_BeCareful+P; IF P>=0 THEN F_F+F+1 ELSE BEGIN F_F+F;P_P+Q; END; IF F>=268435456 THEN EXIT; ENDLOOP; BeCareful_P-Q;IF BeCareful+P>=0 THEN F_F+1--:108--; IF Negative THEN MakeFractionResult_-(F+N) ELSE MakeFractionResult_F+N; END; END; --:107----109:-- TakeFraction: PROCEDURE[Q: PascalInteger,F: Fraction] RETURNS[TakeFractionResult: PascalInteger] = BEGIN P:PascalInteger;Negative:PascalBoolean;N:PascalInteger;BeCareful:PascalInteger;--110: IF F>=0 THEN Negative_FALSE ELSE BEGIN F_-F;Negative_TRUE; END; IF Q<0 THEN BEGIN Q_-Q;Negative_ NOT Negative; END;--:110--IF F<268435456 THEN N_0 ELSE BEGIN N_ PascalDIVPower2[F ,28]; F_ PascalMODPower2Mask[F ,268435455]; IF Q<=2147483647 /N THEN N_N*Q ELSE BEGIN ArithError_TRUE; N_2147483647; END; END;F_F+268435456;--111:--P_134217728; IF Q<1073741824 THEN DO IF PascalODD[F] THEN P_ PascalDIVPower2[(P+Q),1] ELSE P_ PascalDIVPower2[(P),1];F_ PascalDIVPower2[(F),1]; IF F=1 THEN EXIT; ENDLOOP ELSE DO IF PascalODD[F] THEN P_ P+PascalDIVPower2[(Q-P),1] ELSE P_ PascalDIVPower2[(P),1]; F_ PascalDIVPower2[(F),1]; IF F=1--:111-- THEN EXIT; ENDLOOP;BeCareful_N-2147483647; IF BeCareful+P>0 THEN BEGIN ArithError_TRUE;N_2147483647-P; END; IF Negative THEN TakeFractionResult_-(N+P) ELSE TakeFractionResult_N+P; END;--:109 --112:-- TakeScaled: PROCEDURE[Q: PascalInteger,F: Scaled] RETURNS[TakeScaledResult: PascalInteger] = BEGIN P:PascalInteger; Negative:PascalBoolean;N:PascalInteger;BeCareful:PascalInteger;--110: IF F>=0 THEN Negative_FALSE ELSE BEGIN F_-F;Negative_TRUE; END; IF Q<0 THEN BEGIN Q_-Q;Negative_ NOT Negative; END;--:110--IF F<65536 THEN N_0 ELSE BEGIN N_ PascalDIVPower2[F ,16];F_ PascalMODPower2Mask[F ,65535]; IF Q<=2147483647 /N THEN N_N*Q ELSE BEGIN ArithError_TRUE; N_2147483647; END; END;F_F+65536;--113:--P_32768; IF Q<1073741824 THEN DO IF PascalODD[F] THEN P_ PascalDIVPower2[(P+Q),1] ELSE P_ PascalDIVPower2[(P),1];F_ PascalDIVPower2[(F),1]; IF F=1 THEN EXIT; ENDLOOP ELSE DO IF PascalODD[F] THEN P_ P+PascalDIVPower2[(Q-P),1] ELSE P_ PascalDIVPower2[(P),1]; F_ PascalDIVPower2[(F),1]; IF F=1--:113-- THEN EXIT; ENDLOOP;BeCareful_N-2147483647; IF BeCareful+P>0 THEN BEGIN ArithError_TRUE;N_2147483647-P; END; IF Negative THEN TakeScaledResult_-(N+P) ELSE TakeScaledResult_N+P; END;--:112 --114:-- MakeScaled: PROCEDURE[P,Q: PascalInteger] RETURNS[MakeScaledResult: Scaled] = BEGIN F:PascalInteger;N:PascalInteger; Negative:PascalBoolean;BeCareful:PascalInteger; IF P>=0 THEN Negative_FALSE ELSE BEGIN P_-P;Negative_TRUE; END; IF Q<=0 THEN BEGIN IF Q=0 THEN Confusion[47];Q_-Q; Negative_ NOT Negative; END;N_ P /Q;P_ P MOD Q; IF N>=32768 THEN BEGIN ArithError_TRUE; IF Negative THEN MakeScaledResult_-2147483647 ELSE MakeScaledResult_2147483647; END ELSE BEGIN N_(N-1)*65536;--115:--F_1;DO BeCareful_P-Q; P_BeCareful+P;IF P>=0 THEN F_F+F+1 ELSE BEGIN F_F+F;P_P+Q; END; IF F>=65536 THEN EXIT; ENDLOOP;BeCareful_P-Q;IF BeCareful+P>=0 THEN F_F+1--:115--; IF Negative THEN MakeScaledResult_-(F+N) ELSE MakeScaledResult_F+N; END; END;--:114 --116:-- Velocity: PROCEDURE[St,Ct,Sf,Cf: Fraction,T: Scaled] RETURNS[VelocityResult: Fraction] = BEGIN Acc, Num, Denom:PascalInteger; Acc_TakeFraction[St-( PascalDIVPower2[Sf ,4]),Sf-( PascalDIVPower2[St ,4])]; Acc_TakeFraction[Acc,Ct-Cf]; Num_536870912+TakeFraction[Acc,379625062]; Denom_805306368+TakeFraction[Ct,497706707]+TakeFraction[Cf,307599661] ;IF T#65536 THEN Num_MakeScaled[Num,T]; IF PascalDIVPower2[Num ,2]>=Denom THEN VelocityResult_1073741824 ELSE VelocityResult_ MakeFraction[Num,Denom]; END;--:116----117: AbVsCd: PROCEDURE[A,B,C,D: PascalInteger] RETURNS[AbVsCdResult: PascalInteger] = BEGIN Q, R:PascalInteger; --118:--IF A<0 THEN BEGIN A_-A;B_-B; END;IF C<0 THEN BEGIN C_-C; D_-D; END; {IF D<=0 THEN BEGIN IF B>=0 THEN IF((A=0)OR (B=0))AND ((C=0)OR (D=0)) THEN BEGIN AbVsCdResult_0; GOTO Label10; END ELSE BEGIN AbVsCdResult_1; GOTO Label10; END; IF D=0 THEN IF A=0 THEN BEGIN AbVsCdResult_0; GOTO Label10; END ELSE BEGIN AbVsCdResult_-1; GOTO Label10; END;Q_A;A_C;C_Q;Q_-B;B_-D;D_Q; END ELSE IF B<=0 THEN BEGIN IF B<0 THEN IF A>0 THEN BEGIN AbVsCdResult_-1; GOTO Label10; END;IF C=0 THEN BEGIN AbVsCdResult_0; GOTO Label10; END ELSE BEGIN AbVsCdResult_-1; GOTO Label10; END; END--:118--; WHILE TRUE DO BEGIN Q_ A /D;R_ C /B; IF Q#R THEN IF Q>R THEN BEGIN AbVsCdResult_1; GOTO Label10; END ELSE BEGIN AbVsCdResult_-1; GOTO Label10; END;Q_ A MOD D;R_ C MOD B; IF R=0 THEN IF Q=0 THEN BEGIN AbVsCdResult_0; GOTO Label10; END ELSE BEGIN AbVsCdResult_1; GOTO Label10; END;IF Q=0 THEN BEGIN AbVsCdResult_-1; GOTO Label10; END;A_B;B_Q;C_D;D_R; END ENDLOOP ;EXITS Label10 => NULL}; END;--:117----119: FloorScaled: PROCEDURE[X: Scaled] RETURNS[FloorScaledResult: Scaled] = BEGIN BeCareful:PascalInteger; IF X>=0 THEN FloorScaledResult_X-( PascalMODPower2Mask[X ,65535]) ELSE BEGIN BeCareful_X +1;FloorScaledResult_X+( PascalMODPower2Mask[(-BeCareful),65535])-65535; END; END; FloorUnscaled: PROCEDURE[X: Scaled] RETURNS[FloorUnscaledResult: PascalInteger] = BEGIN BeCareful:PascalInteger; IF X>=0 THEN FloorUnscaledResult_ PascalDIVPower2[X ,16] ELSE BEGIN BeCareful_X +1;FloorUnscaledResult_-(1+( PascalDIVPower2[(-BeCareful),16])); END; END; RoundUnscaled: PROCEDURE[X: Scaled] RETURNS[RoundUnscaledResult: PascalInteger] = BEGIN BeCareful:PascalInteger; IF X>=32768 THEN RoundUnscaledResult_1+( PascalDIVPower2[(X-32768),16]) ELSE IF X>=- INT[32768 ] THEN RoundUnscaledResult_0 ELSE BEGIN BeCareful_X+1; RoundUnscaledResult_-(1+( PascalDIVPower2[(-BeCareful-32768),16])); END; END; END.