diff options
Diffstat (limited to 'qtmips_cli/tracer.cpp')
-rw-r--r-- | qtmips_cli/tracer.cpp | 46 |
1 files changed, 45 insertions, 1 deletions
diff --git a/qtmips_cli/tracer.cpp b/qtmips_cli/tracer.cpp index 2969112..55dc3e3 100644 --- a/qtmips_cli/tracer.cpp +++ b/qtmips_cli/tracer.cpp @@ -1,17 +1,61 @@ #include "tracer.h" #include <iostream> +#include <qtmipsexception.h> using namespace std; using namespace machine; Tracer::Tracer(QtMipsMachine *machine) { this->machine = machine; + for (unsigned i = 0; i < 32; i++) + gp_regs[i] = false; + r_hi = false; + r_lo = false; + + con_regs_pc = false; + con_regs_gp = false; + con_regs_hi_lo = false; } +#define CON(VAR, SIG, SLT) do { \ + if (!VAR) { \ + connect(machine->registers(), SIGNAL(SIG), this, SLOT(SLT)); \ + VAR = true;\ + }\ + } while(false) + void Tracer::reg_pc() { - connect(machine->registers(), SIGNAL(pc_update(std::uint32_t)), this, SLOT(regs_pc_update(std::uint32_t))); + CON(con_regs_pc, pc_update(std::uint32_t), regs_pc_update(std::uint32_t)); +} + +void Tracer::reg_gp(std::uint8_t i) { + SANITY_ASSERT(i <= 32, "Trying to trace invalid gp."); + CON(con_regs_gp, gp_update(std::uint8_t,std::uint32_t), regs_gp_update(std::uint8_t,std::uint32_t)); + gp_regs[i] = true; +} + +void Tracer::reg_lo() { + CON(con_regs_hi_lo, hi_lo_update(bool hi, std::uint32_t val), regs_hi_lo_update(bool hi, std::uint32_t val)); + r_lo = true; +} + +void Tracer::reg_hi() { + CON(con_regs_hi_lo, hi_lo_update(bool hi, std::uint32_t val), regs_hi_lo_update(bool hi, std::uint32_t val)); + r_hi = true; } void Tracer::regs_pc_update(std::uint32_t val) { cout << "PC:" << hex << val << endl; } + +void Tracer::regs_gp_update(std::uint8_t i, std::uint32_t val) { + if (gp_regs[i]) + cout << "GP" << dec << (unsigned)i << ":" << hex << val << endl; +} + +void Tracer::regs_hi_lo_update(bool hi, std::uint32_t val) { + if (hi && r_hi) + cout << "HI:" << hex << val << endl; + else if (!hi && r_lo) + cout << "LO:" << hex << val << endl; +} |