|
|
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: 167424 (0x28e00)
Types: TextFile
Names: »LNK.PRN«
└─⟦da8d53b95⟧ Bits:30009789/_.ft.Ibm2.50006585.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 CONST
21 0000
22 0000 (*$I B:LNKDC0-0.pas Configuration Constants *)
23 0000 (******************************************************************************)
24 0000 (* *)
25 0000 (* Copyright (1985) by Metanic Aps., Denmark *)
26 0000 (* *)
27 0000 (* Author: Lars Gregers Jakobsen. *)
28 0000 (* *)
29 0000 (******************************************************************************)
30 0000
31 0000 (* $I B:LNKDC0-0.pas Configuration Constants *)
32 0000
33 0000 VersionNo = 'V0.01';
34 0005 ConfigurationNo = 'C0A CP/M';
35 000D
36 000D CommandLineLength = 127;
37 000D FileNameLength = 14;
38 000D MaxSymbolNameIndex = 2; (*?*)
39 000D MaxNooInputFiles = 2; (*?*)
40 000D MaxNooModules = 2; (*?*)
41 000D MaxNooSections = 2; (*?*)
42 000D MaxNooSegments = 3; (*?*)
43 000D MaxNooSymbols = 7; (*?*)
44 000D MaxNooExternalImportSymbols = 4; (*?*)
45 000D MaxNameTableIndex = 17; (*?*)
46 000D MaxHeapIndex = 3; (* >= MaxNooModules + 1 *)
47 000D OM_Format1 = 1;
48 000D OF_Format1 = 1;
49 000D LogFilePageSize = 65; (*First line is #1. Last line is #65*)
50 000D
51 000D (* *)
52 000D (* *)
53 000D (******************************************************************************)
54 000D
55 000D (*#B#(*$I A:PrTstCon.pas Declarations of constants for PrTst package *)
56 000D
57 000D (* Other constants *)
58 000D
59 000D UnResolved = -1; (* Value of field segmentno in VLT *)
60 000D OvrCode = 0; (* For index in bit map *)
61 000D ImageFactor = 4; (* 2 bits in bit map per 8 bits in image *)
62 000D OMF_Address = 4; (* Address of OMF in target file *)
63 000D OMH_Address = 8; (* Address of OMH in target file *)
64 000D LogMargin = 10; (* Size of blank left margin in log file *)
65 000D
66 000D TYPE (*LINK*)
67 000D
68 000D (* General Types *)
69 000D
70 000D i8 = 0..255;
71 000D i16 = 0..65535;
72 000D i32 = integer;
73 000D i32IndexType = (bs0, bs1, bs2, bs3);
74 000D i32ArrayType = ARRAY (.i32IndexType.) OF i8;
75 000D CharSetType = SET OF char;
76 000D
77 000D (* Basic Types *)
78 000D
79 000D StatusBaseType =
80 000D (Success
81 000D ,BadOption
82 000D ,BadLogFileName
83 000D ,BadTargetFileName
84 000D ,BadFileName
85 000D ,NoSuchFile
86 000D ,NoInputFiles
87 000D ,BadFileFormat
88 000D ,BadModuleFormat
89 000D ,UnexpectedEof
90 000D ,RangeError
91 000D ,BadSymbolName
92 000D ,DuplicateModuleName
93 000D ,DuplicateExportSymbol
94 000D ,NoInput
95 000D ,Baddibit
96 000D ,BadRelocationCode
97 000D ,BadImportCode
98 000D ,NameTableOverFlow
99 000D ,ModuleTableOverFlow
100 000D ,SectionTableOverFlow
101 000D ,FileNameTableOverFlow
102 000D ,SymbolTableOverFlow
103 000D ,ExternalImportTableOverFlow
104 000D ,NotFound
105 000D ,NotFinished
106 000D ,HeapEmpty
107 000D ,NoTarget
108 000D ,Error
109 000D );
110 000D
111 000D StatusType = SET OF StatusBaseType;
112 000D
113 000D OF_FormatType = i32;
114 000D OM_FormatType = i32;
115 000D FileKindBaseType = (explicit, implicit, none);
116 000D LogFileKindType = explicit..none;
117 000D TargetFileKindType = explicit..implicit;
118 000D
119 000D SegmentNoType = UnResolved..MaxNooSegments;
120 000D RelocationIndicatorType = SegmentNoType;
121 000D FileAddressType = 0..MaxInt;
122 000D
123 000D CommandLineIndexType = 0..CommandLineLength;
124 000D CommandLineType = String(.CommandLineLength.);
125 000D
126 000D SymbolNameIndexType = 0..MaxSymbolNameIndex;
127 000D SymbolNameSubIndexType = 1..MaxSymbolNameIndex;
128 000D SymbolNameType = RECORD
129 000D Length: SymbolNameIndexType;
130 000D Name: ARRAY (.SymbolNameSubIndexType.) OF i8;
131 000D END;
132 000D ModuleNameType = SymbolNameType;
133 000D FileNameType = STRING(.FileNameLength.);
134 000D
135 000D ImageUnitType = i8;
136 000D QuadImageUnitType = i32;
137 000D BasicFileType = file OF ImageUnitType;
138 000D FileType = RECORD
139 000D F: BasicFileType; (* File systeme file *)
140 000D P: FileAddressType (* Current file address.
141 000D NOT defined when eof(F) = true *)
142 000D END;
143 000D
144 000D PageNoType = i32;
145 000D LineNoType = 0..255;
146 000D LogFileType = RECORD
147 000D F: text; (* File system file *)
148 000D P: PageNoType; (* No of page started upon *)
149 000D L: LineNoType; (* No of line just printed within current page *)
150 000D END;
151 000D
152 000D (* Table Index Types *)
153 000D
154 000D ExternalImportTableIndexType = 0..MaxNooExternalImportSymbols;
155 000D FileNameTableIndexType = -1..MaxNooInputFiles;
156 000D ModuleTableIndexType = 0..MaxNooModules;
157 000D NameTableIndexType = 0..MaxNameTableIndex;
158 000D SectionTableIndexType = 0..MaxNooSections;
159 000D SymbolTableIndexType = 0..MaxNooSymbols;
160 000D HeapIndexType = 0..MaxHeapIndex;
161 000D
162 000D (* Table Sub Index Types *)
163 000D
164 000D ExternalImportTableSubIndexType = 1..MaxNooExternalImportSymbols;
165 000D ModuleTableSubIndexType = 1..MaxNooModules;
166 000D NameTableSubIndexType = 1..MaxNameTableIndex;
167 000D SectionTableSubIndexType = 1..MaxNooSections;
168 000D SymbolTableSubIndexType = 1..MaxNooSymbols;
169 000D
170 000D
171 000D
172 000D (* Table Record Types *)
173 000D
174 000D ExternalImportTableRecordType = RECORD
175 000D SymbolNo: SymbolTableIndexType
176 000D (* Points to VLT entry holding value *)
177 000D END;
178 000D
179 000D FileNameTableRecordType = FileNameType;
180 000D
181 000D ModuleTableRecordType = RECORD
182 000D ModuleNameReference: SymbolTableIndexType;
183 000D (* Points to SBT entry holding module name *)
184 000D FileNameReference: FileNameTableIndexType;
185 000D (* Points to FNT entry holding name of file *)
186 000D CurrentFileAddress: FileAddressType;
187 000D (* Offset (in octets) relative to start of file. First octet
188 000D in file is # 0 *)
189 000D Referenced: Boolean;
190 000D (* True if module referenced. Not used. *)
191 000D NooSegments: SegmentNoType;
192 000D (* Noo Segments in module *)
193 000D SCTBase: SectionTableIndexType;
194 000D (* Points to SCT entry just below the entries of this module.
195 000D Used by putEXP during relocation of exported symbols *)
196 000D NooExternalImportSymbols: ExternalImportTableIndexType;
197 000D (* Noo External import symbols in module *)
198 000D EITOffset: ExternalImportTableIndexType;
199 000D (* Points to EIT entry just below the entries of this module.
200 000D Used during pass 2 *)
201 000D SBTLinkHead: SymbolTableIndexType
202 000D (* Points to first SBT entry in ordered linked list using
203 000D sortlink as link field *)
204 000D END;
205 000D
206 000D OptionTableRecordType = RECORD
207 000D LogFileKind: LogFileKindType;
208 000D TargetFileKind: TargetFileKindType
209 000D END;
210 000D
211 000D SectionTableRecordType = RECORD
212 000D ModuleNo: ModuleTableIndexType;
213 000D (* Points to MDT entry holding module description *)
214 000D SegmentNo: SegmentNoType;
215 000D (* *)
216 000D ImageSize: FileAddressType;
217 000D (* Size of image in quadimageunits.
218 000D Size of bitmap rid in imageunits *)
219 000D OvrSize: FileAddressType;
220 000D (* Size of overrun store in octets *)
221 000D RelocationConstant: FileAddressType;
222 000D (* Amount (in octets) to offset section during relocation *)
223 000D END;
224 000D
225 000D SymbolTableRecordType = RECORD
226 000D ModuleNo: ModuleTableIndexType;
227 000D (* if symbol resolved: Points to MDT entry of exporting module.
228 000D if not : Points to MDT entry of importing module *)
229 000D NameReference: NameTableIndexType;
230 000D (* Points to first octet of name (length field) in NMT *)
231 000D SortLink: SymbolTableIndexType
232 000D (* Points to SBT entry of next symbol according to
233 000D some ordering (e.g. alphabetically) *)
234 000D END;
235 000D
236 000D ValueTableRecordType = RECORD
237 000D SegmentNo: SegmentNoType;
238 000D (* < 0 : Symbol has not been resolved.
239 000D = 0 : Symbol is absolute.
240 000D 0 < s <= MDT(SBT.ModuleNo).NooSegments:Symbol is relocatable
241 000D and field indicates number of segment. *)
242 000D Value: i32
243 000D (* if symbol resolved: Value of symbol.
244 000D if not : Points to EIT entry of the symbol in the
245 000D reduced EIT written to targetmodule *)
246 000D END;
247 000D
248 000D (* Table Types *)
249 000D
250 000D
251 000D ExternalImportTableType = ARRAY (.ExternalImportTableSubIndexType.) OF
252 000D ExternalImportTableRecordType;
253 000D
254 000D FileNameTableType = ARRAY (.FileNameTableIndexType.) OF
255 000D FileNameTableRecordType;
256 000D
257 000D ModuleTableType = ARRAY (.ModuleTableSubIndexType.) OF
258 000D ModuleTableRecordType;
259 000D
260 000D OptionTableType = OptionTableRecordType;
261 000D
262 000D NameTableType = ARRAY (.NameTableSubIndexType.) OF i8;
263 000D
264 000D SectionTableType = ARRAY (.SectionTableSubIndexType.) OF
265 000D SectionTableRecordType;
266 000D
267 000D SymbolTableType = ARRAY (.SymbolTableSubIndexType.) OF
268 000D SymbolTableRecordType;
269 000D
270 000D ValueTableType = ARRAY (.SymbolTableSubIndexType.) OF
271 000D ValueTableRecordType;
272 000D
273 000D
274 000D (* Other major data structures *)
275 000D
276 000D HeapType = ARRAY (.ModuleTableIndexType.) OF SymbolTableIndexType;
277 000D
278 000D BitMapBufferTagType = (bit, byt);
279 000D BitMapBufferType = RECORD
280 000D P: 0..16;
281 000D CASE BitMapBufferTagType OF
282 000D bit: (I: SET OF 0..15);
283 000D byt: (Y0: i8;
284 000D Y1: i8
285 000D )
286 000D END;
287 000D
288 000D BitMappedFileType = RECORD
289 000D F: BasicFileType;
290 000D B: BitMapBufferType
291 000D END;
292 000D
293 000D (*#B#(*$I A:PrTstTyp.pas Declarations of types for PrTst package *)
294 000D
295 000D
296 000D COMMON (*LINK*)
297 000D
298 000D (* Permanent Tables *)
299 000D
300 000D OptionTable: OptionTableType;
301 000D
302 000D FileNameTable: FilenameTableType;
303 000D CurFileNo: FileNameTableIndexType;
304 000D (* Points to highest entry used *)
305 000D
306 000D ModuleTable: ModuleTableType;
307 000D CurModuleNo: ModuleTableIndexType;
308 000D (* Points to highest entry used *)
309 000D TargetModuleNo: ModuleTableIndexType;
310 000D (* Points to entry of target module *)
311 000D
312 000D SectionTable: SectionTableType;
313 000D SCTOffset: SectionTableIndexType;
314 000D (* Points to highest entry used *)
315 000D TargetSectionOffset: SectionTableIndexType;
316 000D (* Points to entry just below target sections *)
317 000D CurSegmentCount: SegmentNoType;
318 000D (* Number of segments in target module *)
319 000D
320 000D ValueTable: ValueTableType;
321 000D NooExpSymbols: i32;
322 000D (* Number of EXP symbols in target module *)
323 000D
324 000D ExternalImportTable: ExternalImportTableType;
325 000D CurExternalImportSymbolNo: ExternalImportTableIndexType;
326 000D (* Points to highest entry used *)
327 000D NooExiSymbols: i32;
328 000D (* Number of EXI symbols in target module *)
329 000D
330 000D (*#B#(*$I A:PrTstCom.pas Declarations of global variables for PrTst package *)
331 000D
332 000D (* *)
333 000D (* *)
334 000D (******************************************************************************)
335 000D
336 000D
337 000D VAR (*LINK*)
338 000D
339 000D (* Misc. Variables *)
340 000D
341 000D Status: StatusType;
342 000D StatusInx: StatusBaseType;
343 000D TargetFile: FileType;
344 000D LogFile: LogFileType;
345 000D SCTSubInx: SectionTableSubIndexType;
346 000D
347 000D (*#B#(*$I A:PrTstExt.pas External Decl. of standard test procedures *)
348 000D (*#B#(*$I B:LnkDF1.pas Global test output primitives *)
349 000D (*$I B:LnkDF2.pas Global access primitives *)
350 000D (******************************************************************************)
351 000D (* *)
352 000D (* Copyright (1985) by Metanic Aps., Denmark *)
353 000D (* *)
354 000D (* Author: Lars Gregers Jakobsen. *)
355 000D (* *)
356 000D (******************************************************************************)
357 000D
358 000D (* File LnkDF2X holds the access primitives used by the
359 000D linker to access input and output files. *)
360 000D
361 000D FUNCTION OPTLFK: LogFileKindType;
362 000D
363 000D BEGIN (*OPTLFK*)
364 000D optlfk := OptionTable.LogFileKind;
365 0023 END; (*OPTLFK*)
366 0029
367 0029 PROCEDURE FNTP(VAR Status: StatusType
368 0029 ; FileName: FileNameType
369 0029 );
370 0029
371 0029 BEGIN (*FNTP*)
372 0029 IF CurFileNo < MaxNooInputFiles THEN
373 0041 BEGIN
374 0046 CurFileNo := CurFileNo + 1;
375 005C FileNameTable(.CurFileNo.) := FileName;
376 0086 END
377 0086 ELSE
378 0088 Status := Status + (.FileNameTableOverFlow.);
379 00AF (*#B#
380 00AF IF test((.0,6.)) THEN
381 00AF BEGIN
382 00AF write(TestOut, 'FNTP '); TSTstat(Status); TSTindt;
383 00AF TSTfnt(CurFileNo); TSTln
384 00AF END
385 00AF #E#*)
386 00AF END; (*FNTP*)
387 00B5
388 00B5 PROCEDURE EITP(VAR Status: StatusType
389 00B5 ; SymbolTableEntryNo: SymbolTableIndexType
390 00B5 );
391 00B5
392 00B5 BEGIN (*EITP*)
393 00B5 IF CurExternalImportSymbolNo < MaxNooExternalImportSymbols THEN
394 00CD BEGIN
395 00D2 CurExternalImportSymbolNo := CurExternalImportSymbolNo + 1;
396 00E8 ExternalImportTable(.CurExternalImportSymbolNo
397 00ED .).SymbolNo := SymbolTableEntryNo
398 00F8 END
399 0101 ELSE
400 0103 Status := Status + (.ExternalImportTableOverFlow.);
401 012A (*#B#
402 012A IF test((.0,7.)) THEN
403 012A BEGIN
404 012A write(TestOut, 'EITP '); TSTstat(Status); TSTln;
405 012A TSTeit(CurExternalImportSymbolNo)
406 012A END
407 012A #E#*)
408 012A END; (*EITP*)
409 0130
410 0130 (* ModuleTable *)
411 0130
412 0130 PROCEDURE MDTA(VAR Status: StatusType
413 0130 ;VAR ModuleNo: ModuleTableIndexType (*Points to least, vacant entry in MDT*)
414 0130 ; ModuleCount: ModuleTableIndexType
415 0130 );
416 0130
417 0130 BEGIN (*MDTA*)
418 0130 ModuleNo := CurModuleNo;
419 014C IF CurModuleNo > MaxNooModules - ModuleCount THEN
420 0173 Status := Status + (.ModuleTableOverFlow.)
421 0189 ELSE
422 019C BEGIN
423 01A1 ModuleNo := CurModuleNo + 1;
424 01BD CurModuleNo := CurModuleNo + ModuleCount;
425 01DA END;
426 01DA (*#B#
427 01DA IF test((.0,6.)) THEN
428 01DA BEGIN
429 01DA write(TestOut, 'MDTA '); TSTstat(Status); TSTindt;
430 01DA writeln(TestOut, 'ModuleNo, Count, CurModuleNo= ',
431 01DA ModuleNo:1, ' ',
432 01DA ModuleCount:1, ' ', CurModuleNo:1
433 01DA );
434 01DA END;
435 01DA #E#*)
436 01DA END; (*MDTA*)
437 01E0
438 01E0 (* SectionTable *)
439 01E0
440 01E0 PROCEDURE SCTA(VAR Status: StatusType
441 01E0 ;VAR SectionNo: SectionTableIndexType (*Points to highest, used entry in SCT*)
442 01E0 ; SectionCount: SegmentNoType
443 01E0 );
444 01E0
445 01E0 BEGIN (*SCTA*)
446 01E0 SectionNo := SCTOffset;
447 01FC IF SCTOffset > MaxNooSections - SectionCount THEN
448 0223 Status := Status + (.SectionTableOverFlow.)
449 0239 ELSE
450 024C BEGIN
451 0251 SCTOffset := SCTOffset + SectionCount;
452 026E END;
453 026E (*#B#
454 026E IF test((.0,6.)) THEN
455 026E BEGIN
456 026E write(TestOut, 'SCTA '); TSTstat(Status); TSTindt;
457 026E writeln(TestOut, 'SectionNo, Count, SCTOffset= ',
458 026E SectionNo:11, ' ', SectionCount:1, ' ',
459 026E SCTOffset:1
460 026E );
461 026E END;
462 026E #E#*)
463 026E END; (*SCTA*)
464 0274
465 0274 (* *)
466 0274 (* *)
467 0274 (******************************************************************************)
468 0274
469 0274
470 0274
471 0274 (*$I B:LnkDF7.pas Log File access primitives *)
472 0274 (******************************************************************************)
473 0274 (* *)
474 0274 (* Copyright (1985) by Metanic Aps., Denmark *)
475 0274 (* *)
476 0274 (* Author: Lars Gregers Jakobsen. *)
477 0274 (* *)
478 0274 (******************************************************************************)
479 0274
480 0274
481 0274 PROCEDURE WriteSymbolName(VAR F: text
482 0274 ; SymbolName: SymbolNameType
483 0274 ; FieldSize: i8
484 0274 );
485 0274
486 0274 VAR
487 0274 I: i8;
488 0274 N: i8;
489 0274
490 0274 BEGIN (*WRITESYMBOLNAME*)
491 0274 WITH SymbolName DO
492 0296 BEGIN
493 029B IF Length < FieldSize THEN
494 02B3 N := Length
495 02B8 ELSE
496 02C4 N := FieldSize;
497 02CF FOR I := 1 TO N DO
498 02E5 IF Name(.I.) in (.32..127.) THEN
499 031C write(F, chr(Name(.I.)) );
500 035D FOR I := N+1 TO FieldSize DO
501 037F write(F, ' ');
502 03AB END
503 03AB END; (*WRITESYMBOLNAME*)
504 03B1
505 03B1 PROCEDURE LogInit(VAR LogFile: LogFileType
506 03B1 ; FileName: FileNameType
507 03B1 );
508 03B1
509 03B1 BEGIN (*LOGINIT*)
510 03B1 WITH LogFile DO
511 03CA BEGIN
512 03CF assign(F, FileName);
513 03E6 rewrite(F);
514 03F9 P := 0;
515 0410 L := LogFilePageSize;
516 0421 END
517 0421 END; (*LOGINIT*)
518 0427
519 0427 PROCEDURE LogTerm(VAR LogFile: LogFileType
520 0427 );
521 0427
522 0427 BEGIN (*LOGTERM*)
523 0427 WITH LogFile DO
524 0440 BEGIN
525 0445 close(F);
526 0452 END
527 0452 END; (*LOGTERM*)
528 0458
529 0458 FUNCTION LogFF(VAR LogFile: LogFileType
530 0458 ; Delta: LineNoType
531 0458 ): boolean;
532 0458
533 0458 CONST
534 0458 LogFFDelta = 5;
535 0458
536 0458 BEGIN (*LOGFF*)
537 0458 WITH LogFile DO
538 0471 IF L >= LogFilePageSize - Delta THEN
539 0497 BEGIN
540 049C LogFF := true;
541 04A5 P := P + 1;
542 04C4 L := LogFFDelta;
543 04D5 page(F);
544 04E8 writeln(F);
545 0501 writeln(F);
546 051A writeln(F, ' ':LogMargin, 'LINKER '
547 0543 , VersionNo, ' '
548 055A , ConfigurationNo
549 0563 , ' ':30
550 0573 , 'SIDE # ', P:2);
551 05A3 writeln(F);
552 05BC writeln(F);
553 05D5 END
554 05D5 ELSE
555 05D7 LogFF := false;
556 05E0 END; (*LOGFF*)
557 05E9
558 05E9 PROCEDURE LogCmd(VAR LogFile: LogFileType
559 05E9 ; CommandLine: CommandLineType
560 05E9 );
561 05E9
562 05E9 CONST Delta = 5;
563 05E9
564 05E9 BEGIN (*LOGCMD*)
565 05E9 IF OptionTable.LogFileKind <> none THEN
566 05FE BEGIN
567 0603 IF LogFF(LogFile, Delta) THEN BEGIN END;
568 0618 WITH LogFile DO
569 0629 BEGIN
570 062E writeln(F);
571 0647 writeln(F, ' ':LogMargin, 'AKTIVERINGSKOMMANDO: ');
572 068B writeln(F);
573 06A4 writeln(F, ' ':LogMargin, CommandLine);
574 06D6 writeln(F);
575 06EF END
576 06EF END
577 06EF END; (*LOGCMD*)
578 06F5
579 06F5 PROCEDURE LogHSsgd(VAR LogFile: LogFileType
580 06F5 );
581 06F5
582 06F5 BEGIN (*LOGHSSGD*)
583 06F5 IF OptionTable.LogFileKind <> none THEN
584 070A WITH LogFile DO
585 071B BEGIN
586 0720 L := L + 2;
587 0741 writeln(F, ' ':LogMargin, 'SGM'
588 0766 , ' ':2, 'ADRESSE':9
589 0787 , ' ':2, 'STØRRELSE'
590 07A2 , ' ':2, 'MODUL'
591 07BD );
592 07CA writeln(F);
593 07E3 END
594 07E3 END; (*LOGHSSGD*)
595 07E9
596 07E9 PROCEDURE LogHsgd(VAR LogFile: LogFileType
597 07E9 );
598 07E9
599 07E9 BEGIN (*LOGHSGD*)
600 07E9 IF OptionTable.LogFileKind <> none THEN
601 07FE BEGIN
602 0803 IF LogFF(LogFile, 6) THEN BEGIN END;
603 0818 WITH LogFile DO
604 0829 BEGIN
605 082E L := L + 3;
606 084F writeln(F);
607 0868 writeln(F, ' ':LogMargin, 'LOKALISERINGSPLAN:');
608 08A9 writeln(F);
609 08C2 END;
610 08C2 LogHSsgd(LogFile);
611 08D1 END;
612 08D1 END; (*LOGHSGD*)
613 08D7
614 08D7 PROCEDURE LogSGD(VAR LogFile: LogFileType
615 08D7 ; SegmentNo: RelocationIndicatorType
616 08D7 ; StartAddress: FileAddressType
617 08D7 ; Size: FileAddressType
618 08D7 ; ModuleName: SymbolNameType
619 08D7 );
620 08D7
621 08D7 BEGIN (*LOGSGD*)
622 08D7 IF OptionTable.LogFileKind <> none THEN
623 0901 BEGIN
624 0906 IF LogFF(LogFile, 1) THEN
625 091B LogHSsgd(LogFile);
626 092A WITH LogFile DO
627 093B BEGIN
628 0940 L := L + 1;
629 095E write(F, ' ':LogMargin, SegmentNo:3
630 0988 , ' ':2, StartAddress:9
631 099D , ' ':2, Size:9
632 09B2 , ' ':2
633 09BB );
634 09C4 WriteSymbolName(F, ModuleName, 20);
635 09DE writeln(F);
636 09F7 END;
637 09F7 END
638 09F7 END; (*LOGSGD*)
639 09FD
640 09FD PROCEDURE LogHSxp(VAR LogFile: LogFileType
641 09FD );
642 09FD
643 09FD BEGIN (*LOGHSXP*)
644 09FD IF OptionTable.LogFileKind <> none THEN
645 0A12 WITH LogFile DO
646 0A23 BEGIN
647 0A28 L := L + 2;
648 0A49 writeln(F, ' ':LogMargin, 'SGM'
649 0A6E , ' ':2, 'VÆRDI':9
650 0A8D , ' ':2, 'SYMBOL', ' ':14
651 0AB2 , ' ':2, 'MODUL'
652 0AC9 );
653 0AD6 writeln(F);
654 0AEF END
655 0AEF END; (*LOGHSXP*)
656 0AF5
657 0AF5 PROCEDURE LogHxpN(VAR LogFile: LogFileType
658 0AF5 );
659 0AF5
660 0AF5 BEGIN (*LOGHXPN*)
661 0AF5 IF OptionTable.LogFileKind <> none THEN
662 0B0A BEGIN
663 0B0F IF LogFF(LogFile, 6) THEN BEGIN END;
664 0B24 WITH LogFile DO
665 0B35 BEGIN
666 0B3A L := L + 3;
667 0B5B writeln(F);
668 0B74 writeln(F, ' ':LogMargin, 'EXPORTEREDE SYMBOLER (NAVNEORDEN):');
669 0BC5 writeln(F);
670 0BDE END;
671 0BDE LogHSxp(LogFile);
672 0BED END
673 0BED END; (*LOGHXPN*)
674 0BF3
675 0BF3 PROCEDURE LogHxpV(VAR LogFile: LogFileType
676 0BF3 );
677 0BF3
678 0BF3 BEGIN (*LOGHXPV*)
679 0BF3 IF OptionTable.LogFileKind <> none THEN
680 0C08 BEGIN
681 0C0D IF LogFF(LogFile, 6) THEN BEGIN END;
682 0C22 WITH LogFile DO
683 0C33 BEGIN
684 0C38 L := L + 3;
685 0C59 writeln(F);
686 0C72 writeln(F, ' ':LogMargin, 'EXPORTEREDE SYMBOLER (VÆRDIORDEN):');
687 0CC3 writeln(F);
688 0CDC END;
689 0CDC LogHSxp(LogFile);
690 0CEB END
691 0CEB END; (*LOGHXPV*)
692 0CF1
693 0CF1 PROCEDURE LogXP(VAR LogFile: LogFileType
694 0CF1 ; SegmentNo: RelocationIndicatorType
695 0CF1 ; Value: i32
696 0CF1 ; SymbolName: SymbolNameType
697 0CF1 ; ModuleName: ModuleNameType
698 0CF1 );
699 0CF1
700 0CF1 BEGIN (*LOGXP*)
701 0CF1 IF OptionTable.LogFileKind <> none THEN
702 0D30 BEGIN
703 0D35 IF LogFF(LogFile,1) THEN
704 0D4A LogHSxp(LogFile);
705 0D59 WITH LogFile DO
706 0D6A BEGIN
707 0D6F L := L + 1;
708 0D8D write(F, ' ':LogMargin, SegmentNo:3
709 0DB7 , ' ':2, Value:9
710 0DCC , ' ':2
711 0DD5 );
712 0DDE WriteSymbolName(F, SymbolName, 20);
713 0DF8 write(F, ' ':2);
714 0E1A WriteSymbolName(F, ModuleName, 20);
715 0E34 writeln(F);
716 0E4D END
717 0E4D END
718 0E4D END; (*LOGXP*)
719 0E53
720 0E53 PROCEDURE LogHSurs(VAR LogFile: LogFileType
721 0E53 );
722 0E53
723 0E53 BEGIN (*LOGHSURS*)
724 0E53 IF OptionTable.LogFileKind <> none THEN
725 0E68 BEGIN
726 0E6D WITH LogFile DO
727 0E7E BEGIN
728 0E83 L := L + 2;
729 0EA4 writeln(F, ' ':LogMargin
730 0EBD , ' ':16, 'SYMBOL', ' ':14
731 0EE2 , ' ':2, 'MODUL');
732 0F06 writeln(F);
733 0F1F END
734 0F1F END
735 0F1F END; (*LOGHSURS*)
736 0F25
737 0F25 PROCEDURE LogHurs(VAR LogFile: LogFileType
738 0F25 );
739 0F25
740 0F25 BEGIN (*LOGHURS*)
741 0F25 IF OptionTable.LogFileKind <> none THEN
742 0F3A BEGIN
743 0F3F IF LogFF(LogFile, 6)THEN BEGIN END;
744 0F54 WITH LogFile DO
745 0F65 BEGIN
746 0F6A L := L + 3;
747 0F8B writeln(F);
748 0FA4 writeln(F, ' ':LogMargin, 'UTILFREDSSTILLEDE REFERENCER:');
749 0FF0 writeln(F);
750 1009 END;
751 1009 LogHSurs(LogFile);
752 1018 END
753 1018 END; (*LOGHURS*)
754 101E
755 101E PROCEDURE LogURS(VAR LogFile: LogFileType
756 101E ; ModuleName: ModuleNameType
757 101E ; SymbolName: SymbolNameType
758 101E );
759 101E
760 101E BEGIN (*LOGURS*)
761 101E IF OptionTable.LogFileKind <> none THEN
762 105D BEGIN
763 1062 IF LogFF(LogFile, 1) THEN
764 1077 LogHSurs(LogFile);
765 1086 WITH LogFile DO
766 1097 BEGIN
767 109C L := L + 1;
768 10BA write(F, ' ':LogMargin
769 10D3 , ' ':16
770 10DC );
771 10E5 WriteSymbolName(F, SymbolName, 20);
772 10FF write(F, ' ':2);
773 1121 WriteSymbolName(F, ModuleName, 20);
774 113B writeln(F);
775 1154 END
776 1154 END
777 1154 END; (*LOGURS*)
778 115A
779 115A PROCEDURE LogHSdds(VAR LogFile: LogFileType
780 115A );
781 115A
782 115A BEGIN (*LOGHSDDS*)
783 115A IF OptionTable.LogFileKind <> none THEN
784 116F WITH LogFile DO
785 1180 BEGIN
786 1185 L := L + 2;
787 11A6 writeln(F, ' ':LogMargin, 'SGM'
788 11CB , ' ':2, 'VÆRDI':9
789 11EA , ' ':2, 'SYMBOL', ' ':14
790 120F , ' ':2, 'MODUL'
791 1226 );
792 1233 writeln(F);
793 124C END;
794 124C END; (*LOGHSDDS*)
795 1252
796 1252 PROCEDURE LogHdds(VAR LogFile: LogFileType
797 1252 );
798 1252
799 1252 BEGIN (*LOGHDDS*)
800 1252 IF OptionTable.LogFileKind <> none THEN
801 1267 BEGIN
802 126C IF LogFF(LogFile, 6) THEN BEGIN END;
803 1281 WITH LogFile DO
804 1292 BEGIN
805 1297 L := L + 2;
806 12B8 writeln(F);
807 12D1 writeln(F, ' ':LogMargin, 'DOBBELTDEFINEREDE SYMBOLER:');
808 131B writeln(F);
809 1334 END;
810 1334 LogHSdds(LogFile);
811 1343 END
812 1343 END; (*LOGHDDS*)
813 1349
814 1349 PROCEDURE LogDDS(VAR LogFile: LogFileType
815 1349 ; RelocationIndicator: RelocationIndicatorType
816 1349 ; Value: i32
817 1349 ; SymbolName: SymbolNameType
818 1349 ; ModuleName: ModuleNameType
819 1349 );
820 1349
821 1349 BEGIN (*LOGDDS*)
822 1349 IF OptionTable.LogFileKind <> none THEN
823 1388 BEGIN
824 138D IF LogFF(LogFile, 1) THEN
825 13A2 LogHSdds(LogFile);
826 13B1 WITH LogFile DO
827 13C2 BEGIN
828 13C7 L := L + 1;
829 13E5 write(F, ' ':LogMargin, ord(RelocationIndicator):3
830 140F , ' ':2, Value:9
831 1424 , ' ':2
832 142D );
833 1436 WriteSymbolName(F, SymbolName, 20);
834 1450 write(F, ' ':2);
835 1472 WriteSymbolName(F, ModuleName, 20);
836 148C writeln(F);
837 14A5 END
838 14A5 END
839 14A5 END; (*LOGDDS*)
840 14AB
841 14AB PROCEDURE LogOFFerror(VAR LogFile: LogFileType
842 14AB ; FileNo: FileNameTableIndexType
843 14AB );
844 14AB
845 14AB BEGIN (*LOGOFFERROR*)
846 14AB IF OptionTable.LogFileKind <> none THEN
847 14C0 BEGIN
848 14C5 IF LogFF(LogFile, 2) THEN BEGIN END;
849 14DA WITH LogFile DO
850 14EB BEGIN
851 14F0 L := L + 2;
852 1511 writeln(F, ' ':LogMargin, '*** FILFORMATFEJL *** FIL # ', FileNo:1
853 1564 , ' ***'
854 1571 );
855 157E END;
856 157E END
857 157E END; (*LOGOFFERROR*)
858 1584
859 1584
860 1584 PROCEDURE LogOMFerror(VAR LogFile: LogFileType
861 1584 ; FileNo: FileNameTableIndexType
862 1584 ; Position: FileAddressType
863 1584 );
864 1584
865 1584 BEGIN (*LOGOMFERROR*)
866 1584 IF OptionTable.LogFileKind <> none THEN
867 1599 BEGIN
868 159E IF LogFF(LogFile, 2) THEN BEGIN END;
869 15B3 WITH LogFile DO
870 15C4 BEGIN
871 15C9 L := L + 2;
872 15EA writeln(F, ' ':LogMargin, '*** MODULFORMATFEJL *** FIL # ', FileNo:1
873 163F , ' *** POSITION # ', Position:1
874 1668 , ' ***'
875 1675 );
876 1682 END;
877 1682 END
878 1682 END; (*LOGOMFERROR*)
879 1688
880 1688 PROCEDURE LogEOFerror(VAR LogFile: LogFileType
881 1688 ; FileNo: FileNameTableIndexType
882 1688 ; Position: FileAddressType
883 1688 );
884 1688
885 1688 BEGIN (*LOGEOFERROR*)
886 1688 IF OptionTable.LogFileKind <> none THEN
887 169D BEGIN
888 16A2 IF LogFF(LogFile, 2) THEN BEGIN END;
889 16B7 WITH LogFile DO
890 16C8 BEGIN
891 16CD L := L + 2;
892 16EE writeln(F, ' ':LogMargin, '*** FILLÆNGDEFEJL *** FIL # ', FileNo:1
893 1741 , ' *** POSITION # ', Position:1
894 176A , ' ***'
895 1777 );
896 1784 END;
897 1784 END
898 1784 END; (*LOGEOFERROR*)
899 178A
900 178A (* *)
901 178A (* *)
902 178A (******************************************************************************)
903 178A
904 178A
905 178A (*$I B:LnkDF8.pas Object File access primitives *)
906 178A (******************************************************************************)
907 178A (* *)
908 178A (* Copyright (1985) by Metanic Aps., Denmark *)
909 178A (* *)
910 178A (* Author: Lars Gregers Jakobsen. *)
911 178A (* *)
912 178A (******************************************************************************)
913 178A
914 178A PROCEDURE FilAsg(VAR Fl: FileType
915 178A ;Fn: FileNameType
916 178A );
917 178A
918 178A BEGIN (*FILASG*)
919 178A (*#B#
920 178A IF test((.0,1.)) THEN
921 178A writeln(TestOut, 'FILasg FlNm=', Fn);
922 178A #E#*)
923 178A assign(Fl.F, Fn)
924 17AF END; (*FILASG*)
925 17B5
926 17B5 PROCEDURE FilRst(VAR Status: StatusType
927 17B5 ;VAR Fl: FileType
928 17B5 );
929 17B5
930 17B5 BEGIN (*FILRST*)
931 17B5 WITH Fl DO
932 17CE BEGIN
933 17D3 P := 0;
934 17E4 reset(F);
935 17F7 IF eof(F) THEN
936 180D Status := Status + (.UnExpectedEof.);
937 1833 (*#B#
938 1833 IF test((.0,1.)) THEN
939 1833 BEGIN
940 1833 write(TestOut, 'FILrst'); TSTstat(Status); TSTln;
941 1833 END;
942 1833 #E#*)
943 1833 END
944 1833 END; (*FILRST*)
945 1839
946 1839 PROCEDURE FilRwt(VAR Fl: FileType
947 1839 );
948 1839
949 1839 BEGIN (*FILRWT*)
950 1839 (*#B#
951 1839 IF test((.0,1.)) THEN
952 1839 writeln(TestOut, 'FILrwt');
953 1839 #E#*)
954 1839 WITH Fl DO
955 1852 BEGIN
956 1857 rewrite(F);
957 1864 P := 0;
958 187B END
959 187B END; (*FILRWT*)
960 1881
961 1881 PROCEDURE FilCls(VAR Fl: FileType
962 1881 );
963 1881
964 1881 BEGIN (*FILCLS*)
965 1881 close(Fl.F);
966 189C END; (*FILCLS*)
967 18A2
968 18A2 PROCEDURE FilSeek(VAR Status: StatusType
969 18A2 ;VAR Fl: FileType
970 18A2 ; Position: FileAddressType
971 18A2 );
972 18A2
973 18A2 BEGIN (*FILSEEK*)
974 18A2 WITH Fl DO
975 18BB BEGIN
976 18C0 P := Position;
977 18D2 seek(F, Position);
978 18EB IF eof(F) THEN
979 1901 Status := Status + (.UnExpectedEof.);
980 1927 (*#B#
981 1927 IF test((.0,1,2.)) THEN
982 1927 BEGIN
983 1927 write(TestOut, 'FILSEEK '); TSTstat(Status); TSTindt;
984 1927 write(TestOut, 'P=', P:1
985 1927 , ' EOF='); TSTbool(eof(F));
986 1927 TSTln;
987 1927 END;
988 1927 #E#*)
989 1927 END
990 1927 END; (*FILSEEK*)
991 192D
992 192D PROCEDURE FGi8(VAR Status: StatusType
993 192D ;VAR Fl: FileType
994 192D ;VAR V: i8
995 192D );
996 192D
997 192D BEGIN (*FGI8*)
998 192D WITH Fl DO
999 1946 BEGIN
1000 194B IF not eof(F) THEN
1001 195D BEGIN
1002 1962 read(F,V);
1003 198B P := P + 1;
1004 19AD END
1005 19AD ELSE
1006 19AF Status := Status + (.UnexpectedEof.);
1007 19D5 (*#B#
1008 19D5 IF test((.0,2.)) THEN
1009 19D5 BEGIN
1010 19D5 write(TestOut, 'FGI8 '); TSTstat(Status); TSTindt;
1011 19D5 write(TestOut, 'P=', P:1,' V=', V:1, ' EOF='); TSTbool(eof(F));
1012 19D5 TSTln;
1013 19D5 END;
1014 19D5 #E#*)
1015 19D5 END;
1016 19D5 END; (*FGI8*)
1017 19DB
1018 19DB PROCEDURE FGi32(VAR Status: StatusType
1019 19DB ;VAR Fl: FileType
1020 19DB ;VAR V: i32
1021 19DB );
1022 19DB
1023 19DB VAR
1024 19DB I: I32IndexType;
1025 19DB N: I32ArrayType;
1026 19DB
1027 19DB BEGIN (*FGI32*)
1028 19DB WITH Fl DO
1029 19F4 BEGIN
1030 19F9 P := P + 4;
1031 1A1D FOR I := bs3 DOWNTO bs0 DO
1032 1A2E IF not eof(f) THEN
1033 1A47 read(F, N(.I.) )
1034 1A78 ELSE
1035 1A7E Status := Status + (.UnexpectedEof.);
1036 1AAE move(N, V, 4);
1037 1AC7 (*#B#
1038 1AC7 IF test((.0,2.)) THEN
1039 1AC7 BEGIN
1040 1AC7 write(TestOut, 'FGI32 '); TSTstat(Status); TSTindt;
1041 1AC7 write(TestOut, 'P=', P:1,' V=', V:1,
1042 1AC7 ' N=(',N(.bs3.):3,'/',N(.bs2.):3
1043 1AC7 ,'/',N(.bs1.):3,'/',N(.bs0.):3,') EOF=');
1044 1AC7 TSTbool(eof(F)); TSTln;
1045 1AC7 END;
1046 1AC7 #E#*)
1047 1AC7 END;
1048 1AC7 END; (*FGI32*)
1049 1ACD
1050 1ACD PROCEDURE FGSym(VAR Status: StatusType
1051 1ACD ;VAR Fl: FileType
1052 1ACD ;VAR SymbolName: SymbolNameType
1053 1ACD );
1054 1ACD
1055 1ACD VAR
1056 1ACD I: i8;
1057 1ACD N: i8;
1058 1ACD
1059 1ACD BEGIN (*FGSYM*)
1060 1ACD WITH Fl, SymbolName DO
1061 1AF2 BEGIN
1062 1AF7 (*#B#
1063 1AF7 IF test((.0,2.)) THEN
1064 1AF7 BEGIN
1065 1AF7 write(TestOut, 'FGSYM-1 '); TSTstat(Status); TSTindt;
1066 1AF7 write(TestOut, 'P=', P:1, ' F^=',F^:3, ' EOF=');
1067 1AF7 TSTbool(eof(F)); TSTln
1068 1AF7 END;
1069 1AF7 #E#*)
1070 1AF7 IF not eof(F) THEN
1071 1B10 BEGIN
1072 1B15 read(F, N);
1073 1B38 P := P + 1 + N;
1074 1B67 IF (0 < N) and (N <= MaxSymbolNameIndex) THEN
1075 1B85 BEGIN
1076 1B8A Length := N;
1077 1BA2 FOR I := 1 TO N DO
1078 1BB9 IF not eof(F) THEN
1079 1BD2 read(F, Name(.I.) )
1080 1C0B ELSE
1081 1C11 Status := Status + (.UnexpectedEof.)
1082 1C27 END
1083 1C41 ELSE
1084 1C44 BEGIN
1085 1C49 Status := Status + (.BadSymbolName.);
1086 1C6F FOR I := 1 TO N DO
1087 1C85 IF not eof(F) THEN
1088 1C9E read(F, Name(.1.) )
1089 1CC5 ELSE
1090 1CCB Status := Status + (.UnexpectedEof.)
1091 1CE1 END
1092 1CFB END
1093 1CFB ELSE
1094 1CFD Status := Status + (.UnexpectedEof.);
1095 1D23 (*#B#
1096 1D23 IF test((.0,2.)) THEN
1097 1D23 BEGIN
1098 1D23 write(TestOut, 'FGSYM-2 '); TSTstat(Status); TSTindt;
1099 1D23 TSTsymbol(SymbolName);
1100 1D23 END;
1101 1D23 #E#*)
1102 1D23 END
1103 1D23 END; (*FGSYM*)
1104 1D29
1105 1D29 PROCEDURE FPi8(VAR Fl: FileType
1106 1D29 ; V: i8
1107 1D29 );
1108 1D29
1109 1D29 BEGIN (*FPI8*)
1110 1D29 WITH Fl DO
1111 1D42 BEGIN
1112 1D47 (*#B#
1113 1D47 IF test((.0,3.)) THEN
1114 1D47 BEGIN
1115 1D47 writeln(TestOut, 'FPI8 ', 'P=', P:1,' V=', V:1);
1116 1D47 END;
1117 1D47 #E#*)
1118 1D47 write(F,V);
1119 1D6C P := P + 1
1120 1D85 END
1121 1D8E END; (*FPI8*)
1122 1D94
1123 1D94 PROCEDURE FPi32(VAR Fl: FileType
1124 1D94 ; V: i32
1125 1D94 );
1126 1D94
1127 1D94 VAR
1128 1D94 I: I32IndexType;
1129 1D94 N: I32ArrayType;
1130 1D94
1131 1D94 BEGIN (*FPI32*)
1132 1D94 move(V, N, 4);
1133 1DB6 WITH Fl DO
1134 1DC7 BEGIN
1135 1DCC (*#B#
1136 1DCC IF test((.0,3.)) THEN
1137 1DCC BEGIN
1138 1DCC writeln(TestOut, 'FPI32 ', 'P=', P:1,' V=', V:1,
1139 1DCC ' N=(',N(.bs3.):3,'/',N(.bs2.):3
1140 1DCC ,'/',N(.bs1.):3,'/',N(.bs0.):3,')');
1141 1DCC END;
1142 1DCC #E#*)
1143 1DCC P := P + 4;
1144 1DF0 FOR I := bs3 DOWNTO bs0 DO
1145 1E01 write(F, N(.I.) )
1146 1E32 END
1147 1E3F END; (*FPI32*)
1148 1E45
1149 1E45 PROCEDURE FPSym(VAR Fl: FileType
1150 1E45 ; SymbolName: SymbolNameType
1151 1E45 );
1152 1E45
1153 1E45 VAR
1154 1E45 I: SymbolNameIndexType;
1155 1E45
1156 1E45 BEGIN (*FPSYM*)
1157 1E45 WITH Fl, SymbolName DO
1158 1E73 BEGIN
1159 1E78 (*#B#
1160 1E78 IF test((.0,3.)) THEN
1161 1E78 BEGIN
1162 1E78 write(TestOut, 'FPSYM-2 '); TSTstat(Status); TSTindt;
1163 1E78 write(TestOut, 'P=', P:1); TSTindt; TSTsymbol(SymbolName);
1164 1E78 END;
1165 1E78 #E#*)
1166 1E78 P := P + 1 + Length;
1167 1EA2 write(F, Length);
1168 1ECB FOR I := 1 TO Length DO
1169 1EE4 write(F, Name(.I.) )
1170 1F16 END
1171 1F23 END; (*FPSYM*)
1172 1F29
1173 1F29 (* *)
1174 1F29 (* *)
1175 1F29 (******************************************************************************)
1176 1F29
1177 1F29 (*$I B:lnkp0.pas Procedure setup *)
1178 1F29 (******************************************************************************)
1179 1F29 (* *)
1180 1F29 (* Copyright (1985) by Metanic Aps., Denmark *)
1181 1F29 (* *)
1182 1F29 (* Author: Lars Gregers Jakobsen. *)
1183 1F29 (* *)
1184 1F29 (******************************************************************************)
1185 1F29
1186 1F29
1187 1F29 PROCEDURE SetUp(VAR Status: StatusType
1188 1F29 ;VAR TargetFile: FileType
1189 1F29 ;VAR LogFile: LogFileType
1190 1F29 ;VAR Out_file: text
1191 1F29 );
1192 1F29
1193 1F29 CONST
1194 1F29 InputFileNameSuffix = 'OBJ';
1195 1F2C TargetFileNameSuffix = 'OUT';
1196 1F2F LogFileNameSuffix = 'MAP';
1197 1F32
1198 1F32 VAR
1199 1F32 CommandLine: CommandLineType;
1200 1F32 Current: CommandLineIndexType;
1201 1F32 FileName: FileNameType;
1202 1F32
1203 1F32 PROCEDURE SkipBlanks;
1204 1F32
1205 1F32 BEGIN (*SKIPBLANKS*)
1206 1F32 WHILE (CommandLine(.Current.) = ' ') and
1207 1F5B (Current < length(CommandLine)) DO
1208 1F80 Current := Current + 1;
1209 1FA0 END; (*SKIPBLANKS*)
1210 1FA6
1211 1FA6 PROCEDURE DecodeFileName(VAR Status: StatusType
1212 1FA6 ;VAR FileName: FileNameType
1213 1FA6 ; Suffix: FileNameType
1214 1FA6 ; Terminators: CharSetType
1215 1FA6 );
1216 1FA6
1217 1FA6 VAR
1218 1FA6 I: CommandLineIndexType;
1219 1FA6
1220 1FA6 BEGIN (*DECODEFILENAME*)
1221 1FA6 I := 0;
1222 1FB7 WHILE (Current + I < length(CommandLine) ) and
1223 1FE1 not ( CommandLine(.Current + I.) in Terminators ) DO
1224 2022 I := I + 1;
1225 203A IF (0 < I) and (I <= FileNameLength) THEN
1226 205D BEGIN
1227 2062 FileName := Copy(CommandLine, Current, I);
1228 2090 Current := Current + I;
1229 20B5 IF (pos('.', FileName) = 0) THEN
1230 20D0 IF (length(FileName) <= FileNameLength - 4) THEN
1231 20E3 FileName := concat(FileName, '.', Suffix)
1232 210C ELSE
1233 2117 Status := Status + (.BadFileName.)
1234 212D END
1235 213B ELSE
1236 213D Status := Status + (.BadFileName.);
1237 2161 (*#B#
1238 2161 IF test((.0,16,18.)) THEN
1239 2161 BEGIN
1240 2161 write(TestOut, 'DecodeFileName '); TSTstat(Status);
1241 2161 TSTindt; write(TestOut, 'Curr=', Current:1);
1242 2161 TSTindt; write(TestOut, 'I=', I:1);
1243 2161 TSTindt; writeln(TestOut, 'FileName=', FileName)
1244 2161 END
1245 2161 #E#*)
1246 2161 END; (*DECODEFILENAME*)
1247 2167
1248 2167
1249 2167 BEGIN (*SETUP*)
1250 2167 Getcomm(CommandLine);
1251 2182 CommandLine := concat(CommandLine, ' ');
1252 21A4 Current := 1;
1253 21AD Status := (..);
1254 21C4 SkipBlanks; (*Leaving current pointing at next non blank*)
1255 21D0 (*Interpret option list*)
1256 21D0 (*#B#
1257 21D0 IF test((.0,16,18.)) THEN
1258 21D0 BEGIN
1259 21D0 write(TestOut, 'Setup-1 '); write(TestOut, 'Curr=', Current:1);
1260 21D0 TSTindt; write(TestOut, 'Lng(ComLin)=', Length(CommandLine):1);
1261 21D0 TSTindt; TSTmem; TSTln;
1262 21D0 TSTindt; writeln(TestOut, 'ComLin=', CommandLine)
1263 21D0 END;
1264 21D0 #E#*)
1265 21D0 WHILE (Current < length(CommandLine)) and
1266 21E5 (CommandLine(.Current.) = '/') and
1267 2207 (Status = (..)) DO
1268 2223 BEGIN
1269 2228 Current := Current + 1;
1270 223E CASE CommandLine(.Current.) OF
1271 2259 'M','m':
1272 2259 BEGIN
1273 225E Current := Current + 1;
1274 2274 IF CommandLine(.Current.) = '=' THEN
1275 2290 BEGIN
1276 2295 Current := Current + 1;
1277 22AB DecodeFileName(Status, FileNametable(.-1.)
1278 22B7 , LogFileNameSuffix, (.' ', '/', ','.) );
1279 22DF IF Status = (..) THEN
1280 22F7 OptionTable.LogFileKind := Explicit
1281 22FC END
1282 2301 ELSE
1283 2303 OptionTable.LogFileKind := Implicit
1284 2308 END;
1285 2310 'O','o':
1286 2310 BEGIN
1287 2315 Current := Current + 1;
1288 232B IF CommandLine(.Current.) = '=' THEN
1289 2347 BEGIN
1290 234C Current := Current + 1;
1291 2362 DecodeFileName(Status, FileNameTable(.0.)
1292 236E , TargetFileNameSuffix, (.' ', '/', ','.) );
1293 2396 IF Status = (..) THEN
1294 23AE OptionTable.TargetFileKind := Explicit
1295 23B3 END
1296 23B8 ELSE
1297 23BA OptionTable.TargetFileKind := Implicit
1298 23BF END;
1299 23C6 OTHERWISE
1300 23C6 Status := Status + (.BadOption.)
1301 23DC END; (*CASE*)
1302 23FF (*#B#
1303 23FF IF test((.0,16,18.)) THEN
1304 23FF BEGIN
1305 23FF write(TestOut, 'Setup-2 '); TSTstat(Status);
1306 23FF TSTindt; writeln(TestOut, 'Curr=', Current:1);
1307 23FF TSTindt; TSTopt;
1308 23FF TSTindt; TSTfnt(-1);
1309 23FF TSTindt; TSTfnt(0)
1310 23FF END;
1311 23FF #E#*)
1312 23FF END; (*WHILE*)
1313 2402 IF Status = (..) THEN (*Interpret file list*)
1314 241B BEGIN
1315 2420 SkipBlanks;
1316 242C IF Current < length(CommandLine) THEN
1317 2444 Status := Status + (.NotFinished.);
1318 246C WHILE (Current < length(CommandLine)) and
1319 2481 (NotFinished IN Status) DO
1320 24A2 BEGIN
1321 24A7 DecodeFileName(Status, FileName
1322 24B3 , InputFileNameSuffix, (.' ', ','.) );
1323 24DF IF not (BadFileName IN Status) THEN
1324 24F9 BEGIN
1325 24FE (*#B#
1326 24FE IF test((.0,16,18.)) THEN
1327 24FE BEGIN
1328 24FE write(TestOut, 'Setup-3 '); TSTstat(Status); TSTindt;
1329 24FE write(TestOut, 'fstat(FileName)=');
1330 24FE TSTbool(fstat(FileName)); TSTln;
1331 24FE END;
1332 24FE #E#*)
1333 24FE IF fstat(FileName) THEN
1334 2513 FNTP(Status, FileName)
1335 252E ELSE
1336 2533 Status := Status + (.NoSuchFile.);
1337 2557 END;
1338 2557 IF NotFinished IN Status THEN
1339 2571 CASE CommandLine(.Current.) OF
1340 258F ' ':
1341 258F Status := Status - (.NotFinished.);
1342 25B9 ',':
1343 25B9 BEGIN
1344 25BE Current := Current + 1 (*Skip the comma*)
1345 25C3 END
1346 25D4 END (*CASE CommandLine(.Current.) OF*)
1347 25E3 END (* WHILE *** DO *)
1348 25E3 END; (* IF Status = (..) -- End interpret file list *)
1349 25E6 IF CurFileNo <= 0 THEN
1350 25F7 Status := Status + (.NoInputFiles.);
1351 261B IF Status = (..) THEN
1352 2634 BEGIN
1353 2639 FileName := copy(FileNameTable(.1.), 1, pos('.',FileNameTable(.1.)) );
1354 2665 IF OptionTable.LogFileKind = Implicit THEN
1355 2671 FileNameTable(.-1.) := concat(FileName, LogFileNameSuffix);
1356 2692 IF OptionTable.TargetFileKind = Implicit THEN
1357 269E FileNameTable(. 0.) := concat(FileName, TargetFileNameSuffix);
1358 26BF
1359 26BF IF (OptionTable.LogFileKind <> none) and
1360 26C9 ( (not checkfn(FileNameTable(.-1.) ) ) or
1361 26D8 (fstat(FileNameTable(.-1.) ) )
1362 26E2 ) THEN
1363 26EB Status := Status + (.badlogfilename.);
1364 270F IF (not checkfn(FileNameTable(.0.) ) ) or
1365 271F (fstat(FileNameTable(.0.) ) ) THEN
1366 272F Status := Status + (.badtargetfilename.);
1367 2753
1368 2753 (*#B#
1369 2753 IF test((.0,16,18.)) THEN
1370 2753 BEGIN
1371 2753 write(TestOut, 'Setup-4 '); TSTstat(Status); TSTln;
1372 2753 TSTindt; TSTopt;
1373 2753 TSTindt; TSTfnt(-1);
1374 2753 TSTindt; TSTfnt(0);
1375 2753 TSTindt; TSTfnt(1)
1376 2753 END;
1377 2753 #E#*)
1378 2753
1379 2753 IF Status = (..) THEN
1380 276B BEGIN
1381 2770 IF OptionTable.LogFileKind <> None THEN
1382 277C BEGIN
1383 2781 LogInit(LogFile, FileNameTable(.-1.) );
1384 279B LogCmd(LogFile, CommandLine);
1385 27B9 END;
1386 27B9 FilAsg(TargetFile, FileNameTable(.0.) );
1387 27D3 FilRwt(TargetFile);
1388 27E2 END
1389 27E2 ELSE
1390 27E4 Status := Status + (.NoTarget.);
1391 280C END
1392 280C ELSE
1393 280E BEGIN
1394 2813 Status := Status + (.Notarget.);
1395 283B writeln(out_file, CommandLine);
1396 2864 writeln(out_file, '^':Current);
1397 2887 END
1398 2887 END; (*SETUP*)
1399 288D
1400 288D (* *)
1401 288D (* *)
1402 288D (******************************************************************************)
1403 288D
1404 288D (*$I B:lnkp1.pas Procedure pass1 *)
1405 288D (******************************************************************************)
1406 288D (* *)
1407 288D (* Copyright (1985) by Metanic Aps., Denmark *)
1408 288D (* *)
1409 288D (* Author: Lars Gregers Jakobsen. *)
1410 288D (* *)
1411 288D (******************************************************************************)
1412 288D
1413 288D PROCEDURE Pass1(VAR Status: StatusType
1414 288D ;VAR TargetFile: FileType
1415 288D ;VAR LogFile: LogFileType
1416 288D );
1417 288D
1418 288D (* Pass1 of the linker performs the gathering of export and
1419 288D import information from the input files as well as calculation
1420 288D of final memory map and all operations on the symbol table
1421 288D including reporting to the log file.
1422 288D The following statusvalues may be returned:
1423 288D Success: ok. All other parameters meaningful.
1424 288D
1425 288D *)
1426 288D
1427 288D
1428 288D VAR
1429 288D SymbolTable: SymbolTableType;
1430 288D LatestInsert: SymbolTableIndexType; (*Points to SBT entry of latest insert*)
1431 288D CurrentSymbolCount: SymbolTableIndexType; (*Number of SBT entries currently used*)
1432 288D
1433 288D NameTable: NameTableType;
1434 288D CurrentNameTableIndex: NameTableIndexType; (*Least index vacant -
1435 288D NOT count of strings*)
1436 288D
1437 288D
1438 288D (* MISC. VARIABLES *)
1439 288D
1440 288D SBTSubInx: SymbolTableSubIndexType;
1441 288D
1442 288D (*#B#(*$I B:LnkDF3.pas Definitions of pass1 local test output primitives *)
1443 288D (*$I B:LnkDF4.pas Definitions of pass1 local access primitives *)
1444 288D (******************************************************************************)
1445 288D (* *)
1446 288D (* Copyright (1985) by Metanic Aps., Denmark *)
1447 288D (* *)
1448 288D (* Author: Lars Gregers Jakobsen. *)
1449 288D (* *)
1450 288D (******************************************************************************)
1451 288D
1452 288D
1453 288D PROCEDURE NMTP(VAR Status: StatusType
1454 288D ;VAR NameReference: NameTableIndexType
1455 288D ; SymbolName: SymbolNameType
1456 288D );
1457 288D
1458 288D VAR
1459 288D I: SymbolNameIndexType;
1460 288D
1461 288D BEGIN (*NMTP*)
1462 288D WITH SymbolName DO
1463 28AF BEGIN
1464 28B4 IF CurrentNameTableIndex + Length + 1 > MaxNameTableIndex THEN
1465 28E3 Status := Status + (.NameTableOverFlow.)
1466 28F9 ELSE
1467 290D BEGIN
1468 2912 Namereference := CurrentNameTableIndex + 1;
1469 2932 CurrentNameTableIndex := NameReference + Length;
1470 2959 NameTable(.NameReference.) := Length;
1471 297E FOR I := 1 TO Length DO
1472 2997 NameTable(.NameReference + I.) := Name(.I.);
1473 29E3 END;
1474 29E3 (*#B#
1475 29E3 IF test((.0,9.)) THEN
1476 29E3 BEGIN
1477 29E3 write(TestOut, 'NMTP '); TSTstat(Status); TSTindt;
1478 29E3 writeln(TestOut, 'Length=', Length:1);
1479 29E3 TSTindt; TSTindt; TSTindt; TSTnmt(NameReference);
1480 29E3 END;
1481 29E3 #E#*)
1482 29E3 END
1483 29E3 END; (*NMTP*)
1484 29E9
1485 29E9 FUNCTION NMTfail( NameReference: NameTableIndexType
1486 29E9 ; SymbolName: SymbolNameType
1487 29E9 ): boolean;
1488 29E9
1489 29E9 (* NMTfail returns one of the following values:
1490 29E9 FALSE: If the exact same symbolname was found in NMT - i.e.
1491 29E9
1492 29E9 NameReference <> 0 AND
1493 29E9 NMT(.NameReference.) = SymbolName.Length AND
1494 29E9 FOR i = 1 TO length:
1495 29E9 NMT(.NameReference+i.) = SymbolName.Name(.i.)
1496 29E9
1497 29E9 OR If an empty entry was found in NMT - i.e.
1498 29E9
1499 29E9 NameReference = 0.
1500 29E9
1501 29E9
1502 29E9 TRUE: In all other cases.
1503 29E9 *)
1504 29E9
1505 29E9 LABEL
1506 29E9 99;
1507 29E9
1508 29E9 VAR
1509 29E9 I: SymbolNameIndexType;
1510 29E9
1511 29E9 BEGIN (*NMTFAIL*)
1512 29E9 NMTfail := false;
1513 2A0F WITH SymbolName DO
1514 2A14 BEGIN
1515 2A19 IF NameReference <> 0 THEN
1516 2A25 IF length <> NameTable(.NameReference.) THEN
1517 2A42 NMTfail := true
1518 2A47 ELSE
1519 2A4E BEGIN
1520 2A53 FOR I := 1 TO Length DO
1521 2A6C IF Name(.I.) <> NameTable(.NameReference + I.) THEN
1522 2AAC BEGIN
1523 2AB1 NMTfail := true;
1524 2ABA GOTO 99;
1525 2AC2 END;
1526 2ACC 99:; END;
1527 2ACC (*#B#
1528 2ACC IF test((.0,9.)) THEN
1529 2ACC BEGIN
1530 2ACC writeln(TestOut, 'NMTfail ', 'NameRef=', NameReference:1);
1531 2ACC TSTindt; TSTindt; TSTindt; TSTsymbol(SymbolName);
1532 2ACC TSTindt; TSTindt; TSTindt; TSTnmt(NameReference);
1533 2ACC END;
1534 2ACC #E#*)
1535 2ACC END
1536 2ACC END; (*NMTFAIL*)
1537 2AD5
1538 2AD5 PROCEDURE NMTG( NameReference: NameTableIndexType
1539 2AD5 ;VAR SymbolName: SymbolNameType
1540 2AD5 );
1541 2AD5
1542 2AD5 VAR
1543 2AD5 I: SymbolNameIndexType;
1544 2AD5
1545 2AD5 BEGIN (*NMTG*)
1546 2AD5 WITH SymbolName DO
1547 2AEE BEGIN
1548 2AF3 Length := NameTable(.NameReference.);
1549 2B15 FOR I := 1 TO Length DO
1550 2B32 Name(.I.) := NameTable(. NameReference + I .);
1551 2B7B (*#B#
1552 2B7B IF test((.0,9,13.)) THEN
1553 2B7B BEGIN
1554 2B7B write(TestOut, 'NMTG '); TSTindt;
1555 2B7B write(TestOut, 'NameRef=', NameReference:1); TSTindt;
1556 2B7B TSTsymbol(SymbolName);
1557 2B7B END;
1558 2B7B #E#*)
1559 2B7B END
1560 2B7B END; (*NMTG*)
1561 2B81
1562 2B81 PROCEDURE Hash(VAR SymbolName: SymbolNameType
1563 2B81 ;VAR SBTInx: SymbolTableIndexType
1564 2B81 );
1565 2B81
1566 2B81 BEGIN (*HASH*)
1567 2B81 SBTInx := 1
1568 2B94 END; (*HASH*)
1569 2B9C
1570 2B9C PROCEDURE SBTS(VAR Status: StatusType
1571 2B9C ;VAR SBTInx: SymbolTableIndexType
1572 2B9C ; SymbolName: SymbolNameType
1573 2B9C );
1574 2B9C
1575 2B9C (* SBTS returns one of the following Status codes:
1576 2B9C Success: SymbolName found in SBT. SBTInx reflects
1577 2B9C SymbolName.
1578 2B9C NotFound: SymbolName NOT found in SBT. SBTInx
1579 2B9C indicates the entry into which Symbol should be
1580 2B9C registered.
1581 2B9C SymbolTableOverFlow: SymbolName NOT found in SBT.
1582 2B9C SBTInx is not valid. There
1583 2B9C is no room in SBT for further updates.
1584 2B9C
1585 2B9C Search SBT to find the Entry for SYMBOLNAME retaining the index
1586 2B9C of the first vacant record as SYMBOLTABLEENTRYNO if the search
1587 2B9C fails. Otherwise return found index. Set Status to Success or
1588 2B9C NotFound according to outcome. Set Status to SBTOverFlow if
1589 2B9C no vacant is available and symbol is not found.
1590 2B9C
1591 2B9C A SBT record is vacant if Namereference = 0.
1592 2B9C *)
1593 2B9C
1594 2B9C
1595 2B9C BEGIN (*SBTS*)
1596 2B9C (* Assume existence of entry in SBT with NameReference = 0 *)
1597 2B9C Hash(SymbolName, SBTInx);
1598 2BD0 (*#B#
1599 2BD0 IF test((.0,9.)) THEN
1600 2BD0 BEGIN
1601 2BD0 write(TestOut, 'SBTS-1 '); TSTstat(Status); TSTln;
1602 2BD0 TSTindt; TSTindt; TSTindt; TSTsbt(SBTInx); TSTln;
1603 2BD0 END;
1604 2BD0 #E#*)
1605 2BD0 WHILE NMTfail(Symboltable(.SBTInx.).NameReference, SymbolName) DO
1606 2C09 BEGIN
1607 2C0E (* HASH NEXT TRY *)
1608 2C0E IF MaxNooSymbols <= SBTInx THEN
1609 2C25 SBTInx := 0;
1610 2C32 SBTInx := SBTInx + 1;
1611 2C52
1612 2C52 (*#B#
1613 2C52 IF test((.0,9.)) THEN
1614 2C52 BEGIN
1615 2C52 write(TestOut, 'SBTS-2 '); TSTstat(Status); TSTln;
1616 2C52 TSTindt; TSTindt; TSTindt; TSTsbt(SBTInx); TSTln;
1617 2C52 END;
1618 2C52 #E#*)
1619 2C52
1620 2C52 END;
1621 2C54 IF SymbolTable(.SBTInx.).NameReference = 0 THEN
1622 2C7A IF CurrentSymbolCount >= MaxNooSymbols - 1 THEN
1623 2C8E Status := Status + (.SymbolTableOverFlow.)
1624 2CA4 ELSE
1625 2CB7 Status := Status + (.NotFound.);
1626 2CDF (*#B#
1627 2CDF IF test((.0,10.)) THEN
1628 2CDF BEGIN
1629 2CDF write(TestOut, 'SBTS-3 '); TSTstat(Status); TSTln;
1630 2CDF TSTindt; TSTindt; TSTindt; TSTsbt(SBTInx); TSTln;
1631 2CDF END;
1632 2CDF #E#*)
1633 2CDF END; (*SBTS*)
1634 2CE5
1635 2CE5 PROCEDURE SBTEX(VAR Status: StatusType
1636 2CE5 ;VAR SymbolTableEntryNo: SymbolTableIndexType
1637 2CE5 ; SymbolName: SymbolNameType
1638 2CE5 ; P_ModuleNo: ModuleTableIndexType
1639 2CE5 ; P_SegmentNo: SegmentNoType
1640 2CE5 ; Item: i32
1641 2CE5 );
1642 2CE5
1643 2CE5 BEGIN (*SBTEX*)
1644 2CE5 SBTS(Status, SymbolTableEntryNo, SymbolName);
1645 2D24 IF not (SymbolTableOverFlow IN Status) THEN
1646 2D3F WITH SymbolTable(.SymbolTableEntryNo.)
1647 2D60 ,ValueTable(.SymbolTableEntryNo.) DO
1648 2D84 IF NotFound IN Status THEN
1649 2D9F BEGIN (*Symbol is NOT in SBT and thus not resolved*)
1650 2DA4 Status := Status - (.NotFound.);
1651 2DCC NMTP(Status, NameReference, SymbolName);
1652 2DEF IF not (NameTableOverFlow IN Status) THEN
1653 2E0A BEGIN
1654 2E0F CurrentSymbolCount := CurrentSymbolCount + 1;
1655 2E2D ModuleNo := P_ModuleNo;
1656 2E41 IF LatestInsert <> 0 THEN
1657 2E50 SymbolTable(.LatestInsert.).SortLink := SymbolTableEntryNo;
1658 2E80 LatestInsert := SymbolTableEntryNo;
1659 2E96 SortLink := SymbolTableEntryNo;
1660 2EB0 SegmentNo := P_SegmentNo;
1661 2EC4 Value := Item
1662 2ECF END
1663 2ED8 END (*IF NotFound IN Status*)
1664 2ED8 ELSE (* SUCCESS: Symbol is in SBT*)
1665 2EDB BEGIN
1666 2EE0 IF SegmentNo > UnResolved THEN
1667 2EF7 Status := Status + (.DuplicateExportSymbol.)
1668 2F0D ELSE (*Symbol NOT previously resolved i.e. imported only*)
1669 2F20 BEGIN
1670 2F25 ModuleNo := P_ModuleNo;
1671 2F39 IF LatestInsert <> 0 THEN
1672 2F48 SymbolTable(.LatestInsert.).SortLink := SymbolTableEntryNo;
1673 2F78 LatestInsert := SymbolTableEntryNo;
1674 2F8E SortLink := SymbolTableEntryNo;
1675 2FA8 SegmentNo := P_SegmentNo;
1676 2FBC Value := Item
1677 2FC7 END
1678 2FD0 END; (*ELSE (i.e. Success IN Status)*)
1679 2FD0 (*#B#
1680 2FD0 IF test((.0,10.)) THEN
1681 2FD0 BEGIN
1682 2FD0 write(TestOut, 'SBTEX '); TSTstat(Status);
1683 2FD0 TSTindt; TSTsymbol(SymbolName);
1684 2FD0 TSTindt; TSTindt; TSTindt; TSTsbt(SymbolTableEntryNo); TSTln;
1685 2FD0 TSTindt; TSTindt; TSTindt; TSTvlt(SymbolTableEntryNo); TSTln;
1686 2FD0 END;
1687 2FD0 #E#*)
1688 2FD0 END; (*SBTEX*)
1689 2FD6
1690 2FD6
1691 2FD6 PROCEDURE SBTIM(VAR Status: StatusType
1692 2FD6 ;VAR SymbolTableEntryNo: SymbolTableIndexType
1693 2FD6 ;VAR SymbolName: SymbolNameType
1694 2FD6 ; P_ModuleNo: ModuleTableIndexType
1695 2FD6 );
1696 2FD6
1697 2FD6 BEGIN (*SBTIM*)
1698 2FD6 SBTS(Status, SymbolTableEntryNo, SymbolName);
1699 2FFF IF Not (SymbolTableOverFlow IN Status) THEN
1700 301A BEGIN
1701 301F IF NotFound IN Status THEN
1702 303A WITH SymbolTable(.SymbolTableEntryNo.)
1703 305B ,ValueTable(.SymbolTableEntryNo.) DO
1704 307F BEGIN
1705 3084 Status := Status - (.NotFound.);
1706 30AC NMTP(Status, NameReference, SymbolName);
1707 30CE IF not (NameTableOverFlow IN Status) THEN
1708 30E8 BEGIN
1709 30ED CurrentSymbolCount := CurrentSymbolCount + 1;
1710 310B ModuleNo := P_ModuleNo;
1711 311F SortLink := 0;
1712 312E SegmentNo := UnResolved;
1713 313B Value := 0;
1714 3151 END
1715 3151 END;
1716 3151 EITP(Status,SymbolTableEntryNo)
1717 3168 END;
1718 316B (*#B#
1719 316B IF test((.0,10.)) THEN
1720 316B BEGIN
1721 316B write(TestOut, 'SBTIM '); TSTstat(Status); TSTln;
1722 316B TSTindt; TSTindt; TSTindt; TSTsbt(SymbolTableEntryNo); TSTln;
1723 316B TSTindt; TSTindt; TSTindt; TSTvlt(SymbolTableEntryNo); TSTln;
1724 316B END;
1725 316B #E#*)
1726 316B END; (*SBTIM*)
1727 3171
1728 3171 (* *)
1729 3171 (* *)
1730 3171 (******************************************************************************)
1731 3171
1732 3171
1733 3171 (*$I B:lnkp1-1.pas getinputfiles *)
1734 3171 (******************************************************************************)
1735 3171 (* *)
1736 3171 (* Copyright (1985) by Metanic Aps., Denmark *)
1737 3171 (* *)
1738 3171 (* Author: Lars Gregers Jakobsen. *)
1739 3171 (* *)
1740 3171 (******************************************************************************)
1741 3171
1742 3171 PROCEDURE GetInputFiles(VAR GStatus: StatusType
1743 3171 ;VAR LogFile: LogFileType
1744 3171 );
1745 3171
1746 3171 VAR
1747 3171 InputFile: FileType;
1748 3171 FileNo: FileNameTableIndexType;
1749 3171 Status: StatusType;
1750 3171
1751 3171 PROCEDURE ValidateFileFormat(VAR Status: StatusType
1752 3171 ;VAR F: FileType
1753 3171 ; Format: OF_FormatType
1754 3171 );
1755 3171
1756 3171 VAR
1757 3171 OFF_Format: OF_FormatType;
1758 3171
1759 3171 BEGIN (*VALIDATEFILEFORMAT*)
1760 3171 FGi32(Status, F, OFF_Format);
1761 3197 IF OFF_Format <> Format THEN
1762 31AB Status := Status + (.BadFileFormat.);
1763 31CF (*#B#
1764 31CF IF test((.0,16,19.)) THEN
1765 31CF BEGIN
1766 31CF write(TestOut, 'GetFFvalid '); TSTstat(Status); TSTindt;
1767 31CF writeln(TestOut, 'OFF_Format=', OFF_Format);
1768 31CF END;
1769 31CF #E#*)
1770 31CF END; (*VALIDATEFILEFORMAT*)
1771 31D5
1772 31D5 PROCEDURE GetModules(VAR GStatus: StatusType
1773 31D5 ;VAR LogFile: LogFileType
1774 31D5 ; FileNumber: FileNameTableIndexType
1775 31D5 ;VAR Fl: FileType
1776 31D5 ; StartAddressOfNextModule: FileAddressType
1777 31D5 );
1778 31D5
1779 31D5 VAR
1780 31D5 Status: StatusType;
1781 31D5
1782 31D5 PROCEDURE ValidateModuleFormat(VAR Status: StatusType
1783 31D5 ;VAR F: FileType
1784 31D5 ; Format: OM_FormatType
1785 31D5 );
1786 31D5
1787 31D5 VAR
1788 31D5 OMF_Format: OM_FormatType;
1789 31D5
1790 31D5 BEGIN (*VALIDATEMODULEFORMAT*)
1791 31D5 FGi32(Status, F, OMF_Format);
1792 31FB IF OMF_Format <> Format THEN
1793 320F Status := Status + (.BadModuleFormat.);
1794 3235 (*#B#
1795 3235 IF test((.0,16,19.)) THEN
1796 3235 BEGIN
1797 3235 write(TestOut, 'GetMFvalid '); TSTstat(Status); TSTindt;
1798 3235 writeln(TestOut, 'OMF_Format=',OMF_Format);
1799 3235 END;
1800 3235 #E#*)
1801 3235 END; (*VALIDATEMODULEFORMAT*)
1802 323B
1803 323B
1804 323B PROCEDURE GetModuleHeader(VAR GStatus: StatusType
1805 323B ;VAR LogFile: LogFileType
1806 323B ; FileNo:
1807 323B FileNameTableIndexType
1808 323B ;VAR Fl: FileType
1809 323B ;VAR StartAddressOfNextModule:
1810 323B FileAddressType
1811 323B );
1812 323B
1813 323B VAR
1814 323B Status: StatusType;
1815 323B SegmentNo: SegmentNoType;
1816 323B SymbolNo: SymbolTableIndexType;
1817 323B ModuleNo: ModuleTableIndexType;
1818 323B MdtRec: ModuleTableRecordType;
1819 323B NooExpSymbols: QuadImageUnitType;
1820 323B NooExiSymbols: QuadImageUnitType;
1821 323B
1822 323B PROCEDURE GetINX(VAR Status: StatusType
1823 323B ;VAR ModuleNo: ModuleTableIndexType
1824 323B ;VAR Fl: FileType
1825 323B ;VAR StartAddressOfNextModule:
1826 323B FileAddressType
1827 323B ;VAR NooExpSymbols: QuadImageUnitType
1828 323B ;VAR NooExiSymbols: QuadImageUnitType
1829 323B );
1830 323B
1831 323B VAR
1832 323B OMH_ModuleSize: QuadImageUnitType;
1833 323B OMH_NooSegments: QuadImageUnitType;
1834 323B OMH_ModuleName: ModuleNameType;
1835 323B
1836 323B BEGIN (*GETINX*)
1837 323B WITH ModuleTable(.ModuleNo.) DO
1838 3266 BEGIN
1839 326B FGi32(Status, Fl, OMH_ModuleSize);
1840 3289 FGi32(Status, Fl, OMH_NooSegments);
1841 32A7 FGi32(Status, Fl, NooExpSymbols);
1842 32C4 FGi32(Status, Fl, NooExiSymbols);
1843 32E1 StartAddressOfNextModule :=
1844 32EC StartAddressOfNextModule + abs(OMH_moduleSize);
1845 3308 IF (OMH_NooSegments > MaxNooSegments) or
1846 331C (Noo_ExiSymbols > MaxNooExternalImportSymbols) THEN
1847 333D Status := Status + (.RangeError.)
1848 3353 ELSE
1849 3366 BEGIN
1850 336B Referenced := false;
1851 337C NooSegments := OMH_NooSegments;
1852 339B IF NooSegments > CurSegmentCount THEN
1853 33B7 CurSegmentCount := NooSegments;
1854 33CD NooExternalImportSymbols := NooExiSymbols;
1855 33F1 LatestInsert := 0;
1856 33FE FGsym(Status, Fl, OMH_ModuleName);
1857 341C IF Status = (..) THEN
1858 3435 BEGIN
1859 343A SBTEX(Status
1860 343F ,ModuleNameReference
1861 3446 ,OMH_ModuleName
1862 344D ,ModuleNo
1863 3455 ,0,0);
1864 3472 IF not (SymbolTableOverFlow IN Status) THEN
1865 348C ValueTable(.ModuleNameReference.).SegmentNo := UnResolved;
1866 34AB IF DuplicateExportSymbol IN Status THEN
1867 34C5 Status := Status - (.DuplicateExportSymbol.) +
1868 34E4 (.DuplicateModuleName.);
1869 34F4 END
1870 34F4 END
1871 34F4 END
1872 34F4 END; (*GETINX*)
1873 34FA
1874 34FA
1875 34FA PROCEDURE GetSGDs(VAR Status: StatusType
1876 34FA ; SCTBase: SectionTableIndexType
1877 34FA ; NooSegments: SegmentNoType
1878 34FA ; P_ModuleNo: ModuleTableIndexType
1879 34FA ;VAR Fl: FileType
1880 34FA );
1881 34FA
1882 34FA LABEL
1883 34FA 99;
1884 34FA
1885 34FA VAR
1886 34FA SegmentInx: SegmentNoType;
1887 34FA Dummy32: QuadImageUnitType;
1888 34FA
1889 34FA BEGIN (*GETSEGMENTDESCRIPTORS*)
1890 34FA FOR SegmentInx := 1 TO NooSegments DO
1891 351C BEGIN
1892 3521 IF Status <> (..) THEN
1893 353A GOTO 99;
1894 3542 WITH SectionTable(.SCTbase + SegmentInx.) DO
1895 3570 BEGIN
1896 3575 SegmentNo := SegmentInx;
1897 3584 ModuleNo := P_ModuleNo;
1898 3598 FGi32(Status, Fl, Dummy32);
1899 35B6 ImageSize := abs(Dummy32);
1900 35D1 FGi32(Status, Fl, Dummy32);
1901 35EF OvrSize := abs(Dummy32);
1902 360C (*#B#
1903 360C IF test((.0,16,19.)) THEN
1904 360C BEGIN
1905 360C write(TestOut, 'GetSGDs '); TSTstat(Status);
1906 360C TSTindt; TSTsct(SCTbase + SegmentInx); TSTln
1907 360C END;
1908 360C #E#*)
1909 360C END;
1910 360C END;
1911 3616 99:; END; (*GETSEGMENTDESCRIPTORS*)
1912 361C
1913 361C PROCEDURE GetEXP(VAR GStatus: StatusType
1914 361C ;VAR LogFile: LogFileType
1915 361C ;VAR Fl: FileType
1916 361C ;VAR LinkHead: SymbolTableIndexType
1917 361C ; ModuleNo: ModuleTableIndexType
1918 361C ; NooExpSymbols: i32
1919 361C );
1920 361C
1921 361C VAR
1922 361C Status: StatusType;
1923 361C SymbolCount: i32;
1924 361C DuplicateCount: i32;
1925 361C RelocationIndicator: RelocationIndicatorType;
1926 361C EXP_RelocationIndicator: ImageUnitType;
1927 361C EXP_Item: QuadImageUnitType;
1928 361C EXP_SymbolName: SymbolNameType;
1929 361C SymbolTableEntryNo: SymbolTableIndexType; (*DUMMY*)
1930 361C ModuleName: ModuleNameType;
1931 361C
1932 361C BEGIN (*GETEXPORTLIST*)
1933 361C Status := (..);
1934 363C LinkHead := 0;
1935 3649 LatestInsert := 0;
1936 3656 SymbolCount := 0;
1937 3665 DuplicateCount := 0;
1938 3674 IF SymbolCount < NooExpSymbols THEN
1939 3689 BEGIN
1940 368E SymbolCount := SymbolCount + 1;
1941 369E FGi8( Status, Fl, EXP_RelocationIndicator);
1942 36BD IF EXP_RelocationIndicator IN (.0..MaxNooSegments.) THEN
1943 36CF RelocationIndicator := EXP_RelocationIndicator
1944 36D4 ELSE
1945 36E3 Status := Status + (.RangeError.);
1946 370B FGi32(Status, Fl, EXP_Item);
1947 372A FGsym(Status, Fl, EXP_SymbolName);
1948 3749 IF Status = (..) THEN
1949 3763 BEGIN
1950 3768 SBTEX(Status
1951 376D ,LinkHead
1952 3775 ,EXP_SymbolName
1953 377C ,ModuleNo
1954 3784 ,EXP_RelocationIndicator
1955 378B ,EXP_Item
1956 3796 );
1957 37A3 IF DuplicateExportSymbol IN Status THEN
1958 37BC BEGIN
1959 37C1 DuplicateCount := DuplicateCount + 1;
1960 37D1 IF DuplicateCount <= 1 THEN
1961 37E4 LogHdds(LogFile);
1962 37F3 NMTG(SymbolTable(.
1963 37F8 ModuleTable(.ModuleNo
1964 37F8 .).ModuleNameReference
1965 380C .).NameReference
1966 3822 ,ModuleName
1967 3828 );
1968 3837 LogDDS(LogFile
1969 383C ,EXP_RelocationIndicator
1970 3843 ,EXP_Item
1971 384E ,EXP_SymbolName
1972 3854 ,ModuleName
1973 385C );
1974 3867 END
1975 3867 END;
1976 3867 GStatus := GStatus + Status;
1977 3892 END;
1978 3892 WHILE (GStatus <= (.DuplicateExportSymbol.)) and
1979 38AA (SymbolCount < NooExpSymbols) DO
1980 38C5 BEGIN
1981 38CA SymbolCount := SymbolCount + 1;
1982 38DA Status := (..);
1983 38F2 FGi8( Status, Fl, EXP_RelocationIndicator);
1984 3911 IF EXP_RelocationIndicator IN (.0..MaxNooSegments.) THEN
1985 3923 RelocationIndicator := EXP_RelocationIndicator
1986 3928 ELSE
1987 3937 Status := Status + (.RangeError.);
1988 395F FGi32(Status, Fl, EXP_Item);
1989 397E FGsym(Status, Fl, EXP_SymbolName);
1990 399D IF Status = (..) THEN
1991 39B7 BEGIN
1992 39BC SBTEX(Status
1993 39C1 ,SymbolTableEntryNo
1994 39C9 ,EXP_SymbolName
1995 39D1 ,ModuleNo
1996 39D9 ,EXP_RelocationIndicator
1997 39E0 ,EXP_Item
1998 39EB );
1999 39F8 IF DuplicateExportSymbol IN Status THEN
2000 3A11 BEGIN
2001 3A16 DuplicateCount := DuplicateCount + 1;
2002 3A26 IF DuplicateCount <= 1 THEN
2003 3A39 LogHdds(LogFile);
2004 3A48 NMTG(SymbolTable(.
2005 3A4D ModuleTable(.ModuleNo
2006 3A4D .).ModuleNameReference
2007 3A61 .).NameReference
2008 3A77 ,ModuleName
2009 3A7D );
2010 3A8C LogDDS(LogFile
2011 3A91 ,EXP_RelocationIndicator
2012 3A98 ,EXP_Item
2013 3AA3 ,EXP_SymbolName
2014 3AA9 ,ModuleName
2015 3AB1 );
2016 3ABC END
2017 3ABC END;
2018 3ABC GStatus := GStatus + Status
2019 3AD2 END; (*WHILE ... DO*)
2020 3AEA END; (*GETEXPORTLIST*)
2021 3AF0
2022 3AF0 PROCEDURE GetEXI(VAR Status: StatusType
2023 3AF0 ;VAR Fl: FileType
2024 3AF0 ; ModuleNo: ModuleTableIndexType
2025 3AF0 ; NooExternalImportSymbols: i32
2026 3AF0 );
2027 3AF0
2028 3AF0 VAR
2029 3AF0 SymbolTableEntryNo: SymbolTableIndexType;
2030 3AF0 SymbolCount: i32;
2031 3AF0 EXI_SymbolName: SymbolNameType;
2032 3AF0
2033 3AF0 BEGIN (*GETEXTERNALIMPORTLIST*)
2034 3AF0 SymbolCount := 0;
2035 3B07 WHILE (Status = (..)) and
2036 3B1D (SymbolCount < NooExternalImportSymbols) DO
2037 3B37 BEGIN
2038 3B3C SymbolCount := SymbolCount + 1;
2039 3B4C FGsym(Status, Fl, EXI_SymbolName);
2040 3B6A IF Status = (..) THEN
2041 3B82 SBTIM(Status
2042 3B87 ,SymbolTableEntryNo
2043 3B8E ,EXI_SymbolName
2044 3B96 ,ModuleNo
2045 3B9E );
2046 3BAC END; (*WHILE ... DO*)
2047 3BAF END; (*GETEXTERNALIMPORTLIST*)
2048 3BB5
2049 3BB5
2050 3BB5
2051 3BB5 BEGIN (*GETMODULEHEADER*)
2052 3BB5 Status := (..);
2053 3BD5 MDTA(Status, ModuleNo, 1);
2054 3BF0 IF Status = (..) THEN
2055 3C0A BEGIN
2056 3C0F GetINX(Status, ModuleNo, Fl
2057 3C24 , StartAddressOfNextModule
2058 3C2B , NooExpSymbols
2059 3C32 , NooExiSymbols);
2060 3C49 IF Status = (..) THEN
2061 3C63 WITH ModuleTable(.ModuleNo.) DO
2062 3C82 BEGIN
2063 3C87 FileNameReference := FileNo;
2064 3C96 SCTA(Status, SCTBase, NooSegments);
2065 3CC0 IF Status = (..) THEN
2066 3CDA BEGIN
2067 3CDF GetSGDs(Status
2068 3CE4 ,SCTBase
2069 3CEC ,NooSegments
2070 3CFB ,ModuleNo
2071 3D0A ,Fl
2072 3D11 );
2073 3D1B IF Status = (..) THEN
2074 3D35 BEGIN
2075 3D3A SymbolTable(.ModuleNameReference
2076 3D3F .).ModuleNo := ModuleNo;
2077 3D64 GetEXP(Status
2078 3D69 ,LogFile
2079 3D71 ,Fl
2080 3D78 ,SBTLinkHead
2081 3D7F ,ModuleNo
2082 3D8A ,NooExpSymbols
2083 3D91 );
2084 3D9E IF Status <= (.DuplicateExportSymbol.) THEN
2085 3DBA BEGIN
2086 3DBF EITOffset := CurExternalImportSymbolNo;
2087 3DD7 GetEXI(Status
2088 3DDC ,Fl
2089 3DE4 ,ModuleNo
2090 3DEB ,NooExiSymbols
2091 3DF2 );
2092 3DFF CurrentFileAddress := Fl.P;
2093 3E1E END
2094 3E1E END
2095 3E1E END
2096 3E1E END;
2097 3E1E END;
2098 3E1E GStatus := GStatus + Status;
2099 3E49 (*#B#
2100 3E49 IF test((.0,6,16,19.)) THEN
2101 3E49 BEGIN
2102 3E49 write(TestOut, 'GetOMH '); TSTstat(Status); TSTln;
2103 3E49 TSTindt; TSTindt; TSTindt; TSTmdt(ModuleNo);
2104 3E49 END;
2105 3E49 #E#*)
2106 3E49 END; (*GETMODULEHEADER*)
2107 3E4F
2108 3E4F BEGIN (*GETMODULES*)
2109 3E4F REPEAT
2110 3E5C Status := (..);
2111 3E74 FilSeek(Status, InputFile, StartAddressOfNextModule);
2112 3E95 IF not (UnexpectedEof IN Status) THEN
2113 3EAE BEGIN
2114 3EB3 ValidateModuleFormat(Status, InputFile, OM_Format1);
2115 3ED3 IF UnexpectedEof IN Status THEN
2116 3EEB BEGIN
2117 3EF0 LogEOFerror(LogFile, FileNumber, InputFile.P)
2118 3F10 END
2119 3F13 ELSE IF (BadModuleFormat IN Status) THEN
2120 3F2D BEGIN
2121 3F32 LogOMFerror(LogFile, FileNumber, InputFile.P)
2122 3F52 END
2123 3F55 ELSE (* Status = (..) *)
2124 3F57 GetModuleHeader(Status
2125 3F5C ,LogFile
2126 3F64 ,FileNumber
2127 3F6B ,InputFile
2128 3F72 ,StartAddressOfNextModule
2129 3F7A );
2130 3F89 GStatus := GStatus + Status;
2131 3FB4 END
2132 3FB4 UNTIL Status - (.DuplicateExportSymbol, BadSymbolName.) <> (..);
2133 3FD2 END; (*GETMODULES*)
2134 3FD8
2135 3FD8 BEGIN (*GETINPUTFILES*)
2136 3FD8 FOR FileNo := 1 TO CurFileNo DO
2137 3FFA BEGIN
2138 3FFF Status := (..);
2139 4017 FilAsg(InputFile, FileNameTable(.FileNo.));
2140 4043 FilRst(Status, InputFile);
2141 405B IF Status = (..) THEN
2142 4075 BEGIN
2143 407A ValidateFileFormat (Status, InputFile, OF_Format1);
2144 409A IF Status = (..) THEN
2145 40B4 GetModules(Status, LogFile, FileNo, InputFile, 4)
2146 40DF ELSE IF BadFileFormat IN Status THEN
2147 4102 LogOFFerror(LogFile, FileNo);
2148 4118 END;
2149 4118 IF UnexpectedEof IN Status THEN
2150 4131 LogEOFerror(LogFile, FileNo, InputFile.P);
2151 4150 FilCls(InputFile);
2152 4160 GStatus := GStatus + Status;
2153 418B END;
2154 4195 IF CurModuleNo <= 0 THEN
2155 41A6 GStatus := GStatus + (.NoInput.);
2156 41CC END; (*GETINPUTFILES*)
2157 41D5
2158 41D5 (* *)
2159 41D5 (* *)
2160 41D5 (******************************************************************************)
2161 41D5
2162 41D5 (*$I B:lnkp1-2.pas putmodule *)
2163 41D5 (******************************************************************************)
2164 41D5 (* *)
2165 41D5 (* Copyright (1985) by Metanic Aps., Denmark *)
2166 41D5 (* *)
2167 41D5 (* Author: Lars Gregers Jakobsen. *)
2168 41D5 (* *)
2169 41D5 (******************************************************************************)
2170 41D5
2171 41D5 PROCEDURE PutTargetFile(VAR Status: StatusType
2172 41D5 ;VAR TargetFile: FileType
2173 41D5 ;VAR LogFile: LogFileType
2174 41D5 );
2175 41D5
2176 41D5 PROCEDURE PutFF(VAR Fl: FileType
2177 41D5 );
2178 41D5
2179 41D5 BEGIN (*PUTFF*)
2180 41D5 FPi32(Fl, OF_Format1);
2181 41F4 END; (*OUTFF*)
2182 41FA
2183 41FA PROCEDURE PutModule(VAR Status: StatusType
2184 41FA ;VAR TargetFile: FileType
2185 41FA ;VAR LogFile: LogFileType
2186 41FA );
2187 41FA
2188 41FA PROCEDURE PutMF(VAR Fl: FileType
2189 41FA );
2190 41FA
2191 41FA BEGIN (*PUTMF*)
2192 41FA FPi32(Fl, OM_Format1);
2193 4219 END; (*OUTMF*)
2194 421F
2195 421F PROCEDURE PutINX(VAR Status: StatusType
2196 421F ;VAR Fl: FileType
2197 421F ;VAR LogFile: LogFileType
2198 421F );
2199 421F
2200 421F VAR
2201 421F OMH_ModuleName: ModuleNameType;
2202 421F
2203 421F BEGIN (*PUTINX*)
2204 421F FPi32(Fl,0); (* OMH_Module *)
2205 423E FPi32(Fl,0); (* OMH_NooSegments *)
2206 4255 FPi32(Fl,0); (* OMH_NooExportSymbols *)
2207 426C FPi32(Fl,0); (* OMH_NooExtImportSymbols *)
2208 4283 NMTG(SymbolTable(.ModuleTable(.1.).ModuleNameReference
2209 4288 .).NameReference
2210 42A0 , OMH_ModuleName
2211 42A6 );
2212 42B5 FPsym(Fl, OMH_ModuleName);
2213 42CC END; (*PUTINX*)
2214 42D2
2215 42D2 PROCEDURE PutSGDs(VAR Status: StatusType
2216 42D2 ;VAR Fl: Filetype
2217 42D2 ;VAR LogFile: LogFileType
2218 42D2 );
2219 42D2
2220 42D2 VAR
2221 42D2 SRCinx: SectionTableIndexType;
2222 42D2 DSTinx: SectionTableIndexType;
2223 42D2 ModuleName: ModuleNameType;
2224 42D2
2225 42D2 PROCEDURE PutSGD(VAR TargetFile: FileType
2226 42D2 ; Section: SectionTableRecordType
2227 42D2 );
2228 42D2
2229 42D2 BEGIN (*PUTSGD*)
2230 42D2 WITH Section DO
2231 42F4 BEGIN
2232 42F9 FPi32(TargetFile, ImageSize);
2233 430E FPi32(TargetFile, OvrSize);
2234 4323 END;
2235 4323 END; (*PUTSGD*)
2236 4329
2237 4329 BEGIN (*PUTSGDS*)
2238 4329 Status := (..);
2239 4348 SCTA(Status, TargetSectionOffset, CurSegmentCount);
2240 4362 IF not (SectionTableOverFlow IN Status) THEN
2241 437D BEGIN
2242 4382 IF CurSegmentCount > 0 THEN
2243 4393 LogHSgd(LogFile);
2244 43A2 FOR DSTinx := 1 TO CurSegmentCount DO
2245 43BC WITH SectionTable(.TargetSectionOffset + DSTinx.) DO
2246 43EA BEGIN
2247 43EF ModuleNo := TargetModuleNo;
2248 43FD SegmentNo := DSTinx;
2249 4412 ImageSize := 0; (*TO BE UPDATED*)
2250 4429 OvrSize := 0;
2251 4442 RelocationConstant := 0;
2252 445B FOR SRCinx := 1 TO TargetSectionOffset DO
2253 4475 IF SectionTable(.SRCinx.).SegmentNo = DSTinx THEN
2254 4493 BEGIN
2255 4498 SectionTable(.SRCinx.).RelocationConstant :=
2256 44B1 ImageSize * ImageFactor;
2257 44D2 ImageSize := ImageSize +
2258 44EB SectionTable(.SRCinx.).ImageSize;
2259 450F WITH SectionTable(.SRCinx.) DO (*Log memory map element*)
2260 452E IF SectionTable(.SRCinx.).ImageSize > 0 THEN
2261 455A BEGIN
2262 455F NMTG(SymbolTable(.ModuleTable(.
2263 4564 ModuleNo.).ModuleNameReference
2264 457C .).Namereference
2265 4592 ,ModuleName
2266 4598 );
2267 45A7 LogSGD(LogFile
2268 45AC ,DSTinx
2269 45B3 ,RelocationConstant
2270 45BA ,ImageSize*ImageFactor
2271 45D7 ,ModuleName
2272 45E7 );
2273 45F2 END;
2274 45F2 (*#B#
2275 45F2 IF test((.0,6,16,19.)) THEN
2276 45F2 BEGIN
2277 45F2 write(TestOut, 'PutSGDs-1');
2278 45F2 TSTsct(SRCinx);
2279 45F2 END;
2280 45F2 #E#*)
2281 45F2 END; (* FOR SRCinx := ... *)
2282 45FC PutSGD(Fl, SectionTable(.TargetSectionOffset +
2283 4608 DSTinx.) );
2284 462F (*#B#
2285 462F IF test((.0,6,16,19.)) THEN
2286 462F BEGIN
2287 462F write(TestOut, 'PutSGDs-2');
2288 462F TSTsct(TargetSectionOffset + DSTinx);
2289 462F END;
2290 462F #E#*)
2291 462F END; (* FOR DSTinx := ... *)
2292 4639 END; (* allocation ok *)
2293 4639 END; (*PUTSGDS*)
2294 463F
2295 463F PROCEDURE PutEXP(VAR Status: StatusType
2296 463F ;VAR Target: FileType
2297 463F ;VAR LogFile: LogFileType
2298 463F );
2299 463F
2300 463F VAR
2301 463F MDTInx: ModuleTableIndexType;
2302 463F ModuleName: ModuleNameType;
2303 463F Heap: HeapType;
2304 463F HeapMax: HeapIndexType;
2305 463F Winner: SymboltableIndexType;
2306 463F SymbolNo: SymbolTableIndexType;
2307 463F EXP_RelocationIndicator: RelocationIndicatorType;
2308 463F EXP_Item: i32;
2309 463F EXP_SymbolName: SymbolNameType;
2310 463F SbtInx: SymbolTableIndexType;
2311 463F
2312 463F FUNCTION NameSwop(VAR A
2313 463F , B: SymbolNameType
2314 463F ): boolean;
2315 463F
2316 463F VAR
2317 463F I: integer;
2318 463F
2319 463F BEGIN (*NAMESWOP*)
2320 463F I := 1;
2321 4656 IF B.Length < A.Length THEN
2322 4672 BEGIN
2323 4677 WHILE (I <= B.Length) and (A.Name(.I.) >= B.Name(.I.)) DO
2324 46DE I := I + 1;
2325 46F1 NameSwop := (I > B.Length);
2326 4715 END
2327 4715 ELSE
2328 4718 BEGIN
2329 471D WHILE (I <= A.Length) and (A.Name(.I.) <= B.Name(.I.)) DO
2330 4787 I := I + 1;
2331 479A NameSwop := not (I > A.Length);
2332 47BE END;
2333 47BE (*#B#
2334 47BE IF test((.0,13.)) THEN
2335 47BE BEGIN
2336 47BE writeln(TestOut, 'NameSwop ', 'I=', I:1);
2337 47BE TSTindt; TSTindt; TSTindt;
2338 47BE write(TestOut, 'A='); TSTsymbol(A);
2339 47BE TSTindt; TSTindt; TSTindt;
2340 47BE write(TestOut, 'B='); TSTsymbol(B);
2341 47BE END
2342 47BE #E#*)
2343 47BE END; (*NAMESWOP*)
2344 47C7
2345 47C7 PROCEDURE InHeap( New: SymbolTableIndexType
2346 47C7 );
2347 47C7
2348 47C7 VAR
2349 47C7 I,J: integer;
2350 47C7 Z,V: SymbolNameType;
2351 47C7 Swop: boolean;
2352 47C7
2353 47C7 BEGIN (*INHEAP*)
2354 47C7 HeapMax := HeapMax + 1;
2355 47ED I := HeapMax;
2356 47FC NMTG(SymbolTable(.New.).NameReference, Z);
2357 482E IF I > 1 THEN
2358 4845 REPEAT
2359 484A J := I div 2;
2360 4862 NMTG(SymbolTable(. Heap(.J.) .).NameReference, V);
2361 48A7 Swop := NameSwop(V,Z);
2362 48C5 IF Swop THEN
2363 48CE BEGIN
2364 48D3 Heap(.I.) := Heap(.J.);
2365 4911 I := J
2366 4916 END
2367 491E UNTIL (I <= 1) or ( not Swop );
2368 493D Heap(.I.) := New;
2369 4964 (*#B#
2370 4964 IF test((.0,13.)) THEN
2371 4964 BEGIN
2372 4964 writeln(TestOut, 'InHeap New=', New:1);
2373 4964 TSTheap(Heap, HeapMax);
2374 4964 END;
2375 4964 #E#*)
2376 4964 END; (*INHEAP*)
2377 496A
2378 496A PROCEDURE SelectWinner(VAR Status: StatusType
2379 496A );
2380 496A
2381 496A VAR
2382 496A I,J: integer;
2383 496A Swop: boolean;
2384 496A V,W,Z: SymbolNameType;
2385 496A New: SymbolTableIndexType;
2386 496A
2387 496A BEGIN (*SELECTWINNER*)
2388 496A IF (0 < HeapMax) THEN
2389 4986 BEGIN
2390 498B Winner := Heap(.1.);
2391 49A1 WITH Symboltable(.Winner.) DO
2392 49C1 IF SortLink <> Winner THEN
2393 49D3 New := SortLink
2394 49D8 ELSE
2395 49EA BEGIN (* Chain exhausted - descrease size of heap *)
2396 49EF New := Heap(.HeapMax.);
2397 4A11 HeapMax := HeapMax - 1;
2398 4A2F END;
2399 4A2F I := 1;
2400 4A3E IF HeapMax >= 2 THEN
2401 4A52 BEGIN
2402 4A57 J := 2;
2403 4A66 Heap(.HeapMax + 1.) := New;
2404 4A92 NMTG(SymbolTable(.New.).NameReference, Z);
2405 4AC4 REPEAT
2406 4AC9 (* J <= HeapMax *)
2407 4AC9
2408 4AC9 NMTG(SymbolTable(.Heap(. J .).).NameReference, V);
2409 4B12 NMTG(SymbolTable(.Heap(.J+1.).).NameReference, W);
2410 4B5E IF NameSwop(V,W) THEN
2411 4B7A BEGIN
2412 4B7F V := W;
2413 4B99 J := J + 1
2414 4BA2 END;
2415 4BA9
2416 4BA9 Swop := NameSwop(Z,V);
2417 4BC7 IF Swop THEN
2418 4BD0 BEGIN
2419 4BD5 Heap(.I.) := Heap(.J.);
2420 4C13 I := J;
2421 4C20 J := I + I;
2422 4C32 END;
2423 4C32
2424 4C32 (*#B#
2425 4C32 IF test((.0,13.)) THEN
2426 4C32 BEGIN
2427 4C32 write(TestOut, 'SLCT-W-1 ', 'I=' , I:1
2428 4C32 , ' ':2 , 'J=' , J:1
2429 4C32 , ' ':2 , 'New=', New:1
2430 4C32 , ' ':2 , 'Swop='
2431 4C32 ); TSTbool(Swop); TSTln;
2432 4C32 TSTheap(Heap, HeapMax);
2433 4C32 END
2434 4C32 #E#*)
2435 4C32
2436 4C32 UNTIL (not Swop) or (J > HeapMax);
2437 4C58 END;
2438 4C58 Heap(.I.) := New;
2439 4C7F END
2440 4C7F ELSE
2441 4C82 Status := Status + (.HeapEmpty.);
2442 4CAA (*#B#
2443 4CAA IF test((.0,13,16,19.)) THEN
2444 4CAA BEGIN
2445 4CAA write(TestOut, 'SLCT-W-2 '); TSTstat(Status); TSTindt;
2446 4CAA writeln(TestOut, 'HeapMax=', HeapMax:1
2447 4CAA , ' ':2, 'Winner=', Winner:1
2448 4CAA );
2449 4CAA END;
2450 4CAA #E#*)
2451 4CAA END; (*SELECTWINNER*)
2452 4CB0
2453 4CB0
2454 4CB0 BEGIN (*PUTEXP*)
2455 4CB0
2456 4CB0 (*#B#
2457 4CB0 IF test((.0,13.)) THEN
2458 4CB0 BEGIN
2459 4CB0 writeln(TestOut, 'PUTEXP ');
2460 4CB0 FOR SbtInx := 1 TO MaxNooSymbols DO
2461 4CB0 WITH SymbolTable(.SbtInx.), ValueTable(.SbtInx.) DO
2462 4CB0 IF NameReference <> 0 THEN
2463 4CB0 BEGIN
2464 4CB0 TSTindt; TSTindt; TSTindt; TSTsbt(SbtInx);
2465 4CB0 TSTindt; TSTvlt(SbtInx); TSTln;
2466 4CB0 END;
2467 4CB0 END;
2468 4CB0 #E#*)
2469 4CB0
2470 4CB0 (*Initialize selection*)
2471 4CB0 HeapMax := 0;
2472 4CC1 FOR MDTInx := 1 TO TargetModuleNo - 1 DO
2473 4CE8 IF ModuleTable(.MDTInx
2474 4CED .).SBTLinkHead IN (.1..MaxNooSymbols.) THEN
2475 4D0E InHeap(ModuleTable(.MDTInx.).SBTLinkHead);
2476 4D41
2477 4D41 IF HeapMax > 0 THEN
2478 4D51 LogHxpN(LogFile);
2479 4D60 NooExpSymbols := 0;
2480 4D72
2481 4D72 WHILE (Status = (..)) DO
2482 4D8B BEGIN
2483 4D90 SelectWinner(Status);
2484 4DA3 IF Status = (..) THEN
2485 4DBC WITH SymbolTable(.Winner.), ValueTable(.Winner.) DO
2486 4DF9 IF SegmentNo > UnResolved THEN
2487 4E0A BEGIN
2488 4E0F NooExpSymbols := NooExpSymbols + 1;
2489 4E25 IF (SegmentNo > 0) THEN (*relocatable*)
2490 4E3C WITH SectionTable(.ModuleTable(.ModuleNo
2491 4E41 .).SCTbase +
2492 4E59 SegmentNo
2493 4E59 .) DO
2494 4E8A BEGIN
2495 4E8F Value := Value + RelocationConstant;
2496 4EBB END;
2497 4EBB EXP_RelocationIndicator := SegmentNo;
2498 4ECD EXP_Item := Value;
2499 4EE0 NMTG(NameReference, EXP_SymbolName);
2500 4F00 FPi8(Target, EXP_RelocationIndicator);
2501 4F17 FPi32(Target, EXP_Item);
2502 4F2C FPsym(Target, EXP_SymbolName);
2503 4F43 IF (Status = (..)) and (OPTlfk <> none) THEN
2504 4F6C BEGIN
2505 4F71 NMTG(SymbolTable(.
2506 4F76 ModuleTable(.ModuleNo
2507 4F76 .).ModuleNameReference
2508 4F8E .).NameReference
2509 4FA4 ,ModuleName
2510 4FAA );
2511 4FB9 LogXP(LogFile
2512 4FBE ,EXP_RelocationIndicator
2513 4FC5 ,EXP_Item
2514 4FCC ,EXP_SymbolName
2515 4FD2 ,ModuleName
2516 4FDA )
2517 4FE2 END;
2518 4FE5 END;
2519 4FE5 END;
2520 4FE8 Status := Status - (.HeapEmpty.);
2521 5010 IF (HeapEmpty IN Status) and (OPTlfk <> none) THEN
2522 503B BEGIN (*sort sbt/vlt by value and log*)
2523 5040 END
2524 5040 END; (*PUTEXP*)
2525 5046
2526 5046
2527 5046 PROCEDURE PutEXI(VAR Status: StatusType
2528 5046 ;VAR Target: FileType
2529 5046 ;VAR LogFile: LogFileType
2530 5046 );
2531 5046
2532 5046 LABEL
2533 5046 1;
2534 5046
2535 5046 VAR
2536 5046 ModuleName: ModuleNameType;
2537 5046 SymbolName: SymbolNameType;
2538 5046 ExiInx1: ExternalImportTableIndexType;
2539 5046 ExiInx: ExternalImportTableIndexType;
2540 5046
2541 5046 (* TargetModuleNo is a global variable *)
2542 5046
2543 5046 BEGIN (*PUTEXI*)
2544 5046 NooExiSymbols := 0;
2545 5060
2546 5060 ExiInx1 := 1;
2547 5069 FOR ExiInx1 := 1 TO CurExternalImportSymbolNo DO
2548 5083 BEGIN
2549 5088 (*#B#
2550 5088 IF test((.0,7.)) THEN
2551 5088 BEGIN
2552 5088 write(TestOut, 'PUTEXI-1 ');
2553 5088 TSTeit(ExiInx1);
2554 5088 END;
2555 5088 #E#*)
2556 5088 IF (ValueTable(.ExternalImportTable(.ExiInx1.).SymbolNo
2557 5098 .).SegmentNo = UnResolved) THEN
2558 50B0 GOTO 1;
2559 50B8 END;
2560 50C2
2561 50C2 1: IF (CurExternalImportSymbolNo > 0) THEN
2562 50D3 IF (ValueTable(.ExternalImportTable(.ExiInx1.).SymbolNo
2563 50E6 .).SegmentNo = UnResolved) THEN
2564 50FE BEGIN
2565 5103 LogHurs(LogFile);
2566 5112 FOR ExiInx := ExiInx1 TO CurExternalImportSymbolNo DO
2567 512D BEGIN
2568 5132 (*#B#
2569 5132 IF test((.0,7.)) THEN
2570 5132 BEGIN
2571 5132 write(TestOut, 'PUTEXI-2 ');
2572 5132 TSTeit(ExiInx);
2573 5132 END;
2574 5132 #E#*)
2575 5132 WITH ExternalImportTable(.ExiInx.) DO
2576 5148 WITH ValueTable(.SymbolNo.),
2577 5165 SymbolTable(.SymbolNo.) DO
2578 5187 IF SegmentNo = UnResolved THEN
2579 5198 BEGIN
2580 519D NooExiSymbols := NooExiSymbols + 1;
2581 51B3 Value := NooExiSymbols;
2582 51CA NMTG(NameReference, SymbolName);
2583 51EA FPsym(Target, SymbolName);
2584 5201 NMTG(SymbolTable(.
2585 5206 ModuleTable(.ModuleNo
2586 5206 .).ModuleNameReference
2587 521E .).NameReference
2588 5234 ,ModuleName
2589 523A );
2590 5249 LogURS(LogFile, ModuleName, SymbolName);
2591 5268 (*#B#
2592 5268 IF test((.0,16,19.)) THEN
2593 5268 BEGIN
2594 5268 writeln(TestOut, 'PutEXI '
2595 5268 , 'SymbolNo=', SymbolNo:1
2596 5268 , ' ':2, 'Value=', Value:1);
2597 5268 END;
2598 5268 #E#*)
2599 5268 END;
2600 5268
2601 5268 END;
2602 5272 END;
2603 5272 END; (*PUTEXI*)
2604 5278
2605 5278 (* TargetModuleNo is a global variable *)
2606 5278
2607 5278 BEGIN (*PUTMODULE*)
2608 5278 MDTA(Status, TargetModuleNo, 1);
2609 5296 IF not (ModuleTableOverFlow IN Status) THEN
2610 52B1 BEGIN
2611 52B6 PutMF(TargetFile);
2612 52C5 PutINX(Status, TargetFile, LogFile);
2613 52E6 IF Status = (..) THEN
2614 52FF BEGIN (*Calculate memory map, write sgd, and log*)
2615 5304 PutSGDs(Status, TargetFile, LogFile);
2616 5325
2617 5325 IF not (SectionTableOverFlow IN Status) THEN
2618 5340 BEGIN (*Relocate symbol table, write export list, and log*)
2619 5345 PutEXP(Status, TargetFile, LogFile);
2620 5366 IF Status = (..) THEN
2621 537F BEGIN (*Write EXI while logging unresolved references*)
2622 5384 PutEXI(Status, TargetFile, LogFile);
2623 53A5 END;
2624 53A5 END;
2625 53A5 END;
2626 53A5 END;
2627 53A5 END; (*PUTMODULE*)
2628 53AB
2629 53AB BEGIN (*PUTTARGETFILE*)
2630 53AB PutFF(TargetFile);
2631 53C2 PutModule(Status, TargetFile, LogFile);
2632 53E3 END; (*PUTTARGETFILE*)
2633 53E9
2634 53E9 (* *)
2635 53E9 (* *)
2636 53E9 (******************************************************************************)
2637 53E9
2638 53E9
2639 53E9 BEGIN (*PASS1*)
2640 53E9
2641 53E9 (* Initialize local data structures *)
2642 53E9 FOR SBTSubInx := 1 TO MaxNooSymbols DO
2643 5402 SymbolTable(.SBTSubInx.).NameReference := 0;
2644 5429 LatestInsert := 0;
2645 5432 CurrentSymbolCount := 0;
2646 543B CurrentNameTableIndex := 0;
2647 5444
2648 5444 GetInputFiles(Status, LogFile);
2649 545E IF Status = (..) THEN
2650 5477 BEGIN
2651 547C PutTargetFile(Status, TargetFile, LogFile);
2652 549D END;
2653 549D END; (*PASS1*)
2654 54A3
2655 54A3 (* *)
2656 54A3 (* *)
2657 54A3 (******************************************************************************)
2658 54A3
2659 54A3 (*$I B:lnkp2.pas Procedure pass2 *)
2660 54A3 (******************************************************************************)
2661 54A3 (* *)
2662 54A3 (* Copyright (1985) by Metanic Aps., Denmark *)
2663 54A3 (* *)
2664 54A3 (* Author: Lars Gregers Jakobsen. *)
2665 54A3 (* *)
2666 54A3 (******************************************************************************)
2667 54A3
2668 54A3 PROCEDURE Pass2(VAR Status: StatusType
2669 54A3 ;VAR TargetFile: FileType
2670 54A3 ;VAR LogFile: LogFileType
2671 54A3 );
2672 54A3
2673 54A3 LABEL
2674 54A3 999;
2675 54A3
2676 54A3 VAR
2677 54A3 SegmentInx: SegmentNoType;
2678 54A3 ModuleInx: ModuleTableIndexType;
2679 54A3 Crid: BitMappedFileType; (*Composite relocation import directory*)
2680 54A3 Covr: FileType; (*Composite overrun store*)
2681 54A3
2682 54A3 (*#B#(*$I B:LNKDF5.PAS Bit Map Buffer Test Output *)
2683 54A3 (*$I B:LNKDF6.PAS Bit Map Access Primitives *)
2684 54A3 (******************************************************************************)
2685 54A3 (* *)
2686 54A3 (* Copyright (1985) by Metanic Aps., Denmark *)
2687 54A3 (* *)
2688 54A3 (* Author: Lars Gregers Jakobsen. *)
2689 54A3 (* *)
2690 54A3 (******************************************************************************)
2691 54A3
2692 54A3 PROCEDURE BMG2(VAR BM: BitMappedFileType
2693 54A3 ;VAR Relocatable: boolean
2694 54A3 ;VAR Importable: boolean
2695 54A3 );
2696 54A3
2697 54A3 BEGIN (*BMG2*)
2698 54A3 WITH BM, BM.B DO
2699 54CA BEGIN
2700 54CF IF P <= 8 THEN
2701 54E0 BEGIN
2702 54E5 read(F, Y1);
2703 5510 P := P + 8;
2704 5533 END;
2705 5533 P := P - 1;
2706 5553 Relocatable := P IN I;
2707 5581 P := P - 1;
2708 55A1 Importable := P IN I;
2709 55CF (*#B#
2710 55CF IF test((.0,4.)) THEN
2711 55CF BEGIN
2712 55CF write(TestOut, 'BMG2 '); TSTbmb(BM.B);
2713 55CF write(TestOut, 'R,I= ');
2714 55CF TSTbool(Relocatable); TSTindt; TSTbool(Importable); TSTln;
2715 55CF END;
2716 55CF #E#*)
2717 55CF
2718 55CF END;
2719 55CF END; (*BMG2*)
2720 55D5
2721 55D5 PROCEDURE BMG6(VAR BM: BitMappedFileType
2722 55D5 ;VAR Index:i8
2723 55D5 );
2724 55D5
2725 55D5 VAR
2726 55D5 J: 1..6;
2727 55D5
2728 55D5 BEGIN (*BMG6*)
2729 55D5 Index := 0;
2730 55EA WITH BM, BM.B DO
2731 5609 BEGIN
2732 560E IF P < 14 THEN
2733 561C BEGIN
2734 5621 read(F, Y0);
2735 564B FOR J := 1 TO 6 DO
2736 565C Index := Index + Index + ord( (P-J) IN I );
2737 56C7 Y1 := Y0;
2738 56DF P := P + 2; (* = P - 6 + 8 *)
2739 5702 END
2740 5702 ELSE
2741 5705 BEGIN
2742 570A FOR J := 1 TO 6 DO
2743 571B Index := Index + Index + ord( (P-J) IN I );
2744 5786 P := P - 6;
2745 57A9 END;
2746 57A9 (*#B#
2747 57A9 IF test((.0,4.)) THEN
2748 57A9 BEGIN
2749 57A9 write(TestOut, 'BMG6 '); TSTbmb(BM.B);
2750 57A9 writeln(TestOut, 'Index= ',Index:1);
2751 57A9 END;
2752 57A9 #E#*)
2753 57A9 END;
2754 57A9 END; (*BMG6*)
2755 57AF
2756 57AF PROCEDURE BMP2(VAR BM: BitMappedFileType
2757 57AF ; Relocatable: boolean
2758 57AF ; Importable: boolean
2759 57AF );
2760 57AF
2761 57AF BEGIN (*BMP2*)
2762 57AF WITH BM, BM.B DO
2763 57D6 BEGIN
2764 57DB P := P - 1;
2765 57F5 IF Relocatable THEN
2766 5801 I := I + (.P.);
2767 5839 P := P - 1;
2768 5859 IF Importable THEN
2769 5865 I := I + (.P.);
2770 589D IF P <= 8 THEN (* always >= 8 *)
2771 58B4 BEGIN
2772 58B9 write(F, Y1);
2773 58E4 Y1 := 0;
2774 58F3 P := 16 (* = P + 8 *)
2775 58FE END;
2776 5900 (*#B#
2777 5900 IF test((.0,4.)) THEN
2778 5900 BEGIN
2779 5900 write(TestOut, 'BMP2 '); TSTbmb(BM.B);
2780 5900 write(TestOut, 'R,I= ');
2781 5900 TSTbool(Relocatable); TSTindt; TSTbool(Importable); TSTln;
2782 5900 END;
2783 5900 #E#*)
2784 5900 END
2785 5900 END; (*BMP2*)
2786 5906
2787 5906 PROCEDURE BMP6(VAR BM: BitMappedFileType
2788 5906 ; Index:i8
2789 5906 );
2790 5906
2791 5906 VAR
2792 5906 J: 0..5;
2793 5906
2794 5906 BEGIN (*BMP6*)
2795 5906 WITH BM, BM.B DO
2796 592D BEGIN
2797 5932 P := P - 6;
2798 594F FOR J := 0 TO 5 DO
2799 5960 BEGIN
2800 5965 IF odd(Index) THEN
2801 5973 I := I + (.P+J.);
2802 59B5 Index := Index div 2
2803 59BA END;
2804 59CC (*#B#
2805 59CC IF test((.0,4.)) THEN
2806 59CC BEGIN
2807 59CC write(TestOut, 'BMP6 '); TSTbmb(BM.B);
2808 59CC writeln(TestOut, 'Index= ', Index:1);
2809 59CC END;
2810 59CC #E#*)
2811 59CC IF P <= 8 THEN
2812 59E3 BEGIN
2813 59E8 write(F, Y1);
2814 5A13 Y1 := Y0;
2815 5A2B Y0 := 0;
2816 5A39 P := P + 8;
2817 5A5C END;
2818 5A5C END;
2819 5A5C END; (*BMP6*)
2820 5A62
2821 5A62 (* *)
2822 5A62 (* *)
2823 5A62 (******************************************************************************)
2824 5A62
2825 5A62
2826 5A62 PROCEDURE LinkSection(VAR Status: StatusType
2827 5A62 ;VAR TargetFile: FileType
2828 5A62 ;VAR LogFile: LogFileType
2829 5A62 ;VAR Crid: BitMappedFileType
2830 5A62 ;VAR Covr: FileType
2831 5A62 ;VAR SCTrec: SectionTableRecordType
2832 5A62 ;VAR MDTrec: ModuleTableRecordType
2833 5A62 );
2834 5A62
2835 5A62 LABEL
2836 5A62 99;
2837 5A62
2838 5A62 VAR
2839 5A62 Oimg: FileType;
2840 5A62 Orid: BitMappedFileType;
2841 5A62 Oovr: FileType;
2842 5A62 ImageUnit: ImageUnitType;
2843 5A62 QuadImageUnit: QuadImageUnitType;
2844 5A62 Relocatable: boolean;
2845 5A62 Importable: boolean;
2846 5A62 Index: i8;
2847 5A62 Address: FileAddressType; (*relative to current obj. section*)
2848 5A62 LocalImageSize: FileAddressType;
2849 5A62 OvrIndex: QuadImageUnitType;
2850 5A62
2851 5A62
2852 5A62 BEGIN (*LINKSECTION*)
2853 5A62 WITH MDTrec, SCTrec DO
2854 5A87 BEGIN
2855 5A8C IF ImageSize > 0 THEN
2856 5AA4 BEGIN
2857 5AA9 FilAsg(Oimg, FileNameTable(.FileNameReference.));
2858 5ADA FilRst(Status, Oimg);
2859 5AF1 FilSeek(Status, Oimg, CurrentFileAddress);
2860 5B18 CurrentFileAddress := CurrentFileAddress + ImageSize * ImageFactor;
2861 5B52
2862 5B52 WITH Orid DO
2863 5B57 BEGIN
2864 5B5C assign(F, FileNameTable(.FileNameReference.));
2865 5B8C reset(F);
2866 5BA0 seek(F, CurrentFileAddress);
2867 5BBC WITH B DO
2868 5BCE BEGIN
2869 5BD3 P := 16;
2870 5BDA I := (..);
2871 5BF2 read(F, Y1);
2872 5C19 END;
2873 5C19 END;
2874 5C19 CurrentFileAddress := CurrentFileAddress + ImageSize;
2875 5C48
2876 5C48 IF OvrSize > 0 THEN
2877 5C68 BEGIN
2878 5C6D FilAsg(Oovr, FileNameTable(.FileNameReference.));
2879 5C9E FilRst(Status, Oovr);
2880 5CB5 FilSeek(Status, Oovr, CurrentFileAddress);
2881 5CDC CurrentFileAddress := CurrentFileAddress + OvrSize;
2882 5D0D END
2883 5D0D ELSE
2884 5D10 Oovr.P := CurrentFileAddress;
2885 5D27
2886 5D27 (*CurrentFileAddress now reflects starting position of
2887 5D27 next section in file if any*)
2888 5D27
2889 5D27 Address := 0;
2890 5D36 LocalImageSize := (ImageSize - 1) * ImageFactor;
2891 5D5B WHILE (Address <= LocalImageSize) and (Status = (..)) DO
2892 5D8C BEGIN
2893 5D91 BMG2(Orid, Relocatable, Importable);
2894 5DB1 IF Relocatable <> Importable THEN
2895 5DBF BEGIN
2896 5DC4 BMG6(Orid, Index);
2897 5DDC FGi32(Status, Oimg, QuadImageUnit);
2898 5DFB IF Relocatable THEN
2899 5E07 (* Relocate *)
2900 5E07 IF Index IN (.1..NooSegments.) THEN
2901 5E35 WITH SectionTable(.SCTBase + Index.) DO
2902 5E6C QuadImageUnit := QuadImageUnit + RelocationConstant
2903 5E75 ELSE
2904 5E8E Status := Status + (.BadRelocationCode.)
2905 5EA4 ELSE
2906 5EB8 (* Import *)
2907 5EB8 BEGIN (*IMPORT*)
2908 5EBD IF Index = OvrCode THEN
2909 5EC9 IF Oovr.P < CurrentFileAddress - 3 THEN
2910 5EF0 FGi32(Status, Oovr, OvrIndex)
2911 5F0C ELSE
2912 5F12 Status := Status + (.UnexpectedEof.)
2913 5F28 ELSE
2914 5F3B OvrIndex := Index;
2915 5F4B IF OvrIndex IN (.1..NooExternalImportSymbols.) THEN
2916 5F7B WITH ValueTable(.ExternalImportTable(.EITOffset + OvrIndex
2917 5F86 .).SymbolNo
2918 5FAC .) DO
2919 5FC4 IF SegmentNo > UnResolved THEN
2920 5FD5 BEGIN
2921 5FDA QuadImageUnit := QuadImageUnit + Value; (*?* + ? *)
2922 5FF6 Importable := false;
2923 5FFF Relocatable := SegmentNo > 0;
2924 601C Index := SegmentNo;
2925 602F END
2926 602F ELSE
2927 6032 IF Value IN (.0..63.) THEN
2928 6055 Index := Value
2929 605A ELSE
2930 6071 BEGIN
2931 6076 Index := OvrCode;
2932 607F FPi32(Covr, Value);
2933 609A END
2934 609A ELSE
2935 609D Status := Status + (.BadImportCode.)
2936 60B3 END; (*IMPORT*)
2937 60C4 FPi32(TargetFile, QuadImageUnit);
2938 60D9 BMP2(Crid, Relocatable, Importable);
2939 60F6 BMP6(Crid, Index);
2940 6109 Address := Address + ImageFactor;
2941 6124 END
2942 6124 ELSE
2943 6127 IF Relocatable THEN
2944 6133 BEGIN
2945 6138 Status := Status + (.Baddibit.);
2946 615E GOTO 99; (*EXIT procedure*)
2947 6166 END
2948 6166 ELSE
2949 6169 BEGIN
2950 616E FGi8(Status, Oimg, ImageUnit);
2951 618D FPi8(TargetFile, ImageUnit);
2952 61A0 BMP2(Crid, Relocatable, Importable);
2953 61BD Address := Address + 1;
2954 61D0 END;
2955 61D0 END;
2956 61D3 LocalImageSize := ImageSize * ImageFactor;
2957 61F5 WHILE (Address < LocalImageSize) and (Status = (..)) DO
2958 6226 BEGIN
2959 622B BMG2(Orid, Relocatable, Importable);
2960 624B IF Relocatable or Importable THEN
2961 625A BEGIN
2962 625F Status := Status + (.Baddibit.);
2963 6285 GOTO 99; (*EXIT procedure*)
2964 628D END
2965 628D ELSE
2966 6290 BEGIN
2967 6295 FGi8(Status, Oimg, ImageUnit);
2968 62B4 FPi8(TargetFile, ImageUnit);
2969 62C7 BMP2(Crid, Relocatable, Importable);
2970 62E4 Address := Address + 1;
2971 62F7 END;
2972 62F7 END;
2973 62FA END; (* IF ImageSize > 0 THEN *)
2974 62FA 99: END; (* WITH MDTrec, SCTrec DO *)
2975 62FA END; (*LINKSECTION*)
2976 6303
2977 6303 PROCEDURE CopyBuffer(VAR Status: StatusType
2978 6303 ;VAR Buffer: BasicFileType
2979 6303 ;VAR TargetFile: FileType
2980 6303 ;VAR Size: FileAddressType
2981 6303 );
2982 6303
2983 6303 VAR
2984 6303 Item: i8;
2985 6303 Start: FileAddressType;
2986 6303
2987 6303 BEGIN (*COPYBUFFER*)
2988 6303 reset(Buffer);
2989 631E Start := TargetFile.P;
2990 6335 WHILE not eof(Buffer) DO
2991 634E BEGIN
2992 6353 read(Buffer, Item);
2993 6376 FPi8(TargetFile, Item); (*Advancing TargetFile.P*)
2994 6389 END;
2995 638C Size := TargetFile.P - Start;
2996 63B2 (*#B#
2997 63B2 IF test((.0,20.)) THEN
2998 63B2 BEGIN
2999 63B2 writeln(TestOut, 'CPYBUF ', 'Start= ', Start:1
3000 63B2 , ' End= ', TargetFile.P:1
3001 63B2 , ' Size= ', Size:1
3002 63B2 );
3003 63B2 END;
3004 63B2 #E#*)
3005 63B2 END; (*COPYBUFFER*)
3006 63B8
3007 63B8 PROCEDURE UPDINX(VAR Status: StatusType
3008 63B8 VAR TargetFile: FileType
3009 63B8 );
3010 63B8
3011 63B8 VAR
3012 63B8 ModuleSize: i32;
3013 63B8 ModuleName: ModuleNameType;
3014 63B8 SegmentInx: SegmentNoType;
3015 63B8
3016 63B8 BEGIN (*UPDINX*)
3017 63B8 ModuleSize := TargetFile.P - OMF_Address;
3018 63DF update(TargetFile.F);
3019 63F2 FilSeek(Status, TargetFile, OMH_Address);
3020 6410 IF Status = (..) THEN
3021 6429 BEGIN
3022 642E FPi32(TargetFile, ModuleSize);
3023 6443 FPi32(TargetFile, CurSegmentCount);
3024 645D FPi32(TargetFile, NooExpSymbols);
3025 6475 FPi32(TargetFile, NooExiSymbols);
3026 648D FGsym(Status, TargetFile, ModuleName); (*skip past name*)
3027 64AB IF Status = (..) THEN
3028 64C4 FOR SegmentInx := 1 TO CurSegmentCount DO
3029 64DE WITH SectionTable(.TargetSectionOffset + SegmentInx.) DO
3030 650C BEGIN
3031 6511 FPi32(TargetFile, ImageSize);
3032 652D FPi32(TargetFile, OvrSize);
3033 654B END;
3034 6555 END;
3035 6555 END; (*UPDINX*)
3036 655B
3037 655B BEGIN (*PASS2*)
3038 655B FOR SegmentInx := 1 TO CurSegmentCount DO
3039 657D BEGIN
3040 6582 WITH Crid DO
3041 6587 BEGIN
3042 658C rewrite(F);
3043 65A0 WITH B DO
3044 65B2 BEGIN
3045 65B7 P := 16;
3046 65BE I := (..)
3047 65CB END
3048 65D6 END;
3049 65D6 FilRwt(Covr);
3050 65E6 FOR ModuleInx := 1 TO TargetModuleNo - 1 DO
3051 660D BEGIN
3052 6612 (*#B#
3053 6612 IF test((.0,20.)) THEN
3054 6612 BEGIN
3055 6612 write(TestOut, 'Pass-2 '); TSTstat(Status); TSTindt;
3056 6612 writeln(TestOut, 'SgmInx= ', SegmentInx:1
3057 6612 , ' MdlInx= ', ModuleInx:1
3058 6612 );
3059 6612 TSTindt; TSTindt; TSTindt;
3060 6612 TSTmdt(ModuleInx);
3061 6612 TSTindt; TSTindt; TSTindt;
3062 6612 TSTsct(ModuleTable(.ModuleInx.).SCTBase + SegmentInx);
3063 6612 END;
3064 6612 #E#*)
3065 6612 IF (SectionTable(.ModuleTable(.ModuleInx
3066 6617 .).SCTBase + SegmentInx
3067 6628 .).ModuleNo = ModuleInx) THEN
3068 6656 BEGIN
3069 665B LinkSection(Status, TargetFile, LogFile, Crid, Covr
3070 667D ,SectionTable(.ModuleTable(.ModuleInx
3071 6685 .).SCTBase + SegmentInx
3072 6699 .)
3073 66C0 ,ModuleTable(.ModuleInx.)
3074 66D5 );
3075 66D9 IF Status <> (..) THEN
3076 66F2 GOTO 999; (************* EXIT BOTH FOR LOOPS **************)
3077 66FA END;
3078 66FA END;
3079 6704 WITH SectionTable(.TargetSectionOffset + SegmentInx.) DO
3080 6732 BEGIN
3081 6737 CopyBuffer(Status, Crid.F, TargetFile, ImageSize);
3082 675E CopyBuffer(Status, Covr.F, TargetFile, OvrSize);
3083 6787 END;
3084 6787 END;
3085 6791 999:
3086 6791 (*backpatch info to target.inx*)
3087 6791 UPDINX(Status, TargetFile);
3088 67A7
3089 67A7 END; (*PASS2*)
3090 67B0
3091 67B0 (* *)
3092 67B0 (* *)
3093 67B0 (******************************************************************************)
3094 67B0
3095 67B0
3096 67B0
3097 67B0 BEGIN (*LINK*)
3098 67B0 (*#B#
3099 67B0 TestInit(Input,Output);
3100 67B0 #E#*)
3101 67B0 Status := (..);
3102 67CD Optiontable.LogFileKind := None;
3103 67D7 OptionTable.TargetFileKind := Implicit;
3104 67E1 CurFileNo := 0;
3105 67EB CurModuleNo := 0;
3106 67F5 FOR SCTSubInx := 1 TO MaxNooSections DO
3107 6807 SectionTable(.SCTSubInx.).SegmentNo := 0;
3108 682B SCTOffset := 0;
3109 6835 CurSegmentCount := 0;
3110 683F CurExternalImportSymbolNo := 0;
3111 6849
3112 6849 SetUp(Status, TargetFile, LogFile, Output);
3113 6861 (*#B#
3114 6861 IF test((.0,16,17.)) THEN
3115 6861 BEGIN
3116 6861 write(TestOut, 'Link-MAIN-1 '); TSTstat(Status); TSTindt; TSTmem; TSTln
3117 6861 END;
3118 6861 #E#*)
3119 6861 IF Status = (..) THEN
3120 6877 Pass1(Status, TargetFile, LogFile);
3121 688B (*#B#
3122 688B IF test((.0,16,17.)) THEN
3123 688B BEGIN
3124 688B write(TestOut, 'Link-MAIN-2 '); TSTstat(Status); TSTln
3125 688B END;
3126 688B #E#*)
3127 688B IF Status = (..) THEN
3128 68A1 Pass2(Status, TargetFile, LogFile);
3129 68B5 (*#B#
3130 68B5 IF test((.0,16,17.)) THEN
3131 68B5 BEGIN
3132 68B5 write(TestOut, 'Link-MAIN-3 '); TSTstat(Status); TSTln
3133 68B5 END;
3134 68B5 #E#*)
3135 68B5 IF Status = (..) THEN
3136 68CB BEGIN
3137 68D0 writeln(output, 'LINK -- Normal termination')
3138 6906 END
3139 6909 ELSE
3140 690C BEGIN
3141 6911 writeln(output, 'LINK -- Abnormal termination.');
3142 694D FOR StatusInx := Success TO Error DO
3143 695F IF StatusInx IN Status THEN
3144 6972 writeln(output, ' #Error: ', ord(StatusInx):3 );
3145 69B6 IF not (NoTarget IN Status) THEN
3146 69CB erase(TargetFile.F);
3147 69D7 END
3148 69D7 END.
«eof»