Add original unix v6
This commit is contained in:
@@ -0,0 +1,370 @@
|
||||
int nofloat;
|
||||
int peekc;
|
||||
int obuf[259];
|
||||
int tabflg;
|
||||
int labno 1;
|
||||
|
||||
main(argc, argv)
|
||||
char **argv;
|
||||
{
|
||||
/*
|
||||
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
|
||||
*/
|
||||
|
||||
auto c,snlflg,nlflg,t,smode,m,ssmode;
|
||||
extern fin;
|
||||
|
||||
smode = nlflg = snlflg = ssmode = 0;
|
||||
if (argc>1)
|
||||
if ((fin = open(argv[1], 0)) < 0) {
|
||||
putchar('?\n');
|
||||
return;
|
||||
}
|
||||
obuf[0] = 1;
|
||||
if (argc>2)
|
||||
if ((obuf[0] = creat(argv[2], 0666)) < 0) {
|
||||
putchar('?\n');
|
||||
return;
|
||||
}
|
||||
loop:
|
||||
c = getc();
|
||||
if (c!='\n' && c!='\t') nlflg = 0;
|
||||
if (ssmode!=0 && c!='%') {
|
||||
ssmode = 0;
|
||||
printf(".data\nL%d:<", labno++);
|
||||
}
|
||||
switch(c) {
|
||||
|
||||
case '\0':
|
||||
printf(".text; 0\n");
|
||||
fflush(obuf);
|
||||
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 '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;
|
||||
|
||||
case '2':
|
||||
t =+ 16;
|
||||
goto l1;
|
||||
}
|
||||
peekc = c;
|
||||
putchar(t);
|
||||
goto loop;
|
||||
|
||||
case '#':
|
||||
if(getc()=='1')
|
||||
putchar('#'); else
|
||||
putchar('"');
|
||||
goto loop;
|
||||
|
||||
case '%':
|
||||
if (smode)
|
||||
printf(".text;");
|
||||
if (ssmode==0) {
|
||||
if ((peekc=getc())=='[') {
|
||||
peekc = 0;
|
||||
printf(".data;");
|
||||
while((c=getc())!=']')
|
||||
putchar(c);
|
||||
getc();
|
||||
printf(";.text;");
|
||||
goto loop;
|
||||
}
|
||||
}
|
||||
loop1:
|
||||
switch (c=getc()) {
|
||||
|
||||
case ' ':
|
||||
case '\t':
|
||||
goto loop1;
|
||||
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 = flag();
|
||||
goto pf;
|
||||
|
||||
case 'r':
|
||||
m = 9;
|
||||
t = flag();
|
||||
goto pf;
|
||||
|
||||
case '1':
|
||||
m = 5;
|
||||
t = flag();
|
||||
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 '[':
|
||||
printf("L%d=", labno++);
|
||||
while ((c=getc())!=']')
|
||||
putchar(c);
|
||||
ssmode = 0;
|
||||
smode = 0;
|
||||
goto loop;
|
||||
|
||||
case '\n':
|
||||
printf("\nL%d\n", labno);
|
||||
ssmode = 1;
|
||||
nlflg = 1;
|
||||
smode = 1;
|
||||
goto loop;
|
||||
}
|
||||
putchar(c);
|
||||
goto loop1;
|
||||
|
||||
case '\t':
|
||||
if (nlflg) {
|
||||
nlflg = 0;
|
||||
goto loop;
|
||||
}
|
||||
if (smode) {
|
||||
tabflg++;
|
||||
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;
|
||||
|
||||
case 'X':
|
||||
case 'Y':
|
||||
case 'T':
|
||||
snlflg++;
|
||||
}
|
||||
putchar(c);
|
||||
goto loop;
|
||||
}
|
||||
|
||||
getc() {
|
||||
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() {
|
||||
register 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 's':
|
||||
f = 6;
|
||||
goto l1;
|
||||
|
||||
case 'l':
|
||||
f = 8;
|
||||
goto l1;
|
||||
|
||||
case 'p':
|
||||
f =+ 16;
|
||||
goto l1;
|
||||
}
|
||||
peekc = c;
|
||||
return(f);
|
||||
}
|
||||
|
||||
putchar(c)
|
||||
{
|
||||
if (tabflg) {
|
||||
tabflg = 0;
|
||||
printf(">;.byte %o;<", c+0200);
|
||||
} else
|
||||
putc(c, obuf);
|
||||
}
|
||||
Reference in New Issue
Block a user