#if 0
#define CDR_LOG_I SysPrintf
#else
-#define CDR_LOG_I(...)
+#define CDR_LOG_I log_unhandled
#endif
#if 0
#define CDR_LOG_IO SysPrintf
return seekTime;
}
+static void cdrUpdateTransferBuf(const u8 *buf);
static void cdrReadInterrupt(void);
+static void cdrPrepCdda(s16 *buf, int samples);
+static void cdrAttenuate(s16 *buf, int samples, int stereo);
void cdrPlaySeekReadInterrupt(void)
{
cdrPlayInterrupt_Autopause();
if (!cdr.Muted && !Config.Cdda) {
+ cdrPrepCdda(read_buf, CD_FRAMESIZE_RAW / 4);
cdrAttenuate(read_buf, CD_FRAMESIZE_RAW / 4, 1);
SPU_playCDDAchannel(read_buf, CD_FRAMESIZE_RAW, psxRegs.cycle, cdr.FirstSector);
cdr.FirstSector = 0;
CDR_LOG_I("cdrom: cmd %02x with irqstat %x\n", cdr.CmdInProgress, cdr.Stat);
return;
}
+ if (cdr.Irq1Pending) {
+ // hand out the "newest" sector, according to nocash
+ cdrUpdateTransferBuf(CDR_getBuffer());
+ CDR_LOG_I("cdrom: %x:%02x:%02x loaded on ack\n",
+ cdr.Transfer[0], cdr.Transfer[1], cdr.Transfer[2]);
+ SetResultSize(1);
+ cdr.Result[0] = cdr.Irq1Pending;
+ cdr.Stat = (cdr.Irq1Pending & STATUS_ERROR) ? DiskError : DataReady;
+ cdr.Irq1Pending = 0;
+ setIrq(0x205);
+ return;
+ }
cdr.Ctrl &= ~0x80;
} while (0)
#endif
-void cdrAttenuate(s16 *buf, int samples, int stereo)
+static void cdrPrepCdda(s16 *buf, int samples)
+{
+#if __BYTE_ORDER__ == __ORDER_BIG_ENDIAN__
+ int i;
+ for (i = 0; i < samples; i++) {
+ buf[i * 2 + 0] = SWAP16(buf[i * 2 + 0]);
+ buf[i * 2 + 1] = SWAP16(buf[i * 2 + 1]);
+ }
+#endif
+}
+
+static void cdrAttenuate(s16 *buf, int samples, int stereo)
{
int i, l, r;
int ll = cdr.AttenuatorLeftToLeft;
CDRPLAYSEEKREAD_INT((cdr.Mode & MODE_SPEED) ? (cdReadTime / 2) : cdReadTime, 0);
}
-static void doMissedIrqs(void)
-{
- if (cdr.Irq1Pending)
- {
- // hand out the "newest" sector, according to nocash
- cdrUpdateTransferBuf(CDR_getBuffer());
- CDR_LOG_I("cdrom: %x:%02x:%02x loaded on ack\n",
- cdr.Transfer[0], cdr.Transfer[1], cdr.Transfer[2]);
- SetResultSize(1);
- cdr.Result[0] = cdr.Irq1Pending;
- cdr.Stat = (cdr.Irq1Pending & STATUS_ERROR) ? DiskError : DataReady;
- cdr.Irq1Pending = 0;
- setIrq(0x205);
- return;
- }
- if (!(psxRegs.interrupt & (1 << PSXINT_CDR)) && cdr.CmdInProgress)
- CDR_INT(256);
-}
-
/*
cdrRead0:
bit 0,1 - mode
case 0:
break; // transfer
case 1:
+ if (cdr.Stat & rt) {
#ifdef CDR_LOG_CMD_IRQ
- if (cdr.Stat & rt)
- SysPrintf("ack %02x\n", cdr.Stat & rt);
+ SysPrintf("ack %02x (w %02x)\n", cdr.Stat & rt, rt);
#endif
+ if (!(psxRegs.interrupt & (1 << PSXINT_CDR)) &&
+ (cdr.CmdInProgress || cdr.Irq1Pending))
+ CDR_INT(2000); // 710+
+ }
cdr.Stat &= ~rt;
if (rt & 0x40)
cdr.ParamC = 0;
- doMissedIrqs();
return;
case 2:
cdr.AttenuatorLeftToRightT = rt;
cdr.FifoOffset += size;
psxCpu->Clear(madr, size / 4);
}
+ if (size < cdsize)
+ CDR_LOG_I("cdrom: dma3 %d/%d\n", size, cdsize);
CDRDMA_INT((cdsize/4) * 24);
return;
default:
- CDR_LOG("psxDma3() Log: Unknown cddma %x\n", chcr);
+ CDR_LOG_I("psxDma3() Log: Unknown cddma %x\n", chcr);
break;
}