-- file: TexMath4Impl.mesa
-- Pascal-to-Mesa translator output, translated at September 27, 1985 10:21:38 am PDT


DIRECTORY
  PascalBasic,
  TexTypes,
  TexInteraction,
  TexMemory,
  TexSymbols,
  TexScan,
  TexOps,
  TexBuildPage,
  TexMath,
  TexRest,
  TexSysdepInline;

TexMath4Impl: PROGRAM IMPORTS PascalBasic, TexTypes, TexInteraction, TexMemory, TexSymbols, TexScan, TexOps, TexBuildPage, TexMath, TexRest, TexSysdepInline EXPORTS TexMath = PUBLIC
BEGIN OPEN PascalBasic, TexTypes, TexInteraction, TexMemory, TexSymbols, TexScan, TexOps, TexBuildPage, TexMath, TexRest, TexSysdepInline;
 StartEqNo: PROCEDURE
 = 
BEGIN SaveStack↑[SavePtr+0].Int←CurChr;SavePtr←SavePtr+1;--1139:
BEGIN PushMath[15];EqWordDefine[4811,-1];
IF Eqtb↑[3559].Hh.Rh#0  THEN BeginTokenList[Eqtb↑[3559].Hh.Rh,8];
 END--:1139--; END;--:1142----1151:-- ScanMath: PROCEDURE[P: Halfword]
 = 
BEGIN  C:PascalInteger; DO {--Label20:----404:--DO GetXToken[];
 IF(CurCmd#10)AND (CurCmd#0)--:404-- THEN EXIT; ENDLOOP;
DO {--Label21:--{SELECT CurCmd FROM 11,12,67 =>IF  INT[CurChr]>=128  THEN C←CurChr  ELSE BEGIN C
←Eqtb↑[ INT[4639]+CurChr].Hh.Rh;IF C=32768  THEN BEGIN--1152:
BEGIN CurCs←CurChr+1;CurCmd←Eqtb↑[CurCs].Hh.B0;
CurChr←Eqtb↑[CurCs].Hh.Rh;XToken[];BackInput[]; END--:1152--; GOTO Label20; END;
 END;16 =>BEGIN ScanCharNum[];CurChr←CurVal;CurCmd←67; GOTO Label21; END;
17 =>BEGIN ScanFifteenBitInt[];C←CurVal; END;68 =>C←CurChr;
15 =>BEGIN ScanTwentySevenBitInt[];C← PascalDIVPower2[CurVal ,12]; END;
 ENDCASE =>--1153:--BEGIN BackInput[];ScanLeftBrace[];
SaveStack↑[SavePtr+0].Int←P;SavePtr←SavePtr+1;PushMath[9]; GOTO Label10;
 END--:1153--;Mem[P]↑.Hh.Rh←1;Mem[P]↑.Hh.B1← PascalMODPower2Mask[C ,255];
IF(C>=28672)AND ((Eqtb↑[4811].Int>=0)AND (Eqtb↑[4811].Int<16)) THEN Mem[P]↑.Hh
.B0←Eqtb↑[4811].Int  ELSE Mem[P]↑.Hh.B0← PascalMODPower2Mask[( PascalDIVPower2[C ,8]),15];EXITS Label10 => NULL};EXIT; EXITS Label21 => NULL} ENDLOOP;EXIT; EXITS Label20 => NULL} ENDLOOP; END;--:1151
--1155:-- SetMathChar: PROCEDURE[C: PascalInteger] = 
BEGIN P:Halfword;
 IF C>=32768  THEN--1152:--BEGIN CurCs←CurChr+1;
CurCmd←Eqtb↑[CurCs].Hh.B0;CurChr←Eqtb↑[CurCs].Hh.Rh;XToken[];
BackInput[]; END--:1152-- ELSE BEGIN P←NewNoad[];Mem[P+1]↑.Hh.Rh←1;
Mem[P+1]↑.Hh.B1← PascalMODPower2Mask[C ,255];Mem[P+1]↑.Hh.B0← PascalMODPower2Mask[( PascalDIVPower2[C ,8]),15];
IF C>=28672  THEN BEGIN IF((Eqtb↑[4811].Int>=0)AND (Eqtb↑[4811].Int<16)) THEN
Mem[P+1]↑.Hh.B0←Eqtb↑[4811].Int;Mem[P]↑.Hh.B0←16;
 END  ELSE Mem[P]↑.Hh.B0←16+( PascalDIVPower2[C ,12]);
Mem[CurList.TailField]↑.Hh.Rh←P;CurList.TailField←P; END; END;--:1155
--1159:-- MathLimitSwitch: PROCEDURE = 
BEGIN 
 {IF CurList.HeadField#CurList.TailField  THEN IF Mem[CurList.
TailField]↑.Hh.B0=17  THEN BEGIN Mem[CurList.TailField]↑.Hh.B1←CurChr;
 GOTO Label10; END;BEGIN IF Interaction=3  THEN NULL;PrintNl[134];Print[983]; END;
BEGIN HelpPtr←1;HelpLine↑[0]←984; END;Error[];EXITS Label10 => NULL}; END;--:1159----1160:
 ScanDelimiter: PROCEDURE[P: Halfword,R: PascalBoolean]
 = 
