summaryrefslogtreecommitdiff
path: root/libpcsxcore/psxdma.c
diff options
context:
space:
mode:
Diffstat (limited to 'libpcsxcore/psxdma.c')
-rw-r--r--libpcsxcore/psxdma.c24
1 files changed, 20 insertions, 4 deletions
diff --git a/libpcsxcore/psxdma.c b/libpcsxcore/psxdma.c
index f59f268e..7b0cdd37 100644
--- a/libpcsxcore/psxdma.c
+++ b/libpcsxcore/psxdma.c
@@ -65,7 +65,9 @@ void psxDma4(u32 madr, u32 bcr, u32 chcr) { // SPU
size = (bcr >> 16) * (bcr & 0xffff) * 2;
SPU_readDMAMem(ptr, size);
psxCpu->Clear(madr, size);
- break;
+
+ SPUDMA_INT((bcr >> 16) * (bcr & 0xffff) / 2);
+ return;
#ifdef PSXDMA_LOG
default:
@@ -97,7 +99,9 @@ void psxDma2(u32 madr, u32 bcr, u32 chcr) { // GPU
size = (bcr >> 16) * (bcr & 0xffff);
GPU_readDataMem(ptr, size);
psxCpu->Clear(madr, size);
- break;
+
+ GPUDMA_INT(size / 4);
+ return;
case 0x01000201: // mem2vram
#ifdef PSXDMA_LOG
@@ -112,6 +116,7 @@ void psxDma2(u32 madr, u32 bcr, u32 chcr) { // GPU
}
size = (bcr >> 16) * (bcr & 0xffff);
GPU_writeDataMem(ptr, size);
+
GPUDMA_INT(size / 4);
return;
@@ -120,7 +125,10 @@ void psxDma2(u32 madr, u32 bcr, u32 chcr) { // GPU
PSXDMA_LOG("*** DMA 2 - GPU dma chain *** %x addr = %x size = %x\n", chcr, madr, bcr);
#endif
GPU_dmaChain((u32 *)psxM, madr & 0x1fffff);
- break;
+
+ // FIXME!!! Walk through DMA chain and add the cycles
+ GPUDMA_INT( 0x4000 / 4 );
+ return;
#ifdef PSXDMA_LOG
default:
@@ -160,6 +168,9 @@ void psxDma6(u32 madr, u32 bcr, u32 chcr) {
madr -= 4;
}
mem++; *mem = 0xffffff;
+
+ RAMDMA_INT( size / BIAS);
+ return;
}
#ifdef PSXDMA_LOG
else {
@@ -171,4 +182,9 @@ void psxDma6(u32 madr, u32 bcr, u32 chcr) {
HW_DMA6_CHCR &= SWAP32(~0x01000000);
DMA_INTERRUPT(6);
}
-
+
+void gpuotcInterrupt()
+{
+ HW_DMA6_CHCR &= SWAP32(~0x01000000);
+ DMA_INTERRUPT(6);
+}