-#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;
+
+ size = GPU_dmaChain((u32 *)psxM, madr & 0x1fffff, madr_next_p);
+ if ((int)size <= 0)
+ size = gpuDmaChainSize(madr);
+
+ HW_DMA2_MADR = SWAPu32(madr_next);
+
+ // a hack for Judge Dredd which is annoyingly sensitive to timing
+ if (Config.hacks.gpu_timing1024)
+ size = 1024;
+
+ psxRegs.gpuIdleAfter = psxRegs.cycle + size + 16;
+ set_event(PSXINT_GPUDMA, size);
+ return;