From c021267ce6e890ffe0b5dbc365ae2527deca49a6 Mon Sep 17 00:00:00 2001 From: Jeffrey Pfau Date: Wed, 29 Apr 2015 22:13:05 -0700 Subject: [PATCH] Qt: MemoryView subregions --- src/platform/qt/MemoryModel.cpp | 31 ++++++--- src/platform/qt/MemoryModel.h | 5 ++ src/platform/qt/MemoryView.cpp | 30 +++++++++ src/platform/qt/MemoryView.h | 3 + src/platform/qt/MemoryView.ui | 107 +++++++++++++++++++++++++++++++- 5 files changed, 165 insertions(+), 11 deletions(-) diff --git a/src/platform/qt/MemoryModel.cpp b/src/platform/qt/MemoryModel.cpp index 83cab24e5..fa7bd66d0 100644 --- a/src/platform/qt/MemoryModel.cpp +++ b/src/platform/qt/MemoryModel.cpp @@ -49,22 +49,33 @@ MemoryModel::MemoryModel(QWidget* parent) setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff); setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOn); - m_margins = QMargins(metrics.width("FFFFFF ") + 3, m_cellHeight + 1, metrics.width(" AAAAAAAAAAAAAAAA") + 3, 0); + m_margins = QMargins(metrics.width("FFFFFF ") + 4, m_cellHeight + 1, metrics.width(" AAAAAAAAAAAAAAAA") + 3, 0); - verticalScrollBar()->setRange(0, 0x01000001 - viewport()->size().height() / m_cellHeight); connect(verticalScrollBar(), &QSlider::sliderMoved, [this](int position) { m_top = position; update(); }); - update(); + + setRegion(0, 0x10000000, tr("All")); } void MemoryModel::setController(GameController* controller) { m_cpu = controller->thread()->cpu; } +void MemoryModel::setRegion(uint32_t base, uint32_t size, const QString& name) { + m_top = 0; + m_base = base; + m_size = size; + m_regionName = name; + m_regionName.prepare(QTransform(), m_font); + verticalScrollBar()->setRange(0, (size >> 4) + 1 - viewport()->size().height() / m_cellHeight); + verticalScrollBar()->setValue(0); + viewport()->update(); +} + void MemoryModel::resizeEvent(QResizeEvent*) { - verticalScrollBar()->setRange(0, 0x01000001 - viewport()->size().height() / m_cellHeight); + verticalScrollBar()->setRange(0, (m_size >> 4) + 1 - viewport()->size().height() / m_cellHeight); boundsCheck(); } @@ -74,7 +85,7 @@ void MemoryModel::paintEvent(QPaintEvent* event) { QChar c0('0'); QSizeF cellSize = QSizeF((viewport()->size().width() - (m_margins.left() + m_margins.right())) / 16.f, m_cellHeight); QSizeF letterSize = QSizeF(m_letterWidth, m_cellHeight); - painter.drawText(QRect(QPoint(0, 0), QSize(m_margins.left(), m_margins.top())), Qt::AlignHCenter, tr("All")); + painter.drawStaticText(QPointF((m_margins.left() - m_regionName.size().width() - 1) / 2.0, 0), m_regionName); painter.drawText(QRect(QPoint(viewport()->size().width() - m_margins.right(), 0), QSize(m_margins.right(), m_margins.top())), Qt::AlignHCenter, tr("ASCII")); for (int x = 0; x < 16; ++x) { painter.drawText(QRectF(QPointF(cellSize.width() * x + m_margins.left(), 0), cellSize), Qt::AlignHCenter, QString::number(x, 16).toUpper()); @@ -82,10 +93,10 @@ void MemoryModel::paintEvent(QPaintEvent* event) { int height = (viewport()->size().height() - m_cellHeight) / m_cellHeight; for (int y = 0; y < height; ++y) { int yp = m_cellHeight * y + m_margins.top(); - QString data = QString("%0").arg(y + m_top, 6, 16, c0).toUpper(); + QString data = QString("%0").arg(y + m_top + m_base / 16, 6, 16, c0).toUpper(); painter.drawText(QRectF(QPointF(0, yp), QSizeF(m_margins.left(), m_cellHeight)), Qt::AlignHCenter, data); for (int x = 0; x < 16; ++x) { - uint8_t b = m_cpu->memory.load8(m_cpu, (y + m_top) * 16 + x, nullptr); + uint8_t b = m_cpu->memory.load8(m_cpu, (y + m_top) * 16 + x + m_base, nullptr); painter.drawStaticText(QPointF(cellSize.width() * (x + 0.5) - m_letterWidth + m_margins.left(), yp), m_staticNumbers[b]); painter.drawStaticText(QPointF(viewport()->size().width() - (16 - x) * m_margins.right() / 17.0 - m_letterWidth * 0.5, yp), b < 0x80 ? m_staticAscii[b] : m_staticAscii[0]); } @@ -99,14 +110,14 @@ void MemoryModel::wheelEvent(QWheelEvent* event) { m_top -= event->angleDelta().y() / 8; boundsCheck(); event->accept(); + verticalScrollBar()->setValue(m_top); update(); - QAbstractScrollArea::wheelEvent(event); } void MemoryModel::boundsCheck() { if (m_top < 0) { m_top = 0; - } else if (m_top > 0x01000001 - viewport()->size().height() / m_cellHeight) { - m_top = 0x01000001 - viewport()->size().height() / m_cellHeight; + } else if (m_top > (m_size >> 4) + 1 - viewport()->size().height() / m_cellHeight) { + m_top = (m_size >> 4) + 1 - viewport()->size().height() / m_cellHeight; } } diff --git a/src/platform/qt/MemoryModel.h b/src/platform/qt/MemoryModel.h index 69354fe7e..911657e36 100644 --- a/src/platform/qt/MemoryModel.h +++ b/src/platform/qt/MemoryModel.h @@ -26,6 +26,8 @@ public: void setController(GameController* controller); + void setRegion(uint32_t base, uint32_t size, const QString& name = QString()); + protected: void resizeEvent(QResizeEvent*) override; void paintEvent(QPaintEvent*) override; @@ -38,10 +40,13 @@ private: QFont m_font; int m_cellHeight; int m_letterWidth; + uint32_t m_base; + uint32_t m_size; int m_top; QMargins m_margins; QVector m_staticNumbers; QVector m_staticAscii; + QStaticText m_regionName; }; } diff --git a/src/platform/qt/MemoryView.cpp b/src/platform/qt/MemoryView.cpp index 93d826cbb..f76f30a12 100644 --- a/src/platform/qt/MemoryView.cpp +++ b/src/platform/qt/MemoryView.cpp @@ -8,6 +8,10 @@ #include "GameController.h" +extern "C" { +#include "gba/memory.h" +} + using namespace QGBA; MemoryView::MemoryView(GameController* controller, QWidget* parent) @@ -17,5 +21,31 @@ MemoryView::MemoryView(GameController* controller, QWidget* parent) m_ui.setupUi(this); m_ui.hexfield->setController(controller); + + connect(m_ui.regions, SIGNAL(currentIndexChanged(int)), this, SLOT(setIndex(int))); + connect(controller, SIGNAL(gameStopped(GBAThread*)), this, SLOT(close())); } + +void MemoryView::setIndex(int index) { + static struct { + const char* name; + uint32_t base; + uint32_t size; + } indexInfo[] = { + { "All", 0, 0x10000000 }, + { "BIOS", BASE_BIOS, SIZE_BIOS }, + { "EWRAM", BASE_WORKING_RAM, SIZE_WORKING_RAM }, + { "IWRAM", BASE_WORKING_IRAM, SIZE_WORKING_IRAM }, + { "MMIO", BASE_IO, SIZE_IO }, + { "Palette", BASE_PALETTE_RAM, SIZE_PALETTE_RAM }, + { "VRAM", BASE_VRAM, SIZE_VRAM }, + { "OAM", BASE_OAM, SIZE_OAM }, + { "ROM", BASE_CART0, SIZE_CART0 }, + { "ROM (WS1)", BASE_CART1, SIZE_CART1 }, + { "ROM (WS2)", BASE_CART2, SIZE_CART2 }, + { "SRAM", BASE_CART_SRAM, SIZE_CART_SRAM }, + }; + const auto& info = indexInfo[index]; + m_ui.hexfield->setRegion(info.base, info.size, info.name); +} diff --git a/src/platform/qt/MemoryView.h b/src/platform/qt/MemoryView.h index 6f47fbce6..b2ec2e033 100644 --- a/src/platform/qt/MemoryView.h +++ b/src/platform/qt/MemoryView.h @@ -20,6 +20,9 @@ Q_OBJECT public: MemoryView(GameController* controller, QWidget* parent = nullptr); +private slots: + void setIndex(int); + private: Ui::MemoryView m_ui; diff --git a/src/platform/qt/MemoryView.ui b/src/platform/qt/MemoryView.ui index 61e7d7915..550d40e70 100644 --- a/src/platform/qt/MemoryView.ui +++ b/src/platform/qt/MemoryView.ui @@ -15,7 +15,112 @@ - + + + + + + All + + + + + BIOS (16kiB) + + + + + Working RAM (256kiB) + + + + + Internal Working RAM (32kiB) + + + + + Memory-Mapped I/O + + + + + Palette RAM (1kiB) + + + + + Video RAM (96kiB) + + + + + OBJ Attribute Memory (1kiB) + + + + + Game Pak (32MiB) + + + + + Game Pak (Waitstate 1) + + + + + Game Pak (Waitstate 2) + + + + + Static RAM (64kiB) + + + + + + + + Qt::Horizontal + + + + 40 + 20 + + + + + + + + Inspect Address + + + + + + + false + + + 10 + + + + + + + + + + 0 + 0 + + +