cdrom: attempt to improve reset
[pcsx_rearmed.git] / libpcsxcore / cdrom.c
index 3991bad..872cc0c 100644 (file)
@@ -701,6 +701,30 @@ void cdrPlayReadInterrupt(void)
        CDRPLAYREAD_INT(cdReadTime, 0);
 }
 
+static void softReset(void)
+{
+       CDR_getStatus(&stat);
+       if (stat.Status & STATUS_SHELLOPEN) {
+               cdr.DriveState = DRIVESTATE_LID_OPEN;
+               cdr.StatP = STATUS_SHELLOPEN;
+       }
+       else if (CdromId[0] == '\0') {
+               cdr.DriveState = DRIVESTATE_STOPPED;
+               cdr.StatP = 0;
+       }
+       else {
+               cdr.DriveState = DRIVESTATE_STANDBY;
+               cdr.StatP = STATUS_ROTATING;
+       }
+
+       cdr.FifoOffset = DATA_SIZE; // fifo empty
+       cdr.LocL[0] = LOCL_INVALID;
+       cdr.Mode = MODE_SIZE_2340;
+       cdr.Muted = FALSE;
+       SPU_setCDvol(cdr.AttenuatorLeftToLeft, cdr.AttenuatorLeftToRight,
+               cdr.AttenuatorRightToLeft, cdr.AttenuatorRightToRight, psxRegs.cycle);
+}
+
 #define CMD_PART2           0x100
 #define CMD_WHILE_NOT_READY 0x200
 
