diff --git a/src/lr35902/isa-lr35902.h b/src/lr35902/isa-lr35902.h index 8093e226e..0b73c8deb 100644 --- a/src/lr35902/isa-lr35902.h +++ b/src/lr35902/isa-lr35902.h @@ -11,6 +11,6 @@ struct LR35902Core; typedef void (*LR35902Instruction)(struct LR35902Core*); -const LR35902Instruction _lr35902InstructionTable[0x100]; +extern const LR35902Instruction _lr35902InstructionTable[0x100]; #endif diff --git a/src/platform/qt/Display.cpp b/src/platform/qt/Display.cpp index 5d76a5144..b231f0ebc 100644 --- a/src/platform/qt/Display.cpp +++ b/src/platform/qt/Display.cpp @@ -9,7 +9,7 @@ #include "DisplayQt.h" extern "C" { -#include "gba/video.h" +#include "gb/video.h" } using namespace QGBA; @@ -54,7 +54,7 @@ Display::Display(QWidget* parent) , m_filter(false) { setSizePolicy(QSizePolicy::MinimumExpanding, QSizePolicy::MinimumExpanding); - setMinimumSize(VIDEO_HORIZONTAL_PIXELS, VIDEO_VERTICAL_PIXELS); + setMinimumSize(GB_VIDEO_HORIZONTAL_PIXELS, GB_VIDEO_VERTICAL_PIXELS); connect(&m_mouseTimer, SIGNAL(timeout()), this, SIGNAL(hideCursor())); m_mouseTimer.setSingleShot(true); m_mouseTimer.setInterval(MOUSE_DISAPPEAR_TIMER); diff --git a/src/platform/qt/GBAApp.cpp b/src/platform/qt/GBAApp.cpp index 0240c2991..f186345fa 100644 --- a/src/platform/qt/GBAApp.cpp +++ b/src/platform/qt/GBAApp.cpp @@ -83,7 +83,7 @@ GBAApp::GBAApp(int& argc, char* argv[]) freeArguments(&args); if (graphicsOpts.multiplier) { - w->resizeFrame(VIDEO_HORIZONTAL_PIXELS * graphicsOpts.multiplier, VIDEO_VERTICAL_PIXELS * graphicsOpts.multiplier); + w->resizeFrame(QSize(VIDEO_HORIZONTAL_PIXELS * graphicsOpts.multiplier, VIDEO_VERTICAL_PIXELS * graphicsOpts.multiplier)); } if (graphicsOpts.fullscreen) { w->enterFullScreen(); diff --git a/src/platform/qt/GDBController.cpp b/src/platform/qt/GDBController.cpp index 6edc1b9b4..9b56a857b 100644 --- a/src/platform/qt/GDBController.cpp +++ b/src/platform/qt/GDBController.cpp @@ -36,7 +36,7 @@ void GDBController::setBindAddress(uint32_t bindAddress) { } void GDBController::attach() { - if (isAttached()) { + if (isAttached() || m_gameController->platform() != PLATFORM_GBA) { return; } m_gameController->setDebugger(&m_gdbStub.d); diff --git a/src/platform/qt/GameController.cpp b/src/platform/qt/GameController.cpp index 129ddecc5..838179fec 100644 --- a/src/platform/qt/GameController.cpp +++ b/src/platform/qt/GameController.cpp @@ -463,6 +463,23 @@ bool GameController::isPaused() { return mCoreThreadIsPaused(&m_threadContext); } +mPlatform GameController::platform() const { + if (!m_gameOpen) { + return PLATFORM_NONE; + } + return m_threadContext.core->platform(m_threadContext.core); +} + +QSize GameController::screenDimensions() const { + if (!m_gameOpen) { + return QSize(); + } + unsigned width, height; + m_threadContext.core->desiredVideoDimensions(m_threadContext.core, &width, &height); + + return QSize(width, height); +} + void GameController::setPaused(bool paused) { if (!isLoaded() || m_rewindTimer.isActive() || paused == mCoreThreadIsPaused(&m_threadContext)) { return; diff --git a/src/platform/qt/GameController.h b/src/platform/qt/GameController.h index c445efa49..d1baa5628 100644 --- a/src/platform/qt/GameController.h +++ b/src/platform/qt/GameController.h @@ -16,6 +16,7 @@ #include extern "C" { +#include "core/core.h" #include "core/thread.h" #include "gba/cheats.h" #include "gba/context/overrides.h" @@ -58,9 +59,11 @@ public: bool isPaused(); bool isLoaded() { return m_gameOpen && mCoreThreadIsActive(&m_threadContext); } + mPlatform platform() const; bool audioSync() const { return m_audioSync; } bool videoSync() const { return m_videoSync; } + QSize screenDimensions() const; void setInputController(InputController* controller) { m_inputController = controller; } diff --git a/src/platform/qt/OverrideView.cpp b/src/platform/qt/OverrideView.cpp index d643960b6..ac1b8d646 100644 --- a/src/platform/qt/OverrideView.cpp +++ b/src/platform/qt/OverrideView.cpp @@ -104,6 +104,10 @@ void OverrideView::gameStarted(mCoreThread* thread) { gameStopped(); return; } + if (thread->core->platform(thread->core) != PLATFORM_GBA) { + close(); + return; + } GBA* gba = static_cast(thread->core->board); m_ui.savetype->setCurrentIndex(gba->memory.savedata.type + 1); m_ui.savetype->setEnabled(false); diff --git a/src/platform/qt/Window.cpp b/src/platform/qt/Window.cpp index 9c39030d9..3d554254e 100644 --- a/src/platform/qt/Window.cpp +++ b/src/platform/qt/Window.cpp @@ -185,11 +185,11 @@ void Window::argumentsPassed(mArguments* args) { } } -void Window::resizeFrame(int width, int height) { - QSize newSize(width, height); +void Window::resizeFrame(const QSize& size) { + QSize newSize(size); m_screenWidget->setSizeHint(newSize); newSize -= m_screenWidget->size(); - newSize += size(); + newSize += this->size(); resize(newSize); } @@ -215,7 +215,7 @@ void Window::loadConfig() { } if (opts->width && opts->height) { - resizeFrame(opts->width, opts->height); + resizeFrame(QSize(opts->width, opts->height)); } if (opts->fullscreen) { @@ -488,9 +488,13 @@ void Window::resizeEvent(QResizeEvent* event) { } int factor = 0; - if (event->size().width() % VIDEO_HORIZONTAL_PIXELS == 0 && event->size().height() % VIDEO_VERTICAL_PIXELS == 0 && - event->size().width() / VIDEO_HORIZONTAL_PIXELS == event->size().height() / VIDEO_VERTICAL_PIXELS) { - factor = event->size().width() / VIDEO_HORIZONTAL_PIXELS; + QSize size(VIDEO_HORIZONTAL_PIXELS, VIDEO_VERTICAL_PIXELS); + if (m_controller->isLoaded()) { + size = m_controller->screenDimensions(); + } + if (event->size().width() % size.width() == 0 && event->size().height() % size.height() == 0 && + event->size().width() / size.width() == event->size().height() / size.height()) { + factor = event->size().width() / size.width(); } for (QMap::iterator iter = m_frameSizes.begin(); iter != m_frameSizes.end(); ++iter) { bool enableSignals = iter.value()->blockSignals(true); @@ -506,7 +510,7 @@ void Window::resizeEvent(QResizeEvent* event) { } void Window::showEvent(QShowEvent* event) { - resizeFrame(m_screenWidget->sizeHint().width(), m_screenWidget->sizeHint().height()); + resizeFrame(m_screenWidget->sizeHint()); QVariant windowPos = m_config->getQtOption("windowPos"); if (!windowPos.isNull()) { move(windowPos.toPoint()); @@ -612,12 +616,18 @@ void Window::gameStarted(mCoreThread* context, const QString& fname) { foreach (QAction* action, m_gameActions) { action->setDisabled(false); } + foreach (QAction* action, m_gbaActions) { + action->setDisabled(context->core->platform(context->core) != PLATFORM_GBA); + } multiplayerChanged(); if (!fname.isEmpty()) { setWindowFilePath(fname); appendMRU(fname); } updateTitle(); + unsigned width, height; + context->core->desiredVideoDimensions(context->core, &width, &height); + m_display->setMinimumSize(width, height); attachWidget(m_display); #ifndef Q_OS_MAC @@ -632,6 +642,9 @@ void Window::gameStarted(mCoreThread* context, const QString& fname) { } void Window::gameStopped() { + foreach (QAction* action, m_gbaActions) { + action->setDisabled(false); + } foreach (QAction* action, m_gameActions) { action->setDisabled(true); } @@ -799,6 +812,7 @@ void Window::setupMenu(QMenuBar* menubar) { connect(loadState, &QAction::triggered, [this]() { this->openStateWindow(LoadSave::LOAD); }); m_gameActions.append(loadState); m_nonMpActions.append(loadState); + m_gbaActions.append(loadState); addControlledAction(fileMenu, loadState, "loadState"); QAction* saveState = new QAction(tr("&Save state"), fileMenu); @@ -806,6 +820,7 @@ void Window::setupMenu(QMenuBar* menubar) { connect(saveState, &QAction::triggered, [this]() { this->openStateWindow(LoadSave::SAVE); }); m_gameActions.append(saveState); m_nonMpActions.append(saveState); + m_gbaActions.append(saveState); addControlledAction(fileMenu, saveState, "saveState"); QMenu* quickLoadMenu = fileMenu->addMenu(tr("Quick load")); @@ -817,12 +832,14 @@ void Window::setupMenu(QMenuBar* menubar) { connect(quickLoad, SIGNAL(triggered()), m_controller, SLOT(loadState())); m_gameActions.append(quickLoad); m_nonMpActions.append(quickLoad); + m_gbaActions.append(quickLoad); addControlledAction(quickLoadMenu, quickLoad, "quickLoad"); QAction* quickSave = new QAction(tr("Save recent"), quickSaveMenu); connect(quickSave, SIGNAL(triggered()), m_controller, SLOT(saveState())); m_gameActions.append(quickSave); m_nonMpActions.append(quickSave); + m_gbaActions.append(quickSave); addControlledAction(quickSaveMenu, quickSave, "quickSave"); quickLoadMenu->addSeparator(); @@ -833,6 +850,7 @@ void Window::setupMenu(QMenuBar* menubar) { connect(undoLoadState, SIGNAL(triggered()), m_controller, SLOT(loadBackupState())); m_gameActions.append(undoLoadState); m_nonMpActions.append(undoLoadState); + m_gbaActions.append(undoLoadState); addControlledAction(quickLoadMenu, undoLoadState, "undoLoadState"); QAction* undoSaveState = new QAction(tr("Undo save state"), quickSaveMenu); @@ -840,6 +858,7 @@ void Window::setupMenu(QMenuBar* menubar) { connect(undoSaveState, SIGNAL(triggered()), m_controller, SLOT(saveBackupState())); m_gameActions.append(undoSaveState); m_nonMpActions.append(undoSaveState); + m_gbaActions.append(undoSaveState); addControlledAction(quickSaveMenu, undoSaveState, "undoSaveState"); quickLoadMenu->addSeparator(); @@ -852,6 +871,7 @@ void Window::setupMenu(QMenuBar* menubar) { connect(quickLoad, &QAction::triggered, [this, i]() { m_controller->loadState(i); }); m_gameActions.append(quickLoad); m_nonMpActions.append(quickLoad); + m_gbaActions.append(quickLoad); addControlledAction(quickLoadMenu, quickLoad, QString("quickLoad.%1").arg(i)); quickSave = new QAction(tr("State &%1").arg(i), quickSaveMenu); @@ -859,6 +879,7 @@ void Window::setupMenu(QMenuBar* menubar) { connect(quickSave, &QAction::triggered, [this, i]() { m_controller->saveState(i); }); m_gameActions.append(quickSave); m_nonMpActions.append(quickSave); + m_gbaActions.append(quickSave); addControlledAction(quickSaveMenu, quickSave, QString("quickSave.%1").arg(i)); } @@ -866,11 +887,13 @@ void Window::setupMenu(QMenuBar* menubar) { QAction* importShark = new QAction(tr("Import GameShark Save"), fileMenu); connect(importShark, SIGNAL(triggered()), this, SLOT(importSharkport())); m_gameActions.append(importShark); + m_gbaActions.append(importShark); addControlledAction(fileMenu, importShark, "importShark"); QAction* exportShark = new QAction(tr("Export GameShark Save"), fileMenu); connect(exportShark, SIGNAL(triggered()), this, SLOT(exportSharkport())); m_gameActions.append(exportShark); + m_gbaActions.append(exportShark); addControlledAction(fileMenu, exportShark, "exportShark"); fileMenu->addSeparator(); @@ -908,6 +931,7 @@ void Window::setupMenu(QMenuBar* menubar) { QAction* yank = new QAction(tr("Yank game pak"), emulationMenu); connect(yank, SIGNAL(triggered()), m_controller, SLOT(yankPak())); m_gameActions.append(yank); + m_gbaActions.append(yank); addControlledAction(emulationMenu, yank, "yank"); emulationMenu->addSeparator(); @@ -1032,7 +1056,12 @@ void Window::setupMenu(QMenuBar* menubar) { setSize->setCheckable(true); connect(setSize, &QAction::triggered, [this, i, setSize]() { showNormal(); - resizeFrame(VIDEO_HORIZONTAL_PIXELS * i, VIDEO_VERTICAL_PIXELS * i); + QSize size(VIDEO_HORIZONTAL_PIXELS, VIDEO_VERTICAL_PIXELS); + if (m_controller->isLoaded()) { + size = m_controller->screenDimensions(); + } + size *= i; + resizeFrame(size); bool enableSignals = setSize->blockSignals(true); setSize->setChecked(true); setSize->blockSignals(enableSignals); @@ -1174,6 +1203,7 @@ void Window::setupMenu(QMenuBar* menubar) { QAction* overrides = new QAction(tr("Game &overrides..."), toolsMenu); connect(overrides, SIGNAL(triggered()), this, SLOT(openOverrideWindow())); + m_gbaActions.append(overrides); addControlledAction(toolsMenu, overrides, "overrideWindow"); QAction* sensors = new QAction(tr("Game &Pak sensors..."), toolsMenu); @@ -1182,11 +1212,13 @@ void Window::setupMenu(QMenuBar* menubar) { QAction* cheats = new QAction(tr("&Cheats..."), toolsMenu); connect(cheats, SIGNAL(triggered()), this, SLOT(openCheatsWindow())); + m_gbaActions.append(cheats); addControlledAction(toolsMenu, cheats, "cheatsWindow"); #ifdef USE_GDB_STUB QAction* gdbWindow = new QAction(tr("Start &GDB server..."), toolsMenu); connect(gdbWindow, SIGNAL(triggered()), this, SLOT(gdbOpen())); + m_gbaActions.append(gdbWindow); addControlledAction(toolsMenu, gdbWindow, "gdbWindow"); #endif @@ -1199,16 +1231,19 @@ void Window::setupMenu(QMenuBar* menubar) { QAction* paletteView = new QAction(tr("View &palette..."), toolsMenu); connect(paletteView, SIGNAL(triggered()), this, SLOT(openPaletteWindow())); m_gameActions.append(paletteView); + m_gbaActions.append(paletteView); addControlledAction(toolsMenu, paletteView, "paletteWindow"); QAction* memoryView = new QAction(tr("View memory..."), toolsMenu); connect(memoryView, SIGNAL(triggered()), this, SLOT(openMemoryWindow())); m_gameActions.append(memoryView); + m_gbaActions.append(memoryView); addControlledAction(toolsMenu, memoryView, "memoryView"); QAction* ioViewer = new QAction(tr("View &I/O registers..."), toolsMenu); connect(ioViewer, SIGNAL(triggered()), this, SLOT(openIOViewer())); m_gameActions.append(ioViewer); + m_gbaActions.append(ioViewer); addControlledAction(toolsMenu, ioViewer, "ioViewer"); ConfigOption* skipBios = m_config->addOption("skipBios"); diff --git a/src/platform/qt/Window.h b/src/platform/qt/Window.h index 810f34e68..7d6ece721 100644 --- a/src/platform/qt/Window.h +++ b/src/platform/qt/Window.h @@ -47,7 +47,7 @@ public: void setConfig(ConfigController*); void argumentsPassed(mArguments*); - void resizeFrame(int width, int height); + void resizeFrame(const QSize& size); signals: void startDrawing(mCoreThread*); @@ -146,8 +146,10 @@ private: GameController* m_controller; Display* m_display; + // TODO: Move these to a new class QList m_gameActions; QList m_nonMpActions; + QList m_gbaActions; QMap m_frameSizes; LogController m_log; LogView* m_logView;