-- file: MFTimeImpl1.mesa
-- Pascal-to-Mesa translator output, translated at October 31, 1985 4:28:02 pm PST
DIRECTORY
PascalBasic,
PascalWizardFiles,
MFTypes,
MFProcArray,
MFMath,
MFOctants,
MFTime;
MFTimeImpl1: PROGRAM IMPORTS PascalBasic, MFProcArray, MFMath, MFOctants, MFTime EXPORTS MFTime = PUBLIC
BEGIN OPEN PascalBasic, PascalWizardFiles, MFTypes, MFProcArray, MFMath, MFOctants, MFTime;
--:507----552:
TolStep: PascalInteger[0..6];
--:552----555:--
CurT: PascalInteger;
CurTt: PascalInteger;
TimeToGo: PascalInteger;
--:555
--557:--
Delx: PascalInteger;
Dely: PascalInteger;
Tol: PascalInteger;
Uv: PascalInteger[0..BistackSize];
Xy: PascalInteger[0..BistackSize];
ThreeL: PascalInteger;
--:527----539:-- FindDirectionTime: PROCEDURE[X,Y: Scaled,H: Halfword] RETURNS[FindDirectionTimeResult: Scaled]
=
BEGIN Max:Scaled;P, Q:Halfword;N:Scaled;Tt:Scaled;--542:
X1, X2, X3, Y1, Y2, Y3:Scaled;Theta, Phi:Angle;T:Fraction;--:542----540:
{IF ABS[X]<ABS[Y] THEN BEGIN X←MakeFraction[X,ABS[Y]];
IF Y>0 THEN Y←268435456 ELSE Y←-268435456;
END ELSE IF X=0 THEN BEGIN FindDirectionTimeResult←0; GOTO Label10;
END ELSE BEGIN Y←MakeFraction[Y,ABS[X]];
IF X>0 THEN X←268435456 ELSE X←-268435456; END--:540--;N←0;P←H;
{{WHILE TRUE DO BEGIN IF Mem[P]↑.Hh.B1=0 THEN GOTO Label45;Q←Mem[P]↑.Hh.Rh;
--541:--Tt←0;--543:--X1←Mem[ INT[P]+5]↑.Int-Mem[ INT[P]+1]↑.Int;
X2←Mem[ INT[Q]+3]↑.Int-Mem[ INT[P]+5]↑.Int;X3←Mem[ INT[Q]+1]↑.Int-Mem[ INT[Q]+3]↑.Int;
Y1←Mem[ INT[P]+6]↑.Int-Mem[ INT[P]+2]↑.Int;Y2←Mem[ INT[Q]+4]↑.Int-Mem[ INT[P]+6]↑.Int;
Y3←Mem[ INT[Q]+2]↑.Int-Mem[ INT[Q]+4]↑.Int;Max←ABS[X1];
IF ABS[X2]>Max THEN Max←ABS[X2];IF ABS[X3]>Max THEN Max←ABS[X3];
IF ABS[Y1]>Max THEN Max←ABS[Y1];IF ABS[Y2]>Max THEN Max←ABS[Y2];
IF ABS[Y3]>Max THEN Max←ABS[Y3];IF Max=0 THEN GOTO Label40;
WHILE Max<134217728 DO BEGIN Max←Max+Max;X1←X1+X1;X2←X2+X2;X3←X3+X3;
Y1←Y1+Y1;Y2←Y2+Y2;Y3←Y3+Y3; END ENDLOOP ;T←X1;
X1←TakeFraction[X1,X]+TakeFraction[Y1,Y];
Y1←TakeFraction[Y1,X]-TakeFraction[T,Y];T←X2;
X2←TakeFraction[X2,X]+TakeFraction[Y2,Y];
Y2←TakeFraction[Y2,X]-TakeFraction[T,Y];T←X3;
X3←TakeFraction[X3,X]+TakeFraction[Y3,Y];
Y3←TakeFraction[Y3,X]-TakeFraction[T,Y]--:543--;
IF Y1=0 THEN IF X1>=0 THEN GOTO Label40;IF N>0 THEN BEGIN--544:
Theta←NArg[X1,Y1];
IF Theta>=0 THEN IF Phi<=0 THEN IF Phi>=Theta-188743680 THEN GOTO Label40;
IF Theta<=0 THEN IF Phi>=0 THEN IF Phi<=Theta+188743680 THEN GOTO Label40--:
-- 544--;IF P=H THEN GOTO Label45; END;IF(X3#0)OR (Y3#0) THEN Phi←NArg[X3,Y3];
--546:--{IF X1<0 THEN IF X2<0 THEN IF X3<0 THEN GOTO Label30;
IF AbVsCd[Y1,Y3,Y2,Y2]=0 THEN--548:
BEGIN IF AbVsCd[Y1,Y2,0,0]<0 THEN BEGIN T←MakeFraction[Y1,Y1-Y2];
X1←X1-TakeFraction[X1-X2,T];X2←X2-TakeFraction[X2-X3,T];
IF X1-TakeFraction[X1-X2,T]>=0 THEN BEGIN Tt← PascalDIVPower2[(T+2048),12]; GOTO Label40;
END; END ELSE IF Y3=0 THEN IF Y1=0 THEN--549:
BEGIN T←CrossingPoint[-X1,-X2,-X3];
IF T<=268435456 THEN BEGIN Tt← PascalDIVPower2[(T+2048),12]; GOTO Label40; END;
IF AbVsCd[X1,X3,X2,X2]<=0 THEN BEGIN T←MakeFraction[X1,X1-X2];
BEGIN Tt← PascalDIVPower2[(T+2048),12]; GOTO Label40; END; END; END--:549
ELSE IF X3>=0 THEN BEGIN Tt←65536; GOTO Label40; END; GOTO Label30; END--:548--;
IF Y1<=0 THEN IF Y1<0 THEN BEGIN Y1←-Y1;Y2←-Y2;Y3←-Y3;
END ELSE IF Y2>0 THEN BEGIN Y2←-Y2;Y3←-Y3; END;--547:
T←CrossingPoint[Y1,Y2,Y3];IF T>268435456 THEN GOTO Label30;
Y2←Y2-TakeFraction[Y2-Y3,T];X1←X1-TakeFraction[X1-X2,T];
X2←X2-TakeFraction[X2-X3,T];X1←X1-TakeFraction[X1-X2,T];
IF X1>=0 THEN BEGIN Tt← PascalDIVPower2[(T+2048),12]; GOTO Label40; END;IF Y2>0 THEN Y2←0;
Tt←T;T←CrossingPoint[0,-Y2,-Y3];IF T>268435456 THEN GOTO Label30;
X1←X1-TakeFraction[X1-X2,T];X2←X2-TakeFraction[X2-X3,T];
IF X1-TakeFraction[X1-X2,T]>=0 THEN BEGIN T←Tt-TakeFraction[Tt
-268435456,T];BEGIN Tt← PascalDIVPower2[(T+2048),12]; GOTO Label40; END; END--:547--;EXITS Label30 => NULL};--:546
--:541--P←Q;N←N+65536; END ENDLOOP ;EXITS Label45 => NULL};FindDirectionTimeResult←-65536; GOTO Label10;
EXITS Label40 => NULL};FindDirectionTimeResult←N+Tt;EXITS Label10 => NULL}; END;--:539----556:
PathIntersection: PROCEDURE[H,Hh: Halfword] =
BEGIN P, Pp:Halfword;
N, Nn:PascalInteger;--563:
IF Mem[H]↑.Hh.B1=0 THEN BEGIN Mem[ INT[H]+5]↑.Int←Mem[ INT[H]+1]↑.Int;
Mem[ INT[H]+3]↑.Int←Mem[ INT[H]+1]↑.Int;Mem[ INT[H]+6]↑.Int←Mem[ INT[H]+2]↑.Int;
Mem[ INT[H]+4]↑.Int←Mem[ INT[H]+2]↑.Int;Mem[H]↑.Hh.B1←1; END;
IF Mem[Hh]↑.Hh.B1=0 THEN BEGIN Mem[ INT[Hh]+5]↑.Int←Mem[ INT[Hh]+1]↑.Int;
Mem[ INT[Hh]+3]↑.Int←Mem[ INT[Hh]+1]↑.Int;Mem[ INT[Hh]+6]↑.Int←Mem[ INT[Hh]+2]↑.Int;
Mem[ INT[Hh]+4]↑.Int←Mem[ INT[Hh]+2]↑.Int;Mem[Hh]↑.Hh.B1←1; END;--:563--TolStep←0;
{DO N←-65536;P←H;DO IF Mem[P]↑.Hh.B1#0 THEN BEGIN Nn←-65536;
Pp←Hh;DO IF Mem[Pp]↑.Hh.B1#0 THEN BEGIN CubicIntersection[P,Pp];
IF CurT>0 THEN BEGIN CurT←CurT+N;CurTt←CurTt+Nn; GOTO Label10; END; END;
Nn←Nn+65536;Pp←Mem[Pp]↑.Hh.Rh; IF Pp=Hh THEN EXIT; ENDLOOP; END;N←N+65536;
P←Mem[P]↑.Hh.Rh; IF P=H THEN EXIT; ENDLOOP;TolStep←TolStep+3; IF INT[TolStep]>3 THEN EXIT; ENDLOOP;
CurT←-65536;CurTt←-65536;EXITS Label10 => NULL}; END;--:562----564:
END.