bsnes/higan/target-laevateinn/smp/smp.cpp

109 lines
2.9 KiB
C++
Executable File

#include "../base.hpp"
SMPDebugger *smpDebugger = nullptr;
#include "registers.cpp"
uint8 SMPDebugger::read(uint16 addr) {
if((addr & 0xfff0) == 0x00f0) return ~0; //$00f0-00ff MMIO
return SFC::smp.op_busread(addr);
}
void SMPDebugger::write(uint16 addr, uint8 data) {
if((addr & 0xfff0) == 0x00f0) return; //$00f0-00ff MMIO
return SFC::smp.op_buswrite(addr, data);
}
unsigned SMPDebugger::opcodeLength(uint16 addr) {
static unsigned lengthTable[256] = {
0
};
return lengthTable[SFC::smp.op_busread(addr)];
}
void SMPDebugger::updateDisassembly() {
string line[15];
line[7] = { "> ", SFC::smp.disassemble_opcode(opcodePC) };
line[7][31] = 0;
signed addr = opcodePC;
for(signed o = 6; o >= 0; o--) {
for(signed b = 1; b <= 3; b++) {
if(addr - b >= 0 && (debugger->apuUsage.data[addr - b] & Usage::Exec)) {
addr -= b;
line[o] = { " ", SFC::smp.disassemble_opcode(addr) };
line[o][31] = 0;
break;
}
}
}
addr = opcodePC;
for(signed o = 8; o <= 14; o++) {
for(signed b = 1; b <= 3; b++) {
if(addr - b <= 0xffff && (debugger->apuUsage.data[addr + b] & Usage::Exec)) {
addr += b;
line[o] = { " ", SFC::smp.disassemble_opcode(addr) };
line[o][31] = 0;
break;
}
}
}
string output;
for(auto &n : line) {
if(n.empty()) output.append(" ...\n");
else output.append(n, "\n");
}
output.rtrim<1>("\n");
disassembly.setText(output);
registers.setText({
"YA:", hex<2>(SFC::smp.regs.y), hex<2>(SFC::smp.regs.a),
" A:", hex<2>(SFC::smp.regs.a), " X:", hex<2>(SFC::smp.regs.x),
" Y:", hex<2>(SFC::smp.regs.y), " S:01", hex<2>(SFC::smp.regs.s), " ",
SFC::smp.regs.p.n ? "N" : "n", SFC::smp.regs.p.v ? "V" : "v",
SFC::smp.regs.p.p ? "P" : "p", SFC::smp.regs.p.b ? "B" : "b",
SFC::smp.regs.p.h ? "H" : "h", SFC::smp.regs.p.i ? "I" : "i",
SFC::smp.regs.p.z ? "Z" : "z", SFC::smp.regs.p.c ? "C" : "c",
});
}
SMPDebugger::SMPDebugger() {
opcodePC = 0xffc0;
setTitle("SMP Debugger");
setGeometry({128, 128, 350, 255});
layout.setMargin(5);
stepInto.setText("Step Into");
autoUpdate.setText("Auto");
update.setText("Update");
disassembly.setFont(application->monospaceFont);
registers.setFont(application->monospaceFont);
registers.setText(" ");
layout.append(controlLayout, {~0, 0}, 5);
controlLayout.append(stepInto, {80, 0}, 5);
controlLayout.append(spacer, {~0, 0});
controlLayout.append(autoUpdate, {0, 0}, 5);
controlLayout.append(update, {80, 0});
layout.append(disassembly, {~0, ~0}, 5);
layout.append(registers, {~0, 0});
append(layout);
stepInto.onActivate = [&] {
debugger->flags.smp.stepInto = true;
debugger->resume();
};
update.onActivate = { &SMPDebugger::updateDisassembly, this };
registers.onActivate = [&] {
smpRegisterEditor->loadRegisters();
smpRegisterEditor->setVisible();
};
windowManager->append(this, "SMPDebugger");
}