-- file: MFEdgesImpl2.mesa
-- Pascal-to-Mesa translator output, translated at October 31, 1985 4:28:01 pm PST


DIRECTORY
  PascalBasic,
  PascalWizardFiles,
  MFTypes,
  MFProcArray,
  MFInteraction,
  MFMemory,
  MFMoves,
  MFEdges,
  MFParsing;

MFEdgesImpl2: PROGRAM IMPORTS PascalBasic, MFProcArray, MFInteraction, MFMemory, MFMoves, MFEdges, MFParsing EXPORTS MFEdges = PUBLIC
BEGIN OPEN PascalBasic, PascalWizardFiles, MFTypes, MFProcArray, MFInteraction, MFMemory, MFMoves, MFEdges, MFParsing;
 YReflectEdges: PROCEDURE = 
BEGIN P, Q, R:Halfword;
 P←Mem[ INT[CurEdges]+1]↑.Hh.Lh;
Mem[ INT[CurEdges]+1]↑.Hh.Lh← INT[8191]-Mem[ INT[CurEdges]+1]↑.Hh.Rh;
Mem[ INT[CurEdges]+1]↑.Hh.Rh← INT[8191]-P;
Mem[ INT[CurEdges]+5]↑.Hh.Lh← INT[8191]-Mem[ INT[CurEdges]+5]↑.Hh.Lh;
P←Mem[CurEdges]↑.Hh.Rh;Q←CurEdges;DO R←Mem[P]↑.Hh.Rh;
Mem[P]↑.Hh.Rh←Q;Mem[Q]↑.Hh.Lh←P;Q←P;P←R; IF Q=CurEdges THEN EXIT; ENDLOOP;
Mem[ INT[CurEdges]+4]↑.Int←0; END;--:336----337:-- XReflectEdges: PROCEDURE
 = 
BEGIN P, Q, R, S:Halfword;M:PascalInteger; P←Mem[ INT[CurEdges]+2]↑.Hh.Lh;
Mem[ INT[CurEdges]+2]↑.Hh.Lh← INT[8192]-Mem[ INT[CurEdges]+2]↑.Hh.Rh;
Mem[ INT[CurEdges]+2]↑.Hh.Rh← INT[8192]-P;M←( INT[4096]+Mem[ INT[CurEdges]+3]↑.Hh.Lh)*8+8;
Mem[ INT[CurEdges]+3]↑.Hh.Lh←4096;P←Mem[CurEdges]↑.Hh.Rh;DO--339:
Q←Mem[ INT[P]+1]↑.Hh.Rh;R←50000;WHILE Q#50000 DO BEGIN S←Mem[Q]↑.Hh.Rh;
Mem[Q]↑.Hh.Rh←R;R←Q;Mem[R]↑.Hh.Lh←M-Mem[Q]↑.Hh.Lh;Q←S; END ENDLOOP ;
Mem[ INT[P]+1]↑.Hh.Rh←R--:339--;--338:--Q←Mem[ INT[P]+1]↑.Hh.Lh;
WHILE  INT[Q]>1 DO BEGIN Mem[Q]↑.Hh.Lh←M-Mem[Q]↑.Hh.Lh;Q←Mem[Q]↑.Hh.Rh;
 END--:338-- ENDLOOP ;P←Mem[P]↑.Hh.Rh; IF P=CurEdges THEN EXIT; ENDLOOP;Mem[ INT[CurEdges]+4]↑.Int←0; END;
--:337----340:-- YScaleEdges: PROCEDURE[S: PascalInteger]
 = 
BEGIN P, Q, Pp, R, Rr, Ss:Halfword;T:PascalInteger;
 IF(S*( INT[Mem[ INT[CurEdges]+1]↑.Hh.Rh]-4095)>=4096)OR (S*( INT[Mem[ INT[CurEdges]+1]↑.Hh
.Lh]-4096)<=-4096) THEN BEGIN BEGIN IF Interaction=3  THEN NULL;PrintNl[133];
Print[403]; END;BEGIN HelpPtr←3;HelpLine↑[2]←404;HelpLine↑[1]←405;
HelpLine↑[0]←406; END;PutGetError[];
 END  ELSE BEGIN Mem[ INT[CurEdges]+1]↑.Hh.Rh←S*( INT[Mem[ INT[CurEdges]+1]↑.Hh.Rh]-4095)
+4095;Mem[ INT[CurEdges]+1]↑.Hh.Lh←S*( INT[Mem[ INT[CurEdges]+1]↑.Hh.Lh]-4096)+4096;
--341:--P←CurEdges;DO Q←P;P←Mem[P]↑.Hh.Rh;
FOR i:INT    IN [ INT[2 ].. INT[S ]] DO  T ← i;  Pp←GetNode[2];Mem[Q]↑.Hh.Rh←Pp;
Mem[P]↑.Hh.Lh←Pp;Mem[Pp]↑.Hh.Rh←P;Mem[Pp]↑.Hh.Lh←Q;Q←Pp;--335:
R←Mem[ INT[P]+1]↑.Hh.Rh;Rr← INT[Pp]+1;WHILE R#50000 DO BEGIN Ss←GetAvail[];
Mem[Rr]↑.Hh.Rh←Ss;Rr←Ss;Mem[Rr]↑.Hh.Lh←Mem[R]↑.Hh.Lh;R←Mem[R]↑.Hh.Rh;
 END ENDLOOP ;Mem[Rr]↑.Hh.Rh←50000;R←Mem[ INT[P]+1]↑.Hh.Lh;Rr←49999;
