psxcounters: merge shalma's suggestion
[pcsx_rearmed.git] / libpcsxcore / cdrom.c
index 87a7c19..cc377b9 100644 (file)
@@ -1905,9 +1905,10 @@ void cdrWrite3(unsigned char rt) {
                if (cdr.Reading && !cdr.ResultReady) {
                        int left = psxRegs.intCycle[PSXINT_CDREAD].sCycle + psxRegs.intCycle[PSXINT_CDREAD].cycle - psxRegs.cycle;
                        int time = (cdr.Mode & MODE_SPEED) ? (cdReadTime / 2) : cdReadTime;
-                       if (left < time / 2) { // rearmed guesswork hack
-                               //printf("-- resched %d -> %d\n", left, time / 2);
-                               CDREAD_INT(time / 2);
+                       if (Config.CdrReschedule != 2)
+                       if (left < time / 2 || Config.CdrReschedule) { // rearmed guesswork hack
+                               //printf("-- resched %d -> %d\n", left, time);
+                               CDREAD_INT(time);
                        }
                }
 
@@ -1936,6 +1937,7 @@ void cdrWrite3(unsigned char rt) {
 
 void psxDma3(u32 madr, u32 bcr, u32 chcr) {
        u32 cdsize;
+       int size;
        u8 *ptr;
 
 #ifdef CDR_LOG
@@ -1980,15 +1982,12 @@ void psxDma3(u32 madr, u32 bcr, u32 chcr) {
                        - CdlPlay
                        - Spams DMA3 and gets buffer overrun
                        */
-
-                       if( (cdr.pTransfer-cdr.Transfer) + cdsize > 2352 )
-                       {
-                               // avoid crash - probably should wrap here
-                               //memcpy(ptr, cdr.pTransfer, cdsize);
-                       }
-                       else
+                       size = CD_FRAMESIZE_RAW - (cdr.pTransfer - cdr.Transfer);
+                       if (size > cdsize)
+                               size = cdsize;
+                       if (size > 0)
                        {
-                               memcpy(ptr, cdr.pTransfer, cdsize);
+                               memcpy(ptr, cdr.pTransfer, size);
                        }
 
                        psxCpu->Clear(madr, cdsize / 4);
@@ -2017,8 +2016,11 @@ void psxDma3(u32 madr, u32 bcr, u32 chcr) {
 
 void cdrDmaInterrupt()
 {
-       HW_DMA3_CHCR &= SWAP32(~0x01000000);
-       DMA_INTERRUPT(3);
+       if (HW_DMA3_CHCR & SWAP32(0x01000000))
+       {
+               HW_DMA3_CHCR &= SWAP32(~0x01000000);
+               DMA_INTERRUPT(3);
+       }
 }
 
 void cdrReset() {