🚀 go-pugleaf

RetroBBS NetNews Server

Inspired by RockSolid Light RIP Retro Guy

Thread View: comp.sys.m68k.pc
1 messages
1 total messages Started by Mike.Blackwell Mon, 10 Sep 1990 20:48
S-record generator
#27
Author: Mike.Blackwell
Date: Mon, 10 Sep 1990 20:48
116 lines
3836 bytes
Here's a program I whipped up a while ago which let me compile and link
68030 programs on a Sun-3, then download them to a stand alone 68030
system in S-record format. These days, you should be using something
like VxWorks instead, it will make your life much simpler... Should be
enough to get you started, though.

		Mike Blackwell, Robotics Institute, Carnegie Mellon

---------- cut here ----------

/************************************************************************/
/*									*/
/* srec.c  --  Convert a.out files to Motorola S-record format.		*/
/*									*/
/* Link code modules with something like:				*/
/* test.run: $(OBJS)							*/
/*           ld -N -e _Start -s -T 8000 $(OBJS) -o test.i		*/
/*           srec test.i > test.run					*/
/*									*/
/* HISTORY								*/
/*									*/
/* 10-Jun-88  Mike Blackwell (mkb) at Carnegie Mellon University	*/
/*	Created.							*/
/*									*/
/************************************************************************/

#include <stdio.h>
#include <a.out.h>

#define TEXTPOS(x)	sizeof(x)
#define DATAPOS(x)	TEXTPOS(x) + x.a_text

main(argc, argv)
int argc;
char *argv[];
{
    long Taddr, Daddr;			/* Starting addrs of text and data */
    long Tsize, Dsize;			/* Size of text and data segs */
    struct exec filhdr;
    FILE *afp;				/* File descriptor of a.out file */

    if (argc == 2) {
	if ((afp = fopen (argv[1], "r")) == NULL) {
	    fprintf(stderr, "Can't open input file %s\n", argv[1]);
	    exit(1);
	}
    } else {
	fprintf(stderr, "Usage: %s file\n", argv[0]);
	exit(1);
    }

    /* Get the header information. */
    if (fread (&filhdr, sizeof(struct exec), 1, afp) != 1) {
	fprintf(stderr, "Bad format in input file %s\n", argv[1]);
	exit(1);
    }

    /* Check  the magic number. */
    fprintf(stderr, "Machine type = %d\n", filhdr.a_machtype);
    fprintf(stderr, "Magic number = 0%o\n", filhdr.a_magic);
    if (filhdr.a_magic != OMAGIC) {
	fprintf(stderr, "Bad magic number (0%o) in input file %s\n", filhdr.a_magic, argv[1]);
	exit(1);
    }

    /* Record the base loading address. */
    Taddr = filhdr.a_entry;
    Tsize = filhdr.a_text;
    Daddr = Taddr + Tsize;
    Dsize = filhdr.a_data;

    /* Output the records. */
    write_srec("S0", 0, 0, 0);
    outbin(afp, Taddr, Tsize);			/* Text segment */
    fseek(afp, DATAPOS(filhdr), 0);		/* Seek to data */
    outbin(afp, Daddr, Dsize);			/* Data segment */
    write_srec("S9", Taddr, 0, 0);

    fprintf(stderr, "Text segment = %06x, Size = %x\n", Taddr, Tsize);
    fprintf(stderr, "Data segment = %06x, Size = %x\n", Daddr, Dsize);
    fprintf(stderr, "Start address = %06x\n", Taddr);
}


/* Procedure that puts out records for a particular segment. */
outbin(afp, addr, size)
FILE *afp;
long addr;
int size;
{
    int i, n;
    char data[16];

    for (i = 0; i < size; i += 16) {
	n = ((i + 16) <= size) ? 16 : size - i;
	fread(data, 1, n, afp);
	write_srec("S2", addr + i, n, data);
    }
}


write_srec(stype, addr, len, data)
char *stype, *data;
int addr, len;
{
    int chk, i;

    printf("%2s%02X%06X", stype, len + 4, addr);
    chk = (len + 4);
    chk += ((addr >> 16) & 0xFF) + ((addr >> 8) & 0xFF) + (addr & 0xFF);
    for (i = 0; i < len; i++) {
	printf("%02X", data[i] & 0xFF);
	chk += data[i] & 0xFF;
    }
    printf("%02X\n", ~chk & 0xFF);
}
Thread Navigation

This is a paginated view of messages in the thread with full content displayed inline.

Messages are displayed in chronological order, with the original post highlighted in green.

Use pagination controls to navigate through all messages in large threads.

Back to All Threads