void SuperFX::disassemble_opcode(char *output, uint32 addr, bool track_regs) { char t[256] = ""; *output = 0; int temp_regs = disassemble_regs; SNES::debugger.bus_access = true; if(!regs.sfr.alt2) { if(!regs.sfr.alt1) { disassemble_alt0(t, addr); } else { disassemble_alt1(t, addr); } } else { if(!regs.sfr.alt1) { disassemble_alt2(t, addr); } else { disassemble_alt3(t, addr); } } SNES::debugger.bus_access = false; sprintf(output, "%.6x %s", addr, t); unsigned length = strlen(output); while(length++ < 25) strcat(output, " "); // status register and some flags (TODO: other flags?) sprintf(t, "S:%.4x %c%c%c%c ", (unsigned) regs.sfr, (unsigned) regs.sfr & 2 ? 'Z' : 'z', (unsigned) regs.sfr & 4 ? 'C' : 'c', (unsigned) regs.sfr & 8 ? 'N' : 'n', (unsigned) regs.sfr & 16 ? 'V' : 'v'); strcat(output, t); // print all current and past used registers if (track_regs) { for (int i = 0; i < 16; i++) { if ((disassemble_regs | disassemble_lastregs) & (1 << i)) { sprintf(t, "R%-2u:%.4x ", i, (unsigned) regs.r[i]); strcat(output, t); } } disassemble_lastregs = disassemble_regs; disassemble_regs = 0; } else { disassemble_regs = temp_regs; } }
void SuperFX::disassemble_opcode(char *output) { *output = 0; if(!regs.sfr.alt2) { if(!regs.sfr.alt1) { disassemble_alt0(output); } else { disassemble_alt1(output); } } else { if(!regs.sfr.alt1) { disassemble_alt2(output); } else { disassemble_alt3(output); } } unsigned length = strlen(output); while(length++ < 20) strcat(output, " "); }