Here  is the format of object files generated by the  macro  assembler
and Microsoft C Compiler.

	+---------------------------------------+
	| BYTE	Record type			|
	|	80	Module name		|
	|	82				|
	|	84				|
	|	86				|
	|	88				|
	|	8A	End of module		|
	|	8C	External symbols	|
	|	8E				|
	|	90	Public symbols		|
	|	92				|
	|	94	Line number info	|
	|	96	Segment/Group symbols	|
	|	98	Info for specific seg	|
	|	9A	Info for specific group	|
	|	9C	Relocation list		|
	|	9E				|
	|	A0	Segment data		|
	|	A2	Duplicated Segment Data	|
	+---------------------------------------+
	| WORD	Count of bytes in record, inc-	|
	|	luding the record checksum, but	|
	|	not including record type or 	|
	|	byte count			|
	+---------------------------------------+
	| ....	Record  Data  ....		|
	|	See specific record for details |
	+---------------------------------------+
	| BYTE	Checksum of all characters in   |
	|	record, including record type	|
	+---------------------------------------+


Now for each one of the record types.  In the following  descriptions,
certain  terminology will be used.  Many of these record use a  number
which  relates some particular field to a value.  These numbers  range
from  1-255.  In some cases, this number will relate an  instantiation
of  a symbol to the name of the symbol.  In other cases,  this  number
will  relate the segment or group instance with the actual segment  or
group of the instantiation.

Module Name record (80) This record specifies the name of the  module.
The record data field will be filled in as follows:
	+---------------------------------------+
	| BYTE	Length of Module name		|
	+---------------------------------------+
	| (Length) BYTES   Module Name		|
	+---------------------------------------+

End of Module record (8A)
This record specifies the end of the module.  The record  data  field
will be filled with a zero byte
	+---------------------------------------+
	| BYTE	Zero				|
	+---------------------------------------+


External  Symbols Record (8C)
This  record specifies the names of the external symbols.  The  record
data  field is filled in as follows, and record data  fields  defining
the symbols may appear more than once.
	+---------------------------------------+
	| BYTE	Length  of external symbol	|
	+---------------------------------------+
	| (Length) BYTES    External symbol name|
	+---------------------------------------+
	| BYTE	Zero				|
	+---------------------------------------+

Public Symbols Record (90)
This record defines the symbols declared as public symbols.  Only  one
symbol  will appear per record data field.  The record data  field  is
defined as follows:
	+---------------------------------------+
	| BYTE	Zero				|
	+---------------------------------------+
	| BYTE	Segment number in which symbol	|
	|	is defined			|
	+---------------------------------------+
	| BYTE	Length of symbol		|
	+---------------------------------------+
	| (Length) BYTES    Public Symbol Name	|
	+---------------------------------------+
	| WORD	Offset where symbol defined	|
	+---------------------------------------+
	| BYTE	Zero				|
	+---------------------------------------+


Line Number Information Record (94)
This  record  defines   line   number   debugging  information.   This
information is in the form of the line number of the source file,  and
the  address  at  which the code corresponding  to  that  line  number
starts.  The record data field will be filled in as follows:
	+---------------------------------------+
	| BYTE	Zero				|
	+---------------------------------------+
	| BYTE	Segment number			|
	+---------------------------------------+
	| WORD	Line number in source file	|
	+---------------------------------------+
	| WORD	Offset of start of line		|
	+---------------------------------------+

For  this  record, the last two field may be repeated  any  number  of
times.


Segment/Group Symbols Record  (96)
This record defines the names of the symbols used in the module  name,
segment names, and group names.  The segment symbol numbers the relate
the  segment  numbers  to this name.  The record data  field  will  be
filled in as follows:
	+---------------------------------------+
	| BYTE	Zero				|
	+---------------------------------------+
	| BYTE	Length of symbol name		|
	+---------------------------------------+
	| (Length) BYTES  Symbol Name		|
	+---------------------------------------+

The last two field may be repeated any number of times.


