mirror of https://github.com/mgba-emu/mgba.git
GB Memory: Fix HDMA count starting in mode 0 (fixes #855)
This commit is contained in:
parent
f252436d0a
commit
546688f9fb
1
CHANGES
1
CHANGES
|
@ -31,6 +31,7 @@ Bugfixes:
|
||||||
- Qt: Fix sprite export pausing game indefinitely (fixes mgba.io/i/841)
|
- Qt: Fix sprite export pausing game indefinitely (fixes mgba.io/i/841)
|
||||||
- ARM: Fix MSR when T bit is set
|
- ARM: Fix MSR when T bit is set
|
||||||
- GB Video: Fix potential hang when ending mode 0
|
- GB Video: Fix potential hang when ending mode 0
|
||||||
|
- GB Memory: Fix HDMA count starting in mode 0 (fixes mgba.io/i/855)
|
||||||
Misc:
|
Misc:
|
||||||
- GBA Timer: Use global cycles for timers
|
- GBA Timer: Use global cycles for timers
|
||||||
- GBA: Extend oddly-sized ROMs to full address space (fixes mgba.io/i/722)
|
- GBA: Extend oddly-sized ROMs to full address space (fixes mgba.io/i/722)
|
||||||
|
|
|
@ -469,10 +469,13 @@ void GBMemoryWriteHDMA5(struct GB* gb, uint8_t value) {
|
||||||
bool wasHdma = gb->memory.isHdma;
|
bool wasHdma = gb->memory.isHdma;
|
||||||
gb->memory.isHdma = value & 0x80;
|
gb->memory.isHdma = value & 0x80;
|
||||||
if ((!wasHdma && !gb->memory.isHdma) || gb->video.mode == 0) {
|
if ((!wasHdma && !gb->memory.isHdma) || gb->video.mode == 0) {
|
||||||
|
if (gb->memory.isHdma) {
|
||||||
|
gb->memory.hdmaRemaining = 0x10;
|
||||||
|
} else {
|
||||||
gb->memory.hdmaRemaining = ((value & 0x7F) + 1) * 0x10;
|
gb->memory.hdmaRemaining = ((value & 0x7F) + 1) * 0x10;
|
||||||
|
}
|
||||||
gb->cpuBlocked = true;
|
gb->cpuBlocked = true;
|
||||||
mTimingSchedule(&gb->timing, &gb->memory.hdmaEvent, 0);
|
mTimingSchedule(&gb->timing, &gb->memory.hdmaEvent, 0);
|
||||||
gb->cpu->nextEvent = gb->cpu->cycles;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -304,6 +304,7 @@ void _endMode3(struct mTiming* timing, void* context, uint32_t cyclesLate) {
|
||||||
GBVideoProcessDots(video);
|
GBVideoProcessDots(video);
|
||||||
if (video->ly < GB_VIDEO_VERTICAL_PIXELS && video->p->memory.isHdma && video->p->memory.io[REG_HDMA5] != 0xFF) {
|
if (video->ly < GB_VIDEO_VERTICAL_PIXELS && video->p->memory.isHdma && video->p->memory.io[REG_HDMA5] != 0xFF) {
|
||||||
video->p->memory.hdmaRemaining = 0x10;
|
video->p->memory.hdmaRemaining = 0x10;
|
||||||
|
video->p->cpuBlocked = true;
|
||||||
mTimingDeschedule(timing, &video->p->memory.hdmaEvent);
|
mTimingDeschedule(timing, &video->p->memory.hdmaEvent);
|
||||||
mTimingSchedule(timing, &video->p->memory.hdmaEvent, 0);
|
mTimingSchedule(timing, &video->p->memory.hdmaEvent, 0);
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue