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


DIRECTORY
  PascalBasic,
  PascalWizardFiles,
  MFTypes,
  MFProcArray,
  MFInteraction,
  MFMath,
  MFMemory,
  MFSymbols,
  MFEdges,
  MFOctants,
  MFTime,
  MFEquations,
  MFInput,
  MFFileNames,
  MFParsing,
  MFOps,
  MFGF;

MFOpsImpl4: PROGRAM IMPORTS PascalBasic, PascalWizardFiles, MFProcArray, MFInteraction, MFMath, MFMemory, MFSymbols, MFEdges, MFOctants, MFTime, MFEquations, MFInput, MFFileNames, MFParsing, MFOps, MFGF EXPORTS MFOps = PUBLIC
BEGIN OPEN PascalBasic, PascalWizardFiles, MFTypes, MFProcArray, MFInteraction, MFMath, MFMemory, MFSymbols, MFEdges, MFOctants, MFTime, MFEquations, MFInput, MFFileNames, MFParsing, MFOps, MFGF;
 FindPoint: PROCEDURE[V: Scaled,C: Quarterword]
 = 
BEGIN P:Halfword;N:Scaled;Vv:Scaled;Q:Halfword; Vv←V;P←CurExp;
IF Mem[P]↑.Hh.B0=0  THEN N←-65536  ELSE N←0;DO P←Mem[P]↑.Hh.Rh;
N←N+65536; IF P=CurExp THEN EXIT; ENDLOOP;
IF N=0  THEN V←0  ELSE IF V<0  THEN IF Mem[P]↑.Hh.B0=0  THEN V←0  ELSE V←N
-1-( (-V-1)MOD N) ELSE IF V>N  THEN IF Mem[P]↑.Hh.B0=0  THEN V←N  ELSE V← V
MOD N;P←CurExp;WHILE V>=65536 DO BEGIN P←Mem[P]↑.Hh.Rh;V←V-65536; END ENDLOOP ;
IF V#0  THEN--985:--BEGIN Q←Mem[P]↑.Hh.Rh;
SplitCubic[P,V*4096,Mem[ INT[Q]+1]↑.Int,Mem[ INT[Q]+2]↑.Int];P←Mem[P]↑.Hh.Rh;
 END--:985--;--986:--SELECT C FROM 97 =>PairValue[Mem[ INT[P]+1]↑.Int,Mem[ INT[P]+2]↑.Int];
98 =>IF Mem[P]↑.Hh.B0=0  THEN PairValue[Mem[ INT[P]+1]↑.Int,Mem[ INT[P]+2]↑.Int] ELSE
PairValue[Mem[ INT[P]+3]↑.Int,Mem[ INT[P]+4]↑.Int];
99 =>IF Mem[P]↑.Hh.B1=0  THEN PairValue[Mem[ INT[P]+1]↑.Int,Mem[ INT[P]+2]↑.Int] ELSE
PairValue[Mem[ INT[P]+5]↑.Int,Mem[ INT[P]+6]↑.Int]; ENDCASE--:986--; END;--:984
 DoBinary: PROCEDURE[P: Halfword,C: Quarterword] = 
BEGIN 
 Q, R, Rr:Halfword;OldP, OldExp:Halfword;V:PascalInteger;
 BEGIN IF ArithError  THEN ClearArith[]; END;
IF Internal↑[7]>131072  THEN--923:--BEGIN BeginDiagnostic[];PrintNl[715];
PrintExp[P,0];PrintChar[41];PrintOp[C];PrintChar[40];PrintExp[0,0];
Print[707];EndDiagnostic[FALSE]; END--:923--;--925:
SELECT Mem[P]↑.Hh.B0 FROM 13,14 =>OldP←Tarnished[P];19 =>OldP←1;
 ENDCASE =>OldP←0 ;IF OldP#0  THEN BEGIN Q←StashCurExp[];OldP←P;
MakeExpCopy[OldP];P←StashCurExp[];UnstashCurExp[Q]; END;
SELECT CurType FROM 13,14 =>OldExp←Tarnished[CurExp];19 =>OldExp←1;
 ENDCASE =>OldExp←0 ;IF OldExp#0  THEN BEGIN OldExp←CurExp;