Segment Specific Information Record  (98)
This  record defines the combine and alignment classes of  a  specific
segment.   Segment  numbers are assigned in the order in  which  these
records  may appear.  The first occurrence of this record defines  the
first memory segment, and so on.  The record data field will be filled
in as follows:
	+---------------------------------------+
	| BYTE	Combine/Alignment Class:	|
	|	is defined as 0AAXPS00		|
	|	where AA is the alignment class	|
	|		00=AT (Specific segment |
	|		   alignment)		|
	|		01=BYTE boundary	|
	|		10=WORD boundary	|
	|		11=PARAGRAPH boundary	|
	|	      X is unknown: used in stk	|
	|	      P is a public segment	|
	|	      S is a stack segment	|
	+---------------------------------------+
	| WORD	Segment size in bytes		|
	+---------------------------------------+
	| BYTE	Segment/Group Symbol Number	|
	+---------------------------------------+
	| BYTE	Not sure just yet.		|
	+---------------------------------------+
	| BYTE	Not sure just yet: usually 1	|
	+---------------------------------------+


Group Specific Information Record  (9A)
This  record defines the memory segments which will be contained in  a
group.  The format of the record data field is defines as follows:
	+---------------------------------------+
	| BYTE	Segment/Group Symbol Number	|
	+---------------------------------------+
	| BYTE	FF				|
	+---------------------------------------+
	| BYTE	Segment number			|
	+---------------------------------------+

The last two field will be repeated for every segment in a group.


Relocation List Record  (9C)
This record defines the offsets in the just previously defined  memory
segment  which need fixing up.  Multiple fixups may occur in the  data
record field, and is defined as follows:
	+---------------------------------------+
	| BYTE	Attributes needed/Relocation	|
	|	offset MSB and is defined as:	|
	|	1A00SOFFF  where		|
	|	A means absolute address needed	|
	|	S means segment number needed	|
	|	O means offset needed		|
	|	FFF is the 3 Least Significant  |
	|	    bits of the MSB of fixup	|
	|	    offset			|
	+---------------------------------------+
	| BYTE	LSB of fixup offset		|
	+---------------------------------------+
	| BYTE	Relocation type	and is defined	|
	|	as 00LG0AE0 where		|
	|	L means length of symbol needed	|
	|	G means group override		|
	|	A means the address is needed	|
	|	E means the symbol is external	|
	+---------------------------------------+
	| BYTE	Group/Segment number.  If Bit 4	|
	|	of the previous byte was set, 	|
	|	this will be a group number,	|
	|	otherwise it is segment number	|
	+---------------------------------------+
	| BYTE	Destination Segment Number	|
	+---------------------------------------+
	| BYTE	Source Symbol/Segment Number	|
	+---------------------------------------+
	| WORD	Destination offset if Relocation|
	|	type byte is zero, otherwise	|
	|	nonexistant.			|
	+---------------------------------------+


Memory Segment Information Record  (A0)
This  record  defines  the contents of a memory  segment.   One record
for  each segment will appear for each segment which has locations  to
be  defined.   For program code, this will be the  actual  code.   For
data,  this will be the initial contents of the  data.     No   memory
segment record will exceed 1024 bytes, because of the relocation  list
which  may follow.  The format of the data record field is defined  as
follows:
	+---------------------------------------+
	| BYTE	Memory segment number		|
	+---------------------------------------+
	| WORD	Origin in segment		|
	+---------------------------------------+
	| .....  Data for Segment  .....	|
	+---------------------------------------+


Duplicate Memory Segment Information Record  (A2)
This record defines the contents of duplicated memory segment, such as
when  the assembler encounters a DUP in DB directive.  The  format  of
the data record field is defines as follows:
	+---------------------------------------+
	| BYTE	Memory Segment Number		|
	+---------------------------------------+
	| WORD	Origin in Segment		|
	+---------------------------------------+
	| WORD	Number of Duplication times	|
	+---------------------------------------+
	| WORD	1				|
	+---------------------------------------+
	| WORD	1				|
	+---------------------------------------+
	| WORD	0				|
	+---------------------------------------+
	| BYTE	Length of DUP item		|
	+---------------------------------------+
	| (Length) BYTES   DUP data		|
	+---------------------------------------+
ąS