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

⟦9342653cc⟧ TextFile

    Length: 188160 (0x2df00)
    Types: TextFile
    Names: »LNK.PRN«

Derivation

└─⟦2079929d2⟧ Bits:30009789/_.ft.Ibm2.50006583.imd Mogens Pelles Zilog 80,000 / EOS projekt
    └─⟦this⟧ »LNK.PRN« 

TextFile

Pro Pascal Compiler - Version zz 2.1

Compilation of: B:LNK.PAS

Options:    LNIAG

    1   0000    (******************************************************************************)
    2   0000    (*                                                                            *)
    3   0000    (*   Copyright (1985) by Metanic Aps., Denmark                                *)
    4   0000    (*                                                                            *)
    5   0000    (*   Author: Lars Gregers Jakobsen.                                           *)
    6   0000    (*                                                                            *)
    7   0000    (******************************************************************************)
    8   0000    
    9   0000    PROGRAM Link;
   10   0000    
   11   0000    (*$I B:lnkDC0.pas   Declarations of global constants, types, and commons      *)
   12   0000    (******************************************************************************)
   13   0000    (*                                                                            *)
   14   0000    (*   Copyright (1985) by Metanic Aps., Denmark                                *)
   15   0000    (*                                                                            *)
   16   0000    (*   Author: Lars Gregers Jakobsen.                                           *)
   17   0000    (*                                                                            *)
   18   0000    (******************************************************************************)
   19   0000    
   20   0000       CONST
   21   0000    
   22   0000    (*$I B:LNKDC0-0.pas  Configuration Constants                                  *)
   23   0000    (******************************************************************************)
   24   0000    (*                                                                            *)
   25   0000    (*   Copyright (1985) by Metanic Aps., Denmark                                *)
   26   0000    (*                                                                            *)
   27   0000    (*   Author: Lars Gregers Jakobsen.                                           *)
   28   0000    (*                                                                            *)
   29   0000    (******************************************************************************)
   30   0000    
   31   0000    (* $I B:LNKDC0-0.pas  Configuration Constants *)
   32   0000    
   33   0000          ConfigurationNo = 'C0B CP/M';
   34   0008    
   35   0008          CommandLineLength = 127;
   36   0008          FileNameLength = 14;
   37   0008          MaxSymbolNameIndex = 32; (*?*)
   38   0008          MaxNooInputFiles = 5; (*?*)
   39   0008          MaxNooModules = 10;    (*?*)
   40   0008          MaxNooSections = 40;   (*?*)
   41   0008          MaxNooSegments = 5;   (*?*)
   42   0008          MaxNooSymbols = 100;    (*?*)
   43   0008          MaxNooExternalImportSymbols = 100; (*?*)
   44   0008          MaxNameTableIndex = 300; (*?*)
   45   0008          MaxHeapIndex = 11; (* >= MaxNooModules + 1 *)
   46   0008          OM_Format1 = 1;
   47   0008          OF_Format1 = 1;
   48   0008          LogFilePageSize = 65; (*First line is #1. Last line is #65*)
   49   0008    
   50   0008    (*                                                                            *)
   51   0008    (*                                                                            *)
   52   0008    (******************************************************************************)
   53   0008    
   54   0008    (*#B#*)
   55   0008    (*$I A:PrTstCon.pas Declarations of constants for PrTst package          *)
   56   0008    (* $I A:PrTstCon.pas Declarations of constants for PrTst package *)
   57   0008    
   58   0008       (* This file is part of the ProPascal test option package. Se file
   59   0008          PrTst.pas for further explanations of usage
   60   0008       *)
   61   0008    
   62   0008          max_test_option_number = 31;
   63   0008    
   64   0008    
   65   0008    
   66   0008          (* Other constants *)
   67   0008    
   68   0008          VersionNo = 'V0.03';
   69   000D          UnResolved = -1;   (* Value of field segmentno in VLT *)
   70   000D          OvrCode = 0;       (* For index in bit map *)
   71   000D          ImageFactor = 4;   (* 2 bits in bit map per 8 bits in image *)
   72   000D          OMF_Address = 4;   (* Address of OMF in target file *)
   73   000D          OMH_Address = 8;   (* Address of OMH in target file *)
   74   000D          LogMargin = 10;    (* Size of blank left margin in log  file *)
   75   000D    
   76   000D       TYPE  (*LINK*)
   77   000D    
   78   000D          (* General Types *)
   79   000D    
   80   000D          i8  = 0..255;
   81   000D          i16 = 0..65535;
   82   000D          i32 = integer;
   83   000D          i32IndexType = (bs0, bs1, bs2, bs3);
   84   000D          i32ArrayType = ARRAY (.i32IndexType.) OF i8;
   85   000D          CharSetType = SET OF char;
   86   000D    
   87   000D          (* Basic Types *)
   88   000D    
   89   000D          StatusBaseType =
   90   000D             (Success
   91   000D             ,BadOption
   92   000D             ,BadLogFileName
   93   000D             ,BadTargetFileName
   94   000D             ,BadFileName
   95   000D             ,NoSuchFile
   96   000D             ,NoInputFiles
   97   000D             ,ExtraText
   98   000D             ,BadFileFormat
   99   000D             ,BadModuleFormat
  100   000D             ,UnexpectedEof
  101   000D             ,RangeError
  102   000D             ,BadSymbolName
  103   000D             ,DuplicateModuleName
  104   000D             ,DuplicateExportSymbol
  105   000D             ,NoInput
  106   000D             ,Baddibit
  107   000D             ,BadRelocationCode
  108   000D             ,BadImportCode
  109   000D             ,NameTableOverFlow
  110   000D             ,ModuleTableOverFlow
  111   000D             ,SectionTableOverFlow
  112   000D             ,FileNameTableOverFlow
  113   000D             ,SymbolTableOverFlow
  114   000D             ,ExternalImportTableOverFlow
  115   000D             ,NotFound
  116   000D             ,NotFinished
  117   000D             ,HeapEmpty
  118   000D             ,NoTarget
  119   000D             ,Error
  120   000D             );
  121   000D    
  122   000D          StatusType = SET OF StatusBaseType;
  123   000D    
  124   000D          OF_FormatType = i32;
  125   000D          OM_FormatType = i32;
  126   000D          FileKindBaseType = (explicit, implicit, none);
  127   000D          LogFileKindType = explicit..none;
  128   000D          TargetFileKindType = explicit..implicit;
  129   000D    
  130   000D          SegmentNoType = UnResolved..MaxNooSegments;
  131   000D          RelocationIndicatorType = SegmentNoType;
  132   000D          FileAddressType = 0..MaxInt;
  133   000D    
  134   000D          CommandLineIndexType = 0..CommandLineLength;
  135   000D          CommandLineType = String(.CommandLineLength.);
  136   000D    
  137   000D          SymbolNameIndexType = 0..MaxSymbolNameIndex;
  138   000D          SymbolNameSubIndexType = 1..MaxSymbolNameIndex;
  139   000D          SymbolNameType = RECORD
  140   000D             Length: SymbolNameIndexType;
  141   000D             Name: ARRAY (.SymbolNameSubIndexType.) OF i8;
  142   000D            END;
  143   000D          ModuleNameType = SymbolNameType;
  144   000D          FileNameType = STRING(.FileNameLength.);
  145   000D    
  146   000D          ImageUnitType = i8;
  147   000D          QuadImageUnitType = i32;
  148   000D          BasicFileType = file OF ImageUnitType;
  149   000D          FileType = RECORD
  150   000D             F: BasicFileType;    (* File systeme file *)
  151   000D             P: FileAddressType   (* Current file address.
  152   000D                                     NOT defined when eof(F) =  true *)
  153   000D            END;
  154   000D    
  155   000D          PageNoType = i32;
  156   000D          LineNoType = 0..255;
  157   000D          LogFileType = RECORD
  158   000D             F: text;       (* File system file *)
  159   000D             P: PageNoType; (* No of page started upon *)
  160   000D             L: LineNoType; (* No of line just printed within current page *)
  161   000D            END;
  162   000D    
  163   000D          (* Table Index Types *)
  164   000D    
  165   000D          ExternalImportTableIndexType = 0..MaxNooExternalImportSymbols;
  166   000D          FileNameTableIndexType = -1..MaxNooInputFiles;
  167   000D          ModuleTableIndexType = 0..MaxNooModules;
  168   000D          NameTableIndexType = 0..MaxNameTableIndex;
  169   000D          SectionTableIndexType = 0..MaxNooSections;
  170   000D          SymbolTableIndexType = 0..MaxNooSymbols;
  171   000D          HeapIndexType = 0..MaxHeapIndex;
  172   000D    
  173   000D          (* Table Sub Index Types *)
  174   000D    
  175   000D          ExternalImportTableSubIndexType = 1..MaxNooExternalImportSymbols;
  176   000D          ModuleTableSubIndexType = 1..MaxNooModules;
  177   000D          NameTableSubIndexType = 1..MaxNameTableIndex;
  178   000D          SectionTableSubIndexType = 1..MaxNooSections;
  179   000D          SymbolTableSubIndexType = 1..MaxNooSymbols;
  180   000D    
  181   000D    
  182   000D    
  183   000D          (* Table Record Types *)
  184   000D    
  185   000D          ExternalImportTableRecordType = RECORD
  186   000D             SymbolNo: SymbolTableIndexType
  187   000D                   (* Points to VLT entry holding value *)
  188   000D            END;
  189   000D    
  190   000D          FileNameTableRecordType = FileNameType;
  191   000D    
  192   000D          ModuleTableRecordType = RECORD
  193   000D             ModuleNameReference: SymbolTableIndexType;
  194   000D                   (* Points to SBT entry holding module name *)
  195   000D             FileNameReference: FileNameTableIndexType;
  196   000D                   (* Points to FNT entry holding name of file *)
  197   000D             CurrentFileAddress: FileAddressType;
  198   000D                   (* Offset (in octets) relative to start of file. First octet
  199   000D                      in file is # 0 *)
  200   000D             Referenced: Boolean;
  201   000D                   (* True if module referenced. Not used. *)
  202   000D             NooSegments: SegmentNoType;
  203   000D                   (* Noo Segments in module *)
  204   000D             SCTBase: SectionTableIndexType;
  205   000D                   (* Points to SCT entry just below the entries of this module.
  206   000D                      Used by putEXP during relocation of exported symbols *)
  207   000D             NooExternalImportSymbols: ExternalImportTableIndexType;
  208   000D                   (* Noo External import symbols in module *)
  209   000D             EITOffset: ExternalImportTableIndexType;
  210   000D                   (* Points to EIT entry just below the entries of this module.
  211   000D                      Used during pass 2 *)
  212   000D             SBTLinkHead: SymbolTableIndexType
  213   000D                   (* Points to first SBT entry in ordered linked list using
  214   000D                      sortlink as link field *)
  215   000D            END;
  216   000D    
  217   000D          OptionTableRecordType = RECORD
  218   000D             LogFileKind: LogFileKindType;
  219   000D             TargetFileKind: TargetFileKindType
  220   000D            END;
  221   000D    
  222   000D          SectionTableRecordType = RECORD
  223   000D             ModuleNo: ModuleTableIndexType;
  224   000D                   (* Points to MDT entry holding module description *)
  225   000D             SegmentNo: SegmentNoType;
  226   000D                   (* *)
  227   000D             ImageSize: FileAddressType;
  228   000D                   (* Size of image in quadimageunits.
  229   000D                      Size of bitmap rid in imageunits *)
  230   000D             OvrSize: FileAddressType;
  231   000D                   (* Size of overrun store in octets *)
  232   000D             RelocationConstant: FileAddressType;
  233   000D                   (* Amount (in octets) to offset section during relocation *)
  234   000D            END;
  235   000D    
  236   000D          SymbolTableRecordType = RECORD
  237   000D             ModuleNo: ModuleTableIndexType;
  238   000D                   (* if symbol resolved: Points to MDT entry of exporting module.
  239   000D                      if not            : Points to MDT entry of importing module *)
  240   000D             NameReference: NameTableIndexType;
  241   000D                   (* Points to first octet of name (length field) in NMT *)
  242   000D             SortLink: SymbolTableIndexType
  243   000D                   (* Points to SBT entry of next symbol according to
  244   000D                      some ordering (e.g. alphabetically) *)
  245   000D            END;
  246   000D    
  247   000D          ValueTableRecordType = RECORD
  248   000D             SegmentNo: SegmentNoType;
  249   000D                   (* < 0 : Symbol has not been resolved.
  250   000D                      = 0 : Symbol is absolute.
  251   000D                      0 < s <= MDT(SBT.ModuleNo).NooSegments:Symbol is relocatable
  252   000D                            and field indicates number of segment. *)
  253   000D             Value: i32
  254   000D                   (* if symbol resolved: Value of symbol.
  255   000D                      if not            : Points to EIT entry of the symbol in the
  256   000D                           reduced EIT written to targetmodule *)
  257   000D            END;
  258   000D    
  259   000D          (* Table Types *)
  260   000D    
  261   000D    
  262   000D          ExternalImportTableType = ARRAY (.ExternalImportTableSubIndexType.) OF
  263   000D                ExternalImportTableRecordType;
  264   000D    
  265   000D          FileNameTableType = ARRAY (.FileNameTableIndexType.) OF
  266   000D                FileNameTableRecordType;
  267   000D    
  268   000D          ModuleTableType = ARRAY (.ModuleTableSubIndexType.) OF
  269   000D                ModuleTableRecordType;
  270   000D    
  271   000D          OptionTableType = OptionTableRecordType;
  272   000D    
  273   000D          NameTableType = ARRAY (.NameTableSubIndexType.) OF i8;
  274   000D    
  275   000D          SectionTableType = ARRAY (.SectionTableSubIndexType.) OF
  276   000D                SectionTableRecordType;
  277   000D    
  278   000D          SymbolTableType = ARRAY (.SymbolTableSubIndexType.) OF
  279   000D                SymbolTableRecordType;
  280   000D    
  281   000D          ValueTableType =  ARRAY (.SymbolTableSubIndexType.) OF
  282   000D                ValueTableRecordType;
  283   000D    
  284   000D    
  285   000D          (* Other major data structures *)
  286   000D    
  287   000D          HeapType = ARRAY (.ModuleTableIndexType.) OF SymbolTableIndexType;
  288   000D    
  289   000D          BitMapBufferTagType = (bit, byt);
  290   000D          BitMapBufferType = RECORD
  291   000D             P: 0..16;
  292   000D             CASE BitMapBufferTagType OF
  293   000D             bit: (I: SET OF 0..15);
  294   000D             byt: (Y0: i8;
  295   000D                   Y1: i8
  296   000D                  )
  297   000D            END;
  298   000D    
  299   000D          BitMappedFileType = RECORD
  300   000D             F: BasicFileType;
  301   000D             B: BitMapBufferType
  302   000D            END;
  303   000D    
  304   000D    (*#B#*)
  305   000D    (*$I A:PrTstTyp.pas Declarations of types for PrTst package              *)
  306   000D    (* $I A:PrTstTyp.pas Declarations of types for PrTst package *)
  307   000D    
  308   000D       (* This file is part of the ProPascal test option package. Se file
  309   000D          PrTst.pas for further explanations of usage
  310   000D       *)
  311   000D    
  312   000D          test_option_type = 0..max_test_option_number;
  313   000D          test_option_set_type = SET OF test_option_type;
  314   000D    
  315   000D    
  316   000D    
  317   000D    
  318   000D       COMMON   (*LINK*)
  319   000D    
  320   000D          (* Permanent Tables *)
  321   000D    
  322   000D          OptionTable: OptionTableType;
  323   000D    
  324   000D          FileNameTable: FilenameTableType;
  325   000D          CurFileNo: FileNameTableIndexType;
  326   000D                (* Points to highest entry used *)
  327   000D    
  328   000D          ModuleTable: ModuleTableType;
  329   000D          CurModuleNo: ModuleTableIndexType;
  330   000D                (* Points to highest entry used *)
  331   000D          TargetModuleNo: ModuleTableIndexType;
  332   000D                (* Points to entry of target module *)
  333   000D    
  334   000D          SectionTable: SectionTableType;
  335   000D          SCTOffset: SectionTableIndexType;
  336   000D                (* Points to highest entry used *)
  337   000D          TargetSectionOffset: SectionTableIndexType;
  338   000D                (* Points to entry just below target sections *)
  339   000D          CurSegmentCount: SegmentNoType;
  340   000D                (* Number of segments in target module *)
  341   000D    
  342   000D          ValueTable: ValueTableType;
  343   000D          NooExpSymbols: i32;
  344   000D                (* Number of EXP symbols in target module *)
  345   000D    
  346   000D          ExternalImportTable: ExternalImportTableType;
  347   000D          CurExternalImportSymbolNo: ExternalImportTableIndexType;
  348   000D                (* Points to highest entry used *)
  349   000D          NooExiSymbols: i32;
  350   000D                (* Number of EXI symbols in target module *)
  351   000D    
  352   000D    (*#B#*)
  353   000D    (*$I A:PrTstCom.pas Declarations of global variables for PrTst package   *)
  354   000D    (* $I A:PrTstCom.pas Declarations of global variables for PrTst package *)
  355   000D    
  356   000D       (* This file is part of the ProPascal test option package. Se file
  357   000D          PrTst.pas for further explanations of usage
  358   000D       *)
  359   000D    
  360   000D          test_options: test_option_set_type;
  361   000D          test_out: text;
  362   000D          test_global: boolean;
  363   000D    
  364   000D    
  365   000D    
  366   000D    (*                                                                            *)
  367   000D    (*                                                                            *)
  368   000D    (******************************************************************************)
  369   000D    
  370   000D    
  371   000D       VAR   (*LINK*)
  372   000D    
  373   000D          (* Misc. Variables *)
  374   000D    
  375   000D          Status: StatusType;
  376   000D          TargetFile: FileType;
  377   000D          LogFile: LogFileType;
  378   000D          SCTSubInx: SectionTableSubIndexType;
  379   000D    
  380   000D    (*#B#*)
  381   000D    (*$I A:PrTstExt.pas External Decl. of standard test procedures           *)
  382   000D    (* $I A:ProTstExt.pas Declarations of external procedures for ProTst package *)
  383   000D    
  384   000D       (* This file is part of the ProPascal test option package. Se file
  385   000D          ProTst.pas for further explanations of usage
  386   000D       *)
  387   000D    
  388   000D       FUNCTION test(list: test_option_set_type
  389   000D                    ): boolean; EXTERNAL;
  390   000D    
  391   000D       PROCEDURE test_init(VAR in_file,
  392   000D                               out_file: text
  393   000D                          ); EXTERNAL;
  394   000D    
  395   000D    
  396   000D    (*#B#*)
  397   000D    (*$I B:LnkDF1.pas   Global test output primitives                        *)
  398   000D    (******************************************************************************)
  399   000D    (*                                                                            *)
  400   000D    (*   Copyright (1985) by Metanic Aps., Denmark                                *)
  401   000D    (*                                                                            *)
  402   000D    (*   Author: Lars Gregers Jakobsen.                                           *)
  403   000D    (*                                                                            *)
  404   000D    (******************************************************************************)
  405   000D    
  406   000D       (* File LnkDF1 defines the test output primitives used for debugging
  407   000D          program link and its associated subroutines and functions.
  408   000D       *)
  409   000D    
  410   000D       FUNCTION memavail: integer; EXTERNAL;
  411   000D    
  412   000D       PROCEDURE TSTasc(N: i8
  413   000D                       );
  414   000D    
  415   000D         BEGIN (*TSTASC*)
  416   000D          IF (31 < N) and (N < 127) THEN
  417   0031             write(TestOut, chr(N) )
  418   004A          ELSE
  419   004F             write(TestOut, '+')
  420   0067         END;  (*TSTASC*)
  421   0070    
  422   0070       PROCEDURE TSThex(N: i8
  423   0070                       );
  424   0070    
  425   0070          VAR
  426   0070             Nibble: i8;
  427   0070    
  428   0070         BEGIN (*TSTHEX*)
  429   0070          Nibble := N div 16;
  430   008F          IF Nibble < 10 THEN
  431   0098             write(TestOut, chr( ord('0') + Nibble ) )
  432   00B8          ELSE
  433   00BD             write(TestOut, chr( ord('A') - 10 + Nibble ) );
  434   00E0          Nibble := N mod 16;
  435   00F1          IF Nibble < 10 THEN
  436   00FA             write(TestOut, chr( ord('0') + Nibble ) )
  437   011A          ELSE
  438   011F             write(TestOut, chr( ord('A') - 10 + Nibble ) )
  439   013F         END;  (*TSTHEX*)
  440   0148    
  441   0148       PROCEDURE TSTbool(A: boolean
  442   0148                        );
  443   0148    
  444   0148         BEGIN (*TSTBOOL*)
  445   0148          IF A THEN
  446   015B             write(TestOut, 'T')
  447   0173          ELSE
  448   0178             write(TestOut, 'F')
  449   0190         END;  (*TSTBOOL*)
  450   0199    
  451   0199       PROCEDURE TSTindt;
  452   0199    
  453   0199         BEGIN (*TSTindt*)
  454   0199          write(TestOut, ' ':3)
  455   01B9         END;  (*TSTindt*)
  456   01C2    
  457   01C2       PROCEDURE TSTln;
  458   01C2    
  459   01C2         BEGIN (*TSTln*)
  460   01C2          writeln(TestOut)
  461   01D9         END;  (*TSTln*)
  462   01E2    
  463   01E2       PROCEDURE TSTsymbol(S: SymbolNameType
  464   01E2                          );
  465   01E2    
  466   01E2          VAR
  467   01E2             I: SymbolNameIndexType;
  468   01E2    
  469   01E2         BEGIN (*TSTSYMBOL*)
  470   01E2          WITH S DO
  471   0204            BEGIN
  472   0209             write(TestOut, 'SYMBOLÆ', Length:1, 'Å=');
  473   024F             FOR I := 1 TO Length DO
  474   0268                TSTasc(Name(.I.));
  475   028E             TSTln;
  476   0296            END
  477   0296         END;  (*TSTSYMBOL*)
  478   029C    
  479   029C       PROCEDURE TSTstat(Status: StatusType
  480   029C                    );
  481   029C    
  482   029C          VAR
  483   029C             Inx: StatusBaseType;
  484   029C    
  485   029C         BEGIN (*TSTstat*)
  486   029C          write(TestOut, 'STAT=(');
  487   02C9          IF Status = (..) THEN
  488   02E2             write(TestOut, 'SUCCESS)' )
  489   0306          ELSE
  490   030C            BEGIN
  491   0311             FOR Inx := succ(Success) TO Error DO
  492   0322                IF Inx IN Status THEN
  493   0339                   write(TestOut, ' ', ord(Inx):1);
  494   036D            write(TestOut, ' )');
  495   038E           END
  496   038E         END;  (*TSTstat*)
  497   0394    
  498   0394       PROCEDURE TSTmem;
  499   0394    
  500   0394         BEGIN (*TSTmem*)
  501   0394          write(TestOut, 'MEMAVAIL=', memavail:1)
  502   03CC         END;  (*TSTmem*)
  503   03D5    
  504   03D5       PROCEDURE TSTeit(Inx: ExternalImportTableIndexType
  505   03D5                    );
  506   03D5    
  507   03D5         BEGIN (*TSTeit*)
  508   03D5          WITH ExternalImportTable(.Inx.) DO
  509   03F6             writeln(TestOut, 'EITÆ', Inx:1, '/', CurExternalImportSymbolNo:1,
  510   0441                                 'Å=(SblNo=', SymbolNo:1, ')' )
  511   0475         END;  (*TSTeit*)
  512   047E    
  513   047E       PROCEDURE TSTfnt(Inx: FileNameTableIndexType
  514   047E                    );
  515   047E    
  516   047E         BEGIN (*TSTfnt*)
  517   047E          writeln(TestOut, 'FNTÆ', Inx:1, '/', CurFileNo:1,
  518   04D1                              'Å=(FlNm=', FileNameTable(.inx.), ')' )
  519   050C         END;  (*TSTfnt*)
  520   0515    
  521   0515       PROCEDURE TSTheap(Heap: HeapType
  522   0515                        ;HeapMax: ModuleTableIndexType
  523   0515                        );
  524   0515    
  525   0515          VAR
  526   0515             I: ModuleTableIndexType;
  527   0515    
  528   0515         BEGIN (*TSTHEAP*)
  529   0515          TSTindt; TSTindt; TSTindt;
  530   0540          write(TestOut, 'HeapÆ',HeapMax:2,'Å=(' );
  531   0585          FOR I := 1 TO HeapMax DO
  532   059E             write(TestOut, Heap(.I.):2, ' ':1);
  533   05E4          writeln(TestOut, ')');
  534   05FF         END;  (*TSTHEAP*)
  535   0605    
  536   0605       PROCEDURE TSTmdt(Inx: ModuleTableIndexType
  537   0605                    );
  538   0605    
  539   0605         BEGIN (*TST*)
  540   0605          WITH moduleTable(.Inx.) DO
  541   062C            BEGIN
  542   0631             write(TestOut, 'MDTÆ', Inx:1, '/', CurModuleNo:1,
  543   067C                               'Å=(MdNm#=', ModuleNameReference:1, ' ':2
  544   06AA                                  ,'Fn#=', FileNameReference:1, ' ':2
  545   06DA                                  ,'CurFlAddr=', CurrentFileAddress:1, ' ':2
  546   070D                                  ,'Refd='
  547   071B                   );
  548   0728             TSTbool(Referenced);
  549   073F             TSTln;
  550   0747             TSTindt; TSTindt; TSTindt;
  551   0755             writeln(TestOut      ,'SCTbase=', SCTbase:1, ' ':2
  552   0795                                  ,'#Sgm=', NooSegments:1, ' ':2
  553   07C9                                  ,'EIT#=', EITOffset:1, ' ':2
  554   07FD                                  ,'#EIsbl=', NooExternalImportSymbols:1, ' ':2
  555   0833                                  ,'SBTLH=', SBTlinkHead:1
  556   085F                                  ,')'
  557   0865                  );
  558   0871            END
  559   0871         END;  (*TST*)
  560   0877    
  561   0877       PROCEDURE TSTopt;
  562   0877    
  563   0877         BEGIN (*TSTopt*)
  564   0877          writeln(TestOut, 'OPT=(LogKind=', ord(OptionTable.LogFileKind):1, ' ':2
  565   08BA                                ,'TargetKind=', ord(OptionTable.TargetFileKind):1
  566   08E1                                ,')' )
  567   08F0         END;  (*TSTopt*)
  568   08F9    
  569   08F9       PROCEDURE TSTsct(Inx: SectionTableIndexType
  570   08F9                    );
  571   08F9    
  572   08F9         BEGIN (*TSTsct*)
  573   08F9          WITH SectionTable(.Inx.) DO
  574   0920            BEGIN
  575   0925             writeln(TestOut, 'SCT=Æ', Inx:1, '/', SCTOffset:1, '/', CurSegmentCount:1
  576   0985                             ,'Å=(Mdl#=', ModuleNo:1, ' ':2
  577   09B8                             ,'Sgm#=', SegmentNo:1
  578   09E0                    );
  579   09E9             writeln(TestOut, '         ImgSz=', ImageSize, ' ':2
  580   0A2A                             ,'OvrSz=', OvrSize, ' ':2
  581   0A5B                             ,'RlConst=', RelocationConstant
  582   0A76                             ,')'
  583   0A8B                    );
  584   0A97            END
  585   0A97         END;  (*TSTsct*)
  586   0A9D    
  587   0A9D       PROCEDURE TSTvlt(Inx: SymbolTableIndexType
  588   0A9D                    );
  589   0A9D    
  590   0A9D         BEGIN (*TSTvlt*)
  591   0A9D          WITH ValueTable(.Inx.) DO
  592   0AC4            BEGIN
  593   0AC9             write(TestOut, 'VLTÆ',Inx:1,'Å=(Segm#=', SegmentNo:1
  594   0B1F                          , '  Value=', Value:1, ')' )
  595   0B55            END
  596   0B58         END;  (*TSTvlt*)
  597   0B5E    
  598   0B5E    (*                                                                            *)
  599   0B5E    (*                                                                            *)
  600   0B5E    (******************************************************************************)
  601   0B5E    
  602   0B5E    (*$I B:LnkDF2.pas   Global access primitives                                  *)
  603   0B5E    (******************************************************************************)
  604   0B5E    (*                                                                            *)
  605   0B5E    (*   Copyright (1985) by Metanic Aps., Denmark                                *)
  606   0B5E    (*                                                                            *)
  607   0B5E    (*   Author: Lars Gregers Jakobsen.                                           *)
  608   0B5E    (*                                                                            *)
  609   0B5E    (******************************************************************************)
  610   0B5E    
  611   0B5E       (* File LnkDF2X holds the access primitives used by the
  612   0B5E          linker to access input and output files. *)
  613   0B5E    
  614   0B5E         FUNCTION OPTLFK: LogFileKindType;
  615   0B5E    
  616   0B5E           BEGIN (*OPTLFK*)
  617   0B5E            optlfk := OptionTable.LogFileKind;
  618   0B74           END;  (*OPTLFK*)
  619   0B7A    
  620   0B7A         PROCEDURE FNTP(VAR Status: StatusType
  621   0B7A                        ;    FileName: FileNameType
  622   0B7A                        );
  623   0B7A    
  624   0B7A            BEGIN (*FNTP*)
  625   0B7A             IF CurFileNo < MaxNooInputFiles THEN
  626   0B92               BEGIN
  627   0B97                CurFileNo := CurFileNo + 1;
  628   0BAD                FileNameTable(.CurFileNo.) := FileName;
  629   0BD7               END
  630   0BD7             ELSE
  631   0BD9                Status := Status + (.FileNameTableOverFlow.);
  632   0C00    (*#B#*)
  633   0C00             IF test((.0,6.)) THEN
  634   0C16               BEGIN
  635   0C1B                write(TestOut, 'FNTP     '); TSTstat(Status); TSTindt;
  636   0C5A                TSTfnt(CurFileNo); TSTln
  637   0C69               END
  638   0C6C    (*#E#*)
  639   0C6C            END;  (*FNTP*)
  640   0C72    
  641   0C72       PROCEDURE EITP(VAR Status: StatusType
  642   0C72                     ;    SymbolTableEntryNo: SymbolTableIndexType
  643   0C72                     );
  644   0C72    
  645   0C72         BEGIN (*EITP*)
  646   0C72          IF CurExternalImportSymbolNo < MaxNooExternalImportSymbols THEN
  647   0C8A            BEGIN
  648   0C8F             CurExternalImportSymbolNo := CurExternalImportSymbolNo + 1;
  649   0CA5             ExternalImportTable(.CurExternalImportSymbolNo
  650   0CAA                                .).SymbolNo := SymbolTableEntryNo
  651   0CB5            END
  652   0CBE          ELSE
  653   0CC0             Status := Status + (.ExternalImportTableOverFlow.);
  654   0CE8    (*#B#*)
  655   0CE8          IF test((.0,7.)) THEN
  656   0CFE            BEGIN
  657   0D03             write(TestOut, 'EITP     '); TSTstat(Status); TSTln;
  658   0D42             TSTeit(CurExternalImportSymbolNo)
  659   0D4E            END
  660   0D51    (*#E#*)
  661   0D51         END;  (*EITP*)
  662   0D57    
  663   0D57    (* ModuleTable *)
  664   0D57    
  665   0D57       PROCEDURE MDTA(VAR Status: StatusType
  666   0D57                     ;VAR ModuleNo: ModuleTableIndexType  (*Points to least, vacant entry in MDT*)
  667   0D57                     ;    ModuleCount: ModuleTableIndexType
  668   0D57                     );
  669   0D57    
  670   0D57         BEGIN (*MDTA*)
  671   0D57          ModuleNo := CurModuleNo;
  672   0D73          IF CurModuleNo > MaxNooModules - ModuleCount THEN
  673   0D9A             Status := Status + (.ModuleTableOverFlow.)
  674   0DB0          ELSE
  675   0DC3            BEGIN
  676   0DC8             ModuleNo := CurModuleNo + 1;
  677   0DE4             CurModuleNo := CurModuleNo + ModuleCount;
  678   0E01            END;
  679   0E01    (*#B#*)
  680   0E01          IF test((.0,6.)) THEN
  681   0E18            BEGIN
  682   0E1D             write(TestOut, 'MDTA     '); TSTstat(Status); TSTindt;
  683   0E5C             writeln(TestOut, 'ModuleNo, Count, CurModuleNo= ',
  684   0E96                               ModuleNo:1, ' ',
  685   0EB4                               ModuleCount:1, ' ', CurModuleNo:1
  686   0ED9                   );
  687   0EE2            END;
  688   0EE2    (*#E#*)
  689   0EE2         END;  (*MDTA*)
  690   0EE8    
  691   0EE8     (* SectionTable *)
  692   0EE8    
  693   0EE8       PROCEDURE SCTA(VAR Status: StatusType
  694   0EE8                     ;VAR SectionNo: SectionTableIndexType  (*Points to highest, used entry in SCT*)
  695   0EE8                     ;    SectionCount: SegmentNoType
  696   0EE8                     );
  697   0EE8    
  698   0EE8         BEGIN (*SCTA*)
  699   0EE8          SectionNo := SCTOffset;
  700   0F04          IF SCTOffset > MaxNooSections - SectionCount THEN
  701   0F2B             Status := Status + (.SectionTableOverFlow.)
  702   0F41          ELSE
  703   0F54            BEGIN
  704   0F59             SCTOffset := SCTOffset + SectionCount;
  705   0F76            END;
  706   0F76    (*#B#*)
  707   0F76          IF test((.0,6.)) THEN
  708   0F8D            BEGIN
  709   0F92             write(TestOut, 'SCTA     '); TSTstat(Status); TSTindt;
  710   0FD1             writeln(TestOut, 'SectionNo, Count, SCTOffset= ',
  711   100A                               SectionNo:11, ' ', SectionCount:1, ' ',
  712   1042                               SCTOffset:1
  713   104D                    );
  714   1056            END;
  715   1056    (*#E#*)
  716   1056         END;  (*SCTA*)
  717   105C    
  718   105C    (*                                                                            *)
  719   105C    (*                                                                            *)
  720   105C    (******************************************************************************)
  721   105C    
  722   105C    
  723   105C    
  724   105C    (*$I B:LnkDF7.pas   Log File access primitives                                *)
  725   105C    (******************************************************************************)
  726   105C    (*                                                                            *)
  727   105C    (*   Copyright (1985) by Metanic Aps., Denmark                                *)
  728   105C    (*                                                                            *)
  729   105C    (*   Author: Lars Gregers Jakobsen.                                           *)
  730   105C    (*                                                                            *)
  731   105C    (******************************************************************************)
  732   105C    
  733   105C    
  734   105C          PROCEDURE WriteSymbolName(VAR F: text
  735   105C                                   ;    SymbolName: SymbolNameType
  736   105C                                   ;    FieldSize: i8
  737   105C                                   );
  738   105C    
  739   105C             VAR
  740   105C                I: i8;
  741   105C                N: i8;
  742   105C    
  743   105C            BEGIN (*WRITESYMBOLNAME*)
  744   105C             WITH SymbolName DO
  745   107E               BEGIN
  746   1083                IF Length < FieldSize THEN
  747   109B                   N := Length
  748   10A0                ELSE
  749   10AC                   N := FieldSize;
  750   10B7                FOR I := 1 TO N DO
  751   10CD                   IF Name(.I.) in (.32..127.) THEN
  752   1104                      write(F, chr(Name(.I.)) );
  753   1145                FOR I := N+1 TO FieldSize DO
  754   1167                   write(F, ' ');
  755   1193               END
  756   1193            END;  (*WRITESYMBOLNAME*)
  757   1199    
  758   1199          PROCEDURE LogInit(VAR LogFile: LogFileType
  759   1199                           ;    FileName: FileNameType
  760   1199                           );
  761   1199    
  762   1199            BEGIN (*LOGINIT*)
  763   1199             WITH LogFile DO
  764   11B2               BEGIN
  765   11B7                assign(F, FileName);
  766   11CE                rewrite(F);
  767   11E1                P := 0;
  768   11F8                L := LogFilePageSize;
  769   1209               END
  770   1209            END;  (*LOGINIT*)
  771   120F    
  772   120F          PROCEDURE LogTerm(VAR LogFile: LogFileType
  773   120F                           );
  774   120F    
  775   120F            BEGIN (*LOGTERM*)
  776   120F             WITH LogFile DO
  777   1228               BEGIN
  778   122D                close(F);
  779   123A               END
  780   123A            END;  (*LOGTERM*)
  781   1240    
  782   1240          FUNCTION LogFF(VAR LogFile: LogFileType
  783   1240                        ;    Delta: LineNoType
  784   1240                        ): boolean;
  785   1240    
  786   1240             CONST
  787   1240                LogFFDelta = 5;
  788   1240    
  789   1240            BEGIN (*LOGFF*)
  790   1240             WITH LogFile DO
  791   1259                IF L >= LogFilePageSize - Delta THEN
  792   127F                  BEGIN
  793   1284                   LogFF := true;
  794   128D                   P := P + 1;
  795   12AC                   L := LogFFDelta;
  796   12BD                   page(F);
  797   12D0                   writeln(F);
  798   12E9                   writeln(F);
  799   1302                   writeln(F, ' ':LogMargin, 'LINKER '
  800   132B                            , VersionNo, ' '
  801   1342                            , ConfigurationNo
  802   134B                            , ' ':30
  803   135B                            , 'SIDE # ', P:2);
  804   138B                   writeln(F);
  805   13A4                   writeln(F);
  806   13BD                  END
  807   13BD                ELSE
  808   13BF                   LogFF := false;
  809   13C8            END;  (*LOGFF*)
  810   13D1    
  811   13D1          PROCEDURE LogCmd(VAR LogFile: LogFileType
  812   13D1                          ;    CommandLine: CommandLineType
  813   13D1                          );
  814   13D1    
  815   13D1             CONST Delta = 5;
  816   13D1    
  817   13D1            BEGIN (*LOGCMD*)
  818   13D1             IF OptionTable.LogFileKind <> none THEN
  819   13E6               BEGIN
  820   13EB                IF LogFF(LogFile, Delta) THEN BEGIN END;
  821   1400                WITH LogFile DO
  822   1411                  BEGIN
  823   1416                   writeln(F);
  824   142F                   writeln(F, ' ':LogMargin, 'AKTIVERINGSKOMMANDO: ');
  825   1473                   writeln(F);
  826   148C                   writeln(F, ' ':LogMargin, CommandLine);
  827   14BE                   writeln(F);
  828   14D7                  END
  829   14D7               END
  830   14D7            END;  (*LOGCMD*)
  831   14DD    
  832   14DD          PROCEDURE LogHSsgd(VAR LogFile: LogFileType
  833   14DD                            );
  834   14DD    
  835   14DD            BEGIN (*LOGHSSGD*)
  836   14DD             IF OptionTable.LogFileKind <> none THEN
  837   14F2                WITH LogFile DO
  838   1503                  BEGIN
  839   1508                   L := L + 2;
  840   1529                   writeln(F, ' ':LogMargin, 'SGM'
  841   154E                            , ' ':2,         'ADRESSE':9
  842   156F                            , ' ':2,         'STØRRELSE'
  843   158A                            , ' ':2,         'MODUL'
  844   15A5                          );
  845   15B2                   writeln(F);
  846   15CB                  END
  847   15CB            END;  (*LOGHSSGD*)
  848   15D1    
  849   15D1          PROCEDURE LogHsgd(VAR LogFile: LogFileType
  850   15D1                           );
  851   15D1    
  852   15D1            BEGIN (*LOGHSGD*)
  853   15D1             IF OptionTable.LogFileKind <> none THEN
  854   15E6               BEGIN
  855   15EB                IF LogFF(LogFile, 6) THEN BEGIN END;
  856   1600                WITH LogFile DO
  857   1611                  BEGIN
  858   1616                   L := L + 3;
  859   1637                   writeln(F);
  860   1650                   writeln(F, ' ':LogMargin, 'LOKALISERINGSPLAN:');
  861   1691                   writeln(F);
  862   16AA                  END;
  863   16AA                LogHSsgd(LogFile);
  864   16B9               END;
  865   16B9            END;  (*LOGHSGD*)
  866   16BF    
  867   16BF          PROCEDURE LogSGD(VAR LogFile: LogFileType
  868   16BF                          ;    SegmentNo: RelocationIndicatorType
  869   16BF                          ;    StartAddress: FileAddressType
  870   16BF                          ;    Size: FileAddressType
  871   16BF                          ;    ModuleName: SymbolNameType
  872   16BF                          );
  873   16BF    
  874   16BF            BEGIN (*LOGSGD*)
  875   16BF             IF OptionTable.LogFileKind <> none THEN
  876   16E9               BEGIN
  877   16EE                IF LogFF(LogFile, 1) THEN
  878   1703                   LogHSsgd(LogFile);
  879   1712                WITH LogFile DO
  880   1723                  BEGIN
  881   1728                   L := L + 1;
  882   1746                   write(F, ' ':LogMargin, SegmentNo:3
  883   1770                          , ' ':2,         StartAddress:9
  884   1785                          , ' ':2,         Size:9
  885   179A                          , ' ':2
  886   17A3                        );
  887   17AC                   WriteSymbolName(F, ModuleName, 20);
  888   17C6                   writeln(F);
  889   17DF                  END;
  890   17DF               END
  891   17DF            END;  (*LOGSGD*)
  892   17E5    
  893   17E5          PROCEDURE LogHSxp(VAR LogFile: LogFileType
  894   17E5                           );
  895   17E5    
  896   17E5            BEGIN (*LOGHSXP*)
  897   17E5             IF OptionTable.LogFileKind <> none THEN
  898   17FA                WITH LogFile DO
  899   180B                  BEGIN
  900   1810                   L := L + 2;
  901   1831                   writeln(F, ' ':LogMargin, 'SGM'
  902   1856                            , ' ':2,         'VÆRDI':9
  903   1875                            , ' ':2,         'SYMBOL', ' ':14
  904   189A                            , ' ':2,         'MODUL'
  905   18B1                          );
  906   18BE                   writeln(F);
  907   18D7                  END
  908   18D7            END;  (*LOGHSXP*)
  909   18DD    
  910   18DD          PROCEDURE LogHxpN(VAR LogFile: LogFileType
  911   18DD                           );
  912   18DD    
  913   18DD            BEGIN (*LOGHXPN*)
  914   18DD             IF OptionTable.LogFileKind <> none THEN
  915   18F2               BEGIN
  916   18F7                IF LogFF(LogFile, 6) THEN BEGIN END;
  917   190C                WITH LogFile DO
  918   191D                  BEGIN
  919   1922                   L := L + 3;
  920   1943                   writeln(F);
  921   195C                   writeln(F, ' ':LogMargin, 'EXPORTEREDE SYMBOLER (NAVNEORDEN):');
  922   19AD                   writeln(F);
  923   19C6                  END;
  924   19C6                LogHSxp(LogFile);
  925   19D5               END
  926   19D5            END;  (*LOGHXPN*)
  927   19DB    
  928   19DB          PROCEDURE LogHxpV(VAR LogFile: LogFileType
  929   19DB                           );
  930   19DB    
  931   19DB            BEGIN (*LOGHXPV*)
  932   19DB             IF OptionTable.LogFileKind <> none THEN
  933   19F0               BEGIN
  934   19F5                IF LogFF(LogFile, 6) THEN BEGIN END;
  935   1A0A                WITH LogFile DO
  936   1A1B                  BEGIN
  937   1A20                   L := L + 3;
  938   1A41                   writeln(F);
  939   1A5A                   writeln(F, ' ':LogMargin, 'EXPORTEREDE SYMBOLER (VÆRDIORDEN):');
  940   1AAB                   writeln(F);
  941   1AC4                  END;
  942   1AC4                LogHSxp(LogFile);
  943   1AD3               END
  944   1AD3            END;  (*LOGHXPV*)
  945   1AD9    
  946   1AD9          PROCEDURE LogXP(VAR LogFile: LogFileType
  947   1AD9                         ;    SegmentNo: RelocationIndicatorType
  948   1AD9                         ;    Value: i32
  949   1AD9                         ;    SymbolName: SymbolNameType
  950   1AD9                         ;    ModuleName: ModuleNameType
  951   1AD9                         );
  952   1AD9    
  953   1AD9            BEGIN (*LOGXP*)
  954   1AD9             IF OptionTable.LogFileKind <> none THEN
  955   1B18               BEGIN
  956   1B1D                IF LogFF(LogFile,1) THEN
  957   1B32                   LogHSxp(LogFile);
  958   1B41                WITH LogFile DO
  959   1B52                  BEGIN
  960   1B57                   L := L + 1;
  961   1B75                   write(F, ' ':LogMargin, SegmentNo:3
  962   1B9F                          , ' ':2,         Value:9
  963   1BB4                          , ' ':2
  964   1BBD                        );
  965   1BC6                   WriteSymbolName(F, SymbolName, 20);
  966   1BE0                   write(F, ' ':2);
  967   1C02                   WriteSymbolName(F, ModuleName, 20);
  968   1C1C                   writeln(F);
  969   1C35                  END
  970   1C35               END
  971   1C35            END;  (*LOGXP*)
  972   1C3B    
  973   1C3B          PROCEDURE LogHSurs(VAR LogFile: LogFileType
  974   1C3B                            );
  975   1C3B    
  976   1C3B            BEGIN (*LOGHSURS*)
  977   1C3B             IF OptionTable.LogFileKind <> none THEN
  978   1C50               BEGIN
  979   1C55                WITH LogFile DO
  980   1C66                  BEGIN
  981   1C6B                   L := L + 2;
  982   1C8C                   writeln(F, ' ':LogMargin
  983   1CA5                            , ' ':16,        'SYMBOL', ' ':14
  984   1CCA                            , ' ':2,         'MODUL');
  985   1CEE                   writeln(F);
  986   1D07                  END
  987   1D07               END
  988   1D07            END;  (*LOGHSURS*)
  989   1D0D    
  990   1D0D          PROCEDURE LogHurs(VAR LogFile: LogFileType
  991   1D0D                           );
  992   1D0D    
  993   1D0D            BEGIN (*LOGHURS*)
  994   1D0D             IF OptionTable.LogFileKind <> none THEN
  995   1D22               BEGIN
  996   1D27                IF LogFF(LogFile, 6)THEN BEGIN END;
  997   1D3C                WITH LogFile DO
  998   1D4D                  BEGIN
  999   1D52                   L := L + 3;
 1000   1D73                   writeln(F);
 1001   1D8C                   writeln(F, ' ':LogMargin, 'UTILFREDSSTILLEDE REFERENCER:');
 1002   1DD8                   writeln(F);
 1003   1DF1                  END;
 1004   1DF1                LogHSurs(LogFile);
 1005   1E00               END
 1006   1E00            END;  (*LOGHURS*)
 1007   1E06    
 1008   1E06          PROCEDURE LogURS(VAR LogFile: LogFileType
 1009   1E06                          ;    ModuleName: ModuleNameType
 1010   1E06                          ;    SymbolName: SymbolNameType
 1011   1E06                          );
 1012   1E06    
 1013   1E06            BEGIN (*LOGURS*)
 1014   1E06             IF OptionTable.LogFileKind <> none THEN
 1015   1E45               BEGIN
 1016   1E4A                IF LogFF(LogFile, 1) THEN
 1017   1E5F                  LogHSurs(LogFile);
 1018   1E6E                WITH LogFile DO
 1019   1E7F                  BEGIN
 1020   1E84                   L := L + 1;
 1021   1EA2                   write(F, ' ':LogMargin
 1022   1EBB                          , ' ':16
 1023   1EC4                        );
 1024   1ECD                   WriteSymbolName(F, SymbolName, 20);
 1025   1EE7                   write(F, ' ':2);
 1026   1F09                   WriteSymbolName(F, ModuleName, 20);
 1027   1F23                   writeln(F);
 1028   1F3C                  END
 1029   1F3C               END
 1030   1F3C            END;  (*LOGURS*)
 1031   1F42    
 1032   1F42          PROCEDURE LogHSdds(VAR LogFile: LogFileType
 1033   1F42                            );
 1034   1F42    
 1035   1F42            BEGIN (*LOGHSDDS*)
 1036   1F42             IF OptionTable.LogFileKind <> none THEN
 1037   1F57                WITH LogFile DO
 1038   1F68                  BEGIN
 1039   1F6D                   L := L + 2;
 1040   1F8E                   writeln(F, ' ':LogMargin, 'SGM'
 1041   1FB3                            , ' ':2,         'VÆRDI':9
 1042   1FD2                            , ' ':2,         'SYMBOL', ' ':14
 1043   1FF7                            , ' ':2,         'MODUL'
 1044   200E                          );
 1045   201B                   writeln(F);
 1046   2034                  END;
 1047   2034            END;  (*LOGHSDDS*)
 1048   203A    
 1049   203A          PROCEDURE LogHdds(VAR LogFile: LogFileType
 1050   203A                           );
 1051   203A    
 1052   203A            BEGIN (*LOGHDDS*)
 1053   203A             IF OptionTable.LogFileKind <> none THEN
 1054   204F               BEGIN
 1055   2054                IF LogFF(LogFile, 6) THEN BEGIN END;
 1056   2069                WITH LogFile DO
 1057   207A                  BEGIN
 1058   207F                   L := L + 2;
 1059   20A0                   writeln(F);
 1060   20B9                   writeln(F, ' ':LogMargin, 'DOBBELTDEFINEREDE SYMBOLER:');
 1061   2103                   writeln(F);
 1062   211C                  END;
 1063   211C                 LogHSdds(LogFile);
 1064   212B                END
 1065   212B            END;  (*LOGHDDS*)
 1066   2131    
 1067   2131          PROCEDURE LogDDS(VAR LogFile: LogFileType
 1068   2131                          ;    RelocationIndicator: RelocationIndicatorType
 1069   2131                          ;    Value: i32
 1070   2131                          ;    SymbolName: SymbolNameType
 1071   2131                          ;    ModuleName: ModuleNameType
 1072   2131                          );
 1073   2131    
 1074   2131            BEGIN (*LOGDDS*)
 1075   2131             IF OptionTable.LogFileKind <> none THEN
 1076   2170               BEGIN
 1077   2175                IF LogFF(LogFile, 1) THEN
 1078   218A                   LogHSdds(LogFile);
 1079   2199                WITH LogFile DO
 1080   21AA                  BEGIN
 1081   21AF                   L := L + 1;
 1082   21CD                   write(F, ' ':LogMargin, ord(RelocationIndicator):3
 1083   21F7                          , ' ':2,         Value:9
 1084   220C                          , ' ':2
 1085   2215                        );
 1086   221E                   WriteSymbolName(F, SymbolName, 20);
 1087   2238                   write(F, ' ':2);
 1088   225A                   WriteSymbolName(F, ModuleName, 20);
 1089   2274                   writeln(F);
 1090   228D                  END
 1091   228D               END
 1092   228D            END;  (*LOGDDS*)
 1093   2293    
 1094   2293          PROCEDURE LogOFFerror(VAR LogFile: LogFileType
 1095   2293                               ;    FileNo: FileNameTableIndexType
 1096   2293                               );
 1097   2293    
 1098   2293            BEGIN (*LOGOFFERROR*)
 1099   2293             IF OptionTable.LogFileKind <> none THEN
 1100   22A8               BEGIN
 1101   22AD                IF LogFF(LogFile, 2) THEN BEGIN END;
 1102   22C2                WITH LogFile DO
 1103   22D3                  BEGIN
 1104   22D8                   L := L + 2;
 1105   22F9                   writeln(F, ' ':LogMargin, '*** FILFORMATFEJL *** FIL # ', FileNo:1
 1106   234C                                    , ' ***'
 1107   2359                          );
 1108   2366                  END;
 1109   2366               END
 1110   2366            END;  (*LOGOFFERROR*)
 1111   236C    
 1112   236C    
 1113   236C          PROCEDURE LogOMFerror(VAR LogFile: LogFileType
 1114   236C                               ;    FileNo: FileNameTableIndexType
 1115   236C                               ;    Position: FileAddressType
 1116   236C                               );
 1117   236C    
 1118   236C            BEGIN (*LOGOMFERROR*)
 1119   236C             IF OptionTable.LogFileKind <> none THEN
 1120   2381               BEGIN
 1121   2386                IF LogFF(LogFile, 2) THEN BEGIN END;
 1122   239B                WITH LogFile DO
 1123   23AC                  BEGIN
 1124   23B1                   L := L + 2;
 1125   23D2                   writeln(F, ' ':LogMargin, '*** MODULFORMATFEJL *** FIL # ', FileNo:1
 1126   2427                                   , ' *** POSITION # ', Position:1
 1127   2450                                   , ' ***'
 1128   245D                          );
 1129   246A                  END;
 1130   246A               END
 1131   246A            END;  (*LOGOMFERROR*)
 1132   2470    
 1133   2470          PROCEDURE LogEOFerror(VAR LogFile: LogFileType
 1134   2470                               ;    FileNo: FileNameTableIndexType
 1135   2470                               ;    Position: FileAddressType
 1136   2470                               );
 1137   2470    
 1138   2470            BEGIN (*LOGEOFERROR*)
 1139   2470             IF OptionTable.LogFileKind <> none THEN
 1140   2485               BEGIN
 1141   248A                IF LogFF(LogFile, 2) THEN BEGIN END;
 1142   249F                WITH LogFile DO
 1143   24B0                  BEGIN
 1144   24B5                   L := L + 2;
 1145   24D6                   writeln(F, ' ':LogMargin, '*** FILLÆNGDEFEJL *** FIL # ', FileNo:1
 1146   2529                                           , ' *** POSITION # ', Position:1
 1147   2552                                           , ' ***'
 1148   255F                          );
 1149   256C                  END;
 1150   256C               END
 1151   256C            END;  (*LOGEOFERROR*)
 1152   2572    
 1153   2572    (*                                                                            *)
 1154   2572    (*                                                                            *)
 1155   2572    (******************************************************************************)
 1156   2572    
 1157   2572    
 1158   2572    (*$I B:LnkDF8.pas   Object File access primitives                             *)
 1159   2572    (******************************************************************************)
 1160   2572    (*                                                                            *)
 1161   2572    (*   Copyright (1985) by Metanic Aps., Denmark                                *)
 1162   2572    (*                                                                            *)
 1163   2572    (*   Author: Lars Gregers Jakobsen.                                           *)
 1164   2572    (*                                                                            *)
 1165   2572    (******************************************************************************)
 1166   2572    
 1167   2572          PROCEDURE FilAsg(VAR Fl: FileType
 1168   2572                          ;Fn: FileNameType
 1169   2572                          );
 1170   2572    
 1171   2572            BEGIN (*FILASG*)
 1172   2572    (*#B#*)
 1173   2572             IF test((.0,1.)) THEN
 1174   2590                writeln(TestOut, 'FILasg   FlNm=', Fn);
 1175   25CD    (*#E#*)
 1176   25CD             assign(Fl.F, Fn)
 1177   25EA            END;  (*FILASG*)
 1178   25F0    
 1179   25F0          PROCEDURE FilRst(VAR Status: StatusType
 1180   25F0                          ;VAR Fl: FileType
 1181   25F0                          );
 1182   25F0    
 1183   25F0            BEGIN (*FILRST*)
 1184   25F0             WITH Fl DO
 1185   2609               BEGIN
 1186   260E                P := 0;
 1187   261F                reset(F);
 1188   2632                IF eof(F) THEN
 1189   2648                   Status := Status + (.UnExpectedEof.);
 1190   266E    (*#B#*)
 1191   266E                IF test((.0,1.)) THEN
 1192   2684                  BEGIN
 1193   2689                   write(TestOut, 'FILrst'); TSTstat(Status); TSTln;
 1194   26C5                  END;
 1195   26C5    (*#E#*)
 1196   26C5               END
 1197   26C5            END;  (*FILRST*)
 1198   26CB    
 1199   26CB          PROCEDURE FilRwt(VAR Fl: FileType
 1200   26CB                          );
 1201   26CB    
 1202   26CB            BEGIN (*FILRWT*)
 1203   26CB    (*#B#*)
 1204   26CB             IF test((.0,1.)) THEN
 1205   26E9                writeln(TestOut, 'FILrwt');
 1206   270E    (*#E#*)
 1207   270E             WITH Fl DO
 1208   271F               BEGIN
 1209   2724                rewrite(F);
 1210   2731                P := 0;
 1211   2748               END
 1212   2748            END;  (*FILRWT*)
 1213   274E    
 1214   274E          PROCEDURE FilCls(VAR Fl: FileType
 1215   274E                          );
 1216   274E    
 1217   274E            BEGIN (*FILCLS*)
 1218   274E             close(Fl.F);
 1219   2769            END;  (*FILCLS*)
 1220   276F    
 1221   276F          PROCEDURE FilSeek(VAR Status: StatusType
 1222   276F                           ;VAR Fl: FileType
 1223   276F                           ;    Position: FileAddressType
 1224   276F                           );
 1225   276F    
 1226   276F            BEGIN (*FILSEEK*)
 1227   276F             WITH Fl DO
 1228   2788               BEGIN
 1229   278D                P := Position;
 1230   279F                seek(F, Position);
 1231   27B8                IF eof(F) THEN
 1232   27CE                   Status := Status + (.UnExpectedEof.);
 1233   27F4    (*#B#*)
 1234   27F4                IF test((.0,1,2.)) THEN
 1235   280B                  BEGIN
 1236   2810                   write(TestOut, 'FILSEEK  '); TSTstat(Status); TSTindt;
 1237   284F                   write(TestOut, 'P=', P:1
 1238   287A                                , '  EOF='); TSTbool(eof(F));
 1239   28B0                   TSTln;
 1240   28B8                  END;
 1241   28B8    (*#E#*)
 1242   28B8               END
 1243   28B8            END;  (*FILSEEK*)
 1244   28BE    
 1245   28BE          PROCEDURE FGi8(VAR Status: StatusType
 1246   28BE                        ;VAR Fl: FileType
 1247   28BE                        ;VAR V: i8
 1248   28BE                        );
 1249   28BE    
 1250   28BE            BEGIN (*FGI8*)
 1251   28BE             WITH Fl DO
 1252   28D7               BEGIN
 1253   28DC                IF not eof(F) THEN
 1254   28EE                  BEGIN
 1255   28F3                   read(F,V);
 1256   291C                   P := P + 1;
 1257   293E                  END
 1258   293E                ELSE
 1259   2940                  BEGIN
 1260   2945                   Status := Status + (.UnexpectedEof.);
 1261   296B                   V := 0
 1262   2976                  END;
 1263   2978    (*#B#*)
 1264   2978                IF test((.0,2.)) THEN
 1265   298F                  BEGIN
 1266   2994                   write(TestOut, 'FGI8     '); TSTstat(Status); TSTindt;
 1267   29D3                   write(TestOut, 'P=', P:1,' V=', V:1, ' EOF='); TSTbool(eof(F));
 1268   2A51                   TSTln;
 1269   2A59                  END;
 1270   2A59    (*#E#*)
 1271   2A59               END;
 1272   2A59            END;  (*FGI8*)
 1273   2A5F    
 1274   2A5F          PROCEDURE FGi32(VAR Status: StatusType
 1275   2A5F                         ;VAR Fl: FileType
 1276   2A5F                         ;VAR V: i32
 1277   2A5F                         );
 1278   2A5F    
 1279   2A5F             VAR
 1280   2A5F                I: I32IndexType;
 1281   2A5F                N: I32ArrayType;
 1282   2A5F    
 1283   2A5F            BEGIN (*FGI32*)
 1284   2A5F             WITH Fl DO
 1285   2A78               BEGIN
 1286   2A7D                P := P + 4;
 1287   2AA1                FOR I := bs3 DOWNTO bs0 DO
 1288   2AB2                   IF not eof(f) THEN
 1289   2ACB                      read(F, N(.I.) )
 1290   2AFC                   ELSE
 1291   2B02                     BEGIN
 1292   2B07                      Status := Status + (.UnexpectedEof.);
 1293   2B2D                      N(.I.) := 0
 1294   2B43                     END;
 1295   2B4F                move(N, V, 4);
 1296   2B68    (*#B#*)
 1297   2B68                IF test((.0,2.)) THEN
 1298   2B7F                  BEGIN
 1299   2B84                   write(TestOut, 'FGI32    '); TSTstat(Status); TSTindt;
 1300   2BC3                   write(TestOut, 'P=', P:1,' V=', V:1,
 1301   2C15                                  ' N=(',N(.bs3.):3,'/',N(.bs2.):3
 1302   2C47                                    ,'/',N(.bs1.):3,'/',N(.bs0.):3,') EOF=');
 1303   2C93                   TSTbool(eof(F)); TSTln;
 1304   2CB0                  END;
 1305   2CB0    (*#E#*)
 1306   2CB0               END;
 1307   2CB0            END;  (*FGI32*)
 1308   2CB6    
 1309   2CB6          PROCEDURE FGSym(VAR Status: StatusType
 1310   2CB6                         ;VAR Fl: FileType
 1311   2CB6                         ;VAR SymbolName: SymbolNameType
 1312   2CB6                         );
 1313   2CB6    
 1314   2CB6             VAR
 1315   2CB6                I: i8;
 1316   2CB6                N: i8;
 1317   2CB6    
 1318   2CB6            BEGIN (*FGSYM*)
 1319   2CB6             WITH Fl, SymbolName DO
 1320   2CDB               BEGIN
 1321   2CE0    (*#B#*)
 1322   2CE0                IF test((.0,2.)) THEN
 1323   2CF7                  BEGIN
 1324   2CFC                   write(TestOut, 'FGSYM-1  '); TSTstat(Status); TSTindt;
 1325   2D3B                   write(TestOut, 'P=', P:1, '  F^=',F^:3, '  EOF=');
 1326   2DAF                   TSTbool(eof(F)); TSTln
 1327   2DC9                  END;
 1328   2DCC    (*#E#*)
 1329   2DCC                IF not eof(F) THEN
 1330   2DE5                  BEGIN
 1331   2DEA                   read(F, N);
 1332   2E0D                   P := P + 1 + N;
 1333   2E3C                   IF (0 < N) and (N <= MaxSymbolNameIndex) THEN
 1334   2E5A                     BEGIN
 1335   2E5F                      Length := N;
 1336   2E77                      FOR I := 1 TO N DO
 1337   2E8E                         IF not eof(F) THEN
 1338   2EA7                            read(F, Name(.I.) )
 1339   2EE0                         ELSE
 1340   2EE6                           BEGIN
 1341   2EEB                            Length := 0;
 1342   2EF8                            Status := Status + (.UnexpectedEof.)
 1343   2F0E                           END
 1344   2F1E                     END
 1345   2F28                   ELSE
 1346   2F2B                     BEGIN
 1347   2F30                      Length := 0;
 1348   2F3D                      Status := Status + (.BadSymbolName.);
 1349   2F63                      FOR I := 1 TO N DO
 1350   2F79                         IF not eof(F) THEN
 1351   2F92                            read(F, Name(.1.) )
 1352   2FB9                         ELSE
 1353   2FBF                            Status := Status + (.UnexpectedEof.)
 1354   2FD5                     END
 1355   2FEF                  END
 1356   2FEF                ELSE
 1357   2FF1                  BEGIN
 1358   2FF6                   Length := 0;
 1359   3003                   Status := Status + (.UnexpectedEof.)
 1360   3019                  END;
 1361   3029    (*#B#*)
 1362   3029                IF test((.0,2.)) THEN
 1363   303F                  BEGIN
 1364   3044                   write(TestOut, 'FGSYM-2  '); TSTstat(Status); TSTindt;
 1365   3083                   TSTsymbol(SymbolName);
 1366   3092                  END;
 1367   3092    (*#E#*)
 1368   3092               END
 1369   3092            END;  (*FGSYM*)
 1370   3098    
 1371   3098          PROCEDURE FPi8(VAR Fl: FileType
 1372   3098                        ;    V: i8
 1373   3098                        );
 1374   3098    
 1375   3098            BEGIN (*FPI8*)
 1376   3098             WITH Fl DO
 1377   30B1               BEGIN
 1378   30B6    (*#B#*)
 1379   30B6                IF test((.0,3.)) THEN
 1380   30CC                  BEGIN
 1381   30D1                   writeln(TestOut, 'FPI8     ', 'P=', P:1,' V=', V:1);
 1382   313A                  END;
 1383   313A    (*#E#*)
 1384   313A                write(F,V);
 1385   315F                P := P + 1
 1386   3178               END
 1387   3181            END;  (*FPI8*)
 1388   3187    
 1389   3187          PROCEDURE FPi32(VAR Fl: FileType
 1390   3187                         ;    V: i32
 1391   3187                         );
 1392   3187    
 1393   3187             VAR
 1394   3187                I: I32IndexType;
 1395   3187                N: I32ArrayType;
 1396   3187    
 1397   3187            BEGIN (*FPI32*)
 1398   3187             move(V, N, 4);
 1399   31A9             WITH Fl DO
 1400   31BA               BEGIN
 1401   31BF    (*#B#*)
 1402   31BF                IF test((.0,3.)) THEN
 1403   31D6                  BEGIN
 1404   31DB                   writeln(TestOut, 'FPI32    ', 'P=', P:1,' V=', V:1,
 1405   323E                                    ' N=(',N(.bs3.):3,'/',N(.bs2.):3
 1406   3270                                      ,'/',N(.bs1.):3,'/',N(.bs0.):3,')');
 1407   32B2                  END;
 1408   32B2    (*#E#*)
 1409   32B2                P := P + 4;
 1410   32DC                FOR I := bs3 DOWNTO bs0  DO
 1411   32ED                   write(F, N(.I.) )
 1412   331E               END
 1413   332B            END;  (*FPI32*)
 1414   3331    
 1415   3331          PROCEDURE FPSym(VAR Fl: FileType
 1416   3331                         ;    SymbolName: SymbolNameType
 1417   3331                         );
 1418   3331    
 1419   3331             VAR
 1420   3331                I: SymbolNameIndexType;
 1421   3331    
 1422   3331            BEGIN (*FPSYM*)
 1423   3331             WITH Fl, SymbolName DO
 1424   335F               BEGIN
 1425   3364    (*#B#*)
 1426   3364                IF test((.0,3.)) THEN
 1427   337B                  BEGIN
 1428   3380                   write(TestOut, 'FPSYM-2   '); TSTstat(Status); TSTindt;
 1429   33BD                   write(TestOut, 'P=', P:1); TSTindt; TSTsymbol(SymbolName);
 1430   33FF                  END;
 1431   33FF    (*#E#*)
 1432   33FF                P := P + 1 + Length;
 1433   342F                write(F, Length);
 1434   3458                FOR I := 1 TO Length DO
 1435   3471                   write(F, Name(.I.) )
 1436   34A3               END
 1437   34B0            END;  (*FPSYM*)
 1438   34B6    
 1439   34B6    (*                                                                            *)
 1440   34B6    (*                                                                            *)
 1441   34B6    (******************************************************************************)
 1442   34B6    
 1443   34B6    (*$I B:lnkp0.pas    Procedure setup                                           *)
 1444   34B6    (******************************************************************************)
 1445   34B6    (*                                                                            *)
 1446   34B6    (*   Copyright (1985) by Metanic Aps., Denmark                                *)
 1447   34B6    (*                                                                            *)
 1448   34B6    (*   Author: Lars Gregers Jakobsen.                                           *)
 1449   34B6    (*                                                                            *)
 1450   34B6    (******************************************************************************)
 1451   34B6    
 1452   34B6    
 1453   34B6       PROCEDURE SetUp(VAR Status: StatusType
 1454   34B6                      ;VAR TargetFile: FileType
 1455   34B6                      ;VAR LogFile: LogFileType
 1456   34B6                      ;VAR Out_file: text
 1457   34B6                      );
 1458   34B6    
 1459   34B6          CONST
 1460   34B6             InputFileNameSuffix = 'OBJ';
 1461   34B9             TargetFileNameSuffix = 'OUT';
 1462   34BC             LogFileNameSuffix = 'MAP';
 1463   34BF    
 1464   34BF          VAR
 1465   34BF             CommandLine: CommandLineType;
 1466   34BF             Current: CommandLineIndexType;
 1467   34BF             FileName: FileNameType;
 1468   34BF    
 1469   34BF          PROCEDURE SkipBlanks;
 1470   34BF    
 1471   34BF            BEGIN (*SKIPBLANKS*)
 1472   34BF             WHILE  (CommandLine(.Current.) = ' ') and
 1473   34E8                    (Current < length(CommandLine))      DO
 1474   350D                Current := Current + 1;
 1475   352D            END;  (*SKIPBLANKS*)
 1476   3533    
 1477   3533          PROCEDURE DecodeFileName(VAR Status: StatusType
 1478   3533                                  ;VAR FileName: FileNameType
 1479   3533                                  ;    Suffix: FileNameType
 1480   3533                                  ;    Terminators: CharSetType
 1481   3533                                  );
 1482   3533    
 1483   3533             VAR
 1484   3533                I: CommandLineIndexType;
 1485   3533    
 1486   3533            BEGIN (*DECODEFILENAME*)
 1487   3533             I := 0;
 1488   3544             WHILE (Current + I < length(CommandLine) ) and
 1489   356E                   not ( CommandLine(.Current + I.) in Terminators ) DO
 1490   35AF                I := I + 1;
 1491   35C7             IF (0 < I)  and (I <= FileNameLength) THEN
 1492   35EA               BEGIN
 1493   35EF                FileName := Copy(CommandLine, Current, I);
 1494   361D                Current := Current + I;
 1495   3642                IF (pos('.', FileName) = 0) THEN
 1496   365D                   IF (length(FileName) <= FileNameLength - 4) THEN
 1497   3670                      FileName := concat(FileName, '.', Suffix)
 1498   3699                   ELSE
 1499   36A4                      Status := Status + (.BadFileName.)
 1500   36BA               END
 1501   36C8             ELSE
 1502   36CA                Status := Status + (.BadFileName.);
 1503   36EE    (*#B#*)
 1504   36EE             IF test((.0,16,18.)) THEN
 1505   3708               BEGIN
 1506   370D                write(TestOut, 'DecodeFileName   '); TSTstat(Status);
 1507   3751                TSTindt; write(TestOut, 'Curr=', Current:1);
 1508   378D                TSTindt; write(TestOut, 'I=', I:1);
 1509   37C2                TSTindt; writeln(TestOut, 'FileName=', FileName)
 1510   37F9               END
 1511   37FC    (*#E#*)
 1512   37FC            END;  (*DECODEFILENAME*)
 1513   3802    
 1514   3802    
 1515   3802         BEGIN (*SETUP*)
 1516   3802          Getcomm(CommandLine);
 1517   381D          CommandLine := concat(CommandLine, ' ');
 1518   383F          Current := 1;
 1519   3848          Status := (..);
 1520   385F          SkipBlanks; (*Leaving current pointing at next non blank*)
 1521   386B          (*Interpret option list*)
 1522   386B    (*#B#*)
 1523   386B          IF test((.0,16,18.)) THEN
 1524   3885            BEGIN
 1525   388A             write(TestOut, 'Setup-1   '); write(TestOut, 'Curr=', Current:1);
 1526   38E3             TSTindt; write(TestOut, 'Lng(ComLin)=', Length(CommandLine):1);
 1527   3920             TSTindt; TSTmem; TSTln;
 1528   392E             TSTindt; writeln(TestOut, 'ComLin=', CommandLine)
 1529   3964            END;
 1530   3967    (*#E#*)
 1531   3967          WHILE (Current < length(CommandLine)) and
 1532   397C                (CommandLine(.Current.) = '/') and
 1533   399E                (Status = (..)) DO
 1534   39BA            BEGIN
 1535   39BF             Current := Current + 1;
 1536   39D5             CASE CommandLine(.Current.) OF
 1537   39F0             'M','m':
 1538   39F0               BEGIN
 1539   39F5                Current := Current + 1;
 1540   3A0B                IF CommandLine(.Current.) = '=' THEN
 1541   3A27                  BEGIN
 1542   3A2C                   Current := Current + 1;
 1543   3A42                   DecodeFileName(Status, FileNametable(.-1.)
 1544   3A4E                                 , LogFileNameSuffix, (.' ', '/', ','.) );
 1545   3A76                   IF Status = (..) THEN
 1546   3A8E                      OptionTable.LogFileKind := Explicit
 1547   3A93                  END
 1548   3A98                ELSE
 1549   3A9A                   OptionTable.LogFileKind := Implicit
 1550   3A9F               END;
 1551   3AA7             'O','o':
 1552   3AA7               BEGIN
 1553   3AAC                Current := Current + 1;
 1554   3AC2                IF CommandLine(.Current.) = '=' THEN
 1555   3ADE                  BEGIN
 1556   3AE3                   Current := Current + 1;
 1557   3AF9                   DecodeFileName(Status, FileNameTable(.0.)
 1558   3B05                                 , TargetFileNameSuffix, (.' ', '/', ','.) );
 1559   3B2D                   IF Status = (..) THEN
 1560   3B45                      OptionTable.TargetFileKind := Explicit
 1561   3B4A                  END
 1562   3B4F                ELSE
 1563   3B51                   OptionTable.TargetFileKind := Implicit
 1564   3B56               END;
 1565   3B5D             OTHERWISE
 1566   3B5D                Status := Status + (.BadOption.)
 1567   3B73             END; (*CASE*)
 1568   3B96    (*#B#*)
 1569   3B96             IF test((.0,16,18.)) THEN
 1570   3BB0               BEGIN
 1571   3BB5                write(TestOut, 'Setup-2   '); TSTstat(Status);
 1572   3BF2                TSTindt; writeln(TestOut, 'Curr=', Current:1);
 1573   3C2A                TSTindt; TSTopt;
 1574   3C35                TSTindt; TSTfnt(-1);
 1575   3C43                TSTindt; TSTfnt(0)
 1576   3C4E               END;
 1577   3C51    (*#E#*)
 1578   3C51            END; (*WHILE*)
 1579   3C54          IF Status = (..) THEN (*Interpret file list*)
 1580   3C6D            BEGIN
 1581   3C72             SkipBlanks;
 1582   3C7E             IF Current < length(CommandLine) THEN
 1583   3C96                Status := Status + (.NotFinished.);
 1584   3CBE             WHILE (Current < length(CommandLine)) and
 1585   3CD3                   (NotFinished IN Status) DO
 1586   3CF4               BEGIN
 1587   3CF9                DecodeFileName(Status, FileName
 1588   3D05                              , InputFileNameSuffix, (.' ', ','.) );
 1589   3D31                IF not (BadFileName IN Status) THEN
 1590   3D4C                  BEGIN
 1591   3D51    (*#B#*)
 1592   3D51                   IF test((.0,16,18.)) THEN
 1593   3D6B                     BEGIN
 1594   3D70                      write(TestOut, 'Setup-3   '); TSTstat(Status); TSTindt;
 1595   3DB0                      write(TestOut, 'fstat(FileName)=');
 1596   3DDF                      TSTbool(fstat(FileName)); TSTln;
 1597   3DFB                     END;
 1598   3DFB    (*#E#*)
 1599   3DFB                   IF fstat(FileName) THEN
 1600   3E10                      FNTP(Status, FileName)
 1601   3E2B                   ELSE
 1602   3E30                      Status := Status + (.NoSuchFile.);
 1603   3E54                  END;
 1604   3E54                IF NotFinished IN Status THEN
 1605   3E6E                   CASE CommandLine(.Current.) OF
 1606   3E8C                   ' ':
 1607   3E8C                      Status := Status - (.NotFinished.);
 1608   3EB6                   ',':
 1609   3EB6                     BEGIN
 1610   3EBB                      Current := Current + 1 (*Skip the comma*)
 1611   3EC0                     END
 1612   3ED1                   END (*CASE CommandLine(.Current.) OF*)
 1613   3EE0               END (* WHILE *** DO *)
 1614   3EE0            END; (* IF Status = (..)  -- End interpret file list *)
 1615   3EE3          IF CurFileNo <= 0 THEN
 1616   3EF4             Status := Status + (.NoInputFiles.);
 1617   3F18          IF Current < length(CommandLine) THEN
 1618   3F30             Status := Status + (.ExtraText.);
 1619   3F54          IF Status = (..) THEN
 1620   3F6D            BEGIN
 1621   3F72             FileName := copy(FileNameTable(.1.), 1, pos('.',FileNameTable(.1.)) );
 1622   3F9E             IF OptionTable.LogFileKind = Implicit THEN
 1623   3FAA                FileNameTable(.-1.) := concat(FileName, LogFileNameSuffix);
 1624   3FCB             IF OptionTable.TargetFileKind = Implicit THEN
 1625   3FD7                FileNameTable(. 0.) := concat(FileName, TargetFileNameSuffix);
 1626   3FF8    
 1627   3FF8             IF (OptionTable.LogFileKind <> none) and
 1628   4002                ( (not checkfn(FileNameTable(.-1.) ) ) or
 1629   4011                  (fstat(FileNameTable(.-1.) ) )
 1630   401B                ) THEN
 1631   4024                Status := Status + (.badlogfilename.);
 1632   4048             IF (not checkfn(FileNameTable(.0.) ) ) or
 1633   4058                (fstat(FileNameTable(.0.) ) ) THEN
 1634   4068                Status := Status + (.badtargetfilename.);
 1635   408C    
 1636   408C    (*#B#*)
 1637   408C             IF test((.0,16,18.)) THEN
 1638   40A5               BEGIN
 1639   40AA                write(TestOut, 'Setup-4   '); TSTstat(Status); TSTln;
 1640   40EA                TSTindt; TSTopt;
 1641   40F5                TSTindt; TSTfnt(-1);
 1642   4103                TSTindt; TSTfnt(0);
 1643   4111                TSTindt; TSTfnt(1)
 1644   411C               END;
 1645   411F    (*#E#*)
 1646   411F    
 1647   411F             IF Status = (..) THEN
 1648   4137               BEGIN
 1649   413C                IF OptionTable.LogFileKind <> None THEN
 1650   4148                  BEGIN
 1651   414D                   LogInit(LogFile, FileNameTable(.-1.) );
 1652   4167                   LogCmd(LogFile, CommandLine);
 1653   4185                  END;
 1654   4185                FilAsg(TargetFile, FileNameTable(.0.) );
 1655   419F                FilRwt(TargetFile);
 1656   41AE               END
 1657   41AE             ELSE
 1658   41B0                Status := Status + (.NoTarget.);
 1659   41D8            END
 1660   41D8          ELSE
 1661   41DA            BEGIN
 1662   41DF             Status := Status + (.Notarget.);
 1663   4207             writeln(out_file, CommandLine);
 1664   4230             writeln(out_file, '^':Current);
 1665   4253            END
 1666   4253         END;  (*SETUP*)
 1667   4259    
 1668   4259    (*                                                                            *)
 1669   4259    (*                                                                            *)
 1670   4259    (******************************************************************************)
 1671   4259    
 1672   4259    (*$I B:lnkp1.pas    Procedure pass1                                           *)
 1673   4259    (******************************************************************************)
 1674   4259    (*                                                                            *)
 1675   4259    (*   Copyright (1985) by Metanic Aps., Denmark                                *)
 1676   4259    (*                                                                            *)
 1677   4259    (*   Author: Lars Gregers Jakobsen.                                           *)
 1678   4259    (*                                                                            *)
 1679   4259    (******************************************************************************)
 1680   4259    
 1681   4259       PROCEDURE Pass1(VAR Status: StatusType
 1682   4259                      ;VAR TargetFile: FileType
 1683   4259                      ;VAR LogFile: LogFileType
 1684   4259                      );
 1685   4259    
 1686   4259          (* Pass1 of the linker performs the gathering of export and
 1687   4259             import information from the input files as well as calculation
 1688   4259             of final memory map and all operations on the symbol table
 1689   4259             including reporting to the log file.
 1690   4259                The following statusvalues may be returned:
 1691   4259             Success: ok. All other parameters meaningful.
 1692   4259    
 1693   4259          *)
 1694   4259    
 1695   4259    
 1696   4259          VAR
 1697   4259             SymbolTable: SymbolTableType;
 1698   4259             LatestInsert: SymbolTableIndexType; (*Points to SBT entry of latest insert*)
 1699   4259             CurrentSymbolCount: SymbolTableIndexType; (*Number of SBT entries currently used*)
 1700   4259    
 1701   4259             NameTable: NameTableType;
 1702   4259             CurrentNameTableIndex: NameTableIndexType; (*Least index vacant  -
 1703   4259                                                          NOT count of strings*)
 1704   4259    
 1705   4259    
 1706   4259             (* MISC. VARIABLES *)
 1707   4259    
 1708   4259             SBTSubInx: SymbolTableSubIndexType;
 1709   4259    
 1710   4259    (*#B#*)
 1711   4259    (*$I B:LnkDF3.pas   Definitions    of pass1 local test output primitives *)
 1712   4259    (******************************************************************************)
 1713   4259    (*                                                                            *)
 1714   4259    (*   Copyright (1985) by Metanic Aps., Denmark                                *)
 1715   4259    (*                                                                            *)
 1716   4259    (*   Author: Lars Gregers Jakobsen.                                           *)
 1717   4259    (*                                                                            *)
 1718   4259    (******************************************************************************)
 1719   4259    
 1720   4259       PROCEDURE TSTnmt(Inx: NameTableIndexType
 1721   4259                    );
 1722   4259    
 1723   4259          VAR
 1724   4259             i : 0..9;
 1725   4259    
 1726   4259         BEGIN (*TSTnmt*)
 1727   4259          write(TestOut, 'NMTÆ', inx:1
 1728   428F                       , ';../', CurrentNameTableIndex:1,'Å=(' );
 1729   42D1          FOR i := 0 TO 7 DO
 1730   42E2             IF (Inx + i) IN (.1..CurrentNameTableIndex.) THEN
 1731   4323                TSTasc( NameTable(. Inx+i .) )
 1732   4352             ELSE
 1733   4358                write(TestOut, '-');
 1734   437D          write(TestOut, '/');
 1735   4398          IF Inx IN (.1..CurrentNameTableIndex.) THEN
 1736   43C3             TSThex( NameTable(. Inx .) )
 1737   43DB          ELSE
 1738   43E0             write(TestOut, '--');
 1739   4401          FOR i := 1 TO 7 DO
 1740   4412            BEGIN
 1741   4417             write(TestOut, '-');
 1742   4432             IF (Inx + i) IN (.1..CurrentNameTableIndex.) THEN
 1743   4473                TSThex( NameTable(. Inx+i .) )
 1744   44A2             ELSE
 1745   44A8                write(TestOut, '--');
 1746   44C9            END;
 1747   44D3          writeln(TestOut, ')' )
 1748   44EB         END;  (*TSTnmt*)
 1749   44F4    
 1750   44F4       PROCEDURE TSTsbt(Inx: SymbolTableIndexType
 1751   44F4                    );
 1752   44F4    
 1753   44F4         BEGIN (*TSTsbt*)
 1754   44F4          WITH SymbolTable(.Inx.) DO
 1755   451B            BEGIN
 1756   4520             IF NameReference <> 0 THEN
 1757   452F                write(TestOut, 'SBTÆ', Inx:1
 1758   455A                             , '/', LatestInsert:1
 1759   457D                             , '/', CurrentSymbolCount:1
 1760   45A0                             , 'Å=(Module#=', ModuleNo:1, ' '
 1761   45D3                             , 'NameRef=', NameReference:1, ' '
 1762   460A                             , 'SortLink=', SortLink:1, ')'
 1763   4642                     )
 1764   464B             ELSE
 1765   4651                write(TestOut, 'SBTÆ', Inx:1
 1766   467C                             , '/', LatestInsert:1
 1767   469F                             , '/', CurrentSymbolCount:1
 1768   46C2                             , 'Å=(Module#=--', ' '
 1769   46E2                             , 'NameRef=', NameReference:1, ' '
 1770   4719                             , 'SortLink=--', ')'
 1771   473A                     )
 1772   4743            END
 1773   4746         END;  (*TSTsbt*)
 1774   474C    
 1775   474C    (*                                                                            *)
 1776   474C    (*                                                                            *)
 1777   474C    (******************************************************************************)
 1778   474C    
 1779   474C    (*$I B:LnkDF4.pas   Definitions    of pass1 local access primitives           *)
 1780   474C    (******************************************************************************)
 1781   474C    (*                                                                            *)
 1782   474C    (*   Copyright (1985) by Metanic Aps., Denmark                                *)
 1783   474C    (*                                                                            *)
 1784   474C    (*   Author: Lars Gregers Jakobsen.                                           *)
 1785   474C    (*                                                                            *)
 1786   474C    (******************************************************************************)
 1787   474C    
 1788   474C    
 1789   474C       PROCEDURE NMTP(VAR Status: StatusType
 1790   474C                     ;VAR NameReference: NameTableIndexType
 1791   474C                     ;    SymbolName: SymbolNameType
 1792   474C                     );
 1793   474C    
 1794   474C          VAR
 1795   474C             I: SymbolNameIndexType;
 1796   474C    
 1797   474C         BEGIN (*NMTP*)
 1798   474C          WITH SymbolName DO
 1799   476E            BEGIN
 1800   4773             IF CurrentNameTableIndex + Length + 1 > MaxNameTableIndex THEN
 1801   47A7                Status := Status + (.NameTableOverFlow.)
 1802   47BD             ELSE
 1803   47D1               BEGIN
 1804   47D6                Namereference := CurrentNameTableIndex + 1;
 1805   4800                CurrentNameTableIndex := NameReference + Length;
 1806   4833                NameTable(.NameReference.) := Length;
 1807   4857                FOR I := 1 TO Length DO
 1808   4870                   NameTable(.NameReference +  I.) := Name(.I.);
 1809   48C1               END;
 1810   48C1    (*#B#*)
 1811   48C1             IF test((.0,9.)) THEN
 1812   48DA               BEGIN
 1813   48DF                write(TestOut, 'NMTP     '); TSTstat(Status); TSTindt;
 1814   491E                writeln(TestOut, 'Length=', Length:1);
 1815   4955                TSTindt; TSTindt; TSTindt; TSTnmt(NameReference);
 1816   4978               END;
 1817   4978    (*#E#*)
 1818   4978            END
 1819   4978         END;  (*NMTP*)
 1820   497E    
 1821   497E       FUNCTION NMTfail(    NameReference: NameTableIndexType
 1822   497E                       ;    SymbolName: SymbolNameType
 1823   497E                       ): boolean;
 1824   497E    
 1825   497E          (* NMTfail returns one of the following values:
 1826   497E                FALSE: If the exact same symbolname was found in NMT - i.e.
 1827   497E    
 1828   497E                       NameReference <> 0 AND
 1829   497E                       NMT(.NameReference.) = SymbolName.Length AND
 1830   497E                       FOR i = 1 TO length:
 1831   497E                          NMT(.NameReference+i.) = SymbolName.Name(.i.)
 1832   497E    
 1833   497E                       OR If an empty entry was found in NMT - i.e.
 1834   497E    
 1835   497E                       NameReference = 0.
 1836   497E    
 1837   497E    
 1838   497E                TRUE:  In all other cases.
 1839   497E          *)
 1840   497E    
 1841   497E          LABEL
 1842   497E             99;
 1843   497E    
 1844   497E          VAR
 1845   497E             I: SymbolNameIndexType;
 1846   497E    
 1847   497E         BEGIN (*NMTFAIL*)
 1848   497E          NMTfail := false;
 1849   49A4          WITH SymbolName DO
 1850   49A9            BEGIN
 1851   49AE             IF NameReference <> 0 THEN
 1852   49BE                IF length <> NameTable(.NameReference.) THEN
 1853   49DA                   NMTfail := true
 1854   49DF                ELSE
 1855   49E6                  BEGIN
 1856   49EB                   FOR I := 1 TO Length DO
 1857   4A04                      IF Name(.I.) <> NameTable(.NameReference + I.) THEN
 1858   4A4B                        BEGIN
 1859   4A50                         NMTfail := true;
 1860   4A59                         GOTO 99;
 1861   4A61                        END;
 1862   4A6B    99:;          END;
 1863   4A6B    (*#B#*)
 1864   4A6B             IF test((.0,9.)) THEN
 1865   4A84               BEGIN
 1866   4A89                writeln(TestOut, 'NMTfail  ', 'NameRef=', NameReference:1);
 1867   4ADA                TSTindt; TSTindt; TSTindt; TSTsymbol(SymbolName);
 1868   4AF3                TSTindt; TSTindt; TSTindt; TSTnmt(NameReference);
 1869   4B12               END;
 1870   4B12    (*#E#*)
 1871   4B12            END
 1872   4B12         END;  (*NMTFAIL*)
 1873   4B1B    
 1874   4B1B       PROCEDURE NMTG(    NameReference: NameTableIndexType
 1875   4B1B                     ;VAR SymbolName: SymbolNameType
 1876   4B1B                     );
 1877   4B1B    
 1878   4B1B          VAR
 1879   4B1B             I: SymbolNameIndexType;
 1880   4B1B    
 1881   4B1B         BEGIN (*NMTG*)
 1882   4B1B          WITH SymbolName DO
 1883   4B34            BEGIN
 1884   4B39             Length := NameTable(.NameReference.);
 1885   4B5A             FOR I := 1 TO Length DO
 1886   4B77                Name(.I.) := NameTable(. NameReference + I .);
 1887   4BC7    (*#B#*)
 1888   4BC7             IF test((.0,9,13.)) THEN
 1889   4BDF               BEGIN
 1890   4BE4                write(TestOut, 'NMTG     '); TSTindt;
 1891   4C0F                write(TestOut, 'NameRef=', NameReference:1); TSTindt;
 1892   4C4D                TSTsymbol(SymbolName);
 1893   4C5C               END;
 1894   4C5C    (*#E#*)
 1895   4C5C            END
 1896   4C5C         END;  (*NMTG*)
 1897   4C62    
 1898   4C62       PROCEDURE Hash(VAR SymbolName: SymbolNameType
 1899   4C62                     ;VAR SBTInx: SymbolTableIndexType
 1900   4C62                     );
 1901   4C62    
 1902   4C62         BEGIN (*HASH*)
 1903   4C62          SBTInx := 1
 1904   4C75         END;  (*HASH*)
 1905   4C7D    
 1906   4C7D       PROCEDURE SBTS(VAR Status: StatusType
 1907   4C7D                     ;VAR SBTInx: SymbolTableIndexType
 1908   4C7D                     ;    SymbolName: SymbolNameType
 1909   4C7D                     );
 1910   4C7D    
 1911   4C7D          (* SBTS returns one of the following Status codes:
 1912   4C7D                Success: SymbolName found in SBT. SBTInx reflects
 1913   4C7D                         SymbolName.
 1914   4C7D                NotFound: SymbolName NOT found in SBT. SBTInx
 1915   4C7D                          indicates the entry into which Symbol should be
 1916   4C7D                          registered.
 1917   4C7D                SymbolTableOverFlow: SymbolName NOT found in SBT.
 1918   4C7D                                     SBTInx is not valid. There
 1919   4C7D                                     is no room in SBT for further updates.
 1920   4C7D    
 1921   4C7D            Search SBT to find the Entry for SYMBOLNAME retaining the index
 1922   4C7D            of the first vacant record as SYMBOLTABLEENTRYNO if the search
 1923   4C7D            fails. Otherwise return found index. Set Status to Success or
 1924   4C7D            NotFound according to outcome. Set Status to SBTOverFlow if
 1925   4C7D            no vacant is available and symbol is not found.
 1926   4C7D    
 1927   4C7D            A SBT record is vacant if Namereference  = 0.
 1928   4C7D          *)
 1929   4C7D    
 1930   4C7D    
 1931   4C7D         BEGIN (*SBTS*)
 1932   4C7D          (* Assume existence of entry in SBT with NameReference =  0 *)
 1933   4C7D          Hash(SymbolName, SBTInx);
 1934   4CB1    (*#B#*)
 1935   4CB1          IF test((.0,9.)) THEN
 1936   4CC9            BEGIN
 1937   4CCE             write(TestOut, 'SBTS-1   '); TSTstat(Status); TSTln;
 1938   4D0D             TSTindt; TSTindt; TSTindt; TSTsbt(SBTInx); TSTln;
 1939   4D30            END;
 1940   4D30    (*#E#*)
 1941   4D30          WHILE NMTfail(Symboltable(.SBTInx.).NameReference, SymbolName) DO
 1942   4D69            BEGIN
 1943   4D6E             (* HASH NEXT TRY *)
 1944   4D6E             IF MaxNooSymbols <= SBTInx THEN
 1945   4D85                SBTInx := 0;
 1946   4D92             SBTInx := SBTInx + 1;
 1947   4DB2    
 1948   4DB2    (*#B#*)
 1949   4DB2             IF test((.0,9.)) THEN
 1950   4DCA               BEGIN
 1951   4DCF                write(TestOut, 'SBTS-2   '); TSTstat(Status); TSTln;
 1952   4E0E                TSTindt; TSTindt; TSTindt; TSTsbt(SBTInx); TSTln;
 1953   4E31               END;
 1954   4E31    (*#E#*)
 1955   4E31    
 1956   4E31            END;
 1957   4E34          IF SymbolTable(.SBTInx.).NameReference = 0 THEN
 1958   4E5A             IF CurrentSymbolCount >= MaxNooSymbols - 1 THEN
 1959   4E73                Status := Status + (.SymbolTableOverFlow.)
 1960   4E89             ELSE
 1961   4E9C                Status := Status + (.NotFound.);
 1962   4EC4    (*#B#*)
 1963   4EC4          IF test((.0,10.)) THEN
 1964   4EDC            BEGIN
 1965   4EE1             write(TestOut, 'SBTS-3   '); TSTstat(Status); TSTln;
 1966   4F20             TSTindt; TSTindt; TSTindt; TSTsbt(SBTInx); TSTln;
 1967   4F43            END;
 1968   4F43    (*#E#*)
 1969   4F43         END;  (*SBTS*)
 1970   4F49    
 1971   4F49       PROCEDURE SBTEX(VAR Status: StatusType
 1972   4F49                      ;VAR SymbolTableEntryNo: SymbolTableIndexType
 1973   4F49                      ;    SymbolName: SymbolNameType
 1974   4F49                      ;    P_ModuleNo: ModuleTableIndexType
 1975   4F49                      ;    P_SegmentNo: SegmentNoType
 1976   4F49                      ;    Item: i32
 1977   4F49                      );
 1978   4F49    
 1979   4F49         BEGIN (*SBTEX*)
 1980   4F49          SBTS(Status, SymbolTableEntryNo, SymbolName);
 1981   4F88          IF not (SymbolTableOverFlow IN Status) THEN
 1982   4FA3             WITH SymbolTable(.SymbolTableEntryNo.)
 1983   4FC0                  ,ValueTable(.SymbolTableEntryNo.) DO
 1984   4FE4                IF NotFound IN Status THEN
 1985   4FFF                  BEGIN (*Symbol is NOT in SBT and thus not resolved*)
 1986   5004                   Status := Status - (.NotFound.);
 1987   502C                   NMTP(Status, NameReference, SymbolName);
 1988   504F                   IF not (NameTableOverFlow IN Status) THEN
 1989   506A                     BEGIN
 1990   506F                      CurrentSymbolCount := CurrentSymbolCount + 1;
 1991   5097                      ModuleNo := P_ModuleNo;
 1992   50AB                      IF LatestInsert <> 0 THEN
 1993   50BF                         SymbolTable(.LatestInsert.).SortLink := SymbolTableEntryNo;
 1994   50F2                      LatestInsert := SymbolTableEntryNo;
 1995   510D                      SortLink := SymbolTableEntryNo;
 1996   5129                      SegmentNo := P_SegmentNo;
 1997   513D                      Value := Item
 1998   5148                     END
 1999   5151                  END (*IF NotFound IN Status*)
 2000   5151                ELSE (* SUCCESS: Symbol is in SBT*)
 2001   5154                  BEGIN
 2002   5159                   IF SegmentNo > UnResolved THEN
 2003   5170                      Status := Status + (.DuplicateExportSymbol.)
 2004   5186                   ELSE (*Symbol NOT previously resolved i.e. imported only*)
 2005   5199                     BEGIN
 2006   519E                      ModuleNo := P_ModuleNo;
 2007   51B2                      IF LatestInsert <> 0 THEN
 2008   51C6                         SymbolTable(.LatestInsert.).SortLink := SymbolTableEntryNo;
 2009   51F9                      LatestInsert := SymbolTableEntryNo;
 2010   5214                      SortLink := SymbolTableEntryNo;
 2011   5230                      SegmentNo := P_SegmentNo;
 2012   5244                      Value := Item
 2013   524F                     END
 2014   5258                  END; (*ELSE (i.e. Success IN Status)*)
 2015   5258    (*#B#*)
 2016   5258          IF test((.0,10.)) THEN
 2017   5271            BEGIN
 2018   5276             write(TestOut, 'SBTEX    '); TSTstat(Status);
 2019   52B2             TSTindt; TSTsymbol(SymbolName);
 2020   52C5             TSTindt; TSTindt; TSTindt; TSTsbt(SymbolTableEntryNo); TSTln;
 2021   52E8             TSTindt; TSTindt; TSTindt; TSTvlt(SymbolTableEntryNo); TSTln;
 2022   5307            END;
 2023   5307    (*#E#*)
 2024   5307         END;  (*SBTEX*)
 2025   530D    
 2026   530D    
 2027   530D       PROCEDURE SBTIM(VAR Status: StatusType
 2028   530D                      ;VAR SymbolTableEntryNo: SymbolTableIndexType
 2029   530D                      ;VAR SymbolName: SymbolNameType
 2030   530D                      ;    P_ModuleNo: ModuleTableIndexType
 2031   530D                      );
 2032   530D    
 2033   530D         BEGIN (*SBTIM*)
 2034   530D          SBTS(Status, SymbolTableEntryNo, SymbolName);
 2035   5336          IF Not (SymbolTableOverFlow IN Status) THEN
 2036   5351            BEGIN
 2037   5356             IF NotFound IN Status THEN
 2038   5371                WITH SymbolTable(.SymbolTableEntryNo.)
 2039   538E                     ,ValueTable(.SymbolTableEntryNo.) DO
 2040   53B2                  BEGIN
 2041   53B7                   Status := Status - (.NotFound.);
 2042   53DF                   NMTP(Status, NameReference, SymbolName);
 2043   5401                   IF not (NameTableOverFlow IN Status) THEN
 2044   541B                     BEGIN
 2045   5420                      CurrentSymbolCount := CurrentSymbolCount + 1;
 2046   5448                      ModuleNo := P_ModuleNo;
 2047   545C                      SortLink := 0;
 2048   546D                      SegmentNo := UnResolved;
 2049   547A                      Value := 0;
 2050   5490                     END
 2051   5490                  END;
 2052   5490             EITP(Status,SymbolTableEntryNo)
 2053   54A7            END;
 2054   54AA    (*#B#*)
 2055   54AA          IF test((.0,10.)) THEN
 2056   54C3            BEGIN
 2057   54C8             write(TestOut, 'SBTIM    '); TSTstat(Status); TSTln;
 2058   5507             TSTindt; TSTindt; TSTindt; TSTsbt(SymbolTableEntryNo); TSTln;
 2059   552A             TSTindt; TSTindt; TSTindt; TSTvlt(SymbolTableEntryNo); TSTln;
 2060   5549            END;
 2061   5549    (*#E#*)
 2062   5549         END;  (*SBTIM*)
 2063   554F    
 2064   554F    (*                                                                            *)
 2065   554F    (*                                                                            *)
 2066   554F    (******************************************************************************)
 2067   554F    
 2068   554F    
 2069   554F    (*$I B:lnkp1-1.pas  getinputfiles                                             *)
 2070   554F    (******************************************************************************)
 2071   554F    (*                                                                            *)
 2072   554F    (*   Copyright (1985) by Metanic Aps., Denmark                                *)
 2073   554F    (*                                                                            *)
 2074   554F    (*   Author: Lars Gregers Jakobsen.                                           *)
 2075   554F    (*                                                                            *)
 2076   554F    (******************************************************************************)
 2077   554F    
 2078   554F          PROCEDURE GetInputFiles(VAR GStatus: StatusType
 2079   554F                                 ;VAR LogFile: LogFileType
 2080   554F                                 );
 2081   554F    
 2082   554F             VAR
 2083   554F                InputFile: FileType;
 2084   554F                FileNo: FileNameTableIndexType;
 2085   554F                Status: StatusType;
 2086   554F    
 2087   554F             PROCEDURE ValidateFileFormat(VAR Status: StatusType
 2088   554F                                         ;VAR F: FileType
 2089   554F                                         ;    Format: OF_FormatType
 2090   554F                                         );
 2091   554F    
 2092   554F                VAR
 2093   554F                   OFF_Format: OF_FormatType;
 2094   554F    
 2095   554F               BEGIN (*VALIDATEFILEFORMAT*)
 2096   554F                FGi32(Status, F, OFF_Format);
 2097   5575                IF OFF_Format <> Format THEN
 2098   5589                   Status := Status + (.BadFileFormat.);
 2099   55AF    (*#B#*)
 2100   55AF                IF test((.0,16,19.)) THEN
 2101   55C9                  BEGIN
 2102   55CE                   write(TestOut, 'GetFFvalid   '); TSTstat(Status); TSTindt;
 2103   5611                   writeln(TestOut, 'OFF_Format=', OFF_Format);
 2104   5647                  END;
 2105   5647    (*#E#*)
 2106   5647               END;  (*VALIDATEFILEFORMAT*)
 2107   564D    
 2108   564D             PROCEDURE GetModules(VAR GStatus: StatusType
 2109   564D                                 ;VAR LogFile: LogFileType
 2110   564D                                 ;    FileNumber: FileNameTableIndexType
 2111   564D                                 ;VAR Fl: FileType
 2112   564D                                 ;    StartAddressOfNextModule: FileAddressType
 2113   564D                                 );
 2114   564D    
 2115   564D                VAR
 2116   564D                   Status: StatusType;
 2117   564D    
 2118   564D                PROCEDURE ValidateModuleFormat(VAR Status: StatusType
 2119   564D                                              ;VAR F: FileType
 2120   564D                                              ;    Format: OM_FormatType
 2121   564D                                              );
 2122   564D    
 2123   564D                   VAR
 2124   564D                      OMF_Format: OM_FormatType;
 2125   564D    
 2126   564D                  BEGIN (*VALIDATEMODULEFORMAT*)
 2127   564D                   FGi32(Status, F, OMF_Format);
 2128   5673                   IF OMF_Format <> Format THEN
 2129   5687                      Status := Status + (.BadModuleFormat.);
 2130   56AD    (*#B#*)
 2131   56AD                   IF test((.0,16,19.)) THEN
 2132   56C7                     BEGIN
 2133   56CC                      write(TestOut, 'GetMFvalid   '); TSTstat(Status); TSTindt;
 2134   570F                      writeln(TestOut, 'OMF_Format=',OMF_Format);
 2135   5745                     END;
 2136   5745    (*#E#*)
 2137   5745                  END;  (*VALIDATEMODULEFORMAT*)
 2138   574B    
 2139   574B    
 2140   574B                PROCEDURE GetModuleHeader(VAR GStatus: StatusType
 2141   574B                                         ;VAR LogFile: LogFileType
 2142   574B                                         ;    FileNo:
 2143   574B                                                 FileNameTableIndexType
 2144   574B                                         ;VAR Fl: FileType
 2145   574B                                         ;VAR StartAddressOfNextModule:
 2146   574B                                                 FileAddressType
 2147   574B                                         );
 2148   574B    
 2149   574B                   VAR
 2150   574B                      Status: StatusType;
 2151   574B                      SegmentNo: SegmentNoType;
 2152   574B                      SymbolNo: SymbolTableIndexType;
 2153   574B                      ModuleNo: ModuleTableIndexType;
 2154   574B                      MdtRec: ModuleTableRecordType;
 2155   574B                      NooExpSymbols: QuadImageUnitType;
 2156   574B                      NooExiSymbols: QuadImageUnitType;
 2157   574B    
 2158   574B                   PROCEDURE GetINX(VAR Status: StatusType
 2159   574B                                   ;VAR ModuleNo: ModuleTableIndexType
 2160   574B                                   ;VAR Fl: FileType
 2161   574B                                   ;VAR StartAddressOfNextModule:
 2162   574B                                              FileAddressType
 2163   574B                                   ;VAR NooExpSymbols: QuadImageUnitType
 2164   574B                                   ;VAR NooExiSymbols: QuadImageUnitType
 2165   574B                                   );
 2166   574B    
 2167   574B                      VAR
 2168   574B                         OMH_ModuleSize: QuadImageUnitType;
 2169   574B                         OMH_NooSegments: QuadImageUnitType;
 2170   574B                         OMH_ModuleName: ModuleNameType;
 2171   574B    
 2172   574B                     BEGIN (*GETINX*)
 2173   574B                      WITH ModuleTable(.ModuleNo.) DO
 2174   5776                        BEGIN
 2175   577B                         FGi32(Status, Fl, OMH_ModuleSize);
 2176   5799                         FGi32(Status, Fl, OMH_NooSegments);
 2177   57B7                         FGi32(Status, Fl, NooExpSymbols);
 2178   57D4                         FGi32(Status, Fl, NooExiSymbols);
 2179   57F1                         StartAddressOfNextModule :=
 2180   57FC                               StartAddressOfNextModule + abs(OMH_moduleSize);
 2181   5818                         IF (OMH_NooSegments > MaxNooSegments) or
 2182   582C                            (Noo_ExiSymbols > MaxNooExternalImportSymbols) THEN
 2183   584D                            Status := Status + (.RangeError.)
 2184   5863                         ELSE
 2185   5876                           BEGIN
 2186   587B                            Referenced := false;
 2187   588C                            NooSegments := OMH_NooSegments;
 2188   58AB                            IF NooSegments > CurSegmentCount THEN
 2189   58C7                               CurSegmentCount := NooSegments;
 2190   58DD                            NooExternalImportSymbols := NooExiSymbols;
 2191   5901                            LatestInsert := 0;
 2192   5913                            FGsym(Status, Fl, OMH_ModuleName);
 2193   5931                            IF Status = (..) THEN
 2194   594A                              BEGIN
 2195   594F                               SBTEX(Status
 2196   5954                                    ,ModuleNameReference
 2197   595B                                    ,OMH_ModuleName
 2198   5962                                    ,ModuleNo
 2199   596A                                    ,0,0);
 2200   5987                               IF not (SymbolTableOverFlow IN Status) THEN
 2201   59A1                                  ValueTable(.ModuleNameReference.).SegmentNo := UnResolved;
 2202   59C0                               IF DuplicateExportSymbol IN Status THEN
 2203   59DA                                  Status := Status - (.DuplicateExportSymbol.) +
 2204   59F9                                                     (.DuplicateModuleName.);
 2205   5A09                              END
 2206   5A09                           END
 2207   5A09                        END
 2208   5A09                     END;  (*GETINX*)
 2209   5A0F    
 2210   5A0F    
 2211   5A0F                   PROCEDURE GetSGDs(VAR Status: StatusType
 2212   5A0F                                    ;    SCTBase: SectionTableIndexType
 2213   5A0F                                    ;    NooSegments: SegmentNoType
 2214   5A0F                                    ;    P_ModuleNo: ModuleTableIndexType
 2215   5A0F                                    ;VAR Fl: FileType
 2216   5A0F                                    );
 2217   5A0F    
 2218   5A0F                      LABEL
 2219   5A0F                         99;
 2220   5A0F    
 2221   5A0F                      VAR
 2222   5A0F                         SegmentInx: SegmentNoType;
 2223   5A0F                         Dummy32: QuadImageUnitType;
 2224   5A0F    
 2225   5A0F                     BEGIN (*GETSEGMENTDESCRIPTORS*)
 2226   5A0F                      FOR SegmentInx := 1 TO NooSegments DO
 2227   5A31                        BEGIN
 2228   5A36                         IF Status <> (..) THEN
 2229   5A4F                            GOTO 99;
 2230   5A57                         WITH SectionTable(.SCTbase + SegmentInx.) DO
 2231   5A85                           BEGIN
 2232   5A8A                            SegmentNo := SegmentInx;
 2233   5A99                            ModuleNo := P_ModuleNo;
 2234   5AAD                            FGi32(Status, Fl, Dummy32);
 2235   5ACB                            ImageSize := abs(Dummy32);
 2236   5AE6                            FGi32(Status, Fl, Dummy32);
 2237   5B04                            OvrSize := abs(Dummy32);
 2238   5B21    (*#B#*)
 2239   5B21                            IF test((.0,16,19.)) THEN
 2240   5B3B                              BEGIN
 2241   5B40                               write(TestOut, 'GetSGDs  '); TSTstat(Status);
 2242   5B7C                               TSTindt; TSTsct(SCTbase + SegmentInx); TSTln
 2243   5B9D                              END;
 2244   5BA0    (*#E#*)
 2245   5BA0                           END;
 2246   5BA0                        END;
 2247   5BAA    99:;             END;  (*GETSEGMENTDESCRIPTORS*)
 2248   5BB0    
 2249   5BB0                   PROCEDURE GetEXP(VAR GStatus: StatusType
 2250   5BB0                                   ;VAR LogFile: LogFileType
 2251   5BB0                                   ;VAR Fl: FileType
 2252   5BB0                                   ;VAR LinkHead: SymbolTableIndexType
 2253   5BB0                                   ;    ModuleNo: ModuleTableIndexType
 2254   5BB0                                   ;    NooExpSymbols: i32
 2255   5BB0                                   );
 2256   5BB0    
 2257   5BB0                      VAR
 2258   5BB0                         Status: StatusType;
 2259   5BB0                         SymbolCount: i32;
 2260   5BB0                         DuplicateCount: i32;
 2261   5BB0                         RelocationIndicator: RelocationIndicatorType;
 2262   5BB0                         EXP_RelocationIndicator: ImageUnitType;
 2263   5BB0                         EXP_Item: QuadImageUnitType;
 2264   5BB0                         EXP_SymbolName: SymbolNameType;
 2265   5BB0                         SymbolTableEntryNo: SymbolTableIndexType; (*DUMMY*)
 2266   5BB0                         ModuleName: ModuleNameType;
 2267   5BB0    
 2268   5BB0                     BEGIN (*GETEXPORTLIST*)
 2269   5BB0                      Status := (..);
 2270   5BD0                      LinkHead := 0;
 2271   5BDD                      LatestInsert := 0;
 2272   5BEF                      SymbolCount := 0;
 2273   5BFE                      DuplicateCount := 0;
 2274   5C0D                      IF SymbolCount < NooExpSymbols THEN
 2275   5C22                        BEGIN
 2276   5C27                         SymbolCount := SymbolCount + 1;
 2277   5C37                         FGi8( Status, Fl, EXP_RelocationIndicator);
 2278   5C56                         IF EXP_RelocationIndicator IN (.0..MaxNooSegments.) THEN
 2279   5C68                            RelocationIndicator := EXP_RelocationIndicator
 2280   5C6D                         ELSE
 2281   5C7C                            Status := Status + (.RangeError.);
 2282   5CA4                         FGi32(Status, Fl, EXP_Item);
 2283   5CC3                         FGsym(Status, Fl, EXP_SymbolName);
 2284   5CE2                         IF Status = (..) THEN
 2285   5CFC                           BEGIN
 2286   5D01                            SBTEX(Status
 2287   5D06                                 ,LinkHead
 2288   5D0E                                 ,EXP_SymbolName
 2289   5D15                                 ,ModuleNo
 2290   5D1D                                 ,EXP_RelocationIndicator
 2291   5D24                                 ,EXP_Item
 2292   5D2F                                 );
 2293   5D3C                            IF DuplicateExportSymbol IN Status THEN
 2294   5D55                              BEGIN
 2295   5D5A                               DuplicateCount := DuplicateCount + 1;
 2296   5D6A                               IF DuplicateCount <= 1 THEN
 2297   5D7D                                  LogHdds(LogFile);
 2298   5D8C                               NMTG(SymbolTable(.
 2299   5D91                                       ModuleTable(.ModuleNo
 2300   5D91                                                  .).ModuleNameReference
 2301   5DA5                                               .).NameReference
 2302   5DB7                                   ,ModuleName
 2303   5DC0                                   );
 2304   5DCF                               LogDDS(LogFile
 2305   5DD4                                     ,EXP_RelocationIndicator
 2306   5DDB                                     ,EXP_Item
 2307   5DE6                                     ,EXP_SymbolName
 2308   5DEC                                     ,ModuleName
 2309   5DF4                                     );
 2310   5DFF                              END
 2311   5DFF                           END;
 2312   5DFF                         GStatus := GStatus + Status;
 2313   5E2A                        END;
 2314   5E2A                      WHILE (GStatus <= (.DuplicateExportSymbol.)) and
 2315   5E42                            (SymbolCount < NooExpSymbols) DO
 2316   5E5D                        BEGIN
 2317   5E62                         SymbolCount := SymbolCount + 1;
 2318   5E72                         Status := (..);
 2319   5E8A                         FGi8( Status, Fl, EXP_RelocationIndicator);
 2320   5EA9                         IF EXP_RelocationIndicator IN (.0..MaxNooSegments.) THEN
 2321   5EBB                            RelocationIndicator := EXP_RelocationIndicator
 2322   5EC0                         ELSE
 2323   5ECF                            Status := Status + (.RangeError.);
 2324   5EF7                         FGi32(Status, Fl, EXP_Item);
 2325   5F16                         FGsym(Status, Fl, EXP_SymbolName);
 2326   5F35                         IF Status = (..) THEN
 2327   5F4F                           BEGIN
 2328   5F54                            SBTEX(Status
 2329   5F59                                 ,SymbolTableEntryNo
 2330   5F61                                 ,EXP_SymbolName
 2331   5F69                                 ,ModuleNo
 2332   5F71                                 ,EXP_RelocationIndicator
 2333   5F78                                 ,EXP_Item
 2334   5F83                                 );
 2335   5F90                            IF DuplicateExportSymbol IN Status THEN
 2336   5FA9                              BEGIN
 2337   5FAE                               DuplicateCount := DuplicateCount + 1;
 2338   5FBE                               IF DuplicateCount <= 1 THEN
 2339   5FD1                                  LogHdds(LogFile);
 2340   5FE0                               NMTG(SymbolTable(.
 2341   5FE5                                       ModuleTable(.ModuleNo
 2342   5FE5                                                  .).ModuleNameReference
 2343   5FF9                                               .).NameReference
 2344   600B                                   ,ModuleName
 2345   6014                                   );
 2346   6023                               LogDDS(LogFile
 2347   6028                                     ,EXP_RelocationIndicator
 2348   602F                                     ,EXP_Item
 2349   603A                                     ,EXP_SymbolName
 2350   6040                                     ,ModuleName
 2351   6048                                     );
 2352   6053                              END
 2353   6053                           END;
 2354   6053                         GStatus := GStatus + Status
 2355   6069                        END; (*WHILE ... DO*)
 2356   6081                     END;  (*GETEXPORTLIST*)
 2357   6087    
 2358   6087                   PROCEDURE GetEXI(VAR Status: StatusType
 2359   6087                                   ;VAR Fl: FileType
 2360   6087                                   ;    ModuleNo: ModuleTableIndexType
 2361   6087                                   ;    NooExternalImportSymbols: i32
 2362   6087                                   );
 2363   6087    
 2364   6087                      VAR
 2365   6087                         SymbolTableEntryNo: SymbolTableIndexType;
 2366   6087                         SymbolCount: i32;
 2367   6087                         EXI_SymbolName: SymbolNameType;
 2368   6087    
 2369   6087                     BEGIN (*GETEXTERNALIMPORTLIST*)
 2370   6087                      SymbolCount := 0;
 2371   609E                      WHILE (Status = (..)) and
 2372   60B4                            (SymbolCount < NooExternalImportSymbols) DO
 2373   60CE                        BEGIN
 2374   60D3                         SymbolCount := SymbolCount + 1;
 2375   60E3                         FGsym(Status, Fl, EXI_SymbolName);
 2376   6101                         IF Status = (..) THEN
 2377   6119                            SBTIM(Status
 2378   611E                                 ,SymbolTableEntryNo
 2379   6125                                 ,EXI_SymbolName
 2380   612D                                 ,ModuleNo
 2381   6135                                 );
 2382   6143                        END; (*WHILE ... DO*)
 2383   6146                     END;  (*GETEXTERNALIMPORTLIST*)
 2384   614C    
 2385   614C    
 2386   614C    
 2387   614C                  BEGIN (*GETMODULEHEADER*)
 2388   614C                   Status := (..);
 2389   616C                   MDTA(Status, ModuleNo, 1);
 2390   6187                   IF Status = (..) THEN
 2391   61A1                     BEGIN
 2392   61A6                      GetINX(Status, ModuleNo, Fl
 2393   61BB                            , StartAddressOfNextModule
 2394   61C2                            , NooExpSymbols
 2395   61C9                            , NooExiSymbols);
 2396   61E0                      IF Status = (..) THEN
 2397   61FA                         WITH ModuleTable(.ModuleNo.) DO
 2398   6219                           BEGIN
 2399   621E                            FileNameReference := FileNo;
 2400   622D                            SCTA(Status, SCTBase, NooSegments);
 2401   6257                            IF Status = (..) THEN
 2402   6271                              BEGIN
 2403   6276                               GetSGDs(Status
 2404   627B                                      ,SCTBase
 2405   6283                                      ,NooSegments
 2406   6292                                      ,ModuleNo
 2407   62A1                                      ,Fl
 2408   62A8                                      );
 2409   62B2                               IF Status = (..) THEN
 2410   62CC                                 BEGIN
 2411   62D1                                  SymbolTable(.ModuleNameReference
 2412   62D6                                             .).ModuleNo := ModuleNo;
 2413   62F7                                  GetEXP(Status
 2414   62FC                                        ,LogFile
 2415   6304                                        ,Fl
 2416   630B                                        ,SBTLinkHead
 2417   6312                                        ,ModuleNo
 2418   631D                                        ,NooExpSymbols
 2419   6324                                        );
 2420   6331                                  IF Status <= (.DuplicateExportSymbol.) THEN
 2421   634D                                    BEGIN
 2422   6352                                     EITOffset := CurExternalImportSymbolNo;
 2423   636A                                     GetEXI(Status
 2424   636F                                           ,Fl
 2425   6377                                           ,ModuleNo
 2426   637E                                           ,NooExiSymbols
 2427   6385                                           );
 2428   6392                                     CurrentFileAddress := Fl.P;
 2429   63B1                                    END
 2430   63B1                                 END
 2431   63B1                              END
 2432   63B1                           END;
 2433   63B1                     END;
 2434   63B1                   GStatus := GStatus + Status;
 2435   63DC    (*#B#*)
 2436   63DC                   IF test((.0,6,16,19.)) THEN
 2437   63F5                     BEGIN
 2438   63FA                      write(TestOut, 'GetOMH   '); TSTstat(Status); TSTln;
 2439   643A                      TSTindt; TSTindt; TSTindt; TSTmdt(ModuleNo);
 2440   6452                     END;
 2441   6452    (*#E#*)
 2442   6452                  END;  (*GETMODULEHEADER*)
 2443   6458    
 2444   6458               BEGIN (*GETMODULES*)
 2445   6458                REPEAT
 2446   6465                   Status := (..);
 2447   647D                   FilSeek(Status, InputFile, StartAddressOfNextModule);
 2448   649E                   IF not (UnexpectedEof IN Status) THEN
 2449   64B7                     BEGIN
 2450   64BC                      ValidateModuleFormat(Status, InputFile, OM_Format1);
 2451   64DC                      IF UnexpectedEof IN Status THEN
 2452   64F4                        BEGIN
 2453   64F9                         LogEOFerror(LogFile, FileNumber, InputFile.P)
 2454   6519                        END
 2455   651C                      ELSE IF (BadModuleFormat IN Status) THEN
 2456   6536                        BEGIN
 2457   653B                         LogOMFerror(LogFile, FileNumber, InputFile.P)
 2458   655B                        END
 2459   655E                      ELSE (* Status = (..) *)
 2460   6560                         GetModuleHeader(Status
 2461   6565                                        ,LogFile
 2462   656D                                        ,FileNumber
 2463   6574                                        ,InputFile
 2464   657B                                        ,StartAddressOfNextModule
 2465   6583                                        );
 2466   6592                      GStatus := GStatus + Status;
 2467   65BD                     END
 2468   65BD                UNTIL Status - (.DuplicateExportSymbol, BadSymbolName.) <> (..);
 2469   65DB               END;  (*GETMODULES*)
 2470   65E1    
 2471   65E1            BEGIN (*GETINPUTFILES*)
 2472   65E1             FOR FileNo := 1 TO CurFileNo DO
 2473   6603               BEGIN
 2474   6608                Status := (..);
 2475   6620                FilAsg(InputFile, FileNameTable(.FileNo.));
 2476   664C                FilRst(Status, InputFile);
 2477   6664                IF Status = (..) THEN
 2478   667E                  BEGIN
 2479   6683                   ValidateFileFormat (Status, InputFile, OF_Format1);
 2480   66A3                   IF Status = (..) THEN
 2481   66BD                      GetModules(Status, LogFile, FileNo, InputFile, 4)
 2482   66E8                   ELSE IF BadFileFormat IN Status THEN
 2483   670B                      LogOFFerror(LogFile, FileNo);
 2484   6721                  END;
 2485   6721                IF UnexpectedEof IN Status THEN
 2486   673A                   LogEOFerror(LogFile, FileNo, InputFile.P);
 2487   6759                FilCls(InputFile);
 2488   6769                GStatus := GStatus + Status;
 2489   6794               END;
 2490   679E             IF CurModuleNo <= 0 THEN
 2491   67AF                GStatus := GStatus + (.NoInput.);
 2492   67D5            END;  (*GETINPUTFILES*)
 2493   67DE    
 2494   67DE    (*                                                                            *)
 2495   67DE    (*                                                                            *)
 2496   67DE    (******************************************************************************)
 2497   67DE    
 2498   67DE    (*$I B:lnkp1-2.pas  putmodule                                                 *)
 2499   67DE    (******************************************************************************)
 2500   67DE    (*                                                                            *)
 2501   67DE    (*   Copyright (1985) by Metanic Aps., Denmark                                *)
 2502   67DE    (*                                                                            *)
 2503   67DE    (*   Author: Lars Gregers Jakobsen.                                           *)
 2504   67DE    (*                                                                            *)
 2505   67DE    (******************************************************************************)
 2506   67DE    
 2507   67DE          PROCEDURE PutTargetFile(VAR Status: StatusType
 2508   67DE                                 ;VAR TargetFile: FileType
 2509   67DE                                 ;VAR LogFile: LogFileType
 2510   67DE                                 );
 2511   67DE    
 2512   67DE             PROCEDURE PutFF(VAR Fl: FileType
 2513   67DE                            );
 2514   67DE    
 2515   67DE               BEGIN (*PUTFF*)
 2516   67DE                FPi32(Fl, OF_Format1);
 2517   67FD               END;  (*OUTFF*)
 2518   6803    
 2519   6803             PROCEDURE PutModule(VAR Status: StatusType
 2520   6803                                ;VAR TargetFile: FileType
 2521   6803                                ;VAR  LogFile: LogFileType
 2522   6803                                );
 2523   6803    
 2524   6803                PROCEDURE PutMF(VAR Fl: FileType
 2525   6803                               );
 2526   6803    
 2527   6803                  BEGIN (*PUTMF*)
 2528   6803                   FPi32(Fl, OM_Format1);
 2529   6822                  END;  (*OUTMF*)
 2530   6828    
 2531   6828                PROCEDURE PutINX(VAR Status: StatusType
 2532   6828                                ;VAR Fl: FileType
 2533   6828                                ;VAR LogFile: LogFileType
 2534   6828                                );
 2535   6828    
 2536   6828                   VAR
 2537   6828                      OMH_ModuleName: ModuleNameType;
 2538   6828    
 2539   6828                  BEGIN (*PUTINX*)
 2540   6828                   FPi32(Fl,0); (* OMH_Module *)
 2541   6847                   FPi32(Fl,0); (* OMH_NooSegments *)
 2542   685E                   FPi32(Fl,0); (* OMH_NooExportSymbols *)
 2543   6875                   FPi32(Fl,0); (* OMH_NooExtImportSymbols *)
 2544   688C                   NMTG(SymbolTable(.ModuleTable(.1.).ModuleNameReference
 2545   6891                                   .).NameReference
 2546   68A5                       , OMH_ModuleName
 2547   68AE                       );
 2548   68BD                   FPsym(Fl, OMH_ModuleName);
 2549   68D4                  END;  (*PUTINX*)
 2550   68DA    
 2551   68DA                PROCEDURE PutSGDs(VAR Status: StatusType
 2552   68DA                                 ;VAR Fl: Filetype
 2553   68DA                                 ;VAR LogFile: LogFileType
 2554   68DA                                 );
 2555   68DA    
 2556   68DA                   VAR
 2557   68DA                      SRCinx: SectionTableIndexType;
 2558   68DA                      DSTinx: SectionTableIndexType;
 2559   68DA                      ModuleName: ModuleNameType;
 2560   68DA    
 2561   68DA                  PROCEDURE PutSGD(VAR TargetFile: FileType
 2562   68DA                                  ;    Section: SectionTableRecordType
 2563   68DA                                  );
 2564   68DA    
 2565   68DA                     BEGIN (*PUTSGD*)
 2566   68DA                      WITH Section  DO
 2567   68FC                        BEGIN
 2568   6901                         FPi32(TargetFile, ImageSize);
 2569   6916                         FPi32(TargetFile, OvrSize);
 2570   692B                        END;
 2571   692B                     END;  (*PUTSGD*)
 2572   6931    
 2573   6931                  BEGIN (*PUTSGDS*)
 2574   6931                   Status := (..);
 2575   6950                   SCTA(Status, TargetSectionOffset, CurSegmentCount);
 2576   696A                   IF not (SectionTableOverFlow IN Status) THEN
 2577   6985                     BEGIN
 2578   698A                      IF CurSegmentCount > 0 THEN
 2579   699B                         LogHSgd(LogFile);
 2580   69AA                      FOR DSTinx := 1 TO CurSegmentCount DO
 2581   69C4                         WITH SectionTable(.TargetSectionOffset + DSTinx.) DO
 2582   69F2                           BEGIN
 2583   69F7                            ModuleNo := TargetModuleNo;
 2584   6A05                            SegmentNo := DSTinx;
 2585   6A1A                            ImageSize := 0;                (*TO BE UPDATED*)
 2586   6A31                            OvrSize := 0;
 2587   6A4A                            RelocationConstant := 0;
 2588   6A63                            FOR SRCinx := 1 TO TargetSectionOffset DO
 2589   6A7D                               IF SectionTable(.SRCinx.).SegmentNo = DSTinx THEN
 2590   6A9B                                 BEGIN
 2591   6AA0                                  SectionTable(.SRCinx.).RelocationConstant :=
 2592   6AB9                                               ImageSize * ImageFactor;
 2593   6ADA                                  ImageSize := ImageSize +
 2594   6AF3                                               SectionTable(.SRCinx.).ImageSize;
 2595   6B17                                  WITH SectionTable(.SRCinx.) DO (*Log memory map element*)
 2596   6B36                                     IF SectionTable(.SRCinx.).ImageSize > 0 THEN
 2597   6B62                                       BEGIN
 2598   6B67                                        NMTG(SymbolTable(.ModuleTable(.
 2599   6B6C                                                          ModuleNo.).ModuleNameReference
 2600   6B84                                                        .).Namereference
 2601   6B96                                            ,ModuleName
 2602   6B9F                                            );
 2603   6BAE                                        LogSGD(LogFile
 2604   6BB3                                              ,DSTinx
 2605   6BBA                                              ,RelocationConstant
 2606   6BC1                                              ,ImageSize*ImageFactor
 2607   6BDE                                              ,ModuleName
 2608   6BEE                                              );
 2609   6BF9                                       END;
 2610   6BF9    (*#B#*)
 2611   6BF9                                  IF test((.0,6,16,19.)) THEN
 2612   6C13                                    BEGIN
 2613   6C18                                     write(TestOut, 'PutSGDs-1');
 2614   6C40                                     TSTsct(SRCinx);
 2615   6C4F                                    END;
 2616   6C4F    (*#E#*)
 2617   6C4F                                 END; (* FOR SRCinx := ... *)
 2618   6C59                            PutSGD(Fl, SectionTable(.TargetSectionOffset +
 2619   6C65                                                     DSTinx.)  );
 2620   6C8C    (*#B#*)
 2621   6C8C                            IF test((.0,6,16,19.)) THEN
 2622   6CA6                              BEGIN
 2623   6CAB                               write(TestOut, 'PutSGDs-2');
 2624   6CD3                               TSTsct(TargetSectionOffset + DSTinx);
 2625   6CF1                              END;
 2626   6CF1    (*#E#*)
 2627   6CF1                           END; (* FOR DSTinx := ... *)
 2628   6CFB                     END; (* allocation ok *)
 2629   6CFB                  END;  (*PUTSGDS*)
 2630   6D01    
 2631   6D01                PROCEDURE PutEXP(VAR Status: StatusType
 2632   6D01                                ;VAR Target: FileType
 2633   6D01                                ;VAR LogFile: LogFileType
 2634   6D01                                );
 2635   6D01    
 2636   6D01                   VAR
 2637   6D01                      MDTInx: ModuleTableIndexType;
 2638   6D01                      ModuleName: ModuleNameType;
 2639   6D01                      Heap: HeapType;
 2640   6D01                      HeapMax: HeapIndexType;
 2641   6D01                      Winner: SymboltableIndexType;
 2642   6D01                      SymbolNo: SymbolTableIndexType;
 2643   6D01                      EXP_RelocationIndicator: RelocationIndicatorType;
 2644   6D01                      EXP_Item: i32;
 2645   6D01                      EXP_SymbolName: SymbolNameType;
 2646   6D01                      SbtInx: SymbolTableIndexType;
 2647   6D01    
 2648   6D01                   FUNCTION NameSwop(VAR A
 2649   6D01                                    ,    B: SymbolNameType
 2650   6D01                                    ): boolean;
 2651   6D01    
 2652   6D01                      VAR
 2653   6D01                         I: integer;
 2654   6D01    
 2655   6D01                     BEGIN (*NAMESWOP*)
 2656   6D01                      I := 1;
 2657   6D18                      IF B.Length < A.Length THEN
 2658   6D34                        BEGIN
 2659   6D39                         WHILE (I <= B.Length) and (A.Name(.I.) >= B.Name(.I.)) DO
 2660   6DA0                            I := I + 1;
 2661   6DB3                         NameSwop := (I > B.Length);
 2662   6DD7                        END
 2663   6DD7                      ELSE
 2664   6DDA                        BEGIN
 2665   6DDF                         WHILE (I <= A.Length) and (A.Name(.I.) <= B.Name(.I.)) DO
 2666   6E49                            I := I + 1;
 2667   6E5C                         NameSwop := not (I > A.Length);
 2668   6E80                        END;
 2669   6E80    (*#B#*)
 2670   6E80                      IF test((.0,13.)) THEN
 2671   6E99                        BEGIN
 2672   6E9E                         writeln(TestOut, 'NameSwop ', 'I=', I:1);
 2673   6EE1                         TSTindt; TSTindt; TSTindt;
 2674   6EEF                         write(TestOut, 'A='); TSTsymbol(A);
 2675   6F1A                         TSTindt; TSTindt; TSTindt;
 2676   6F28                         write(TestOut, 'B='); TSTsymbol(B);
 2677   6F53                        END
 2678   6F53    (*#E#*)
 2679   6F53                     END;  (*NAMESWOP*)
 2680   6F5C    
 2681   6F5C                   PROCEDURE InHeap(    New: SymbolTableIndexType
 2682   6F5C                                   );
 2683   6F5C    
 2684   6F5C                      VAR
 2685   6F5C                         I,J: integer;
 2686   6F5C                         Z,V: SymbolNameType;
 2687   6F5C                         Swop: boolean;
 2688   6F5C    
 2689   6F5C                     BEGIN (*INHEAP*)
 2690   6F5C                      HeapMax := HeapMax + 1;
 2691   6F82                      I := HeapMax;
 2692   6F91                      NMTG(SymbolTable(.New.).NameReference, Z);
 2693   6FC2                      IF I > 1 THEN
 2694   6FD9                      REPEAT
 2695   6FDE                         J := I div 2;
 2696   6FF6                         NMTG(SymbolTable(. Heap(.J.) .).NameReference, V);
 2697   703A                         Swop := NameSwop(V,Z);
 2698   7058                         IF Swop THEN
 2699   7061                           BEGIN
 2700   7066                            Heap(.I.) := Heap(.J.);
 2701   70A4                            I := J
 2702   70A9                           END
 2703   70B1                      UNTIL (I <= 1) or ( not Swop );
 2704   70D0                      Heap(.I.) := New;
 2705   70F7    (*#B#*)
 2706   70F7                      IF test((.0,13.)) THEN
 2707   7110                       BEGIN
 2708   7115                        writeln(TestOut, 'InHeap   New=', New:1);
 2709   7152                        TSTheap(Heap, HeapMax);
 2710   716D                       END;
 2711   716D    (*#E#*)
 2712   716D                     END;  (*INHEAP*)
 2713   7173    
 2714   7173                   PROCEDURE SelectWinner(VAR Status: StatusType
 2715   7173                                         );
 2716   7173    
 2717   7173                      VAR
 2718   7173                         I,J: integer;
 2719   7173                         Swop: boolean;
 2720   7173                         V,W,Z: SymbolNameType;
 2721   7173                         New: SymbolTableIndexType;
 2722   7173    
 2723   7173                     BEGIN (*SELECTWINNER*)
 2724   7173                      IF (0 < HeapMax) THEN
 2725   718F                        BEGIN
 2726   7194                         Winner := Heap(.1.);
 2727   71AA                         WITH Symboltable(.Winner.) DO
 2728   71C6                            IF SortLink <> Winner THEN
 2729   71DA                               New := SortLink
 2730   71DF                            ELSE
 2731   71F3                              BEGIN (* Chain exhausted - descrease size of heap *)
 2732   71F8                               New := Heap(.HeapMax.);
 2733   721A                               HeapMax := HeapMax - 1;
 2734   7238                              END;
 2735   7238                         I := 1;
 2736   7247                         IF HeapMax >= 2 THEN
 2737   725B                           BEGIN
 2738   7260                            J := 2;
 2739   726F                            Heap(.HeapMax + 1.) := New;
 2740   729B                            NMTG(SymbolTable(.New.).NameReference, Z);
 2741   72CC                            REPEAT
 2742   72D1                               (* J <= HeapMax *)
 2743   72D1    
 2744   72D1                               NMTG(SymbolTable(.Heap(. J .).).NameReference, V);
 2745   7319                               NMTG(SymbolTable(.Heap(.J+1.).).NameReference, W);
 2746   7364                               IF NameSwop(V,W) THEN
 2747   7380                                 BEGIN
 2748   7385                                  V := W;
 2749   739F                                  J := J + 1
 2750   73A8                                 END;
 2751   73AF    
 2752   73AF                               Swop := NameSwop(Z,V);
 2753   73CD                               IF Swop THEN
 2754   73D6                                 BEGIN
 2755   73DB                                  Heap(.I.) := Heap(.J.);
 2756   7419                                  I := J;
 2757   7426                                  J := I + I;
 2758   7438                                 END;
 2759   7438    
 2760   7438    (*#B#*)
 2761   7438                               IF test((.0,13.)) THEN
 2762   7451                                 BEGIN
 2763   7456                                  write(TestOut, 'SLCT-W-1 ', 'I='  , I:1
 2764   7490                                                    , ' ':2 , 'J='  , J:1
 2765   74B4                                                    , ' ':2 , 'New=', New:1
 2766   74DF                                                    , ' ':2 , 'Swop='
 2767   74F6                                       ); TSTbool(Swop); TSTln;
 2768   7515                                  TSTheap(Heap, HeapMax);
 2769   7530                                 END
 2770   7530    (*#E#*)
 2771   7530    
 2772   7530                            UNTIL (not Swop) or (J > HeapMax);
 2773   7556                           END;
 2774   7556                         Heap(.I.) := New;
 2775   757D                        END
 2776   757D                      ELSE
 2777   7580                         Status := Status + (.HeapEmpty.);
 2778   75A8    (*#B#*)
 2779   75A8                      IF test((.0,13,16,19.)) THEN
 2780   75C2                        BEGIN
 2781   75C7                         write(TestOut, 'SLCT-W-2 '); TSTstat(Status); TSTindt;
 2782   7606                         writeln(TestOut,        'HeapMax=', HeapMax:1
 2783   7639                                        , ' ':2, 'Winner=', Winner:1
 2784   766B                                );
 2785   7674                        END;
 2786   7674    (*#E#*)
 2787   7674                     END;  (*SELECTWINNER*)
 2788   767A    
 2789   767A    
 2790   767A                  BEGIN (*PUTEXP*)
 2791   767A    
 2792   767A    (*#B#*)
 2793   767A                   IF test((.0,13.)) THEN
 2794   769B                     BEGIN
 2795   76A0                      writeln(TestOut, 'PUTEXP   ');
 2796   76C8                      FOR SbtInx := 1 TO MaxNooSymbols DO
 2797   76D9                         WITH SymbolTable(.SbtInx.), ValueTable(.SbtInx.) DO
 2798   770F                            IF NameReference <> 0 THEN
 2799   7724                              BEGIN
 2800   7729                               TSTindt; TSTindt; TSTindt; TSTsbt(SbtInx);
 2801   7745                               TSTindt; TSTvlt(SbtInx); TSTln;
 2802   775A                              END;
 2803   7764                     END;
 2804   7764    (*#E#*)
 2805   7764    
 2806   7764                   (*Initialize selection*)
 2807   7764                   HeapMax := 0;
 2808   776D                   FOR MDTInx := 1 TO TargetModuleNo - 1 DO
 2809   7794                      IF ModuleTable(.MDTInx
 2810   7799                                    .).SBTLinkHead IN (.1..MaxNooSymbols.) THEN
 2811   77C7                         InHeap(ModuleTable(.MDTInx.).SBTLinkHead);
 2812   77FA    
 2813   77FA                   IF HeapMax > 0 THEN
 2814   780A                      LogHxpN(LogFile);
 2815   7819                   NooExpSymbols := 0;
 2816   782B    
 2817   782B                   WHILE (Status = (..)) DO
 2818   7844                     BEGIN
 2819   7849                      SelectWinner(Status);
 2820   785C                      IF Status = (..) THEN
 2821   7875                         WITH SymbolTable(.Winner.), ValueTable(.Winner.) DO
 2822   78AE                            IF SegmentNo > UnResolved THEN
 2823   78BF                              BEGIN
 2824   78C4                               NooExpSymbols := NooExpSymbols + 1;
 2825   78DA                               IF (SegmentNo > 0)  THEN (*relocatable*)
 2826   78F1                                  WITH SectionTable(.ModuleTable(.ModuleNo
 2827   78F6                                                                .).SCTbase +
 2828   790E                                                                   SegmentNo
 2829   790E                                                   .) DO
 2830   793F                                    BEGIN
 2831   7944                                     Value := Value + RelocationConstant;
 2832   7970                                    END;
 2833   7970                               EXP_RelocationIndicator := SegmentNo;
 2834   7982                               EXP_Item := Value;
 2835   7995                               NMTG(NameReference, EXP_SymbolName);
 2836   79B8                               FPi8(Target, EXP_RelocationIndicator);
 2837   79CF                               FPi32(Target, EXP_Item);
 2838   79E4                               FPsym(Target, EXP_SymbolName);
 2839   79FB                               IF (Status = (..)) and (OPTlfk <> none) THEN
 2840   7A24                                 BEGIN
 2841   7A29                                  NMTG(SymbolTable(.
 2842   7A2E                                          ModuleTable(.ModuleNo
 2843   7A2E                                                     .).ModuleNameReference
 2844   7A46                                                  .).NameReference
 2845   7A58                                      ,ModuleName
 2846   7A61                                      );
 2847   7A70                                  LogXP(LogFile
 2848   7A75                                       ,EXP_RelocationIndicator
 2849   7A7C                                       ,EXP_Item
 2850   7A83                                       ,EXP_SymbolName
 2851   7A89                                       ,ModuleName
 2852   7A91                                       )
 2853   7A99                                 END;
 2854   7A9C                              END;
 2855   7A9C                     END;
 2856   7A9F                   Status := Status - (.HeapEmpty.);
 2857   7AC7                   IF (HeapEmpty IN Status) and (OPTlfk <> none) THEN
 2858   7AF2                     BEGIN  (*sort sbt/vlt by value and log*)
 2859   7AF7                     END
 2860   7AF7                  END;  (*PUTEXP*)
 2861   7AFD    
 2862   7AFD    
 2863   7AFD                PROCEDURE PutEXI(VAR Status: StatusType
 2864   7AFD                                ;VAR Target: FileType
 2865   7AFD                                ;VAR LogFile: LogFileType
 2866   7AFD                                );
 2867   7AFD    
 2868   7AFD                LABEL
 2869   7AFD                   1;
 2870   7AFD    
 2871   7AFD                VAR
 2872   7AFD                     ModuleName: ModuleNameType;
 2873   7AFD                     SymbolName: SymbolNameType;
 2874   7AFD                     ExiInx1: ExternalImportTableIndexType;
 2875   7AFD                     ExiInx: ExternalImportTableIndexType;
 2876   7AFD    
 2877   7AFD                  (* TargetModuleNo is a global variable *)
 2878   7AFD    
 2879   7AFD                  BEGIN (*PUTEXI*)
 2880   7AFD                   NooExiSymbols := 0;
 2881   7B17    
 2882   7B17                   ExiInx1 := 1;
 2883   7B20                   FOR ExiInx1 := 1 TO CurExternalImportSymbolNo DO
 2884   7B3A                     BEGIN
 2885   7B3F    (*#B#*)
 2886   7B3F                      IF test((.0,7.)) THEN
 2887   7B56                        BEGIN
 2888   7B5B                         write(TestOut, 'PUTEXI-1 ');
 2889   7B83                         TSTeit(ExiInx1);
 2890   7B92                        END;
 2891   7B92    (*#E#*)
 2892   7B92                      IF (ValueTable(.ExternalImportTable(.ExiInx1.).SymbolNo
 2893   7BA5                                    .).SegmentNo = UnResolved) THEN
 2894   7BBD                         GOTO 1;
 2895   7BC5                     END;
 2896   7BCF    
 2897   7BCF    1:             IF (CurExternalImportSymbolNo > 0) THEN
 2898   7BE0                      IF (ValueTable(.ExternalImportTable(.ExiInx1.).SymbolNo
 2899   7BF3                                .).SegmentNo = UnResolved) THEN
 2900   7C0B                        BEGIN
 2901   7C10                         LogHurs(LogFile);
 2902   7C1F                         FOR ExiInx := ExiInx1 TO CurExternalImportSymbolNo DO
 2903   7C3A                           BEGIN
 2904   7C3F    (*#B#*)
 2905   7C3F                            IF test((.0,7.)) THEN
 2906   7C56                              BEGIN
 2907   7C5B                               write(TestOut, 'PUTEXI-2 ');
 2908   7C83                               TSTeit(ExiInx);
 2909   7C92                              END;
 2910   7C92    (*#E#*)
 2911   7C92                            WITH ExternalImportTable(.ExiInx.) DO
 2912   7CAB                               WITH ValueTable(.SymbolNo.),
 2913   7CC8                                    SymbolTable(.SymbolNo.) DO
 2914   7CE6                                        IF SegmentNo = UnResolved THEN
 2915   7CF7                                          BEGIN
 2916   7CFC                                           NooExiSymbols := NooExiSymbols + 1;
 2917   7D12                                           Value := NooExiSymbols;
 2918   7D29                                           NMTG(NameReference, SymbolName);
 2919   7D4C                                           FPsym(Target, SymbolName);
 2920   7D63                                           NMTG(SymbolTable(.
 2921   7D68                                                   ModuleTable(.ModuleNo
 2922   7D68                                                              .).ModuleNameReference
 2923   7D80                                                           .).NameReference
 2924   7D92                                               ,ModuleName
 2925   7D9B                                               );
 2926   7DAA                                           LogURS(LogFile, ModuleName, SymbolName);
 2927   7DC9    (*#B#*)
 2928   7DC9                                           IF test((.0,16,19.)) THEN
 2929   7DE3                                             BEGIN
 2930   7DE8                                              writeln(TestOut, 'PutEXI   '
 2931   7E03                                                             , 'SymbolNo=', SymbolNo:1
 2932   7E32                                                             , ' ':2, 'Value=', Value:1);
 2933   7E69                                             END;
 2934   7E69    (*#E#*)
 2935   7E69                                          END;
 2936   7E69    
 2937   7E69                           END;
 2938   7E73                        END;
 2939   7E73                  END;  (*PUTEXI*)
 2940   7E79    
 2941   7E79               (* TargetModuleNo is a global variable *)
 2942   7E79    
 2943   7E79               BEGIN (*PUTMODULE*)
 2944   7E79                MDTA(Status, TargetModuleNo, 1);
 2945   7E97                IF not (ModuleTableOverFlow IN Status) THEN
 2946   7EB2                  BEGIN
 2947   7EB7                   PutMF(TargetFile);
 2948   7EC6                   PutINX(Status, TargetFile, LogFile);
 2949   7EE7                   IF Status = (..) THEN
 2950   7F00                     BEGIN (*Calculate memory map, write sgd, and log*)
 2951   7F05                      PutSGDs(Status, TargetFile, LogFile);
 2952   7F26    
 2953   7F26                      IF not (SectionTableOverFlow IN Status) THEN
 2954   7F41                        BEGIN (*Relocate symbol table, write export list, and log*)
 2955   7F46                         PutEXP(Status, TargetFile, LogFile);
 2956   7F67                         IF Status = (..) THEN
 2957   7F80                           BEGIN (*Write EXI while logging unresolved references*)
 2958   7F85                            PutEXI(Status, TargetFile, LogFile);
 2959   7FA6                           END;
 2960   7FA6                        END;
 2961   7FA6                     END;
 2962   7FA6                  END;
 2963   7FA6               END;  (*PUTMODULE*)
 2964   7FAC    
 2965   7FAC            BEGIN (*PUTTARGETFILE*)
 2966   7FAC             PutFF(TargetFile);
 2967   7FC3             PutModule(Status, TargetFile, LogFile);
 2968   7FE4            END;  (*PUTTARGETFILE*)
 2969   7FEA    
 2970   7FEA    (*                                                                            *)
 2971   7FEA    (*                                                                            *)
 2972   7FEA    (******************************************************************************)
 2973   7FEA    
 2974   7FEA    
 2975   7FEA         BEGIN (*PASS1*)
 2976   7FEA    
 2977   7FEA          (* Initialize local data structures *)
 2978   7FEA          FOR SBTSubInx := 1 TO MaxNooSymbols DO
 2979   8005             SymbolTable(.SBTSubInx.).NameReference := 0;
 2980   802B          LatestInsert := 0;
 2981   803D          CurrentSymbolCount := 0;
 2982   804F          CurrentNameTableIndex := 0;
 2983   805D    
 2984   805D          GetInputFiles(Status, LogFile);
 2985   8089          IF Status = (..) THEN
 2986   80AB            BEGIN
 2987   80B0             PutTargetFile(Status, TargetFile, LogFile);
 2988   80EC            END;
 2989   80EC         END;  (*PASS1*)
 2990   80F2    
 2991   80F2    (*                                                                            *)
 2992   80F2    (*                                                                            *)
 2993   80F2    (******************************************************************************)
 2994   80F2    
 2995   80F2    (*$I B:lnkp2.pas    Procedure pass2                                           *)
 2996   80F2    (******************************************************************************)
 2997   80F2    (*                                                                            *)
 2998   80F2    (*   Copyright (1985) by Metanic Aps., Denmark                                *)
 2999   80F2    (*                                                                            *)
 3000   80F2    (*   Author: Lars Gregers Jakobsen.                                           *)
 3001   80F2    (*                                                                            *)
 3002   80F2    (******************************************************************************)
 3003   80F2    
 3004   80F2       PROCEDURE Pass2(VAR Status: StatusType
 3005   80F2                      ;VAR TargetFile: FileType
 3006   80F2                      ;VAR LogFile: LogFileType
 3007   80F2                      );
 3008   80F2    
 3009   80F2          LABEL
 3010   80F2             999;
 3011   80F2    
 3012   80F2          VAR
 3013   80F2             SegmentInx: SegmentNoType;
 3014   80F2             ModuleInx: ModuleTableIndexType;
 3015   80F2             Crid: BitMappedFileType;  (*Composite relocation import directory*)
 3016   80F2             Covr: FileType;           (*Composite overrun store*)
 3017   80F2    
 3018   80F2    (*#B#*)
 3019   80F2    (*$I B:LNKDF5.PAS  Bit Map Buffer Test Output                            *)
 3020   80F2    (******************************************************************************)
 3021   80F2    (*                                                                            *)
 3022   80F2    (*   Copyright (1985) by Metanic Aps., Denmark                                *)
 3023   80F2    (*                                                                            *)
 3024   80F2    (*   Author: Lars Gregers Jakobsen.                                           *)
 3025   80F2    (*                                                                            *)
 3026   80F2    (******************************************************************************)
 3027   80F2    
 3028   80F2          PROCEDURE TSTbmb(Bmb: BitMapBufferType
 3029   80F2                          );
 3030   80F2    
 3031   80F2             VAR
 3032   80F2                I: 0..15;
 3033   80F2    
 3034   80F2            BEGIN (*TSTBMB*)
 3035   80F2             write(TestOut, 'Y1,Y0,I,P= ', Bmb.Y1:3, ' ', Bmb.Y0:3, ' ');
 3036   8169             FOR I := 15 DOWNTO 8 DO
 3037   817A                IF I IN Bmb.I THEN
 3038   8191                   write(TestOut, '1')
 3039   81A9                ELSE
 3040   81AF                   write(TestOut, '0');
 3041   81D4             write(TestOut, ' ');
 3042   81EF             FOR I := 7 DOWNTO 0 DO
 3043   8200                IF I IN Bmb.I THEN
 3044   8217                   write(TestOut, '1')
 3045   822F                ELSE
 3046   8235                   write(TestOut, '0');
 3047   825A             write(TestOut, ' ', Bmb.P:3, '   ');
 3048   8296            END;  (*TSTBMB*)
 3049   829C    
 3050   829C    (*                                                                            *)
 3051   829C    (*                                                                            *)
 3052   829C    (******************************************************************************)
 3053   829C    
 3054   829C    (*$I B:LNKDF6.PAS  Bit Map Access Primitives                                  *)
 3055   829C    (******************************************************************************)
 3056   829C    (*                                                                            *)
 3057   829C    (*   Copyright (1985) by Metanic Aps., Denmark                                *)
 3058   829C    (*                                                                            *)
 3059   829C    (*   Author: Lars Gregers Jakobsen.                                           *)
 3060   829C    (*                                                                            *)
 3061   829C    (******************************************************************************)
 3062   829C    
 3063   829C          PROCEDURE BMG2(VAR BM: BitMappedFileType
 3064   829C                        ;VAR Relocatable: boolean
 3065   829C                        ;VAR Importable: boolean
 3066   829C                        );
 3067   829C    
 3068   829C            BEGIN (*BMG2*)
 3069   829C             WITH BM, BM.B DO
 3070   82C3               BEGIN
 3071   82C8                IF P <= 8 THEN
 3072   82D9                  BEGIN
 3073   82DE                   read(F, Y1);
 3074   8309                   P := P + 8;
 3075   832C                  END;
 3076   832C                P := P - 1;
 3077   834C                Relocatable := P IN I;
 3078   837A                P := P - 1;
 3079   839A                Importable  := P IN I;
 3080   83C8    (*#B#*)
 3081   83C8                IF test((.0,4.)) THEN
 3082   83DF                  BEGIN
 3083   83E4                   write(TestOut, 'BMG2     '); TSTbmb(BM.B);
 3084   8418                   write(TestOut, 'R,I= ');
 3085   843C                   TSTbool(Relocatable); TSTindt; TSTbool(Importable); TSTln;
 3086   8463                  END;
 3087   8463    (*#E#*)
 3088   8463    
 3089   8463               END;
 3090   8463            END;  (*BMG2*)
 3091   8469    
 3092   8469          PROCEDURE BMG6(VAR BM: BitMappedFileType
 3093   8469                        ;VAR Index:i8
 3094   8469                        );
 3095   8469    
 3096   8469             VAR
 3097   8469                J: 1..6;
 3098   8469    
 3099   8469            BEGIN (*BMG6*)
 3100   8469             Index := 0;
 3101   847E             WITH BM, BM.B DO
 3102   849D               BEGIN
 3103   84A2                IF P < 14 THEN
 3104   84B0                  BEGIN
 3105   84B5                   read(F, Y0);
 3106   84DF                   FOR J := 1 TO 6 DO
 3107   84F0                      Index := Index + Index + ord( (P-J) IN I );
 3108   855B                   Y1 := Y0;
 3109   8573                   P := P + 2; (* = P - 6 + 8 *)
 3110   8596                  END
 3111   8596                ELSE
 3112   8599                  BEGIN
 3113   859E                   FOR J := 1 TO 6 DO
 3114   85AF                      Index := Index + Index + ord( (P-J) IN I );
 3115   861A                   P := P - 6;
 3116   863D                  END;
 3117   863D    (*#B#*)
 3118   863D                IF test((.0,4.)) THEN
 3119   8654                  BEGIN
 3120   8659                   write(TestOut, 'BMG6     '); TSTbmb(BM.B);
 3121   868D                   writeln(TestOut, 'Index= ',Index:1);
 3122   86C6                  END;
 3123   86C6    (*#E#*)
 3124   86C6               END;
 3125   86C6            END;  (*BMG6*)
 3126   86CC    
 3127   86CC          PROCEDURE BMP2(VAR BM: BitMappedFileType
 3128   86CC                        ;    Relocatable: boolean
 3129   86CC                        ;    Importable: boolean
 3130   86CC                        );
 3131   86CC    
 3132   86CC            BEGIN (*BMP2*)
 3133   86CC             WITH BM, BM.B DO
 3134   86F3               BEGIN
 3135   86F8                P := P - 1;
 3136   8712                IF Relocatable THEN
 3137   871E                   I := I + (.P.);
 3138   8756                P := P - 1;
 3139   8776                IF Importable THEN
 3140   8782                   I := I + (.P.);
 3141   87BA                IF P <= 8 THEN  (* always >= 8 *)
 3142   87D1                  BEGIN
 3143   87D6                   write(F, Y1);
 3144   8801                   Y1 := 0;
 3145   8810                   P := 16 (* = P + 8 *)
 3146   881B                  END;
 3147   881D    (*#B#*)
 3148   881D                IF test((.0,4.)) THEN
 3149   8834                  BEGIN
 3150   8839                   write(TestOut, 'BMP2     '); TSTbmb(BM.B);
 3151   886D                   write(TestOut, 'R,I= ');
 3152   8891                   TSTbool(Relocatable); TSTindt; TSTbool(Importable); TSTln;
 3153   88B0                  END;
 3154   88B0    (*#E#*)
 3155   88B0               END
 3156   88B0            END;  (*BMP2*)
 3157   88B6    
 3158   88B6          PROCEDURE BMP6(VAR BM: BitMappedFileType
 3159   88B6                        ;    Index:i8
 3160   88B6                        );
 3161   88B6    
 3162   88B6             VAR
 3163   88B6                J: 0..5;
 3164   88B6    
 3165   88B6            BEGIN (*BMP6*)
 3166   88B6             WITH BM, BM.B DO
 3167   88DD               BEGIN
 3168   88E2                P := P - 6;
 3169   88FF                FOR J := 0 TO 5 DO
 3170   8910                  BEGIN
 3171   8915                   IF odd(Index) THEN
 3172   8923                      I := I + (.P+J.);
 3173   8965                   Index := Index div 2
 3174   896A                  END;
 3175   897C    (*#B#*)
 3176   897C                IF test((.0,4.)) THEN
 3177   8993                  BEGIN
 3178   8998                   write(TestOut, 'BMP6     '); TSTbmb(BM.B);
 3179   89CC                   writeln(TestOut, 'Index= ', Index:1);
 3180   8A01                  END;
 3181   8A01    (*#E#*)
 3182   8A01                IF P <= 8 THEN
 3183   8A18                  BEGIN
 3184   8A1D                   write(F, Y1);
 3185   8A48                   Y1 := Y0;
 3186   8A60                   Y0 := 0;
 3187   8A6E                   P := P + 8;
 3188   8A91                  END;
 3189   8A91               END;
 3190   8A91            END;  (*BMP6*)
 3191   8A97    
 3192   8A97    (*                                                                            *)
 3193   8A97    (*                                                                            *)
 3194   8A97    (******************************************************************************)
 3195   8A97    
 3196   8A97    
 3197   8A97          PROCEDURE LinkSection(VAR Status: StatusType
 3198   8A97                               ;VAR TargetFile: FileType
 3199   8A97                               ;VAR LogFile: LogFileType
 3200   8A97                               ;VAR Crid: BitMappedFileType
 3201   8A97                               ;VAR Covr: FileType
 3202   8A97                               ;VAR SCTrec: SectionTableRecordType
 3203   8A97                               ;VAR MDTrec: ModuleTableRecordType
 3204   8A97                               );
 3205   8A97    
 3206   8A97             LABEL
 3207   8A97                99;
 3208   8A97    
 3209   8A97             VAR
 3210   8A97                Oimg: FileType;
 3211   8A97                Orid: BitMappedFileType;
 3212   8A97                Oovr: FileType;
 3213   8A97                ImageUnit: ImageUnitType;
 3214   8A97                QuadImageUnit: QuadImageUnitType;
 3215   8A97                Relocatable: boolean;
 3216   8A97                Importable: boolean;
 3217   8A97                Index: i8;
 3218   8A97                Address: FileAddressType; (*relative to current obj. section*)
 3219   8A97                LocalImageSize: FileAddressType;
 3220   8A97                OvrIndex: QuadImageUnitType;
 3221   8A97    
 3222   8A97    
 3223   8A97            BEGIN (*LINKSECTION*)
 3224   8A97             WITH MDTrec, SCTrec DO
 3225   8ABC               BEGIN
 3226   8AC1                IF ImageSize > 0 THEN
 3227   8AD9                  BEGIN
 3228   8ADE                   FilAsg(Oimg, FileNameTable(.FileNameReference.));
 3229   8B0F                   FilRst(Status, Oimg);
 3230   8B26                   FilSeek(Status, Oimg, CurrentFileAddress);
 3231   8B4D                   CurrentFileAddress := CurrentFileAddress + ImageSize * ImageFactor;
 3232   8B87    
 3233   8B87                   WITH Orid DO
 3234   8B8C                     BEGIN
 3235   8B91                      assign(F, FileNameTable(.FileNameReference.));
 3236   8BC1                      reset(F);
 3237   8BD5                      seek(F, CurrentFileAddress);
 3238   8BF1                      WITH B DO
 3239   8C03                        BEGIN
 3240   8C08                         P := 16;
 3241   8C0F                         I := (..);
 3242   8C27                         read(F, Y1);
 3243   8C4E                        END;
 3244   8C4E                     END;
 3245   8C4E                   CurrentFileAddress := CurrentFileAddress + ImageSize;
 3246   8C7D    
 3247   8C7D                   IF OvrSize > 0 THEN
 3248   8C9D                     BEGIN
 3249   8CA2                      FilAsg(Oovr, FileNameTable(.FileNameReference.));
 3250   8CD3                      FilRst(Status, Oovr);
 3251   8CEA                      FilSeek(Status, Oovr, CurrentFileAddress);
 3252   8D11                      CurrentFileAddress := CurrentFileAddress + OvrSize;
 3253   8D42                     END
 3254   8D42                   ELSE
 3255   8D45                      Oovr.P := CurrentFileAddress;
 3256   8D5C    
 3257   8D5C                   (*CurrentFileAddress now reflects starting position of
 3258   8D5C                     next section in file if any*)
 3259   8D5C    
 3260   8D5C                   Address := 0;
 3261   8D6B                   LocalImageSize := (ImageSize - 1) * ImageFactor;
 3262   8D90                   WHILE (Address <= LocalImageSize) and (Status = (..)) DO
 3263   8DC1                     BEGIN
 3264   8DC6                      BMG2(Orid, Relocatable, Importable);
 3265   8DE6                      IF Relocatable <> Importable THEN
 3266   8DF4                        BEGIN
 3267   8DF9                         BMG6(Orid, Index);
 3268   8E11                         FGi32(Status, Oimg, QuadImageUnit);
 3269   8E30                         IF Relocatable THEN
 3270   8E3C                            (* Relocate *)
 3271   8E3C                            IF Index IN (.1..NooSegments.) THEN
 3272   8E6A                               WITH SectionTable(.SCTBase + Index.) DO
 3273   8EA1                                  QuadImageUnit := QuadImageUnit + RelocationConstant
 3274   8EAA                            ELSE
 3275   8EC3                               Status := Status + (.BadRelocationCode.)
 3276   8ED9                         ELSE
 3277   8EED                            (* Import *)
 3278   8EED                           BEGIN (*IMPORT*)
 3279   8EF2                            IF Index = OvrCode THEN
 3280   8EFE                               IF Oovr.P  < CurrentFileAddress - 3 THEN
 3281   8F25                                  FGi32(Status, Oovr, OvrIndex)
 3282   8F41                               ELSE
 3283   8F47                                  Status := Status + (.UnexpectedEof.)
 3284   8F5D                            ELSE
 3285   8F70                               OvrIndex := Index;
 3286   8F80                            IF OvrIndex IN (.1..NooExternalImportSymbols.) THEN
 3287   8FB0                               WITH ValueTable(.ExternalImportTable(.EITOffset + OvrIndex
 3288   8FBB                                                                   .).SymbolNo
 3289   8FE1                                              .) DO
 3290   8FF9                                  IF SegmentNo > UnResolved THEN
 3291   900A                                    BEGIN
 3292   900F                                     QuadImageUnit := QuadImageUnit + Value; (*?* + ? *)
 3293   902B                                     Importable := false;
 3294   9034                                     Relocatable := SegmentNo > 0;
 3295   9051                                     Index := SegmentNo;
 3296   9064                                    END
 3297   9064                                  ELSE
 3298   9067                                     IF Value IN (.0..63.) THEN
 3299   908A                                        Index := Value
 3300   908F                                     ELSE
 3301   90A6                                       BEGIN
 3302   90AB                                        Index := OvrCode;
 3303   90B4                                        FPi32(Covr, Value);
 3304   90CF                                       END
 3305   90CF                            ELSE
 3306   90D2                               Status := Status + (.BadImportCode.)
 3307   90E8                           END;  (*IMPORT*)
 3308   90F9                         FPi32(TargetFile, QuadImageUnit);
 3309   910E                         BMP2(Crid, Relocatable, Importable);
 3310   912B                         BMP6(Crid, Index);
 3311   913E                         Address := Address + ImageFactor;
 3312   9159                        END
 3313   9159                      ELSE
 3314   915C                         IF Relocatable THEN
 3315   9168                           BEGIN
 3316   916D                            Status := Status + (.Baddibit.);
 3317   9194                            GOTO 99; (*EXIT procedure*)
 3318   919C                           END
 3319   919C                         ELSE
 3320   919F                           BEGIN
 3321   91A4                            FGi8(Status, Oimg, ImageUnit);
 3322   91C3                            FPi8(TargetFile, ImageUnit);
 3323   91D6                            BMP2(Crid, Relocatable, Importable);
 3324   91F3                            Address := Address + 1;
 3325   9206                           END;
 3326   9206                     END;
 3327   9209                   LocalImageSize := ImageSize * ImageFactor;
 3328   922B                   WHILE (Address < LocalImageSize) and (Status = (..)) DO
 3329   925C                     BEGIN
 3330   9261                      BMG2(Orid, Relocatable, Importable);
 3331   9281                      IF Relocatable or Importable THEN
 3332   9290                        BEGIN
 3333   9295                         Status := Status + (.Baddibit.);
 3334   92BC                         GOTO 99; (*EXIT procedure*)
 3335   92C4                        END
 3336   92C4                      ELSE
 3337   92C7                        BEGIN
 3338   92CC                         FGi8(Status, Oimg, ImageUnit);
 3339   92EB                         FPi8(TargetFile, ImageUnit);
 3340   92FE                         BMP2(Crid, Relocatable, Importable);
 3341   931B                         Address := Address + 1;
 3342   932E                        END;
 3343   932E                     END;
 3344   9331                  END; (* IF ImageSize > 0 THEN *)
 3345   9331    99:        END; (* WITH MDTrec, SCTrec DO *)
 3346   9331            END;  (*LINKSECTION*)
 3347   933A    
 3348   933A          PROCEDURE CopyBuffer(VAR Status: StatusType
 3349   933A                              ;VAR Buffer: BasicFileType
 3350   933A                              ;VAR TargetFile: FileType
 3351   933A                              ;VAR Size: FileAddressType
 3352   933A                              );
 3353   933A    
 3354   933A             VAR
 3355   933A                Item: i8;
 3356   933A                Start: FileAddressType;
 3357   933A    
 3358   933A            BEGIN (*COPYBUFFER*)
 3359   933A             reset(Buffer);
 3360   9355             Start := TargetFile.P;
 3361   936C             WHILE not eof(Buffer) DO
 3362   9385               BEGIN
 3363   938A                read(Buffer, Item);
 3364   93AD                FPi8(TargetFile, Item); (*Advancing TargetFile.P*)
 3365   93C0               END;
 3366   93C3             Size := TargetFile.P - Start;
 3367   93E9    (*#B#*)
 3368   93E9             IF test((.0,20.)) THEN
 3369   9403               BEGIN
 3370   9408                writeln(TestOut, 'CPYBUF   ', 'Start= ', Start:1
 3371   9447                                            , ' End= ', TargetFile.P:1
 3372   946D                                            , ' Size= ', Size:1
 3373   9492                       );
 3374   949B               END;
 3375   949B    (*#E#*)
 3376   949B            END;  (*COPYBUFFER*)
 3377   94A1    
 3378   94A1          PROCEDURE UPDINX(VAR Status: StatusType
 3379   94A1                           VAR TargetFile: FileType
 3380   94A1                          );
 3381   94A1    
 3382   94A1             VAR
 3383   94A1                ModuleSize: i32;
 3384   94A1                ModuleName: ModuleNameType;
 3385   94A1                SegmentInx: SegmentNoType;
 3386   94A1    
 3387   94A1            BEGIN (*UPDINX*)
 3388   94A1             ModuleSize := TargetFile.P - OMF_Address;
 3389   94C8             update(TargetFile.F);
 3390   94DB             FilSeek(Status, TargetFile, OMH_Address);
 3391   94F9             IF Status = (..) THEN
 3392   9512               BEGIN
 3393   9517                FPi32(TargetFile, ModuleSize);
 3394   952C                FPi32(TargetFile, CurSegmentCount);
 3395   9546                FPi32(TargetFile, NooExpSymbols);
 3396   955E                FPi32(TargetFile, NooExiSymbols);
 3397   9576                FGsym(Status, TargetFile, ModuleName); (*skip past name*)
 3398   9594                IF Status = (..) THEN
 3399   95AD                   FOR SegmentInx := 1 TO CurSegmentCount DO
 3400   95C7                      WITH SectionTable(.TargetSectionOffset + SegmentInx.) DO
 3401   95F5                        BEGIN
 3402   95FA                         FPi32(TargetFile, ImageSize);
 3403   9616                         FPi32(TargetFile, OvrSize);
 3404   9634                        END;
 3405   963E               END;
 3406   963E            END;  (*UPDINX*)
 3407   9644    
 3408   9644         BEGIN (*PASS2*)
 3409   9644          FOR SegmentInx := 1 TO CurSegmentCount DO
 3410   9666            BEGIN
 3411   966B             WITH Crid DO
 3412   9670               BEGIN
 3413   9675                rewrite(F);
 3414   9689                WITH B DO
 3415   969B                  BEGIN
 3416   96A0                   P := 16;
 3417   96A7                   I := (..)
 3418   96B4                  END
 3419   96BF               END;
 3420   96BF             FilRwt(Covr);
 3421   96CF             FOR ModuleInx := 1 TO TargetModuleNo - 1 DO
 3422   96F6               BEGIN
 3423   96FB    (*#B#*)
 3424   96FB                IF test((.0,20.)) THEN
 3425   9715                  BEGIN
 3426   971A                   write(TestOut, 'Pass-2   '); TSTstat(Status); TSTindt;
 3427   9759                   writeln(TestOut, 'SgmInx= ', SegmentInx:1
 3428   9788                                  , ' MdlInx= ', ModuleInx:1
 3429   97AF                                  );
 3430   97B8                   TSTindt; TSTindt; TSTindt;
 3431   97C6                   TSTmdt(ModuleInx);
 3432   97D5                   TSTindt; TSTindt; TSTindt;
 3433   97E3                   TSTsct(ModuleTable(.ModuleInx.).SCTBase + SegmentInx);
 3434   9819                  END;
 3435   9819    (*#E#*)
 3436   9819                IF (SectionTable(.ModuleTable(.ModuleInx
 3437   981E                                             .).SCTBase + SegmentInx
 3438   9832                                .).ModuleNo = ModuleInx) THEN
 3439   9860                  BEGIN
 3440   9865                   LinkSection(Status, TargetFile, LogFile, Crid, Covr
 3441   9887                              ,SectionTable(.ModuleTable(.ModuleInx
 3442   988F                                                         .).SCTBase + SegmentInx
 3443   98A3                                           .)
 3444   98CA                              ,ModuleTable(.ModuleInx.)
 3445   98DF                              );
 3446   98E3                   IF Status <> (..) THEN
 3447   98FC                      GOTO 999; (*************  EXIT BOTH FOR LOOPS **************)
 3448   9904                  END;
 3449   9904               END;
 3450   990E             WITH SectionTable(.TargetSectionOffset + SegmentInx.) DO
 3451   993C               BEGIN
 3452   9941                CopyBuffer(Status, Crid.F, TargetFile, ImageSize);
 3453   9968                CopyBuffer(Status, Covr.F, TargetFile, OvrSize);
 3454   9991               END;
 3455   9991            END;
 3456   999B    999:
 3457   999B          (*backpatch info to target.inx*)
 3458   999B          UPDINX(Status, TargetFile);
 3459   99B1    
 3460   99B1         END;  (*PASS2*)
 3461   99BA    
 3462   99BA    (*                                                                            *)
 3463   99BA    (*                                                                            *)
 3464   99BA    (******************************************************************************)
 3465   99BA    
 3466   99BA    
 3467   99BA    
 3468   99BA      BEGIN  (*LINK*)
 3469   99BA    (*#B#*)
 3470   99BA       TestInit(Input,Output);
 3471   99D3    (*#E#*)
 3472   99D3       Status := (..);
 3473   99E7       Optiontable.LogFileKind := None;
 3474   99F1       OptionTable.TargetFileKind := Implicit;
 3475   99FB       CurFileNo := 0;
 3476   9A05       CurModuleNo := 0;
 3477   9A0F       FOR SCTSubInx := 1 TO MaxNooSections DO
 3478   9A21          SectionTable(.SCTSubInx.).SegmentNo := 0;
 3479   9A45       SCTOffset := 0;
 3480   9A4F       CurSegmentCount := 0;
 3481   9A59       CurExternalImportSymbolNo := 0;
 3482   9A63    
 3483   9A63       SetUp(Status, TargetFile, LogFile, Output);
 3484   9A7B    (*#B#*)
 3485   9A7B       IF test((.0,16,17.)) THEN
 3486   9A95         BEGIN
 3487   9A9A          write(TestOut, 'Link-MAIN-1   '); TSTstat(Status); TSTindt; TSTmem; TSTln
 3488   9ADE         END;
 3489   9AE1    (*#E#*)
 3490   9AE1       IF Status = (..) THEN
 3491   9AF7          Pass1(Status, TargetFile, LogFile);
 3492   9B0B    (*#B#*)
 3493   9B0B       IF test((.0,16,17.)) THEN
 3494   9B25         BEGIN
 3495   9B2A          write(TestOut, 'Link-MAIN-2   '); TSTstat(Status); TSTln
 3496   9B68         END;
 3497   9B6B    (*#E#*)
 3498   9B6B       IF Status = (..) THEN
 3499   9B81          Pass2(Status, TargetFile, LogFile);
 3500   9B95    (*#B#*)
 3501   9B95       IF test((.0,16,17.)) THEN
 3502   9BAF         BEGIN
 3503   9BB4          write(TestOut, 'Link-MAIN-3   '); TSTstat(Status); TSTln
 3504   9BF2         END;
 3505   9BF5    (*#E#*)
 3506   9BF5       IF Status = (..) THEN
 3507   9C0B         BEGIN
 3508   9C10          writeln(output, 'LINK -- Normal termination')
 3509   9C46         END
 3510   9C49       ELSE
 3511   9C4C         BEGIN
 3512   9C51          writeln(output, 'LINK -- Abnormal termination.');
 3513   9C8D    
 3514   9C8D          IF BadOption IN Status THEN
 3515   9CA2             writeln(output, 'Bad option');
 3516   9CCB          IF BadLogFileName IN Status THEN
 3517   9CE0             writeln(output, 'Bad log file name');
 3518   9D10          IF BadTargetFileName IN Status THEN
 3519   9D25             writeln(output, 'Bad target file name');
 3520   9D58          IF BadFileName IN Status THEN
 3521   9D6D             writeln(output, 'Bad file name');
 3522   9D99          IF NoSuchFile IN Status THEN
 3523   9DAE             writeln(output, 'No such file');
 3524   9DD9          IF NoInputFiles IN Status THEN
 3525   9DEE             writeln(output, 'No input files');
 3526   9E1B          IF ExtraText IN Status THEN
 3527   9E30             writeln(output, 'Extra text');
 3528   9E59          IF BadFileFormat IN Status THEN
 3529   9E6E             writeln(output, 'Bad file format');
 3530   9E9C          IF BadModuleFormat IN Status THEN
 3531   9EB1             writeln(output, 'Bad module format');
 3532   9EE1          IF UnexpectedEof IN Status THEN
 3533   9EF6             writeln(output, 'Unexpected EOF');
 3534   9F23          IF RangeError IN Status THEN
 3535   9F38             writeln(output, 'Range error');
 3536   9F62          IF BadSymbolName IN Status THEN
 3537   9F77             writeln(output, 'Bad symbol name');
 3538   9FA5          IF DuplicateModuleName IN Status THEN
 3539   9FBA             writeln(output, 'Duplicate module name');
 3540   9FEE          IF DuplicateExportSymbol IN Status THEN
 3541   A003             writeln(output, 'Duplicate export symbol');
 3542   A039          IF NoInput IN Status THEN
 3543   A04E             writeln(output, 'No input');
 3544   A075          IF Baddibit IN Status THEN
 3545   A08A             writeln(output, 'Bad dibit');
 3546   A0B2          IF BadRelocationCode IN Status THEN
 3547   A0C7             writeln(output, 'Bad relocation code');
 3548   A0F9          IF BadImportCode IN Status THEN
 3549   A10E             writeln(output, 'Bad import code');
 3550   A13C          IF NameTableOverFlow IN Status THEN
 3551   A151             writeln(output, 'Name table overflow');
 3552   A183          IF ModuleTableOverFlow IN Status THEN
 3553   A198             writeln(output, 'Module table overflow');
 3554   A1CC          IF SectionTableOverFlow IN Status THEN
 3555   A1E1             writeln(output, 'Section table overflow');
 3556   A216          IF FileNameTableOverFlow IN Status THEN
 3557   A22B             writeln(output, 'File name table overflow');
 3558   A262          IF SymbolTableOverFlow IN Status THEN
 3559   A277             writeln(output, 'Symbol table overflow');
 3560   A2AB          IF ExternalImportTableOverFlow IN Status THEN
 3561   A2C0             writeln(output, 'External import table overflow');
 3562   A2FD    
 3563   A2FD          IF not (NoTarget IN Status) THEN
 3564   A312             erase(TargetFile.F);
 3565   A31E         END
 3566   A31E      END. 
«eof»