Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
alexbevi
GitHub Repository: alexbevi/BizHawk
Path: blob/master/libsnes/bsnes/snes/alt/smp/disassembler.cpp
2 views
1
uint8 SMP::disassemble_read(uint16 addr) {
2
if(addr >= 0xffc0) return smp.iplrom[addr & 0x3f];
3
return smp.apuram[addr];
4
}
5
6
uint16 SMP::relb(int8 offset, int op_len) {
7
uint16 pc = regs.pc + op_len;
8
return pc + offset;
9
}
10
11
void SMP::disassemble_opcode(char *output, uint16 addr) {
12
char *s, t[512];
13
uint8 op, op0, op1;
14
uint16 opw, opdp0, opdp1;
15
s = output;
16
17
sprintf(s, "..%.4x ", addr);
18
19
op = disassemble_read(addr + 0);
20
op0 = disassemble_read(addr + 1);
21
op1 = disassemble_read(addr + 2);
22
opw = (op0) | (op1 << 8);
23
opdp0 = ((unsigned)regs.p.p << 8) + op0;
24
opdp1 = ((unsigned)regs.p.p << 8) + op1;
25
26
strcpy(t, " ");
27
28
switch(op) {
29
case 0x00: sprintf(t, "nop"); break;
30
case 0x01: sprintf(t, "tcall 0"); break;
31
case 0x02: sprintf(t, "set0 $%.3x", opdp0); break;
32
case 0x03: sprintf(t, "bbs0 $%.3x,$%.4x", opdp0, relb(op1, 3)); break;
33
case 0x04: sprintf(t, "or a,$%.3x", opdp0); break;
34
case 0x05: sprintf(t, "or a,$%.4x", opw); break;
35
case 0x06: sprintf(t, "or a,(x)"); break;
36
case 0x07: sprintf(t, "or a,($%.3x+x)", opdp0); break;
37
case 0x08: sprintf(t, "or a,#$%.2x", op0); break;
38
case 0x09: sprintf(t, "or $%.3x,$%.3x", opdp1, opdp0); break;
39
case 0x0a: sprintf(t, "or1 c,$%.4x:%d", opw & 0x1fff, opw >> 13); break;
40
case 0x0b: sprintf(t, "asl $%.3x", opdp0); break;
41
case 0x0c: sprintf(t, "asl $%.4x", opw); break;
42
case 0x0d: sprintf(t, "push p"); break;
43
case 0x0e: sprintf(t, "tset $%.4x,a", opw); break;
44
case 0x0f: sprintf(t, "brk"); break;
45
case 0x10: sprintf(t, "bpl $%.4x", relb(op0, 2)); break;
46
case 0x11: sprintf(t, "tcall 1"); break;
47
case 0x12: sprintf(t, "clr0 $%.3x", opdp0); break;
48
case 0x13: sprintf(t, "bbc0 $%.3x,$%.4x", opdp0, relb(op1, 3)); break;
49
case 0x14: sprintf(t, "or a,$%.3x+x", opdp0); break;
50
case 0x15: sprintf(t, "or a,$%.4x+x", opw); break;
51
case 0x16: sprintf(t, "or a,$%.4x+y", opw); break;
52
case 0x17: sprintf(t, "or a,($%.3x)+y", opdp0); break;
53
case 0x18: sprintf(t, "or $%.3x,#$%.2x", opdp1, op0); break;
54
case 0x19: sprintf(t, "or (x),(y)"); break;
55
case 0x1a: sprintf(t, "decw $%.3x", opdp0); break;
56
case 0x1b: sprintf(t, "asl $%.3x+x", opdp0); break;
57
case 0x1c: sprintf(t, "asl a"); break;
58
case 0x1d: sprintf(t, "dec x"); break;
59
case 0x1e: sprintf(t, "cmp x,$%.4x", opw); break;
60
case 0x1f: sprintf(t, "jmp ($%.4x+x)", opw); break;
61
case 0x20: sprintf(t, "clrp"); break;
62
case 0x21: sprintf(t, "tcall 2"); break;
63
case 0x22: sprintf(t, "set1 $%.3x", opdp0); break;
64
case 0x23: sprintf(t, "bbs1 $%.3x,$%.4x", opdp0, relb(op1, 3)); break;
65
case 0x24: sprintf(t, "and a,$%.3x", opdp0); break;
66
case 0x25: sprintf(t, "and a,$%.4x", opw); break;
67
case 0x26: sprintf(t, "and a,(x)"); break;
68
case 0x27: sprintf(t, "and a,($%.3x+x)", opdp0); break;
69
case 0x28: sprintf(t, "and a,#$%.2x", op0); break;
70
case 0x29: sprintf(t, "and $%.3x,$%.3x", opdp1, opdp0); break;
71
case 0x2a: sprintf(t, "or1 c,!$%.4x:%d", opw & 0x1fff, opw >> 13); break;
72
case 0x2b: sprintf(t, "rol $%.3x", opdp0); break;
73
case 0x2c: sprintf(t, "rol $%.4x", opw); break;
74
case 0x2d: sprintf(t, "push a"); break;
75
case 0x2e: sprintf(t, "cbne $%.3x,$%.4x", opdp0, relb(op1, 3)); break;
76
case 0x2f: sprintf(t, "bra $%.4x", relb(op0, 2)); break;
77
case 0x30: sprintf(t, "bmi $%.4x", relb(op0, 2)); break;
78
case 0x31: sprintf(t, "tcall 3"); break;
79
case 0x32: sprintf(t, "clr1 $%.3x", opdp0); break;
80
case 0x33: sprintf(t, "bbc1 $%.3x,$%.4x", opdp0, relb(op1, 3)); break;
81
case 0x34: sprintf(t, "and a,$%.3x+x", opdp0); break;
82
case 0x35: sprintf(t, "and a,$%.4x+x", opw); break;
83
case 0x36: sprintf(t, "and a,$%.4x+y", opw); break;
84
case 0x37: sprintf(t, "and a,($%.3x)+y", opdp0); break;
85
case 0x38: sprintf(t, "and $%.3x,#$%.2x", opdp1, op0); break;
86
case 0x39: sprintf(t, "and (x),(y)"); break;
87
case 0x3a: sprintf(t, "incw $%.3x", opdp0); break;
88
case 0x3b: sprintf(t, "rol $%.3x+x", opdp0); break;
89
case 0x3c: sprintf(t, "rol a"); break;
90
case 0x3d: sprintf(t, "inc x"); break;
91
case 0x3e: sprintf(t, "cmp x,$%.3x", opdp0); break;
92
case 0x3f: sprintf(t, "call $%.4x", opw); break;
93
case 0x40: sprintf(t, "setp"); break;
94
case 0x41: sprintf(t, "tcall 4"); break;
95
case 0x42: sprintf(t, "set2 $%.3x", opdp0); break;
96
case 0x43: sprintf(t, "bbs2 $%.3x,$%.4x", opdp0, relb(op1, 3)); break;
97
case 0x44: sprintf(t, "eor a,$%.3x", opdp0); break;
98
case 0x45: sprintf(t, "eor a,$%.4x", opw); break;
99
case 0x46: sprintf(t, "eor a,(x)"); break;
100
case 0x47: sprintf(t, "eor a,($%.3x+x)", opdp0); break;
101
case 0x48: sprintf(t, "eor a,#$%.2x", op0); break;
102
case 0x49: sprintf(t, "eor $%.3x,$%.3x", opdp1, opdp0); break;
103
case 0x4a: sprintf(t, "and1 c,$%.4x:%d", opw & 0x1fff, opw >> 13); break;
104
case 0x4b: sprintf(t, "lsr $%.3x", opdp0); break;
105
case 0x4c: sprintf(t, "lsr $%.4x", opw); break;
106
case 0x4d: sprintf(t, "push x"); break;
107
case 0x4e: sprintf(t, "tclr $%.4x,a", opw); break;
108
case 0x4f: sprintf(t, "pcall $ff%.2x", op0); break;
109
case 0x50: sprintf(t, "bvc $%.4x", relb(op0, 2)); break;
110
case 0x51: sprintf(t, "tcall 5"); break;
111
case 0x52: sprintf(t, "clr2 $%.3x", opdp0); break;
112
case 0x53: sprintf(t, "bbc2 $%.3x,$%.4x", opdp0, relb(op1, 3)); break;
113
case 0x54: sprintf(t, "eor a,$%.3x+x", opdp0); break;
114
case 0x55: sprintf(t, "eor a,$%.4x+x", opw); break;
115
case 0x56: sprintf(t, "eor a,$%.4x+y", opw); break;
116
case 0x57: sprintf(t, "eor a,($%.3x)+y", opdp0); break;
117
case 0x58: sprintf(t, "eor $%.3x,#$%.2x", opdp1, op0); break;
118
case 0x59: sprintf(t, "eor (x),(y)"); break;
119
case 0x5a: sprintf(t, "cmpw ya,$%.3x", opdp0); break;
120
case 0x5b: sprintf(t, "lsr $%.3x+x", opdp0); break;
121
case 0x5c: sprintf(t, "lsr a"); break;
122
case 0x5d: sprintf(t, "mov x,a"); break;
123
case 0x5e: sprintf(t, "cmp y,$%.4x", opw); break;
124
case 0x5f: sprintf(t, "jmp $%.4x", opw); break;
125
case 0x60: sprintf(t, "clrc"); break;
126
case 0x61: sprintf(t, "tcall 6"); break;
127
case 0x62: sprintf(t, "set3 $%.3x", opdp0); break;
128
case 0x63: sprintf(t, "bbs3 $%.3x,$%.4x", opdp0, relb(op1, 3)); break;
129
case 0x64: sprintf(t, "cmp a,$%.3x", opdp0); break;
130
case 0x65: sprintf(t, "cmp a,$%.4x", opw); break;
131
case 0x66: sprintf(t, "cmp a,(x)"); break;
132
case 0x67: sprintf(t, "cmp a,($%.3x+x)", opdp0); break;
133
case 0x68: sprintf(t, "cmp a,#$%.2x", op0); break;
134
case 0x69: sprintf(t, "cmp $%.3x,$%.3x", opdp1, opdp0); break;
135
case 0x6a: sprintf(t, "and1 c,!$%.4x:%d", opw & 0x1fff, opw >> 13); break;
136
case 0x6b: sprintf(t, "ror $%.3x", opdp0); break;
137
case 0x6c: sprintf(t, "ror $%.4x", opw); break;
138
case 0x6d: sprintf(t, "push y"); break;
139
case 0x6e: sprintf(t, "dbnz $%.3x,$%.4x", opdp0, relb(op1, 3)); break;
140
case 0x6f: sprintf(t, "ret"); break;
141
case 0x70: sprintf(t, "bvs $%.4x", relb(op0, 2)); break;
142
case 0x71: sprintf(t, "tcall 7"); break;
143
case 0x72: sprintf(t, "clr3 $%.3x", opdp0); break;
144
case 0x73: sprintf(t, "bbc3 $%.3x,$%.4x", opdp0, relb(op1, 3)); break;
145
case 0x74: sprintf(t, "cmp a,$%.3x+x", opdp0); break;
146
case 0x75: sprintf(t, "cmp a,$%.4x+x", opw); break;
147
case 0x76: sprintf(t, "cmp a,$%.4x+y", opw); break;
148
case 0x77: sprintf(t, "cmp a,($%.3x)+y", opdp0); break;
149
case 0x78: sprintf(t, "cmp $%.3x,#$%.2x", opdp1, op0); break;
150
case 0x79: sprintf(t, "cmp (x),(y)"); break;
151
case 0x7a: sprintf(t, "addw ya,$%.3x", opdp0); break;
152
case 0x7b: sprintf(t, "ror $%.3x+x", opdp0); break;
153
case 0x7c: sprintf(t, "ror a"); break;
154
case 0x7d: sprintf(t, "mov a,x"); break;
155
case 0x7e: sprintf(t, "cmp y,$%.3x", opdp0); break;
156
case 0x7f: sprintf(t, "reti"); break;
157
case 0x80: sprintf(t, "setc"); break;
158
case 0x81: sprintf(t, "tcall 8"); break;
159
case 0x82: sprintf(t, "set4 $%.3x", opdp0); break;
160
case 0x83: sprintf(t, "bbs4 $%.3x,$%.4x", opdp0, relb(op1, 3)); break;
161
case 0x84: sprintf(t, "adc a,$%.3x", opdp0); break;
162
case 0x85: sprintf(t, "adc a,$%.4x", opw); break;
163
case 0x86: sprintf(t, "adc a,(x)"); break;
164
case 0x87: sprintf(t, "adc a,($%.3x+x)", opdp0); break;
165
case 0x88: sprintf(t, "adc a,#$%.2x", op0); break;
166
case 0x89: sprintf(t, "adc $%.3x,$%.3x", opdp1, opdp0); break;
167
case 0x8a: sprintf(t, "eor1 c,$%.4x:%d", opw & 0x1fff, opw >> 13); break;
168
case 0x8b: sprintf(t, "dec $%.3x", opdp0); break;
169
case 0x8c: sprintf(t, "dec $%.4x", opw); break;
170
case 0x8d: sprintf(t, "mov y,#$%.2x", op0); break;
171
case 0x8e: sprintf(t, "pop p"); break;
172
case 0x8f: sprintf(t, "mov $%.3x,#$%.2x", opdp1, op0); break;
173
case 0x90: sprintf(t, "bcc $%.4x", relb(op0, 2)); break;
174
case 0x91: sprintf(t, "tcall 9"); break;
175
case 0x92: sprintf(t, "clr4 $%.3x", opdp0); break;
176
case 0x93: sprintf(t, "bbc4 $%.3x,$%.4x", opdp0, relb(op1, 3)); break;
177
case 0x94: sprintf(t, "adc a,$%.3x+x", opdp0); break;
178
case 0x95: sprintf(t, "adc a,$%.4x+x", opw); break;
179
case 0x96: sprintf(t, "adc a,$%.4x+y", opw); break;
180
case 0x97: sprintf(t, "adc a,($%.3x)+y", opdp0); break;
181
case 0x98: sprintf(t, "adc $%.3x,#$%.2x", opdp1, op0); break;
182
case 0x99: sprintf(t, "adc (x),(y)"); break;
183
case 0x9a: sprintf(t, "subw ya,$%.3x", opdp0); break;
184
case 0x9b: sprintf(t, "dec $%.3x+x", opdp0); break;
185
case 0x9c: sprintf(t, "dec a"); break;
186
case 0x9d: sprintf(t, "mov x,sp"); break;
187
case 0x9e: sprintf(t, "div ya,x"); break;
188
case 0x9f: sprintf(t, "xcn a"); break;
189
case 0xa0: sprintf(t, "ei"); break;
190
case 0xa1: sprintf(t, "tcall 10"); break;
191
case 0xa2: sprintf(t, "set5 $%.3x", opdp0); break;
192
case 0xa3: sprintf(t, "bbs5 $%.3x,$%.4x", opdp0, relb(op1, 3)); break;
193
case 0xa4: sprintf(t, "sbc a,$%.3x", opdp0); break;
194
case 0xa5: sprintf(t, "sbc a,$%.4x", opw); break;
195
case 0xa6: sprintf(t, "sbc a,(x)"); break;
196
case 0xa7: sprintf(t, "sbc a,($%.3x+x)", opdp0); break;
197
case 0xa8: sprintf(t, "sbc a,#$%.2x", op0); break;
198
case 0xa9: sprintf(t, "sbc $%.3x,$%.3x", opdp1, opdp0); break;
199
case 0xaa: sprintf(t, "mov1 c,$%.4x:%d", opw & 0x1fff, opw >> 13); break;
200
case 0xab: sprintf(t, "inc $%.3x", opdp0); break;
201
case 0xac: sprintf(t, "inc $%.4x", opw); break;
202
case 0xad: sprintf(t, "cmp y,#$%.2x", op0); break;
203
case 0xae: sprintf(t, "pop a"); break;
204
case 0xaf: sprintf(t, "mov (x)+,a"); break;
205
case 0xb0: sprintf(t, "bcs $%.4x", relb(op0, 2)); break;
206
case 0xb1: sprintf(t, "tcall 11"); break;
207
case 0xb2: sprintf(t, "clr5 $%.3x", opdp0); break;
208
case 0xb3: sprintf(t, "bbc5 $%.3x,$%.4x", opdp0, relb(op1, 3)); break;
209
case 0xb4: sprintf(t, "sbc a,$%.3x+x", opdp0); break;
210
case 0xb5: sprintf(t, "sbc a,$%.4x+x", opw); break;
211
case 0xb6: sprintf(t, "sbc a,$%.4x+y", opw); break;
212
case 0xb7: sprintf(t, "sbc a,($%.3x)+y", opdp0); break;
213
case 0xb8: sprintf(t, "sbc $%.3x,#$%.2x", opdp1, op0); break;
214
case 0xb9: sprintf(t, "sbc (x),(y)"); break;
215
case 0xba: sprintf(t, "movw ya,$%.3x", opdp0); break;
216
case 0xbb: sprintf(t, "inc $%.3x+x", opdp0); break;
217
case 0xbc: sprintf(t, "inc a"); break;
218
case 0xbd: sprintf(t, "mov sp,x"); break;
219
case 0xbe: sprintf(t, "das a"); break;
220
case 0xbf: sprintf(t, "mov a,(x)+"); break;
221
case 0xc0: sprintf(t, "di"); break;
222
case 0xc1: sprintf(t, "tcall 12"); break;
223
case 0xc2: sprintf(t, "set6 $%.3x", opdp0); break;
224
case 0xc3: sprintf(t, "bbs6 $%.3x,$%.4x", opdp0, relb(op1, 3)); break;
225
case 0xc4: sprintf(t, "mov $%.3x,a", opdp0); break;
226
case 0xc5: sprintf(t, "mov $%.4x,a", opw); break;
227
case 0xc6: sprintf(t, "mov (x),a"); break;
228
case 0xc7: sprintf(t, "mov ($%.3x+x),a", opdp0); break;
229
case 0xc8: sprintf(t, "cmp x,#$%.2x", op0); break;
230
case 0xc9: sprintf(t, "mov $%.4x,x", opw); break;
231
case 0xca: sprintf(t, "mov1 $%.4x:%d,c", opw & 0x1fff, opw >> 13); break;
232
case 0xcb: sprintf(t, "mov $%.3x,y", opdp0); break;
233
case 0xcc: sprintf(t, "mov $%.4x,y", opw); break;
234
case 0xcd: sprintf(t, "mov x,#$%.2x", op0); break;
235
case 0xce: sprintf(t, "pop x"); break;
236
case 0xcf: sprintf(t, "mul ya"); break;
237
case 0xd0: sprintf(t, "bne $%.4x", relb(op0, 2)); break;
238
case 0xd1: sprintf(t, "tcall 13"); break;
239
case 0xd2: sprintf(t, "clr6 $%.3x", opdp0); break;
240
case 0xd3: sprintf(t, "bbc6 $%.3x,$%.4x", opdp0, relb(op1, 3)); break;
241
case 0xd4: sprintf(t, "mov $%.3x+x,a", opdp0); break;
242
case 0xd5: sprintf(t, "mov $%.4x+x,a", opw); break;
243
case 0xd6: sprintf(t, "mov $%.4x+y,a", opw); break;
244
case 0xd7: sprintf(t, "mov ($%.3x)+y,a", opdp0); break;
245
case 0xd8: sprintf(t, "mov $%.3x,x", opdp0); break;
246
case 0xd9: sprintf(t, "mov $%.3x+y,x", opdp0); break;
247
case 0xda: sprintf(t, "movw $%.3x,ya", opdp0); break;
248
case 0xdb: sprintf(t, "mov $%.3x+x,y", opdp0); break;
249
case 0xdc: sprintf(t, "dec y"); break;
250
case 0xdd: sprintf(t, "mov a,y"); break;
251
case 0xde: sprintf(t, "cbne $%.3x+x,$%.4x", opdp0, relb(op1, 3)); break;
252
case 0xdf: sprintf(t, "daa a"); break;
253
case 0xe0: sprintf(t, "clrv"); break;
254
case 0xe1: sprintf(t, "tcall 14"); break;
255
case 0xe2: sprintf(t, "set7 $%.3x", opdp0); break;
256
case 0xe3: sprintf(t, "bbs7 $%.3x,$%.4x", opdp0, relb(op1, 3)); break;
257
case 0xe4: sprintf(t, "mov a,$%.3x", opdp0); break;
258
case 0xe5: sprintf(t, "mov a,$%.4x", opw); break;
259
case 0xe6: sprintf(t, "mov a,(x)"); break;
260
case 0xe7: sprintf(t, "mov a,($%.3x+x)", opdp0); break;
261
case 0xe8: sprintf(t, "mov a,#$%.2x", op0); break;
262
case 0xe9: sprintf(t, "mov x,$%.4x", opw); break;
263
case 0xea: sprintf(t, "not1 c,$%.4x:%d", opw & 0x1fff, opw >> 13); break;
264
case 0xeb: sprintf(t, "mov y,$%.3x", opdp0); break;
265
case 0xec: sprintf(t, "mov y,$%.4x", opw); break;
266
case 0xed: sprintf(t, "notc"); break;
267
case 0xee: sprintf(t, "pop y"); break;
268
case 0xef: sprintf(t, "sleep"); break;
269
case 0xf0: sprintf(t, "beq $%.4x", relb(op0, 2)); break;
270
case 0xf1: sprintf(t, "tcall 15"); break;
271
case 0xf2: sprintf(t, "clr7 $%.3x", opdp0); break;
272
case 0xf3: sprintf(t, "bbc7 $%.3x,$%.4x", opdp0, relb(op1, 3)); break;
273
case 0xf4: sprintf(t, "mov a,$%.3x+x", opdp0); break;
274
case 0xf5: sprintf(t, "mov a,$%.4x+x", opw); break;
275
case 0xf6: sprintf(t, "mov a,$%.4x+y", opw); break;
276
case 0xf7: sprintf(t, "mov a,($%.3x)+y", opdp0); break;
277
case 0xf8: sprintf(t, "mov x,$%.3x", opdp0); break;
278
case 0xf9: sprintf(t, "mov x,$%.3x+y", opdp0); break;
279
case 0xfa: sprintf(t, "mov $%.3x,$%.3x", opdp1, opdp0); break;
280
case 0xfb: sprintf(t, "mov y,$%.3x+x", opdp0); break;
281
case 0xfc: sprintf(t, "inc y"); break;
282
case 0xfd: sprintf(t, "mov y,a"); break;
283
case 0xfe: sprintf(t, "dbnz y,$%.4x", relb(op0, 2)); break;
284
case 0xff: sprintf(t, "stop"); break;
285
}
286
287
t[strlen(t)] = ' ';
288
strcat(s, t);
289
290
sprintf(t, "A:%.2x X:%.2x Y:%.2x SP:01%.2x YA:%.4x ",
291
regs.a, regs.x, regs.y, regs.sp, (uint16)regs.ya);
292
strcat(s, t);
293
294
sprintf(t, "%c%c%c%c%c%c%c%c",
295
regs.p.n ? 'N' : 'n',
296
regs.p.v ? 'V' : 'v',
297
regs.p.p ? 'P' : 'p',
298
regs.p.b ? 'B' : 'b',
299
regs.p.h ? 'H' : 'h',
300
regs.p.i ? 'I' : 'i',
301
regs.p.z ? 'Z' : 'z',
302
regs.p.c ? 'C' : 'c');
303
strcat(s, t);
304
}
305
306