ack/mach/z80/int/dl.c
1984-06-25 16:22:03 +00:00

201 lines
2.8 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 32
int check;
int echo;
int istty;
int bytecount;
int ttyfd;
char *progname;
char hex[] = "0123456789ABCDEF";
main(argc,argv) char **argv; {
register nd,pc,sg,osg,first;
register char *s;
int uid;
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);
s = "/dev/tty05";
if (argc >= 3)
s = argv[2];
if ((ttyfd = open(s,2)) < 0)
if ((ttyfd = creat(s,0666)) < 0)
fatal("can't open %s",s);
if (gtty(ttyfd,&tty) == 0) {
echo++;
istty++;
tty.sg_ispeed = tty.sg_ospeed = B2400;
tty.sg_flags = RAW;
stty(ttyfd,&tty);
} else {
freopen(s,"w",stdout);
}
first = 1; osg = 0;
uid = getuid();
lock(1);
for (;;) {
pc = get2c(stdin);
if (feof(stdin))
break;
sg = get2c(stdin);
nd = get2c(stdin);
if (first) {
put('L'); reply();
put('S'); reply();
first = 0;
}
if (sg != osg) {
segment(sg);
osg = sg;
}
while (nd > MAXBYTE) {
data(MAXBYTE,pc);
nd -= MAXBYTE;
pc += MAXBYTE;
}
if (nd > 0)
data(nd,pc);
assert(feof(stdin) == 0);
}
if (first == 0)
eof();
/* lock(0); */
/* setuid(uid); */
/* if (echo) */
/* for (;;) */
/* reply(); */
}
segment(sg) {
newline(2,0,SEGTYPE);
word(sg);
endline();
}
startad(pc) {
newline(4,0,PCTYPE);
word(0);
word(pc);
endline();
}
data(nd,pc) {
newline(nd,pc,DATTYPE);
do
byte(getc(stdin));
while (--nd);
endline();
}
eof() {
newline(0,0,EOFTYPE);
byte(0xFF);
put('\n');
}
newline(n,pc,typ) {
check = 0;
bytecount = n+5;
put('\n'); /* added instruction */
put(':');
byte(n);
word(pc);
byte(typ);
}
endline() {
byte(-check);
assert(bytecount == 0);
assert(check == 0);
}
word(w) {
byte(w>>8);
byte(w);
}
byte(b) {
check += b;
--bytecount;
put(hex[(b>>4) & 017]);
put(hex[b & 017]);
}
put(c) {
if (istty)
write(ttyfd,&c,1);
else
putchar(c);
}
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);
}