-#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)
+ 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);
+
+ // Tekken 3 = use 1.0 only (not 1.5x)
+
+ // Einhander = parse linked list in pieces (todo)
+ // Rebel Assault 2 = parse linked list in pieces (todo)
+ psxRegs.gpuIdleAfter = psxRegs.cycle + size + 16;
+ set_event(PSXINT_GPUDMA, size);
+ return;