DEADSOFTWARE

Add graphics convertor
[awtools.git] / dis_aw.c
1 #include <stdio.h>
2 #include <stdint.h>
3 #include "dis.h"
5 /*
6 * Eric Chahi's style target
7 * i.e. native Another World script syntax
8 */
10 void aw_printlabel(int i) {
11 if(printadr)
12 fprintf(fp, "%u\t", adr);
14 if(i == -1)
15 fprintf(fp, "\t");
16 else
17 fprintf(fp, "L%i\t", i);
18 }
20 void aw_printopcode(uint16_t op, uint16_t x, uint16_t y, uint16_t z, uint16_t w, int label) {
21 char *s;
22 char c1[16], c2[16], c3[16];
24 if(op & 0x80) {
25 fprintf(fp, "spr1\t%u\t%u\t%u\n", w, x, y);
26 } else if(op & 0x40) {
27 char seg = '1';
29 switch(op & 48) {
30 case 0:
31 snprintf(c1, 16, "%i", (int16_t)x);
32 break;
33 case 16:
34 snprintf(c1, 16, "v%u", x);
35 break;
36 case 32:
37 snprintf(c1, 16, "%u", x);
38 break;
39 case 48:
40 snprintf(c1, 16, "%u", x+256);
41 break;
42 }
44 switch(op & 12) {
45 case 0:
46 snprintf(c2, 16, "%i", (int16_t)y);
47 break;
48 case 4:
49 snprintf(c2, 16, "v%u", y);
50 break;
51 case 8:
52 case 12:
53 snprintf(c2, 16, "%u", y);
54 break;
55 }
57 switch(op & 3) {
58 case 0:
59 snprintf(c3, 16, "64");
60 break;
61 case 1:
62 snprintf(c3, 16, "v%u", z);
63 break;
64 case 2:
65 snprintf(c3, 16, "%u", z);
66 break;
67 case 3:
68 seg = '2';
69 snprintf(c3, 16, "64");
70 break;
71 }
73 /* Maybe graphics segmet is changed using file name */
74 fprintf(fp, "spr%c\t%u\t%s\t%s\t%s\n", seg, w, c1, c2, c3);
75 } else {
76 switch(op) {
77 case 0x0:
78 fprintf(fp, "seti\tv%u\t%i\n", x, (int16_t)y);
79 break;
80 case 0x1:
81 fprintf(fp, "set\tv%u\tv%u\n", x, y);
82 break;
83 case 0x2:
84 fprintf(fp, "add\tv%u\tv%u\n", x, y);
85 break;
86 case 0x3:
87 fprintf(fp, "addi\tv%u\t%u\n", x, y);
88 break;
89 case 0x4:
90 fprintf(fp, "jsr\tL%u\n", label);
91 break;
92 case 0x5:
93 fprintf(fp, "return\n");
94 break;
95 case 0x6:
96 fprintf(fp, "break\n");
97 break;
98 case 0x7:
99 fprintf(fp, "jmp\tL%u\n", label);
100 break;
101 case 0x8:
102 fprintf(fp, "setvec\t%u\tL%u\n", x, label);
103 break;
104 case 0x9:
105 fprintf(fp, "dbra\tv%u\tL%u\n", x, label);
106 break;
107 case 0xA:
108 if(w & 0x80)
109 snprintf(c1, 16, "v%u", y);
110 else if(w & 0x40)
111 snprintf(c1, 16, "%i", (int16_t)y);
112 else
113 snprintf(c1, 16, "%u", y);
115 switch(w & 0x7) {
116 case 0:
117 s = "=";
118 break;
119 case 1:
120 s = "<>";
121 break;
122 case 2:
123 s = ">";
124 break;
125 case 3:
126 s = ">=";
127 break;
128 case 4:
129 s = "<";
130 break;
131 case 5:
132 s = "<=";
133 break;
134 default:
135 s = "unk";
138 fprintf(fp, "si\tv%u\t%s\t%s\tL%u\n", x, s, c1, label);
139 break;
140 case 0xB:
141 fprintf(fp, "fade\t%u\n", x);
142 break;
143 case 0xC:
144 fprintf(fp, "vec\t%u\t%u\t%u\n", x, y, z);
145 break;
146 case 0xD:
147 fprintf(fp, "setws\t%u\n", x);
148 break;
149 case 0xE:
150 fprintf(fp, "clr\t%u\t%u\n", x, y);
151 break;
152 case 0xF:
153 fprintf(fp, "copy\t%u\t%u\n", x, y);
154 break;
155 case 0x10:
156 fprintf(fp, "show\t%u\n", x);
157 break;
158 case 0x11:
159 fprintf(fp, "bigend\n");
160 break;
161 case 0x12:
162 fprintf(fp, "text\t%u\t%u\t%u\t%u\n", z, x, y, w);
163 break;
164 case 0x13:
165 fprintf(fp, "sub\tv%u\tv%u\n", x, y);
166 break;
167 case 0x14:
168 fprintf(fp, "andi\tv%u\t%u\n", x, y);
169 break;
170 case 0x15:
171 fprintf(fp, "ori\tv%u\t%u\n", x, y);
172 break;
173 case 0x16:
174 fprintf(fp, "lsl\tv%u\t%u\n", x, y);
175 break;
176 case 0x17:
177 fprintf(fp, "lsr\tv%u\t%u\n", x, y);
178 break;
179 case 0x18:
180 fprintf(fp, "play\t%u\t%u\t%u\t%u\n", z, x, y, w);
181 break;
182 case 0x19:
183 fprintf(fp, "load\t%u\n", x);
184 break;
185 case 0x1A:
186 fprintf(fp, "song\t%u\t%u\t%u\n", x, y, z);
187 break;
188 default:
189 fprintf(fp, "unk_%x\n", op);