MakeExpCopy[OldExp]; END--:925--;{SELECT C FROM 69,70 =>--928:
IF( INT[CurType]<14)OR ( INT[Mem[P]↑.Hh.B0]<14) THEN IF(CurType=11)AND (
Mem[P]↑.Hh.B0=11) THEN BEGIN IF C=70  THEN NegateEdges[CurExp];CurEdges←CurExp;
MergeEdges[Mem[ INT[P]+1]↑.Int];
 END  ELSE BadBinary[P,C] ELSE IF CurType=14  THEN IF Mem[P]↑.Hh.B0#14
 THEN BadBinary[P,C] ELSE BEGIN Q←Mem[ INT[P]+1]↑.Int;R←Mem[CurExp+1]↑.Int;
AddOrSubtract[Q,R,C];AddOrSubtract[ INT[Q]+2, INT[R]+2,C];
 END  ELSE IF Mem[P]↑.Hh.B0=14  THEN BadBinary[P,C] ELSE AddOrSubtract[P,0
,C]--:928--;--935:
77,78,79,80,81,82 =>BEGIN {IF( INT[CurType]>14)AND ( INT[Mem[P]↑.Hh.B0]>14) THEN
AddOrSubtract[P,0,70] ELSE IF CurType#Mem[P]↑.Hh.B0  THEN BEGIN
BadBinary[P,C]; GOTO Label30;
 END  ELSE IF CurType=4  THEN FlushCurExp[StrVsStr[Mem[ INT[P]+1]↑.Int,
CurExp]] ELSE IF(CurType=5)OR (CurType=3) THEN--937:
BEGIN Q←Mem[CurExp+1]↑.Int;
WHILE(Q#CurExp)AND (Q#P)DO Q←Mem[ INT[Q]+1]↑.Int ENDLOOP ;
IF Q=P  THEN FlushCurExp[0]; END--:937
 ELSE IF(CurType=14)OR (CurType=13) THEN--938:--BEGIN Q←Mem[ INT[P]+1]↑.Int;
R←Mem[CurExp+1]↑.Int;Rr← INT[R]+BigNodeSize↑[CurType]-2;
{WHILE TRUE DO BEGIN AddOrSubtract[Q,R,70];
IF Mem[R]↑.Hh.B0#16  THEN  GOTO Label31;IF Mem[ INT[R]+1]↑.Int#0  THEN  GOTO Label31;
IF R=Rr  THEN  GOTO Label31;Q← INT[Q]+2;R← INT[R]+2; END ENDLOOP ;
EXITS Label31 => NULL};TakePart[ 53+PascalDIVPower2[(R-Mem[CurExp+1]↑.Int),1]]; END--:938
 ELSE IF CurType=2  THEN FlushCurExp[CurExp-Mem[ INT[P]+1]↑.Int] ELSE BEGIN
BadBinary[P,C]; GOTO Label30; END;--936:
IF CurType#16  THEN BEGIN IF  INT[CurType]<16  THEN BEGIN DispErr[P,157];
BEGIN HelpPtr←1;HelpLine↑[0]←716; END ; END  ELSE BEGIN HelpPtr←2;
HelpLine↑[1]←717;HelpLine↑[0]←718; END;DispErr[0,719];
PutGetFlushError[31];
 END  ELSE SELECT C FROM 77 =>IF CurExp<0  THEN CurExp←30  ELSE CurExp←31;
78 =>IF CurExp<=0  THEN CurExp←30  ELSE CurExp←31;
79 =>IF CurExp>0  THEN CurExp←30  ELSE CurExp←31;
80 =>IF CurExp>=0  THEN CurExp←30  ELSE CurExp←31;
81 =>IF CurExp=0  THEN CurExp←30  ELSE CurExp←31;
82 =>IF CurExp#0  THEN CurExp←30  ELSE CurExp←31; ENDCASE;CurType←2--:936
;EXITS Label30 => NULL}; END;--:935----939:
76,75 =>IF(Mem[P]↑.Hh.B0#2)OR (CurType#2) THEN BadBinary[P,C] ELSE IF Mem[
 INT[P]+1]↑.Int=C-45  THEN CurExp←Mem[ INT[P]+1]↑.Int;--:939----940:
71 =>IF( INT[CurType]<14)OR ( INT[Mem[P]↑.Hh.B0]<14) THEN BadBinary[P,71] ELSE IF(
CurType=16)OR (Mem[P]↑.Hh.B0=16) THEN--941:
BEGIN IF Mem[P]↑.Hh.B0=16  THEN BEGIN V←Mem[ INT[P]+1]↑.Int;FreeNode[P,2];
 END  ELSE BEGIN V←CurExp;UnstashCurExp[P]; END;
IF CurType=16  THEN CurExp←TakeScaled[CurExp,V] ELSE IF CurType=14
 THEN BEGIN P←Mem[CurExp+1]↑.Int;DepMult[P,V,TRUE];
DepMult[ INT[P]+2,V,TRUE]; END  ELSE DepMult[0,V,TRUE]; GOTO Label10; END--:941
 ELSE IF(NicePair[P,Mem[P]↑.Hh.B0]AND ( INT[CurType]>14))OR (NicePair[CurExp,
CurType]AND ( INT[Mem[P]↑.Hh.B0]>14)) THEN BEGIN HardTimes[P]; GOTO Label10;
 END  ELSE BadBinary[P,71];--:940----947:
72 =>IF(CurType#16)OR ( INT[Mem[P]↑.Hh.B0]<14) THEN BadBinary[P,72] ELSE BEGIN V
←CurExp;UnstashCurExp[P];IF V=0  THEN--949:--BEGIN DispErr[0,649];
BEGIN HelpPtr←2;HelpLine↑[1]←721;HelpLine↑[0]←722; END;PutGetError[];
 END--:949
 ELSE BEGIN IF CurType=16  THEN CurExp←MakeScaled[CurExp,V] ELSE IF
CurType=14  THEN BEGIN P←Mem[CurExp+1]↑.Int;DepDiv[P,V];
DepDiv[ INT[P]+2,V]; END  ELSE DepDiv[0,V]; END; GOTO Label10; END;--:947----950:
73,74 =>IF(CurType=16)AND (Mem[P]↑.Hh.B0=16) THEN IF C=73  THEN CurExp←
PythAdd[Mem[ INT[P]+1]↑.Int,CurExp] ELSE CurExp←PythSub[Mem[ INT[P]+1]↑.Int,
CurExp] ELSE BadBinary[P,C];--:950----951:
84,85,86,87,88,89,90,91 =>IF(Mem[P]↑.Hh.B0=9)OR (Mem[P]↑.Hh.B0=8)OR (Mem[P]↑.Hh
.B0=6) THEN BEGIN PathTrans[P,C]; GOTO Label10;
 END  ELSE IF(Mem[P]↑.Hh.B0=14)OR (Mem[P]↑.Hh.B0=13) THEN BigTrans[P,C] ELSE
IF Mem[P]↑.Hh.B0=11  THEN BEGIN EdgesTrans[P,C]; GOTO Label10;
 END  ELSE BadBinary[P,C];--:951----974:
83 =>IF(CurType=4)AND (Mem[P]↑.Hh.B0=4) THEN Cat[P] ELSE BadBinary[P,83];
94 =>IF NicePair[P,Mem[P]↑.Hh.B0]AND (CurType=4) THEN ChopString[Mem[ INT[P]+1]↑.
Int] ELSE BadBinary[P,94];95 =>BEGIN IF CurType=14  THEN PairToPath[];
IF NicePair[P,Mem[P]↑.Hh.B0]AND (CurType=9) THEN ChopPath[Mem[ INT[P]+1]↑.Int]
 ELSE BadBinary[P,95]; END;--:974----982:
97,98,99 =>BEGIN IF CurType=14  THEN PairToPath[];
IF(CurType=9)AND (Mem[P]↑.Hh.B0=16) THEN FindPoint[Mem[ INT[P]+1]↑.Int,C] ELSE
BadBinary[P,C]; END;100 =>BEGIN IF CurType=8  THEN MaterializePen[];
IF (CurType=6)AND NicePair[P,Mem[P]↑.Hh.B0] THEN SetUpOffset[Mem[ INT[P]+1]↑.
Int] ELSE BadBinary[P,100]; END;
96 =>BEGIN IF CurType=14  THEN PairToPath[];
IF (CurType=9)AND NicePair[P,Mem[P]↑.Hh.B0] THEN SetUpDirectionTime[
Mem[ INT[P]+1]↑.Int] ELSE BadBinary[P,96]; END;--:982----987:
92 =>BEGIN IF Mem[P]↑.Hh.B0=14  THEN BEGIN Q←StashCurExp[];
UnstashCurExp[P];PairToPath[];P←StashCurExp[];UnstashCurExp[Q]; END;
IF CurType=14  THEN PairToPath[];
IF(CurType=9)AND (Mem[P]↑.Hh.B0=9) THEN BEGIN PathIntersection[Mem[ INT[P]+1]↑.
Int,CurExp];PairValue[CurT,CurTt]; END  ELSE BadBinary[P,92]; END;
--:987-- ENDCASE;RecycleValue[P];FreeNode[P,2];
EXITS Label10 => NULL};BEGIN IF ArithError  THEN ClearArith[]; END;--924:
IF OldP#0  THEN BEGIN RecycleValue[OldP];FreeNode[OldP,2]; END;
IF OldExp#0  THEN BEGIN RecycleValue[OldExp];FreeNode[OldExp,2];
 END--:924--; END;--:921----943:-- FracMult: PROCEDURE[N,D: Scaled]
 = 
BEGIN P:Halfword;OldExp:Halfword;V:Fraction;
 IF Internal↑[7]>131072  THEN--944:--BEGIN BeginDiagnostic[];
PrintNl[715];PrintScaled[N];PrintChar[47];PrintScaled[D];Print[720];
PrintExp[0,0];Print[707];EndDiagnostic[FALSE]; END--:944--;
SELECT CurType FROM 13,14 =>OldExp←Tarnished[CurExp];19 =>OldExp←1;
 ENDCASE =>OldExp←0 ;IF OldExp#0  THEN BEGIN OldExp←CurExp;
MakeExpCopy[OldExp]; END;V←MakeFraction[N,D];
IF CurType=16  THEN CurExp←TakeFraction[CurExp,V] ELSE IF CurType=14
 THEN BEGIN P←Mem[CurExp+1]↑.Int;DepMult[P,V,FALSE];
DepMult[ INT[P]+2,V,FALSE]; END  ELSE DepMult[0,V,FALSE];
IF OldExp#0  THEN BEGIN RecycleValue[OldExp];FreeNode[OldExp,2];
 END ; END;--:943----988:----1153:-- ShipOut: PROCEDURE[C: EightBits] = 
BEGIN  F:PascalInteger;
PrevM, M, Mm:PascalInteger;PrevN, N:PascalInteger;P, Q:Halfword;PrevW, W, Ww:PascalInteger;
D:PascalInteger;Delta:PascalInteger;CurMinM:PascalInteger;XOff, YOff:PascalInteger;
 IF OutputFileName=0  THEN InitGf[];
F←RoundUnscaled[Internal↑[19]];XOff←RoundUnscaled[Internal↑[29]];
YOff←RoundUnscaled[Internal↑[30]];
IF  INT[TermOffset]>MaxPrintLine-9  THEN PrintLn [] ELSE IF( INT[TermOffset]>0)OR (
 INT[FileOffset]>0) THEN PrintChar[32];PrintChar[91];PrintInt[C];
IF F#0  THEN BEGIN PrintChar[46];PrintInt[F]; END;PascalTextBREAK[file: @TermOut];
BocC←256*F+C;BocP←CharPtr↑[C];CharPtr↑[C]←GfPrevPtr;
IF Internal↑[34]>0  THEN--1165:
BEGIN IF XOff#0  THEN BEGIN GfString[310,0];BEGIN GfBuf↑[GfPtr]←243;
GfPtr←GfPtr+1;IF GfPtr=GfLimit  THEN GfSwap[]; END;
GfFour[XOff*65536]; END;IF YOff#0  THEN BEGIN GfString[311,0];
BEGIN GfBuf↑[GfPtr]←243;GfPtr←GfPtr+1;
IF GfPtr=GfLimit  THEN GfSwap[]; END;GfFour[YOff*65536]; END; END--:1165--;
--1166:--PrevN←4096;P←Mem[CurEdges]↑.Hh.Lh;
N← INT[Mem[ INT[CurEdges]+1]↑.Hh.Rh]-4096;WHILE P#CurEdges DO BEGIN--1168:
IF  INT[Mem[ INT[P]+1]↑.Hh.Lh]>1  THEN SortEdges[P];Q←Mem[ INT[P]+1]↑.Hh.Rh;W←0;
PrevM←-268435456;Ww←0;PrevW←0;M←PrevM;
DO IF Q=50000  THEN Mm←268435456  ELSE BEGIN D←Mem[Q]↑.Hh.Lh;
Mm← PascalDIVPower2[D ,3];Ww←Ww+( PascalMODPower2Mask[D ,7])-4; END;
IF Mm#M  THEN BEGIN IF PrevW<=0  THEN BEGIN IF W>0  THEN--1169:
BEGIN IF PrevM=-268435456  THEN--1171:
BEGIN {IF PrevN=4096  THEN BEGIN GfBoc[Mem[ INT[CurEdges]+2]↑.Hh.Lh+XOff-4096
,Mem[ INT[CurEdges]+2]↑.Hh.Rh+XOff-4096,Mem[ INT[CurEdges]+1]↑.Hh.Lh+YOff-4096,
N+YOff];CurMinM← INT[Mem[ INT[CurEdges]+2]↑.Hh.Lh]-4096+Mem[ INT[CurEdges]+3]↑.Hh.Lh;
 END  ELSE IF PrevN>N+1  THEN--1173:--BEGIN Delta←PrevN-N-1;
IF Delta<256  THEN IF Delta=0  THEN BEGIN GfBuf↑[GfPtr]←70;
GfPtr←GfPtr+1;IF GfPtr=GfLimit  THEN GfSwap[];
 END  ELSE BEGIN BEGIN GfBuf↑[GfPtr]←71;GfPtr←GfPtr+1;
IF GfPtr=GfLimit  THEN GfSwap[]; END;BEGIN GfBuf↑[GfPtr]←Delta;
GfPtr←GfPtr+1;IF GfPtr=GfLimit  THEN GfSwap[]; END;
 END  ELSE BEGIN BEGIN GfBuf↑[GfPtr]←72;GfPtr←GfPtr+1;
IF GfPtr=GfLimit  THEN GfSwap[]; END;GfTwo[Delta]; END; END--:1173
 ELSE--1172:--BEGIN Delta←M-CurMinM;
IF Delta>164  THEN BEGIN GfBuf↑[GfPtr]←70;GfPtr←GfPtr+1;
IF GfPtr=GfLimit  THEN GfSwap[];
 END  ELSE BEGIN BEGIN GfBuf↑[GfPtr]←74+Delta;GfPtr←GfPtr+1;
IF GfPtr=GfLimit  THEN GfSwap[]; END; GOTO Label30; END; END--:1172--;
GfPaint[M-CurMinM];EXITS Label30 => NULL};PrevN←N; END--:1171-- ELSE GfPaint[M-PrevM];
PrevM←M;PrevW←W; END--:1169--; END  ELSE IF W<=0  THEN--1170:
BEGIN GfPaint[M-PrevM];PrevM←M;PrevW←W; END--:1170--;M←Mm; END;W←Ww;
Q←Mem[Q]↑.Hh.Rh; IF Mm=268435456 THEN EXIT; ENDLOOP;IF W#0  THEN PrintNl[912];
IF PrevM-Mem[ INT[CurEdges]+3]↑.Hh.Lh+XOff>GfMaxM  THEN GfMaxM←
PrevM-Mem[ INT[CurEdges]+3]↑.Hh.Lh+XOff--:1168--;P←Mem[P]↑.Hh.Lh;N←N-1; END ENDLOOP ;
IF PrevN=4096  THEN--1167:--BEGIN GfBoc[0,0,0,0];
IF GfMaxM<0  THEN GfMaxM←0;IF GfMinN>0  THEN GfMinN←0; END--:1167
 ELSE IF PrevN+YOff<GfMinN  THEN GfMinN←PrevN+YOff--:1166--;
BEGIN GfBuf↑[GfPtr]←69;GfPtr←GfPtr+1;
IF GfPtr=GfLimit  THEN GfSwap[]; END;GfPrevPtr←GfOffset+GfPtr;
TotalChars←TotalChars+1;PrintChar[93];PascalTextBREAK[file: @TermOut];
IF Internal↑[11]>0  THEN PrintEdges[911,TRUE,XOff,YOff]; END;--:1164
--994:----1005:-- TryEq: PROCEDURE[L,R: Halfword] = 
BEGIN  P:Halfword;
T:PascalInteger[16..19];Q:Halfword;Pp:Halfword;Tt:PascalInteger[17..19];Copied:PascalBoolean;--1006:
 
 T←Mem[L]↑.Hh.B0;IF T=16  THEN BEGIN T←17;
P←ConstDependency[-Mem[ INT[L]+1]↑.Int];Q←P;
 END  ELSE IF T=19  THEN BEGIN T←17;P←SingleDependency[L];
Mem[ INT[P]+1]↑.Int←-Mem[ INT[P]+1]↑.Int;Q←DepFinal;
 END  ELSE BEGIN P←Mem[ INT[L]+1]↑.Hh.Rh;Q←P;
{WHILE TRUE DO BEGIN Mem[ INT[Q]+1]↑.Int←-Mem[ INT[Q]+1]↑.Int;
IF Mem[Q]↑.Hh.Lh=0  THEN  GOTO Label30;Q←Mem[Q]↑.Hh.Rh; END ENDLOOP ;
EXITS Label30 => NULL};Mem[Mem[ INT[L]+1]↑.Hh.Lh]↑.Hh.Rh←Mem[Q]↑.Hh.Rh;
Mem[ INT[Mem[Q]↑.Hh.Rh]+1]↑.Hh.Lh←Mem[ INT[L]+1]↑.Hh.Lh;Mem[L]↑.Hh.B0←16; END--:1006--;
--1008:
{IF R=0  THEN IF CurType=16  THEN BEGIN Mem[ INT[Q]+1]↑.Int←Mem[ INT[Q]+1]↑.Int+CurExp
; GOTO Label31; END  ELSE BEGIN Tt←CurType;
IF Tt=19  THEN Pp←SingleDependency[CurExp] ELSE Pp←Mem[CurExp+1]↑.Hh.
Rh;
 END  ELSE IF Mem[R]↑.Hh.B0=16  THEN BEGIN Mem[ INT[Q]+1]↑.Int←Mem[ INT[Q]+1]↑.Int+Mem[ INT[R
]+1]↑.Int; GOTO Label31; END  ELSE BEGIN Tt←Mem[R]↑.Hh.B0;
IF Tt=19  THEN Pp←SingleDependency[R] ELSE Pp←Mem[ INT[R]+1]↑.Hh.Rh; END;
IF Tt#19  THEN Copied←FALSE  ELSE BEGIN Copied←TRUE;Tt←17; END;--1009:
WatchCoefs←FALSE;
IF T=Tt  THEN P←PPlusQ[P,Pp,T] ELSE IF T=18  THEN P←PPlusFq[P,65536,
Pp,18,17] ELSE BEGIN Q←P;
WHILE Mem[Q]↑.Hh.Lh#0 DO BEGIN Mem[ INT[Q]+1]↑.Int←RoundFraction[Mem[ INT[Q]+1]↑.Int
];Q←Mem[Q]↑.Hh.Rh; END ENDLOOP ;T←18;P←PPlusQ[P,Pp,T]; END;WatchCoefs←TRUE;
--:1009--IF Copied  THEN FlushNodeList[Pp];EXITS Label31 => NULL};--:1008--IF Mem[P]↑.Hh.Lh=0  THEN--1007:
BEGIN IF ABS[Mem[ INT[P]+1]↑.Int]>64  THEN BEGIN BEGIN IF Interaction=3  THEN NULL;
PrintNl[133];Print[762]; END;Print[764];PrintScaled[Mem[ INT[P]+1]↑.Int];
PrintChar[41];BEGIN HelpPtr←2;HelpLine↑[1]←763;HelpLine↑[0]←761;
 END;PutGetError[]; END  ELSE IF R=0  THEN--622:
BEGIN BEGIN IF Interaction=3  THEN NULL;PrintNl[133];Print[466]; END;
BEGIN HelpPtr←2;HelpLine↑[1]←467;HelpLine↑[0]←468; END;PutGetError[];
 END--:622--;FreeNode[P,2]; END--:1007-- ELSE BEGIN LinearEq[P,T];
IF R=0  THEN IF CurType#16  THEN IF Mem[CurExp]↑.Hh.B0=16  THEN BEGIN Pp
←CurExp;CurExp←Mem[CurExp+1]↑.Int;CurType←16;FreeNode[Pp,2]; END;
 END; END;--:1005----1000:-- MakeEq: PROCEDURE[Lhs: Halfword] = 
BEGIN 
 T:SmallNumber;V:PascalInteger;P, Q:Halfword; DO {--Label20:--T←Mem[Lhs]↑.Hh.B0;
IF  INT[T]<=14  THEN V←Mem[ INT[Lhs]+1]↑.Int;{SELECT T FROM--1002:
2,4,6,9,11 =>IF CurType=T+1  THEN BEGIN NonlinearEq[V,CurExp,FALSE];
 GOTO Label30; END  ELSE IF CurType=T  THEN--1003:
BEGIN {IF  INT[CurType]<=4  THEN BEGIN IF CurType=4  THEN BEGIN IF StrVsStr[V
,CurExp]#0  THEN  GOTO Label45; END  ELSE IF V#CurExp  THEN  GOTO Label45;--622:
BEGIN BEGIN IF Interaction=3  THEN NULL;PrintNl[133];Print[466]; END;
BEGIN HelpPtr←2;HelpLine↑[1]←467;HelpLine↑[0]←468; END;PutGetError[];
 END--:622--; GOTO Label30; END;BEGIN IF Interaction=3  THEN NULL;PrintNl[133];
Print[759]; END;BEGIN HelpPtr←2;HelpLine↑[1]←760;HelpLine↑[0]←761;
 END;PutGetError[]; GOTO Label30;EXITS Label45 => NULL};BEGIN IF Interaction=3  THEN NULL;PrintNl[133];
Print[762]; END;BEGIN HelpPtr←2;HelpLine↑[1]←763;HelpLine↑[0]←761;
 END;PutGetError[]; GOTO Label30; END--:1003--;
3,5,7,12,10 =>IF CurType=T-1  THEN BEGIN NonlinearEq[CurExp,Lhs,TRUE];
 GOTO Label30; END  ELSE IF CurType=T  THEN BEGIN RingMerge[Lhs,CurExp];
 GOTO Label30; END  ELSE IF CurType=14  THEN IF T=10  THEN BEGIN PairToPath[];
 GOTO Label20; END;13,14 =>IF CurType=T  THEN--1004:--BEGIN P←V+BigNodeSize↑[T];
Q←Mem[CurExp+1]↑.Int+BigNodeSize↑[T];DO P← INT[P]-2;Q← INT[Q]-2;TryEq[P,Q];
 IF P=V THEN EXIT; ENDLOOP; GOTO Label30; END--:1004--;
16,17,18,19 =>IF  INT[CurType]>=16  THEN BEGIN TryEq[Lhs,0]; GOTO Label30; END;1 => NULL;
--:1002-- ENDCASE;--1001:--DispErr[Lhs,157];DispErr[0,756];
IF  INT[Mem[Lhs]↑.Hh.B0]<=14  THEN PrintType[Mem[Lhs]↑.Hh.B0] ELSE Print[213];
PrintChar[61];IF  INT[CurType]<=14  THEN PrintType[CurType] ELSE Print[213];
PrintChar[41];BEGIN HelpPtr←2;HelpLine↑[1]←757;HelpLine↑[0]←758;
 END;PutGetError--:1001--[];EXITS Label30 => NULL};BEGIN IF ArithError  THEN ClearArith[]; END;
RecycleValue[Lhs];FreeNode[Lhs,2];EXIT; EXITS Label20 => NULL} ENDLOOP; END;--:1000-- DoEquation: PROCEDURE = 
BEGIN Lhs:Halfword;P:Halfword;
 Lhs←StashCurExp[];GetXNext[];VarFlag←77;ScanExpression[];
IF CurCmd=51  THEN DoEquation [] ELSE IF CurCmd=77  THEN DoAssignment[];
IF Internal↑[7]>131072  THEN--996:--BEGIN BeginDiagnostic[];PrintNl[715];
PrintExp[Lhs,0];Print[751];PrintExp[0,0];Print[707];
EndDiagnostic[FALSE]; END--:996--;
IF CurType=10  THEN IF Mem[Lhs]↑.Hh.B0=14  THEN BEGIN P←StashCurExp[];
UnstashCurExp[Lhs];Lhs←P; END;MakeEq[Lhs]; END;--:994----995:

END.