From 85a85672e434fc4df288828d26fe5a1beb9c7ed2 Mon Sep 17 00:00:00 2001 From: Vicki Pfau Date: Fri, 15 Feb 2019 21:41:04 -0800 Subject: [PATCH] GBA Peripherals: Start implementing Progress Gate --- include/mgba/gba/interface.h | 7 + res/chip-names-5.txt | 379 +++++++++++++++++++++++++++++ src/gba/extra/battlechip.c | 37 ++- src/platform/qt/BattleChipView.cpp | 19 ++ src/platform/qt/BattleChipView.ui | 60 ++++- src/platform/qt/CoreController.cpp | 8 + src/platform/qt/CoreController.h | 1 + src/platform/qt/Window.cpp | 7 +- src/platform/qt/resources.qrc | 1 + 9 files changed, 501 insertions(+), 18 deletions(-) create mode 100644 res/chip-names-5.txt diff --git a/include/mgba/gba/interface.h b/include/mgba/gba/interface.h index 0c61363e3..14eabc750 100644 --- a/include/mgba/gba/interface.h +++ b/include/mgba/gba/interface.h @@ -60,12 +60,19 @@ struct GBASIODriver { void GBASIOJOYCreate(struct GBASIODriver* sio); int GBASIOJOYSendCommand(struct GBASIODriver* sio, enum GBASIOJOYCommand command, uint8_t* data); +enum GBASIOBattleChipGateFlavor { + GBA_FLAVOR_BATTLECHIP_GATE = 4, + GBA_FLAVOR_PROGRESS_GATE = 5, + GBA_FLAVOR_BEAST_LINK_GATE = 6, +}; + struct GBASIOBattlechipGate { struct GBASIODriver d; struct mTimingEvent event; uint16_t chipId; uint16_t data[2]; int state; + int flavor; }; void GBASIOBattlechipGateCreate(struct GBASIOBattlechipGate*); diff --git a/res/chip-names-5.txt b/res/chip-names-5.txt new file mode 100644 index 000000000..487d219da --- /dev/null +++ b/res/chip-names-5.txt @@ -0,0 +1,379 @@ +Cannon +Hi Cannon +Mega Cannon +Air Shot +Air Hockey + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Fanfare + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +ProtoMan Navi +NumberMan Navi + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/gba/extra/battlechip.c b/src/gba/extra/battlechip.c index 40b80e3ec..259f958a5 100644 --- a/src/gba/extra/battlechip.c +++ b/src/gba/extra/battlechip.c @@ -26,6 +26,8 @@ enum { enum { BATTLECHIP_OK = 0xFFC6, + PROGRESS_GATE_OK = 0xFFC7, + BEAST_LINK_GATE_OK = 0xFFC8, BATTLECHIP_CONTINUE = 0xFFFF, }; @@ -46,11 +48,13 @@ void GBASIOBattlechipGateCreate(struct GBASIOBattlechipGate* gate) { gate->event.context = gate; gate->event.callback = _battlechipTransferEvent; gate->event.priority = 0x80; + + gate->chipId = 0; + gate->flavor = GBA_FLAVOR_BATTLECHIP_GATE; } bool GBASIOBattlechipGateInit(struct GBASIODriver* driver) { struct GBASIOBattlechipGate* gate = (struct GBASIOBattlechipGate*) driver; - gate->chipId = 0; return true; } @@ -100,6 +104,20 @@ void _battlechipTransferEvent(struct mTiming* timing, void* user, uint32_t cycle mLOG(GBA_BATTLECHIP, DEBUG, "> %04X", cmd); + uint16_t ok; + switch (gate->flavor) { + case GBA_FLAVOR_BATTLECHIP_GATE: + default: + ok = BATTLECHIP_OK; + break; + case GBA_FLAVOR_PROGRESS_GATE: + ok = PROGRESS_GATE_OK; + break; + case GBA_FLAVOR_BEAST_LINK_GATE: + ok = BEAST_LINK_GATE_OK; + break; + } + switch (gate->state) { case BATTLECHIP_STATE_COMMAND: mLOG(GBA_BATTLECHIP, DEBUG, "C %04X", cmd); @@ -112,6 +130,7 @@ void _battlechipTransferEvent(struct mTiming* timing, void* user, uint32_t cycle case 0xA3B0: case 0xA3C0: case 0xA3D0: + case 0xA6C0: gate->state = -1; // Fall through case 0x5379: @@ -120,14 +139,22 @@ void _battlechipTransferEvent(struct mTiming* timing, void* user, uint32_t cycle case 0x537C: case 0x537D: case 0x537E: + case 0xC4D8: case 0xD979: case 0xD97A: case 0xD97B: case 0xD97C: case 0xD97D: case 0xD97E: - reply = BATTLECHIP_OK; + reply = ok; break; + case 0x424A: + case 0x424B: + case 0x424C: + case 0x424D: + case 0x424E: + case 0x424F: + case 0x4250: case 0x5745: case 0x5746: case 0x5747: @@ -150,12 +177,12 @@ void _battlechipTransferEvent(struct mTiming* timing, void* user, uint32_t cycle case BATTLECHIP_STATE_DATA_0: reply = gate->data[0]; gate->data[0] += 3; - gate->data[0] &= 0xF0FF; + gate->data[0] &= 0x00FF; break; case BATTLECHIP_STATE_DATA_1: reply = gate->data[1]; gate->data[1] -= 3; - gate->data[1] |= 0xFE00; + gate->data[1] |= 0xFC00; break; case BATTLECHIP_STATE_ID: reply = gate->chipId; @@ -165,7 +192,7 @@ void _battlechipTransferEvent(struct mTiming* timing, void* user, uint32_t cycle reply = 0; break; case BATTLECHIP_STATE_END: - reply = BATTLECHIP_OK; + reply = ok; gate->state = -1; break; } diff --git a/src/platform/qt/BattleChipView.cpp b/src/platform/qt/BattleChipView.cpp index 4f6b6a4b3..d101c18f4 100644 --- a/src/platform/qt/BattleChipView.cpp +++ b/src/platform/qt/BattleChipView.cpp @@ -27,6 +27,24 @@ BattleChipView::BattleChipView(std::shared_ptr controller, QWidg connect(m_ui.inserted, &QAbstractButton::toggled, this, &BattleChipView::insertChip); connect(controller.get(), &CoreController::stopping, this, &QWidget::close); + connect(m_ui.gateBattleChip, &QAbstractButton::toggled, this, [this](bool on) { + if (on) { + setFlavor(4); + } + }); + connect(m_ui.gateProgress, &QAbstractButton::toggled, this, [this](bool on) { + if (on) { + setFlavor(5); + } + }); + connect(m_ui.gateBeastLink, &QAbstractButton::toggled, this, [this](bool on) { + if (on) { + setFlavor(6); + } + }); + + + m_controller->attachBattleChipGate(); setFlavor(4); } @@ -35,6 +53,7 @@ BattleChipView::~BattleChipView() { } void BattleChipView::setFlavor(int flavor) { + m_controller->setBattleChipFlavor(flavor); loadChipNames(flavor); } diff --git a/src/platform/qt/BattleChipView.ui b/src/platform/qt/BattleChipView.ui index 092663ae7..63290a93c 100644 --- a/src/platform/qt/BattleChipView.ui +++ b/src/platform/qt/BattleChipView.ui @@ -7,46 +7,92 @@ 0 0 426 - 152 + 278 BattleChip Gate - + Inserted - + Chip ID - + - Chip Name + Chip name - + 65535 - + + + + + Gate type + + + + + + + Progress &Gate + + + gate + + + + + + + Ba&ttleChip Gate + + + true + + + gate + + + + + + + false + + + Beast &Link Gate + + + gate + + + + + + diff --git a/src/platform/qt/CoreController.cpp b/src/platform/qt/CoreController.cpp index c5e8850ec..ef641b3a1 100644 --- a/src/platform/qt/CoreController.cpp +++ b/src/platform/qt/CoreController.cpp @@ -750,6 +750,14 @@ void CoreController::setBattleChipId(uint16_t id) { Interrupter interrupter(this); m_battlechip.chipId = id; } + +void CoreController::setBattleChipFlavor(int flavor) { + if (platform() != PLATFORM_GBA) { + return; + } + Interrupter interrupter(this); + m_battlechip.flavor = flavor; +} #endif void CoreController::setAVStream(mAVStream* stream) { diff --git a/src/platform/qt/CoreController.h b/src/platform/qt/CoreController.h index b7a740626..dbcec9cf3 100644 --- a/src/platform/qt/CoreController.h +++ b/src/platform/qt/CoreController.h @@ -143,6 +143,7 @@ public slots: void attachBattleChipGate(); void detachBattleChipGate(); void setBattleChipId(uint16_t id); + void setBattleChipFlavor(int flavor); #endif void setAVStream(mAVStream*); diff --git a/src/platform/qt/Window.cpp b/src/platform/qt/Window.cpp index a49f3075f..ce3b586b5 100644 --- a/src/platform/qt/Window.cpp +++ b/src/platform/qt/Window.cpp @@ -1365,12 +1365,7 @@ void Window::setupMenu(QMenuBar* menubar) { #ifdef M_CORE_GBA QAction* bcGate = new QAction(tr("BattleChip Gate..."), emulationMenu); - connect(bcGate, &QAction::triggered, [this]() { - BattleChipView* view = new BattleChipView(m_controller); - openView(view); - m_controller->attachBattleChipGate(); - - }); + connect(bcGate, &QAction::triggered, openControllerTView()); addControlledAction(emulationMenu, bcGate, "bcGate"); m_gbaActions.append(bcGate); m_gameActions.append(bcGate); diff --git a/src/platform/qt/resources.qrc b/src/platform/qt/resources.qrc index 80be2c8be..475ab337c 100644 --- a/src/platform/qt/resources.qrc +++ b/src/platform/qt/resources.qrc @@ -5,5 +5,6 @@ ../../../res/patrons.txt ../../../res/no-cam.png ../../../res/chip-names-4.txt + ../../../res/chip-names-5.txt