psx - fix some disc swapping screwups
This commit is contained in:
parent
a2e0191455
commit
dcd79cd678
Binary file not shown.
|
@ -93,22 +93,34 @@ void PS_CDC::DMForceStop(void)
|
||||||
|
|
||||||
void PS_CDC::OpenTray()
|
void PS_CDC::OpenTray()
|
||||||
{
|
{
|
||||||
|
//track the tray state
|
||||||
|
TrayOpen = true;
|
||||||
|
|
||||||
//effectively a NOP at t=0
|
//effectively a NOP at t=0
|
||||||
DMForceStop();
|
DMForceStop();
|
||||||
|
|
||||||
//zero 31-jan-2015 - psxtech says that what this is used for is actually a 'was open' flag which gets cleared after the status gets polled.
|
//zero 31-jan-2015 - psxtech says that what this is used for is actually a 'was open' flag which gets cleared after the status gets polled.
|
||||||
//so lets set it here, and rename it later if we're sure.
|
//so lets set it here, and rename it later if we're sure.
|
||||||
DiscChanged = true;
|
Status_TrayOpenBit = true;
|
||||||
|
|
||||||
|
//since Cur_disc tracks what the CDC sees mounted, it can't see anything now that it's open, so exchange these states
|
||||||
|
Open_disc = Cur_disc;
|
||||||
|
Cur_disc = NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
void PS_CDC::CloseTray(bool poke)
|
void PS_CDC::CloseTray(bool poke)
|
||||||
{
|
{
|
||||||
|
//track the tray state
|
||||||
|
TrayOpen = false;
|
||||||
|
|
||||||
//switch pending (open) disc to current disc
|
//switch pending (open) disc to current disc
|
||||||
Cur_disc = Open_disc;
|
Cur_disc = Open_disc;
|
||||||
Open_disc = NULL;
|
Open_disc = NULL;
|
||||||
|
|
||||||
|
//cache Open_DiscID and clear it out
|
||||||
char disc_id[5];
|
char disc_id[5];
|
||||||
strncpy(disc_id,(char*)Open_DiscID,4);
|
strncpy(disc_id,(char*)Open_DiscID,4);
|
||||||
Open_DiscID[0] = 0;
|
memset(Open_DiscID,0,sizeof(Open_DiscID));
|
||||||
|
|
||||||
//prepare analysis if disc: leave in empty state
|
//prepare analysis if disc: leave in empty state
|
||||||
IsPSXDisc = false;
|
IsPSXDisc = false;
|
||||||
|
@ -119,8 +131,8 @@ void PS_CDC::CloseTray(bool poke)
|
||||||
{
|
{
|
||||||
Cur_disc->ReadTOC((ShockTOC*)&toc,(ShockTOCTrack*)toc.tracks);
|
Cur_disc->ReadTOC((ShockTOC*)&toc,(ShockTOCTrack*)toc.tracks);
|
||||||
|
|
||||||
//complete analysis
|
//complete analysis. if we had a disc ID, then it's a PSX disc; copy it in
|
||||||
if(disc_id)
|
if(disc_id[0])
|
||||||
{
|
{
|
||||||
strncpy((char *)DiscID, disc_id, 4);
|
strncpy((char *)DiscID, disc_id, 4);
|
||||||
IsPSXDisc = true;
|
IsPSXDisc = true;
|
||||||
|
@ -238,7 +250,8 @@ void PS_CDC::SoftReset(void)
|
||||||
CommandLoc = 0;
|
CommandLoc = 0;
|
||||||
CommandLoc_Dirty = true;
|
CommandLoc_Dirty = true;
|
||||||
|
|
||||||
DiscChanged = true;
|
Status_TrayOpenBit = true;
|
||||||
|
TrayOpen = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
void PS_CDC::Power(void)
|
void PS_CDC::Power(void)
|
||||||
|
@ -255,7 +268,9 @@ void PS_CDC::Power(void)
|
||||||
|
|
||||||
SYNCFUNC(PS_CDC)
|
SYNCFUNC(PS_CDC)
|
||||||
{
|
{
|
||||||
NSS(DiscChanged);
|
NSS(TrayOpen);
|
||||||
|
|
||||||
|
NSS(Status_TrayOpenBit);
|
||||||
NSS(DiscStartupDelay);
|
NSS(DiscStartupDelay);
|
||||||
|
|
||||||
NSS(AudioBuffer);
|
NSS(AudioBuffer);
|
||||||
|
@ -434,7 +449,7 @@ uint8 PS_CDC::MakeStatus(bool cmd_error)
|
||||||
ret |= 0x40;
|
ret |= 0x40;
|
||||||
|
|
||||||
// TODO: shell open and seek error
|
// TODO: shell open and seek error
|
||||||
if(!Cur_CDIF || DiscChanged)
|
if(Status_TrayOpenBit)
|
||||||
ret |= 0x10;
|
ret |= 0x10;
|
||||||
|
|
||||||
if(DriveStatus != DS_STOPPED)
|
if(DriveStatus != DS_STOPPED)
|
||||||
|
@ -443,8 +458,6 @@ uint8 PS_CDC::MakeStatus(bool cmd_error)
|
||||||
if(cmd_error)
|
if(cmd_error)
|
||||||
ret |= 0x01;
|
ret |= 0x01;
|
||||||
|
|
||||||
DiscChanged = false;
|
|
||||||
|
|
||||||
return(ret);
|
return(ret);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1557,9 +1570,14 @@ bool PS_CDC::CommandCheckDiscPresent(void)
|
||||||
return(true);
|
return(true);
|
||||||
}
|
}
|
||||||
|
|
||||||
int32 PS_CDC::Command_Nop(const int arg_count, const uint8 *args)
|
int32 PS_CDC::Command_GetStat(const int arg_count, const uint8 *args)
|
||||||
{
|
{
|
||||||
WriteResult(MakeStatus());
|
WriteResult(MakeStatus());
|
||||||
|
|
||||||
|
//PSX-SPX: this command ACKs the TrayOpenBit if the shell is no longer open
|
||||||
|
if(!TrayOpen)
|
||||||
|
Status_TrayOpenBit = false;
|
||||||
|
|
||||||
WriteIRQ(CDCIRQ_ACKNOWLEDGE);
|
WriteIRQ(CDCIRQ_ACKNOWLEDGE);
|
||||||
|
|
||||||
return(0);
|
return(0);
|
||||||
|
@ -2401,7 +2419,7 @@ int32 PS_CDC::Command_0x1d(const int arg_count, const uint8 *args)
|
||||||
PS_CDC::CDC_CTEntry PS_CDC::Commands[0x20] =
|
PS_CDC::CDC_CTEntry PS_CDC::Commands[0x20] =
|
||||||
{
|
{
|
||||||
{ /* 0x00, */ 0, 0, NULL, NULL, NULL },
|
{ /* 0x00, */ 0, 0, NULL, NULL, NULL },
|
||||||
{ /* 0x01, */ 0, 0, "Nop", &PS_CDC::Command_Nop, NULL },
|
{ /* 0x01, */ 0, 0, "GetStat", &PS_CDC::Command_GetStat, NULL },
|
||||||
{ /* 0x02, */ 3, 3, "Setloc", &PS_CDC::Command_Setloc, NULL },
|
{ /* 0x02, */ 3, 3, "Setloc", &PS_CDC::Command_Setloc, NULL },
|
||||||
{ /* 0x03, */ 0, 1, "Play", &PS_CDC::Command_Play, NULL },
|
{ /* 0x03, */ 0, 1, "Play", &PS_CDC::Command_Play, NULL },
|
||||||
{ /* 0x04, */ 0, 0, "Forward", &PS_CDC::Command_Forward, NULL },
|
{ /* 0x04, */ 0, 0, "Forward", &PS_CDC::Command_Forward, NULL },
|
||||||
|
|
|
@ -50,11 +50,12 @@ class PS_CDC
|
||||||
private:
|
private:
|
||||||
CDIF *Cur_CDIF;
|
CDIF *Cur_CDIF;
|
||||||
ShockDiscRef* Cur_disc;
|
ShockDiscRef* Cur_disc;
|
||||||
|
bool TrayOpen;
|
||||||
|
|
||||||
ShockDiscRef* Open_disc; //the disc that's in the tray, while the tray is open. pending, kind of. used because Cur_disc != NULL is used as a tray-closed marker in the CDC code
|
ShockDiscRef* Open_disc; //the disc that's in the tray, while the tray is open. pending, kind of. used because Cur_disc != NULL is used as a tray-closed marker in the CDC code
|
||||||
uint8 Open_DiscID[4]; //same thing
|
uint8 Open_DiscID[4]; //same thing
|
||||||
|
|
||||||
bool DiscChanged;
|
bool Status_TrayOpenBit; //PSX-SPX calls it ShellOpen
|
||||||
int32 DiscStartupDelay;
|
int32 DiscStartupDelay;
|
||||||
|
|
||||||
CD_Audio_Buffer AudioBuffer;
|
CD_Audio_Buffer AudioBuffer;
|
||||||
|
@ -238,7 +239,7 @@ class PS_CDC
|
||||||
|
|
||||||
static CDC_CTEntry Commands[0x20];
|
static CDC_CTEntry Commands[0x20];
|
||||||
|
|
||||||
int32 Command_Nop(const int arg_count, const uint8 *args);
|
int32 Command_GetStat(const int arg_count, const uint8 *args);
|
||||||
int32 Command_Setloc(const int arg_count, const uint8 *args);
|
int32 Command_Setloc(const int arg_count, const uint8 *args);
|
||||||
int32 Command_Play(const int arg_count, const uint8 *args);
|
int32 Command_Play(const int arg_count, const uint8 *args);
|
||||||
int32 Command_Forward(const int arg_count, const uint8 *args);
|
int32 Command_Forward(const int arg_count, const uint8 *args);
|
||||||
|
|
Loading…
Reference in New Issue