ack/mach/6500/dl/dl.c
1985-01-07 13:08:48 +00:00

165 lines
2.2 KiB
C

/*
* (c) copyright 1983 by the Vrije Universiteit, Amsterdam, The Netherlands.
*
* This product is part of the Amsterdam Compiler Kit.
*
* Permission to use, sell, duplicate or disclose this software must be
* obtained in writing. Requests for such permissions may be sent to
*
* Dr. Andrew S. Tanenbaum
* Wiskundig Seminarium
* Vrije Universiteit
* Postbox 7161
* 1007 MC Amsterdam
* The Netherlands
*
*/
#include <sgtty.h>
#include <stdio.h>
#include <assert.h>
struct sgttyb tty;
#define DATTYPE 0
#define EOFTYPE 1
#define SEGTYPE 2
#define PCTYPE 3
#define MAXBYTE 0x18
int check;
int records;
int echo;
int bytecount;
int ttyfd;
char *progname;
char hex[] = "0123456789ABCDEF";
main(argc,argv) char **argv; {
register nd,pc,sg,osg,first;
register char *s;
progname = argv[0];
if (argc > 3)
fatal("usage: %s [object [tty]]\n",argv[0]);
s = "a.out";
if (argc >= 2)
s = argv[1];
if (freopen(s,"r",stdin) == NULL)
fatal("can't open %s",s);
ttyfd = 1;
first = 1; osg = 0;
for (;;) {
pc = get2c(stdin);
if (feof(stdin))
break;
sg = get2c(stdin);
nd = get2c(stdin);
if (first) {
first = 0;
}
assert(sg == osg);
while (nd > MAXBYTE) {
data(MAXBYTE,pc);
nd -= MAXBYTE;
pc += MAXBYTE;
}
if (nd > 0)
data(nd,pc);
assert(feof(stdin) == 0);
}
if (first == 0)
eof();
if (echo)
for (;;)
reply();
}
data(nd,pc) {
newline(nd,pc,DATTYPE);
do
byte(getc(stdin));
while (--nd);
endline();
}
eof() {
newline(0,records,EOFTYPE);
endline();
}
newline(n,pc,typ) {
records++;
put(';');
byte(n);
check = 0;
bytecount = n+4;
word(pc);
}
endline() {
word(check);
put('\r');
put('\n');
assert(bytecount == 0);
put(0);
put(0);
put(0);
put(0);
put(0);
put(0);
}
word(w) {
byte(w>>8);
byte(w);
}
byte(b) {
b &= 0377;
check += b;
--bytecount;
put(hex[(b>>4) & 017]);
put(hex[b & 017]);
}
put(c) {
write(ttyfd,&c,1);
}
reply() {
register i;
int c;
if (echo == 0)
return;
i = read(ttyfd,&c,1);
assert(i > 0);
write(1,&c,1);
}
get2c(f) FILE *f; {
register c;
c = getc(f);
return((getc(f) << 8) | c);
}
fatal(s,a) {
fprintf(stderr,"%s: ",progname);
fprintf(stderr,s,a);
fprintf(stderr,"\n");
exit(-1);
}