diff options
author | Karel Kočí <cynerd@email.cz> | 2018-01-01 20:43:42 +0100 |
---|---|---|
committer | Karel Kočí <cynerd@email.cz> | 2018-01-01 20:47:36 +0100 |
commit | 128ce1ee2115b54d43db1334e12410b1cc216f10 (patch) | |
tree | 10593231884a85966f38ac1fff9d139ae75e1bbb /qtmips_cli/tracer.cpp | |
parent | 92b6d05aed7cbfa7ddb0c5dcc61318c69c03bc97 (diff) | |
download | qtmips-128ce1ee2115b54d43db1334e12410b1cc216f10.tar.gz qtmips-128ce1ee2115b54d43db1334e12410b1cc216f10.tar.bz2 qtmips-128ce1ee2115b54d43db1334e12410b1cc216f10.zip |
cli: extend tracer and implement reporter
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; +} |