97 lines
2.4 KiB
C
97 lines
2.4 KiB
C
|
#include <stdio.h>
|
||
|
#include <out.h>
|
||
|
#include "arm.h"
|
||
|
struct outhead ohead;
|
||
|
struct outsect sect[NSECT];
|
||
|
struct armhead ahead;
|
||
|
struct chunkhead chead;
|
||
|
struct areadec area[NSECT];
|
||
|
int fd;
|
||
|
|
||
|
|
||
|
main (argc,argv)
|
||
|
int argc;
|
||
|
char *argv[];
|
||
|
{
|
||
|
if (argc != 3) fatal ("usage: dl ackobj armobj\n");
|
||
|
if (! rd_open (*++argv))
|
||
|
fatal ("can't open \n");
|
||
|
if ((fd = open(*++argv, 1)) <0)
|
||
|
fatal ("can't open \n");
|
||
|
else {
|
||
|
convert ();
|
||
|
}
|
||
|
}
|
||
|
|
||
|
convert ()
|
||
|
{
|
||
|
int i,areasize=0;
|
||
|
char buf[4];
|
||
|
int cnt;
|
||
|
|
||
|
rd_ohead(&ohead);
|
||
|
if (ohead.oh_flags & HF_LINK) {
|
||
|
fatal("unresolved references\n");
|
||
|
}
|
||
|
ahead.chunkfileid = 0xC3CBC6C5;
|
||
|
ahead.maxchunks = MAXCHUNK;
|
||
|
ahead.numchunks = MAXCHUNK;
|
||
|
strncpy(ahead.entries[0].chunkid , "OBJ_HEAD", 8);
|
||
|
strncpy(ahead.entries[1].chunkid , "OBJ_AREA", 8);
|
||
|
strncpy(ahead.entries[2].chunkid , "OBJ_IDFN", 8);
|
||
|
strncpy(ahead.entries[3].chunkid , "OBJ_SYMT", 8);
|
||
|
strncpy(ahead.entries[4].chunkid , "OBJ_STRT", 8);
|
||
|
ahead.entries[0].offset = sizeof(struct armhead);
|
||
|
ahead.entries[0].size = sizeof(struct chunkhead) + ohead.oh_nsect *
|
||
|
sizeof(struct areadec);
|
||
|
ahead.entries[1].offset = ahead.entries[0].offset+ahead.entries[0].size;
|
||
|
chead.objtype = 0xC5E2D080;
|
||
|
chead.versionid = 110;
|
||
|
chead.narea = ohead.oh_nsect;
|
||
|
chead.nsymb = ohead.oh_nname;
|
||
|
chead.entrya = 0;
|
||
|
chead.entryo = 0;
|
||
|
lseek(fd, ahead.entries[1].offset, 0);
|
||
|
rd_sect(sect, ohead.oh_nsect);
|
||
|
for (i = 0; i < ohead.oh_nsect; i++) {
|
||
|
area[i].name=0;
|
||
|
area[i].atal=2|1<<7|(i=0?(1<<8):0);
|
||
|
area[i].size=sect[i].os_size;
|
||
|
area[i].nrel=0;
|
||
|
area[i].base=sect[i].os_base;
|
||
|
rd_outsect(i);
|
||
|
cnt = sect[i].os_flen;
|
||
|
areasize += cnt;
|
||
|
if (cnt!=sect[i].os_size)
|
||
|
area[i].atal |= 1<<11;
|
||
|
if (cnt & 3)
|
||
|
fatal("alignment error\n");
|
||
|
while (cnt){
|
||
|
rd_emit(buf, (long)4);
|
||
|
write(fd, buf, 4);
|
||
|
cnt -= 4;
|
||
|
}
|
||
|
}
|
||
|
ahead.entries[1].size = areasize;
|
||
|
lseek(fd, 0, 0);
|
||
|
write(fd, &ahead, sizeof(struct armhead));
|
||
|
write(fd, &chead, sizeof(struct chunkhead));
|
||
|
for(i=1; i<NSECT; i++)
|
||
|
write(fd, &area[i], sizeof(struct areadec));
|
||
|
close(fd);
|
||
|
}
|
||
|
|
||
|
fatal(s)
|
||
|
char *s;
|
||
|
{
|
||
|
printf (s);
|
||
|
exit (-1);
|
||
|
}
|
||
|
|
||
|
rd_fatal(s)
|
||
|
char *s;
|
||
|
{
|
||
|
printf (s);
|
||
|
exit (-1);
|
||
|
}
|