home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Simtel MSDOS 1992 September
/
Simtel20_Sept92.cdr
/
msdos
/
pgmutl
/
val_link.arc
/
MAP.C
< prev
next >
Wrap
Text File
|
1989-02-18
|
17KB
|
507 lines
/* MAP.C */
/*+-------------------------------------------------------------------------+
| |
| link_map |
| |
+-------------------------------------------------------------------------+*/
void link_map()
BeginDeclarations
file_info_ptr file;
#define File (*file)
group_entry_ptr grp;
#define Grp (*grp)
bit_16 i;
lseg_ptr lseg;
#define Lseg (*lseg)
lseg_ptr last_location_lseg;
public_entry_ptr pub;
#define Pub (*pub)
segment_entry_ptr seg;
#define Seg (*seg)
bit_32 stop_address;
EndDeclarations
BeginCode
map_start_time = Now;
If lst_file_list.first IsNull
Then /* No map file to be created. */
return;
EndIf;
file_open_for_write(lst_file_list.first);
print("\n");
print(" Start Stop Length Name Class\n");
TraverseList(segment_list, seg)
BeginTraverse
stop_address = Seg.address+Seg.length;
If Seg.length Exceeds 0L
Then
stop_address--;
EndIf;
print(" %05lXH %05lXH %05lXH %-22Fs %-22Fs\n",
Seg.address,
stop_address,
Seg.length,
(*Seg.segment_name).symbol,
(*Seg.class_name).symbol);
EndTraverse;
If map.set IsTrue
Then
If First(group_list) IsNotNull
Then
print("\n");
print(" Origin Group\n");
TraverseList(group_list, grp)
BeginTraverse
print(" %04X:%1X %Fs\n",
CanonicFrame((*Grp.first_segment).address),
Bit_16((*Grp.first_segment).address & 0xFL),
(*Grp.group_name).symbol);
EndTraverse;
EndIf;
public_sort_array = (public_entry_ptr_array)
allocate_memory
(Addr(dynamic_pool),
Bit_32(sizeof(public_entry_ptr)) *
Bit_32(MAX_PUBLICS_IN_LIBRARY));
n_publics_to_sort = 0;
TraverseList(external_list, pub)
BeginTraverse
LoopIf(Pub.type_entry IsNot internal);
public_sort_array[n_publics_to_sort++] = pub;
EndTraverse;
TraverseList(lib_file_list, file)
BeginTraverse
TraverseList(File.external_list, pub)
BeginTraverse
LoopIf(Pub.type_entry IsNot internal);
public_sort_array[n_publics_to_sort++] = pub;
EndTraverse;
EndTraverse;
If n_publics_to_sort Exceeds 0
Then
sort_publics_by_name(0, n_publics_to_sort-1);
print("\n");
print(" Address Publics by Name\n");
print("\n");
For i=0; i LessThan n_publics_to_sort; i++
BeginFor
pub = public_sort_array[i];
print(" %04X:%04X ",
CanonicFrame(public_frame_address(pub)),
Bit_16(public_target_address(pub) -
public_frame_address(pub)));
If Pub.Internal.lseg IsNull
Then
print("Abs ");
Else
print(" ");
EndIf;
print("%Fs\n", Pub.symbol);
EndFor;
sort_publics_by_value(0, n_publics_to_sort-1);
print("\n");
print(" Address Publics by Value\n");
print("\n");
For i=0; i LessThan n_publics_to_sort; i++
BeginFor
pub = public_sort_array[i];
print(" %04X:%04X ",
CanonicFrame(public_frame_address(pub)),
Bit_16(public_target_address(pub) -
public_frame_address(pub)));
If Pub.Internal.lseg IsNull
Then
print("Abs ");
Else
print(" ");
EndIf;
print("%Fs\n", Pub.symbol);
EndFor;
EndIf;
print("\n");
If start_address_found IsTrue
Then
print("Program entry point at %04X:%04X\n",
initial_CS,
initial_IP);
EndIf;
EndIf;
If detail_level.val Exceeds 0
Then
print("\n");
print("Next Uninitialized Byte(%05lX), EXE header Relocation Items(%u)\n",
highest_uninitialized_byte,
n_relocation_items);
print("\n");
print("Segment order expression:\n");
print("\t\"%Fs\"\n", String(ordering.val));
TraverseList(segment_list, seg)
BeginTraverse
print("\n");
print("Segment(%Fs) Class(%Fs)",
(*Seg.segment_name).symbol,
(*Seg.class_name).symbol);
If Seg.owning_group IsNotNull
Then
print(" Group(%Fs)",
(*(*Seg.owning_group).group_name).symbol);
EndIf;
print(" Combine(%s)\n",
combine_text[Seg.combine]);
print("\tStart(%05lX) Length(%05lX) Next Uninitialized Byte(%05lX)\n",
Seg.address,
Seg.length,
Seg.highest_uninitialized_byte);
If detail_level.val Exceeds 1
Then
TraverseList(Seg.lsegs, lseg)
BeginTraverse
LoopIf(Lseg.length IsZero);
print("\n");
print("File(%Fs) Next Uninitialized Byte(%05lX)\n",
(*Lseg.file).filename,
Lseg.highest_uninitialized_byte+Lseg.address);
print("\tModule(%Fs) Address(%05lX) Length(%05lX) Align(%s)\n",
(*Lseg.tmodule).symbol,
Lseg.address,
Lseg.length,
align_text[Lseg.align]);
If (detail_level.val Exceeds 2) AndIf
(Lseg.align IsNot absolute_segment) AndIf
(Seg.combine IsNot blank_common_combine)
Then
map_memory(Lseg.data, Lseg.address, Lseg.length);
EndIf;
EndTraverse;
EndTraverse;
EndIf;
If (detail_level.val Exceeds 3) AndIf (exefile IsTrue)
Then
print("\n");
print("EXE file header:\n");
map_memory(BytePtr(exe_header), 0L, exe_header_size);
EndIf;
If detail_level.val Exceeds 4
Then
last_location_lseg = Null;
print("\n");
print("Fixups:\n");
file_open_for_read(temp_file);
file_read(BytePtr(Addr(temp_file_header)), sizeof(temp_file_header));
While temp_file_header.rec_typ IsNotZero
BeginWhile
If temp_file_header.rec_typ IsNot FIXUPP_record
Then
file_position(Bit_32(infile.byte_position) +
infile.start_of_buffer_position +
Bit_32(temp_file_header.rec_len));
file_read(BytePtr(Addr(temp_file_header)), sizeof(temp_file_header));
ContinueLoop;
Else
file_read(BytePtr(Addr(fixup)), temp_file_header.rec_len);
EndIf;
If last_location_lseg IsNot temp_file_header.lseg
Then
lseg = temp_file_header.lseg;
seg = Lseg.segment;
print("\n");
print("Fixups for File(%Fs), Module(%Fs), Segment(%Fs)\n",
(*Lseg.file).filename,
(*Lseg.tmodule).symbol,
(*Seg.segment_name).symbol);
EndIf;
last_location_lseg = temp_file_header.lseg;
print("\tLocation(%05lX) Type(%s) Mode(%s)\n",
(*temp_file_header.lseg).address +
Bit_32(temp_file_header.offset),
type_text[fixup.location_type],
mode_text[fixup.mode]);
print("\t\tFrame(");
Using fixup.frame_method
BeginCase
When 0:
lseg = (lseg_ptr) fixup.frame_referent;
seg = Lseg.segment;
print("Seg(%Fs)", (*Seg.segment_name).symbol);
break;
When 1:
grp = (group_entry_ptr) fixup.frame_referent;
print("Grp(%Fs)", (*Grp.group_name).symbol);
break;
When 2:
pub = (public_entry_ptr) fixup.frame_referent;
print("Ext(%Fs)", Pub.symbol);
break;
When 3:
print("Abs(%04lX)", ((bit_32)(fixup.frame_referent)));
break;
When 4:
print("Location");
break;
When 5:
print("Target");
break;
When 6:
print("None");
break;
EndCase;
print(") Target(");
Using fixup.target_method
BeginCase
When 0:
lseg = (lseg_ptr) fixup.target_referent;
seg = Lseg.segment;
print("Seg(%Fs)+%04lX",
(*Seg.segment_name).symbol,
Bit_32(fixup.target_offset) +
(Lseg.address - Seg.address));
break;
When 1:
grp = (group_entry_ptr) fixup.target_referent;
print("Grp(%Fs)+%04lX",
(*Grp.group_name).symbol,
Bit_32(fixup.target_offset));
break;
When 2:
pub = (public_entry_ptr) fixup.target_referent;
print("Ext(%Fs)+%04lX",
Pub.symbol,
Bit_32(fixup.target_offset));
break;
When 3:
print("Abs(%04lX)", ((bit_32)(fixup.target_referent)));
break;
EndCase;
print(")\n");
file_read(BytePtr(Addr(temp_file_header)), sizeof(temp_file_header));
EndWhile;
file_close_for_read();
EndIf;
EndIf;
file_close_for_write();
return;
EndCode
#undef File
#undef Grp
#undef Pub
#undef Seg
#undef Lseg
/*+-------------------------------------------------------------------------+
| |
| map_memory |
| |
+-------------------------------------------------------------------------+*/
void map_memory(byte_ptr data, bit_32 address, bit_32 length)
BeginDeclarations
bit_16 i;
bit_32 line_address;
char ascii[20];
EndDeclarations
BeginCode
line_address = address & 0xFFFF0L;
While length Exceeds 0
BeginWhile
print("%05X: ", line_address);
far_set(BytePtr(ascii), 0, 20);
For i=0; i<16; i++
BeginFor
If i Is 8
Then
print(" :");
strcat(ascii, " : ");
EndIf;
If (line_address LessThan address) OrIf (length IsZero)
Then
print(" ..");
ascii[strlen(ascii)] = ' ';
line_address++;
Else
print(" %02X", *data);
If isprint(*data)
Then
ascii[strlen(ascii)] = (char) *data;
Else
ascii[strlen(ascii)] = '.';
EndIf;
data++;
line_address++;
address++;
length--;
EndIf;
EndFor;
print(" %s\n", ascii);
EndWhile;
return;
EndCode
/*+-------------------------------------------------------------------------+
| |
| sort_publics_by_name |
| |
+-------------------------------------------------------------------------+*/
void sort_publics_by_name(bit_16 left, bit_16 right)
BeginDeclarations
bit_16 i;
bit_16 j;
public_entry_ptr temp;
EndDeclarations
BeginCode
If left NotLessThan right
Then
return;
EndIf;
i = left;
j = right;
While i LessThan j
BeginWhile
While i LessThan j
BeginWhile
If far_compare((*public_sort_array[i]).symbol,
(*public_sort_array[j]).symbol,
(*public_sort_array[i]).length+1) Exceeds 0
Then
temp = public_sort_array[i];
public_sort_array[i] = public_sort_array[j];
public_sort_array[j] = temp;
ExitLoop;
EndIf;
j--;
EndWhile;
While i LessThan j
BeginWhile
If far_compare((*public_sort_array[i]).symbol,
(*public_sort_array[j]).symbol,
(*public_sort_array[i]).length+1) Exceeds 0
Then
temp = public_sort_array[i];
public_sort_array[i] = public_sort_array[j];
public_sort_array[j] = temp;
ExitLoop;
EndIf;
i++;
EndWhile;
EndWhile;
If i Exceeds 0
Then
sort_publics_by_name(left, i-1);
EndIf;
sort_publics_by_name(i+1, right);
return;
EndCode
/*+-------------------------------------------------------------------------+
| |
| sort_publics_by_value |
| |
+-------------------------------------------------------------------------+*/
void sort_publics_by_value(bit_16 left, bit_16 right)
BeginDeclarations
bit_16 i;
bit_16 j;
public_entry_ptr temp;
EndDeclarations
BeginCode
If left NotLessThan right
Then
return;
EndIf;
i = left;
j = right;
While i LessThan j
BeginWhile
While i LessThan j
BeginWhile
If (((*public_sort_array[i]).Internal.lseg IsNull) AndIf
((*public_sort_array[j]).Internal.lseg IsNotNull)) OrIf
(public_target_address(public_sort_array[i]) Exceeds
public_target_address(public_sort_array[j]))
Then
temp = public_sort_array[i];
public_sort_array[i] = public_sort_array[j];
public_sort_array[j] = temp;
ExitLoop;
EndIf;
j--;
EndWhile;
While i LessThan j
BeginWhile
If (((*public_sort_array[i]).Internal.lseg IsNull) AndIf
((*public_sort_array[j]).Internal.lseg IsNotNull)) OrIf
(public_target_address(public_sort_array[i]) Exceeds
public_target_address(public_sort_array[j]))
Then
temp = public_sort_array[i];
public_sort_array[i] = public_sort_array[j];
public_sort_array[j] = temp;
ExitLoop;
EndIf;
i++;
EndWhile;
EndWhile;
If i Exceeds 0
Then
sort_publics_by_value(left, i-1);
EndIf;
sort_publics_by_value(i+1, right);
return;
EndCode
/*
Start Stop Length Name Class
00000H 016F7H 016F8H _TEXT CODE
016F8H 016F8H 00000H C_ETEXT ENDCODE
01700H 01741H 00042H NULL BEGDATA
01742H 01967H 00226H _DATA DATA
01968H 01975H 0000EH CDATA DATA
01976H 01976H 00000H XIFB DATA
01976H 01976H 00000H XIF DATA
01976H 01976H 00000H XIFE DATA
01976H 01976H 00000H XIB DATA
01976H 01976H 00000H XI DATA
01976H 01976H 00000H XIE DATA
01976H 01976H 00000H XPB DATA
01976H 01977H 00002H XP DATA
01978H 01978H 00000H XPE DATA
01978H 01978H 00000H XCB DATA
01978H 01978H 00000H XC DATA
01978H 01978H 00000H XCE DATA
01978H 01978H 00000H XCFB DATA
01978H 01978H 00000H XCF DATA
01978H 01978H 00000H XCFE DATA
01978H 01978H 00000H CONST CONST
01978H 0197FH 00008H HDR MSG
01980H 01A4DH 000CEH MSG MSG
01A4EH 01A4FH 00002H PAD MSG
01A50H 01A50H 00001H EPAD MSG
01A52H 01A77H 00026H _BSS BSS
01A78H 01A78H 00000H XOB BSS
01A78H 01A78H 00000H XO BSS
01A78H 01A78H 00000H XOE BSS
01A80H 02085H 00606H c_common BSS
02090H 0288FH 00800H STACK STACK
Origin Group
0170:0 DGROUP
Address Publics by Name
0170:005C STKHQQ
Address Publics by Value
0000:0010 _main
0000:9876 Abs __acrtmsg
0000:9876 Abs __acrtused
Program entry point at 0000:0294
*/