mirror of https://github.com/mgba-emu/mgba.git
GBA Peripherals: Start implementing Progress Gate
This commit is contained in:
parent
c82f9f0efc
commit
85a85672e4
|
@ -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*);
|
||||
|
|
|
@ -0,0 +1,379 @@
|
|||
Cannon
|
||||
Hi Cannon
|
||||
Mega Cannon
|
||||
Air Shot
|
||||
Air Hockey
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
Fanfare
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
ProtoMan Navi
|
||||
NumberMan Navi
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
|
@ -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;
|
||||
}
|
||||
|
|
|
@ -27,6 +27,24 @@ BattleChipView::BattleChipView(std::shared_ptr<CoreController> 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);
|
||||
}
|
||||
|
||||
|
|
|
@ -7,46 +7,92 @@
|
|||
<x>0</x>
|
||||
<y>0</y>
|
||||
<width>426</width>
|
||||
<height>152</height>
|
||||
<height>278</height>
|
||||
</rect>
|
||||
</property>
|
||||
<property name="windowTitle">
|
||||
<string>BattleChip Gate</string>
|
||||
</property>
|
||||
<layout class="QFormLayout" name="formLayout">
|
||||
<item row="2" column="1">
|
||||
<item row="5" column="1">
|
||||
<widget class="QCheckBox" name="inserted">
|
||||
<property name="text">
|
||||
<string>Inserted</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="1" column="0">
|
||||
<item row="4" column="0">
|
||||
<widget class="QLabel" name="label">
|
||||
<property name="text">
|
||||
<string>Chip ID</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="0" column="0">
|
||||
<item row="3" column="0">
|
||||
<widget class="QLabel" name="label_2">
|
||||
<property name="text">
|
||||
<string>Chip Name</string>
|
||||
<string>Chip name</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="1" column="1">
|
||||
<item row="4" column="1">
|
||||
<widget class="QSpinBox" name="chipId">
|
||||
<property name="maximum">
|
||||
<number>65535</number>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="0" column="1">
|
||||
<item row="3" column="1">
|
||||
<widget class="QComboBox" name="chipName"/>
|
||||
</item>
|
||||
<item row="0" column="0">
|
||||
<widget class="QLabel" name="label_3">
|
||||
<property name="text">
|
||||
<string>Gate type</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="1" column="1">
|
||||
<widget class="QRadioButton" name="gateProgress">
|
||||
<property name="text">
|
||||
<string>Progress &Gate</string>
|
||||
</property>
|
||||
<attribute name="buttonGroup">
|
||||
<string notr="true">gate</string>
|
||||
</attribute>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="0" column="1">
|
||||
<widget class="QRadioButton" name="gateBattleChip">
|
||||
<property name="text">
|
||||
<string>Ba&ttleChip Gate</string>
|
||||
</property>
|
||||
<property name="checked">
|
||||
<bool>true</bool>
|
||||
</property>
|
||||
<attribute name="buttonGroup">
|
||||
<string notr="true">gate</string>
|
||||
</attribute>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="2" column="1">
|
||||
<widget class="QRadioButton" name="gateBeastLink">
|
||||
<property name="enabled">
|
||||
<bool>false</bool>
|
||||
</property>
|
||||
<property name="text">
|
||||
<string>Beast &Link Gate</string>
|
||||
</property>
|
||||
<attribute name="buttonGroup">
|
||||
<string notr="true">gate</string>
|
||||
</attribute>
|
||||
</widget>
|
||||
</item>
|
||||
</layout>
|
||||
</widget>
|
||||
<resources/>
|
||||
<connections/>
|
||||
<buttongroups>
|
||||
<buttongroup name="gate"/>
|
||||
</buttongroups>
|
||||
</ui>
|
||||
|
|
|
@ -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) {
|
||||
|
|
|
@ -143,6 +143,7 @@ public slots:
|
|||
void attachBattleChipGate();
|
||||
void detachBattleChipGate();
|
||||
void setBattleChipId(uint16_t id);
|
||||
void setBattleChipFlavor(int flavor);
|
||||
#endif
|
||||
|
||||
void setAVStream(mAVStream*);
|
||||
|
|
|
@ -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<BattleChipView>());
|
||||
addControlledAction(emulationMenu, bcGate, "bcGate");
|
||||
m_gbaActions.append(bcGate);
|
||||
m_gameActions.append(bcGate);
|
||||
|
|
|
@ -5,5 +5,6 @@
|
|||
<file>../../../res/patrons.txt</file>
|
||||
<file>../../../res/no-cam.png</file>
|
||||
<file>../../../res/chip-names-4.txt</file>
|
||||
<file>../../../res/chip-names-5.txt</file>
|
||||
</qresource>
|
||||
</RCC>
|
||||
|
|
Loading…
Reference in New Issue