drc: something works on arm64
[pcsx_rearmed.git] / libpcsxcore / psxdma.c
index b0f3fba..cb84fbc 100644 (file)
@@ -122,7 +122,8 @@ static u32 gpuDmaChainSize(u32 addr) {
                // next 32-bit pointer
                addr = psxMu32( addr & ~0x3 ) & 0xffffff;
                size += 1;
-       } while (addr != 0xffffff);
+       } while (!(addr & 0x800000)); // contrary to some documentation, the end-of-linked-list marker is not actually 0xFF'FFFF
+                                  // any pointer with bit 23 set will do.
 
        return size;
 }
@@ -220,7 +221,7 @@ void gpuInterrupt() {
 }
 
 void psxDma6(u32 madr, u32 bcr, u32 chcr) {
-       u32 size;
+       u32 words;
        u32 *mem = (u32 *)PSXM(madr);
 
 #ifdef PSXDMA_LOG
@@ -238,7 +239,7 @@ void psxDma6(u32 madr, u32 bcr, u32 chcr) {
                }
 
                // already 32-bit size
-               size = bcr;
+               words = bcr;
 
                while (bcr--) {
                        *mem-- = SWAP32((madr - 4) & 0xffffff);
@@ -246,7 +247,10 @@ void psxDma6(u32 madr, u32 bcr, u32 chcr) {
                }
                mem++; *mem = 0xffffff;
 
-               GPUOTCDMA_INT(size);
+               //GPUOTCDMA_INT(size);
+               // halted
+               psxRegs.cycle += words;
+               GPUOTCDMA_INT(16);
                return;
        }
 #ifdef PSXDMA_LOG