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;
typedef void (*LR35902Instruction)(struct LR35902Core*);
const LR35902Instruction _lr35902InstructionTable[0x100];
extern const LR35902Instruction _lr35902InstructionTable[0x100];
#endif

View File

@ -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);

View File

@ -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();

View File

@ -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);

View File

@ -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;

View File

@ -16,6 +16,7 @@
#include <memory>
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; }

View File

@ -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<GBA*>(thread->core->board);
m_ui.savetype->setCurrentIndex(gba->memory.savedata.type + 1);
m_ui.savetype->setEnabled(false);

View File

@ -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<int, QAction*>::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");

View File

@ -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<QAction*> m_gameActions;
QList<QAction*> m_nonMpActions;
QList<QAction*> m_gbaActions;
QMap<int, QAction*> m_frameSizes;
LogController m_log;
LogView* m_logView;