aboutsummaryrefslogtreecommitdiff
path: root/qtmips_cli/tracer.cpp
diff options
context:
space:
mode:
authorKarel Kočí <cynerd@email.cz>2018-01-01 20:43:42 +0100
committerKarel Kočí <cynerd@email.cz>2018-01-01 20:47:36 +0100
commit128ce1ee2115b54d43db1334e12410b1cc216f10 (patch)
tree10593231884a85966f38ac1fff9d139ae75e1bbb /qtmips_cli/tracer.cpp
parent92b6d05aed7cbfa7ddb0c5dcc61318c69c03bc97 (diff)
downloadqtmips-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.cpp46
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;
+}