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

⟦7c2dfa278⟧ TextFile

    Length: 187264 (0x2db80)
    Types: TextFile
    Names: »LNK.PRN«

Derivation

└─⟦94d85ef43⟧ Bits:30009789/_.ft.Ibm2.50006584.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.02';
   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 + 1 DO
  532   05AB             write(TestOut, Heap(.I.):2, ' ':1);
  533   05F1          writeln(TestOut, ')');
  534   060C         END;  (*TSTHEAP*)
  535   0612    
  536   0612       PROCEDURE TSTmdt(Inx: ModuleTableIndexType
  537   0612                    );
  538   0612    
  539   0612         BEGIN (*TST*)
  540   0612          WITH moduleTable(.Inx.) DO
  541   0639            BEGIN
  542   063E             write(TestOut, 'MDTÆ', Inx:1, '/', CurModuleNo:1,
  543   0689                               'Å=(MdNm#=', ModuleNameReference:1, ' ':2
  544   06B7                                  ,'Fn#=', FileNameReference:1, ' ':2
  545   06E7                                  ,'CurFlAddr=', CurrentFileAddress:1, ' ':2
  546   071A                                  ,'Refd='
  547   0728                   );
  548   0735             TSTbool(Referenced);
  549   074C             TSTln;
  550   0754             TSTindt; TSTindt; TSTindt;
  551   0762             writeln(TestOut      ,'SCTbase=', SCTbase:1, ' ':2
  552   07A2                                  ,'#Sgm=', NooSegments:1, ' ':2
  553   07D6                                  ,'EIT#=', EITOffset:1, ' ':2
  554   080A                                  ,'#EIsbl=', NooExternalImportSymbols:1, ' ':2
  555   0840                                  ,'SBTLH=', SBTlinkHead:1
  556   086C                                  ,')'
  557   0872                  );
  558   087E            END
  559   087E         END;  (*TST*)
  560   0884    
  561   0884       PROCEDURE TSTopt;
  562   0884    
  563   0884         BEGIN (*TSTopt*)
  564   0884          writeln(TestOut, 'OPT=(LogKind=', ord(OptionTable.LogFileKind):1, ' ':2
  565   08C7                                ,'TargetKind=', ord(OptionTable.TargetFileKind):1
  566   08EE                                ,')' )
  567   08FD         END;  (*TSTopt*)
  568   0906    
  569   0906       PROCEDURE TSTsct(Inx: SectionTableIndexType
  570   0906                    );
  571   0906    
  572   0906         BEGIN (*TSTsct*)
  573   0906          WITH SectionTable(.Inx.) DO
  574   092D            BEGIN
  575   0932             writeln(TestOut, 'SCT=Æ', Inx:1, '/', SCTOffset:1, '/', CurSegmentCount:1
  576   0992                             ,'Å=(Mdl#=', ModuleNo:1, ' ':2
  577   09C5                             ,'Sgm#=', SegmentNo:1
  578   09ED                    );
  579   09F6             writeln(TestOut, '         ImgSz=', ImageSize, ' ':2
  580   0A37                             ,'OvrSz=', OvrSize, ' ':2
  581   0A68                             ,'RlConst=', RelocationConstant
  582   0A83                             ,')'
  583   0A98                    );
  584   0AA4            END
  585   0AA4         END;  (*TSTsct*)
  586   0AAA    
  587   0AAA       PROCEDURE TSTvlt(Inx: SymbolTableIndexType
  588   0AAA                    );
  589   0AAA    
  590   0AAA         BEGIN (*TSTvlt*)
  591   0AAA          WITH ValueTable(.Inx.) DO
  592   0AD1            BEGIN
  593   0AD6             write(TestOut, 'VLTÆ',Inx:1,'Å=(Segm#=', SegmentNo:1
  594   0B2C                          , '  Value=', Value:1, ')' )
  595   0B62            END
  596   0B65         END;  (*TSTvlt*)
  597   0B6B    
  598   0B6B    (*                                                                            *)
  599   0B6B    (*                                                                            *)
  600   0B6B    (******************************************************************************)
  601   0B6B    
  602   0B6B    (*$I B:LnkDF2.pas   Global access primitives                                  *)
  603   0B6B    (******************************************************************************)
  604   0B6B    (*                                                                            *)
  605   0B6B    (*   Copyright (1985) by Metanic Aps., Denmark                                *)
  606   0B6B    (*                                                                            *)
  607   0B6B    (*   Author: Lars Gregers Jakobsen.                                           *)
  608   0B6B    (*                                                                            *)
  609   0B6B    (******************************************************************************)
  610   0B6B    
  611   0B6B       (* File LnkDF2X holds the access primitives used by the
  612   0B6B          linker to access input and output files. *)
  613   0B6B    
  614   0B6B         FUNCTION OPTLFK: LogFileKindType;
  615   0B6B    
  616   0B6B           BEGIN (*OPTLFK*)
  617   0B6B            optlfk := OptionTable.LogFileKind;
  618   0B81           END;  (*OPTLFK*)
  619   0B87    
  620   0B87         PROCEDURE FNTP(VAR Status: StatusType
  621   0B87                        ;    FileName: FileNameType
  622   0B87                        );
  623   0B87    
  624   0B87            BEGIN (*FNTP*)
  625   0B87             IF CurFileNo < MaxNooInputFiles THEN
  626   0B9F               BEGIN
  627   0BA4                CurFileNo := CurFileNo + 1;
  628   0BBA                FileNameTable(.CurFileNo.) := FileName;
  629   0BE4               END
  630   0BE4             ELSE
  631   0BE6                Status := Status + (.FileNameTableOverFlow.);
  632   0C0D    (*#B#*)
  633   0C0D             IF test((.0,6.)) THEN
  634   0C23               BEGIN
  635   0C28                write(TestOut, 'FNTP     '); TSTstat(Status); TSTindt;
  636   0C67                TSTfnt(CurFileNo); TSTln
  637   0C76               END
  638   0C79    (*#E#*)
  639   0C79            END;  (*FNTP*)
  640   0C7F    
  641   0C7F       PROCEDURE EITP(VAR Status: StatusType
  642   0C7F                     ;    SymbolTableEntryNo: SymbolTableIndexType
  643   0C7F                     );
  644   0C7F    
  645   0C7F         BEGIN (*EITP*)
  646   0C7F          IF CurExternalImportSymbolNo < MaxNooExternalImportSymbols THEN
  647   0C97            BEGIN
  648   0C9C             CurExternalImportSymbolNo := CurExternalImportSymbolNo + 1;
  649   0CB2             ExternalImportTable(.CurExternalImportSymbolNo
  650   0CB7                                .).SymbolNo := SymbolTableEntryNo
  651   0CC2            END
  652   0CCB          ELSE
  653   0CCD             Status := Status + (.ExternalImportTableOverFlow.);
  654   0CF5    (*#B#*)
  655   0CF5          IF test((.0,7.)) THEN
  656   0D0B            BEGIN
  657   0D10             write(TestOut, 'EITP     '); TSTstat(Status); TSTln;
  658   0D4F             TSTeit(CurExternalImportSymbolNo)
  659   0D5B            END
  660   0D5E    (*#E#*)
  661   0D5E         END;  (*EITP*)
  662   0D64    
  663   0D64    (* ModuleTable *)
  664   0D64    
  665   0D64       PROCEDURE MDTA(VAR Status: StatusType
  666   0D64                     ;VAR ModuleNo: ModuleTableIndexType  (*Points to least, vacant entry in MDT*)
  667   0D64                     ;    ModuleCount: ModuleTableIndexType
  668   0D64                     );
  669   0D64    
  670   0D64         BEGIN (*MDTA*)
  671   0D64          ModuleNo := CurModuleNo;
  672   0D80          IF CurModuleNo > MaxNooModules - ModuleCount THEN
  673   0DA7             Status := Status + (.ModuleTableOverFlow.)
  674   0DBD          ELSE
  675   0DD0            BEGIN
  676   0DD5             ModuleNo := CurModuleNo + 1;
  677   0DF1             CurModuleNo := CurModuleNo + ModuleCount;
  678   0E0E            END;
  679   0E0E    (*#B#*)
  680   0E0E          IF test((.0,6.)) THEN
  681   0E25            BEGIN
  682   0E2A             write(TestOut, 'MDTA     '); TSTstat(Status); TSTindt;
  683   0E69             writeln(TestOut, 'ModuleNo, Count, CurModuleNo= ',
  684   0EA3                               ModuleNo:1, ' ',
  685   0EC1                               ModuleCount:1, ' ', CurModuleNo:1
  686   0EE6                   );
  687   0EEF            END;
  688   0EEF    (*#E#*)
  689   0EEF         END;  (*MDTA*)
  690   0EF5    
  691   0EF5     (* SectionTable *)
  692   0EF5    
  693   0EF5       PROCEDURE SCTA(VAR Status: StatusType
  694   0EF5                     ;VAR SectionNo: SectionTableIndexType  (*Points to highest, used entry in SCT*)
  695   0EF5                     ;    SectionCount: SegmentNoType
  696   0EF5                     );
  697   0EF5    
  698   0EF5         BEGIN (*SCTA*)
  699   0EF5          SectionNo := SCTOffset;
  700   0F11          IF SCTOffset > MaxNooSections - SectionCount THEN
  701   0F38             Status := Status + (.SectionTableOverFlow.)
  702   0F4E          ELSE
  703   0F61            BEGIN
  704   0F66             SCTOffset := SCTOffset + SectionCount;
  705   0F83            END;
  706   0F83    (*#B#*)
  707   0F83          IF test((.0,6.)) THEN
  708   0F9A            BEGIN
  709   0F9F             write(TestOut, 'SCTA     '); TSTstat(Status); TSTindt;
  710   0FDE             writeln(TestOut, 'SectionNo, Count, SCTOffset= ',
  711   1017                               SectionNo:11, ' ', SectionCount:1, ' ',
  712   104F                               SCTOffset:1
  713   105A                    );
  714   1063            END;
  715   1063    (*#E#*)
  716   1063         END;  (*SCTA*)
  717   1069    
  718   1069    (*                                                                            *)
  719   1069    (*                                                                            *)
  720   1069    (******************************************************************************)
  721   1069    
  722   1069    
  723   1069    
  724   1069    (*$I B:LnkDF7.pas   Log File access primitives                                *)
  725   1069    (******************************************************************************)
  726   1069    (*                                                                            *)
  727   1069    (*   Copyright (1985) by Metanic Aps., Denmark                                *)
  728   1069    (*                                                                            *)
  729   1069    (*   Author: Lars Gregers Jakobsen.                                           *)
  730   1069    (*                                                                            *)
  731   1069    (******************************************************************************)
  732   1069    
  733   1069    
  734   1069          PROCEDURE WriteSymbolName(VAR F: text
  735   1069                                   ;    SymbolName: SymbolNameType
  736   1069                                   ;    FieldSize: i8
  737   1069                                   );
  738   1069    
  739   1069             VAR
  740   1069                I: i8;
  741   1069                N: i8;
  742   1069    
  743   1069            BEGIN (*WRITESYMBOLNAME*)
  744   1069             WITH SymbolName DO
  745   108B               BEGIN
  746   1090                IF Length < FieldSize THEN
  747   10A8                   N := Length
  748   10AD                ELSE
  749   10B9                   N := FieldSize;
  750   10C4                FOR I := 1 TO N DO
  751   10DA                   IF Name(.I.) in (.32..127.) THEN
  752   1111                      write(F, chr(Name(.I.)) );
  753   1152                FOR I := N+1 TO FieldSize DO
  754   1174                   write(F, ' ');
  755   11A0               END
  756   11A0            END;  (*WRITESYMBOLNAME*)
  757   11A6    
  758   11A6          PROCEDURE LogInit(VAR LogFile: LogFileType
  759   11A6                           ;    FileName: FileNameType
  760   11A6                           );
  761   11A6    
  762   11A6            BEGIN (*LOGINIT*)
  763   11A6             WITH LogFile DO
  764   11BF               BEGIN
  765   11C4                assign(F, FileName);
  766   11DB                rewrite(F);
  767   11EE                P := 0;
  768   1205                L := LogFilePageSize;
  769   1216               END
  770   1216            END;  (*LOGINIT*)
  771   121C    
  772   121C          PROCEDURE LogTerm(VAR LogFile: LogFileType
  773   121C                           );
  774   121C    
  775   121C            BEGIN (*LOGTERM*)
  776   121C             WITH LogFile DO
  777   1235               BEGIN
  778   123A                close(F);
  779   1247               END
  780   1247            END;  (*LOGTERM*)
  781   124D    
  782   124D          FUNCTION LogFF(VAR LogFile: LogFileType
  783   124D                        ;    Delta: LineNoType
  784   124D                        ): boolean;
  785   124D    
  786   124D             CONST
  787   124D                LogFFDelta = 5;
  788   124D    
  789   124D            BEGIN (*LOGFF*)
  790   124D             WITH LogFile DO
  791   1266                IF L >= LogFilePageSize - Delta THEN
  792   128C                  BEGIN
  793   1291                   LogFF := true;
  794   129A                   P := P + 1;
  795   12B9                   L := LogFFDelta;
  796   12CA                   page(F);
  797   12DD                   writeln(F);
  798   12F6                   writeln(F);
  799   130F                   writeln(F, ' ':LogMargin, 'LINKER '
  800   1338                            , VersionNo, ' '
  801   134F                            , ConfigurationNo
  802   1358                            , ' ':30
  803   1368                            , 'SIDE # ', P:2);
  804   1398                   writeln(F);
  805   13B1                   writeln(F);
  806   13CA                  END
  807   13CA                ELSE
  808   13CC                   LogFF := false;
  809   13D5            END;  (*LOGFF*)
  810   13DE    
  811   13DE          PROCEDURE LogCmd(VAR LogFile: LogFileType
  812   13DE                          ;    CommandLine: CommandLineType
  813   13DE                          );
  814   13DE    
  815   13DE             CONST Delta = 5;
  816   13DE    
  817   13DE            BEGIN (*LOGCMD*)
  818   13DE             IF OptionTable.LogFileKind <> none THEN
  819   13F3               BEGIN
  820   13F8                IF LogFF(LogFile, Delta) THEN BEGIN END;
  821   140D                WITH LogFile DO
  822   141E                  BEGIN
  823   1423                   writeln(F);
  824   143C                   writeln(F, ' ':LogMargin, 'AKTIVERINGSKOMMANDO: ');
  825   1480                   writeln(F);
  826   1499                   writeln(F, ' ':LogMargin, CommandLine);
  827   14CB                   writeln(F);
  828   14E4                  END
  829   14E4               END
  830   14E4            END;  (*LOGCMD*)
  831   14EA    
  832   14EA          PROCEDURE LogHSsgd(VAR LogFile: LogFileType
  833   14EA                            );
  834   14EA    
  835   14EA            BEGIN (*LOGHSSGD*)
  836   14EA             IF OptionTable.LogFileKind <> none THEN
  837   14FF                WITH LogFile DO
  838   1510                  BEGIN
  839   1515                   L := L + 2;
  840   1536                   writeln(F, ' ':LogMargin, 'SGM'
  841   155B                            , ' ':2,         'ADRESSE':9
  842   157C                            , ' ':2,         'STØRRELSE'
  843   1597                            , ' ':2,         'MODUL'
  844   15B2                          );
  845   15BF                   writeln(F);
  846   15D8                  END
  847   15D8            END;  (*LOGHSSGD*)
  848   15DE    
  849   15DE          PROCEDURE LogHsgd(VAR LogFile: LogFileType
  850   15DE                           );
  851   15DE    
  852   15DE            BEGIN (*LOGHSGD*)
  853   15DE             IF OptionTable.LogFileKind <> none THEN
  854   15F3               BEGIN
  855   15F8                IF LogFF(LogFile, 6) THEN BEGIN END;
  856   160D                WITH LogFile DO
  857   161E                  BEGIN
  858   1623                   L := L + 3;
  859   1644                   writeln(F);
  860   165D                   writeln(F, ' ':LogMargin, 'LOKALISERINGSPLAN:');
  861   169E                   writeln(F);
  862   16B7                  END;
  863   16B7                LogHSsgd(LogFile);
  864   16C6               END;
  865   16C6            END;  (*LOGHSGD*)
  866   16CC    
  867   16CC          PROCEDURE LogSGD(VAR LogFile: LogFileType
  868   16CC                          ;    SegmentNo: RelocationIndicatorType
  869   16CC                          ;    StartAddress: FileAddressType
  870   16CC                          ;    Size: FileAddressType
  871   16CC                          ;    ModuleName: SymbolNameType
  872   16CC                          );
  873   16CC    
  874   16CC            BEGIN (*LOGSGD*)
  875   16CC             IF OptionTable.LogFileKind <> none THEN
  876   16F6               BEGIN
  877   16FB                IF LogFF(LogFile, 1) THEN
  878   1710                   LogHSsgd(LogFile);
  879   171F                WITH LogFile DO
  880   1730                  BEGIN
  881   1735                   L := L + 1;
  882   1753                   write(F, ' ':LogMargin, SegmentNo:3
  883   177D                          , ' ':2,         StartAddress:9
  884   1792                          , ' ':2,         Size:9
  885   17A7                          , ' ':2
  886   17B0                        );
  887   17B9                   WriteSymbolName(F, ModuleName, 20);
  888   17D3                   writeln(F);
  889   17EC                  END;
  890   17EC               END
  891   17EC            END;  (*LOGSGD*)
  892   17F2    
  893   17F2          PROCEDURE LogHSxp(VAR LogFile: LogFileType
  894   17F2                           );
  895   17F2    
  896   17F2            BEGIN (*LOGHSXP*)
  897   17F2             IF OptionTable.LogFileKind <> none THEN
  898   1807                WITH LogFile DO
  899   1818                  BEGIN
  900   181D                   L := L + 2;
  901   183E                   writeln(F, ' ':LogMargin, 'SGM'
  902   1863                            , ' ':2,         'VÆRDI':9
  903   1882                            , ' ':2,         'SYMBOL', ' ':14
  904   18A7                            , ' ':2,         'MODUL'
  905   18BE                          );
  906   18CB                   writeln(F);
  907   18E4                  END
  908   18E4            END;  (*LOGHSXP*)
  909   18EA    
  910   18EA          PROCEDURE LogHxpN(VAR LogFile: LogFileType
  911   18EA                           );
  912   18EA    
  913   18EA            BEGIN (*LOGHXPN*)
  914   18EA             IF OptionTable.LogFileKind <> none THEN
  915   18FF               BEGIN
  916   1904                IF LogFF(LogFile, 6) THEN BEGIN END;
  917   1919                WITH LogFile DO
  918   192A                  BEGIN
  919   192F                   L := L + 3;
  920   1950                   writeln(F);
  921   1969                   writeln(F, ' ':LogMargin, 'EXPORTEREDE SYMBOLER (NAVNEORDEN):');
  922   19BA                   writeln(F);
  923   19D3                  END;
  924   19D3                LogHSxp(LogFile);
  925   19E2               END
  926   19E2            END;  (*LOGHXPN*)
  927   19E8    
  928   19E8          PROCEDURE LogHxpV(VAR LogFile: LogFileType
  929   19E8                           );
  930   19E8    
  931   19E8            BEGIN (*LOGHXPV*)
  932   19E8             IF OptionTable.LogFileKind <> none THEN
  933   19FD               BEGIN
  934   1A02                IF LogFF(LogFile, 6) THEN BEGIN END;
  935   1A17                WITH LogFile DO
  936   1A28                  BEGIN
  937   1A2D                   L := L + 3;
  938   1A4E                   writeln(F);
  939   1A67                   writeln(F, ' ':LogMargin, 'EXPORTEREDE SYMBOLER (VÆRDIORDEN):');
  940   1AB8                   writeln(F);
  941   1AD1                  END;
  942   1AD1                LogHSxp(LogFile);
  943   1AE0               END
  944   1AE0            END;  (*LOGHXPV*)
  945   1AE6    
  946   1AE6          PROCEDURE LogXP(VAR LogFile: LogFileType
  947   1AE6                         ;    SegmentNo: RelocationIndicatorType
  948   1AE6                         ;    Value: i32
  949   1AE6                         ;    SymbolName: SymbolNameType
  950   1AE6                         ;    ModuleName: ModuleNameType
  951   1AE6                         );
  952   1AE6    
  953   1AE6            BEGIN (*LOGXP*)
  954   1AE6             IF OptionTable.LogFileKind <> none THEN
  955   1B25               BEGIN
  956   1B2A                IF LogFF(LogFile,1) THEN
  957   1B3F                   LogHSxp(LogFile);
  958   1B4E                WITH LogFile DO
  959   1B5F                  BEGIN
  960   1B64                   L := L + 1;
  961   1B82                   write(F, ' ':LogMargin, SegmentNo:3
  962   1BAC                          , ' ':2,         Value:9
  963   1BC1                          , ' ':2
  964   1BCA                        );
  965   1BD3                   WriteSymbolName(F, SymbolName, 20);
  966   1BED                   write(F, ' ':2);
  967   1C0F                   WriteSymbolName(F, ModuleName, 20);
  968   1C29                   writeln(F);
  969   1C42                  END
  970   1C42               END
  971   1C42            END;  (*LOGXP*)
  972   1C48    
  973   1C48          PROCEDURE LogHSurs(VAR LogFile: LogFileType
  974   1C48                            );
  975   1C48    
  976   1C48            BEGIN (*LOGHSURS*)
  977   1C48             IF OptionTable.LogFileKind <> none THEN
  978   1C5D               BEGIN
  979   1C62                WITH LogFile DO
  980   1C73                  BEGIN
  981   1C78                   L := L + 2;
  982   1C99                   writeln(F, ' ':LogMargin
  983   1CB2                            , ' ':16,        'SYMBOL', ' ':14
  984   1CD7                            , ' ':2,         'MODUL');
  985   1CFB                   writeln(F);
  986   1D14                  END
  987   1D14               END
  988   1D14            END;  (*LOGHSURS*)
  989   1D1A    
  990   1D1A          PROCEDURE LogHurs(VAR LogFile: LogFileType
  991   1D1A                           );
  992   1D1A    
  993   1D1A            BEGIN (*LOGHURS*)
  994   1D1A             IF OptionTable.LogFileKind <> none THEN
  995   1D2F               BEGIN
  996   1D34                IF LogFF(LogFile, 6)THEN BEGIN END;
  997   1D49                WITH LogFile DO
  998   1D5A                  BEGIN
  999   1D5F                   L := L + 3;
 1000   1D80                   writeln(F);
 1001   1D99                   writeln(F, ' ':LogMargin, 'UTILFREDSSTILLEDE REFERENCER:');
 1002   1DE5                   writeln(F);
 1003   1DFE                  END;
 1004   1DFE                LogHSurs(LogFile);
 1005   1E0D               END
 1006   1E0D            END;  (*LOGHURS*)
 1007   1E13    
 1008   1E13          PROCEDURE LogURS(VAR LogFile: LogFileType
 1009   1E13                          ;    ModuleName: ModuleNameType
 1010   1E13                          ;    SymbolName: SymbolNameType
 1011   1E13                          );
 1012   1E13    
 1013   1E13            BEGIN (*LOGURS*)
 1014   1E13             IF OptionTable.LogFileKind <> none THEN
 1015   1E52               BEGIN
 1016   1E57                IF LogFF(LogFile, 1) THEN
 1017   1E6C                  LogHSurs(LogFile);
 1018   1E7B                WITH LogFile DO
 1019   1E8C                  BEGIN
 1020   1E91                   L := L + 1;
 1021   1EAF                   write(F, ' ':LogMargin
 1022   1EC8                          , ' ':16
 1023   1ED1                        );
 1024   1EDA                   WriteSymbolName(F, SymbolName, 20);
 1025   1EF4                   write(F, ' ':2);
 1026   1F16                   WriteSymbolName(F, ModuleName, 20);
 1027   1F30                   writeln(F);
 1028   1F49                  END
 1029   1F49               END
 1030   1F49            END;  (*LOGURS*)
 1031   1F4F    
 1032   1F4F          PROCEDURE LogHSdds(VAR LogFile: LogFileType
 1033   1F4F                            );
 1034   1F4F    
 1035   1F4F            BEGIN (*LOGHSDDS*)
 1036   1F4F             IF OptionTable.LogFileKind <> none THEN
 1037   1F64                WITH LogFile DO
 1038   1F75                  BEGIN
 1039   1F7A                   L := L + 2;
 1040   1F9B                   writeln(F, ' ':LogMargin, 'SGM'
 1041   1FC0                            , ' ':2,         'VÆRDI':9
 1042   1FDF                            , ' ':2,         'SYMBOL', ' ':14
 1043   2004                            , ' ':2,         'MODUL'
 1044   201B                          );
 1045   2028                   writeln(F);
 1046   2041                  END;
 1047   2041            END;  (*LOGHSDDS*)
 1048   2047    
 1049   2047          PROCEDURE LogHdds(VAR LogFile: LogFileType
 1050   2047                           );
 1051   2047    
 1052   2047            BEGIN (*LOGHDDS*)
 1053   2047             IF OptionTable.LogFileKind <> none THEN
 1054   205C               BEGIN
 1055   2061                IF LogFF(LogFile, 6) THEN BEGIN END;
 1056   2076                WITH LogFile DO
 1057   2087                  BEGIN
 1058   208C                   L := L + 2;
 1059   20AD                   writeln(F);
 1060   20C6                   writeln(F, ' ':LogMargin, 'DOBBELTDEFINEREDE SYMBOLER:');
 1061   2110                   writeln(F);
 1062   2129                  END;
 1063   2129                 LogHSdds(LogFile);
 1064   2138                END
 1065   2138            END;  (*LOGHDDS*)
 1066   213E    
 1067   213E          PROCEDURE LogDDS(VAR LogFile: LogFileType
 1068   213E                          ;    RelocationIndicator: RelocationIndicatorType
 1069   213E                          ;    Value: i32
 1070   213E                          ;    SymbolName: SymbolNameType
 1071   213E                          ;    ModuleName: ModuleNameType
 1072   213E                          );
 1073   213E    
 1074   213E            BEGIN (*LOGDDS*)
 1075   213E             IF OptionTable.LogFileKind <> none THEN
 1076   217D               BEGIN
 1077   2182                IF LogFF(LogFile, 1) THEN
 1078   2197                   LogHSdds(LogFile);
 1079   21A6                WITH LogFile DO
 1080   21B7                  BEGIN
 1081   21BC                   L := L + 1;
 1082   21DA                   write(F, ' ':LogMargin, ord(RelocationIndicator):3
 1083   2204                          , ' ':2,         Value:9
 1084   2219                          , ' ':2
 1085   2222                        );
 1086   222B                   WriteSymbolName(F, SymbolName, 20);
 1087   2245                   write(F, ' ':2);
 1088   2267                   WriteSymbolName(F, ModuleName, 20);
 1089   2281                   writeln(F);
 1090   229A                  END
 1091   229A               END
 1092   229A            END;  (*LOGDDS*)
 1093   22A0    
 1094   22A0          PROCEDURE LogOFFerror(VAR LogFile: LogFileType
 1095   22A0                               ;    FileNo: FileNameTableIndexType
 1096   22A0                               );
 1097   22A0    
 1098   22A0            BEGIN (*LOGOFFERROR*)
 1099   22A0             IF OptionTable.LogFileKind <> none THEN
 1100   22B5               BEGIN
 1101   22BA                IF LogFF(LogFile, 2) THEN BEGIN END;
 1102   22CF                WITH LogFile DO
 1103   22E0                  BEGIN
 1104   22E5                   L := L + 2;
 1105   2306                   writeln(F, ' ':LogMargin, '*** FILFORMATFEJL *** FIL # ', FileNo:1
 1106   2359                                    , ' ***'
 1107   2366                          );
 1108   2373                  END;
 1109   2373               END
 1110   2373            END;  (*LOGOFFERROR*)
 1111   2379    
 1112   2379    
 1113   2379          PROCEDURE LogOMFerror(VAR LogFile: LogFileType
 1114   2379                               ;    FileNo: FileNameTableIndexType
 1115   2379                               ;    Position: FileAddressType
 1116   2379                               );
 1117   2379    
 1118   2379            BEGIN (*LOGOMFERROR*)
 1119   2379             IF OptionTable.LogFileKind <> none THEN
 1120   238E               BEGIN
 1121   2393                IF LogFF(LogFile, 2) THEN BEGIN END;
 1122   23A8                WITH LogFile DO
 1123   23B9                  BEGIN
 1124   23BE                   L := L + 2;
 1125   23DF                   writeln(F, ' ':LogMargin, '*** MODULFORMATFEJL *** FIL # ', FileNo:1
 1126   2434                                   , ' *** POSITION # ', Position:1
 1127   245D                                   , ' ***'
 1128   246A                          );
 1129   2477                  END;
 1130   2477               END
 1131   2477            END;  (*LOGOMFERROR*)
 1132   247D    
 1133   247D          PROCEDURE LogEOFerror(VAR LogFile: LogFileType
 1134   247D                               ;    FileNo: FileNameTableIndexType
 1135   247D                               ;    Position: FileAddressType
 1136   247D                               );
 1137   247D    
 1138   247D            BEGIN (*LOGEOFERROR*)
 1139   247D             IF OptionTable.LogFileKind <> none THEN
 1140   2492               BEGIN
 1141   2497                IF LogFF(LogFile, 2) THEN BEGIN END;
 1142   24AC                WITH LogFile DO
 1143   24BD                  BEGIN
 1144   24C2                   L := L + 2;
 1145   24E3                   writeln(F, ' ':LogMargin, '*** FILLÆNGDEFEJL *** FIL # ', FileNo:1
 1146   2536                                           , ' *** POSITION # ', Position:1
 1147   255F                                           , ' ***'
 1148   256C                          );
 1149   2579                  END;
 1150   2579               END
 1151   2579            END;  (*LOGEOFERROR*)
 1152   257F    
 1153   257F    (*                                                                            *)
 1154   257F    (*                                                                            *)
 1155   257F    (******************************************************************************)
 1156   257F    
 1157   257F    
 1158   257F    (*$I B:LnkDF8.pas   Object File access primitives                             *)
 1159   257F    (******************************************************************************)
 1160   257F    (*                                                                            *)
 1161   257F    (*   Copyright (1985) by Metanic Aps., Denmark                                *)
 1162   257F    (*                                                                            *)
 1163   257F    (*   Author: Lars Gregers Jakobsen.                                           *)
 1164   257F    (*                                                                            *)
 1165   257F    (******************************************************************************)
 1166   257F    
 1167   257F          PROCEDURE FilAsg(VAR Fl: FileType
 1168   257F                          ;Fn: FileNameType
 1169   257F                          );
 1170   257F    
 1171   257F            BEGIN (*FILASG*)
 1172   257F    (*#B#*)
 1173   257F             IF test((.0,1.)) THEN
 1174   259D                writeln(TestOut, 'FILasg   FlNm=', Fn);
 1175   25DA    (*#E#*)
 1176   25DA             assign(Fl.F, Fn)
 1177   25F7            END;  (*FILASG*)
 1178   25FD    
 1179   25FD          PROCEDURE FilRst(VAR Status: StatusType
 1180   25FD                          ;VAR Fl: FileType
 1181   25FD                          );
 1182   25FD    
 1183   25FD            BEGIN (*FILRST*)
 1184   25FD             WITH Fl DO
 1185   2616               BEGIN
 1186   261B                P := 0;
 1187   262C                reset(F);
 1188   263F                IF eof(F) THEN
 1189   2655                   Status := Status + (.UnExpectedEof.);
 1190   267B    (*#B#*)
 1191   267B                IF test((.0,1.)) THEN
 1192   2691                  BEGIN
 1193   2696                   write(TestOut, 'FILrst'); TSTstat(Status); TSTln;
 1194   26D2                  END;
 1195   26D2    (*#E#*)
 1196   26D2               END
 1197   26D2            END;  (*FILRST*)
 1198   26D8    
 1199   26D8          PROCEDURE FilRwt(VAR Fl: FileType
 1200   26D8                          );
 1201   26D8    
 1202   26D8            BEGIN (*FILRWT*)
 1203   26D8    (*#B#*)
 1204   26D8             IF test((.0,1.)) THEN
 1205   26F6                writeln(TestOut, 'FILrwt');
 1206   271B    (*#E#*)
 1207   271B             WITH Fl DO
 1208   272C               BEGIN
 1209   2731                rewrite(F);
 1210   273E                P := 0;
 1211   2755               END
 1212   2755            END;  (*FILRWT*)
 1213   275B    
 1214   275B          PROCEDURE FilCls(VAR Fl: FileType
 1215   275B                          );
 1216   275B    
 1217   275B            BEGIN (*FILCLS*)
 1218   275B             close(Fl.F);
 1219   2776            END;  (*FILCLS*)
 1220   277C    
 1221   277C          PROCEDURE FilSeek(VAR Status: StatusType
 1222   277C                           ;VAR Fl: FileType
 1223   277C                           ;    Position: FileAddressType
 1224   277C                           );
 1225   277C    
 1226   277C            BEGIN (*FILSEEK*)
 1227   277C             WITH Fl DO
 1228   2795               BEGIN
 1229   279A                P := Position;
 1230   27AC                seek(F, Position);
 1231   27C5                IF eof(F) THEN
 1232   27DB                   Status := Status + (.UnExpectedEof.);
 1233   2801    (*#B#*)
 1234   2801                IF test((.0,1,2.)) THEN
 1235   2818                  BEGIN
 1236   281D                   write(TestOut, 'FILSEEK  '); TSTstat(Status); TSTindt;
 1237   285C                   write(TestOut, 'P=', P:1
 1238   2887                                , '  EOF='); TSTbool(eof(F));
 1239   28BD                   TSTln;
 1240   28C5                  END;
 1241   28C5    (*#E#*)
 1242   28C5               END
 1243   28C5            END;  (*FILSEEK*)
 1244   28CB    
 1245   28CB          PROCEDURE FGi8(VAR Status: StatusType
 1246   28CB                        ;VAR Fl: FileType
 1247   28CB                        ;VAR V: i8
 1248   28CB                        );
 1249   28CB    
 1250   28CB            BEGIN (*FGI8*)
 1251   28CB             WITH Fl DO
 1252   28E4               BEGIN
 1253   28E9                IF not eof(F) THEN
 1254   28FB                  BEGIN
 1255   2900                   read(F,V);
 1256   2929                   P := P + 1;
 1257   294B                  END
 1258   294B                ELSE
 1259   294D                  BEGIN
 1260   2952                   Status := Status + (.UnexpectedEof.);
 1261   2978                   V := 0
 1262   2983                  END;
 1263   2985    (*#B#*)
 1264   2985                IF test((.0,2.)) THEN
 1265   299C                  BEGIN
 1266   29A1                   write(TestOut, 'FGI8     '); TSTstat(Status); TSTindt;
 1267   29E0                   write(TestOut, 'P=', P:1,' V=', V:1, ' EOF='); TSTbool(eof(F));
 1268   2A5E                   TSTln;
 1269   2A66                  END;
 1270   2A66    (*#E#*)
 1271   2A66               END;
 1272   2A66            END;  (*FGI8*)
 1273   2A6C    
 1274   2A6C          PROCEDURE FGi32(VAR Status: StatusType
 1275   2A6C                         ;VAR Fl: FileType
 1276   2A6C                         ;VAR V: i32
 1277   2A6C                         );
 1278   2A6C    
 1279   2A6C             VAR
 1280   2A6C                I: I32IndexType;
 1281   2A6C                N: I32ArrayType;
 1282   2A6C    
 1283   2A6C            BEGIN (*FGI32*)
 1284   2A6C             WITH Fl DO
 1285   2A85               BEGIN
 1286   2A8A                P := P + 4;
 1287   2AAE                FOR I := bs3 DOWNTO bs0 DO
 1288   2ABF                   IF not eof(f) THEN
 1289   2AD8                      read(F, N(.I.) )
 1290   2B09                   ELSE
 1291   2B0F                     BEGIN
 1292   2B14                      Status := Status + (.UnexpectedEof.);
 1293   2B3A                      N(.I.) := 0
 1294   2B50                     END;
 1295   2B5C                move(N, V, 4);
 1296   2B75    (*#B#*)
 1297   2B75                IF test((.0,2.)) THEN
 1298   2B8C                  BEGIN
 1299   2B91                   write(TestOut, 'FGI32    '); TSTstat(Status); TSTindt;
 1300   2BD0                   write(TestOut, 'P=', P:1,' V=', V:1,
 1301   2C22                                  ' N=(',N(.bs3.):3,'/',N(.bs2.):3
 1302   2C54                                    ,'/',N(.bs1.):3,'/',N(.bs0.):3,') EOF=');
 1303   2CA0                   TSTbool(eof(F)); TSTln;
 1304   2CBD                  END;
 1305   2CBD    (*#E#*)
 1306   2CBD               END;
 1307   2CBD            END;  (*FGI32*)
 1308   2CC3    
 1309   2CC3          PROCEDURE FGSym(VAR Status: StatusType
 1310   2CC3                         ;VAR Fl: FileType
 1311   2CC3                         ;VAR SymbolName: SymbolNameType
 1312   2CC3                         );
 1313   2CC3    
 1314   2CC3             VAR
 1315   2CC3                I: i8;
 1316   2CC3                N: i8;
 1317   2CC3    
 1318   2CC3            BEGIN (*FGSYM*)
 1319   2CC3             WITH Fl, SymbolName DO
 1320   2CE8               BEGIN
 1321   2CED    (*#B#*)
 1322   2CED                IF test((.0,2.)) THEN
 1323   2D04                  BEGIN
 1324   2D09                   write(TestOut, 'FGSYM-1  '); TSTstat(Status); TSTindt;
 1325   2D48                   write(TestOut, 'P=', P:1, '  F^=',F^:3, '  EOF=');
 1326   2DBC                   TSTbool(eof(F)); TSTln
 1327   2DD6                  END;
 1328   2DD9    (*#E#*)
 1329   2DD9                IF not eof(F) THEN
 1330   2DF2                  BEGIN
 1331   2DF7                   read(F, N);
 1332   2E1A                   P := P + 1 + N;
 1333   2E49                   IF (0 < N) and (N <= MaxSymbolNameIndex) THEN
 1334   2E67                     BEGIN
 1335   2E6C                      Length := N;
 1336   2E84                      FOR I := 1 TO N DO
 1337   2E9B                         IF not eof(F) THEN
 1338   2EB4                            read(F, Name(.I.) )
 1339   2EED                         ELSE
 1340   2EF3                            Status := Status + (.UnexpectedEof.)
 1341   2F09                     END
 1342   2F23                   ELSE
 1343   2F26                     BEGIN
 1344   2F2B                      Status := Status + (.BadSymbolName.);
 1345   2F51                      FOR I := 1 TO N DO
 1346   2F67                         IF not eof(F) THEN
 1347   2F80                            read(F, Name(.1.) )
 1348   2FA7                         ELSE
 1349   2FAD                            Status := Status + (.UnexpectedEof.)
 1350   2FC3                     END
 1351   2FDD                  END
 1352   2FDD                ELSE
 1353   2FDF                   Status := Status + (.UnexpectedEof.);
 1354   3005    (*#B#*)
 1355   3005                IF test((.0,2.)) THEN
 1356   301B                  BEGIN
 1357   3020                   write(TestOut, 'FGSYM-2  '); TSTstat(Status); TSTindt;
 1358   305F                   TSTsymbol(SymbolName);
 1359   306E                  END;
 1360   306E    (*#E#*)
 1361   306E               END
 1362   306E            END;  (*FGSYM*)
 1363   3074    
 1364   3074          PROCEDURE FPi8(VAR Fl: FileType
 1365   3074                        ;    V: i8
 1366   3074                        );
 1367   3074    
 1368   3074            BEGIN (*FPI8*)
 1369   3074             WITH Fl DO
 1370   308D               BEGIN
 1371   3092    (*#B#*)
 1372   3092                IF test((.0,3.)) THEN
 1373   30A8                  BEGIN
 1374   30AD                   writeln(TestOut, 'FPI8     ', 'P=', P:1,' V=', V:1);
 1375   3116                  END;
 1376   3116    (*#E#*)
 1377   3116                write(F,V);
 1378   313B                P := P + 1
 1379   3154               END
 1380   315D            END;  (*FPI8*)
 1381   3163    
 1382   3163          PROCEDURE FPi32(VAR Fl: FileType
 1383   3163                         ;    V: i32
 1384   3163                         );
 1385   3163    
 1386   3163             VAR
 1387   3163                I: I32IndexType;
 1388   3163                N: I32ArrayType;
 1389   3163    
 1390   3163            BEGIN (*FPI32*)
 1391   3163             move(V, N, 4);
 1392   3185             WITH Fl DO
 1393   3196               BEGIN
 1394   319B    (*#B#*)
 1395   319B                IF test((.0,3.)) THEN
 1396   31B2                  BEGIN
 1397   31B7                   writeln(TestOut, 'FPI32    ', 'P=', P:1,' V=', V:1,
 1398   321A                                    ' N=(',N(.bs3.):3,'/',N(.bs2.):3
 1399   324C                                      ,'/',N(.bs1.):3,'/',N(.bs0.):3,')');
 1400   328E                  END;
 1401   328E    (*#E#*)
 1402   328E                P := P + 4;
 1403   32B8                FOR I := bs3 DOWNTO bs0  DO
 1404   32C9                   write(F, N(.I.) )
 1405   32FA               END
 1406   3307            END;  (*FPI32*)
 1407   330D    
 1408   330D          PROCEDURE FPSym(VAR Fl: FileType
 1409   330D                         ;    SymbolName: SymbolNameType
 1410   330D                         );
 1411   330D    
 1412   330D             VAR
 1413   330D                I: SymbolNameIndexType;
 1414   330D    
 1415   330D            BEGIN (*FPSYM*)
 1416   330D             WITH Fl, SymbolName DO
 1417   333B               BEGIN
 1418   3340    (*#B#*)
 1419   3340                IF test((.0,3.)) THEN
 1420   3357                  BEGIN
 1421   335C                   write(TestOut, 'FPSYM-2   '); TSTstat(Status); TSTindt;
 1422   3399                   write(TestOut, 'P=', P:1); TSTindt; TSTsymbol(SymbolName);
 1423   33DB                  END;
 1424   33DB    (*#E#*)
 1425   33DB                P := P + 1 + Length;
 1426   340B                write(F, Length);
 1427   3434                FOR I := 1 TO Length DO
 1428   344D                   write(F, Name(.I.) )
 1429   347F               END
 1430   348C            END;  (*FPSYM*)
 1431   3492    
 1432   3492    (*                                                                            *)
 1433   3492    (*                                                                            *)
 1434   3492    (******************************************************************************)
 1435   3492    
 1436   3492    (*$I B:lnkp0.pas    Procedure setup                                           *)
 1437   3492    (******************************************************************************)
 1438   3492    (*                                                                            *)
 1439   3492    (*   Copyright (1985) by Metanic Aps., Denmark                                *)
 1440   3492    (*                                                                            *)
 1441   3492    (*   Author: Lars Gregers Jakobsen.                                           *)
 1442   3492    (*                                                                            *)
 1443   3492    (******************************************************************************)
 1444   3492    
 1445   3492    
 1446   3492       PROCEDURE SetUp(VAR Status: StatusType
 1447   3492                      ;VAR TargetFile: FileType
 1448   3492                      ;VAR LogFile: LogFileType
 1449   3492                      ;VAR Out_file: text
 1450   3492                      );
 1451   3492    
 1452   3492          CONST
 1453   3492             InputFileNameSuffix = 'OBJ';
 1454   3495             TargetFileNameSuffix = 'OUT';
 1455   3498             LogFileNameSuffix = 'MAP';
 1456   349B    
 1457   349B          VAR
 1458   349B             CommandLine: CommandLineType;
 1459   349B             Current: CommandLineIndexType;
 1460   349B             FileName: FileNameType;
 1461   349B    
 1462   349B          PROCEDURE SkipBlanks;
 1463   349B    
 1464   349B            BEGIN (*SKIPBLANKS*)
 1465   349B             WHILE  (CommandLine(.Current.) = ' ') and
 1466   34C4                    (Current < length(CommandLine))      DO
 1467   34E9                Current := Current + 1;
 1468   3509            END;  (*SKIPBLANKS*)
 1469   350F    
 1470   350F          PROCEDURE DecodeFileName(VAR Status: StatusType
 1471   350F                                  ;VAR FileName: FileNameType
 1472   350F                                  ;    Suffix: FileNameType
 1473   350F                                  ;    Terminators: CharSetType
 1474   350F                                  );
 1475   350F    
 1476   350F             VAR
 1477   350F                I: CommandLineIndexType;
 1478   350F    
 1479   350F            BEGIN (*DECODEFILENAME*)
 1480   350F             I := 0;
 1481   3520             WHILE (Current + I < length(CommandLine) ) and
 1482   354A                   not ( CommandLine(.Current + I.) in Terminators ) DO
 1483   358B                I := I + 1;
 1484   35A3             IF (0 < I)  and (I <= FileNameLength) THEN
 1485   35C6               BEGIN
 1486   35CB                FileName := Copy(CommandLine, Current, I);
 1487   35F9                Current := Current + I;
 1488   361E                IF (pos('.', FileName) = 0) THEN
 1489   3639                   IF (length(FileName) <= FileNameLength - 4) THEN
 1490   364C                      FileName := concat(FileName, '.', Suffix)
 1491   3675                   ELSE
 1492   3680                      Status := Status + (.BadFileName.)
 1493   3696               END
 1494   36A4             ELSE
 1495   36A6                Status := Status + (.BadFileName.);
 1496   36CA    (*#B#*)
 1497   36CA             IF test((.0,16,18.)) THEN
 1498   36E4               BEGIN
 1499   36E9                write(TestOut, 'DecodeFileName   '); TSTstat(Status);
 1500   372D                TSTindt; write(TestOut, 'Curr=', Current:1);
 1501   3769                TSTindt; write(TestOut, 'I=', I:1);
 1502   379E                TSTindt; writeln(TestOut, 'FileName=', FileName)
 1503   37D5               END
 1504   37D8    (*#E#*)
 1505   37D8            END;  (*DECODEFILENAME*)
 1506   37DE    
 1507   37DE    
 1508   37DE         BEGIN (*SETUP*)
 1509   37DE          Getcomm(CommandLine);
 1510   37F9          CommandLine := concat(CommandLine, ' ');
 1511   381B          Current := 1;
 1512   3824          Status := (..);
 1513   383B          SkipBlanks; (*Leaving current pointing at next non blank*)
 1514   3847          (*Interpret option list*)
 1515   3847    (*#B#*)
 1516   3847          IF test((.0,16,18.)) THEN
 1517   3861            BEGIN
 1518   3866             write(TestOut, 'Setup-1   '); write(TestOut, 'Curr=', Current:1);
 1519   38BF             TSTindt; write(TestOut, 'Lng(ComLin)=', Length(CommandLine):1);
 1520   38FC             TSTindt; TSTmem; TSTln;
 1521   390A             TSTindt; writeln(TestOut, 'ComLin=', CommandLine)
 1522   3940            END;
 1523   3943    (*#E#*)
 1524   3943          WHILE (Current < length(CommandLine)) and
 1525   3958                (CommandLine(.Current.) = '/') and
 1526   397A                (Status = (..)) DO
 1527   3996            BEGIN
 1528   399B             Current := Current + 1;
 1529   39B1             CASE CommandLine(.Current.) OF
 1530   39CC             'M','m':
 1531   39CC               BEGIN
 1532   39D1                Current := Current + 1;
 1533   39E7                IF CommandLine(.Current.) = '=' THEN
 1534   3A03                  BEGIN
 1535   3A08                   Current := Current + 1;
 1536   3A1E                   DecodeFileName(Status, FileNametable(.-1.)
 1537   3A2A                                 , LogFileNameSuffix, (.' ', '/', ','.) );
 1538   3A52                   IF Status = (..) THEN
 1539   3A6A                      OptionTable.LogFileKind := Explicit
 1540   3A6F                  END
 1541   3A74                ELSE
 1542   3A76                   OptionTable.LogFileKind := Implicit
 1543   3A7B               END;
 1544   3A83             'O','o':
 1545   3A83               BEGIN
 1546   3A88                Current := Current + 1;
 1547   3A9E                IF CommandLine(.Current.) = '=' THEN
 1548   3ABA                  BEGIN
 1549   3ABF                   Current := Current + 1;
 1550   3AD5                   DecodeFileName(Status, FileNameTable(.0.)
 1551   3AE1                                 , TargetFileNameSuffix, (.' ', '/', ','.) );
 1552   3B09                   IF Status = (..) THEN
 1553   3B21                      OptionTable.TargetFileKind := Explicit
 1554   3B26                  END
 1555   3B2B                ELSE
 1556   3B2D                   OptionTable.TargetFileKind := Implicit
 1557   3B32               END;
 1558   3B39             OTHERWISE
 1559   3B39                Status := Status + (.BadOption.)
 1560   3B4F             END; (*CASE*)
 1561   3B72    (*#B#*)
 1562   3B72             IF test((.0,16,18.)) THEN
 1563   3B8C               BEGIN
 1564   3B91                write(TestOut, 'Setup-2   '); TSTstat(Status);
 1565   3BCE                TSTindt; writeln(TestOut, 'Curr=', Current:1);
 1566   3C06                TSTindt; TSTopt;
 1567   3C11                TSTindt; TSTfnt(-1);
 1568   3C1F                TSTindt; TSTfnt(0)
 1569   3C2A               END;
 1570   3C2D    (*#E#*)
 1571   3C2D            END; (*WHILE*)
 1572   3C30          IF Status = (..) THEN (*Interpret file list*)
 1573   3C49            BEGIN
 1574   3C4E             SkipBlanks;
 1575   3C5A             IF Current < length(CommandLine) THEN
 1576   3C72                Status := Status + (.NotFinished.);
 1577   3C9A             WHILE (Current < length(CommandLine)) and
 1578   3CAF                   (NotFinished IN Status) DO
 1579   3CD0               BEGIN
 1580   3CD5                DecodeFileName(Status, FileName
 1581   3CE1                              , InputFileNameSuffix, (.' ', ','.) );
 1582   3D0D                IF not (BadFileName IN Status) THEN
 1583   3D28                  BEGIN
 1584   3D2D    (*#B#*)
 1585   3D2D                   IF test((.0,16,18.)) THEN
 1586   3D47                     BEGIN
 1587   3D4C                      write(TestOut, 'Setup-3   '); TSTstat(Status); TSTindt;
 1588   3D8C                      write(TestOut, 'fstat(FileName)=');
 1589   3DBB                      TSTbool(fstat(FileName)); TSTln;
 1590   3DD7                     END;
 1591   3DD7    (*#E#*)
 1592   3DD7                   IF fstat(FileName) THEN
 1593   3DEC                      FNTP(Status, FileName)
 1594   3E07                   ELSE
 1595   3E0C                      Status := Status + (.NoSuchFile.);
 1596   3E30                  END;
 1597   3E30                IF NotFinished IN Status THEN
 1598   3E4A                   CASE CommandLine(.Current.) OF
 1599   3E68                   ' ':
 1600   3E68                      Status := Status - (.NotFinished.);
 1601   3E92                   ',':
 1602   3E92                     BEGIN
 1603   3E97                      Current := Current + 1 (*Skip the comma*)
 1604   3E9C                     END
 1605   3EAD                   END (*CASE CommandLine(.Current.) OF*)
 1606   3EBC               END (* WHILE *** DO *)
 1607   3EBC            END; (* IF Status = (..)  -- End interpret file list *)
 1608   3EBF          IF CurFileNo <= 0 THEN
 1609   3ED0             Status := Status + (.NoInputFiles.);
 1610   3EF4          IF Current < length(CommandLine) THEN
 1611   3F0C             Status := Status + (.ExtraText.);
 1612   3F30          IF Status = (..) THEN
 1613   3F49            BEGIN
 1614   3F4E             FileName := copy(FileNameTable(.1.), 1, pos('.',FileNameTable(.1.)) );
 1615   3F7A             IF OptionTable.LogFileKind = Implicit THEN
 1616   3F86                FileNameTable(.-1.) := concat(FileName, LogFileNameSuffix);
 1617   3FA7             IF OptionTable.TargetFileKind = Implicit THEN
 1618   3FB3                FileNameTable(. 0.) := concat(FileName, TargetFileNameSuffix);
 1619   3FD4    
 1620   3FD4             IF (OptionTable.LogFileKind <> none) and
 1621   3FDE                ( (not checkfn(FileNameTable(.-1.) ) ) or
 1622   3FED                  (fstat(FileNameTable(.-1.) ) )
 1623   3FF7                ) THEN
 1624   4000                Status := Status + (.badlogfilename.);
 1625   4024             IF (not checkfn(FileNameTable(.0.) ) ) or
 1626   4034                (fstat(FileNameTable(.0.) ) ) THEN
 1627   4044                Status := Status + (.badtargetfilename.);
 1628   4068    
 1629   4068    (*#B#*)
 1630   4068             IF test((.0,16,18.)) THEN
 1631   4081               BEGIN
 1632   4086                write(TestOut, 'Setup-4   '); TSTstat(Status); TSTln;
 1633   40C6                TSTindt; TSTopt;
 1634   40D1                TSTindt; TSTfnt(-1);
 1635   40DF                TSTindt; TSTfnt(0);
 1636   40ED                TSTindt; TSTfnt(1)
 1637   40F8               END;
 1638   40FB    (*#E#*)
 1639   40FB    
 1640   40FB             IF Status = (..) THEN
 1641   4113               BEGIN
 1642   4118                IF OptionTable.LogFileKind <> None THEN
 1643   4124                  BEGIN
 1644   4129                   LogInit(LogFile, FileNameTable(.-1.) );
 1645   4143                   LogCmd(LogFile, CommandLine);
 1646   4161                  END;
 1647   4161                FilAsg(TargetFile, FileNameTable(.0.) );
 1648   417B                FilRwt(TargetFile);
 1649   418A               END
 1650   418A             ELSE
 1651   418C                Status := Status + (.NoTarget.);
 1652   41B4            END
 1653   41B4          ELSE
 1654   41B6            BEGIN
 1655   41BB             Status := Status + (.Notarget.);
 1656   41E3             writeln(out_file, CommandLine);
 1657   420C             writeln(out_file, '^':Current);
 1658   422F            END
 1659   422F         END;  (*SETUP*)
 1660   4235    
 1661   4235    (*                                                                            *)
 1662   4235    (*                                                                            *)
 1663   4235    (******************************************************************************)
 1664   4235    
 1665   4235    (*$I B:lnkp1.pas    Procedure pass1                                           *)
 1666   4235    (******************************************************************************)
 1667   4235    (*                                                                            *)
 1668   4235    (*   Copyright (1985) by Metanic Aps., Denmark                                *)
 1669   4235    (*                                                                            *)
 1670   4235    (*   Author: Lars Gregers Jakobsen.                                           *)
 1671   4235    (*                                                                            *)
 1672   4235    (******************************************************************************)
 1673   4235    
 1674   4235       PROCEDURE Pass1(VAR Status: StatusType
 1675   4235                      ;VAR TargetFile: FileType
 1676   4235                      ;VAR LogFile: LogFileType
 1677   4235                      );
 1678   4235    
 1679   4235          (* Pass1 of the linker performs the gathering of export and
 1680   4235             import information from the input files as well as calculation
 1681   4235             of final memory map and all operations on the symbol table
 1682   4235             including reporting to the log file.
 1683   4235                The following statusvalues may be returned:
 1684   4235             Success: ok. All other parameters meaningful.
 1685   4235    
 1686   4235          *)
 1687   4235    
 1688   4235    
 1689   4235          VAR
 1690   4235             SymbolTable: SymbolTableType;
 1691   4235             LatestInsert: SymbolTableIndexType; (*Points to SBT entry of latest insert*)
 1692   4235             CurrentSymbolCount: SymbolTableIndexType; (*Number of SBT entries currently used*)
 1693   4235    
 1694   4235             NameTable: NameTableType;
 1695   4235             CurrentNameTableIndex: NameTableIndexType; (*Least index vacant  -
 1696   4235                                                          NOT count of strings*)
 1697   4235    
 1698   4235    
 1699   4235             (* MISC. VARIABLES *)
 1700   4235    
 1701   4235             SBTSubInx: SymbolTableSubIndexType;
 1702   4235    
 1703   4235    (*#B#*)
 1704   4235    (*$I B:LnkDF3.pas   Definitions    of pass1 local test output primitives *)
 1705   4235    (******************************************************************************)
 1706   4235    (*                                                                            *)
 1707   4235    (*   Copyright (1985) by Metanic Aps., Denmark                                *)
 1708   4235    (*                                                                            *)
 1709   4235    (*   Author: Lars Gregers Jakobsen.                                           *)
 1710   4235    (*                                                                            *)
 1711   4235    (******************************************************************************)
 1712   4235    
 1713   4235       PROCEDURE TSTnmt(Inx: NameTableIndexType
 1714   4235                    );
 1715   4235    
 1716   4235          VAR
 1717   4235             i : 0..9;
 1718   4235    
 1719   4235         BEGIN (*TSTnmt*)
 1720   4235          write(TestOut, 'NMTÆ', inx:1
 1721   426B                       , ';../', CurrentNameTableIndex:1,'Å=(' );
 1722   42AD          FOR i := 0 TO 7 DO
 1723   42BE             IF (Inx + i) IN (.1..MaxNameTableIndex.) THEN
 1724   430F                TSTasc( NameTable(. Inx+i .) )
 1725   433E             ELSE
 1726   4344                write(TestOut, '-');
 1727   4369          write(TestOut, '/');
 1728   4384          IF Inx IN (.1..MaxNameTableIndex.) THEN
 1729   43BF             TSThex( NameTable(. Inx .) )
 1730   43D7          ELSE
 1731   43DC             write(TestOut, '--');
 1732   43FD          FOR i := 1 TO 7 DO
 1733   440E            BEGIN
 1734   4413             write(TestOut, '-');
 1735   442E             IF (Inx + i) IN (.1..MaxNameTableIndex.) THEN
 1736   447F                TSThex( NameTable(. Inx+i .) )
 1737   44AE             ELSE
 1738   44B4                write(TestOut, '--');
 1739   44D5            END;
 1740   44DF          writeln(TestOut, ')' )
 1741   44F7         END;  (*TSTnmt*)
 1742   4500    
 1743   4500       PROCEDURE TSTsbt(Inx: SymbolTableIndexType
 1744   4500                    );
 1745   4500    
 1746   4500         BEGIN (*TSTsbt*)
 1747   4500          WITH SymbolTable(.Inx.) DO
 1748   4527            BEGIN
 1749   452C             write(TestOut, 'SBTÆ', Inx:1
 1750   4557                          , '/', LatestInsert:1
 1751   457A                          , '/', CurrentSymbolCount:1
 1752   459D                          , 'Å=(Module#=', ModuleNo:1, ' '
 1753   45D0                          , 'NameRef=', NameReference:1, ' '
 1754   4607                          , 'SortLink=', SortLink:1, ')'
 1755   463F                    );
 1756   464B            END
 1757   464B         END;  (*TSTsbt*)
 1758   4651    
 1759   4651    (*                                                                            *)
 1760   4651    (*                                                                            *)
 1761   4651    (******************************************************************************)
 1762   4651    
 1763   4651    (*$I B:LnkDF4.pas   Definitions    of pass1 local access primitives           *)
 1764   4651    (******************************************************************************)
 1765   4651    (*                                                                            *)
 1766   4651    (*   Copyright (1985) by Metanic Aps., Denmark                                *)
 1767   4651    (*                                                                            *)
 1768   4651    (*   Author: Lars Gregers Jakobsen.                                           *)
 1769   4651    (*                                                                            *)
 1770   4651    (******************************************************************************)
 1771   4651    
 1772   4651    
 1773   4651       PROCEDURE NMTP(VAR Status: StatusType
 1774   4651                     ;VAR NameReference: NameTableIndexType
 1775   4651                     ;    SymbolName: SymbolNameType
 1776   4651                     );
 1777   4651    
 1778   4651          VAR
 1779   4651             I: SymbolNameIndexType;
 1780   4651    
 1781   4651         BEGIN (*NMTP*)
 1782   4651          WITH SymbolName DO
 1783   4673            BEGIN
 1784   4678             IF CurrentNameTableIndex + Length + 1 > MaxNameTableIndex THEN
 1785   46AC                Status := Status + (.NameTableOverFlow.)
 1786   46C2             ELSE
 1787   46D6               BEGIN
 1788   46DB                Namereference := CurrentNameTableIndex + 1;
 1789   4705                CurrentNameTableIndex := NameReference + Length;
 1790   4738                NameTable(.NameReference.) := Length;
 1791   475C                FOR I := 1 TO Length DO
 1792   4775                   NameTable(.NameReference +  I.) := Name(.I.);
 1793   47C6               END;
 1794   47C6    (*#B#*)
 1795   47C6             IF test((.0,9.)) THEN
 1796   47DF               BEGIN
 1797   47E4                write(TestOut, 'NMTP     '); TSTstat(Status); TSTindt;
 1798   4823                writeln(TestOut, 'Length=', Length:1);
 1799   485A                TSTindt; TSTindt; TSTindt; TSTnmt(NameReference);
 1800   487D               END;
 1801   487D    (*#E#*)
 1802   487D            END
 1803   487D         END;  (*NMTP*)
 1804   4883    
 1805   4883       FUNCTION NMTfail(    NameReference: NameTableIndexType
 1806   4883                       ;    SymbolName: SymbolNameType
 1807   4883                       ): boolean;
 1808   4883    
 1809   4883          (* NMTfail returns one of the following values:
 1810   4883                FALSE: If the exact same symbolname was found in NMT - i.e.
 1811   4883    
 1812   4883                       NameReference <> 0 AND
 1813   4883                       NMT(.NameReference.) = SymbolName.Length AND
 1814   4883                       FOR i = 1 TO length:
 1815   4883                          NMT(.NameReference+i.) = SymbolName.Name(.i.)
 1816   4883    
 1817   4883                       OR If an empty entry was found in NMT - i.e.
 1818   4883    
 1819   4883                       NameReference = 0.
 1820   4883    
 1821   4883    
 1822   4883                TRUE:  In all other cases.
 1823   4883          *)
 1824   4883    
 1825   4883          LABEL
 1826   4883             99;
 1827   4883    
 1828   4883          VAR
 1829   4883             I: SymbolNameIndexType;
 1830   4883    
 1831   4883         BEGIN (*NMTFAIL*)
 1832   4883          NMTfail := false;
 1833   48A9          WITH SymbolName DO
 1834   48AE            BEGIN
 1835   48B3             IF NameReference <> 0 THEN
 1836   48C3                IF length <> NameTable(.NameReference.) THEN
 1837   48DF                   NMTfail := true
 1838   48E4                ELSE
 1839   48EB                  BEGIN
 1840   48F0                   FOR I := 1 TO Length DO
 1841   4909                      IF Name(.I.) <> NameTable(.NameReference + I.) THEN
 1842   4950                        BEGIN
 1843   4955                         NMTfail := true;
 1844   495E                         GOTO 99;
 1845   4966                        END;
 1846   4970    99:;          END;
 1847   4970    (*#B#*)
 1848   4970             IF test((.0,9.)) THEN
 1849   4989               BEGIN
 1850   498E                writeln(TestOut, 'NMTfail  ', 'NameRef=', NameReference:1);
 1851   49DF                TSTindt; TSTindt; TSTindt; TSTsymbol(SymbolName);
 1852   49F8                TSTindt; TSTindt; TSTindt; TSTnmt(NameReference);
 1853   4A17               END;
 1854   4A17    (*#E#*)
 1855   4A17            END
 1856   4A17         END;  (*NMTFAIL*)
 1857   4A20    
 1858   4A20       PROCEDURE NMTG(    NameReference: NameTableIndexType
 1859   4A20                     ;VAR SymbolName: SymbolNameType
 1860   4A20                     );
 1861   4A20    
 1862   4A20          VAR
 1863   4A20             I: SymbolNameIndexType;
 1864   4A20    
 1865   4A20         BEGIN (*NMTG*)
 1866   4A20          WITH SymbolName DO
 1867   4A39            BEGIN
 1868   4A3E             Length := NameTable(.NameReference.);
 1869   4A5F             FOR I := 1 TO Length DO
 1870   4A7C                Name(.I.) := NameTable(. NameReference + I .);
 1871   4ACC    (*#B#*)
 1872   4ACC             IF test((.0,9,13.)) THEN
 1873   4AE4               BEGIN
 1874   4AE9                write(TestOut, 'NMTG     '); TSTindt;
 1875   4B14                write(TestOut, 'NameRef=', NameReference:1); TSTindt;
 1876   4B52                TSTsymbol(SymbolName);
 1877   4B61               END;
 1878   4B61    (*#E#*)
 1879   4B61            END
 1880   4B61         END;  (*NMTG*)
 1881   4B67    
 1882   4B67       PROCEDURE Hash(VAR SymbolName: SymbolNameType
 1883   4B67                     ;VAR SBTInx: SymbolTableIndexType
 1884   4B67                     );
 1885   4B67    
 1886   4B67         BEGIN (*HASH*)
 1887   4B67          SBTInx := 1
 1888   4B7A         END;  (*HASH*)
 1889   4B82    
 1890   4B82       PROCEDURE SBTS(VAR Status: StatusType
 1891   4B82                     ;VAR SBTInx: SymbolTableIndexType
 1892   4B82                     ;    SymbolName: SymbolNameType
 1893   4B82                     );
 1894   4B82    
 1895   4B82          (* SBTS returns one of the following Status codes:
 1896   4B82                Success: SymbolName found in SBT. SBTInx reflects
 1897   4B82                         SymbolName.
 1898   4B82                NotFound: SymbolName NOT found in SBT. SBTInx
 1899   4B82                          indicates the entry into which Symbol should be
 1900   4B82                          registered.
 1901   4B82                SymbolTableOverFlow: SymbolName NOT found in SBT.
 1902   4B82                                     SBTInx is not valid. There
 1903   4B82                                     is no room in SBT for further updates.
 1904   4B82    
 1905   4B82            Search SBT to find the Entry for SYMBOLNAME retaining the index
 1906   4B82            of the first vacant record as SYMBOLTABLEENTRYNO if the search
 1907   4B82            fails. Otherwise return found index. Set Status to Success or
 1908   4B82            NotFound according to outcome. Set Status to SBTOverFlow if
 1909   4B82            no vacant is available and symbol is not found.
 1910   4B82    
 1911   4B82            A SBT record is vacant if Namereference  = 0.
 1912   4B82          *)
 1913   4B82    
 1914   4B82    
 1915   4B82         BEGIN (*SBTS*)
 1916   4B82          (* Assume existence of entry in SBT with NameReference =  0 *)
 1917   4B82          Hash(SymbolName, SBTInx);
 1918   4BB6    (*#B#*)
 1919   4BB6          IF test((.0,9.)) THEN
 1920   4BCE            BEGIN
 1921   4BD3             write(TestOut, 'SBTS-1   '); TSTstat(Status); TSTln;
 1922   4C12             TSTindt; TSTindt; TSTindt; TSTsbt(SBTInx); TSTln;
 1923   4C35            END;
 1924   4C35    (*#E#*)
 1925   4C35          WHILE NMTfail(Symboltable(.SBTInx.).NameReference, SymbolName) DO
 1926   4C6E            BEGIN
 1927   4C73             (* HASH NEXT TRY *)
 1928   4C73             IF MaxNooSymbols <= SBTInx THEN
 1929   4C8A                SBTInx := 0;
 1930   4C97             SBTInx := SBTInx + 1;
 1931   4CB7    
 1932   4CB7    (*#B#*)
 1933   4CB7             IF test((.0,9.)) THEN
 1934   4CCF               BEGIN
 1935   4CD4                write(TestOut, 'SBTS-2   '); TSTstat(Status); TSTln;
 1936   4D13                TSTindt; TSTindt; TSTindt; TSTsbt(SBTInx); TSTln;
 1937   4D36               END;
 1938   4D36    (*#E#*)
 1939   4D36    
 1940   4D36            END;
 1941   4D39          IF SymbolTable(.SBTInx.).NameReference = 0 THEN
 1942   4D5F             IF CurrentSymbolCount >= MaxNooSymbols - 1 THEN
 1943   4D78                Status := Status + (.SymbolTableOverFlow.)
 1944   4D8E             ELSE
 1945   4DA1                Status := Status + (.NotFound.);
 1946   4DC9    (*#B#*)
 1947   4DC9          IF test((.0,10.)) THEN
 1948   4DE1            BEGIN
 1949   4DE6             write(TestOut, 'SBTS-3   '); TSTstat(Status); TSTln;
 1950   4E25             TSTindt; TSTindt; TSTindt; TSTsbt(SBTInx); TSTln;
 1951   4E48            END;
 1952   4E48    (*#E#*)
 1953   4E48         END;  (*SBTS*)
 1954   4E4E    
 1955   4E4E       PROCEDURE SBTEX(VAR Status: StatusType
 1956   4E4E                      ;VAR SymbolTableEntryNo: SymbolTableIndexType
 1957   4E4E                      ;    SymbolName: SymbolNameType
 1958   4E4E                      ;    P_ModuleNo: ModuleTableIndexType
 1959   4E4E                      ;    P_SegmentNo: SegmentNoType
 1960   4E4E                      ;    Item: i32
 1961   4E4E                      );
 1962   4E4E    
 1963   4E4E         BEGIN (*SBTEX*)
 1964   4E4E          SBTS(Status, SymbolTableEntryNo, SymbolName);
 1965   4E8D          IF not (SymbolTableOverFlow IN Status) THEN
 1966   4EA8             WITH SymbolTable(.SymbolTableEntryNo.)
 1967   4EC5                  ,ValueTable(.SymbolTableEntryNo.) DO
 1968   4EE9                IF NotFound IN Status THEN
 1969   4F04                  BEGIN (*Symbol is NOT in SBT and thus not resolved*)
 1970   4F09                   Status := Status - (.NotFound.);
 1971   4F31                   NMTP(Status, NameReference, SymbolName);
 1972   4F54                   IF not (NameTableOverFlow IN Status) THEN
 1973   4F6F                     BEGIN
 1974   4F74                      CurrentSymbolCount := CurrentSymbolCount + 1;
 1975   4F9C                      ModuleNo := P_ModuleNo;
 1976   4FB0                      IF LatestInsert <> 0 THEN
 1977   4FC4                         SymbolTable(.LatestInsert.).SortLink := SymbolTableEntryNo;
 1978   4FF7                      LatestInsert := SymbolTableEntryNo;
 1979   5012                      SortLink := SymbolTableEntryNo;
 1980   502E                      SegmentNo := P_SegmentNo;
 1981   5042                      Value := Item
 1982   504D                     END
 1983   5056                  END (*IF NotFound IN Status*)
 1984   5056                ELSE (* SUCCESS: Symbol is in SBT*)
 1985   5059                  BEGIN
 1986   505E                   IF SegmentNo > UnResolved THEN
 1987   5075                      Status := Status + (.DuplicateExportSymbol.)
 1988   508B                   ELSE (*Symbol NOT previously resolved i.e. imported only*)
 1989   509E                     BEGIN
 1990   50A3                      ModuleNo := P_ModuleNo;
 1991   50B7                      IF LatestInsert <> 0 THEN
 1992   50CB                         SymbolTable(.LatestInsert.).SortLink := SymbolTableEntryNo;
 1993   50FE                      LatestInsert := SymbolTableEntryNo;
 1994   5119                      SortLink := SymbolTableEntryNo;
 1995   5135                      SegmentNo := P_SegmentNo;
 1996   5149                      Value := Item
 1997   5154                     END
 1998   515D                  END; (*ELSE (i.e. Success IN Status)*)
 1999   515D    (*#B#*)
 2000   515D          IF test((.0,10.)) THEN
 2001   5176            BEGIN
 2002   517B             write(TestOut, 'SBTEX    '); TSTstat(Status);
 2003   51B7             TSTindt; TSTsymbol(SymbolName);
 2004   51CA             TSTindt; TSTindt; TSTindt; TSTsbt(SymbolTableEntryNo); TSTln;
 2005   51ED             TSTindt; TSTindt; TSTindt; TSTvlt(SymbolTableEntryNo); TSTln;
 2006   520C            END;
 2007   520C    (*#E#*)
 2008   520C         END;  (*SBTEX*)
 2009   5212    
 2010   5212    
 2011   5212       PROCEDURE SBTIM(VAR Status: StatusType
 2012   5212                      ;VAR SymbolTableEntryNo: SymbolTableIndexType
 2013   5212                      ;VAR SymbolName: SymbolNameType
 2014   5212                      ;    P_ModuleNo: ModuleTableIndexType
 2015   5212                      );
 2016   5212    
 2017   5212         BEGIN (*SBTIM*)
 2018   5212          SBTS(Status, SymbolTableEntryNo, SymbolName);
 2019   523B          IF Not (SymbolTableOverFlow IN Status) THEN
 2020   5256            BEGIN
 2021   525B             IF NotFound IN Status THEN
 2022   5276                WITH SymbolTable(.SymbolTableEntryNo.)
 2023   5293                     ,ValueTable(.SymbolTableEntryNo.) DO
 2024   52B7                  BEGIN
 2025   52BC                   Status := Status - (.NotFound.);
 2026   52E4                   NMTP(Status, NameReference, SymbolName);
 2027   5306                   IF not (NameTableOverFlow IN Status) THEN
 2028   5320                     BEGIN
 2029   5325                      CurrentSymbolCount := CurrentSymbolCount + 1;
 2030   534D                      ModuleNo := P_ModuleNo;
 2031   5361                      SortLink := 0;
 2032   5372                      SegmentNo := UnResolved;
 2033   537F                      Value := 0;
 2034   5395                     END
 2035   5395                  END;
 2036   5395             EITP(Status,SymbolTableEntryNo)
 2037   53AC            END;
 2038   53AF    (*#B#*)
 2039   53AF          IF test((.0,10.)) THEN
 2040   53C8            BEGIN
 2041   53CD             write(TestOut, 'SBTIM    '); TSTstat(Status); TSTln;
 2042   540C             TSTindt; TSTindt; TSTindt; TSTsbt(SymbolTableEntryNo); TSTln;
 2043   542F             TSTindt; TSTindt; TSTindt; TSTvlt(SymbolTableEntryNo); TSTln;
 2044   544E            END;
 2045   544E    (*#E#*)
 2046   544E         END;  (*SBTIM*)
 2047   5454    
 2048   5454    (*                                                                            *)
 2049   5454    (*                                                                            *)
 2050   5454    (******************************************************************************)
 2051   5454    
 2052   5454    
 2053   5454    (*$I B:lnkp1-1.pas  getinputfiles                                             *)
 2054   5454    (******************************************************************************)
 2055   5454    (*                                                                            *)
 2056   5454    (*   Copyright (1985) by Metanic Aps., Denmark                                *)
 2057   5454    (*                                                                            *)
 2058   5454    (*   Author: Lars Gregers Jakobsen.                                           *)
 2059   5454    (*                                                                            *)
 2060   5454    (******************************************************************************)
 2061   5454    
 2062   5454          PROCEDURE GetInputFiles(VAR GStatus: StatusType
 2063   5454                                 ;VAR LogFile: LogFileType
 2064   5454                                 );
 2065   5454    
 2066   5454             VAR
 2067   5454                InputFile: FileType;
 2068   5454                FileNo: FileNameTableIndexType;
 2069   5454                Status: StatusType;
 2070   5454    
 2071   5454             PROCEDURE ValidateFileFormat(VAR Status: StatusType
 2072   5454                                         ;VAR F: FileType
 2073   5454                                         ;    Format: OF_FormatType
 2074   5454                                         );
 2075   5454    
 2076   5454                VAR
 2077   5454                   OFF_Format: OF_FormatType;
 2078   5454    
 2079   5454               BEGIN (*VALIDATEFILEFORMAT*)
 2080   5454                FGi32(Status, F, OFF_Format);
 2081   547A                IF OFF_Format <> Format THEN
 2082   548E                   Status := Status + (.BadFileFormat.);
 2083   54B4    (*#B#*)
 2084   54B4                IF test((.0,16,19.)) THEN
 2085   54CE                  BEGIN
 2086   54D3                   write(TestOut, 'GetFFvalid   '); TSTstat(Status); TSTindt;
 2087   5516                   writeln(TestOut, 'OFF_Format=', OFF_Format);
 2088   554C                  END;
 2089   554C    (*#E#*)
 2090   554C               END;  (*VALIDATEFILEFORMAT*)
 2091   5552    
 2092   5552             PROCEDURE GetModules(VAR GStatus: StatusType
 2093   5552                                 ;VAR LogFile: LogFileType
 2094   5552                                 ;    FileNumber: FileNameTableIndexType
 2095   5552                                 ;VAR Fl: FileType
 2096   5552                                 ;    StartAddressOfNextModule: FileAddressType
 2097   5552                                 );
 2098   5552    
 2099   5552                VAR
 2100   5552                   Status: StatusType;
 2101   5552    
 2102   5552                PROCEDURE ValidateModuleFormat(VAR Status: StatusType
 2103   5552                                              ;VAR F: FileType
 2104   5552                                              ;    Format: OM_FormatType
 2105   5552                                              );
 2106   5552    
 2107   5552                   VAR
 2108   5552                      OMF_Format: OM_FormatType;
 2109   5552    
 2110   5552                  BEGIN (*VALIDATEMODULEFORMAT*)
 2111   5552                   FGi32(Status, F, OMF_Format);
 2112   5578                   IF OMF_Format <> Format THEN
 2113   558C                      Status := Status + (.BadModuleFormat.);
 2114   55B2    (*#B#*)
 2115   55B2                   IF test((.0,16,19.)) THEN
 2116   55CC                     BEGIN
 2117   55D1                      write(TestOut, 'GetMFvalid   '); TSTstat(Status); TSTindt;
 2118   5614                      writeln(TestOut, 'OMF_Format=',OMF_Format);
 2119   564A                     END;
 2120   564A    (*#E#*)
 2121   564A                  END;  (*VALIDATEMODULEFORMAT*)
 2122   5650    
 2123   5650    
 2124   5650                PROCEDURE GetModuleHeader(VAR GStatus: StatusType
 2125   5650                                         ;VAR LogFile: LogFileType
 2126   5650                                         ;    FileNo:
 2127   5650                                                 FileNameTableIndexType
 2128   5650                                         ;VAR Fl: FileType
 2129   5650                                         ;VAR StartAddressOfNextModule:
 2130   5650                                                 FileAddressType
 2131   5650                                         );
 2132   5650    
 2133   5650                   VAR
 2134   5650                      Status: StatusType;
 2135   5650                      SegmentNo: SegmentNoType;
 2136   5650                      SymbolNo: SymbolTableIndexType;
 2137   5650                      ModuleNo: ModuleTableIndexType;
 2138   5650                      MdtRec: ModuleTableRecordType;
 2139   5650                      NooExpSymbols: QuadImageUnitType;
 2140   5650                      NooExiSymbols: QuadImageUnitType;
 2141   5650    
 2142   5650                   PROCEDURE GetINX(VAR Status: StatusType
 2143   5650                                   ;VAR ModuleNo: ModuleTableIndexType
 2144   5650                                   ;VAR Fl: FileType
 2145   5650                                   ;VAR StartAddressOfNextModule:
 2146   5650                                              FileAddressType
 2147   5650                                   ;VAR NooExpSymbols: QuadImageUnitType
 2148   5650                                   ;VAR NooExiSymbols: QuadImageUnitType
 2149   5650                                   );
 2150   5650    
 2151   5650                      VAR
 2152   5650                         OMH_ModuleSize: QuadImageUnitType;
 2153   5650                         OMH_NooSegments: QuadImageUnitType;
 2154   5650                         OMH_ModuleName: ModuleNameType;
 2155   5650    
 2156   5650                     BEGIN (*GETINX*)
 2157   5650                      WITH ModuleTable(.ModuleNo.) DO
 2158   567B                        BEGIN
 2159   5680                         FGi32(Status, Fl, OMH_ModuleSize);
 2160   569E                         FGi32(Status, Fl, OMH_NooSegments);
 2161   56BC                         FGi32(Status, Fl, NooExpSymbols);
 2162   56D9                         FGi32(Status, Fl, NooExiSymbols);
 2163   56F6                         StartAddressOfNextModule :=
 2164   5701                               StartAddressOfNextModule + abs(OMH_moduleSize);
 2165   571D                         IF (OMH_NooSegments > MaxNooSegments) or
 2166   5731                            (Noo_ExiSymbols > MaxNooExternalImportSymbols) THEN
 2167   5752                            Status := Status + (.RangeError.)
 2168   5768                         ELSE
 2169   577B                           BEGIN
 2170   5780                            Referenced := false;
 2171   5791                            NooSegments := OMH_NooSegments;
 2172   57B0                            IF NooSegments > CurSegmentCount THEN
 2173   57CC                               CurSegmentCount := NooSegments;
 2174   57E2                            NooExternalImportSymbols := NooExiSymbols;
 2175   5806                            LatestInsert := 0;
 2176   5818                            FGsym(Status, Fl, OMH_ModuleName);
 2177   5836                            IF Status = (..) THEN
 2178   584F                              BEGIN
 2179   5854                               SBTEX(Status
 2180   5859                                    ,ModuleNameReference
 2181   5860                                    ,OMH_ModuleName
 2182   5867                                    ,ModuleNo
 2183   586F                                    ,0,0);
 2184   588C                               IF not (SymbolTableOverFlow IN Status) THEN
 2185   58A6                                  ValueTable(.ModuleNameReference.).SegmentNo := UnResolved;
 2186   58C5                               IF DuplicateExportSymbol IN Status THEN
 2187   58DF                                  Status := Status - (.DuplicateExportSymbol.) +
 2188   58FE                                                     (.DuplicateModuleName.);
 2189   590E                              END
 2190   590E                           END
 2191   590E                        END
 2192   590E                     END;  (*GETINX*)
 2193   5914    
 2194   5914    
 2195   5914                   PROCEDURE GetSGDs(VAR Status: StatusType
 2196   5914                                    ;    SCTBase: SectionTableIndexType
 2197   5914                                    ;    NooSegments: SegmentNoType
 2198   5914                                    ;    P_ModuleNo: ModuleTableIndexType
 2199   5914                                    ;VAR Fl: FileType
 2200   5914                                    );
 2201   5914    
 2202   5914                      LABEL
 2203   5914                         99;
 2204   5914    
 2205   5914                      VAR
 2206   5914                         SegmentInx: SegmentNoType;
 2207   5914                         Dummy32: QuadImageUnitType;
 2208   5914    
 2209   5914                     BEGIN (*GETSEGMENTDESCRIPTORS*)
 2210   5914                      FOR SegmentInx := 1 TO NooSegments DO
 2211   5936                        BEGIN
 2212   593B                         IF Status <> (..) THEN
 2213   5954                            GOTO 99;
 2214   595C                         WITH SectionTable(.SCTbase + SegmentInx.) DO
 2215   598A                           BEGIN
 2216   598F                            SegmentNo := SegmentInx;
 2217   599E                            ModuleNo := P_ModuleNo;
 2218   59B2                            FGi32(Status, Fl, Dummy32);
 2219   59D0                            ImageSize := abs(Dummy32);
 2220   59EB                            FGi32(Status, Fl, Dummy32);
 2221   5A09                            OvrSize := abs(Dummy32);
 2222   5A26    (*#B#*)
 2223   5A26                            IF test((.0,16,19.)) THEN
 2224   5A40                              BEGIN
 2225   5A45                               write(TestOut, 'GetSGDs  '); TSTstat(Status);
 2226   5A81                               TSTindt; TSTsct(SCTbase + SegmentInx); TSTln
 2227   5AA2                              END;
 2228   5AA5    (*#E#*)
 2229   5AA5                           END;
 2230   5AA5                        END;
 2231   5AAF    99:;             END;  (*GETSEGMENTDESCRIPTORS*)
 2232   5AB5    
 2233   5AB5                   PROCEDURE GetEXP(VAR GStatus: StatusType
 2234   5AB5                                   ;VAR LogFile: LogFileType
 2235   5AB5                                   ;VAR Fl: FileType
 2236   5AB5                                   ;VAR LinkHead: SymbolTableIndexType
 2237   5AB5                                   ;    ModuleNo: ModuleTableIndexType
 2238   5AB5                                   ;    NooExpSymbols: i32
 2239   5AB5                                   );
 2240   5AB5    
 2241   5AB5                      VAR
 2242   5AB5                         Status: StatusType;
 2243   5AB5                         SymbolCount: i32;
 2244   5AB5                         DuplicateCount: i32;
 2245   5AB5                         RelocationIndicator: RelocationIndicatorType;
 2246   5AB5                         EXP_RelocationIndicator: ImageUnitType;
 2247   5AB5                         EXP_Item: QuadImageUnitType;
 2248   5AB5                         EXP_SymbolName: SymbolNameType;
 2249   5AB5                         SymbolTableEntryNo: SymbolTableIndexType; (*DUMMY*)
 2250   5AB5                         ModuleName: ModuleNameType;
 2251   5AB5    
 2252   5AB5                     BEGIN (*GETEXPORTLIST*)
 2253   5AB5                      Status := (..);
 2254   5AD5                      LinkHead := 0;
 2255   5AE2                      LatestInsert := 0;
 2256   5AF4                      SymbolCount := 0;
 2257   5B03                      DuplicateCount := 0;
 2258   5B12                      IF SymbolCount < NooExpSymbols THEN
 2259   5B27                        BEGIN
 2260   5B2C                         SymbolCount := SymbolCount + 1;
 2261   5B3C                         FGi8( Status, Fl, EXP_RelocationIndicator);
 2262   5B5B                         IF EXP_RelocationIndicator IN (.0..MaxNooSegments.) THEN
 2263   5B6D                            RelocationIndicator := EXP_RelocationIndicator
 2264   5B72                         ELSE
 2265   5B81                            Status := Status + (.RangeError.);
 2266   5BA9                         FGi32(Status, Fl, EXP_Item);
 2267   5BC8                         FGsym(Status, Fl, EXP_SymbolName);
 2268   5BE7                         IF Status = (..) THEN
 2269   5C01                           BEGIN
 2270   5C06                            SBTEX(Status
 2271   5C0B                                 ,LinkHead
 2272   5C13                                 ,EXP_SymbolName
 2273   5C1A                                 ,ModuleNo
 2274   5C22                                 ,EXP_RelocationIndicator
 2275   5C29                                 ,EXP_Item
 2276   5C34                                 );
 2277   5C41                            IF DuplicateExportSymbol IN Status THEN
 2278   5C5A                              BEGIN
 2279   5C5F                               DuplicateCount := DuplicateCount + 1;
 2280   5C6F                               IF DuplicateCount <= 1 THEN
 2281   5C82                                  LogHdds(LogFile);
 2282   5C91                               NMTG(SymbolTable(.
 2283   5C96                                       ModuleTable(.ModuleNo
 2284   5C96                                                  .).ModuleNameReference
 2285   5CAA                                               .).NameReference
 2286   5CBC                                   ,ModuleName
 2287   5CC5                                   );
 2288   5CD4                               LogDDS(LogFile
 2289   5CD9                                     ,EXP_RelocationIndicator
 2290   5CE0                                     ,EXP_Item
 2291   5CEB                                     ,EXP_SymbolName
 2292   5CF1                                     ,ModuleName
 2293   5CF9                                     );
 2294   5D04                              END
 2295   5D04                           END;
 2296   5D04                         GStatus := GStatus + Status;
 2297   5D2F                        END;
 2298   5D2F                      WHILE (GStatus <= (.DuplicateExportSymbol.)) and
 2299   5D47                            (SymbolCount < NooExpSymbols) DO
 2300   5D62                        BEGIN
 2301   5D67                         SymbolCount := SymbolCount + 1;
 2302   5D77                         Status := (..);
 2303   5D8F                         FGi8( Status, Fl, EXP_RelocationIndicator);
 2304   5DAE                         IF EXP_RelocationIndicator IN (.0..MaxNooSegments.) THEN
 2305   5DC0                            RelocationIndicator := EXP_RelocationIndicator
 2306   5DC5                         ELSE
 2307   5DD4                            Status := Status + (.RangeError.);
 2308   5DFC                         FGi32(Status, Fl, EXP_Item);
 2309   5E1B                         FGsym(Status, Fl, EXP_SymbolName);
 2310   5E3A                         IF Status = (..) THEN
 2311   5E54                           BEGIN
 2312   5E59                            SBTEX(Status
 2313   5E5E                                 ,SymbolTableEntryNo
 2314   5E66                                 ,EXP_SymbolName
 2315   5E6E                                 ,ModuleNo
 2316   5E76                                 ,EXP_RelocationIndicator
 2317   5E7D                                 ,EXP_Item
 2318   5E88                                 );
 2319   5E95                            IF DuplicateExportSymbol IN Status THEN
 2320   5EAE                              BEGIN
 2321   5EB3                               DuplicateCount := DuplicateCount + 1;
 2322   5EC3                               IF DuplicateCount <= 1 THEN
 2323   5ED6                                  LogHdds(LogFile);
 2324   5EE5                               NMTG(SymbolTable(.
 2325   5EEA                                       ModuleTable(.ModuleNo
 2326   5EEA                                                  .).ModuleNameReference
 2327   5EFE                                               .).NameReference
 2328   5F10                                   ,ModuleName
 2329   5F19                                   );
 2330   5F28                               LogDDS(LogFile
 2331   5F2D                                     ,EXP_RelocationIndicator
 2332   5F34                                     ,EXP_Item
 2333   5F3F                                     ,EXP_SymbolName
 2334   5F45                                     ,ModuleName
 2335   5F4D                                     );
 2336   5F58                              END
 2337   5F58                           END;
 2338   5F58                         GStatus := GStatus + Status
 2339   5F6E                        END; (*WHILE ... DO*)
 2340   5F86                     END;  (*GETEXPORTLIST*)
 2341   5F8C    
 2342   5F8C                   PROCEDURE GetEXI(VAR Status: StatusType
 2343   5F8C                                   ;VAR Fl: FileType
 2344   5F8C                                   ;    ModuleNo: ModuleTableIndexType
 2345   5F8C                                   ;    NooExternalImportSymbols: i32
 2346   5F8C                                   );
 2347   5F8C    
 2348   5F8C                      VAR
 2349   5F8C                         SymbolTableEntryNo: SymbolTableIndexType;
 2350   5F8C                         SymbolCount: i32;
 2351   5F8C                         EXI_SymbolName: SymbolNameType;
 2352   5F8C    
 2353   5F8C                     BEGIN (*GETEXTERNALIMPORTLIST*)
 2354   5F8C                      SymbolCount := 0;
 2355   5FA3                      WHILE (Status = (..)) and
 2356   5FB9                            (SymbolCount < NooExternalImportSymbols) DO
 2357   5FD3                        BEGIN
 2358   5FD8                         SymbolCount := SymbolCount + 1;
 2359   5FE8                         FGsym(Status, Fl, EXI_SymbolName);
 2360   6006                         IF Status = (..) THEN
 2361   601E                            SBTIM(Status
 2362   6023                                 ,SymbolTableEntryNo
 2363   602A                                 ,EXI_SymbolName
 2364   6032                                 ,ModuleNo
 2365   603A                                 );
 2366   6048                        END; (*WHILE ... DO*)
 2367   604B                     END;  (*GETEXTERNALIMPORTLIST*)
 2368   6051    
 2369   6051    
 2370   6051    
 2371   6051                  BEGIN (*GETMODULEHEADER*)
 2372   6051                   Status := (..);
 2373   6071                   MDTA(Status, ModuleNo, 1);
 2374   608C                   IF Status = (..) THEN
 2375   60A6                     BEGIN
 2376   60AB                      GetINX(Status, ModuleNo, Fl
 2377   60C0                            , StartAddressOfNextModule
 2378   60C7                            , NooExpSymbols
 2379   60CE                            , NooExiSymbols);
 2380   60E5                      IF Status = (..) THEN
 2381   60FF                         WITH ModuleTable(.ModuleNo.) DO
 2382   611E                           BEGIN
 2383   6123                            FileNameReference := FileNo;
 2384   6132                            SCTA(Status, SCTBase, NooSegments);
 2385   615C                            IF Status = (..) THEN
 2386   6176                              BEGIN
 2387   617B                               GetSGDs(Status
 2388   6180                                      ,SCTBase
 2389   6188                                      ,NooSegments
 2390   6197                                      ,ModuleNo
 2391   61A6                                      ,Fl
 2392   61AD                                      );
 2393   61B7                               IF Status = (..) THEN
 2394   61D1                                 BEGIN
 2395   61D6                                  SymbolTable(.ModuleNameReference
 2396   61DB                                             .).ModuleNo := ModuleNo;
 2397   61FC                                  GetEXP(Status
 2398   6201                                        ,LogFile
 2399   6209                                        ,Fl
 2400   6210                                        ,SBTLinkHead
 2401   6217                                        ,ModuleNo
 2402   6222                                        ,NooExpSymbols
 2403   6229                                        );
 2404   6236                                  IF Status <= (.DuplicateExportSymbol.) THEN
 2405   6252                                    BEGIN
 2406   6257                                     EITOffset := CurExternalImportSymbolNo;
 2407   626F                                     GetEXI(Status
 2408   6274                                           ,Fl
 2409   627C                                           ,ModuleNo
 2410   6283                                           ,NooExiSymbols
 2411   628A                                           );
 2412   6297                                     CurrentFileAddress := Fl.P;
 2413   62B6                                    END
 2414   62B6                                 END
 2415   62B6                              END
 2416   62B6                           END;
 2417   62B6                     END;
 2418   62B6                   GStatus := GStatus + Status;
 2419   62E1    (*#B#*)
 2420   62E1                   IF test((.0,6,16,19.)) THEN
 2421   62FA                     BEGIN
 2422   62FF                      write(TestOut, 'GetOMH   '); TSTstat(Status); TSTln;
 2423   633F                      TSTindt; TSTindt; TSTindt; TSTmdt(ModuleNo);
 2424   6357                     END;
 2425   6357    (*#E#*)
 2426   6357                  END;  (*GETMODULEHEADER*)
 2427   635D    
 2428   635D               BEGIN (*GETMODULES*)
 2429   635D                REPEAT
 2430   636A                   Status := (..);
 2431   6382                   FilSeek(Status, InputFile, StartAddressOfNextModule);
 2432   63A3                   IF not (UnexpectedEof IN Status) THEN
 2433   63BC                     BEGIN
 2434   63C1                      ValidateModuleFormat(Status, InputFile, OM_Format1);
 2435   63E1                      IF UnexpectedEof IN Status THEN
 2436   63F9                        BEGIN
 2437   63FE                         LogEOFerror(LogFile, FileNumber, InputFile.P)
 2438   641E                        END
 2439   6421                      ELSE IF (BadModuleFormat IN Status) THEN
 2440   643B                        BEGIN
 2441   6440                         LogOMFerror(LogFile, FileNumber, InputFile.P)
 2442   6460                        END
 2443   6463                      ELSE (* Status = (..) *)
 2444   6465                         GetModuleHeader(Status
 2445   646A                                        ,LogFile
 2446   6472                                        ,FileNumber
 2447   6479                                        ,InputFile
 2448   6480                                        ,StartAddressOfNextModule
 2449   6488                                        );
 2450   6497                      GStatus := GStatus + Status;
 2451   64C2                     END
 2452   64C2                UNTIL Status - (.DuplicateExportSymbol, BadSymbolName.) <> (..);
 2453   64E0               END;  (*GETMODULES*)
 2454   64E6    
 2455   64E6            BEGIN (*GETINPUTFILES*)
 2456   64E6             FOR FileNo := 1 TO CurFileNo DO
 2457   6508               BEGIN
 2458   650D                Status := (..);
 2459   6525                FilAsg(InputFile, FileNameTable(.FileNo.));
 2460   6551                FilRst(Status, InputFile);
 2461   6569                IF Status = (..) THEN
 2462   6583                  BEGIN
 2463   6588                   ValidateFileFormat (Status, InputFile, OF_Format1);
 2464   65A8                   IF Status = (..) THEN
 2465   65C2                      GetModules(Status, LogFile, FileNo, InputFile, 4)
 2466   65ED                   ELSE IF BadFileFormat IN Status THEN
 2467   6610                      LogOFFerror(LogFile, FileNo);
 2468   6626                  END;
 2469   6626                IF UnexpectedEof IN Status THEN
 2470   663F                   LogEOFerror(LogFile, FileNo, InputFile.P);
 2471   665E                FilCls(InputFile);
 2472   666E                GStatus := GStatus + Status;
 2473   6699               END;
 2474   66A3             IF CurModuleNo <= 0 THEN
 2475   66B4                GStatus := GStatus + (.NoInput.);
 2476   66DA            END;  (*GETINPUTFILES*)
 2477   66E3    
 2478   66E3    (*                                                                            *)
 2479   66E3    (*                                                                            *)
 2480   66E3    (******************************************************************************)
 2481   66E3    
 2482   66E3    (*$I B:lnkp1-2.pas  putmodule                                                 *)
 2483   66E3    (******************************************************************************)
 2484   66E3    (*                                                                            *)
 2485   66E3    (*   Copyright (1985) by Metanic Aps., Denmark                                *)
 2486   66E3    (*                                                                            *)
 2487   66E3    (*   Author: Lars Gregers Jakobsen.                                           *)
 2488   66E3    (*                                                                            *)
 2489   66E3    (******************************************************************************)
 2490   66E3    
 2491   66E3          PROCEDURE PutTargetFile(VAR Status: StatusType
 2492   66E3                                 ;VAR TargetFile: FileType
 2493   66E3                                 ;VAR LogFile: LogFileType
 2494   66E3                                 );
 2495   66E3    
 2496   66E3             PROCEDURE PutFF(VAR Fl: FileType
 2497   66E3                            );
 2498   66E3    
 2499   66E3               BEGIN (*PUTFF*)
 2500   66E3                FPi32(Fl, OF_Format1);
 2501   6702               END;  (*OUTFF*)
 2502   6708    
 2503   6708             PROCEDURE PutModule(VAR Status: StatusType
 2504   6708                                ;VAR TargetFile: FileType
 2505   6708                                ;VAR  LogFile: LogFileType
 2506   6708                                );
 2507   6708    
 2508   6708                PROCEDURE PutMF(VAR Fl: FileType
 2509   6708                               );
 2510   6708    
 2511   6708                  BEGIN (*PUTMF*)
 2512   6708                   FPi32(Fl, OM_Format1);
 2513   6727                  END;  (*OUTMF*)
 2514   672D    
 2515   672D                PROCEDURE PutINX(VAR Status: StatusType
 2516   672D                                ;VAR Fl: FileType
 2517   672D                                ;VAR LogFile: LogFileType
 2518   672D                                );
 2519   672D    
 2520   672D                   VAR
 2521   672D                      OMH_ModuleName: ModuleNameType;
 2522   672D    
 2523   672D                  BEGIN (*PUTINX*)
 2524   672D                   FPi32(Fl,0); (* OMH_Module *)
 2525   674C                   FPi32(Fl,0); (* OMH_NooSegments *)
 2526   6763                   FPi32(Fl,0); (* OMH_NooExportSymbols *)
 2527   677A                   FPi32(Fl,0); (* OMH_NooExtImportSymbols *)
 2528   6791                   NMTG(SymbolTable(.ModuleTable(.1.).ModuleNameReference
 2529   6796                                   .).NameReference
 2530   67AA                       , OMH_ModuleName
 2531   67B3                       );
 2532   67C2                   FPsym(Fl, OMH_ModuleName);
 2533   67D9                  END;  (*PUTINX*)
 2534   67DF    
 2535   67DF                PROCEDURE PutSGDs(VAR Status: StatusType
 2536   67DF                                 ;VAR Fl: Filetype
 2537   67DF                                 ;VAR LogFile: LogFileType
 2538   67DF                                 );
 2539   67DF    
 2540   67DF                   VAR
 2541   67DF                      SRCinx: SectionTableIndexType;
 2542   67DF                      DSTinx: SectionTableIndexType;
 2543   67DF                      ModuleName: ModuleNameType;
 2544   67DF    
 2545   67DF                  PROCEDURE PutSGD(VAR TargetFile: FileType
 2546   67DF                                  ;    Section: SectionTableRecordType
 2547   67DF                                  );
 2548   67DF    
 2549   67DF                     BEGIN (*PUTSGD*)
 2550   67DF                      WITH Section  DO
 2551   6801                        BEGIN
 2552   6806                         FPi32(TargetFile, ImageSize);
 2553   681B                         FPi32(TargetFile, OvrSize);
 2554   6830                        END;
 2555   6830                     END;  (*PUTSGD*)
 2556   6836    
 2557   6836                  BEGIN (*PUTSGDS*)
 2558   6836                   Status := (..);
 2559   6855                   SCTA(Status, TargetSectionOffset, CurSegmentCount);
 2560   686F                   IF not (SectionTableOverFlow IN Status) THEN
 2561   688A                     BEGIN
 2562   688F                      IF CurSegmentCount > 0 THEN
 2563   68A0                         LogHSgd(LogFile);
 2564   68AF                      FOR DSTinx := 1 TO CurSegmentCount DO
 2565   68C9                         WITH SectionTable(.TargetSectionOffset + DSTinx.) DO
 2566   68F7                           BEGIN
 2567   68FC                            ModuleNo := TargetModuleNo;
 2568   690A                            SegmentNo := DSTinx;
 2569   691F                            ImageSize := 0;                (*TO BE UPDATED*)
 2570   6936                            OvrSize := 0;
 2571   694F                            RelocationConstant := 0;
 2572   6968                            FOR SRCinx := 1 TO TargetSectionOffset DO
 2573   6982                               IF SectionTable(.SRCinx.).SegmentNo = DSTinx THEN
 2574   69A0                                 BEGIN
 2575   69A5                                  SectionTable(.SRCinx.).RelocationConstant :=
 2576   69BE                                               ImageSize * ImageFactor;
 2577   69DF                                  ImageSize := ImageSize +
 2578   69F8                                               SectionTable(.SRCinx.).ImageSize;
 2579   6A1C                                  WITH SectionTable(.SRCinx.) DO (*Log memory map element*)
 2580   6A3B                                     IF SectionTable(.SRCinx.).ImageSize > 0 THEN
 2581   6A67                                       BEGIN
 2582   6A6C                                        NMTG(SymbolTable(.ModuleTable(.
 2583   6A71                                                          ModuleNo.).ModuleNameReference
 2584   6A89                                                        .).Namereference
 2585   6A9B                                            ,ModuleName
 2586   6AA4                                            );
 2587   6AB3                                        LogSGD(LogFile
 2588   6AB8                                              ,DSTinx
 2589   6ABF                                              ,RelocationConstant
 2590   6AC6                                              ,ImageSize*ImageFactor
 2591   6AE3                                              ,ModuleName
 2592   6AF3                                              );
 2593   6AFE                                       END;
 2594   6AFE    (*#B#*)
 2595   6AFE                                  IF test((.0,6,16,19.)) THEN
 2596   6B18                                    BEGIN
 2597   6B1D                                     write(TestOut, 'PutSGDs-1');
 2598   6B45                                     TSTsct(SRCinx);
 2599   6B54                                    END;
 2600   6B54    (*#E#*)
 2601   6B54                                 END; (* FOR SRCinx := ... *)
 2602   6B5E                            PutSGD(Fl, SectionTable(.TargetSectionOffset +
 2603   6B6A                                                     DSTinx.)  );
 2604   6B91    (*#B#*)
 2605   6B91                            IF test((.0,6,16,19.)) THEN
 2606   6BAB                              BEGIN
 2607   6BB0                               write(TestOut, 'PutSGDs-2');
 2608   6BD8                               TSTsct(TargetSectionOffset + DSTinx);
 2609   6BF6                              END;
 2610   6BF6    (*#E#*)
 2611   6BF6                           END; (* FOR DSTinx := ... *)
 2612   6C00                     END; (* allocation ok *)
 2613   6C00                  END;  (*PUTSGDS*)
 2614   6C06    
 2615   6C06                PROCEDURE PutEXP(VAR Status: StatusType
 2616   6C06                                ;VAR Target: FileType
 2617   6C06                                ;VAR LogFile: LogFileType
 2618   6C06                                );
 2619   6C06    
 2620   6C06                   VAR
 2621   6C06                      MDTInx: ModuleTableIndexType;
 2622   6C06                      ModuleName: ModuleNameType;
 2623   6C06                      Heap: HeapType;
 2624   6C06                      HeapMax: HeapIndexType;
 2625   6C06                      Winner: SymboltableIndexType;
 2626   6C06                      SymbolNo: SymbolTableIndexType;
 2627   6C06                      EXP_RelocationIndicator: RelocationIndicatorType;
 2628   6C06                      EXP_Item: i32;
 2629   6C06                      EXP_SymbolName: SymbolNameType;
 2630   6C06                      SbtInx: SymbolTableIndexType;
 2631   6C06    
 2632   6C06                   FUNCTION NameSwop(VAR A
 2633   6C06                                    ,    B: SymbolNameType
 2634   6C06                                    ): boolean;
 2635   6C06    
 2636   6C06                      VAR
 2637   6C06                         I: integer;
 2638   6C06    
 2639   6C06                     BEGIN (*NAMESWOP*)
 2640   6C06                      I := 1;
 2641   6C1D                      IF B.Length < A.Length THEN
 2642   6C39                        BEGIN
 2643   6C3E                         WHILE (I <= B.Length) and (A.Name(.I.) >= B.Name(.I.)) DO
 2644   6CA5                            I := I + 1;
 2645   6CB8                         NameSwop := (I > B.Length);
 2646   6CDC                        END
 2647   6CDC                      ELSE
 2648   6CDF                        BEGIN
 2649   6CE4                         WHILE (I <= A.Length) and (A.Name(.I.) <= B.Name(.I.)) DO
 2650   6D4E                            I := I + 1;
 2651   6D61                         NameSwop := not (I > A.Length);
 2652   6D85                        END;
 2653   6D85    (*#B#*)
 2654   6D85                      IF test((.0,13.)) THEN
 2655   6D9E                        BEGIN
 2656   6DA3                         writeln(TestOut, 'NameSwop ', 'I=', I:1);
 2657   6DE6                         TSTindt; TSTindt; TSTindt;
 2658   6DF4                         write(TestOut, 'A='); TSTsymbol(A);
 2659   6E1F                         TSTindt; TSTindt; TSTindt;
 2660   6E2D                         write(TestOut, 'B='); TSTsymbol(B);
 2661   6E58                        END
 2662   6E58    (*#E#*)
 2663   6E58                     END;  (*NAMESWOP*)
 2664   6E61    
 2665   6E61                   PROCEDURE InHeap(    New: SymbolTableIndexType
 2666   6E61                                   );
 2667   6E61    
 2668   6E61                      VAR
 2669   6E61                         I,J: integer;
 2670   6E61                         Z,V: SymbolNameType;
 2671   6E61                         Swop: boolean;
 2672   6E61    
 2673   6E61                     BEGIN (*INHEAP*)
 2674   6E61                      HeapMax := HeapMax + 1;
 2675   6E87                      I := HeapMax;
 2676   6E96                      NMTG(SymbolTable(.New.).NameReference, Z);
 2677   6EC7                      IF I > 1 THEN
 2678   6EDE                      REPEAT
 2679   6EE3                         J := I div 2;
 2680   6EFB                         NMTG(SymbolTable(. Heap(.J.) .).NameReference, V);
 2681   6F3F                         Swop := NameSwop(V,Z);
 2682   6F5D                         IF Swop THEN
 2683   6F66                           BEGIN
 2684   6F6B                            Heap(.I.) := Heap(.J.);
 2685   6FA9                            I := J
 2686   6FAE                           END
 2687   6FB6                      UNTIL (I <= 1) or ( not Swop );
 2688   6FD5                      Heap(.I.) := New;
 2689   6FFC    (*#B#*)
 2690   6FFC                      IF test((.0,13.)) THEN
 2691   7015                       BEGIN
 2692   701A                        writeln(TestOut, 'InHeap   New=', New:1);
 2693   7057                        TSTheap(Heap, HeapMax);
 2694   7072                       END;
 2695   7072    (*#E#*)
 2696   7072                     END;  (*INHEAP*)
 2697   7078    
 2698   7078                   PROCEDURE SelectWinner(VAR Status: StatusType
 2699   7078                                         );
 2700   7078    
 2701   7078                      VAR
 2702   7078                         I,J: integer;
 2703   7078                         Swop: boolean;
 2704   7078                         V,W,Z: SymbolNameType;
 2705   7078                         New: SymbolTableIndexType;
 2706   7078    
 2707   7078                     BEGIN (*SELECTWINNER*)
 2708   7078                      IF (0 < HeapMax) THEN
 2709   7094                        BEGIN
 2710   7099                         Winner := Heap(.1.);
 2711   70AF                         WITH Symboltable(.Winner.) DO
 2712   70CB                            IF SortLink <> Winner THEN
 2713   70DF                               New := SortLink
 2714   70E4                            ELSE
 2715   70F8                              BEGIN (* Chain exhausted - descrease size of heap *)
 2716   70FD                               New := Heap(.HeapMax.);
 2717   711F                               HeapMax := HeapMax - 1;
 2718   713D                              END;
 2719   713D                         I := 1;
 2720   714C                         IF HeapMax >= 2 THEN
 2721   7160                           BEGIN
 2722   7165                            J := 2;
 2723   7174                            Heap(.HeapMax + 1.) := New;
 2724   71A0                            NMTG(SymbolTable(.New.).NameReference, Z);
 2725   71D1                            REPEAT
 2726   71D6                               (* J <= HeapMax *)
 2727   71D6    
 2728   71D6                               NMTG(SymbolTable(.Heap(. J .).).NameReference, V);
 2729   721E                               NMTG(SymbolTable(.Heap(.J+1.).).NameReference, W);
 2730   7269                               IF NameSwop(V,W) THEN
 2731   7285                                 BEGIN
 2732   728A                                  V := W;
 2733   72A4                                  J := J + 1
 2734   72AD                                 END;
 2735   72B4    
 2736   72B4                               Swop := NameSwop(Z,V);
 2737   72D2                               IF Swop THEN
 2738   72DB                                 BEGIN
 2739   72E0                                  Heap(.I.) := Heap(.J.);
 2740   731E                                  I := J;
 2741   732B                                  J := I + I;
 2742   733D                                 END;
 2743   733D    
 2744   733D    (*#B#*)
 2745   733D                               IF test((.0,13.)) THEN
 2746   7356                                 BEGIN
 2747   735B                                  write(TestOut, 'SLCT-W-1 ', 'I='  , I:1
 2748   7395                                                    , ' ':2 , 'J='  , J:1
 2749   73B9                                                    , ' ':2 , 'New=', New:1
 2750   73E4                                                    , ' ':2 , 'Swop='
 2751   73FB                                       ); TSTbool(Swop); TSTln;
 2752   741A                                  TSTheap(Heap, HeapMax);
 2753   7435                                 END
 2754   7435    (*#E#*)
 2755   7435    
 2756   7435                            UNTIL (not Swop) or (J > HeapMax);
 2757   745B                           END;
 2758   745B                         Heap(.I.) := New;
 2759   7482                        END
 2760   7482                      ELSE
 2761   7485                         Status := Status + (.HeapEmpty.);
 2762   74AD    (*#B#*)
 2763   74AD                      IF test((.0,13,16,19.)) THEN
 2764   74C7                        BEGIN
 2765   74CC                         write(TestOut, 'SLCT-W-2 '); TSTstat(Status); TSTindt;
 2766   750B                         writeln(TestOut,        'HeapMax=', HeapMax:1
 2767   753E                                        , ' ':2, 'Winner=', Winner:1
 2768   7570                                );
 2769   7579                        END;
 2770   7579    (*#E#*)
 2771   7579                     END;  (*SELECTWINNER*)
 2772   757F    
 2773   757F    
 2774   757F                  BEGIN (*PUTEXP*)
 2775   757F    
 2776   757F    (*#B#*)
 2777   757F                   IF test((.0,13.)) THEN
 2778   75A0                     BEGIN
 2779   75A5                      writeln(TestOut, 'PUTEXP   ');
 2780   75CD                      FOR SbtInx := 1 TO MaxNooSymbols DO
 2781   75DE                         WITH SymbolTable(.SbtInx.), ValueTable(.SbtInx.) DO
 2782   7614                            IF NameReference <> 0 THEN
 2783   7629                              BEGIN
 2784   762E                               TSTindt; TSTindt; TSTindt; TSTsbt(SbtInx);
 2785   764A                               TSTindt; TSTvlt(SbtInx); TSTln;
 2786   765F                              END;
 2787   7669                     END;
 2788   7669    (*#E#*)
 2789   7669    
 2790   7669                   (*Initialize selection*)
 2791   7669                   HeapMax := 0;
 2792   7672                   FOR MDTInx := 1 TO TargetModuleNo - 1 DO
 2793   7699                      IF ModuleTable(.MDTInx
 2794   769E                                    .).SBTLinkHead IN (.1..MaxNooSymbols.) THEN
 2795   76CC                         InHeap(ModuleTable(.MDTInx.).SBTLinkHead);
 2796   76FF    
 2797   76FF                   IF HeapMax > 0 THEN
 2798   770F                      LogHxpN(LogFile);
 2799   771E                   NooExpSymbols := 0;
 2800   7730    
 2801   7730                   WHILE (Status = (..)) DO
 2802   7749                     BEGIN
 2803   774E                      SelectWinner(Status);
 2804   7761                      IF Status = (..) THEN
 2805   777A                         WITH SymbolTable(.Winner.), ValueTable(.Winner.) DO
 2806   77B3                            IF SegmentNo > UnResolved THEN
 2807   77C4                              BEGIN
 2808   77C9                               NooExpSymbols := NooExpSymbols + 1;
 2809   77DF                               IF (SegmentNo > 0)  THEN (*relocatable*)
 2810   77F6                                  WITH SectionTable(.ModuleTable(.ModuleNo
 2811   77FB                                                                .).SCTbase +
 2812   7813                                                                   SegmentNo
 2813   7813                                                   .) DO
 2814   7844                                    BEGIN
 2815   7849                                     Value := Value + RelocationConstant;
 2816   7875                                    END;
 2817   7875                               EXP_RelocationIndicator := SegmentNo;
 2818   7887                               EXP_Item := Value;
 2819   789A                               NMTG(NameReference, EXP_SymbolName);
 2820   78BD                               FPi8(Target, EXP_RelocationIndicator);
 2821   78D4                               FPi32(Target, EXP_Item);
 2822   78E9                               FPsym(Target, EXP_SymbolName);
 2823   7900                               IF (Status = (..)) and (OPTlfk <> none) THEN
 2824   7929                                 BEGIN
 2825   792E                                  NMTG(SymbolTable(.
 2826   7933                                          ModuleTable(.ModuleNo
 2827   7933                                                     .).ModuleNameReference
 2828   794B                                                  .).NameReference
 2829   795D                                      ,ModuleName
 2830   7966                                      );
 2831   7975                                  LogXP(LogFile
 2832   797A                                       ,EXP_RelocationIndicator
 2833   7981                                       ,EXP_Item
 2834   7988                                       ,EXP_SymbolName
 2835   798E                                       ,ModuleName
 2836   7996                                       )
 2837   799E                                 END;
 2838   79A1                              END;
 2839   79A1                     END;
 2840   79A4                   Status := Status - (.HeapEmpty.);
 2841   79CC                   IF (HeapEmpty IN Status) and (OPTlfk <> none) THEN
 2842   79F7                     BEGIN  (*sort sbt/vlt by value and log*)
 2843   79FC                     END
 2844   79FC                  END;  (*PUTEXP*)
 2845   7A02    
 2846   7A02    
 2847   7A02                PROCEDURE PutEXI(VAR Status: StatusType
 2848   7A02                                ;VAR Target: FileType
 2849   7A02                                ;VAR LogFile: LogFileType
 2850   7A02                                );
 2851   7A02    
 2852   7A02                LABEL
 2853   7A02                   1;
 2854   7A02    
 2855   7A02                VAR
 2856   7A02                     ModuleName: ModuleNameType;
 2857   7A02                     SymbolName: SymbolNameType;
 2858   7A02                     ExiInx1: ExternalImportTableIndexType;
 2859   7A02                     ExiInx: ExternalImportTableIndexType;
 2860   7A02    
 2861   7A02                  (* TargetModuleNo is a global variable *)
 2862   7A02    
 2863   7A02                  BEGIN (*PUTEXI*)
 2864   7A02                   NooExiSymbols := 0;
 2865   7A1C    
 2866   7A1C                   ExiInx1 := 1;
 2867   7A25                   FOR ExiInx1 := 1 TO CurExternalImportSymbolNo DO
 2868   7A3F                     BEGIN
 2869   7A44    (*#B#*)
 2870   7A44                      IF test((.0,7.)) THEN
 2871   7A5B                        BEGIN
 2872   7A60                         write(TestOut, 'PUTEXI-1 ');
 2873   7A88                         TSTeit(ExiInx1);
 2874   7A97                        END;
 2875   7A97    (*#E#*)
 2876   7A97                      IF (ValueTable(.ExternalImportTable(.ExiInx1.).SymbolNo
 2877   7AAA                                    .).SegmentNo = UnResolved) THEN
 2878   7AC2                         GOTO 1;
 2879   7ACA                     END;
 2880   7AD4    
 2881   7AD4    1:             IF (CurExternalImportSymbolNo > 0) THEN
 2882   7AE5                      IF (ValueTable(.ExternalImportTable(.ExiInx1.).SymbolNo
 2883   7AF8                                .).SegmentNo = UnResolved) THEN
 2884   7B10                        BEGIN
 2885   7B15                         LogHurs(LogFile);
 2886   7B24                         FOR ExiInx := ExiInx1 TO CurExternalImportSymbolNo DO
 2887   7B3F                           BEGIN
 2888   7B44    (*#B#*)
 2889   7B44                            IF test((.0,7.)) THEN
 2890   7B5B                              BEGIN
 2891   7B60                               write(TestOut, 'PUTEXI-2 ');
 2892   7B88                               TSTeit(ExiInx);
 2893   7B97                              END;
 2894   7B97    (*#E#*)
 2895   7B97                            WITH ExternalImportTable(.ExiInx.) DO
 2896   7BB0                               WITH ValueTable(.SymbolNo.),
 2897   7BCD                                    SymbolTable(.SymbolNo.) DO
 2898   7BEB                                        IF SegmentNo = UnResolved THEN
 2899   7BFC                                          BEGIN
 2900   7C01                                           NooExiSymbols := NooExiSymbols + 1;
 2901   7C17                                           Value := NooExiSymbols;
 2902   7C2E                                           NMTG(NameReference, SymbolName);
 2903   7C51                                           FPsym(Target, SymbolName);
 2904   7C68                                           NMTG(SymbolTable(.
 2905   7C6D                                                   ModuleTable(.ModuleNo
 2906   7C6D                                                              .).ModuleNameReference
 2907   7C85                                                           .).NameReference
 2908   7C97                                               ,ModuleName
 2909   7CA0                                               );
 2910   7CAF                                           LogURS(LogFile, ModuleName, SymbolName);
 2911   7CCE    (*#B#*)
 2912   7CCE                                           IF test((.0,16,19.)) THEN
 2913   7CE8                                             BEGIN
 2914   7CED                                              writeln(TestOut, 'PutEXI   '
 2915   7D08                                                             , 'SymbolNo=', SymbolNo:1
 2916   7D37                                                             , ' ':2, 'Value=', Value:1);
 2917   7D6E                                             END;
 2918   7D6E    (*#E#*)
 2919   7D6E                                          END;
 2920   7D6E    
 2921   7D6E                           END;
 2922   7D78                        END;
 2923   7D78                  END;  (*PUTEXI*)
 2924   7D7E    
 2925   7D7E               (* TargetModuleNo is a global variable *)
 2926   7D7E    
 2927   7D7E               BEGIN (*PUTMODULE*)
 2928   7D7E                MDTA(Status, TargetModuleNo, 1);
 2929   7D9C                IF not (ModuleTableOverFlow IN Status) THEN
 2930   7DB7                  BEGIN
 2931   7DBC                   PutMF(TargetFile);
 2932   7DCB                   PutINX(Status, TargetFile, LogFile);
 2933   7DEC                   IF Status = (..) THEN
 2934   7E05                     BEGIN (*Calculate memory map, write sgd, and log*)
 2935   7E0A                      PutSGDs(Status, TargetFile, LogFile);
 2936   7E2B    
 2937   7E2B                      IF not (SectionTableOverFlow IN Status) THEN
 2938   7E46                        BEGIN (*Relocate symbol table, write export list, and log*)
 2939   7E4B                         PutEXP(Status, TargetFile, LogFile);
 2940   7E6C                         IF Status = (..) THEN
 2941   7E85                           BEGIN (*Write EXI while logging unresolved references*)
 2942   7E8A                            PutEXI(Status, TargetFile, LogFile);
 2943   7EAB                           END;
 2944   7EAB                        END;
 2945   7EAB                     END;
 2946   7EAB                  END;
 2947   7EAB               END;  (*PUTMODULE*)
 2948   7EB1    
 2949   7EB1            BEGIN (*PUTTARGETFILE*)
 2950   7EB1             PutFF(TargetFile);
 2951   7EC8             PutModule(Status, TargetFile, LogFile);
 2952   7EE9            END;  (*PUTTARGETFILE*)
 2953   7EEF    
 2954   7EEF    (*                                                                            *)
 2955   7EEF    (*                                                                            *)
 2956   7EEF    (******************************************************************************)
 2957   7EEF    
 2958   7EEF    
 2959   7EEF         BEGIN (*PASS1*)
 2960   7EEF    
 2961   7EEF          (* Initialize local data structures *)
 2962   7EEF          FOR SBTSubInx := 1 TO MaxNooSymbols DO
 2963   7F0A             SymbolTable(.SBTSubInx.).NameReference := 0;
 2964   7F30          LatestInsert := 0;
 2965   7F42          CurrentSymbolCount := 0;
 2966   7F54          CurrentNameTableIndex := 0;
 2967   7F62    
 2968   7F62          GetInputFiles(Status, LogFile);
 2969   7F8E          IF Status = (..) THEN
 2970   7FB0            BEGIN
 2971   7FB5             PutTargetFile(Status, TargetFile, LogFile);
 2972   7FF1            END;
 2973   7FF1         END;  (*PASS1*)
 2974   7FF7    
 2975   7FF7    (*                                                                            *)
 2976   7FF7    (*                                                                            *)
 2977   7FF7    (******************************************************************************)
 2978   7FF7    
 2979   7FF7    (*$I B:lnkp2.pas    Procedure pass2                                           *)
 2980   7FF7    (******************************************************************************)
 2981   7FF7    (*                                                                            *)
 2982   7FF7    (*   Copyright (1985) by Metanic Aps., Denmark                                *)
 2983   7FF7    (*                                                                            *)
 2984   7FF7    (*   Author: Lars Gregers Jakobsen.                                           *)
 2985   7FF7    (*                                                                            *)
 2986   7FF7    (******************************************************************************)
 2987   7FF7    
 2988   7FF7       PROCEDURE Pass2(VAR Status: StatusType
 2989   7FF7                      ;VAR TargetFile: FileType
 2990   7FF7                      ;VAR LogFile: LogFileType
 2991   7FF7                      );
 2992   7FF7    
 2993   7FF7          LABEL
 2994   7FF7             999;
 2995   7FF7    
 2996   7FF7          VAR
 2997   7FF7             SegmentInx: SegmentNoType;
 2998   7FF7             ModuleInx: ModuleTableIndexType;
 2999   7FF7             Crid: BitMappedFileType;  (*Composite relocation import directory*)
 3000   7FF7             Covr: FileType;           (*Composite overrun store*)
 3001   7FF7    
 3002   7FF7    (*#B#*)
 3003   7FF7    (*$I B:LNKDF5.PAS  Bit Map Buffer Test Output                            *)
 3004   7FF7    (******************************************************************************)
 3005   7FF7    (*                                                                            *)
 3006   7FF7    (*   Copyright (1985) by Metanic Aps., Denmark                                *)
 3007   7FF7    (*                                                                            *)
 3008   7FF7    (*   Author: Lars Gregers Jakobsen.                                           *)
 3009   7FF7    (*                                                                            *)
 3010   7FF7    (******************************************************************************)
 3011   7FF7    
 3012   7FF7          PROCEDURE TSTbmb(Bmb: BitMapBufferType
 3013   7FF7                          );
 3014   7FF7    
 3015   7FF7             VAR
 3016   7FF7                I: 0..15;
 3017   7FF7    
 3018   7FF7            BEGIN (*TSTBMB*)
 3019   7FF7             write(TestOut, 'Y1,Y0,I,P= ', Bmb.Y1:3, ' ', Bmb.Y0:3, ' ');
 3020   806E             FOR I := 15 DOWNTO 8 DO
 3021   807F                IF I IN Bmb.I THEN
 3022   8096                   write(TestOut, '1')
 3023   80AE                ELSE
 3024   80B4                   write(TestOut, '0');
 3025   80D9             write(TestOut, ' ');
 3026   80F4             FOR I := 7 DOWNTO 0 DO
 3027   8105                IF I IN Bmb.I THEN
 3028   811C                   write(TestOut, '1')
 3029   8134                ELSE
 3030   813A                   write(TestOut, '0');
 3031   815F             write(TestOut, ' ', Bmb.P:3, '   ');
 3032   819B            END;  (*TSTBMB*)
 3033   81A1    
 3034   81A1    (*                                                                            *)
 3035   81A1    (*                                                                            *)
 3036   81A1    (******************************************************************************)
 3037   81A1    
 3038   81A1    (*$I B:LNKDF6.PAS  Bit Map Access Primitives                                  *)
 3039   81A1    (******************************************************************************)
 3040   81A1    (*                                                                            *)
 3041   81A1    (*   Copyright (1985) by Metanic Aps., Denmark                                *)
 3042   81A1    (*                                                                            *)
 3043   81A1    (*   Author: Lars Gregers Jakobsen.                                           *)
 3044   81A1    (*                                                                            *)
 3045   81A1    (******************************************************************************)
 3046   81A1    
 3047   81A1          PROCEDURE BMG2(VAR BM: BitMappedFileType
 3048   81A1                        ;VAR Relocatable: boolean
 3049   81A1                        ;VAR Importable: boolean
 3050   81A1                        );
 3051   81A1    
 3052   81A1            BEGIN (*BMG2*)
 3053   81A1             WITH BM, BM.B DO
 3054   81C8               BEGIN
 3055   81CD                IF P <= 8 THEN
 3056   81DE                  BEGIN
 3057   81E3                   read(F, Y1);
 3058   820E                   P := P + 8;
 3059   8231                  END;
 3060   8231                P := P - 1;
 3061   8251                Relocatable := P IN I;
 3062   827F                P := P - 1;
 3063   829F                Importable  := P IN I;
 3064   82CD    (*#B#*)
 3065   82CD                IF test((.0,4.)) THEN
 3066   82E4                  BEGIN
 3067   82E9                   write(TestOut, 'BMG2     '); TSTbmb(BM.B);
 3068   831D                   write(TestOut, 'R,I= ');
 3069   8341                   TSTbool(Relocatable); TSTindt; TSTbool(Importable); TSTln;
 3070   8368                  END;
 3071   8368    (*#E#*)
 3072   8368    
 3073   8368               END;
 3074   8368            END;  (*BMG2*)
 3075   836E    
 3076   836E          PROCEDURE BMG6(VAR BM: BitMappedFileType
 3077   836E                        ;VAR Index:i8
 3078   836E                        );
 3079   836E    
 3080   836E             VAR
 3081   836E                J: 1..6;
 3082   836E    
 3083   836E            BEGIN (*BMG6*)
 3084   836E             Index := 0;
 3085   8383             WITH BM, BM.B DO
 3086   83A2               BEGIN
 3087   83A7                IF P < 14 THEN
 3088   83B5                  BEGIN
 3089   83BA                   read(F, Y0);
 3090   83E4                   FOR J := 1 TO 6 DO
 3091   83F5                      Index := Index + Index + ord( (P-J) IN I );
 3092   8460                   Y1 := Y0;
 3093   8478                   P := P + 2; (* = P - 6 + 8 *)
 3094   849B                  END
 3095   849B                ELSE
 3096   849E                  BEGIN
 3097   84A3                   FOR J := 1 TO 6 DO
 3098   84B4                      Index := Index + Index + ord( (P-J) IN I );
 3099   851F                   P := P - 6;
 3100   8542                  END;
 3101   8542    (*#B#*)
 3102   8542                IF test((.0,4.)) THEN
 3103   8559                  BEGIN
 3104   855E                   write(TestOut, 'BMG6     '); TSTbmb(BM.B);
 3105   8592                   writeln(TestOut, 'Index= ',Index:1);
 3106   85CB                  END;
 3107   85CB    (*#E#*)
 3108   85CB               END;
 3109   85CB            END;  (*BMG6*)
 3110   85D1    
 3111   85D1          PROCEDURE BMP2(VAR BM: BitMappedFileType
 3112   85D1                        ;    Relocatable: boolean
 3113   85D1                        ;    Importable: boolean
 3114   85D1                        );
 3115   85D1    
 3116   85D1            BEGIN (*BMP2*)
 3117   85D1             WITH BM, BM.B DO
 3118   85F8               BEGIN
 3119   85FD                P := P - 1;
 3120   8617                IF Relocatable THEN
 3121   8623                   I := I + (.P.);
 3122   865B                P := P - 1;
 3123   867B                IF Importable THEN
 3124   8687                   I := I + (.P.);
 3125   86BF                IF P <= 8 THEN  (* always >= 8 *)
 3126   86D6                  BEGIN
 3127   86DB                   write(F, Y1);
 3128   8706                   Y1 := 0;
 3129   8715                   P := 16 (* = P + 8 *)
 3130   8720                  END;
 3131   8722    (*#B#*)
 3132   8722                IF test((.0,4.)) THEN
 3133   8739                  BEGIN
 3134   873E                   write(TestOut, 'BMP2     '); TSTbmb(BM.B);
 3135   8772                   write(TestOut, 'R,I= ');
 3136   8796                   TSTbool(Relocatable); TSTindt; TSTbool(Importable); TSTln;
 3137   87B5                  END;
 3138   87B5    (*#E#*)
 3139   87B5               END
 3140   87B5            END;  (*BMP2*)
 3141   87BB    
 3142   87BB          PROCEDURE BMP6(VAR BM: BitMappedFileType
 3143   87BB                        ;    Index:i8
 3144   87BB                        );
 3145   87BB    
 3146   87BB             VAR
 3147   87BB                J: 0..5;
 3148   87BB    
 3149   87BB            BEGIN (*BMP6*)
 3150   87BB             WITH BM, BM.B DO
 3151   87E2               BEGIN
 3152   87E7                P := P - 6;
 3153   8804                FOR J := 0 TO 5 DO
 3154   8815                  BEGIN
 3155   881A                   IF odd(Index) THEN
 3156   8828                      I := I + (.P+J.);
 3157   886A                   Index := Index div 2
 3158   886F                  END;
 3159   8881    (*#B#*)
 3160   8881                IF test((.0,4.)) THEN
 3161   8898                  BEGIN
 3162   889D                   write(TestOut, 'BMP6     '); TSTbmb(BM.B);
 3163   88D1                   writeln(TestOut, 'Index= ', Index:1);
 3164   8906                  END;
 3165   8906    (*#E#*)
 3166   8906                IF P <= 8 THEN
 3167   891D                  BEGIN
 3168   8922                   write(F, Y1);
 3169   894D                   Y1 := Y0;
 3170   8965                   Y0 := 0;
 3171   8973                   P := P + 8;
 3172   8996                  END;
 3173   8996               END;
 3174   8996            END;  (*BMP6*)
 3175   899C    
 3176   899C    (*                                                                            *)
 3177   899C    (*                                                                            *)
 3178   899C    (******************************************************************************)
 3179   899C    
 3180   899C    
 3181   899C          PROCEDURE LinkSection(VAR Status: StatusType
 3182   899C                               ;VAR TargetFile: FileType
 3183   899C                               ;VAR LogFile: LogFileType
 3184   899C                               ;VAR Crid: BitMappedFileType
 3185   899C                               ;VAR Covr: FileType
 3186   899C                               ;VAR SCTrec: SectionTableRecordType
 3187   899C                               ;VAR MDTrec: ModuleTableRecordType
 3188   899C                               );
 3189   899C    
 3190   899C             LABEL
 3191   899C                99;
 3192   899C    
 3193   899C             VAR
 3194   899C                Oimg: FileType;
 3195   899C                Orid: BitMappedFileType;
 3196   899C                Oovr: FileType;
 3197   899C                ImageUnit: ImageUnitType;
 3198   899C                QuadImageUnit: QuadImageUnitType;
 3199   899C                Relocatable: boolean;
 3200   899C                Importable: boolean;
 3201   899C                Index: i8;
 3202   899C                Address: FileAddressType; (*relative to current obj. section*)
 3203   899C                LocalImageSize: FileAddressType;
 3204   899C                OvrIndex: QuadImageUnitType;
 3205   899C    
 3206   899C    
 3207   899C            BEGIN (*LINKSECTION*)
 3208   899C             WITH MDTrec, SCTrec DO
 3209   89C1               BEGIN
 3210   89C6                IF ImageSize > 0 THEN
 3211   89DE                  BEGIN
 3212   89E3                   FilAsg(Oimg, FileNameTable(.FileNameReference.));
 3213   8A14                   FilRst(Status, Oimg);
 3214   8A2B                   FilSeek(Status, Oimg, CurrentFileAddress);
 3215   8A52                   CurrentFileAddress := CurrentFileAddress + ImageSize * ImageFactor;
 3216   8A8C    
 3217   8A8C                   WITH Orid DO
 3218   8A91                     BEGIN
 3219   8A96                      assign(F, FileNameTable(.FileNameReference.));
 3220   8AC6                      reset(F);
 3221   8ADA                      seek(F, CurrentFileAddress);
 3222   8AF6                      WITH B DO
 3223   8B08                        BEGIN
 3224   8B0D                         P := 16;
 3225   8B14                         I := (..);
 3226   8B2C                         read(F, Y1);
 3227   8B53                        END;
 3228   8B53                     END;
 3229   8B53                   CurrentFileAddress := CurrentFileAddress + ImageSize;
 3230   8B82    
 3231   8B82                   IF OvrSize > 0 THEN
 3232   8BA2                     BEGIN
 3233   8BA7                      FilAsg(Oovr, FileNameTable(.FileNameReference.));
 3234   8BD8                      FilRst(Status, Oovr);
 3235   8BEF                      FilSeek(Status, Oovr, CurrentFileAddress);
 3236   8C16                      CurrentFileAddress := CurrentFileAddress + OvrSize;
 3237   8C47                     END
 3238   8C47                   ELSE
 3239   8C4A                      Oovr.P := CurrentFileAddress;
 3240   8C61    
 3241   8C61                   (*CurrentFileAddress now reflects starting position of
 3242   8C61                     next section in file if any*)
 3243   8C61    
 3244   8C61                   Address := 0;
 3245   8C70                   LocalImageSize := (ImageSize - 1) * ImageFactor;
 3246   8C95                   WHILE (Address <= LocalImageSize) and (Status = (..)) DO
 3247   8CC6                     BEGIN
 3248   8CCB                      BMG2(Orid, Relocatable, Importable);
 3249   8CEB                      IF Relocatable <> Importable THEN
 3250   8CF9                        BEGIN
 3251   8CFE                         BMG6(Orid, Index);
 3252   8D16                         FGi32(Status, Oimg, QuadImageUnit);
 3253   8D35                         IF Relocatable THEN
 3254   8D41                            (* Relocate *)
 3255   8D41                            IF Index IN (.1..NooSegments.) THEN
 3256   8D6F                               WITH SectionTable(.SCTBase + Index.) DO
 3257   8DA6                                  QuadImageUnit := QuadImageUnit + RelocationConstant
 3258   8DAF                            ELSE
 3259   8DC8                               Status := Status + (.BadRelocationCode.)
 3260   8DDE                         ELSE
 3261   8DF2                            (* Import *)
 3262   8DF2                           BEGIN (*IMPORT*)
 3263   8DF7                            IF Index = OvrCode THEN
 3264   8E03                               IF Oovr.P  < CurrentFileAddress - 3 THEN
 3265   8E2A                                  FGi32(Status, Oovr, OvrIndex)
 3266   8E46                               ELSE
 3267   8E4C                                  Status := Status + (.UnexpectedEof.)
 3268   8E62                            ELSE
 3269   8E75                               OvrIndex := Index;
 3270   8E85                            IF OvrIndex IN (.1..NooExternalImportSymbols.) THEN
 3271   8EB5                               WITH ValueTable(.ExternalImportTable(.EITOffset + OvrIndex
 3272   8EC0                                                                   .).SymbolNo
 3273   8EE6                                              .) DO
 3274   8EFE                                  IF SegmentNo > UnResolved THEN
 3275   8F0F                                    BEGIN
 3276   8F14                                     QuadImageUnit := QuadImageUnit + Value; (*?* + ? *)
 3277   8F30                                     Importable := false;
 3278   8F39                                     Relocatable := SegmentNo > 0;
 3279   8F56                                     Index := SegmentNo;
 3280   8F69                                    END
 3281   8F69                                  ELSE
 3282   8F6C                                     IF Value IN (.0..63.) THEN
 3283   8F8F                                        Index := Value
 3284   8F94                                     ELSE
 3285   8FAB                                       BEGIN
 3286   8FB0                                        Index := OvrCode;
 3287   8FB9                                        FPi32(Covr, Value);
 3288   8FD4                                       END
 3289   8FD4                            ELSE
 3290   8FD7                               Status := Status + (.BadImportCode.)
 3291   8FED                           END;  (*IMPORT*)
 3292   8FFE                         FPi32(TargetFile, QuadImageUnit);
 3293   9013                         BMP2(Crid, Relocatable, Importable);
 3294   9030                         BMP6(Crid, Index);
 3295   9043                         Address := Address + ImageFactor;
 3296   905E                        END
 3297   905E                      ELSE
 3298   9061                         IF Relocatable THEN
 3299   906D                           BEGIN
 3300   9072                            Status := Status + (.Baddibit.);
 3301   9099                            GOTO 99; (*EXIT procedure*)
 3302   90A1                           END
 3303   90A1                         ELSE
 3304   90A4                           BEGIN
 3305   90A9                            FGi8(Status, Oimg, ImageUnit);
 3306   90C8                            FPi8(TargetFile, ImageUnit);
 3307   90DB                            BMP2(Crid, Relocatable, Importable);
 3308   90F8                            Address := Address + 1;
 3309   910B                           END;
 3310   910B                     END;
 3311   910E                   LocalImageSize := ImageSize * ImageFactor;
 3312   9130                   WHILE (Address < LocalImageSize) and (Status = (..)) DO
 3313   9161                     BEGIN
 3314   9166                      BMG2(Orid, Relocatable, Importable);
 3315   9186                      IF Relocatable or Importable THEN
 3316   9195                        BEGIN
 3317   919A                         Status := Status + (.Baddibit.);
 3318   91C1                         GOTO 99; (*EXIT procedure*)
 3319   91C9                        END
 3320   91C9                      ELSE
 3321   91CC                        BEGIN
 3322   91D1                         FGi8(Status, Oimg, ImageUnit);
 3323   91F0                         FPi8(TargetFile, ImageUnit);
 3324   9203                         BMP2(Crid, Relocatable, Importable);
 3325   9220                         Address := Address + 1;
 3326   9233                        END;
 3327   9233                     END;
 3328   9236                  END; (* IF ImageSize > 0 THEN *)
 3329   9236    99:        END; (* WITH MDTrec, SCTrec DO *)
 3330   9236            END;  (*LINKSECTION*)
 3331   923F    
 3332   923F          PROCEDURE CopyBuffer(VAR Status: StatusType
 3333   923F                              ;VAR Buffer: BasicFileType
 3334   923F                              ;VAR TargetFile: FileType
 3335   923F                              ;VAR Size: FileAddressType
 3336   923F                              );
 3337   923F    
 3338   923F             VAR
 3339   923F                Item: i8;
 3340   923F                Start: FileAddressType;
 3341   923F    
 3342   923F            BEGIN (*COPYBUFFER*)
 3343   923F             reset(Buffer);
 3344   925A             Start := TargetFile.P;
 3345   9271             WHILE not eof(Buffer) DO
 3346   928A               BEGIN
 3347   928F                read(Buffer, Item);
 3348   92B2                FPi8(TargetFile, Item); (*Advancing TargetFile.P*)
 3349   92C5               END;
 3350   92C8             Size := TargetFile.P - Start;
 3351   92EE    (*#B#*)
 3352   92EE             IF test((.0,20.)) THEN
 3353   9308               BEGIN
 3354   930D                writeln(TestOut, 'CPYBUF   ', 'Start= ', Start:1
 3355   934C                                            , ' End= ', TargetFile.P:1
 3356   9372                                            , ' Size= ', Size:1
 3357   9397                       );
 3358   93A0               END;
 3359   93A0    (*#E#*)
 3360   93A0            END;  (*COPYBUFFER*)
 3361   93A6    
 3362   93A6          PROCEDURE UPDINX(VAR Status: StatusType
 3363   93A6                           VAR TargetFile: FileType
 3364   93A6                          );
 3365   93A6    
 3366   93A6             VAR
 3367   93A6                ModuleSize: i32;
 3368   93A6                ModuleName: ModuleNameType;
 3369   93A6                SegmentInx: SegmentNoType;
 3370   93A6    
 3371   93A6            BEGIN (*UPDINX*)
 3372   93A6             ModuleSize := TargetFile.P - OMF_Address;
 3373   93CD             update(TargetFile.F);
 3374   93E0             FilSeek(Status, TargetFile, OMH_Address);
 3375   93FE             IF Status = (..) THEN
 3376   9417               BEGIN
 3377   941C                FPi32(TargetFile, ModuleSize);
 3378   9431                FPi32(TargetFile, CurSegmentCount);
 3379   944B                FPi32(TargetFile, NooExpSymbols);
 3380   9463                FPi32(TargetFile, NooExiSymbols);
 3381   947B                FGsym(Status, TargetFile, ModuleName); (*skip past name*)
 3382   9499                IF Status = (..) THEN
 3383   94B2                   FOR SegmentInx := 1 TO CurSegmentCount DO
 3384   94CC                      WITH SectionTable(.TargetSectionOffset + SegmentInx.) DO
 3385   94FA                        BEGIN
 3386   94FF                         FPi32(TargetFile, ImageSize);
 3387   951B                         FPi32(TargetFile, OvrSize);
 3388   9539                        END;
 3389   9543               END;
 3390   9543            END;  (*UPDINX*)
 3391   9549    
 3392   9549         BEGIN (*PASS2*)
 3393   9549          FOR SegmentInx := 1 TO CurSegmentCount DO
 3394   956B            BEGIN
 3395   9570             WITH Crid DO
 3396   9575               BEGIN
 3397   957A                rewrite(F);
 3398   958E                WITH B DO
 3399   95A0                  BEGIN
 3400   95A5                   P := 16;
 3401   95AC                   I := (..)
 3402   95B9                  END
 3403   95C4               END;
 3404   95C4             FilRwt(Covr);
 3405   95D4             FOR ModuleInx := 1 TO TargetModuleNo - 1 DO
 3406   95FB               BEGIN
 3407   9600    (*#B#*)
 3408   9600                IF test((.0,20.)) THEN
 3409   961A                  BEGIN
 3410   961F                   write(TestOut, 'Pass-2   '); TSTstat(Status); TSTindt;
 3411   965E                   writeln(TestOut, 'SgmInx= ', SegmentInx:1
 3412   968D                                  , ' MdlInx= ', ModuleInx:1
 3413   96B4                                  );
 3414   96BD                   TSTindt; TSTindt; TSTindt;
 3415   96CB                   TSTmdt(ModuleInx);
 3416   96DA                   TSTindt; TSTindt; TSTindt;
 3417   96E8                   TSTsct(ModuleTable(.ModuleInx.).SCTBase + SegmentInx);
 3418   971E                  END;
 3419   971E    (*#E#*)
 3420   971E                IF (SectionTable(.ModuleTable(.ModuleInx
 3421   9723                                             .).SCTBase + SegmentInx
 3422   9737                                .).ModuleNo = ModuleInx) THEN
 3423   9765                  BEGIN
 3424   976A                   LinkSection(Status, TargetFile, LogFile, Crid, Covr
 3425   978C                              ,SectionTable(.ModuleTable(.ModuleInx
 3426   9794                                                         .).SCTBase + SegmentInx
 3427   97A8                                           .)
 3428   97CF                              ,ModuleTable(.ModuleInx.)
 3429   97E4                              );
 3430   97E8                   IF Status <> (..) THEN
 3431   9801                      GOTO 999; (*************  EXIT BOTH FOR LOOPS **************)
 3432   9809                  END;
 3433   9809               END;
 3434   9813             WITH SectionTable(.TargetSectionOffset + SegmentInx.) DO
 3435   9841               BEGIN
 3436   9846                CopyBuffer(Status, Crid.F, TargetFile, ImageSize);
 3437   986D                CopyBuffer(Status, Covr.F, TargetFile, OvrSize);
 3438   9896               END;
 3439   9896            END;
 3440   98A0    999:
 3441   98A0          (*backpatch info to target.inx*)
 3442   98A0          UPDINX(Status, TargetFile);
 3443   98B6    
 3444   98B6         END;  (*PASS2*)
 3445   98BF    
 3446   98BF    (*                                                                            *)
 3447   98BF    (*                                                                            *)
 3448   98BF    (******************************************************************************)
 3449   98BF    
 3450   98BF    
 3451   98BF    
 3452   98BF      BEGIN  (*LINK*)
 3453   98BF    (*#B#*)
 3454   98BF       TestInit(Input,Output);
 3455   98D8    (*#E#*)
 3456   98D8       Status := (..);
 3457   98EC       Optiontable.LogFileKind := None;
 3458   98F6       OptionTable.TargetFileKind := Implicit;
 3459   9900       CurFileNo := 0;
 3460   990A       CurModuleNo := 0;
 3461   9914       FOR SCTSubInx := 1 TO MaxNooSections DO
 3462   9926          SectionTable(.SCTSubInx.).SegmentNo := 0;
 3463   994A       SCTOffset := 0;
 3464   9954       CurSegmentCount := 0;
 3465   995E       CurExternalImportSymbolNo := 0;
 3466   9968    
 3467   9968       SetUp(Status, TargetFile, LogFile, Output);
 3468   9980    (*#B#*)
 3469   9980       IF test((.0,16,17.)) THEN
 3470   999A         BEGIN
 3471   999F          write(TestOut, 'Link-MAIN-1   '); TSTstat(Status); TSTindt; TSTmem; TSTln
 3472   99E3         END;
 3473   99E6    (*#E#*)
 3474   99E6       IF Status = (..) THEN
 3475   99FC          Pass1(Status, TargetFile, LogFile);
 3476   9A10    (*#B#*)
 3477   9A10       IF test((.0,16,17.)) THEN
 3478   9A2A         BEGIN
 3479   9A2F          write(TestOut, 'Link-MAIN-2   '); TSTstat(Status); TSTln
 3480   9A6D         END;
 3481   9A70    (*#E#*)
 3482   9A70       IF Status = (..) THEN
 3483   9A86          Pass2(Status, TargetFile, LogFile);
 3484   9A9A    (*#B#*)
 3485   9A9A       IF test((.0,16,17.)) THEN
 3486   9AB4         BEGIN
 3487   9AB9          write(TestOut, 'Link-MAIN-3   '); TSTstat(Status); TSTln
 3488   9AF7         END;
 3489   9AFA    (*#E#*)
 3490   9AFA       IF Status = (..) THEN
 3491   9B10         BEGIN
 3492   9B15          writeln(output, 'LINK -- Normal termination')
 3493   9B4B         END
 3494   9B4E       ELSE
 3495   9B51         BEGIN
 3496   9B56          writeln(output, 'LINK -- Abnormal termination.');
 3497   9B92    
 3498   9B92          IF BadOption IN Status THEN
 3499   9BA7             writeln(output, 'Bad option');
 3500   9BD0          IF BadLogFileName IN Status THEN
 3501   9BE5             writeln(output, 'Bad log file name');
 3502   9C15          IF BadTargetFileName IN Status THEN
 3503   9C2A             writeln(output, 'Bad target file name');
 3504   9C5D          IF BadFileName IN Status THEN
 3505   9C72             writeln(output, 'Bad file name');
 3506   9C9E          IF NoSuchFile IN Status THEN
 3507   9CB3             writeln(output, 'No such file');
 3508   9CDE          IF NoInputFiles IN Status THEN
 3509   9CF3             writeln(output, 'No input files');
 3510   9D20          IF ExtraText IN Status THEN
 3511   9D35             writeln(output, 'Extra text');
 3512   9D5E          IF BadFileFormat IN Status THEN
 3513   9D73             writeln(output, 'Bad file format');
 3514   9DA1          IF BadModuleFormat IN Status THEN
 3515   9DB6             writeln(output, 'Bad module format');
 3516   9DE6          IF UnexpectedEof IN Status THEN
 3517   9DFB             writeln(output, 'Unexpected EOF');
 3518   9E28          IF RangeError IN Status THEN
 3519   9E3D             writeln(output, 'Range error');
 3520   9E67          IF BadSymbolName IN Status THEN
 3521   9E7C             writeln(output, 'Bad symbol name');
 3522   9EAA          IF DuplicateModuleName IN Status THEN
 3523   9EBF             writeln(output, 'Duplicate module name');
 3524   9EF3          IF DuplicateExportSymbol IN Status THEN
 3525   9F08             writeln(output, 'Duplicate export symbol');
 3526   9F3E          IF NoInput IN Status THEN
 3527   9F53             writeln(output, 'No input');
 3528   9F7A          IF Baddibit IN Status THEN
 3529   9F8F             writeln(output, 'Bad dibit');
 3530   9FB7          IF BadRelocationCode IN Status THEN
 3531   9FCC             writeln(output, 'Bad relocation code');
 3532   9FFE          IF BadImportCode IN Status THEN
 3533   A013             writeln(output, 'Bad import code');
 3534   A041          IF NameTableOverFlow IN Status THEN
 3535   A056             writeln(output, 'Name table overflow');
 3536   A088          IF ModuleTableOverFlow IN Status THEN
 3537   A09D             writeln(output, 'Module table overflow');
 3538   A0D1          IF SectionTableOverFlow IN Status THEN
 3539   A0E6             writeln(output, 'Section table overflow');
 3540   A11B          IF FileNameTableOverFlow IN Status THEN
 3541   A130             writeln(output, 'File name table overflow');
 3542   A167          IF SymbolTableOverFlow IN Status THEN
 3543   A17C             writeln(output, 'Symbol table overflow');
 3544   A1B0          IF ExternalImportTableOverFlow IN Status THEN
 3545   A1C5             writeln(output, 'External import table overflow');
 3546   A202    
 3547   A202          IF not (NoTarget IN Status) THEN
 3548   A217             erase(TargetFile.F);
 3549   A223         END
 3550   A223      END. 
«eof»