135 lines
		
	
	
	
		
			2.6 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			135 lines
		
	
	
	
		
			2.6 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
| #ifndef NORCSID
 | |
| static char rcsid[] = "$Header$";
 | |
| #endif
 | |
| 
 | |
| #include <stdio.h>
 | |
| 
 | |
| /*
 | |
|  * (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
 | |
|  *
 | |
|  * Author: Hans van Staveren
 | |
|  */
 | |
| 
 | |
| char buf[512];
 | |
| char *index();
 | |
| 
 | |
| main() {
 | |
| 	register n,sa;
 | |
| 	register char *p;
 | |
| 
 | |
| 	sa=0;
 | |
| 	for (;;) {
 | |
| 		getline(buf);
 | |
| 		if (n=stackadjust()) {
 | |
| 			sa += n;
 | |
| 			continue;
 | |
| 		}
 | |
| 		if (nullinstruction())
 | |
| 			continue;
 | |
| 		if (sa) {
 | |
| 			if (buf[0]=='t' && buf[1]=='s' && buf[2]=='t' && buf[3]==' ') {
 | |
| 				sa -= 2;
 | |
| 				buf[0]='m';
 | |
| 				buf[1]='o';
 | |
| 				buf[2]='v';
 | |
| 				strcat(buf,",(sp)+");
 | |
| 			} else if (buf[0]=='m' && buf[1]=='o' && buf[2]=='v' &&
 | |
| 			    buf[3]==' ' && (p=index(&buf[5],','))!=0 &&
 | |
| 			    p[1]=='-' && p[2]=='(' && p[3]=='s') {
 | |
| 				sa -= 2;
 | |
| 				p[1]=' ';
 | |
| 			}
 | |
| 		}
 | |
| 		switch(sa) {
 | |
| 		case 0:break;
 | |
| 		case 2:puts("tst (sp)+");sa=0;break;
 | |
| 		case 4:puts("cmp (sp)+,(sp)+");sa=0;break;
 | |
| 		case 6:puts("add $06,sp");sa=0;break;
 | |
| 		}
 | |
| 		puts(buf);
 | |
| 	}
 | |
| }
 | |
| 
 | |
| getline(buf) register char *buf; {
 | |
| 	register c;
 | |
| 
 | |
| 	while ((c=getchar())==' ' || c=='\t')
 | |
| 		;
 | |
| 	if (c==EOF)
 | |
| 		exit(0);
 | |
| 	do *buf++=c;
 | |
| 	while ((c=getchar())!='\n');
 | |
| 	*buf=0;
 | |
| }
 | |
| 
 | |
| stackadjust() {
 | |
| 
 | |
| 	if (buf[0]=='t' &&
 | |
| 	    buf[1]=='s' &&
 | |
| 	    buf[2]=='t' &&
 | |
| 	    buf[3]==' ' &&
 | |
| 	    buf[4]=='(' &&
 | |
| 	    buf[5]=='s' &&
 | |
| 	    buf[6]=='p' &&
 | |
| 	    buf[7]==')' &&
 | |
| 	    buf[8]=='+') return(2);
 | |
| 	if (buf[0]=='c' &&
 | |
| 	    buf[1]=='m' &&
 | |
| 	    buf[2]=='p' &&
 | |
| 	    buf[3]==' ' &&
 | |
| 	    buf[4]=='(' &&
 | |
| 	    buf[5]=='s' &&
 | |
| 	    buf[6]=='p' &&
 | |
| 	    buf[7]==')' &&
 | |
| 	    buf[8]=='+' &&
 | |
| 	    buf[9]==',' &&
 | |
| 	    buf[10]=='(' &&
 | |
| 	    buf[11]=='s' &&
 | |
| 	    buf[12]=='p' &&
 | |
| 	    buf[13]==')' &&
 | |
| 	    buf[14]=='+') return(4);
 | |
| 	if (buf[0]=='a' &&
 | |
| 	    buf[1]=='d' &&
 | |
| 	    buf[2]=='d' &&
 | |
| 	    buf[3]==' ' &&
 | |
| 	    buf[4]=='$' &&
 | |
| 	    buf[5]=='0' &&
 | |
| 	    buf[6]=='6' &&
 | |
| 	    buf[7]==',' &&
 | |
| 	    buf[8]=='s' &&
 | |
| 	    buf[9]=='p' &&
 | |
| 	    buf[10]==0) return(6);
 | |
| 	return(0);
 | |
| }
 | |
| 
 | |
| nullinstruction() {
 | |
| 	register char *p;
 | |
| 
 | |
| 	if (buf[4]=='$' && buf[5]=='0' && buf[6]=='0' && buf[7]==',') {
 | |
| 		p=index(buf,'-');
 | |
| 		if (p!=0 && p[1]=='(')
 | |
| 			return(0);
 | |
| 		p=index(buf,'+');
 | |
| 		if (p!=0 && p[-1]==')')
 | |
| 			return(0);
 | |
| 		if (buf[0]=='b' && buf[1]=='i' && (buf[2]=='s' || buf[2]=='c'))
 | |
| 			return(1);
 | |
| 		if (buf[0]=='a' && buf[1]=='d' && buf[2]=='d')
 | |
| 			return(1);
 | |
| 		if (buf[0]=='s' && buf[1]=='u' && buf[2]=='b')
 | |
| 			return(1);
 | |
| 	}
 | |
| 	return(0);
 | |
| }
 |