[net.micro.atari16] Executable file format

wampler@unmvax.UUCP (Bruce Wampler) (10/01/86)

	I'm working on porting an assembler/linker to the ST, but
I can't seem to find a description of the .PRG file format.  What
goes in the header - what does the file have to have to be loaded by
the GEMDOS loader?  Any specifics or directions to specific parts of
the developer's documentation would be most appreciated.  I will
make this assembler/linker available when it is finished.
--
Dr. Bruce E. Wampler
University of New Mexico
Department of Computer Science
Albuquerque, NM 87131

..{ucbvax | seismo!gatech | ihnp4!lanl}!unmvax!wampler

sansom@trwrb.UUCP (Richard Sansom) (10/03/86)

The following was posted some time ago by J. R. Bammi via J. M. Turner:

-- cut here --

	I extracted the following info. from documents that came
with the development system. I have only found the .prg (output
of relmod) format, and not the .o format. The input of
relmod is the standard cp/m-68K relocatable files, so I
guess the .o format is the same as for cp/m-68K. I am not at
all familiar with cp/m-68K, and i could not find anyting in the
documents I have about the format of .o files. Maybe you are
familiar with cp/m-68k or have access to the relevant cp/m-68k
documents. Looking forward to your PD diss assmebler.

The format for a .prg file is as Follows (word = 16 bits). Output of
relmod - 16 bit relocatable objects are not supported by Gem Dos.

	14 Word Header
	Text Segment Image
	Data Segment Image
	Symbol Table (Optional)
	Relocation Info (Optional)


Header Format:
	Byte	Size(words)	Contents
	0	1		Contains 601A H Denoting Contiguous
				text, data and block storage segments
	2	2		Size of Text Segment - Bytes
	6	2		Size of Data Segment - Bytes
	10	2		Size of Block Storage Segment - Bytes
	14	2		Size of Symbol Table - Bytes
	18	2		Reserved - Always Zero
	22	2		Reserved - Always Zero
				(This is supposed to contain the
				Begining of the Text Segment and
				execution, but execution always begins
				at the top of the Text segement, hence 0)
	26	1		If Zero then Relocation info IS
				present, No relocation info otherwise.
				Always Zero for Gem Dos.


Symbol Table Format:
	Each entry is 7 words.
	
	Byte	Size(words)	Contents
	0	4		Name - zero padded to 8 characters
	8	1		Type
	10	2		Value

	Type			Value
	defined			8000 H
	equated 		4000 H
	global  		2000 H
	equated register	1000 H
	external reference	 800 H
	data based reloc.	 400 H
	text based reloc.	 200 H
	bss  based reloc.	 100 H

	where:
	  reloc. == relocatable

	A symbol with multiple characteristics has the bits OR'ed in
the type field.

	The value field is the value of the symbol (address, register
number, value of an expression or some other value). When the value
field is non-zero AND the type field contains an External Symbol, the
linker interprets the value to be a common region in which the size of
the region is the value in the value field. Multiple such entries may
be present and the size of the common that the linker ultimately
decides on, is the greatest of the values, of the same name.

 The nm68 utility provided with the development system can be used to
dump the symbol table.


Relocation Information:
	If  the last word in the header is Zero the relocation info is
	present in the following format: (following symbol table if present)

	Byte	Size (BYTES)	Contents
	0	4		Offset from the beginning of the Text
				Segment of the first longword needing
				relocation.
	4	1		Relocation offset byte
	5	1		"          "      "
	.....

	xx	1		A byte containing Zero terminates

	Relocation offset byte - Gives the offset to the Next longword
in the Text Segment to relocate (offset from the First Offset ) and so
on. When an offset of Zero is encountered the relocation info
is terminated. The bytes of Relocation offset give succeeding offsets.
(so the smallest legal value is 4 (size of long word)). If a
succeeding offset is greater than 254, then a byte containg One (1)
will be encountered, signifying add 254 to the previous total.

	I hope that I explained the above clearly. I guess an example
is appropriate to say what i mean.
	Suppose that the first longword to be relocated is at offset
128 from the begining of the text segment. The next one is at offset
132 from the begining. The next is at offset 390 from the begining
of the text segment (ie. 258 bytes from the second longword to be
relocated ), Then the relocation info looks like

	byte	Size(BYTES)	Contents
	0	4		128
	4	1		4
	5	1		1	(add 254)
	6	1		4	(128 + 4 + 254 + 4 = 390)

	and so on.

-- cut here --

 __________ ______ ____ _____ ___
/_________//___   ||__|/____|/__/   Richard E. Sansom
   ___    ____/  / ____________	    TRW Electronics & Defense Sector
  /  /   /  /\  <  |    /|    /     One Space Park Drive, R3/1028
 /  /   /  /  \  \ |   / |   /	    Redondo Beach, CA 90278
/__/   /__/    \__\|__/  |__/	    {...decvax,ucbvax,ihnp4}!trwrb!sansom