174a4d8c2SCharles.Forsyth #define EXTERN
274a4d8c2SCharles.Forsyth #include "gc.h"
374a4d8c2SCharles.Forsyth
474a4d8c2SCharles.Forsyth void
listinit(void)574a4d8c2SCharles.Forsyth listinit(void)
674a4d8c2SCharles.Forsyth {
774a4d8c2SCharles.Forsyth
874a4d8c2SCharles.Forsyth fmtinstall('A', Aconv);
974a4d8c2SCharles.Forsyth fmtinstall('B', Bconv);
1074a4d8c2SCharles.Forsyth fmtinstall('P', Pconv);
1174a4d8c2SCharles.Forsyth fmtinstall('S', Sconv);
1274a4d8c2SCharles.Forsyth fmtinstall('D', Dconv);
1374a4d8c2SCharles.Forsyth fmtinstall('R', Rconv);
1474a4d8c2SCharles.Forsyth }
1574a4d8c2SCharles.Forsyth
1674a4d8c2SCharles.Forsyth int
Bconv(Fmt * fp)1774a4d8c2SCharles.Forsyth Bconv(Fmt *fp)
1874a4d8c2SCharles.Forsyth {
1974a4d8c2SCharles.Forsyth char str[STRINGSZ], ss[STRINGSZ], *s;
2074a4d8c2SCharles.Forsyth Bits bits;
2174a4d8c2SCharles.Forsyth int i;
2274a4d8c2SCharles.Forsyth
2374a4d8c2SCharles.Forsyth str[0] = 0;
2474a4d8c2SCharles.Forsyth bits = va_arg(fp->args, Bits);
2574a4d8c2SCharles.Forsyth while(bany(&bits)) {
2674a4d8c2SCharles.Forsyth i = bnum(bits);
2774a4d8c2SCharles.Forsyth if(str[0])
2874a4d8c2SCharles.Forsyth strcat(str, " ");
2974a4d8c2SCharles.Forsyth if(var[i].sym == S) {
30*45a20ab7Sforsyth snprint(ss, sizeof(ss), "$%ld", var[i].offset);
3174a4d8c2SCharles.Forsyth s = ss;
3274a4d8c2SCharles.Forsyth } else
3374a4d8c2SCharles.Forsyth s = var[i].sym->name;
3474a4d8c2SCharles.Forsyth if(strlen(str) + strlen(s) + 1 >= STRINGSZ)
3574a4d8c2SCharles.Forsyth break;
3674a4d8c2SCharles.Forsyth strcat(str, s);
3774a4d8c2SCharles.Forsyth bits.b[i/32] &= ~(1L << (i%32));
3874a4d8c2SCharles.Forsyth }
3974a4d8c2SCharles.Forsyth return fmtstrcpy(fp, str);
4074a4d8c2SCharles.Forsyth }
4174a4d8c2SCharles.Forsyth
4274a4d8c2SCharles.Forsyth int
Pconv(Fmt * fp)4374a4d8c2SCharles.Forsyth Pconv(Fmt *fp)
4474a4d8c2SCharles.Forsyth {
4574a4d8c2SCharles.Forsyth char str[STRINGSZ];
4674a4d8c2SCharles.Forsyth Prog *p;
4774a4d8c2SCharles.Forsyth
4874a4d8c2SCharles.Forsyth p = va_arg(fp->args, Prog*);
4974a4d8c2SCharles.Forsyth if(p->as == ADATA)
50*45a20ab7Sforsyth snprint(str, sizeof(str), " %A %D/%d,%D",
5174a4d8c2SCharles.Forsyth p->as, &p->from, p->from.scale, &p->to);
5274a4d8c2SCharles.Forsyth else if(p->as == ATEXT)
53*45a20ab7Sforsyth snprint(str, sizeof(str), " %A %D,%d,%D",
5474a4d8c2SCharles.Forsyth p->as, &p->from, p->from.scale, &p->to);
5574a4d8c2SCharles.Forsyth else
56*45a20ab7Sforsyth snprint(str, sizeof(str), " %A %D,%D",
5774a4d8c2SCharles.Forsyth p->as, &p->from, &p->to);
5874a4d8c2SCharles.Forsyth return fmtstrcpy(fp, str);
5974a4d8c2SCharles.Forsyth }
6074a4d8c2SCharles.Forsyth
6174a4d8c2SCharles.Forsyth int
Aconv(Fmt * fp)6274a4d8c2SCharles.Forsyth Aconv(Fmt *fp)
6374a4d8c2SCharles.Forsyth {
6474a4d8c2SCharles.Forsyth int i;
6574a4d8c2SCharles.Forsyth
6674a4d8c2SCharles.Forsyth i = va_arg(fp->args, int);
6774a4d8c2SCharles.Forsyth return fmtstrcpy(fp, anames[i]);
6874a4d8c2SCharles.Forsyth }
6974a4d8c2SCharles.Forsyth
7074a4d8c2SCharles.Forsyth int
Dconv(Fmt * fp)7174a4d8c2SCharles.Forsyth Dconv(Fmt *fp)
7274a4d8c2SCharles.Forsyth {
73*45a20ab7Sforsyth char str[40], s[20];
7474a4d8c2SCharles.Forsyth Adr *a;
7574a4d8c2SCharles.Forsyth int i;
7674a4d8c2SCharles.Forsyth
7774a4d8c2SCharles.Forsyth a = va_arg(fp->args, Adr*);
7874a4d8c2SCharles.Forsyth i = a->type;
7974a4d8c2SCharles.Forsyth if(i >= D_INDIR) {
8074a4d8c2SCharles.Forsyth if(a->offset)
81*45a20ab7Sforsyth snprint(str, sizeof(str), "%ld(%R)", a->offset, i-D_INDIR);
8274a4d8c2SCharles.Forsyth else
83*45a20ab7Sforsyth snprint(str, sizeof(str), "(%R)", i-D_INDIR);
8474a4d8c2SCharles.Forsyth goto brk;
8574a4d8c2SCharles.Forsyth }
8674a4d8c2SCharles.Forsyth switch(i) {
8774a4d8c2SCharles.Forsyth
8874a4d8c2SCharles.Forsyth default:
8974a4d8c2SCharles.Forsyth if(a->offset)
90*45a20ab7Sforsyth snprint(str, sizeof(str), "$%ld,%R", a->offset, i);
9174a4d8c2SCharles.Forsyth else
92*45a20ab7Sforsyth snprint(str, sizeof(str), "%R", i);
9374a4d8c2SCharles.Forsyth break;
9474a4d8c2SCharles.Forsyth
9574a4d8c2SCharles.Forsyth case D_NONE:
9674a4d8c2SCharles.Forsyth str[0] = 0;
9774a4d8c2SCharles.Forsyth break;
9874a4d8c2SCharles.Forsyth
9974a4d8c2SCharles.Forsyth case D_BRANCH:
100*45a20ab7Sforsyth snprint(str, sizeof(str), "%ld(PC)", a->offset-pc);
10174a4d8c2SCharles.Forsyth break;
10274a4d8c2SCharles.Forsyth
10374a4d8c2SCharles.Forsyth case D_EXTERN:
104*45a20ab7Sforsyth snprint(str, sizeof(str), "%s+%ld(SB)", a->sym->name, a->offset);
10574a4d8c2SCharles.Forsyth break;
10674a4d8c2SCharles.Forsyth
10774a4d8c2SCharles.Forsyth case D_STATIC:
108*45a20ab7Sforsyth snprint(str, sizeof(str), "%s<>+%ld(SB)", a->sym->name,
10974a4d8c2SCharles.Forsyth a->offset);
11074a4d8c2SCharles.Forsyth break;
11174a4d8c2SCharles.Forsyth
11274a4d8c2SCharles.Forsyth case D_AUTO:
113*45a20ab7Sforsyth snprint(str, sizeof(str), "%s+%ld(SP)", a->sym->name, a->offset);
11474a4d8c2SCharles.Forsyth break;
11574a4d8c2SCharles.Forsyth
11674a4d8c2SCharles.Forsyth case D_PARAM:
11774a4d8c2SCharles.Forsyth if(a->sym)
118*45a20ab7Sforsyth snprint(str, sizeof(str), "%s+%ld(FP)", a->sym->name, a->offset);
11974a4d8c2SCharles.Forsyth else
120*45a20ab7Sforsyth snprint(str, sizeof(str), "%ld(FP)", a->offset);
12174a4d8c2SCharles.Forsyth break;
12274a4d8c2SCharles.Forsyth
12374a4d8c2SCharles.Forsyth case D_CONST:
124*45a20ab7Sforsyth snprint(str, sizeof(str), "$%ld", a->offset);
12574a4d8c2SCharles.Forsyth break;
12674a4d8c2SCharles.Forsyth
12774a4d8c2SCharles.Forsyth case D_FCONST:
128*45a20ab7Sforsyth snprint(str, sizeof(str), "$(%.17e)", a->dval);
12974a4d8c2SCharles.Forsyth break;
13074a4d8c2SCharles.Forsyth
13174a4d8c2SCharles.Forsyth case D_SCONST:
132*45a20ab7Sforsyth snprint(str, sizeof(str), "$\"%S\"", a->sval);
13374a4d8c2SCharles.Forsyth break;
13474a4d8c2SCharles.Forsyth
13574a4d8c2SCharles.Forsyth case D_ADDR:
13674a4d8c2SCharles.Forsyth a->type = a->index;
13774a4d8c2SCharles.Forsyth a->index = D_NONE;
138*45a20ab7Sforsyth snprint(str, sizeof(str), "$%D", a);
13974a4d8c2SCharles.Forsyth a->index = a->type;
14074a4d8c2SCharles.Forsyth a->type = D_ADDR;
14174a4d8c2SCharles.Forsyth goto conv;
14274a4d8c2SCharles.Forsyth }
14374a4d8c2SCharles.Forsyth brk:
14474a4d8c2SCharles.Forsyth if(a->index != D_NONE) {
145*45a20ab7Sforsyth fmtstrcpy(fp, str);
146*45a20ab7Sforsyth snprint(s, sizeof(s), "(%R*%d)", (int)a->index, (int)a->scale);
147*45a20ab7Sforsyth return fmtstrcpy(fp, s);
14874a4d8c2SCharles.Forsyth }
14974a4d8c2SCharles.Forsyth conv:
15074a4d8c2SCharles.Forsyth return fmtstrcpy(fp, str);
15174a4d8c2SCharles.Forsyth }
15274a4d8c2SCharles.Forsyth
15374a4d8c2SCharles.Forsyth char* regstr[] =
15474a4d8c2SCharles.Forsyth {
15574a4d8c2SCharles.Forsyth "AL", /*[D_AL]*/
15674a4d8c2SCharles.Forsyth "CL",
15774a4d8c2SCharles.Forsyth "DL",
15874a4d8c2SCharles.Forsyth "BL",
15974a4d8c2SCharles.Forsyth "AH",
16074a4d8c2SCharles.Forsyth "CH",
16174a4d8c2SCharles.Forsyth "DH",
16274a4d8c2SCharles.Forsyth "BH",
16374a4d8c2SCharles.Forsyth
16474a4d8c2SCharles.Forsyth "AX", /*[D_AX]*/
16574a4d8c2SCharles.Forsyth "CX",
16674a4d8c2SCharles.Forsyth "DX",
16774a4d8c2SCharles.Forsyth "BX",
16874a4d8c2SCharles.Forsyth "SP",
16974a4d8c2SCharles.Forsyth "BP",
17074a4d8c2SCharles.Forsyth "SI",
17174a4d8c2SCharles.Forsyth "DI",
17274a4d8c2SCharles.Forsyth
17374a4d8c2SCharles.Forsyth "F0", /*[D_F0]*/
17474a4d8c2SCharles.Forsyth "F1",
17574a4d8c2SCharles.Forsyth "F2",
17674a4d8c2SCharles.Forsyth "F3",
17774a4d8c2SCharles.Forsyth "F4",
17874a4d8c2SCharles.Forsyth "F5",
17974a4d8c2SCharles.Forsyth "F6",
18074a4d8c2SCharles.Forsyth "F7",
18174a4d8c2SCharles.Forsyth
18274a4d8c2SCharles.Forsyth "CS", /*[D_CS]*/
18374a4d8c2SCharles.Forsyth "SS",
18474a4d8c2SCharles.Forsyth "DS",
18574a4d8c2SCharles.Forsyth "ES",
18674a4d8c2SCharles.Forsyth "FS",
18774a4d8c2SCharles.Forsyth "GS",
18874a4d8c2SCharles.Forsyth
18974a4d8c2SCharles.Forsyth "GDTR", /*[D_GDTR]*/
19074a4d8c2SCharles.Forsyth "IDTR", /*[D_IDTR]*/
19174a4d8c2SCharles.Forsyth "LDTR", /*[D_LDTR]*/
19274a4d8c2SCharles.Forsyth "MSW", /*[D_MSW] */
19374a4d8c2SCharles.Forsyth "TASK", /*[D_TASK]*/
19474a4d8c2SCharles.Forsyth
19574a4d8c2SCharles.Forsyth "CR0", /*[D_CR]*/
19674a4d8c2SCharles.Forsyth "CR1",
19774a4d8c2SCharles.Forsyth "CR2",
19874a4d8c2SCharles.Forsyth "CR3",
19974a4d8c2SCharles.Forsyth "CR4",
20074a4d8c2SCharles.Forsyth "CR5",
20174a4d8c2SCharles.Forsyth "CR6",
20274a4d8c2SCharles.Forsyth "CR7",
20374a4d8c2SCharles.Forsyth
20474a4d8c2SCharles.Forsyth "DR0", /*[D_DR]*/
20574a4d8c2SCharles.Forsyth "DR1",
20674a4d8c2SCharles.Forsyth "DR2",
20774a4d8c2SCharles.Forsyth "DR3",
20874a4d8c2SCharles.Forsyth "DR4",
20974a4d8c2SCharles.Forsyth "DR5",
21074a4d8c2SCharles.Forsyth "DR6",
21174a4d8c2SCharles.Forsyth "DR7",
21274a4d8c2SCharles.Forsyth
21374a4d8c2SCharles.Forsyth "TR0", /*[D_TR]*/
21474a4d8c2SCharles.Forsyth "TR1",
21574a4d8c2SCharles.Forsyth "TR2",
21674a4d8c2SCharles.Forsyth "TR3",
21774a4d8c2SCharles.Forsyth "TR4",
21874a4d8c2SCharles.Forsyth "TR5",
21974a4d8c2SCharles.Forsyth "TR6",
22074a4d8c2SCharles.Forsyth "TR7",
22174a4d8c2SCharles.Forsyth
22274a4d8c2SCharles.Forsyth "NONE", /*[D_NONE]*/
22374a4d8c2SCharles.Forsyth };
22474a4d8c2SCharles.Forsyth
22574a4d8c2SCharles.Forsyth int
Rconv(Fmt * fp)22674a4d8c2SCharles.Forsyth Rconv(Fmt *fp)
22774a4d8c2SCharles.Forsyth {
228*45a20ab7Sforsyth char str[20];
22974a4d8c2SCharles.Forsyth int r;
23074a4d8c2SCharles.Forsyth
23174a4d8c2SCharles.Forsyth r = va_arg(fp->args, int);
23274a4d8c2SCharles.Forsyth if(r >= D_AL && r <= D_NONE)
233*45a20ab7Sforsyth snprint(str, sizeof(str), "%s", regstr[r-D_AL]);
23474a4d8c2SCharles.Forsyth else
235*45a20ab7Sforsyth snprint(str, sizeof(str), "gok(%d)", r);
23674a4d8c2SCharles.Forsyth
23774a4d8c2SCharles.Forsyth return fmtstrcpy(fp, str);
23874a4d8c2SCharles.Forsyth }
23974a4d8c2SCharles.Forsyth
24074a4d8c2SCharles.Forsyth int
Sconv(Fmt * fp)24174a4d8c2SCharles.Forsyth Sconv(Fmt *fp)
24274a4d8c2SCharles.Forsyth {
24374a4d8c2SCharles.Forsyth int i, c;
244*45a20ab7Sforsyth char str[30], *p, *a;
24574a4d8c2SCharles.Forsyth
24674a4d8c2SCharles.Forsyth a = va_arg(fp->args, char*);
24774a4d8c2SCharles.Forsyth p = str;
24874a4d8c2SCharles.Forsyth for(i=0; i<sizeof(double); i++) {
24974a4d8c2SCharles.Forsyth c = a[i] & 0xff;
25074a4d8c2SCharles.Forsyth if(c >= 'a' && c <= 'z' ||
25174a4d8c2SCharles.Forsyth c >= 'A' && c <= 'Z' ||
25274a4d8c2SCharles.Forsyth c >= '0' && c <= '9') {
25374a4d8c2SCharles.Forsyth *p++ = c;
25474a4d8c2SCharles.Forsyth continue;
25574a4d8c2SCharles.Forsyth }
25674a4d8c2SCharles.Forsyth *p++ = '\\';
25774a4d8c2SCharles.Forsyth switch(c) {
25874a4d8c2SCharles.Forsyth default:
25974a4d8c2SCharles.Forsyth if(c < 040 || c >= 0177)
26074a4d8c2SCharles.Forsyth break; /* not portable */
26174a4d8c2SCharles.Forsyth p[-1] = c;
26274a4d8c2SCharles.Forsyth continue;
26374a4d8c2SCharles.Forsyth case 0:
26474a4d8c2SCharles.Forsyth *p++ = 'z';
26574a4d8c2SCharles.Forsyth continue;
26674a4d8c2SCharles.Forsyth case '\\':
26774a4d8c2SCharles.Forsyth case '"':
26874a4d8c2SCharles.Forsyth *p++ = c;
26974a4d8c2SCharles.Forsyth continue;
27074a4d8c2SCharles.Forsyth case '\n':
27174a4d8c2SCharles.Forsyth *p++ = 'n';
27274a4d8c2SCharles.Forsyth continue;
27374a4d8c2SCharles.Forsyth case '\t':
27474a4d8c2SCharles.Forsyth *p++ = 't';
27574a4d8c2SCharles.Forsyth continue;
27674a4d8c2SCharles.Forsyth }
27774a4d8c2SCharles.Forsyth *p++ = (c>>6) + '0';
27874a4d8c2SCharles.Forsyth *p++ = ((c>>3) & 7) + '0';
27974a4d8c2SCharles.Forsyth *p++ = (c & 7) + '0';
28074a4d8c2SCharles.Forsyth }
28174a4d8c2SCharles.Forsyth *p = 0;
28274a4d8c2SCharles.Forsyth return fmtstrcpy(fp, str);
28374a4d8c2SCharles.Forsyth }
284