summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSND\notaz_cp <SND\notaz_cp@e17a0e51-4ae3-4d35-97c3-1a29b211df97>2013-01-19 00:34:58 +0000
committerSND\notaz_cp <SND\notaz_cp@e17a0e51-4ae3-4d35-97c3-1a29b211df97>2013-01-19 00:34:58 +0000
commitfa36f657238cb6d45db79290bbdaaeb9c384ed7f (patch)
tree14e40b653c57e295183138cd823737b697fa8da2
parente81dceb242a12650a4b259b3cbdc35a9155c9c9e (diff)
downloadpcsxr-fa36f657238cb6d45db79290bbdaaeb9c384ed7f.tar.gz
cdrom: move more handling to cdrInterrupt
git-svn-id: https://pcsxr.svn.codeplex.com/svn/pcsxr@82378 e17a0e51-4ae3-4d35-97c3-1a29b211df97
-rwxr-xr-xlibpcsxcore/cdrom.c132
1 files changed, 22 insertions, 110 deletions
diff --git a/libpcsxcore/cdrom.c b/libpcsxcore/cdrom.c
index 94d4fbc2..7d73d220 100755
--- a/libpcsxcore/cdrom.c
+++ b/libpcsxcore/cdrom.c
@@ -660,6 +660,7 @@ void cdrInterrupt() {
break;
case CdlPlay:
+ StopCdda();
if (cdr.Seeked == SEEK_PENDING) {
// XXX: wrong, should seek instead..
memcpy( cdr.SetSectorPlay, cdr.SetSector, 4 );
@@ -754,6 +755,18 @@ void cdrInterrupt() {
break;
case CdlStop:
+ if (cdr.Play) {
+ // grab time for current track
+ CDR_getTD((u8)(cdr.CurTrack), cdr.ResultTD);
+
+ cdr.SetSectorPlay[0] = cdr.ResultTD[2];
+ cdr.SetSectorPlay[1] = cdr.ResultTD[1];
+ cdr.SetSectorPlay[2] = cdr.ResultTD[0];
+ }
+
+ StopCdda();
+ StopReading();
+
delay = 0x800;
if (cdr.DriveState == DRIVESTATE_STANDBY)
delay = cdReadTime * 30 / 2;
@@ -800,12 +813,16 @@ void cdrInterrupt() {
break;
case CdlMute:
+ cdr.Muted = TRUE;
break;
case CdlDemute:
+ cdr.Muted = FALSE;
break;
case CdlSetfilter:
+ cdr.File = cdr.Param[0];
+ cdr.Channel = cdr.Param[1];
break;
case CdlSetmode:
@@ -874,6 +891,8 @@ void cdrInterrupt() {
case CdlSeekL:
case CdlSeekP:
+ StopCdda();
+ StopReading();
cdr.StatP |= STATUS_SEEK;
/*
@@ -966,7 +985,8 @@ void cdrInterrupt() {
case CdlReadN:
case CdlReadS:
- if (!cdr.Reading) return;
+ cdr.Reading = 1;
+ cdr.FirstSector = 1;
// Fighting Force 2 - update subq time immediately
// - fixes new game
@@ -1283,22 +1303,7 @@ void cdrWrite1(unsigned char rt) {
AddIrqQueue(cdr.Cmd, 0x800);
switch (cdr.Cmd) {
- case CdlSync:
- case CdlNop:
- case CdlForward:
- case CdlBackward:
- case CdlReadT:
- case CdlTest:
- case CdlID:
- case CdlReadToc:
- case CdlGetmode:
- case CdlGetlocL:
- case CdlGetlocP:
- case CdlGetTD:
- break;
-
case CdlSetloc:
- StopReading();
for (i = 0; i < 3; i++)
set_loc[i] = btoi(cdr.Param[i]);
@@ -1316,54 +1321,9 @@ void cdrWrite1(unsigned char rt) {
cdr.SetSector[3] = 0;
break;
- case CdlPlay:
- // Vib Ribbon: try same track again
- StopCdda();
-
- // Vib Ribbon - decoded buffer IRQ for CDDA reading
- // - fixes ribbon timing + music CD mode
- //CDRDBUF_INT( PSXCLK / 44100 * 0x100 );
-
- cdr.Play = TRUE;
-
- cdr.StatP |= STATUS_SEEK;
- cdr.StatP &= ~STATUS_ROTATING;
- break;
-
case CdlReadN:
- StopReading();
- cdr.Reading = 1;
- cdr.FirstSector = 1;
- cdr.Readed = 0xff;
- break;
-
- case CdlStandby:
- StopCdda();
- StopReading();
- break;
-
- case CdlStop:
- // GameShark CD Player: Reset CDDA to track start
- if (cdr.Play) {
- // grab time for current track
- CDR_getTD((u8)(cdr.CurTrack), cdr.ResultTD);
-
- cdr.SetSectorPlay[0] = cdr.ResultTD[2];
- cdr.SetSectorPlay[1] = cdr.ResultTD[1];
- cdr.SetSectorPlay[2] = cdr.ResultTD[0];
- }
-
- StopCdda();
- StopReading();
- break;
-
+ case CdlReadS:
case CdlPause:
- /*
- GameShark CD Player: save time for resume
-
- Twisted Metal - World Tour: don't mix Setloc / CdlPlay cursors
- */
-
StopCdda();
StopReading();
break;
@@ -1375,28 +1335,6 @@ void cdrWrite1(unsigned char rt) {
StopReading();
break;
- case CdlMute:
- cdr.Muted = TRUE;
- // Duke Nukem - Time to Kill
- // - do not directly set cd-xa volume
- //SPU_writeRegister( H_CDLeft, 0x0000 );
- //SPU_writeRegister( H_CDRight, 0x0000 );
- break;
-
- case CdlDemute:
- cdr.Muted = FALSE;
-
- // Duke Nukem - Time to Kill
- // - do not directly set cd-xa volume
- //SPU_writeRegister( H_CDLeft, 0x7f00 );
- //SPU_writeRegister( H_CDRight, 0x7f00 );
- break;
-
- case CdlSetfilter:
- cdr.File = cdr.Param[0];
- cdr.Channel = cdr.Param[1];
- break;
-
case CdlSetmode:
CDR_LOG("cdrWrite1() Log: Setmode %x\n", cdr.Param[0]);
@@ -1407,32 +1345,6 @@ void cdrWrite1(unsigned char rt) {
if( cdr.Play && (cdr.Mode & MODE_CDDA) == 0 )
StopCdda();
break;
-
- case CdlGetTN:
- //AddIrqQueue(cdr.Cmd, 0x800);
-
- // GameShark CDX CD Player: very long time
- AddIrqQueue(cdr.Cmd, 0x100000);
- break;
-
- case CdlSeekL:
- case CdlSeekP:
- // Tomb Raider 2 - reset cdda
- StopCdda();
- StopReading();
- break;
-
- case CdlReadS:
- StopReading();
- cdr.Reading = 2;
- cdr.FirstSector = 1;
- cdr.Readed = 0xff;
- break;
-
- default:
- cdr.ParamC = 0;
- CDR_LOG_I("cdrWrite1() Log: Unknown command: %x\n", cdr.Cmd);
- return;
}
}