Added
This commit is contained in:
122
mach/arm/cv/dl.c
Normal file
122
mach/arm/cv/dl.c
Normal file
@@ -0,0 +1,122 @@
|
||||
static char rcsid[] = "$Header$";
|
||||
#define MAXBYTE 24
|
||||
#include <stdio.h>
|
||||
#include <out.h>
|
||||
char hex[] = "0123456789ABCDEF";
|
||||
FILE *fp, *fopen();
|
||||
char **s;
|
||||
int bytes, bytcnt, checksum;
|
||||
long pc;
|
||||
struct outhead ohead;
|
||||
struct outsect sect[MAXSECT];
|
||||
|
||||
|
||||
main (argc,argv)
|
||||
int argc;
|
||||
char *argv[];
|
||||
{
|
||||
if (argc != 2) fatal ("usage: %s filename\n",argv[0]);
|
||||
if (! rd_open (*++argv))
|
||||
fatal ("can't open %s\n",*argv);
|
||||
else {
|
||||
s = argv;
|
||||
convert ();
|
||||
}
|
||||
}
|
||||
|
||||
convert ()
|
||||
{
|
||||
int i;
|
||||
|
||||
rd_ohead(&ohead);
|
||||
if (ohead.oh_flags & HF_LINK) {
|
||||
fatal("%s contains unresolved references\n",s);
|
||||
}
|
||||
rd_sect(sect, ohead.oh_nsect);
|
||||
for (i = 0; i < ohead.oh_nsect; i++) {
|
||||
rd_outsect(i);
|
||||
pc = sect[i].os_base;
|
||||
while (sect[i].os_size) {
|
||||
unsigned int sz = 8096, fl;
|
||||
extern char *calloc();
|
||||
register char *buf;
|
||||
char *pbuf;
|
||||
|
||||
if (sz > sect[i].os_size) sz = sect[i].os_size;
|
||||
sect[i].os_size -= sz;
|
||||
pbuf = buf = calloc(sz, 1);
|
||||
if (fl = sect[i].os_flen) {
|
||||
if (fl > sz) fl = sz;
|
||||
sect[i].os_flen -= fl;
|
||||
|
||||
rd_emit(buf, (long) fl);
|
||||
}
|
||||
while (sz > 0) {
|
||||
int p = bytcnt = sz < MAXBYTE ? sz : MAXBYTE;
|
||||
checksum = 0;
|
||||
sz -= p;
|
||||
if (pc > 0xffffL)
|
||||
S2record (buf);
|
||||
else S1record (buf);
|
||||
buf += p;
|
||||
}
|
||||
free(pbuf);
|
||||
}
|
||||
}
|
||||
printf ("S9030000FC\n");
|
||||
}
|
||||
|
||||
|
||||
S2record (buf)
|
||||
char *buf;
|
||||
{
|
||||
printf ("S2");
|
||||
bytcnt += 4;
|
||||
outbyte (bytcnt);
|
||||
outbyte ((int) (pc >> 16));
|
||||
outbyte ((int) (pc >> 8));
|
||||
outbyte ((int) pc);
|
||||
record ();
|
||||
}
|
||||
|
||||
S1record (buf)
|
||||
char *buf;
|
||||
{
|
||||
printf ("S1");
|
||||
bytcnt += 3;
|
||||
outbyte (bytcnt);
|
||||
outbyte ((int) (pc >> 8));
|
||||
outbyte((int) pc);
|
||||
record (buf);
|
||||
}
|
||||
|
||||
record (buf)
|
||||
register char *buf;
|
||||
{
|
||||
while (bytcnt != 0)
|
||||
{
|
||||
outbyte (*buf++);
|
||||
pc ++;
|
||||
}
|
||||
outbyte (~checksum);
|
||||
putchar ('\n');
|
||||
putchar (0);
|
||||
putchar (0);
|
||||
}
|
||||
|
||||
outbyte (b)
|
||||
int b;
|
||||
{
|
||||
checksum = (checksum + b) & 0377;
|
||||
putchar (hex[(b>>4) & 017]);
|
||||
putchar (hex[b & 017]);
|
||||
-- bytcnt;
|
||||
}
|
||||
|
||||
rd_fatal() { fatal("Read error\n"); }
|
||||
|
||||
fatal (s,a)
|
||||
{
|
||||
printf (s,a);
|
||||
exit (-1);
|
||||
}
|
||||
Reference in New Issue
Block a user