|
|
DataMuseum.dkPresents historical artifacts from the history of: Bogika Butler |
This is an automatic "excavation" of a thematic subset of
See our Wiki for more about Bogika Butler Excavated with: AutoArchaeologist - Free & Open Source Software. |
top - metrics - download
Length: 16640 (0x4100)
Types: TextFile
Names: »LNKP1-1.PAS«
└─⟦91467e717⟧ Bits:30009789/_.ft.Ibm2.50007348.imd Mogens Pelles Zilog 80,000 / EOS projekt
└─⟦this⟧ »LNKP1-1.PAS«
PROCEDURE GetInputFiles(VAR GStatus: StatusType
;VAR LogFile: LogFileType
);
VAR
InputFile: FileType;
FileNo: FileNameTableIndexType;
Status: StatusType;
PROCEDURE ValidateFileFormat(VAR Status: StatusType
;VAR F: FileType
; Format: OF_FormatType
);
VAR
OFF_Format: OF_FormatType;
BEGIN (*VALIDATEFILEFORMAT*)
FGi32(Status, F, OFF_Format);
IF OFF_Format <> Format THEN
Status := Status + (.BadFileFormat.);
IF test((.0,16,19.)) THEN
BEGIN
write(TestOut, 'GetFFvalid '); TSTstat(Status); TSTindt;
writeln(TestOut, 'OFF_Format=', OFF_Format);
END;
END; (*VALIDATEFILEFORMAT*)
PROCEDURE GetModules(VAR GStatus: StatusType
;VAR LogFile: LogFileType
; FileNumber: FileNameTableIndexType
;VAR Fl: FileType
; StartAddressOfNextModule: FileAddressType
);
VAR
Status: StatusType;
PROCEDURE ValidateModuleFormat(VAR Status: StatusType
;VAR F: FileType
; Format: OM_FormatType
);
VAR
OMF_Format: OM_FormatType;
BEGIN (*VALIDATEMODULEFORMAT*)
FGi32(Status, F, OMF_Format);
IF OMF_Format <> Format THEN
Status := Status + (.BadModuleFormat.);
IF test((.0,16,19.)) THEN
BEGIN
write(TestOut, 'GetMFvalid '); TSTstat(Status); TSTindt;
writeln(TestOut, 'OMF_Format=',OMF_Format);
END;
END; (*VALIDATEMODULEFORMAT*)
PROCEDURE GetModuleHeader(VAR GStatus: StatusType
;VAR LogFile: LogFileType
; FileNo:
FileNameTableIndexType
;VAR Fl: FileType
;VAR StartAddressOfNextModule:
FileAddressType
);
VAR
Status: StatusType;
SegmentNo: SegmentNoType;
SymbolNo: SymbolTableIndexType;
ModuleNo: ModuleTableIndexType;
SCTBase: SectionTableIndexType;
MdtRec: ModuleTableRecordType;
NooExportSymbols: i32;
PROCEDURE GetINX(VAR Status: StatusType
;VAR ModuleNo: ModuleTableIndexType
;VAR Fl: FileType
;VAR StartAddressOfNextModule:
FileAddressType
;VAR NooExportSymbols: i32
);
VAR
OMH_ModuleSize: i32;
OMH_ModuleName: ModuleNameType;
Dummy32: i32;
BEGIN (*GETINX*)
WITH ModuleTable(.ModuleNo.) DO
BEGIN
FGi32(Status, Fl, OMH_ModuleSize);
StartAddressOfNextModule :=
StartAddressOfNextModule + OMH_moduleSize;
CurrentFileAddress := StartAddressOfNextModule;
Referenced := false;
FGi32(Status, Fl, Dummy32);
NooSegments := Dummy32;
IF NooSegments > CurSegmentCount THEN
CurSegmentCount := NooSegments;
FGi32(Status, Fl, NooExportSymbols);
FGi32(Status, Fl, Dummy32);
NooExternalImportSymbols := Dummy32;
FGsym(Status, Fl, OMH_ModuleName);
IF Status = (..) THEN
BEGIN
LatestInsert := 0;
SBTEX(Status
,ModuleNameReference
,OMH_ModuleName
,ModuleNo
,0,0,0);
IF not (SymbolTableOverFlow IN Status) THEN
BEGIN
ValueTable(.ModuleNameReference.).Resolved := false;
CurrentUrsCount := CurrentUrsCount + 2;
END;
IF DuplicateExportSymbol IN Status THEN
Status := Status - (.DuplicateExportSymbol.) +
(.DuplicateModuleName.);
END
END
END; (*GETINX*)
PROCEDURE GetSGDs(VAR Status: StatusType
;VAR SCTBase: SectionTableIndexType
; NooSegments: SegmentNoType
; ModuleNo: ModuleTableIndexType
;VAR Fl: FileType
);
VAR
SegmentNo: SegmentNoType;
SGD_Record: ObjectRecordType;
BEGIN (*GETSEGMENTDESCRIPTORS*)
SegmentNo := 0;
SCTBase := SCTOffset;
WITH SGD_Record DO
WHILE (SegmentNo < NooSegments) and (Status = (..)) DO
BEGIN
SegmentNo := SegmentNo + 1;
FGi32(Status, Fl, SGD_Image);
FGi32(Status, Fl, SGD_Rld);
FGi32(Status, Fl, SGD_IntImport);
FGi32(Status, Fl, SGD_NooIntImportSymbols);
IF Status = (..) THEN
SCTP(Status, ModuleNo, SegmentNo, SGD_Record);
IF test((.0,16,19.)) THEN
BEGIN
write(TestOut, 'GetSGDs '); TSTstat(Status); TSTln
END;
END
END; (*GETSEGMENTDESCRIPTORS*)
PROCEDURE GetEXP(VAR GStatus: StatusType
;VAR LogFile: LogFileType
;VAR Fl: FileType
;VAR LinkHead: SymbolTableIndexType
; SCTBase: SectionTableIndexType
; ModuleNo: ModuleTableIndexType
; NooExportSymbols: i32
);
VAR
Status: StatusType;
SymbolCount: i32;
DuplicateCount: i32;
EXP_Record: ObjectRecordType;
SymbolTableEntryNo: SymbolTableIndexType; (*DUMMY*)
Dummy8: i8;
Dummy32: i32;
BEGIN (*GETEXPORTLIST*)
Status := (..);
LinkHead := 0;
LatestInsert := 0;
SymbolCount := 0;
DuplicateCount := 0;
IF SymbolCount < NooExportSymbols THEN
WITH EXP_Record DO
BEGIN
SymbolCount := SymbolCount + 1;
FGi8( Status, Fl, Dummy8);
EXP_Record.EXP_RelocationIndicator := Dummy8;
FGi32(Status, Fl, EXP_Record.EXP_Item);
FGsym(Status, Fl, EXP_Record.EXP_SymbolName);
IF Status = (..) THEN
BEGIN
SBTEX(Status
,LinkHead
,EXP_SymbolName
,ModuleNo
,SCTBase
,EXP_RelocationIndicator
,EXP_Item
);
IF DuplicateExportSymbol IN Status THEN
BEGIN
DuplicateCount := DuplicateCount + 1;
IF DuplicateCount <= 1 THEN
LogHdds(LogFile);
LogDDS(LogFile
,ModuleNo
,EXP_RelocationIndicator
,EXP_Item
,EXP_SymbolName
);
END
END;
GStatus := GStatus + Status;
END;
WHILE (GStatus <= (.DuplicateExportSymbol.)) and
(SymbolCount < NooExportSymbols) DO
BEGIN
SymbolCount := SymbolCount + 1;
Status := (..);
FGi8( Status, Fl, Dummy8);
EXP_Record.EXP_RelocationIndicator := Dummy8;
FGi32(Status, Fl, EXP_Record.EXP_Item);
FGsym(Status, Fl, EXP_Record.EXP_SymbolName);
IF Status = (..) THEN
WITH EXP_Record DO
BEGIN
SBTEX(Status
,SymbolTableEntryNo
,EXP_SymbolName
,ModuleNo
,SCTBase
,EXP_RelocationIndicator
,EXP_Item
);
IF DuplicateExportSymbol IN Status THEN
BEGIN
DuplicateCount := DuplicateCount + 1;
IF DuplicateCount <= 1 THEN
LogHdds(LogFile);
LogDDS(LogFile
,ModuleNo
,EXP_RelocationIndicator
,EXP_Item
,EXP_SymbolName
);
END
END;
GStatus := GStatus + Status
END; (*WHILE ... DO*)
END; (*GETEXPORTLIST*)
PROCEDURE GetEXI(VAR Status: StatusType
;VAR Fl: FileType
; ModuleNo: ModuleTableIndexType
; NooExternalImportSymbols:
ExternalImportTableIndexType
);
VAR
SymbolTableEntryNo: SymbolTableIndexType;
SymbolCount: i32;
EXI_SymbolName: SymbolNameType;
BEGIN (*GETEXTERNALIMPORTLIST*)
SymbolCount := 0;
WHILE (Status = (..)) and
(SymbolCount < NooExternalImportSymbols) DO
BEGIN
SymbolCount := SymbolCount + 1;
FGsym(Status, Fl, EXI_SymbolName);
IF Status = (..) THEN
SBTIM(Status
,SymbolTableEntryNo
,EXI_SymbolName
,ModuleNo
);
END; (*WHILE ... DO*)
END; (*GETEXTERNALIMPORTLIST*)
BEGIN (*GETMODULEHEADER*)
Status := (..);
MDTA(Status, ModuleNo, 1);
IF Status = (..) THEN
BEGIN
GetINX(Status, ModuleNo, Fl
, StartAddressOfNextModule
, NooExportSymbols);
IF Status = (..) THEN
WITH ModuleTable(.ModuleNo.) DO
BEGIN
FileNameReference := FileNo;
GetSGDs(Status
,SCTBase
,NooSegments
,ModuleNo
,Fl
);
IF Status = (..) THEN
BEGIN
SymbolTable(.ModuleNameReference
.).Section := - ModuleNo;
GetEXP(Status
,LogFile
,Fl
,SBTLinkHead
,SCTBase
,ModuleNo
,NooExportSymbols
);
IF Status <= (.DuplicateExportSymbol.) THEN
BEGIN
EITOffset := CurExternalImportSymbolNo;
GetEXI(Status
,Fl
,ModuleNo
,NooExternalImportSymbols
);
END
END
END;
END;
GStatus := GStatus + Status;
IF test((.0,6,16,19.)) THEN
BEGIN
write(TestOut, 'GetOMH '); TSTstat(Status); TSTln;
TSTindt; TSTindt; TSTindt; TSTmdt(ModuleNo);
END;
END; (*GETMODULEHEADER*)
BEGIN (*GETMODULES*)
REPEAT
Status := (..);
FilSeek(Status, InputFile, StartAddressOfNextModule);
IF not (UnexpectedEof IN Status) THEN
BEGIN
ValidateModuleFormat(Status, InputFile, OM_Format1);
IF UnexpectedEof IN Status THEN
BEGIN
LogEOFerror(LogFile, FileNumber, InputFile.P)
END
ELSE IF (BadModuleFormat IN Status) THEN
BEGIN
LogOMFerror(LogFile, FileNumber, InputFile.P)
END
ELSE (* Status = (..) *)
GetModuleHeader(Status
,LogFile
,FileNumber
,InputFile
,StartAddressOfNextModule
);
GStatus := GStatus + Status;
END
UNTIL Status - (.DuplicateExportSymbol, BadSymbolName.) <> (..);
END; (*GETMODULES*)
BEGIN (*GETINPUTFILES*)
FOR FileNo := 1 TO CurFileNo DO
BEGIN
Status := (..);
FilAsg(InputFile, FileNameTable(.FileNo.));
FilRst(Status, InputFile);
IF Status = (..) THEN
BEGIN
ValidateFileFormat (Status, InputFile, OF_Format1);
IF Status = (..) THEN
GetModules(Status, LogFile, FileNo, InputFile, 4)
ELSE IF BadFileFormat IN Status THEN
LogOFFerror(LogFile, FileNo);
END;
IF UnexpectedEof IN Status THEN
LogEOFerror(LogFile, FileNo, InputFile.P);
FilCls(InputFile);
GStatus := GStatus + Status;
END;
IF CurModuleNo <= 0 THEN
GStatus := GStatus + (.NoInput.);
END; (*GETINPUTFILES*)
«eof»