mirror of https://github.com/PCSX2/pcsx2.git
CDVD: Fix up Pause and some Status behaviour
This commit is contained in:
parent
589aba3713
commit
33ac2e7d15
|
@ -1028,14 +1028,8 @@ SCCS-40005:
|
||||||
name: "ICO"
|
name: "ICO"
|
||||||
region: "NTSC-C"
|
region: "NTSC-C"
|
||||||
clampModes:
|
clampModes:
|
||||||
eeClampMode: 2 # Game require EE clamping set to Extra + Preserve Sign to not freeze.
|
eeClampMode: 2 # Otherwise freezes in various spots, check full intro.
|
||||||
patches:
|
vuClampMode: 1 # Otherwise camera gets stuck off the player in various spots.
|
||||||
BF3A46DA:
|
|
||||||
content: |-
|
|
||||||
author=kozarovv
|
|
||||||
// Game expect sceCdStatPause at some point, but for some reason value is never set.
|
|
||||||
// So instead, set expected value to be sceCdStatSpin, to allow further modules loading.
|
|
||||||
patch=0,EE,0010EDD4,word,24100002
|
|
||||||
SCCS-40006:
|
SCCS-40006:
|
||||||
name: "Shin Sangoku Musou 2"
|
name: "Shin Sangoku Musou 2"
|
||||||
region: "NTSC-C"
|
region: "NTSC-C"
|
||||||
|
@ -3797,12 +3791,6 @@ SCPS-11021:
|
||||||
SCPS-11022:
|
SCPS-11022:
|
||||||
name: "Yoake no Mariko 2nd Act"
|
name: "Yoake no Mariko 2nd Act"
|
||||||
region: "NTSC-J"
|
region: "NTSC-J"
|
||||||
patches:
|
|
||||||
0cf7e6ff:
|
|
||||||
content: |-
|
|
||||||
comment=Patch by Prafull
|
|
||||||
// Fixes initial hang.
|
|
||||||
patch=1,EE,00176000,word,00000000
|
|
||||||
SCPS-11023:
|
SCPS-11023:
|
||||||
name: "Bravo Music - Chou-Meikyokuban"
|
name: "Bravo Music - Chou-Meikyokuban"
|
||||||
region: "NTSC-J"
|
region: "NTSC-J"
|
||||||
|
|
|
@ -893,6 +893,7 @@ __fi void cdvdReadInterrupt()
|
||||||
//Console.WriteLn("cdvdReadInterrupt %x %x %x %x %x", cpuRegs.interrupt, cdvd.Readed, cdvd.Reading, cdvd.nSectors, (HW_DMA3_BCR_H16 * HW_DMA3_BCR_L16) *4);
|
//Console.WriteLn("cdvdReadInterrupt %x %x %x %x %x", cpuRegs.interrupt, cdvd.Readed, cdvd.Reading, cdvd.nSectors, (HW_DMA3_BCR_H16 * HW_DMA3_BCR_L16) *4);
|
||||||
|
|
||||||
cdvd.Ready = CDVD_NOTREADY;
|
cdvd.Ready = CDVD_NOTREADY;
|
||||||
|
cdvd.Status = CDVD_STATUS_READ | CDVD_STATUS_SPIN;
|
||||||
if (!cdvd.Readed)
|
if (!cdvd.Readed)
|
||||||
{
|
{
|
||||||
// Seeking finished. Process the track we requested before, and
|
// Seeking finished. Process the track we requested before, and
|
||||||
|
@ -905,9 +906,6 @@ __fi void cdvdReadInterrupt()
|
||||||
cdvd.RetryCntP = 0;
|
cdvd.RetryCntP = 0;
|
||||||
cdvd.Reading = 1;
|
cdvd.Reading = 1;
|
||||||
cdvd.Readed = 1;
|
cdvd.Readed = 1;
|
||||||
//cdvd.Status = CDVD_STATUS_PAUSE; // check (rama)
|
|
||||||
cdvd.Status = CDVD_STATUS_READ | CDVD_STATUS_SPIN; // Time Crisis 2
|
|
||||||
|
|
||||||
cdvd.Sector = cdvd.SeekToSector;
|
cdvd.Sector = cdvd.SeekToSector;
|
||||||
|
|
||||||
CDVD_LOG("Cdvd Seek Complete > Scheduling block read interrupt at iopcycle=%8.8x.",
|
CDVD_LOG("Cdvd Seek Complete > Scheduling block read interrupt at iopcycle=%8.8x.",
|
||||||
|
@ -1002,9 +1000,11 @@ static uint cdvdStartSeek(uint newsector, CDVD_MODE_TYPE mode)
|
||||||
cdvd.Ready = CDVD_NOTREADY;
|
cdvd.Ready = CDVD_NOTREADY;
|
||||||
cdvd.Reading = 0;
|
cdvd.Reading = 0;
|
||||||
cdvd.Readed = 0;
|
cdvd.Readed = 0;
|
||||||
//cdvd.Status = CDVD_STATUS_STOP; // before r4961
|
|
||||||
//cdvd.Status = CDVD_STATUS_SEEK | CDVD_STATUS_SPIN; // Time Crisis 2 // but breaks ICO NTSC
|
// Okay so let's explain this, since people keep messing with it in the past and just poking it.
|
||||||
cdvd.Status = CDVD_STATUS_PAUSE; // best so far in my tests (rama)
|
// So when the drive is spinning, bit 0x2 is set on the Status, and bit 0x8 is set when the drive is not reading.
|
||||||
|
// So In the case where it's seeking to data it will be Spinning (0x2) not reading (0x8) and Seeking (0x10, but because seeking is also spinning 0x2 is also set))
|
||||||
|
cdvd.Status = CDVD_STATUS_SEEK | CDVD_STATUS_PAUSE;
|
||||||
|
|
||||||
if (!cdvd.Spinning)
|
if (!cdvd.Spinning)
|
||||||
{
|
{
|
||||||
|
@ -1255,9 +1255,6 @@ static void cdvdWrite04(u8 rt)
|
||||||
CDVD_LOG("cdvdWrite04: NCMD %s (%x) (ParamP = %x)", nCmdName[rt], rt, cdvd.ParamP);
|
CDVD_LOG("cdvdWrite04: NCMD %s (%x) (ParamP = %x)", nCmdName[rt], rt, cdvd.ParamP);
|
||||||
|
|
||||||
cdvd.nCommand = rt;
|
cdvd.nCommand = rt;
|
||||||
// Why fiddle with Status and PwOff here at all? (rama)
|
|
||||||
cdvd.Status = cdvd.Spinning ? CDVD_STATUS_SPIN : CDVD_STATUS_STOP; // checkme
|
|
||||||
cdvd.PwOff = Irq_None; // good or bad?
|
|
||||||
|
|
||||||
switch (rt)
|
switch (rt)
|
||||||
{
|
{
|
||||||
|
@ -1275,6 +1272,9 @@ static void cdvdWrite04(u8 rt)
|
||||||
cdvd.Action = cdvdAction_Standby;
|
cdvd.Action = cdvdAction_Standby;
|
||||||
cdvd.ReadTime = cdvdBlockReadTime(MODE_DVDROM);
|
cdvd.ReadTime = cdvdBlockReadTime(MODE_DVDROM);
|
||||||
CDVD_INT(cdvdStartSeek(0, MODE_DVDROM));
|
CDVD_INT(cdvdStartSeek(0, MODE_DVDROM));
|
||||||
|
// Might not seek, but makes sense since it does move to the inner most track
|
||||||
|
// It's only temporary until the interrupt anyway when it sets itself ready
|
||||||
|
cdvd.Status = CDVD_STATUS_SPIN | CDVD_STATUS_SEEK;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case N_CD_STOP: // CdStop
|
case N_CD_STOP: // CdStop
|
||||||
|
@ -1283,8 +1283,12 @@ static void cdvdWrite04(u8 rt)
|
||||||
CDVD_INT(PSXCLK / 6); // 166ms delay?
|
CDVD_INT(PSXCLK / 6); // 166ms delay?
|
||||||
break;
|
break;
|
||||||
|
|
||||||
// from an emulation point of view there is not much need to do anything for this one
|
|
||||||
case N_CD_PAUSE: // CdPause
|
case N_CD_PAUSE: // CdPause
|
||||||
|
// A few games rely on PAUSE setting the Status correctly.
|
||||||
|
// However we should probably stop any read in progress too, just to be safe
|
||||||
|
psxRegs.interrupt &= ~(1 << IopEvt_Cdvd);
|
||||||
|
cdvd.Ready = CDVD_READY2;
|
||||||
|
cdvd.Status = CDVD_STATUS_PAUSE;
|
||||||
cdvdSetIrq();
|
cdvdSetIrq();
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
@ -1292,6 +1296,7 @@ static void cdvdWrite04(u8 rt)
|
||||||
cdvd.Action = cdvdAction_Seek;
|
cdvd.Action = cdvdAction_Seek;
|
||||||
cdvd.ReadTime = cdvdBlockReadTime(MODE_DVDROM);
|
cdvd.ReadTime = cdvdBlockReadTime(MODE_DVDROM);
|
||||||
CDVD_INT(cdvdStartSeek(*(uint*)(cdvd.Param + 0), MODE_DVDROM));
|
CDVD_INT(cdvdStartSeek(*(uint*)(cdvd.Param + 0), MODE_DVDROM));
|
||||||
|
cdvd.Status = CDVD_STATUS_SEEK;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case N_CD_READ: // CdRead
|
case N_CD_READ: // CdRead
|
||||||
|
|
|
@ -50,17 +50,22 @@ enum CdvdIrqId
|
||||||
|
|
||||||
};
|
};
|
||||||
|
|
||||||
/* is cdvd.Status only for NCMDS? (linuzappz) */
|
/* Cdvd.Status bits and their meaning
|
||||||
/* cdvd.Status is a construction site as of now (rama)*/
|
0x0 = Stop
|
||||||
|
0x1 = Tray Open
|
||||||
|
0x2 = Spindle Motor Spinning
|
||||||
|
0x4 = Reading disc
|
||||||
|
0x8 = Ready but not reading
|
||||||
|
0x10 = Seeking
|
||||||
|
0x20 = Abnormal Termination
|
||||||
|
*/
|
||||||
enum cdvdStatus
|
enum cdvdStatus
|
||||||
{
|
{
|
||||||
//CDVD_STATUS_NONE = 0x00, // not sure ;)
|
|
||||||
//CDVD_STATUS_SEEK_COMPLETE = 0x0A,
|
|
||||||
CDVD_STATUS_STOP = 0x00,
|
CDVD_STATUS_STOP = 0x00,
|
||||||
CDVD_STATUS_TRAY_OPEN = 0x01, // confirmed to be tray open
|
CDVD_STATUS_TRAY_OPEN = 0x01, // confirmed to be tray open
|
||||||
CDVD_STATUS_SPIN = 0x02,
|
CDVD_STATUS_SPIN = 0x02,
|
||||||
CDVD_STATUS_READ = 0x06,
|
CDVD_STATUS_READ = 0x06,
|
||||||
CDVD_STATUS_PAUSE = 0x0A, // neutral value. Recommended to never rely on this.
|
CDVD_STATUS_PAUSE = 0x0A,
|
||||||
CDVD_STATUS_SEEK = 0x12,
|
CDVD_STATUS_SEEK = 0x12,
|
||||||
CDVD_STATUS_EMERGENCY = 0x20,
|
CDVD_STATUS_EMERGENCY = 0x20,
|
||||||
};
|
};
|
||||||
|
|
Loading…
Reference in New Issue