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 + + + + + + +