@@ -983,15 +1007,11 @@ void cdrInterrupt(void) {
 
                case CdlReset:
                case CdlReset + CMD_WHILE_NOT_READY:
+                       // note: nocash and Duckstation calls this 'Init', but
+                       // the official SDK calls it 'Reset', and so do we
                        StopCdda();
                        StopReading();
-                       SetPlaySeekRead(cdr.StatP, 0);
-                       cdr.LocL[0] = LOCL_INVALID;
-                       cdr.Mode = MODE_SIZE_2340; /* This fixes This is Football 2, Pooh's Party lockups */
-                       cdr.DriveState = DRIVESTATE_PAUSED;
-                       cdr.Muted = FALSE;
-                       SPU_setCDvol(cdr.AttenuatorLeftToLeft, cdr.AttenuatorLeftToRight,
-                               cdr.AttenuatorRightToLeft, cdr.AttenuatorRightToRight, psxRegs.cycle);
+                       softReset();
                        second_resp_time = not_ready ? 70000 : 4100000;
                        start_rotating = 1;
                        break;
@@ -1432,7 +1452,7 @@ unsigned char cdrRead0(void) {
 }
 
 void cdrWrite0(unsigned char rt) {
-       CDR_LOG_IO("cdr w0.idx: %02x\n", rt);
+       CDR_LOG_IO("cdr w0.x.idx: %02x\n", rt);
 
        cdr.Ctrl = (rt & 3) | (cdr.Ctrl & ~3);
 }
@@ -1446,13 +1466,13 @@ unsigned char cdrRead1(void) {
        if (cdr.ResultP == cdr.ResultC)
                cdr.ResultReady = 0;
 
-       CDR_LOG_IO("cdr r1.rsp: %02x #%u\n", psxHu8(0x1801), cdr.ResultP - 1);
+       CDR_LOG_IO("cdr r1.x.rsp: %02x #%u\n", psxHu8(0x1801), cdr.ResultP - 1);
 
        return psxHu8(0x1801);
 }
 
 void cdrWrite1(unsigned char rt) {
-       const char *rnames[] = { "cmd", "smd", "smc", "arr" }; (void)rnames;
+       const char *rnames[] = { "0.cmd", "1.smd", "2.smc", "3.arr" }; (void)rnames;
        CDR_LOG_IO("cdr w1.%s: %02x\n", rnames[cdr.Ctrl & 3], rt);
 
        switch (cdr.Ctrl & 3) {
@@ -1472,10 +1492,9 @@ void cdrWrite1(unsigned char rt) {
                SysPrintf(" Param[%d] = {", cdr.ParamC);
                for (i = 0; i < cdr.ParamC; i++)
                        SysPrintf(" %x,", cdr.Param[i]);
-               SysPrintf("}\n");
-       } else {
-               SysPrintf("\n");
+               SysPrintf("}");
        }
+       SysPrintf(" @%08x\n", psxRegs.pc);
 #endif
 
        cdr.ResultReady = 0;
@@ -1504,12 +1523,12 @@ unsigned char cdrRead2(void) {
        else
                CDR_LOG_I("read empty fifo (%d)\n", cdr.FifoSize);
 
-       CDR_LOG_IO("cdr r2.dat: %02x\n", ret);
+       CDR_LOG_IO("cdr r2.x.dat: %02x\n", ret);
        return ret;
 }
 
 void cdrWrite2(unsigned char rt) {
-       const char *rnames[] = { "prm", "ien", "all", "arl" }; (void)rnames;
+       const char *rnames[] = { "0.prm", "1.ien", "2.all", "3.arl" }; (void)rnames;
        CDR_LOG_IO("cdr w2.%s: %02x\n", rnames[cdr.Ctrl & 3], rt);
 
        switch (cdr.Ctrl & 3) {
@@ -1536,12 +1555,13 @@ unsigned char cdrRead3(void) {
        else
                psxHu8(0x1803) = cdr.IrqMask | 0xE0;
 
-       CDR_LOG_IO("cdr r3.%s: %02x\n", (cdr.Ctrl & 1) ? "ifl" : "ien", psxHu8(0x1803));
+       CDR_LOG_IO("cdr r3.%d.%s: %02x\n", cdr.Ctrl & 3,
+               (cdr.Ctrl & 1) ? "ifl" : "ien", psxHu8(0x1803));
        return psxHu8(0x1803);
 }
 
 void cdrWrite3(unsigned char rt) {
-       const char *rnames[] = { "req", "ifl", "alr", "ava" }; (void)rnames;
+       const char *rnames[] = { "0.req", "1.ifl", "2.alr", "3.ava" }; (void)rnames;
        u8 ll, lr, rl, rr;
        CDR_LOG_IO("cdr w3.%s: %02x\n", rnames[cdr.Ctrl & 3], rt);
 
@@ -1588,8 +1608,8 @@ void cdrWrite3(unsigned char rt) {
                            rl == cdr.AttenuatorRightToLeft &&
                            rr == cdr.AttenuatorRightToRight)
                                return;
-                       cdr.AttenuatorLeftToLeftT = ll; cdr.AttenuatorLeftToRightT = lr;
-                       cdr.AttenuatorRightToLeftT = rl; cdr.AttenuatorRightToRightT = rr;
+                       cdr.AttenuatorLeftToLeft = ll; cdr.AttenuatorLeftToRight = lr;
+                       cdr.AttenuatorRightToLeft = rl; cdr.AttenuatorRightToRight = rr;
                        CDR_LOG_I("CD-XA Volume: %02x %02x | %02x %02x\n", ll, lr, rl, rr);
                        SPU_setCDvol(ll, lr, rl, rr, psxRegs.cycle);
                }
@@ -1635,6 +1655,7 @@ void psxDma3(u32 madr, u32 bcr, u32 chcr) {
 
        switch (chcr & 0x71000000) {
                case 0x11000000:
+                       madr &= ~3;
                        ptr = getDmaRam(madr, &max_words);
                        if (ptr == INVALID_PTR) {
                                CDR_LOG_I("psxDma3() Log: *** DMA 3 *** NULL Pointer!\n");
@@ -1714,30 +1735,14 @@ void cdrReset() {
        cdr.FilterChannel = 0;
        cdr.IrqMask = 0x1f;
        cdr.IrqStat = NoIntr;
-       cdr.FifoOffset = DATA_SIZE; // fifo empty
 
-       CDR_getStatus(&stat);
-       if (stat.Status & STATUS_SHELLOPEN) {
-               cdr.DriveState = DRIVESTATE_LID_OPEN;
-               cdr.StatP = STATUS_SHELLOPEN;
-       }
-       else if (CdromId[0] == '\0') {
-               cdr.DriveState = DRIVESTATE_STOPPED;
-               cdr.StatP = 0;
-       }
-       else {
-               cdr.DriveState = DRIVESTATE_STANDBY;
-               cdr.StatP = STATUS_ROTATING;
-       }
-       
        // BIOS player - default values
        cdr.AttenuatorLeftToLeft = 0x80;
        cdr.AttenuatorLeftToRight = 0x00;
        cdr.AttenuatorRightToLeft = 0x00;
        cdr.AttenuatorRightToRight = 0x80;
-       SPU_setCDvol(cdr.AttenuatorLeftToLeft, cdr.AttenuatorLeftToRight,
-               cdr.AttenuatorRightToLeft, cdr.AttenuatorRightToRight, psxRegs.cycle);
 
+       softReset();
        getCdInfo();
 }