Beispiel #1
0
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;
  }
}
Beispiel #2
0
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, " ");
}