Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
alexbevi
GitHub Repository: alexbevi/BizHawk
Path: blob/master/libsnes/bsnes/snes/chip/necdsp/disassembler.cpp
2 views
1
#ifdef NECDSP_CPP
2
3
string NECDSP::disassemble(uint14 ip) {
4
string output = { hex<4>(ip), " " };
5
uint24 opcode = programROM[ip];
6
uint2 type = opcode >> 22;
7
8
if(type == 0 || type == 1) { //OP,RT
9
uint2 pselect = opcode >> 20;
10
uint4 alu = opcode >> 16;
11
uint1 asl = opcode >> 15;
12
uint2 dpl = opcode >> 13;
13
uint4 dphm = opcode >> 9;
14
uint1 rpdcr = opcode >> 8;
15
uint4 src = opcode >> 4;
16
uint4 dst = opcode >> 0;
17
18
switch(alu) {
19
case 0: output.append("nop "); break;
20
case 1: output.append("or "); break;
21
case 2: output.append("and "); break;
22
case 3: output.append("xor "); break;
23
case 4: output.append("sub "); break;
24
case 5: output.append("add "); break;
25
case 6: output.append("sbb "); break;
26
case 7: output.append("adc "); break;
27
case 8: output.append("dec "); break;
28
case 9: output.append("inc "); break;
29
case 10: output.append("cmp "); break;
30
case 11: output.append("shr1 "); break;
31
case 12: output.append("shl1 "); break;
32
case 13: output.append("shl2 "); break;
33
case 14: output.append("shl4 "); break;
34
case 15: output.append("xchg "); break;
35
}
36
37
if(alu < 8) {
38
switch(pselect) {
39
case 0: output.append("ram,"); break;
40
case 1: output.append("idb,"); break;
41
case 2: output.append("m," ); break;
42
case 3: output.append("n," ); break;
43
}
44
}
45
46
switch(asl) {
47
case 0: output.append("a"); break;
48
case 1: output.append("b"); break;
49
}
50
51
output.append("\n mov ");
52
53
switch(src) {
54
case 0: output.append("trb," ); break;
55
case 1: output.append("a," ); break;
56
case 2: output.append("b," ); break;
57
case 3: output.append("tr," ); break;
58
case 4: output.append("dp," ); break;
59
case 5: output.append("rp," ); break;
60
case 6: output.append("ro," ); break;
61
case 7: output.append("sgn," ); break;
62
case 8: output.append("dr," ); break;
63
case 9: output.append("drnf,"); break;
64
case 10: output.append("sr," ); break;
65
case 11: output.append("sim," ); break;
66
case 12: output.append("sil," ); break;
67
case 13: output.append("k," ); break;
68
case 14: output.append("l," ); break;
69
case 15: output.append("mem," ); break;
70
}
71
72
switch(dst) {
73
case 0: output.append("non"); break;
74
case 1: output.append("a" ); break;
75
case 2: output.append("b" ); break;
76
case 3: output.append("tr" ); break;
77
case 4: output.append("dp" ); break;
78
case 5: output.append("rp" ); break;
79
case 6: output.append("dr" ); break;
80
case 7: output.append("sr" ); break;
81
case 8: output.append("sol"); break;
82
case 9: output.append("som"); break;
83
case 10: output.append("k" ); break;
84
case 11: output.append("klr"); break;
85
case 12: output.append("klm"); break;
86
case 13: output.append("l" ); break;
87
case 14: output.append("trb"); break;
88
case 15: output.append("mem"); break;
89
}
90
91
if(dpl) {
92
switch(dpl) {
93
case 0: output.append("\n dpnop"); break;
94
case 1: output.append("\n dpinc"); break;
95
case 2: output.append("\n dpdec"); break;
96
case 3: output.append("\n dpclr"); break;
97
}
98
}
99
100
if(dphm) {
101
output.append("\n m", hex<1>(dphm));
102
}
103
104
if(rpdcr == 1) {
105
output.append("\n rpdec");
106
}
107
108
if(type == 1) {
109
output.append("\n ret");
110
}
111
}
112
113
if(type == 2) { //JP
114
uint9 brch = opcode >> 13;
115
uint11 na = opcode >> 2;
116
uint8 bank = opcode >> 0;
117
118
uint14 jp = (regs.pc & 0x2000) | (bank << 11) | (na << 0);
119
120
switch(brch) {
121
case 0x000: output.append("jmpso "); jp = 0; break;
122
case 0x080: output.append("jnca "); break;
123
case 0x082: output.append("jca "); break;
124
case 0x084: output.append("jncb "); break;
125
case 0x086: output.append("jcb "); break;
126
case 0x088: output.append("jnza "); break;
127
case 0x08a: output.append("jza "); break;
128
case 0x08c: output.append("jnzb "); break;
129
case 0x08e: output.append("jzb "); break;
130
case 0x090: output.append("jnova0 "); break;
131
case 0x092: output.append("jova0 "); break;
132
case 0x094: output.append("jnovb0 "); break;
133
case 0x096: output.append("jovb0 "); break;
134
case 0x098: output.append("jnova1 "); break;
135
case 0x09a: output.append("jova1 "); break;
136
case 0x09c: output.append("jnovb1 "); break;
137
case 0x09e: output.append("jovb1 "); break;
138
case 0x0a0: output.append("jnsa0 "); break;
139
case 0x0a2: output.append("jsa0 "); break;
140
case 0x0a4: output.append("jnsb0 "); break;
141
case 0x0a6: output.append("jsb0 "); break;
142
case 0x0a8: output.append("jnsa1 "); break;
143
case 0x0aa: output.append("jsa1 "); break;
144
case 0x0ac: output.append("jnsb1 "); break;
145
case 0x0ae: output.append("jsb1 "); break;
146
case 0x0b0: output.append("jdpl0 "); break;
147
case 0x0b1: output.append("jdpln0 "); break;
148
case 0x0b2: output.append("jdplf "); break;
149
case 0x0b3: output.append("jdplnf "); break;
150
case 0x0b4: output.append("jnsiak "); break;
151
case 0x0b6: output.append("jsiak "); break;
152
case 0x0b8: output.append("jnsoak "); break;
153
case 0x0ba: output.append("jsoak "); break;
154
case 0x0bc: output.append("jnrqm "); break;
155
case 0x0be: output.append("jrqm "); break;
156
case 0x100: output.append("ljmp "); jp &= ~0x2000; break;
157
case 0x101: output.append("hjmp "); jp |= 0x2000; break;
158
case 0x140: output.append("lcall "); jp &= ~0x2000; break;
159
case 0x141: output.append("hcall "); jp |= 0x2000; break;
160
default: output.append("?????? "); break;
161
}
162
163
output.append("$", hex<4>(jp));
164
}
165
166
if(type == 3) { //LD
167
output.append("ld ");
168
uint16 id = opcode >> 6;
169
uint4 dst = opcode >> 0;
170
171
output.append("$", hex<4>(id), ",");
172
173
switch(dst) {
174
case 0: output.append("non"); break;
175
case 1: output.append("a" ); break;
176
case 2: output.append("b" ); break;
177
case 3: output.append("tr" ); break;
178
case 4: output.append("dp" ); break;
179
case 5: output.append("rp" ); break;
180
case 6: output.append("dr" ); break;
181
case 7: output.append("sr" ); break;
182
case 8: output.append("sol"); break;
183
case 9: output.append("som"); break;
184
case 10: output.append("k" ); break;
185
case 11: output.append("klr"); break;
186
case 12: output.append("klm"); break;
187
case 13: output.append("l" ); break;
188
case 14: output.append("trb"); break;
189
case 15: output.append("mem"); break;
190
}
191
}
192
193
return output;
194
}
195
196
#endif
197
198