|
|
DataMuseum.dkPresents historical artifacts from the history of: DANOSI |
This is an automatic "excavation" of a thematic subset of
See our Wiki for more about DANOSI Excavated with: AutoArchaeologist - Free & Open Source Software. |
top - download
Length: 51808 (0xca60)
Types: TextFile
Names: »P435.PAS«
└─⟦02956c927⟧ Bits:30010510 DVBS1.SW2114.src.2.14-1 SW2114 REAL #1/4 TIME PASCAL SOURCE REL 2.14
└─⟦this⟧ »RTP\P435.PAS«
└─⟦4f587ad96⟧ Bits:30010518 DVBS1.SW2114.src.2.7-1 SW2114 1/4 Real Time Pascal 2.7 92.06.16
└─⟦this⟧ »RTP\P435.PAS«
└─⟦a2a9e188c⟧ Bits:30010526 DVBS1.SW2114.src.2.6-4 RTP Compiler Source SW2104+SW2114 Disk 1 92.02.03 HEJ HHA
└─⟦this⟧ »RTP\P435.PAS«
└─⟦b607d6035⟧ Bits:30010532 RTP compiler Source 1 2.14 26/9(?)-92 DVBS1.SW2114.src.2.14-8
└─⟦this⟧ »P435.PAS«
└─⟦fd2665794⟧ Bits:30010523 DVBS1.SW2114.src.2.6-1 RTP compiler source SW2104+SW2114 Disk#1 30/1-92 HHA
└─⟦this⟧ »RTP\P435.PAS«
PROCEDURE GetTBinFile;\r
BEGIN\r
if filebufferindex = filebufferlast then\r
BEGIN\r
filebufferindex := 0;\r
if eof(Tbinfile) then\r
begin\r
filebufferlast := 0;\r
eoftbinfile := true;\r
end\r
else\r
begin\r
blockread(TBinFile,Filebufferptr^,lengthoffilebuffer,filebufferlast);\r
if filebufferlast = 0 THEN\r
eoftbinfile := true\r
else\r
eoftbinfile := false;\r
end\r
END;\r
\r
if not eoftbinfile then\r
begin\r
filebufferindex := filebufferindex + 1;\r
tbinfileptr := filebufferptr^[filebufferindex];\r
end;\r
END;\r
\r
Procedure PutInteger( Value : Integer);\r
VAR\r
I_code : RECORD\r
CASE BOOLEAN OF\r
TRUE: (W : WORD);\r
FALSE:(B1,B2: BYTE);\r
END;\r
BEGIN\r
I_code.W := Value;\r
Put_Byte(I_code.b2);\r
Put_Byte(I_code.B1);\r
END;\r
\r
Procedure PutAddr(Ptr : ST_ElemPtr);\r
BEGIN\r
PutInteger((Ptr^.MegaLabel_Offset DIV CodeSize) + 1);\r
PutInteger(Ptr^.MegaLabel_Offset MOD CodeSize );\r
END;\r
\r
\r
Procedure PutParamKind(code : Codes;TypeRef : St_Address);\r
VAR Size : Integer;\r
Typ : Integer;\r
BEGIN\r
ExtParamKind(Code,TypeRef,Typ,Size);\r
PutInteger(typ);\r
PutInteger(Size);\r
END;\r
\r
Procedure ExtPutParameters(Lab : St_Address);\r
VAR Ptr : St_ElemPtr;\r
help : Integer;\r
typeAddr,Addr : St_Address;\r
BEGIN\r
help := ExtNoOfParams(Lab);\r
PutInteger(Help);\r
St_Retrieve(Lab,Ptr);\r
Addr := Ptr^.ListRef;\r
IF Ptr^.St_Kind = CFunction THEN\r
BEGIN\r
PutParamKind(CFunction,Ptr^.TypeRef);\r
END;\r
WHILE Not Equal_Addr(Addr,St_StopAddr) DO\r
BEGIN\r
st_Retrieve(Addr,ptr);\r
Addr := Ptr^.ListRef;\r
TypeAddr := Ptr^.TypeRef;\r
PutParamKind(Ptr^.St_Kind,TypeAddr);\r
st_retrieve(TypeAddr,ptr);\r
IF Ptr^.Type_Mode = Open_fam THEN\r
PutParamKind(cInspectParam,Ptr^.st_Family_ref);\r
END;\r
END;\r
\r
(* The following procedure writes on file CodeList *)\r
\r
PROCEDURE WriteHexByte( x : integer );\r
(* The procedure writes a hex byte to codefile *)\r
\r
BEGIN\r
write(CodeList,HexNumber[x DIV Max4Bit MOD Max4Bit]);\r
write(CodeList,HexNumber[x MOD Max4Bit]);\r
\r
CurrentPos := CurrentPos + 2;\r
END; (* WriteHexByte *)\r
\r
\r
(*---------------------------------------------------------*)\r
\r
PROCEDURE WriteHexWord(x : Word);\r
(* The procedure writes a Hex word to CodeList *)\r
\r
VAR\r
\r
WordByte : RECORD\r
CASE Int : integer OF\r
1 : (i : Integer);\r
2 : (Byte1 : 0..255;\r
Byte2 : 0..255);\r
3 : (w : Word);\r
END;\r
(* Used to convert a integer/Word to two bytes or two bytes\r
to a integer/Word *)\r
\r
\r
\r
BEGIN\r
WordByte.w := x;\r
WriteHexByte(WordByte.Byte2);\r
WriteHexByte(WordByte.Byte1);\r
\r
END; (* WriteHexWord *)\r
\r
\r
(* ----------------------------------------------------------- *)\r
\r
\r
\r
\r
PROCEDURE WriteSpace( x : integer);\r
(* The procedure writes x spaces to CodeList *)\r
\r
VAR\r
i : integer;\r
\r
BEGIN\r
FOR i := 1 TO x DO\r
write(CodeList,' ');\r
CurrentPos := CurrentPos + x;\r
END; (* WriteSpace *)\r
\r
PROCEDURE InternalLinkTable(Place : St_Address; AddOff : Integer);\r
VAR Page, Offz : Word;\r
Ptr : St_ElemPtr;\r
BEGIN\r
InternalLinkEntries := InternalLinkEntries + 1;\r
Page := Offset DIV CodeSize;\r
Offz := Offset - Page*CodeSize;\r
St_New_Fixupp(Page+1, Offz, InternalStartList, InternalEndList);\r
St_Get(InternalEndList, Ptr);\r
Ptr^.Ext_Owner := Place;\r
Ptr^.Ext_spix := AddOff;\r
END;\r
\r
PROCEDURE ExternalLinkTable(routno : integer);\r
VAR Page, Offz : Word;\r
Ptr : St_ElemPtr;\r
BEGIN\r
Page := Offset DIV CodeSize;\r
Offz := Offset - Page*CodeSize;\r
St_New_Fixupp(Page+1, Offz, ExternalStartList, ExternalEndList);\r
St_Get(ExternalEndList, Ptr);\r
Ptr^.Ext_Spix := routno;\r
END;\r
\r
Procedure PutName(Spix : Spixrange; CodeOn : Boolean);\r
VAR Str : Ptr_string;\r
i : Integer;\r
Ch : Byte;\r
BEGIN\r
St_NameOfSpix(Spix,Str);\r
IF CodeOn THEN\r
BEGIN\r
WriteHexWord(Offset);\r
WriteSpace(CodePos - CurrentPos);\r
END;\r
For i := 1 To 12 DO\r
BEGIN\r
IF i > Length(Str^) THEN Ch := 32 ELSE Ch := ord(Str^[i]);\r
IF (Ch >= ord('A')) AND (Ch <= ord('Z'))\r
THEN Ch := Ch - ord('A') + ord('a');\r
Put_byte(Ch);\r
IF CodeOn THEN WriteHexByte(Ch);\r
END;\r
IF CodeOn THEN\r
BEGIN\r
WriteSpace(CommentPos - CurrentPos);\r
Writeln(CodeList, ' ', Str^);\r
CurrentPos := 0;\r
END;\r
END;\r
\r
\r
PROCEDURE WriteLabel( Lab : St_elemptr);\r
(* The procedure writes the label pointed to by lab to CodeList *)\r
\r
VAR\r
i : integer;\r
Str : Ptr_string;\r
BEGIN\r
IF Lab^.St_Spix <> AnonymousSpix THEN\r
BEGIN\r
St_NameOfSpix(Lab^.St_Spix,Str);\r
(*FOR i := 1 TO Str^.Length DO\r
write(CodeList,Str^.Name[i]); *)\r
(* TURBO *)\r
write(CodeList,str^);\r
write(CodeList,':');\r
END\r
ELSE\r
BEGIN\r
write(CodeList,'?',Lab^.MegaLabel_Offset,':');\r
END;\r
\r
END; (* WriteLabel *)\r
\r
PROCEDURE PutAbsAddr(Labbe : St_Address; Str : String);\r
VAR Ptr : St_ElemPtr;\r
BEGIN\r
Offset := Offset - 1;\r
InternalLinkTable(Labbe,0);\r
Offset := Offset + 1;\r
PutInteger(0);\r
Put_byte(0);\r
IF CodeOnPass2 THEN\r
BEGIN\r
WriteHexWord(Offset);\r
WriteSpace(CodePos - CurrentPos);\r
WriteHexByte(0);\r
WriteHexWord(0);\r
WriteSpace(CommentPos - CurrentPos);\r
(* write Label *)\r
St_Retrieve(Labbe, Ptr);\r
WHILE NOT Equal_Addr(Ptr^.DefAsLabel,St_NillAddr)\r
DO St_Retrieve(Ptr^.DefAsLabel,Ptr);\r
Write(CodeList,' ');\r
WriteLabel(Ptr);\r
writeln(CodeList, Str);\r
CurrentPos := 0;\r
END;\r
\r
Offset := Offset + 3;\r
END;\r
\r
PROCEDURE WriteInteger( I: Integer; Comm : String);\r
BEGIN\r
PutInteger(i);\r
IF CodeOnPass2 THEN\r
BEGIN\r
WriteHexWord(Offset);\r
WriteSpace(CodePos - CurrentPos);\r
WriteHexWord(I);\r
WriteSpace(CommentPos - CurrentPos);\r
Writeln(CodeList, Comm);\r
CurrentPos := 0;\r
END;\r
Offset := Offset + 2;\r
END;\r
\r
PROCEDURE WritePointer(Size : Integer;Comm : String);\r
VAR i : Integer;\r
BEGIN\r
FOR i := 1 TO Size DO Put_byte(0);\r
IF CodeOnPass2 THEN\r
BEGIN\r
WriteHexWord(Offset);\r
WriteSpace(CodePos - CurrentPos);\r
FOR i := 1 TO Size DO WriteHexByte(0);\r
WriteSpace(CommentPos - CurrentPos);\r
Writeln(CodeList, Comm);\r
CurrentPos := 0;\r
END;\r
Offset := Offset + Size;\r
END;\r
\r
PROCEDURE ReadRestSymLine;\r
VAR Ch : char;\r
BEGIN\r
WHILE NOT eoln(TSymFile) DO\r
BEGIN\r
read(TSymFile,ch);\r
write(CodeList,ch);\r
END;\r
readln(TSymFile);\r
writeln(CodeList);\r
CurrentPos := 0;\r
END;\r
\r
Procedure RCPutJumpInst(Inst: Instruction; JumpPlace: Longint;\r
InstLength: Integer);\r
VAR i : Integer;\r
BEGIN\r
IF CodeOnPass2 THEN\r
BEGIN\r
WriteHexWord(Offset);\r
WriteSpace(2);\r
WriteSpace(CodePos - CurrentPos);\r
END;\r
\r
i := InstructionValue[Inst] AND 255;\r
Put_byte(i);\r
IF CodeOnPass2 THEN WriteHexByte(i);\r
\r
If InstLength <> 4 THEN\r
BEGIN\r
i := (JumpPlace - (Offset+InstLength)) AND $ffff;\r
Putinteger(i);\r
IF CodeOnPass2 THEN WriteHexWord(i);\r
END ELSE\r
BEGIN\r
i := JumpPlace DIV CodeSize;\r
Put_byte(0(*i*));\r
IF CodeOnPass2 THEN WriteHexByte(i);\r
i := JumpPlace - (JumpPlace DIV CodeSize)*CodeSize;\r
PutInteger(0(*i*));\r
IF CodeOnPass2 THEN WriteHexWord(i);\r
END;\r
IF CodeOnPass2 THEN\r
BEGIN\r
WriteSpace(commentPos - CurrentPos);\r
write(Codelist, ' ', InstructionName[Inst],' ');\r
END;\r
END;\r
\r
PROCEDURE RCPutJump(VAR Jump: Tempbin1_record;Offz:Integer);\r
VAR Inst : Instruction;\r
InstLength, i : Integer;\r
Ptr : St_Elemptr;\r
BEGIN\r
\r
St_Retrieve(Jump.Bin1Label,Ptr);\r
WHILE NOT Equal_Addr(Ptr^.DefAsLabel,St_NillAddr)\r
DO St_Retrieve(Ptr^.DefAsLabel,Ptr);\r
\r
i := Jump.Bin1Param DIV 3;\r
InstLength := 3;\r
CASE Jump.Bin1Code OF\r
UnCondJump :\r
IF (Ptr^.MegaLabel_Offset DIV CodeSize)\r
<>(Offset DIV CodeSize) THEN\r
BEGIN\r
Inst := rJMPHC;\r
InstLength := 4;\r
InternalLinkTable(Jump.Bin1Label,offz);\r
END ELSE Inst := rJMPRW;\r
CondJump: Inst := Instruction(i);\r
InternalCall:\r
BEGIN\r
Inst := Instruction(i);\r
InstLength := 4;\r
InternalLinkTable(Jump.Bin1Label,offz);\r
END;\r
ELSE\r
IF (Ptr^.MegaLabel_Offset DIV CodeSize)\r
<>(Offset DIV CodeSize) THEN\r
BEGIN\r
Inst := rREAAD;\r
InstLength := 4;\r
InternalLinkTable(Jump.Bin1Label,offz);\r
END ELSE\r
BEGIN\r
Inst := rREARD;\r
InstLength := 0;\r
END;\r
END;\r
\r
RCPutJumpInst(Inst, Ptr^.MegaLabel_Offset + offz, InstLength);\r
IF InstLength = 0 THEN InstLength := 3;\r
\r
IF CodeOnPass2 THEN\r
BEGIN\r
WriteLabel(Ptr);\r
IF Offz <> 0 THEN write(Codelist,' + ',Offz);\r
Writeln(Codelist);\r
Offset := Offset +InstLength;\r
CurrentPos := 0;\r
END ELSE\r
BEGIN\r
Offset := Offset + InstLength;\r
END;\r
END;\r
\r
PROCEDURE RCPageJump(Offz, Instoffz:Integer);\r
VAR Inst : Instruction;\r
InstLength, i : Integer;\r
BEGIN\r
IF Instoffz = 0 THEN\r
BEGIN (* Uncondjump *)\r
Inst := rJMPHC;\r
InstLength := 4;\r
InternalLinkTable(St_Nilladdr,0);\r
END ELSE\r
BEGIN\r
Inst := Instruction(Instoffz);\r
InstLength := 3;\r
END;\r
\r
RCPutJumpInst(Inst, Offz, InstLength);\r
\r
IF CodeOnPass2 THEN\r
BEGIN\r
write(CodeList,'?',Offz,':');\r
Writeln(Codelist);\r
Offset := Offset +InstLength;\r
CurrentPos := 0;\r
END ELSE\r
BEGIN\r
Offset := Offset + InstLength;\r
END;\r
END;\r
\r
PROCEDURE RCPutCode(CodeLength: Integer);\r
VAR i, j, InstLength : Integer;\r
ch : Char;\r
BEGIN\r
i := 0;\r
WHILE i < CodeLength DO\r
BEGIN\r
IF CodeOnPass2 THEN\r
BEGIN\r
WriteHexWord(Offset);\r
WriteSpace(2);\r
WriteSpace(CodePos - CurrentPos);\r
Read(Tsymfile, InstLength);\r
FOR j := 1 TO InstLength DO\r
BEGIN\r
GetTBinfile;\r
WriteHexByte(Tbinfileptr);\r
Put_byte(Tbinfileptr);\r
END;\r
WriteSpace(CommentPos - CurrentPos);\r
ReadRestSymLine;\r
i := i + InstLength;\r
Offset := Offset + InstLength;\r
END ELSE\r
BEGIN\r
GetTBinfile;\r
Put_byte(Tbinfileptr);\r
i := i + 1;\r
Offset := Offset + 1;\r
END;\r
END;\r
END;\r
\r
PROCEDURE MakePass4_2;\r
(* The procedure is called when there is no more code for\r
the block. The procedure makes the <Object Block> for the block\r
That is the secound pass is made . FileOffset gives the length\r
of the code in the block *)\r
TYPE\r
PtrJumpElement = ^CondjumpElement;\r
CondJumpElement = RECORD\r
NextJumpElement : PtrJumpElement;\r
JumpLabel : St_Address;\r
END;\r
VAR\r
CondJumpHead : PtrJumpElement;\r
Ptr, Ptr1 : St_ElemPtr;\r
i, j , CharValue : integer;\r
Leng, StepW : Word;\r
NoLabels : integer;\r
ch : char;\r
Lab, Lab1, Lab2 : St_Address;\r
Inst : Instruction;\r
Low, High : integer;\r
Off, OtherwiseOffset : Longint;\r
(* Gives the offset of the next byte written to\r
CodeFile *)\r
Str : Ptr_string;\r
LastLBDR : longint;\r
firstlbdr : boolean;\r
CurrentFile1 : Boolean;\r
\r
JumpRec1,Helprec : Tempbin1_record;\r
StartOffset : LongInt;\r
ParamSize : integer;\r
CreateSize : word;\r
dateandtime : DateTime;\r
CONST\r
NameEntryLength = 10;\r
LineTabLength = 16;\r
VAR\r
NameEntry :\r
record\r
case b : boolean of\r
true : ( firstOffset : Longint;\r
CodeLength : Longint;\r
blocktype : byte;\r
length : byte);\r
false : ( a : array[1..NameEntryLength] of byte);\r
end;\r
\r
LineTab :\r
Record\r
case b : boolean of\r
true : ( FirstLine : Longint;\r
FirstOffset : Longint;\r
OffsetSpacing : Longint;\r
LastOffset : Longint );\r
False : ( a : array[1..LineTabLength] of byte)\r
End;\r
\r
\r
LengthOfLineTabel : word ;\r
LineTabelAddr, TempLineTabelAddr : St_Address;\r
LineTabelIndex : Word;\r
LineTabelOffset : Longint;\r
MakingLineTab : Boolean;\r
LastLine, LineRest, LineDiff : Word;\r
\r
NoSegFixUp : Word;\r
FirstSegFixUp, LastSegFixup : St_Address;\r
SegNumber : Byte;\r
CurSpix : SpixRange;\r
UseLabel : Boolean;\r
RoutineOffset : Word;\r
\r
CodeDumpLength : integer;\r
skip : boolean;\r
Entrypoint : Boolean;\r
ActivePI3Routines : Integer;\r
ConvertExtNumber:Array[1..NoOfPi3RoutinesAndSetRoutines] OF Integer;\r
help : longint;\r
allignedLengthOfNameTable : word;\r
\r
PROCEDURE NewCondJump(Lab : St_Address);\r
VAR NewEl : PtrJumpElement;\r
BEGIN\r
New(NewEl);\r
NewEl^.NextJumpElement := CondJumpHead;\r
NewEl^.JumpLabel := Lab;\r
CondJumpHead := NewEl;\r
NoOfOutPageJumps := NoOfOutPageJumps + 1;\r
END;\r
\r
PROCEDURE DisposeCondJump(VAR Lab : St_Address);\r
VAR NewEl : PtrJumpElement;\r
BEGIN\r
NewEl := CondJumpHead;\r
Lab := CondJumpHead^.JumpLabel;\r
CondJumpHead := NewEl^.NextJumpElement;\r
NoOfOutPageJumps := NoOfOutPageJumps - 1;\r
Dispose(NewEl);\r
END;\r
\r
PROCEDURE InsertLineDiff(Force : Boolean);\r
(* This procedure is only used when making linetabel. The procedure\r
inserts the next linediff. in the linetabel *)\r
\r
BEGIN\r
WHILE ((Offset - LineTabelOffset) >= Spacing) OR (Force) DO\r
BEGIN\r
LineDiff := ( LineNumber - LastLine) + LineRest;\r
\r
IF LineDiff > 255 THEN\r
BEGIN\r
LineRest := LineDiff - 255;\r
LineDiff := 255;\r
END\r
ELSE\r
LineRest := 0;\r
LastLine := LineNumber;\r
\r
LineTabelOffset := LineTabelOffset + Spacing;\r
\r
St_Get(TempLineTabelAddr,Ptr);\r
\r
Ptr^.Data_area[LineTabelIndex] := LineDiff;\r
LineTabelIndex := LineTabelIndex + 1;\r
IF LineTabelIndex > Ptr^.St_Size THEN\r
BEGIN\r
TempLineTabelAddr := Ptr^.ListRef;\r
LineTabelIndex := 1;\r
END;\r
Force := False;\r
END;\r
END;\r
\r
PROCEDURE ResetBin1Files;\r
BEGIN\r
St_unlock(JumpRec);\r
ST_get(FirstTempPage, JumpRec);\r
tempIndex := 0;\r
ST_lock(JumpRec);\r
END;\r
\r
PROCEDURE ReadJumpRec(VAR r: Tempbin1_record);\r
BEGIN\r
NextTempPage;\r
r := JumpRec^.Jump_data[TempIndex];\r
END;\r
\r
PROCEDURE WriteJumpRec(VAR r: Tempbin1_record);\r
BEGIN\r
r.Bin1Param := r.Bin1Param + NewPageCounter;\r
NewPageCounter := 0;\r
JumpRec^.Jump_data[TempIndex] := R;\r
END;\r
\r
PROCEDURE AddOffset( Size : Integer);\r
VAR Allign : TempBin1_Record;\r
BEGIN\r
IF (Offset DIV CodeSize) <> (Offset - 1 + Size + LineTabSize\r
+ (NoOfOutPageJumps+JumpToNextPage)*4) DIV CodeSize THEN\r
BEGIN\r
NewPageCounter := NewPageCounter + 2;\r
Offset := ((Offset DIV CodeSize)+1)*CodeSize;\r
NoOfOutPageJumps := 0;\r
END;\r
Offset := Offset + Size;\r
END;\r
\r
PROCEDURE InsertJumpSizes;\r
VAR Stable : Boolean;\r
JumpBack : Boolean;\r
CaseLabel : Boolean;\r
InstLength : Integer;\r
noturns : integer;\r
diff,Diff1 : integer;\r
JumpRelValue : Longint;\r
BEGIN\r
\r
noturns := 2;\r
NewPageCounter := 0;\r
Diff := 0;\r
offset := internaloffset;\r
REPEAT\r
(* writeln('stabel fors off: ',offset,' noturns ',noturns,\r
' lastpagelinetab ',Lastlinetabsize + (noofoutpagejumps * 4));*)\r
Stable := True;\r
Offset := 0;\r
diff := 0;\r
JumpToNextPage := 1;\r
NoOfOutPageJumps := 0;\r
ResetBin1Files;\r
WHILE NOT eofTempPage DO\r
BEGIN\r
ReadJumpRec(JumpRec1);\r
JumpRec1.Bin1Param := (JumpRec1.Bin1Param DIV 3) * 3;\r
\r
CASE JumpRec1.Bin1Code OF\r
\r
Lineno: ;\r
\r
ExternalCall :\r
BEGIN\r
AddOffset(JumpRec1.Bin2Code);\r
END;\r
\r
DeclareLabel,DeclareLabelConst : (* Label *)\r
BEGIN\r
Diff := 0;\r
CaseLabel := JumpRec1.Bin1Param <> 0;\r
IF (Jumprec1.Bin1code = DeclareLabelConst)\r
OR CaseLabel THEN\r
BEGIN\r
IF Not CaseLabel THEN JumpToNextPage := 0;\r
IF Odd(Offset) THEN\r
BEGIN\r
addoffset(1);\r
IF (offset - 1) MOD CodeSize = 0 THEN\r
offset := Offset - 1;\r
Diff := 1;\r
END;\r
END;\r
IF EntryPoint THEN\r
BEGIN\r
EntryPoint := False;\r
AddOffset(18 + JumpRec1.Bin2Code);\r
END ELSE\r
AddOffset(JumpRec1.Bin2Code);\r
St_Get(JumpRec1.Bin1Label, Ptr);\r
IF ((Ptr^.Label_Scope AND 1) = 0) AND (Diff = 1)\r
THEN Stable := False;\r
Diff1 := 0;\r
IF CaseLabel THEN\r
BEGIN\r
Diff1 := JumpRec1.Bin1Param + 4;\r
AddOffset(Diff1);\r
END;\r
Ptr^.MegaLabel_offset := Offset - JumpRec1.Bin2Code - Diff1;\r
IF (Ptr^.Label_scope shr 1) <>\r
(Ptr^.MegaLabel_offset Div CodeSize)\r
THEN Stable := False;\r
Ptr^.Label_Scope := Diff +\r
((Ptr^.MegaLabel_Offset DIV CodeSize) shl 1);\r
END;\r
\r
AddLabelToDis :\r
BEGIN\r
St_Retrieve(JumpRec1.Bin1Label,Ptr);\r
WHILE NOT Equal_Addr(Ptr^.DefAsLabel,St_NillAddr) DO\r
St_Retrieve(Ptr^.DefAsLabel,Ptr);\r
\r
AddOffset(4);\r
Offset := Offset - 4;\r
IF (Ptr^.MegaLabel_Offset DIV CodeSize)\r
<> (Offset DIV CodeSize) THEN\r
BEGIN\r
InstLength := 4;\r
END ELSE\r
BEGIN\r
InstLength := 3;\r
END;\r
\r
(* IF (InstLength > JumpRec1.Bin1Param) OR\r
(( noturns > 0) AND (InstLength <> JumpRec1.Bin1Param))*)\r
IF InstLength <> (jumpRec1.Bin1Param DIV 3) THEN\r
BEGIN\r
(* writeln('addlabtodis instlength ' , instlength,\r
' old ',JumpRec1.bin1param,' off ',offset,\r
' label ', Ptr^.MegaLabel_Offset);*)\r
\r
Stable := False;\r
JumpRec1.Bin1Param := InstLength * 3;\r
END;\r
Offset := Offset + InstLength;\r
END;\r
\r
\r
CondJump :\r
BEGIN\r
St_Retrieve(JumpRec1.Bin1Label,Ptr);\r
WHILE NOT Equal_Addr(Ptr^.DefAsLabel,St_NillAddr) DO\r
St_Retrieve(Ptr^.DefAsLabel,Ptr);\r
IF (Ptr^.MegaLabel_Offset DIV CodeSize)\r
<>(Offset DIV CodeSize) THEN\r
BEGIN\r
AddOffset(7);\r
Offset := Offset - 7;\r
END\r
ELSE\r
BEGIN\r
AddOffset(3);\r
Offset := Offset - 3;\r
END;\r
IF (Ptr^.MegaLabel_Offset DIV CodeSize)\r
<>(Offset DIV CodeSize) THEN\r
BEGIN\r
NoOfOutPageJumps := NoOfOutPageJumps + 1;\r
END;\r
Offset := Offset + 3;\r
END;\r
\r
UnCondJump:\r
BEGIN\r
St_Retrieve(JumpRec1.Bin1Label,Ptr);\r
WHILE NOT Equal_Addr(Ptr^.DefAsLabel,St_NillAddr) DO\r
St_Retrieve(Ptr^.DefAsLabel,Ptr);\r
AddOffset(4);\r
Offset := Offset - 4;\r
IF (Ptr^.MegaLabel_Offset DIV CodeSize)\r
<> (Offset DIV CodeSize) THEN\r
BEGIN\r
InstLength := 4;\r
END ELSE\r
BEGIN\r
InstLength := 3;\r
END;\r
\r
i := JumpRec1.Bin1Param div 3;\r
(* writeln('jump instlength ' , instlength,\r
' old ',i,' off ' ,offset,\r
' label ', Ptr^.MegaLabel_Offset ,\r
' back ', ord(jumpback),\r
' diff ',diff);\r
*)\r
(*IF (InstLength > i) OR\r
(( noturns > 0) AND (InstLength <> JumpRec1.Bin1Param))*)\r
IF InstLength <> i THEN\r
BEGIN\r
Stable := False;\r
JumpRec1.Bin1Param := InstLength * 3;\r
END;\r
Offset := Offset + InstLength;\r
END;\r
\r
InternalCall:\r
BEGIN\r
AddOffset(4);\r
END;\r
\r
ExternalLBDR: (* external LBDR *)\r
BEGIN\r
AddOffset(16);\r
END;\r
\r
InternalLBDR:\r
BEGIN\r
AddOffset(10);;\r
END;\r
\r
RoutineEntryPoint:\r
BEGIN\r
EntryPoint := True;\r
END;\r
\r
\r
ELSE;\r
\r
END; (* end case *)\r
\r
If NewPageCounter <> 0 THEN NewPageCounter := 1;\r
IF (JumpRec1.Bin1Code <> DeclareLabel) AND\r
(JumpRec1.Bin1Code <> DeclareLabelConst) AND\r
(JumpRec1.Bin1code <> ExternalCall) THEN\r
AddOffset(JumpRec1.Bin2Code);\r
\r
WriteJumpRec(JumpRec1);\r
\r
END; (* while *)\r
\r
CurrentFile1 := NOT CurrentFile1;\r
noturns := noturns - 1;\r
Offset := Offset + NoOfOutPageJumps*4;\r
LastLineTabSize := (5+1+1) + (Offset Mod CodeSize) DIV Spacing;\r
Offset := Offset + LastLineTabSize;\r
IF Odd(Offset) THEN\r
BEGIN\r
LastLineTabSize := LastLineTabSize + 1;\r
Offset := Offset + 1;\r
END;\r
NoofOutPageJumps := 0;\r
UNTIL Stable;\r
END;\r
\r
PROCEDURE RCPutAllign(off : integer);\r
Var i : Integer;\r
BEGIN\r
IF CodeOnPass2 THEN\r
IF off > 0 THEN\r
BEGIN\r
WriteHexWord(Offset);\r
WriteSpace(CodePos - CurrentPos);\r
END;\r
For i := 1 TO Off DO\r
BEGIN\r
IF CodeOnPass2 THEN WriteHexByte(0);\r
Put_byte(0);\r
Offset := Offset + 1;\r
END;\r
IF CodeOnPass2 THEN\r
IF Off > 0 THEN\r
BEGIN\r
Writespace(CommentPos - CurrentPos);\r
CurrentPos := 0;\r
Writeln(Codelist,' ALLIGNMENT');\r
END;\r
END;\r
\r
Procedure ChangePage;\r
VAR i : Longint;\r
j : Integer;\r
LastPage, Firstpos : Boolean;\r
Uncond : Tempbin1_record;\r
step : integer;\r
StepLinRec : Integer;\r
LastLinrec : Integer;\r
BEGIN\r
\r
i := ((Offset DIV CodeSize)+1)*CodeSize;\r
IF JumpToNextPage = 0 THEN\r
BEGIN\r
RCPageJump(i, 0);\r
END;\r
IF i > InternalOffset THEN\r
BEGIN\r
LastPage := True;\r
LastLinRec := LastLineTabSize - 5;\r
i := Offset + NoOfOutPageJumps*4 + LastLineTabSize;\r
END ELSE\r
BEGIN\r
LastPage := False;\r
LastLinRec := LineTabSize - 5;\r
RCPutAllign(i - Offset - NoOfOutPageJumps*4 - LineTabSize);\r
END;\r
UnCond.Bin1Code := UnCondJump;\r
WHILE CondJumpHead <> Nil DO\r
BEGIN\r
DisposeCondJump(Uncond.Bin1Label);\r
RcPutJump(Uncond, 0);\r
END;\r
\r
IF MakingLineTab THEN InsertLineDiff(True);\r
\r
(* Generate Linetable *)\r
InternalLinkTable(St_StopAddr,0);\r
PutInteger(0);\r
Put_byte(0);\r
PutInteger(FirstLine);\r
IF CodeOnPass2 THEN\r
BEGIN\r
WriteHexWord(Offset);\r
WriteSpace(LabelPos - CurrentPos);\r
Writeln(Codelist, 'LINETABLE:');\r
CurrentPos := 0;\r
WriteSpace(CodePos - CurrentPos);\r
For j := 1 to 3 DO WriteHexByte(0);\r
WriteHexWord(FirstLine);\r
Writeln(CodeList, ' Next(A), FirstLine(W)');\r
CurrentPos := 0;\r
END;\r
Offset := Offset + 5;\r
FirstPos := True;\r
\r
TempLineTabelAddr := LineTabelAddr;\r
StepLinRec := 0;\r
WHILE Not Equal_Addr(TempLineTabelAddr,St_StopAddr) DO\r
BEGIN\r
St_Retrieve(TempLineTabelAddr,Ptr);\r
IF CodeOnPass2 THEN\r
IF StepLinRec <> LastLinRec THEN\r
BEGIN\r
FirstPos := False;\r
WriteHexWord(Offset);\r
WriteSpace(CodePos - CurrentPos);\r
END;\r
For Step := 1 TO Ptr^.St_Size DO\r
IF LastLinRec <> StepLinRec THEN\r
BEGIN\r
StepLinRec := StepLinRec + 1;\r
Put_Byte(Ptr^.Data_area[Step]);\r
Offset := Offset + 1;\r
IF CodeOnPass2 THEN\r
BEGIN\r
WriteHexByte(Ptr^.Data_area[Step]);\r
IF (step MOD 10 = 0) OR (Step = Ptr^.St_Size)\r
OR (StepLinRec = LastLinRec) THEN\r
BEGIN\r
Writeln(CodeList);\r
CurrentPos := 0;\r
FirstPos := True;\r
IF (Step <> Ptr^.St_Size) AND (SteplinRec <> LastLinRec) THEN\r
BEGIN\r
FirstPos := False;\r
WriteHexWord(Offset);\r
WriteSpace(CodePos - CurrentPos);\r
END;\r
END;\r
END;\r
END;\r
TempLineTabelAddr := Ptr^.ListRef;\r
END;\r
\r
FirstLine := LineNumber;\r
TempLineTabelAddr := LineTabelAddr;\r
LineTabelIndex := 2;\r
\r
LineDiff := LineNumber - LastLine + LineRest;\r
IF LineDiff > 255 THEN LineDiff := 255;\r
Step := 0;\r
WHILE Offset < i DO\r
BEGIN\r
Put_Byte(LineDiff);\r
IF CodeOnPass2 THEN\r
BEGIN\r
Step := (Step + 1) MOD 10;\r
IF Step = 1 THEN\r
BEGIN\r
IF Firstpos THEN ELSE\r
BEGIN\r
Writeln(CodeList);\r
CurrentPos := 0;\r
END;\r
WriteHexWord(Offset);\r
WriteSpace(CodePos - CurrentPos);\r
WriteHexByte(LineDiff);\r
FirstPos := False;\r
END\r
END;\r
Offset := Offset + 1;\r
END;\r
IF CodeOnPass2 THEN\r
BEGIN\r
IF FirstPos THEN ELSE\r
BEGIN\r
Writeln(CodeList);\r
CurrentPos := 0;\r
END;\r
IF LastPage THEN ELSE\r
BEGIN\r
WriteHexWord(Offset);\r
WriteSpace(LabelPos - CurrentPos);\r
Writeln(Codelist, 'PAGE ', (Offset DIV CodeSize)+1);\r
CurrentPos := 0;\r
END;\r
END;\r
\r
LineTabelOffset := Offset;\r
END;\r
\r
PROCEDURE ReadJumpRec2(VAR Jumprec1: Tempbin1_record);\r
BEGIN\r
ReadJumpRec(JumpRec1);\r
CodeDumpLength := CodeDumpLength + JumpRec1.Bin2Code;\r
JumpToNextPage := ord(JumpRec1.Bin1Code = DeclareLabelConst);\r
IF (JumpRec1.Bin1Param Mod 3) = 1 THEN ChangePage;\r
Leng := JumpRec1.Bin1Param Mod 3;\r
\r
JumpRec1.Bin1Param := (JumpRec1.Bin1Param DIV 3) * 3;\r
END;\r
\r
BEGIN (* MakePass4_2 *)\r
\r
LastLBDR := 0;\r
LengthOfLineTabel := 0;\r
InternalLinkEntries := 0;\r
FirstLBDR := true;\r
CurrentFile1 := True;\r
\r
EntryPoint := False;\r
InsertJumpSizes;\r
\r
InternalOffset := Offset;\r
CondJumpHead := Nil;\r
\r
CurrentPos := 0;\r
CodeDumpLength:= 0;\r
MakingLineTab := false;\r
Offset := 0;\r
\r
ResetBin1Files;\r
JumpToNextPage := 0;\r
\r
WHILE NOT eofTempPage DO\r
BEGIN\r
ReadJumpRec2(Jumprec1);\r
\r
CASE JumpRec1.Bin1Code OF\r
\r
LineNo :\r
BEGIN\r
IF MakingLineTab THEN InsertLineDiff(false);\r
LineNumber := JumpRec1.Bin1Label.va_high;\r
IF CodeOnPass2 THEN\r
BEGIN\r
writeln(CodeList,'$L',LineNumber);\r
END;\r
END;\r
\r
\r
DeclareLabel,DeclareLabelConst : (* Label *)\r
BEGIN\r
IF (Odd(Offset)) AND ((JumpRec1.Bin1param <> 0) OR\r
(JumpRec1.Bin1Code = DeclareLabelConst)) THEN\r
BEGIN\r
RcPutAllign(1);\r
END;\r
\r
IF EntryPoint THEN\r
BEGIN\r
EntryPoint := False;\r
St_Retrieve(JumpRec1.Bin1Label, Ptr);\r
PutName(Ptr^.St_Spix, CodeOnPass2);\r
Offset := Offset + 12;\r
InternalLinkTable(St_LineTable,0);\r
WritePointer(3, ' Pointer to LineTable');\r
InternalLinktable(St_RoutineName,0);\r
WritePointer(3, ' Pointer to Routine Name');\r
END;\r
\r
IF CodeOnPass2 THEN\r
BEGIN\r
St_Retrieve(JumpRec1.Bin1Label, Ptr);\r
IF Equal_Addr(Ptr^.DefAsLabel,St_NillAddr) THEN\r
BEGIN (* write the label *)\r
WriteHexWord(Offset);\r
WriteSpace(LabelPos - CurrentPos);\r
WriteLabel(Ptr);\r
Writeln(Codelist);\r
CurrentPos := 0;\r
END;\r
END;\r
\r
END;\r
\r
\r
SetCode:\r
BEGIN\r
CodeOnPass2 := JumpRec1.Bin1Label.Va_high <> 255;\r
IF CodeOnPass2 THEN\r
WriteLn(CodeList,'$S',JumpRec1.Bin1Label.Va_high);\r
END;\r
\r
ContextEnd :\r
IF LineTabel THEN\r
BEGIN\r
(* Start Making linetabel *)\r
St_Reserve(LineTabSize-5,LineTabelAddr,Ptr);\r
\r
LineTabelIndex := 1;\r
(* linenumber gives the line of endinclude *)\r
FirstLine := LineNumber;\r
\r
\r
Ptr^.Data_area[LineTabelIndex] := 0;\r
LineTabelIndex := LineTabelIndex + 1;\r
\r
LineTabelOffset := 0;\r
MakingLineTab := true;\r
LastLine := FirstLine;\r
LineRest := 0;\r
TempLineTabelAddr := LineTabelAddr;\r
END;\r
\r
\r
RoutineStart :\r
BEGIN\r
(* Get Routine node *)\r
St_Get(JumpRec1.Bin1Label,Ptr);\r
IF Ptr^.St_Kind = cType THEN\r
BEGIN\r
Ptr^.MegaT_First_Offset := Offset;\r
Ptr^.t_Name_Entry_List := LastNameEntry;\r
END\r
ELSE\r
BEGIN\r
IF (Ptr^.St_Kind = cProgram) AND\r
(Ptr^.St_Specs = St_Global) THEN\r
StartOffset := Offset;\r
Ptr^.MegaFirst_Offset := Offset;\r
Ptr^.Name_Entry_List := LastNameEntry;\r
END;\r
\r
LastNameEntry := JumpRec1.Bin1Label;\r
(* update lengthofnametabel *)\r
st_NameofSpix(Ptr^.St_Spix,Str);\r
LengthOfNameTabel := LengthOfNameTabel + length(Str^)\r
+ NameEntryLength;\r
END;\r
\r
\r
\r
RoutineStop :\r
BEGIN\r
St_Get(JumpRec1.Bin1Label,Ptr);\r
IF Ptr^.St_Kind = cType THEN\r
BEGIN\r
Ptr^.MegaT_Last_Offset := Offset-1;\r
END\r
ELSE\r
BEGIN\r
IF (Ptr^.St_Kind = cProgram) AND\r
(Ptr^.St_Specs = St_Global) THEN\r
BEGIN\r
Ptr^.St_Size := Offset - StartOffset;\r
Ptr^.Last_offset := (Offset - StartOffset) SHR 16;\r
END;\r
Ptr^.MegaLast_Offset := Offset-1;\r
St_Retrieve(Ptr^.St_Label,Ptr);\r
WHILE Not Equal_Addr(Ptr^.DefAsLabel,St_NillAddr) DO\r
St_Retrieve(Ptr^.DefAsLabel,Ptr);\r
help := ptr^.MegaLabel_Offset;\r
St_Get(JumpRec1.Bin1Label,Ptr);\r
Ptr^.MegaFirst_Offset :=help;\r
END;\r
SizeOfConst := offset;\r
END;\r
\r
AddLabelToDis :\r
BEGIN\r
ReadJumpRec2(Helprec);\r
RCPutJump(JumpRec1, HelpRec.Bin1Label.Va_high);\r
END;\r
\r
UnCondJump, InternalCall:\r
BEGIN\r
RCPutJump(JumpRec1,0);\r
END;\r
\r
CondJump:\r
BEGIN\r
St_Retrieve(JumpRec1.Bin1Label,Ptr);\r
WHILE NOT Equal_Addr(Ptr^.DefAsLabel,St_NillAddr)\r
DO St_Retrieve(Ptr^.DefAsLabel,Ptr);\r
IF (Ptr^.MegaLabel_Offset DIV CodeSize)\r
<>(Offset DIV CodeSize) THEN\r
BEGIN\r
NewCondJump(JumpRec1.Bin1Label);\r
IF (Offset DIV CodeSize)\r
=(InternalOffset Div CodeSize) THEN\r
BEGIN\r
RCPageJump(InternalOffset\r
- NoOfOutPageJumps*4 - LastLineTabSize,\r
JumpRec1.Bin1Param DIV 3);\r
END ELSE\r
BEGIN\r
RCPageJump(((Offset DIV CodeSize)+1)*CodeSize\r
- NoOfOutPageJumps*4 - LineTabSize,\r
JumpRec1.Bin1Param DIV 3);\r
END;\r
END ELSE\r
BEGIN\r
RCPutJump(JumpRec1,0);\r
END;\r
END;\r
\r
ExternalCall:\r
BEGIN\r
ExternalLinkTable(JumpRec1.Bin1Label.Va_low);\r
END;\r
\r
CaseLabList : (* a list of case labels *)\r
BEGIN\r
NoLabels := JumpRec1.Bin1Label.Va_High;\r
ReadJumpRec2(JumpRec1); (* low *)\r
WriteInteger(JumpRec1.Bin1Label.va_High,' Case Low');\r
ReadJumpRec2(JumpRec1); (* high *)\r
WriteInteger(JumpRec1.Bin1Label.va_High, ' Case High');\r
ReadJumpRec2(JumpRec1);\r
Lab := JumpRec1.Bin1Label; (* Casetable *)\r
\r
ReadJumpRec2(JumpRec1);\r
Lab1 := JumpRec1.Bin1Label; (* Otherwise *)\r
\r
PutAbsAddr(Lab1,' Case Otherwise');\r
IF Not Equal_Addr(Lab,St_NillAddr) THEN\r
WHILE NoLabels > 0 DO\r
BEGIN\r
St_Retrieve(Lab,Ptr);\r
Low := Ptr^.Label_Low;\r
High := Ptr^.Label_High;\r
\r
Lab2 := Ptr^.ListRef;\r
\r
FOR i := Low TO High DO\r
BEGIN\r
NoLabels := NoLabels - 1;\r
PutAbsAddr(Lab,'');\r
END;\r
\r
IF NoLabels > 0 THEN\r
BEGIN\r
St_Retrieve(Lab2,Ptr);\r
FOR i := (High + 1) TO (Ptr^.Label_Low - 1) DO\r
BEGIN\r
NoLabels := NoLabels - 1;\r
PutAbsAddr(Lab1,'');\r
END;\r
END;\r
Lab := Lab2;\r
END; (* While *)\r
END;\r
\r
\r
RoutineEntryPoint:\r
BEGIN\r
EntryPoint := True;\r
END;\r
\r
ExternalLBDR: (* external LBDR *)\r
BEGIN\r
NoLabels := ExtNoofParams(JumpRec1.Bin1Label);\r
\r
St_Retrieve(JumpRec1.Bin1Label, Ptr);\r
\r
PutInteger(44 + NoLabels*4);\r
PutInteger(((InternalOffset-1) DIV CodeSize)+1);\r
\r
PutInteger(CodeSize);\r
PutInteger(InternalOffset MOD CodeSize);\r
Case Ptr^.St_Kind OF\r
cprogram: Off := 1;\r
cfunction:Off := 3;\r
Else Off := 2;\r
END;\r
PutInteger(Off);\r
\r
Lab := Ptr^.St_Label;\r
IF off = 1 THEN CreateSize := Ptr^.Prog_CreateSize\r
ELSE CreateSize := 0;\r
ParamSize := Ptr^.St_ParamSize + Proc3502_Descr_Size;\r
St_Retrieve(Lab, Ptr);\r
PutName(Ptr^.St_Spix, False);\r
\r
PutAddr(Ptr); (* EntryPoint *)\r
IF off = 1 THEN\r
BEGIN\r
St_Retrieve(ExceptionLab, Ptr);\r
PutAddr(Ptr); (* Exception Point *)\r
END\r
ELSE\r
BEGIN\r
PutInteger(0);\r
PutInteger(0);\r
END;\r
PutInteger(CreateSize DIV 2); (* Default appetite *)\r
PutInteger(ParamSize); (* Last param offset *)\r
UnPackTime(SourceDate,DateAndTime);\r
with DateAndtime Do\r
BEGIN\r
Stepw := (Year - 1900) shl 9 + ( Month shl 5) +\r
+ day;\r
PutInteger(Stepw);(* Source Date *)\r
stepw := (10 SHL 11) +\r
(hour SHL 6) +\r
min;\r
PutInteger(stepw); (* Source Time *)\r
END;\r
PutInteger((Call_options.version SHL 8) +\r
Call_options.subversion ); (* Version *)\r
PutInteger(5 SHL 13 + releaseno * 256 + versionno);\r
\r
ExtPutParameters(Jumprec1.Bin1Label);\r
with DateAndtime Do\r
BEGIN\r
GetDate(Year,Month,day,stepw);\r
GetTime(Hour,Min,Sec,stepw);\r
Stepw := (Year - 1900) shl 9 +\r
month SHL 5 + day;\r
WriteInteger(Stepw, ' Object Date');\r
stepw := (10 SHL 11) + (hour SHL 6 ) +\r
min;\r
WriteInteger(stepw,' Object Time');\r
END;\r
WriteInteger(CodeSize - LineTabSize, ' Length of Code');\r
WriteInteger(InternalOffset MOD CodeSize - LastLineTabSize,\r
' Length of Last');\r
WriteInteger(LastLineNumber, ' Last Line Number');\r
WriteInteger(Spacing, ' Line Spacing');\r
InternalLinkTable(St_StopAddr,0);\r
WritePointer(4, ' First Linetable');\r
END;\r
\r
InternalLBDR: (* Internal LBDR *)\r
BEGIN\r
St_Retrieve(JumpRec1.Bin1Label, Ptr);\r
\r
Lab := Ptr^.St_External_List;\r
CreateSize := Ptr^.Prog_CreateSize div 2;\r
ParamSize := Ptr^.St_ParamSize + Proc3502_Descr_Size;\r
\r
PutAbsAddr(Ptr^.St_Label,' EntryPoint');\r
PutAbsAddr(Lab,' Exception');\r
\r
\r
WriteInteger(CreateSize div 2,' Default Appetite'); (* Default appetite *)\r
WriteInteger(ParamSize,' Last parameter offset');\r
END;\r
\r
END; (* end case *)\r
\r
IF (Leng) = 2 THEN ChangePage;\r
IF CodeDumpLength <> 0 THEN\r
BEGIN\r
RCPutCode(CodeDumpLength);\r
CodeDumpLength := 0;\r
END;\r
\r
\r
END; (* while *)\r
IF CodeDumpLength <> 0 THEN RCPutCode(CodeDumpLength);\r
JumpToNextPage := 1;\r
ChangePage;\r
\r
St_Get(GlobalBlockSymbol,Ptr);\r
Ptr^.MegaLast_offset := Offset;\r
Ptr^.St_size := Codesize;\r
\r
(* Output the Descriptor segment PART 2 *)\r
NoLabels := 0;\r
Lab := FirstExtDec;\r
WHILE Not Equal_Addr(Lab,St_NillAddr) DO\r
BEGIN\r
St_Retrieve(Lab,Ptr);\r
IF Ptr^.Fixup_no <> 0 THEN NoLabels := NoLabels + 1;\r
Lab := Ptr^.Ext_Ref;\r
END;\r
FOR j := 1 TO NoPreextDecl DO\r
IF PreextCalled[j] <> 0 THEN NoLabels := NoLabels + 1;\r
\r
(* External Link Table *)\r
Putinteger(NoLabels);\r
j := 0;\r
Lab := FirstExtDec;\r
FOR High := 1 TO NoLabels DO\r
BEGIN\r
Low := 0; (* No Of Calls Of External Routine *)\r
(* with number j *)\r
REPEAT\r
j := j + 1;\r
IF j <= NoPreextDecl THEN Low := PreextCalled[j] ELSE\r
BEGIN\r
St_Retrieve(Lab,Ptr);\r
Low := Ptr^.Fixup_no;\r
Lab1 := Lab;\r
Lab := Ptr^.Ext_Ref;\r
END;\r
UNTIL Low > 0;\r
\r
IF j <= NoPreextDecl THEN\r
BEGIN\r
CurSpix := PreExtName[j];\r
PutName(CurSpix, False);\r
\r
CASE j OF\r
Exception :\r
BEGIN\r
PutInteger(1);\r
PutInteger(34);\r
PutInteger(2);\r
END;\r
Shift :\r
BEGIN\r
PutInteger(2);\r
FOR i := 1 TO 2 DO\r
BEGIN\r
PutInteger(34);\r
PutInteger(2);\r
END;\r
END;\r
\r
Init_Reference,\r
Init_Chain,\r
Init_Shared ,\r
Init_Mailbox,\r
Init_Process,\r
Init_Port,\r
Init_Pool,\r
Init_LocalRef,\r
HeapRef :\r
BEGIN\r
PutInteger(1);\r
PutInteger(6);\r
PutInteger(3);\r
END;\r
\r
Init_Semaphore :\r
BEGIN\r
PutInteger(3);\r
PutInteger(9);\r
PutInteger(7);\r
for i := 1 to 2 DO\r
BEGIN\r
PutInteger(34);\r
PutInteger(2);\r
END;\r
END;\r
\r
waits,\r
signals :\r
BEGIN\r
PutInteger(1);\r
PutInteger(25);\r
PutInteger(10);\r
END;\r
Init_Internal,\r
Init_External:\r
BEGIN\r
PutInteger(2);\r
PutInteger(6);\r
PutInteger(3);\r
PutInteger(6);\r
PutInteger(3);\r
END;\r
\r
ExcRec:\r
BEGIN\r
PutInteger(3);\r
FOR I := 1 To 2 DO\r
BEGIN\r
putInteger(6);\r
PutInteger(3);\r
END;\r
putInteger(34);\r
PutInteger(2);\r
END;\r
\r
ExcProcess:\r
BEGIN\r
PutInteger(2);\r
FOR I := 1 To 2 DO\r
BEGIN\r
putInteger(17);\r
PutInteger(6);\r
END;\r
END;\r
\r
Eqrec:\r
BEGIN\r
PutInteger(4);\r
PutInteger(35);\r
PutInteger(1);\r
FOR I := 1 To 2 DO\r
BEGIN\r
putInteger(6);\r
PutInteger(3);\r
END;\r
putInteger(34);\r
PutInteger(2);\r
END;\r
\r
ExcPack :\r
BEGIN\r
PutInteger(4);\r
FOR I := 1 To 2 DO\r
BEGIN\r
putInteger(6);\r
PutInteger(3);\r
putInteger(34);\r
PutInteger(2);\r
END;\r
END;\r
ExcRecPack :\r
BEGIN\r
PutInteger(3);\r
putInteger(6);\r
PutInteger(3);\r
putInteger(6);\r
PutInteger(3);\r
putInteger(34);\r
PutInteger(2);\r
END;\r
\r
ExcPackRec :\r
BEGIN\r
PutInteger(3);\r
putInteger(6);\r
PutInteger(3);\r
putInteger(34);\r
PutInteger(2);\r
putInteger(6);\r
PutInteger(3);\r
END;\r
StStr,\r
ExStr:\r
BEGIN\r
PutInteger(4);\r
FOR I := 1 To 2 DO\r
BEGIN\r
putInteger(6);\r
PutInteger(3);\r
END;\r
FOR I := 1 To 2 DO\r
BEGIN\r
putInteger(34);\r
PutInteger(2);\r
END;\r
END;\r
GtStr,\r
LtStr,\r
EqStr:\r
BEGIN\r
PutInteger(5);\r
PutInteger(35);\r
PutInteger(1);\r
FOR I := 1 To 2 DO\r
BEGIN\r
putInteger(6);\r
PutInteger(3);\r
END;\r
FOR I := 1 To 2 DO\r
BEGIN\r
putInteger(34);\r
PutInteger(2);\r
END;\r
END;\r
ELSE PutInteger(0);\r
END;\r
END ELSE\r
BEGIN\r
St_Retrieve(Lab1, Ptr);\r
Lab2 := Ptr^.Ext_Owner;\r
St_Retrieve(Lab2, Ptr);\r
CurSpix := Ptr^.St_Spix;\r
PutName(CurSpix, False);\r
ExtPutParameters(Lab2);\r
END; (* Description of parameters *)\r
PutInteger(Low); (* No Of Uses *)\r
Lab2 := ExternalStartList;\r
i := 0;\r
REPEAT\r
St_Retrieve(Lab2, Ptr);\r
IF Ptr^.Ext_Spix = j THEN\r
BEGIN\r
PutInteger(Ptr^.Fixup_no);\r
PutInteger(Ptr^.Fixup_Offset + 3);\r
i := i + 1;\r
END;\r
Lab2 := Ptr^.Ext_Ref;\r
UNTIL i >= Low;\r
END;\r
\r
(* Internal Link Table *)\r
low := 0;\r
PutInteger(InternalLinkEntries);\r
Lab := InternalStartList;\r
For Stepw := 1 TO InternalLinkEntries DO\r
BEGIN\r
St_Retrieve(Lab, Ptr);\r
Lab := Ptr^.Ext_ref;\r
PutInteger(Ptr^.Fixup_no);\r
IF Equal_Addr(Ptr^.Ext_Owner, St_NillAddr) THEN\r
BEGIN (* UnConditional Jump to Next Page *)\r
PutInteger(Ptr^.Fixup_Offset + 3);\r
PutInteger(Ptr^.Fixup_no + 1);\r
PutInteger(0);\r
END ELSE\r
IF Equal_Addr(Ptr^.Ext_Owner, St_StopAddr) THEN\r
BEGIN (* Link Of LineTable on the Next Page *)\r
PutInteger(Ptr^.Fixup_Offset + 2);\r
IF (Low = 0) OR ( Low = ((Offset DIV CodeSize) + 1)) THEN\r
PutInteger(Ptr^.Fixup_no)\r
ELSE\r
PutInteger(Ptr^.Fixup_no + 1);\r
IF ( Low >= (Offset DIV CodeSize) ) THEN\r
PutInteger((Offset - LastLineTabSize) MOD CodeSize)\r
ELSE\r
PutInteger(CodeSize - LineTabSize);\r
Low := Low + 1;\r
END ELSE\r
IF Equal_Addr(Ptr^.Ext_Owner, St_RoutineName) THEN\r
BEGIN (* Pointer to RoutineName in LineTable *)\r
PutInteger(Ptr^.Fixup_Offset + 2);\r
PutInteger(Ptr^.Fixup_no);\r
PutInteger(Ptr^.Fixup_Offset - 15);\r
END ELSE\r
IF Equal_Addr(Ptr^.Ext_Owner, St_LineTable) THEN\r
BEGIN (* Pointer to Start of LineTable *)\r
PutInteger(Ptr^.Fixup_Offset + 2);\r
PutInteger(1);\r
PutInteger(0);\r
END ELSE\r
BEGIN\r
PutInteger(Ptr^.Fixup_Offset + 3);\r
j := Ptr^.ext_Spix;\r
St_Retrieve(Ptr^.Ext_Owner, Ptr);\r
WHILE NOT Equal_Addr(Ptr^.DefAsLabel,St_NillAddr)\r
DO St_Retrieve(Ptr^.DefAsLabel,Ptr);\r
i := Ptr^.MegaLabel_Offset DIV CodeSize;\r
PutInteger(i + 1);\r
PutInteger((Ptr^.MegaLabel_Offset - i*CodeSize) + j);\r
END;\r
END;\r
\r
END; (* MakePass4_2 *)\r
«eof»