notaz.gp2x.de
/
pcsx_rearmed.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
frontend: add toggle FPS option
[pcsx_rearmed.git]
/
libpcsxcore
/
cdrom.c
diff --git
a/libpcsxcore/cdrom.c
b/libpcsxcore/cdrom.c
index
a150db6
..
1aa958b
100644
(file)
--- a/
libpcsxcore/cdrom.c
+++ b/
libpcsxcore/cdrom.c
@@
-26,6
+26,7
@@
#include "psxdma.h"
cdrStruct cdr;
#include "psxdma.h"
cdrStruct cdr;
+static unsigned char *pTransfer;
/* CD-ROM magic numbers */
#define CdlSync 0
/* CD-ROM magic numbers */
#define CdlSync 0
@@
-539,7
+540,11
@@
static void Create_Fake_Subq()
static void cdrPlayInterrupt_Autopause()
{
struct SubQ *subq = (struct SubQ *)CDR_getBufferSub();
static void cdrPlayInterrupt_Autopause()
{
struct SubQ *subq = (struct SubQ *)CDR_getBufferSub();
+ int track_changed = 0;
if (subq != NULL ) {
if (subq != NULL ) {
+ // update subq
+ ReadTrack( cdr.SetSectorPlay );
+
#ifdef CDR_LOG
CDR_LOG( "CDDA SUB - %X:%X:%X\n",
subq->AbsoluteAddress[0], subq->AbsoluteAddress[1], subq->AbsoluteAddress[2] );
#ifdef CDR_LOG
CDR_LOG( "CDDA SUB - %X:%X:%X\n",
subq->AbsoluteAddress[0], subq->AbsoluteAddress[1], subq->AbsoluteAddress[2] );
@@
-552,8
+557,8
@@
static void cdrPlayInterrupt_Autopause()
Tomb Raider 1 ($7)
*/
Tomb Raider 1 ($7)
*/
- if( cdr.CurTrack
>
= btoi( subq->TrackNumber ) )
-
return
;
+ if( cdr.CurTrack
+ 1 =
= btoi( subq->TrackNumber ) )
+
track_changed = 1
;
} else {
Create_Fake_Subq();
#ifdef CDR_LOG___0
} else {
Create_Fake_Subq();
#ifdef CDR_LOG___0
@@
-561,13
+566,11
@@
static void cdrPlayInterrupt_Autopause()
fake_subq_real[0], fake_subq_real[1], fake_subq_real[2] );
#endif
fake_subq_real[0], fake_subq_real[1], fake_subq_real[2] );
#endif
- if( !fake_subq_change )
- return;
-
+ track_changed = fake_subq_change;
fake_subq_change = 0;
}
fake_subq_change = 0;
}
- if (
cdr.Mode & MODE_AUTOPAUSE
) {
+ if (
(cdr.Mode & MODE_AUTOPAUSE) && track_changed
) {
#ifdef CDR_LOG
CDR_LOG( "CDDA STOP\n" );
#endif
#ifdef CDR_LOG
CDR_LOG( "CDDA STOP\n" );
#endif
@@
-584,11
+587,6
@@
static void cdrPlayInterrupt_Autopause()
StopCdda();
}
if (cdr.Mode & MODE_REPORT) {
StopCdda();
}
if (cdr.Mode & MODE_REPORT) {
- // rearmed note: PCSX-Reloaded does this for every sector,
- // but we try to get away with only track change here.
- memset( cdr.Result, 0, 8 );
- cdr.Result[0] |= 0x10;
-
if (subq != NULL) {
#ifdef CDR_LOG
CDR_LOG( "REPPLAY SUB - %X:%X:%X\n",
if (subq != NULL) {
#ifdef CDR_LOG
CDR_LOG( "REPPLAY SUB - %X:%X:%X\n",
@@
-596,6
+594,10
@@
static void cdrPlayInterrupt_Autopause()
#endif
cdr.CurTrack = btoi( subq->TrackNumber );
#endif
cdr.CurTrack = btoi( subq->TrackNumber );
+ if (subq->AbsoluteAddress[2] & 0xf)
+ return;
+
+ cdr.Result[0] = cdr.StatP;
// BIOS CD Player: data already BCD format
cdr.Result[1] = subq->TrackNumber;
cdr.Result[2] = subq->IndexNumber;
// BIOS CD Player: data already BCD format
cdr.Result[1] = subq->TrackNumber;
cdr.Result[2] = subq->IndexNumber;
@@
-609,6
+611,10
@@
static void cdrPlayInterrupt_Autopause()
fake_subq_real[0], fake_subq_real[1], fake_subq_real[2] );
#endif
fake_subq_real[0], fake_subq_real[1], fake_subq_real[2] );
#endif
+ if (fake_subq_real[2] & 0xf)
+ return;
+
+ cdr.Result[0] = cdr.StatP;
// track # / index #
cdr.Result[1] = itob(cdr.CurTrack);
cdr.Result[2] = itob(fake_subq_index);
// track # / index #
cdr.Result[1] = itob(cdr.CurTrack);
cdr.Result[2] = itob(fake_subq_index);
@@
-956,6
+962,9
@@
void cdrInterrupt() {
subq = (struct SubQ *)CDR_getBufferSub();
if (subq != NULL) {
subq = (struct SubQ *)CDR_getBufferSub();
if (subq != NULL) {
+ // update subq
+ ReadTrack( cdr.SetSectorPlay );
+
cdr.Result[0] = subq->TrackNumber;
cdr.Result[1] = subq->IndexNumber;
memcpy(cdr.Result + 2, subq->TrackRelativeAddress, 3);
cdr.Result[0] = subq->TrackNumber;
cdr.Result[1] = subq->IndexNumber;
memcpy(cdr.Result + 2, subq->TrackRelativeAddress, 3);
@@
-1262,6
+1271,9
@@
void cdrInterrupt() {
Check_Shell( Irq );
Check_Shell( Irq );
+ cdr.ParamP = 0;
+ cdr.ParamC = 0;
+
if (cdr.Stat != NoIntr && cdr.Reg2 != 0x18) {
psxHu32ref(0x1070) |= SWAP32((u32)0x4);
}
if (cdr.Stat != NoIntr && cdr.Reg2 != 0x18) {
psxHu32ref(0x1070) |= SWAP32((u32)0x4);
}
@@
-1448,13
+1460,7
@@
void cdrWrite0(unsigned char rt) {
#ifdef CDR_LOG
CDR_LOG("cdrWrite0() Log: CD0 write: %x\n", rt);
#endif
#ifdef CDR_LOG
CDR_LOG("cdrWrite0() Log: CD0 write: %x\n", rt);
#endif
- cdr.Ctrl = rt | (cdr.Ctrl & ~0x3);
-
- if (rt == 0) {
- cdr.ParamP = 0;
- cdr.ParamC = 0;
- cdr.ResultReady = 0;
- }
+ cdr.Ctrl = (rt & 3) | (cdr.Ctrl & ~3);
}
unsigned char cdrRead1(void) {
}
unsigned char cdrRead1(void) {
@@
-1504,7
+1510,9
@@
void cdrWrite1(unsigned char rt) {
}
#endif
}
#endif
- if (cdr.Ctrl & 0x1) return;
+ if (cdr.Ctrl & 0x3) return;
+
+ cdr.ResultReady = 0;
switch (cdr.Cmd) {
case CdlSync:
switch (cdr.Cmd) {
case CdlSync:
@@
-1807,6
+1815,8
@@
void cdrWrite1(unsigned char rt) {
break;
default:
break;
default:
+ cdr.ParamP = 0;
+ cdr.ParamC = 0;
#ifdef CDR_LOG
CDR_LOG("cdrWrite1() Log: Unknown command: %x\n", cdr.Cmd);
#endif
#ifdef CDR_LOG
CDR_LOG("cdrWrite1() Log: Unknown command: %x\n", cdr.Cmd);
#endif
@@
-1823,7
+1833,7
@@
unsigned char cdrRead2(void) {
if (cdr.Readed == 0) {
ret = 0;
} else {
if (cdr.Readed == 0) {
ret = 0;
} else {
- ret = *
cdr.
pTransfer++;
+ ret = *pTransfer++;
}
#ifdef CDR_LOG
}
#ifdef CDR_LOG
@@
-1859,7
+1869,7
@@
void cdrWrite2(unsigned char rt) {
cdr.Reg2 = rt;
break;
}
cdr.Reg2 = rt;
break;
}
- } else if (!(cdr.Ctrl & 0x
1
) && cdr.ParamP < 8) {
+ } else if (!(cdr.Ctrl & 0x
3
) && cdr.ParamP < 8) {
cdr.Param[cdr.ParamP++] = rt;
cdr.ParamC++;
}
cdr.Param[cdr.ParamP++] = rt;
cdr.ParamC++;
}
@@
-1912,7
+1922,7
@@
void cdrWrite3(unsigned char rt) {
}
}
- if (rt == 0x07 &&
cdr.Ctrl & 0x
1) {
+ if (rt == 0x07 &&
(cdr.Ctrl & 3) ==
1) {
cdr.Stat = 0;
if (cdr.Irq == 0xff) {
cdr.Stat = 0;
if (cdr.Irq == 0xff) {
@@
-1937,18
+1947,18
@@
void cdrWrite3(unsigned char rt) {
return;
}
return;
}
- if (rt == 0x80 && !(cdr.Ctrl & 0x
1
) && cdr.Readed == 0) {
+ if (rt == 0x80 && !(cdr.Ctrl & 0x
3
) && cdr.Readed == 0) {
cdr.Readed = 1;
cdr.Readed = 1;
-
cdr.
pTransfer = cdr.Transfer;
+ pTransfer = cdr.Transfer;
switch (cdr.Mode & 0x30) {
case MODE_SIZE_2328:
case 0x00:
switch (cdr.Mode & 0x30) {
case MODE_SIZE_2328:
case 0x00:
-
cdr.
pTransfer += 12;
+ pTransfer += 12;
break;
case MODE_SIZE_2340:
break;
case MODE_SIZE_2340:
-
cdr.
pTransfer += 0;
+ pTransfer += 0;
break;
default:
break;
default:
@@
-2004,16
+2014,16
@@
void psxDma3(u32 madr, u32 bcr, u32 chcr) {
- CdlPlay
- Spams DMA3 and gets buffer overrun
*/
- CdlPlay
- Spams DMA3 and gets buffer overrun
*/
- size = CD_FRAMESIZE_RAW - (
cdr.
pTransfer - cdr.Transfer);
+ size = CD_FRAMESIZE_RAW - (pTransfer - cdr.Transfer);
if (size > cdsize)
size = cdsize;
if (size > 0)
{
if (size > cdsize)
size = cdsize;
if (size > 0)
{
- memcpy(ptr,
cdr.
pTransfer, size);
+ memcpy(ptr, pTransfer, size);
}
psxCpu->Clear(madr, cdsize / 4);
}
psxCpu->Clear(madr, cdsize / 4);
-
cdr.
pTransfer += cdsize;
+ pTransfer += cdsize;
// burst vs normal
// burst vs normal
@@
-2050,6
+2060,7
@@
void cdrReset() {
cdr.CurTrack = 1;
cdr.File = 1;
cdr.Channel = 1;
cdr.CurTrack = 1;
cdr.File = 1;
cdr.Channel = 1;
+ pTransfer = cdr.Transfer;
// BIOS player - default values
cdr.AttenuatorLeft[0] = 0x80;
// BIOS player - default values
cdr.AttenuatorLeft[0] = 0x80;
@@
-2059,8
+2070,7
@@
void cdrReset() {
}
int cdrFreeze(gzFile f, int Mode) {
}
int cdrFreeze(gzFile f, int Mode) {
- uintptr_t tmp;
-
+ u32 tmp;
if( Mode == 0 ) {
StopCdda();
if( Mode == 0 ) {
StopCdda();
@@
-2069,12
+2079,16
@@
int cdrFreeze(gzFile f, int Mode) {
gzfreeze(&cdr, sizeof(cdr));
if (Mode == 1)
gzfreeze(&cdr, sizeof(cdr));
if (Mode == 1)
- tmp =
cdr.
pTransfer - cdr.Transfer;
+ tmp = pTransfer - cdr.Transfer;
gzfreeze(&tmp, sizeof(tmp));
gzfreeze(&tmp, sizeof(tmp));
- if (Mode == 0)
- cdr.pTransfer = cdr.Transfer + tmp;
+ if (Mode == 0) {
+ pTransfer = cdr.Transfer + tmp;
+
+ if (cdr.Play && !Config.Cdda)
+ CDR_play(cdr.SetSectorPlay);
+ }
return 0;
}
return 0;
}