diff --git a/.gitignore b/.gitignore index f2e96b314a..26cc8297ec 100644 --- a/.gitignore +++ b/.gitignore @@ -33,3 +33,4 @@ android/ui_atlas.zim __testoutput.txt __testerror.txt ppge_atlas.zim.png +local.properties diff --git a/Common/FixedSizeUnorderedSet.h b/Common/FixedSizeUnorderedSet.h index 87552f2baa..f7746629ea 100644 --- a/Common/FixedSizeUnorderedSet.h +++ b/Common/FixedSizeUnorderedSet.h @@ -10,7 +10,7 @@ class FixedSizeUnorderedSet public: bool insert(T item) { - if (count_ < maxCount - 1) + if (count_ < (int)maxCount - 1) { data_[count_++] = item; return true; @@ -41,7 +41,7 @@ public: size_t size() { - return count_; + return (size_t)count_; } T &operator[](size_t index) { diff --git a/Common/ThunkArm.cpp b/Common/ThunkARM.cpp similarity index 100% rename from Common/ThunkArm.cpp rename to Common/ThunkARM.cpp diff --git a/Core/HLE/sceAudio.cpp b/Core/HLE/sceAudio.cpp index ab3cc9a0dd..5c1725aa41 100644 --- a/Core/HLE/sceAudio.cpp +++ b/Core/HLE/sceAudio.cpp @@ -149,14 +149,14 @@ u32 sceAudioOutputPanned(u32 chan, u32 leftVol, u32 rightVol, u32 samplePtr) int sceAudioGetChannelRestLen(u32 chan) { int sz = (int)chans[chan].sampleQueue.size() / 2; - DEBUG_LOG(HLE,"UNTESTED %i = sceAudioGetChannelRestLen(%i)", PARAM(0)); + DEBUG_LOG(HLE,"UNTESTED %i = sceAudioGetChannelRestLen(%i)", sz, chan); return sz; } int sceAudioGetChannelRestLength(u32 chan) { int sz = (int)chans[chan].sampleQueue.size() / 2; - DEBUG_LOG(HLE,"UNTESTED %i = sceAudioGetChannelRestLen(%i)", PARAM(0)); + DEBUG_LOG(HLE,"UNTESTED %i = sceAudioGetChannelRestLen(%i)", sz, chan); return sz; } diff --git a/Core/HLE/sceGe.cpp b/Core/HLE/sceGe.cpp index 082a6dd4a5..2a8513410e 100644 --- a/Core/HLE/sceGe.cpp +++ b/Core/HLE/sceGe.cpp @@ -71,15 +71,17 @@ u32 sceGeListEnQueue(u32 listAddress, u32 stallAddress, u32 callbackId, u32 optP else state = SCE_GE_LIST_COMPLETED; - DEBUG_LOG(HLE,"List enqueued."); + DEBUG_LOG(HLE,"List %i enqueued.", listID); //return display list ID return listID; } u32 sceGeListEnQueueHead(u32 listAddress, u32 stallAddress, u32 callbackId, u32 optParamAddr) { - if (!stallAddress) - stallAddress = listAddress; + DEBUG_LOG(HLE,"sceGeListEnQueueHead(addr=%08x, stall=%08x, cbid=%08x, param=%08x)", + listAddress,stallAddress,callbackId,optParamAddr); + //if (!stallAddress) + // stallAddress = listAddress; u32 listID = gpu->EnqueueList(listAddress,stallAddress); // HACKY if (listID) @@ -87,9 +89,7 @@ u32 sceGeListEnQueueHead(u32 listAddress, u32 stallAddress, u32 callbackId, u32 else state = SCE_GE_LIST_COMPLETED; - DEBUG_LOG(HLE,"%i=sceGeListEnQueueHead(addr=%08x, stall=%08x, cbid=%08x, param=%08x)", - listID, listAddress,stallAddress,callbackId,optParamAddr); - DEBUG_LOG(HLE,"List enqueued."); + DEBUG_LOG(HLE,"List %i enqueued.", listID); //return display list ID return listID; } diff --git a/Core/HLE/sceKernelInterrupt.cpp b/Core/HLE/sceKernelInterrupt.cpp index c872d68906..030efbace1 100644 --- a/Core/HLE/sceKernelInterrupt.cpp +++ b/Core/HLE/sceKernelInterrupt.cpp @@ -199,10 +199,12 @@ public: { return subIntrHandlers.find(subIntrNum) != subIntrHandlers.end(); } - SubIntrHandler &get(int subIntrNum) + SubIntrHandler *get(int subIntrNum) { if (has(subIntrNum)) - return subIntrHandlers[subIntrNum]; + return &subIntrHandlers[subIntrNum]; + else + return 0; // what to do, what to do... } @@ -365,7 +367,7 @@ u32 sceKernelEnableSubIntr(u32 intrNumber, u32 subIntrNumber) if (!intrHandlers[intrNumber].has(subIntrNumber)) return -1; - intrHandlers[intrNumber].get(subIntrNumber).enabled = true; + intrHandlers[intrNumber].get(subIntrNumber)->enabled = true; return 0; } @@ -378,7 +380,7 @@ u32 sceKernelDisableSubIntr(u32 intrNumber, u32 subIntrNumber) if (!intrHandlers[intrNumber].has(subIntrNumber)) return -1; - intrHandlers[intrNumber].get(subIntrNumber).enabled = false; + intrHandlers[intrNumber].get(subIntrNumber)->enabled = false; return 0; } diff --git a/Core/HLE/sceKernelThread.cpp b/Core/HLE/sceKernelThread.cpp index 1e1bcf719f..b8611ff7bf 100644 --- a/Core/HLE/sceKernelThread.cpp +++ b/Core/HLE/sceKernelThread.cpp @@ -1170,7 +1170,7 @@ void sceKernelWakeupThread() } } else { - ERROR_LOG(HLE,"sceKernelWakeupThread(%i) - bad thread id"); + ERROR_LOG(HLE,"sceKernelWakeupThread(%i) - bad thread id", uid); RETURN(error); } } @@ -1189,7 +1189,7 @@ void sceKernelCancelWakeupThread() RETURN(wCount); } else { - ERROR_LOG(HLE,"sceKernelCancelWakeupThread(%i) - bad thread id"); + ERROR_LOG(HLE,"sceKernelCancelWakeupThread(%i) - bad thread id", uid); RETURN(error); } } diff --git a/Core/HLE/scePower.cpp b/Core/HLE/scePower.cpp index 4f6f178bcd..d4c49b0f27 100644 --- a/Core/HLE/scePower.cpp +++ b/Core/HLE/scePower.cpp @@ -135,17 +135,17 @@ int scePowerUnregisterCallback(int slotId) int sceKernelPowerLock(int lockType) { - DEBUG_LOG(HLE,"UNIMPL 0=sceKernelPowerLock(%i)", lockType); + DEBUG_LOG(HLE,"0=sceKernelPowerLock(%i)", lockType); return 0; } int sceKernelPowerUnlock(int lockType) { - DEBUG_LOG(HLE,"UNIMPL 0=sceKernelPowerUnlock(%i)"); + DEBUG_LOG(HLE,"0=sceKernelPowerUnlock(%i)", lockType); return 0; } int sceKernelPowerTick(int flag) { - DEBUG_LOG(HLE,"UNIMPL 0=sceKernelPowerTick()"); + DEBUG_LOG(HLE,"UNIMPL 0=sceKernelPowerTick(%i)", flag); return 0; } @@ -161,13 +161,13 @@ int sceKernelVolatileMemTryLock(int type, int paddr, int psize) } else { - ERROR_LOG(HLE, "sceKernelVolatileMemTryLock - already locked!"); - //RETURN(ERROR_POWER_VMEM_IN_USE); // does this line still need to be here?? + ERROR_LOG(HLE, "sceKernelVolatileMemTryLock(%i, %08x, %i) - already locked!", type, paddr, psize); return ERROR_POWER_VMEM_IN_USE; } // Volatile RAM is always at 0x08400000 and is of size 0x00400000. // It's always available in the emu. + // TODO: Should really reserve this properly! Memory::Write_U32(0x08400000, paddr); Memory::Write_U32(0x00400000, psize); @@ -176,10 +176,9 @@ int sceKernelVolatileMemTryLock(int type, int paddr, int psize) int sceKernelVolatileMemUnlock(int type) { - INFO_LOG(HLE,"sceKernelVolatileMemUnlock()"); + INFO_LOG(HLE,"sceKernelVolatileMemUnlock(%i)", type); // TODO: sanity check volatileMemLocked = false; - return 0; } diff --git a/Core/HLE/sceUtility.cpp b/Core/HLE/sceUtility.cpp index e67f4f61d1..ee2b13e963 100644 --- a/Core/HLE/sceUtility.cpp +++ b/Core/HLE/sceUtility.cpp @@ -82,30 +82,28 @@ enum SceUtilitySavedataType #define SCE_UTILITY_STATUS_SHUTDOWN 4 -/** title, savedataTitle, detail: parts of the unencrypted SFO -data, it contains what the VSH and standard load screen shows */ -typedef struct PspUtilitySavedataSFOParam +// title, savedataTitle, detail: parts of the unencrypted SFO +// data, it contains what the VSH and standard load screen shows +struct PspUtilitySavedataSFOParam { char title[0x80]; char savedataTitle[0x80]; char detail[0x400]; unsigned char parentalLevel; unsigned char unknown[3]; -} PspUtilitySavedataSFOParam; +}; -typedef struct PspUtilitySavedataFileData { +struct PspUtilitySavedataFileData { void *buf; - SceSize bufSize; - SceSize size; /* ??? - why are there two sizes? */ + SceSize bufSize; // Size of the buffer pointed to by buf + SceSize size; // Actual file size to write / was read int unknown; -} PspUtilitySavedataFileData; +}; -/** Structure to hold the parameters for the ::sceUtilitySavedataInitStart function. -*/ -typedef struct SceUtilitySavedataParam +// Structure to hold the parameters for the sceUtilitySavedataInitStart function. +struct SceUtilitySavedataParam { - /** Size of the structure */ - SceSize size; + SceSize size; // Size of the structure int language; @@ -115,12 +113,10 @@ typedef struct SceUtilitySavedataParam int result; int unknown2[4]; - /** mode: 0 to load, 1 to save */ - int mode; + int mode; // 0 to load, 1 to save int bind; - /** unknown13 use 0x10 */ - int overwriteMode; + int overwriteMode; // use 0x10 ? /** gameName: name used from the game for saves, equal for all saves */ char gameName[16]; @@ -133,7 +129,7 @@ typedef struct SceUtilitySavedataParam void *dataBuf; /** size of allocated space to dataBuf */ SceSize dataBufSize; - SceSize dataSize; + SceSize dataSize; // Size of the actual save data PspUtilitySavedataSFOParam sfoParam; @@ -143,17 +139,20 @@ typedef struct SceUtilitySavedataParam PspUtilitySavedataFileData snd0FileData; unsigned char unknown17[4]; -} SceUtilitySavedataParam; - +}; static u32 utilityDialogState = SCE_UTILITY_STATUS_SHUTDOWN; +u32 messageDialogAddr; + void __UtilityInit() { + messageDialogAddr = 0; utilityDialogState = SCE_UTILITY_STATUS_SHUTDOWN; + // Creates a directory for save on the sdcard or MemStick directory } @@ -292,12 +291,15 @@ struct pspMessageDialog u32 buttonPressed; // 0=?, 1=Yes, 2=No, 3=Back }; -u32 messageDialogAddr; - void sceUtilityMsgDialogInitStart() { u32 structAddr = PARAM(0); - DEBUG_LOG(HLE,"FAKE sceUtilityMsgDialogInitStart(%i)", structAddr); + DEBUG_LOG(HLE,"sceUtilityMsgDialogInitStart(%i)", structAddr); + if (!Memory::IsValidAddress(structAddr)) + { + RETURN(-1); + return; + } messageDialogAddr = structAddr; pspMessageDialog messageDialog; Memory::ReadStruct(messageDialogAddr, &messageDialog); @@ -321,7 +323,8 @@ void sceUtilityMsgDialogShutdownStart() void sceUtilityMsgDialogUpdate() { - DEBUG_LOG(HLE,"sceUtilityMsgDialogUpdate(%i)", PARAM(0)); + int animSpeed = PARAM(0); + DEBUG_LOG(HLE,"sceUtilityMsgDialogUpdate(%i)", animSpeed); switch (utilityDialogState) { case SCE_UTILITY_STATUS_FINISHED: @@ -334,6 +337,12 @@ void sceUtilityMsgDialogUpdate() RETURN(0); return; } + + if (!Memory::IsValidAddress(messageDialogAddr)) { + ERROR_LOG(HLE, "sceUtilityMsgDialogUpdate: Bad messagedialogaddr %08x", messageDialogAddr); + RETURN(-1); + return; + } pspMessageDialog messageDialog; Memory::ReadStruct(messageDialogAddr, &messageDialog); @@ -354,7 +363,7 @@ void sceUtilityMsgDialogUpdate() static u32 lastButtons = 0; u32 buttons = __CtrlPeekButtons(); - if (messageDialog.options & 0x10) //yesnobutton + if (messageDialog.options & 0x10) // yesnobutton { PPGeDrawImage(I_CROSS, 80, 220, 0, 0xFFFFFFFF); PPGeDrawText("Yes", 140, 220, PPGE_ALIGN_HCENTER, 1.0f, 0xFFFFFFFF); diff --git a/Core/MIPS/ARM/JitCache.cpp b/Core/MIPS/ARM/JitCache.cpp index 4cb912afe8..5df0381fa1 100644 --- a/Core/MIPS/ARM/JitCache.cpp +++ b/Core/MIPS/ARM/JitCache.cpp @@ -365,7 +365,7 @@ void JitBlockCache::DestroyBlock(int block_num, bool invalidate) #ifdef JIT_UNLIMITED_ICACHE Memory::Write_Opcode_JIT(b.originalAddress, b.originalFirstOpcode?b.originalFirstOpcode:JIT_ICACHE_INVALID_WORD); #else - if (Memory::ReadUnchecked_U32(b.originalAddress) == block_num) + if ((int)Memory::ReadUnchecked_U32(b.originalAddress) == block_num) Memory::WriteUnchecked_U32(b.originalFirstOpcode, b.originalAddress); #endif diff --git a/Core/MIPS/ARM/RegCache.cpp b/Core/MIPS/ARM/RegCache.cpp index 5c64fca2a0..e562f78411 100644 --- a/Core/MIPS/ARM/RegCache.cpp +++ b/Core/MIPS/ARM/RegCache.cpp @@ -282,7 +282,7 @@ void GPRRegCache::BindToRegister(int i, bool doLoad, bool makeDirty) { if (i != j && regs[j].location.IsSimpleReg() && regs[j].location.GetSimpleReg() == xr) { - PanicAlert(""); + PanicAlert("bad"); } } regs[i].away = true; @@ -318,7 +318,8 @@ void GPRRegCache::StoreFromRegister(int i) doStore = true; } Location newLoc = GetDefaultLocation(i); - //if (doStore) + if (doStore) + ; // emit->MOV(32, newLoc, regs[i].location); regs[i].location = newLoc; regs[i].away = false; diff --git a/Core/MIPS/MIPS.cpp b/Core/MIPS/MIPS.cpp index 2108cde51b..528f189011 100644 --- a/Core/MIPS/MIPS.cpp +++ b/Core/MIPS/MIPS.cpp @@ -77,7 +77,6 @@ void MIPSState::Reset() SetWriteMask(b); pc = 0; - prevPC = 0; hi = 0; lo = 0; fpcond = 0; @@ -157,7 +156,6 @@ void MIPSState::RunLoopUntil(u64 globalTicks) break; } #endif - prevPC = pc; if (inDelaySlot) { MIPSInterpret(op); @@ -172,6 +170,7 @@ void MIPSState::RunLoopUntil(u64 globalTicks) MIPSInterpret(op); } + /* if (!Memory::IsValidAddress(pc)) { pc = pc; @@ -179,9 +178,12 @@ void MIPSState::RunLoopUntil(u64 globalTicks) if (r[MIPS_REG_RA] != 0 && !Memory::IsValidAddress(r[MIPS_REG_RA])) { // pc = pc; - } + }*/ if (inDelaySlot) + { + CoreTiming::downcount -= 1; goto again; + } } CoreTiming::downcount -= 1; @@ -190,11 +192,9 @@ void MIPSState::RunLoopUntil(u64 globalTicks) DEBUG_LOG(CPU, "Hit the max ticks, bailing : %llu, %llu", globalTicks, CoreTiming::GetTicks()); break; } - } CoreTiming::Advance(); - // if (exceptions) checkExceptions(); if (CoreTiming::GetTicks() > globalTicks) { DEBUG_LOG(CPU, "Hit the max ticks, bailing : %llu, %llu", globalTicks, CoreTiming::GetTicks()); diff --git a/Core/MIPS/MIPS.h b/Core/MIPS/MIPS.h index 48d86499c3..2d4e4ca4aa 100644 --- a/Core/MIPS/MIPS.h +++ b/Core/MIPS/MIPS.h @@ -112,7 +112,6 @@ public: u32 pc; u32 nextPC; - u32 prevPC; u32 hi; u32 lo; diff --git a/Core/MIPS/MIPSDisVFPU.cpp b/Core/MIPS/MIPSDisVFPU.cpp index 8fabb7e5d3..782d0b57d1 100644 --- a/Core/MIPS/MIPSDisVFPU.cpp +++ b/Core/MIPS/MIPSDisVFPU.cpp @@ -431,6 +431,7 @@ namespace MIPSDis break; default: // invalid + name = "???"; break; } int vd = _VD; diff --git a/Core/MIPS/MIPSInt.cpp b/Core/MIPS/MIPSInt.cpp index fcd623fed7..6e254ef687 100644 --- a/Core/MIPS/MIPSInt.cpp +++ b/Core/MIPS/MIPSInt.cpp @@ -311,7 +311,7 @@ namespace MIPSInt switch (op >> 26) { case 48: // ll - R(rt) = Memory::Read_U32(addr); + R(rt) = Memory::Read_U32(addr); currentMIPS->llBit = 1; break; case 56: // sc @@ -580,7 +580,7 @@ namespace MIPSInt { s32 a = (s32)R(rs); s32 b = (s32)R(rt); - if (a == 0x80000000 && b == -1) { + if (a == (s32)0x80000000 && b == -1) { LO = 0x80000000; } else if (b != 0) { LO = (u32)(a / b); @@ -768,10 +768,10 @@ namespace MIPSInt case 36: switch (currentMIPS->fcr31 & 3) { - case 0: FsI(fd) = roundf(F(fs)); break; // RINT_0 // TODO: rintf or roundf? + case 0: FsI(fd) = (int)roundf(F(fs)); break; // RINT_0 // TODO: rintf or roundf? case 1: FsI(fd) = (int)F(fs); break; // CAST_1 - case 2: FsI(fd) = ceilf(F(fs)); break; // CEIL_2 - case 3: FsI(fd) = floorf(F(fs)); break; // FLOOR_3 + case 2: FsI(fd) = (int)ceilf(F(fs)); break; // CEIL_2 + case 3: FsI(fd) = (int)floorf(F(fs)); break; // FLOOR_3 } break; //cvt.w.s default: @@ -815,6 +815,7 @@ namespace MIPSInt default: _dbg_assert_msg_(CPU,0,"Trying to interpret FPUComp instruction that can't be interpreted"); + cond = false; break; } currentMIPS->fpcond = cond; diff --git a/Core/MIPS/MIPSIntVFPU.cpp b/Core/MIPS/MIPSIntVFPU.cpp index 4e9c6663b7..104c1e8089 100644 --- a/Core/MIPS/MIPSIntVFPU.cpp +++ b/Core/MIPS/MIPSIntVFPU.cpp @@ -170,78 +170,78 @@ namespace MIPSInt switch (op >> 26) { case 53: //lvl.q/lvr.q - if (addr & 0x3) - { - _dbg_assert_msg_(CPU, 0, "Misaligned lvX.q"); - } - if ((op&2) == 0) - { - // It's an LVL - float d[4]; - ReadVector(d, V_Quad, vt); - int offset = (addr >> 2) & 3; - for (int i = 0; i < offset + 1; i++) - { - d[3 - i] = Memory::Read_Float(addr - i * 4); - } - WriteVector(d, V_Quad, vt); - } - else - { - // It's an LVR - float d[4]; - ReadVector(d, V_Quad, vt); - int offset = (addr >> 2) & 3; - for (int i = 0; i < (3 - offset) + 1; i++) - { - d[i] = Memory::Read_Float(addr + 4 * i); - } - WriteVector(d, V_Quad, vt); - } - break; + if (addr & 0x3) + { + _dbg_assert_msg_(CPU, 0, "Misaligned lvX.q"); + } + if ((op&2) == 0) + { + // It's an LVL + float d[4]; + ReadVector(d, V_Quad, vt); + int offset = (addr >> 2) & 3; + for (int i = 0; i < offset + 1; i++) + { + d[3 - i] = Memory::Read_Float(addr - i * 4); + } + WriteVector(d, V_Quad, vt); + } + else + { + // It's an LVR + float d[4]; + ReadVector(d, V_Quad, vt); + int offset = (addr >> 2) & 3; + for (int i = 0; i < (3 - offset) + 1; i++) + { + d[i] = Memory::Read_Float(addr + 4 * i); + } + WriteVector(d, V_Quad, vt); + } + break; case 54: //lv.q - if (addr & 0xF) - { - _dbg_assert_msg_(CPU, 0, "Misaligned lv.q"); - } + if (addr & 0xF) + { + _dbg_assert_msg_(CPU, 0, "Misaligned lv.q"); + } WriteVector((const float*)Memory::GetPointer(addr), V_Quad, vt); break; case 61: // svl.q/svr.q - if (addr & 0x3) - { - _dbg_assert_msg_(CPU, 0, "Misaligned svX.q"); - } - if ((op&2) == 0) - { - // It's an SVL - float d[4]; - ReadVector(d, V_Quad, vt); - int offset = (addr >> 2) & 3; - for (int i = 0; i < offset + 1; i++) - { - Memory::Write_Float(d[3 - i], addr - i * 4); - } - } - else - { - // It's an SVR - float d[4]; - ReadVector(d, V_Quad, vt); - int offset = (addr >> 2) & 3; - for (int i = 0; i < (3 - offset) + 1; i++) - { - Memory::Write_Float(d[i], addr + 4 * i); - } - } - break; + if (addr & 0x3) + { + _dbg_assert_msg_(CPU, 0, "Misaligned svX.q"); + } + if ((op&2) == 0) + { + // It's an SVL + float d[4]; + ReadVector(d, V_Quad, vt); + int offset = (addr >> 2) & 3; + for (int i = 0; i < offset + 1; i++) + { + Memory::Write_Float(d[3 - i], addr - i * 4); + } + } + else + { + // It's an SVR + float d[4]; + ReadVector(d, V_Quad, vt); + int offset = (addr >> 2) & 3; + for (int i = 0; i < (3 - offset) + 1; i++) + { + Memory::Write_Float(d[i], addr + 4 * i); + } + } + break; case 62: //sv.q - if (addr & 0xF) - { - _dbg_assert_msg_(CPU, 0, "Misaligned sv.q"); - } + if (addr & 0xF) + { + _dbg_assert_msg_(CPU, 0, "Misaligned sv.q"); + } ReadVector((float*)Memory::GetPointer(addr), V_Quad, vt); break; @@ -401,33 +401,33 @@ namespace MIPSInt EatPrefixes(); } - void Int_Vmscl(u32 op) - { - float s[16]; - float t[16]; - float d[16]; + void Int_Vmscl(u32 op) + { + float d[16]; + float s[16]; + float t[1]; - int vd = _VD; - int vs = _VS; - int vt = _VT; - MatrixSize sz = GetMtxSize(op); - int n = GetMatrixSide(sz); + int vd = _VD; + int vs = _VS; + int vt = _VT; + MatrixSize sz = GetMtxSize(op); + int n = GetMatrixSide(sz); - ReadMatrix(s, sz, vs); - ReadMatrix(t, sz, vt); + ReadMatrix(s, sz, vs); + ReadVector(t, V_Single, vt); - for (int a = 0; a < n; a++) - { - for (int b = 0; b < n; b++) - { - d[a*4 + b] = s[a*4 + b] * t[0]; - } - } + for (int a = 0; a < n; a++) + { + for (int b = 0; b < n; b++) + { + d[a*4 + b] = s[a*4 + b] * t[0]; + } + } - WriteMatrix(d, sz, vd); - PC += 4; - EatPrefixes(); - } + WriteMatrix(d, sz, vd); + PC += 4; + EatPrefixes(); + } void Int_Vmmov(u32 op) { @@ -436,7 +436,7 @@ namespace MIPSInt int vs = _VS; MatrixSize sz = GetMtxSize(op); ReadMatrix(s, sz, vs); - WriteMatrix(s,sz,vd); + WriteMatrix(s, sz, vd); PC += 4; EatPrefixes(); } @@ -470,7 +470,7 @@ namespace MIPSInt case 19: d[i] = cosf((float)M_PI_2 * s[i]); break; //vcos case 20: d[i] = powf(2.0f, s[i]); break; case 21: d[i] = logf(s[i])/log(2.0f); break; - case 22: d[i] = sqrtf(s[i]); break; //vsqrt + case 22: d[i] = sqrtf(s[i]); break; //vsqrt case 23: d[i] = asinf(s[i] * (float)M_2_PI); break; //vasin // case 24: vnrcp // case 26: vnsin @@ -703,7 +703,7 @@ namespace MIPSInt void Int_Vi2x(u32 op) { int s[4]; - u32 d[2] = {0}; + u32 d[2] = {0}; int vd = _VD; int vs = _VS; VectorSize sz = GetVecSize(op); @@ -726,18 +726,18 @@ namespace MIPSInt break; case 1: //vi2c - { - for (int i = 0; i < 4; i++) - { - int v = s[i]; - v >>= 24; - d[0] |= ((u32)v & 0xFF) << (i * 8); - } - oz = V_Single; - } - break; + { + for (int i = 0; i < 4; i++) + { + int v = s[i]; + v >>= 24; + d[0] |= ((u32)v & 0xFF) << (i * 8); + } + oz = V_Single; + } + break; - case 2: //vi2us + case 2: //vi2us { for (int i = 0; i < GetNumVectorElements(sz) / 2; i++) { int low = s[i * 2]; @@ -775,54 +775,54 @@ namespace MIPSInt EatPrefixes(); } - void Int_ColorConv(u32 op) - { - int vd = _VD; - int vs = _VS; - u32 s[4]; - VectorSize sz = V_Quad; - ReadVector((float *)s, sz, vs); - u16 colors[4]; - for (int i = 0; i < 4; i++) - { - u32 in = s[i]; - u16 col = 0; - switch ((op >> 16) & 3) - { - case 1: // 4444 - { - int a = ((in >> 24) & 0xFF) >> 4; - int b = ((in >> 16) & 0xFF) >> 4; - int g = ((in >> 8) & 0xFF) >> 4; - int r = ((in) & 0xFF) >> 4; - col = (a << 12) | (b << 8) | (g << 4 ) | (r); - break; - } - case 2: // 5551 - { - int a = ((in >> 24) & 0xFF) >> 7; - int b = ((in >> 16) & 0xFF) >> 3; - int g = ((in >> 8) & 0xFF) >> 3; - int r = ((in) & 0xFF) >> 3; - col = (a << 15) | (b << 10) | (g << 5) | (r); - break; - } - case 3: // 565 - { - int b = ((in >> 16) & 0xFF) >> 3; - int g = ((in >> 8) & 0xFF) >> 2; - int r = ((in) & 0xFF) >> 3; - col = (b << 11) | (g << 5) | (r); - break; - } - } - colors[i] = col; - } - u32 ov[2] = {(u32)colors[0] | (colors[1] << 16), (u32)colors[2] | (colors[3] << 16)}; - WriteVector((const float *)ov, V_Pair, vd); - PC += 4; - EatPrefixes(); - } + void Int_ColorConv(u32 op) + { + int vd = _VD; + int vs = _VS; + u32 s[4]; + VectorSize sz = V_Quad; + ReadVector((float *)s, sz, vs); + u16 colors[4]; + for (int i = 0; i < 4; i++) + { + u32 in = s[i]; + u16 col = 0; + switch ((op >> 16) & 3) + { + case 1: // 4444 + { + int a = ((in >> 24) & 0xFF) >> 4; + int b = ((in >> 16) & 0xFF) >> 4; + int g = ((in >> 8) & 0xFF) >> 4; + int r = ((in) & 0xFF) >> 4; + col = (a << 12) | (b << 8) | (g << 4 ) | (r); + break; + } + case 2: // 5551 + { + int a = ((in >> 24) & 0xFF) >> 7; + int b = ((in >> 16) & 0xFF) >> 3; + int g = ((in >> 8) & 0xFF) >> 3; + int r = ((in) & 0xFF) >> 3; + col = (a << 15) | (b << 10) | (g << 5) | (r); + break; + } + case 3: // 565 + { + int b = ((in >> 16) & 0xFF) >> 3; + int g = ((in >> 8) & 0xFF) >> 2; + int r = ((in) & 0xFF) >> 3; + col = (b << 11) | (g << 5) | (r); + break; + } + } + colors[i] = col; + } + u32 ov[2] = {(u32)colors[0] | (colors[1] << 16), (u32)colors[2] | (colors[3] << 16)}; + WriteVector((const float *)ov, V_Pair, vd); + PC += 4; + EatPrefixes(); + } void Int_VDot(u32 op) { @@ -927,27 +927,27 @@ namespace MIPSInt EatPrefixes(); } - void Int_Vavg(u32 op) - { - float s[4]; - float d; - int vd = _VD; - int vs = _VS; - VectorSize sz = GetVecSize(op); - ReadVector(s, sz, vs); - ApplySwizzleS(s, sz); - float sum = 0.0f; - int n = GetNumVectorElements(sz); - for (int i = 0; i < n; i++) - { - sum += s[i]; - } - d = sum / n; - ApplyPrefixD(&d, V_Single); - V(vd) = d; - PC += 4; - EatPrefixes(); - } + void Int_Vavg(u32 op) + { + float s[4]; + float d; + int vd = _VD; + int vs = _VS; + VectorSize sz = GetVecSize(op); + ReadVector(s, sz, vs); + ApplySwizzleS(s, sz); + float sum = 0.0f; + int n = GetNumVectorElements(sz); + for (int i = 0; i < n; i++) + { + sum += s[i]; + } + d = sum / n; + ApplyPrefixD(&d, V_Single); + V(vd) = d; + PC += 4; + EatPrefixes(); + } void Int_VScl(u32 op) { @@ -971,36 +971,36 @@ namespace MIPSInt EatPrefixes(); } - void Int_Vrnds(u32 op) - { - int vd = _VD; - int seed = VI(vd); - currentMIPS->rng.Init(seed); - } - - void Int_VrndX(u32 op) - { - float d[4]; - int vd = _VD; - VectorSize sz = GetVecSize(op); - int n = GetNumVectorElements(sz); - for (int i = 0; i < n; i++) - { - switch ((op >> 16) & 0x1f) - { - case 1: d[i] = (float)currentMIPS->rng.R32(); break; // vrndi - TODO: copy bits instead? - case 2: d[i] = 1.0f + ((float)currentMIPS->rng.R32() / 0xFFFFFFFF); break; // vrndf1 TODO: make more accurate - case 3: d[i] = 2.0f + 2 * ((float)currentMIPS->rng.R32() / 0xFFFFFFFF); break; // vrndf2 TODO: make more accurate - case 4: d[i] = 0.0f; // Should not get here - } - } - ApplyPrefixD(d, sz); - WriteVector(d, sz, vd); - PC += 4; - EatPrefixes(); - } + void Int_Vrnds(u32 op) + { + int vd = _VD; + int seed = VI(vd); + currentMIPS->rng.Init(seed); + } - // Generates one line of a rotation matrix around one of the three axes + void Int_VrndX(u32 op) + { + float d[4]; + int vd = _VD; + VectorSize sz = GetVecSize(op); + int n = GetNumVectorElements(sz); + for (int i = 0; i < n; i++) + { + switch ((op >> 16) & 0x1f) + { + case 1: d[i] = (float)currentMIPS->rng.R32(); break; // vrndi - TODO: copy bits instead? + case 2: d[i] = 1.0f + ((float)currentMIPS->rng.R32() / 0xFFFFFFFF); break; // vrndf1 TODO: make more accurate + case 3: d[i] = 2.0f + 2 * ((float)currentMIPS->rng.R32() / 0xFFFFFFFF); break; // vrndf2 TODO: make more accurate + case 4: d[i] = 0.0f; // Should not get here + } + } + ApplyPrefixD(d, sz); + WriteVector(d, sz, vd); + PC += 4; + EatPrefixes(); + } + + // Generates one line of a rotation matrix around one of the three axes void Int_Vrot(u32 op) { int vd = _VD; @@ -1010,9 +1010,9 @@ namespace MIPSInt float angle = V(vs) * M_PI_2; bool negSin = (imm & 0x10) ? true : false; float sine = sinf(angle); - float cosine = cosf(angle); + float cosine = cosf(angle); if (negSin) - sine = -sine; + sine = -sine; float d[4] = {0}; if (((imm >> 2) & 3) == (imm & 3)) { @@ -1035,23 +1035,23 @@ namespace MIPSInt VectorSize sz = GetVecSize(op); MatrixSize msz = GetMtxSize(op); - int n = GetNumVectorElements(sz); + int n = GetNumVectorElements(sz); + + bool homogenous = false; + if (n == ins) + { + n++; + sz = (VectorSize)((int)(sz) + 1); + msz = (MatrixSize)((int)(msz) + 1); + homogenous = true; + } - bool homogenous = false; - if (n == ins) - { - n++; - sz = (VectorSize)((int)(sz) + 1); - msz = (MatrixSize)((int)(msz) + 1); - homogenous = true; - } - float s[16]; ReadMatrix(s, msz, vs); float t[4]; ReadVector(t, sz, vt); float d[4]; - + if (homogenous) { for (int i = 0; i < n; i++) @@ -1082,7 +1082,7 @@ namespace MIPSInt PC += 4; EatPrefixes(); } - + void Int_SV(u32 op) { s32 imm = (signed short)(op&0xFFFC); @@ -1093,7 +1093,7 @@ namespace MIPSInt switch (op >> 26) { case 50: //lv.s - VI(vt) = Memory::Read_U32(addr); + VI(vt) = Memory::Read_U32(addr); break; case 58: //sv.s Memory::Write_U32(VI(vt), addr); @@ -1208,6 +1208,7 @@ namespace MIPSInt for (int i = 0; i < n; i++) { int c; + // These set c to 0 or 1, nothing else. switch (cond) { case VC_EQ: c = s[i] == t[i]; break; @@ -1232,8 +1233,9 @@ namespace MIPSInt affected_bits |= 1 << i; } // Use masking to only change the affected bits - currentMIPS->vfpuCtrl[VFPU_CTRL_CC] = (currentMIPS->vfpuCtrl[VFPU_CTRL_CC] & ~affected_bits) | - (cc | (or_val << 4) | (and_val << 5)) & affected_bits; + currentMIPS->vfpuCtrl[VFPU_CTRL_CC] = + (currentMIPS->vfpuCtrl[VFPU_CTRL_CC] & ~affected_bits) | + ((cc | (or_val << 4) | (and_val << 5)) & affected_bits); PC += 4; EatPrefixes(); } @@ -1348,13 +1350,6 @@ namespace MIPSInt default: goto bad; } break; - /* - case 27: //VFPU3 - switch ((op >> 23)&7) - { - case 0: d[i] = s[i] * t[i]; break; //vmul - } - break;*/ default: bad: _dbg_assert_msg_(CPU,0,"Trying to interpret instruction that can't be interpreted"); diff --git a/Core/MIPS/MIPSTables.cpp b/Core/MIPS/MIPSTables.cpp index c8940bfb49..80bf608052 100644 --- a/Core/MIPS/MIPSTables.cpp +++ b/Core/MIPS/MIPSTables.cpp @@ -225,8 +225,8 @@ const MIPSInstruction tableSpecial[64] = /// 000000 ...... ...... .......... xxx {-2}, INSTR("slt", &Jit::Comp_RType3, Dis_RType3, Int_RType3,IN_RS|IN_RT|OUT_RD), INSTR("sltu", &Jit::Comp_RType3, Dis_RType3, Int_RType3,IN_RS|IN_RT|OUT_RD), - INSTR("max", &Jit::Comp_Generic, Dis_RType3, Int_RType3,IN_RS|IN_RT|OUT_RD), - INSTR("min", &Jit::Comp_Generic, Dis_RType3, Int_RType3,IN_RS|IN_RT|OUT_RD), + INSTR("max", &Jit::Comp_RType3, Dis_RType3, Int_RType3,IN_RS|IN_RT|OUT_RD), + INSTR("min", &Jit::Comp_RType3, Dis_RType3, Int_RType3,IN_RS|IN_RT|OUT_RD), INSTR("msub", &Jit::Comp_Generic, Dis_MulDivType, Int_MulDivType, IN_RS|IN_RT|OUT_OTHER), INSTR("msubu", &Jit::Comp_Generic, Dis_MulDivType, Int_MulDivType, IN_RS|IN_RT|OUT_OTHER), diff --git a/Core/MIPS/x86/CompALU.cpp b/Core/MIPS/x86/CompALU.cpp index c86551baf2..674d685c16 100644 --- a/Core/MIPS/x86/CompALU.cpp +++ b/Core/MIPS/x86/CompALU.cpp @@ -161,17 +161,17 @@ namespace MIPSComp case 33: //R(rd) = R(rs) + R(rt); break; //addu CompTriArith(op, &XEmitter::ADD); break; - case 134: //R(rd) = R(rs) - R(rt); break; //sub - case 135: + case 34: //R(rd) = R(rs) - R(rt); break; //sub + case 35: CompTriArith(op, &XEmitter::SUB); break; - case 136: //R(rd) = R(rs) & R(rt); break; //and + case 36: //R(rd) = R(rs) & R(rt); break; //and CompTriArith(op, &XEmitter::AND); break; - case 137: //R(rd) = R(rs) | R(rt); break; //or + case 37: //R(rd) = R(rs) | R(rt); break; //or CompTriArith(op, &XEmitter::OR); break; - case 138: //R(rd) = R(rs) ^ R(rt); break; //xor + case 38: //R(rd) = R(rs) ^ R(rt); break; //xor CompTriArith(op, &XEmitter::XOR); break; diff --git a/Core/MemMapFunctions.cpp b/Core/MemMapFunctions.cpp index 78f8262f0e..561e7fb93e 100644 --- a/Core/MemMapFunctions.cpp +++ b/Core/MemMapFunctions.cpp @@ -82,7 +82,7 @@ inline void ReadFromHardware(T &var, const u32 address) } else { - WARN_LOG(MEMMAP, "ReadFromHardware: Invalid address %08x PC %08x PPC %08x LR %08x", address, currentMIPS->pc, currentMIPS->prevPC, currentMIPS->r[MIPS_REG_RA]); + WARN_LOG(MEMMAP, "ReadFromHardware: Invalid address %08x PC %08x LR %08x", address, currentMIPS->pc, currentMIPS->r[MIPS_REG_RA]); if (!g_Config.bIgnoreBadMemAccess) { // TODO: Not sure what the best way to crash is... exit(0); diff --git a/GPU/GLES/TextureCache.cpp b/GPU/GLES/TextureCache.cpp index 680d004427..7b97e2d342 100644 --- a/GPU/GLES/TextureCache.cpp +++ b/GPU/GLES/TextureCache.cpp @@ -497,8 +497,8 @@ void PSPSetTexture() if (!texaddr) return; u8 level = 0; - int format = gstate.texformat & 0xF; - int clutformat = gstate.clutformat & 3; + u32 format = gstate.texformat & 0xF; + u32 clutformat = gstate.clutformat & 3; DEBUG_LOG(G3D,"Texture at %08x",texaddr); u8 *texptr = Memory::GetPointer(texaddr); @@ -513,26 +513,23 @@ void PSPSetTexture() bool match = true; //TODO: Check more texture parameters, compute real texture hash - if(dim != entry.dim || entry.hash != *(u32*)texptr || entry.format != format) + if (dim != entry.dim || entry.hash != *(u32*)texptr || entry.format != format) match = false; //TODO: Check more clut parameters, compute clut hash - if(match && (format >= GE_TFMT_CLUT4 && format <= GE_TFMT_CLUT32) && - (entry.clutformat != clutformat || - entry.clutaddr != GetClutAddr(clutformat == GE_CMODE_32BIT_ABGR8888 ? 4 : 2) || - entry.cluthash != Memory::Read_U32(entry.clutaddr))) + if (match && (format >= GE_TFMT_CLUT4 && format <= GE_TFMT_CLUT32) && + (entry.clutformat != clutformat || + entry.clutaddr != GetClutAddr(clutformat == GE_CMODE_32BIT_ABGR8888 ? 4 : 2) || + entry.cluthash != Memory::Read_U32(entry.clutaddr))) match = false; - if (match) - { + if (match) { //got one! glBindTexture(GL_TEXTURE_2D, entry.texture); UpdateSamplingParams(); DEBUG_LOG(G3D,"Texture at %08x Found in Cache, applying", texaddr); return; //Done! - } - else - { + } else { NOTICE_LOG(G3D,"Texture different or overwritten, reloading at %08x", texaddr); //Damnit, got overwritten. @@ -785,7 +782,7 @@ void PSPSetTexture() } else { write = (u8 *)finalBuf; } - for (int y = 0; y < h; y++) { + for (u32 y = 0; y < h; y++) { memmove(write, read, outRowBytes); read += inRowBytes; write += outRowBytes; diff --git a/GPU/GPUState.h b/GPU/GPUState.h index 864d523316..77a8612275 100644 --- a/GPU/GPUState.h +++ b/GPU/GPUState.h @@ -234,14 +234,12 @@ struct GPUgstate float tgenMatrix[12]; float boneMatrix[8*12]; }; +// Real data in the context ends here +// The rest is cached simplified/converted data for fast access. +// Does not need to be saved when saving/restoring context. struct GPUStateCache { - // Real data in the context ends here - // The rest is cached simplified/converted data for fast access. - // What we have here still fits into 512 words, but just barely so we should - // in the future just recompute the below on an sceGeRestoreContext(). - u32 vertexAddr; u32 indexAddr; diff --git a/android/ab.sh b/android/ab.sh index 9480248799..6190b3e541 100644 --- a/android/ab.sh +++ b/android/ab.sh @@ -1 +1 @@ -NDK_MODULE_PATH=..:../native/ext $NDK/ndk-build -j 3 +NDK_MODULE_PATH=..:../native/ext $NDK/ndk-build -j3 TARGET_PLATFORM=android-9 $* diff --git a/android/build.xml b/android/build.xml new file mode 100644 index 0000000000..9ece82a893 --- /dev/null +++ b/android/build.xml @@ -0,0 +1,92 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/android/custom_rules.xml b/android/custom_rules.xml new file mode 100644 index 0000000000..19735dcb05 --- /dev/null +++ b/android/custom_rules.xml @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + diff --git a/android/jni/Android.mk b/android/jni/Android.mk index 53a379946b..a63bc5f606 100644 --- a/android/jni/Android.mk +++ b/android/jni/Android.mk @@ -24,8 +24,8 @@ LOCAL_MODULE := ppsspp_jni NATIVE := ../../native SRC := ../.. -LOCAL_CFLAGS := -DUSE_PROFILER -DGL_GLEXT_PROTOTYPES -O2 -fsigned-char -Wall -Wno-multichar -Wno-psabi -std=gnu++0x -Wno-unused-variable -fno-strict-aliasing -ffast-math -LOCAL_CPPFLAGS := +LOCAL_CFLAGS := -DUSE_PROFILER -DGL_GLEXT_PROTOTYPES -O2 -fsigned-char -Wall -Wno-multichar -Wno-psabi -Wno-unused-variable -fno-strict-aliasing -ffast-math +LOCAL_CPPFLAGS := -std=gnu++0x LOCAL_C_INCLUDES := \ $(LOCAL_PATH)/../../Common \ $(LOCAL_PATH)/../.. \ @@ -68,7 +68,7 @@ LOCAL_SRC_FILES := \ $(SRC)/Common/ThunkARM.cpp \ $(SRC)/Common/Misc.cpp \ $(SRC)/GPU/Math3D.cpp \ - $(SRC)/GPU/GpuState.cpp \ + $(SRC)/GPU/GPUState.cpp \ $(SRC)/GPU/GLES/Framebuffer.cpp \ $(SRC)/GPU/GLES/DisplayListInterpreter.cpp \ $(SRC)/GPU/GLES/TextureCache.cpp \ @@ -89,7 +89,7 @@ LOCAL_SRC_FILES := \ $(SRC)/Core/Loaders.cpp \ $(SRC)/Core/PSPLoaders.cpp \ $(SRC)/Core/MemMap.cpp \ - $(SRC)/Core/MemmapFunctions.cpp \ + $(SRC)/Core/MemMapFunctions.cpp \ $(SRC)/Core/System.cpp \ $(SRC)/Core/PSPMixer.cpp \ $(SRC)/Core/Debugger/Breakpoints.cpp \ diff --git a/android/project.properties b/android/project.properties index 924a2616fc..babca9a8c9 100644 --- a/android/project.properties +++ b/android/project.properties @@ -11,5 +11,5 @@ #proguard.config=${sdk.dir}/tools/proguard/proguard-android.txt:proguard-project.txt # Project target. -target=android-8 +target=android-10 android.library.reference.1=../native/android diff --git a/native b/native index 2703289d45..8e673a20f7 160000 --- a/native +++ b/native @@ -1 +1 @@ -Subproject commit 2703289d456bf22e80eafbce0aa0307389a51dc6 +Subproject commit 8e673a20f70bb636a5cc4ba17cbbe6613869b461