You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

358 lines
4.0 KiB

main() {
/*
A1 -> A
A2 B
A O
B1 C
B2 D
BE L
BF P
C1 E
C2 F
F G
H H
R I
R1 J
S K
I M
M N
* +1
S +2
C +4
1 +8
z -> 4
c 10
a 14
e 20
n 63
* +0100
*/
extern putchar,getc,peekc,printf,flag,flush;
auto c,snlflg,nlflg,t,smode,m,ssmode;
smode = nlflg = snlflg = ssmode = 0;
loop:
c = getc();
if (c!='\n' & c!='\t') nlflg = 0;
if (ssmode!=0 & c!='%') {
ssmode = 0;
printf(".data\n1:<");
}
switch(c) {
case '\0':
printf(".text; 0\n");
flush();
return;
case ':':
if (!smode)
printf("=.+2; 0"); else
putchar(':');
goto loop;
case 'A':
if ((c=getc())=='1' | c=='2') {
putchar(c+'A'-'1');
goto loop;
}
putchar('O');
peekc = c;
goto loop;
case 'B':
switch (getc()) {
case '1':
putchar('C');
goto loop;
case '2':
putchar('D');
goto loop;
case 'E':
putchar('L');
goto loop;
case 'F':
putchar('P');
goto loop;
}
putchar('?');
goto loop;
case 'C':
putchar(getc()+'E'-'1');
goto loop;
case 'F':
putchar('G');
goto subtre;
case 'R':
if ((c=getc()) == '1')
putchar('J'); else {
putchar('I');
peekc = c;
}
goto loop;
case 'H':
putchar('H');
goto subtre;
case 'I':
putchar('M');
goto loop;
case 'M':
putchar('N');
snlflg++;
goto loop;
case 'S':
putchar('K');
subtre:
snlflg = 1;
t = 'A';
l1:
switch (c=getc()) {
case '*':
t++;
goto l1;
case 'S':
t =+ 2;
goto l1;
case 'C':
t =+ 4;
goto l1;
case '1':
t =+ 8;
goto l1;
}
peekc = c;
putchar(t);
goto loop;
case '#':
if(getc()=='1')
putchar('#'); else
putchar('"');
goto loop;
case '%':
if (smode)
printf(".text;");
loop1:
switch (c=getc()) {
case 'a':
m = 16;
t = flag();
goto pf;
case ',':
putchar(';');
goto loop1;
case 'i':
m = 12;
t = flag();
goto pf;
case 'z':
m = 4;
t = 0;
goto pf;
case 'c':
t = 0;
m = 8;
goto pf;
case 'e':
t = flag();
m = 20;
goto pf;
case 'n':
t = flag();
m = 63;
pf:
if ((c=getc())=='*')
m =+ 0100; else
peekc = c;
printf(".byte %o,%o", m, t);
goto loop1;
case '\n':
printf(";1f\n");
ssmode = 1;
nlflg = 1;
smode = 1;
goto loop;
}
putchar(c);
goto loop1;
case '\t':
if (nlflg) {
nlflg = 0;
goto loop;
}
putchar('\t');
goto loop;
case '\n':
if (!smode) {
putchar('\n');
goto loop;
}
if (nlflg) {
nlflg = 0;
printf("\\0>\n.text\n");
smode = 0;
goto loop;
}
if (!snlflg)
printf("\\n");
snlflg = 0;
printf(">\n<");
nlflg = 1;
goto loop;
}
putchar(c);
goto loop;
}
getc() {
extern getchar, peekc, nofloat;
auto t, ifcnt;
ifcnt = 0;
gc:
if (peekc) {
t = peekc;
peekc = 0;
} else
t = getchar();
if (t==0)
return(0);
if (t=='{') {
ifcnt++;
t = getchar();
}
if (t=='}') {
t = getc();
if (--ifcnt==0)
if (t=='\n')
t = getc();
}
if (ifcnt & nofloat)
goto gc;
return(t);
}
flag() {
extern getc, peekc;
auto c, f;
f = 0;
l1:
switch(c=getc()) {
case 'w':
f = 1;
goto l1;
case 'i':
f = 2;
goto l1;
case 'b':
f = 3;
goto l1;
case 'f':
f = 4;
goto l1;
case 'd':
f = 5;
goto l1;
case 'p':
f =+ 16;
goto l1;
}
peekc = c;
return(f);
}
peekc 0;
putchar(c) {
extern flush, oubuf, ouptr;
char ouptr[], oubuf[];
auto c1;
goto init;
init:
ouptr = oubuf;
init = init1;
init1:
if(c1 = c>>8) {
*ouptr++ = c1;
if(ouptr >= oubuf+512)
flush();
}
if(c =& 0377) {
*ouptr++ = c;
if(ouptr >= oubuf+512)
flush();
}
}
flush() {
extern ouptr, oubuf, fout, write;
char ouptr[], oubuf[];
write(fout, oubuf, ouptr-oubuf);
ouptr = oubuf;
}
getcha() {
extern read, incnt, fin, inbuf, inptr;
char inbuf[], inptr[];
goto init;
init:
inptr = inbuf;
init = init1;
init1:
if(inptr >= inbuf+incnt) {
inptr = inbuf;
incnt = read(fin, inbuf, 512);
if(!incnt)
return('\0');
}
return(*inptr++);
}
inbuf[256];
oubuf[256];
inptr 0;
incnt 0;
ouptr 0;
fin 0;
fout 1;
nofloat 0;