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