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

⟦1ef0bb6fc⟧ TextFile

    Length: 188288 (0x2df80)
    Types: TextFile
    Names: »LNK.PRN«

Derivation

└─⟦243948191⟧ Bits:30009789/_.ft.Ibm2.50007349.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.04';
   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                         write(TestOut,        'HeapMax=', HeapMax:1, ' ':2);
 2783   764B                         IF 0 < HeapMax THEN
 2784   765F                            writeln(TestOut, 'Winner=', Winner:1)
 2785   7697                         ELSE
 2786   769D                            writeln(TestOut, 'Winner=--');
 2787   76C5                        END;
 2788   76C5    (*#E#*)
 2789   76C5                     END;  (*SELECTWINNER*)
 2790   76CB    
 2791   76CB    
 2792   76CB                  BEGIN (*PUTEXP*)
 2793   76CB    
 2794   76CB    (*#B#*)
 2795   76CB                   IF test((.0,13.)) THEN
 2796   76EC                     BEGIN
 2797   76F1                      writeln(TestOut, 'PUTEXP   ');
 2798   7719                      FOR SbtInx := 1 TO MaxNooSymbols DO
 2799   772A                         WITH SymbolTable(.SbtInx.), ValueTable(.SbtInx.) DO
 2800   7760                            IF NameReference <> 0 THEN
 2801   7775                              BEGIN
 2802   777A                               TSTindt; TSTindt; TSTindt; TSTsbt(SbtInx);
 2803   7796                               TSTindt; TSTvlt(SbtInx); TSTln;
 2804   77AB                              END;
 2805   77B5                     END;
 2806   77B5    (*#E#*)
 2807   77B5    
 2808   77B5                   (*Initialize selection*)
 2809   77B5                   HeapMax := 0;
 2810   77BE                   FOR MDTInx := 1 TO TargetModuleNo - 1 DO
 2811   77E5                      IF ModuleTable(.MDTInx
 2812   77EA                                    .).SBTLinkHead IN (.1..MaxNooSymbols.) THEN
 2813   7818                         InHeap(ModuleTable(.MDTInx.).SBTLinkHead);
 2814   784B    
 2815   784B                   IF HeapMax > 0 THEN
 2816   785B                      LogHxpN(LogFile);
 2817   786A                   NooExpSymbols := 0;
 2818   787C    
 2819   787C                   WHILE (Status = (..)) DO
 2820   7895                     BEGIN
 2821   789A                      SelectWinner(Status);
 2822   78AD                      IF Status = (..) THEN
 2823   78C6                         WITH SymbolTable(.Winner.), ValueTable(.Winner.) DO
 2824   78FF                            IF SegmentNo > UnResolved THEN
 2825   7910                              BEGIN
 2826   7915                               NooExpSymbols := NooExpSymbols + 1;
 2827   792B                               IF (SegmentNo > 0)  THEN (*relocatable*)
 2828   7942                                  WITH SectionTable(.ModuleTable(.ModuleNo
 2829   7947                                                                .).SCTbase +
 2830   795F                                                                   SegmentNo
 2831   795F                                                   .) DO
 2832   7990                                    BEGIN
 2833   7995                                     Value := Value + RelocationConstant;
 2834   79C1                                    END;
 2835   79C1                               EXP_RelocationIndicator := SegmentNo;
 2836   79D3                               EXP_Item := Value;
 2837   79E6                               NMTG(NameReference, EXP_SymbolName);
 2838   7A09                               FPi8(Target, EXP_RelocationIndicator);
 2839   7A20                               FPi32(Target, EXP_Item);
 2840   7A35                               FPsym(Target, EXP_SymbolName);
 2841   7A4C                               IF (Status = (..)) and (OPTlfk <> none) THEN
 2842   7A75                                 BEGIN
 2843   7A7A                                  NMTG(SymbolTable(.
 2844   7A7F                                          ModuleTable(.ModuleNo
 2845   7A7F                                                     .).ModuleNameReference
 2846   7A97                                                  .).NameReference
 2847   7AA9                                      ,ModuleName
 2848   7AB2                                      );
 2849   7AC1                                  LogXP(LogFile
 2850   7AC6                                       ,EXP_RelocationIndicator
 2851   7ACD                                       ,EXP_Item
 2852   7AD4                                       ,EXP_SymbolName
 2853   7ADA                                       ,ModuleName
 2854   7AE2                                       )
 2855   7AEA                                 END;
 2856   7AED                              END;
 2857   7AED                     END;
 2858   7AF0                   Status := Status - (.HeapEmpty.);
 2859   7B18                   IF (HeapEmpty IN Status) and (OPTlfk <> none) THEN
 2860   7B43                     BEGIN  (*sort sbt/vlt by value and log*)
 2861   7B48                     END
 2862   7B48                  END;  (*PUTEXP*)
 2863   7B4E    
 2864   7B4E    
 2865   7B4E                PROCEDURE PutEXI(VAR Status: StatusType
 2866   7B4E                                ;VAR Target: FileType
 2867   7B4E                                ;VAR LogFile: LogFileType
 2868   7B4E                                );
 2869   7B4E    
 2870   7B4E                LABEL
 2871   7B4E                   1;
 2872   7B4E    
 2873   7B4E                VAR
 2874   7B4E                     ModuleName: ModuleNameType;
 2875   7B4E                     SymbolName: SymbolNameType;
 2876   7B4E                     ExiInx1: ExternalImportTableIndexType;
 2877   7B4E                     ExiInx: ExternalImportTableIndexType;
 2878   7B4E    
 2879   7B4E                  (* TargetModuleNo is a global variable *)
 2880   7B4E    
 2881   7B4E                  BEGIN (*PUTEXI*)
 2882   7B4E                   NooExiSymbols := 0;
 2883   7B68    
 2884   7B68                   ExiInx1 := 1;
 2885   7B71                   FOR ExiInx1 := 1 TO CurExternalImportSymbolNo DO
 2886   7B8B                     BEGIN
 2887   7B90    (*#B#*)
 2888   7B90                      IF test((.0,7.)) THEN
 2889   7BA7                        BEGIN
 2890   7BAC                         write(TestOut, 'PUTEXI-1 ');
 2891   7BD4                         TSTeit(ExiInx1);
 2892   7BE3                        END;
 2893   7BE3    (*#E#*)
 2894   7BE3                      IF (ValueTable(.ExternalImportTable(.ExiInx1.).SymbolNo
 2895   7BF6                                    .).SegmentNo = UnResolved) THEN
 2896   7C0E                         GOTO 1;
 2897   7C16                     END;
 2898   7C20    
 2899   7C20    1:             IF (CurExternalImportSymbolNo > 0) THEN
 2900   7C31                      IF (ValueTable(.ExternalImportTable(.ExiInx1.).SymbolNo
 2901   7C44                                .).SegmentNo = UnResolved) THEN
 2902   7C5C                        BEGIN
 2903   7C61                         LogHurs(LogFile);
 2904   7C70                         FOR ExiInx := ExiInx1 TO CurExternalImportSymbolNo DO
 2905   7C8B                           BEGIN
 2906   7C90    (*#B#*)
 2907   7C90                            IF test((.0,7.)) THEN
 2908   7CA7                              BEGIN
 2909   7CAC                               write(TestOut, 'PUTEXI-2 ');
 2910   7CD4                               TSTeit(ExiInx);
 2911   7CE3                              END;
 2912   7CE3    (*#E#*)
 2913   7CE3                            WITH ExternalImportTable(.ExiInx.) DO
 2914   7CFC                               WITH ValueTable(.SymbolNo.),
 2915   7D19                                    SymbolTable(.SymbolNo.) DO
 2916   7D37                                        IF SegmentNo = UnResolved THEN
 2917   7D48                                          BEGIN
 2918   7D4D                                           NooExiSymbols := NooExiSymbols + 1;
 2919   7D63                                           Value := NooExiSymbols;
 2920   7D7A                                           NMTG(NameReference, SymbolName);
 2921   7D9D                                           FPsym(Target, SymbolName);
 2922   7DB4                                           NMTG(SymbolTable(.
 2923   7DB9                                                   ModuleTable(.ModuleNo
 2924   7DB9                                                              .).ModuleNameReference
 2925   7DD1                                                           .).NameReference
 2926   7DE3                                               ,ModuleName
 2927   7DEC                                               );
 2928   7DFB                                           LogURS(LogFile, ModuleName, SymbolName);
 2929   7E1A    (*#B#*)
 2930   7E1A                                           IF test((.0,16,19.)) THEN
 2931   7E34                                             BEGIN
 2932   7E39                                              writeln(TestOut, 'PutEXI   '
 2933   7E54                                                             , 'SymbolNo=', SymbolNo:1
 2934   7E83                                                             , ' ':2, 'Value=', Value:1);
 2935   7EBA                                             END;
 2936   7EBA    (*#E#*)
 2937   7EBA                                          END;
 2938   7EBA    
 2939   7EBA                           END;
 2940   7EC4                        END;
 2941   7EC4                  END;  (*PUTEXI*)
 2942   7ECA    
 2943   7ECA               (* TargetModuleNo is a global variable *)
 2944   7ECA    
 2945   7ECA               BEGIN (*PUTMODULE*)
 2946   7ECA                MDTA(Status, TargetModuleNo, 1);
 2947   7EE8                IF not (ModuleTableOverFlow IN Status) THEN
 2948   7F03                  BEGIN
 2949   7F08                   PutMF(TargetFile);
 2950   7F17                   PutINX(Status, TargetFile, LogFile);
 2951   7F38                   IF Status = (..) THEN
 2952   7F51                     BEGIN (*Calculate memory map, write sgd, and log*)
 2953   7F56                      PutSGDs(Status, TargetFile, LogFile);
 2954   7F77    
 2955   7F77                      IF not (SectionTableOverFlow IN Status) THEN
 2956   7F92                        BEGIN (*Relocate symbol table, write export list, and log*)
 2957   7F97                         PutEXP(Status, TargetFile, LogFile);
 2958   7FB8                         IF Status = (..) THEN
 2959   7FD1                           BEGIN (*Write EXI while logging unresolved references*)
 2960   7FD6                            PutEXI(Status, TargetFile, LogFile);
 2961   7FF7                           END;
 2962   7FF7                        END;
 2963   7FF7                     END;
 2964   7FF7                  END;
 2965   7FF7               END;  (*PUTMODULE*)
 2966   7FFD    
 2967   7FFD            BEGIN (*PUTTARGETFILE*)
 2968   7FFD             PutFF(TargetFile);
 2969   8014             PutModule(Status, TargetFile, LogFile);
 2970   8035            END;  (*PUTTARGETFILE*)
 2971   803B    
 2972   803B    (*                                                                            *)
 2973   803B    (*                                                                            *)
 2974   803B    (******************************************************************************)
 2975   803B    
 2976   803B    
 2977   803B         BEGIN (*PASS1*)
 2978   803B    
 2979   803B          (* Initialize local data structures *)
 2980   803B          FOR SBTSubInx := 1 TO MaxNooSymbols DO
 2981   8056             SymbolTable(.SBTSubInx.).NameReference := 0;
 2982   807C          LatestInsert := 0;
 2983   808E          CurrentSymbolCount := 0;
 2984   80A0          CurrentNameTableIndex := 0;
 2985   80AE    
 2986   80AE          GetInputFiles(Status, LogFile);
 2987   80DA          IF Status = (..) THEN
 2988   80FC            BEGIN
 2989   8101             PutTargetFile(Status, TargetFile, LogFile);
 2990   813D            END;
 2991   813D         END;  (*PASS1*)
 2992   8143    
 2993   8143    (*                                                                            *)
 2994   8143    (*                                                                            *)
 2995   8143    (******************************************************************************)
 2996   8143    
 2997   8143    (*$I B:lnkp2.pas    Procedure pass2                                           *)
 2998   8143    (******************************************************************************)
 2999   8143    (*                                                                            *)
 3000   8143    (*   Copyright (1985) by Metanic Aps., Denmark                                *)
 3001   8143    (*                                                                            *)
 3002   8143    (*   Author: Lars Gregers Jakobsen.                                           *)
 3003   8143    (*                                                                            *)
 3004   8143    (******************************************************************************)
 3005   8143    
 3006   8143       PROCEDURE Pass2(VAR Status: StatusType
 3007   8143                      ;VAR TargetFile: FileType
 3008   8143                      ;VAR LogFile: LogFileType
 3009   8143                      );
 3010   8143    
 3011   8143          LABEL
 3012   8143             999;
 3013   8143    
 3014   8143          VAR
 3015   8143             SegmentInx: SegmentNoType;
 3016   8143             ModuleInx: ModuleTableIndexType;
 3017   8143             Crid: BitMappedFileType;  (*Composite relocation import directory*)
 3018   8143             Covr: FileType;           (*Composite overrun store*)
 3019   8143    
 3020   8143    (*#B#*)
 3021   8143    (*$I B:LNKDF5.PAS  Bit Map Buffer Test Output                            *)
 3022   8143    (******************************************************************************)
 3023   8143    (*                                                                            *)
 3024   8143    (*   Copyright (1985) by Metanic Aps., Denmark                                *)
 3025   8143    (*                                                                            *)
 3026   8143    (*   Author: Lars Gregers Jakobsen.                                           *)
 3027   8143    (*                                                                            *)
 3028   8143    (******************************************************************************)
 3029   8143    
 3030   8143          PROCEDURE TSTbmb(Bmb: BitMapBufferType
 3031   8143                          );
 3032   8143    
 3033   8143             VAR
 3034   8143                I: 0..15;
 3035   8143    
 3036   8143            BEGIN (*TSTBMB*)
 3037   8143             write(TestOut, 'Y1,Y0,I,P= ', Bmb.Y1:3, ' ', Bmb.Y0:3, ' ');
 3038   81BA             FOR I := 15 DOWNTO 8 DO
 3039   81CB                IF I IN Bmb.I THEN
 3040   81E2                   write(TestOut, '1')
 3041   81FA                ELSE
 3042   8200                   write(TestOut, '0');
 3043   8225             write(TestOut, ' ');
 3044   8240             FOR I := 7 DOWNTO 0 DO
 3045   8251                IF I IN Bmb.I THEN
 3046   8268                   write(TestOut, '1')
 3047   8280                ELSE
 3048   8286                   write(TestOut, '0');
 3049   82AB             write(TestOut, ' ', Bmb.P:3, '   ');
 3050   82E7            END;  (*TSTBMB*)
 3051   82ED    
 3052   82ED    (*                                                                            *)
 3053   82ED    (*                                                                            *)
 3054   82ED    (******************************************************************************)
 3055   82ED    
 3056   82ED    (*$I B:LNKDF6.PAS  Bit Map Access Primitives                                  *)
 3057   82ED    (******************************************************************************)
 3058   82ED    (*                                                                            *)
 3059   82ED    (*   Copyright (1985) by Metanic Aps., Denmark                                *)
 3060   82ED    (*                                                                            *)
 3061   82ED    (*   Author: Lars Gregers Jakobsen.                                           *)
 3062   82ED    (*                                                                            *)
 3063   82ED    (******************************************************************************)
 3064   82ED    
 3065   82ED          PROCEDURE BMG2(VAR BM: BitMappedFileType
 3066   82ED                        ;VAR Relocatable: boolean
 3067   82ED                        ;VAR Importable: boolean
 3068   82ED                        );
 3069   82ED    
 3070   82ED            BEGIN (*BMG2*)
 3071   82ED             WITH BM, BM.B DO
 3072   8314               BEGIN
 3073   8319                IF P <= 8 THEN
 3074   832A                  BEGIN
 3075   832F                   read(F, Y1);
 3076   835A                   P := P + 8;
 3077   837D                  END;
 3078   837D                P := P - 1;
 3079   839D                Relocatable := P IN I;
 3080   83CB                P := P - 1;
 3081   83EB                Importable  := P IN I;
 3082   8419    (*#B#*)
 3083   8419                IF test((.0,4.)) THEN
 3084   8430                  BEGIN
 3085   8435                   write(TestOut, 'BMG2     '); TSTbmb(BM.B);
 3086   8469                   write(TestOut, 'R,I= ');
 3087   848D                   TSTbool(Relocatable); TSTindt; TSTbool(Importable); TSTln;
 3088   84B4                  END;
 3089   84B4    (*#E#*)
 3090   84B4    
 3091   84B4               END;
 3092   84B4            END;  (*BMG2*)
 3093   84BA    
 3094   84BA          PROCEDURE BMG6(VAR BM: BitMappedFileType
 3095   84BA                        ;VAR Index:i8
 3096   84BA                        );
 3097   84BA    
 3098   84BA             VAR
 3099   84BA                J: 1..6;
 3100   84BA    
 3101   84BA            BEGIN (*BMG6*)
 3102   84BA             Index := 0;
 3103   84CF             WITH BM, BM.B DO
 3104   84EE               BEGIN
 3105   84F3                IF P < 14 THEN
 3106   8501                  BEGIN
 3107   8506                   read(F, Y0);
 3108   8530                   FOR J := 1 TO 6 DO
 3109   8541                      Index := Index + Index + ord( (P-J) IN I );
 3110   85AC                   Y1 := Y0;
 3111   85C4                   P := P + 2; (* = P - 6 + 8 *)
 3112   85E7                  END
 3113   85E7                ELSE
 3114   85EA                  BEGIN
 3115   85EF                   FOR J := 1 TO 6 DO
 3116   8600                      Index := Index + Index + ord( (P-J) IN I );
 3117   866B                   P := P - 6;
 3118   868E                  END;
 3119   868E    (*#B#*)
 3120   868E                IF test((.0,4.)) THEN
 3121   86A5                  BEGIN
 3122   86AA                   write(TestOut, 'BMG6     '); TSTbmb(BM.B);
 3123   86DE                   writeln(TestOut, 'Index= ',Index:1);
 3124   8717                  END;
 3125   8717    (*#E#*)
 3126   8717               END;
 3127   8717            END;  (*BMG6*)
 3128   871D    
 3129   871D          PROCEDURE BMP2(VAR BM: BitMappedFileType
 3130   871D                        ;    Relocatable: boolean
 3131   871D                        ;    Importable: boolean
 3132   871D                        );
 3133   871D    
 3134   871D            BEGIN (*BMP2*)
 3135   871D             WITH BM, BM.B DO
 3136   8744               BEGIN
 3137   8749                P := P - 1;
 3138   8763                IF Relocatable THEN
 3139   876F                   I := I + (.P.);
 3140   87A7                P := P - 1;
 3141   87C7                IF Importable THEN
 3142   87D3                   I := I + (.P.);
 3143   880B                IF P <= 8 THEN  (* always >= 8 *)
 3144   8822                  BEGIN
 3145   8827                   write(F, Y1);
 3146   8852                   Y1 := 0;
 3147   8861                   P := 16 (* = P + 8 *)
 3148   886C                  END;
 3149   886E    (*#B#*)
 3150   886E                IF test((.0,4.)) THEN
 3151   8885                  BEGIN
 3152   888A                   write(TestOut, 'BMP2     '); TSTbmb(BM.B);
 3153   88BE                   write(TestOut, 'R,I= ');
 3154   88E2                   TSTbool(Relocatable); TSTindt; TSTbool(Importable); TSTln;
 3155   8901                  END;
 3156   8901    (*#E#*)
 3157   8901               END
 3158   8901            END;  (*BMP2*)
 3159   8907    
 3160   8907          PROCEDURE BMP6(VAR BM: BitMappedFileType
 3161   8907                        ;    Index:i8
 3162   8907                        );
 3163   8907    
 3164   8907             VAR
 3165   8907                J: 0..5;
 3166   8907    
 3167   8907            BEGIN (*BMP6*)
 3168   8907             WITH BM, BM.B DO
 3169   892E               BEGIN
 3170   8933                P := P - 6;
 3171   8950                FOR J := 0 TO 5 DO
 3172   8961                  BEGIN
 3173   8966                   IF odd(Index) THEN
 3174   8974                      I := I + (.P+J.);
 3175   89B6                   Index := Index div 2
 3176   89BB                  END;
 3177   89CD    (*#B#*)
 3178   89CD                IF test((.0,4.)) THEN
 3179   89E4                  BEGIN
 3180   89E9                   write(TestOut, 'BMP6     '); TSTbmb(BM.B);
 3181   8A1D                   writeln(TestOut, 'Index= ', Index:1);
 3182   8A52                  END;
 3183   8A52    (*#E#*)
 3184   8A52                IF P <= 8 THEN
 3185   8A69                  BEGIN
 3186   8A6E                   write(F, Y1);
 3187   8A99                   Y1 := Y0;
 3188   8AB1                   Y0 := 0;
 3189   8ABF                   P := P + 8;
 3190   8AE2                  END;
 3191   8AE2               END;
 3192   8AE2            END;  (*BMP6*)
 3193   8AE8    
 3194   8AE8    (*                                                                            *)
 3195   8AE8    (*                                                                            *)
 3196   8AE8    (******************************************************************************)
 3197   8AE8    
 3198   8AE8    
 3199   8AE8          PROCEDURE LinkSection(VAR Status: StatusType
 3200   8AE8                               ;VAR TargetFile: FileType
 3201   8AE8                               ;VAR LogFile: LogFileType
 3202   8AE8                               ;VAR Crid: BitMappedFileType
 3203   8AE8                               ;VAR Covr: FileType
 3204   8AE8                               ;VAR SCTrec: SectionTableRecordType
 3205   8AE8                               ;VAR MDTrec: ModuleTableRecordType
 3206   8AE8                               );
 3207   8AE8    
 3208   8AE8             LABEL
 3209   8AE8                99;
 3210   8AE8    
 3211   8AE8             VAR
 3212   8AE8                Oimg: FileType;
 3213   8AE8                Orid: BitMappedFileType;
 3214   8AE8                Oovr: FileType;
 3215   8AE8                ImageUnit: ImageUnitType;
 3216   8AE8                QuadImageUnit: QuadImageUnitType;
 3217   8AE8                Relocatable: boolean;
 3218   8AE8                Importable: boolean;
 3219   8AE8                Index: i8;
 3220   8AE8                Address: FileAddressType; (*relative to current obj. section*)
 3221   8AE8                LocalImageSize: FileAddressType;
 3222   8AE8                OvrIndex: QuadImageUnitType;
 3223   8AE8    
 3224   8AE8    
 3225   8AE8            BEGIN (*LINKSECTION*)
 3226   8AE8             WITH MDTrec, SCTrec DO
 3227   8B0D               BEGIN
 3228   8B12                IF ImageSize > 0 THEN
 3229   8B2A                  BEGIN
 3230   8B2F                   FilAsg(Oimg, FileNameTable(.FileNameReference.));
 3231   8B60                   FilRst(Status, Oimg);
 3232   8B77                   FilSeek(Status, Oimg, CurrentFileAddress);
 3233   8B9E                   CurrentFileAddress := CurrentFileAddress + ImageSize * ImageFactor;
 3234   8BD8    
 3235   8BD8                   WITH Orid DO
 3236   8BDD                     BEGIN
 3237   8BE2                      assign(F, FileNameTable(.FileNameReference.));
 3238   8C12                      reset(F);
 3239   8C26                      seek(F, CurrentFileAddress);
 3240   8C42                      WITH B DO
 3241   8C54                        BEGIN
 3242   8C59                         P := 16;
 3243   8C60                         I := (..);
 3244   8C78                         read(F, Y1);
 3245   8C9F                        END;
 3246   8C9F                     END;
 3247   8C9F                   CurrentFileAddress := CurrentFileAddress + ImageSize;
 3248   8CCE    
 3249   8CCE                   IF OvrSize > 0 THEN
 3250   8CEE                     BEGIN
 3251   8CF3                      FilAsg(Oovr, FileNameTable(.FileNameReference.));
 3252   8D24                      FilRst(Status, Oovr);
 3253   8D3B                      FilSeek(Status, Oovr, CurrentFileAddress);
 3254   8D62                      CurrentFileAddress := CurrentFileAddress + OvrSize;
 3255   8D93                     END
 3256   8D93                   ELSE
 3257   8D96                      Oovr.P := CurrentFileAddress;
 3258   8DAD    
 3259   8DAD                   (*CurrentFileAddress now reflects starting position of
 3260   8DAD                     next section in file if any*)
 3261   8DAD    
 3262   8DAD                   Address := 0;
 3263   8DBC                   LocalImageSize := (ImageSize - 1) * ImageFactor;
 3264   8DE1                   WHILE (Address <= LocalImageSize) and (Status = (..)) DO
 3265   8E12                     BEGIN
 3266   8E17                      BMG2(Orid, Relocatable, Importable);
 3267   8E37                      IF Relocatable <> Importable THEN
 3268   8E45                        BEGIN
 3269   8E4A                         BMG6(Orid, Index);
 3270   8E62                         FGi32(Status, Oimg, QuadImageUnit);
 3271   8E81                         IF Relocatable THEN
 3272   8E8D                            (* Relocate *)
 3273   8E8D                            IF Index IN (.1..NooSegments.) THEN
 3274   8EBB                               WITH SectionTable(.SCTBase + Index.) DO
 3275   8EF2                                  QuadImageUnit := QuadImageUnit + RelocationConstant
 3276   8EFB                            ELSE
 3277   8F14                               Status := Status + (.BadRelocationCode.)
 3278   8F2A                         ELSE
 3279   8F3E                            (* Import *)
 3280   8F3E                           BEGIN (*IMPORT*)
 3281   8F43                            IF Index = OvrCode THEN
 3282   8F4F                               IF Oovr.P  < CurrentFileAddress - 3 THEN
 3283   8F76                                  FGi32(Status, Oovr, OvrIndex)
 3284   8F92                               ELSE
 3285   8F98                                  Status := Status + (.UnexpectedEof.)
 3286   8FAE                            ELSE
 3287   8FC1                               OvrIndex := Index;
 3288   8FD1                            IF OvrIndex IN (.1..NooExternalImportSymbols.) THEN
 3289   9001                               WITH ValueTable(.ExternalImportTable(.EITOffset + OvrIndex
 3290   900C                                                                   .).SymbolNo
 3291   9032                                              .) DO
 3292   904A                                  IF SegmentNo > UnResolved THEN
 3293   905B                                    BEGIN
 3294   9060                                     QuadImageUnit := QuadImageUnit + Value; (*?* + ? *)
 3295   907C                                     Importable := false;
 3296   9085                                     Relocatable := SegmentNo > 0;
 3297   90A2                                     Index := SegmentNo;
 3298   90B5                                    END
 3299   90B5                                  ELSE
 3300   90B8                                     IF Value IN (.0..63.) THEN
 3301   90DB                                        Index := Value
 3302   90E0                                     ELSE
 3303   90F7                                       BEGIN
 3304   90FC                                        Index := OvrCode;
 3305   9105                                        FPi32(Covr, Value);
 3306   9120                                       END
 3307   9120                            ELSE
 3308   9123                               Status := Status + (.BadImportCode.)
 3309   9139                           END;  (*IMPORT*)
 3310   914A                         FPi32(TargetFile, QuadImageUnit);
 3311   915F                         BMP2(Crid, Relocatable, Importable);
 3312   917C                         BMP6(Crid, Index);
 3313   918F                         Address := Address + ImageFactor;
 3314   91AA                        END
 3315   91AA                      ELSE
 3316   91AD                         IF Relocatable THEN
 3317   91B9                           BEGIN
 3318   91BE                            Status := Status + (.Baddibit.);
 3319   91E5                            GOTO 99; (*EXIT procedure*)
 3320   91ED                           END
 3321   91ED                         ELSE
 3322   91F0                           BEGIN
 3323   91F5                            FGi8(Status, Oimg, ImageUnit);
 3324   9214                            FPi8(TargetFile, ImageUnit);
 3325   9227                            BMP2(Crid, Relocatable, Importable);
 3326   9244                            Address := Address + 1;
 3327   9257                           END;
 3328   9257                     END;
 3329   925A                   LocalImageSize := ImageSize * ImageFactor;
 3330   927C                   WHILE (Address < LocalImageSize) and (Status = (..)) DO
 3331   92AD                     BEGIN
 3332   92B2                      BMG2(Orid, Relocatable, Importable);
 3333   92D2                      IF Relocatable or Importable THEN
 3334   92E1                        BEGIN
 3335   92E6                         Status := Status + (.Baddibit.);
 3336   930D                         GOTO 99; (*EXIT procedure*)
 3337   9315                        END
 3338   9315                      ELSE
 3339   9318                        BEGIN
 3340   931D                         FGi8(Status, Oimg, ImageUnit);
 3341   933C                         FPi8(TargetFile, ImageUnit);
 3342   934F                         BMP2(Crid, Relocatable, Importable);
 3343   936C                         Address := Address + 1;
 3344   937F                        END;
 3345   937F                     END;
 3346   9382                  END; (* IF ImageSize > 0 THEN *)
 3347   9382    99:        END; (* WITH MDTrec, SCTrec DO *)
 3348   9382            END;  (*LINKSECTION*)
 3349   938B    
 3350   938B          PROCEDURE CopyBuffer(VAR Status: StatusType
 3351   938B                              ;VAR Buffer: BasicFileType
 3352   938B                              ;VAR TargetFile: FileType
 3353   938B                              ;VAR Size: FileAddressType
 3354   938B                              );
 3355   938B    
 3356   938B             VAR
 3357   938B                Item: i8;
 3358   938B                Start: FileAddressType;
 3359   938B    
 3360   938B            BEGIN (*COPYBUFFER*)
 3361   938B             reset(Buffer);
 3362   93A6             Start := TargetFile.P;
 3363   93BD             WHILE not eof(Buffer) DO
 3364   93D6               BEGIN
 3365   93DB                read(Buffer, Item);
 3366   93FE                FPi8(TargetFile, Item); (*Advancing TargetFile.P*)
 3367   9411               END;
 3368   9414             Size := TargetFile.P - Start;
 3369   943A    (*#B#*)
 3370   943A             IF test((.0,20.)) THEN
 3371   9454               BEGIN
 3372   9459                writeln(TestOut, 'CPYBUF   ', 'Start= ', Start:1
 3373   9498                                            , ' End= ', TargetFile.P:1
 3374   94BE                                            , ' Size= ', Size:1
 3375   94E3                       );
 3376   94EC               END;
 3377   94EC    (*#E#*)
 3378   94EC            END;  (*COPYBUFFER*)
 3379   94F2    
 3380   94F2          PROCEDURE UPDINX(VAR Status: StatusType
 3381   94F2                           VAR TargetFile: FileType
 3382   94F2                          );
 3383   94F2    
 3384   94F2             VAR
 3385   94F2                ModuleSize: i32;
 3386   94F2                ModuleName: ModuleNameType;
 3387   94F2                SegmentInx: SegmentNoType;
 3388   94F2    
 3389   94F2            BEGIN (*UPDINX*)
 3390   94F2             ModuleSize := TargetFile.P - OMF_Address;
 3391   9519             update(TargetFile.F);
 3392   952C             FilSeek(Status, TargetFile, OMH_Address);
 3393   954A             IF Status = (..) THEN
 3394   9563               BEGIN
 3395   9568                FPi32(TargetFile, ModuleSize);
 3396   957D                FPi32(TargetFile, CurSegmentCount);
 3397   9597                FPi32(TargetFile, NooExpSymbols);
 3398   95AF                FPi32(TargetFile, NooExiSymbols);
 3399   95C7                FGsym(Status, TargetFile, ModuleName); (*skip past name*)
 3400   95E5                IF Status = (..) THEN
 3401   95FE                   FOR SegmentInx := 1 TO CurSegmentCount DO
 3402   9618                      WITH SectionTable(.TargetSectionOffset + SegmentInx.) DO
 3403   9646                        BEGIN
 3404   964B                         FPi32(TargetFile, ImageSize);
 3405   9667                         FPi32(TargetFile, OvrSize);
 3406   9685                        END;
 3407   968F               END;
 3408   968F            END;  (*UPDINX*)
 3409   9695    
 3410   9695         BEGIN (*PASS2*)
 3411   9695          FOR SegmentInx := 1 TO CurSegmentCount DO
 3412   96B7            BEGIN
 3413   96BC             WITH Crid DO
 3414   96C1               BEGIN
 3415   96C6                rewrite(F);
 3416   96DA                WITH B DO
 3417   96EC                  BEGIN
 3418   96F1                   P := 16;
 3419   96F8                   I := (..)
 3420   9705                  END
 3421   9710               END;
 3422   9710             FilRwt(Covr);
 3423   9720             FOR ModuleInx := 1 TO TargetModuleNo - 1 DO
 3424   9747               BEGIN
 3425   974C    (*#B#*)
 3426   974C                IF test((.0,20.)) THEN
 3427   9766                  BEGIN
 3428   976B                   write(TestOut, 'Pass-2   '); TSTstat(Status); TSTindt;
 3429   97AA                   writeln(TestOut, 'SgmInx= ', SegmentInx:1
 3430   97D9                                  , ' MdlInx= ', ModuleInx:1
 3431   9800                                  );
 3432   9809                   TSTindt; TSTindt; TSTindt;
 3433   9817                   TSTmdt(ModuleInx);
 3434   9826                   TSTindt; TSTindt; TSTindt;
 3435   9834                   TSTsct(ModuleTable(.ModuleInx.).SCTBase + SegmentInx);
 3436   986A                  END;
 3437   986A    (*#E#*)
 3438   986A                IF (SectionTable(.ModuleTable(.ModuleInx
 3439   986F                                             .).SCTBase + SegmentInx
 3440   9883                                .).ModuleNo = ModuleInx) THEN
 3441   98B1                  BEGIN
 3442   98B6                   LinkSection(Status, TargetFile, LogFile, Crid, Covr
 3443   98D8                              ,SectionTable(.ModuleTable(.ModuleInx
 3444   98E0                                                         .).SCTBase + SegmentInx
 3445   98F4                                           .)
 3446   991B                              ,ModuleTable(.ModuleInx.)
 3447   9930                              );
 3448   9934                   IF Status <> (..) THEN
 3449   994D                      GOTO 999; (*************  EXIT BOTH FOR LOOPS **************)
 3450   9955                  END;
 3451   9955               END;
 3452   995F             WITH SectionTable(.TargetSectionOffset + SegmentInx.) DO
 3453   998D               BEGIN
 3454   9992                CopyBuffer(Status, Crid.F, TargetFile, ImageSize);
 3455   99B9                CopyBuffer(Status, Covr.F, TargetFile, OvrSize);
 3456   99E2               END;
 3457   99E2            END;
 3458   99EC    999:
 3459   99EC          (*backpatch info to target.inx*)
 3460   99EC          UPDINX(Status, TargetFile);
 3461   9A02    
 3462   9A02         END;  (*PASS2*)
 3463   9A0B    
 3464   9A0B    (*                                                                            *)
 3465   9A0B    (*                                                                            *)
 3466   9A0B    (******************************************************************************)
 3467   9A0B    
 3468   9A0B    
 3469   9A0B    
 3470   9A0B      BEGIN  (*LINK*)
 3471   9A0B    (*#B#*)
 3472   9A0B       TestInit(Input,Output);
 3473   9A24    (*#E#*)
 3474   9A24       Status := (..);
 3475   9A38       Optiontable.LogFileKind := None;
 3476   9A42       OptionTable.TargetFileKind := Implicit;
 3477   9A4C       CurFileNo := 0;
 3478   9A56       CurModuleNo := 0;
 3479   9A60       FOR SCTSubInx := 1 TO MaxNooSections DO
 3480   9A72          SectionTable(.SCTSubInx.).SegmentNo := 0;
 3481   9A96       SCTOffset := 0;
 3482   9AA0       CurSegmentCount := 0;
 3483   9AAA       CurExternalImportSymbolNo := 0;
 3484   9AB4    
 3485   9AB4       SetUp(Status, TargetFile, LogFile, Output);
 3486   9ACC    (*#B#*)
 3487   9ACC       IF test((.0,16,17.)) THEN
 3488   9AE6         BEGIN
 3489   9AEB          write(TestOut, 'Link-MAIN-1   '); TSTstat(Status); TSTindt; TSTmem; TSTln
 3490   9B2F         END;
 3491   9B32    (*#E#*)
 3492   9B32       IF Status = (..) THEN
 3493   9B48          Pass1(Status, TargetFile, LogFile);
 3494   9B5C    (*#B#*)
 3495   9B5C       IF test((.0,16,17.)) THEN
 3496   9B76         BEGIN
 3497   9B7B          write(TestOut, 'Link-MAIN-2   '); TSTstat(Status); TSTln
 3498   9BB9         END;
 3499   9BBC    (*#E#*)
 3500   9BBC       IF Status = (..) THEN
 3501   9BD2          Pass2(Status, TargetFile, LogFile);
 3502   9BE6    (*#B#*)
 3503   9BE6       IF test((.0,16,17.)) THEN
 3504   9C00         BEGIN
 3505   9C05          write(TestOut, 'Link-MAIN-3   '); TSTstat(Status); TSTln
 3506   9C43         END;
 3507   9C46    (*#E#*)
 3508   9C46       IF Status = (..) THEN
 3509   9C5C         BEGIN
 3510   9C61          writeln(output, 'LINK -- Normal termination')
 3511   9C97         END
 3512   9C9A       ELSE
 3513   9C9D         BEGIN
 3514   9CA2          writeln(output, 'LINK -- Abnormal termination.');
 3515   9CDE    
 3516   9CDE          IF BadOption IN Status THEN
 3517   9CF3             writeln(output, 'Bad option');
 3518   9D1C          IF BadLogFileName IN Status THEN
 3519   9D31             writeln(output, 'Bad log file name');
 3520   9D61          IF BadTargetFileName IN Status THEN
 3521   9D76             writeln(output, 'Bad target file name');
 3522   9DA9          IF BadFileName IN Status THEN
 3523   9DBE             writeln(output, 'Bad file name');
 3524   9DEA          IF NoSuchFile IN Status THEN
 3525   9DFF             writeln(output, 'No such file');
 3526   9E2A          IF NoInputFiles IN Status THEN
 3527   9E3F             writeln(output, 'No input files');
 3528   9E6C          IF ExtraText IN Status THEN
 3529   9E81             writeln(output, 'Extra text');
 3530   9EAA          IF BadFileFormat IN Status THEN
 3531   9EBF             writeln(output, 'Bad file format');
 3532   9EED          IF BadModuleFormat IN Status THEN
 3533   9F02             writeln(output, 'Bad module format');
 3534   9F32          IF UnexpectedEof IN Status THEN
 3535   9F47             writeln(output, 'Unexpected EOF');
 3536   9F74          IF RangeError IN Status THEN
 3537   9F89             writeln(output, 'Range error');
 3538   9FB3          IF BadSymbolName IN Status THEN
 3539   9FC8             writeln(output, 'Bad symbol name');
 3540   9FF6          IF DuplicateModuleName IN Status THEN
 3541   A00B             writeln(output, 'Duplicate module name');
 3542   A03F          IF DuplicateExportSymbol IN Status THEN
 3543   A054             writeln(output, 'Duplicate export symbol');
 3544   A08A          IF NoInput IN Status THEN
 3545   A09F             writeln(output, 'No input');
 3546   A0C6          IF Baddibit IN Status THEN
 3547   A0DB             writeln(output, 'Bad dibit');
 3548   A103          IF BadRelocationCode IN Status THEN
 3549   A118             writeln(output, 'Bad relocation code');
 3550   A14A          IF BadImportCode IN Status THEN
 3551   A15F             writeln(output, 'Bad import code');
 3552   A18D          IF NameTableOverFlow IN Status THEN
 3553   A1A2             writeln(output, 'Name table overflow');
 3554   A1D4          IF ModuleTableOverFlow IN Status THEN
 3555   A1E9             writeln(output, 'Module table overflow');
 3556   A21D          IF SectionTableOverFlow IN Status THEN
 3557   A232             writeln(output, 'Section table overflow');
 3558   A267          IF FileNameTableOverFlow IN Status THEN
 3559   A27C             writeln(output, 'File name table overflow');
 3560   A2B3          IF SymbolTableOverFlow IN Status THEN
 3561   A2C8             writeln(output, 'Symbol table overflow');
 3562   A2FC          IF ExternalImportTableOverFlow IN Status THEN
 3563   A311             writeln(output, 'External import table overflow');
 3564   A34E    
 3565   A34E          IF not (NoTarget IN Status) THEN
 3566   A363             erase(TargetFile.F);
 3567   A36F         END
 3568   A36F      END. 
«eof»