From 3c55784c549fd5b022a7ffd4dbb76ba2254a90b4 Mon Sep 17 00:00:00 2001 From: Jeffrey Pfau Date: Sat, 25 Jul 2015 12:19:19 -0700 Subject: [PATCH] GBA Hardware: Game Boy Player detection is off by default --- src/gba/gba.c | 4 +- src/gba/hardware.c | 19 +-- src/gba/hardware.h | 3 +- src/gba/supervisor/overrides.c | 6 + src/platform/qt/OverrideView.cpp | 5 + src/platform/qt/OverrideView.ui | 219 +++++++++++++++++++------------ 6 files changed, 164 insertions(+), 92 deletions(-) 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 - - -