mirror of https://github.com/mgba-emu/mgba.git
DS Video: Fix timing
This commit is contained in:
parent
f78f45b60f
commit
9c30435c9f
|
@ -130,7 +130,7 @@ void DSVideoReset(struct DSVideo* video) {
|
||||||
video->event7.callback = _startHblank7;
|
video->event7.callback = _startHblank7;
|
||||||
video->event9.callback = _startHblank9;
|
video->event9.callback = _startHblank9;
|
||||||
mTimingSchedule(&video->p->ds7.timing, &video->event7, DS_VIDEO_HORIZONTAL_LENGTH - DS7_VIDEO_HBLANK_LENGTH);
|
mTimingSchedule(&video->p->ds7.timing, &video->event7, DS_VIDEO_HORIZONTAL_LENGTH - DS7_VIDEO_HBLANK_LENGTH);
|
||||||
mTimingSchedule(&video->p->ds9.timing, &video->event9, DS_VIDEO_HORIZONTAL_LENGTH - DS9_VIDEO_HBLANK_LENGTH);
|
mTimingSchedule(&video->p->ds9.timing, &video->event9, (DS_VIDEO_HORIZONTAL_LENGTH - DS9_VIDEO_HBLANK_LENGTH) * 2);
|
||||||
|
|
||||||
video->frameCounter = 0;
|
video->frameCounter = 0;
|
||||||
video->frameskipCounter = 0;
|
video->frameskipCounter = 0;
|
||||||
|
@ -174,10 +174,6 @@ void _startHdraw7(struct mTiming* timing, void* context, uint32_t cyclesLate) {
|
||||||
video->event7.callback = _startHblank7;
|
video->event7.callback = _startHblank7;
|
||||||
mTimingSchedule(timing, &video->event7, DS_VIDEO_HORIZONTAL_LENGTH - DS7_VIDEO_HBLANK_LENGTH - cyclesLate);
|
mTimingSchedule(timing, &video->event7, DS_VIDEO_HORIZONTAL_LENGTH - DS7_VIDEO_HBLANK_LENGTH - cyclesLate);
|
||||||
|
|
||||||
++video->vcount;
|
|
||||||
if (video->vcount == DS_VIDEO_VERTICAL_TOTAL_PIXELS) {
|
|
||||||
video->vcount = 0;
|
|
||||||
}
|
|
||||||
video->p->ds7.memory.io[DS_REG_VCOUNT >> 1] = video->vcount;
|
video->p->ds7.memory.io[DS_REG_VCOUNT >> 1] = video->vcount;
|
||||||
|
|
||||||
if (video->vcount == GBARegisterDISPSTATGetVcountSetting(dispstat)) {
|
if (video->vcount == GBARegisterDISPSTATGetVcountSetting(dispstat)) {
|
||||||
|
@ -193,9 +189,6 @@ void _startHdraw7(struct mTiming* timing, void* context, uint32_t cyclesLate) {
|
||||||
switch (video->vcount) {
|
switch (video->vcount) {
|
||||||
case DS_VIDEO_VERTICAL_PIXELS:
|
case DS_VIDEO_VERTICAL_PIXELS:
|
||||||
video->p->ds7.memory.io[DS_REG_DISPSTAT >> 1] = GBARegisterDISPSTATFillInVblank(dispstat);
|
video->p->ds7.memory.io[DS_REG_DISPSTAT >> 1] = GBARegisterDISPSTATFillInVblank(dispstat);
|
||||||
if (video->frameskipCounter <= 0) {
|
|
||||||
video->renderer->finishFrame(video->renderer);
|
|
||||||
}
|
|
||||||
if (GBARegisterDISPSTATIsVblankIRQ(dispstat)) {
|
if (GBARegisterDISPSTATIsVblankIRQ(dispstat)) {
|
||||||
DSRaiseIRQ(video->p->ds7.cpu, video->p->ds7.memory.io, DS_IRQ_VBLANK);
|
DSRaiseIRQ(video->p->ds7.cpu, video->p->ds7.memory.io, DS_IRQ_VBLANK);
|
||||||
}
|
}
|
||||||
|
@ -215,9 +208,6 @@ void _startHblank7(struct mTiming* timing, void* context, uint32_t cyclesLate) {
|
||||||
|
|
||||||
// Begin Hblank
|
// Begin Hblank
|
||||||
dispstat = GBARegisterDISPSTATFillInHblank(dispstat);
|
dispstat = GBARegisterDISPSTATFillInHblank(dispstat);
|
||||||
if (video->vcount < DS_VIDEO_VERTICAL_PIXELS && video->frameskipCounter <= 0) {
|
|
||||||
video->renderer->drawScanline(video->renderer, video->vcount);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (GBARegisterDISPSTATIsHblankIRQ(dispstat)) {
|
if (GBARegisterDISPSTATIsHblankIRQ(dispstat)) {
|
||||||
DSRaiseIRQ(video->p->ds7.cpu, video->p->ds7.memory.io, DS_IRQ_HBLANK);
|
DSRaiseIRQ(video->p->ds7.cpu, video->p->ds7.memory.io, DS_IRQ_HBLANK);
|
||||||
|
@ -230,7 +220,7 @@ void _startHdraw9(struct mTiming* timing, void* context, uint32_t cyclesLate) {
|
||||||
GBARegisterDISPSTAT dispstat = video->p->ds9.memory.io[DS_REG_DISPSTAT >> 1];
|
GBARegisterDISPSTAT dispstat = video->p->ds9.memory.io[DS_REG_DISPSTAT >> 1];
|
||||||
dispstat = GBARegisterDISPSTATClearInHblank(dispstat);
|
dispstat = GBARegisterDISPSTATClearInHblank(dispstat);
|
||||||
video->event9.callback = _startHblank9;
|
video->event9.callback = _startHblank9;
|
||||||
mTimingSchedule(timing, &video->event9, DS_VIDEO_HORIZONTAL_LENGTH - DS9_VIDEO_HBLANK_LENGTH - cyclesLate);
|
mTimingSchedule(timing, &video->event9, (DS_VIDEO_HORIZONTAL_LENGTH - DS9_VIDEO_HBLANK_LENGTH) * 2 - cyclesLate);
|
||||||
|
|
||||||
++video->vcount;
|
++video->vcount;
|
||||||
if (video->vcount == DS_VIDEO_VERTICAL_TOTAL_PIXELS) {
|
if (video->vcount == DS_VIDEO_VERTICAL_TOTAL_PIXELS) {
|
||||||
|
@ -255,6 +245,9 @@ void _startHdraw9(struct mTiming* timing, void* context, uint32_t cyclesLate) {
|
||||||
break;
|
break;
|
||||||
case DS_VIDEO_VERTICAL_PIXELS:
|
case DS_VIDEO_VERTICAL_PIXELS:
|
||||||
video->p->ds9.memory.io[DS_REG_DISPSTAT >> 1] = GBARegisterDISPSTATFillInVblank(dispstat);
|
video->p->ds9.memory.io[DS_REG_DISPSTAT >> 1] = GBARegisterDISPSTATFillInVblank(dispstat);
|
||||||
|
if (video->frameskipCounter <= 0) {
|
||||||
|
video->renderer->finishFrame(video->renderer);
|
||||||
|
}
|
||||||
if (GBARegisterDISPSTATIsVblankIRQ(dispstat)) {
|
if (GBARegisterDISPSTATIsVblankIRQ(dispstat)) {
|
||||||
DSRaiseIRQ(video->p->ds9.cpu, video->p->ds9.memory.io, DS_IRQ_VBLANK);
|
DSRaiseIRQ(video->p->ds9.cpu, video->p->ds9.memory.io, DS_IRQ_VBLANK);
|
||||||
}
|
}
|
||||||
|
@ -277,10 +270,13 @@ void _startHblank9(struct mTiming* timing, void* context, uint32_t cyclesLate) {
|
||||||
GBARegisterDISPSTAT dispstat = video->p->ds9.memory.io[DS_REG_DISPSTAT >> 1];
|
GBARegisterDISPSTAT dispstat = video->p->ds9.memory.io[DS_REG_DISPSTAT >> 1];
|
||||||
dispstat = GBARegisterDISPSTATFillInHblank(dispstat);
|
dispstat = GBARegisterDISPSTATFillInHblank(dispstat);
|
||||||
video->event9.callback = _startHdraw9;
|
video->event9.callback = _startHdraw9;
|
||||||
mTimingSchedule(timing, &video->event9, DS9_VIDEO_HBLANK_LENGTH - cyclesLate);
|
mTimingSchedule(timing, &video->event9, (DS9_VIDEO_HBLANK_LENGTH * 2) - cyclesLate);
|
||||||
|
|
||||||
// Begin Hblank
|
// Begin Hblank
|
||||||
dispstat = GBARegisterDISPSTATFillInHblank(dispstat);
|
dispstat = GBARegisterDISPSTATFillInHblank(dispstat);
|
||||||
|
if (video->vcount < DS_VIDEO_VERTICAL_PIXELS && video->frameskipCounter <= 0) {
|
||||||
|
video->renderer->drawScanline(video->renderer, video->vcount);
|
||||||
|
}
|
||||||
|
|
||||||
if (GBARegisterDISPSTATIsHblankIRQ(dispstat)) {
|
if (GBARegisterDISPSTATIsHblankIRQ(dispstat)) {
|
||||||
DSRaiseIRQ(video->p->ds9.cpu, video->p->ds9.memory.io, DS_IRQ_HBLANK);
|
DSRaiseIRQ(video->p->ds9.cpu, video->p->ds9.memory.io, DS_IRQ_HBLANK);
|
||||||
|
|
Loading…
Reference in New Issue