mirror of
https://github.com/SEPPDROID/Digital-Research-Source-Code.git
synced 2025-10-24 08:54:17 +00:00
Upload
Digital Research
This commit is contained in:
254
CPM OPERATING SYSTEMS/CPM 68K/1.0X SOURCES/v103/util/sendc68.c
Normal file
254
CPM OPERATING SYSTEMS/CPM 68K/1.0X SOURCES/v103/util/sendc68.c
Normal file
@@ -0,0 +1,254 @@
|
||||
|
||||
/*
|
||||
Copyright 1983
|
||||
Alcyon Corporation
|
||||
8716 Production Ave.
|
||||
San Diego, Ca. 92121
|
||||
*/
|
||||
|
||||
char *version = "@(#) sendc68 - Jul 29, 1983";
|
||||
|
||||
#ifdef VAX11
|
||||
# include <c68/cout.h>
|
||||
# include <c68/sendc68.h>
|
||||
#else
|
||||
# include <cout.h>
|
||||
# include <sendc68.h>
|
||||
#endif
|
||||
|
||||
/**
|
||||
* this program reads a c.out format binary file and converts
|
||||
* it to the absolute ASCII load format acceptable by MACSBUG
|
||||
* and then sends it down the standard output file
|
||||
**/
|
||||
|
||||
#define RBLEN 32 /* number of bytes per S1 record */
|
||||
#define DELAY 012000
|
||||
#define SDEFAULT 0x400
|
||||
#define EDEFAULT 0x1000
|
||||
#define USAGE "[-r] [-d delay] [-s start] [-e end] [-] objectfile [outputfile]"
|
||||
|
||||
struct hdr2 couthd;
|
||||
|
||||
long loctr;
|
||||
int fout;
|
||||
int pflg;
|
||||
char cksum;
|
||||
int syno;
|
||||
char *ofn;
|
||||
int ofd;
|
||||
int noclear;
|
||||
int bcnt = RBLEN;
|
||||
int regulus = 0;
|
||||
int debug;
|
||||
long delay, nlstart, nlend;
|
||||
struct buf *file;
|
||||
|
||||
main(argc,argv)
|
||||
int argc;
|
||||
char *argv[];
|
||||
{
|
||||
long l, l1;
|
||||
int i;
|
||||
short word;
|
||||
|
||||
if( argc < 2 ) {
|
||||
usage:
|
||||
printf("Usage: sendc68 %s\n",USAGE);
|
||||
exit();
|
||||
}
|
||||
file = &ibuf;
|
||||
i = 1;
|
||||
nlstart = SDEFAULT;
|
||||
nlend = EDEFAULT;
|
||||
while( *argv[i] == '-' ) {
|
||||
switch(argv[i][1]) {
|
||||
case '\0': /* '-' only */
|
||||
noclear = 1;
|
||||
break;
|
||||
case 'r': /* don't put out cr-lf only lf */
|
||||
regulus = 1;
|
||||
break;
|
||||
case 'd':
|
||||
delay = atol(argv[++i]);
|
||||
if( delay <= 0 )
|
||||
delay = DELAY;
|
||||
break;
|
||||
case 's':
|
||||
nlstart = atol(argv[++i]);
|
||||
if( nlstart < 0 )
|
||||
nlstart = SDEFAULT;
|
||||
break;
|
||||
case 'e':
|
||||
nlend = atol(argv[++i]);
|
||||
if( nlend < 0 )
|
||||
nlend = EDEFAULT;
|
||||
break;
|
||||
case 'D':
|
||||
debug = 1;
|
||||
break;
|
||||
default:
|
||||
goto usage;
|
||||
}
|
||||
i++;
|
||||
}
|
||||
|
||||
openfile(argv[i++]);
|
||||
if( argc > i ) {
|
||||
ofn = argv[i]; /* tty device name */
|
||||
if( (ofd = creat(ofn,0666)) < 0 ) {
|
||||
printf("unable to create %s\n",ofn);
|
||||
exit();
|
||||
}
|
||||
}
|
||||
else
|
||||
ofd = dup(1); /* standard output file */
|
||||
|
||||
fout = ofd; /* use buffered output */
|
||||
l1 = couthd.ch_tsize;
|
||||
loctr = couthd.ch_entry;
|
||||
|
||||
/* Main Loop */
|
||||
for( l = 0; l < l1; l += 2) {
|
||||
lgetw(&word, file);
|
||||
outword(word);
|
||||
loctr += 2;
|
||||
}
|
||||
if( couthd.ch_magic == EX_ABMAGIC ) {
|
||||
while(bcnt != RBLEN) /* fill out the last S1 buffer */
|
||||
outword(0);
|
||||
loctr = couthd.ch_dstart;
|
||||
}
|
||||
l1 = couthd.ch_dsize;
|
||||
for( l = 0; l < l1; l += 2) {
|
||||
lgetw(&word, file);
|
||||
outword(word);
|
||||
loctr += 2;
|
||||
}
|
||||
if( noclear == 0 ) {
|
||||
if( couthd.ch_magic == EX_ABMAGIC ) {
|
||||
while( bcnt != RBLEN ) /* fill out the last S1 buffer */
|
||||
outword(0);
|
||||
loctr = couthd.ch_bstart;
|
||||
}
|
||||
l1 = couthd.ch_bsize; /* size of bss */
|
||||
while( l1 > 0 ) {
|
||||
outword(0); /* clear the bss */
|
||||
l1 -= 2;
|
||||
loctr += 2;
|
||||
}
|
||||
}
|
||||
while( bcnt != RBLEN ) /* fill out the last S1 buffer */
|
||||
outword(0);
|
||||
printf("S9030000FC\n");
|
||||
if( !regulus )
|
||||
putchar(015); /* carriage return */
|
||||
flush();
|
||||
}
|
||||
|
||||
openfile(ap)
|
||||
char *ap;
|
||||
{
|
||||
register char *p;
|
||||
|
||||
p = ap;
|
||||
if( (ibuf.fildes = open(p,0)) < 0 ) {
|
||||
printf("unable to open %s\n",p);
|
||||
exit();
|
||||
}
|
||||
ifilname = p; /* point to current file name for error msgs */
|
||||
readhdr(); /* read file header */
|
||||
}
|
||||
|
||||
#define BADMAGIC(magic) (magic<EX_MAGIC || magic>EX_4KSTXT)
|
||||
readhdr()
|
||||
{
|
||||
if (getchd(file, &couthd) == -1) {
|
||||
printf("read error on: %s\n",ifilname);
|
||||
exit(-1);
|
||||
}
|
||||
if (debug) {
|
||||
printf("magic = %x\n",couthd.ch_magic);
|
||||
printf("tsize = %ld\n",couthd.ch_tsize);
|
||||
printf("dsize = %ld\n",couthd.ch_dsize);
|
||||
printf("bsize = %ld\n",couthd.ch_bsize);
|
||||
printf("ssize = %ld\n",couthd.ch_ssize);
|
||||
printf("stksize = %ld\n",couthd.ch_stksize);
|
||||
printf("entry = %ld\n",couthd.ch_entry);
|
||||
if (couthd.ch_magic == EX_ABMAGIC) {
|
||||
printf("dstart = %ld\n",couthd.ch_dstart);
|
||||
printf("bstart = %ld\n",couthd.ch_bstart);
|
||||
}
|
||||
}
|
||||
if (BADMAGIC(couthd.ch_magic)) {
|
||||
printf("file format error: %s %x\n",ifilname,couthd.ch_magic);
|
||||
exit(-1);
|
||||
}
|
||||
}
|
||||
|
||||
outword(i)
|
||||
register int i;
|
||||
{
|
||||
if( loctr >= nlstart && loctr < nlend ) /* MACSBUG RAM--dont load */
|
||||
return;
|
||||
|
||||
if( bcnt == RBLEN ) { /* beginning of record */
|
||||
cksum = 0;
|
||||
if (loctr >= 0x10000L) {
|
||||
printf("S2");
|
||||
hexby((int)(RBLEN+4));
|
||||
hexby((int)(loctr>>16));
|
||||
}
|
||||
else {
|
||||
printf("S1");
|
||||
hexby((int)(RBLEN+3)); /* byte count */
|
||||
}
|
||||
hexwd((int)loctr);
|
||||
}
|
||||
hexwd((int)i);
|
||||
bcnt -= 2;
|
||||
if( bcnt == 0 ) {
|
||||
hexby((int)(-cksum-1));
|
||||
putchar('\n');
|
||||
if( !regulus )
|
||||
putchar(015); /* carriage return */
|
||||
bcnt = RBLEN;
|
||||
flush();
|
||||
dodelay(); /* give 68000 time to load */
|
||||
}
|
||||
}
|
||||
|
||||
hexwd(i)
|
||||
register int i;
|
||||
{
|
||||
hexby(i>>8);
|
||||
hexby(i);
|
||||
}
|
||||
|
||||
hexby(c)
|
||||
register int c;
|
||||
{
|
||||
c &= 0xff;
|
||||
cksum += c;
|
||||
outhex((c>>4)&017);
|
||||
outhex(c&017);
|
||||
}
|
||||
|
||||
outhex(x)
|
||||
register int x;
|
||||
{
|
||||
if( x >= 0 && x <= 9 )
|
||||
putchar(x+'0');
|
||||
else if( x >= 10 && x <= 15 )
|
||||
putchar(x-10+'A');
|
||||
else
|
||||
exit(-1);
|
||||
}
|
||||
|
||||
dodelay()
|
||||
{
|
||||
register long i, j;
|
||||
|
||||
for( i = 0; i != delay; i++ )
|
||||
j = 0;
|
||||
}
|
||||
Reference in New Issue
Block a user