Qt: More GB bringup

This commit is contained in:
Jeffrey Pfau 2016-02-13 01:06:36 -08:00
parent adf20bea09
commit f3daa19a6d
9 changed files with 76 additions and 15 deletions

View File

@ -11,6 +11,6 @@
struct LR35902Core; struct LR35902Core;
typedef void (*LR35902Instruction)(struct LR35902Core*); typedef void (*LR35902Instruction)(struct LR35902Core*);
const LR35902Instruction _lr35902InstructionTable[0x100]; extern const LR35902Instruction _lr35902InstructionTable[0x100];
#endif #endif

View File

@ -9,7 +9,7 @@
#include "DisplayQt.h" #include "DisplayQt.h"
extern "C" { extern "C" {
#include "gba/video.h" #include "gb/video.h"
} }
using namespace QGBA; using namespace QGBA;
@ -54,7 +54,7 @@ Display::Display(QWidget* parent)
, m_filter(false) , m_filter(false)
{ {
setSizePolicy(QSizePolicy::MinimumExpanding, QSizePolicy::MinimumExpanding); 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())); connect(&m_mouseTimer, SIGNAL(timeout()), this, SIGNAL(hideCursor()));
m_mouseTimer.setSingleShot(true); m_mouseTimer.setSingleShot(true);
m_mouseTimer.setInterval(MOUSE_DISAPPEAR_TIMER); m_mouseTimer.setInterval(MOUSE_DISAPPEAR_TIMER);

View File

