[net.micro.atari] atst.out.h - format of .prg files

turner@imagen.UUCP (D'arc Angel) (01/16/86)

~~~~~~~~~~~~~~~~~~~~~~~~~~~~\ lineater,\~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

so far this is the only source i have worth contributing, hopefully
more will follow, this is a .h file i wrote (with some help from a
friend at CWRU) that describes the format of the header for atari .o
and .prg files:

/*	atst.out.h	.1	24Dec85	*/

/*
 * Header prepended to each Atari ST .prg file
 */
struct exec {
	 short	a_magic;	/* magic number */
unsigned long	a_text;		/* size of text segment */
unsigned long	a_data;		/* size of initialized data */
unsigned long	a_bss;		/* size of uninitialized data */
unsigned long	a_syms;		/* size of symbol table */
unsigned long	a_AZero1;	/* always zero */
unsigned long	a_AZero2;	/* always zero */
unsigned short	a_isreloc;	/* is reloc info present */
};

#define	CMAGIC	0x601a		/* contiguous text */

#define	ISRELOCINFO	0	/* relocation information is present */
				/*  any other value - no reloc info  */

/*
 * Macros which take exec structures as arguments and tell whether
 * the file has a reasonable magic number or offsets to text|symbols|strings.
 */
#define	N_BADMAG(x) \
    (((x).a_magic)!=CMAGIC)
#define	N_TXTOFF(x) \
	((x).a_magic==ZMAGIC ? 1024 : sizeof (struct exec))
#define N_SYMOFF(x) \
	(N_TXTOFF(x) + (x).a_text+(x).a_data)
#define	N_STROFF(x) \
	(N_SYMOFF(x) + (x).a_syms)

/*
 * Format of a relocation datum.
 */
struct relocation_info {
	 int	r_address;	/* offset from beg of Text Segment of */
				/* 1st longword needing relocation    */
unsigned char	r_offset;	/* reloc offset byte */
};

/*
 * Format of a symbol table entry
 */

struct	nlist {
	 char	n_name[9];	/* symbol name */
unsigned short	n_type;		/* type flag, i.e. N_TEXT etc; see below */
unsigned long	n_value;	/* value of this symbol (or sdb offset) */
};

/*
 * Simple values for n_type.
 */
#define	N_BSS	0x0100		/* bss */
#define	N_TEXT	0x0200		/* text */
#define	N_DATA	0x0400		/* data */
#define	N_EXT	0x0800		/* external */
#define N_EQREG	0x1000		/* equated register */
#define N_GLOBL	0x2000		/* global */
#define N_EQU	0x4000		/* equated */
#define N_DEF	0x8000		/* defined */

-------------------------------------------------------------------------

it has a problem (at least on VAXen) that C likes to add a half word
of filler after the magic number in the start of the header, anyone
have a work around for it?
-- 
			god bless Lily St. Cyr
			 -Rocky Horror Picture Show

Name:	James Turner
Mail:	Imagen Corp. 2650 San Tomas Expressway, P.O. Box 58101
        Santa Clara, CA 95052-9400
AT&T:	(408) 986-9400
UUCP:	...{decvax,ucbvax}!decwrl!imagen!turner
CompuServe: 76327,1575