From 7bab42455b1c857a7a150be6e9a4e54199619796 Mon Sep 17 00:00:00 2001 From: Nekotekina Date: Sun, 23 Mar 2014 23:43:37 +0400 Subject: [PATCH] Minor fixes cellAtrac faked --- rpcs3/Emu/Cell/SPUThread.h | 2 + rpcs3/Emu/SysCalls/Modules/cellAtrac.cpp | 157 +++++++++++++------ rpcs3/Emu/SysCalls/Modules/cellAtrac.h | 31 ++++ rpcs3/Emu/SysCalls/Modules/cellL10n.cpp | 7 +- rpcs3/Emu/SysCalls/Modules/cellSysmodule.cpp | 4 + rpcs3/Emu/SysCalls/lv2/SC_Lwmutex.cpp | 6 +- rpcs3/Emu/System.cpp | 2 +- 7 files changed, 155 insertions(+), 54 deletions(-) diff --git a/rpcs3/Emu/Cell/SPUThread.h b/rpcs3/Emu/Cell/SPUThread.h index ba260eb360..c898783979 100644 --- a/rpcs3/Emu/Cell/SPUThread.h +++ b/rpcs3/Emu/Cell/SPUThread.h @@ -586,6 +586,8 @@ public: } } + Sleep(1); + switch(cmd & ~(MFC_BARRIER_MASK | MFC_FENCE_MASK | MFC_LIST_MASK | MFC_RESULT_MASK)) { case MFC_PUT_CMD: diff --git a/rpcs3/Emu/SysCalls/Modules/cellAtrac.cpp b/rpcs3/Emu/SysCalls/Modules/cellAtrac.cpp index a73ab793d2..34ffeb5eff 100644 --- a/rpcs3/Emu/SysCalls/Modules/cellAtrac.cpp +++ b/rpcs3/Emu/SysCalls/Modules/cellAtrac.cpp @@ -7,141 +7,200 @@ Module cellAtrac(0x0013, cellAtrac_init); #include "cellAtrac.h" -int cellAtracSetDataAndGetMemSize() +int cellAtracSetDataAndGetMemSize(mem_ptr_t pHandle, u32 pucBufferAddr, u32 uiReadByte, u32 uiBufferByte, mem32_t puiWorkMemByte) { - UNIMPLEMENTED_FUNC(cellAtrac); + cellAtrac.Error("cellAtracSetDataAndGetMemSize(pHandle=0x%x, pucBufferAddr=0x%x, uiReadByte=0x%x, uiBufferByte=0x%x, puiWorkMemByte_addr=0x%x)", + pHandle.GetAddr(), pucBufferAddr, uiReadByte, uiBufferByte, puiWorkMemByte.GetAddr()); + + puiWorkMemByte = 0x1000; // unproved return CELL_OK; } -int cellAtracCreateDecoder() +int cellAtracCreateDecoder(mem_ptr_t pHandle, u32 pucWorkMem_addr, u32 uiPpuThreadPriority, u32 uiSpuThreadPriority) { - UNIMPLEMENTED_FUNC(cellAtrac); + cellAtrac.Error("cellAtracCreateDecoder(pHandle=0x%x, pucWorkMem_addr=0x%x, uiPpuThreadPriority=%d, uiSpuThreadPriority=%d)", + pHandle.GetAddr(), pucWorkMem_addr, uiPpuThreadPriority, uiSpuThreadPriority); + + pHandle->data.pucWorkMem_addr = pucWorkMem_addr; return CELL_OK; } -int cellAtracCreateDecoderExt() +int cellAtracCreateDecoderExt(mem_ptr_t pHandle, u32 pucWorkMem_addr, u32 uiPpuThreadPriority, mem_ptr_t pExtRes) { - UNIMPLEMENTED_FUNC(cellAtrac); + cellAtrac.Error("cellAtracCreateDecoderExt(pHandle=0x%x, pucWorkMem_addr=0x%x, uiPpuThreadPriority=%d, pExtRes_addr=0x%x)", + pHandle.GetAddr(), pucWorkMem_addr, uiPpuThreadPriority, pExtRes.GetAddr()); + + pHandle->data.pucWorkMem_addr = pucWorkMem_addr; return CELL_OK; } -int cellAtracDeleteDecoder() +int cellAtracDeleteDecoder(mem_ptr_t pHandle) { - UNIMPLEMENTED_FUNC(cellAtrac); + cellAtrac.Error("cellAtracDeleteDecoder(pHandle=0x%x)", pHandle.GetAddr()); return CELL_OK; } -int cellAtracDecode() +int cellAtracDecode(mem_ptr_t pHandle, u32 pfOutAddr, mem32_t puiSamples, mem32_t puiFinishflag, mem32_t piRemainFrame) { - //UNIMPLEMENTED_FUNC(cellAtrac); + cellAtrac.Error("cellAtracDecode(pHandle=0x%x, pfOutAddr=0x%x, puiSamples_addr=0x%x, puiFinishFlag_addr=0x%x, piRemainFrame_addr=0x%x)", + pHandle.GetAddr(), pfOutAddr, puiSamples.GetAddr(), puiFinishflag.GetAddr(), piRemainFrame.GetAddr()); + + puiSamples = 0; + puiFinishflag = 1; + piRemainFrame = CELL_ATRAC_ALLDATA_IS_ON_MEMORY; return CELL_OK; } -int cellAtracGetStreamDataInfo() +int cellAtracGetStreamDataInfo(mem_ptr_t pHandle, mem32_t ppucWritePointer, mem32_t puiWritableByte, mem32_t puiReadPosition) { - //UNIMPLEMENTED_FUNC(cellAtrac); + cellAtrac.Error("cellAtracGetStreamDataInfo(pHandle=0x%x, ppucWritePointer_addr=0x%x, puiWritableByte_addr=0x%x, puiReadPosition_addr=0x%x)", + pHandle.GetAddr(), ppucWritePointer.GetAddr(), puiWritableByte.GetAddr(), puiReadPosition.GetAddr()); + + ppucWritePointer = pHandle->data.pucWorkMem_addr; + puiWritableByte = 0x1000; + puiReadPosition = 0; return CELL_OK; } -int cellAtracAddStreamData() +int cellAtracAddStreamData(mem_ptr_t pHandle, u32 uiAddByte) { - UNIMPLEMENTED_FUNC(cellAtrac); + cellAtrac.Error("cellAtracAddStreamData(pHandle=0x%x, uiAddByte=0x%x)", pHandle.GetAddr(), uiAddByte); return CELL_OK; } -int cellAtracGetRemainFrame() +int cellAtracGetRemainFrame(mem_ptr_t pHandle, mem32_t piRemainFrame) { - UNIMPLEMENTED_FUNC(cellAtrac); + cellAtrac.Error("cellAtracGetRemainFrame(pHandle=0x%x, piRemainFrame_addr=0x%x)", pHandle.GetAddr(), piRemainFrame.GetAddr()); + + piRemainFrame = CELL_ATRAC_ALLDATA_IS_ON_MEMORY; return CELL_OK; } -int cellAtracGetVacantSize() +int cellAtracGetVacantSize(mem_ptr_t pHandle, mem32_t puiVacantSize) { - UNIMPLEMENTED_FUNC(cellAtrac); + cellAtrac.Error("cellAtracGetVacantSize(pHandle=0x%x, puiVacantSize_addr=0x%x)", pHandle.GetAddr(), puiVacantSize.GetAddr()); + + puiVacantSize = 0x1000; return CELL_OK; } -int cellAtracIsSecondBufferNeeded() +int cellAtracIsSecondBufferNeeded(mem_ptr_t pHandle) { - UNIMPLEMENTED_FUNC(cellAtrac); + cellAtrac.Error("cellAtracIsSecondBufferNeeded(pHandle=0x%x)", pHandle.GetAddr()); return CELL_OK; } -int cellAtracGetSecondBufferInfo() +int cellAtracGetSecondBufferInfo(mem_ptr_t pHandle, mem32_t puiReadPosition, mem32_t puiDataByte) { - UNIMPLEMENTED_FUNC(cellAtrac); + cellAtrac.Error("cellAtracGetSecondBufferInfo(pHandle=0x%x, puiReadPosition_addr=0x%x, puiDataByte_addr=0x%x)", + pHandle.GetAddr(), puiReadPosition.GetAddr(), puiDataByte.GetAddr()); + + puiReadPosition = 0; + puiDataByte = 0; // write to null block will occur return CELL_OK; } -int cellAtracSetSecondBuffer() +int cellAtracSetSecondBuffer(mem_ptr_t pHandle, u32 pucSecondBufferAddr, u32 uiSecondBufferByte) { - UNIMPLEMENTED_FUNC(cellAtrac); + cellAtrac.Error("cellAtracSetSecondBuffer(pHandle=0x%x, pucSecondBufferAddr=0x%x, uiSecondBufferByte=0x%x)", + pHandle.GetAddr(), pucSecondBufferAddr, uiSecondBufferByte); return CELL_OK; } -int cellAtracGetChannel() +int cellAtracGetChannel(mem_ptr_t pHandle, mem32_t puiChannel) { - UNIMPLEMENTED_FUNC(cellAtrac); + cellAtrac.Error("cellAtracGetChannel(pHandle=0x%x, puiChannel_addr=0x%x)", pHandle.GetAddr(), puiChannel.GetAddr()); + + puiChannel = 2; return CELL_OK; } -int cellAtracGetMaxSample() +int cellAtracGetMaxSample(mem_ptr_t pHandle, mem32_t puiMaxSample) { - UNIMPLEMENTED_FUNC(cellAtrac); + cellAtrac.Error("cellAtracGetMaxSample(pHandle=0x%x, puiMaxSample_addr=0x%x)", pHandle.GetAddr(), puiMaxSample.GetAddr()); + + puiMaxSample = 512; return CELL_OK; } -int cellAtracGetNextSample() +int cellAtracGetNextSample(mem_ptr_t pHandle, mem32_t puiNextSample) { - UNIMPLEMENTED_FUNC(cellAtrac); + cellAtrac.Error("cellAtracGetNextSample(pHandle=0x%x, puiNextSample_addr=0x%x)", pHandle.GetAddr(), puiNextSample.GetAddr()); + + puiNextSample = 0; return CELL_OK; } -int cellAtracGetSoundInfo() +int cellAtracGetSoundInfo(mem_ptr_t pHandle, mem32_t piEndSample, mem32_t piLoopStartSample, mem32_t piLoopEndSample) { - UNIMPLEMENTED_FUNC(cellAtrac); + cellAtrac.Error("cellAtracGetSoundInfo(pHandle=0x%x, piEndSample_addr=0x%x, piLoopStartSample_addr=0x%x, piLoopEndSample_addr=0x%x)", + pHandle.GetAddr(), piEndSample.GetAddr(), piLoopStartSample.GetAddr(), piLoopEndSample.GetAddr()); + + piEndSample = 0; + piLoopStartSample = 0; + piLoopEndSample = 0; return CELL_OK; } -int cellAtracGetNextDecodePosition() +int cellAtracGetNextDecodePosition(mem_ptr_t pHandle, mem32_t puiSamplePosition) { - UNIMPLEMENTED_FUNC(cellAtrac); + cellAtrac.Error("cellAtracGetNextDecodePosition(pHandle=0x%x, puiSamplePosition_addr=0x%x)", + pHandle.GetAddr(), puiSamplePosition.GetAddr()); + + puiSamplePosition = 0; + return CELL_ATRAC_ERROR_ALLDATA_WAS_DECODED; +} + +int cellAtracGetBitrate(mem_ptr_t pHandle, mem32_t puiBitrate) +{ + cellAtrac.Error("cellAtracGetBitrate(pHandle=0x%x, puiBitrate_addr=0x%x)", + pHandle.GetAddr(), puiBitrate.GetAddr()); + + puiBitrate = 128; return CELL_OK; } -int cellAtracGetBitrate() +int cellAtracGetLoopInfo(mem_ptr_t pHandle, mem32_t piLoopNum, mem32_t puiLoopStatus) { - UNIMPLEMENTED_FUNC(cellAtrac); + cellAtrac.Error("cellAtracGetLoopInfo(pHandle=0x%x, piLoopNum_addr=0x%x, puiLoopStatus_addr=0x%x)", + pHandle.GetAddr(), piLoopNum.GetAddr(), puiLoopStatus.GetAddr()); + + piLoopNum = 0; + puiLoopStatus = 0; return CELL_OK; } -int cellAtracGetLoopInfo() +int cellAtracSetLoopNum(mem_ptr_t pHandle, int iLoopNum) { - UNIMPLEMENTED_FUNC(cellAtrac); + cellAtrac.Error("cellAtracSetLoopNum(pHandle=0x%x, iLoopNum=0x%x)", pHandle.GetAddr(), iLoopNum); return CELL_OK; } -int cellAtracSetLoopNum() +int cellAtracGetBufferInfoForResetting(mem_ptr_t pHandle, u32 uiSample, mem_ptr_t pBufferInfo) { - UNIMPLEMENTED_FUNC(cellAtrac); + cellAtrac.Error("cellAtracGetBufferInfoForResetting(pHandle=0x%x, uiSample=0x%x, pBufferInfo_addr=0x%x)", + pHandle.GetAddr(), uiSample, pBufferInfo.GetAddr()); + + pBufferInfo->pucWriteAddr = pHandle->data.pucWorkMem_addr; + pBufferInfo->uiWritableByte = 0x1000; + pBufferInfo->uiMinWriteByte = 0; + pBufferInfo->uiReadPosition = 0; return CELL_OK; } -int cellAtracGetBufferInfoForResetting() +int cellAtracResetPlayPosition(mem_ptr_t pHandle, u32 uiSample, u32 uiWriteByte) { - UNIMPLEMENTED_FUNC(cellAtrac); + cellAtrac.Error("cellAtracResetPlayPosition(pHandle=0x%x, uiSample=0x%x, uiWriteByte=0x%x)", + pHandle.GetAddr(), uiSample, uiWriteByte); return CELL_OK; } -int cellAtracResetPlayPosition() +int cellAtracGetInternalErrorInfo(mem_ptr_t pHandle, mem32_t piResult) { - UNIMPLEMENTED_FUNC(cellAtrac); - return CELL_OK; -} + cellAtrac.Error("cellAtracGetInternalErrorInfo(pHandle=0x%x, piResult_addr=0x%x)", + pHandle.GetAddr(), piResult.GetAddr()); -int cellAtracGetInternalErrorInfo() -{ - UNIMPLEMENTED_FUNC(cellAtrac); + piResult = 0; return CELL_OK; } diff --git a/rpcs3/Emu/SysCalls/Modules/cellAtrac.h b/rpcs3/Emu/SysCalls/Modules/cellAtrac.h index 3d1d652644..5a95c32b97 100644 --- a/rpcs3/Emu/SysCalls/Modules/cellAtrac.h +++ b/rpcs3/Emu/SysCalls/Modules/cellAtrac.h @@ -25,4 +25,35 @@ enum CELL_ATRAC_ERROR_ILLEGAL_RESET_BYTE = 0x80610372, CELL_ATRAC_ERROR_ILLEGAL_PPU_THREAD_PRIORITY = 0x80610381, CELL_ATRAC_ERROR_ILLEGAL_SPU_THREAD_PRIORITY = 0x80610382, +}; + +// Remain Frame +enum +{ + CELL_ATRAC_ALLDATA_IS_ON_MEMORY = -1, + CELL_ATRAC_NONLOOP_STREAM_DATA_IS_ON_MEMORY = -2, + CELL_ATRAC_LOOP_STREAM_DATA_IS_ON_MEMORY = -3, +}; + +union CellAtracHandle +{ + u8 uiWorkMem[512]; + struct AtracHandle + { + u32 pucWorkMem_addr; + } data; +}; + +struct CellAtracBufferInfo +{ + be_t pucWriteAddr; + be_t uiWritableByte; + be_t uiMinWriteByte; + be_t uiReadPosition; +}; + +struct CellAtracExtRes +{ + be_t pSpurs_addr; + u8 priority[8]; }; \ No newline at end of file diff --git a/rpcs3/Emu/SysCalls/Modules/cellL10n.cpp b/rpcs3/Emu/SysCalls/Modules/cellL10n.cpp index b783b58727..ae9c22e0f9 100644 --- a/rpcs3/Emu/SysCalls/Modules/cellL10n.cpp +++ b/rpcs3/Emu/SysCalls/Modules/cellL10n.cpp @@ -58,7 +58,12 @@ int UTF16stoUTF8s(mem16_ptr_t utf16, mem64_t utf16_len, mem8_ptr_t utf8, mem64_t int jstrchk(mem8_ptr_t jstr) { - cellL10n.Log("jstrchk(jstr_addr=0x%x [%s])", jstr.GetAddr(), "omitted" /*Memory.ReadString(jstr.GetAddr()).wx_str()*/); + if (!jstr.IsGood()) + cellL10n.Error("jstrchk(jstr_addr=0x%x): invalid address", jstr.GetAddr()); + else if (jstr[0]) + cellL10n.Log("jstrchk(jstr_addr=0x%x): utf-8: [%s]", jstr.GetAddr(), Memory.ReadString(jstr.GetAddr()).wx_str()); + else + cellL10n.Log("jstrchk(jstr_addr=0x%x): empty string", jstr.GetAddr()); return L10N_STR_UTF8; } diff --git a/rpcs3/Emu/SysCalls/Modules/cellSysmodule.cpp b/rpcs3/Emu/SysCalls/Modules/cellSysmodule.cpp index 38b4ad53db..a1874ebf97 100644 --- a/rpcs3/Emu/SysCalls/Modules/cellSysmodule.cpp +++ b/rpcs3/Emu/SysCalls/Modules/cellSysmodule.cpp @@ -158,6 +158,10 @@ int cellSysmoduleSetMemcontainer(u32 ct_id) int cellSysmoduleLoadModule(u16 id) { + if (id == 0xf054) + { + cellSysmodule.Error("cellSysmoduleLoadModule: TODO: CELL_SYSMODULE_LIBATRAC3MULTI"); + } cellSysmodule.Warning("cellSysmoduleLoadModule(%s)", wxString(getModuleName(id)).wx_str()); Module* m = GetModuleById(id); diff --git a/rpcs3/Emu/SysCalls/lv2/SC_Lwmutex.cpp b/rpcs3/Emu/SysCalls/lv2/SC_Lwmutex.cpp index 31fedbd349..05b9058fdd 100644 --- a/rpcs3/Emu/SysCalls/lv2/SC_Lwmutex.cpp +++ b/rpcs3/Emu/SysCalls/lv2/SC_Lwmutex.cpp @@ -211,7 +211,7 @@ int sys_lwmutex_t::trylock(be_t tid) if (mutex.unlock(owner_tid, owner_tid) != SMR_OK) // check free value { owner_tid = mutex.GetOwner(); - if (CPUThread* tt = Emu.GetCPU().GetThread(owner_tid)) + /*if (CPUThread* tt = Emu.GetCPU().GetThread(owner_tid)) { if (!tt->IsAlive()) { @@ -227,7 +227,7 @@ int sys_lwmutex_t::trylock(be_t tid) mutex.unlock(owner_tid, tid); recursive_count = 1; return CELL_OK; - } + }*/ } /*while ((attribute.ToBE() & se32(SYS_SYNC_ATTR_RECURSIVE_MASK)) == 0) @@ -272,7 +272,7 @@ int sys_lwmutex_t::unlock(be_t tid) { if (!recursive_count || (recursive_count.ToBE() != se32(1) && (attribute.ToBE() & se32(SYS_SYNC_NOT_RECURSIVE)))) { - sc_lwmutex.Error("sys_lwmutex_t::unlock(%d): wrong recursive value (%d)", (u32)sleep_queue, (u32)recursive_count); + sc_lwmutex.Error("sys_lwmutex_t::unlock(%d): wrong recursive value fixed (%d)", (u32)sleep_queue, (u32)recursive_count); recursive_count = 1; } recursive_count -= 1; diff --git a/rpcs3/Emu/System.cpp b/rpcs3/Emu/System.cpp index 7c92cb7e3d..3f32054def 100644 --- a/rpcs3/Emu/System.cpp +++ b/rpcs3/Emu/System.cpp @@ -358,7 +358,7 @@ void Emulator::Resume() m_status = Running; CheckStatus(); - if(IsRunning() && Ini.CPUDecoderMode.GetValue() != 1) GetCPU().Exec(); + //if(IsRunning() && Ini.CPUDecoderMode.GetValue() != 1) GetCPU().Exec(); #ifndef QT_UI wxGetApp().SendDbgCommand(DID_RESUMED_EMU); #endif