BEGIN IF R  THEN ScanTwentySevenBitInt [] ELSE BEGIN--404:
DO GetXToken[]; IF(CurCmd#10)AND (CurCmd#0)--:404-- THEN EXIT; ENDLOOP;
SELECT CurCmd FROM 11,12 =>CurVal←Eqtb↑[ INT[5073]+CurChr].Int;
15 =>ScanTwentySevenBitInt[]; ENDCASE =>CurVal←-1 ; END;
IF CurVal<0  THEN--1161:--BEGIN BEGIN IF Interaction=3  THEN NULL;PrintNl[134];
Print[985]; END;BEGIN HelpPtr←6;HelpLine↑[5]←986;HelpLine↑[4]←987;
HelpLine↑[3]←988;HelpLine↑[2]←989;HelpLine↑[1]←990;HelpLine↑[0]←991;
 END;BackError[];CurVal←0; END--:1161--;
Mem[P]↑.Qqqq.B0← PascalMODPower2Mask[( PascalDIVPower2[CurVal ,20]),15];
Mem[P]↑.Qqqq.B1← PascalMODPower2Mask[( PascalDIVPower2[CurVal ,12]),255];
Mem[P]↑.Qqqq.B2← PascalMODPower2Mask[( PascalDIVPower2[CurVal ,8]),15];Mem[P]↑.Qqqq.B3← PascalMODPower2Mask[CurVal ,255];
 END;--:1160----1163:-- MathRadical: PROCEDURE
 = 
BEGIN BEGIN Mem[CurList.TailField]↑.Hh.Rh←GetNode[5];
CurList.TailField←Mem[CurList.TailField]↑.Hh.Rh; END;
Mem[CurList.TailField]↑.Hh.B0←24;Mem[CurList.TailField]↑.Hh.B1←0;
Mem[CurList.TailField+1]↑.Hh←EmptyField;
Mem[CurList.TailField+3]↑.Hh←EmptyField;
Mem[CurList.TailField+2]↑.Hh←EmptyField;
ScanDelimiter[CurList.TailField+4,TRUE];
ScanMath[CurList.TailField+1]; END;--:1163----1165:-- MathAc: PROCEDURE
 = 
BEGIN IF CurCmd=45  THEN--1166:--BEGIN BEGIN IF Interaction=3  THEN NULL;
PrintNl[134];Print[992]; END;PrintEsc[385];Print[993];
BEGIN HelpPtr←2;HelpLine↑[1]←994;HelpLine↑[0]←995; END;Error[];
 END--:1166--;BEGIN Mem[CurList.TailField]↑.Hh.Rh←GetNode[5];
CurList.TailField←Mem[CurList.TailField]↑.Hh.Rh; END;
Mem[CurList.TailField]↑.Hh.B0←28;Mem[CurList.TailField]↑.Hh.B1←0;
Mem[CurList.TailField+1]↑.Hh←EmptyField;
Mem[CurList.TailField+3]↑.Hh←EmptyField;
Mem[CurList.TailField+2]↑.Hh←EmptyField;
Mem[CurList.TailField+4]↑.Hh.Rh←1;ScanFifteenBitInt[];
Mem[CurList.TailField+4]↑.Hh.B1← PascalMODPower2Mask[CurVal ,255];
IF(CurVal>=28672)AND ((Eqtb↑[4811].Int>=0)AND (Eqtb↑[4811].Int<16)) THEN Mem
[CurList.TailField+4]↑.Hh.B0←Eqtb↑[4811].Int  ELSE Mem[CurList.
TailField+4]↑.Hh.B0← PascalMODPower2Mask[( PascalDIVPower2[CurVal ,8]),15];
ScanMath[CurList.TailField+1]; END;--:1165----1172:
 AppendChoices: PROCEDURE
 = 
BEGIN BEGIN Mem[CurList.TailField]↑.Hh.Rh←NewChoice[];
CurList.TailField←Mem[CurList.TailField]↑.Hh.Rh; END;
SavePtr←SavePtr+1;SaveStack↑[SavePtr-1].Int←0;ScanLeftBrace[];
PushMath[13]; END;--:1172----1174:----1184:
 FinMlist: PROCEDURE[P: Halfword] RETURNS[FinMlistResult: Halfword] = 
BEGIN Q:Halfword;
 IF CurList.AuxField#0  THEN--1185:
BEGIN Mem[CurList.AuxField+3]↑.Hh.Rh←3;
Mem[CurList.AuxField+3]↑.Hh.Lh←Mem[CurList.HeadField]↑.Hh.Rh;
IF P=0  THEN Q←CurList.AuxField  ELSE BEGIN Q←Mem[CurList.AuxField+2
]↑.Hh.Lh;IF Mem[Q]↑.Hh.B0#30  THEN Confusion[735];
Mem[CurList.AuxField+2]↑.Hh.Lh←Mem[Q]↑.Hh.Rh;
Mem[Q]↑.Hh.Rh←CurList.AuxField;Mem[CurList.AuxField]↑.Hh.Rh←P; END;
 END--:1185-- ELSE BEGIN Mem[CurList.TailField]↑.Hh.Rh←P;
Q←Mem[CurList.HeadField]↑.Hh.Rh; END;PopNest[];FinMlistResult←Q; END;--:1184
 BuildChoices: PROCEDURE = 
BEGIN  P:Halfword; Unsave[];
P←FinMlist[0];
{SELECT SaveStack↑[SavePtr-1].Int FROM 0 =>Mem[CurList.TailField+1]↑.Hh.Lh←P
;1 =>Mem[CurList.TailField+1]↑.Hh.Rh←P;
2 =>Mem[CurList.TailField+2]↑.Hh.Lh←P;
3 =>BEGIN Mem[CurList.TailField+2]↑.Hh.Rh←P;SavePtr←SavePtr-1;
 GOTO Label10; END; ENDCASE;
SaveStack↑[SavePtr-1].Int←SaveStack↑[SavePtr-1].Int+1;
ScanLeftBrace[];PushMath[13];EXITS Label10 => NULL}; END;--:1174----1176:-- SubSup: PROCEDURE
 = 
BEGIN T:SmallNumber;P:Halfword; T←0;P←0;
IF CurList.TailField#CurList.HeadField  THEN IF( INT[Mem[CurList.
TailField]↑.Hh.B0]>=16)AND ( INT[Mem[CurList.TailField]↑.Hh.B0]<30) THEN BEGIN P
← INT[CurList.TailField+2]+CurCmd-7;T←Mem[P]↑.Hh.Rh; END;
IF(P=0)OR (T#0) THEN--1177:
BEGIN BEGIN Mem[CurList.TailField]↑.Hh.Rh←NewNoad[];
CurList.TailField←Mem[CurList.TailField]↑.Hh.Rh; END;
P← INT[CurList.TailField+2]+CurCmd-7;
IF T#0  THEN BEGIN IF CurCmd=7  THEN BEGIN BEGIN IF Interaction=3  THEN NULL;
PrintNl[134];Print[996]; END;BEGIN HelpPtr←1;HelpLine↑[0]←997; END;
 END  ELSE BEGIN BEGIN IF Interaction=3  THEN NULL;PrintNl[134];Print[998]; END;
BEGIN HelpPtr←1;HelpLine↑[0]←999; END; END;Error[]; END; END--:1177--;
ScanMath[P]; END;--:1176----1181:-- MathFraction: PROCEDURE
 = 
BEGIN C:SmallNumber; C←CurChr;IF CurList.AuxField#0  THEN--1183:
BEGIN IF  INT[C]>=3  THEN BEGIN ScanDelimiter[64988,FALSE];
ScanDelimiter[64988,FALSE]; END;
IF  C MOD 3=0  THEN ScanDimen[FALSE,FALSE,FALSE];
BEGIN IF Interaction=3  THEN NULL;PrintNl[134];Print[1006]; END;
BEGIN HelpPtr←3;HelpLine↑[2]←1007;HelpLine↑[1]←1008;
HelpLine↑[0]←1009; END;Error[]; END--:1183
 ELSE BEGIN CurList.AuxField←GetNode[6];
Mem[CurList.AuxField]↑.Hh.B0←25;Mem[CurList.AuxField]↑.Hh.B1←0;
Mem[CurList.AuxField+2]↑.Hh.Rh←3;
Mem[CurList.AuxField+2]↑.Hh.Lh←Mem[CurList.HeadField]↑.Hh.Rh;
Mem[CurList.AuxField+3]↑.Hh←EmptyField;
Mem[CurList.AuxField+4]↑.Qqqq←NullDelimiter;
Mem[CurList.AuxField+5]↑.Qqqq←NullDelimiter;
Mem[CurList.HeadField]↑.Hh.Rh←0;
CurList.TailField←CurList.HeadField;--1182:
IF  INT[C]>=3  THEN BEGIN ScanDelimiter[CurList.AuxField+4,FALSE];
ScanDelimiter[CurList.AuxField+5,FALSE]; END;
SELECT  C MOD 3 FROM 0 =>BEGIN ScanDimen[FALSE,FALSE,FALSE];
Mem[CurList.AuxField+1]↑.Int←CurVal; END;
1 =>Mem[CurList.AuxField+1]↑.Int←1073741824;
2 =>Mem[CurList.AuxField+1]↑.Int←0; ENDCASE--:1182--; END; END;--:1181----1191:
 MathLeftRight: PROCEDURE = 
BEGIN T:SmallNumber;P:Halfword;
 T←CurChr;IF(T=31)AND (CurGroup#16) THEN--1192:
BEGIN IF CurGroup=15  THEN BEGIN ScanDelimiter[64988,FALSE];
BEGIN IF Interaction=3  THEN NULL;PrintNl[134];Print[636]; END;PrintEsc[735];
BEGIN HelpPtr←1;HelpLine↑[0]←1010; END;Error[]; END  ELSE OffSave[];
 END--:1192-- ELSE BEGIN P←NewNoad[];Mem[P]↑.Hh.B0←T;
ScanDelimiter[P+1,FALSE];IF T=30  THEN BEGIN PushMath[16];
Mem[CurList.HeadField]↑.Hh.Rh←P;CurList.TailField←P;
 END  ELSE BEGIN P←FinMlist[P];Unsave[];
BEGIN Mem[CurList.TailField]↑.Hh.Rh←NewNoad[];
CurList.TailField←Mem[CurList.TailField]↑.Hh.Rh; END;
Mem[CurList.TailField]↑.Hh.B0←23;Mem[CurList.TailField+1]↑.Hh.Rh←3;
Mem[CurList.TailField+1]↑.Hh.Lh←P; END; END; END;--:1191----1194:
 AfterMath: PROCEDURE = 
BEGIN L:PascalBoolean;Danger:PascalBoolean;M:PascalInteger;P:Halfword;
A:Halfword;--1198:--B:Halfword;W:Scaled;Z:Scaled;E:Scaled;Q:Scaled;
D:Scaled;S:Scaled;G1, G2:SmallNumber;R:Halfword;T:Halfword;--:1198
 Danger←FALSE;--1195:
IF( INT[FontParams↑[Eqtb↑[4081].Hh.Rh]]<22)OR ( INT[FontParams↑[Eqtb↑[4097].Hh.Rh]]<22)
OR ( INT[FontParams↑[Eqtb↑[4113].Hh.Rh]]<22) THEN BEGIN BEGIN IF Interaction=3
 THEN NULL;PrintNl[134];Print[1011]; END;BEGIN HelpPtr←3;HelpLine↑[2]←1012;
HelpLine↑[1]←1013;HelpLine↑[0]←1014; END;Error[];FlushMath[];Danger←TRUE;
 END  ELSE IF( INT[FontParams↑[Eqtb↑[4082].Hh.Rh]]<13)OR ( INT[FontParams↑[Eqtb↑[4098].
Hh.Rh]]<13)OR ( INT[FontParams↑[Eqtb↑[4114].Hh.Rh]]<13) THEN BEGIN BEGIN IF
Interaction=3  THEN NULL;PrintNl[134];Print[1015]; END;BEGIN HelpPtr←3;
HelpLine↑[2]←1016;HelpLine↑[1]←1017;HelpLine↑[0]←1018; END;Error[];
FlushMath[];Danger←TRUE; END--:1195--;M←CurList.ModeField;L←FALSE;
P←FinMlist[0];IF CurList.ModeField=-M  THEN BEGIN CurMlist←P;
CurStyle←2;MlistPenalties←FALSE;MlistToHlist[];
A←Hpack[Mem[64997]↑.Hh.Rh,0,1];Unsave[];SavePtr←SavePtr-1;
IF SaveStack↑[SavePtr+0].Int=1  THEN L←TRUE;IF Danger  THEN FlushMath[];
M←CurList.ModeField;P←FinMlist[0]; END  ELSE A←0;IF M<0  THEN--1196:
BEGIN BEGIN Mem[CurList.TailField]↑.Hh.Rh←NewMath[Eqtb↑[5202].Int,0];
CurList.TailField←Mem[CurList.TailField]↑.Hh.Rh; END;CurMlist←P;
CurStyle←2;MlistPenalties←( INT[CurList.ModeField]>0);MlistToHlist[];
Mem[CurList.TailField]↑.Hh.Rh←Mem[64997]↑.Hh.Rh;
WHILE Mem[CurList.TailField]↑.Hh.Rh#0 DO CurList.TailField←Mem[
CurList.TailField]↑.Hh.Rh ENDLOOP ;
BEGIN Mem[CurList.TailField]↑.Hh.Rh←NewMath[Eqtb↑[5202].Int,1];
CurList.TailField←Mem[CurList.TailField]↑.Hh.Rh; END;
CurList.AuxField←1000;Unsave[]; END--:1196-- ELSE BEGIN--1197:
BEGIN GetXToken[];IF CurCmd#3  THEN BEGIN BEGIN IF Interaction=3  THEN NULL;
PrintNl[134];Print[1019]; END;BEGIN HelpPtr←2;HelpLine↑[1]←1020;
HelpLine↑[0]←1021; END;BackError[]; END; END--:1197--;--1199:--CurMlist←P;
CurStyle←0;MlistPenalties←FALSE;MlistToHlist[];P←Mem[64997]↑.Hh.Rh;
AdjustTail←64995;B←Hpack[P,0,1];T←AdjustTail;AdjustTail←0;
W←Mem[B+1]↑.Int;Z←Eqtb↑[5215].Int;S←Eqtb↑[5216].Int;
IF (A=0)OR Danger  THEN BEGIN E←0;Q←0; END  ELSE BEGIN E←Mem[A+1]↑.Int;
Q←E+FontInfo↑[6+ParamBase↑[Eqtb↑[4081].Hh.Rh]].Int; END;
IF W+Q>Z  THEN--1201:
BEGIN IF(E#0)AND ((W-TotalShrink↑[0]+Q<=Z)OR (TotalShrink↑[1]#0)OR (
TotalShrink↑[2]#0)OR (TotalShrink↑[3]#0)) THEN BEGIN FreeNode[B,7];
B←Hpack[P,Z-Q,0]; END  ELSE BEGIN E←0;IF W>Z  THEN BEGIN FreeNode[B,7];
B←Hpack[P,Z,0]; END; END;W←Mem[B+1]↑.Int; END--:1201--;--1202:--D←Half[Z-W];
IF(E>0)AND (D<2*E) THEN BEGIN D←Half[Z-W-E];
IF P#0  THEN IF Mem[P]↑.Hh.B0=10  THEN D←0; END--:1202--;--1203:
BEGIN Mem[CurList.TailField]↑.Hh.Rh←NewPenalty[Eqtb↑[4778].Int];
CurList.TailField←Mem[CurList.TailField]↑.Hh.Rh; END;
IF (D+S<=Eqtb↑[5214].Int)OR L  THEN BEGIN G1←3;G2←4; END  ELSE BEGIN G1←5;
G2←6; END;IF L AND (E=0) THEN BEGIN Mem[A+4]↑.Int←S;AppendToVlist[A];
BEGIN Mem[CurList.TailField]↑.Hh.Rh←NewPenalty[10000];
CurList.TailField←Mem[CurList.TailField]↑.Hh.Rh; END;
 END  ELSE BEGIN Mem[CurList.TailField]↑.Hh.Rh←NewParamGlue[G1];
CurList.TailField←Mem[CurList.TailField]↑.Hh.Rh; END--:1203--;--1204:
IF E#0  THEN BEGIN R←NewKern[Z-W-E-D];IF L  THEN BEGIN Mem[A]↑.Hh.Rh←R;
Mem[R]↑.Hh.Rh←B;B←A;D←0; END  ELSE BEGIN Mem[B]↑.Hh.Rh←R;
Mem[R]↑.Hh.Rh←A; END;B←Hpack[B,0,1]; END;Mem[B+4]↑.Int←S+D;
AppendToVlist[B];
IF T#64995  THEN BEGIN Mem[CurList.TailField]↑.Hh.Rh←Mem[64995]↑.Hh.Rh;
CurList.TailField←T; END--:1204--;--1205:
IF  (A#0)AND (E=0)AND NOT L  THEN BEGIN BEGIN Mem[CurList.TailField]↑.Hh.
Rh←NewPenalty[10000];
CurList.TailField←Mem[CurList.TailField]↑.Hh.Rh; END;
Mem[A+4]↑.Int←S+Z-Mem[A+1]↑.Int;AppendToVlist[A];
BEGIN Mem[CurList.TailField]↑.Hh.Rh←NewPenalty[Eqtb↑[4779].Int];
CurList.TailField←Mem[CurList.TailField]↑.Hh.Rh; END;
 END  ELSE BEGIN BEGIN Mem[CurList.TailField]↑.Hh.Rh←NewPenalty[Eqtb↑
[4779].Int];CurList.TailField←Mem[CurList.TailField]↑.Hh.Rh; END;
BEGIN Mem[CurList.TailField]↑.Hh.Rh←NewParamGlue[G2];
CurList.TailField←Mem[CurList.TailField]↑.Hh.Rh; END; END--:1205--;
ResumeAfterDisplay--:1199--[]; END; END;--:1194----1200:

END.