diff --git a/src/gba/gba.c b/src/gba/gba.c
index d4aa5d98e..732da9eed 100644
--- a/src/gba/gba.c
+++ b/src/gba/gba.c
@@ -787,7 +787,9 @@ void GBAFrameEnded(struct GBA* gba) {
gba->stream->postVideoFrame(gba->stream, gba->video.renderer);
}
- GBAHardwarePlayerUpdate(gba);
+ if (gba->memory.hw.devices & (HW_GB_PLAYER | HW_GB_PLAYER_DETECTION)) {
+ GBAHardwarePlayerUpdate(gba);
+ }
struct GBAThread* thread = GBAThreadGetContext();
if (!thread) {
diff --git a/src/gba/hardware.c b/src/gba/hardware.c
index 7d5a16d7a..fc4875f47 100644
--- a/src/gba/hardware.c
+++ b/src/gba/hardware.c
@@ -44,6 +44,16 @@ static const int RTC_BYTES[8] = {
void GBAHardwareInit(struct GBACartridgeHardware* hw, uint16_t* base) {
hw->gpioBase = base;
GBAHardwareClear(hw);
+
+ hw->gbpCallback.d.readKeys = _gbpRead;
+ hw->gbpCallback.p = hw;
+ hw->gbpDriver.d.init = 0;
+ hw->gbpDriver.d.deinit = 0;
+ hw->gbpDriver.d.load = 0;
+ hw->gbpDriver.d.unload = 0;
+ hw->gbpDriver.d.writeRegister = _gbpSioWriteRegister;
+ hw->gbpDriver.d.processEvents = _gbpSioProcessEvents;
+ hw->gbpDriver.p = hw;
}
void GBAHardwareClear(struct GBACartridgeHardware* hw) {
@@ -516,15 +526,6 @@ void GBAHardwarePlayerUpdate(struct GBA* gba) {
}
if (GBAHardwarePlayerCheckScreen(&gba->video)) {
gba->memory.hw.devices |= HW_GB_PLAYER;
- gba->memory.hw.gbpCallback.d.readKeys = _gbpRead;
- gba->memory.hw.gbpCallback.p = &gba->memory.hw;
- gba->memory.hw.gbpDriver.d.init = 0;
- gba->memory.hw.gbpDriver.d.deinit = 0;
- gba->memory.hw.gbpDriver.d.load = 0;
- gba->memory.hw.gbpDriver.d.unload = 0;
- gba->memory.hw.gbpDriver.d.writeRegister = _gbpSioWriteRegister;
- gba->memory.hw.gbpDriver.d.processEvents = _gbpSioProcessEvents;
- gba->memory.hw.gbpDriver.p = &gba->memory.hw;
gba->memory.hw.gbpInputsPosted = 0;
gba->memory.hw.gbpNextEvent = INT_MAX;
gba->keyCallback = &gba->memory.hw.gbpCallback.d;
diff --git a/src/gba/hardware.h b/src/gba/hardware.h
index 53a4899a7..7923d0669 100644
--- a/src/gba/hardware.h
+++ b/src/gba/hardware.h
@@ -34,7 +34,8 @@ enum GBAHardwareDevice {
HW_LIGHT_SENSOR = 4,
HW_GYRO = 8,
HW_TILT = 16,
- HW_GB_PLAYER = 32
+ HW_GB_PLAYER = 32,
+ HW_GB_PLAYER_DETECTION = 64
};
enum GPIORegister {
diff --git a/src/gba/supervisor/overrides.c b/src/gba/supervisor/overrides.c
index 5ed596644..3d48d10d5 100644
--- a/src/gba/supervisor/overrides.c
+++ b/src/gba/supervisor/overrides.c
@@ -285,6 +285,12 @@ void GBAOverrideApply(struct GBA* gba, const struct GBACartridgeOverride* overri
if (override->hardware & HW_TILT) {
GBAHardwareInitTilt(&gba->memory.hw);
}
+
+ if (override->hardware & HW_GB_PLAYER_DETECTION) {
+ gba->memory.hw.devices |= HW_GB_PLAYER_DETECTION;
+ } else {
+ gba->memory.hw.devices &= ~HW_GB_PLAYER_DETECTION;
+ }
}
if (override->idleLoop != IDLE_LOOP_NONE) {
diff --git a/src/platform/qt/OverrideView.cpp b/src/platform/qt/OverrideView.cpp
index 76a6ca35a..738760684 100644
--- a/src/platform/qt/OverrideView.cpp
+++ b/src/platform/qt/OverrideView.cpp
@@ -39,6 +39,7 @@ OverrideView::OverrideView(GameController* controller, ConfigController* config,
connect(m_ui.hwLight, SIGNAL(clicked()), this, SLOT(updateOverrides()));
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()));
@@ -80,6 +81,9 @@ void OverrideView::updateOverrides() {
m_override.hardware |= HW_RUMBLE;
}
}
+ if (m_ui.hwGBPlayer->isChecked()) {
+ m_override.hardware |= HW_GB_PLAYER_DETECTION;
+ }
bool ok;
uint32_t parsedIdleLoop = m_ui.idleLoop->text().toInt(&ok, 16);
@@ -115,6 +119,7 @@ void OverrideView::gameStarted(GBAThread* thread) {
m_ui.hwLight->setChecked(thread->gba->memory.hw.devices & HW_LIGHT_SENSOR);
m_ui.hwTilt->setChecked(thread->gba->memory.hw.devices & HW_TILT);
m_ui.hwRumble->setChecked(thread->gba->memory.hw.devices & HW_RUMBLE);
+ m_ui.hwGBPlayer->setChecked(thread->gba->memory.hw.devices & HW_GB_PLAYER_DETECTION);
if (thread->gba->idleLoop != IDLE_LOOP_NONE) {
m_ui.idleLoop->setText(QString::number(thread->gba->idleLoop, 16));
diff --git a/src/platform/qt/OverrideView.ui b/src/platform/qt/OverrideView.ui
index 6925ede96..bb99fc40a 100644
--- a/src/platform/qt/OverrideView.ui
+++ b/src/platform/qt/OverrideView.ui
@@ -6,8 +6,8 @@
0
0
- 409
- 228
+ 401
+ 203
@@ -23,13 +23,19 @@
QLayout::SetFixedSize
- -
+
-
-
Qt::Horizontal
+
+
+ 0
+ 0
+
+
-
@@ -44,7 +50,135 @@
- -
+
-
+
+
+ Qt::Vertical
+
+
+
+ 0
+ 0
+
+
+
+
+ -
+
+
+
+
+
+
-
+
+
-
+
+
+ Save type
+
+
+
+ -
+
+
-
+
+ Autodetect
+
+
+ -
+
+ None
+
+
+ -
+
+ SRAM
+
+
+ -
+
+ Flash 512kb
+
+
+ -
+
+ Flash 1Mb
+
+
+ -
+
+ EEPROM
+
+
+
+
+ -
+
+
+ Idle loop
+
+
+
+ -
+
+
+ -
+
+
+ Qt::Horizontal
+
+
+
+
+
+ -
+
+
+ Qt::Horizontal
+
+
+
+ -
+
+
-
+
+
+ Qt::Horizontal
+
+
+
+ 0
+ 0
+
+
+
+
+ -
+
+
+ Game Boy Player features
+
+
+
+ -
+
+
+ Qt::Horizontal
+
+
+
+ 0
+ 0
+
+
+
+
+
+
+
+
+
+ -
@@ -113,83 +247,6 @@
- -
-
-
-
-
-
-
- QFormLayout::AllNonFixedFieldsGrow
-
-
-
-
-
- Save type
-
-
-
- -
-
-
-
-
- Autodetect
-
-
- -
-
- None
-
-
- -
-
- SRAM
-
-
- -
-
- Flash 512kb
-
-
- -
-
- Flash 1Mb
-
-
- -
-
- EEPROM
-
-
-
-
- -
-
-
- Idle loop
-
-
-
- -
-
-
- -
-
-
- Qt::Horizontal
-
-
-
-
-
-
- -
-
-
- Qt::Vertical
-
-
-