-- file: MFPathsImpl1.mesa
-- Pascal-to-Mesa translator output, translated at October 31, 1985 4:28:01 pm PST
DIRECTORY
PascalBasic,
PascalWizardFiles,
MFTypes,
MFProcArray,
MFInteraction,
MFMath,
MFMemory,
MFPaths;
MFPathsImpl1: PROGRAM IMPORTS PascalBasic, MFProcArray, MFInteraction, MFMath, MFMemory EXPORTS MFPaths = PUBLIC
BEGIN OPEN PascalBasic, PascalWizardFiles, MFTypes, MFProcArray, MFInteraction, MFMath, MFMemory, MFPaths;
--:250----267:--
PathTail: Halfword;
--:267----279:
DeltaX: LONG POINTER TO ARRAY PascalInteger[0..300] OF Scaled ← PascalStaticZone.NEW[ARRAY PascalInteger[0..300] OF Scaled];
DeltaY: LONG POINTER TO ARRAY PascalInteger[0..300] OF Scaled ← PascalStaticZone.NEW[ARRAY PascalInteger[0..300] OF Scaled];
Delta: LONG POINTER TO ARRAY PascalInteger[0..300] OF Scaled ← PascalStaticZone.NEW[ARRAY PascalInteger[0..300] OF Scaled];
Psi: LONG POINTER TO ARRAY PascalInteger[1..300] OF Angle ← PascalStaticZone.NEW[ARRAY PascalInteger[1..300] OF Angle];
--:279----283:
Theta: LONG POINTER TO ARRAY PascalInteger[0..300] OF Angle ← PascalStaticZone.NEW[ARRAY PascalInteger[0..300] OF Angle];
Uu: LONG POINTER TO ARRAY PascalInteger[0..300] OF Fraction ← PascalStaticZone.NEW[ARRAY PascalInteger[0..300] OF Fraction];
Vv: LONG POINTER TO ARRAY PascalInteger[0..300] OF Angle ← PascalStaticZone.NEW[ARRAY PascalInteger[0..300] OF Angle];
Ww: LONG POINTER TO ARRAY PascalInteger[0..300] OF Fraction ← PascalStaticZone.NEW[ARRAY PascalInteger[0..300] OF Fraction];
--:283
--298:--
St: Fraction;
Ct: Fraction;
Sf: Fraction;
Cf: Fraction;
PrintPath: PROCEDURE[H: Halfword,S: StrNumber,Nuline: PascalBoolean]
=
BEGIN P, Q:Halfword; PrintDiagnostic[385,S,Nuline];
PrintLn[];P←H;{DO Q←Mem[P]↑.Hh.Rh;
IF(P=0)OR (Q=0) THEN BEGIN PrintNl[131]; GOTO Label30; END;--258:
PrintTwo[Mem[ INT[P]+1]↑.Int,Mem[ INT[P]+2]↑.Int];
{SELECT Mem[P]↑.Hh.B1 FROM 0 =>BEGIN IF Mem[P]↑.Hh.B0=4 THEN Print[386];
IF(Mem[Q]↑.Hh.B0#0)OR (Q#H) THEN Q←0; GOTO Label31; END;1 =>--261:
BEGIN Print[392];PrintTwo[Mem[ INT[P]+5]↑.Int,Mem[ INT[P]+6]↑.Int];Print[391];
IF Mem[Q]↑.Hh.B0#1 THEN Print[393] ELSE PrintTwo[Mem[ INT[Q]+3]↑.Int,Mem[ INT[Q]+4]↑.
Int]; GOTO Label31; END--:261--;4 =>--262:
IF(Mem[P]↑.Hh.B0#1)AND (Mem[P]↑.Hh.B0#4) THEN Print[386]--:262--;3,2 =>--263:
BEGIN IF Mem[P]↑.Hh.B0=4 THEN Print[393];
IF Mem[P]↑.Hh.B1=3 THEN BEGIN Print[389];PrintScaled[Mem[ INT[P]+5]↑.Int];
END ELSE BEGIN NSinCos[Mem[ INT[P]+5]↑.Int];PrintChar[123];
PrintScaled[NCos];PrintChar[44];PrintScaled[NSin]; END;
PrintChar[125]; END--:263--; ENDCASE =>Print[131];
IF INT[Mem[Q]↑.Hh.B0]<=1 THEN Print[387] ELSE IF(Mem[ INT[P]+6]↑.Int#65536)OR (Mem[ INT[Q]+4
]↑.Int#65536) THEN--260:--BEGIN Print[390];
IF Mem[ INT[P]+6]↑.Int<0 THEN Print[333];PrintScaled[ABS[Mem[ INT[P]+6]↑.Int]];
IF Mem[ INT[P]+6]↑.Int#Mem[ INT[Q]+4]↑.Int THEN BEGIN Print[391];
IF Mem[ INT[Q]+4]↑.Int<0 THEN Print[333];PrintScaled[ABS[Mem[ INT[Q]+4]↑.Int]]; END;
END--:260--;EXITS Label31 => NULL};--:258--P←Q;IF(P#H)OR (Mem[H]↑.Hh.B0#0) THEN--259:
BEGIN PrintNl[388];
IF Mem[P]↑.Hh.B0=2 THEN BEGIN NSinCos[Mem[ INT[P]+3]↑.Int];PrintChar[123];
PrintScaled[NCos];PrintChar[44];PrintScaled[NSin];PrintChar[125];
END ELSE IF Mem[P]↑.Hh.B0=3 THEN BEGIN Print[389];
PrintScaled[Mem[ INT[P]+3]↑.Int];PrintChar[125]; END; END--:259--; IF P=H THEN EXIT; ENDLOOP;
IF Mem[H]↑.Hh.B0#0 THEN Print[258];EXITS Label30 => NULL};EndDiagnostic[TRUE]; END;--:257
--:603----268:-- TossKnotList: PROCEDURE[P: Halfword] =
BEGIN Q:Halfword;
R:Halfword; Q←P;DO R←Mem[Q]↑.Hh.Rh;FreeNode[Q,7];Q←R;
IF Q=P THEN EXIT; ENDLOOP; END;--:268----385:-- CopyKnot: PROCEDURE[P: Halfword] RETURNS[CopyKnotResult: Halfword]
=
BEGIN Q:Halfword;K:PascalInteger[0..6]; Q←GetNode[7];
FOR i:INT IN [ INT[0 ].. INT[6 ]] DO K ← i; Mem[ INT[Q]+K]↑←Mem[ INT[P]+K]↑ ENDLOOP;CopyKnotResult←Q; END;--:264----265:
CopyPath: PROCEDURE[P: Halfword] RETURNS[CopyPathResult: Halfword] =
BEGIN Q, Pp, Qq:Halfword;
Q←GetNode[7];Qq←Q;Pp←P;
{WHILE TRUE DO BEGIN Mem[Qq]↑.Hh.B0←Mem[Pp]↑.Hh.B0;
Mem[Qq]↑.Hh.B1←Mem[Pp]↑.Hh.B1;Mem[ INT[Qq]+1]↑.Int←Mem[ INT[Pp]+1]↑.Int;
Mem[ INT[Qq]+2]↑.Int←Mem[ INT[Pp]+2]↑.Int;Mem[ INT[Qq]+3]↑.Int←Mem[ INT[Pp]+3]↑.Int;
Mem[ INT[Qq]+4]↑.Int←Mem[ INT[Pp]+4]↑.Int;Mem[ INT[Qq]+5]↑.Int←Mem[ INT[Pp]+5]↑.Int;
Mem[ INT[Qq]+6]↑.Int←Mem[ INT[Pp]+6]↑.Int;
IF Mem[Pp]↑.Hh.Rh=P THEN BEGIN Mem[Qq]↑.Hh.Rh←Q;CopyPathResult←Q; GOTO Label10; END;
Mem[Qq]↑.Hh.Rh←GetNode[7];Qq←Mem[Qq]↑.Hh.Rh;Pp←Mem[Pp]↑.Hh.Rh; END ENDLOOP ;
EXITS Label10 => NULL}; END;--:265----266:-- HtapYpoc: PROCEDURE[P: Halfword] RETURNS[HtapYpocResult: Halfword] =
BEGIN
Q, Pp, Qq, Rr:Halfword; Q←GetNode[7];Qq←Q;Pp←P;
{WHILE TRUE DO BEGIN Mem[Qq]↑.Hh.B1←Mem[Pp]↑.Hh.B0;
Mem[Qq]↑.Hh.B0←Mem[Pp]↑.Hh.B1;Mem[ INT[Qq]+1]↑.Int←Mem[ INT[Pp]+1]↑.Int;
Mem[ INT[Qq]+2]↑.Int←Mem[ INT[Pp]+2]↑.Int;Mem[ INT[Qq]+5]↑.Int←Mem[ INT[Pp]+3]↑.Int;
Mem[ INT[Qq]+6]↑.Int←Mem[ INT[Pp]+4]↑.Int;Mem[ INT[Qq]+3]↑.Int←Mem[ INT[Pp]+5]↑.Int;
Mem[ INT[Qq]+4]↑.Int←Mem[ INT[Pp]+6]↑.Int;
IF Mem[Pp]↑.Hh.Rh=P THEN BEGIN Mem[Q]↑.Hh.Rh←Qq;PathTail←Pp;
HtapYpocResult←Q; GOTO Label10; END;Rr←GetNode[7];Mem[Rr]↑.Hh.Rh←Qq;Qq←Rr;
Pp←Mem[Pp]↑.Hh.Rh; END ENDLOOP ;EXITS Label10 => NULL}; END;--:266----269:----284:----296:
CurlRatio: PROCEDURE[Gamma,ATension,BTension: Scaled] RETURNS[CurlRatioResult: Fraction]
=
BEGIN Alpha, Beta, Num, Denom, Ff:Fraction;
Alpha←MakeFraction[65536,ATension];
Beta←MakeFraction[65536,BTension];
IF Alpha<=Beta THEN BEGIN Ff←MakeFraction[Alpha,Beta];
Ff←TakeFraction[Ff,Ff];Gamma←TakeFraction[Gamma,Ff];
Beta← PascalDIVPower2[Beta ,12];Denom←TakeFraction[Gamma,Alpha]+196608-Beta;
Num←TakeFraction[Gamma,805306368-Alpha]+Beta;
END ELSE BEGIN Ff←MakeFraction[Beta,Alpha];Ff←TakeFraction[Ff,Ff];
Beta← PascalDIVPower2[TakeFraction[Beta,Ff],12];
Denom←TakeFraction[Gamma,Alpha]+( Ff /1365)-Beta;
Num←TakeFraction[Gamma,805306368-Alpha]+Beta; END;
IF Num>=Denom+Denom+Denom+Denom THEN CurlRatioResult←1073741824 ELSE
CurlRatioResult←MakeFraction[Num,Denom]; END;--:296----299:
SetControls: PROCEDURE[P,Q: Halfword,K: PascalInteger] =
BEGIN Rr, Ss:Fraction;
Lt, Rt:Scaled;Sine:Fraction; Lt←ABS[Mem[ INT[Q]+4]↑.Int];
Rt←ABS[Mem[ INT[P]+6]↑.Int];Rr←Velocity[St,Ct,Sf,Cf,Rt];
Ss←Velocity[Sf,Cf,St,Ct,Lt];
IF(Mem[ INT[P]+6]↑.Int<0)OR (Mem[ INT[Q]+4]↑.Int<0) THEN--300:
IF((St>=0)AND (Sf>=0))OR ((St<=0)AND (Sf<=0)) THEN BEGIN Sine←TakeFraction
[ABS[St],Cf]+TakeFraction[ABS[Sf],Ct];
IF Sine>0 THEN BEGIN Sine←TakeFraction[Sine,268500992];
IF Mem[ INT[P]+6]↑.Int<0 THEN IF AbVsCd[ABS[Sf],268435456,Rr,Sine]<0 THEN Rr
←MakeFraction[ABS[Sf],Sine];
IF Mem[ INT[Q]+4]↑.Int<0 THEN IF AbVsCd[ABS[St],268435456,Ss,Sine]<0 THEN Ss
←MakeFraction[ABS[St],Sine]; END; END--:300--;
Mem[ INT[P]+5]↑.Int←Mem[ INT[P]+1]↑.Int+TakeFraction[
TakeFraction[DeltaX↑[K],Ct]-TakeFraction[DeltaY↑[K],St],Rr];
Mem[ INT[P]+6]↑.Int←Mem[ INT[P]+2]↑.Int+TakeFraction[
TakeFraction[DeltaY↑[K],Ct]+TakeFraction[DeltaX↑[K],St],Rr];
Mem[ INT[Q]+3]↑.Int←Mem[ INT[Q]+1]↑.Int-TakeFraction[
TakeFraction[DeltaX↑[K],Cf]+TakeFraction[DeltaY↑[K],Sf],Ss];
Mem[ INT[Q]+4]↑.Int←Mem[ INT[Q]+2]↑.Int-TakeFraction[
TakeFraction[DeltaY↑[K],Cf]-TakeFraction[DeltaX↑[K],Sf],Ss];Mem[P]↑.Hh.B1←1;Mem[Q]↑.Hh.B0←1; END;
END.