cdrom: allow resetting with lid open
authornotaz <notasas@gmail.com>
Sat, 28 Oct 2023 22:19:32 +0000 (01:19 +0300)
committernotaz <notasas@gmail.com>
Sat, 28 Oct 2023 22:33:28 +0000 (01:33 +0300)
libretro/pcsx_rearmed#679

libpcsxcore/cdriso.c
libpcsxcore/cdrom.c
libpcsxcore/misc.c
libpcsxcore/misc.h
libpcsxcore/plugins.h
libpcsxcore/r3000a.c

index cb51060..a12ec31 100644 (file)
@@ -118,7 +118,6 @@ long CALLBACK CDR__configure(void);
 long CALLBACK CDR__test(void);
 void CALLBACK CDR__about(void);
 long CALLBACK CDR__setfilename(char *filename);
-long CALLBACK CDR__getStatus(struct CdrStat *stat);
 
 static void DecodeRawSubData(void);
 
index 99e8dcd..6f4e3eb 100644 (file)
@@ -1694,7 +1694,13 @@ void cdrReset() {
        cdr.Reg2 = 0x1f;
        cdr.Stat = NoIntr;
        cdr.FifoOffset = DATA_SIZE; // fifo empty
-       if (CdromId[0] == '\0') {
+
+       CDR_getStatus(&stat);
+       if (stat.Status & STATUS_SHELLOPEN) {
+               cdr.DriveState = DRIVESTATE_LID_OPEN;
+               cdr.StatP = STATUS_SHELLOPEN;
+       }
+       else if (CdromId[0] == '\0') {
                cdr.DriveState = DRIVESTATE_STOPPED;
                cdr.StatP = 0;
        }
index 526ebd4..f175e2a 100644 (file)
@@ -163,12 +163,19 @@ static void SetBootRegs(u32 pc, u32 gp, u32 sp)
        psxCpu->Notify(R3000ACPU_NOTIFY_AFTER_LOAD, NULL);
 }
 
-void BiosBootBypass() {
+int BiosBootBypass() {
+       struct CdrStat stat = { 0, 0, };
        assert(psxRegs.pc == 0x80030000);
 
+       // no bypass if the lid is open
+       CDR__getStatus(&stat);
+       if (stat.Status & 0x10)
+               return 0;
+
        // skip BIOS logos and region check
        psxCpu->Notify(R3000ACPU_NOTIFY_BEFORE_SAVE, NULL);
        psxRegs.pc = psxRegs.GPR.n.ra;
+       return 1;
 }
 
 static void getFromCnf(char *buf, const char *key, u32 *val)
index a1c36bb..539acc7 100644 (file)
@@ -57,7 +57,7 @@ extern char CdromId[10];
 extern char CdromLabel[33];
 extern int  CdromFrontendId; // for frontend use
 
-void BiosBootBypass();
+int BiosBootBypass();
 
 int LoadCdrom();
 int LoadCdromFile(const char *filename, EXE_HEADER *head);
index d208665..b106028 100644 (file)
@@ -161,6 +161,8 @@ extern CDRsetfilename        CDR_setfilename;
 extern CDRreadCDDA           CDR_readCDDA;\r
 extern CDRgetTE              CDR_getTE;\r
 \r
+long CALLBACK CDR__getStatus(struct CdrStat *stat);\r
+\r
 // SPU Functions\r
 typedef long (CALLBACK* SPUinit)(void);                                \r
 typedef long (CALLBACK* SPUshutdown)(void);    \r
index fb043ae..0c29dba 100644 (file)
@@ -76,8 +76,7 @@ void psxReset() {
        if (!Config.HLE) {
                psxExecuteBios();
                if (psxRegs.pc == 0x80030000 && !Config.SlowBoot) {
-                       BiosBootBypass();
-                       introBypassed = TRUE;
+                       introBypassed = BiosBootBypass();
                }
        }
        if (Config.HLE || introBypassed)