home *** CD-ROM | disk | FTP | other *** search
- /* 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
-
-
- */