all repos — mgba @ e81ed20a144be7e9952abc0b91d235cf0d11ad39

mGBA Game Boy Advance Emulator

Qt: GB Override view
Jeffrey Pfau jeffrey@endrift.com
Sat, 10 Sep 2016 08:35:50 -0700
commit

e81ed20a144be7e9952abc0b91d235cf0d11ad39

parent

1bc8dfe42b7fb819a1e0585474356a11d0975972

M src/gb/gb.csrc/gb/gb.c

@@ -265,20 +265,35 @@ if (gb->biosVf) {

gb->biosVf->seek(gb->biosVf, 0, SEEK_SET); gb->memory.romBase = malloc(GB_SIZE_CART_BANK0); ssize_t size = gb->biosVf->read(gb->biosVf, gb->memory.romBase, GB_SIZE_CART_BANK0); + uint32_t biosCrc = doCrc32(gb->memory.romBase, size); + switch (biosCrc) { + case 0x59C8598E: + break; + case 0x41884E46: + break; + default: + gb->biosVf->close(gb->biosVf); + gb->biosVf = NULL; + free(gb->memory.romBase); + gb->memory.romBase = gb->memory.rom; + break; + } - memcpy(&gb->memory.romBase[size], &gb->memory.rom[size], GB_SIZE_CART_BANK0 - size); - if (size > 0x100) { - memcpy(&gb->memory.romBase[0x100], &gb->memory.rom[0x100], sizeof(struct GBCartridge)); + if (gb->biosVf) { + memcpy(&gb->memory.romBase[size], &gb->memory.rom[size], GB_SIZE_CART_BANK0 - size); + if (size > 0x100) { + memcpy(&gb->memory.romBase[0x100], &gb->memory.rom[0x100], sizeof(struct GBCartridge)); + } + + cpu->a = 0; + cpu->f.packed = 0; + cpu->c = 0; + cpu->e = 0; + cpu->h = 0; + cpu->l = 0; + cpu->sp = 0; + cpu->pc = 0; } - - cpu->a = 0; - cpu->f.packed = 0; - cpu->c = 0; - cpu->e = 0; - cpu->h = 0; - cpu->l = 0; - cpu->sp = 0; - cpu->pc = 0; } cpu->b = 0;

@@ -298,10 +313,10 @@ cpu->e = 0xD8;

cpu->h = 1; cpu->l = 0x4D; break; - case GB_MODEL_CGB: + case GB_MODEL_AGB: cpu->b = 1; // Fall through - case GB_MODEL_AGB: // Silence warnings + case GB_MODEL_CGB: cpu->a = 0x11; cpu->f.packed = 0x80; cpu->c = 0;
M src/platform/qt/CMakeLists.txtsrc/platform/qt/CMakeLists.txt

@@ -129,6 +129,12 @@ ShortcutView.ui

TileView.ui VideoView.ui) +set(GBA_SRC + GBAOverride.cpp) + +set(GB_SRC + GBOverride.cpp) + qt5_wrap_ui(UI_SRC ${UI_FILES}) set(QT_LIBRARIES)

@@ -137,6 +143,14 @@

set(AUDIO_SRC) if(BUILD_SDL) list(APPEND AUDIO_SRC AudioProcessorSDL.cpp) +endif() + +if(M_CORE_GBA) + list(APPEND PLATFORM_SRC ${GBA_SRC}) +endif() + +if(M_CORE_GB) + list(APPEND PLATFORM_SRC ${GB_SRC}) endif() set(QT_DEFINES)
M src/platform/qt/ConfigController.cppsrc/platform/qt/ConfigController.cpp

@@ -12,7 +12,6 @@ #include <QDir>

#include <QMenu> extern "C" { -#include "gba/overrides.h" #include "feature/commandline.h" }

@@ -177,8 +176,8 @@ }

