#include "stdafx.h" #include "Utilities/Log.h" #include "Emu/Memory/Memory.h" #include "Emu/System.h" #include "Emu/Cell/PPUThread.h" #include "Emu/SysCalls/SC_FUNC.h" #include "Emu/SysCalls/Modules.h" #include "Emu/Cell/PPUDecoder.h" #include "Emu/Cell/PPUInterpreter.h" #include "Emu/Cell/PPUDisAsm.h" #include extern gcmInfo gcm_info; PPUThread& GetCurrentPPUThread() { PPCThread* thread = GetCurrentPPCThread(); if(!thread || thread->GetType() != CPU_THREAD_PPU) throw std::string("GetCurrentPPUThread: bad thread"); return *(PPUThread*)thread; } PPUThread::PPUThread() : PPCThread(CPU_THREAD_PPU) { owned_mutexes = 0; Reset(); } PPUThread::~PPUThread() { } void PPUThread::DoReset() { PPCThread::DoReset(); //reset regs memset(VPR, 0, sizeof(VPR)); memset(FPR, 0, sizeof(FPR)); memset(GPR, 0, sizeof(GPR)); memset(SPRG, 0, sizeof(SPRG)); CR.CR = 0; LR = 0; CTR = 0; USPRG0 = 0; TB = 0; XER.XER = 0; FPSCR.FPSCR = 0; VSCR.VSCR = 0; cycle = 0; } void PPUThread::AddArgv(const std::string& arg) { m_stack_point -= arg.length() + 1; m_stack_point = Memory.AlignAddr(m_stack_point, 0x10) - 0x10; m_argv_addr.push_back(m_stack_point); Memory.WriteString(m_stack_point, arg); } void PPUThread::InitRegs() { const u32 pc = Memory.Read32(entry); const u32 rtoc = Memory.Read32(entry + 4); //ConLog.Write("entry = 0x%x", entry); //ConLog.Write("rtoc = 0x%x", rtoc); SetPc(pc); /* const s32 thread_num = Emu.GetCPU().GetThreadNumById(GetType(), GetId()); if(thread_num < 0) { LOG_ERROR(PPU, "GetThreadNumById failed."); Emu.Pause(); return; } */ /* const s32 tls_size = Emu.GetTLSFilesz() * thread_num; if(tls_size >= Emu.GetTLSMemsz()) { LOG_ERROR(PPU, "Out of TLS memory."); Emu.Pause(); return; } */ m_stack_point = Memory.AlignAddr(m_stack_point, 0x200) - 0x200; GPR[1] = m_stack_point; GPR[2] = rtoc; /* for(int i=4; i<32; ++i) { if(i != 6) GPR[i] = (i+1) * 0x10000; } */ if(m_argv_addr.size()) { u64 argc = m_argv_addr.size(); m_stack_point -= 0xc + 4 * argc; u64 argv = m_stack_point; mem64_ptr_t argv_list(argv); for(int i=0; i b) return CR_GT; if(a == b) return CR_EQ; return CR_SO; }