mirror of https://github.com/mgba-emu/mgba.git
GBA SIO: Clean up lockstep cycle counting
This commit is contained in:
parent
32a8a47de6
commit
b92bb30a72
|
@ -149,11 +149,7 @@ bool GBASIOLockstepNodeUnload(struct GBASIODriver* driver) {
|
||||||
|
|
||||||
// Flush ongoing transfer
|
// Flush ongoing transfer
|
||||||
if (mTimingIsScheduled(&driver->p->p->timing, &node->event)) {
|
if (mTimingIsScheduled(&driver->p->p->timing, &node->event)) {
|
||||||
int oldWhen = node->event.when;
|
node->eventDiff -= node->event.when - mTimingCurrentTime(&driver->p->p->timing);
|
||||||
|
|
||||||
mTimingDeschedule(&driver->p->p->timing, &node->event);
|
|
||||||
mTimingSchedule(&driver->p->p->timing, &node->event, 0);
|
|
||||||
node->eventDiff -= oldWhen - node->event.when;
|
|
||||||
mTimingDeschedule(&driver->p->p->timing, &node->event);
|
mTimingDeschedule(&driver->p->p->timing, &node->event);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -190,15 +186,11 @@ static uint16_t GBASIOLockstepNodeMultiWriteRegister(struct GBASIODriver* driver
|
||||||
ATOMIC_STORE(node->p->d.transferActive, TRANSFER_STARTING);
|
ATOMIC_STORE(node->p->d.transferActive, TRANSFER_STARTING);
|
||||||
ATOMIC_STORE(node->p->d.transferCycles, GBASIOCyclesPerTransfer[GBASIOMultiplayerGetBaud(node->d.p->siocnt)][node->p->d.attached - 1]);
|
ATOMIC_STORE(node->p->d.transferCycles, GBASIOCyclesPerTransfer[GBASIOMultiplayerGetBaud(node->d.p->siocnt)][node->p->d.attached - 1]);
|
||||||
|
|
||||||
bool scheduled = mTimingIsScheduled(&driver->p->p->timing, &node->event);
|
if (mTimingIsScheduled(&driver->p->p->timing, &node->event)) {
|
||||||
int oldWhen = node->event.when;
|
node->eventDiff -= node->event.when - mTimingCurrentTime(&driver->p->p->timing);
|
||||||
|
mTimingDeschedule(&driver->p->p->timing, &node->event);
|
||||||
mTimingDeschedule(&driver->p->p->timing, &node->event);
|
|
||||||
mTimingSchedule(&driver->p->p->timing, &node->event, 0);
|
|
||||||
|
|
||||||
if (scheduled) {
|
|
||||||
node->eventDiff -= oldWhen - node->event.when;
|
|
||||||
}
|
}
|
||||||
|
mTimingSchedule(&driver->p->p->timing, &node->event, 0);
|
||||||
} else {
|
} else {
|
||||||
value &= ~0x0080;
|
value &= ~0x0080;
|
||||||
}
|
}
|
||||||
|
@ -443,15 +435,13 @@ static uint32_t _slaveUpdate(struct GBASIOLockstepNode* node) {
|
||||||
static void _GBASIOLockstepNodeProcessEvents(struct mTiming* timing, void* user, uint32_t cyclesLate) {
|
static void _GBASIOLockstepNodeProcessEvents(struct mTiming* timing, void* user, uint32_t cyclesLate) {
|
||||||
struct GBASIOLockstepNode* node = user;
|
struct GBASIOLockstepNode* node = user;
|
||||||
mLockstepLock(&node->p->d);
|
mLockstepLock(&node->p->d);
|
||||||
if (node->p->d.attached < 2) {
|
|
||||||
mTimingSchedule(timing, &node->event, GBASIOCyclesPerTransfer[GBASIOMultiplayerGetBaud(node->d.p->siocnt)][0]);
|
|
||||||
mLockstepUnlock(&node->p->d);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
int32_t cycles = 0;
|
int32_t cycles = 0;
|
||||||
node->nextEvent -= cyclesLate;
|
node->nextEvent -= cyclesLate;
|
||||||
node->eventDiff += cyclesLate;
|
node->eventDiff += cyclesLate;
|
||||||
if (node->nextEvent <= 0) {
|
if (node->p->d.attached < 2) {
|
||||||
|
cycles = GBASIOCyclesPerTransfer[GBASIOMultiplayerGetBaud(node->d.p->siocnt)][0];
|
||||||
|
} else if (node->nextEvent <= 0) {
|
||||||
if (!node->id) {
|
if (!node->id) {
|
||||||
cycles = _masterUpdate(node);
|
cycles = _masterUpdate(node);
|
||||||
} else {
|
} else {
|
||||||
|
|
Loading…
Reference in New Issue