mirror of https://github.com/mgba-emu/mgba.git
GB: Rearrange some scheduling for better callback ability
This commit is contained in:
parent
3b69fb767c
commit
db4a873d9c
|
@ -127,7 +127,7 @@ void _endMode0(struct mTiming* timing, void* context, uint32_t cyclesLate) {
|
||||||
video->mode = 1;
|
video->mode = 1;
|
||||||
video->modeEvent.callback = _endMode1;
|
video->modeEvent.callback = _endMode1;
|
||||||
|
|
||||||
_updateFrameCount(timing, video, cyclesLate);
|
mTimingSchedule(&video->p->timing, &video->frameEvent, -cyclesLate);
|
||||||
|
|
||||||
if (GBRegisterSTATIsVblankIRQ(video->stat) || GBRegisterSTATIsOAMIRQ(video->stat)) {
|
if (GBRegisterSTATIsVblankIRQ(video->stat) || GBRegisterSTATIsOAMIRQ(video->stat)) {
|
||||||
video->p->memory.io[REG_IF] |= (1 << GB_IRQ_LCDSTAT);
|
video->p->memory.io[REG_IF] |= (1 << GB_IRQ_LCDSTAT);
|
||||||
|
@ -252,16 +252,16 @@ void _updateFrameCount(struct mTiming* timing, void* context, uint32_t cyclesLat
|
||||||
video->p->stream->postVideoFrame(video->p->stream, pixels, stride);
|
video->p->stream->postVideoFrame(video->p->stream, pixels, stride);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (!GBRegisterLCDCIsEnable(video->p->memory.io[REG_LCDC])) {
|
||||||
|
mTimingSchedule(timing, &video->frameEvent, GB_VIDEO_TOTAL_LENGTH);
|
||||||
|
}
|
||||||
|
|
||||||
for (c = 0; c < mCoreCallbacksListSize(&video->p->coreCallbacks); ++c) {
|
for (c = 0; c < mCoreCallbacksListSize(&video->p->coreCallbacks); ++c) {
|
||||||
struct mCoreCallbacks* callbacks = mCoreCallbacksListGetPointer(&video->p->coreCallbacks, c);
|
struct mCoreCallbacks* callbacks = mCoreCallbacksListGetPointer(&video->p->coreCallbacks, c);
|
||||||
if (callbacks->videoFrameStarted) {
|
if (callbacks->videoFrameStarted) {
|
||||||
callbacks->videoFrameStarted(callbacks->context);
|
callbacks->videoFrameStarted(callbacks->context);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!GBRegisterLCDCIsEnable(video->p->memory.io[REG_LCDC])) {
|
|
||||||
mTimingSchedule(timing, &video->frameEvent, GB_VIDEO_TOTAL_LENGTH);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static void _cleanOAM(struct GBVideo* video, int y) {
|
static void _cleanOAM(struct GBVideo* video, int y) {
|
||||||
|
|
|
@ -158,6 +158,10 @@ void LR35902Tick(struct LR35902Core* cpu) {
|
||||||
void LR35902Run(struct LR35902Core* cpu) {
|
void LR35902Run(struct LR35902Core* cpu) {
|
||||||
bool running = true;
|
bool running = true;
|
||||||
while (running || cpu->executionState != LR35902_CORE_FETCH) {
|
while (running || cpu->executionState != LR35902_CORE_FETCH) {
|
||||||
|
if (cpu->cycles >= cpu->nextEvent) {
|
||||||
|
cpu->irqh.processEvents(cpu);
|
||||||
|
break;
|
||||||
|
}
|
||||||
_LR35902Step(cpu);
|
_LR35902Step(cpu);
|
||||||
if (cpu->cycles + 2 >= cpu->nextEvent) {
|
if (cpu->cycles + 2 >= cpu->nextEvent) {
|
||||||
int32_t diff = cpu->nextEvent - cpu->cycles;
|
int32_t diff = cpu->nextEvent - cpu->cycles;
|
||||||
|
@ -172,9 +176,5 @@ void LR35902Run(struct LR35902Core* cpu) {
|
||||||
cpu->executionState = LR35902_CORE_FETCH;
|
cpu->executionState = LR35902_CORE_FETCH;
|
||||||
cpu->instruction(cpu);
|
cpu->instruction(cpu);
|
||||||
++cpu->cycles;
|
++cpu->cycles;
|
||||||
if (cpu->cycles >= cpu->nextEvent) {
|
|
||||||
cpu->irqh.processEvents(cpu);
|
|
||||||
running = false;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue