diff --git a/include/mgba/gba/interface.h b/include/mgba/gba/interface.h index b698f4030..f83f9e717 100644 --- a/include/mgba/gba/interface.h +++ b/include/mgba/gba/interface.h @@ -118,6 +118,7 @@ struct GBASIODriver { int (*connectedDevices)(struct GBASIODriver* driver); int (*deviceId)(struct GBASIODriver* driver); uint16_t (*writeSIOCNT)(struct GBASIODriver* driver, uint16_t value); + uint16_t (*writeRCNT)(struct GBASIODriver* driver, uint16_t value); }; enum GBASIOBattleChipGateFlavor { diff --git a/src/gba/extra/battlechip.c b/src/gba/extra/battlechip.c index b71b4e33e..4070626d8 100644 --- a/src/gba/extra/battlechip.c +++ b/src/gba/extra/battlechip.c @@ -51,6 +51,7 @@ void GBASIOBattlechipGateCreate(struct GBASIOBattlechipGate* gate) { gate->d.handlesMode = GBASIOBattlechipGateHandlesMode; gate->d.connectedDevices = GBASIOBattlechipGateConnectedDevices; gate->d.deviceId = NULL; + gate->d.writeRCNT = NULL; gate->event.context = gate; gate->event.callback = _battlechipTransferEvent; diff --git a/src/gba/sio.c b/src/gba/sio.c index 68b8fcb48..14edd7b7a 100644 --- a/src/gba/sio.c +++ b/src/gba/sio.c @@ -193,6 +193,10 @@ void GBASIOWriteRCNT(struct GBASIO* sio, uint16_t value) { sio->rcnt &= 0xF; sio->rcnt |= value & ~0xF; _switchMode(sio); + if (sio->activeDriver && sio->activeDriver->writeRCNT) { + sio->rcnt &= 0xC000; + sio->rcnt |= sio->activeDriver->writeRCNT(sio->activeDriver, value) & 0x01FF; + } } void GBASIOWriteSIOCNT(struct GBASIO* sio, uint16_t value) { @@ -278,8 +282,6 @@ uint16_t GBASIOWriteRegister(struct GBASIO* sio, uint32_t address, uint16_t valu default: mLOG(GBA_SIO, DEBUG, "JOY write: Unknown reg %03X <- %04X", address, value); break; - case GBA_REG_RCNT: - break; } break; case GBA_SIO_NORMAL_8: @@ -290,8 +292,6 @@ uint16_t GBASIOWriteRegister(struct GBASIO* sio, uint32_t address, uint16_t valu default: mLOG(GBA_SIO, DEBUG, "NORMAL8 %i write: Unknown reg %03X <- %04X", id, address, value); break; - case GBA_REG_RCNT: - break; } break; case GBA_SIO_NORMAL_32: @@ -305,8 +305,6 @@ uint16_t GBASIOWriteRegister(struct GBASIO* sio, uint32_t address, uint16_t valu default: mLOG(GBA_SIO, DEBUG, "NORMAL32 %i write: Unknown reg %03X <- %04X", id, address, value); break; - case GBA_REG_RCNT: - break; } break; case GBA_SIO_MULTI: @@ -317,8 +315,6 @@ uint16_t GBASIOWriteRegister(struct GBASIO* sio, uint32_t address, uint16_t valu default: mLOG(GBA_SIO, DEBUG, "MULTI %i write: Unknown reg %03X <- %04X", id, address, value); break; - case GBA_REG_RCNT: - break; } break; default: diff --git a/src/gba/sio/dolphin.c b/src/gba/sio/dolphin.c index 039f9b528..f7aad747b 100644 --- a/src/gba/sio/dolphin.c +++ b/src/gba/sio/dolphin.c @@ -41,6 +41,7 @@ void GBASIODolphinCreate(struct GBASIODolphin* dol) { dol->d.handlesMode = GBASIODolphinHandlesMode; dol->d.connectedDevices = GBASIODolphinConnectedDevices; dol->d.deviceId = NULL; + dol->d.writeSIOCNT = NULL; dol->event.context = dol; dol->event.name = "GB SIO Lockstep"; dol->event.callback = GBASIODolphinProcessEvents; diff --git a/src/gba/sio/gbp.c b/src/gba/sio/gbp.c index 7aeef1b0b..f7b3747a1 100644 --- a/src/gba/sio/gbp.c +++ b/src/gba/sio/gbp.c @@ -54,6 +54,7 @@ void GBASIOPlayerInit(struct GBASIOPlayer* gbp) { gbp->d.handlesMode = _gbpSioHandlesMode; gbp->d.connectedDevices = _gbpSioConnectedDevices; gbp->d.deviceId = NULL; + gbp->d.writeRCNT = NULL; gbp->event.context = gbp; gbp->event.name = "GBA SIO Game Boy Player"; gbp->event.callback = _gbpSioProcessEvents; diff --git a/src/gba/sio/lockstep.c b/src/gba/sio/lockstep.c index 526d83575..30092c3ec 100644 --- a/src/gba/sio/lockstep.c +++ b/src/gba/sio/lockstep.c @@ -47,6 +47,7 @@ void GBASIOLockstepNodeCreate(struct GBASIOLockstepNode* node) { node->d.connectedDevices = GBASIOLockstepNodeConnectedDevices; node->d.deviceId = GBASIOLockstepNodeDeviceId; node->d.writeSIOCNT = NULL; + node->d.writeRCNT = NULL; } bool GBASIOLockstepAttachNode(struct GBASIOLockstep* lockstep, struct GBASIOLockstepNode* node) {