home *** CD-ROM | disk | FTP | other *** search
- Newsgroups: alt.sources
- From: Mike.Blackwell@ROVER.RI.CMU.EDU
- Subject: [comp.sys.m68k.pc] S-record generator
- Message-ID: <1990Sep11.173917.12127@math.lsa.umich.edu>
- Date: Tue, 11 Sep 90 17:39:17 GMT
-
- Archive-name: srec/10-Sep-90
- Original-posting-by: Mike.Blackwell@ROVER.RI.CMU.EDU
- Original-subject: S-record generator
- Reposted-by: emv@math.lsa.umich.edu (Edward Vielmetti)
-
- [Reposted from comp.sys.m68k.pc.
- Comments on this service to emv@math.lsa.umich.edu (Edward Vielmetti).]
-
- 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);
- }
-