GB: Convert SIO events to mTiming

This commit is contained in:
Jeffrey Pfau 2016-09-17 19:04:36 -07:00
parent e2357f0b70
commit 6243b7fd3b
3 changed files with 22 additions and 24 deletions

View File

@ -565,11 +565,6 @@ void GBProcessEvents(struct LR35902Core* cpu) {
} }
} }
testEvent = GBSIOProcessEvents(&gb->sio, cycles);
if (testEvent < nextEvent) {
nextEvent = testEvent;
}
cpu->cycles -= cycles; cpu->cycles -= cycles;
cpu->nextEvent = nextEvent; cpu->nextEvent = nextEvent;

View File

@ -9,8 +9,13 @@
#include "gb/io.h" #include "gb/io.h"
#include "gb/serialize.h" #include "gb/serialize.h"
void _GBSIOProcessEvents(struct mTiming* timing, void* context, uint32_t cyclesLate);
void GBSIOInit(struct GBSIO* sio) { void GBSIOInit(struct GBSIO* sio) {
sio->pendingSB = 0xFF; sio->pendingSB = 0xFF;
sio->event.context = sio;
sio->event.name = "GB SIO";
sio->event.callback = _GBSIOProcessEvents;
} }
void GBSIOReset(struct GBSIO* sio) { void GBSIOReset(struct GBSIO* sio) {
@ -23,31 +28,26 @@ void GBSIODeinit(struct GBSIO* sio) {
// Nothing to do yet // Nothing to do yet
} }
int32_t GBSIOProcessEvents(struct GBSIO* sio, int32_t cycles) { void _GBSIOProcessEvents(struct mTiming* timing, void* context, uint32_t cyclesLate) {
if (sio->nextEvent != INT_MAX) { UNUSED(cyclesLate);
sio->nextEvent -= cycles; struct GBSIO* sio = context;
--sio->remainingBits;
sio->p->memory.io[REG_SB] &= ~(8 >> sio->remainingBits);
sio->p->memory.io[REG_SB] |= sio->pendingSB & ~(8 >> sio->remainingBits);
if (!sio->remainingBits) {
sio->p->memory.io[REG_IF] |= (1 << GB_IRQ_SIO);
sio->p->memory.io[REG_SC] = GBRegisterSCClearEnable(sio->p->memory.io[REG_SC]);
GBUpdateIRQs(sio->p);
} else {
mTimingSchedule(timing, &sio->event, sio->period);
} }
if (sio->nextEvent <= 0) {
--sio->remainingBits;
sio->p->memory.io[REG_SB] &= ~(8 >> sio->remainingBits);
sio->p->memory.io[REG_SB] |= sio->pendingSB & ~(8 >> sio->remainingBits);
if (!sio->remainingBits) {
sio->p->memory.io[REG_IF] |= (1 << GB_IRQ_SIO);
sio->p->memory.io[REG_SC] = GBRegisterSCClearEnable(sio->p->memory.io[REG_SC]);
GBUpdateIRQs(sio->p);
sio->nextEvent = INT_MAX;
} else {
sio->nextEvent += sio->period;
}
}
return sio->nextEvent;
} }
void GBSIOWriteSC(struct GBSIO* sio, uint8_t sc) { void GBSIOWriteSC(struct GBSIO* sio, uint8_t sc) {
sio->period = 0x1000; // TODO Shift Clock sio->period = 0x1000; // TODO Shift Clock
if (GBRegisterSCIsEnable(sc)) { if (GBRegisterSCIsEnable(sc)) {
if (GBRegisterSCIsShiftClock(sc)) { if (GBRegisterSCIsShiftClock(sc)) {
sio->nextEvent = sio->p->cpu->cycles + sio->period; mTimingSchedule(&sio->p->timing, &sio->event, sio->period);
} }
sio->remainingBits = 8; sio->remainingBits = 8;
} }

View File

@ -8,10 +8,14 @@
#include "util/common.h" #include "util/common.h"
#include "core/timing.h"
struct GB; struct GB;
struct GBSIO { struct GBSIO {
struct GB* p; struct GB* p;
struct mTimingEvent event;
int32_t nextEvent; int32_t nextEvent;
int32_t period; int32_t period;
int remainingBits; int remainingBits;
@ -27,7 +31,6 @@ DECL_BIT(GBRegisterSC, Enable, 7);
void GBSIOInit(struct GBSIO* sio); void GBSIOInit(struct GBSIO* sio);
void GBSIOReset(struct GBSIO* sio); void GBSIOReset(struct GBSIO* sio);
void GBSIODeinit(struct GBSIO* sio); void GBSIODeinit(struct GBSIO* sio);
int32_t GBSIOProcessEvents(struct GBSIO* sio, int32_t cycles);
void GBSIOWriteSC(struct GBSIO* sio, uint8_t sc); void GBSIOWriteSC(struct GBSIO* sio, uint8_t sc);
#endif #endif