diff --git a/src/platform/qt/MemoryModel.cpp b/src/platform/qt/MemoryModel.cpp
index a5f598f4a..307ab8144 100644
--- a/src/platform/qt/MemoryModel.cpp
+++ b/src/platform/qt/MemoryModel.cpp
@@ -204,6 +204,7 @@ void MemoryModel::mousePressEvent(QMouseEvent* event) {
uint32_t address = int(position.x() / m_cellSize.width()) + (int(position.y() / m_cellSize.height()) + m_top) * 16 + m_base;
m_selectionAnchor = address & ~(m_align - 1);
m_selection = qMakePair(m_selectionAnchor, m_selectionAnchor + m_align);
+ emit selectionChanged(m_selection.first, m_selection.second);
viewport()->update();
}
@@ -219,6 +220,7 @@ void MemoryModel::mouseMoveEvent(QMouseEvent* event) {
} else {
m_selection = qMakePair(m_selectionAnchor, (address & ~(m_align - 1)) + m_align);
}
+ emit selectionChanged(m_selection.first, m_selection.second);
viewport()->update();
}
diff --git a/src/platform/qt/MemoryModel.h b/src/platform/qt/MemoryModel.h
index a1efac6ec..267812d68 100644
--- a/src/platform/qt/MemoryModel.h
+++ b/src/platform/qt/MemoryModel.h
@@ -27,12 +27,17 @@ public:
void setController(GameController* controller);
void setRegion(uint32_t base, uint32_t size, const QString& name = QString());
+
void setAlignment(int);
+ int alignment() const { return m_align; }
public slots:
void jumpToAddress(const QString& hex);
void jumpToAddress(uint32_t);
+signals:
+ void selectionChanged(uint32_t start, uint32_t end);
+
protected:
void resizeEvent(QResizeEvent*) override;
void paintEvent(QPaintEvent*) override;
diff --git a/src/platform/qt/MemoryView.cpp b/src/platform/qt/MemoryView.cpp
index 41671c371..aca7f2cd5 100644
--- a/src/platform/qt/MemoryView.cpp
+++ b/src/platform/qt/MemoryView.cpp
@@ -29,6 +29,8 @@ MemoryView::MemoryView(GameController* controller, QWidget* parent)
connect(m_ui.width32, &QAbstractButton::clicked, [this]() { m_ui.hexfield->setAlignment(4); });
connect(m_ui.setAddress, SIGNAL(valueChanged(const QString&)), m_ui.hexfield, SLOT(jumpToAddress(const QString&)));
+ connect(m_ui.hexfield, SIGNAL(selectionChanged(uint32_t, uint32_t)), this, SLOT(updateStatus(uint32_t, uint32_t)));
+
connect(controller, SIGNAL(gameStopped(GBAThread*)), this, SLOT(close()));
}
@@ -54,3 +56,38 @@ void MemoryView::setIndex(int index) {
const auto& info = indexInfo[index];
m_ui.hexfield->setRegion(info.base, info.size, info.name);
}
+
+void MemoryView::updateStatus(uint32_t start, uint32_t end) {
+ int align = m_ui.hexfield->alignment();
+ if (start & (align - 1) || end - start != align) {
+ m_ui.sintVal->clear();
+ m_ui.uintVal->clear();
+ return;
+ }
+ ARMCore* cpu = m_controller->thread()->cpu;
+ union {
+ uint32_t u32;
+ int32_t i32;
+ uint16_t u16;
+ int16_t i16;
+ uint8_t u8;
+ int8_t i8;
+ } value;
+ switch (align) {
+ case 1:
+ value.u8 = cpu->memory.load8(cpu, start, nullptr);
+ m_ui.sintVal->setText(QString::number(value.i8));
+ m_ui.uintVal->setText(QString::number(value.u8));
+ break;
+ case 2:
+ value.u16 = cpu->memory.load16(cpu, start, nullptr);
+ m_ui.sintVal->setText(QString::number(value.i16));
+ m_ui.uintVal->setText(QString::number(value.u16));
+ break;
+ case 4:
+ value.u32 = cpu->memory.load32(cpu, start, nullptr);
+ m_ui.sintVal->setText(QString::number(value.i32));
+ m_ui.uintVal->setText(QString::number(value.u32));
+ break;
+ }
+}
diff --git a/src/platform/qt/MemoryView.h b/src/platform/qt/MemoryView.h
index b2ec2e033..b5b7e9c9f 100644
--- a/src/platform/qt/MemoryView.h
+++ b/src/platform/qt/MemoryView.h
@@ -22,6 +22,7 @@ public:
private slots:
void setIndex(int);
+ void updateStatus(uint32_t start, uint32_t end);
private:
Ui::MemoryView m_ui;
diff --git a/src/platform/qt/MemoryView.ui b/src/platform/qt/MemoryView.ui
index 0684c41d4..59ff2ef7c 100644
--- a/src/platform/qt/MemoryView.ui
+++ b/src/platform/qt/MemoryView.ui
@@ -7,7 +7,7 @@
0
0
550
- 610
+ 640
@@ -185,6 +185,46 @@
+ -
+
+
-
+
+
-
+
+
+ Signed Integer:
+
+
+
+ -
+
+
+ true
+
+
+
+
+
+ -
+
+
-
+
+
+ Unsigned Integer:
+
+
+
+ -
+
+
+ true
+
+
+
+
+
+
+