register breakpoint: MMR0-3

This commit is contained in:
folkert van heusden 2024-04-16 14:49:15 +02:00
parent ffe36af9b4
commit 1344440a04
Signed by untrusted user who does not match committer: folkert
GPG key ID: 6B6455EDFEED3BD1
3 changed files with 53 additions and 4 deletions

View file

@ -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<std::string> 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 *, std::optional<std::string> > breakpoint_register::parse(bus *const b, const std::string & in)
@ -56,6 +96,11 @@ std::pair<breakpoint_register *, std::optional<std::string> > 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 += ",";

View file

@ -13,6 +13,10 @@ private:
int register_nr { -1 };
std::set<uint16_t> 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<uint16_t> & values);
virtual ~breakpoint_register();

View file

@ -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");