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
release r22
[pcsx_rearmed.git]
/
libpcsxcore
/
cdrom.c
diff --git
a/libpcsxcore/cdrom.c
b/libpcsxcore/cdrom.c
index
ca7f9f7
..
556b512
100644
(file)
--- a/
libpcsxcore/cdrom.c
+++ b/
libpcsxcore/cdrom.c
@@
-14,10
+14,10
@@
* You should have received a copy of the GNU General Public License *
* along with this program; if not, write to the *
* Free Software Foundation, Inc., *
* You should have received a copy of the GNU General Public License *
* along with this program; if not, write to the *
* Free Software Foundation, Inc., *
- * 51 Franklin Street, Fifth Floor, Boston, MA 0211
1-1307
USA. *
+ * 51 Franklin Street, Fifth Floor, Boston, MA 0211
0-1301
USA. *
***************************************************************************/
***************************************************************************/
-/*
+/*
* Handles all CD-ROM registers and functions.
*/
* Handles all CD-ROM registers and functions.
*/
@@
-126,7
+126,7
@@
unsigned char Test23[] = { 0x43, 0x58, 0x44, 0x32, 0x39 ,0x34, 0x30, 0x51 };
#define STATUS_ERROR (1<<0) // 0x01
/* Errors */
#define STATUS_ERROR (1<<0) // 0x01
/* Errors */
-#define ERROR_NOT
_READY
(1<<7) // 0x80
+#define ERROR_NOT
READY
(1<<7) // 0x80
#define ERROR_INVALIDCMD (1<<6) // 0x40
#define ERROR_INVALIDARG (1<<5) // 0x20
#define ERROR_INVALIDCMD (1<<6) // 0x40
#define ERROR_INVALIDARG (1<<5) // 0x20
@@
-205,7
+205,7
@@
static void sec2msf(unsigned int s, u8 *msf) {
cdr.Reading = 0; \
psxRegs.interrupt &= ~(1 << PSXINT_CDREAD); \
} \
cdr.Reading = 0; \
psxRegs.interrupt &= ~(1 << PSXINT_CDREAD); \
} \
- cdr.StatP &= ~
STATUS_READ
;\
+ cdr.StatP &= ~
(STATUS_READ|STATUS_SEEK)
;\
}
#define StopCdda() { \
}
#define StopCdda() { \
@@
-492,7
+492,10
@@
void cdrPlayInterrupt()
setIrq();
}
setIrq();
}
- memcpy(cdr.SetSectorPlay, cdr.SetSector, 4);
+ if (cdr.SetlocPending) {
+ memcpy(cdr.SetSectorPlay, cdr.SetSector, 4);
+ cdr.SetlocPending = 0;
+ }
Find_CurTrack(cdr.SetSectorPlay);
ReadTrack(cdr.SetSectorPlay);
cdr.TrackChanged = FALSE;
Find_CurTrack(cdr.SetSectorPlay);
ReadTrack(cdr.SetSectorPlay);
cdr.TrackChanged = FALSE;
@@
-574,13
+577,17
@@
void cdrInterrupt() {
case CdlSetloc:
break;
case CdlSetloc:
break;
+ do_CdlPlay:
case CdlPlay:
StopCdda();
if (cdr.Seeked == SEEK_PENDING) {
// XXX: wrong, should seek instead..
case CdlPlay:
StopCdda();
if (cdr.Seeked == SEEK_PENDING) {
// XXX: wrong, should seek instead..
- memcpy( cdr.SetSectorPlay, cdr.SetSector, 4 );
cdr.Seeked = SEEK_DONE;
}
cdr.Seeked = SEEK_DONE;
}
+ if (cdr.SetlocPending) {
+ memcpy(cdr.SetSectorPlay, cdr.SetSector, 4);
+ cdr.SetlocPending = 0;
+ }
// BIOS CD Player
// - Pause player, hit Track 01/02/../xx (Setloc issued!!)
// BIOS CD Player
// - Pause player, hit Track 01/02/../xx (Setloc issued!!)
@@
-900,13
+907,22
@@
void cdrInterrupt() {
case CdlReadN:
case CdlReadS:
case CdlReadN:
case CdlReadS:
+ if (cdr.SetlocPending) {
+ memcpy(cdr.SetSectorPlay, cdr.SetSector, 4);
+ cdr.SetlocPending = 0;
+ }
+ Find_CurTrack(cdr.SetSectorPlay);
+
+ if ((cdr.Mode & MODE_CDDA) && cdr.CurTrack > 1)
+ // Read* acts as play for cdda tracks in cdda mode
+ goto do_CdlPlay;
+
cdr.Reading = 1;
cdr.FirstSector = 1;
// Fighting Force 2 - update subq time immediately
// - fixes new game
cdr.Reading = 1;
cdr.FirstSector = 1;
// Fighting Force 2 - update subq time immediately
// - fixes new game
- Find_CurTrack(cdr.SetSector);
- ReadTrack(cdr.SetSector);
+ ReadTrack(cdr.SetSectorPlay);
// Crusaders of Might and Magic - update getlocl now
// Crusaders of Might and Magic - update getlocl now
@@
-968,7
+984,7
@@
void cdrInterrupt() {
case DRIVESTATE_PREPARE_CD:
SetResultSize(2);
cdr.Result[0] = cdr.StatP | STATUS_ERROR;
case DRIVESTATE_PREPARE_CD:
SetResultSize(2);
cdr.Result[0] = cdr.StatP | STATUS_ERROR;
- cdr.Result[1] = ERROR_NOT
_
READY;
+ cdr.Result[1] = ERROR_NOTREADY;
cdr.Stat = DiskError;
break;
}
cdr.Stat = DiskError;
break;
}
@@
-1057,7
+1073,7
@@
void cdrReadInterrupt() {
cdr.Result[0] = cdr.StatP;
cdr.Seeked = SEEK_DONE;
cdr.Result[0] = cdr.StatP;
cdr.Seeked = SEEK_DONE;
- ReadTrack(cdr.SetSector);
+ ReadTrack(cdr.SetSector
Play
);
buf = CDR_getBuffer();
if (buf == NULL)
buf = CDR_getBuffer();
if (buf == NULL)
@@
-1098,13
+1114,13
@@
void cdrReadInterrupt() {
}
}
}
}
- cdr.SetSector[2]++;
- if (cdr.SetSector[2] == 75) {
- cdr.SetSector[2] = 0;
- cdr.SetSector[1]++;
- if (cdr.SetSector[1] == 60) {
- cdr.SetSector[1] = 0;
- cdr.SetSector[0]++;
+ cdr.SetSector
Play
[2]++;
+ if (cdr.SetSector
Play
[2] == 75) {
+ cdr.SetSector
Play
[2] = 0;
+ cdr.SetSector
Play
[1]++;
+ if (cdr.SetSector
Play
[1] == 60) {
+ cdr.SetSector
Play
[1] = 0;
+ cdr.SetSector
Play
[0]++;
}
}
}
}
@@
-1124,7
+1140,7
@@
void cdrReadInterrupt() {
}
// update for CdlGetlocP
}
// update for CdlGetlocP
- ReadTrack(cdr.SetSector);
+ ReadTrack(cdr.SetSector
Play
);
}
/*
}
/*
@@
-1218,18
+1234,14
@@
void cdrWrite1(unsigned char rt) {
for (i = 0; i < 3; i++)
set_loc[i] = btoi(cdr.Param[i]);
for (i = 0; i < 3; i++)
set_loc[i] = btoi(cdr.Param[i]);
- // FIXME: clean up this SetSector/SetSectorPlay mess,
- // there should be single var tracking current sector pos
- if (cdr.Play)
- i = msf2sec(cdr.SetSectorPlay);
- else
- i = msf2sec(cdr.SetSector);
+ i = msf2sec(cdr.SetSectorPlay);
i = abs(i - msf2sec(set_loc));
if (i > 16)
cdr.Seeked = SEEK_PENDING;
memcpy(cdr.SetSector, set_loc, 3);
cdr.SetSector[3] = 0;
i = abs(i - msf2sec(set_loc));
if (i > 16)
cdr.Seeked = SEEK_PENDING;
memcpy(cdr.SetSector, set_loc, 3);
cdr.SetSector[3] = 0;
+ cdr.SetlocPending = 1;
break;
case CdlReadN:
break;
case CdlReadN:
@@
-1401,13
+1413,15
@@
void psxDma3(u32 madr, u32 bcr, u32 chcr) {
psxCpu->Clear(madr, cdsize / 4);
pTransfer += cdsize;
psxCpu->Clear(madr, cdsize / 4);
pTransfer += cdsize;
-
- // burst vs normal
if( chcr == 0x11400100 ) {
if( chcr == 0x11400100 ) {
+ HW_DMA3_MADR = SWAPu32(madr + cdsize);
CDRDMA_INT( (cdsize/4) / 4 );
}
else if( chcr == 0x11000000 ) {
CDRDMA_INT( (cdsize/4) / 4 );
}
else if( chcr == 0x11000000 ) {
- CDRDMA_INT( (cdsize/4) * 1 );
+ // CDRDMA_INT( (cdsize/4) * 1 );
+ // halted
+ psxRegs.cycle += (cdsize/4) * 24/2;
+ CDRDMA_INT(16);
}
return;
}
return;
@@
-1448,6
+1462,7
@@
void cdrReset() {
cdr.Reg2 = 0x1f;
cdr.Stat = NoIntr;
cdr.DriveState = DRIVESTATE_STANDBY;
cdr.Reg2 = 0x1f;
cdr.Stat = NoIntr;
cdr.DriveState = DRIVESTATE_STANDBY;
+ cdr.StatP = STATUS_ROTATING;
pTransfer = cdr.Transfer;
// BIOS player - default values
pTransfer = cdr.Transfer;
// BIOS player - default values
@@
-1466,7
+1481,7
@@
int cdrFreeze(void *f, int Mode) {
if (Mode == 0 && !Config.Cdda)
CDR_stop();
if (Mode == 0 && !Config.Cdda)
CDR_stop();
- cdr.freeze_ver = 0x6364720
1
;
+ cdr.freeze_ver = 0x6364720
2
;
gzfreeze(&cdr, sizeof(cdr));
if (Mode == 1) {
gzfreeze(&cdr, sizeof(cdr));
if (Mode == 1) {
@@
-1487,6
+1502,9
@@
int cdrFreeze(void *f, int Mode) {
ReadTrack(tmpp);
if (cdr.Play) {
ReadTrack(tmpp);
if (cdr.Play) {
+ if (cdr.freeze_ver < 0x63647202)
+ memcpy(cdr.SetSectorPlay, cdr.SetSector, 3);
+
Find_CurTrack(cdr.SetSectorPlay);
if (!Config.Cdda)
CDR_play(cdr.SetSectorPlay);
Find_CurTrack(cdr.SetSectorPlay);
if (!Config.Cdda)
CDR_play(cdr.SetSectorPlay);
@@
-1498,6
+1516,12
@@
int cdrFreeze(void *f, int Mode) {
SysPrintf("cdrom: fixing up old savestate\n");
cdr.Reg2 = 7;
}
SysPrintf("cdrom: fixing up old savestate\n");
cdr.Reg2 = 7;
}
+ // also did not save Attenuator..
+ if ((cdr.AttenuatorLeftToLeft | cdr.AttenuatorLeftToRight
+ | cdr.AttenuatorRightToLeft | cdr.AttenuatorRightToRight) == 0)
+ {
+ cdr.AttenuatorLeftToLeft = cdr.AttenuatorRightToRight = 0x80;
+ }
}
}
}
}