return value; } -void ConfigController::saveOverride(const GBACartridgeOverride& override) { - GBAOverrideSave(overrides(), &override); +void ConfigController::saveOverride(const Override& override) { + override.save(overrides()); write(); }
M src/platform/qt/ConfigController.hsrc/platform/qt/ConfigController.h

@@ -6,6 +6,8 @@ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */

#ifndef QGBA_CONFIG_CONTROLLER #define QGBA_CONFIG_CONTROLLER +#include "Override.h" + #include <QMap> #include <QObject> #include <QSettings>

@@ -78,7 +80,7 @@ QList<QString> getMRU() const;

void setMRU(const QList<QString>& mru); Configuration* overrides() { return mCoreConfigGetOverrides(&m_config); } - void saveOverride(const GBACartridgeOverride&); + void saveOverride(const Override&); Configuration* input() { return mCoreConfigGetInput(&m_config); }
A src/platform/qt/GBAOverride.cpp

@@ -0,0 +1,23 @@

+/* Copyright (c) 2013-2016 Jeffrey Pfau + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ +#include "GBAOverride.h" + +extern "C" { +#include "core/core.h" +} + +using namespace QGBA; + +void GBAOverride::apply(struct mCore* core) { + if (core->platform(core) != PLATFORM_GBA) { + return; + } + GBAOverrideApply(static_cast<GBA*>(core->board), &override); +} + +void GBAOverride::save(struct Configuration* config) const { + GBAOverrideSave(config, &override); +}
A src/platform/qt/GBAOverride.h

@@ -0,0 +1,27 @@

+/* Copyright (c) 2013-2016 Jeffrey Pfau + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ +#ifndef QGBA_GBA_OVERRIDE +#define QGBA_GBA_OVERRIDE + +#include "Override.h" + +extern "C" { +#include "gba/overrides.h" +} + +namespace QGBA { + +class GBAOverride : public Override { +public: + void apply(struct mCore*) override; + void save(struct Configuration*) const override; + + struct GBACartridgeOverride override; +}; + +} + +#endif
A src/platform/qt/GBOverride.cpp

@@ -0,0 +1,23 @@

+/* Copyright (c) 2013-2016 Jeffrey Pfau + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ +#include "GBOverride.h" + +extern "C" { +#include "core/core.h" +} + +using namespace QGBA; + +void GBOverride::apply(struct mCore* core) { + if (core->platform(core) != PLATFORM_GB) { + return; + } + GBOverrideApply(static_cast<GB*>(core->board), &override); +} + +void GBOverride::save(struct Configuration* config) const { + GBOverrideSave(config, &override); +}
A src/platform/qt/GBOverride.h

@@ -0,0 +1,27 @@

+/* Copyright (c) 2013-2016 Jeffrey Pfau + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ +#ifndef QGBA_GB_OVERRIDE +#define QGBA_GB_OVERRIDE + +#include "Override.h" + +extern "C" { +#include "gb/overrides.h" +} + +namespace QGBA { + +class GBOverride : public Override { +public: + void apply(struct mCore*) override; + void save(struct Configuration*) const override; + + struct GBCartridgeOverride override; +}; + +} + +#endif
M src/platform/qt/GameController.cppsrc/platform/qt/GameController.cpp

@@ -70,6 +70,7 @@ , m_backupLoadState(nullptr)

, m_backupSaveState(nullptr) , m_saveStateFlags(SAVESTATE_SCREENSHOT | SAVESTATE_SAVEDATA | SAVESTATE_CHEATS) , m_loadStateFlags(SAVESTATE_SCREENSHOT) + , m_override(nullptr) { #ifdef M_CORE_GBA m_lux.p = this;

@@ -283,8 +284,9 @@ m_multiplayer->detachGame(this);

m_multiplayer = nullptr; } -void GameController::setOverride(const GBACartridgeOverride& override) { - // TODO: Put back overrides +void GameController::clearOverride() { + delete m_override; + m_override = nullptr; } void GameController::setConfig(const mCoreConfig* config) {

@@ -433,6 +435,10 @@ mCoreAutoloadPatch(m_threadContext.core);

} } m_vf = nullptr; + + if (m_override) { + m_override->apply(m_threadContext.core); + } if (!mCoreThreadStart(&m_threadContext)) { emit gameFailed();
M src/platform/qt/GameController.hsrc/platform/qt/GameController.h

@@ -39,6 +39,7 @@

class AudioProcessor; class InputController; class MultiplayerController; +class Override; class GameController : public QObject { Q_OBJECT

@@ -71,8 +72,9 @@ void setMultiplayerController(MultiplayerController* controller);

MultiplayerController* multiplayerController() { return m_multiplayer; } void clearMultiplayerController(); - void setOverride(const GBACartridgeOverride& override); - void clearOverride() { /* TODO: Put back overrides */ } + void setOverride(Override* override) { m_override = override; } + Override* override() { return m_override; } + void clearOverride(); void setConfig(const mCoreConfig*);

