main() { extrn argv, fout, fin; extrn drop, setstk, stack; extrn namsiz; extrn space, ospace, cp, cmst; extrn ap, ast; auto o, a, b, sym 10, p, pp; if(argv[0]<3) { printf("Arg count*n"); exit(1); } if((fin=open(argv[2],0))<0) { printf("Can't find %s*n", argv[2]); exit(1); } if((fout=creat(argv[3], PERM))<0) { printf("Can't create %s*n", argv[3]); exit(1); } printf("*tjmp 9f*n"); a = 0; while(a < 10) sym[a++] = 0; a = b = 0; while((o=getchar()) > 0) { switch(o) { case 'L': printf("L%o:*n", getw()); goto cont; /* ln=m */ case 'q': printf("L%o=%o*n", getw(), getw()); goto cont; case 'g': read(fin, sym, namsiz); printf("*n.globl .%s*n*.%s:*n", sym, sym); goto cont; case 'e': printf("*t.+2*n"); goto cont; case 'v': chain(); goto cont; case 'l': printf("*tL%o*n", getw()); goto cont; case 'o': printf("*t%o*n", getw()); goto cont; case 'r': printf("*t.=.+%o*n", getw()*2); goto cont; case 'p': printf("7:*n"); goto cont; case 'k': printf("*tt; .+%o*n", (getw()+1)*2); goto cont; case 't': case 'f': case 'z': printf("*t%c; L%o*n", o, getw()); goto cont; case 'y': printf("*ty; %o*n", getw()*2); goto cont; case 's': stack = getw(); drop = 1; space = ospace; cp = cmst; ap = ast; goto cont; case 'x': /* urgh */ a = 0; while(a < 10) space[a++] = 0; read(fin, space, namsiz); p = space; space =+ 8; *cp++ = block(1, o, p); goto cont; case 'a': case 'c': case 'i': *cp++ = block(1, o, getw()); goto cont; case '"': *cp++ = p = block(1, 's', 0); while((o=getchar()) != '"') *space++ = getw(); p[1] = space-p-2; goto cont; case 'b': case 'u': build(o, getw()); goto cont; case 'n': a = getw(); switch(a) { case 1: cp[-1] = block(2, '()', cp[-1], 0); goto cont; case 2: *ap++ = cp; goto cont; case 3: pp = cp; cp = a = *--ap; p = block(2, '()', *--cp, pp-a); while(a < pp) *space++ = *a++; *cp++ = p; goto cont; case 4: build('[]'); goto cont; case 6: case 7: case 011: printf("*t%c%o*n", o, a); goto cont; } printf("ERROR*n"); goto cont; case ':': case '?': (--cp)[-1] = block(3, o, getw(), cp[-1], *cp); goto cont; case 'S': setstk = 1; goto cont; case 'E': /* printf("emit %o*n", cp-cmst); */ while(cp > cmst) { emit(*--cp, 0); drop = 1; /* putchar('*n');*/ } /* printf("emit end*n"); */ goto cont; } printf("shouldn't reach this: %c*n", o); /* don't reach this */ cont: } printf("*n9:*tjsr*tr5,chain*n"); chain(); } build(op, n) { extrn cp; auto p1, p2; if(op=='[]') { build('b', 014); op = 'u'; n = 3; } switch(op) { case 'u': p1 = *--cp; switch(n) { case 1: if(p1[0]=='u' & p1[1]==3) { *cp++ = p1[2]; return; } goto un; case 3: if(p1[0]=='u' & p1[1]==1) { *cp++ = p1[2]; return; } goto un; } un: *cp++ = block(2, op, n, p1); return; case 'b': (--cp)[-1] = block(3, op, n, cp[-1], *cp); return; } printf("build error %c*n", op); } leaf(v, o) { extrn drop; putchar('*t'); if(drop) putchar('i'); if(v) putchar('v'); putchar(o); drop = 0; } emit(x, lv) { extrn drop, setstk, stack; auto n, p; if(setstk) { printf("*ts; %o*n", stack*2); setstk = drop = 0; } n = x[1]; switch(*x) { case 'c': if(lv) printf("illegal lv*n"); leaf(lv, 'c'); printf("; %o*n", n); return; case 'a': leaf(lv, 'a'); printf("; %o*n", n*2); return; case 'i': leaf(lv, 'x'); printf("; 7f+%o*n", n*2); return; case 'x': leaf(lv, 'x'); printf("; .%s*n", n); return; case 's': if(lv) printf("illegal lv*n"); leaf(1, 'x'); printf("; 1f*n*tt; 2f*n1:*n"); n = x[1]; p = x+2; while(n--) printf("%o*n", *p++); printf("2:*n"); return; case 'u': p = x[2]; if(n == 3) { if(lv) { emit(x[2], 0); return; } if(p[0]=='b' & p[1]==014) { emit(p[2], 0); emit(p[3], 0); printf("*tn4*n"); return; } } if(lv) printf("u illegal lv*n"); if(n == 1) { emit(p, 1); return; } emit(p, n==1 | n>=5); printf("*t%c%o*n", *x, n); return; case 'b': if(lv) printf("b illegal lv*n"); emit(x[2], n==1 | n>=0100); emit(x[3], 0); printf("*t%c%o*n", *x, n); return; case '?': p = x[3]; emit(x[2], 0); drop = 1; printf("*tf; L%o*n", p[1]); emit(p[2], 0); drop = 1; printf("*tt; L%o*n", x[1]); printf("L%o:*n", p[1]); emit(p[3], 0); printf("L%o:*n", x[1]); return; case '()': emit(x[1], 0); n=x[2]; if(n == 0) { printf("*tn1*n"); return; } printf("*tn2*n"); p=x+3; while(n--) emit(*p++, 0); printf("*tn3*n"); return; } printf("unknown op %c*n", *x); } chn 0; chain() { extrn chn; if(chn) printf("*t8b-2*n8:*n"); else printf("*t0*n8:*n"); chn = 1; } getw() { extrn fin; auto w; w = 0; read(fin, &w, 2); return(w); } block(n, o, a1, a2, a3, a4) { extrn space; auto p, ap; p = space; ap = &o; n++; while(n--) { *space++ = *ap++; } return(p); } namsiz 8; ossiz 250; ospace[250]; space 0; ap 0; ast[40]; cp 0; cmsiz 40; cmst[40]; stack 0; setstk 0; drop 0;