deraadt@cpsc.UCalgary.CA (Theo de Raadt) (01/31/90)
I need information on how an intel record (like an srecord) is formatted. I posted a while back looking for an 8031 assembler. A friend wrote one (for fun?), and he just posted it to comp.sources.misc. Anyone that needs it can wait for it there, or send stauffer@cpsc.ucalgary.ca mail. It's pretty waily. I added the srecord code in the assembler, but was unable to test it. Now I'd like to add irecords to it too. <tdr.
koontz@oregon.sgi.com (David Koontz) (02/02/90)
In article <2454@cs-spool.calgary.UUCP>, deraadt@cpsc.UCalgary.CA (Theo de Raadt) writes: > I need information on how an intel record (like an srecord) is > formatted. > This was intended to take 68020 code in a unix environ, strip the header off, and convert to ihex for making EPROMs. (easy to undo). I checked the source and could find no copyright notice. ================ /* ihex.c */ /* Intel hex code generating program, taken from prom.c - promdef.c written by A. Bechtolsheim in SAIL on SU-AI. C version by Andy Schneider. Takes input file specified as argv[1] and produces a file named '<inputfile>.hex'. */ #include <stdio.h> #include <strings.h> #define STRING "0123456789ABCDEF" #define OUTHEX(fp,v) {putc(STRING[(v&0xf0)>>4],fp);putc(STRING[v&0x0f],fp);} #define OUTFRAME(fp,x) {chksum+=x;OUTHEX(fp,x);} #define BIGSTRING 100 #define DEFAULTSIZE 16384 main (argc,argv) int argc; char **argv; { char infile[BIGSTRING]; char name[BIGSTRING]; char *suffix = ".hex"; char x; int i,adrs,chksum; long size = DEFAULTSIZE; FILE *input, *chan, *fopen(); if (argc < 2) { fprintf (stderr,"No source file named\n"); exit (0); } else{ fprintf (stderr,"Source file %s\n",argv[1]); } if (argc > 2){ size = atol(argv[2]); fprintf(stderr,"Specified Size: %x\n",size); } strncpy (infile,argv[1],10); strcpy (name,infile); strncat (name,suffix,4); /* add dothex */ printf ("Input filename: %s\n",infile); printf ("Output filename: %s\n",name); input = fopen(infile,"r"); if (input == NULL) { fprintf (stderr,"Can't open %s for read\n",infile); exit (0); } chan = fopen(name,"w"); if (chan == NULL) { fprintf(stderr,"Open failure on %s\n",name); exit (0); } for (i=0;i<32;i++) x = fgetc(input); /* lets remove 32 byte unix header */ for (adrs=0;adrs<= (size -1);adrs+=16) { putc(':',chan); /* record mark field */ chksum=0; /* init checksum */ OUTFRAME(chan,16); /* record length = 16 */ OUTFRAME(chan,(0xff&(adrs>>8))); /* load address field high order digit */ OUTFRAME(chan,(adrs & 0xff)); /* load address field low-order digit */ OUTHEX(chan, 0); /* record type = data */ for (i=0;i<=15;i++) { x = fgetc(input); OUTFRAME(chan,x); } OUTHEX(chan,((-(chksum&0xff))&0xff)); /* two's complement of the 8 bit sum of frames */ putc('\n',chan); } fprintf(chan,":0000000000\n"); /* final record: length=0, adrs=0, type=0, chk=0 */ fclose(input); fclose(chan); }