CDVD: catch MEC/NVM file exception

It will stop the emulation and open a nice box with an error message instead of terminate PCSX2
This commit is contained in:
Gregory Hainaut 2016-08-15 14:09:01 +02:00
parent deb7121fde
commit 0f1c10230a

View File

@ -1420,9 +1420,10 @@ static __fi void fail_pol_cal()
static void cdvdWrite16(u8 rt) // SCOMMAND
{
// cdvdTN diskInfo;
// cdvdTD trackInfo;
// int i, lbn, type, min, sec, frm, address;
try {
// cdvdTN diskInfo;
// cdvdTD trackInfo;
// int i, lbn, type, min, sec, frm, address;
int address;
u8 tmp;
@ -1432,10 +1433,10 @@ static void cdvdWrite16(u8 rt) // SCOMMAND
cdvd.Result[0] = 0; // assume success -- failures will overwrite this with an error code.
switch (rt) {
// case 0x01: // GetDiscType - from cdvdman (0:1)
// SetResultSize(1);
// cdvd.Result[0] = 0;
// break;
// case 0x01: // GetDiscType - from cdvdman (0:1)
// SetResultSize(1);
// cdvd.Result[0] = 0;
// break;
case 0x02: // CdReadSubQ (0:11)
SetResultSize(11);
@ -1581,8 +1582,8 @@ static void cdvdWrite16(u8 rt) // SCOMMAND
}
break;
// case 0x0C: // sceCdSetHDMode (1:1)
// break;
// case 0x0C: // sceCdSetHDMode (1:1)
// break;
case 0x0F: // sceCdPowerOff (0:1)- Call74 from Xcdvdman
@ -1627,8 +1628,8 @@ static void cdvdWrite16(u8 rt) // SCOMMAND
cdvdWriteModelNumber(&cdvd.Param[1], cdvd.Param[0]);
break;
// case 0x19: // sceCdForbidRead (0:1) - from xcdvdman
// break;
// case 0x19: // sceCdForbidRead (0:1) - from xcdvdman
// break;
case 0x1A: // sceCdBootCertify (4:1)//(4:16 in psx?)
SetResultSize(1);//on input there are 4 bytes: 1;?10;J;C for 18000; 1;60;E;C for 39002 from ROMVER
@ -1645,8 +1646,8 @@ static void cdvdWrite16(u8 rt) // SCOMMAND
cdvd.Result[0] = 0;
break;
// case 0x1D: // cdvdman_call116 (0:5) - In V10 Bios
// break;
// case 0x1D: // cdvdman_call116 (0:5) - In V10 Bios
// break;
case 0x1E: // sceRemote2Read (0:5) - // 00 14 AA BB CC -> remote key code
SetResultSize(5);
@ -1657,8 +1658,8 @@ static void cdvdWrite16(u8 rt) // SCOMMAND
cdvd.Result[4] = 0x00;
break;
// case 0x1F: // sceRemote2_7 (2:1) - cdvdman_call117
// break;
// case 0x1F: // sceRemote2_7 (2:1) - cdvdman_call117
// break;
case 0x20: // sceRemote2_6 (0:3) // 00 01 00
SetResultSize(3);
@ -1667,8 +1668,8 @@ static void cdvdWrite16(u8 rt) // SCOMMAND
cdvd.Result[2] = 0x00;
break;
// case 0x21: // sceCdWriteWakeUpTime (8:1)
// break;
// case 0x21: // sceCdWriteWakeUpTime (8:1)
// break;
case 0x22: // sceCdReadWakeUpTime (0:10)
SetResultSize(10);
@ -1690,37 +1691,37 @@ static void cdvdWrite16(u8 rt) // SCOMMAND
cdvd.Result[0] = 0;
break;
// case 0x25: // cdvdman_call120 (1:1) - In V10 Bios
// break;
// case 0x25: // cdvdman_call120 (1:1) - In V10 Bios
// break;
// case 0x26: // cdvdman_call128 (0,3) - In V10 Bios
// break;
// case 0x26: // cdvdman_call128 (0,3) - In V10 Bios
// break;
// case 0x27: // cdvdman_call148 (0:13) - In V10 Bios
// break;
// case 0x27: // cdvdman_call148 (0:13) - In V10 Bios
// break;
// case 0x28: // cdvdman_call150 (1:1) - In V10 Bios
// break;
// case 0x28: // cdvdman_call150 (1:1) - In V10 Bios
// break;
case 0x29: //sceCdNoticeGameStart (1:1)
SetResultSize(1);
cdvd.Result[0] = 0;
break;
// case 0x2C: //sceCdXBSPowerCtl (2:2)
// break;
// case 0x2C: //sceCdXBSPowerCtl (2:2)
// break;
// case 0x2D: //sceCdXLEDCtl (2:2)
// break;
// case 0x2D: //sceCdXLEDCtl (2:2)
// break;
// case 0x2E: //sceCdBuzzerCtl (0:1)
// break;
// case 0x2E: //sceCdBuzzerCtl (0:1)
// break;
// case 0x2F: //cdvdman_call167 (16:1)
// break;
// case 0x2F: //cdvdman_call167 (16:1)
// break;
// case 0x30: //cdvdman_call169 (1:9)
// break;
// case 0x30: //cdvdman_call169 (1:9)
// break;
case 0x31: //sceCdSetMediumRemoval (1:1)
SetResultSize(1);
@ -1733,8 +1734,8 @@ static void cdvdWrite16(u8 rt) // SCOMMAND
//cdvd.Result[0] = 0; // fixme: I'm pretty sure that the same variable shouldn't be set twice here. Perhaps cdvd.Result[1]?
break;
// case 0x33: //sceCdXDVRPReset (1:1)
// break;
// case 0x33: //sceCdXDVRPReset (1:1)
// break;
case 0x36: //cdvdman_call189 [__sceCdReadRegionParams - made up name] (0:15) i think it is 16, not 15
SetResultSize(15);
@ -1745,14 +1746,14 @@ static void cdvdWrite16(u8 rt) // SCOMMAND
cdvd.Result[1] = 1 << cdvd.Result[1]; //encryption zone; see offset 0x1C in encrypted headers
//////////////////////////////////////////
cdvd.Result[2] = 0; //??
// cdvd.Result[3] == ROMVER[4] == *0xBFC7FF04
// cdvd.Result[4] == OSDVER[4] == CAP Jjpn, Aeng, Eeng, Heng, Reng, Csch, Kkor?
// cdvd.Result[5] == OSDVER[5] == small
// cdvd.Result[6] == OSDVER[6] == small
// cdvd.Result[7] == OSDVER[7] == small
// cdvd.Result[8] == VERSTR[0x22] == *0xBFC7FF52
// cdvd.Result[9] == DVDID J U O E A R C M
// cdvd.Result[10]== 0; //??
// cdvd.Result[3] == ROMVER[4] == *0xBFC7FF04
// cdvd.Result[4] == OSDVER[4] == CAP Jjpn, Aeng, Eeng, Heng, Reng, Csch, Kkor?
// cdvd.Result[5] == OSDVER[5] == small
// cdvd.Result[6] == OSDVER[6] == small
// cdvd.Result[7] == OSDVER[7] == small
// cdvd.Result[8] == VERSTR[0x22] == *0xBFC7FF52
// cdvd.Result[9] == DVDID J U O E A R C M
// cdvd.Result[10]== 0; //??
cdvd.Result[11] = 0; //??
cdvd.Result[12] = 0; //??
//////////////////////////////////////////
@ -2034,6 +2035,12 @@ static void cdvdWrite16(u8 rt) // SCOMMAND
//Console.WriteLn("SCMD - 0x%x\n", rt);
cdvd.ParamP = 0;
cdvd.ParamC = 0;
} catch (Exception::CannotCreateStream& ex) {
Cpu->ThrowException(Exception::RuntimeError()
.SetDiagMsg(L"Failed to read/write NMV/MEC file.")
.SetUserMsg(pxE( L"Failed to read/write NMV/MEC file. Check your bios setup/permission settings"))
);
}
}
static __fi void cdvdWrite17(u8 rt) { // SDATAIN