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