164 lines
		
	
	
	
		
			2.2 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			164 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);
 | |
| }
 |