DataMuseum.dk

Presents historical artifacts from the history of:

Bogika Butler

This is an automatic "excavation" of a thematic subset of
artifacts from Datamuseum.dk's BitArchive.

See our Wiki for more about Bogika Butler

Excavated with: AutoArchaeologist - Free & Open Source Software.


top - metrics - download

⟦a62502b16⟧ TextFile

    Length: 19712 (0x4d00)
    Types: TextFile
    Names: »LNKP1-2.BAK«

Derivation

└─⟦dbb5cfece⟧ Bits:30009789/_.ft.Ibm2.50007354.imd Mogens Pelles Zilog 80,000 / EOS projekt
    └─⟦this⟧ »LNKP1-2.BAK« 

TextFile

(******************************************************************************)
(*                                                                            *)
(*   Copyright (1985) by Metanic Aps., Denmark                                *)
(*                                                                            *)
(*   Author: Lars Gregers Jakobsen.                                           *)
(*                                                                            *)
(******************************************************************************)

      PROCEDURE PutTargetFile(VAR Status: StatusType
                             ;VAR TargetFile: FileType
                             ;VAR LogFile: LogFileType
                             );

         PROCEDURE PutFF(VAR Fl: FileType
                        );

           BEGIN (*PUTFF*)
            FPi32(Fl, OF_Format1);
           END;  (*OUTFF*)

         PROCEDURE PutModule(VAR Status: StatusType
                            ;VAR TargetFile: FileType
                            ;VAR  LogFile: LogFileType
                            );

            PROCEDURE PutMF(VAR Fl: FileType
                           );

              BEGIN (*PUTMF*)
               FPi32(Fl, OM_Format1);
              END;  (*OUTMF*)

            PROCEDURE PutINX(VAR Status: StatusType
                            ;VAR Fl: FileType
                            ;VAR LogFile: LogFileType
                            );

               VAR
                  OMH_ModuleName: ModuleNameType;

              BEGIN (*PUTINX*)
               FPi32(Fl,0); (* OMH_Module *)
               FPi32(Fl,0); (* OMH_NooSegments *)
               FPi32(Fl,0); (* OMH_NooExportSymbols *)
               FPi32(Fl,0); (* OMH_NooExtImportSymbols *)
               NMTG(SymbolTable(.ModuleTable(.1.).ModuleNameReference
                               .).NameReference
                   , OMH_ModuleName
                   );
               FPsym(Fl, OMH_ModuleName);
              END;  (*PUTINX*)

            PROCEDURE PutSGDs(VAR Status: StatusType
                             ;VAR Fl: Filetype
                             ;VAR LogFile: LogFileType
                             );

               VAR
                  SRCinx: SectionTableIndexType;
                  DSTinx: SectionTableIndexType;
                  ModuleName: ModuleNameType;

              PROCEDURE PutSGD(VAR TargetFile: FileType
                              ;    Section: SectionTableRecordType
                              );

                 BEGIN (*PUTSGD*)
                  WITH Section  DO
                    BEGIN
                     FPi32(TargetFile, ImageSize);
                     FPi32(TargetFile, OvrSize);
                    END;
                 END;  (*PUTSGD*)

              BEGIN (*PUTSGDS*)
               Status := (..);
               SCTA(Status, TargetSectionOffset, CurSegmentCount);
               IF not (SectionTableOverFlow IN Status) THEN
                 BEGIN
                  IF CurSegmentCount > 0 THEN
                     LogHSgd(LogFile);
                  FOR DSTinx := 1 TO CurSegmentCount DO
                     WITH SectionTable(.TargetSectionOffset + DSTinx.) DO
                       BEGIN
                        ModuleNo := TargetModuleNo;
                        SegmentNo := DSTinx;
                        ImageSize := 0;                (*TO BE UPDATED*)
                        OvrSize := 0;
                        RelocationConstant := 0;
                        FOR SRCinx := 1 TO TargetSectionOffset DO
                           IF SectionTable(.SRCinx.).SegmentNo = DSTinx THEN
                             BEGIN
                              SectionTable(.SRCinx.).RelocationConstant :=
                                           ImageSize * ImageFactor;
                              ImageSize := ImageSize +
                                           SectionTable(.SRCinx.).ImageSize;
                              WITH SectionTable(.SRCinx.) DO (*Log memory map element*)
                                 IF SectionTable(.SRCinx.).ImageSize > 0 THEN
                                   BEGIN
                                    NMTG(SymbolTable(.ModuleTable(.
                                                      ModuleNo.).ModuleNameReference
                                                    .).Namereference
                                        ,ModuleName
                                        );
                                    LogSGD(LogFile
                                          ,DSTinx
                                          ,RelocationConstant
                                          ,ImageSize*ImageFactor
                                          ,ModuleName
                                          );
                                   END;
                              IF test((.0,6,16,19.)) THEN
                                BEGIN
                                 write(TestOut, 'PutSGDs-1');
                                 TSTsct(SRCinx);
                                END;
                             END; (* FOR SRCinx := ... *)
                        PutSGD(Fl, SectionTable(.TargetSectionOffset +
                                                 DSTinx.)  );
                        IF test((.0,6,16,19.)) THEN
                          BEGIN
                           write(TestOut, 'PutSGDs-2');
                           TSTsct(TargetSectionOffset + DSTinx);
                          END;
                       END; (* FOR DSTinx := ... *)
                 END; (* allocation ok *)
              END;  (*PUTSGDS*)

            PROCEDURE PutEXP(VAR Status: StatusType
                            ;VAR Target: FileType
                            ;VAR LogFile: LogFileType
                            );

               VAR
                  MDTInx: ModuleTableIndexType;
                  ModuleName: ModuleNameType;
                  Heap: HeapType;
                  HeapMax: HeapIndexType;
                  Winner: SymboltableIndexType;
                  SymbolNo: SymbolTableIndexType;
                  EXP_RelocationIndicator: RelocationIndicatorType;
                  EXP_Item: i32;
                  EXP_SymbolName: SymbolNameType;
                  SbtInx: SymbolTableIndexType;

               FUNCTION NameSwop(VAR A
                                ,    B: SymbolNameType
                                ): boolean;

                  VAR
                     I: integer;

                 BEGIN (*NAMESWOP*)
                  I := 1;
                  IF B.Length < A.Length THEN
                    BEGIN
                     WHILE (I <= B.Length) and (A.Name(.I.) >= B.Name(.I.)) DO
                        I := I + 1;
                     NameSwop := (I > B.Length);
                    END
                  ELSE
                    BEGIN
                     WHILE (I <= A.Length) and (A.Name(.I.) <= B.Name(.I.)) DO
                        I := I + 1;
                     NameSwop := not (I > A.Length);
                    END;
                  IF test((.0,13.)) THEN
                    BEGIN
                     writeln(TestOut, 'NameSwop ', 'I=', I:1);
                     TSTindt; TSTindt; TSTindt;
                     write(TestOut, 'A='); TSTsymbol(A);
                     TSTindt; TSTindt; TSTindt;
                     write(TestOut, 'B='); TSTsymbol(B);
                    END
                 END;  (*NAMESWOP*)

               PROCEDURE InHeap(    New: SymbolTableIndexType
                               );

                  VAR
                     I,J: integer;
                     Z,V: SymbolNameType;
                     Swop: boolean;

                 BEGIN (*INHEAP*)
                  HeapMax := HeapMax + 1;
                  I := HeapMax;
                  NMTG(SymbolTable(.New.).NameReference, Z);
                  IF I > 1 THEN
                  REPEAT
                     J := I div 2;
                     NMTG(SymbolTable(. Heap(.J.) .).NameReference, V);
                     Swop := NameSwop(V,Z);
                     IF Swop THEN
                       BEGIN
                        Heap(.I.) := Heap(.J.);
                        I := J
                       END
                  UNTIL (I <= 1) or ( not Swop );
                  Heap(.I.) := New;
                  IF test((.0,13.)) THEN
                   BEGIN
                    writeln(TestOut, 'InHeap   New=', New:1);
                    TSTheap(Heap, HeapMax);
                   END;
                 END;  (*INHEAP*)

               PROCEDURE SelectWinner(VAR Status: StatusType
                                     );

                  VAR
                     I,J: integer;
                     Swop: boolean;
                     V,W,Z: SymbolNameType;
                     New: SymbolTableIndexType;

                 BEGIN (*SELECTWINNER*)
                  IF (0 < HeapMax) THEN
                    BEGIN
                     Winner := Heap(.1.);
                     WITH Symboltable(.Winner.) DO
                        IF SortLink <> Winner THEN
                           New := SortLink
                        ELSE
                          BEGIN (* Chain exhausted - descrease size of heap *)
                           New := Heap(.HeapMax.);
                           HeapMax := HeapMax - 1;
                          END;
                     I := 1;
                     IF HeapMax >= 2 THEN
                       BEGIN
                        J := 2;
                        Heap(.HeapMax + 1.) := New;
                        NMTG(SymbolTable(.New.).NameReference, Z);
                        REPEAT
                           (* J <= HeapMax *)

                           NMTG(SymbolTable(.Heap(. J .).).NameReference, V);
                           NMTG(SymbolTable(.Heap(.J+1.).).NameReference, W);
                           IF NameSwop(V,W) THEN
                             BEGIN
                              V := W;
                              J := J + 1
                             END;

                           Swop := NameSwop(Z,V);
                           IF Swop THEN
                             BEGIN
                              Heap(.I.) := Heap(.J.);
                              I := J;
                              J := I + I;
                             END;

                           IF test((.0,13.)) THEN
                             BEGIN
                              write(TestOut, 'SLCT-W-1 ', 'I='  , I:1
                                                , ' ':2 , 'J='  , J:1
                                                , ' ':2 , 'New=', New:1
                                                , ' ':2 , 'Swop='
                                   ); TSTbool(Swop); TSTln;
                              TSTheap(Heap, HeapMax);
                             END

                        UNTIL (not Swop) or (J > HeapMax);
                       END;
                     Heap(.I.) := New;
                    END
                  ELSE
                     Status := Status + (.HeapEmpty.);
                  IF test((.0,13,16,19.)) THEN
                    BEGIN
                     write(TestOut, 'SLCT-W-2 '); TSTstat(Status); TSTindt;
                     writeln(TestOut,        'HeapMax=', HeapMax:1
                                    , ' ':2, 'Winner=', Winner:1
                            );
                    END;
                 END;  (*SELECTWINNER*)


              BEGIN (*PUTEXP*)

               IF test((.0,13.)) THEN
                 BEGIN
                  writeln(TestOut, 'PUTEXP   ');
                  FOR SbtInx := 1 TO MaxNooSymbols DO
                     WITH SymbolTable(.SbtInx.), ValueTable(.SbtInx.) DO
                        IF NameReference <> 0 THEN
                          BEGIN
                           TSTindt; TSTindt; TSTindt; TSTsbt(SbtInx);
                           TSTindt; TSTvlt(SbtInx); TSTln;
                          END;
                 END;

               (*Initialize selection*)
               HeapMax := 0;
               FOR MDTInx := 1 TO TargetModuleNo - 1 DO
                  IF ModuleTable(.MDTInx
                                .).SBTLinkHead IN (.1..MaxNooSymbols.) THEN
                     InHeap(ModuleTable(.MDTInx.).SBTLinkHead);

               IF HeapMax > 0 THEN
                  LogHxpN(LogFile);
               NooExpSymbols := 0;

               WHILE (Status = (..)) DO
                 BEGIN
                  SelectWinner(Status);
                  IF Status = (..) THEN
                     WITH SymbolTable(.Winner.), ValueTable(.Winner.) DO
                        IF SegmentNo > UnResolved THEN
                          BEGIN
                           NooExpSymbols := NooExpSymbols + 1;
                           IF (SegmentNo > 0)  THEN (*relocatable*)
                              WITH SectionTable(.ModuleTable(.ModuleNo
                                                            .).SCTbase +
                                                               SegmentNo
                                               .) DO
                                BEGIN
                                 Value := Value + RelocationConstant;
                                END;
                           EXP_RelocationIndicator := SegmentNo;
                           EXP_Item := Value;
                           NMTG(NameReference, EXP_SymbolName);
                           FPi8(Target, EXP_RelocationIndicator);
                           FPi32(Target, EXP_Item);
                           FPsym(Target, EXP_SymbolName);
                           IF (Status = (..)) and (OPTlfk <> none) THEN
                             BEGIN
                              NMTG(SymbolTable(.
                                      ModuleTable(.ModuleNo
                                                 .).ModuleNameReference
                                              .).NameReference
                                  ,ModuleName
                                  );
                              LogXP(LogFile
                                   ,EXP_RelocationIndicator
                                   ,EXP_Item
                                   ,EXP_SymbolName
                                   ,ModuleName
                                   )
                             END;
                          END;
                 END;
               Status := Status - (.HeapEmpty.);
               IF (HeapEmpty IN Status) and (OPTlfk <> none) THEN
                 BEGIN  (*sort sbt/vlt by value and log*)
                 END
              END;  (*PUTEXP*)


            PROCEDURE PutEXI(VAR Status: StatusType
                            ;VAR Target: FileType
                            ;VAR LogFile: LogFileType
                            );

            LABEL
               1;

            VAR
                 ModuleName: ModuleNameType;
                 SymbolName: SymbolNameType;
                 ExiInx1: ExternalImportTableIndexType;
                 ExiInx: ExternalImportTableIndexType;

              (* TargetModuleNo is a global variable *)

              BEGIN (*PUTEXI*)
               NooExiSymbols := 0;

               ExiInx1 := 1;
               FOR ExiInx1 := 1 TO CurExternalImportSymbolNo DO
                 BEGIN
                  IF test((.0,7.)) THEN
                    BEGIN
                     write(TestOut, 'PUTEXI-1 ');
                     TSTeit(ExiInx1);
                    END;
                  IF (ValueTable(.ExternalImportTable(.ExiInx1.).SymbolNo
                                .).SegmentNo = UnResolved) THEN
                     GOTO 1;
                 END;

