Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
alexbevi
GitHub Repository: alexbevi/BizHawk
Path: blob/master/libsnes/bsnes/snes/chip/superfx/disasm/disasm.cpp
2 views
1
#ifdef SUPERFX_CPP
2
3
void SuperFX::disassemble_opcode(char *output) {
4
*output = 0;
5
6
if(!regs.sfr.alt2) {
7
if(!regs.sfr.alt1) {
8
disassemble_alt0(output);
9
} else {
10
disassemble_alt1(output);
11
}
12
} else {
13
if(!regs.sfr.alt1) {
14
disassemble_alt2(output);
15
} else {
16
disassemble_alt3(output);
17
}
18
}
19
20
unsigned length = strlen(output);
21
while(length++ < 20) strcat(output, " ");
22
}
23
24
#define case4(id) \
25
case id+ 0: case id+ 1: case id+ 2: case id+ 3
26
#define case6(id) \
27
case id+ 0: case id+ 1: case id+ 2: case id+ 3: case id+ 4: case id+ 5
28
#define case12(id) \
29
case id+ 0: case id+ 1: case id+ 2: case id+ 3: case id+ 4: case id+ 5: case id+ 6: case id+ 7: \
30
case id+ 8: case id+ 9: case id+10: case id+11
31
#define case15(id) \
32
case id+ 0: case id+ 1: case id+ 2: case id+ 3: case id+ 4: case id+ 5: case id+ 6: case id+ 7: \
33
case id+ 8: case id+ 9: case id+10: case id+11: case id+12: case id+13: case id+14
34
#define case16(id) \
35
case id+ 0: case id+ 1: case id+ 2: case id+ 3: case id+ 4: case id+ 5: case id+ 6: case id+ 7: \
36
case id+ 8: case id+ 9: case id+10: case id+11: case id+12: case id+13: case id+14: case id+15
37
38
#define op0 regs.pipeline
39
#define op1 bus_read((regs.pbr << 16) + regs.r[15] + 0)
40
#define op2 bus_read((regs.pbr << 16) + regs.r[15] + 1)
41
42
void SuperFX::disassemble_alt0(char *output) {
43
char t[256] = "";
44
switch(op0) {
45
case (0x00): sprintf(t, "stop"); break;
46
case (0x01): sprintf(t, "nop"); break;
47
case (0x02): sprintf(t, "cache"); break;
48
case (0x03): sprintf(t, "lsr"); break;
49
case (0x04): sprintf(t, "rol"); break;
50
case (0x05): sprintf(t, "bra %+d", (int8_t)op1); break;
51
case (0x06): sprintf(t, "blt %+d", (int8_t)op1); break;
52
case (0x07): sprintf(t, "bge %+d", (int8_t)op1); break;
53
case (0x08): sprintf(t, "bne %+d", (int8_t)op1); break;
54
case (0x09): sprintf(t, "beq %+d", (int8_t)op1); break;
55
case (0x0a): sprintf(t, "bpl %+d", (int8_t)op1); break;
56
case (0x0b): sprintf(t, "bmi %+d", (int8_t)op1); break;
57
case (0x0c): sprintf(t, "bcc %+d", (int8_t)op1); break;
58
case (0x0d): sprintf(t, "bcs %+d", (int8_t)op1); break;
59
case (0x0e): sprintf(t, "bvc %+d", (int8_t)op1); break;
60
case (0x0f): sprintf(t, "bvs %+d", (int8_t)op1); break;
61
case16(0x10): sprintf(t, "to r%u", op0 & 15); break;
62
case16(0x20): sprintf(t, "with r%u", op0 & 15); break;
63
case12(0x30): sprintf(t, "stw (r%u)", op0 & 15); break;
64
case (0x3c): sprintf(t, "loop"); break;
65
case (0x3d): sprintf(t, "alt1"); break;
66
case (0x3e): sprintf(t, "alt2"); break;
67
case (0x3f): sprintf(t, "alt3"); break;
68
case12(0x40): sprintf(t, "ldw (r%u)", op0 & 15); break;
69
case (0x4c): sprintf(t, "plot"); break;
70
case (0x4d): sprintf(t, "swap"); break;
71
case (0x4e): sprintf(t, "color"); break;
72
case (0x4f): sprintf(t, "not"); break;
73
case16(0x50): sprintf(t, "add r%u", op0 & 15); break;
74
case16(0x60): sprintf(t, "sub r%u", op0 & 15); break;
75
case (0x70): sprintf(t, "merge"); break;
76
case15(0x71): sprintf(t, "and r%u", op0 & 15); break;
77
case16(0x80): sprintf(t, "mult r%u", op0 & 15); break;
78
case (0x90): sprintf(t, "sbk"); break;
79
case4 (0x91): sprintf(t, "link #%u", op0 & 15); break;
80
case (0x95): sprintf(t, "sex"); break;
81
case (0x96): sprintf(t, "asr"); break;
82
case (0x97): sprintf(t, "ror"); break;
83
case6 (0x98): sprintf(t, "jmp r%u", op0 & 15); break;
84
case (0x9e): sprintf(t, "lob"); break;
85
case (0x9f): sprintf(t, "fmult"); break;
86
case16(0xa0): sprintf(t, "ibt r%u,#$%.2x", op0 & 15, op1); break;
87
case16(0xb0): sprintf(t, "from r%u", op0 & 15); break;
88
case (0xc0): sprintf(t, "hib");
89
case15(0xc1): sprintf(t, "or r%u", op0 & 15); break;
90
case15(0xd0): sprintf(t, "inc r%u", op0 & 15); break;
91
case (0xdf): sprintf(t, "getc"); break;
92
case15(0xe0): sprintf(t, "dec r%u", op0 & 15); break;
93
case (0xef): sprintf(t, "getb"); break;
94
case16(0xf0): sprintf(t, "iwt r%u,#$%.2x%.2x", op0 & 15, op2, op1); break;
95
}
96
strcat(output, t);
97
}
98
99
void SuperFX::disassemble_alt1(char *output) {
100
char t[256] = "";
101
switch(op0) {
102
case (0x00): sprintf(t, "stop"); break;
103
case (0x01): sprintf(t, "nop"); break;
104
case (0x02): sprintf(t, "cache"); break;
105
case (0x03): sprintf(t, "lsr"); break;
106
case (0x04): sprintf(t, "rol"); break;
107
case (0x05): sprintf(t, "bra %+d", (int8_t)op1); break;
108
case (0x06): sprintf(t, "blt %+d", (int8_t)op1); break;
109
case (0x07): sprintf(t, "bge %+d", (int8_t)op1); break;
110
case (0x08): sprintf(t, "bne %+d", (int8_t)op1); break;
111
case (0x09): sprintf(t, "beq %+d", (int8_t)op1); break;
112
case (0x0a): sprintf(t, "bpl %+d", (int8_t)op1); break;
113
case (0x0b): sprintf(t, "bmi %+d", (int8_t)op1); break;
114
case (0x0c): sprintf(t, "bcc %+d", (int8_t)op1); break;
115
case (0x0d): sprintf(t, "bcs %+d", (int8_t)op1); break;
116
case (0x0e): sprintf(t, "bvc %+d", (int8_t)op1); break;
117
case (0x0f): sprintf(t, "bvs %+d", (int8_t)op1); break;
118
case16(0x10): sprintf(t, "to r%u", op0 & 15); break;
119
case16(0x20): sprintf(t, "with r%u", op0 & 15); break;
120
case12(0x30): sprintf(t, "stb (r%u)", op0 & 15); break;
121
case (0x3c): sprintf(t, "loop"); break;
122
case (0x3d): sprintf(t, "alt1"); break;
123
case (0x3e): sprintf(t, "alt2"); break;
124
case (0x3f): sprintf(t, "alt3"); break;
125
case12(0x40): sprintf(t, "ldb (r%u)", op0 & 15); break;
126
case (0x4c): sprintf(t, "rpix"); break;
127
case (0x4d): sprintf(t, "swap"); break;
128
case (0x4e): sprintf(t, "cmode"); break;
129
case (0x4f): sprintf(t, "not"); break;
130
case16(0x50): sprintf(t, "adc r%u", op0 & 15); break;
131
case16(0x60): sprintf(t, "sbc r%u", op0 & 15); break;
132
case (0x70): sprintf(t, "merge"); break;
133
case15(0x71): sprintf(t, "bic r%u", op0 & 15); break;
134
case16(0x80): sprintf(t, "umult r%u", op0 & 15); break;
135
case (0x90): sprintf(t, "sbk"); break;
136
case4 (0x91): sprintf(t, "link #%u", op0 & 15); break;
137
case (0x95): sprintf(t, "sex"); break;
138
case (0x96): sprintf(t, "div2"); break;
139
case (0x97): sprintf(t, "ror"); break;
140
case6 (0x98): sprintf(t, "ljmp r%u", op0 & 15); break;
141
case (0x9e): sprintf(t, "lob"); break;
142
case (0x9f): sprintf(t, "lmult"); break;
143
case16(0xa0): sprintf(t, "lms r%u,(#$%.4x)", op0 & 15, op1 << 1); break;
144
case16(0xb0): sprintf(t, "from r%u", op0 & 15); break;
145
case (0xc0): sprintf(t, "hib"); break;
146
case15(0xc1): sprintf(t, "xor r%u", op0 & 15); break;
147
case15(0xd0): sprintf(t, "inc r%u", op0 & 15); break;
148
case (0xdf): sprintf(t, "getc"); break;
149
case15(0xe0): sprintf(t, "dec r%u", op0 & 15); break;
150
case (0xef): sprintf(t, "getbh"); break;
151
case16(0xf0): sprintf(t, "lm r%u", op0 & 15); break;
152
}
153
strcat(output, t);
154
}
155
156
void SuperFX::disassemble_alt2(char *output) {
157
char t[256] = "";
158
switch(op0) {
159
case (0x00): sprintf(t, "stop"); break;
160
case (0x01): sprintf(t, "nop"); break;
161
case (0x02): sprintf(t, "cache"); break;
162
case (0x03): sprintf(t, "lsr"); break;
163
case (0x04): sprintf(t, "rol"); break;
164
case (0x05): sprintf(t, "bra %+d", (int8_t)op1); break;
165
case (0x06): sprintf(t, "blt %+d", (int8_t)op1); break;
166
case (0x07): sprintf(t, "bge %+d", (int8_t)op1); break;
167
case (0x08): sprintf(t, "bne %+d", (int8_t)op1); break;
168
case (0x09): sprintf(t, "beq %+d", (int8_t)op1); break;
169
case (0x0a): sprintf(t, "bpl %+d", (int8_t)op1); break;
170
case (0x0b): sprintf(t, "bmi %+d", (int8_t)op1); break;
171
case (0x0c): sprintf(t, "bcc %+d", (int8_t)op1); break;
172
case (0x0d): sprintf(t, "bcs %+d", (int8_t)op1); break;
173
case (0x0e): sprintf(t, "bvc %+d", (int8_t)op1); break;
174
case (0x0f): sprintf(t, "bvs %+d", (int8_t)op1); break;
175
case16(0x10): sprintf(t, "to r%u", op0 & 15); break;
176
case16(0x20): sprintf(t, "with r%u", op0 & 15); break;
177
case12(0x30): sprintf(t, "stw (r%u)", op0 & 15); break;
178
case (0x3c): sprintf(t, "loop"); break;
179
case (0x3d): sprintf(t, "alt1"); break;
180
case (0x3e): sprintf(t, "alt2"); break;
181
case (0x3f): sprintf(t, "alt3"); break;
182
case12(0x40): sprintf(t, "ldw (r%u)", op0 & 15); break;
183
case (0x4c): sprintf(t, "plot"); break;
184
case (0x4d): sprintf(t, "swap"); break;
185
case (0x4e): sprintf(t, "color"); break;
186
case (0x4f): sprintf(t, "not"); break;
187
case16(0x50): sprintf(t, "add #%u", op0 & 15); break;
188
case16(0x60): sprintf(t, "sub #%u", op0 & 15); break;
189
case (0x70): sprintf(t, "merge"); break;
190
case15(0x71): sprintf(t, "and #%u", op0 & 15); break;
191
case16(0x80): sprintf(t, "mult #%u", op0 & 15); break;
192
case (0x90): sprintf(t, "sbk"); break;
193
case4 (0x91): sprintf(t, "link #%u", op0 & 15); break;
194
case (0x95): sprintf(t, "sex"); break;
195
case (0x96): sprintf(t, "asr"); break;
196
case (0x97): sprintf(t, "ror"); break;
197
case6 (0x98): sprintf(t, "jmp r%u", op0 & 15); break;
198
case (0x9e): sprintf(t, "lob"); break;
199
case (0x9f): sprintf(t, "fmult"); break;
200
case16(0xa0): sprintf(t, "sms r%u,(#$%.4x)", op0 & 15, op1 << 1); break;
201
case16(0xb0): sprintf(t, "from r%u", op0 & 15); break;
202
case (0xc0): sprintf(t, "hib"); break;
203
case15(0xc1): sprintf(t, "or #%u", op0 & 15); break;
204
case15(0xd0): sprintf(t, "inc r%u", op0 & 15); break;
205
case (0xdf): sprintf(t, "ramb"); break;
206
case15(0xe0): sprintf(t, "dec r%u", op0 & 15); break;
207
case (0xef): sprintf(t, "getbl"); break;
208
case16(0xf0): sprintf(t, "sm r%u", op0 & 15); break;
209
}
210
strcat(output, t);
211
}
212
213
void SuperFX::disassemble_alt3(char *output) {
214
char t[256] = "";
215
switch(op0) {
216
case (0x00): sprintf(t, "stop"); break;
217
case (0x01): sprintf(t, "nop"); break;
218
case (0x02): sprintf(t, "cache"); break;
219
case (0x03): sprintf(t, "lsr"); break;
220
case (0x04): sprintf(t, "rol"); break;
221
case (0x05): sprintf(t, "bra %+d", (int8_t)op1); break;
222
case (0x06): sprintf(t, "blt %+d", (int8_t)op1); break;
223
case (0x07): sprintf(t, "bge %+d", (int8_t)op1); break;
224
case (0x08): sprintf(t, "bne %+d", (int8_t)op1); break;
225
case (0x09): sprintf(t, "beq %+d", (int8_t)op1); break;
226
case (0x0a): sprintf(t, "bpl %+d", (int8_t)op1); break;
227
case (0x0b): sprintf(t, "bmi %+d", (int8_t)op1); break;
228
case (0x0c): sprintf(t, "bcc %+d", (int8_t)op1); break;
229
case (0x0d): sprintf(t, "bcs %+d", (int8_t)op1); break;
230
case (0x0e): sprintf(t, "bvc %+d", (int8_t)op1); break;
231
case (0x0f): sprintf(t, "bvs %+d", (int8_t)op1); break;
232
case16(0x10): sprintf(t, "to r%u", op0 & 15); break;
233
case16(0x20): sprintf(t, "with r%u", op0 & 15); break;
234
case12(0x30): sprintf(t, "stb (r%u)", op0 & 15); break;
235
case (0x3c): sprintf(t, "loop"); break;
236
case (0x3d): sprintf(t, "alt1"); break;
237
case (0x3e): sprintf(t, "alt2"); break;
238
case (0x3f): sprintf(t, "alt3"); break;
239
case12(0x40): sprintf(t, "ldb (r%u)", op0 & 15); break;
240
case (0x4c): sprintf(t, "rpix"); break;
241
case (0x4d): sprintf(t, "swap"); break;
242
case (0x4e): sprintf(t, "cmode"); break;
243
case (0x4f): sprintf(t, "not"); break;
244
case16(0x50): sprintf(t, "adc #%u", op0 & 15); break;
245
case16(0x60): sprintf(t, "cmp r%u", op0 & 15); break;
246
case (0x70): sprintf(t, "merge"); break;
247
case15(0x71): sprintf(t, "bic #%u", op0 & 15); break;
248
case16(0x80): sprintf(t, "umult #%u", op0 & 15); break;
249
case (0x90): sprintf(t, "sbk"); break;
250
case4 (0x91): sprintf(t, "link #%u", op0 & 15); break;
251
case (0x95): sprintf(t, "sex"); break;
252
case (0x96): sprintf(t, "div2"); break;
253
case (0x97): sprintf(t, "ror"); break;
254
case6 (0x98): sprintf(t, "ljmp r%u", op0 & 15); break;
255
case (0x9e): sprintf(t, "lob"); break;
256
case (0x9f): sprintf(t, "lmult"); break;
257
case16(0xa0): sprintf(t, "lms r%u", op0 & 15); break;
258
case16(0xb0): sprintf(t, "from r%u", op0 & 15); break;
259
case (0xc0): sprintf(t, "hib"); break;
260
case15(0xc1): sprintf(t, "xor #%u", op0 & 15); break;
261
case15(0xd0): sprintf(t, "inc r%u", op0 & 15); break;
262
case (0xdf): sprintf(t, "romb"); break;
263
case15(0xe0): sprintf(t, "dec r%u", op0 & 15); break;
264
case (0xef): sprintf(t, "getbs"); break;
265
case16(0xf0): sprintf(t, "lm r%u", op0 & 15); break;
266
}
267
strcat(output, t);
268
}
269
270
#undef case4
271
#undef case6
272
#undef case12
273
#undef case15
274
#undef case16
275
#undef op0
276
#undef op1
277
#undef op2
278
279
#endif
280
281