|
|
DataMuseum.dkPresents historical artifacts from the history of: Bogika Butler |
This is an automatic "excavation" of a thematic subset of
See our Wiki for more about Bogika Butler Excavated with: AutoArchaeologist - Free & Open Source Software. |
top - metrics - download
Length: 157184 (0x26600)
Types: TextFile
Names: »LNK.PRN«
└─⟦3d1e6965e⟧ Bits:30009789/_.ft.Ibm2.50007347.imd Mogens Pelles Zilog 80,000 / EOS projekt
└─⟦this⟧ »LNK.PRN«
└─⟦91467e717⟧ Bits:30009789/_.ft.Ibm2.50007348.imd Mogens Pelles Zilog 80,000 / EOS projekt
└─⟦this⟧ »LNK.PRN«
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 (*$I B:LNKDC0-0.pas Configuration Constants *)
21 0000 (* $I B:LNKDC0-0.pas Configuration Constants *)
22 0000
23 0000 CONST (*LINK*)
24 0000 CommandLineLength = 127;
25 0000 FileNameLength = 14;
26 0000 MaxSymbolNameIndex = 32; (*?*)
27 0000 MaxNooInputFiles = 5; (*?*)
28 0000 MaxNooModules = 10; (*?*)
29 0000 MaxNooSections = 40; (*?*)
30 0000 MaxNooSegments = 5; (*?*)
31 0000 MaxNooSymbols = 50; (*?*)
32 0000 MaxNooExternalImportSymbols = 50; (*?*)
33 0000 MaxNooInternalImportSymbols = 50; (*?*)
34 0000 MaxObjectRecordIndex = 31; (*?*)
35 0000 MaxSectorIndex = 1023;
36 0000 MaxNameTableIndex = 250; (*?*)
37 0000 MaxHeapIndex = 11; (* >= MaxNooModules + 1 *)
38 0000 OM_Format1 = 1;
39 0000 OF_Format1 = 1;
40 0000 LogFilePageSize = 65; (*First line is #1. Last line is #65*)
41 0000
42 0000
43 0000 (*$I A:PrTstCon.pas Declarations of constants for PrTst package *)
44 0000 (* $I A:PrTstCon.pas Declarations of constants for PrTst package *)
45 0000
46 0000 (* This file is part of the ProPascal test option package. Se file
47 0000 PrTst.pas for further explanations of usage
48 0000 *)
49 0000
50 0000 max_test_option_number = 31;
51 0000
52 0000
53 0000
54 0000
55 0000 TYPE (*LINK*)
56 0000
57 0000 (* General Types *)
58 0000
59 0000 i8 = 0..255;
60 0000 byte = i8;
61 0000 i16 = 0..65535;
62 0000 i32 = integer;
63 0000 i32IndexType = (bs0, bs1, bs2, bs3);
64 0000 i32ArrayType = ARRAY (.i32IndexType.) OF i8;
65 0000 CharSetType = SET OF char;
66 0000
67 0000 (* Basic Types *)
68 0000
69 0000 StatusBaseType =
70 0000 (success
71 0000 ,badfileformat
72 0000 ,badmoduleformat
73 0000 ,unexpectedeof
74 0000 ,NotFound
75 0000 ,DuplicateModuleName
76 0000 ,NameTableOverFlow
77 0000 ,ModuleTableOverFlow
78 0000 ,SectionTableOverFlow
79 0000 ,FileNameTableOverFlow
80 0000 ,SymbolTableOverFlow
81 0000 ,ExternalImportTableOverFlow
82 0000 ,InternalImportTableOverFlow
83 0000 ,ValueTableOverFlow
84 0000 ,NoSuchFile
85 0000 ,NotFinished
86 0000 ,BadLogFileName
87 0000 ,BadTargetFileName
88 0000 ,BadSymbolName
89 0000 ,NoInputFiles
90 0000 ,BadOption
91 0000 ,BadFileName
92 0000 ,DuplicateExportSymbol
93 0000 ,HeapEmpty
94 0000 ,NoInput
95 0000 ,error
96 0000 );
97 0000
98 0000 StatusType = SET OF StatusBaseType;
99 0000
100 0000 OF_FormatType = i32;
101 0000 OM_FormatType = i32;
102 0000 FileKindBaseType = (explicit, implicit, none);
103 0000 LogFileKindType = explicit..none;
104 0000 TargetFileKindType = explicit..implicit;
105 0000
106 0000 SegmentNoType = 0..MaxNooSegments;
107 0000 RelocationIndicatorType = SegmentNoType;
108 0000 FileAddressType = 0..MaxInt;
109 0000 SizeType = FileAddressType;
110 0000 ModuleSectionReferenceType = - MaxNooModules..MaxNooSections;
111 0000
112 0000 CommandLineIndexType = 0..CommandLineLength;
113 0000 CommandLineType = String(.CommandLineLength.);
114 0000
115 0000
116 0000
117 0000 SymbolNameIndexType = 0..MaxSymbolNameIndex;
118 0000 SymbolNameSubIndexType = 1..MaxSymbolNameIndex;
119 0000 SymbolNameType = RECORD
120 0000 Length: SymbolNameIndexType;
121 0000 Name: ARRAY (.SymbolNameSubIndexType.) OF i8;
122 0000 END;
123 0000 ModuleNameType = SymbolNameType;
124 0000 FileNameType = STRING(.FileNameLength.);
125 0000
126 0000 FileType = RECORD
127 0000 F: FILE OF i8; (* File systeme file *)
128 0000 P: FileAddressType (* Current file address.
129 0000 NOT defined when eof(F) = true *)
130 0000 END;
131 0000
132 0000 PageNoType = i32;
133 0000 LineNoType = 0..255;
134 0000 LogFileType = RECORD
135 0000 F: text; (* File system file *)
136 0000 P: PageNoType; (* No of page started upon *)
137 0000 L: LineNoType; (* No of line just printed within current page *)
138 0000 END;
139 0000
140 0000 (* Table Index Types *)
141 0000
142 0000 ExternalImportTableIndexType = 0..MaxNooExternalImportSymbols;
143 0000 FileNameTableIndexType = -1..MaxNooInputFiles;
144 0000 InternalImportTableIndexType = 0..MaxNooInternalImportSymbols;
145 0000 ModuleTableIndexType = 0..MaxNooModules;
146 0000 NameTableIndexType = 0..MaxNameTableIndex;
147 0000 SectionTableIndexType = 0..MaxNooSections;
148 0000 SymbolTableIndexType = 0..MaxNooSymbols;
149 0000 HeapIndexType = 0..MaxHeapIndex;
150 0000
151 0000 (* Table Sub Index Types *)
152 0000
153 0000 ExternalImportTableSubIndexType = 1..MaxNooExternalImportSymbols;
154 0000 InternalImportTableSubIndexType = 1..MaxNooInternalImportSymbols;
155 0000 ModuleTableSubIndexType = 1..MaxNooModules;
156 0000 NameTableSubIndexType = 1..MaxNameTableIndex;
157 0000 SectionTableSubIndexType = 1..MaxNooSections;
158 0000 SymbolTableSubIndexType = 1..MaxNooSymbols;
159 0000
160 0000
161 0000
162 0000 (* Table Record Types *)
163 0000
164 0000 ExternalImportTableRecordType = RECORD
165 0000 SymbolNo: SymbolTableIndexType
166 0000 END;
167 0000
168 0000 FileNameTableRecordType = FileNameType;
169 0000
170 0000 InternalImportTableRecordType = RECORD
171 0000 ModificationAddress: FileAddressType;
172 0000 SymbolIndex: ExternalImportTableIndexType
173 0000 END;
174 0000
175 0000 ModuleTableRecordType = RECORD
176 0000 ModuleNameReference: SymbolTableIndexType; (* Reference to symbol
177 0000 table entry holding
178 0000 module name*)
179 0000 FileNameReference: FileNameTableIndexType; (* *)
180 0000 CurrentFileAddress: FileAddressType; (* Offset relative to
181 0000 start of file *)
182 0000 Referenced: Boolean; (* True if module referenced *)
183 0000 NooSegments: SegmentNoType; (* Noo Segments in module *)
184 0000 NooExternalImportSymbols: ExternalImportTableIndexType;
185 0000 EITOffset: ExternalImportTableIndexType;
186 0000 SBTLinkHead: SymbolTableIndexType
187 0000 END;
188 0000
189 0000 SectionTableRecordType = RECORD
190 0000 ModuleNo: ModuleTableIndexType;
191 0000 SegmentNo: SegmentNoType;
192 0000 ImageSize,
193 0000 RldSize: FileAddressType;
194 0000 NooInternalImportSymbols: InternalImportTableIndexType;
195 0000 RelocationConstant: SizeType;
196 0000 END;
197 0000
198 0000 SymbolTableRecordType = RECORD
199 0000 Section: ModuleSectionReferenceType;
200 0000 NameReference: NameTableIndexType;
201 0000 SortLink: SymbolTableIndexType
202 0000 END;
203 0000
204 0000 ValueTableRecordType = RECORD
205 0000 Resolved: Boolean;
206 0000 Value: i32
207 0000 END;
208 0000
209 0000 (* Table Types *)
210 0000
211 0000
212 0000 ExternalImportTableType = ARRAY (.ExternalImportTableSubIndexType.) OF
213 0000 ExternalImportTableRecordType;
214 0000
215 0000 FileNameTableType = ARRAY (.FileNameTableIndexType.) OF
216 0000 FileNameTableRecordType;
217 0000
218 0000 InternalImportTableType = ARRAY (.InternalImportTableSubIndexType.) OF
219 0000 InternalImportTableRecordType;
220 0000
221 0000 ModuleTableType = ARRAY (.ModuleTableSubIndexType.) OF
222 0000 ModuleTableRecordType;
223 0000
224 0000 OptionTableType = RECORD
225 0000 LogFileKind: LogFileKindType;
226 0000 TargetFileKind: TargetFileKindType
227 0000 END;
228 0000
229 0000 NameTableType = ARRAY (.NameTableSubIndexType.) OF i8;
230 0000
231 0000 SectionTableType = ARRAY (.SectionTableSubIndexType.) OF
232 0000 SectionTableRecordType;
233 0000
234 0000 SymbolTableType = ARRAY (.SymbolTableSubIndexType.) OF
235 0000 SymbolTableRecordType;
236 0000
237 0000 ValueTableType = ARRAY (.SymbolTableSubIndexType.) OF
238 0000 ValueTableRecordType;
239 0000
240 0000
241 0000 (* Other major data structures *)
242 0000
243 0000 HeapType = ARRAY (.ModuleTableIndexType.) OF SymbolTableIndexType;
244 0000
245 0000
246 0000
247 0000 ObjectRecordKindType = (OFF_Kind,
248 0000 OMF_Kind,
249 0000 OMH_Kind,
250 0000 SGD_Kind,
251 0000 EXP_Kind,
252 0000 EXI_Kind,
253 0000 IMG_Kind,
254 0000 RLD_Kind,
255 0000 INI_Kind,
256 0000 SYM_Kind,
257 0000 IndexableKind
258 0000 );
259 0000
260 0000 ObjectRecordIndexType = 0..MaxObjectRecordIndex;
261 0000
262 0000 ObjectRecordType = RECORD
263 0000 CASE ObjectRecordKind: ObjectRecordKindType OF
264 0000 OFF_Kind:
265 0000 (OF_Format: OF_FormatType);
266 0000 OMF_Kind:
267 0000 (OM_Format: OM_FormatType);
268 0000 OMH_Kind:
269 0000 (OMH_Module
270 0000 ,OMH_NooSegments
271 0000 ,OMH_NooExportSymbols
272 0000 ,OMH_NooExtImportSymbols
273 0000 : i32
274 0000 ;OMH_ModuleName
275 0000 : ModuleNameType
276 0000 );
277 0000 SGD_Kind:
278 0000 (SGD_Image
279 0000 ,SGD_Rld
280 0000 ,SGD_IntImport
281 0000 ,SGD_NooIntImportSymbols: i32
282 0000 );
283 0000 EXP_Kind:
284 0000 (EXP_RelocationIndicator: RelocationIndicatorType
285 0000 ;EXP_Item: i32
286 0000 ;EXP_SymbolName: SymbolNameType
287 0000 );
288 0000 EXI_Kind:
289 0000 (EXI_SymbolName: SymbolNameType
290 0000 );
291 0000 IMG_Kind:
292 0000 (IMG_SectionImageUnit: i8
293 0000 );
294 0000 RLD_Kind:
295 0000 (RLD_RelocationIndicator: RelocationIndicatorType
296 0000 );
297 0000 INI_Kind:
298 0000 (INI_ModificationAddress: FileAddressType
299 0000 ;INI_SymbolIndex: ExternalImportTableIndexType
300 0000 );
301 0000 SYM_Kind:
302 0000 (SYM_SymbolName: SymbolNameType
303 0000 );
304 0000 IndexableKind:
305 0000 (N: ARRAY (.ObjectRecordIndexType.) OF i8)
306 0000 END; (*RECORD CASE*)
307 0000
308 0000 (*$I A:PrTstTyp.pas Declarations of types for PrTst package *)
309 0000 (* $I A:PrTstTyp.pas Declarations of types for PrTst package *)
310 0000
311 0000 (* This file is part of the ProPascal test option package. Se file
312 0000 PrTst.pas for further explanations of usage
313 0000 *)
314 0000
315 0000 test_option_type = 0..max_test_option_number;
316 0000 test_option_set_type = SET OF test_option_type;
317 0000
318 0000
319 0000
320 0000
321 0000 COMMON (*LINK*)
322 0000
323 0000 (* Permanent Tables *)
324 0000
325 0000 OptionTable: OptionTableType;
326 0000
327 0000 FileNameTable: FilenameTableType;
328 0000 CurFileNo: FileNameTableIndexType;
329 0000
330 0000 ModuleTable: ModuleTableType;
331 0000 CurModuleNo: ModuleTableIndexType;
332 0000 TargetModuleNo: ModuleTableIndexType;
333 0000
334 0000 SectionTable: SectionTableType;
335 0000 SCTOffset: SectionTableIndexType;
336 0000 TargetSectionOffset: SectionTableIndexType;
337 0000 CurSegmentCount: SegmentNoType;
338 0000
339 0000
340 0000 ValueTable: ValueTableType;
341 0000 CurValueNo: SymbolTableIndexType; (*?*)
342 0000
343 0000 ExternalImportTable: ExternalImportTableType;
344 0000 CurExternalImportSymbolNo: ExternalImportTableIndexType;
345 0000
346 0000 (*$I A:PrTstCom.pas Declarations of global variables for PrTst package *)
347 0000 (* $I A:PrTstCom.pas Declarations of global variables for PrTst package *)
348 0000
349 0000 (* This file is part of the ProPascal test option package. Se file
350 0000 PrTst.pas for further explanations of usage
351 0000 *)
352 0000
353 0000 test_options: test_option_set_type;
354 0000 test_out: text;
355 0000 test_global: boolean;
356 0000
357 0000
358 0000
359 0000
360 0000 VAR (*LINK*)
361 0000
362 0000 (* Misc. Variables *)
363 0000
364 0000 Status: StatusType;
365 0000 StatusInx: StatusBaseType;
366 0000 TargetFile: FileType;
367 0000 LogFile: LogFileType;
368 0000
369 0000 (*$I A:PrTstExt.pas External Decl. of standard test procedures *)
370 0000 (* $I A:ProTstExt.pas Declarations of external procedures for ProTst package *)
371 0000
372 0000 (* This file is part of the ProPascal test option package. Se file
373 0000 ProTst.pas for further explanations of usage
374 0000 *)
375 0000
376 0000 FUNCTION test(list: test_option_set_type
377 0000 ): boolean; EXTERNAL;
378 0000
379 0000 PROCEDURE test_init(VAR in_file,
380 0000 out_file: text
381 0000 ); EXTERNAL;
382 0000
383 0000
384 0000 (* $I B:LnkDC1.pas External Decl. of global test output primitives *)
385 0000 (*$I B:LnkDF1.pas Globall test output primitives *)
386 0000 (*
387 0000 SEGMENT LnkDF1X;
388 0000 *)
389 0000 (* Segment LnkDF1X defines the test output primitives used for debugging
390 0000 program link and its associated subroutines and functions. The
391 0000 corresponding external declarations should be found in file
392 0000 'LnkDC1.pas'.
393 0000 *)
394 0000
395 0000 (* $I B:lnkDC0.pas Declarations of global constants, types, and commons *)
396 0000
397 0000 FUNCTION memavail: integer; EXTERNAL;
398 0000
399 0000 PROCEDURE TSTasc(N: i8
400 0000 );
401 0000
402 0000 BEGIN (*TSTASC*)
403 0000 IF (31 < N) and (N < 127) THEN
404 0024 write(TestOut, chr(N) )
405 003D ELSE
406 0042 write(TestOut, '+')
407 005A END; (*TSTASC*)
408 0063
409 0063 PROCEDURE TSThex(N: i8
410 0063 );
411 0063
412 0063 VAR
413 0063 Nibble: i8;
414 0063
415 0063 BEGIN (*TSTHEX*)
416 0063 Nibble := N div 16;
417 0082 IF Nibble < 10 THEN
418 008B write(TestOut, chr( ord('0') + Nibble ) )
419 00AB ELSE
420 00B0 write(TestOut, chr( ord('A') - 10 + Nibble ) );
421 00D3 Nibble := N mod 16;
422 00E4 IF Nibble < 10 THEN
423 00ED write(TestOut, chr( ord('0') + Nibble ) )
424 010D ELSE
425 0112 write(TestOut, chr( ord('A') - 10 + Nibble ) )
426 0132 END; (*TSTHEX*)
427 013B
428 013B PROCEDURE TSTbool(A: boolean
429 013B );
430 013B
431 013B BEGIN (*TSTBOOL*)
432 013B IF A THEN
433 014E write(TestOut, 'T')
434 0166 ELSE
435 016B write(TestOut, 'F')
436 0183 END; (*TSTBOOL*)
437 018C
438 018C PROCEDURE TSTindt;
439 018C
440 018C BEGIN (*TSTindt*)
441 018C write(TestOut, ' ':3)
442 01AC END; (*TSTindt*)
443 01B5
444 01B5 PROCEDURE TSTln;
445 01B5
446 01B5 BEGIN (*TSTln*)
447 01B5 writeln(TestOut)
448 01CC END; (*TSTln*)
449 01D5
450 01D5 PROCEDURE TSTsymbol(S: SymbolNameType
451 01D5 );
452 01D5
453 01D5 VAR
454 01D5 I: SymbolNameIndexType;
455 01D5
456 01D5 BEGIN (*TSTSYMBOL*)
457 01D5 WITH S DO
458 01F7 BEGIN
459 01FC write(TestOut, 'SYMBOLÆ', Length:1, 'Å=');
460 0242 FOR I := 1 TO Length DO
461 025B TSTasc(Name(.I.));
462 0281 TSTln;
463 0289 END
464 0289 END; (*TSTSYMBOL*)
465 028F
466 028F PROCEDURE TSTstat(Status: StatusType
467 028F );
468 028F
469 028F VAR
470 028F Inx: StatusBaseType;
471 028F
472 028F BEGIN (*TSTstat*)
473 028F write(TestOut, 'STAT=(');
474 02BC IF Status = (..) THEN
475 02D5 write(TestOut, 'SUCCESS)' )
476 02F9 ELSE
477 02FF BEGIN
478 0304 FOR Inx := succ(Success) TO Error DO
479 0315 IF Inx IN Status THEN
480 032C write(TestOut, ' ', ord(Inx):1);
481 0360 write(TestOut, ' )');
482 0381 END
483 0381 END; (*TSTstat*)
484 0387
485 0387 PROCEDURE TSTmem;
486 0387
487 0387 BEGIN (*TSTmem*)
488 0387 write(TestOut, 'MEMAVAIL=', memavail:1)
489 03BF END; (*TSTmem*)
490 03C8
491 03C8 PROCEDURE TSTfpos(VAR Fl: FileType
492 03C8 );
493 03C8
494 03C8 BEGIN (*TSTfpos*)
495 03C8 write(TestOut, 'FPOS=',
496 03F1 (*Fl.S:1, '/',*)
497 03F1 Fl.P:1)
498 0404 END; (*TSTfpos*)
499 040D
500 040D PROCEDURE TSTeit(Inx: ExternalImportTableIndexType
501 040D );
502 040D
503 040D BEGIN (*TSTeit*)
504 040D WITH ExternalImportTable(.Inx.) DO
505 042E writeln(TestOut, 'EITÆ', Inx:1, '/', CurExternalImportSymbolNo:1,
506 0479 'Å=(SblNo=', SymbolNo:1, ')' )
507 04AD END; (*TSTeit*)
508 04B6
509 04B6 PROCEDURE TSTfnt(Inx: FileNameTableIndexType
510 04B6 );
511 04B6
512 04B6 BEGIN (*TSTfnt*)
513 04B6 writeln(TestOut, 'FNTÆ', Inx:1, '/', CurFileNo:1,
514 0509 'Å=(FlNm=', FileNameTable(.inx.), ')' )
515 0544 END; (*TSTfnt*)
516 054D
517 054D PROCEDURE TSTheap(Heap: HeapType
518 054D ;HeapMax: ModuleTableIndexType
519 054D );
520 054D
521 054D VAR
522 054D I: ModuleTableIndexType;
523 054D
524 054D BEGIN (*TSTHEAP*)
525 054D TSTindt; TSTindt; TSTindt;
526 0578 write(TestOut, 'HeapÆ',HeapMax:2,'Å=(' );
527 05BD FOR I := 1 TO HeapMax + 1 DO
528 05E3 write(TestOut, Heap(.I.):2, ' ':1);
529 0629 writeln(TestOut, ')');
530 0644 END; (*TSTHEAP*)
531 064A
532 064A PROCEDURE TSTiit(Inx: InternalImportTableIndexType
533 064A );
534 064A
535 064A BEGIN (*TSTiit*)
536 064A END; (*TSTiit*)
537 0658
538 0658 PROCEDURE TSTmdt(Inx: ModuleTableIndexType
539 0658 );
540 0658
541 0658 BEGIN (*TST*)
542 0658 WITH moduleTable(.Inx.) DO
543 067F BEGIN
544 0684 write(TestOut, 'MDTÆ', Inx:1, '/', CurModuleNo:1,
545 06CF 'Å=(MdNm#=', ModuleNameReference:1, ' ':2
546 06FD ,'Fn#=', FileNameReference:1, ' ':2
547 072D ,'CurFlAddr=', CurrentFileAddress:1, ' ':2
548 0760 ,'Refd='
549 076E );
550 077B TSTbool(Referenced);
551 0792 TSTln;
552 079A TSTindt; TSTindt; TSTindt;
553 07A8 writeln(TestOut ,'#Sgm=', NooSegments:1, ' ':2
554 07E5 ,'#EIsbl=', NooExternalImportSymbols:1, ' ':2
555 081B ,'EIT#=', EITOffset:1, ' ':2
556 084F ,'SBTLH=', SBTlinkHead:1
557 087B ,')'
558 0881 );
559 088D END
560 088D END; (*TST*)
561 0893
562 0893 PROCEDURE TSTopt;
563 0893
564 0893 BEGIN (*TSTopt*)
565 0893 writeln(TestOut, 'OPT=(LogKind=', ord(OptionTable.LogFileKind):1, ' ':2
566 08D6 ,'TargetKind=', ord(OptionTable.TargetFileKind):1
567 08FD ,')' )
568 090C END; (*TSTopt*)
569 0915
570 0915 PROCEDURE TSTsct(Inx: SectionTableIndexType
571 0915 );
572 0915
573 0915 BEGIN (*TSTsct*)
574 0915 WITH SectionTable(.Inx.) DO
575 093C BEGIN
576 0941 writeln(TestOut, 'SCT=Æ', Inx:1, '/', SCTOffset:1, '/', CurSegmentCount:1
577 09A1 ,'Å=(Mdl#=', ModuleNo:1, ' ':2
578 09D4 ,'Sgm#=', SegmentNo:1
579 09FC ,'#IISbl=', NooInternalImportSymbols:1
580 0A29 );
581 0A32 writeln(TestOut, ' ImSz=', ImageSize, ' ':2
582 0A72 ,'RlSz=', RldSize, ' ':2
583 0AA2 ,'RlConst=', RelocationConstant
584 0ABD ,')'
585 0AD2 );
586 0ADE END
587 0ADE END; (*TSTsct*)
588 0AE4
589 0AE4 PROCEDURE TSTvlt(Inx: SymbolTableIndexType
590 0AE4 );
591 0AE4
592 0AE4 BEGIN (*TSTvlt*)
593 0AE4 WITH ValueTable(.Inx.) DO
594 0B0B BEGIN
595 0B10 write(TestOut, 'VLTÆ',Inx:1,'Å=(Resolved='); TSTbool(Resolved);
596 0B6B write(TestOut, ' Value=', Value:1)
597 0BA1 END
598 0BA4 END; (*TSTvlt*)
599 0BAA
600 0BAA
601 0BAA
602 0BAA (* BEGIN (*LNKTST*)
603 0BAA (* END. (*LNKTST*)
604 0BAA
605 0BAA
606 0BAA (* $I B:LnkDC2.pas External Decl. of global access primitives *)
607 0BAA (*$I B:LnkDF2.pas Global access primitives *)
608 0BAA (******************************************************************************)
609 0BAA (* *)
610 0BAA (* Copyright (1985) by Metanic Aps., Denmark *)
611 0BAA (* *)
612 0BAA (* Author: Lars Gregers Jakobsen. *)
613 0BAA (* *)
614 0BAA (******************************************************************************)
615 0BAA (*
616 0BAA SEGMENT LnkDF2X;
617 0BAA *)
618 0BAA (* Segment LnkDF2X holds the access primitives used by the
619 0BAA linker to access input and output files. *)
620 0BAA
621 0BAA (* On resetting (FILRST) the File sector number 0 (zero) is brought
622 0BAA into F^ and sector number (S) is initialized to 0 (zero). The file
623 0BAA pointer (P) is initialized to 0 too and it always points to the next
624 0BAA byte to be read. If a read operation causes the file pointer to
625 0BAA exceed maxsectorindex and no end of file condition exists a new
626 0BAA sector will be fetched (renew) and P will be updated accordingly.
627 0BAA If an end of file condition exists it will persist throughout
628 0BAA (thus identifiable) and P will be set to 0 (zero). *)
629 0BAA
630 0BAA
631 0BAA
632 0BAA (* $I B:lnkDC0.pas Declarations of global constants, types, and commons *)
633 0BAA (* $I A:PrTstExt.pas External Decl. of standard test procedures *)
634 0BAA (* $I B:LnkDC1.pas External Decl. of global test output primitives *)
635 0BAA
636 0BAA (*$I B:LNKDF8.PAS Object file access primitives *)
637 0BAA PROCEDURE FilAsg(VAR Fl: FileType
638 0BAA ;Fn: FileNameType
639 0BAA );
640 0BAA
641 0BAA BEGIN (*FILASG*)
642 0BAA IF test((.0,1.)) THEN
643 0BC8 writeln(TestOut, 'FILasg FlNm=', Fn);
644 0C05 assign(Fl.F, Fn)
645 0C22 END; (*FILASG*)
646 0C28
647 0C28 PROCEDURE FilRst(VAR Status: StatusType
648 0C28 ;VAR Fl: FileType
649 0C28 );
650 0C28
651 0C28 BEGIN (*FILRST*)
652 0C28 WITH Fl DO
653 0C41 BEGIN
654 0C46 P := 0;
655 0C57 reset(F);
656 0C6A IF eof(F) THEN
657 0C80 Status := Status + (.UnExpectedEof.);
658 0CA4 IF test((.0,1.)) THEN
659 0CBA BEGIN
660 0CBF write(TestOut, 'FILrst'); TSTstat(Status); TSTln;
661 0CFB END;
662 0CFB END
663 0CFB END; (*FILRST*)
664 0D01
665 0D01 PROCEDURE FilRwt(VAR Fl: FileType
666 0D01 );
667 0D01
668 0D01 BEGIN (*FILRWT*)
669 0D01 IF test((.0,1.)) THEN
670 0D1F writeln(TestOut, 'FILrwt');
671 0D44 WITH Fl DO
672 0D55 BEGIN
673 0D5A rewrite(F);
674 0D67 P := 0;
675 0D7E END
676 0D7E END; (*FILRWT*)
677 0D84
678 0D84 PROCEDURE FilCls(VAR Fl: FileType
679 0D84 );
680 0D84
681 0D84 BEGIN (*FILCLS*)
682 0D84 close(Fl.F);
683 0D9F END; (*FILCLS*)
684 0DA5
685 0DA5 PROCEDURE FilSeek(VAR Status: StatusType
686 0DA5 ;VAR Fl: FileType
687 0DA5 ; Position: FileAddressType
688 0DA5 );
689 0DA5
690 0DA5 BEGIN (*FILSEEK*)
691 0DA5 WITH Fl DO
692 0DBE BEGIN
693 0DC3 P := Position;
694 0DD5 seek(F, Position);
695 0DEE IF eof(F) THEN
696 0E04 Status := Status + (.UnExpectedEof.);
697 0E28 IF test((.0,1,2.)) THEN
698 0E3F BEGIN
699 0E44 write(TestOut, 'FILSEEK '); TSTstat(Status); TSTindt;
700 0E83 write(TestOut, 'P=', P:1
701 0EAE , ' EOF='); TSTbool(eof(F));
702 0EE4 TSTln;
703 0EEC END;
704 0EEC END
705 0EEC END; (*FILSEEK*)
706 0EF2
707 0EF2 PROCEDURE FGi8(VAR Status: StatusType
708 0EF2 ;VAR Fl: FileType
709 0EF2 ;VAR V: i8
710 0EF2 );
711 0EF2
712 0EF2 BEGIN (*FGI8*)
713 0EF2 WITH Fl DO
714 0F0B BEGIN
715 0F10 IF not eof(F) THEN
716 0F22 BEGIN
717 0F27 read(F,V);
718 0F50 P := P + 1;
719 0F72 END
720 0F72 ELSE
721 0F74 Status := Status + (.UnexpectedEof.);
722 0F98 IF test((.0,2.)) THEN
723 0FAF BEGIN
724 0FB4 write(TestOut, 'FGI8 '); TSTstat(Status); TSTindt;
725 0FF3 write(TestOut, 'P=', P:1,' V=', V:1, ' EOF='); TSTbool(eof(F));
726 1071 TSTln;
727 1079 END;
728 1079 END;
729 1079 END; (*FGI8*)
730 107F
731 107F PROCEDURE FGi32(VAR Status: StatusType
732 107F ;VAR Fl: FileType
733 107F ;VAR V: i32
734 107F );
735 107F
736 107F VAR
737 107F I: I32IndexType;
738 107F N: I32ArrayType;
739 107F
740 107F BEGIN (*FGI32*)
741 107F WITH Fl DO
742 1098 BEGIN
743 109D P := P + 4;
744 10C1 FOR I := bs0 TO bs3 DO
745 10D2 IF not eof(f) THEN
746 10EB read(F, N(.I.) )
747 111C ELSE
748 1122 Status := Status + (.UnexpectedEof.);
749 1150 move(N, V, 4);
750 1169 IF test((.0,2.)) THEN
751 1180 BEGIN
752 1185 write(TestOut, 'FGI32 '); TSTstat(Status); TSTindt;
753 11C4 write(TestOut, 'P=', P:1,' V=', V:1,
754 1216 ' N=(',N(.bs3.):3,'/',N(.bs2.):3
755 1248 ,'/',N(.bs1.):3,'/',N(.bs0.):3,') EOF=');
756 1294 TSTbool(eof(F)); TSTln;
757 12B1 END;
758 12B1 END;
759 12B1 END; (*FGI32*)
760 12B7
761 12B7 PROCEDURE FGSym(VAR Status: StatusType
762 12B7 ;VAR Fl: FileType
763 12B7 ;VAR SymbolName: SymbolNameType
764 12B7 );
765 12B7
766 12B7 VAR
767 12B7 I: i8;
768 12B7 N: i8;
769 12B7
770 12B7 BEGIN (*FGSYM*)
771 12B7 WITH Fl, SymbolName DO
772 12DC BEGIN
773 12E1 IF test((.0,2.)) THEN
774 12F8 BEGIN
775 12FD write(TestOut, 'FGSYM-1 '); TSTstat(Status); TSTindt;
776 133C write(TestOut, 'P=', P:1, ' F^=',F^:3, ' EOF=');
777 13B0 TSTbool(eof(F)); TSTln
778 13CA END;
779 13CD IF not eof(F) THEN
780 13E6 BEGIN
781 13EB read(F, N);
782 140E P := P + 1 + N;
783 143D IF (0 < N) and (N <= MaxSymbolNameIndex) THEN
784 145B BEGIN
785 1460 Length := N;
786 1478 FOR I := 1 TO N DO
787 148F IF not eof(F) THEN
788 14A8 read(F, Name(.I.) )
789 14E1 ELSE
790 14E7 Status := Status + (.UnexpectedEof.)
791 14FD END
792 1515 ELSE
793 1518 BEGIN
794 151D Status := Status + (.BadSymbolName.);
795 1544 FOR I := 1 TO N DO
796 155A IF not eof(F) THEN
797 1573 read(F, Name(.1.) )
798 159A ELSE
799 15A0 Status := Status + (.UnexpectedEof.)
800 15B6 END
801 15CE END
802 15CE ELSE
803 15D0 Status := Status + (.UnexpectedEof.);
804 15F4 IF test((.0,2.)) THEN
805 160A BEGIN
806 160F write(TestOut, 'FGSYM-2 '); TSTstat(Status); TSTindt;
807 164E TSTsymbol(SymbolName);
808 165D END;
809 165D END
810 165D END; (*FGSYM*)
811 1663
812 1663 PROCEDURE FPi8(VAR Fl: FileType
813 1663 ; V: i8
814 1663 );
815 1663
816 1663 BEGIN (*FPI8*)
817 1663 WITH Fl DO
818 167C BEGIN
819 1681 IF test((.0,3.)) THEN
820 1697 BEGIN
821 169C writeln(TestOut, 'FPI8 ', 'P=', P:1,' V=', V:1);
822 1705 END;
823 1705 write(F,V);
824 172A P := P + 1
825 1743 END
826 174C END; (*FPI8*)
827 1752
828 1752 PROCEDURE FPi32(VAR Fl: FileType
829 1752 ; V: i32
830 1752 );
831 1752
832 1752 VAR
833 1752 I: I32IndexType;
834 1752 N: I32ArrayType;
835 1752
836 1752 BEGIN (*FPI32*)
837 1752 move(V, N, 4);
838 1774 WITH Fl DO
839 1785 BEGIN
840 178A IF test((.0,3.)) THEN
841 17A1 BEGIN
842 17A6 writeln(TestOut, 'FPI32 ', 'P=', P:1,' V=', V:1,
843 1809 ' N=(',N(.bs3.):3,'/',N(.bs2.):3
844 183B ,'/',N(.bs1.):3,'/',N(.bs0.):3,')');
845 187D END;
846 187D P := P + 4;
847 18A7 FOR I := bs0 TO bs3 DO
848 18B8 write(F, N(.I.) )
849 18E9 END
850 18F6 END; (*FPI32*)
851 18FC
852 18FC PROCEDURE FPSym(VAR Fl: FileType
853 18FC ; SymbolName: SymbolNameType
854 18FC );
855 18FC
856 18FC VAR
857 18FC I: SymbolNameIndexType;
858 18FC
859 18FC BEGIN (*FPSYM*)
860 18FC WITH Fl, SymbolName DO
861 192A BEGIN
862 192F IF test((.0,3.)) THEN
863 1946 BEGIN
864 194B write(TestOut, 'FPSYM-2 '); TSTstat(Status); TSTindt;
865 1988 write(TestOut, 'P=', P:1); TSTindt; TSTsymbol(SymbolName);
866 19CA END;
867 19CA P := P + 1 + Length;
868 19FA write(F, Length);
869 1A23 FOR I := 1 TO Length DO
870 1A3C write(F, Name(.I.) )
871 1A6E END
872 1A7B END; (*FPSYM*)
873 1A81
874 1A81 (*$I B:LNKDF7.PAS Log file access primitives *)
875 1A81 (******************************************************************************)
876 1A81 (* *)
877 1A81 (* Copyright (1985) by Metanic Aps., Denmark *)
878 1A81 (* *)
879 1A81 (* Author: Lars Gregers Jakobsen. *)
880 1A81 (* *)
881 1A81 (******************************************************************************)
882 1A81
883 1A81 (* This file holds the access primitives for writing the log file*)
884 1A81
885 1A81 PROCEDURE WriteSymbolName(VAR F: text
886 1A81 ; SymbolName: SymbolNameType
887 1A81 ; FieldSize: i8
888 1A81 );
889 1A81
890 1A81 VAR
891 1A81 I: SymbolNameIndexType;
892 1A81 N: i8;
893 1A81
894 1A81 BEGIN (*WRITESYMBOLNAME*)
895 1A81 WITH SymbolName DO
896 1AA3 BEGIN
897 1AA8 IF Length < FieldSize THEN
898 1AC0 N := Length
899 1AC5 ELSE
900 1AD1 N := FieldSize;
901 1ADC FOR I := 1 TO N DO
902 1AFE IF Name(.I.) in (.32..127.) THEN
903 1B31 write(F, chr(Name(.I.)) );
904 1B6E FOR I := N+1 TO FieldSize DO
905 1B93 write(F, ' ');
906 1BBF END
907 1BBF END; (*WRITESYMBOLNAME*)
908 1BC5
909 1BC5 PROCEDURE LogInit(VAR LogFile: LogFileType
910 1BC5 ; FileName: FileNameType
911 1BC5 );
912 1BC5
913 1BC5 BEGIN (*LOGINIT*)
914 1BC5 WITH LogFile DO
915 1BDE BEGIN
916 1BE3 assign(F, FileName);
917 1BFA rewrite(F);
918 1C0D P := 0;
919 1C24 L := LogFilePageSize;
920 1C35 END
921 1C35 END; (*LOGINIT*)
922 1C3B
923 1C3B PROCEDURE LogTerm(VAR LogFile: LogFileType
924 1C3B );
925 1C3B
926 1C3B BEGIN (*LOGTERM*)
927 1C3B WITH LogFile DO
928 1C54 BEGIN
929 1C59 close(F);
930 1C66 END
931 1C66 END; (*LOGTERM*)
932 1C6C
933 1C6C FUNCTION LogFF(VAR LogFile: LogFileType
934 1C6C ; Delta: LineNoType
935 1C6C ): boolean;
936 1C6C
937 1C6C CONST
938 1C6C LogFFDelta = 5;
939 1C6C
940 1C6C BEGIN (*LOGFF*)
941 1C6C WITH LogFile DO
942 1C85 IF L > LogFilePageSize - Delta THEN
943 1CAE BEGIN
944 1CB3 LogFF := true;
945 1CBC P := P + 1;
946 1CDB L := LogFFDelta;
947 1CEC page(F);
948 1CFF writeln(F);
949 1D18 writeln(F);
950 1D31 writeln(F, ' ':10, 'LINKER for unnamed project. '
951 1D6F , 'Butler has neither clock nor calender. '
952 1DA3 , 'PAGE # ', P:2);
953 1DD7 writeln(F);
954 1DF0 writeln(F);
955 1E09 END
956 1E09 ELSE
957 1E0B LogFF := false;
958 1E14 END; (*LOGFF*)
959 1E1D
960 1E1D PROCEDURE LogCmd(VAR LogFile: LogFileType
961 1E1D ; CommandLine: CommandLineType
962 1E1D );
963 1E1D
964 1E1D CONST Delta = 3;
965 1E1D
966 1E1D BEGIN (*LOGCMD*)
967 1E1D IF OptionTable.LogFileKind <> none THEN
968 1E32 BEGIN
969 1E37 IF LogFF(LogFile, Delta) THEN BEGIN END;
970 1E4C WITH LogFile DO
971 1E5D BEGIN
972 1E62 writeln(F, ' ':10, 'AKTIVERINGSKOMMANDO: ');
973 1EA6 writeln(F, ' ':10, CommandLine);
974 1ED8 writeln(F)
975 1EEE END
976 1EF1 END
977 1EF1 END; (*LOGCMD*)
978 1EF7
979 1EF7 PROCEDURE LogHSsgd(VAR LogFile: LogFileType
980 1EF7 );
981 1EF7
982 1EF7 BEGIN (*LOGHSSGD*)
983 1EF7 IF OptionTable.LogFileKind <> none THEN
984 1F0C WITH LogFile DO
985 1F1D BEGIN
986 1F22 L := L + 2;
987 1F43 writeln(F, ' ':10, 'SEGM STARTADR. STØRRELSE MODUL'
988 1F86 (* , ' ':25, 'FIL' *)
989 1F86 );
990 1F93 writeln(F);
991 1FAC END
992 1FAC END; (*LOGHSSGD*)
993 1FB2
994 1FB2 PROCEDURE LogHsgd(VAR LogFile: LogFileType
995 1FB2 );
996 1FB2
997 1FB2 BEGIN (*LOGHSGD*)
998 1FB2 IF OptionTable.LogFileKind <> none THEN
999 1FC7 BEGIN
1000 1FCC IF LogFF(LogFile, 6) THEN BEGIN END;
1001 1FE1 WITH LogFile DO
1002 1FF2 BEGIN
1003 1FF7 L := L + 3;
1004 2018 writeln(F);
1005 2031 writeln(F, ' ':10, 'LOKALISERINGSPLAN:');
1006 2072 writeln(F);
1007 208B END;
1008 208B LogHSsgd(LogFile);
1009 209A END;
1010 209A END; (*LOGHSGD*)
1011 20A0
1012 20A0 PROCEDURE LogSGD(VAR LogFile: LogFileType
1013 20A0 ; SegmentNo: RelocationIndicatorType
1014 20A0 ; StartAddress: SizeType
1015 20A0 ; Size: SizeType
1016 20A0 ; ModuleName: SymbolNameType
1017 20A0 );
1018 20A0
1019 20A0 BEGIN (*LOGSGD*)
1020 20A0 IF OptionTable.LogFileKind <> none THEN
1021 20CA BEGIN
1022 20CF IF LogFF(LogFile, 1) THEN
1023 20E4 LogHSsgd(LogFile);
1024 20F3 WITH LogFile DO
1025 2104 BEGIN
1026 2109 L := L + 1;
1027 2127 write(F, ' ':10, SegmentNo:3
1028 2151 , ' ':2, StartAddress:9
1029 2166 , ' ':2, Size:9
1030 217B , ' ':3
1031 2184 );
1032 218D WriteSymbolName(F, ModuleName, 24);
1033 21A7 writeln(F);
1034 21C0 END;
1035 21C0 END
1036 21C0 END; (*LOGSGD*)
1037 21C6
1038 21C6 PROCEDURE LogHSxp(VAR LogFile: LogFileType
1039 21C6 );
1040 21C6
1041 21C6 BEGIN (*LOGHSXP*)
1042 21C6 IF OptionTable.LogFileKind <> none THEN
1043 21DB WITH LogFile DO
1044 21EC BEGIN
1045 21F1 L := L + 2;
1046 2212 writeln(F, ' ':10, 'SEGM VÆRDI MODUL SYMBOL');
1047 225E writeln(F);
1048 2277 END
1049 2277 END; (*LOGHSXP*)
1050 227D
1051 227D PROCEDURE LogHxpN(VAR LogFile: LogFileType
1052 227D );
1053 227D
1054 227D BEGIN (*LOGHXPN*)
1055 227D IF OptionTable.LogFileKind <> none THEN
1056 2292 BEGIN
1057 2297 IF LogFF(LogFile, 6) THEN BEGIN END;
1058 22AC WITH LogFile DO
1059 22BD BEGIN
1060 22C2 L := L + 3;
1061 22E3 writeln(F);
1062 22FC writeln(F, ' ':10, 'EXPORTEREDE SYMBOLER (NAVNEORDEN):');
1063 234D writeln(F);
1064 2366 END;
1065 2366 LogHSxp(LogFile);
1066 2375 END
1067 2375 END; (*LOGHXPN*)
1068 237B
1069 237B PROCEDURE LogHxpV(VAR LogFile: LogFileType
1070 237B );
1071 237B
1072 237B BEGIN (*LOGHXPV*)
1073 237B IF OptionTable.LogFileKind <> none THEN
1074 2390 BEGIN
1075 2395 IF LogFF(LogFile, 6) THEN BEGIN END;
1076 23AA WITH LogFile DO
1077 23BB BEGIN
1078 23C0 L := L + 3;
1079 23E1 writeln(F);
1080 23FA writeln(F, ' ':10, 'EXPORTEREDE SYMBOLER (VÆRDIORDEN):');
1081 244B writeln(F);
1082 2464 END;
1083 2464 LogHSxp(LogFile);
1084 2473 END
1085 2473 END; (*LOGHXPV*)
1086 2479
1087 2479 PROCEDURE LogXP(VAR LogFile: LogFileType
1088 2479 ; SegmentNo: RelocationIndicatorType
1089 2479 ; Value: i32
1090 2479 ; SymbolName: SymbolNameType
1091 2479 ; ModuleName: ModuleNameType
1092 2479 );
1093 2479
1094 2479 BEGIN (*LOGXP*)
1095 2479 IF OptionTable.LogFileKind <> none THEN
1096 24B8 BEGIN
1097 24BD IF LogFF(LogFile,1) THEN
1098 24D2 LogHSxp(LogFile);
1099 24E1 WITH LogFile DO
1100 24F2 BEGIN
1101 24F7 L := L + 1;
1102 2515 write(F, ' ':10, SegmentNo:3
1103 253F , ' ':2, Value:9
1104 2554 , ' ':2
1105 255D );
1106 2566 WriteSymbolName(F, ModuleName, 20);
1107 2580 write(F, ' ':2);
1108 25A2 WriteSymbolName(F, SymbolName, 20);
1109 25BC writeln(F);
1110 25D5 END
1111 25D5 END
1112 25D5 END; (*LOGXP*)
1113 25DB
1114 25DB PROCEDURE LogHSurs(VAR LogFile: LogFileType
1115 25DB );
1116 25DB
1117 25DB BEGIN (*LOGHSURS*)
1118 25DB IF OptionTable.LogFileKind <> none THEN
1119 25F0 BEGIN
1120 25F5 WITH LogFile DO
1121 2606 BEGIN
1122 260B L := L + 2;
1123 262C writeln(F, ' ':10, 'MODUL SYMBOL');
1124 2668 writeln(F);
1125 2681 END
1126 2681 END
1127 2681 END; (*LOGHSURS*)
1128 2687
1129 2687 PROCEDURE LogHurs(VAR LogFile: LogFileType
1130 2687 );
1131 2687
1132 2687 BEGIN (*LOGHURS*)
1133 2687 IF OptionTable.LogFileKind <> none THEN
1134 269C BEGIN
1135 26A1 IF LogFF(LogFile, 6)THEN BEGIN END;
1136 26B6 WITH LogFile DO
1137 26C7 BEGIN
1138 26CC L := L + 3;
1139 26ED writeln(F);
1140 2706 writeln(F, ' ':10, 'UTILFREDSSTILLEDE REFERENCER:');
1141 2752 writeln(F);
1142 276B END;
1143 276B LogHSurs(LogFile);
1144 277A END
1145 277A END; (*LOGHURS*)
1146 2780
1147 2780 PROCEDURE LogURS(VAR LogFile: LogFileType
1148 2780 ; ModuleName: ModuleNameType
1149 2780 ; SymbolName: SymbolNameType
1150 2780 );
1151 2780
1152 2780 BEGIN (*LOGURS*)
1153 2780 IF OptionTable.LogFileKind <> none THEN
1154 27BF BEGIN
1155 27C4 IF LogFF(LogFile, 1) THEN
1156 27D9 LogHSurs(LogFile);
1157 27E8 WITH LogFile DO
1158 27F9 BEGIN
1159 27FE L := L + 1;
1160 281C write(F, ' ':10);
1161 283E WriteSymbolName(F, ModuleName, 20);
1162 2858 write(F, ' ':2);
1163 287A WriteSymbolName(F, SymbolName, 20);
1164 2894 writeln(F);
1165 28AD END
1166 28AD END
1167 28AD END; (*LOGURS*)
1168 28B3
1169 28B3 PROCEDURE LogHSdds(VAR LogFile: LogFileType
1170 28B3 );
1171 28B3
1172 28B3 BEGIN (*LOGHSDDS*)
1173 28B3 IF OptionTable.LogFileKind <> none THEN
1174 28C8 WITH LogFile DO
1175 28D9 BEGIN
1176 28DE L := L + 2;
1177 28FF writeln(F, ' ':10, 'MODUL SEGM VÆRDI SYMBOL');
1178 294A writeln(F);
1179 2963 END;
1180 2963 END; (*LOGHSDDS*)
1181 2969
1182 2969 PROCEDURE LogHdds(VAR LogFfle: LogFileType
1183 2969 );
1184 2969
1185 2969 BEGIN (*LOGHDDS*)
1186 2969 IF OptionTable.LogFileKind <> none THEN
1187 297E BEGIN
1188 2983 IF LogFF(LogFile, 5) THEN BEGIN END;
1189 2995 WITH LogFile DO
1190 299A BEGIN
1191 299F L := L + 2;
1192 29B4 writeln(F);
1193 29C6 writeln(F, ' ':10, 'Dobbeltdefinerede symboler:');
1194 2A09 END;
1195 2A09 LogHSdds(LogFile);
1196 2A15 END
1197 2A15 END; (*LOGHDDS*)
1198 2A1B
1199 2A1B PROCEDURE LogDDS(VAR LogFile: LogFileType
1200 2A1B ; ModuleNo: ModuleTableIndexType
1201 2A1B ; RelocationIndicator: RelocationIndicatorType
1202 2A1B ; Value: i32
1203 2A1B ; SymbolName: SymbolNameType
1204 2A1B );
1205 2A1B
1206 2A1B BEGIN (*LOGDDS*)
1207 2A1B IF OptionTable.LogFileKind <> none THEN
1208 2A45 BEGIN
1209 2A4A IF LogFF(LogFile, 1) THEN
1210 2A5F LogHSdds(LogFile);
1211 2A6E WITH LogFile DO
1212 2A7F BEGIN
1213 2A84 L := L + 1;
1214 2AA2 write(F, ' ':10, ' ':1, ModuleNo:3
1215 2AD5 , ' ':4, ord(RelocationIndicator):2
1216 2AEF , ' ':3, Value:9
1217 2B04 , ' ':1
1218 2B0D );
1219 2B16 WriteSymbolName(F, SymbolName, 40);
1220 2B30 writeln(F);
1221 2B49 END;
1222 2B49 END
1223 2B49 END; (*LOGDDS*)
1224 2B4F
1225 2B4F PROCEDURE LogOFFerror(VAR LogFile: LogFileType
1226 2B4F ; FileNo: FileNameTableIndexType
1227 2B4F );
1228 2B4F
1229 2B4F BEGIN (*LOGOFFERROR*)
1230 2B4F IF OptionTable.LogFileKind <> none THEN
1231 2B64 BEGIN
1232 2B69 IF LogFF(LogFile, 2) THEN BEGIN END;
1233 2B7E WITH LogFile DO
1234 2B8F BEGIN
1235 2B94 L := L + 2;
1236 2BB5 writeln(F, ' ':10, '*** Filformatfejl *** Fil # ', FileNo:1
1237 2C08 , ' ***'
1238 2C15 );
1239 2C22 END;
1240 2C22 END
1241 2C22 END; (*LOGOFFERROR*)
1242 2C28
1243 2C28
1244 2C28 PROCEDURE LogOMFerror(VAR LogFile: LogFileType
1245 2C28 ; FileNo: FileNameTableIndexType
1246 2C28 ; Position: FileAddressType
1247 2C28 );
1248 2C28
1249 2C28 BEGIN (*LOGOMFERROR*)
1250 2C28 IF OptionTable.LogFileKind <> none THEN
1251 2C3D BEGIN
1252 2C42 IF LogFF(LogFile, 2) THEN BEGIN END;
1253 2C57 WITH LogFile DO
1254 2C68 BEGIN
1255 2C6D L := L + 2;
1256 2C8E writeln(F, ' ':10, '*** Modulformatfejl *** Fil # ', FileNo:1
1257 2CE3 , ' *** Position # ', Position:1
1258 2D0C , ' ***'
1259 2D19 );
1260 2D26 END;
1261 2D26 END
1262 2D26 END; (*LOGOMFERROR*)
1263 2D2C
1264 2D2C PROCEDURE LogEOFerror(VAR LogFile: LogFileType
1265 2D2C ; FileNo: FileNameTableIndexType
1266 2D2C ; Position: FileAddressType
1267 2D2C );
1268 2D2C
1269 2D2C BEGIN (*LOGEOFERROR*)
1270 2D2C IF OptionTable.LogFileKind <> none THEN
1271 2D41 BEGIN
1272 2D46 IF LogFF(LogFile, 2) THEN BEGIN END;
1273 2D5B WITH LogFile DO
1274 2D6C BEGIN
1275 2D71 L := L + 2;
1276 2D92 writeln(F, ' ':10, '*** FilLængdefejl *** Fil # ', FileNo:1
1277 2DE5 , ' *** Position # ', Position:1
1278 2E0E , ' ***'
1279 2E1B );
1280 2E28 END;
1281 2E28 END
1282 2E28 END; (*LOGEOFERROR*)
1283 2E2E
1284 2E2E
1285 2E2E
1286 2E2E
1287 2E2E FUNCTION OPTLFK: LogFileKindType;
1288 2E2E
1289 2E2E BEGIN (*OPTLFK*)
1290 2E2E optlfk := OptionTable.LogFileKind;
1291 2E44 END; (*OPTLFK*)
1292 2E4A
1293 2E4A PROCEDURE FNTP(VAR Status: StatusType
1294 2E4A ; FileName: FileNameType
1295 2E4A );
1296 2E4A
1297 2E4A BEGIN (*FNTP*)
1298 2E4A IF CurFileNo < MaxNooInputFiles THEN
1299 2E62 BEGIN
1300 2E67 CurFileNo := CurFileNo + 1;
1301 2E7D FileNameTable(.CurFileNo.) := FileName;
1302 2EA7 END
1303 2EA7 ELSE
1304 2EA9 Status := Status + (.FileNameTableOverFlow.);
1305 2ECF IF test((.0,6.)) THEN
1306 2EE5 BEGIN
1307 2EEA write(TestOut, 'FNTP '); TSTstat(Status); TSTindt;
1308 2F29 TSTfnt(CurFileNo); TSTln
1309 2F38 END
1310 2F3B END; (*FNTP*)
1311 2F41
1312 2F41 PROCEDURE FNTG(VAR Status: StatusType
1313 2F41 ; Inx: FileNameTableIndexType
1314 2F41 ;VAR FileName: FileNameType
1315 2F41 );
1316 2F41
1317 2F41 BEGIN (*FNTG*)
1318 2F41 IF test((.0,6.)) THEN
1319 2F5F BEGIN
1320 2F64 write(TestOut, 'FNTG '); TSTfnt(Inx); TSTln
1321 2F96 END;
1322 2F99 FileName := FileNameTable(.Inx.);
1323 2FC5 END; (*FNTG*)
1324 2FCB
1325 2FCB PROCEDURE EITP(VAR Status: StatusType
1326 2FCB ; SymbolTableEntryNo: SymbolTableIndexType
1327 2FCB );
1328 2FCB
1329 2FCB BEGIN (*EITP*)
1330 2FCB IF CurExternalImportSymbolNo < MaxNooExternalImportSymbols THEN
1331 2FE3 BEGIN
1332 2FE8 CurExternalImportSymbolNo := CurExternalImportSymbolNo + 1;
1333 2FFE ExternalImportTable(.CurExternalImportSymbolNo
1334 3003 .).SymbolNo := SymbolTableEntryNo
1335 300E END
1336 3017 ELSE
1337 3019 Status := Status + (.ExternalImportTableOverFlow.);
1338 303F IF test((.0,7.)) THEN
1339 3055 BEGIN
1340 305A write(TestOut, 'EITP '); TSTstat(Status); TSTln;
1341 3099 TSTeit(CurExternalImportSymbolNo)
1342 30A5 END
1343 30A8 END; (*EITP*)
1344 30AE
1345 30AE (* ModuleTable *)
1346 30AE
1347 30AE PROCEDURE MDTA(VAR Status: StatusType
1348 30AE ;VAR ModuleNo: ModuleTableIndexType
1349 30AE ; ModuleCount: ModuleTableIndexType
1350 30AE );
1351 30AE
1352 30AE BEGIN (*MDTA*)
1353 30AE IF CurModuleNo > MaxNooModules - ModuleCount THEN
1354 30DD Status := Status + (.ModuleTableOverFlow.)
1355 30F3 ELSE
1356 3103 BEGIN
1357 3108 ModuleNo := CurModuleNo + 1;
1358 3124 CurModuleNo := CurModuleNo + ModuleCount;
1359 3141 END;
1360 3141 END; (*MDTA*)
1361 3147
1362 3147 (* SectionTable *)
1363 3147
1364 3147 PROCEDURE SCTA(VAR Status: StatusType
1365 3147 ;VAR SectionNo: SectionTableIndexType
1366 3147 ; SectionCount: SectionTableIndexType
1367 3147 );
1368 3147
1369 3147 BEGIN (*SCTA*)
1370 3147 IF SCTOffset > MaxNooSections - SectionCount THEN
1371 3176 Status := Status + (.SectionTableOverFlow.)
1372 318C ELSE
1373 319E BEGIN
1374 31A3 SectionNo := SCTOffset + 1;
1375 31BF SCTOffset := SCTOffset + SectionCount;
1376 31DC END
1377 31DC END; (*SCTA*)
1378 31E2
1379 31E2 PROCEDURE SCTP(VAR Status: StatusType
1380 31E2 ; P_ModuleNo: ModuleTableIndexType
1381 31E2 ; P_SegmentNo: SegmentNoType
1382 31E2 ; SGD_Record: ObjectRecordType
1383 31E2 );
1384 31E2
1385 31E2 BEGIN (*SCTP*)
1386 31E2 IF SCTOffset >= MaxNooSections THEN
1387 320F Status := Status + (.Sectiontableoverflow.)
1388 3225 ELSE
1389 3238 BEGIN
1390 323D SCTOffset := SCTOffset + 1;
1391 3253 WITH SectionTable(.SCTOffset.), SGD_Record DO
1392 326F BEGIN
1393 3274 ModuleNo := P_ModuleNo;
1394 3282 SegmentNo := P_SegmentNo;
1395 3297 ImageSize := SGD_Image;
1396 32AF RldSize := SGD_Rld;
1397 32C9 NooInternalImportSymbols := SGD_NooIntImportSymbols;
1398 32E8 RelocationConstant := 0
1399 32F3 END;
1400 3301 END;
1401 3301 IF test((.0,6.)) THEN
1402 3317 BEGIN
1403 331C write(TestOut, 'SCTP '); TSTstat(Status); TSTindt;
1404 335B TSTsct(SCTOffset);
1405 336A END
1406 336A END; (*SCTP*)
1407 3370
1408 3370 PROCEDURE SCTG(VAR Status: StatusType
1409 3370 ; SectionNo: SectionTableIndexType
1410 3370 ;VAR Section: SectionTableRecordType
1411 3370 );
1412 3370
1413 3370 BEGIN (*SCTG*)
1414 3370 Section := SectionTable(.SectionNo.)
1415 3398 END; (*SCTG*)
1416 33A4
1417 33A4 PROCEDURE SCTWB(VAR Status: StatusType
1418 33A4 ; SectionNo: SectionTableIndexType
1419 33A4 ; Section: SectionTableRecordType
1420 33A4 );
1421 33A4
1422 33A4 BEGIN (*SCTWB*)
1423 33A4 SectionTable(.SectionNo.) := Section;
1424 33E8 IF test((.0,6.)) THEN
1425 33FE BEGIN
1426 3403 write(TestOut, 'SCTWB '); TSTstat(Status); TSTln;
1427 3441 TSTindt; TSTsct(SCTOffset);
1428 3453 END
1429 3453 END; (*SCTWB*)
1430 3459
1431 3459 FUNCTION SCTGSG( SectionNo: SectionTableIndexType
1432 3459 ): RelocationIndicatorType;
1433 3459
1434 3459 BEGIN (*SCTGSG*)
1435 3459 SCTGSG := SectionTable(.SectionNo.).SegmentNo
1436 347A END; (*SCTGSG*)
1437 3488
1438 3488 FUNCTION SCTGRC( SectionNo: SectionTableIndexType
1439 3488 ): SizeType;
1440 3488
1441 3488 BEGIN (*SCTGRC*)
1442 3488 SCTGRC := SectionTable(.SectionNo.).RelocationConstant
1443 34A9 END; (*SCTGRC*)
1444 34BD
1445 34BD
1446 34BD (* BEGIN (*LNKDF2X SEGMENT*)
1447 34BD (* END. (*LNKDF2X SEGMENT*)
1448 34BD
1449 34BD
1450 34BD
1451 34BD
1452 34BD
1453 34BD (*
1454 34BD PROCEDURE Init(VAR Status: StatusType
1455 34BD ); EXTERNAL;
1456 34BD PROCEDURE SetUp(VAR Status: StatusType
1457 34BD ;VAR TargetFile: FileType
1458 34BD ;VAR LogFile: LogFileType
1459 34BD ;VAR Output: text
1460 34BD ); EXTERNAL;
1461 34BD PROCEDURE Pass1(VAR Status: StatusType
1462 34BD ); EXTERNAL;
1463 34BD PROCEDURE Pass2(VAR Status: StatusType
1464 34BD ); EXTERNAL;
1465 34BD PROCEDURE Term(VAR Status: StatusType
1466 34BD ); EXTERNAL;
1467 34BD *)
1468 34BD (*$I B:lnkinit.pas Procedures init and term *)
1469 34BD (******************************************************************************)
1470 34BD (* *)
1471 34BD (* Copyright (1985) by Metanic Aps., Denmark *)
1472 34BD (* *)
1473 34BD (* Author: Lars Gregers Jakobsen. *)
1474 34BD (* *)
1475 34BD (******************************************************************************)
1476 34BD (*
1477 34BD SEGMENT InitTerm;
1478 34BD
1479 34BD This Prospero Pascal segment holds the declarations for the init
1480 34BD and term procedures for the Metanic Linker.
1481 34BD *)
1482 34BD
1483 34BD (* $I B:lnkDC0.pas Declarations of global constants, types, and commons *)
1484 34BD
1485 34BD PROCEDURE Init(VAR Status: StatusType
1486 34BD );
1487 34BD
1488 34BD BEGIN (*INIT*)
1489 34BD Optiontable.LogFileKind := None;
1490 34CF OptionTable.TargetFileKind := Implicit;
1491 34D9
1492 34D9 CurFileNo := 0;
1493 34E3 CurModuleNo := 0;
1494 34ED SCTOffset := 0;
1495 34F7 CurSegmentCount := 0;
1496 3501 CurValueNo := 0;
1497 350B CurExternalImportSymbolNo := 0;
1498 3515 Status := (..)
1499 3521 END; (*INIT*)
1500 3532
1501 3532
1502 3532 PROCEDURE Term(VAR Status: StatusType
1503 3532 );
1504 3532
1505 3532 BEGIN (*TERM*)
1506 3532 END; (*TERM*)
1507 3540
1508 3540 (* BEGIN (*INITTERM*)
1509 3540 (* END. (*INITTERM*)
1510 3540
1511 3540
1512 3540
1513 3540
1514 3540
1515 3540
1516 3540
1517 3540
1518 3540
1519 3540 (*$I B:lnkp0.pas Procedure setup *)
1520 3540 (******************************************************************************)
1521 3540 (* *)
1522 3540 (* Copyright (1985) by Metanic Aps., Denmark *)
1523 3540 (* *)
1524 3540 (* Author: Lars Gregers Jakobsen. *)
1525 3540 (* *)
1526 3540 (******************************************************************************)
1527 3540 (*
1528 3540 SEGMENT SetUp;
1529 3540 *)
1530 3540 (*
1531 3540 This prospero Pascal segment holds the declarations for the setup
1532 3540 procedure for Metanic linker.
1533 3540 *)
1534 3540
1535 3540 (* $I B:lnkDC0.pas Declarations of global constants, types, and commons *)
1536 3540 (* $I A:PrTstExt.pas External Decl. of standard test procedures *)
1537 3540 (* $I B:LnkDC1.pas External Decl. of global test output primitives *)
1538 3540 (* $I B:LnkDC2.pas External Decl. of global access primitives *)
1539 3540
1540 3540 PROCEDURE SetUp(VAR Status: StatusType
1541 3540 ;VAR TargetFile: FileType
1542 3540 ;VAR LogFile: LogFileType
1543 3540 ;VAR Out_file: text
1544 3540 );
1545 3540
1546 3540 CONST
1547 3540 InputFileNameSuffix = 'OBJ';
1548 3543 TargetFileNameSuffix = 'OUT';
1549 3546 LogFileNameSuffix = 'MAP';
1550 3549 NilSuffix = '';
1551 3549
1552 3549 VAR
1553 3549 CommandLine: CommandLineType;
1554 3549 Ch: Char;
1555 3549 Current: CommandLineIndexType;
1556 3549 FileName: FileNameType;
1557 3549
1558 3549 PROCEDURE SkipBlanks;
1559 3549
1560 3549 BEGIN (*SKIPBLANKS*)
1561 3549 WHILE (CommandLine(.Current.) = ' ') and
1562 3572 (Current < length(CommandLine)) DO
1563 3597 Current := Current + 1;
1564 35B7 END; (*SKIPBLANKS*)
1565 35BD
1566 35BD PROCEDURE DecodeFileName(VAR Status: StatusType
1567 35BD ;VAR FileName: FileNameType
1568 35BD ; Suffix: FileNameType
1569 35BD ; Terminators: CharSetType
1570 35BD );
1571 35BD
1572 35BD VAR
1573 35BD I: CommandLineIndexType;
1574 35BD
1575 35BD BEGIN (*DECODEFILENAME*)
1576 35BD I := 0;
1577 35CE WHILE (Current + I < length(CommandLine) ) and
1578 35F8 not ( CommandLine(.Current + I.) in Terminators ) DO
1579 3639 I := I + 1;
1580 3651 IF (0 < I) and (I <= FileNameLength) THEN
1581 3674 BEGIN
1582 3679 FileName := Copy(CommandLine, Current, I);
1583 36A7 Current := Current + I;
1584 36CC IF (pos('.', FileName) = 0) THEN
1585 36E7 IF (length(FileName) <= FileNameLength - 4) THEN
1586 36FA FileName := concat(FileName, '.', Suffix)
1587 3723 ELSE
1588 372E Status := Status + (.BadFileName.)
1589 3744 END
1590 3755 ELSE
1591 3757 Status := Status + (.BadFileName.);
1592 377E IF test((.0,16,18.)) THEN
1593 3798 BEGIN
1594 379D write(TestOut, 'DecodeFileName '); TSTstat(Status);
1595 37E1 TSTindt; write(TestOut, 'Curr=', Current:1);
1596 381D TSTindt; write(TestOut, 'I=', I:1);
1597 3852 TSTindt; writeln(TestOut, 'FileName=', FileName)
1598 3889 END
1599 388C END; (*DECODEFILENAME*)
1600 3892
1601 3892
1602 3892 BEGIN (*SETUP*)
1603 3892 Getcomm(CommandLine);
1604 38AD CommandLine := concat(CommandLine, ' ');
1605 38CF Current := 1;
1606 38D8 Status := (..);
1607 38EF SkipBlanks; (*Leaving current pointing at next non blank*)
1608 38FB (*Interpret option list*)
1609 38FB IF test((.0,16,18.)) THEN
1610 3915 BEGIN
1611 391A write(TestOut, 'Setup-1 '); write(TestOut, 'Curr=', Current:1);
1612 3973 TSTindt; write(TestOut, 'Lng(ComLin)=', Length(CommandLine):1);
1613 39B0 TSTindt; TSTmem; TSTln;
1614 39BE TSTindt; writeln(TestOut, 'ComLin=', CommandLine)
1615 39F4 END;
1616 39F7 WHILE (Current < length(CommandLine)) and
1617 3A0C (CommandLine(.Current.) = '/') and
1618 3A2E (Status = (..)) DO
1619 3A4A BEGIN
1620 3A4F Current := Current + 1;
1621 3A65 CASE CommandLine(.Current.) OF
1622 3A80 'M','m':
1623 3A80 BEGIN
1624 3A85 Current := Current + 1;
1625 3A9B IF CommandLine(.Current.) = '=' THEN
1626 3AB7 BEGIN
1627 3ABC Current := Current + 1;
1628 3AD2 DecodeFileName(Status, FileNametable(.-1.)
1629 3ADE , LogFileNameSuffix, (.' ', '/', ','.) );
1630 3B06 IF Status = (..) THEN
1631 3B1E OptionTable.LogFileKind := Explicit
1632 3B23 END
1633 3B28 ELSE
1634 3B2A OptionTable.LogFileKind := Implicit
1635 3B2F END;
1636 3B37 'O','o':
1637 3B37 BEGIN
1638 3B3C Current := Current + 1;
1639 3B52 IF CommandLine(.Current.) = '=' THEN
1640 3B6E BEGIN
1641 3B73 Current := Current + 1;
1642 3B89 DecodeFileName(Status, FileNameTable(.0.)
1643 3B95 , TargetFileNameSuffix, (.' ', '/', ','.) );
1644 3BBD IF Status = (..) THEN
1645 3BD5 OptionTable.TargetFileKind := Explicit
1646 3BDA END
1647 3BDF ELSE
1648 3BE1 OptionTable.TargetFileKind := Implicit
1649 3BE6 END;
1650 3BED OTHERWISE
1651 3BED Status := Status + (.BadOption.)
1652 3C03 END; (*CASE*)
1653 3C29 IF test((.0,16,18.)) THEN
1654 3C43 BEGIN
1655 3C48 write(TestOut, 'Setup-2 '); TSTstat(Status);
1656 3C85 TSTindt; writeln(TestOut, 'Curr=', Current:1);
1657 3CBD TSTindt; TSTopt;
1658 3CC8 TSTindt; TSTfnt(-1);
1659 3CD6 TSTindt; TSTfnt(0)
1660 3CE1 END;
1661 3CE4 END; (*WHILE*)
1662 3CE7 IF Status = (..) THEN (*Interpret file list*)
1663 3D00 BEGIN
1664 3D05 SkipBlanks;
1665 3D11 IF Current < length(CommandLine) THEN
1666 3D29 Status := Status + (.NotFinished.);
1667 3D4F WHILE (Current < length(CommandLine)) and
1668 3D64 (NotFinished IN Status) DO
1669 3D85 BEGIN
1670 3D8A DecodeFileName(Status, FileName
1671 3D96 , InputFileNameSuffix, (.' ', ','.) );
1672 3DC2 IF not (BadFileName IN Status) THEN
1673 3DDD BEGIN
1674 3DE2 IF test((.0,16,18.)) THEN
1675 3DFC BEGIN
1676 3E01 write(TestOut, 'Setup-3 '); TSTstat(Status); TSTindt;
1677 3E41 write(TestOut, 'fstat(FileName)=');
1678 3E70 TSTbool(fstat(FileName)); TSTln;
1679 3E8C END;
1680 3E8C IF fstat(FileName) THEN
1681 3EA1 FNTP(Status, FileName)
1682 3EBC ELSE
1683 3EC1 Status := Status + (.NoSuchFile.);
1684 3EE7 END;
1685 3EE7 IF NotFinished IN Status THEN
1686 3F01 CASE CommandLine(.Current.) OF
1687 3F1F ' ':
1688 3F1F Status := Status - (.NotFinished.);
1689 3F47 ',':
1690 3F47 BEGIN
1691 3F4C Current := Current + 1 (*Skip the comma*)
1692 3F51 END
1693 3F62 END (*CASE CommandLine(.Current.) OF*)
1694 3F71 END (* WHILE *** DO *)
1695 3F71 END; (* IF Status = (..) -- End interpret file list *)
1696 3F74 IF CurFileNo <= 0 THEN
1697 3F85 Status := Status + (.NoInputFiles.);
1698 3FAC IF Status = (..) THEN
1699 3FC5 BEGIN
1700 3FCA FileName := copy(FileNameTable(.1.), 1, pos('.',FileNameTable(.1.)) );
1701 3FF6 IF OptionTable.LogFileKind = Implicit THEN
1702 4002 FileNameTable(.-1.) := concat(FileName, LogFileNameSuffix);
1703 4023 IF OptionTable.TargetFileKind = Implicit THEN
1704 402F FileNameTable(. 0.) := concat(FileName, TargetFileNameSuffix);
1705 4050
1706 4050 IF (OptionTable.LogFileKind <> none) and
1707 405A ( (not checkfn(FileNameTable(.-1.) ) ) or
1708 4069 (fstat(FileNameTable(.-1.) ) )
1709 4073 ) THEN
1710 407C Status := Status + (.badlogfilename.);
1711 40A3 IF (not checkfn(FileNameTable(.0.) ) ) or
1712 40B3 (fstat(FileNameTable(.0.) ) ) THEN
1713 40C3 Status := Status + (.badtargetfilename.);
1714 40EA
1715 40EA IF test((.0,16,18.)) THEN
1716 4103 BEGIN
1717 4108 write(TestOut, 'Setup-4 '); TSTstat(Status); TSTln;
1718 4148 TSTindt; TSTopt;
1719 4153 TSTindt; TSTfnt(-1);
1720 4161 TSTindt; TSTfnt(0);
1721 416F TSTindt; TSTfnt(1)
1722 417A END;
1723 417D
1724 417D IF Status = (..) THEN
1725 4195 BEGIN
1726 419A IF OptionTable.LogFileKind <> None THEN
1727 41A6 BEGIN
1728 41AB LogInit(LogFile, FileNameTable(.-1.) );
1729 41C5 LogCmd(LogFile, CommandLine);
1730 41E3 END;
1731 41E3 FilAsg(TargetFile, FileNameTable(.0.) );
1732 41FD FilRwt(TargetFile);
1733 420C END
1734 420C END
1735 420C ELSE
1736 420E BEGIN
1737 4213 writeln(out_file, CommandLine);
1738 423C writeln(out_file, '^':Current);
1739 425F END
1740 425F END; (*SETUP*)
1741 4265
1742 4265 (* BEGIN (*SETUP SEGMENT*)
1743 4265 (* END. (*SETUP SEGMENT*)
1744 4265
1745 4265 (*$I B:lnkp1.pas Procedure pass1 *)
1746 4265 (******************************************************************************)
1747 4265 (* *)
1748 4265 (* Copyright (1985) by Metanic Aps., Denmark *)
1749 4265 (* *)
1750 4265 (* Author: Lars Gregers Jakobsen. *)
1751 4265 (* *)
1752 4265 (******************************************************************************)
1753 4265 (*
1754 4265 SEGMENT pass1;
1755 4265
1756 4265 This prospero pascal segment holds the declarations for the pass1
1757 4265 procedure of the Metanic linker.
1758 4265 *)
1759 4265
1760 4265 (* $I B:lnkDC0.pas Declarations of global constants, types, and commons *)
1761 4265 (* $I A:PrTstExt.pas External Decl. of standard test procedures *)
1762 4265 (* $I B:LnkDC1.pas External Decl. of global test output primitives *)
1763 4265 (* $I B:LnkDC2.pas External Decl. of global access primitives *)
1764 4265
1765 4265 PROCEDURE Pass1(VAR Status: StatusType
1766 4265 ;VAR TargetFile: FileType
1767 4265 ;VAR LogFile: LogFileType
1768 4265 );
1769 4265
1770 4265 (* Pass1 of the linker performs the gathering of export and
1771 4265 import information from the input files as well as calculation
1772 4265 of final memory map and all operations on the symbol table
1773 4265 including reporting to the log file.
1774 4265 The following statusvalues may be returned:
1775 4265 Success: ok. All other parameters meaningful.
1776 4265
1777 4265 *)
1778 4265
1779 4265
1780 4265 VAR
1781 4265 SymbolTable: SymbolTableType;
1782 4265 LatestInsert: SymbolTableIndexType;
1783 4265 CurrentSymbolCount: SymbolTableIndexType;
1784 4265 CurrentUrsCount: integer; (* Count of unresolved symbols*)
1785 4265
1786 4265 NameTable: NameTableType;
1787 4265 CurrentNameTableIndex: NameTableIndexType; (*Max Index used -
1788 4265 NOT count of strings*)
1789 4265
1790 4265
1791 4265 (* MISC. VARIABLES *)
1792 4265
1793 4265 SBTSubInx: SymbolTableSubIndexType;
1794 4265
1795 4265 (*$I B:LnkDF3.pas Definitions of pass1 local test output primitives *)
1796 4265
1797 4265 PROCEDURE TSTnmt(Inx: NameTableIndexType
1798 4265 );
1799 4265
1800 4265 VAR
1801 4265 i : 0..9;
1802 4265
1803 4265 BEGIN (*TSTnmt*)
1804 4265 write(TestOut, 'NMTÆ', inx:1
1805 4296 , ';../', CurrentNameTableIndex:1,'Å=(' );
1806 42D3 FOR i := 0 TO 7 DO
1807 42E4 TSTasc( NameTable(. Inx+i .) );
1808 4316 write(TestOut, '/');
1809 4331 TSThex( NameTable(. Inx .) );
1810 434C FOR i := 1 TO 7 DO
1811 435D BEGIN
1812 4362 write(TestOut, '-');
1813 437D TSThex( NameTable(. Inx+i .) )
1814 43A2 END;
1815 43AF writeln(TestOut, ')' )
1816 43C7 END; (*TSTnmt*)
1817 43D0
1818 43D0 PROCEDURE TSTsbt(Inx: SymbolTableIndexType
1819 43D0 );
1820 43D0
1821 43D0 BEGIN (*TSTsbt*)
1822 43D0 WITH SymbolTable(.Inx.) DO
1823 43FB BEGIN
1824 4400 write(TestOut, 'SBTÆ', Inx:1
1825 442B , '/', LatestInsert:1
1826 444E , '/', CurrentSymbolCount:1
1827 4471 , '/', CurrentUrsCount:1
1828 448F , 'Å=(SectionNo=', Section:1, ' '
1829 44C4 , 'NameRef=', NameReference:1, ' '
1830 44F6 , 'SortLink=', SortLink:1, ')'
1831 452C );
1832 4538 END
1833 4538 END; (*TSTsbt*)
1834 453E
1835 453E (*$I B:LnkDF4.pas Definitions of pass1 local access primitives *)
1836 453E (******************************************************************************)
1837 453E (* *)
1838 453E (* Copyright (1985) by Metanic Aps., Denmark *)
1839 453E (* *)
1840 453E (* Author: Lars Gregers Jakobsen. *)
1841 453E (* *)
1842 453E (******************************************************************************)
1843 453E
1844 453E
1845 453E (* This include file contains the declarations for access
1846 453E procedures used by pass one.
1847 453E *)
1848 453E
1849 453E
1850 453E PROCEDURE NMTP(VAR Status: StatusType
1851 453E ;VAR NameReference: NameTableIndexType
1852 453E ; SymbolName: SymbolNameType
1853 453E );
1854 453E
1855 453E VAR
1856 453E I: SymbolNameIndexType;
1857 453E
1858 453E BEGIN (*NMTP*)
1859 453E WITH SymbolName DO
1860 4560 BEGIN
1861 4565 IF CurrentNameTableIndex + Length > MaxNameTableIndex THEN
1862 458A Status := Status + (.NameTableOverFlow.)
1863 45A0 ELSE
1864 45B1 BEGIN
1865 45B6 Namereference := CurrentNameTableIndex;
1866 45CE NameTable(.CurrentNameTableIndex.) := Length;
1867 45F2 FOR I := 1 TO Length DO
1868 460B NameTable(.CurrentNameTableIndex + I.) := Name(.I.);
1869 4652 CurrentNameTableIndex := CurrentNameTableIndex + Length + 1;
1870 4682 END;
1871 4682 IF test((.0,9.)) THEN
1872 469B BEGIN
1873 46A0 write(TestOut, 'NMTP '); TSTstat(Status); TSTindt;
1874 46DF writeln(TestOut, 'Length=', Length:1);
1875 4716 TSTindt; TSTindt; TSTindt; TSTnmt(NameReference);
1876 4736 END;
1877 4736 END
1878 4736 END; (*NMTP*)
1879 473C
1880 473C FUNCTION NMTfail( NameReference: NameTableIndexType
1881 473C ; SymbolName: SymbolNameType
1882 473C ): boolean;
1883 473C
1884 473C (* NMTfail returns one of the following values:
1885 473C FALSE: If the exact same symbolname was found in NMT - i.e.
1886 473C
1887 473C NameReference <> 0 AND
1888 473C NMT(.NameReference.) = SymbolName.Length AND
1889 473C FOR i = 1 TO length:
1890 473C NMT(.NameReference+i.) = SymbolName.Name(.i.)
1891 473C
1892 473C OR If an empty entry was found in NMT - i.e.
1893 473C
1894 473C NameReference = 0.
1895 473C
1896 473C
1897 473C TRUE: In all other cases.
1898 473C *)
1899 473C
1900 473C VAR
1901 473C I: SymbolNameIndexType;
1902 473C
1903 473C BEGIN (*NMTS*)
1904 473C WITH SymbolName DO
1905 475E BEGIN
1906 4763 IF NameReference = 0 THEN
1907 476E NMTfail := false
1908 4773 ELSE
1909 477A IF length <> NameTable(.NameReference.) THEN
1910 4796 NMTfail := true
1911 479B ELSE
1912 47A2 BEGIN
1913 47A7 I := 1;
1914 47B0 WHILE (I <= length) and
1915 47BE ( Name(.I.) = NameTable(.NameReference + I.) ) DO
1916 4800 I := I + 1;
1917 4818 NMTfail := I <= Length
1918 481D END;
1919 482F IF test((.0,9.)) THEN
1920 4848 BEGIN
1921 484D writeln(TestOut, 'NMTfail ', 'NameRef=', NameReference:1);
1922 4899 TSTindt; TSTindt; TSTindt; TSTsymbol(SymbolName);
1923 48B2 TSTindt; TSTindt; TSTindt; TSTnmt(NameReference);
1924 48CE TSTindt; TSTindt; TSTindt; write(TestOut, '(I <= Length)=');
1925 4904 TSTbool(I<=Length); TSTln;
1926 491F END;
1927 491F END
1928 491F END; (*NMTS*)
1929 4928
1930 4928 PROCEDURE NMTG( NameReference: NameTableIndexType
1931 4928 ;VAR SymbolName: SymbolNameType
1932 4928 );
1933 4928
1934 4928 VAR
1935 4928 I: SymbolNameIndexType;
1936 4928
1937 4928 BEGIN (*NMTG*)
1938 4928 WITH SymbolName DO
1939 4941 BEGIN
1940 4946 Length := NameTable(.NameReference.);
1941 4967 FOR I := 1 TO Length DO
1942 4984 Name(.I.) := NameTable(. NameReference + I .);
1943 49CA IF test((.0,9,13.)) THEN
1944 49E2 BEGIN
1945 49E7 write(TestOut, 'NMTG '); TSTindt;
1946 4A12 write(TestOut, 'NameRef=', NameReference:1); TSTindt;
1947 4A4B TSTsymbol(SymbolName);
1948 4A5A END;
1949 4A5A END
1950 4A5A END; (*NMTG*)
1951 4A60
1952 4A60 PROCEDURE Hash(VAR SymbolName: SymbolNameType
1953 4A60 ;VAR SBTInx: SymbolTableIndexType
1954 4A60 );
1955 4A60
1956 4A60 BEGIN (*HASH*)
1957 4A60 SBTInx := 1
1958 4A73 END; (*HASH*)
1959 4A7B
1960 4A7B PROCEDURE SBTS(VAR Status: StatusType
1961 4A7B ;VAR SBTInx: SymbolTableIndexType
1962 4A7B ; SymbolName: SymbolNameType
1963 4A7B );
1964 4A7B
1965 4A7B (* SBTS returns one of the following Status codes:
1966 4A7B Success: SymbolName found in SBT. SBTInx reflects
1967 4A7B SymbolName.
1968 4A7B NotFound: SymbolName NOT found in SBT. SBTInx
1969 4A7B indicates the entry into which Symbol should be
1970 4A7B registered.
1971 4A7B SymbolTableOverFlow: SymbolName NOT found in SBT.
1972 4A7B SBTInx is not valid. There
1973 4A7B is no room in SBT for further updates.
1974 4A7B
1975 4A7B Search SBT to find the Entry for SYMBOLNAME retaining the index
1976 4A7B of the first vacant record as SYMBOLTABLEENTRYNO if the search
1977 4A7B fails. Otherwise return found index. Set Status to Success or
1978 4A7B NotFound according to outcome. Set Status to SBTOverFlow if
1979 4A7B no vacant is available and symbol is not found.
1980 4A7B
1981 4A7B A SBT record is vacant if Namereference = 0.
1982 4A7B A SBT record referring to section 0 holds an absolute symbol if
1983 4A7B namreference is non zero.
1984 4A7B *)
1985 4A7B
1986 4A7B
1987 4A7B BEGIN (*SBTS*)
1988 4A7B (* Assume existence of entry in SBT with NameReference = 0 *)
1989 4A7B Hash(SymbolName, SBTInx);
1990 4AAF IF test((.0,9.)) THEN
1991 4AC7 BEGIN
1992 4ACC write(TestOut, 'SBTS-1 '); TSTstat(Status); TSTln;
1993 4B0B TSTindt; TSTindt; TSTindt; TSTsbt(SBTInx); TSTln;
1994 4B2E END;
1995 4B2E WHILE NMTfail(Symboltable(.SBTInx.).NameReference, SymbolName) DO
1996 4B68 BEGIN
1997 4B6D (* HASH NEXT TRY *)
1998 4B6D IF MaxNooSymbols <= SBTInx THEN
1999 4B84 SBTInx := 0;
2000 4B91 SBTInx := SBTInx + 1;
2001 4BB1
2002 4BB1 IF test((.0,9.)) THEN
2003 4BC9 BEGIN
2004 4BCE write(TestOut, 'SBTS-2 '); TSTstat(Status); TSTln;
2005 4C0D TSTindt; TSTindt; TSTindt; TSTsbt(SBTInx); TSTln;
2006 4C30 END;
2007 4C30
2008 4C30 END;
2009 4C33 IF SymbolTable(.SBTInx.).NameReference = 0 THEN
2010 4C59 IF CurrentSymbolCount >= MaxNooSymbols - 1 THEN
2011 4C72 Status := Status + (.SymbolTableOverFlow.)
2012 4C88 ELSE
2013 4C9A Status := Status + (.NotFound.);
2014 4CBE IF test((.0,10.)) THEN
2015 4CD6 BEGIN
2016 4CDB write(TestOut, 'SBTS-3 '); TSTstat(Status); TSTln;
2017 4D1A TSTindt; TSTindt; TSTindt; TSTsbt(SBTInx); TSTln;
2018 4D3D END;
2019 4D3D END; (*SBTS*)
2020 4D43
2021 4D43 PROCEDURE SBTEX(VAR Status: StatusType
2022 4D43 ;VAR SymbolTableEntryNo: SymbolTableIndexType
2023 4D43 ; SymbolName: SymbolNameType
2024 4D43 ; ModuleNo: ModuleTableIndexType
2025 4D43 ; SectionNo: SectionTableIndexType
2026 4D43 ; Item: i32
2027 4D43 );
2028 4D43
2029 4D43 VAR
2030 4D43 LocalNameReference: NameTableIndexType;
2031 4D43 LocalSectionNo: ModuleSectionReferenceType;
2032 4D43
2033 4D43 BEGIN (*SBTEX*)
2034 4D43 IF SectionNo = 0 THEN
2035 4D6B LocalSectionNo := - ModuleNo
2036 4D70 ELSE
2037 4D84 LocalSectionNo := SectionNo + SCTOffset;
2038 4DA1 SBTS(Status, SymbolTableEntryNo, SymbolName);
2039 4DC3 IF SymbolTableOverFlow IN Status THEN
2040 4DDD BEGIN END
2041 4DE2 ELSE IF NotFound IN Status THEN
2042 4E00 BEGIN (*Symbol is NOT in SBT and thus not resolved*)
2043 4E05 Status := Status - (.NotFound.);
2044 4E29 NMTP(Status, LocalNameReference, SymbolName);
2045 4E4C IF not (NameTableOverFlow IN Status) THEN
2046 4E67 BEGIN
2047 4E6C CurrentSymbolCount := CurrentSymbolCount + 1;
2048 4E94 WITH SymbolTable(.SymbolTableEntryNo.)
2049 4EB5 ,ValueTable(.SymbolTableEntryNo.) DO
2050 4ED9 BEGIN
2051 4EDE Section := LocalSectionNo;
2052 4EF2 NameReference := LocalNameReference;
2053 4F07 IF LatestInsert <> 0 THEN
2054 4F1B SymbolTable(.LatestInsert.).SortLink := SymbolTableEntryNo;
2055 4F50 LatestInsert := SymbolTableEntryNo;
2056 4F6B SortLink := SymbolTableEntryNo;
2057 4F85 Resolved := true;
2058 4F92 CurrentUrsCount := CurrentUrsCount - 1;
2059 4FB4 Value := Item
2060 4FBF END (*WITH ... DO*)
2061 4FC8 END
2062 4FC8 END
2063 4FC8 ELSE (* SUCCESS: Symbol is in SBT*)
2064 4FCB WITH SymbolTable(.SymbolTableEntryNo.)
2065 4FEC ,ValueTable(.SymbolTableEntryNo.) DO
2066 5010 BEGIN
2067 5015 IF Resolved THEN
2068 501E Status := Status + (.DuplicateExportSymbol.)
2069 5034 ELSE (*Symbol NOT previously resolved i.e. imported only*)
2070 5048 BEGIN
2071 504D Section := LocalSectionNo;
2072 5061 IF LatestInsert <> 0 THEN
2073 5075 SymbolTable(.LatestInsert.).SortLink := SymbolTableEntryNo;
2074 50AA LatestInsert := SymbolTableEntryNo;
2075 50C5 SortLink := SymbolTableEntryNo;
2076 50DF Resolved := true;
2077 50EC CurrentUrsCount := CurrentUrsCount - 1;
2078 510E Value := Item
2079 5119 END
2080 5122 END; (*WITH ... DO*)
2081 5122 IF test((.0,10.)) THEN
2082 513B BEGIN
2083 5140 write(TestOut, 'SBTEX '); TSTstat(Status);
2084 517C TSTindt; TSTsymbol(SymbolName);
2085 518F TSTindt; TSTindt; TSTindt; TSTsbt(SymbolTableEntryNo); TSTln;
2086 51B2 TSTindt; TSTindt; TSTindt; TSTvlt(SymbolTableEntryNo); TSTln;
2087 51D1 END;
2088 51D1 END; (*SBTEX*)
2089 51D7
2090 51D7
2091 51D7 PROCEDURE SBTIM(VAR Status: StatusType
2092 51D7 ;VAR SymbolTableEntryNo: SymbolTableIndexType
2093 51D7 ;VAR SymbolName: SymbolNameType
2094 51D7 ; ModuleNo: ModuleTableIndexType
2095 51D7 );
2096 51D7
2097 51D7 VAR
2098 51D7 LocalNameReference: NameTableIndexType;
2099 51D7
2100 51D7 BEGIN (*SBTIM*)
2101 51D7 SBTS(Status, SymbolTableEntryNo, SymbolName);
2102 5200 IF SymbolTableOverFlow IN Status THEN
2103 521A BEGIN END
2104 521F ELSE
2105 5222 BEGIN
2106 5227 IF NotFound IN Status THEN
2107 5242 BEGIN
2108 5247 Status := Status - (.NotFound.);
2109 526B NMTP(Status, LocalNameReference, SymbolName);
2110 528D IF not (NameTableOverFlow IN Status) THEN
2111 52A8 BEGIN
2112 52AD CurrentSymbolCount := CurrentSymbolCount + 1;
2113 52D5 WITH SymbolTable(.SymbolTableEntryNo.)
2114 52F6 ,ValueTable(.SymbolTableEntryNo.) DO
2115 531A BEGIN
2116 531F Section := - ModuleNo;
2117 533C NameReference := LocalNameReference;
2118 5351 SortLink := 0;
2119 5360 Resolved := false;
2120 536D CurrentUrsCount := CurrentUrsCount + 1;
2121 538F Value := 0;
2122 53A5 END
2123 53A5 END
2124 53A5 END;
2125 53A5 EITP(Status,SymbolTableEntryNo)
2126 53BC END;
2127 53BF IF test((.0,10.)) THEN
2128 53D8 BEGIN
2129 53DD write(TestOut, 'SBTIM '); TSTstat(Status); TSTln;
2130 541C TSTindt; TSTindt; TSTindt; TSTsbt(SymbolTableEntryNo); TSTln;
2131 543F TSTindt; TSTindt; TSTindt; TSTvlt(SymbolTableEntryNo); TSTln;
2132 545E END;
2133 545E END; (*SBTIM*)
2134 5464
2135 5464
2136 5464
2137 5464 (*$I B:lnkp1-1.pas getinputfiles *)
2138 5464
2139 5464 PROCEDURE GetInputFiles(VAR GStatus: StatusType
2140 5464 ;VAR LogFile: LogFileType
2141 5464 );
2142 5464
2143 5464 VAR
2144 5464 InputFile: FileType;
2145 5464 FileNo: FileNameTableIndexType;
2146 5464 Status: StatusType;
2147 5464
2148 5464 PROCEDURE ValidateFileFormat(VAR Status: StatusType
2149 5464 ;VAR F: FileType
2150 5464 ; Format: OF_FormatType
2151 5464 );
2152 5464
2153 5464 VAR
2154 5464 OFF_Format: OF_FormatType;
2155 5464
2156 5464 BEGIN (*VALIDATEFILEFORMAT*)
2157 5464 FGi32(Status, F, OFF_Format);
2158 548A IF OFF_Format <> Format THEN
2159 549E Status := Status + (.BadFileFormat.);
2160 54C2 IF test((.0,16,19.)) THEN
2161 54DC BEGIN
2162 54E1 write(TestOut, 'GetFFvalid '); TSTstat(Status); TSTindt;
2163 5524 writeln(TestOut, 'OFF_Format=', OFF_Format);
2164 555A END;
2165 555A END; (*VALIDATEFILEFORMAT*)
2166 5560
2167 5560 PROCEDURE GetModules(VAR GStatus: StatusType
2168 5560 ;VAR LogFile: LogFileType
2169 5560 ; FileNumber: FileNameTableIndexType
2170 5560 ;VAR Fl: FileType
2171 5560 ; StartAddressOfNextModule: FileAddressType
2172 5560 );
2173 5560
2174 5560 VAR
2175 5560 Status: StatusType;
2176 5560
2177 5560 PROCEDURE ValidateModuleFormat(VAR Status: StatusType
2178 5560 ;VAR F: FileType
2179 5560 ; Format: OM_FormatType
2180 5560 );
2181 5560
2182 5560 VAR
2183 5560 OMF_Format: OM_FormatType;
2184 5560
2185 5560 BEGIN (*VALIDATEMODULEFORMAT*)
2186 5560 FGi32(Status, F, OMF_Format);
2187 5586 IF OMF_Format <> Format THEN
2188 559A Status := Status + (.BadModuleFormat.);
2189 55BE IF test((.0,16,19.)) THEN
2190 55D8 BEGIN
2191 55DD write(TestOut, 'GetMFvalid '); TSTstat(Status); TSTindt;
2192 5620 writeln(TestOut, 'OMF_Format=',OMF_Format);
2193 5656 END;
2194 5656 END; (*VALIDATEMODULEFORMAT*)
2195 565C
2196 565C
2197 565C PROCEDURE GetModuleHeader(VAR GStatus: StatusType
2198 565C ;VAR LogFile: LogFileType
2199 565C ; FileNo:
2200 565C FileNameTableIndexType
2201 565C ;VAR Fl: FileType
2202 565C ;VAR StartAddressOfNextModule:
2203 565C FileAddressType
2204 565C );
2205 565C
2206 565C VAR
2207 565C Status: StatusType;
2208 565C SegmentNo: SegmentNoType;
2209 565C SymbolNo: SymbolTableIndexType;
2210 565C ModuleNo: ModuleTableIndexType;
2211 565C MdtRec: ModuleTableRecordType;
2212 565C NooExportSymbols: i32;
2213 565C
2214 565C PROCEDURE GetINX(VAR Status: StatusType
2215 565C ;VAR MdtRec: ModuleTableRecordType
2216 565C ;VAR Fl: FileType
2217 565C ;VAR StartAddressOfNextModule:
2218 565C FileAddressType
2219 565C ;VAR NooExportSymbols: i32
2220 565C );
2221 565C
2222 565C VAR
2223 565C OMH_ModuleSize: i32;
2224 565C OMH_ModuleName: ModuleNameType;
2225 565C Dummy32: i32;
2226 565C
2227 565C BEGIN (*GETINX*)
2228 565C WITH MdtRec DO
2229 5675 BEGIN
2230 567A FGi32(Status, Fl, OMH_ModuleSize);
2231 5698 StartAddressOfNextModule :=
2232 56A3 StartAddressOfNextModule + OMH_moduleSize;
2233 56BC CurrentFileAddress := StartAddressOfNextModule;
2234 56D9 Referenced := false;
2235 56EA FGi32(Status, Fl, Dummy32);
2236 5708 NooSegments := Dummy32;
2237 5727 IF NooSegments > CurSegmentCount THEN
2238 5743 CurSegmentCount := NooSegments;
2239 5759 FGi32(Status, Fl, NooExportSymbols);
2240 5776 FGi32(Status, Fl, Dummy32);
2241 5794 NooExternalImportSymbols := Dummy32;
2242 57B3 FGsym(Status, Fl, OMH_ModuleName);
2243 57D1 IF Status = (..) THEN
2244 57EA BEGIN
2245 57EF LatestInsert := 0;
2246 5801 SBTEX(Status, ModuleNameReference, OMH_ModuleName,0,0,0);
2247 5831 IF not (SymbolTableOverFlow IN Status) THEN
2248 584B BEGIN
2249 5850 ValueTable(.ModuleNameReference.).Resolved := false;
2250 586F CurrentUrsCount := CurrentUrsCount + 2;
2251 5899 END;
2252 5899 IF DuplicateExportSymbol IN Status THEN
2253 58B3 Status := Status - (.DuplicateExportSymbol.) +
2254 58D3 (.DuplicateModuleName.);
2255 58E1 END
2256 58E1 END
2257 58E1 END; (*GETINX*)
2258 58E7
2259 58E7
2260 58E7 PROCEDURE GetSGDs(VAR Status: StatusType
2261 58E7 ; NooSegments: SegmentNoType
2262 58E7 ; ModuleNo: ModuleTableIndexType
2263 58E7 ;VAR Fl: FileType
2264 58E7 );
2265 58E7
2266 58E7 VAR
2267 58E7 SegmentNo: SegmentNoType;
2268 58E7 SGD_Record: ObjectRecordType;
2269 58E7
2270 58E7 BEGIN (*GETSEGMENTDESCRIPTORS*)
2271 58E7 SegmentNo := 0;
2272 58F8 WITH SGD_Record DO
2273 58FD WHILE (SegmentNo < NooSegments) and (Status = (..)) DO
2274 592A BEGIN
2275 592F SegmentNo := SegmentNo + 1;
2276 5945 FGi32(Status, Fl, SGD_Image);
2277 5963 FGi32(Status, Fl, SGD_Rld);
2278 5981 FGi32(Status, Fl, SGD_IntImport);
2279 599F FGi32(Status, Fl, SGD_NooIntImportSymbols);
2280 59BD IF Status = (..) THEN
2281 59D5 SCTP(Status, ModuleNo, SegmentNo, SGD_Record);
2282 59FA IF test((.0,16,19.)) THEN
2283 5A13 BEGIN
2284 5A18 write(TestOut, 'GetSGDs '); TSTstat(Status); TSTln
2285 5A54 END;
2286 5A57 END
2287 5A57 END; (*GETSEGMENTDESCRIPTORS*)
2288 5A60
2289 5A60 PROCEDURE GetEXP(VAR GStatus: StatusType
2290 5A60 ;VAR LogFile: LogFileType
2291 5A60 ;VAR Fl: FileType
2292 5A60 ;VAR LinkHead: SymbolTableIndexType
2293 5A60 ; ModuleNo: ModuleTableIndexType
2294 5A60 ; NooExportSymbols: i32
2295 5A60 );
2296 5A60
2297 5A60 VAR
2298 5A60 Status: StatusType;
2299 5A60 SymbolCount: i32;
2300 5A60 DuplicateCount: i32;
2301 5A60 EXP_Record: ObjectRecordType;
2302 5A60 SymbolTableEntryNo: SymbolTableIndexType; (*DUMMY*)
2303 5A60 Dummy8: i8;
2304 5A60 Dummy32: i32;
2305 5A60
2306 5A60 BEGIN (*GETEXPORTLIST*)
2307 5A60 Status := (..);
2308 5A80 LinkHead := 0;
2309 5A8D LatestInsert := 0;
2310 5A9F SymbolCount := 0;
2311 5AAE DuplicateCount := 0;
2312 5ABD IF SymbolCount < NooExportSymbols THEN
2313 5AD2 WITH EXP_Record DO
2314 5AD7 BEGIN
2315 5ADC SymbolCount := SymbolCount + 1;
2316 5AEC FGi8( Status, Fl, Dummy8);
2317 5B0B EXP_Record.EXP_RelocationIndicator := Dummy8;
2318 5B1D FGi32(Status, Fl, EXP_Record.EXP_Item);
2319 5B3C FGsym(Status, Fl, EXP_Record.EXP_SymbolName);
2320 5B5B IF Status = (..) THEN
2321 5B75 BEGIN
2322 5B7A SBTEX(Status
2323 5B7F ,LinkHead
2324 5B87 ,EXP_SymbolName
2325 5B8E ,ModuleNo
2326 5B96 ,EXP_RelocationIndicator
2327 5B9D ,EXP_Item
2328 5BA4 );
2329 5BB1 IF DuplicateExportSymbol IN Status THEN
2330 5BC9 BEGIN
2331 5BCE DuplicateCount := DuplicateCount + 1;
2332 5BDE IF DuplicateCount <= 1 THEN
2333 5BF1 LogHdds(LogFile);
2334 5C00 LogDDS(LogFile
2335 5C05 ,ModuleNo
2336 5C0C ,EXP_RelocationIndicator
2337 5C13 ,EXP_Item
2338 5C1A ,EXP_SymbolName
2339 5C20 );
2340 5C2B END
2341 5C2B END;
2342 5C2B GStatus := GStatus + Status;
2343 5C56 END;
2344 5C56 WHILE (GStatus <= (.DuplicateExportSymbol.)) and
2345 5C6F (SymbolCount < NooExportSymbols) DO
2346 5C8A BEGIN
2347 5C8F SymbolCount := SymbolCount + 1;
2348 5C9F Status := (..);
2349 5CB7 FGi8( Status, Fl, Dummy8);
2350 5CD6 EXP_Record.EXP_RelocationIndicator := Dummy8;
2351 5CE8 FGi32(Status, Fl, EXP_Record.EXP_Item);
2352 5D07 FGsym(Status, Fl, EXP_Record.EXP_SymbolName);
2353 5D26 IF Status = (..) THEN
2354 5D40 WITH EXP_Record DO
2355 5D45 BEGIN
2356 5D4A SBTEX(Status
2357 5D4F ,SymbolTableEntryNo
2358 5D57 ,EXP_SymbolName
2359 5D5F ,ModuleNo
2360 5D67 ,EXP_RelocationIndicator
2361 5D6E ,EXP_Item
2362 5D75 );
2363 5D82 IF DuplicateExportSymbol IN Status THEN
2364 5D9A BEGIN
2365 5D9F DuplicateCount := DuplicateCount + 1;
2366 5DAF IF DuplicateCount <= 1 THEN
2367 5DC2 LogHdds(LogFile);
2368 5DD1 LogDDS(LogFile
2369 5DD6 ,ModuleNo
2370 5DDD ,EXP_RelocationIndicator
2371 5DE4 ,EXP_Item
2372 5DEB ,EXP_SymbolName
2373 5DF1 );
2374 5DFC END
2375 5DFC END;
2376 5DFC GStatus := GStatus + Status
2377 5E12 END; (*WHILE ... DO*)
2378 5E2A END; (*GETEXPORTLIST*)
2379 5E30
2380 5E30 PROCEDURE GetEXI(VAR Status: StatusType
2381 5E30 ;VAR Fl: FileType
2382 5E30 ; ModuleNo: ModuleTableIndexType
2383 5E30 ; NooExternalImportSymbols:
2384 5E30 ExternalImportTableIndexType
2385 5E30 );
2386 5E30
2387 5E30 VAR
2388 5E30 SymbolTableEntryNo: SymbolTableIndexType;
2389 5E30 SymbolCount: i32;
2390 5E30 EXI_SymbolName: SymbolNameType;
2391 5E30
2392 5E30 BEGIN (*GETEXTERNALIMPORTLIST*)
2393 5E30 SymbolCount := 0;
2394 5E47 WHILE (Status = (..)) and
2395 5E5D (SymbolCount < NooExternalImportSymbols) DO
2396 5E7C BEGIN
2397 5E81 SymbolCount := SymbolCount + 1;
2398 5E91 FGsym(Status, Fl, EXI_SymbolName);
2399 5EAF IF Status = (..) THEN
2400 5EC7 SBTIM(Status
2401 5ECC ,SymbolTableEntryNo
2402 5ED3 ,EXI_SymbolName
2403 5EDB ,ModuleNo
2404 5EE3 );
2405 5EF1 END; (*WHILE ... DO*)
2406 5EF4 END; (*GETEXTERNALIMPORTLIST*)
2407 5EFA
2408 5EFA
2409 5EFA
2410 5EFA BEGIN (*GETMODULEHEADER*)
2411 5EFA Status := (..);
2412 5F1A MDTA(Status, ModuleNo, 1);
2413 5F35 IF Status = (..) THEN
2414 5F4F BEGIN
2415 5F54 GetINX(Status, ModuleTable(.ModuleNo.), Fl
2416 5F76 , StartAddressOfNextModule
2417 5F7D , NooExportSymbols);
2418 5F93 IF Status = (..) THEN
2419 5FAD WITH ModuleTable(.ModuleNo.) DO
2420 5FCC BEGIN
2421 5FD1 FileNameReference := FileNo;
2422 5FE0 GetSGDs(Status
2423 5FE5 ,NooSegments
2424 5FED ,ModuleNo
2425 5FFC ,Fl
2426 6003 );
2427 600D IF Status = (..) THEN
2428 6027 BEGIN
2429 602C SymbolTable(.ModuleNameReference
2430 6031 .).Section := - ModuleNo;
2431 605F GetEXP(Status
2432 6064 ,LogFile
2433 606C ,Fl
2434 6073 ,SBTLinkHead
2435 607A ,ModuleNo
2436 6085 ,NooExportSymbols
2437 608C );
2438 6099 IF Status <= (.DuplicateExportSymbol.) THEN
2439 60B6 BEGIN
2440 60BB EITOffset := CurExternalImportSymbolNo;
2441 60D3 GetEXI(Status
2442 60D8 ,Fl
2443 60E0 ,ModuleNo
2444 60E7 ,NooExternalImportSymbols
2445 60EE );
2446 6104 END
2447 6104 END
2448 6104 END;
2449 6104 END;
2450 6104 GStatus := GStatus + Status;
2451 612F IF test((.0,6,16,19.)) THEN
2452 6148 BEGIN
2453 614D write(TestOut, 'GetOMH '); TSTstat(Status); TSTln;
2454 618D TSTindt; TSTindt; TSTindt; TSTmdt(ModuleNo);
2455 61A5 END;
2456 61A5 END; (*GETMODULEHEADER*)
2457 61AB
2458 61AB BEGIN (*GETMODULES*)
2459 61AB REPEAT
2460 61B8 Status := (..);
2461 61D0 FilSeek(Status, InputFile, StartAddressOfNextModule);
2462 61F1 IF not (UnexpectedEof IN Status) THEN
2463 620A BEGIN
2464 620F ValidateModuleFormat(Status, InputFile, OM_Format1);
2465 622F IF UnexpectedEof IN Status THEN
2466 6247 BEGIN
2467 624C LogEOFerror(LogFile, FileNumber, InputFile.P)
2468 626C END
2469 626F ELSE IF (BadModuleFormat IN Status) THEN
2470 6289 BEGIN
2471 628E LogOMFerror(LogFile, FileNumber, InputFile.P)
2472 62AE END
2473 62B1 ELSE (* Status = (..) *)
2474 62B3 GetModuleHeader(Status
2475 62B8 ,LogFile
2476 62C0 ,FileNumber
2477 62C7 ,InputFile
2478 62CE ,StartAddressOfNextModule
2479 62D6 );
2480 62E5 GStatus := GStatus + Status;
2481 6310 END
2482 6310 UNTIL Status - (.DuplicateExportSymbol, BadSymbolName.) <> (..);
2483 632F END; (*GETMODULES*)
2484 6335
2485 6335 BEGIN (*GETINPUTFILES*)
2486 6335 FOR FileNo := 1 TO CurFileNo DO
2487 6357 BEGIN
2488 635C Status := (..);
2489 6374 FilAsg(InputFile, FileNameTable(.FileNo.));
2490 63A0 FilRst(Status, InputFile);
2491 63B8 IF Status = (..) THEN
2492 63D2 BEGIN
2493 63D7 ValidateFileFormat (Status, InputFile, OF_Format1);
2494 63F7 IF Status = (..) THEN
2495 6411 GetModules(Status, LogFile, FileNo, InputFile, 4)
2496 643C ELSE IF BadFileFormat IN Status THEN
2497 645F LogOFFerror(LogFile, FileNo);
2498 6475 END;
2499 6475 IF UnexpectedEof IN Status THEN
2500 648E LogEOFerror(LogFile, FileNo, InputFile.P);
2501 64AD FilCls(InputFile);
2502 64BD GStatus := GStatus + Status;
2503 64E8 END;
2504 64F2 IF CurModuleNo <= 0 THEN
2505 6503 GStatus := GStatus + (.NoInput.);
2506 652B END; (*GETINPUTFILES*)
2507 6534
2508 6534 (*$I B:lnkp1-2.pas putmodule *)
2509 6534 PROCEDURE PutTargetFile(VAR Status: StatusType
2510 6534 ;VAR TargetFile: FileType
2511 6534 ;VAR LogFile: LogFileType
2512 6534 );
2513 6534
2514 6534 PROCEDURE PutFF(VAR Fl: FileType
2515 6534 );
2516 6534
2517 6534 BEGIN (*PUTFF*)
2518 6534 FPi32(Fl, OF_Format1);
2519 6553 END; (*OUTFF*)
2520 6559
2521 6559 PROCEDURE PutModule(VAR Status: StatusType
2522 6559 ;VAR TargetFile: FileType
2523 6559 ;VAR LogFile: LogFileType
2524 6559 );
2525 6559
2526 6559 PROCEDURE PutMF(VAR Fl: FileType
2527 6559 );
2528 6559
2529 6559 BEGIN (*PUTMF*)
2530 6559 FPi32(Fl, OM_Format1);
2531 6578 END; (*OUTMF*)
2532 657E
2533 657E PROCEDURE PutINX(VAR Status: StatusType
2534 657E ;VAR Fl: FileType
2535 657E ;VAR LogFile: LogFileType
2536 657E );
2537 657E
2538 657E VAR
2539 657E OMH_ModuleName: ModuleNameType;
2540 657E
2541 657E BEGIN (*PUTINX*)
2542 657E FPi32(Fl,0); (* OMH_Module *)
2543 659D FPi32(Fl,0); (* OMH_NooSegments *)
2544 65B4 FPi32(Fl,0); (* OMH_NooExportSymbols *)
2545 65CB FPi32(Fl,0); (* OMH_NooExtImprtSymbols *)
2546 65E2 NMTG(SymbolTable(.ModuleTable(.1.).ModuleNameReference
2547 65E7 .).NameReference
2548 65FF , OMH_ModuleName
2549 6605 );
2550 6614 FPsym(Fl, OMH_ModuleName);
2551 662B END; (*PUTINX*)
2552 6631
2553 6631 PROCEDURE PutSGDs(VAR Status: StatusType
2554 6631 ;VAR Fl: Filetype
2555 6631 ;VAR Log: LogFileType
2556 6631 );
2557 6631
2558 6631 VAR
2559 6631 SegmentNoIndex: SegmentNoType;
2560 6631 SRCinx: SectionTableIndexType;
2561 6631 DSTinx: SectionTableIndexType;
2562 6631 ModuleName: ModuleNameType;
2563 6631
2564 6631 PROCEDURE PutSGD(VAR TargetFile: FileType
2565 6631 ; Section: SectionTableRecordType
2566 6631 );
2567 6631
2568 6631 BEGIN (*PUTSGD*)
2569 6631 WITH Section DO
2570 6653 BEGIN
2571 6658 FPi32(TargetFile, ImageSize);
2572 666D FPi32(TargetFile, RldSize);
2573 6682 FPi32(TargetFile, RldSize); (***** IntImportSize !!!!!!*)
2574 6697 FPi32(TargetFile, NooInternalImportSymbols);
2575 66B1 END
2576 66B1 END; (*PUTSGD*)
2577 66B7
2578 66B7 BEGIN (*PUTSGDS*)
2579 66B7 Status := (..);
2580 66D6 SCTA(Status, TargetSectionOffset, CurSegmentCount);
2581 66F0 IF not (SectionTableOverFlow IN Status) THEN
2582 670B BEGIN
2583 6710 IF CurSegmentCount > 0 THEN
2584 6721 LogHSgd(LogFile);
2585 6734 FOR DSTinx := 1 TO CurSegmentCount DO
2586 674E WITH SectionTable(.TargetSectionOffset + DSTinx - 1.) DO
2587 6788 BEGIN
2588 678D ModuleNo := TargetModuleNo;
2589 679B SegmentNo := DSTinx;
2590 67B0 ImageSize := 0; (*TO BE UPDATED*)
2591 67C7 RldSize := 0; (*TO BE UPDATED*)
2592 67E0 NooInternalImportSymbols := 0; (*TO BE UPDATED AFTER PASS 2*)
2593 67F1 RelocationConstant := 0;
2594 680A FOR SRCinx := 1 TO TargetSectionOffset - 1 DO
2595 6831 IF SectionTable(.SRCinx.).SegmentNo = DSTinx THEN
2596 684F BEGIN
2597 6854 SectionTable(.SRCinx.).RelocationConstant := ImageSize;
2598 6883 ImageSize := ImageSize + SectionTable(.SRCinx.).ImageSize;
2599 68C0 RldSize := RldSize + SectionTable(.SRCinx.).RldSize;
2600 6903 WITH SectionTable(.SRCinx.) DO (*Log memory map element*)
2601 6922 IF ImageSize > 0 THEN
2602 693A BEGIN
2603 693F NMTG(SymbolTable(.ModuleTable(.
2604 6944 ModuleNo.).ModuleNameReference
2605 695C .).Namereference
2606 6972 ,ModuleName
2607 6978 );
2608 6987 LogSGD(LogFile
2609 698C ,DSTinx
2610 6997 ,RelocationConstant
2611 699E ,ImageSize
2612 69B0 ,ModuleName
2613 69C0 );
2614 69CB END;
2615 69CB IF test((.0,6,16,19.)) THEN
2616 69E5 BEGIN
2617 69EA write(TestOut, 'PutSGDs-1');
2618 6A12 TSTsct(SRCinx);
2619 6A21 END;
2620 6A21 END; (* FOR SRCinx := ... *)
2621 6A2B PutSGD(Fl, SectionTable(.TargetSectionOffset +
2622 6A37 DSTinx - 1.) );
2623 6A6A IF test((.0,6,16,19.)) THEN
2624 6A84 BEGIN
2625 6A89 write(TestOut, 'PutSGDs-2');
2626 6AB1 TSTsct(TargetSectionOffset + DSTinx - 1 );
2627 6ADB END;
2628 6ADB END; (* FOR DSTinx := ... *)
2629 6AE5 END; (* allocation ok *)
2630 6AE5 END; (*PUTSGDS*)
2631 6AEB
2632 6AEB PROCEDURE PutEXP(VAR Status: StatusType
2633 6AEB ;VAR Target: FileType
2634 6AEB ;VAR LogFile: LogFileType
2635 6AEB );
2636 6AEB
2637 6AEB VAR
2638 6AEB MDTInx: ModuleTableIndexType;
2639 6AEB ModuleName: ModuleNameType;
2640 6AEB Heap: HeapType;
2641 6AEB HeapMax: HeapIndexType;
2642 6AEB Winner: SymboltableIndexType;
2643 6AEB SymbolNo: SymbolTableIndexType;
2644 6AEB EXP_Record: ObjectRecordType;
2645 6AEB SbtInx: SymbolTableIndexType;
2646 6AEB
2647 6AEB FUNCTION NameSwop(VAR A
2648 6AEB , B: SymbolNameType
2649 6AEB ): boolean;
2650 6AEB
2651 6AEB VAR
2652 6AEB I: integer;
2653 6AEB
2654 6AEB BEGIN (*NAMESWOP*)
2655 6AEB I := 1;
2656 6B02 IF B.Length < A.Length THEN
2657 6B1E BEGIN
2658 6B23 WHILE (I <= B.Length) and (A.Name(.I.) >= B.Name(.I.)) DO
2659 6B8A I := I + 1;
2660 6B9D NameSwop := (I > B.Length);
2661 6BC1 END
2662 6BC1 ELSE
2663 6BC4 BEGIN
2664 6BC9 WHILE (I <= A.Length) and (A.Name(.I.) <= B.Name(.I.)) DO
2665 6C33 I := I + 1;
2666 6C46 NameSwop := not (I > A.Length);
2667 6C6A END;
2668 6C6A IF test((.0,13.)) THEN
2669 6C83 BEGIN
2670 6C88 writeln(TestOut, 'NameSwop ', 'I=', I:1);
2671 6CCB TSTindt; TSTindt; TSTindt;
2672 6CD9 write(TestOut, 'A='); TSTsymbol(A);
2673 6D04 TSTindt; TSTindt; TSTindt;
2674 6D12 write(TestOut, 'B='); TSTsymbol(B);
2675 6D3D END
2676 6D3D END; (*NAMESWOP*)
2677 6D46
2678 6D46 PROCEDURE InHeap( New: SymbolTableIndexType
2679 6D46 );
2680 6D46
2681 6D46 VAR
2682 6D46 I,J: integer;
2683 6D46 Z,V: SymbolNameType;
2684 6D46 Swop: boolean;
2685 6D46
2686 6D46 BEGIN (*INHEAP*)
2687 6D46 HeapMax := HeapMax + 1;
2688 6D6C I := HeapMax;
2689 6D7B NMTG(SymbolTable(.New.).NameReference, Z);
2690 6DAD IF I > 1 THEN
2691 6DC4 REPEAT
2692 6DC9 J := I div 2;
2693 6DE1 NMTG(SymbolTable(. Heap(.J.) .).NameReference, V);
2694 6E26 Swop := NameSwop(V,Z);
2695 6E44 IF Swop THEN
2696 6E4D BEGIN
2697 6E52 Heap(.I.) := Heap(.J.);
2698 6E90 I := J
2699 6E95 END
2700 6E9D UNTIL (I <= 1) or ( not Swop );
2701 6EBC Heap(.I.) := New;
2702 6EE3 IF test((.0,13.)) THEN
2703 6EFC BEGIN
2704 6F01 writeln(TestOut, 'InHeap New=', New:1);
2705 6F3E TSTheap(Heap, HeapMax);
2706 6F59 END;
2707 6F59 END; (*INHEAP*)
2708 6F5F
2709 6F5F PROCEDURE SelectWinner(VAR Status: StatusType
2710 6F5F );
2711 6F5F
2712 6F5F VAR
2713 6F5F I,J: integer;
2714 6F5F Swop: boolean;
2715 6F5F V,W,Z: SymbolNameType;
2716 6F5F New: SymbolTableIndexType;
2717 6F5F
2718 6F5F BEGIN (*SELECTWINNER*)
2719 6F5F IF (0 < HeapMax) THEN
2720 6F7B BEGIN
2721 6F80 Winner := Heap(.1.);
2722 6F96 WITH Symboltable(.Winner.) DO
2723 6FB6 IF SortLink <> Winner THEN
2724 6FC8 New := SortLink
2725 6FCD ELSE
2726 6FDF BEGIN (* Chain exhausted - descrease size of heap *)
2727 6FE4 New := Heap(.HeapMax.);
2728 7006 HeapMax := HeapMax - 1;
2729 7024 END;
2730 7024 I := 1;
2731 7033 IF HeapMax >= 2 THEN
2732 7047 BEGIN
2733 704C J := 2;
2734 705B Heap(.HeapMax + 1.) := New;
2735 7087 NMTG(SymbolTable(.New.).NameReference, Z);
2736 70B9 REPEAT
2737 70BE (* J <= HeapMax *)
2738 70BE
2739 70BE NMTG(SymbolTable(.Heap(. J .).).NameReference, V);
2740 7107 NMTG(SymbolTable(.Heap(.J+1.).).NameReference, W);
2741 7153 IF NameSwop(V,W) THEN
2742 716F BEGIN
2743 7174 V := W;
2744 718E J := J + 1
2745 7197 END;
2746 719E
2747 719E Swop := NameSwop(Z,V);
2748 71BC IF Swop THEN
2749 71C5 BEGIN
2750 71CA Heap(.I.) := Heap(.J.);
2751 7208 I := J;
2752 7215 J := I + I;
2753 7227 END;
2754 7227
2755 7227 IF test((.0,13.)) THEN
2756 7240 BEGIN
2757 7245 write(TestOut, 'SLCT-W-1 ', 'I=' , I:1
2758 727F , ' ':2 , 'J=' , J:1
2759 72A3 , ' ':2 , 'New=', New:1
2760 72CE , ' ':2 , 'Swop='
2761 72E5 ); TSTbool(Swop); TSTln;
2762 7304 TSTheap(Heap, HeapMax);
2763 731F END
2764 731F
2765 731F UNTIL (not Swop) or (J > HeapMax);
2766 7345 END;
2767 7345 Heap(.I.) := New;
2768 736C END
2769 736C ELSE
2770 736F Status := Status + (.HeapEmpty.);
2771 7396 IF test((.0,13,16,19.)) THEN
2772 73B0 BEGIN
2773 73B5 write(TestOut, 'SLCT-W-2 '); TSTstat(Status); TSTindt;
2774 73F4 writeln(TestOut, 'HeapMax=', HeapMax:1
2775 7427 , ' ':2, 'Winner=', Winner:1
2776 7459 );
2777 7462 END;
2778 7462 END; (*SELECTWINNER*)
2779 7468
2780 7468
2781 7468 BEGIN (*PUTEXP*)
2782 7468 IF CurrentSymbolCount > 0 THEN
2783 7489 LogHxpN(LogFile);
2784 7498
2785 7498 IF test((.0,13.)) THEN
2786 74B1 BEGIN
2787 74B6 writeln(TestOut, 'PUTEXP ');
2788 74DE FOR SbtInx := 1 TO MaxNooSymbols DO
2789 74EF WITH SymbolTable(.SbtInx.), ValueTable(.SbtInx.) DO
2790 7529 IF NameReference <> 0 THEN
2791 753A BEGIN
2792 753F TSTindt; TSTindt; TSTindt; TSTsbt(SbtInx);
2793 755B TSTindt; TSTvlt(SbtInx); TSTln;
2794 7570 END;
2795 757A END;
2796 757A
2797 757A (*Initialize selection*)
2798 757A HeapMax := 0;
2799 7583 FOR MDTInx := 1 TO TargetModuleNo - 1 DO
2800 75AA IF ModuleTable(.MDTInx
2801 75AF .).SBTLinkHead IN (.1..MaxNooSymbols.) THEN
2802 75D7 InHeap(ModuleTable(.MDTInx.).SBTLinkHead);
2803 760A
2804 760A WHILE (Status = (..)) DO
2805 7623 BEGIN
2806 7628 SelectWinner(Status);
2807 763B IF Status = (..) THEN
2808 7654 WITH SymbolTable(.Winner.), ValueTable(.Winner.),
2809 7691 EXP_Record DO
2810 7691 IF resolved THEN
2811 769B BEGIN
2812 76A0 IF (Section > 0) THEN (*relocatable*)
2813 76B7 BEGIN
2814 76BC Value := Value + SCTGRC(Section);
2815 76E9 EXP_RelocationIndicator := SCTGSG(Section);
2816 7702 END
2817 7702 ELSE (*absolute*)
2818 7705 EXP_RelocationIndicator := 0;
2819 770E EXP_Item := Value;
2820 7721 NMTG(NameReference, EXP_SymbolName);
2821 7741 FPi8(Target, EXP_RelocationIndicator);
2822 7758 FPi32(Target, EXP_Item);
2823 776D FPsym(Target, EXP_SymbolName);
2824 7784 IF (Status = (..)) and (OPTlfk <> none) THEN
2825 77AD BEGIN
2826 77B2 IF Section > 0 THEN
2827 77C9 NMTG(SymbolTable(.
2828 77CE ModuleTable(.
2829 77CE SectionTable(.Section
2830 77CE .).ModuleNo
2831 77E6 .).ModuleNameReference
2832 77F8 .).NameReference
2833 780E ,ModuleName
2834 7814 )
2835 781C ELSE
2836 7826 NMTG(SymbolTable(.
2837 782B ModuleTable(.-(Section)
2838 7831 .).ModuleNameReference
2839 784C .).NameReference
2840 7862 ,ModuleName
2841 7868 );
2842 7877 LogXP(LogFile
2843 787C ,EXP_RelocationIndicator
2844 7883 ,EXP_Item
2845 788A ,EXP_SymbolName
2846 7890 ,ModuleName
2847 7898 )
2848 78A0 END;
2849 78A3 END;
2850 78A3 END;
2851 78A6 Status := Status - (.HeapEmpty.);
2852 78CD IF (HeapEmpty IN Status) and (OPTlfk <> none) THEN
2853 78F8 BEGIN (*sort sbt/vlt by value and log*)
2854 78FD Status := (..);
2855 7914 IF CurrentSymbolCount > 0 THEN
2856 792D LogHxpV(LogFile);
2857 793C (*sort*)
2858 793C WHILE Status = (..) DO
2859 7955 BEGIN
2860 795A (*GET NEXT IN LINKED LIST*)
2861 795A IF Status = (..) THEN
2862 7973 (***********Something is wrong here!!! V V *)
2863 7973 WITH SymbolTable(.winner.), ValueTable(.winner.), EXP_Record DO
2864 79B0 LogXP(LogFile
2865 79B5 ,EXP_RelocationIndicator
2866 79BC ,EXP_Item
2867 79C3 ,EXP_SymbolName
2868 79C9 ,ModuleName
2869 79D1 )
2870 79D9 END
2871 79DC END
2872 79DF END; (*PUTEXP*)
2873 79E5
2874 79E5
2875 79E5 PROCEDURE PutEXI(VAR Status: StatusType
2876 79E5 ;VAR Target: FileType
2877 79E5 ;VAR LogFile: LogFileType
2878 79E5 );
2879 79E5
2880 79E5 VAR
2881 79E5 ModuleName: ModuleNameType;
2882 79E5 SymbolName: SymbolNameType;
2883 79E5 ExiInx: ExternalImportTableIndexType;
2884 79E5
2885 79E5 (* TargetModuleNo is a global variable *)
2886 79E5 (* CurrentUrsCount and NooExternalImportSymbols of
2887 79E5 taget module represents the same information. *)
2888 79E5
2889 79E5 BEGIN (*PUTEXI*)
2890 79E5 IF CurrentUrsCount > 0 THEN
2891 7A0D LogHurs(LogFile);
2892 7A1C WITH ModuleTable(.TargetModuleNo.) DO
2893 7A3B BEGIN
2894 7A40 NooExternalImportSymbols := 0;
2895 7A4B FOR ExiInx := 1 TO CurExternalImportSymbolNo DO
2896 7A65 WITH ExternalImportTable(.ExiInx.) DO
2897 7A7B WITH ValueTable(.SymbolNo.),
2898 7A98 SymbolTable(.SymbolNo.) DO
2899 7ABA IF not resolved THEN
2900 7ACC BEGIN
2901 7AD1 NooExternalImportSymbols :=
2902 7ADC NooExternalImportSymbols + 1;
2903 7AF9 Value := NooExternalImportSymbols;
2904 7B1A NMTG(NameReference, SymbolName);
2905 7B3A FPsym(Target, SymbolName);
2906 7B51 IF Section > 0 THEN
2907 7B68 WITH SymbolTable(.
2908 7B6D ModuleTable(.
2909 7B6D SectionTable(.Section
2910 7B6D .).ModuleNo
2911 7B85 .).ModuleNameReference
2912 7B97 .) DO
2913 7BB3 NMTG(NameReference, ModuleName)
2914 7BC6 ELSE
2915 7BD0 WITH SymbolTable(.
2916 7BD5 ModuleTable(.-(Section)
2917 7BDB .).ModuleNameReference
2918 7BF6 .) DO
2919 7C12 NMTG(NameReference, ModuleName);
2920 7C2C LogURS(LogFile, ModuleName, SymbolName);
2921 7C4B IF test((.0,16,19.)) THEN
2922 7C65 BEGIN
2923 7C6A writeln(TestOut, 'PutEXI '
2924 7C85 , 'SymbolNo=', SymbolNo:1
2925 7CB4 , ' ':2, 'Value=', Value:1);
2926 7CEB END;
2927 7CEB END
2928 7CEB
2929 7CEB
2930 7CEB END
2931 7CF5 END; (*PUTEXI*)
2932 7CFB
2933 7CFB (* TargetModuleNo is a global variable *)
2934 7CFB
2935 7CFB BEGIN (*PUTMODULE*)
2936 7CFB MDTA(Status, TargetModuleNo, 1);
2937 7D19 IF not (ModuleTableOverFlow IN Status) THEN
2938 7D34 BEGIN
2939 7D39 PutMF(TargetFile);
2940 7D48 PutINX(Status, TargetFile, LogFile);
2941 7D69 IF Status = (..) THEN
2942 7D82 BEGIN (*Calculate memory map, write sgd, and log*)
2943 7D87 PutSGDs(Status, TargetFile, LogFile);
2944 7DA8
2945 7DA8 IF not (SectionTableOverFlow IN Status) THEN
2946 7DC3 BEGIN (*Relocate symbol table, write export list, and log*)
2947 7DC8 PutEXP(Status, TargetFile, LogFile);
2948 7DE9 IF Status = (..) THEN
2949 7E02 BEGIN (*Write EXI while logging unresolved references*)
2950 7E07 PutEXI(Status, TargetFile, LogFile);
2951 7E28 END;
2952 7E28 END;
2953 7E28 END;
2954 7E28 END;
2955 7E28 END; (*PUTMODULE*)
2956 7E2E
2957 7E2E BEGIN (*PUTTARGETFILE*)
2958 7E2E PutFF(TargetFile);
2959 7E45 PutModule(Status, TargetFile, LogFile);
2960 7E66 END; (*PUTTARGETFILE*)
2961 7E6C
2962 7E6C
2963 7E6C
2964 7E6C BEGIN (*PASS1*)
2965 7E6C
2966 7E6C (* Initialize local data structures *)
2967 7E6C FOR SBTSubInx := 1 TO MaxNooSymbols DO
2968 7E87 SymbolTable(.SBTSubInx.).NameReference := 0;
2969 7EAE LatestInsert := 0;
2970 7EC0 CurrentSymbolCount := 0;
2971 7ED2 CurrentUrsCount := 0;
2972 7EEA CurrentNameTableIndex := 1;
2973 7EF3
2974 7EF3 GetInputFiles(Status, LogFile);
2975 7F1F IF Status = (..) THEN
2976 7F41 BEGIN
2977 7F46 PutTargetFile(Status, TargetFile, LogFile);
2978 7F82 END;
2979 7F82 END; (*PASS1*)
2980 7F88
2981 7F88 (* BEGIN (*PASS1 SEGMENT*)
2982 7F88 (* END. (*PASS1 SEGMENT*)
2983 7F88
2984 7F88 (*$I B:lnkp2.pas Procedure pass2 *)
2985 7F88 (******************************************************************************)
2986 7F88 (* *)
2987 7F88 (* Copyright (1985) by Metanic Aps., Denmark *)
2988 7F88 (* *)
2989 7F88 (* Author: Lars Gregers Jakobsen. *)
2990 7F88 (* *)
2991 7F88 (******************************************************************************)
2992 7F88 (*
2993 7F88 SEGMENT pass2;
2994 7F88
2995 7F88 *)
2996 7F88 PROCEDURE Pass2(Status: StatusType
2997 7F88 );
2998 7F88
2999 7F88 BEGIN (*PASS2*)
3000 7F88 END; (*PASS2*)
3001 7F96
3002 7F96 (* BEGIN (*LNKPASS2*)
3003 7F96 (* END. (*LNKPASS2*)
3004 7F96
3005 7F96
3006 7F96
3007 7F96 BEGIN (*LINK*)
3008 7F96 TestInit(Input,Output);
3009 7FAF Status := (..);
3010 7FC3 Init(Status);
3011 7FCF IF Status = (..) THEN
3012 7FE5 SetUp(Status, TargetFile, LogFile, Output);
3013 7FFD IF test((.0,16,17.)) THEN
3014 8017 BEGIN
3015 801C write(TestOut, 'Link-MAIN-1 '); TSTstat(Status); TSTindt; TSTmem; TSTln
3016 8060 END;
3017 8063 IF Status = (..) THEN
3018 8079 Pass1(Status, TargetFile, LogFile);
3019 808D IF test((.0,16,17.)) THEN
3020 80A7 BEGIN
3021 80AC write(TestOut, 'Link-MAIN-2 '); TSTstat(Status); TSTln
3022 80EA END;
3023 80ED IF Status = (..) THEN
3024 8103 Pass2(Status);
3025 8119 IF test((.0,16,17.)) THEN
3026 8133 BEGIN
3027 8138 write(TestOut, 'Link-MAIN-3 '); TSTstat(Status); TSTln
3028 8176 END;
3029 8179 IF Status = (..) THEN
3030 818F Term(Status);
3031 819B IF test((.0,16,17.)) THEN
3032 81B5 BEGIN
3033 81BA write(TestOut, 'Link-MAIN-4 '); TSTstat(Status); TSTln
3034 81F8 END;
3035 81FB IF Status = (..) THEN
3036 8211 BEGIN
3037 8216 writeln(output, 'LINK -- Normal termination')
3038 824C END
3039 824F ELSE
3040 8252 BEGIN
3041 8257 writeln(output, 'LINK -- Abnormal termination.');
3042 8293 FOR StatusInx := Success TO Error DO
3043 82A5 IF StatusInx IN Status THEN
3044 82B8 writeln(output, ' #Error: ', ord(StatusInx):3 );
3045 82FC END
3046 82FC END.
«eof»