WHILE  INT[R]>1 DO BEGIN Ss←GetAvail[];Mem[Rr]↑.Hh.Rh←Ss;Rr←Ss;
Mem[Rr]↑.Hh.Lh←Mem[R]↑.Hh.Lh;R←Mem[R]↑.Hh.Rh; END ENDLOOP ;Mem[Rr]↑.Hh.Rh←R;
Mem[ INT[Pp]+1]↑.Hh.Lh←Mem[49999]↑.Hh.Rh--:335--; ENDLOOP;
 IF Mem[P]↑.Hh.Rh=CurEdges--:341-- THEN EXIT; ENDLOOP;Mem[ INT[CurEdges]+4]↑.Int←0; END; END;
--:340----342:-- XScaleEdges: PROCEDURE[S: PascalInteger] = 
BEGIN P, Q:Halfword;
T:PascalInteger[0..65535];W:PascalInteger[0..7];Delta:PascalInteger;
 IF(S*( INT[Mem[ INT[CurEdges]+2]↑.Hh.Rh]-4096)>=4096)OR (S*( INT[Mem[ INT[CurEdges]+2]↑.Hh
.Lh]-4096)<=-4096) THEN BEGIN BEGIN IF Interaction=3  THEN NULL;PrintNl[133];
Print[403]; END;BEGIN HelpPtr←3;HelpLine↑[2]←407;HelpLine↑[1]←405;
HelpLine↑[0]←406; END;PutGetError[];
 END  ELSE IF(Mem[ INT[CurEdges]+2]↑.Hh.Rh#4096)OR (Mem[ INT[CurEdges]+2]↑.Hh.Lh#4096
) THEN BEGIN Mem[ INT[CurEdges]+2]↑.Hh.Rh←S*( INT[Mem[ INT[CurEdges]+2]↑.Hh.Rh]-4096)+4096
;Mem[ INT[CurEdges]+2]↑.Hh.Lh←S*( INT[Mem[ INT[CurEdges]+2]↑.Hh.Lh]-4096)+4096;
Delta←8*(4096-S*Mem[ INT[CurEdges]+3]↑.Hh.Lh)+0;Mem[ INT[CurEdges]+3]↑.Hh.Lh←4096;
--343:--Q←Mem[CurEdges]↑.Hh.Rh;DO P←Mem[ INT[Q]+1]↑.Hh.Rh;
WHILE P#50000 DO BEGIN T←Mem[P]↑.Hh.Lh;W← PascalMODPower2Mask[T ,7];
Mem[P]↑.Hh.Lh←( INT[T]-W)*S+W+Delta;P←Mem[P]↑.Hh.Rh; END ENDLOOP ;P←Mem[ INT[Q]+1]↑.Hh.Lh;
WHILE  INT[P]>1 DO BEGIN T←Mem[P]↑.Hh.Lh;W← PascalMODPower2Mask[T ,7];
Mem[P]↑.Hh.Lh←( INT[T]-W)*S+W+Delta;P←Mem[P]↑.Hh.Rh; END ENDLOOP ;Q←Mem[Q]↑.Hh.Rh;
 IF Q=CurEdges--:343-- THEN EXIT; ENDLOOP;Mem[ INT[CurEdges]+4]↑.Int←0; END; END;--:342----344:
 XySwapEdges: PROCEDURE = 
BEGIN  MMagic, NMagic:PascalInteger;
P, Q, R, S:Halfword;--357:--MSpread:PascalInteger;J, Jj:PascalInteger[0..MoveSize];M, Mm:PascalInteger;
Pd, Rd:PascalInteger;Pm, Rm:PascalInteger;W:PascalInteger;Ww:PascalInteger;Dw:PascalInteger;--:357----363:
Extras:PascalInteger;Xw:PascalInteger[-3..3];K:PascalInteger;--:363----356:
--365:
 
 MSpread← INT[Mem[ INT[CurEdges]+2]↑.Hh.Rh]-Mem[ INT[CurEdges]+2]↑.Hh.Lh;