@ -83,7 +83,7 @@ GBAApp::GBAApp(int& argc, char* argv[])
freeArguments(&args); freeArguments(&args);
if (graphicsOpts.multiplier) { 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) { if (graphicsOpts.fullscreen) {
w->enterFullScreen(); w->enterFullScreen();

View File

@ -36,7 +36,7 @@ void GDBController::setBindAddress(uint32_t bindAddress) {
} }
void GDBController::attach() { void GDBController::attach() {
if (isAttached()) { if (isAttached() || m_gameController->platform() != PLATFORM_GBA) {
return; return;
} }
m_gameController->setDebugger(&m_gdbStub.d); m_gameController->setDebugger(&m_gdbStub.d);

View File

@ -463,6 +463,23 @@ bool GameController::isPaused() {
return mCoreThreadIsPaused(&m_threadContext); 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) { void GameController::setPaused(bool paused) {
if (!isLoaded() || m_rewindTimer.isActive() || paused == mCoreThreadIsPaused(&m_threadContext)) { if (!isLoaded() || m_rewindTimer.isActive() || paused == mCoreThreadIsPaused(&m_threadContext)) {
return; return;

View File

@ -16,6 +16,7 @@
#include <memory> #include <memory>
extern "C" { extern "C" {
#include "core/core.h"
#include "core/thread.h" #include "core/thread.h"
#include "gba/cheats.h" #include "gba/cheats.h"
#include "gba/context/overrides.h" #include "gba/context/overrides.h"
@ -58,9 +59,11 @@ public:
bool isPaused(); bool isPaused();
bool isLoaded() { return m_gameOpen && mCoreThreadIsActive(&m_threadContext); } bool isLoaded() { return m_gameOpen && mCoreThreadIsActive(&m_threadContext); }
mPlatform platform() const;
bool audioSync() const { return m_audioSync; } bool audioSync() const { return m_audioSync; }
bool videoSync() const { return m_videoSync; } bool videoSync() const { return m_videoSync; }
QSize screenDimensions() const;
void setInputController(InputController* controller) { m_inputController = controller; } void setInputController(InputController* controller) { m_inputController = controller; }

View File

@ -104,6 +104,10 @@ void OverrideView::gameStarted(mCoreThread* thread) {
gameStopped(); gameStopped();
return; return;
} }
if (thread->core->platform(thread->core) != PLATFORM_GBA) {
close();
return;
}
GBA* gba = static_cast<GBA*>(thread->core->board); GBA* gba = static_cast<GBA*>(thread->core->board);
m_ui.savetype->setCurrentIndex(gba->memory.savedata.type + 1); m_ui.savetype->setCurrentIndex(gba->memory.savedata.type + 1);
m_ui.savetype->setEnabled(false); m_ui.savetype->setEnabled(false);

View File

@ -185,11 +185,11 @@ void Window::argumentsPassed(mArguments* args) {
} }
} }
void Window::resizeFrame(int width, int height) { void Window::resizeFrame(const QSize& size) {
QSize newSize(width, height); QSize newSize(size);
m_screenWidget->setSizeHint(newSize); m_screenWidget->setSizeHint(newSize);
newSize -= m_screenWidget->size(); newSize -= m_screenWidget->size();
newSize += size(); newSize += this->size();
resize(newSize); resize(newSize);
} }
@ -215,7 +215,7 @@ void Window::loadConfig() {
} }
if (opts->width && opts->height) { if (opts->width && opts->height) {
resizeFrame(opts->width, opts->height); resizeFrame(QSize(opts->width, opts->height));
} }
if (opts->fullscreen) { if (opts->fullscreen) {
@ -488,9 +488,13 @@ void Window::resizeEvent(QResizeEvent* event) {
} }
int factor = 0; int factor = 0;
if (event->size().width() % VIDEO_HORIZONTAL_PIXELS == 0 && event->size().height() % VIDEO_VERTICAL_PIXELS == 0 && QSize size(VIDEO_HORIZONTAL_PIXELS, VIDEO_VERTICAL_PIXELS);
event->size().width() / VIDEO_HORIZONTAL_PIXELS == event->size().height() / VIDEO_VERTICAL_PIXELS) { if (m_controller->isLoaded()) {
factor = event->size().width() / VIDEO_HORIZONTAL_PIXELS; 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<int, QAction*>::iterator iter = m_frameSizes.begin(); iter != m_frameSizes.end(); ++iter) { for (QMap<int, QAction*>::iterator iter = m_frameSizes.begin(); iter != m_frameSizes.end(); ++iter) {
bool enableSignals = iter.value()->blockSignals(true); bool enableSignals = iter.value()->blockSignals(true);
@ -506,7 +510,7 @@ void Window::resizeEvent(QResizeEvent* event) {
} }
void Window::showEvent(QShowEvent* 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"); QVariant windowPos = m_config->getQtOption("windowPos");
if (!windowPos.isNull()) { if (!windowPos.isNull()) {
move(windowPos.toPoint()); move(windowPos.toPoint());
@ -612,12 +616,18 @@ void Window::gameStarted(mCoreThread* context, const QString& fname) {
foreach (QAction* action, m_gameActions) { foreach (QAction* action, m_gameActions) {
action->setDisabled(false); action->setDisabled(false);
} }
foreach (QAction* action, m_gbaActions) {
action->setDisabled(context->core->platform(context->core) != PLATFORM_GBA);
}
multiplayerChanged(); multiplayerChanged();
if (!fname.isEmpty()) { if (!fname.isEmpty()) {
setWindowFilePath(fname); setWindowFilePath(fname);
appendMRU(fname); appendMRU(fname);
} }
updateTitle(); updateTitle();
unsigned width, height;
context->core->desiredVideoDimensions(context->core, &width, &height);
m_display->setMinimumSize(width, height);
attachWidget(m_display); attachWidget(m_display);
#ifndef Q_OS_MAC #ifndef Q_OS_MAC
@ -632,6 +642,9 @@ void Window::gameStarted(mCoreThread* context, const QString& fname) {
} }
void Window::gameStopped() { void Window::gameStopped() {
foreach (QAction* action, m_gbaActions) {
action->setDisabled(false);
}
foreach (QAction* action, m_gameActions) { foreach (QAction* action, m_gameActions) {
action->setDisabled(true); action->setDisabled(true);
} }
@ -799,6 +812,7 @@ void Window::setupMenu(QMenuBar* menubar) {
connect(loadState, &QAction::triggered, [this]() { this->openStateWindow(LoadSave::LOAD); }); connect(loadState, &QAction::triggered, [this]() { this->openStateWindow(LoadSave::LOAD); });
m_gameActions.append(loadState); m_gameActions.append(loadState);
m_nonMpActions.append(loadState); m_nonMpActions.append(loadState);
m_gbaActions.append(loadState);
addControlledAction(fileMenu, loadState, "loadState"); addControlledAction(fileMenu, loadState, "loadState");
QAction* saveState = new QAction(tr("&Save state"), fileMenu); 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); }); connect(saveState, &QAction::triggered, [this]() { this->openStateWindow(LoadSave::SAVE); });
m_gameActions.append(saveState); m_gameActions.append(saveState);
m_nonMpActions.append(saveState); m_nonMpActions.append(saveState);
m_gbaActions.append(saveState);
addControlledAction(fileMenu, saveState, "saveState"); addControlledAction(fileMenu, saveState, "saveState");
QMenu* quickLoadMenu = fileMenu->addMenu(tr("Quick load")); QMenu* quickLoadMenu = fileMenu->addMenu(tr("Quick load"));
@ -817,12 +832,14 @@ void Window::setupMenu(QMenuBar* menubar) {
connect(quickLoad, SIGNAL(triggered()), m_controller, SLOT(loadState())); connect(quickLoad, SIGNAL(triggered()), m_controller, SLOT(loadState()));
m_gameActions.append(quickLoad); m_gameActions.append(quickLoad);
m_nonMpActions.append(quickLoad); m_nonMpActions.append(quickLoad);
m_gbaActions.append(quickLoad);
addControlledAction(quickLoadMenu, quickLoad, "quickLoad"); addControlledAction(quickLoadMenu, quickLoad, "quickLoad");
QAction* quickSave = new QAction(tr("Save recent"), quickSaveMenu); QAction* quickSave = new QAction(tr("Save recent"), quickSaveMenu);
connect(quickSave, SIGNAL(triggered()), m_controller, SLOT(saveState())); connect(quickSave, SIGNAL(triggered()), m_controller, SLOT(saveState()));
m_gameActions.append(quickSave); m_gameActions.append(quickSave);
m_nonMpActions.append(quickSave); m_nonMpActions.append(quickSave);
m_gbaActions.append(quickSave);
addControlledAction(quickSaveMenu, quickSave, "quickSave"); addControlledAction(quickSaveMenu, quickSave, "quickSave");
quickLoadMenu->addSeparator(); quickLoadMenu->addSeparator();
@ -833,6 +850,7 @@ void Window::setupMenu(QMenuBar* menubar) {
connect(undoLoadState, SIGNAL(triggered()), m_controller, SLOT(loadBackupState())); connect(undoLoadState, SIGNAL(triggered()), m_controller, SLOT(loadBackupState()));
m_gameActions.append(undoLoadState); m_gameActions.append(undoLoadState);
m_nonMpActions.append(undoLoadState); m_nonMpActions.append(undoLoadState);
m_gbaActions.append(undoLoadState);
addControlledAction(quickLoadMenu, undoLoadState, "undoLoadState"); addControlledAction(quickLoadMenu, undoLoadState, "undoLoadState");
QAction* undoSaveState = new QAction(tr("Undo save state"), quickSaveMenu); 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())); connect(undoSaveState, SIGNAL(triggered()), m_controller, SLOT(saveBackupState()));
m_gameActions.append(undoSaveState); m_gameActions.append(undoSaveState);
m_nonMpActions.append(undoSaveState); m_nonMpActions.append(undoSaveState);
m_gbaActions.append(undoSaveState);
addControlledAction(quickSaveMenu, undoSaveState, "undoSaveState"); addControlledAction(quickSaveMenu, undoSaveState, "undoSaveState");
quickLoadMenu->addSeparator(); quickLoadMenu->addSeparator();
@ -852,6 +871,7 @@ void Window::setupMenu(QMenuBar* menubar) {
connect(quickLoad, &QAction::triggered, [this, i]() { m_controller->loadState(i); }); connect(quickLoad, &QAction::triggered, [this, i]() { m_controller->loadState(i); });
m_gameActions.append(quickLoad); m_gameActions.append(quickLoad);
m_nonMpActions.append(quickLoad); m_nonMpActions.append(quickLoad);
m_gbaActions.append(quickLoad);
addControlledAction(quickLoadMenu, quickLoad, QString("quickLoad.%1").arg(i)); addControlledAction(quickLoadMenu, quickLoad, QString("quickLoad.%1").arg(i));
quickSave = new QAction(tr("State &%1").arg(i), quickSaveMenu); 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); }); connect(quickSave, &QAction::triggered, [this, i]() { m_controller->saveState(i); });
m_gameActions.append(quickSave); m_gameActions.append(quickSave);
m_nonMpActions.append(quickSave); m_nonMpActions.append(quickSave);
m_gbaActions.append(quickSave);
addControlledAction(quickSaveMenu, quickSave, QString("quickSave.%1").arg(i)); 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); QAction* importShark = new QAction(tr("Import GameShark Save"), fileMenu);
connect(importShark, SIGNAL(triggered()), this, SLOT(importSharkport())); connect(importShark, SIGNAL(triggered()), this, SLOT(importSharkport()));
m_gameActions.append(importShark); m_gameActions.append(importShark);
m_gbaActions.append(importShark);
addControlledAction(fileMenu, importShark, "importShark"); addControlledAction(fileMenu, importShark, "importShark");
QAction* exportShark = new QAction(tr("Export GameShark Save"), fileMenu); QAction* exportShark = new QAction(tr("Export GameShark Save"), fileMenu);
connect(exportShark, SIGNAL(triggered()), this, SLOT(exportSharkport())); connect(exportShark, SIGNAL(triggered()), this, SLOT(exportSharkport()));
m_gameActions.append(exportShark); m_gameActions.append(exportShark);
m_gbaActions.append(exportShark);
addControlledAction(fileMenu, exportShark, "exportShark"); addControlledAction(fileMenu, exportShark, "exportShark");
fileMenu->addSeparator(); fileMenu->addSeparator();
@ -908,6 +931,7 @@ void Window::setupMenu(QMenuBar* menubar) {
QAction* yank = new QAction(tr("Yank game pak"), emulationMenu); QAction* yank = new QAction(tr("Yank game pak"), emulationMenu);
connect(yank, SIGNAL(triggered()), m_controller, SLOT(yankPak())); connect(yank, SIGNAL(triggered()), m_controller, SLOT(yankPak()));
m_gameActions.append(yank); m_gameActions.append(yank);
m_gbaActions.append(yank);
addControlledAction(emulationMenu, yank, "yank"); addControlledAction(emulationMenu, yank, "yank");
emulationMenu->addSeparator(); emulationMenu->addSeparator();
@ -1032,7 +1056,12 @@ void Window::setupMenu(QMenuBar* menubar) {
setSize->setCheckable(true); setSize->setCheckable(true);
connect(setSize, &QAction::triggered, [this, i, setSize]() { connect(setSize, &QAction::triggered, [this, i, setSize]() {
showNormal(); 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); bool enableSignals = setSize->blockSignals(true);
setSize->setChecked(true); setSize->setChecked(true);
setSize->blockSignals(enableSignals); setSize->blockSignals(enableSignals);
@ -1174,6 +1203,7 @@ void Window::setupMenu(QMenuBar* menubar) {
QAction* overrides = new QAction(tr("Game &overrides..."), toolsMenu); QAction* overrides = new QAction(tr("Game &overrides..."), toolsMenu);
connect(overrides, SIGNAL(triggered()), this, SLOT(openOverrideWindow())); connect(overrides, SIGNAL(triggered()), this, SLOT(openOverrideWindow()));
m_gbaActions.append(overrides);
addControlledAction(toolsMenu, overrides, "overrideWindow"); addControlledAction(toolsMenu, overrides, "overrideWindow");
QAction* sensors = new QAction(tr("Game &Pak sensors..."), toolsMenu); 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); QAction* cheats = new QAction(tr("&Cheats..."), toolsMenu);
connect(cheats, SIGNAL(triggered()), this, SLOT(openCheatsWindow())); connect(cheats, SIGNAL(triggered()), this, SLOT(openCheatsWindow()));
m_gbaActions.append(cheats);
addControlledAction(toolsMenu, cheats, "cheatsWindow"); addControlledAction(toolsMenu, cheats, "cheatsWindow");
#ifdef USE_GDB_STUB #ifdef USE_GDB_STUB
QAction* gdbWindow = new QAction(tr("Start &GDB server..."), toolsMenu); QAction* gdbWindow = new QAction(tr("Start &GDB server..."), toolsMenu);
connect(gdbWindow, SIGNAL(triggered()), this, SLOT(gdbOpen())); connect(gdbWindow, SIGNAL(triggered()), this, SLOT(gdbOpen()));
m_gbaActions.append(gdbWindow);
addControlledAction(toolsMenu, gdbWindow, "gdbWindow"); addControlledAction(toolsMenu, gdbWindow, "gdbWindow");
#endif #endif
@ -1199,16 +1231,19 @@ void Window::setupMenu(QMenuBar* menubar) {
QAction* paletteView = new QAction(tr("View &palette..."), toolsMenu); QAction* paletteView = new QAction(tr("View &palette..."), toolsMenu);
connect(paletteView, SIGNAL(triggered()), this, SLOT(openPaletteWindow())); connect(paletteView, SIGNAL(triggered()), this, SLOT(openPaletteWindow()));
m_gameActions.append(paletteView); m_gameActions.append(paletteView);
m_gbaActions.append(paletteView);
addControlledAction(toolsMenu, paletteView, "paletteWindow"); addControlledAction(toolsMenu, paletteView, "paletteWindow");
QAction* memoryView = new QAction(tr("View memory..."), toolsMenu); QAction* memoryView = new QAction(tr("View memory..."), toolsMenu);
connect(memoryView, SIGNAL(triggered()), this, SLOT(openMemoryWindow())); connect(memoryView, SIGNAL(triggered()), this, SLOT(openMemoryWindow()));
m_gameActions.append(memoryView); m_gameActions.append(memoryView);
m_gbaActions.append(memoryView);
addControlledAction(toolsMenu, memoryView, "memoryView"); addControlledAction(toolsMenu, memoryView, "memoryView");
QAction* ioViewer = new QAction(tr("View &I/O registers..."), toolsMenu); QAction* ioViewer = new QAction(tr("View &I/O registers..."), toolsMenu);
connect(ioViewer, SIGNAL(triggered()), this, SLOT(openIOViewer())); connect(ioViewer, SIGNAL(triggered()), this, SLOT(openIOViewer()));
m_gameActions.append(ioViewer); m_gameActions.append(ioViewer);
m_gbaActions.append(ioViewer);
addControlledAction(toolsMenu, ioViewer, "ioViewer"); addControlledAction(toolsMenu, ioViewer, "ioViewer");
ConfigOption* skipBios = m_config->addOption("skipBios"); ConfigOption* skipBios = m_config->addOption("skipBios");

View File

@ -47,7 +47,7 @@ public:
void setConfig(ConfigController*); void setConfig(ConfigController*);
void argumentsPassed(mArguments*); void argumentsPassed(mArguments*);
void resizeFrame(int width, int height); void resizeFrame(const QSize& size);
signals: signals:
void startDrawing(mCoreThread*); void startDrawing(mCoreThread*);
@ -146,8 +146,10 @@ private:
GameController* m_controller; GameController* m_controller;
Display* m_display; Display* m_display;
// TODO: Move these to a new class
QList<QAction*> m_gameActions; QList<QAction*> m_gameActions;
QList<QAction*> m_nonMpActions; QList<QAction*> m_nonMpActions;
QList<QAction*> m_gbaActions;
QMap<int, QAction*> m_frameSizes; QMap<int, QAction*> m_frameSizes;
LogController m_log; LogController m_log;
LogView* m_logView; LogView* m_logView;