1 #include "lib9.h"
2 #include "isa.h"
3 #include "interp.h"
4 #include "mathi.h"
5
6 enum
7 {
8 TOKI0,
9 TOKI1,
10 TOKI2,
11 TOKI3,
12 TOKSB,
13 TOKFP
14 };
15 #include "tab.h"
16
17 typedef struct Addr Addr;
18 struct Addr
19 {
20 uchar mode;
21 Adr a;
22 };
23
24 #pragma varargck type "a" Addr*
25
26 char* opnam[256];
27 int iconv(Fmt*);
28 int aconv(Fmt*);
29
30 int
aconv(Fmt * f)31 aconv(Fmt *f)
32 {
33 Addr *a;
34 char buf[64];
35
36 a = va_arg(f->args, Addr*);
37 if(a == nil)
38 return fmtstrcpy(f, "AZ");
39 switch(a->mode & AMASK) {
40 case AFP: sprint(buf, "%d(fp)", a->a.ind); break;
41 case AMP: sprint(buf, "%d(mp)", a->a.ind); break;
42 case AIMM: sprint(buf, "$%d", a->a.imm); break;
43 case AIND|AFP: sprint(buf, "%d(%d(fp))", a->a.i.s, a->a.i.f); break;
44 case AIND|AMP: sprint(buf, "%d(%d(mp))", a->a.i.s, a->a.i.f); break;
45 }
46 return fmtstrcpy(f, buf);
47 }
48
49 int
Dconv(Fmt * f)50 Dconv(Fmt *f)
51 {
52 int j;
53 Inst *i;
54 Addr s, d;
55 char buf[128];
56 static int init;
57
58 if(init == 0) {
59 for(j = 0; keywds[j].name != nil; j++)
60 opnam[keywds[j].op] = keywds[j].name;
61
62 fmtinstall('a', aconv);
63 init = 1;
64 }
65
66 i = va_arg(f->args, Inst*);
67 if(i == nil)
68 return fmtstrcpy(f, "IZ");
69
70 switch(keywds[i->op].terminal) {
71 case TOKI0:
72 sprint(buf, "%s", opnam[i->op]);
73 break;
74 case TOKI1:
75 d.a = i->d;
76 d.mode = UDST(i->add);
77 sprint(buf, "%s\t%a", opnam[i->op], &d);
78 break;
79 case TOKI3:
80 d.a = i->d;
81 d.mode = UDST(i->add);
82 s.a = i->s;
83 s.mode = USRC(i->add);
84 switch(i->add&ARM) {
85 default:
86 sprint(buf, "%s\t%a, %a", opnam[i->op], &s, &d);
87 break;
88 case AXIMM:
89 sprint(buf, "%s\t%a, $%d, %a", opnam[i->op], &s, i->reg, &d);
90 break;
91 case AXINF:
92 sprint(buf, "%s\t%a, %d(fp), %a", opnam[i->op], &s, i->reg, &d);
93 break;
94 case AXINM:
95 sprint(buf, "%s\t%a, %d(mp), %a", opnam[i->op], &s, i->reg, &d);
96 break;
97 }
98 break;
99 case TOKI2:
100 d.a = i->d;
101 d.mode = UDST(i->add);
102 s.a = i->s;
103 s.mode = USRC(i->add);
104 sprint(buf, "%s\t%a, %a", opnam[i->op], &s, &d);
105 break;
106 }
107
108 return fmtstrcpy(f, buf);
109 }
110
111