Add DVDLowOpenPartition

git-svn-id: https://dolphin-emu.googlecode.com/svn/trunk@3070 8ced0084-cf51-0410-be5f-012b33b47a6e
This commit is contained in:
Shawn Hoffman 2009-04-25 07:49:48 +00:00
parent a8c224023c
commit 72febe7b8a
3 changed files with 242 additions and 110 deletions

View File

@ -15,10 +15,6 @@
// Official SVN repository and contact information can be found at
// http://code.google.com/p/dolphin-emu/
//////////////////////////////////////////////////////////////////////////////////////////
// Include
// ¯¯¯¯¯¯¯¯¯¯
#include "Common.h"
#include "WII_IPC_HLE_Device_DI.h"
@ -31,17 +27,13 @@
#include "VolumeCreator.h"
#include "Filesystem.h"
///////////////////////////////////
//////////////////////////////////////////////////
// Music mod
// ¯¯¯¯¯¯¯¯¯¯
#include "Setup.h" // Define MUSICMOD here
#ifdef MUSICMOD
#include "../../../../Externals/MusicMod/Main/Src/Main.h"
#endif
///////////////////////
CWII_IPC_HLE_Device_di::CWII_IPC_HLE_Device_di(u32 _DeviceID, const std::string& _rDeviceName )
@ -56,10 +48,14 @@ CWII_IPC_HLE_Device_di::CWII_IPC_HLE_Device_di(u32 _DeviceID, const std::string&
CWII_IPC_HLE_Device_di::~CWII_IPC_HLE_Device_di()
{
if(m_pFileSystem) { delete m_pFileSystem; m_pFileSystem = NULL; }
/* This caused the crash in VolumeHandler.cpp, setting m_pVolume = NULL; didn't help
it still makes VolumeHandler.cpp have a non-NULL pointer with no content so that
delete crashes */
if (m_pFileSystem)
{
delete m_pFileSystem;
m_pFileSystem = NULL;
}
// This caused the crash in VolumeHandler.cpp, setting m_pVolume = NULL; didn't help
// it still makes VolumeHandler.cpp have a non-NULL pointer with no content so that
// delete crashes
//if(m_pVolume) { delete m_pVolume; m_pVolume = NULL; }
}
@ -88,7 +84,8 @@ bool CWII_IPC_HLE_Device_di::IOCtl(u32 _CommandAddress)
u32 BufferOutSize = Memory::Read_U32(_CommandAddress + 0x1C);
u32 Command = Memory::Read_U32(BufferIn) >> 24;
DEBUG_LOG(WII_IPC_DVD, "%s - Command(0x%08x) BufferIn(0x%08x, 0x%x) BufferOut(0x%08x, 0x%x)", GetDeviceName().c_str(), Command, BufferIn, BufferInSize, BufferOut, BufferOutSize);
DEBUG_LOG(WII_IPC_DVD, "%s - Command(0x%08x) BufferIn(0x%08x, 0x%x) BufferOut(0x%08x, 0x%x)",
GetDeviceName().c_str(), Command, BufferIn, BufferInSize, BufferOut, BufferOutSize);
u32 ReturnValue = ExecuteCommand(BufferIn, BufferInSize, BufferOut, BufferOutSize);
Memory::Write_U32(ReturnValue, _CommandAddress + 0x4);
@ -98,28 +95,61 @@ bool CWII_IPC_HLE_Device_di::IOCtl(u32 _CommandAddress)
bool CWII_IPC_HLE_Device_di::IOCtlV(u32 _CommandAddress)
{
// PanicAlert("CWII_IPC_HLE_Device_di::IOCtlV() unknown");
// DumpCommands(_CommandAddress);
u32 ReturnValue = 0;
INFO_LOG(WII_IPC_DVD, "*******************************");
INFO_LOG(WII_IPC_DVD, "CWII_IPC_DVD_Device_di::IOCtlV");
INFO_LOG(WII_IPC_DVD, "*******************************");
SIOCtlVBuffer CommandBuffer(_CommandAddress);
// Prepare the out buffer(s) with zeros as a safety precaution
// to avoid returning bad values
for(u32 i = 0; i < CommandBuffer.NumberPayloadBuffer; i++)
{
Memory::Memset(CommandBuffer.PayloadBuffer[i].m_Address, 0,
CommandBuffer.PayloadBuffer[i].m_Size);
}
u32 ReturnValue = 0;
switch (CommandBuffer.Parameter)
{
// DVDLowOpenPartition???
// DVDLowOpenPartition
case 0x8b:
{
INFO_LOG(WII_IPC_DVD, "DVD IOCtlV: DVDLowOpenPartition");
_dbg_assert_msg_(WII_IPC_DVD, 0, "DVD IOCtlV: DVDLowOpenPartition");
_dbg_assert_msg_(WII_IPC_DVD, CommandBuffer.InBuffer[1].m_Address == 0, "DVDLowOpenPartition with ticket");
_dbg_assert_msg_(WII_IPC_DVD, CommandBuffer.InBuffer[2].m_Address == 0, "DVDLowOpenPartition with cert chain");
u8 partition = Memory::Read_U32(CommandBuffer.m_Address + 4);
INFO_LOG(WII_IPC_DVD, "DVD IOCtlV: DVDLowOpenPartition %i", partition);
bool readOK = false;
// Get the info table
u8 pInfoTableOffset[4];
readOK |= VolumeHandler::RAWReadToPtr(pInfoTableOffset, 0x40004, 4);
u64 InfoTableOffset = (u32)(pInfoTableOffset[3] | pInfoTableOffset[2] << 8 | pInfoTableOffset[1] << 16 | pInfoTableOffset[0] << 24) << 2;
// Get the offset of the partition
u8 pInfoTableEntryOffset[4];
readOK |= VolumeHandler::RAWReadToPtr(pInfoTableEntryOffset, InfoTableOffset + (partition << 2) + 4, 4);
u64 PartitionOffset = (u32)(pInfoTableEntryOffset[3] | pInfoTableEntryOffset[2] << 8 | pInfoTableEntryOffset[1] << 16 | pInfoTableEntryOffset[0] << 24) << 2;
// Read TMD to the buffer
readOK |= VolumeHandler::RAWReadToPtr(Memory::GetPointer(CommandBuffer.PayloadBuffer[0].m_Address),
PartitionOffset + 0x2c0, CommandBuffer.PayloadBuffer[0].m_Size);
// Second outbuffer is error, we can ignore it
ReturnValue = readOK ? 1 : 0;
}
break;
default:
INFO_LOG(WII_IPC_DVD, "DVD IOCtlV: %i", CommandBuffer.Parameter);
_dbg_assert_msg_(WII_IPC_DVD, 0, "DVD: %i", CommandBuffer.Parameter);
ERROR_LOG(WII_IPC_DVD, "DVD IOCtlV: %i", CommandBuffer.Parameter);
_dbg_assert_msg_(WII_IPC_DVD, 0, "DVD IOCtlV: %i", CommandBuffer.Parameter);
break;
}
Memory::Write_U32(ReturnValue, _CommandAddress+4);
Memory::Write_U32(ReturnValue, _CommandAddress + 4);
return true;
}
@ -127,11 +157,11 @@ u32 CWII_IPC_HLE_Device_di::ExecuteCommand(u32 _BufferIn, u32 _BufferInSize, u32
{
u32 Command = Memory::Read_U32(_BufferIn) >> 24;
/* Set out buffer to zeroes as a safety precaution to avoid answering
nonsense values */
// TATSUNOKO VS CAPCOM: Gets here with _BufferOut == 0x0!!!
if (_BufferOut != 0) {
// TATSUNOKO VS CAPCOM: Gets here with _BufferOut == 0!!!
if (_BufferOut != 0)
{
// Set out buffer to zeroes as a safety precaution to avoid answering
// nonsense values
Memory::Memset(_BufferOut, 0, _BufferOutSize);
}
@ -150,94 +180,98 @@ u32 CWII_IPC_HLE_Device_di::ExecuteCommand(u32 _BufferIn, u32 _BufferInSize, u32
0x0000, 0x0002, 0x20060526, I tried it in Balls of Fury that gives a DVD error
message after the DVDLowInquiry, but that did't change anything, it must be
something else. */
buffer[0] = 0x01; // rev
buffer[1] = 0x02;
buffer[2] = 0x03; // dev code
buffer[3] = 0x04;
buffer[4] = 0x20; // firmware date
buffer[5] = 0x08;
buffer[6] = 0x08;
buffer[7] = 0x29;
// buffer[0] = 0x01; // rev
// buffer[1] = 0x02;
// buffer[2] = 0x03; // dev code
// buffer[3] = 0x04;
// buffer[4] = 0x20; // firmware date
// buffer[5] = 0x08;
// buffer[6] = 0x08;
// buffer[7] = 0x29;
DEBUG_LOG(WII_IPC_DVD, "%s executes DVDLowInquiry (Buffer 0x%08x, 0x%x)", GetDeviceName().c_str(), _BufferOut, _BufferOutSize);
return 0x1;
buffer[4] = 0x20; // firmware date
buffer[5] = 0x02;
buffer[6] = 0x04;
buffer[7] = 0x02;
buffer[8] = 0x61; // version
DEBUG_LOG(WII_IPC_DVD, "%s executes DVDLowInquiry (Buffer 0x%08x, 0x%x)",
GetDeviceName().c_str(), _BufferOut, _BufferOutSize);
return 1;
}
break;
// DVDLowReadDiskID
case 0x70:
{
// TODO - verify that this is correct
VolumeHandler::ReadToPtr(Memory::GetPointer(_BufferOut), 0, _BufferOutSize);
VolumeHandler::RAWReadToPtr(Memory::GetPointer(_BufferOut), 0, _BufferOutSize);
DEBUG_LOG(WII_IPC_DVD, "%s executes DVDLowReadDiskID (Buffer 0x%08x, 0x%x)", GetDeviceName().c_str(), _BufferOut, _BufferOutSize);
return 0x1;
DEBUG_LOG(WII_IPC_DVD, "%s executes DVDLowReadDiskID 0x%08x",
GetDeviceName().c_str(), Memory::Read_U64(_BufferOut));
return 1;
}
break;
// DVDLowRead
case 0x71:
{
// DVDLowRead
case 0x71:
{
if (_BufferOut == 0)
{
PanicAlert("DVDLowRead : _BufferOut == 0");
return 0;
}
u32 Size = Memory::Read_U32(_BufferIn + 0x04);
u64 DVDAddress = (u64)Memory::Read_U32(_BufferIn + 0x08) << 2;
u32 Size = Memory::Read_U32(_BufferIn + 0x04);
u64 DVDAddress = (u64)Memory::Read_U32(_BufferIn + 0x08) << 2;
const char *pFilename = m_pFileSystem->GetFileName(DVDAddress);
if (pFilename != NULL)
{
INFO_LOG(WII_IPC_DVD, " DVDLowRead: %s (0x%x) - (DVDAddr: 0x%x, Size: 0x%x)", pFilename, m_pFileSystem->GetFileSize(pFilename), DVDAddress, Size);
}
else
{
INFO_LOG(WII_IPC_DVD, " DVDLowRead: file unkw - (DVDAddr: 0x%x, Size: 0x%x)", GetDeviceName().c_str(), DVDAddress, Size);
}
const char *pFilename = m_pFileSystem->GetFileName(DVDAddress);
if (pFilename != NULL)
{
INFO_LOG(WII_IPC_DVD, " DVDLowRead: %s (0x%x) - (DVDAddr: 0x%x, Size: 0x%x)",
pFilename, m_pFileSystem->GetFileSize(pFilename), DVDAddress, Size);
}
else
{
INFO_LOG(WII_IPC_DVD, " DVDLowRead: file unkw - (DVDAddr: 0x%x, Size: 0x%x)",
GetDeviceName().c_str(), DVDAddress, Size);
}
if (Size > _BufferOutSize)
{
PanicAlert("Detected attempt to read more data from the DVD than fit inside the out buffer. Clamp.");
Size = _BufferOutSize;
}
if (Size > _BufferOutSize)
{
PanicAlert("Detected attempt to read more data from the DVD than fit inside the out buffer. Clamp.");
Size = _BufferOutSize;
}
if (VolumeHandler::ReadToPtr(Memory::GetPointer(_BufferOut), DVDAddress, Size) != true)
{
PanicAlert("Cant read from DVD_Plugin - DVD-Interface: Fatal Error");
}
if (!VolumeHandler::ReadToPtr(Memory::GetPointer(_BufferOut), DVDAddress, Size))
{
PanicAlert("Cant read from DVD_Plugin - DVD-Interface: Fatal Error");
}
//////////////////////////////////////////////////
// Music mod
// ¯¯¯¯¯¯¯¯¯¯
#ifdef MUSICMOD
std::string Tmp = pFilename;
MusicMod::CheckFile(Tmp);
std::string Tmp = pFilename;
MusicMod::CheckFile(Tmp);
#endif
///////////////////////
return 0x1;
}
break;
return 1;
}
break;
// DVDLowWaitForCoverClose
case 0x79:
{
Memory::Memset(_BufferOut, 0, _BufferOutSize);
INFO_LOG(WII_IPC_DVD, "%s executes DVDLowWaitForCoverClose (Buffer 0x%08x, 0x%x)", GetDeviceName().c_str(), _BufferOut, _BufferOutSize);
{
INFO_LOG(WII_IPC_DVD, "%s executes DVDLowWaitForCoverClose (Buffer 0x%08x, 0x%x)",
GetDeviceName().c_str(), _BufferOut, _BufferOutSize);
return 4;
}
break;
// DVDLowPrepareCoverRegister
// DVDLowGetCoverReg - Called by "Legend of Spyro" and MP3
case 0x7a:
{
INFO_LOG(WII_IPC_DVD, "%s executes DVDLowGetCoverReg (Buffer 0x%08x, 0x%x)", GetDeviceName().c_str(), _BufferOut, _BufferOutSize);
// Write zeroes to the out buffer just in case there is some nonsense data there
Memory::Memset(_BufferOut, 0, _BufferOutSize);
INFO_LOG(WII_IPC_DVD, "%s executes DVDLowGetCoverReg (Buffer 0x%08x, 0x%x)",
GetDeviceName().c_str(), _BufferOut, _BufferOutSize);
// --------------------------------------------------------------------
/* Hack for Legend of Spyro. Switching the 4th byte between 0 and 1 gets
@ -262,19 +296,40 @@ u32 CWII_IPC_HLE_Device_di::ExecuteCommand(u32 _BufferIn, u32 _BufferInSize, u32
}
break;
// DVDLowNotifyReset
case 0x7e:
PanicAlert("DVDLowNotifyReset");
break;
// DVDLowReadDvdPhysical
case 0x80:
PanicAlert("DVDLowReadDvdPhysical");
break;
// DVDLowReadDvdCopyright
case 0x81:
PanicAlert("DVDLowReadDvdCopyright");
break;
// DVDLowReadDvdDiscKey
case 0x82:
PanicAlert("DVDLowReadDvdDiscKey");
break;
// DVDLowClearCoverInterrupt
case 0x86:
{
Memory::Memset(_BufferOut, 0, _BufferOutSize);
INFO_LOG(WII_IPC_DVD, "%s executes DVDLowClearCoverInterrupt (Buffer 0x%08x, 0x%x)", GetDeviceName().c_str(), _BufferOut, _BufferOutSize);
INFO_LOG(WII_IPC_DVD, "%s executes DVDLowClearCoverInterrupt (Buffer 0x%08x, 0x%x)",
GetDeviceName().c_str(), _BufferOut, _BufferOutSize);
return 1;
}
break;
// DVDLowGetCoverStatus
case 0x88:
{
Memory::Memset(_BufferOut, 0, _BufferOutSize);
INFO_LOG(WII_IPC_DVD, "%s executes DVDLowGetCoverStatus (Buffer 0x%08x, 0x%x)", GetDeviceName().c_str(), _BufferOut, _BufferOutSize);
INFO_LOG(WII_IPC_DVD, "%s executes DVDLowGetCoverStatus (Buffer 0x%08x, 0x%x)",
GetDeviceName().c_str(), _BufferOut, _BufferOutSize);
return 1;
}
break;
@ -282,24 +337,27 @@ u32 CWII_IPC_HLE_Device_di::ExecuteCommand(u32 _BufferIn, u32 _BufferInSize, u32
// DVDLowReset
case 0x8a:
{
Memory::Memset(_BufferOut, 0, _BufferOutSize);
INFO_LOG(WII_IPC_DVD, "%s executes DVDLowReset (Buffer 0x%08x, 0x%x)", GetDeviceName().c_str(), _BufferOut, _BufferOutSize);
INFO_LOG(WII_IPC_DVD, "%s executes DVDLowReset (Buffer 0x%08x, 0x%x)",
GetDeviceName().c_str(), _BufferOut, _BufferOutSize);
return 1;
}
break;
// DVDLowOpenPartition
case 0x8b:
PanicAlert("DVDLowOpenPartition", Command);
PanicAlert("DVDLowOpenPartition");
return 1;
break;
// DVDLowClosePartition
case 0x8c:
//PanicAlert("DVDLowClosePartition");
DEBUG_LOG(WII_IPC_DVD, "DVDLowClosePartition");
return 1;
break;
// DVDLowUnencryptedRead
case 0x8d:
//PanicAlert("DVDLowUnencryptedRead");
DEBUG_LOG(WII_IPC_DVD, "DVDLowUnencryptedRead");
{
if (_BufferOut == 0)
{
@ -315,40 +373,106 @@ u32 CWII_IPC_HLE_Device_di::ExecuteCommand(u32 _BufferIn, u32 _BufferInSize, u32
Size = _BufferOutSize;
}
if (VolumeHandler::RAWReadToPtr(Memory::GetPointer(_BufferOut), DVDAddress, Size) != true)
if (!VolumeHandler::RAWReadToPtr(Memory::GetPointer(_BufferOut), DVDAddress, Size))
{
PanicAlert("Cant read from DVD_Plugin - DVD-Interface: Fatal Error");
}
}
return 1;
}
break;
// DVDLowSeek
case 0xab:
//PanicAlert("DVDLowSeek");
break;
case 0xe0:
PanicAlert("DVD unknown command 0xe0, so far only seen in Tatsunoko. Don't know what to do, things will probably go wrong.");
// DVDLowEnableDvdVideo
case 0x8e:
PanicAlert("DVDLowEnableDvdVideo");
break;
// DVDLowReportKey
case 0xa4:
PanicAlert("DVDLowReportKey");
break;
// DVDLowSeek
case 0xab:
PanicAlert("DVDLowSeek");
break;
// Apparently Dx commands have never been seen in dolphin? *shrug*
// DVDLowReadDvd
case 0xd0:
PanicAlert("DVDLowReadDvd");
break;
// DVDLowReadDvdConfig
case 0xd1:
PanicAlert("DVDLowReadDvdConfig");
break;
// DVDLowStopLaser
case 0xd2:
PanicAlert("DVDLowStopLaser");
break;
// DVDLowOffset
case 0xd9:
PanicAlert("DVDLowOffset");
break;
// DVDLowReadDiskBca
case 0xda:
PanicAlert("DVDLowReadDiskBca");
break;
// DVDLowRequestDiscStatus
case 0xdb:
PanicAlert("DVDLowRequestDiscStatus");
break;
// DVDLowRequestRetryNumber
case 0xdc:
PanicAlert("DVDLowRequestRetryNumber");
break;
// DVDLowSetMaximumRotation
case 0xdd:
PanicAlert("DVDLowSetMaximumRotation");
break;
// DVDLowSerMeasControl
case 0xdf:
PanicAlert("DVDLowSerMeasControl");
break;
// DVDLowRequestError
case 0xe0:
// Identical to the error codes found in yagcd section 5.7.3.5.1 (so far)
PanicAlert("DVDLowRequestError");
break;
// Ex commands are immediate and respond with 4 bytes
// DVDLowStopMotor
case 0xe3:
{
Memory::Memset(_BufferOut, 0, _BufferOutSize);
u32 eject = Memory::Read_U32(_BufferIn + 0x04);
INFO_LOG(WII_IPC_DVD, "%s executes DVDLowStopMotor (Buffer 0x%08x, 0x%x)", GetDeviceName().c_str(), _BufferOut, _BufferOutSize);
INFO_LOG(WII_IPC_DVD, "%s executes DVDLowStopMotor eject = %s",
GetDeviceName().c_str(), eject ? "true" : "false");
if(eject)
if (eject)
{
INFO_LOG(WII_IPC_DVD, "Eject disc", GetDeviceName().c_str(), _BufferOut, _BufferOutSize);
// TODO: eject the disc
}
}
break;
// DVDLowAudioBufferConfig
case 0xe4:
PanicAlert("DVDLowAudioBufferConfig");
break;
default:
ERROR_LOG(WII_IPC_DVD, "%s executes unknown cmd 0x%08x (Buffer 0x%08x, 0x%x)", GetDeviceName().c_str(), Command, _BufferOut, _BufferOutSize);
ERROR_LOG(WII_IPC_DVD, "%s executes unknown cmd 0x%08x (Buffer 0x%08x, 0x%x)",
GetDeviceName().c_str(), Command, _BufferOut, _BufferOutSize);
PanicAlert("%s executes unknown cmd 0x%08x", GetDeviceName().c_str(), Command);
break;

View File

@ -389,10 +389,17 @@ u32 CWII_IPC_HLE_Device_sdio_slot0::ExecuteCommand(u32 _BufferIn, u32 _BufferInS
Memory::Write_U32(0x900, _BufferOut);
break;
case CRAZY_BIGN:
DEBUG_LOG(WII_IPC_SD, "CMD64, wtf");
case CRAZY_BIGN64:
WARN_LOG(WII_IPC_SD, "CMD64, wtf");
// <svpe> shuffle2_: try returning -4 for cmd x'40.
Memory::Write_U32(-0x4, _BufferOut);
Memory::Write_U32(-0x04, _BufferOut);
_dbg_assert_msg_(WII_IPC_SD, req.arg == 2, "cmd64 odd arg value 0x%08x", req.arg);
break;
case CRAZY_BIGN65:
ERROR_LOG(WII_IPC_SD, "CMD65, wtf");
break;
default:

View File

@ -94,7 +94,8 @@ private:
ACMD_SENDOPCOND = 0x29,
ACMD_SENDSCR = 0x33,
CRAZY_BIGN = 0x40,
CRAZY_BIGN64 = 0x40,
CRAZY_BIGN65 = 0x41,
};
u32 m_Status;