|
|
DataMuseum.dkPresents historical artifacts from the history of: DKUUG/EUUG Conference tapes |
This is an automatic "excavation" of a thematic subset of
See our Wiki for more about DKUUG/EUUG Conference tapes Excavated with: AutoArchaeologist - Free & Open Source Software. |
top - metrics - downloadIndex: T d
Length: 7826 (0x1e92)
Types: TextFile
Names: »dl68.c«
└─⟦9ae75bfbd⟧ Bits:30007242 EUUGD3: Starter Kit
└─⟦3b20aab50⟧ »EurOpenD3/network/snmp/kip-snmp.91.tar.Z«
└─⟦b503a39fe⟧
└─⟦this⟧ »kip/etc/dl68.c«
/* Downloader for MACSBUG.
Author Anonymous.
Modified to store symbols: V. Pratt, Jan. 1981.
Assumed to run on a machine with VAX-type byte order in a word,
namely first text byte is least significant byte. Modify the function
reverse(lwrd) appropriately to run on another machine.
Jan. 1982 - V. Pratt - Modified to load symbol table where the Sun
bootloader puts it
*/
#include "b.out.h"
#include <stdio.h>
#define STARTADDR 0x1000 /* Default start address */
#define RCDSIZE 12 /* Size of Motorola S-type records */
#define MACSSYMTAB 0x6BA /* Symbol table starts here - MACSBUG */
#define SUNSYMTAB 0x1f000 /* Symbol table starts here - SUN */
#define SYMTAB (vflag=='m'?MACSSYMTAB:SUNSYMTAB)
#define SYMTABADDR 0x570 /* Boundaries of symbol table here */
#define MAXSYMS (vflag=='m'?((0x1000-0x6BA)/12):(0x1000/12))
#define MAXSYMST (0x1000/12) /* Max size of symbol table for either
SUN or MACSBUG */
#define hex(c) c>9 ? c+0X37 : c+0X30 /* macro for hex convert */
struct bhdr filhdr;
struct sym68 { /* fake sym for 68000 */
short dummy1; /* ignored */
char stype; /* type */
char slength; /* length */
long svalue;
};
char Sdata=2; /* Default to S2/S8 records (24 bit addr) */
char Send=8;
char vflag=0; /* 1 -> Design Module */
FILE *infile, *outfile;
char infilename[30], outfilename[30] = {0};
int syms = 0;
puthex(b) /* print byte as two hex chars */
char b;
{
register char c1,c2;
c1=(b>>4) & 0XF; c2=b & 0XF;
c1=hex(c1); c2=hex(c2);
fprintf(outfile,"%c%c",c1,c2);
}
typedef struct Msymtab /* structure of the MACSBUG symbol space */
{char name[8];
int value;
} msymtab;
reverse(lwrd) unsigned lwrd;
{return((lwrd>>24) |
(lwrd>>8 & 0xff00) |
(lwrd<<8 & 0xff0000)|
(lwrd<<24)
);
}
int checksum;
checkout(c) char c; {checksum += c; puthex(c);}
/* Procedure to print out one ExorMacs record of given type */
print_exormacs_record(type,buffer,Dcount,addr) char *buffer; int Dcount, addr;
{fprintf(outfile,"S%d",type); checksum = 0;
if (type == 2 || type == 8)
{checkout((char) Dcount+4);
checkout((char) (addr>>16));
}
else
checkout((char) Dcount+3);
checkout((char) (addr>>8));
checkout((char) addr);
while (Dcount--) checkout(*buffer++);
puthex(~(checksum & 0XFF));
fprintf(outfile,"\n");
}
/* Procedure that puts out records from a buffer */
outbuf(buffer,addr,size)
char *buffer;
int addr, size;
{
int count, /* counts total number of bytes processed*/
Dcount; /* number of bytes in current record */
for(count=0; count<size; count += RCDSIZE)
{Dcount= (size-count<RCDSIZE) ? size-count : RCDSIZE;
print_exormacs_record(Sdata,buffer,Dcount,addr);
buffer += Dcount;
addr += Dcount;
}
}
/* Procedure that puts out records from a file */
outbin(file,addr,size)
FILE *file;
int addr, size;
{
int count, /* counts total number of bytes processed*/
Dcount; /* number of bytes in current record */
char buffer[RCDSIZE]; /* buffer for data */
for(count=0; count<size; count += RCDSIZE)
{Dcount= (size-count<RCDSIZE) ? size-count : RCDSIZE;
if(fread(buffer,Dcount,1,file) != 1)
{fprintf(stderr,"Read error\n"); exit(1);}
print_exormacs_record(Sdata,buffer,Dcount,addr);
addr += Dcount;
}
}
#define lower(c) 'a' <= c && c <= 'z'
#define upper(c) 'A' <= c && c <= 'Z'
#define digit(c) '0' <= c && c <= '9'
macify(c) char c; /* convert c to a form acceptable to MACSBUG */
{return
(lower(c)? c-32:
upper(c)? c:
digit(c)? c:
c == '_'? '.':
/*default*/ '$' /* rags to riches */
);
}
/* Procedure to convert symbol table to .r format */
rbuild(table,source,size) struct sym68 *table; FILE *source; int *size;
{struct sym s; int symno, chrno; char c;
struct sym68 *s68 = table;
int pos;
for (pos=0; pos < filhdr.ssize; )
{if (!fread(&s,sizeof s,1,source)) break;/* Get symbol descriptor */
pos += sizeof s;
s68 = (struct sym68 *)((int)s68 -2); /* kludge */
s68->stype = s.stype;
s68->slength = s.slength;
s68->svalue = reverse(s.svalue);
s68++;
while (*(char *)s68 = getc(source)) {
s68 = (struct sym68 *)((int)s68 + 1);
pos++;
}
s68 = (struct sym68 *)((int)s68 + strlen(s68)+1);
if ((int)s68 & 1) {
*((char *)s68) = 0; /* clear extra byte */
s68 = (struct sym68 *)((int)s68 + 1); /* word align */
}
}
*size = (int)s68 - (int)table;
}
/* Procedure to convert symbol table to MACSBUG format */
build(table,source,size) msymtab table[]; FILE *source; int *size;
{struct sym s; int symno, chrno; char c;
for (symno=0; symno<MAXSYMS; symno++) /* Keep count of symbols */
{if (!fread(&s,sizeof s,1,source)) break;/* Get symbol descriptor */
chrno = 0;
while ((c = getc(source)) && chrno<8)
table[symno].name[chrno++] = macify(c);/* Write chars of sym.*/
while (chrno<8) /* Pad rest with spaces */
table[symno].name[chrno++] = ' ';
while (c) c = getc(source); /* discard symbol tail */
table[symno].value = reverse(s.svalue); /* Supply symbol value */
}
*size = symno * 12; /* return size of table */
return((int)table); /* return address of table */
}
main(argc,argv)
int argc;
char *argv[];
{
int Sa, Daddr=STARTADDR, i;
msymtab table[MAXSYMST];
if(argc<2)
{fprintf(stderr,"Usage: dl68 infile [ > outfile ]\n");
exit(1);
}
for (i=1; i<argc; i++) /* get options */
if (argv[i][0] == '-')
switch (argv[i][1]) {
case 'T': if (i++ < argc)
sscanf(argv[i],"%x",&Daddr);
break;
case 'v':
vflag = argv[i][2];
break;
case 'o':
if (i++ < argc)
strcpy(outfilename,argv[i]);
break;
case 's':
Sdata = argv[i][2] - '0';
Send = argv[i][3] - '0';
break;
}
else strcpy(infilename,argv[i]);
if((infile=fopen(infilename,"r"))==NULL) /* open infile */
{strcat(infilename,".68"); /* try .68 form */
if ((infile=fopen(infilename,"r"))==NULL)
{fprintf(stderr,"dl68: Can't open %s\n",infilename);
exit(1);
}
}
if (*outfilename) {
if ((outfile = fopen(outfilename,"w")) == NULL) {
fprintf(stderr,"dl68: Can't open %s\n",outfilename);
exit(1);
}
}
else outfile = stdout;
if(fread(&filhdr, sizeof(struct bhdr),1,infile) != 1)/* get header info */
{fprintf(stderr,"dl68: %s wrong format\n",infilename);
exit(1);
}
if(filhdr.fmagic != FMAGIC) { /* check magic number */
fprintf(stderr,"dl68: %s not proper b.out file\n",infilename);
exit(1);
}
Sa = Daddr;
/* Output records for TEXT portion */
outbin(infile,Daddr,filhdr.tsize);
Daddr += filhdr.tsize; /* adjust output address */
fseek(infile,DATAPOS,0); /* seek to DATA portion */
/* Output records for DATA segment */
outbin(infile,Daddr,filhdr.dsize);
Daddr += filhdr.dsize; /* adjust output address */
fseek(infile,SYMPOS,0); /* seek to SYM portion */
if (filhdr.ssize) {
int sz;
if (vflag != 'm') {
/* Output symbol table in boot loader format */
int ssize68;
static char stable[8192]; /* enough? */
(char*)rbuild(stable,infile,&sz);
ssize68 = reverse(sz);
Daddr += filhdr.bsize; /* skip bss (should be 0 really) */
print_exormacs_record(Sdata,&ssize68,4,Daddr);
Daddr += 4;
outbuf(stable,Daddr,sz);
}
else {
int tabpnt[2]; msymtab table[MAXSYMST]; char *bbuf;
bbuf = (char*)build(table,infile,&sz);
outbuf(bbuf,SYMTAB,sz);
tabpnt[0] = reverse(SYMTAB); /* Lower limit */
tabpnt[1] = reverse(SYMTAB+sz); /* Upper limit */
outbuf(tabpnt,SYMTABADDR,sizeof tabpnt);/* Output pointers */
}
}
/* Output entry point: as in file header, else default to start address */
print_exormacs_record(Send,0,0,filhdr.entry? filhdr.entry: Sa);
}