-- file: TexDviImpl.mesa
-- Pascal-to-Mesa translator output, translated at September 27, 1985 10:21:37 am PDT
DIRECTORY
PascalBasic,
PascalWizardFiles,
TexTypes,
TexSysdep,
TexSysdepInline,
TexInteraction,
TexMemory,
TexSymbols,
TexScan,
TexDvi,
TexOps,
TexBuildPage,
TexExtensions;
TexDviImpl: PROGRAM IMPORTS PascalBasic, PascalWizardFiles, TexSysdep, TexSysdepInline, TexInteraction, TexMemory, TexSymbols, TexScan, TexDvi, TexOps, TexBuildPage, TexExtensions EXPORTS TexDvi = PUBLIC
BEGIN OPEN PascalBasic, PascalWizardFiles, TexTypes, TexSysdep, TexSysdepInline, TexInteraction, TexMemory, TexSymbols, TexScan, TexDvi, TexOps, TexBuildPage, TexExtensions;
--:592----595:
DviBuf: LONG POINTER TO ARRAY DviIndex OF EightBits ← PascalStaticZone.NEW[ARRAY DviIndex OF EightBits];
HalfBuf: DviIndex;
DviLimit: DviIndex;
DviPtr: DviIndex;
DviOffset: PascalInteger;
DviGone: PascalInteger;
--:595----605:--
DownPtr: Halfword;
RightPtr: Halfword;
--:605----616:
DviH: Scaled;
DviV: Scaled;
CurH: Scaled;
CurV: Scaled;
DviF: InternalFontNumber;
--:597----598:
DviSwap: PROCEDURE
=
BEGIN IF DviLimit=DviBufSize THEN BEGIN WriteDvi[0,HalfBuf-1];
DviLimit←HalfBuf;DviOffset←DviOffset+DviBufSize;DviPtr←0;
END ELSE BEGIN WriteDvi[HalfBuf,DviBufSize-1];
DviLimit←DviBufSize; END;DviGone←DviGone+HalfBuf; END;--:598----600:
DviFour: PROCEDURE[X: PascalInteger]
=
BEGIN IF X>=0 THEN BEGIN DviBuf↑[DviPtr]← PascalDIVPower2[X ,24];
DviPtr←DviPtr+1;IF DviPtr=DviLimit THEN DviSwap[];
END ELSE BEGIN X←X+1073741824;X←X+1073741824;
BEGIN DviBuf↑[DviPtr]←( PascalDIVPower2[X ,24])+128;DviPtr←DviPtr+1;
IF DviPtr=DviLimit THEN DviSwap[]; END; END;X← PascalMODPower2Mask[X ,16777215];
BEGIN DviBuf↑[DviPtr]← PascalDIVPower2[X ,16];DviPtr←DviPtr+1;
IF DviPtr=DviLimit THEN DviSwap[]; END;X← PascalMODPower2Mask[X ,65535];
BEGIN DviBuf↑[DviPtr]← PascalDIVPower2[X ,8];DviPtr←DviPtr+1;
IF DviPtr=DviLimit THEN DviSwap[]; END;
BEGIN DviBuf↑[DviPtr]← PascalMODPower2Mask[X ,255];DviPtr←DviPtr+1;
IF DviPtr=DviLimit THEN DviSwap[]; END; END;--:600----601:
DviPop: PROCEDURE[L: PascalInteger]
=
BEGIN IF(L=DviOffset+DviPtr)AND ( INT[DviPtr]>0) THEN DviPtr←DviPtr-1 ELSE
BEGIN DviBuf↑[DviPtr]←142;DviPtr←DviPtr+1;
IF DviPtr=DviLimit THEN DviSwap[]; END; END;--:601----602:
DviFontDef: PROCEDURE[F: InternalFontNumber] =
BEGIN K:PoolPointer;
BEGIN DviBuf↑[DviPtr]←243;DviPtr←DviPtr+1;
IF DviPtr=DviLimit THEN DviSwap[]; END;BEGIN DviBuf↑[DviPtr]←F-1;
DviPtr←DviPtr+1;IF DviPtr=DviLimit THEN DviSwap[]; END;
BEGIN DviBuf↑[DviPtr]←FontCheck↑[F].B0;DviPtr←DviPtr+1;
IF DviPtr=DviLimit THEN DviSwap[]; END;
BEGIN DviBuf↑[DviPtr]←FontCheck↑[F].B1;DviPtr←DviPtr+1;
IF DviPtr=DviLimit THEN DviSwap[]; END;
BEGIN DviBuf↑[DviPtr]←FontCheck↑[F].B2;DviPtr←DviPtr+1;
IF DviPtr=DviLimit THEN DviSwap[]; END;
BEGIN DviBuf↑[DviPtr]←FontCheck↑[F].B3;DviPtr←DviPtr+1;
IF DviPtr=DviLimit THEN DviSwap[]; END;DviFour[FontSize↑[F]];
DviFour[FontDsize↑[F]];
BEGIN DviBuf↑[DviPtr]←( INT[StrStart↑[FontArea↑[F]+1]]-StrStart↑[FontArea↑[F
]]);DviPtr←DviPtr+1;IF DviPtr=DviLimit THEN DviSwap[]; END;
BEGIN DviBuf↑[DviPtr]←( INT[StrStart↑[FontName↑[F]+1]]-StrStart↑[FontName↑[F
]]);DviPtr←DviPtr+1;IF DviPtr=DviLimit THEN DviSwap[]; END;--603:
FOR i:INT IN [ INT[StrStart↑[FontArea↑[F]]].. INT[ INT[StrStart↑[FontArea↑[F]+1]]-1 ]] DO K ← i;
DviBuf↑[DviPtr]←StrPool↑[K];DviPtr←DviPtr+1;
IF DviPtr=DviLimit THEN DviSwap[]; ENDLOOP;
FOR i:INT IN [ INT[StrStart↑[FontName↑[F]]].. INT[ INT[StrStart↑[FontName↑[F]+1]]-1 ]] DO K ← i;
DviBuf↑[DviPtr]←StrPool↑[K];DviPtr←DviPtr+1;
IF DviPtr=DviLimit THEN DviSwap[];--:603-- ENDLOOP; END;--:602----607:
Movement: PROCEDURE[W: Scaled,O: EightBits] =
BEGIN
Mstate:SmallNumber;P, Q:Halfword;K:PascalInteger; --610:-- Q←GetNode[3];
Mem[Q+1]↑.Int←W;Mem[Q+2]↑.Int←DviOffset+DviPtr;
IF O=157 THEN BEGIN Mem[Q]↑.Hh.Rh←DownPtr;DownPtr←Q;
END ELSE BEGIN Mem[Q]↑.Hh.Rh←RightPtr;RightPtr←Q; END;--611:
P←Mem[Q]↑.Hh.Rh;Mstate←0;
{{{WHILE P#0 DO BEGIN IF Mem[P+1]↑.Int=W THEN--612:
SELECT INT[Mstate]+Mem[P]↑.Hh.Lh FROM 3,4,15,16 =>IF Mem[P+2]↑.Int<DviGone THEN
GOTO Label45 ELSE--613:--BEGIN K←Mem[P+2]↑.Int-DviOffset;
IF K<0 THEN K←K+DviBufSize;DviBuf↑[K]←DviBuf↑[K]+5;Mem[P]↑.Hh.Lh←1;
GOTO Label40; END--:613--;
5,9,11 =>IF Mem[P+2]↑.Int<DviGone THEN GOTO Label45 ELSE--614:
BEGIN K←Mem[P+2]↑.Int-DviOffset;IF K<0 THEN K←K+DviBufSize;
DviBuf↑[K]←DviBuf↑[K]+10;Mem[P]↑.Hh.Lh←2; GOTO Label40; END--:614--;
1,2,8,13 => GOTO Label40; ENDCASE => NULL--:612
ELSE SELECT INT[Mstate]+Mem[P]↑.Hh.Lh FROM 1 =>Mstate←6;2 =>Mstate←12;8,13 => GOTO Label45;
ENDCASE => NULL;P←Mem[P]↑.Hh.Rh; END ENDLOOP ;EXITS Label45 => NULL};--:611--Mem[Q]↑.Hh.Lh←3;
IF ABS[W]>=8388608 THEN BEGIN BEGIN DviBuf↑[DviPtr]←O+3;
DviPtr←DviPtr+1;IF DviPtr=DviLimit THEN DviSwap[]; END;DviFour[W];
GOTO Label10; END;{{IF ABS[W]>=32768 THEN BEGIN BEGIN DviBuf↑[DviPtr]←O+2;
DviPtr←DviPtr+1;IF DviPtr=DviLimit THEN DviSwap[]; END;
IF W<0 THEN W←W+16777216;BEGIN DviBuf↑[DviPtr]← PascalDIVPower2[W ,16];
DviPtr←DviPtr+1;IF DviPtr=DviLimit THEN DviSwap[]; END;
W← PascalMODPower2Mask[W ,65535]; GOTO Label2; END;
IF ABS[W]>=128 THEN BEGIN BEGIN DviBuf↑[DviPtr]←O+1;
DviPtr←DviPtr+1;IF DviPtr=DviLimit THEN DviSwap[]; END;
IF W<0 THEN W←W+65536; GOTO Label2; END;BEGIN DviBuf↑[DviPtr]←O;
DviPtr←DviPtr+1;IF DviPtr=DviLimit THEN DviSwap[]; END;
IF W<0 THEN W←W+256; GOTO Label1;EXITS Label2 => NULL};BEGIN DviBuf↑[DviPtr]← PascalDIVPower2[W ,8];
DviPtr←DviPtr+1;IF DviPtr=DviLimit THEN DviSwap[]; END;
EXITS Label1 => NULL};BEGIN DviBuf↑[DviPtr]← PascalMODPower2Mask[W ,255];DviPtr←DviPtr+1;
IF DviPtr=DviLimit THEN DviSwap[]; END; GOTO Label10--:610--;EXITS Label40 => NULL};--609:
Mem[Q]↑.Hh.Lh←Mem[P]↑.Hh.Lh;
IF Mem[Q]↑.Hh.Lh=1 THEN BEGIN BEGIN DviBuf↑[DviPtr]←O+4;
DviPtr←DviPtr+1;IF DviPtr=DviLimit THEN DviSwap[]; END;
WHILE Mem[Q]↑.Hh.Rh#P DO BEGIN Q←Mem[Q]↑.Hh.Rh;
SELECT Mem[Q]↑.Hh.Lh FROM 3 =>Mem[Q]↑.Hh.Lh←5;4 =>Mem[Q]↑.Hh.Lh←6; ENDCASE => NULL; END ENDLOOP ;
END ELSE BEGIN BEGIN DviBuf↑[DviPtr]←O+9;DviPtr←DviPtr+1;
IF DviPtr=DviLimit THEN DviSwap[]; END;
WHILE Mem[Q]↑.Hh.Rh#P DO BEGIN Q←Mem[Q]↑.Hh.Rh;
SELECT Mem[Q]↑.Hh.Lh FROM 3 =>Mem[Q]↑.Hh.Lh←4;5 =>Mem[Q]↑.Hh.Lh←6; ENDCASE => NULL; END ENDLOOP ;
END--:609--;EXITS Label10 => NULL}; END;--:607----615:-- PruneMovements: PROCEDURE[L: PascalInteger]
=
BEGIN P:Halfword;
{WHILE DownPtr#0 DO BEGIN IF Mem[DownPtr+2]↑.Int<L THEN GOTO Label30;
P←DownPtr;DownPtr←Mem[P]↑.Hh.Rh;FreeNode[P,3]; END ENDLOOP ;
EXITS Label30 => NULL};{WHILE RightPtr#0 DO BEGIN IF Mem[RightPtr+2]↑.Int<L THEN GOTO Label10;
P←RightPtr;RightPtr←Mem[P]↑.Hh.Rh;FreeNode[P,3]; END ENDLOOP ;EXITS Label10 => NULL}; END;--:615
HlistOut: PROCEDURE
=
BEGIN BaseLine:Scaled;LeftEdge:Scaled;
SaveH, SaveV:Scaled;ThisBox:Halfword;GOrder:GlueOrd;GSign:PascalInteger[0..2];
P:Halfword;SaveLoc:PascalInteger;LeaderBox:Halfword;LeaderWd:Scaled;
Lx:Scaled;OuterDoingLeaders:PascalBoolean;Edge:Scaled;
ThisBox←TempPtr;GOrder←Mem[ThisBox+5]↑.Hh.B1;
GSign←Mem[ThisBox+5]↑.Hh.B0;P←Mem[ThisBox+5]↑.Hh.Rh;CurS←CurS+1;
IF CurS>0 THEN BEGIN DviBuf↑[DviPtr]←141;DviPtr←DviPtr+1;
IF DviPtr=DviLimit THEN DviSwap[]; END;
IF CurS>MaxPush THEN MaxPush←CurS;SaveLoc←DviOffset+DviPtr;
BaseLine←CurV;LeftEdge←CurH;WHILE P#0 DO--620:
DO {IF( INT[P]>=HiMemMin) THEN BEGIN IF CurH#DviH THEN BEGIN Movement[CurH
-DviH,143];DviH←CurH; END;
IF CurV#DviV THEN BEGIN Movement[CurV-DviV,157];DviV←CurV; END;
DO F←Mem[P]↑.Hh.B0;C←Mem[P]↑.Hh.B1;IF F#DviF THEN--621:
BEGIN IF NOT FontUsed↑[F] THEN BEGIN DviFontDef[F];FontUsed↑[F]←TRUE;
END;IF INT[F]<=64 THEN BEGIN DviBuf↑[DviPtr]←F+170;DviPtr←DviPtr+1;
IF DviPtr=DviLimit THEN DviSwap[];
END ELSE BEGIN BEGIN DviBuf↑[DviPtr]←235;DviPtr←DviPtr+1;
IF DviPtr=DviLimit THEN DviSwap[]; END;BEGIN DviBuf↑[DviPtr]←F-1;
DviPtr←DviPtr+1;IF DviPtr=DviLimit THEN DviSwap[]; END; END;DviF←F;
END--:621--;IF INT[C]<128 THEN BEGIN DviBuf↑[DviPtr]←C;DviPtr←DviPtr+1;
IF DviPtr=DviLimit THEN DviSwap[];
END ELSE BEGIN BEGIN DviBuf↑[DviPtr]←128;DviPtr←DviPtr+1;
IF DviPtr=DviLimit THEN DviSwap[]; END;BEGIN DviBuf↑[DviPtr]←C;
DviPtr←DviPtr+1;IF DviPtr=DviLimit THEN DviSwap[]; END; END;
CurH←CurH+FontInfo↑[WidthBase↑[F]+FontInfo↑[CharBase↑[F]+C].Qqqq.B0].
Int;P←Mem[P]↑.Hh.Rh; IF NOT ( INT[P]>=HiMemMin) THEN EXIT; ENDLOOP;DviH←CurH; END ELSE--622:
BEGIN {{{SELECT Mem[P]↑.Hh.B0 FROM 0,1 =>--623:
IF Mem[P+5]↑.Hh.Rh=0 THEN CurH←CurH+Mem[P+1]↑.Int ELSE BEGIN SaveH←
DviH;SaveV←DviV;CurV←BaseLine+Mem[P+4]↑.Int;TempPtr←P;
Edge←CurH;IF Mem[P]↑.Hh.B0=1 THEN VlistOut [] ELSE HlistOut[];
DviH←SaveH;DviV←SaveV;CurH←Edge+Mem[P+1]↑.Int;CurV←BaseLine;
END--:623--;2 =>BEGIN RuleHt←Mem[P+3]↑.Int;RuleDp←Mem[P+2]↑.Int;
RuleWd←Mem[P+1]↑.Int; GOTO Label14; END;8 =>--1366:--OutWhat[P]--:1366--;10 =>--625:
BEGIN G←Mem[P+1]↑.Hh.Lh;RuleWd←Mem[G+1]↑.Int;
IF GSign#0 THEN BEGIN IF GSign=1 THEN BEGIN IF Mem[G]↑.Hh.B0=GOrder
THEN RuleWd←RuleWd+PascalROUND[Mem[ThisBox+6]↑.Gr*PascalFLOAT[Mem[G+2]↑.Int]];
END ELSE BEGIN IF Mem[G]↑.Hh.B1=GOrder THEN RuleWd←RuleWd-PascalROUND[Mem[
ThisBox+6]↑.Gr*PascalFLOAT[Mem[G+3]↑.Int]]; END; END;IF INT[Mem[P]↑.Hh.B1]>=100 THEN--626:
BEGIN LeaderBox←Mem[P+1]↑.Hh.Rh;
IF Mem[LeaderBox]↑.Hh.B0=2 THEN BEGIN RuleHt←Mem[LeaderBox+3]↑.Int;
RuleDp←Mem[LeaderBox+2]↑.Int; GOTO Label14; END;
LeaderWd←Mem[LeaderBox+1]↑.Int;
IF(LeaderWd>0)AND (RuleWd>0) THEN BEGIN Edge←CurH+RuleWd;Lx←0;--627:
IF Mem[P]↑.Hh.B1=100 THEN BEGIN SaveH←CurH;
CurH←LeftEdge+LeaderWd*( (CurH-LeftEdge)/LeaderWd);
IF CurH<SaveH THEN CurH←CurH+LeaderWd;
END ELSE BEGIN Lq← RuleWd /LeaderWd;Lr← RuleWd MOD LeaderWd;
IF Mem[P]↑.Hh.B1=101 THEN CurH←CurH+( PascalDIVPower2[Lr ,1]) ELSE BEGIN Lx←(2*Lr+Lq
+1)/(2*Lq+2);CurH←CurH+( PascalDIVPower2[(Lr-(Lq-1)*Lx),1]); END; END--:627--;
WHILE CurH+LeaderWd<=Edge DO--628:
BEGIN CurV←BaseLine+Mem[LeaderBox+4]↑.Int;
IF CurV#DviV THEN BEGIN Movement[CurV-DviV,157];DviV←CurV; END;
SaveV←DviV;IF CurH#DviH THEN BEGIN Movement[CurH-DviH,143];
DviH←CurH; END;SaveH←DviH;TempPtr←LeaderBox;
OuterDoingLeaders←DoingLeaders;DoingLeaders←TRUE;
IF Mem[LeaderBox]↑.Hh.B0=1 THEN VlistOut [] ELSE HlistOut[];
DoingLeaders←OuterDoingLeaders;DviV←SaveV;DviH←SaveH;
CurV←SaveV;CurH←SaveH+LeaderWd+Lx; END--:628-- ENDLOOP ;CurH←Edge; GOTO Label15;
END; END--:626--; GOTO Label13; END--:625--;11,9 =>CurH←CurH+Mem[P+1]↑.Int;6 =>--652:
BEGIN Mem[64988]↑←Mem[P+1]↑;Mem[64988]↑.Hh.Rh←Mem[P]↑.Hh.Rh;P←64988;
GOTO Label21; END--:652--; ENDCASE => NULL; GOTO Label15;EXITS Label14 => NULL};--624:
IF(RuleHt=-1073741824) THEN RuleHt←Mem[ThisBox+3]↑.Int;
IF(RuleDp=-1073741824) THEN RuleDp←Mem[ThisBox+2]↑.Int;
RuleHt←RuleHt+RuleDp;
IF(RuleHt>0)AND (RuleWd>0) THEN BEGIN IF CurH#DviH THEN BEGIN
Movement[CurH-DviH,143];DviH←CurH; END;CurV←BaseLine+RuleDp;
IF CurV#DviV THEN BEGIN Movement[CurV-DviV,157];DviV←CurV; END;
BEGIN DviBuf↑[DviPtr]←132;DviPtr←DviPtr+1;
IF DviPtr=DviLimit THEN DviSwap[]; END;DviFour[RuleHt];
DviFour[RuleWd];CurV←BaseLine;DviH←DviH+RuleWd; END--:624--;
EXITS Label13 => NULL};CurH←CurH+RuleWd;EXITS Label15 => NULL};P←Mem[P]↑.Hh.Rh; END--:622----:620--; EXIT; EXITS Label21 => NULL} ENDLOOP ENDLOOP ;
PruneMovements[SaveLoc];IF CurS>0 THEN DviPop[SaveLoc];
CurS←CurS-1; END;--:619----629:-- --618:-- VlistOut: PROCEDURE =
BEGIN
LeftEdge:Scaled;TopEdge:Scaled;SaveH, SaveV:Scaled;
ThisBox:Halfword;GOrder:GlueOrd;GSign:PascalInteger[0..2];P:Halfword;
SaveLoc:PascalInteger;LeaderBox:Halfword;LeaderHt:Scaled;Lx:Scaled;
OuterDoingLeaders:PascalBoolean;Edge:Scaled; ThisBox←TempPtr;
GOrder←Mem[ThisBox+5]↑.Hh.B1;GSign←Mem[ThisBox+5]↑.Hh.B0;
P←Mem[ThisBox+5]↑.Hh.Rh;CurS←CurS+1;
IF CurS>0 THEN BEGIN DviBuf↑[DviPtr]←141;DviPtr←DviPtr+1;
IF DviPtr=DviLimit THEN DviSwap[]; END;
IF CurS>MaxPush THEN MaxPush←CurS;SaveLoc←DviOffset+DviPtr;
LeftEdge←CurH;CurV←CurV-Mem[ThisBox+3]↑.Int;TopEdge←CurV;
WHILE P#0 DO--630:--BEGIN {IF( INT[P]>=HiMemMin) THEN Confusion[685] ELSE--631:
BEGIN {{SELECT Mem[P]↑.Hh.B0 FROM 0,1 =>--632:
IF Mem[P+5]↑.Hh.Rh=0 THEN CurV←CurV+Mem[P+3]↑.Int+Mem[P+2]↑.Int ELSE
BEGIN CurV←CurV+Mem[P+3]↑.Int;
IF CurV#DviV THEN BEGIN Movement[CurV-DviV,157];DviV←CurV; END;
SaveH←DviH;SaveV←DviV;CurH←LeftEdge+Mem[P+4]↑.Int;TempPtr←P;
IF Mem[P]↑.Hh.B0=1 THEN VlistOut [] ELSE HlistOut[];DviH←SaveH;
DviV←SaveV;CurV←SaveV+Mem[P+2]↑.Int;CurH←LeftEdge; END--:632--;
2 =>BEGIN RuleHt←Mem[P+3]↑.Int;RuleDp←Mem[P+2]↑.Int;
RuleWd←Mem[P+1]↑.Int; GOTO Label14; END;8 =>--1365:--OutWhat[P]--:1365--;10 =>--634:
BEGIN G←Mem[P+1]↑.Hh.Lh;RuleHt←Mem[G+1]↑.Int;
IF GSign#0 THEN BEGIN IF GSign=1 THEN BEGIN IF Mem[G]↑.Hh.B0=GOrder
THEN RuleHt←RuleHt+PascalROUND[Mem[ThisBox+6]↑.Gr*PascalFLOAT[Mem[G+2]↑.Int]];
END ELSE BEGIN IF Mem[G]↑.Hh.B1=GOrder THEN RuleHt←RuleHt-PascalROUND[Mem[
ThisBox+6]↑.Gr*PascalFLOAT[Mem[G+3]↑.Int]]; END; END;IF INT[Mem[P]↑.Hh.B1]>=100 THEN--635:
BEGIN LeaderBox←Mem[P+1]↑.Hh.Rh;
IF Mem[LeaderBox]↑.Hh.B0=2 THEN BEGIN RuleWd←Mem[LeaderBox+1]↑.Int;
RuleDp←0; GOTO Label14; END;
LeaderHt←Mem[LeaderBox+3]↑.Int+Mem[LeaderBox+2]↑.Int;
IF(LeaderHt>0)AND (RuleHt>0) THEN BEGIN Edge←CurV+RuleHt;Lx←0;--636:
IF Mem[P]↑.Hh.B1=100 THEN BEGIN SaveV←CurV;
CurV←TopEdge+LeaderHt*( (CurV-TopEdge)/LeaderHt);
IF CurV<SaveV THEN CurV←CurV+LeaderHt;
END ELSE BEGIN Lq← RuleHt /LeaderHt;Lr← RuleHt MOD LeaderHt;
IF Mem[P]↑.Hh.B1=101 THEN CurV←CurV+( PascalDIVPower2[Lr ,1]) ELSE BEGIN Lx←(2*Lr+Lq
+1)/(2*Lq+2);CurV←CurV+( PascalDIVPower2[(Lr-(Lq-1)*Lx),1]); END; END--:636--;
WHILE CurV+LeaderHt<=Edge DO--637:
BEGIN CurH←LeftEdge+Mem[LeaderBox+4]↑.Int;
IF CurH#DviH THEN BEGIN Movement[CurH-DviH,143];DviH←CurH; END;
SaveH←DviH;CurV←CurV+Mem[LeaderBox+3]↑.Int;
IF CurV#DviV THEN BEGIN Movement[CurV-DviV,157];DviV←CurV; END;
SaveV←DviV;TempPtr←LeaderBox;OuterDoingLeaders←DoingLeaders;
DoingLeaders←TRUE;
IF Mem[LeaderBox]↑.Hh.B0=1 THEN VlistOut [] ELSE HlistOut[];
DoingLeaders←OuterDoingLeaders;DviV←SaveV;DviH←SaveH;
CurH←SaveH;CurV←SaveV-Mem[LeaderBox+3]↑.Int+LeaderHt+Lx; END--:637
ENDLOOP ;CurV←Edge; GOTO Label15; END; END--:635--; GOTO Label13; END--:634--;
11 =>CurV←CurV+Mem[P+1]↑.Int; ENDCASE => NULL; GOTO Label15;EXITS Label14 => NULL};--633:
IF(RuleWd=-1073741824) THEN RuleWd←Mem[ThisBox+1]↑.Int;
RuleHt←RuleHt+RuleDp;CurV←CurV+RuleHt;
IF(RuleHt>0)AND (RuleWd>0) THEN BEGIN IF CurH#DviH THEN BEGIN
Movement[CurH-DviH,143];DviH←CurH; END;
IF CurV#DviV THEN BEGIN Movement[CurV-DviV,157];DviV←CurV; END;
BEGIN DviBuf↑[DviPtr]←137;DviPtr←DviPtr+1;
IF DviPtr=DviLimit THEN DviSwap[]; END;DviFour[RuleHt];
DviFour[RuleWd]; END; GOTO Label15--:633--;EXITS Label13 => NULL};CurV←CurV+RuleHt; END--:631--;
EXITS Label15 => NULL};P←Mem[P]↑.Hh.Rh; END--:630-- ENDLOOP ;PruneMovements[SaveLoc];
IF CurS>0 THEN DviPop[SaveLoc];CurS←CurS-1; END;--:629----638:----1377:
ShipOut: PROCEDURE[P: Halfword] =
BEGIN PageLoc:PascalInteger;J, K:PascalInteger[0..9];
S:PoolPointer;OldSetting:PascalInteger[0..21];
IF Eqtb↑[4801].Int>0 THEN BEGIN PrintNl[210];PrintLn[];Print[686];
END;
IF INT[TermOffset]>MaxPrintLine-9 THEN PrintLn [] ELSE IF( INT[TermOffset]>0)OR (
INT[FileOffset]>0) THEN PrintChar[32];PrintChar[91];J←9;
WHILE(Eqtb↑[4817+J].Int=0)AND ( INT[J]>0)DO J←J-1 ENDLOOP ;
FOR i:INT IN [ INT[0 ].. INT[J ]] DO K ← i; PrintInt[Eqtb↑[4817+K].Int];
IF INT[K]<J THEN PrintChar[46]; ENDLOOP;PascalTextBREAK[file: @TermOut];
IF Eqtb↑[4801].Int>0 THEN BEGIN PrintChar[93];BeginDiagnostic[];
ShowBox[P];EndDiagnostic[TRUE]; END;--640:----641:
{IF(Mem[P+3]↑.Int>1073741823)OR (Mem[P+2]↑.Int>1073741823)OR (
Mem[P+3]↑.Int+Mem[P+2]↑.Int+Eqtb↑[5220].Int>1073741823)OR (
Mem[P+1]↑.Int+Eqtb↑[5219].Int>1073741823) THEN BEGIN BEGIN IF Interaction=3 THEN NULL;PrintNl[134];
Print[690]; END;BEGIN HelpPtr←2;HelpLine↑[1]←691;HelpLine↑[0]←692;
END;Error[];IF Eqtb↑[4801].Int<=0 THEN BEGIN BeginDiagnostic[];
PrintNl[693];ShowBox[P];EndDiagnostic[TRUE]; END; GOTO Label30; END;
IF Mem[P+3]↑.Int+Mem[P+2]↑.Int+Eqtb↑[5220].Int>MaxV THEN MaxV←Mem[P+3]↑.
Int+Mem[P+2]↑.Int+Eqtb↑[5220].Int;
IF Mem[P+1]↑.Int+Eqtb↑[5219].Int>MaxH THEN MaxH←Mem[P+1]↑.Int+Eqtb↑[5219]
.Int--:641--;--617:--DviH←0;DviV←0;CurH←Eqtb↑[5219].Int;DviF←0;
CurS←-1;PrepareMag[];
IF UsePressFormat THEN BEGIN IF OutputFileName=0 THEN BEGIN IF
JobName=0 THEN OpenLogFile[];PackJobName[650];
WHILE NOT PressOpenOut []DO PromptFileName[651,650] ENDLOOP ;
OutputFileName←PressMakeNameString[]; END;IF TotalPages=0 THEN NULL;
END ELSE BEGIN IF OutputFileName=0 THEN BEGIN IF JobName=0 THEN
OpenLogFile[];PackJobName[652];
WHILE NOT BOpenOut[@DviFile]DO PromptFileName[651,652] ENDLOOP ;
OutputFileName←BMakeNameString[@DviFile]; END;
IF TotalPages=0 THEN BEGIN BEGIN DviBuf↑[DviPtr]←247;
DviPtr←DviPtr+1;IF DviPtr=DviLimit THEN DviSwap[]; END;
BEGIN DviBuf↑[DviPtr]←2;DviPtr←DviPtr+1;
IF DviPtr=DviLimit THEN DviSwap[]; END;DviFour[25400000];
DviFour[473628672];PrepareMag[];DviFour[Eqtb↑[4784].Int];
OldSetting←Selector;Selector←21;Print[684];PrintInt[Eqtb↑[4790].Int];
PrintChar[46];PrintTwo[Eqtb↑[4789].Int];PrintChar[46];
PrintTwo[Eqtb↑[4788].Int];PrintChar[58];
PrintTwo[ Eqtb↑[4787].Int /60];PrintTwo[ Eqtb↑[4787].Int MOD 60];
Selector←OldSetting;
BEGIN DviBuf↑[DviPtr]←( INT[PoolPtr]-StrStart↑[StrPtr]);
DviPtr←DviPtr+1;IF DviPtr=DviLimit THEN DviSwap[]; END;
FOR i:INT IN [ INT[StrStart↑[StrPtr]].. INT[ INT[PoolPtr]-1 ]] DO S ← i; DviBuf↑[DviPtr]←
StrPool↑[S];DviPtr←DviPtr+1;IF DviPtr=DviLimit THEN DviSwap[]; ENDLOOP;
PoolPtr←StrStart↑[StrPtr]; END; END--:617--;
IF UsePressFormat THEN BEGIN CurV←Mem[P+3]↑.Int+Eqtb↑[5220].Int;
TempPtr←P;IF Mem[P]↑.Hh.B0=1 THEN VlistPressOut [] ELSE HlistPressOut[];
PressWritePage[];TotalPages←TotalPages+1;
END ELSE BEGIN PageLoc←DviOffset+DviPtr;BEGIN DviBuf↑[DviPtr]←139;
DviPtr←DviPtr+1;IF DviPtr=DviLimit THEN DviSwap[]; END;
FOR i:INT IN [ INT[0 ].. INT[9 ]] DO K ← i; DviFour[Eqtb↑[4817+K].Int] ENDLOOP;DviFour[LastBop];
LastBop←PageLoc;CurV←Mem[P+3]↑.Int+Eqtb↑[5220].Int;TempPtr←P;
IF Mem[P]↑.Hh.B0=1 THEN VlistOut [] ELSE HlistOut[];
BEGIN DviBuf↑[DviPtr]←140;DviPtr←DviPtr+1;
IF DviPtr=DviLimit THEN DviSwap[]; END;TotalPages←TotalPages+1; END;
EXITS Label30 => NULL};--:640--IF Eqtb↑[4801].Int<=0 THEN PrintChar[93];DeadCycles←0;
PascalTextBREAK[file: @TermOut];--639:--IF Eqtb↑[4798].Int>1 THEN BEGIN PrintNl[687];
PrintInt[VarUsed];PrintChar[38];PrintInt[DynUsed];PrintChar[59];
END;FlushNodeList[P];IF Eqtb↑[4798].Int>1 THEN BEGIN Print[688];
PrintInt[VarUsed];PrintChar[38];PrintInt[DynUsed];Print[689];
PrintInt[ INT[HiMemMin]-LoMemMax-1];PrintLn[]; END;--:639-- END;--:638----645:
END.