aboutsummaryrefslogtreecommitdiff
path: root/qtmips_gui/programdock.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'qtmips_gui/programdock.cpp')
-rw-r--r--qtmips_gui/programdock.cpp68
1 files changed, 66 insertions, 2 deletions
diff --git a/qtmips_gui/programdock.cpp b/qtmips_gui/programdock.cpp
index 39a3f77..a355b22 100644
--- a/qtmips_gui/programdock.cpp
+++ b/qtmips_gui/programdock.cpp
@@ -50,11 +50,23 @@ ProgramDock::ProgramDock(QWidget *parent, QSettings *settings) : Super(parent) {
setObjectName("Program");
setWindowTitle("Program");
+ this->settings = settings;
+ follow_source = (enum FollowSource)
+ settings->value("ProgramViewFollowSource", 0).toInt();
+
+ for (int i = 0; i < FOLLOWSRC_COUNT; i++)
+ follow_addr[i] = 0;
+
QWidget *content = new QWidget();
QComboBox *follow_inst = new QComboBox();
- follow_inst->addItem("Follow - none");
- follow_inst->addItem("Follow - fetch");
+ follow_inst->addItem("Follow none");
+ follow_inst->addItem("Follow fetch");
+ follow_inst->addItem("Follow decode");
+ follow_inst->addItem("Follow execute");
+ follow_inst->addItem("Follow memory");
+ follow_inst->addItem("Follow writeback");
+ follow_inst->setCurrentIndex((int)follow_source);
QTableView *program_content = new ProgramTableView(0, settings);
// program_content->setSizePolicy();
@@ -81,8 +93,60 @@ ProgramDock::ProgramDock(QWidget *parent, QSettings *settings) : Super(parent) {
go_edit, SLOT(set_value(std::uint32_t)));
connect(this, SIGNAL(jump_to_pc(std::uint32_t)),
program_content, SLOT(go_to_address(std::uint32_t)));
+ connect(follow_inst, SIGNAL(currentIndexChanged(int)),
+ this, SLOT(set_follow_inst(int)));
+ connect(this, SIGNAL(focus_addr(std::uint32_t)),
+ program_content, SLOT(focus_address(std::uint32_t)));
}
void ProgramDock::setup(machine::QtMipsMachine *machine) {
+ std::uint32_t pc;
emit machine_setup(machine);
+ if (machine == nullptr)
+ return;
+ pc = machine->registers()->read_pc();
+ for (int i = 0; i < FOLLOWSRC_COUNT; i++)
+ follow_addr[i] = pc;
+ update_follow_position();
+}
+
+void ProgramDock::set_follow_inst(int follow) {
+ follow_source = (enum FollowSource)follow;
+ settings->setValue("ProgramViewFollowSource", (int)follow_source);
+ update_follow_position();
+}
+
+void ProgramDock::fetch_inst_addr(std::uint32_t addr) {
+ follow_addr[FOLLOWSRC_FETCH] = addr;
+ if (follow_source == FOLLOWSRC_FETCH)
+ update_follow_position();
+}
+
+void ProgramDock::decode_inst_addr(std::uint32_t addr) {
+ follow_addr[FOLLOWSRC_DECODE] = addr;
+ if (follow_source == FOLLOWSRC_DECODE)
+ update_follow_position();
+}
+
+void ProgramDock::execute_inst_addr(std::uint32_t addr) {
+ follow_addr[FOLLOWSRC_EXECUTE] = addr;
+ if (follow_source == FOLLOWSRC_EXECUTE)
+ update_follow_position();
+}
+
+void ProgramDock::memory_inst_addr(std::uint32_t addr) {
+ follow_addr[FOLLOWSRC_MEMORY] = addr;
+ if (follow_source == FOLLOWSRC_MEMORY)
+ update_follow_position();
+}
+
+void ProgramDock::writeback_inst_addr(std::uint32_t addr) {
+ follow_addr[FOLLOWSRC_WRITEBACK] = addr;
+ if (follow_source == FOLLOWSRC_WRITEBACK)
+ update_follow_position();
+}
+
+void ProgramDock::update_follow_position() {
+ if (follow_source != FOLLOWSRC_NONE)
+ emit focus_addr(follow_addr[follow_source]);
}