DEADSOFTWARE

Add graphics convertor
[awtools.git] / dis_att.c
1 #include <stdio.h>
2 #include <stdint.h>
3 #include "dis.h"
5 /*
6 * AT&T style target
7 *
8 * This target uses another mnemonics:
9 * spr = spr1, spr2
10 * mov = set, seti
11 * add = add, addi
12 * jsr = jsr
13 * ret = return
14 * wait = break
15 * jmp = jmp
16 * setv = setvec
17 * jnz = dbra
18 * je, jne, jg, jge, jl, jle = si (=, !=, >, >=, <, <=)
19 * pal = fade
20 * vec = vec
21 * page = setws
22 * clr = clr
23 * copy = copy
24 * show = show
25 * kill = bigend
26 * text = text
27 * sub = sub
28 * and = andi
29 * or = ori
30 * shl = lsl
31 * shr = lsr
32 * snd = play
33 * ld = load
34 * mus = song
35 */
37 void att_printlabel(int i) {
38 if(i != -1) {
39 if(label[i].type != LT_JUMP && adr != 0)
40 fputc('\n', fp);
42 if(label[i].type == LT_CALL)
43 fprintf(fp, "# Procedure code\n");
44 else if(label[i].type == LT_VEC)
45 fprintf(fp, "# Task code\n");
47 fprintf(fp, ".L%X:\n", i);
48 }
50 if(printadr)
51 fprintf(fp, "/* %5u */", adr);
53 fprintf(fp, "\t");
54 }
56 void att_printopcode(uint16_t op, uint16_t x, uint16_t y, uint16_t z, uint16_t w, int label) {
57 char *s;
58 char c1[16], c2[16], c3[16];
60 if(op & 0x80) {
61 fprintf(fp, "spr\t0x%x, $%u, $%u\n", w, x, y);
62 } else if(op & 0x40) {
63 char *seg = "";
65 switch(op & 48) {
66 case 0:
67 snprintf(c1, 16, "$%i", (int16_t)x);
68 break;
69 case 16:
70 snprintf(c1, 16, "%%v%u", x);
71 break;
72 case 32:
73 snprintf(c1, 16, "$%u", x);
74 break;
75 case 48:
76 snprintf(c1, 16, "%%%u", x+256);
77 break;
78 }
80 switch(op & 12) {
81 case 0:
82 snprintf(c2, 16, "$%i", (int16_t)y);
83 break;
84 case 4:
85 snprintf(c2, 16, "%%v%u", y);
86 break;
87 case 8:
88 case 12:
89 snprintf(c2, 16, "$%u", y);
90 break;
91 }
93 switch(op & 3) {
94 case 0:
95 snprintf(c3, 16, "$64");
96 break;
97 case 1:
98 snprintf(c3, 16, "%%v%u", z);
99 break;
100 case 2:
101 snprintf(c3, 16, "$%u", z);
102 break;
103 case 3:
104 seg = "(%vid2)";
105 snprintf(c3, 16, "$64");
106 break;
109 fprintf(fp, "spr\t0x%x%s, %s, %s, %s\n", w, seg, c1, c2, c3);
110 } else {
111 switch(op) {
112 case 0x0:
113 fprintf(fp, "mov\t$%i, %%v%u\n", (int16_t)y, x);
114 break;
115 case 0x1:
116 fprintf(fp, "mov\t%%v%u, %%v%u\n", y, x);
117 break;
118 case 0x2:
119 fprintf(fp, "add\t%%v%u, %%v%u\n", y, x);
120 break;
121 case 0x3:
122 fprintf(fp, "add\t$%u, %%v%u\n", y, x);
123 break;
124 case 0x4:
125 fprintf(fp, "jsr\t.L%X\n", label);
126 break;
127 case 0x5:
128 fprintf(fp, "ret\n");
129 break;
130 case 0x6:
131 fprintf(fp, "wait\n");
132 break;
133 case 0x7:
134 fprintf(fp, "jmp\t.L%X\n", label);
135 break;
136 case 0x8:
137 fprintf(fp, "setv\t$%u, .L%X\n", x, label);
138 break;
139 case 0x9:
140 fprintf(fp, "jnz\t%%v%u, .L%X\n", x, label);
141 break;
142 case 0xA:
143 if(w & 0x80)
144 snprintf(c1, 16, "%%v%u", y);
145 else if(w & 0x40)
146 snprintf(c1, 16, "$%i", (int16_t)y);
147 else
148 snprintf(c1, 16, "$%u", y);
150 switch(w & 0x7) {
151 case 0:
152 s = "je";
153 break;
154 case 1:
155 s = "jne";
156 break;
157 case 2:
158 s = "jg";
159 break;
160 case 3:
161 s = "jge";
162 break;
163 case 4:
164 s = "jl";
165 break;
166 case 5:
167 s = "jle";
168 break;
169 default:
170 s = "unk_jmp";
173 fprintf(fp, "%s\t%%v%u, %s, .L%X\n", s, x, c1, label);
174 break;
175 case 0xB:
176 fprintf(fp, "pal\t$%u\n", x);
177 break;
178 case 0xC:
179 fprintf(fp, "vec\t$%u, $%u, $%u\n", x, y, z);
180 break;
181 case 0xD:
182 fprintf(fp, "page\t$%u\n", x);
183 break;
184 case 0xE:
185 fprintf(fp, "clr\t$%u, $%u\n", x, y);
186 break;
187 case 0xF:
188 fprintf(fp, "copy\t$%u, $%u\n", x, y);
189 break;
190 case 0x10:
191 fprintf(fp, "show\t$%u\n", x);
192 break;
193 case 0x11:
194 fprintf(fp, "kill\n");
195 break;
196 case 0x12:
197 fprintf(fp, "text\t$%u, $%u, $%u, $%u\n", z, x, y, w);
198 break;
199 case 0x13:
200 fprintf(fp, "sub\t%%v%u, %%v%u\n", y, x);
201 break;
202 case 0x14:
203 fprintf(fp, "and\t$%u, %%v%u\n", y, x);
204 break;
205 case 0x15:
206 fprintf(fp, "or\t$%u, %%v%u\n", y, x);
207 break;
208 case 0x16:
209 fprintf(fp, "shl\t$%u, %%v%u\n", y, x);
210 break;
211 case 0x17:
212 fprintf(fp, "shr\t$%u, %%v%u\n", y, x);
213 break;
214 case 0x18:
215 fprintf(fp, "snd\t$%u, $%u, $%u, $%u\n", z, x, y, w);
216 break;
217 case 0x19:
218 fprintf(fp, "ld\t$%u\n", x);
219 break;
220 case 0x1A:
221 fprintf(fp, "mus\t$%u, $%u, $%u\n", x, y, z);
222 break;
223 default:
224 fprintf(fp, "unk_%x\n", op);