@@ -182,7 +182,7 @@ void _dmaEvent(struct mTiming* timing, void* context, uint32_t cyclesLate) {
182
182
dma -> nextCount = 0 ;
183
183
bool noRepeat = !GBADMARegisterIsRepeat (dma -> reg );
184
184
noRepeat |= GBADMARegisterGetTiming (dma -> reg ) == GBA_DMA_TIMING_NOW ;
185
- noRepeat |= memory -> activeDMA == 3 && GBADMARegisterGetTiming (dma -> reg ) == GBA_DMA_TIMING_CUSTOM ;
185
+ noRepeat |= memory -> activeDMA == 3 && GBADMARegisterGetTiming (dma -> reg ) == GBA_DMA_TIMING_CUSTOM && gba -> video . vcount == VIDEO_VERTICAL_PIXELS + 1 ;
186
186
if (noRepeat ) {
187
187
dma -> reg = GBADMARegisterClearEnable (dma -> reg );
188
188
@@ -237,9 +237,6 @@ void GBADMAService(struct GBA* gba, int number, struct GBADMA* info) {
237
237
238
238
gba -> cpuBlocked = true;
239
239
if (info -> count == info -> nextCount ) {
240
- if (sourceRegion < REGION_CART0 || destRegion < REGION_CART0 ) {
241
- cycles += 2 ;
242
- }
243
240
if (width == 4 ) {
244
241
cycles += memory -> waitstatesNonseq32 [sourceRegion ] + memory -> waitstatesNonseq32 [destRegion ];
245
242
} else {
@@ -263,19 +260,17 @@ void GBADMAService(struct GBA* gba, int number, struct GBADMA* info) {
263
260
}
264
261
gba -> bus = memory -> dmaTransferRegister ;
265
262
cpu -> memory .store32 (cpu , dest , memory -> dmaTransferRegister , 0 );
266
- memory -> dmaTransferRegister &= 0xFFFF0000 ;
267
- memory -> dmaTransferRegister |= memory -> dmaTransferRegister >> 16 ;
268
263
} else {
269
264
if (sourceRegion == REGION_CART2_EX && memory -> savedata .type == SAVEDATA_EEPROM ) {
270
265
if (memory -> savedata .type == SAVEDATA_AUTODETECT ) {
271
266
mLOG (GBA_MEM , INFO , "Detected EEPROM savegame" );
272
267
GBASavedataInitEEPROM (& memory -> savedata );
273
268
}
274
269
memory -> dmaTransferRegister = GBASavedataReadEEPROM (& memory -> savedata );
275
- } else {
276
- if (source ) {
277
- memory -> dmaTransferRegister = cpu -> memory .load16 (cpu , source , 0 );
278
- }
270
+ memory -> dmaTransferRegister |= memory -> dmaTransferRegister << 16 ;
271
+ } else if (source ) {
272
+ memory -> dmaTransferRegister = cpu -> memory .load16 (cpu , source , 0 );
273
+ memory -> dmaTransferRegister |= memory -> dmaTransferRegister << 16 ;
279
274
}
280
275
if (destRegion == REGION_CART2_EX ) {
281
276
if (memory -> savedata .type == SAVEDATA_AUTODETECT ) {
@@ -289,7 +284,6 @@ void GBADMAService(struct GBA* gba, int number, struct GBADMA* info) {
289
284
cpu -> memory .store16 (cpu , dest , memory -> dmaTransferRegister , 0 );
290
285
291
286
}
292
- memory -> dmaTransferRegister |= memory -> dmaTransferRegister << 16 ;
293
287
gba -> bus = memory -> dmaTransferRegister ;
294
288
}
295
289
int sourceOffset = DMA_OFFSET [GBADMARegisterGetSrcControl (info -> reg )] * width ;
@@ -306,6 +300,9 @@ void GBADMAService(struct GBA* gba, int number, struct GBADMA* info) {
306
300
info -> nextDest = dest ;
307
301
if (!wordsRemaining ) {
308
302
info -> nextCount |= 0x80000000 ;
303
+ if (sourceRegion < REGION_CART0 || destRegion < REGION_CART0 ) {
304
+ info -> when += 2 ;
305
+ }
309
306
}
310
307
GBADMAUpdate (gba );
311
308
}
0 commit comments