diff --git a/breakpoint_register.cpp b/breakpoint_register.cpp index 622bf64..328b32e 100644 --- a/breakpoint_register.cpp +++ b/breakpoint_register.cpp @@ -16,15 +16,55 @@ breakpoint_register::~breakpoint_register() { } +std::string breakpoint_register::get_name(hwreg_t reg) const +{ + if (reg < 8) + return format("R%d", reg); + + switch(reg) { + case hr_mmr0: + return "mmr0"; + case hr_mmr1: + return "mmr1"; + case hr_mmr2: + return "mmr2"; + case hr_mmr3: + return "mmr3"; + } + + return "???"; +} + std::optional breakpoint_register::is_triggered() const { - uint16_t v = c->getRegister(register_nr); // TODO run-mode + uint16_t v = 0; + + if (register_nr < 8) + v = c->getRegister(register_nr); // TODO run-mode + else { + hwreg_t reg = hwreg_t(register_nr); + + switch(reg) { + case hr_mmr0: + v = b->getMMR0(); + break; + case hr_mmr1: + v = b->getMMR1(); + break; + case hr_mmr2: + v = b->getMMR2(); + break; + case hr_mmr3: + v = b->getMMR3(); + break; + } + } auto it = values.find(v); if (it == values.end()) return { }; - return format("R%d=%06o", register_nr, v); + return get_name(hwreg_t(register_nr)) + format("%06o", v); } std::pair > breakpoint_register::parse(bus *const b, const std::string & in) @@ -56,6 +96,11 @@ std::pair > breakpoint_registe else if (key == "PC" || key == "pc") { return { new breakpoint_register(b, 7, values), { } }; } + else if (key.substr(0, 3) == "MMR" or key.substr(0, 3) == "mmr") { + int which = key[3] - '0'; + + return { new breakpoint_register(b, hr_mmr0 + which, values), { } }; + } return { nullptr, { } }; } @@ -66,7 +111,7 @@ std::string breakpoint_register::emit() const for(auto & v: values) { if (out.empty()) - out = format("R%d", register_nr) + "="; + out = get_name(hwreg_t(register_nr)) + "="; else out += ","; diff --git a/breakpoint_register.h b/breakpoint_register.h index 784cfbb..45f118b 100644 --- a/breakpoint_register.h +++ b/breakpoint_register.h @@ -13,6 +13,10 @@ private: int register_nr { -1 }; std::set values; + enum hwreg_t { hr_mmr0 = 100, hr_mmr1, hr_mmr2, hr_mmr3 }; + + std::string get_name(hwreg_t reg) const; + public: breakpoint_register(bus *const b, const int register_nr, const std::set & values); virtual ~breakpoint_register(); diff --git a/debugger.cpp b/debugger.cpp index ff921b3..d1566b0 100644 --- a/debugger.cpp +++ b/debugger.cpp @@ -1026,7 +1026,7 @@ void debugger(console *const cnsl, bus *const b, std::atomic_uint32_t *const sto cnsl->put_string_lf("sbp/cbp/lbp - set/clear/list breakpoint(s)"); cnsl->put_string_lf(" e.g.: (pc=0123 and memwv[04000]=0200,0300 and (r4=07,05 or r5=0456))"); cnsl->put_string_lf(" values seperated by ',', char after mem is w/b (word/byte), then"); - cnsl->put_string_lf(" follows v/p (virtual/physical), all octal values"); + cnsl->put_string_lf(" follows v/p (virtual/physical), all octal values, mmr0-3 are registers"); cnsl->put_string_lf("trace/t - toggle tracing"); cnsl->put_string_lf("turbo - toggle turbo mode (cannot be interrupted)"); cnsl->put_string_lf("strace - start tracing from address - invoke without address to disable");