From a4d10c950fcf8181f708eb4dffdc9133aa33193b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Karel=20Ko=C4=8D=C3=AD?= Date: Fri, 15 Dec 2017 22:46:01 +0100 Subject: Implement some barebone registers dock --- qtmips_gui/registersdock.cpp | 64 +++++++++++++++++++++++++++++++++++++++++--- qtmips_gui/registersdock.h | 25 +++++++++++++++-- qtmips_gui/registersdock.ui | 26 ------------------ 3 files changed, 84 insertions(+), 31 deletions(-) delete mode 100644 qtmips_gui/registersdock.ui (limited to 'qtmips_gui') diff --git a/qtmips_gui/registersdock.cpp b/qtmips_gui/registersdock.cpp index e8a5907..d038462 100644 --- a/qtmips_gui/registersdock.cpp +++ b/qtmips_gui/registersdock.cpp @@ -1,10 +1,68 @@ #include "registersdock.h" RegistersDock::RegistersDock(QWidget *parent) : QDockWidget(parent) { - ui = new Ui::RegistersDock(); - ui->setupUi(this); + regs = nullptr; + + widg = new QScrollArea(this); + layout = new QFormLayout(widg); + +#define INIT(X, LABEL) do{ \ + X = new QLabel(widg); \ + X->setTextInteractionFlags(Qt::TextSelectableByMouse); \ + layout->addRow(LABEL, X); \ + } while(false) + + INIT(pc, "PC:"); + for (int i = 0; i < 32; i++) + INIT(gp[i], QString("GP") + QString::number(i) + QString(" ($") + QString::number(i) + QString("):")); + INIT(lo, "LO:"); + INIT(hi, "HI:"); + +#undef INIT + + setWidget(widg); } RegistersDock::~RegistersDock() { - delete ui; + delete layout; + delete pc, hi, lo; + for (int i = 0; i < 32; i++) + delete gp[i]; +} + +void RegistersDock::setup(QtMipsMachine *machine) { + regs = machine->registers(); + connect(regs, SIGNAL(pc_update(std::uint32_t)), this, SLOT(pc_changed(std::uint32_t))); + connect(regs, SIGNAL(gp_update(std::uint8_t,std::uint32_t)), this, SLOT(gp_changed(std::uint8_t,std::uint32_t))); + connect(regs, SIGNAL(hi_lo_update(bool,std::uint32_t)), this, SLOT(hi_lo_changed(bool,std::uint32_t))); + + // Load values + labelVal(pc, regs->read_pc(), false); + labelVal(hi, regs->read_hi_lo(true), true); + labelVal(lo, regs->read_hi_lo(false), true); + for (int i = 0; i < 32; i++) + labelVal(gp[i], regs->read_gp(i), true); +} + +void RegistersDock::pc_changed(std::uint32_t val) { + labelVal(pc, val, false); +} + +void RegistersDock::gp_changed(std::uint8_t i, std::uint32_t val) { + SANITY_ASSERT(i < 32, QString("RegistersDock received signal with invalid gp register: ") + QString::number(i)); + labelVal(gp[i], val, true); +} + +void RegistersDock::hi_lo_changed(bool hi, std::uint32_t val) { + if (hi) + labelVal(this->hi, val, true); + else + labelVal(lo, val, true); +} + +void RegistersDock::labelVal(QLabel *label, std::uint32_t value, bool dec) { + QString t = QString("0x") + QString::number(value, 16); + if (dec) + t += QString(" (") + QString::number(value) + QString(")"); + label->setText(t); } diff --git a/qtmips_gui/registersdock.h b/qtmips_gui/registersdock.h index 338edc3..90be659 100644 --- a/qtmips_gui/registersdock.h +++ b/qtmips_gui/registersdock.h @@ -2,16 +2,37 @@ #define REGISTERSDOCK_H #include -#include "ui_registersdock.h" +#include +#include +#include +#include +#include "qtmipsmachine.h" class RegistersDock : public QDockWidget { + Q_OBJECT public: RegistersDock(QWidget *parent); ~RegistersDock(); + void setup(QtMipsMachine *machine); + +private slots: + void pc_changed(std::uint32_t val); + void gp_changed(std::uint8_t i, std::uint32_t val); + void hi_lo_changed(bool hi, std::uint32_t val); + private: - Ui::RegistersDock *ui; + const Registers *regs; + + QScrollArea *widg; + QFormLayout *layout; + + QLabel *pc; + QLabel *hi; + QLabel *lo; + QLabel *gp[32]; + void labelVal(QLabel *label, std::uint32_t val, bool dec); }; #endif // REGISTERSDOCK_H diff --git a/qtmips_gui/registersdock.ui b/qtmips_gui/registersdock.ui deleted file mode 100644 index 9b51505..0000000 --- a/qtmips_gui/registersdock.ui +++ /dev/null @@ -1,26 +0,0 @@ - - - RegistersDock - - - - 0 - 0 - 400 - 300 - - - - Registers - - - - - - - - - - - - -- cgit v1.2.3