GB: Allow player 2 to act as shift clock

This commit is contained in:
Jeffrey Pfau 2016-12-26 17:13:53 -08:00
parent 269b18d8aa
commit c662b59e99
2 changed files with 12 additions and 5 deletions

View File

@ -22,6 +22,7 @@ void GBSIOLockstepInit(struct GBSIOLockstep* lockstep) {
lockstep->players[1] = NULL;
lockstep->pendingSB[0] = 0xFF;
lockstep->pendingSB[1] = 0xFF;
lockstep->masterClaimed = false;
}
void GBSIOLockstepNodeCreate(struct GBSIOLockstepNode* node) {
@ -135,6 +136,7 @@ static int32_t _masterUpdate(struct GBSIOLockstepNode* node) {
case TRANSFER_FINISHED:
// Everything's settled. We're done.
_finishTransfer(node);
ATOMIC_STORE(node->p->masterClaimed, false);
node->nextEvent += LOCKSTEP_INCREMENT;
ATOMIC_STORE(node->p->d.transferActive, TRANSFER_IDLE);
break;
@ -226,11 +228,15 @@ static void GBSIOLockstepNodeWriteSB(struct GBSIODriver* driver, uint8_t value)
static uint8_t GBSIOLockstepNodeWriteSC(struct GBSIODriver* driver, uint8_t value) {
struct GBSIOLockstepNode* node = (struct GBSIOLockstepNode*) driver;
if (!node->id && (value & 0x81) == 0x81) {
node->p->d.transferActive = TRANSFER_STARTING;
node->p->d.transferCycles = GBSIOCyclesPerTransfer[(value >> 1) & 1];
mTimingDeschedule(&driver->p->p->timing, &node->event);
mTimingSchedule(&driver->p->p->timing, &node->event, 0);
if ((value & 0x81) == 0x81 && node->p->d.attached > 1) {
bool claimed = false;
if (ATOMIC_CMPXCHG(node->p->masterClaimed, claimed, true)) {
node->p->d.transferActive = TRANSFER_STARTING;
node->p->d.transferCycles = GBSIOCyclesPerTransfer[(value >> 1) & 1];
mTimingDeschedule(&driver->p->p->timing, &driver->p->event);
mTimingDeschedule(&driver->p->p->timing, &node->event);
mTimingSchedule(&driver->p->p->timing, &node->event, 0);
}
}
return value;
}

View File

@ -17,6 +17,7 @@ struct GBSIOLockstep {
struct GBSIOLockstepNode* players[MAX_GBS];
uint8_t pendingSB[MAX_GBS];
bool masterClaimed;
};
struct GBSIOLockstepNode {