@@ -191,6 +193,7 @@ VFile* m_vf;

QString m_bios; bool m_useBios; QString m_patch; + Override* m_override; QThread* m_audioThread; AudioProcessor* m_audioProcessor;
M src/platform/qt/OverrideView.cppsrc/platform/qt/OverrideView.cpp

@@ -1,4 +1,4 @@

-/* Copyright (c) 2013-2015 Jeffrey Pfau +/* Copyright (c) 2013-2016 Jeffrey Pfau * * This Source Code Form is subject to the terms of the Mozilla Public * License, v. 2.0. If a copy of the MPL was not distributed with this

@@ -8,17 +8,52 @@

#include "ConfigController.h" #include "GameController.h" +#ifdef M_CORE_GBA +#include "GBAOverride.h" extern "C" { #include "gba/gba.h" } +#endif + +#ifdef M_CORE_GB +#include "GBOverride.h" +extern "C" { +#include "gb/gb.h" +} +#endif using namespace QGBA; + +QList<enum GBModel> OverrideView::s_gbModelList; +QList<enum GBMemoryBankControllerType> OverrideView::s_mbcList; OverrideView::OverrideView(GameController* controller, ConfigController* config, QWidget* parent) : QDialog(parent, Qt::WindowTitleHint | Qt::WindowSystemMenuHint | Qt::WindowCloseButtonHint) , m_controller(controller) , m_config(config) { +#ifdef M_CORE_GB + if (s_mbcList.isEmpty()) { + // NB: Keep in sync with OverrideView.ui + s_mbcList.append(GB_MBC_AUTODETECT); + s_mbcList.append(GB_MBC_NONE); + s_mbcList.append(GB_MBC1); + s_mbcList.append(GB_MBC2); + s_mbcList.append(GB_MBC3); + s_mbcList.append(GB_MBC3_RTC); + s_mbcList.append(GB_MBC5); + s_mbcList.append(GB_MBC5_RUMBLE); + s_mbcList.append(GB_MBC7); + s_mbcList.append(GB_HuC3); + } + if (s_gbModelList.isEmpty()) { + // NB: Keep in sync with OverrideView.ui + s_gbModelList.append(GB_MODEL_AUTODETECT); + s_gbModelList.append(GB_MODEL_DMG); + s_gbModelList.append(GB_MODEL_CGB); + s_gbModelList.append(GB_MODEL_AGB); + } +#endif m_ui.setupUi(this); connect(controller, SIGNAL(gameStarted(mCoreThread*, const QString&)), this, SLOT(gameStarted(mCoreThread*)));

@@ -41,7 +76,18 @@ connect(m_ui.hwTilt, SIGNAL(clicked()), this, SLOT(updateOverrides()));

connect(m_ui.hwRumble, SIGNAL(clicked()), this, SLOT(updateOverrides())); connect(m_ui.hwGBPlayer, SIGNAL(clicked()), this, SLOT(updateOverrides())); - connect(m_ui.save, SIGNAL(clicked()), this, SLOT(saveOverride())); + connect(m_ui.gbModel, SIGNAL(currentIndexChanged(int)), this, SLOT(updateOverrides())); + connect(m_ui.mbc, SIGNAL(currentIndexChanged(int)), this, SLOT(updateOverrides())); + + connect(m_ui.tabWidget, SIGNAL(currentChanged(int)), this, SLOT(updateOverrides())); +#ifndef M_CORE_GBA + m_ui.tabWidget->removeTab(m_ui.tabWidget->indexOf(m_ui.tabGBA)); +#endif +#ifndef M_CORE_GB + m_ui.tabWidget->removeTab(m_ui.tabWidget->indexOf(m_ui.tabGB)); +#endif + + connect(m_ui.buttonBox, SIGNAL(accepted()), this, SLOT(saveOverride())); if (controller->isLoaded()) { gameStarted(controller->thread());

@@ -52,50 +98,67 @@ void OverrideView::saveOverride() {

if (!m_config) { return; } - m_config->saveOverride(m_override); + m_config->saveOverride(*m_controller->override()); } void OverrideView::updateOverrides() { - memset(m_override.id, 0, 4); - m_override.savetype = static_cast<SavedataType>(m_ui.savetype->currentIndex() - 1); - m_override.hardware = HW_NO_OVERRIDE; - m_override.idleLoop = IDLE_LOOP_NONE; - m_override.mirroring = false; +#ifdef M_CORE_GBA + if (m_ui.tabWidget->currentWidget() == m_ui.tabGBA) { + GBAOverride* gba = new GBAOverride; + memset(gba->override.id, 0, 4); + gba->override.savetype = static_cast<SavedataType>(m_ui.savetype->currentIndex() - 1); + gba->override.hardware = HW_NO_OVERRIDE; + gba->override.idleLoop = IDLE_LOOP_NONE; + gba->override.mirroring = false; - if (!m_ui.hwAutodetect->isChecked()) { - m_override.hardware = HW_NONE; - if (m_ui.hwRTC->isChecked()) { - m_override.hardware |= HW_RTC; + if (!m_ui.hwAutodetect->isChecked()) { + gba->override.hardware = HW_NONE; + if (m_ui.hwRTC->isChecked()) { + gba->override.hardware |= HW_RTC; + } + if (m_ui.hwGyro->isChecked()) { + gba->override.hardware |= HW_GYRO; + } + if (m_ui.hwLight->isChecked()) { + gba->override.hardware |= HW_LIGHT_SENSOR; + } + if (m_ui.hwTilt->isChecked()) { + gba->override.hardware |= HW_TILT; + } + if (m_ui.hwRumble->isChecked()) { + gba->override.hardware |= HW_RUMBLE; + } } - if (m_ui.hwGyro->isChecked()) { - m_override.hardware |= HW_GYRO; - } - if (m_ui.hwLight->isChecked()) { - m_override.hardware |= HW_LIGHT_SENSOR; - } - if (m_ui.hwTilt->isChecked()) { - m_override.hardware |= HW_TILT; + if (m_ui.hwGBPlayer->isChecked()) { + gba->override.hardware |= HW_GB_PLAYER_DETECTION; } - if (m_ui.hwRumble->isChecked()) { - m_override.hardware |= HW_RUMBLE; + + bool ok; + uint32_t parsedIdleLoop = m_ui.idleLoop->text().toInt(&ok, 16); + if (ok) { + gba->override.idleLoop = parsedIdleLoop; } - } - if (m_ui.hwGBPlayer->isChecked()) { - m_override.hardware |= HW_GB_PLAYER_DETECTION; - } - bool ok; - uint32_t parsedIdleLoop = m_ui.idleLoop->text().toInt(&ok, 16); - if (ok) { - m_override.idleLoop = parsedIdleLoop; + if (gba->override.savetype != SAVEDATA_AUTODETECT || gba->override.hardware != HW_NO_OVERRIDE || + gba->override.idleLoop != IDLE_LOOP_NONE) { + m_controller->setOverride(gba); + } else { + m_controller->clearOverride(); + } } - - if (m_override.savetype != SAVEDATA_AUTODETECT || m_override.hardware != HW_NO_OVERRIDE || - m_override.idleLoop != IDLE_LOOP_NONE) { - m_controller->setOverride(m_override); - } else { - m_controller->clearOverride(); +#endif +#ifdef M_CORE_GB + if (m_ui.tabWidget->currentWidget() == m_ui.tabGB) { + GBOverride* gb = new GBOverride; + gb->override.mbc = s_mbcList[m_ui.mbc->currentIndex()]; + gb->override.model = s_gbModelList[m_ui.gbModel->currentIndex()]; + if (gb->override.mbc != GB_MBC_AUTODETECT || gb->override.model != GB_MODEL_AUTODETECT) { + m_controller->setOverride(gb); + } else { + m_controller->clearOverride(); + } } +#endif } void OverrideView::gameStarted(mCoreThread* thread) {

@@ -103,66 +166,61 @@ if (!thread->core) {

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); - m_ui.hwAutodetect->setEnabled(false); - m_ui.hwRTC->setEnabled(false); - m_ui.hwGyro->setEnabled(false); - m_ui.hwLight->setEnabled(false); - m_ui.hwTilt->setEnabled(false); - m_ui.hwRumble->setEnabled(false); + m_ui.tabWidget->setEnabled(false); - m_ui.hwRTC->setChecked(gba->memory.hw.devices & HW_RTC); - m_ui.hwGyro->setChecked(gba->memory.hw.devices & HW_GYRO); - m_ui.hwLight->setChecked(gba->memory.hw.devices & HW_LIGHT_SENSOR); - m_ui.hwTilt->setChecked(gba->memory.hw.devices & HW_TILT); - m_ui.hwRumble->setChecked(gba->memory.hw.devices & HW_RUMBLE); - m_ui.hwGBPlayer->setChecked(gba->memory.hw.devices & HW_GB_PLAYER_DETECTION); + switch (thread->core->platform(thread->core)) { +#ifdef M_CORE_GBA + case PLATFORM_GBA: { + m_ui.tabWidget->setCurrentWidget(m_ui.tabGBA); + GBA* gba = static_cast<GBA*>(thread->core->board); + m_ui.savetype->setCurrentIndex(gba->memory.savedata.type + 1); + m_ui.hwRTC->setChecked(gba->memory.hw.devices & HW_RTC); + m_ui.hwGyro->setChecked(gba->memory.hw.devices & HW_GYRO); + m_ui.hwLight->setChecked(gba->memory.hw.devices & HW_LIGHT_SENSOR); + m_ui.hwTilt->setChecked(gba->memory.hw.devices & HW_TILT); + m_ui.hwRumble->setChecked(gba->memory.hw.devices & HW_RUMBLE); + m_ui.hwGBPlayer->setChecked(gba->memory.hw.devices & HW_GB_PLAYER_DETECTION); - if (gba->idleLoop != IDLE_LOOP_NONE) { - m_ui.idleLoop->setText(QString::number(gba->idleLoop, 16)); - } else { - m_ui.idleLoop->clear(); + if (gba->idleLoop != IDLE_LOOP_NONE) { + m_ui.idleLoop->setText(QString::number(gba->idleLoop, 16)); + } else { + m_ui.idleLoop->clear(); + } + break; + } +#endif +#ifdef M_CORE_GB + case PLATFORM_GB: { + m_ui.tabWidget->setCurrentWidget(m_ui.tabGB); + GB* gb = static_cast<GB*>(thread->core->board); + int mbc = s_mbcList.indexOf(gb->memory.mbcType); + if (mbc >= 0) { + m_ui.mbc->setCurrentIndex(mbc); + } else { + m_ui.mbc->setCurrentIndex(0); + } + int model = s_gbModelList.indexOf(gb->model); + if (model >= 0) { + m_ui.gbModel->setCurrentIndex(model); + } else { + m_ui.gbModel->setCurrentIndex(0); + } + break; } - - GBAGetGameCode(gba, m_override.id); - m_override.hardware = gba->memory.hw.devices; - m_override.savetype = gba->memory.savedata.type; - m_override.idleLoop = gba->idleLoop; - - m_ui.idleLoop->setEnabled(false); - - m_ui.save->setEnabled(m_config); +#endif + case PLATFORM_NONE: + break; + } } void OverrideView::gameStopped() { + m_ui.tabWidget->setEnabled(true); m_ui.savetype->setCurrentIndex(0); - m_ui.savetype->setEnabled(true); - - m_ui.hwAutodetect->setEnabled(true); - m_ui.hwRTC->setEnabled(!m_ui.hwAutodetect->isChecked()); - m_ui.hwGyro->setEnabled(!m_ui.hwAutodetect->isChecked()); - m_ui.hwLight->setEnabled(!m_ui.hwAutodetect->isChecked()); - m_ui.hwTilt->setEnabled(!m_ui.hwAutodetect->isChecked()); - m_ui.hwRumble->setEnabled(!m_ui.hwAutodetect->isChecked()); - - m_ui.hwAutodetect->setChecked(true); - m_ui.hwRTC->setChecked(false); - m_ui.hwGyro->setChecked(false); - m_ui.hwLight->setChecked(false); - m_ui.hwTilt->setChecked(false); - m_ui.hwRumble->setChecked(false); - - m_ui.idleLoop->setEnabled(true); m_ui.idleLoop->clear(); - m_ui.save->setEnabled(false); + m_ui.mbc->setCurrentIndex(0); + m_ui.gbModel->setCurrentIndex(0); updateOverrides(); }
M src/platform/qt/OverrideView.hsrc/platform/qt/OverrideView.h

@@ -8,11 +8,13 @@ #define QGBA_OVERRIDE_VIEW

#include <QDialog> -#include "ui_OverrideView.h" - +#ifdef M_CORE_GB extern "C" { -#include "gba/overrides.h" +#include "gb/overrides.h" } +#endif + +#include "ui_OverrideView.h" struct mCoreThread;

@@ -20,6 +22,7 @@ namespace QGBA {

class ConfigController; class GameController; +class Override; class OverrideView : public QDialog { Q_OBJECT

@@ -40,7 +43,11 @@ Ui::OverrideView m_ui;

GameController* m_controller; ConfigController* m_config; - GBACartridgeOverride m_override; + +#ifdef M_CORE_GB + static QList<enum GBModel> s_gbModelList; + static QList<enum GBMemoryBankControllerType> s_mbcList; +#endif }; }
M src/platform/qt/OverrideView.uisrc/platform/qt/OverrideView.ui

@@ -6,8 +6,8 @@ <property name="geometry">

<rect> <x>0</x> <y>0</y> - <width>401</width> - <height>203</height> + <width>443</width> + <height>282</height> </rect> </property> <property name="sizePolicy">

@@ -19,232 +19,322 @@ </property>

<property name="windowTitle"> <string>Game Overrides</string> </property> - <layout class="QGridLayout" name="gridLayout_3"> - <property name="sizeConstraint"> - <enum>QLayout::SetFixedSize</enum> - </property> - <item row="4" column="1"> - <layout class="QHBoxLayout" name="horizontalLayout_2"> - <item> - <spacer name="horizontalSpacer_2"> - <property name="orientation"> - <enum>Qt::Horizontal</enum> - </property> - <property name="sizeHint" stdset="0"> - <size> - <width>0</width> - <height>0</height> - </size> - </property> - </spacer> - </item> - <item> - <widget class="QPushButton" name="save"> - <property name="enabled"> - <bool>false</bool> - </property> - <property name="text"> - <string>Save</string> - </property> - </widget> - </item> - </layout> - </item> - <item row="3" column="1"> - <spacer name="verticalSpacer"> - <property name="orientation"> - <enum>Qt::Vertical</enum> + <layout class="QVBoxLayout" name="verticalLayout"> + <item> + <widget class="QTabWidget" name="tabWidget"> + <property name="currentIndex"> + <number>0</number> </property> - <property name="sizeHint" stdset="0"> - <size> - <width>0</width> - <height>0</height> - </size> - </property> - </spacer> - </item> - <item row="2" column="1"> - <widget class="QGroupBox" name="groupBox_2"> - <property name="title"> - <string/> - </property> - <layout class="QVBoxLayout" name="verticalLayout_2"> - <item> - <layout class="QFormLayout" name="formLayout"> - <item row="0" column="0"> - <widget class="QLabel" name="label"> - <property name="text"> - <string>Save type</string> - </property> - </widget> - </item> - <item row="0" column="1"> - <widget class="QComboBox" name="savetype"> + <widget class="QWidget" name="tabGBA"> + <attribute name="title"> + <string>Game Boy Advance</string> + </attribute> + <layout class="QGridLayout" name="gridLayout"> + <item row="0" column="0" rowspan="3"> + <widget class="QGroupBox" name="groupBox"> + <property name="title"> + <string/> + </property> + <layout class="QVBoxLayout" name="verticalLayout_2"> <item> - <property name="text"> - <string>Autodetect</string> - </property> + <widget class="QCheckBox" name="hwAutodetect"> + <property name="text"> + <string>Autodetect</string> + </property> + <property name="checked"> + <bool>true</bool> + </property> + </widget> </item> <item> - <property name="text"> - <string>None</string> - </property> + <widget class="QCheckBox" name="hwRTC"> + <property name="enabled"> + <bool>false</bool> + </property> + <property name="text"> + <string>Realtime clock</string> + </property> + </widget> </item> <item> - <property name="text"> - <string>SRAM</string> - </property> + <widget class="QCheckBox" name="hwGyro"> + <property name="enabled"> + <bool>false</bool> + </property> + <property name="text"> + <string>Gyroscope</string> + </property> + </widget> </item> <item> - <property name="text"> - <string>Flash 512kb</string> - </property> + <widget class="QCheckBox" name="hwTilt"> + <property name="enabled"> + <bool>false</bool> + </property> + <property name="text"> + <string>Tilt</string> + </property> + </widget> </item> <item> - <property name="text"> - <string>Flash 1Mb</string> - </property> + <widget class="QCheckBox" name="hwLight"> + <property name="enabled"> + <bool>false</bool> + </property> + <property name="text"> + <string>Light sensor</string> + </property> + </widget> </item> <item> - <property name="text"> - <string>EEPROM</string> - </property> + <widget class="QCheckBox" name="hwRumble"> + <property name="enabled"> + <bool>false</bool> + </property> + <property name="text"> + <string>Rumble</string> + </property> + </widget> </item> - </widget> - </item> - <item row="2" column="0"> - <widget class="QLabel" name="label_3"> + </layout> + </widget> + </item> + <item row="0" column="1"> + <widget class="QGroupBox" name="groupBox_2"> + <property name="title"> + <string/> + </property> + <layout class="QVBoxLayout" name="verticalLayout_3"> + <item> + <layout class="QFormLayout" name="formLayout"> + <item row="0" column="0"> + <widget class="QLabel" name="label"> + <property name="text"> + <string>Save type</string> + </property> + </widget> + </item> + <item row="0" column="1"> + <widget class="QComboBox" name="savetype"> + <item> + <property name="text"> + <string>Autodetect</string> + </property> + </item> + <item> + <property name="text"> + <string>None</string> + </property> + </item> + <item> + <property name="text"> + <string>SRAM</string> + </property> + </item> + <item> + <property name="text"> + <string>Flash 512kb</string> + </property> + </item> + <item> + <property name="text"> + <string>Flash 1Mb</string> + </property> + </item> + <item> + <property name="text"> + <string>EEPROM</string> + </property> + </item> + </widget> + </item> + <item row="2" column="0"> + <widget class="QLabel" name="label_3"> + <property name="text"> + <string>Idle loop</string> + </property> + </widget> + </item> + <item row="2" column="1"> + <widget class="QLineEdit" name="idleLoop"/> + </item> + <item row="1" column="0" colspan="2"> + <widget class="Line" name="line"> + <property name="orientation"> + <enum>Qt::Horizontal</enum> + </property> + </widget> + </item> + </layout> + </item> + <item> + <widget class="Line" name="line_2"> + <property name="orientation"> + <enum>Qt::Horizontal</enum> + </property> + </widget> + </item> + <item> + <layout class="QHBoxLayout" name="horizontalLayout_2"> + <item> + <spacer name="horizontalSpacer"> + <property name="orientation"> + <enum>Qt::Horizontal</enum> + </property> + <property name="sizeHint" stdset="0"> + <size> + <width>0</width> + <height>0</height> + </size> + </property> + </spacer> + </item> + <item> + <widget class="QCheckBox" name="hwGBPlayer"> + <property name="text"> + <string>Game Boy Player features</string> + </property> + </widget> + </item> + <item> + <spacer name="horizontalSpacer_3"> + <property name="orientation"> + <enum>Qt::Horizontal</enum> + </property> + <property name="sizeHint" stdset="0"> + <size> + <width>0</width> + <height>0</height> + </size> + </property> + </spacer> + </item> + </layout> + </item> + </layout> + </widget> + </item> + <item row="1" column="1"> + <spacer name="verticalSpacer"> + <property name="orientation"> + <enum>Qt::Vertical</enum> + </property> + <property name="sizeHint" stdset="0"> + <size> + <width>0</width> + <height>0</height> + </size> + </property> + </spacer> + </item> + </layout> + </widget> + <widget class="QWidget" name="tabGB"> + <attribute name="title"> + <string>Game Boy</string> + </attribute> + <layout class="QFormLayout" name="formLayout_3"> + <item row="0" column="0"> + <widget class="QLabel" name="label_2"> + <property name="text"> + <string>Game Boy model</string> + </property> + </widget> + </item> + <item row="0" column="1"> + <widget class="QComboBox" name="gbModel"> + <item> <property name="text"> - <string>Idle loop</string> + <string>Autodetect</string> </property> - </widget> - </item> - <item row="2" column="1"> - <widget class="QLineEdit" name="idleLoop"/> - </item> - <item row="1" column="0" colspan="2"> - <widget class="Line" name="line"> - <property name="orientation"> - <enum>Qt::Horizontal</enum> + </item> + <item> + <property name="text"> + <string>Game Boy (DMG)</string> </property> - </widget> - </item> - </layout> - </item> - <item> - <widget class="Line" name="line_2"> - <property name="orientation"> - <enum>Qt::Horizontal</enum> - </property> - </widget> - </item> - <item> - <layout class="QHBoxLayout" name="horizontalLayout"> - <item> - <spacer name="horizontalSpacer"> - <property name="orientation"> - <enum>Qt::Horizontal</enum> + </item> + <item> + <property name="text"> + <string>Game Boy Color (CGB)</string> </property> - <property name="sizeHint" stdset="0"> - <size> - <width>0</width> - <height>0</height> - </size> + </item> + <item> + <property name="text"> + <string>Game Boy Advance (AGB)</string> </property> - </spacer> - </item> - <item> - <widget class="QCheckBox" name="hwGBPlayer"> + </item> + </widget> + </item> + <item row="1" column="0"> + <widget class="QLabel" name="label_4"> + <property name="text"> + <string>Memory bank controller</string> + </property> + </widget> + </item> + <item row="1" column="1"> + <widget class="QComboBox" name="mbc"> + <item> <property name="text"> - <string>Game Boy Player features</string> + <string>Autodetect</string> </property> - </widget> - </item> - <item> - <spacer name="horizontalSpacer_3"> - <property name="orientation"> - <enum>Qt::Horizontal</enum> + </item> + <item> + <property name="text"> + <string>None</string> </property> - <property name="sizeHint" stdset="0"> - <size> - <width>0</width> - <height>0</height> - </size> + </item> + <item> + <property name="text"> + <string>MBC1</string> + </property> + </item> + <item> + <property name="text"> + <string>MBC2</string> + </property> + </item> + <item> + <property name="text"> + <string>MBC3</string> + </property> + </item> + <item> + <property name="text"> + <string>MBC3 + RTC</string> </property> - </spacer> - </item> - </layout> - </item> - </layout> + </item> + <item> + <property name="text"> + <string>MBC5</string> + </property> + </item> + <item> + <property name="text"> + <string>MBC5 + Rumble</string> + </property> + </item> + <item> + <property name="text"> + <string>MBC7</string> + </property> + </item> + <item> + <property name="text"> + <string>HuC-3</string> + </property> + </item> + </widget> + </item> + </layout> + </widget> </widget> </item> - <item row="2" column="0" rowspan="3"> - <widget class="QGroupBox" name="groupBox"> - <property name="title"> - <string/> + <item> + <widget class="QDialogButtonBox" name="buttonBox"> + <property name="standardButtons"> + <set>QDialogButtonBox::Close|QDialogButtonBox::Save</set> </property> - <layout class="QVBoxLayout" name="verticalLayout"> - <item> - <widget class="QCheckBox" name="hwAutodetect"> - <property name="text"> - <string>Autodetect</string> - </property> - <property name="checked"> - <bool>true</bool> - </property> - </widget> - </item> - <item> - <widget class="QCheckBox" name="hwRTC"> - <property name="enabled"> - <bool>false</bool> - </property> - <property name="text"> - <string>Realtime clock</string> - </property> - </widget> - </item> - <item> - <widget class="QCheckBox" name="hwGyro"> - <property name="enabled"> - <bool>false</bool> - </property> - <property name="text"> - <string>Gyroscope</string> - </property> - </widget> - </item> - <item> - <widget class="QCheckBox" name="hwTilt"> - <property name="enabled"> - <bool>false</bool> - </property> - <property name="text"> - <string>Tilt</string> - </property> - </widget> - </item> - <item> - <widget class="QCheckBox" name="hwLight"> - <property name="enabled"> - <bool>false</bool> - </property> - <property name="text"> - <string>Light sensor</string> - </property> - </widget> - </item> - <item> - <widget class="QCheckBox" name="hwRumble"> - <property name="enabled"> - <bool>false</bool> - </property> - <property name="text"> - <string>Rumble</string> - </property> - </widget> - </item> - </layout> </widget> </item> </layout>
M src/platform/qt/Window.cppsrc/platform/qt/Window.cpp

@@ -1318,7 +1318,6 @@

#ifdef M_CORE_GBA QAction* overrides = new QAction(tr("Game &overrides..."), toolsMenu); connect(overrides, SIGNAL(triggered()), this, SLOT(openOverrideWindow())); - m_gbaActions.append(overrides); addControlledAction(toolsMenu, overrides, "overrideWindow"); #endif