-#ifdef PSXDMA_LOG
- PSXDMA_LOG("*** DMA 2 - GPU dma chain *** %x addr = %x size = %x\n", chcr, madr, bcr);
-#endif
- GPU_dmaChain((u32 *)psxM, madr & 0x1fffff);
- break;
+ PSXDMA_LOG("*** DMA 2 - GPU dma chain *** %lx addr = %lx size = %lx\n", chcr, madr, bcr);
+ // when not emulating walking progress, end immediately
+ madr_next = 0xffffff;
+
+ do_walking = Config.GpuListWalking;
+ if (do_walking < 0 || Config.hacks.gpu_timing1024)
+ do_walking = Config.hacks.gpu_slow_list_walking;
+ madr_next_p = do_walking ? &madr_next : NULL;
+
+ cycles_sum = GPU_dmaChain((u32 *)psxM, madr & 0x1fffff,
+ madr_next_p, &cycles_last_cmd);
+
+ HW_DMA2_MADR = SWAPu32(madr_next);
+
+ // a hack for Judge Dredd which is annoyingly sensitive to timing
+ if (Config.hacks.gpu_timing1024)
+ cycles_sum = 1024;
+
+ psxRegs.gpuIdleAfter = psxRegs.cycle + cycles_sum + cycles_last_cmd;
+ set_event(PSXINT_GPUDMA, cycles_sum);
+ //printf("%u dma2cf: %6d,%4d %08x %08x %08x %08x\n", psxRegs.cycle,
+ // cycles_sum, cycles_last_cmd, madr, bcr, chcr, HW_DMA2_MADR);
+ return;