Make seek mode 2 (offset from end of file) make sense. I doubt any games use this.

This commit is contained in:
Jordan Woyak 2013-02-20 15:15:04 -06:00
parent 0efe6c2124
commit 04a33b177a
1 changed files with 26 additions and 37 deletions

View File

@ -165,7 +165,7 @@ File::IOFile CWII_IPC_HLE_Device_FileIO::OpenFile()
bool CWII_IPC_HLE_Device_FileIO::Seek(u32 _CommandAddress) bool CWII_IPC_HLE_Device_FileIO::Seek(u32 _CommandAddress)
{ {
u32 ReturnValue = FS_RESULT_FATAL; u32 ReturnValue = FS_RESULT_FATAL;
const u32 SeekPosition = Memory::Read_U32(_CommandAddress + 0xC); const u32 SeekOffset = Memory::Read_U32(_CommandAddress + 0xC);
const u32 Mode = Memory::Read_U32(_CommandAddress + 0x10); const u32 Mode = Memory::Read_U32(_CommandAddress + 0x10);
if (auto file = OpenFile()) if (auto file = OpenFile())
@ -173,48 +173,37 @@ bool CWII_IPC_HLE_Device_FileIO::Seek(u32 _CommandAddress)
ReturnValue = FS_RESULT_FATAL; ReturnValue = FS_RESULT_FATAL;
const u64 fileSize = file.GetSize(); const u64 fileSize = file.GetSize();
INFO_LOG(WII_IPC_FILEIO, "FileIO: Seek Pos: 0x%08x, Mode: %i (%s, Length=0x%08llx)", SeekPosition, Mode, m_Name.c_str(), fileSize); INFO_LOG(WII_IPC_FILEIO, "FileIO: Seek Pos: 0x%08x, Mode: %i (%s, Length=0x%08llx)", SeekOffset, Mode, m_Name.c_str(), fileSize);
u64 wantedPos = 0;
switch (Mode) switch (Mode)
{ {
case 0: case 0:
{ wantedPos = SeekOffset;
if (SeekPosition <= fileSize)
{
m_SeekPos = SeekPosition;
ReturnValue = m_SeekPos;
}
break; break;
}
case 1: case 1:
{ wantedPos = m_SeekPos + SeekOffset;
u32 wantedPos = SeekPosition+m_SeekPos;
if (wantedPos <= fileSize)
{
m_SeekPos = wantedPos;
ReturnValue = m_SeekPos;
}
break; break;
}
case 2: case 2:
{ wantedPos = fileSize + (s32)SeekOffset;
u64 wantedPos = fileSize+m_SeekPos;
if (wantedPos <= fileSize)
{
m_SeekPos = wantedPos;
ReturnValue = m_SeekPos;
}
break; break;
}
default: default:
{
PanicAlert("CWII_IPC_HLE_Device_FileIO Unsupported seek mode %i", Mode); PanicAlert("CWII_IPC_HLE_Device_FileIO Unsupported seek mode %i", Mode);
ReturnValue = FS_RESULT_FATAL; ReturnValue = FS_RESULT_FATAL;
break; break;
} }
if (wantedPos <= fileSize)
{
m_SeekPos = wantedPos;
ReturnValue = m_SeekPos;
} }
} }
else else
{ {
// TODO: This can't be right.
ReturnValue = FS_FILE_NOT_EXIST; ReturnValue = FS_FILE_NOT_EXIST;
} }
Memory::Write_U32(ReturnValue, _CommandAddress + 0x4); Memory::Write_U32(ReturnValue, _CommandAddress + 0x4);