1:             IF (CurExternalImportSymbolNo > 0) THEN
                  IF (ValueTable(.ExternalImportTable(.ExiInx1.).SymbolNo
                            .).SegmentNo = UnResolved) THEN
                    BEGIN
                     LogHurs(LogFile);
                     FOR ExiInx := ExiInx1 TO CurExternalImportSymbolNo DO
                       BEGIN
                        IF test((.0,7.)) THEN
                          BEGIN
                           write(TestOut, 'PUTEXI-2 ');
                           TSTeit(ExiInx);
                          END;
                        WITH ExternalImportTable(.ExiInx.) DO
                           WITH ValueTable(.SymbolNo.),
                                SymbolTable(.SymbolNo.) DO
                                    IF SegmentNo = UnResolved THEN
                                      BEGIN
                                       NooExiSymbols := NooExiSymbols + 1;
                                       Value := NooExiSymbols;
                                       NMTG(NameReference, SymbolName);
                                       FPsym(Target, SymbolName);
                                       NMTG(SymbolTable(.
                                               ModuleTable(.ModuleNo
                                                          .).ModuleNameReference
                                                       .).NameReference
                                           ,ModuleName
                                           );
                                       LogURS(LogFile, ModuleName, SymbolName);
                                       IF test((.0,16,19.)) THEN
                                         BEGIN
                                          writeln(TestOut, 'PutEXI   '
                                                         , 'SymbolNo=', SymbolNo:1
                                                         , ' ':2, 'Value=', Value:1);
                                         END;
                                      END;

                       END;
                    END;
              END;  (*PUTEXI*)

           (* TargetModuleNo is a global variable *)

           BEGIN (*PUTMODULE*)
            MDTA(Status, TargetModuleNo, 1);
            IF not (ModuleTableOverFlow IN Status) THEN
              BEGIN
               PutMF(TargetFile);
               PutINX(Status, TargetFile, LogFile);
               IF Status = (..) THEN
                 BEGIN (*Calculate memory map, write sgd, and log*)
                  PutSGDs(Status, TargetFile, LogFile);

                  IF not (SectionTableOverFlow IN Status) THEN
                    BEGIN (*Relocate symbol table, write export list, and log*)
                     PutEXP(Status, TargetFile, LogFile);
                     IF Status = (..) THEN
                       BEGIN (*Write EXI while logging unresolved references*)
                        PutEXI(Status, TargetFile, LogFile);
                       END;
                    END;
                 END;
              END;
           END;  (*PUTMODULE*)

        BEGIN (*PUTTARGETFILE*)
         PutFF(TargetFile);
         PutModule(Status, TargetFile, LogFile);
        END;  (*PUTTARGETFILE*)

(*                                                                            *)
(*                                                                            *)
(******************************************************************************)
«eof»