IF MSpread>MoveSize  THEN Overflow[408,MoveSize];
FOR i:INT    IN [ INT[0 ].. INT[MSpread ]] DO  J ← i; Move↑[J]←50000--:356-- ENDLOOP;--355:--P←GetNode[2];
Mem[ INT[P]+1]↑.Hh.Rh←50000;Mem[ INT[P]+1]↑.Hh.Lh←0;Mem[P]↑.Hh.Lh←CurEdges;
Mem[Mem[CurEdges]↑.Hh.Rh]↑.Hh.Lh←P;P←GetNode[2];Mem[ INT[P]+1]↑.Hh.Rh←50000;
Mem[P]↑.Hh.Lh←Mem[CurEdges]↑.Hh.Lh;--:355--MMagic← INT[Mem[ INT[CurEdges]+2]↑.Hh.Lh]+Mem[ INT[CurEdges]+3]↑.Hh.Lh-4096;
NMagic← INT[8]*Mem[ INT[CurEdges]+1]↑.Hh.Rh+12--:365--;DO  Q←Mem[P]↑.Hh.Lh;
IF  INT[Mem[ INT[Q]+1]↑.Hh.Lh]>1  THEN SortEdges[Q];--358:--R←Mem[ INT[P]+1]↑.Hh.Rh;
FreeNode[P,2];P←R;Pd←Mem[P]↑.Hh.Lh;Pm← PascalDIVPower2[Pd ,3];R←Mem[ INT[Q]+1]↑.Hh.Rh;
Rd←Mem[R]↑.Hh.Lh;Rm← PascalDIVPower2[Rd ,3];W←0;
{WHILE TRUE DO BEGIN IF Pm<Rm  THEN Mm←Pm  ELSE Mm←Rm;IF W#0  THEN--362:
IF M#Mm  THEN BEGIN IF Mm-MMagic>=MoveSize  THEN Confusion[378];
Extras← (ABS[W]-1)/3;
IF Extras>0  THEN BEGIN IF W>0  THEN Xw←3  ELSE Xw←-3;Ww←W-Extras*Xw;
 END  ELSE Ww←W;DO J←M-MMagic;
FOR i:INT    IN [ INT[1 ].. INT[Extras ]] DO  K ← i;  S←GetAvail[];Mem[S]↑.Hh.Lh←NMagic+Xw;
Mem[S]↑.Hh.Rh←Move↑[J];Move↑[J]←S; ENDLOOP;S←GetAvail[];
Mem[S]↑.Hh.Lh←NMagic+Ww;Mem[S]↑.Hh.Rh←Move↑[J];Move↑[J]←S;M←M+1;
 IF M=Mm THEN EXIT; ENDLOOP; END--:362--;IF Pd<Rd  THEN BEGIN Dw←( PascalMODPower2Mask[Pd ,7])-4;--360:
S←Mem[P]↑.Hh.Rh;BEGIN Mem[P]↑.Hh.Rh←Avail;Avail←P;DynUsed←DynUsed-1;
 END;P←S;Pd←Mem[P]↑.Hh.Lh;Pm← PascalDIVPower2[Pd ,3];
 END  ELSE BEGIN IF R=50000  THEN  GOTO Label30;Dw←-(( PascalMODPower2Mask[Rd ,7])-4);--359:
R←Mem[R]↑.Hh.Rh;Rd←Mem[R]↑.Hh.Lh;Rm← PascalDIVPower2[Rd ,3]; END;M←Mm;W←W+Dw;
 END ENDLOOP ;EXITS Label30 => NULL};--:358--P←Q;NMagic←NMagic-8; IF Mem[P]↑.Hh.Lh=CurEdges THEN EXIT; ENDLOOP;
FreeNode[P,2];--364:--Move↑[MSpread]←0;J←0;
WHILE Move↑[J]=50000 DO J←J+1 ENDLOOP ;
IF J=MSpread  THEN InitEdges[CurEdges] ELSE BEGIN Mm←Mem[ INT[CurEdges]+2]↑.
Hh.Lh;Mem[ INT[CurEdges]+2]↑.Hh.Lh←Mem[ INT[CurEdges]+1]↑.Hh.Lh;
Mem[ INT[CurEdges]+2]↑.Hh.Rh← INT[Mem[ INT[CurEdges]+1]↑.Hh.Rh]+1;
Mem[ INT[CurEdges]+3]↑.Hh.Lh←4096;Jj←MSpread-1;
WHILE Move↑[Jj]=50000 DO Jj←Jj-1 ENDLOOP ;Mem[ INT[CurEdges]+1]↑.Hh.Lh←J+Mm;
Mem[ INT[CurEdges]+1]↑.Hh.Rh←Jj+Mm;Q←CurEdges;DO P←GetNode[2];
Mem[Q]↑.Hh.Rh←P;Mem[P]↑.Hh.Lh←Q;Mem[ INT[P]+1]↑.Hh.Rh←Move↑[J];
Mem[ INT[P]+1]↑.Hh.Lh←0;J←J+1;Q←P; IF  INT[J]>Jj THEN EXIT; ENDLOOP;Mem[Q]↑.Hh.Rh←CurEdges;
Mem[CurEdges]↑.Hh.Lh←Q;
Mem[ INT[CurEdges]+5]↑.Hh.Lh← INT[Mem[ INT[CurEdges]+1]↑.Hh.Rh]+1;
Mem[ INT[CurEdges]+5]↑.Hh.Rh←CurEdges;Mem[ INT[CurEdges]+4]↑.Int←0; END;--:364-- END;--:354----366:--
END.