From 0b9cf1270cd1779d489ad276527aab973adebeee Mon Sep 17 00:00:00 2001 From: Vicki Pfau Date: Thu, 5 Sep 2024 03:33:35 -0700 Subject: [PATCH] GBA SIO: Modify GBASIOTransferCycles to not require SIO struct --- include/mgba/internal/gba/sio.h | 2 +- src/gba/sio.c | 25 ++++++++++++------------- src/gba/sio/lockstep.c | 6 +++--- 3 files changed, 16 insertions(+), 17 deletions(-) diff --git a/include/mgba/internal/gba/sio.h b/include/mgba/internal/gba/sio.h index bb7b2a78c..ca271abc4 100644 --- a/include/mgba/internal/gba/sio.h +++ b/include/mgba/internal/gba/sio.h @@ -93,7 +93,7 @@ void GBASIOWriteRCNT(struct GBASIO* sio, uint16_t value); void GBASIOWriteSIOCNT(struct GBASIO* sio, uint16_t value); uint16_t GBASIOWriteRegister(struct GBASIO* sio, uint32_t address, uint16_t value); -int32_t GBASIOTransferCycles(struct GBASIO* sio); +int32_t GBASIOTransferCycles(enum GBASIOMode mode, uint16_t siocnt, int connected); void GBASIOMultiplayerFinishTransfer(struct GBASIO* sio, uint16_t data[4], uint32_t cyclesLate); void GBASIONormal8FinishTransfer(struct GBASIO* sio, uint8_t data, uint32_t cyclesLate); diff --git a/src/gba/sio.c b/src/gba/sio.c index 971eb9502..4b635db18 100644 --- a/src/gba/sio.c +++ b/src/gba/sio.c @@ -228,8 +228,12 @@ static void _startTransfer(struct GBASIO* sio) { return; } } + int connected = 0; + if (sio->activeDriver && sio->activeDriver->connectedDevices) { + connected = sio->activeDriver->connectedDevices(sio->activeDriver); + } mTimingDeschedule(&sio->p->timing, &sio->completeEvent); - mTimingSchedule(&sio->p->timing, &sio->completeEvent, GBASIOTransferCycles(sio)); + mTimingSchedule(&sio->p->timing, &sio->completeEvent, GBASIOTransferCycles(sio->mode, sio->siocnt, connected)); } void GBASIOWriteSIOCNT(struct GBASIO* sio, uint16_t value) { @@ -429,26 +433,21 @@ uint16_t GBASIOWriteRegister(struct GBASIO* sio, uint32_t address, uint16_t valu return value; } -int32_t GBASIOTransferCycles(struct GBASIO* sio) { - int connected = 0; - if (sio->activeDriver) { - connected = sio->activeDriver->connectedDevices(sio->activeDriver); - } - +int32_t GBASIOTransferCycles(enum GBASIOMode mode, uint16_t siocnt, int connected) { if (connected < 0 || connected >= MAX_GBAS) { - mLOG(GBA_SIO, ERROR, "SIO driver returned invalid device count %i", connected); + mLOG(GBA_SIO, ERROR, "Invalid device count %i", connected); return 0; } - switch (sio->mode) { + switch (mode) { case GBA_SIO_MULTI: - return GBASIOCyclesPerTransfer[GBASIOMultiplayerGetBaud(sio->siocnt)][connected]; + return GBASIOCyclesPerTransfer[GBASIOMultiplayerGetBaud(siocnt)][connected]; case GBA_SIO_NORMAL_8: - return 8 * GBA_ARM7TDMI_FREQUENCY / ((GBASIONormalIsInternalSc(sio->siocnt) ? 2048 : 256) * 1024); + return 8 * GBA_ARM7TDMI_FREQUENCY / ((GBASIONormalIsInternalSc(siocnt) ? 2048 : 256) * 1024); case GBA_SIO_NORMAL_32: - return 32 * GBA_ARM7TDMI_FREQUENCY / ((GBASIONormalIsInternalSc(sio->siocnt) ? 2048 : 256) * 1024); + return 32 * GBA_ARM7TDMI_FREQUENCY / ((GBASIONormalIsInternalSc(siocnt) ? 2048 : 256) * 1024); default: - mLOG(GBA_SIO, STUB, "No cycle count implemented for mode %s", _modeName(sio->mode)); + mLOG(GBA_SIO, STUB, "No cycle count implemented for mode %s", _modeName(mode)); break; } return 0; diff --git a/src/gba/sio/lockstep.c b/src/gba/sio/lockstep.c index ed74ed6d4..2008638bd 100644 --- a/src/gba/sio/lockstep.c +++ b/src/gba/sio/lockstep.c @@ -248,7 +248,7 @@ static uint16_t GBASIOLockstepNodeMultiWriteSIOCNT(struct GBASIODriver* driver, if (!node->id && attached > 1 && GBASIOMultiplayerIsReady(node->d.p->siocnt)) { mLOG(GBA_SIO, DEBUG, "Lockstep %i: Transfer initiated", node->id); ATOMIC_STORE(node->p->d.transferActive, TRANSFER_STARTING); - ATOMIC_STORE(node->p->d.transferCycles, GBASIOTransferCycles(node->d.p)); + ATOMIC_STORE(node->p->d.transferCycles, GBASIOTransferCycles(node->d.p->mode, node->d.p->siocnt, attached)); if (mTimingIsScheduled(&driver->p->p->timing, &node->event)) { node->eventDiff -= node->event.when - mTimingCurrentTime(&driver->p->p->timing); @@ -479,7 +479,7 @@ static void _GBASIOLockstepNodeProcessEvents(struct mTiming* timing, void* user, if (node->p->d.attached < 2) { switch (node->mode) { case GBA_SIO_MULTI: - cycles = GBASIOTransferCycles(node->d.p); + cycles = GBASIOTransferCycles(node->d.p->mode, node->d.p->siocnt, node->p->d.attached); break; case GBA_SIO_NORMAL_8: case GBA_SIO_NORMAL_32: @@ -544,7 +544,7 @@ static uint16_t GBASIOLockstepNodeNormalWriteSIOCNT(struct GBASIODriver* driver, if ((value & 0x0081) == 0x0081) { if (!node->id) { // Frequency - int32_t cycles = GBASIOTransferCycles(node->d.p); + int32_t cycles = GBASIOTransferCycles(node->d.p->mode, node->d.p->siocnt, attached); if (transferActive == TRANSFER_IDLE) { mLOG(GBA_SIO, DEBUG, "Lockstep %i: Transfer initiated", node->id);