GB SIO: Fix bidirectional transfer starting (fixes #2290)

This commit is contained in:
Vicki Pfau 2022-06-09 21:10:27 -07:00
parent d9092c6acf
commit 9ac6096c3d
2 changed files with 8 additions and 1 deletions

View File

@ -26,6 +26,7 @@ Emulation fixes:
- GB I/O: Fix writing to WAVE RAM behavior (fixes mgba.io/i/1334) - GB I/O: Fix writing to WAVE RAM behavior (fixes mgba.io/i/1334)
- GB Memory: Add cursory cartridge open bus emulation (fixes mgba.io/i/2032) - GB Memory: Add cursory cartridge open bus emulation (fixes mgba.io/i/2032)
- GB Serialize: Fix loading MBC1 states that affect bank 0 (fixes mgba.io/i/2402) - GB Serialize: Fix loading MBC1 states that affect bank 0 (fixes mgba.io/i/2402)
- GB SIO: Fix bidirectional transfer starting (fixes mgba.io/i/2290)
- GB Video: Draw SGB border pieces that overlap GB graphics (fixes mgba.io/i/1339) - GB Video: Draw SGB border pieces that overlap GB graphics (fixes mgba.io/i/1339)
- GBA: Improve timing when not booting from BIOS - GBA: Improve timing when not booting from BIOS
- GBA: Fix expected entry point for multiboot ELFs (fixes mgba.io/i/2450) - GBA: Fix expected entry point for multiboot ELFs (fixes mgba.io/i/2450)

View File

@ -157,7 +157,7 @@ static int32_t _masterUpdate(struct GBSIOLockstepNode* node) {
} }
} }
// Tell the other GBs they can continue up to where we were // Tell the other GBs they can continue up to where we were
node->p->d.addCycles(&node->p->d, 0, node->eventDiff); node->p->d.addCycles(&node->p->d, node->id, node->eventDiff);
#ifndef NDEBUG #ifndef NDEBUG
node->phase = node->p->d.transferActive; node->phase = node->p->d.transferActive;
#endif #endif
@ -252,6 +252,12 @@ static uint8_t GBSIOLockstepNodeWriteSC(struct GBSIODriver* driver, uint8_t valu
mLockstepLock(&node->p->d); mLockstepLock(&node->p->d);
bool claimed = false; bool claimed = false;
if (ATOMIC_CMPXCHG(node->p->masterClaimed, claimed, true)) { if (ATOMIC_CMPXCHG(node->p->masterClaimed, claimed, true)) {
if (node->id != 0) {
node->p->players[0]->id = 1;
node->p->players[1] = node->p->players[0];
node->p->players[0] = node->p->players[1];
node->id = 0;
}
ATOMIC_STORE(node->p->d.transferActive, TRANSFER_STARTING); ATOMIC_STORE(node->p->d.transferActive, TRANSFER_STARTING);
ATOMIC_STORE(node->p->d.transferCycles, GBSIOCyclesPerTransfer[(value >> 1) & 1]); ATOMIC_STORE(node->p->d.transferCycles, GBSIOCyclesPerTransfer[(value >> 1) & 1]);
mTimingDeschedule(&driver->p->p->timing, &driver->p->event); mTimingDeschedule(&driver->p->p->timing, &driver->p->event);