dma: should clear both start bits
[pcsx_rearmed.git] / libpcsxcore / cdrom.c
index 5f4ce60..7bc57cf 100644 (file)
@@ -1318,7 +1318,7 @@ static void cdrReadInterrupt(void)
        }
        memcpy(cdr.LocL, buf, 8);
 
-       if (!cdr.Irq1Pending)
+       if (!cdr.Stat && !cdr.Irq1Pending)
                cdrUpdateTransferBuf(buf);
 
        if ((!cdr.Muted) && (cdr.Mode & MODE_STRSND) && (!Config.Xa) && (cdr.FirstSector != -1)) { // CD-XA
@@ -1515,8 +1515,11 @@ void cdrWrite3(unsigned char rt) {
                        // note: Croc, Shadow Tower (more) vs Discworld Noir (<993)
                        if (!pending && (cdr.CmdInProgress || cdr.Irq1Pending))
                        {
-                               s32 c = 2048 - (psxRegs.cycle - nextCycle);
-                               c = MAX_VALUE(c, 512);
+                               s32 c = 2048;
+                               if (cdr.CmdInProgress) {
+                                       c = 2048 - (psxRegs.cycle - nextCycle);
+                                       c = MAX_VALUE(c, 512);
+                               }
                                CDR_INT(c);
                        }
                }
@@ -1562,7 +1565,7 @@ void cdrWrite3(unsigned char rt) {
 }
 
 void psxDma3(u32 madr, u32 bcr, u32 chcr) {
-       u32 cdsize;
+       u32 cdsize, max_words;
        int size;
        u8 *ptr;
 
@@ -1577,7 +1580,7 @@ void psxDma3(u32 madr, u32 bcr, u32 chcr) {
 
        switch (chcr & 0x71000000) {
                case 0x11000000:
-                       ptr = (u8 *)PSXM(madr);
+                       ptr = getDmaRam(madr, &max_words);
                        if (ptr == INVALID_PTR) {
                                CDR_LOG_I("psxDma3() Log: *** DMA 3 *** NULL Pointer!\n");
                                break;
@@ -1594,6 +1597,8 @@ void psxDma3(u32 madr, u32 bcr, u32 chcr) {
                        size = DATA_SIZE - cdr.FifoOffset;
                        if (size > cdsize)
                                size = cdsize;
+                       if (size > max_words * 4)
+                               size = max_words * 4;
                        if (size > 0)
                        {
                                memcpy(ptr, cdr.Transfer + cdr.FifoOffset, size);