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