From b0868613bb33d420d0df8779052d9e8713ac0d2b Mon Sep 17 00:00:00 2001 From: raven02 Date: Sat, 19 Jan 2013 21:05:05 +0800 Subject: [PATCH 01/23] Add DoState() to scePsmfPlayer . --- Core/Dialog/PSPDialog.cpp | 2 +- Core/HLE/scePsmf.cpp | 18 ++++++++++++++++++ 2 files changed, 19 insertions(+), 1 deletion(-) diff --git a/Core/Dialog/PSPDialog.cpp b/Core/Dialog/PSPDialog.cpp index 8871509e81..2d348b3370 100644 --- a/Core/Dialog/PSPDialog.cpp +++ b/Core/Dialog/PSPDialog.cpp @@ -43,7 +43,7 @@ PSPDialog::DialogStatus PSPDialog::GetStatus() void PSPDialog::StartDraw() { PPGeBegin(); - PPGeDrawRect(0, 0, 480, 272, CalcFadedColor(0x90606060)); + PPGeDrawRect(0, 0, 480, 272, CalcFadedColor(0x00606060)); } void PSPDialog::EndDraw() { diff --git a/Core/HLE/scePsmf.cpp b/Core/HLE/scePsmf.cpp index 937a8116b5..eb6dd8500d 100644 --- a/Core/HLE/scePsmf.cpp +++ b/Core/HLE/scePsmf.cpp @@ -141,6 +141,7 @@ public: class PsmfPlayer { public: PsmfPlayer(u32 data); + void DoState(PointerWrap &p); int videoCodec; int videoStreamNum; @@ -295,6 +296,23 @@ void Psmf::DoState(PointerWrap &p) { p.DoMarker("Psmf"); } +void PsmfPlayer::DoState(PointerWrap &p) { + p.Do(videoCodec); + p.Do(videoStreamNum); + p.Do(audioCodec); + p.Do(audioStreamNum); + p.Do(playMode); + p.Do(playSpeed); + + p.Do(displayBuffer); + p.Do(displayBufferSize); + p.Do(playbackThreadPriority); + p.Do(psmfMaxAheadTimestamp); + p.Do(psmfPlayerLastTimestamp); + + p.DoMarker("PsmfPlayer"); +} + static std::map psmfMap; static std::map psmfPlayerMap; // TODO: Should have a map. From 7961197dacdd564c501c5d8893fcf1ba58dff34f Mon Sep 17 00:00:00 2001 From: raven02 Date: Sat, 19 Jan 2013 22:14:19 +0800 Subject: [PATCH 02/23] Cosmetic fix PSPSaveDialog::DisplayConfirmationYesNo --- Core/Dialog/PSPDialog.cpp | 2 +- Core/Dialog/PSPSaveDialog.cpp | 13 +++++++------ 2 files changed, 8 insertions(+), 7 deletions(-) diff --git a/Core/Dialog/PSPDialog.cpp b/Core/Dialog/PSPDialog.cpp index 2d348b3370..e58df90e65 100644 --- a/Core/Dialog/PSPDialog.cpp +++ b/Core/Dialog/PSPDialog.cpp @@ -43,7 +43,7 @@ PSPDialog::DialogStatus PSPDialog::GetStatus() void PSPDialog::StartDraw() { PPGeBegin(); - PPGeDrawRect(0, 0, 480, 272, CalcFadedColor(0x00606060)); + PPGeDrawRect(0, 0, 480, 272, CalcFadedColor(0x70606060)); } void PSPDialog::EndDraw() { diff --git a/Core/Dialog/PSPSaveDialog.cpp b/Core/Dialog/PSPSaveDialog.cpp index 302bc7767c..3393f82191 100644 --- a/Core/Dialog/PSPSaveDialog.cpp +++ b/Core/Dialog/PSPSaveDialog.cpp @@ -300,11 +300,11 @@ void PSPSaveDialog::DisplaySaveDataInfo2() void PSPSaveDialog::DisplayConfirmationYesNo(std::string text) { - PPGeDrawText(text.c_str(), 180, 100, PPGE_ALIGN_LEFT, 0.45f, 0xFFFFFFFF); - - PPGeDrawText("Yes", 230, 140, PPGE_ALIGN_LEFT, 0.45f, CalcFadedColor(yesnoChoice == 1?0xFF0000FF:0xFFFFFFFF)); - PPGeDrawText("No", 330, 140, PPGE_ALIGN_LEFT, 0.45f, CalcFadedColor(yesnoChoice == 0?0xFF0000FF:0xFFFFFFFF)); - + PPGeDrawRect(180, 105, 460, 106, CalcFadedColor(0xFFFFFFFF)); + PPGeDrawText(text.c_str(), 220, 110, PPGE_ALIGN_LEFT, 0.45f, 0xFFFFFFFF); + PPGeDrawText("Yes", 250, 140, PPGE_ALIGN_LEFT, 0.45f, CalcFadedColor(yesnoChoice == 1?0xFF0000FF:0xFFFFFFFF)); + PPGeDrawText("No", 350, 140, PPGE_ALIGN_LEFT, 0.45f, CalcFadedColor(yesnoChoice == 0?0xFF0000FF:0xFFFFFFFF)); + PPGeDrawRect(180, 160, 460, 161, CalcFadedColor(0xFFFFFFFF)); if (IsButtonPressed(CTRL_LEFT) && yesnoChoice == 0) { yesnoChoice = 1; @@ -579,7 +579,8 @@ int PSPSaveDialog::Update() DisplaySaveIcon(); DisplaySaveDataInfo2(); - DisplayConfirmationYesNo("The data will be deleted.\nAre you sure you want to continue?"); + DisplayConfirmationYesNo(" This save data will be deleted.\nAre you sure you want to continue?"); + DisplayEnterBack(); if (IsButtonPressed(cancelButtonFlag)) From 79d9f25e922a6246bc7bba7df8ac93de0a83b883 Mon Sep 17 00:00:00 2001 From: raven02 Date: Sat, 19 Jan 2013 23:41:35 +0800 Subject: [PATCH 03/23] Display AM/PM and 12 hour format --- Core/Dialog/PSPSaveDialog.cpp | 24 ++++++++++++++++++++---- 1 file changed, 20 insertions(+), 4 deletions(-) diff --git a/Core/Dialog/PSPSaveDialog.cpp b/Core/Dialog/PSPSaveDialog.cpp index 3393f82191..ff3bb8e6bb 100644 --- a/Core/Dialog/PSPSaveDialog.cpp +++ b/Core/Dialog/PSPSaveDialog.cpp @@ -251,13 +251,21 @@ void PSPSaveDialog::DisplaySaveDataInfo1() char saveTitle[512]; char saveDetail[512]; + char am_pm[] = "AM"; + int hour = param.GetFileInfo(currentSelectedSave).modif_time.tm_hour ; + if( hour > 12 ) { + strcpy(am_pm, "PM"); + hour -= 12; + } + snprintf(title,512,"%s", param.GetFileInfo(currentSelectedSave).title); - snprintf(time,512,"%02d/%02d/%d %02d:%02d %lld KB" + snprintf(time,512,"%02d/%02d/%d %02d:%02d %s %lld KB" , param.GetFileInfo(currentSelectedSave).modif_time.tm_mday , param.GetFileInfo(currentSelectedSave).modif_time.tm_mon + 1 , param.GetFileInfo(currentSelectedSave).modif_time.tm_year + 1900 - , param.GetFileInfo(currentSelectedSave).modif_time.tm_hour + , hour , param.GetFileInfo(currentSelectedSave).modif_time.tm_min + , am_pm , param.GetFileInfo(currentSelectedSave).size / 1024 ); snprintf(saveTitle,512,"%s", param.GetFileInfo(currentSelectedSave).saveTitle); @@ -284,13 +292,21 @@ void PSPSaveDialog::DisplaySaveDataInfo2() else { char txt[1024]; - snprintf(txt,1024,"%s\n%02d/%02d/%d %02d:%02d\n%lld KB" + char am_pm[] = "AM"; + int hour = param.GetFileInfo(currentSelectedSave).modif_time.tm_hour ; + if( hour > 12 ) { + strcpy(am_pm, "PM"); + hour -= 12; + } + + snprintf(txt,1024,"%s\n%02d/%02d/%d %02d:%02d %s\n%lld KB" , param.GetFileInfo(currentSelectedSave).saveTitle , param.GetFileInfo(currentSelectedSave).modif_time.tm_mday , param.GetFileInfo(currentSelectedSave).modif_time.tm_mon + 1 , param.GetFileInfo(currentSelectedSave).modif_time.tm_year + 1900 - , param.GetFileInfo(currentSelectedSave).modif_time.tm_hour + , hour , param.GetFileInfo(currentSelectedSave).modif_time.tm_min + , am_pm , param.GetFileInfo(currentSelectedSave).size / 1024 ); std::string saveinfoTxt = txt; From f1295f6262623745bdf1d2e0776f0fc1aedc05df Mon Sep 17 00:00:00 2001 From: "Unknown W. Brackets" Date: Sat, 19 Jan 2013 02:48:48 -0800 Subject: [PATCH 04/23] Don't muck with currentMIPS->r in the slowmem jit. --- Common/ABI.cpp | 26 +++++++++++++++++ Common/x64Emitter.h | 1 + Core/MIPS/x86/CompLoadStore.cpp | 50 ++++++++++++++++++--------------- 3 files changed, 55 insertions(+), 22 deletions(-) diff --git a/Common/ABI.cpp b/Common/ABI.cpp index f0489e346d..4a79b64434 100644 --- a/Common/ABI.cpp +++ b/Common/ABI.cpp @@ -170,6 +170,16 @@ void XEmitter::ABI_CallFunctionACC(void *func, const Gen::OpArg &arg1, u32 param ABI_RestoreStack(3 * 4); } +void XEmitter::ABI_CallFunctionAAC(void *func, const Gen::OpArg &arg1, const Gen::OpArg &arg2, u32 param3) +{ + ABI_AlignStack(3 * 4); + PUSH(32, Imm32(param3)); + PUSH(32, arg2); + PUSH(32, arg1); + CALL(func); + ABI_RestoreStack(3 * 4); +} + void XEmitter::ABI_CallFunctionA(void *func, const Gen::OpArg &arg1) { ABI_AlignStack(1 * 4); @@ -430,6 +440,22 @@ void XEmitter::ABI_CallFunctionACC(void *func, const Gen::OpArg &arg1, u32 param } } +void XEmitter::ABI_CallFunctionAAC(void *func, const Gen::OpArg &arg1, const Gen::OpArg &arg2, u32 param3) +{ + MOV(32, R(ABI_PARAM1), arg1); + MOV(32, R(ABI_PARAM2), arg2); + MOV(64, R(ABI_PARAM3), Imm64(param3)); + u64 distance = u64(func) - (u64(code) + 5); + if (distance >= 0x0000000080000000ULL + && distance < 0xFFFFFFFF80000000ULL) { + // Far call + MOV(64, R(RAX), Imm64((u64)func)); + CALLptr(R(RAX)); + } else { + CALL(func); + } +} + void XEmitter::ABI_CallFunctionA(void *func, const Gen::OpArg &arg1) { if (!arg1.IsSimpleReg(ABI_PARAM1)) diff --git a/Common/x64Emitter.h b/Common/x64Emitter.h index e0b85e6b85..fb8ec8694b 100644 --- a/Common/x64Emitter.h +++ b/Common/x64Emitter.h @@ -657,6 +657,7 @@ public: void ABI_CallFunctionPPC(void *func, void *param1, void *param2,u32 param3); void ABI_CallFunctionAC(void *func, const Gen::OpArg &arg1, u32 param2); void ABI_CallFunctionACC(void *func, const Gen::OpArg &arg1, u32 param2, u32 param3); + void ABI_CallFunctionAAC(void *func, const Gen::OpArg &arg1, const Gen::OpArg &arg2, u32 param3); void ABI_CallFunctionA(void *func, const Gen::OpArg &arg1); // Pass a register as a paremeter. diff --git a/Core/MIPS/x86/CompLoadStore.cpp b/Core/MIPS/x86/CompLoadStore.cpp index f53338823a..1b9695612b 100644 --- a/Core/MIPS/x86/CompLoadStore.cpp +++ b/Core/MIPS/x86/CompLoadStore.cpp @@ -41,24 +41,24 @@ namespace MIPSComp { - static void ReadMemSafe32(u32 addr, int preg, u32 offset) + static u32 ReadMemSafe32(u32 addr, u32 offset) { - currentMIPS->r[preg] = Memory::Read_U32(addr + offset); + return Memory::Read_U32(addr + offset); } - static void ReadMemSafe16(u32 addr, int preg, u32 offset) + static u32 ReadMemSafe16(u32 addr, u32 offset) { - currentMIPS->r[preg] = Memory::Read_U16(addr + offset); + return Memory::Read_U16(addr + offset); } - static void WriteMemSafe32(u32 addr, int preg, u32 offset) + static void WriteMemSafe32(u32 addr, u32 value, u32 offset) { - Memory::Write_U32(currentMIPS->r[preg], addr + offset); + Memory::Write_U32(value, addr + offset); } - static void WriteMemSafe16(u32 addr, int preg, u32 offset) + static void WriteMemSafe16(u32 addr, u32 value, u32 offset) { - Memory::Write_U16(currentMIPS->r[preg], addr + offset); + Memory::Write_U16(value, addr + offset); } void Jit::Comp_ITypeMem(u32 op) @@ -92,14 +92,16 @@ namespace MIPSComp #else MOVZX(32, 16, gpr.RX(rt), MComplex(RBX, EAX, SCALE_1, offset)); #endif - gpr.UnlockAll(); - FlushAll(); FixupBranch skip = J(); SetJumpTarget(tooLow); SetJumpTarget(tooHigh); - ABI_CallFunctionACC((void *) &ReadMemSafe16, gpr.R(rs), rt, offset); + + ABI_CallFunctionAC((void *) &ReadMemSafe16, R(EAX), offset); + MOVZX(32, 16, gpr.RX(rt), R(EAX)); + SetJumpTarget(skip); + gpr.UnlockAll(); } else { @@ -139,14 +141,16 @@ namespace MIPSComp #else MOV(32, gpr.R(rt), MComplex(RBX, EAX, SCALE_1, offset)); #endif - gpr.UnlockAll(); - FlushAll(); FixupBranch skip = J(); SetJumpTarget(tooLow); SetJumpTarget(tooHigh); - ABI_CallFunctionACC((void *) &ReadMemSafe32, gpr.R(rs), rt, offset); + + ABI_CallFunctionAC((void *) &ReadMemSafe32, R(EAX), offset); + MOV(32, gpr.R(rt), R(EAX)); + SetJumpTarget(skip); + gpr.UnlockAll(); } else { @@ -177,7 +181,7 @@ namespace MIPSComp FlushAll(); gpr.Lock(rt, rs); - gpr.BindToRegister(rt, true, true); + gpr.BindToRegister(rt, true, false); MOV(32, R(EAX), gpr.R(rs)); CMP(32, R(EAX), Imm32(0x08000000)); @@ -189,14 +193,15 @@ namespace MIPSComp #else MOV(16, MComplex(RBX, EAX, SCALE_1, offset), gpr.R(rt)); #endif - gpr.UnlockAll(); - FlushAll(); FixupBranch skip = J(); SetJumpTarget(tooLow); SetJumpTarget(tooHigh); - ABI_CallFunctionACC((void *) &WriteMemSafe16, gpr.R(rs), rt, offset); + + ABI_CallFunctionAAC((void *) &WriteMemSafe16, R(EAX), gpr.R(rt), offset); + SetJumpTarget(skip); + gpr.UnlockAll(); } else { @@ -220,7 +225,7 @@ namespace MIPSComp FlushAll(); gpr.Lock(rt, rs); - gpr.BindToRegister(rt, true, true); + gpr.BindToRegister(rt, true, false); MOV(32, R(EAX), gpr.R(rs)); CMP(32, R(EAX), Imm32(0x08000000)); @@ -232,14 +237,15 @@ namespace MIPSComp #else MOV(32, MComplex(RBX, EAX, SCALE_1, offset), gpr.R(rt)); #endif - gpr.UnlockAll(); - FlushAll(); FixupBranch skip = J(); SetJumpTarget(tooLow); SetJumpTarget(tooHigh); - ABI_CallFunctionACC((void *) &WriteMemSafe32, gpr.R(rs), rt, offset); + + ABI_CallFunctionAAC((void *) &WriteMemSafe32, R(EAX), gpr.R(rt), offset); + SetJumpTarget(skip); + gpr.UnlockAll(); } else { From 5305017fc3a5356f9611475fe8ed8fea70a2a90d Mon Sep 17 00:00:00 2001 From: "Unknown W. Brackets" Date: Sat, 19 Jan 2013 10:49:19 -0800 Subject: [PATCH 05/23] Properly save registers before the slowmem call. --- Common/ABI.cpp | 30 ++++++++++++------------- Common/x64Emitter.h | 2 +- Core/MIPS/x86/CompLoadStore.cpp | 40 +++++++-------------------------- Core/MIPS/x86/Jit.h | 2 ++ 4 files changed, 26 insertions(+), 48 deletions(-) diff --git a/Common/ABI.cpp b/Common/ABI.cpp index 4a79b64434..3d0d792984 100644 --- a/Common/ABI.cpp +++ b/Common/ABI.cpp @@ -170,16 +170,6 @@ void XEmitter::ABI_CallFunctionACC(void *func, const Gen::OpArg &arg1, u32 param ABI_RestoreStack(3 * 4); } -void XEmitter::ABI_CallFunctionAAC(void *func, const Gen::OpArg &arg1, const Gen::OpArg &arg2, u32 param3) -{ - ABI_AlignStack(3 * 4); - PUSH(32, Imm32(param3)); - PUSH(32, arg2); - PUSH(32, arg1); - CALL(func); - ABI_RestoreStack(3 * 4); -} - void XEmitter::ABI_CallFunctionA(void *func, const Gen::OpArg &arg1) { ABI_AlignStack(1 * 4); @@ -188,6 +178,15 @@ void XEmitter::ABI_CallFunctionA(void *func, const Gen::OpArg &arg1) ABI_RestoreStack(1 * 4); } +void XEmitter::ABI_CallFunctionAA(void *func, const Gen::OpArg &arg1, const Gen::OpArg &arg2) +{ + ABI_AlignStack(2 * 4); + PUSH(32, arg2); + PUSH(32, arg1); + CALL(func); + ABI_RestoreStack(2 * 4); +} + void XEmitter::ABI_PushAllCalleeSavedRegsAndAdjustStack() { // Note: 4 * 4 = 16 bytes, so alignment is preserved. PUSH(EBP); @@ -440,11 +439,10 @@ void XEmitter::ABI_CallFunctionACC(void *func, const Gen::OpArg &arg1, u32 param } } -void XEmitter::ABI_CallFunctionAAC(void *func, const Gen::OpArg &arg1, const Gen::OpArg &arg2, u32 param3) +void XEmitter::ABI_CallFunctionA(void *func, const Gen::OpArg &arg1) { - MOV(32, R(ABI_PARAM1), arg1); - MOV(32, R(ABI_PARAM2), arg2); - MOV(64, R(ABI_PARAM3), Imm64(param3)); + if (!arg1.IsSimpleReg(ABI_PARAM1)) + MOV(32, R(ABI_PARAM1), arg1); u64 distance = u64(func) - (u64(code) + 5); if (distance >= 0x0000000080000000ULL && distance < 0xFFFFFFFF80000000ULL) { @@ -456,10 +454,12 @@ void XEmitter::ABI_CallFunctionAAC(void *func, const Gen::OpArg &arg1, const Gen } } -void XEmitter::ABI_CallFunctionA(void *func, const Gen::OpArg &arg1) +void XEmitter::ABI_CallFunctionAA(void *func, const Gen::OpArg &arg1, const Gen::OpArg &arg2) { if (!arg1.IsSimpleReg(ABI_PARAM1)) MOV(32, R(ABI_PARAM1), arg1); + if (!arg2.IsSimpleReg(ABI_PARAM2)) + MOV(32, R(ABI_PARAM2), arg2); u64 distance = u64(func) - (u64(code) + 5); if (distance >= 0x0000000080000000ULL && distance < 0xFFFFFFFF80000000ULL) { diff --git a/Common/x64Emitter.h b/Common/x64Emitter.h index fb8ec8694b..cb690593a3 100644 --- a/Common/x64Emitter.h +++ b/Common/x64Emitter.h @@ -657,8 +657,8 @@ public: void ABI_CallFunctionPPC(void *func, void *param1, void *param2,u32 param3); void ABI_CallFunctionAC(void *func, const Gen::OpArg &arg1, u32 param2); void ABI_CallFunctionACC(void *func, const Gen::OpArg &arg1, u32 param2, u32 param3); - void ABI_CallFunctionAAC(void *func, const Gen::OpArg &arg1, const Gen::OpArg &arg2, u32 param3); void ABI_CallFunctionA(void *func, const Gen::OpArg &arg1); + void ABI_CallFunctionAA(void *func, const Gen::OpArg &arg1, const Gen::OpArg &arg2); // Pass a register as a paremeter. void ABI_CallFunctionR(void *func, Gen::X64Reg reg1); diff --git a/Core/MIPS/x86/CompLoadStore.cpp b/Core/MIPS/x86/CompLoadStore.cpp index 1b9695612b..4110a60b1b 100644 --- a/Core/MIPS/x86/CompLoadStore.cpp +++ b/Core/MIPS/x86/CompLoadStore.cpp @@ -41,26 +41,6 @@ namespace MIPSComp { - static u32 ReadMemSafe32(u32 addr, u32 offset) - { - return Memory::Read_U32(addr + offset); - } - - static u32 ReadMemSafe16(u32 addr, u32 offset) - { - return Memory::Read_U16(addr + offset); - } - - static void WriteMemSafe32(u32 addr, u32 value, u32 offset) - { - Memory::Write_U32(value, addr + offset); - } - - static void WriteMemSafe16(u32 addr, u32 value, u32 offset) - { - Memory::Write_U16(value, addr + offset); - } - void Jit::Comp_ITypeMem(u32 op) { int offset = (signed short)(op&0xFFFF); @@ -77,8 +57,6 @@ namespace MIPSComp case 37: //R(rt) = ReadMem16(addr); break; //lhu if (!g_Config.bFastMemory) { - FlushAll(); - gpr.Lock(rt, rs); gpr.BindToRegister(rt, rt == rs, true); @@ -97,7 +75,8 @@ namespace MIPSComp SetJumpTarget(tooLow); SetJumpTarget(tooHigh); - ABI_CallFunctionAC((void *) &ReadMemSafe16, R(EAX), offset); + ADD(32, R(EAX), Imm32(offset)); + ABI_CallFunctionA(thunks.ProtectFunction((void *) &Memory::Read_U16, 1), R(EAX)); MOVZX(32, 16, gpr.RX(rt), R(EAX)); SetJumpTarget(skip); @@ -126,8 +105,6 @@ namespace MIPSComp case 35: //R(rt) = ReadMem32(addr); break; //lw if (!g_Config.bFastMemory) { - FlushAll(); - gpr.Lock(rt, rs); gpr.BindToRegister(rt, rt == rs, true); @@ -146,7 +123,8 @@ namespace MIPSComp SetJumpTarget(tooLow); SetJumpTarget(tooHigh); - ABI_CallFunctionAC((void *) &ReadMemSafe32, R(EAX), offset); + ADD(32, R(EAX), Imm32(offset)); + ABI_CallFunctionA(thunks.ProtectFunction((void *) &Memory::Read_U32, 1), R(EAX)); MOV(32, gpr.R(rt), R(EAX)); SetJumpTarget(skip); @@ -178,8 +156,6 @@ namespace MIPSComp case 41: //WriteMem16(addr, R(rt)); break; //sh if (!g_Config.bFastMemory) { - FlushAll(); - gpr.Lock(rt, rs); gpr.BindToRegister(rt, true, false); @@ -198,7 +174,8 @@ namespace MIPSComp SetJumpTarget(tooLow); SetJumpTarget(tooHigh); - ABI_CallFunctionAAC((void *) &WriteMemSafe16, R(EAX), gpr.R(rt), offset); + ADD(32, R(EAX), Imm32(offset)); + ABI_CallFunctionAA(thunks.ProtectFunction((void *) &Memory::Write_U16, 2), gpr.R(rt), R(EAX)); SetJumpTarget(skip); gpr.UnlockAll(); @@ -222,8 +199,6 @@ namespace MIPSComp case 43: //WriteMem32(addr, R(rt)); break; //sw if (!g_Config.bFastMemory) { - FlushAll(); - gpr.Lock(rt, rs); gpr.BindToRegister(rt, true, false); @@ -242,7 +217,8 @@ namespace MIPSComp SetJumpTarget(tooLow); SetJumpTarget(tooHigh); - ABI_CallFunctionAAC((void *) &WriteMemSafe32, R(EAX), gpr.R(rt), offset); + ADD(32, R(EAX), Imm32(offset)); + ABI_CallFunctionAA(thunks.ProtectFunction((void *) &Memory::Write_U32, 2), gpr.R(rt), R(EAX)); SetJumpTarget(skip); gpr.UnlockAll(); diff --git a/Core/MIPS/x86/Jit.h b/Core/MIPS/x86/Jit.h index 6d895b697c..34f18c86ef 100644 --- a/Core/MIPS/x86/Jit.h +++ b/Core/MIPS/x86/Jit.h @@ -18,6 +18,7 @@ #pragma once #include "../../../Globals.h" +#include "../../../Common/Thunk.h" #include "Asm.h" #if defined(ARM) @@ -131,6 +132,7 @@ private: FPURegCache fpr; AsmRoutineManager asm_; + ThunkManager thunks; MIPSState *mips_; }; From 72e547420dd935b0293d8d0c57c5554c780f0b2d Mon Sep 17 00:00:00 2001 From: "Unknown W. Brackets" Date: Sat, 19 Jan 2013 11:04:18 -0800 Subject: [PATCH 06/23] Refactor jit slowmem, add lbu to jit since easy. --- Core/MIPS/x86/CompLoadStore.cpp | 268 ++++++++++++-------------------- Core/MIPS/x86/Jit.h | 2 + 2 files changed, 105 insertions(+), 165 deletions(-) diff --git a/Core/MIPS/x86/CompLoadStore.cpp b/Core/MIPS/x86/CompLoadStore.cpp index 4110a60b1b..133e63c080 100644 --- a/Core/MIPS/x86/CompLoadStore.cpp +++ b/Core/MIPS/x86/CompLoadStore.cpp @@ -41,6 +41,103 @@ namespace MIPSComp { + void Jit::CompITypeMemRead(u32 op, u32 bits, void *func) + { + int offset = (signed short)(op&0xFFFF); + int rt = _RT; + int rs = _RS; + + if (!g_Config.bFastMemory) + { + gpr.Lock(rt, rs); + gpr.BindToRegister(rt, rt == rs, true); + + MOV(32, R(EAX), gpr.R(rs)); + CMP(32, R(EAX), Imm32(0x08000000)); + FixupBranch tooLow = J_CC(CC_L); + CMP(32, R(EAX), Imm32(0x0A000000)); + FixupBranch tooHigh = J_CC(CC_GE); +#ifdef _M_IX86 + MOVZX(32, bits, gpr.RX(rt), MDisp(EAX, (u32)Memory::base + offset)); +#else + MOVZX(32, bits, gpr.RX(rt), MComplex(RBX, EAX, SCALE_1, offset)); +#endif + + FixupBranch skip = J(); + SetJumpTarget(tooLow); + SetJumpTarget(tooHigh); + + ADD(32, R(EAX), Imm32(offset)); + ABI_CallFunctionA(thunks.ProtectFunction(func, 1), R(EAX)); + MOVZX(32, bits, gpr.RX(rt), R(EAX)); + + SetJumpTarget(skip); + gpr.UnlockAll(); + } + else + { + gpr.Lock(rt, rs); + gpr.BindToRegister(rt, rt == rs, true); +#ifdef _M_IX86 + MOV(32, R(EAX), gpr.R(rs)); + AND(32, R(EAX), Imm32(Memory::MEMVIEW32_MASK)); + MOVZX(32, bits, gpr.RX(rt), MDisp(EAX, (u32)Memory::base + offset)); +#else + MOV(32, R(EAX), gpr.R(rs)); + MOVZX(32, bits, gpr.RX(rt), MComplex(RBX, EAX, SCALE_1, offset)); +#endif + gpr.UnlockAll(); + } + } + + void Jit::CompITypeMemWrite(u32 op, u32 bits, void *func) + { + int offset = (signed short)(op&0xFFFF); + int rt = _RT; + int rs = _RS; + + if (!g_Config.bFastMemory) + { + gpr.Lock(rt, rs); + gpr.BindToRegister(rt, true, false); + + MOV(32, R(EAX), gpr.R(rs)); + CMP(32, R(EAX), Imm32(0x08000000)); + FixupBranch tooLow = J_CC(CC_L); + CMP(32, R(EAX), Imm32(0x0A000000)); + FixupBranch tooHigh = J_CC(CC_GE); +#ifdef _M_IX86 + MOV(bits, MDisp(EAX, (u32)Memory::base + offset), gpr.R(rt)); +#else + MOV(bits, MComplex(RBX, EAX, SCALE_1, offset), gpr.R(rt)); +#endif + + FixupBranch skip = J(); + SetJumpTarget(tooLow); + SetJumpTarget(tooHigh); + + ADD(32, R(EAX), Imm32(offset)); + ABI_CallFunctionAA(thunks.ProtectFunction(func, 2), gpr.R(rt), R(EAX)); + + SetJumpTarget(skip); + gpr.UnlockAll(); + } + else + { + gpr.Lock(rt, rs); + gpr.BindToRegister(rt, true, false); +#ifdef _M_IX86 + MOV(32, R(EAX), gpr.R(rs)); + AND(32, R(EAX), Imm32(Memory::MEMVIEW32_MASK)); + MOV(bits, MDisp(EAX, (u32)Memory::base + offset), gpr.R(rt)); +#else + MOV(32, R(EAX), gpr.R(rs)); + MOV(bits, MComplex(RBX, EAX, SCALE_1, offset), gpr.R(rt)); +#endif + gpr.UnlockAll(); + } + } + void Jit::Comp_ITypeMem(u32 op) { int offset = (signed short)(op&0xFFFF); @@ -55,188 +152,29 @@ namespace MIPSComp switch (o) { case 37: //R(rt) = ReadMem16(addr); break; //lhu - if (!g_Config.bFastMemory) - { - gpr.Lock(rt, rs); - gpr.BindToRegister(rt, rt == rs, true); - - MOV(32, R(EAX), gpr.R(rs)); - CMP(32, R(EAX), Imm32(0x08000000)); - FixupBranch tooLow = J_CC(CC_L); - CMP(32, R(EAX), Imm32(0x0A000000)); - FixupBranch tooHigh = J_CC(CC_GE); -#ifdef _M_IX86 - MOVZX(32, 16, gpr.RX(rt), MDisp(EAX, (u32)Memory::base + offset)); -#else - MOVZX(32, 16, gpr.RX(rt), MComplex(RBX, EAX, SCALE_1, offset)); -#endif - - FixupBranch skip = J(); - SetJumpTarget(tooLow); - SetJumpTarget(tooHigh); - - ADD(32, R(EAX), Imm32(offset)); - ABI_CallFunctionA(thunks.ProtectFunction((void *) &Memory::Read_U16, 1), R(EAX)); - MOVZX(32, 16, gpr.RX(rt), R(EAX)); - - SetJumpTarget(skip); - gpr.UnlockAll(); - } - else - { - gpr.Lock(rt, rs); - gpr.BindToRegister(rt, rt == rs, true); -#ifdef _M_IX86 - MOV(32, R(EAX), gpr.R(rs)); - AND(32, R(EAX), Imm32(Memory::MEMVIEW32_MASK)); - MOVZX(32, 16, gpr.RX(rt), MDisp(EAX, (u32)Memory::base + offset)); -#else - MOV(32, R(EAX), gpr.R(rs)); - MOVZX(32, 16, gpr.RX(rt), MComplex(RBX, EAX, SCALE_1, offset)); -#endif - gpr.UnlockAll(); - } + CompITypeMemRead(op, 16, (void *) &Memory::Read_U16); break; case 36: //R(rt) = ReadMem8 (addr); break; //lbu - Comp_Generic(op); - return; + CompITypeMemRead(op, 8, (void *) &Memory::Read_U8); + break; case 35: //R(rt) = ReadMem32(addr); break; //lw - if (!g_Config.bFastMemory) - { - gpr.Lock(rt, rs); - gpr.BindToRegister(rt, rt == rs, true); - - MOV(32, R(EAX), gpr.R(rs)); - CMP(32, R(EAX), Imm32(0x08000000)); - FixupBranch tooLow = J_CC(CC_L); - CMP(32, R(EAX), Imm32(0x0A000000)); - FixupBranch tooHigh = J_CC(CC_GE); -#ifdef _M_IX86 - MOV(32, gpr.R(rt), MDisp(EAX, (u32)Memory::base + offset)); -#else - MOV(32, gpr.R(rt), MComplex(RBX, EAX, SCALE_1, offset)); -#endif - - FixupBranch skip = J(); - SetJumpTarget(tooLow); - SetJumpTarget(tooHigh); - - ADD(32, R(EAX), Imm32(offset)); - ABI_CallFunctionA(thunks.ProtectFunction((void *) &Memory::Read_U32, 1), R(EAX)); - MOV(32, gpr.R(rt), R(EAX)); - - SetJumpTarget(skip); - gpr.UnlockAll(); - } - else - { - gpr.Lock(rt, rs); - gpr.BindToRegister(rt, rt == rs, true); -#ifdef _M_IX86 - MOV(32, R(EAX), gpr.R(rs)); - AND(32, R(EAX), Imm32(Memory::MEMVIEW32_MASK)); - MOV(32, gpr.R(rt), MDisp(EAX, (u32)Memory::base + offset)); -#else - MOV(32, R(EAX), gpr.R(rs)); - MOV(32, gpr.R(rt), MComplex(RBX, EAX, SCALE_1, offset)); -#endif - gpr.UnlockAll(); - } + CompITypeMemRead(op, 32, (void *) &Memory::Read_U16); break; case 132: //R(rt) = (u32)(s32)(s8) ReadMem8 (addr); break; //lb case 133: //R(rt) = (u32)(s32)(s16)ReadMem16(addr); break; //lh - case 136: //R(rt) = ReadMem8 (addr); break; //lbu case 140: //WriteMem8 (addr, R(rt)); break; //sb Comp_Generic(op); return; case 41: //WriteMem16(addr, R(rt)); break; //sh - if (!g_Config.bFastMemory) - { - gpr.Lock(rt, rs); - gpr.BindToRegister(rt, true, false); - - MOV(32, R(EAX), gpr.R(rs)); - CMP(32, R(EAX), Imm32(0x08000000)); - FixupBranch tooLow = J_CC(CC_L); - CMP(32, R(EAX), Imm32(0x0A000000)); - FixupBranch tooHigh = J_CC(CC_GE); -#ifdef _M_IX86 - MOV(16, MDisp(EAX, (u32)Memory::base + offset), gpr.R(rt)); -#else - MOV(16, MComplex(RBX, EAX, SCALE_1, offset), gpr.R(rt)); -#endif - - FixupBranch skip = J(); - SetJumpTarget(tooLow); - SetJumpTarget(tooHigh); - - ADD(32, R(EAX), Imm32(offset)); - ABI_CallFunctionAA(thunks.ProtectFunction((void *) &Memory::Write_U16, 2), gpr.R(rt), R(EAX)); - - SetJumpTarget(skip); - gpr.UnlockAll(); - } - else - { - gpr.Lock(rt, rs); - gpr.BindToRegister(rt, true, false); -#ifdef _M_IX86 - MOV(32, R(EAX), gpr.R(rs)); - AND(32, R(EAX), Imm32(Memory::MEMVIEW32_MASK)); - MOV(16, MDisp(EAX, (u32)Memory::base + offset), gpr.R(rt)); -#else - MOV(32, R(EAX), gpr.R(rs)); - MOV(16, MComplex(RBX, EAX, SCALE_1, offset), gpr.R(rt)); -#endif - gpr.UnlockAll(); - } + CompITypeMemWrite(op, 16, (void *) &Memory::Write_U16); break; case 43: //WriteMem32(addr, R(rt)); break; //sw - if (!g_Config.bFastMemory) - { - gpr.Lock(rt, rs); - gpr.BindToRegister(rt, true, false); - - MOV(32, R(EAX), gpr.R(rs)); - CMP(32, R(EAX), Imm32(0x08000000)); - FixupBranch tooLow = J_CC(CC_L); - CMP(32, R(EAX), Imm32(0x0A000000)); - FixupBranch tooHigh = J_CC(CC_GE); -#ifdef _M_IX86 - MOV(32, MDisp(EAX, (u32)Memory::base + offset), gpr.R(rt)); -#else - MOV(32, MComplex(RBX, EAX, SCALE_1, offset), gpr.R(rt)); -#endif - - FixupBranch skip = J(); - SetJumpTarget(tooLow); - SetJumpTarget(tooHigh); - - ADD(32, R(EAX), Imm32(offset)); - ABI_CallFunctionAA(thunks.ProtectFunction((void *) &Memory::Write_U32, 2), gpr.R(rt), R(EAX)); - - SetJumpTarget(skip); - gpr.UnlockAll(); - } - else - { - gpr.Lock(rt, rs); - gpr.BindToRegister(rt, true, false); -#ifdef _M_IX86 - MOV(32, R(EAX), gpr.R(rs)); - AND(32, R(EAX), Imm32(Memory::MEMVIEW32_MASK)); - MOV(32, MDisp(EAX, (u32)Memory::base + offset), gpr.R(rt)); -#else - MOV(32, R(EAX), gpr.R(rs)); - MOV(32, MComplex(RBX, EAX, SCALE_1, offset), gpr.R(rt)); -#endif - gpr.UnlockAll(); - } + CompITypeMemWrite(op, 32, (void *) &Memory::Write_U32); break; case 134: //lwl diff --git a/Core/MIPS/x86/Jit.h b/Core/MIPS/x86/Jit.h index 34f18c86ef..bec37c9d7a 100644 --- a/Core/MIPS/x86/Jit.h +++ b/Core/MIPS/x86/Jit.h @@ -121,6 +121,8 @@ private: void CompTriArith(u32 op, void (XEmitter::*arith)(int, const OpArg &, const OpArg &)); void CompShiftImm(u32 op, void (XEmitter::*shift)(int, OpArg, OpArg)); void CompShiftVar(u32 op, void (XEmitter::*shift)(int, OpArg, OpArg)); + void CompITypeMemRead(u32 op, u32 bits, void *func); + void CompITypeMemWrite(u32 op, u32 bits, void *func); void CompFPTriArith(u32 op, void (XEmitter::*arith)(X64Reg reg, OpArg), bool orderMatters); From 37fb64ac831206765bd4f52d0d6039cbb759c6ae Mon Sep 17 00:00:00 2001 From: "Unknown W. Brackets" Date: Sat, 19 Jan 2013 11:10:28 -0800 Subject: [PATCH 07/23] Fast path scratchpad too, shouldn't be expensive. --- Core/MIPS/x86/CompLoadStore.cpp | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) diff --git a/Core/MIPS/x86/CompLoadStore.cpp b/Core/MIPS/x86/CompLoadStore.cpp index 133e63c080..56037aed74 100644 --- a/Core/MIPS/x86/CompLoadStore.cpp +++ b/Core/MIPS/x86/CompLoadStore.cpp @@ -53,10 +53,13 @@ namespace MIPSComp gpr.BindToRegister(rt, rt == rs, true); MOV(32, R(EAX), gpr.R(rs)); + // Is it in physical ram? CMP(32, R(EAX), Imm32(0x08000000)); FixupBranch tooLow = J_CC(CC_L); CMP(32, R(EAX), Imm32(0x0A000000)); FixupBranch tooHigh = J_CC(CC_GE); + + const u8* safe = GetCodePtr(); #ifdef _M_IX86 MOVZX(32, bits, gpr.RX(rt), MDisp(EAX, (u32)Memory::base + offset)); #else @@ -67,6 +70,13 @@ namespace MIPSComp SetJumpTarget(tooLow); SetJumpTarget(tooHigh); + // Might also be the scratchpad. + CMP(32, R(EAX), Imm32(0x00010000)); + FixupBranch tooLow2 = J_CC(CC_L); + CMP(32, R(EAX), Imm32(0x00014000)); + J_CC(CC_L, safe); + SetJumpTarget(tooLow2); + ADD(32, R(EAX), Imm32(offset)); ABI_CallFunctionA(thunks.ProtectFunction(func, 1), R(EAX)); MOVZX(32, bits, gpr.RX(rt), R(EAX)); @@ -102,10 +112,13 @@ namespace MIPSComp gpr.BindToRegister(rt, true, false); MOV(32, R(EAX), gpr.R(rs)); + // Is it in physical ram? CMP(32, R(EAX), Imm32(0x08000000)); FixupBranch tooLow = J_CC(CC_L); CMP(32, R(EAX), Imm32(0x0A000000)); FixupBranch tooHigh = J_CC(CC_GE); + + const u8* safe = GetCodePtr(); #ifdef _M_IX86 MOV(bits, MDisp(EAX, (u32)Memory::base + offset), gpr.R(rt)); #else @@ -116,6 +129,13 @@ namespace MIPSComp SetJumpTarget(tooLow); SetJumpTarget(tooHigh); + // Might also be the scratchpad. + CMP(32, R(EAX), Imm32(0x00010000)); + FixupBranch tooLow2 = J_CC(CC_L); + CMP(32, R(EAX), Imm32(0x00014000)); + J_CC(CC_L, safe); + SetJumpTarget(tooLow2); + ADD(32, R(EAX), Imm32(offset)); ABI_CallFunctionAA(thunks.ProtectFunction(func, 2), gpr.R(rt), R(EAX)); From 140fd171efe924241b6b5f57afc1e60aab0384cb Mon Sep 17 00:00:00 2001 From: "Unknown W. Brackets" Date: Sat, 19 Jan 2013 13:48:20 -0800 Subject: [PATCH 08/23] Fix some 64-bit type conversion warnings. --- Common/ChunkFile.h | 2 +- Common/StringUtil.cpp | 8 +++--- Core/Debugger/SymbolMap.cpp | 18 ++++++-------- Core/Dialog/PSPDialog.cpp | 4 +-- Core/Dialog/PSPOskDialog.cpp | 2 +- Core/Dialog/SavedataParam.cpp | 38 ++++++++++++++--------------- Core/ELF/ParamSFO.cpp | 4 +-- Core/FileSystems/BlockDevices.cpp | 6 ++--- Core/FileSystems/BlockDevices.h | 8 +++--- Core/HLE/sceAudio.cpp | 2 +- Core/HLE/sceIo.cpp | 2 +- Core/HLE/sceKernelMbx.cpp | 4 +-- Core/HLE/sceKernelModule.cpp | 4 +-- Core/HLE/sceKernelMsgPipe.cpp | 4 +-- Core/HLE/sceKernelThread.cpp | 8 +++--- GPU/GLES/DisplayListInterpreter.cpp | 2 +- GPU/GLES/TextureCache.cpp | 2 +- 17 files changed, 58 insertions(+), 60 deletions(-) diff --git a/Common/ChunkFile.h b/Common/ChunkFile.h index 261ac37965..f758726b72 100644 --- a/Common/ChunkFile.h +++ b/Common/ChunkFile.h @@ -479,7 +479,7 @@ public: u8 *compressed_buffer = new u8[comp_len]; snappy_compress((const char *)buffer, sz, (char *)compressed_buffer, &comp_len); delete [] buffer; - header.ExpectedSize = comp_len; + header.ExpectedSize = (int)comp_len; if (!pFile.WriteArray(&header, 1)) { ERROR_LOG(COMMON,"ChunkReader: Failed writing header"); diff --git a/Common/StringUtil.cpp b/Common/StringUtil.cpp index 189b82e158..4c8662d2e0 100644 --- a/Common/StringUtil.cpp +++ b/Common/StringUtil.cpp @@ -250,8 +250,8 @@ std::string ReplaceAll(std::string result, const std::string& src, const std::st { while(1) { - const int pos = result.find(src); - if (pos == -1) break; + const size_t pos = result.find(src); + if (pos == result.npos) break; result.replace(pos, src.size(), dest); } return result; @@ -297,7 +297,7 @@ std::string UriDecode(const std::string & sSrc) // for future extension" const unsigned char * pSrc = (const unsigned char *)sSrc.c_str(); - const int SRC_LEN = sSrc.length(); + const size_t SRC_LEN = sSrc.length(); const unsigned char * const SRC_END = pSrc + SRC_LEN; const unsigned char * const SRC_LAST_DEC = SRC_END - 2; // last decodable '%' @@ -359,7 +359,7 @@ std::string UriEncode(const std::string & sSrc) { const char DEC2HEX[16 + 1] = "0123456789ABCDEF"; const unsigned char * pSrc = (const unsigned char *)sSrc.c_str(); - const int SRC_LEN = sSrc.length(); + const size_t SRC_LEN = sSrc.length(); unsigned char * const pStart = new unsigned char[SRC_LEN * 3]; unsigned char * pEnd = pStart; const unsigned char * const SRC_END = pSrc + SRC_LEN; diff --git a/Core/Debugger/SymbolMap.cpp b/Core/Debugger/SymbolMap.cpp index b2badb0b4c..81761819f3 100644 --- a/Core/Debugger/SymbolMap.cpp +++ b/Core/Debugger/SymbolMap.cpp @@ -207,7 +207,7 @@ void SymbolMap::SaveSymbolMap(const char *filename) int SymbolMap::GetSymbolNum(unsigned int address, SymbolType symmask) { - int start=0; + size_t start=0; for (size_t i = 0; i < entries.size(); i++) { @@ -216,8 +216,6 @@ int SymbolMap::GetSymbolNum(unsigned int address, SymbolType symmask) else break; } - - if (start<0) start=0; for (size_t i = 0; i < entries.size(); i++) { @@ -227,7 +225,7 @@ int SymbolMap::GetSymbolNum(unsigned int address, SymbolType symmask) if (address < addr+entries[i].size) { if (entries[i].type & symmask) - return i; + return (int) i; else return -1; } @@ -358,7 +356,7 @@ int SymbolMap::FindSymbol(const char *name) { for (size_t i = 0; i < entries.size(); i++) if (strcmp(entries[i].name,name)==0) - return i; + return (int) i; return -1; } @@ -450,27 +448,27 @@ void SymbolMap::UseFuncSignaturesFile(const char *filename, u32 maxAddress) else break; } - int numSigs = sigs.size(); + size_t numSigs = sigs.size(); fclose(f); std::sort(sigs.begin(), sigs.end()); f = fopen("C:\\mojs.txt", "w"); fprintf(f,"00000000\n"); - for (int j=0; jdataBuf != 0) // Can launch save without save data in mode 13 { std::string filePath = dirPath+"/"+GetFileName(param); - int saveSize = param->dataSize; + SceSize saveSize = param->dataSize; if(saveSize == 0 || saveSize > param->dataBufSize) saveSize = param->dataBufSize; // fallback, should never use this INFO_LOG(HLE,"Saving file with size %u in %s",saveSize,filePath.c_str()); @@ -305,7 +305,7 @@ bool SavedataParam::Save(SceUtilitySavedataParam* param, int saveId) u8 *sfoData; size_t sfoSize; sfoFile.WriteSFO(&sfoData,&sfoSize); - WritePSPFile(sfopath, sfoData, sfoSize); + WritePSPFile(sfopath, sfoData, (SceSize)sfoSize); delete[] sfoData; // SAVE ICON0 @@ -341,7 +341,7 @@ bool SavedataParam::Save(SceUtilitySavedataParam* param, int saveId) // Save Encryption Data { EncryptFileInfo encryptInfo; - int dataSize = sizeof(encryptInfo); // version + key + sdkVersion + SceSize dataSize = sizeof(encryptInfo); // version + key + sdkVersion memset(&encryptInfo,0,dataSize); encryptInfo.fileVersion = 1; @@ -380,7 +380,7 @@ bool SavedataParam::Load(SceUtilitySavedataParam *param, int saveId) ERROR_LOG(HLE,"Error reading file %s",filePath.c_str()); return false; } - param->dataSize = readSize; + param->dataSize = (SceSize)readSize; // copy back save name in request strncpy(param->saveName,GetSaveDirName(param, saveId).c_str(),20); @@ -455,8 +455,8 @@ bool SavedataParam::GetSizes(SceUtilitySavedataParam *param) Memory::Write_U32((u32)(MemoryStick_FreeSpace() / MemoryStick_SectorSize()),param->msFree+4); // Free cluster Memory::Write_U32((u32)(MemoryStick_FreeSpace() / 0x400),param->msFree+8); // Free space (in KB) std::string spaceTxt = SavedataParam::GetSpaceText((int)MemoryStick_FreeSpace()); - Memory::Memset(param->msFree+12,0,spaceTxt.size()+1); - Memory::Memcpy(param->msFree+12,spaceTxt.c_str(),spaceTxt.size()); // Text representing free space + Memory::Memset(param->msFree+12,0,(u32)spaceTxt.size()+1); + Memory::Memcpy(param->msFree+12,spaceTxt.c_str(),(u32)spaceTxt.size()); // Text representing free space } if (Memory::IsValidAddress(param->msData)) { @@ -495,12 +495,12 @@ bool SavedataParam::GetSizes(SceUtilitySavedataParam *param) Memory::Write_U32(total_size / (u32)MemoryStick_SectorSize(),param->utilityData); // num cluster Memory::Write_U32(total_size / 0x400,param->utilityData+4); // save size in KB std::string spaceTxt = SavedataParam::GetSpaceText(total_size); - Memory::Memset(param->utilityData+8,0,spaceTxt.size()+1); - Memory::Memcpy(param->utilityData+8,spaceTxt.c_str(),spaceTxt.size()); // save size in text + Memory::Memset(param->utilityData+8,0,(u32)spaceTxt.size()+1); + Memory::Memcpy(param->utilityData+8,spaceTxt.c_str(),(u32)spaceTxt.size()); // save size in text Memory::Write_U32(total_size / 0x400,param->utilityData+16); // save size in KB spaceTxt = SavedataParam::GetSpaceText(total_size); - Memory::Memset(param->utilityData+20,0,spaceTxt.size()+1); - Memory::Memcpy(param->utilityData+20,spaceTxt.c_str(),spaceTxt.size()); // save size in text + Memory::Memset(param->utilityData+20,0,(u32)spaceTxt.size()+1); + Memory::Memcpy(param->utilityData+20,spaceTxt.c_str(),(u32)spaceTxt.size()); // save size in text } return ret; @@ -532,7 +532,7 @@ bool SavedataParam::GetList(SceUtilitySavedataParam *param) } } - for (size_t i = 0; i < validDir.size(); i++) + for (u32 i = 0; i < (u32)validDir.size(); i++) { u32 baseAddr = outputBuffer + (i*72); Memory::Write_U32(0x11FF,baseAddr + 0); // mode @@ -545,11 +545,11 @@ bool SavedataParam::GetList(SceUtilitySavedataParam *param) // folder name without gamename (max 20 u8) std::string outName = validDir[i].name.substr(GetGameName(param).size()); Memory::Memset(baseAddr + 52,0,20); - Memory::Memcpy(baseAddr + 52, outName.c_str(), outName.size()); + Memory::Memcpy(baseAddr + 52, outName.c_str(), (u32)outName.size()); } } // Save num of folder found - Memory::Write_U32(validDir.size(),param->idListAddr+4); + Memory::Write_U32((u32)validDir.size(), param->idListAddr + 4); } return true; } @@ -695,7 +695,7 @@ int SavedataParam::SetPspParam(SceUtilitySavedataParam *param) // We have a png to show PspUtilitySavedataFileData newData; Memory::ReadStruct(param->newData, &newData); - CreatePNGIcon(Memory::GetPointer(newData.buf),newData.size,saveDataList[realCount]); + CreatePNGIcon(Memory::GetPointer(newData.buf), (int)newData.size, saveDataList[realCount]); } DEBUG_LOG(HLE,"Don't Exist"); realCount++; @@ -739,7 +739,7 @@ int SavedataParam::SetPspParam(SceUtilitySavedataParam *param) // We have a png to show PspUtilitySavedataFileData newData; Memory::ReadStruct(param->newData, &newData); - CreatePNGIcon(Memory::GetPointer(newData.buf),newData.size,saveDataList[0]); + CreatePNGIcon(Memory::GetPointer(newData.buf), (int)newData.size, saveDataList[0]); } DEBUG_LOG(HLE,"Don't Exist"); } @@ -798,7 +798,7 @@ void SavedataParam::SetFileInfo(int idx, PSPFileInfo &info, std::string saveName { u8 *textureDataPNG = new u8[(size_t)info2.size]; ReadPSPFile(fileDataPath2, textureDataPNG, info2.size, NULL); - CreatePNGIcon(textureDataPNG, info2.size, saveDataList[idx]); + CreatePNGIcon(textureDataPNG, (int)info2.size, saveDataList[idx]); delete[] textureDataPNG; } diff --git a/Core/ELF/ParamSFO.cpp b/Core/ELF/ParamSFO.cpp index bfba51a6cd..ec8fdfcda3 100644 --- a/Core/ELF/ParamSFO.cpp +++ b/Core/ELF/ParamSFO.cpp @@ -159,7 +159,7 @@ bool ParamSFOData::WriteSFO(u8 **paramsfo, size_t *size) while((key_size%4)) key_size++; header.key_table_start = sizeof(Header) + header.index_table_entries * sizeof(IndexTable); - header.data_table_start = header.key_table_start + key_size; + header.data_table_start = header.key_table_start + (u32)key_size; total_size += sizeof(IndexTable) * header.index_table_entries; total_size += key_size; @@ -201,7 +201,7 @@ bool ParamSFOData::WriteSFO(u8 **paramsfo, size_t *size) else if (it->second.type == VT_UTF8) { index_ptr->param_fmt = 0x0204; - index_ptr->param_len = it->second.s_value.size()+1; + index_ptr->param_len = (u32)it->second.s_value.size()+1; memcpy(data_ptr,it->second.s_value.c_str(),index_ptr->param_len); data_ptr[index_ptr->param_len] = 0; diff --git a/Core/FileSystems/BlockDevices.cpp b/Core/FileSystems/BlockDevices.cpp index 2af43646f0..c413209c0c 100644 --- a/Core/FileSystems/BlockDevices.cpp +++ b/Core/FileSystems/BlockDevices.cpp @@ -105,10 +105,10 @@ CISOFileBlockDevice::CISOFileBlockDevice(std::string _filename) } indexShift = hdr.align; u64 totalSize = hdr.total_bytes; - numBlocks = (int)(totalSize / blockSize); + numBlocks = (u32)(totalSize / blockSize); DEBUG_LOG(LOADER, "hdrSize=%i numBlocks=%i align=%i", hdrSize, numBlocks, indexShift); - int indexSize = numBlocks + 1; + u32 indexSize = numBlocks + 1; index = new u32[indexSize]; if(fread(index, sizeof(u32), indexSize, f) != indexSize) @@ -137,7 +137,7 @@ bool CISOFileBlockDevice::ReadBlock(int blockNumber, u8 *outPtr) u32 compressedReadSize = idx2 - idx; fseek(f, compressedReadPos, SEEK_SET); - size_t readSize = fread(inbuffer, 1, compressedReadSize, f); + u32 readSize = (u32)fread(inbuffer, 1, compressedReadSize, f); if (plain) { diff --git a/Core/FileSystems/BlockDevices.h b/Core/FileSystems/BlockDevices.h index 48faa59cad..68c4652596 100644 --- a/Core/FileSystems/BlockDevices.h +++ b/Core/FileSystems/BlockDevices.h @@ -32,7 +32,7 @@ public: virtual ~BlockDevice() {} virtual bool ReadBlock(int blockNumber, u8 *outPtr) = 0; int GetBlockSize() const { return 2048;} // forced, it cannot be changed by subclasses - virtual int GetNumBlocks() = 0; + virtual u32 GetNumBlocks() = 0; }; @@ -42,7 +42,7 @@ public: CISOFileBlockDevice(std::string _filename); ~CISOFileBlockDevice(); bool ReadBlock(int blockNumber, u8 *outPtr); - int GetNumBlocks() { return numBlocks;} + u32 GetNumBlocks() { return numBlocks;} private: std::string filename; @@ -50,7 +50,7 @@ private: u32 *index; int indexShift; u32 blockSize; - int numBlocks; + u32 numBlocks; }; @@ -60,7 +60,7 @@ public: FileBlockDevice(std::string _filename); ~FileBlockDevice(); bool ReadBlock(int blockNumber, u8 *outPtr); - int GetNumBlocks() {return (int)(filesize / GetBlockSize());} + u32 GetNumBlocks() {return (u32)(filesize / GetBlockSize());} private: std::string filename; diff --git a/Core/HLE/sceAudio.cpp b/Core/HLE/sceAudio.cpp index 0bd420577d..9ce7f2cf89 100644 --- a/Core/HLE/sceAudio.cpp +++ b/Core/HLE/sceAudio.cpp @@ -309,7 +309,7 @@ u32 sceAudioOutput2ChangeLength(u32 sampleCount) u32 sceAudioOutput2GetRestSample() { DEBUG_LOG(HLE,"UNTESTED sceAudioOutput2GetRestSample()"); - return chans[0].sampleQueue.size() * 2; + return (u32) chans[0].sampleQueue.size() * 2; } u32 sceAudioOutput2Release() diff --git a/Core/HLE/sceIo.cpp b/Core/HLE/sceIo.cpp index bde8ada673..bd8d39574a 100644 --- a/Core/HLE/sceIo.cpp +++ b/Core/HLE/sceIo.cpp @@ -934,7 +934,7 @@ public: p.Do(index); // TODO: Is this the right way for it to wake up? - int count = listing.size(); + int count = (int) listing.size(); p.Do(count); listing.resize(count); for (int i = 0; i < count; ++i) { diff --git a/Core/HLE/sceKernelMbx.cpp b/Core/HLE/sceKernelMbx.cpp index 3e54d11621..a720c710dd 100644 --- a/Core/HLE/sceKernelMbx.cpp +++ b/Core/HLE/sceKernelMbx.cpp @@ -517,7 +517,7 @@ int sceKernelCancelReceiveMbx(SceUID id, u32 numWaitingThreadsAddr) return error; } - u32 count = m->waitingThreads.size(); + u32 count = (u32) m->waitingThreads.size(); DEBUG_LOG(HLE, "sceKernelCancelReceiveMbx(%i, %08x): cancelling %d threads", id, numWaitingThreadsAddr, count); bool wokeThreads = false; @@ -553,7 +553,7 @@ int sceKernelReferMbxStatus(SceUID id, u32 infoAddr) // For whatever reason, it won't write if the size (first member) is 0. if (Memory::Read_U32(infoAddr) != 0) { - m->nmb.numWaitThreads = m->waitingThreads.size(); + m->nmb.numWaitThreads = (int) m->waitingThreads.size(); Memory::WriteStruct(infoAddr, &m->nmb); } diff --git a/Core/HLE/sceKernelModule.cpp b/Core/HLE/sceKernelModule.cpp index 1af606d958..83ef5d59ff 100644 --- a/Core/HLE/sceKernelModule.cpp +++ b/Core/HLE/sceKernelModule.cpp @@ -911,8 +911,8 @@ u32 sceKernelLoadModuleByID(u32 id, u32 flags, u32 lmoptionPtr) if (lmoptionPtr) { lmoption = (SceKernelLMOption *)Memory::GetPointer(lmoptionPtr); } - u32 pos = pspFileSystem.SeekFile(handle, 0, FILEMOVE_CURRENT); - u32 size = pspFileSystem.SeekFile(handle, 0, FILEMOVE_END); + u32 pos = (u32) pspFileSystem.SeekFile(handle, 0, FILEMOVE_CURRENT); + size_t size = pspFileSystem.SeekFile(handle, 0, FILEMOVE_END); std::string error_string; pspFileSystem.SeekFile(handle, pos, FILEMOVE_BEGIN); Module *module = 0; diff --git a/Core/HLE/sceKernelMsgPipe.cpp b/Core/HLE/sceKernelMsgPipe.cpp index 2f820a3a3a..68ef9d6cad 100644 --- a/Core/HLE/sceKernelMsgPipe.cpp +++ b/Core/HLE/sceKernelMsgPipe.cpp @@ -617,8 +617,8 @@ void sceKernelReferMsgPipeStatus() MsgPipe *m = kernelObjects.Get(uid, error); if (m) { - m->nmp.numSendWaitThreads = m->sendWaitingThreads.size(); - m->nmp.numReceiveWaitThreads = m->receiveWaitingThreads.size(); + m->nmp.numSendWaitThreads = (int) m->sendWaitingThreads.size(); + m->nmp.numReceiveWaitThreads = (int) m->receiveWaitingThreads.size(); Memory::WriteStruct(msgPipeStatusAddr, &m->nmp); RETURN(0); } diff --git a/Core/HLE/sceKernelThread.cpp b/Core/HLE/sceKernelThread.cpp index c23fd232a9..619e1c6603 100644 --- a/Core/HLE/sceKernelThread.cpp +++ b/Core/HLE/sceKernelThread.cpp @@ -196,7 +196,7 @@ public: int registerActionType(ActionCreator creator) { types_.push_back(creator); - return types_.size() - 1; + return (int) types_.size() - 1; } void restoreActionType(int actionType, ActionCreator creator) { @@ -897,9 +897,9 @@ u32 sceKernelGetThreadmanIdList(u32 type, u32 readBufPtr, u32 readBufSize, u32 i for (size_t i = 0; i < std::min((size_t)readBufSize, threadqueue.size()); i++) { - Memory::Write_U32(threadqueue[i], readBufPtr + i * 4); + Memory::Write_U32(threadqueue[i], readBufPtr + (u32)i * 4); } - Memory::Write_U32(threadqueue.size(), idCountPtr); + Memory::Write_U32((u32)threadqueue.size(), idCountPtr); return 0; } @@ -2283,7 +2283,7 @@ void __KernelCallAddress(Thread *thread, u32 entryPoint, Action *afterAction, bo for (size_t i = 0; i < args.size(); i++) { call->args[i] = args[i]; } - call->numArgs = args.size(); + call->numArgs = (int) args.size(); call->doAfter = afterAction; call->tag = "callAddress"; diff --git a/GPU/GLES/DisplayListInterpreter.cpp b/GPU/GLES/DisplayListInterpreter.cpp index af2186ade7..caeaf363bc 100644 --- a/GPU/GLES/DisplayListInterpreter.cpp +++ b/GPU/GLES/DisplayListInterpreter.cpp @@ -1127,7 +1127,7 @@ void GLES_GPU::UpdateStats() { gpuStats.numFragmentShaders = shaderManager_->NumFragmentShaders(); gpuStats.numShaders = shaderManager_->NumPrograms(); gpuStats.numTextures = TextureCache_NumLoadedTextures(); - gpuStats.numFBOs = vfbs_.size(); + gpuStats.numFBOs = (int)vfbs_.size(); } void GLES_GPU::DoBlockTransfer() { diff --git a/GPU/GLES/TextureCache.cpp b/GPU/GLES/TextureCache.cpp index 3f592cd98c..3cfad971df 100644 --- a/GPU/GLES/TextureCache.cpp +++ b/GPU/GLES/TextureCache.cpp @@ -138,7 +138,7 @@ void TextureCache_InvalidateAll(bool force) { } int TextureCache_NumLoadedTextures() { - return cache.size(); + return (int)cache.size(); } From e27faf7c8a3c683aed2997c39a50d4b0fd3ff711 Mon Sep 17 00:00:00 2001 From: "Unknown W. Brackets" Date: Sat, 19 Jan 2013 13:51:44 -0800 Subject: [PATCH 09/23] Fix a couple signedness warnings in disarm. --- ext/disarm.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/ext/disarm.cpp b/ext/disarm.cpp index f17d1856f1..ffd3d756b5 100644 --- a/ext/disarm.cpp +++ b/ext/disarm.cpp @@ -757,7 +757,7 @@ lPling: } else { if (((int)imm8)<0 && ((int)imm8)>-100) { - *op++='-'; imm8=-imm8; + *op++='-'; imm8=-(int)imm8; } op = num(op, imm8); } @@ -880,7 +880,7 @@ lPling: if (!(instr&Ubit)) { if (offset) *op++='-'; else result.oddbits=1; - result.offset = -offset; + result.offset = -(int)offset; } else result.offset = offset; op = num(op, offset); From 9d8a9a1dd08d8610ebf06f060b078d9813ea3e7f Mon Sep 17 00:00:00 2001 From: "Unknown W. Brackets" Date: Sat, 19 Jan 2013 14:05:46 -0800 Subject: [PATCH 10/23] Couple more type conversion errors, cleanup. --- Windows/WindowsHost.cpp | 37 +++++++++++++++---------------------- 1 file changed, 15 insertions(+), 22 deletions(-) diff --git a/Windows/WindowsHost.cpp b/Windows/WindowsHost.cpp index f82d722f9a..4579c8ed08 100644 --- a/Windows/WindowsHost.cpp +++ b/Windows/WindowsHost.cpp @@ -41,12 +41,12 @@ void WindowsHost::SetWindowTitle(const char *message) std::string title = "PPSSPP v0.5 - "; title += message; - int size = MultiByteToWideChar(CP_UTF8, 0, message, title.size(), NULL, 0); + int size = MultiByteToWideChar(CP_UTF8, 0, message, (int) title.size(), NULL, 0); if (size > 0) { wchar_t *utf16_title = new wchar_t[size + 1]; if (utf16_title) - size = MultiByteToWideChar(CP_UTF8, 0, message, title.size(), utf16_title, size); + size = MultiByteToWideChar(CP_UTF8, 0, message, (int) title.size(), utf16_title, size); else size = 0; @@ -129,32 +129,25 @@ void WindowsHost::BootDone() SendMessage(MainWindow::GetHWND(), WM_USER+1, 0,0); } +static std::string SymbolMapFilename(const char *currentFilename) +{ + std::string result = currentFilename; + size_t dot = result.rfind('.'); + if (dot == result.npos) + return result + ".map"; + + result.replace(dot, result.npos, ".map"); + return result; +} + bool WindowsHost::AttemptLoadSymbolMap() { - char filename[256]; - strcpy(filename, GetCurrentFilename()); - int len = strlen(filename); - int ptpos = len-1; - while (filename[ptpos]!='.' && ptpos>len-8) - ptpos--; - filename[ptpos+1] = 'm'; - filename[ptpos+2] = 'a'; - filename[ptpos+3] = 'p'; - return symbolMap.LoadSymbolMap(filename); + return symbolMap.LoadSymbolMap(SymbolMapFilename(GetCurrentFilename()).c_str()); } void WindowsHost::PrepareShutdown() { - char filename[256]; - strcpy(filename, GetCurrentFilename()); - int len = strlen(filename); - int ptpos = len-1; - while (filename[ptpos]!='.' && ptpos>len-8) - ptpos--; - filename[ptpos+1] = 'm'; - filename[ptpos+2] = 'a'; - filename[ptpos+3] = 'p'; - symbolMap.SaveSymbolMap(filename); + symbolMap.SaveSymbolMap(SymbolMapFilename(GetCurrentFilename()).c_str()); } void WindowsHost::AddSymbol(std::string name, u32 addr, u32 size, int type=0) From c64966c16e6ef957bb86936010f8c7bce02f912f Mon Sep 17 00:00:00 2001 From: "Unknown W. Brackets" Date: Sat, 19 Jan 2013 11:54:57 -0800 Subject: [PATCH 11/23] Oops, lost the CONDITIONAL_DISABLE. --- Core/MIPS/x86/CompLoadStore.cpp | 3 +++ 1 file changed, 3 insertions(+) diff --git a/Core/MIPS/x86/CompLoadStore.cpp b/Core/MIPS/x86/CompLoadStore.cpp index 56037aed74..97a23805cb 100644 --- a/Core/MIPS/x86/CompLoadStore.cpp +++ b/Core/MIPS/x86/CompLoadStore.cpp @@ -43,6 +43,7 @@ namespace MIPSComp { void Jit::CompITypeMemRead(u32 op, u32 bits, void *func) { + CONDITIONAL_DISABLE; int offset = (signed short)(op&0xFFFF); int rt = _RT; int rs = _RS; @@ -102,6 +103,7 @@ namespace MIPSComp void Jit::CompITypeMemWrite(u32 op, u32 bits, void *func) { + CONDITIONAL_DISABLE; int offset = (signed short)(op&0xFFFF); int rt = _RT; int rs = _RS; @@ -160,6 +162,7 @@ namespace MIPSComp void Jit::Comp_ITypeMem(u32 op) { + CONDITIONAL_DISABLE; int offset = (signed short)(op&0xFFFF); int rt = _RT; int rs = _RS; From 90e6f0b7dfff57654346106f5d0b7e0a480c86b7 Mon Sep 17 00:00:00 2001 From: "Unknown W. Brackets" Date: Sat, 19 Jan 2013 12:34:02 -0800 Subject: [PATCH 12/23] Optimize static memory read/writes in jit as well. Like the arm jit does. --- Core/MIPS/x86/CompLoadStore.cpp | 54 +++++++++++++++++++++------------ 1 file changed, 34 insertions(+), 20 deletions(-) diff --git a/Core/MIPS/x86/CompLoadStore.cpp b/Core/MIPS/x86/CompLoadStore.cpp index 97a23805cb..be544b105f 100644 --- a/Core/MIPS/x86/CompLoadStore.cpp +++ b/Core/MIPS/x86/CompLoadStore.cpp @@ -48,11 +48,19 @@ namespace MIPSComp int rt = _RT; int rs = _RS; - if (!g_Config.bFastMemory) - { - gpr.Lock(rt, rs); - gpr.BindToRegister(rt, rt == rs, true); + gpr.Lock(rt, rs); + gpr.BindToRegister(rt, rt == rs, true); + if (gpr.R(rs).IsImm()) + { + void *data = Memory::GetPointer(gpr.R(rs).GetImmValue() + offset); + if (data) + MOVZX(32, bits, gpr.RX(rt), M(data)); + else + MOV(32, gpr.R(rt), Imm32(0)); + } + else if (!g_Config.bFastMemory) + { MOV(32, R(EAX), gpr.R(rs)); // Is it in physical ram? CMP(32, R(EAX), Imm32(0x08000000)); @@ -83,22 +91,19 @@ namespace MIPSComp MOVZX(32, bits, gpr.RX(rt), R(EAX)); SetJumpTarget(skip); - gpr.UnlockAll(); } else { - gpr.Lock(rt, rs); - gpr.BindToRegister(rt, rt == rs, true); -#ifdef _M_IX86 MOV(32, R(EAX), gpr.R(rs)); +#ifdef _M_IX86 AND(32, R(EAX), Imm32(Memory::MEMVIEW32_MASK)); MOVZX(32, bits, gpr.RX(rt), MDisp(EAX, (u32)Memory::base + offset)); #else - MOV(32, R(EAX), gpr.R(rs)); MOVZX(32, bits, gpr.RX(rt), MComplex(RBX, EAX, SCALE_1, offset)); #endif - gpr.UnlockAll(); } + + gpr.UnlockAll(); } void Jit::CompITypeMemWrite(u32 op, u32 bits, void *func) @@ -108,11 +113,23 @@ namespace MIPSComp int rt = _RT; int rs = _RS; - if (!g_Config.bFastMemory) - { - gpr.Lock(rt, rs); - gpr.BindToRegister(rt, true, false); + gpr.Lock(rt, rs); + gpr.BindToRegister(rt, true, false); + if (gpr.R(rs).IsImm()) + { + void *data = Memory::GetPointer(gpr.R(rs).GetImmValue() + offset); + if (data) + MOV(bits, M(data), gpr.R(rt)); + else if (bits == 8) + MOV(bits, M(data), Imm8(0)); + else if (bits == 16) + MOV(bits, M(data), Imm16(0)); + else + MOV(bits, M(data), Imm32(0)); + } + else if (!g_Config.bFastMemory) + { MOV(32, R(EAX), gpr.R(rs)); // Is it in physical ram? CMP(32, R(EAX), Imm32(0x08000000)); @@ -142,22 +159,19 @@ namespace MIPSComp ABI_CallFunctionAA(thunks.ProtectFunction(func, 2), gpr.R(rt), R(EAX)); SetJumpTarget(skip); - gpr.UnlockAll(); } else { - gpr.Lock(rt, rs); - gpr.BindToRegister(rt, true, false); -#ifdef _M_IX86 MOV(32, R(EAX), gpr.R(rs)); +#ifdef _M_IX86 AND(32, R(EAX), Imm32(Memory::MEMVIEW32_MASK)); MOV(bits, MDisp(EAX, (u32)Memory::base + offset), gpr.R(rt)); #else - MOV(32, R(EAX), gpr.R(rs)); MOV(bits, MComplex(RBX, EAX, SCALE_1, offset), gpr.R(rt)); #endif - gpr.UnlockAll(); } + + gpr.UnlockAll(); } void Jit::Comp_ITypeMem(u32 op) From 5e8f1917ee8213ff1285ce23825077d7833a3609 Mon Sep 17 00:00:00 2001 From: "Unknown W. Brackets" Date: Sat, 19 Jan 2013 15:47:32 -0800 Subject: [PATCH 13/23] Fix 64-bit memory dereferencing. --- Core/MIPS/x86/CompLoadStore.cpp | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/Core/MIPS/x86/CompLoadStore.cpp b/Core/MIPS/x86/CompLoadStore.cpp index be544b105f..e5c8f586b2 100644 --- a/Core/MIPS/x86/CompLoadStore.cpp +++ b/Core/MIPS/x86/CompLoadStore.cpp @@ -55,7 +55,13 @@ namespace MIPSComp { void *data = Memory::GetPointer(gpr.R(rs).GetImmValue() + offset); if (data) + { +#ifdef _M_IX86 MOVZX(32, bits, gpr.RX(rt), M(data)); +#else + MOVZX(32, bits, gpr.RX(rt), MDisp(RBX, gpr.R(rs).GetImmValue() + offset)); +#endif + } else MOV(32, gpr.R(rt), Imm32(0)); } @@ -120,7 +126,13 @@ namespace MIPSComp { void *data = Memory::GetPointer(gpr.R(rs).GetImmValue() + offset); if (data) + { +#ifdef _M_IX86 MOV(bits, M(data), gpr.R(rt)); +#else + MOV(bits, MDisp(RBX, gpr.R(rs).GetImmValue() + offset), gpr.R(rt)); +#endif + } else if (bits == 8) MOV(bits, M(data), Imm8(0)); else if (bits == 16) From e78223d2c0439c6eb9bfb6aff31edbba5255295d Mon Sep 17 00:00:00 2001 From: "Unknown W. Brackets" Date: Sat, 19 Jan 2013 16:02:56 -0800 Subject: [PATCH 14/23] Since flipping the op is easy, also do lb/lh. --- Core/MIPS/x86/CompLoadStore.cpp | 38 +++++++++++++++++++-------------- Core/MIPS/x86/Jit.h | 4 ++-- 2 files changed, 24 insertions(+), 18 deletions(-) diff --git a/Core/MIPS/x86/CompLoadStore.cpp b/Core/MIPS/x86/CompLoadStore.cpp index e5c8f586b2..da45913400 100644 --- a/Core/MIPS/x86/CompLoadStore.cpp +++ b/Core/MIPS/x86/CompLoadStore.cpp @@ -41,7 +41,7 @@ namespace MIPSComp { - void Jit::CompITypeMemRead(u32 op, u32 bits, void *func) + void Jit::CompITypeMemRead(u32 op, u32 bits, void (XEmitter::*mov)(int, int, X64Reg, OpArg), void *safeFunc) { CONDITIONAL_DISABLE; int offset = (signed short)(op&0xFFFF); @@ -57,9 +57,9 @@ namespace MIPSComp if (data) { #ifdef _M_IX86 - MOVZX(32, bits, gpr.RX(rt), M(data)); + (this->*mov)(32, bits, gpr.RX(rt), M(data)); #else - MOVZX(32, bits, gpr.RX(rt), MDisp(RBX, gpr.R(rs).GetImmValue() + offset)); + (this->*mov)(32, bits, gpr.RX(rt), MDisp(RBX, gpr.R(rs).GetImmValue() + offset)); #endif } else @@ -76,9 +76,9 @@ namespace MIPSComp const u8* safe = GetCodePtr(); #ifdef _M_IX86 - MOVZX(32, bits, gpr.RX(rt), MDisp(EAX, (u32)Memory::base + offset)); + (this->*mov)(32, bits, gpr.RX(rt), MDisp(EAX, (u32)Memory::base + offset)); #else - MOVZX(32, bits, gpr.RX(rt), MComplex(RBX, EAX, SCALE_1, offset)); + (this->*mov)(32, bits, gpr.RX(rt), MComplex(RBX, EAX, SCALE_1, offset)); #endif FixupBranch skip = J(); @@ -93,8 +93,8 @@ namespace MIPSComp SetJumpTarget(tooLow2); ADD(32, R(EAX), Imm32(offset)); - ABI_CallFunctionA(thunks.ProtectFunction(func, 1), R(EAX)); - MOVZX(32, bits, gpr.RX(rt), R(EAX)); + ABI_CallFunctionA(thunks.ProtectFunction(safeFunc, 1), R(EAX)); + (this->*mov)(32, bits, gpr.RX(rt), R(EAX)); SetJumpTarget(skip); } @@ -103,16 +103,16 @@ namespace MIPSComp MOV(32, R(EAX), gpr.R(rs)); #ifdef _M_IX86 AND(32, R(EAX), Imm32(Memory::MEMVIEW32_MASK)); - MOVZX(32, bits, gpr.RX(rt), MDisp(EAX, (u32)Memory::base + offset)); + (this->*mov)(32, bits, gpr.RX(rt), MDisp(EAX, (u32)Memory::base + offset)); #else - MOVZX(32, bits, gpr.RX(rt), MComplex(RBX, EAX, SCALE_1, offset)); + (this->*mov)(32, bits, gpr.RX(rt), MComplex(RBX, EAX, SCALE_1, offset)); #endif } gpr.UnlockAll(); } - void Jit::CompITypeMemWrite(u32 op, u32 bits, void *func) + void Jit::CompITypeMemWrite(u32 op, u32 bits, void *safeFunc) { CONDITIONAL_DISABLE; int offset = (signed short)(op&0xFFFF); @@ -168,7 +168,7 @@ namespace MIPSComp SetJumpTarget(tooLow2); ADD(32, R(EAX), Imm32(offset)); - ABI_CallFunctionAA(thunks.ProtectFunction(func, 2), gpr.R(rt), R(EAX)); + ABI_CallFunctionAA(thunks.ProtectFunction(safeFunc, 2), gpr.R(rt), R(EAX)); SetJumpTarget(skip); } @@ -201,19 +201,25 @@ namespace MIPSComp switch (o) { case 37: //R(rt) = ReadMem16(addr); break; //lhu - CompITypeMemRead(op, 16, (void *) &Memory::Read_U16); + CompITypeMemRead(op, 16, &XEmitter::MOVZX, (void *) &Memory::Read_U16); break; case 36: //R(rt) = ReadMem8 (addr); break; //lbu - CompITypeMemRead(op, 8, (void *) &Memory::Read_U8); + CompITypeMemRead(op, 8, &XEmitter::MOVZX, (void *) &Memory::Read_U8); break; case 35: //R(rt) = ReadMem32(addr); break; //lw - CompITypeMemRead(op, 32, (void *) &Memory::Read_U16); + CompITypeMemRead(op, 32, &XEmitter::MOVZX, (void *) &Memory::Read_U16); + break; + + case 32: //R(rt) = (u32)(s32)(s8) ReadMem8 (addr); break; //lb + CompITypeMemRead(op, 8, &XEmitter::MOVSX, (void *) &Memory::Read_U8); + break; + + case 33: //R(rt) = (u32)(s32)(s16)ReadMem16(addr); break; //lh + CompITypeMemRead(op, 16, &XEmitter::MOVSX, (void *) &Memory::Read_U16); break; - case 132: //R(rt) = (u32)(s32)(s8) ReadMem8 (addr); break; //lb - case 133: //R(rt) = (u32)(s32)(s16)ReadMem16(addr); break; //lh case 140: //WriteMem8 (addr, R(rt)); break; //sb Comp_Generic(op); return; diff --git a/Core/MIPS/x86/Jit.h b/Core/MIPS/x86/Jit.h index bec37c9d7a..27c094a9ef 100644 --- a/Core/MIPS/x86/Jit.h +++ b/Core/MIPS/x86/Jit.h @@ -121,8 +121,8 @@ private: void CompTriArith(u32 op, void (XEmitter::*arith)(int, const OpArg &, const OpArg &)); void CompShiftImm(u32 op, void (XEmitter::*shift)(int, OpArg, OpArg)); void CompShiftVar(u32 op, void (XEmitter::*shift)(int, OpArg, OpArg)); - void CompITypeMemRead(u32 op, u32 bits, void *func); - void CompITypeMemWrite(u32 op, u32 bits, void *func); + void CompITypeMemRead(u32 op, u32 bits, void (XEmitter::*mov)(int, int, X64Reg, OpArg), void *safeFunc); + void CompITypeMemWrite(u32 op, u32 bits, void *safeFunc); void CompFPTriArith(u32 op, void (XEmitter::*arith)(X64Reg reg, OpArg), bool orderMatters); From 862c88d61a87dd3b60c60d2f0196850cfcb06bc0 Mon Sep 17 00:00:00 2001 From: "Unknown W. Brackets" Date: Sat, 19 Jan 2013 18:31:04 -0800 Subject: [PATCH 15/23] More warning fixes, switches and printfs, etc. This time ones not reported by Visual Studio. --- Core/Core.cpp | 1 + Core/Debugger/SymbolMap.cpp | 2 +- Core/HLE/sceIo.cpp | 7 +++++-- Core/HLE/sceKernelModule.cpp | 2 +- Core/HLE/sceKernelThread.cpp | 6 +++--- Core/HLE/sceMpeg.cpp | 4 ++-- Core/MIPS/MIPSIntVFPU.cpp | 4 ++++ 7 files changed, 17 insertions(+), 9 deletions(-) diff --git a/Core/Core.cpp b/Core/Core.cpp index 5fab683bea..2d8a75cf91 100644 --- a/Core/Core.cpp +++ b/Core/Core.cpp @@ -120,6 +120,7 @@ reswitch: case CORE_POWERDOWN: case CORE_ERROR: + case CORE_NEXTFRAME: //1: Exit loop!! return; } diff --git a/Core/Debugger/SymbolMap.cpp b/Core/Debugger/SymbolMap.cpp index 81761819f3..2c90839b82 100644 --- a/Core/Debugger/SymbolMap.cpp +++ b/Core/Debugger/SymbolMap.cpp @@ -457,7 +457,7 @@ void SymbolMap::UseFuncSignaturesFile(const char *filename, u32 maxAddress) for (size_t j=0; j (id, error); int result; if (f) result = PSP_DEV_TYPE_ALIAS; else { - ERROR_LOG(HLE, "sceIoGetDevTyp: unknown id %s", id); + ERROR_LOG(HLE, "sceIoGetDevType: unknown id %d", id); result = ERROR_KERNEL_BAD_FILE_DESCRIPTOR; } @@ -401,13 +402,14 @@ u32 sceIoGetDevType(int id) u32 sceIoCancel(int id) { + ERROR_LOG(HLE, "UNIMPL sceIoCancel(%d)", id); u32 error; FileNode *f = kernelObjects.Get < FileNode > (id, error); int result; if (f) f->closePending = true; else { - ERROR_LOG(HLE, "sceIoCancel: unknown id %s", id); + ERROR_LOG(HLE, "sceIoCancel: unknown id %d", id); result = ERROR_KERNEL_BAD_FILE_DESCRIPTOR; } @@ -795,6 +797,7 @@ int sceIoCloseAsync(int id) u32 sceIoLseekAsync(int id, s64 offset, int whence) { + DEBUG_LOG(HLE, "sceIoLseekAsync(%d) sorta implemented", id); sceIoLseek(id, offset, whence); __IoCompleteAsyncIO(id); return 0; diff --git a/Core/HLE/sceKernelModule.cpp b/Core/HLE/sceKernelModule.cpp index 83ef5d59ff..290d03aab8 100644 --- a/Core/HLE/sceKernelModule.cpp +++ b/Core/HLE/sceKernelModule.cpp @@ -903,7 +903,7 @@ u32 sceKernelLoadModuleByID(u32 id, u32 flags, u32 lmoptionPtr) { u32 error; u32 handle = __IoGetFileHandleFromId(id, error); - if (handle < 0) { + if (handle == -1) { ERROR_LOG(HLE,"sceKernelLoadModuleByID(%08x, %08x, %08x): could not open file id",id,flags,lmoptionPtr); return error; } diff --git a/Core/HLE/sceKernelThread.cpp b/Core/HLE/sceKernelThread.cpp index 619e1c6603..0c86272339 100644 --- a/Core/HLE/sceKernelThread.cpp +++ b/Core/HLE/sceKernelThread.cpp @@ -1874,7 +1874,7 @@ void sceKernelSleepThreadCB() int sceKernelWaitThreadEnd(SceUID threadID, u32 timeoutPtr) { - DEBUG_LOG(HLE, "sceKernelWaitThreadEnd(%i, %08x)", threadID); + DEBUG_LOG(HLE, "sceKernelWaitThreadEnd(%i, %08x)", threadID, timeoutPtr); if (threadID == 0 || threadID == currentThread) return SCE_KERNEL_ERROR_ILLEGAL_THID; @@ -1900,7 +1900,7 @@ int sceKernelWaitThreadEnd(SceUID threadID, u32 timeoutPtr) int sceKernelWaitThreadEndCB(SceUID threadID, u32 timeoutPtr) { - DEBUG_LOG(HLE, "sceKernelWaitThreadEnd(%i)", threadID); + DEBUG_LOG(HLE, "sceKernelWaitThreadEndCB(%i)", threadID, timeoutPtr); if (threadID == 0 || threadID == currentThread) return SCE_KERNEL_ERROR_ILLEGAL_THID; @@ -1920,7 +1920,7 @@ int sceKernelWaitThreadEndCB(SceUID threadID, u32 timeoutPtr) } else { - ERROR_LOG(HLE, "sceKernelWaitThreadEnd - bad thread %i", threadID); + ERROR_LOG(HLE, "sceKernelWaitThreadEndCB - bad thread %i", threadID); return error; } } diff --git a/Core/HLE/sceMpeg.cpp b/Core/HLE/sceMpeg.cpp index 0519e3dc24..c51bd05622 100644 --- a/Core/HLE/sceMpeg.cpp +++ b/Core/HLE/sceMpeg.cpp @@ -193,7 +193,7 @@ struct MpegContext { bool endOfVideoReached; int videoPixelMode; u32 mpegMagic; - u32 mpegVersion; + int mpegVersion; u32 mpegRawVersion; u32 mpegOffset; u32 mpegStreamSize; @@ -1028,7 +1028,7 @@ int sceMpegGetAvcAu(u32 mpeg, u32 streamId, u32 auAddr, u32 attrAddr) } result = PSP_ERROR_MPEG_NO_DATA; } - if (ctx->mpegLastTimestamp < 0 || sceAu.pts >= ctx->mpegLastTimestamp) { + if (ctx->mpegLastTimestamp <= 0 || sceAu.pts >= ctx->mpegLastTimestamp) { NOTICE_LOG(HLE, "End of video reached"); ctx->endOfVideoReached = true; } else { diff --git a/Core/MIPS/MIPSIntVFPU.cpp b/Core/MIPS/MIPSIntVFPU.cpp index 3c51ebd68e..8ae4847f4e 100644 --- a/Core/MIPS/MIPSIntVFPU.cpp +++ b/Core/MIPS/MIPSIntVFPU.cpp @@ -656,6 +656,10 @@ namespace MIPSInt d[2] = ExpandHalf(s[1] & 0xFFFF); d[3] = ExpandHalf(s[1] >> 16); break; + case V_Triple: + case V_Quad: + _dbg_assert_msg_(CPU, 0, "Trying to interpret Int_Vh2f instruction that can't be interpreted"); + break; } ApplyPrefixD(d, sz); //TODO: and the mask to kill everything but mask WriteVector(d, sz, vd); From 75a38729239b1303bd2052c3e7695d1b464a8655 Mon Sep 17 00:00:00 2001 From: "Unknown W. Brackets" Date: Sat, 19 Jan 2013 19:07:11 -0800 Subject: [PATCH 16/23] Log missed jit ops for poor man profiling. --- Core/MIPS/x86/Jit.cpp | 35 +++++++++++++++++++++++++++++++++++ 1 file changed, 35 insertions(+) diff --git a/Core/MIPS/x86/Jit.cpp b/Core/MIPS/x86/Jit.cpp index f0ac586be2..e372bd63f1 100644 --- a/Core/MIPS/x86/Jit.cpp +++ b/Core/MIPS/x86/Jit.cpp @@ -15,6 +15,8 @@ // Official git repository and contact information can be found at // https://github.com/hrydgard/ppsspp and http://www.ppsspp.org/. +#include +#include #include "../../Core.h" #include "../../CoreTiming.h" #include "../MIPS.h" @@ -45,6 +47,15 @@ static u64 saved_flags; #endif +const bool USE_JIT_MISSMAP = false; +static std::map notJitOps; + +template +std::pair flip_pair(const std::pair &p) +{ + return std::pair(p.second, p.first); +} + void JitBreakpoint() { Core_EnableStepping(true); @@ -52,6 +63,27 @@ void JitBreakpoint() if (CBreakPoints::IsTempBreakPoint(currentMIPS->pc)) CBreakPoints::RemoveBreakPoint(currentMIPS->pc); + + // There's probably a better place for this. + if (USE_JIT_MISSMAP) + { + std::map notJitSorted; + std::transform(notJitOps.begin(), notJitOps.end(), std::inserter(notJitSorted, notJitSorted.begin()), flip_pair); + + std::string message; + char temp[256]; + int remaining = 15; + for (auto it = notJitSorted.rbegin(), end = notJitSorted.rend(); it != end && --remaining >= 0; ++it) + { + snprintf(temp, 256, " (%d), ", it->first); + message += it->second + temp; + } + + if (message.size() > 2) + message.resize(message.size() - 2); + + NOTICE_LOG(JIT, "Top ops compiled to interpreter: %s", message.c_str()); + } } Jit::Jit(MIPSState *mips) : blocks(mips), mips_(mips) @@ -178,6 +210,9 @@ void Jit::Comp_RunBlock(u32 op) void Jit::Comp_Generic(u32 op) { + if (USE_JIT_MISSMAP) + notJitOps[MIPSGetName(op)]++; + FlushAll(); MIPSInterpretFunc func = MIPSGetInterpretFunc(op); if (func) From 385417effe30cdb56db1a623057d55457801147a Mon Sep 17 00:00:00 2001 From: "Unknown W. Brackets" Date: Sat, 19 Jan 2013 20:11:17 -0800 Subject: [PATCH 17/23] Log jit misses at runtime instead of compile time. Really, it could be very different after all... this shouldn't be all that slow, I guess. --- Core/MIPS/x86/Jit.cpp | 19 +++++++++++++++---- 1 file changed, 15 insertions(+), 4 deletions(-) diff --git a/Core/MIPS/x86/Jit.cpp b/Core/MIPS/x86/Jit.cpp index e372bd63f1..6c316a2fa4 100644 --- a/Core/MIPS/x86/Jit.cpp +++ b/Core/MIPS/x86/Jit.cpp @@ -86,6 +86,15 @@ void JitBreakpoint() } } +static void JitLogMiss(u32 op) +{ + if (USE_JIT_MISSMAP) + notJitOps[MIPSGetName(op)]++; + + MIPSInterpretFunc func = MIPSGetInterpretFunc(op); + func(op); +} + Jit::Jit(MIPSState *mips) : blocks(mips), mips_(mips) { blocks.Init(); @@ -210,16 +219,18 @@ void Jit::Comp_RunBlock(u32 op) void Jit::Comp_Generic(u32 op) { - if (USE_JIT_MISSMAP) - notJitOps[MIPSGetName(op)]++; - FlushAll(); MIPSInterpretFunc func = MIPSGetInterpretFunc(op); if (func) { MOV(32, M(&mips_->pc), Imm32(js.compilerPC)); - ABI_CallFunctionC((void *)func, op); + if (USE_JIT_MISSMAP) + ABI_CallFunctionC((void *)&JitLogMiss, op); + else + ABI_CallFunctionC((void *)func, op); } + else + _dbg_assert_msg_(JIT, 0, "Trying to compile instruction that can't be interpreted"); } void Jit::WriteExit(u32 destination, int exit_num) From 6e6fa2458e49d850fc2e26774ad6a81a3993c2e5 Mon Sep 17 00:00:00 2001 From: raven02 Date: Sun, 20 Jan 2013 12:40:24 +0800 Subject: [PATCH 18/23] Mode 7 should be SCE_UTILITY_SAVEDATA_TYPE_LISTDELETE --- Core/Dialog/SavedataParam.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Core/Dialog/SavedataParam.h b/Core/Dialog/SavedataParam.h index b867de3f3e..dc9384e46e 100644 --- a/Core/Dialog/SavedataParam.h +++ b/Core/Dialog/SavedataParam.h @@ -28,8 +28,8 @@ enum SceUtilitySavedataType SCE_UTILITY_SAVEDATA_TYPE_SAVE = 3, SCE_UTILITY_SAVEDATA_TYPE_LISTLOAD = 4, SCE_UTILITY_SAVEDATA_TYPE_LISTSAVE = 5, - SCE_UTILITY_SAVEDATA_TYPE_LISTDELETE = 6, - SCE_UTILITY_SAVEDATA_TYPE_DELETE = 7, + SCE_UTILITY_SAVEDATA_TYPE_DELETE = 6, + SCE_UTILITY_SAVEDATA_TYPE_LISTDELETE = 7, SCE_UTILITY_SAVEDATA_TYPE_SIZES = 8, SCE_UTILITY_SAVEDATA_TYPE_LIST = 11, SCE_UTILITY_SAVEDATA_TYPE_FILES = 12, From 139932f7a00db365076f70510ea08be0716a4d7e Mon Sep 17 00:00:00 2001 From: raven02 Date: Sun, 20 Jan 2013 12:41:47 +0800 Subject: [PATCH 19/23] Revert color0 to be original --- GPU/GLES/TransformPipeline.cpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/GPU/GLES/TransformPipeline.cpp b/GPU/GLES/TransformPipeline.cpp index 22fd63122c..1e75617bc0 100644 --- a/GPU/GLES/TransformPipeline.cpp +++ b/GPU/GLES/TransformPipeline.cpp @@ -479,9 +479,9 @@ void TransformDrawEngine::SoftwareTransformAndDraw( c1[j] = 0.0f; } } else { - c0[0] = ((gstate.materialambient >> 8) & 0xFF) / 255.f; - c0[1] = (gstate.materialambient & 0xFF) / 255.f; - c0[2] = (gstate.materialambient & 0xFF) / 255.f; + c0[0] = (gstate.materialambient & 0xFF) / 255.f; + c0[1] = ((gstate.materialambient >> 8) & 0xFF) / 255.f; + c0[2] = ((gstate.materialambient >> 16)& 0xFF) / 255.f; c0[3] = (gstate.materialalpha & 0xFF) / 255.f; } } From 6ebb06c171ba9c65dbeeb24d6141d169f20e0f83 Mon Sep 17 00:00:00 2001 From: raven02 Date: Sun, 20 Jan 2013 14:05:01 +0800 Subject: [PATCH 20/23] Add PSP_SYSTEMPARAM_ID_INT_BUTTON_PREFERENCE and region Russia/Trad Chi/Sim Chi --- Core/HLE/sceUtility.cpp | 81 +++++++++++++++++++++-------------------- 1 file changed, 42 insertions(+), 39 deletions(-) diff --git a/Core/HLE/sceUtility.cpp b/Core/HLE/sceUtility.cpp index bb727f9989..6fa82cd432 100644 --- a/Core/HLE/sceUtility.cpp +++ b/Core/HLE/sceUtility.cpp @@ -79,14 +79,14 @@ int sceUtilitySavedataUpdate(int animSpeed) return saveDialog.Update(); } -#define PSP_AV_MODULE_AVCODEC 0 -#define PSP_AV_MODULE_SASCORE 1 -#define PSP_AV_MODULE_ATRAC3PLUS 2 // Requires PSP_AV_MODULE_AVCODEC loading first -#define PSP_AV_MODULE_MPEGBASE 3 // Requires PSP_AV_MODULE_AVCODEC loading first -#define PSP_AV_MODULE_MP3 4 -#define PSP_AV_MODULE_VAUDIO 5 -#define PSP_AV_MODULE_AAC 6 -#define PSP_AV_MODULE_G729 7 +#define PSP_AV_MODULE_AVCODEC 0 +#define PSP_AV_MODULE_SASCORE 1 +#define PSP_AV_MODULE_ATRAC3PLUS 2 // Requires PSP_AV_MODULE_AVCODEC loading first +#define PSP_AV_MODULE_MPEGBASE 3 // Requires PSP_AV_MODULE_AVCODEC loading first +#define PSP_AV_MODULE_MP3 4 +#define PSP_AV_MODULE_VAUDIO 5 +#define PSP_AV_MODULE_AAC 6 +#define PSP_AV_MODULE_G729 7 u32 sceUtilityLoadAvModule(u32 module) { @@ -216,23 +216,16 @@ int sceUtilityGamedataInstallGetStatus() return retval; } -#define PSP_SYSTEMPARAM_ID_STRING_NICKNAME 1 -#define PSP_SYSTEMPARAM_ID_INT_ADHOC_CHANNEL 2 -#define PSP_SYSTEMPARAM_ID_INT_WLAN_POWERSAVE 3 -#define PSP_SYSTEMPARAM_ID_INT_DATE_FORMAT 4 -#define PSP_SYSTEMPARAM_ID_INT_TIME_FORMAT 5 +#define PSP_SYSTEMPARAM_ID_STRING_NICKNAME 1 +#define PSP_SYSTEMPARAM_ID_INT_ADHOC_CHANNEL 2 +#define PSP_SYSTEMPARAM_ID_INT_WLAN_POWERSAVE 3 +#define PSP_SYSTEMPARAM_ID_INT_DATE_FORMAT 4 +#define PSP_SYSTEMPARAM_ID_INT_TIME_FORMAT 5 //Timezone offset from UTC in minutes, (EST = -300 = -5 * 60) -#define PSP_SYSTEMPARAM_ID_INT_TIMEZONE 6 -#define PSP_SYSTEMPARAM_ID_INT_DAYLIGHTSAVINGS 7 -#define PSP_SYSTEMPARAM_ID_INT_LANGUAGE 8 -/** -* #9 seems to be Region or maybe X/O button swap. -* It doesn't exist on JAP v1.0 -* is 1 on NA v1.5s -* is 0 on JAP v1.5s -* is read-only -*/ -#define PSP_SYSTEMPARAM_ID_INT_UNKNOWN 9 +#define PSP_SYSTEMPARAM_ID_INT_TIMEZONE 6 +#define PSP_SYSTEMPARAM_ID_INT_DAYLIGHTSAVINGS 7 +#define PSP_SYSTEMPARAM_ID_INT_LANGUAGE 8 +#define PSP_SYSTEMPARAM_ID_INT_BUTTON_PREFERENCE 9 /** * Return values for the SystemParam functions @@ -240,13 +233,14 @@ int sceUtilityGamedataInstallGetStatus() #define PSP_SYSTEMPARAM_RETVAL_OK 0 #define PSP_SYSTEMPARAM_RETVAL_FAIL 0x80110103 + /** * Valid values for PSP_SYSTEMPARAM_ID_INT_ADHOC_CHANNEL */ -#define PSP_SYSTEMPARAM_ADHOC_CHANNEL_AUTOMATIC 0 -#define PSP_SYSTEMPARAM_ADHOC_CHANNEL_1 1 -#define PSP_SYSTEMPARAM_ADHOC_CHANNEL_6 6 -#define PSP_SYSTEMPARAM_ADHOC_CHANNEL_11 11 +#define PSP_SYSTEMPARAM_ADHOC_CHANNEL_AUTOMATIC 0 +#define PSP_SYSTEMPARAM_ADHOC_CHANNEL_1 1 +#define PSP_SYSTEMPARAM_ADHOC_CHANNEL_6 6 +#define PSP_SYSTEMPARAM_ADHOC_CHANNEL_11 11 /** * Valid values for PSP_SYSTEMPARAM_ID_INT_WLAN_POWERSAVE @@ -273,18 +267,27 @@ int sceUtilityGamedataInstallGetStatus() #define PSP_SYSTEMPARAM_DAYLIGHTSAVINGS_STD 0 #define PSP_SYSTEMPARAM_DAYLIGHTSAVINGS_SAVING 1 +/** +* Valid values for PSP_SYSTEMPARAM_ID_INT_BUTTON_PREFERENCE +*/ +#define PSP_SYSTEMPARAM_BUTTON_CIRCLE 0 +#define PSP_SYSTEMPARAM_BUTTON_CROSS 1 + /** * Valid values for PSP_SYSTEMPARAM_ID_INT_LANGUAGE */ -#define PSP_SYSTEMPARAM_LANGUAGE_JAPANESE 0 -#define PSP_SYSTEMPARAM_LANGUAGE_ENGLISH 1 -#define PSP_SYSTEMPARAM_LANGUAGE_FRENCH 2 -#define PSP_SYSTEMPARAM_LANGUAGE_SPANISH 3 -#define PSP_SYSTEMPARAM_LANGUAGE_GERMAN 4 -#define PSP_SYSTEMPARAM_LANGUAGE_ITALIAN 5 -#define PSP_SYSTEMPARAM_LANGUAGE_DUTCH 6 -#define PSP_SYSTEMPARAM_LANGUAGE_PORTUGUESE 7 -#define PSP_SYSTEMPARAM_LANGUAGE_KOREAN 8 +#define PSP_SYSTEMPARAM_LANGUAGE_JAPANESE 0 +#define PSP_SYSTEMPARAM_LANGUAGE_ENGLISH 1 +#define PSP_SYSTEMPARAM_LANGUAGE_FRENCH 2 +#define PSP_SYSTEMPARAM_LANGUAGE_SPANISH 3 +#define PSP_SYSTEMPARAM_LANGUAGE_GERMAN 4 +#define PSP_SYSTEMPARAM_LANGUAGE_ITALIAN 5 +#define PSP_SYSTEMPARAM_LANGUAGE_DUTCH 6 +#define PSP_SYSTEMPARAM_LANGUAGE_PORTUGUESE 7 +#define PSP_SYSTEMPARAM_LANGUAGE_RUSSIAN 8 +#define PSP_SYSTEMPARAM_LANGUAGE_KOREAN 9 +#define PSP_SYSTEMPARAM_LANGUAGE_CHINESE_TRADITIONAL 10 +#define PSP_SYSTEMPARAM_LANGUAGE_CHINESE_SIMPLIFIED 11 //TODO: should save to config file @@ -338,8 +341,8 @@ u32 sceUtilityGetSystemParamInt(u32 id, u32 destaddr) case PSP_SYSTEMPARAM_ID_INT_LANGUAGE: param = PSP_SYSTEMPARAM_LANGUAGE_ENGLISH; break; - case PSP_SYSTEMPARAM_ID_INT_UNKNOWN: - param = 1; + case PSP_SYSTEMPARAM_ID_INT_BUTTON_PREFERENCE: + param = PSP_SYSTEMPARAM_BUTTON_CROSS; break; default: return PSP_SYSTEMPARAM_RETVAL_FAIL; From 53600161baeb3e35c3c4aed76113512bfee53ef9 Mon Sep 17 00:00:00 2001 From: "Unknown W. Brackets" Date: Sun, 20 Jan 2013 00:19:18 -0800 Subject: [PATCH 21/23] Don't write anything to a bad static pointer. Not sure what came over me... --- Core/MIPS/x86/CompLoadStore.cpp | 6 ------ 1 file changed, 6 deletions(-) diff --git a/Core/MIPS/x86/CompLoadStore.cpp b/Core/MIPS/x86/CompLoadStore.cpp index da45913400..d6889ba92d 100644 --- a/Core/MIPS/x86/CompLoadStore.cpp +++ b/Core/MIPS/x86/CompLoadStore.cpp @@ -133,12 +133,6 @@ namespace MIPSComp MOV(bits, MDisp(RBX, gpr.R(rs).GetImmValue() + offset), gpr.R(rt)); #endif } - else if (bits == 8) - MOV(bits, M(data), Imm8(0)); - else if (bits == 16) - MOV(bits, M(data), Imm16(0)); - else - MOV(bits, M(data), Imm32(0)); } else if (!g_Config.bFastMemory) { From b16a2084530f88ce537b2a1cb1bb7d76059cebfb Mon Sep 17 00:00:00 2001 From: raven02 Date: Sun, 20 Jan 2013 16:16:57 +0800 Subject: [PATCH 22/23] Add __PsmfPlayerDoState(PointerWrap &p) to sceKernel --- Core/HLE/sceKernel.cpp | 1 + Core/HLE/scePsmf.cpp | 32 ++++++++++++++++++++++++++++++++ Core/HLE/scePsmf.h | 1 + 3 files changed, 34 insertions(+) diff --git a/Core/HLE/sceKernel.cpp b/Core/HLE/sceKernel.cpp index 18b2143273..dfcbffb5a6 100644 --- a/Core/HLE/sceKernel.cpp +++ b/Core/HLE/sceKernel.cpp @@ -174,6 +174,7 @@ void __KernelDoState(PointerWrap &p) __MpegDoState(p); __PowerDoState(p); __PsmfDoState(p); + __PsmfPlayerDoState(p); __SasDoState(p); __SslDoState(p); __UmdDoState(p); diff --git a/Core/HLE/scePsmf.cpp b/Core/HLE/scePsmf.cpp index eb6dd8500d..6b7fe7e941 100644 --- a/Core/HLE/scePsmf.cpp +++ b/Core/HLE/scePsmf.cpp @@ -373,6 +373,38 @@ void __PsmfDoState(PointerWrap &p) p.DoMarker("scePsmf"); } +void __PsmfPlayerDoState(PointerWrap &p) +{ + int n = (int) psmfPlayerMap.size(); + p.Do(n); + if (p.mode == p.MODE_READ) { + std::map::iterator it, end; + for (it = psmfPlayerMap.begin(), end = psmfPlayerMap.end(); it != end; ++it) { + delete it->second; + } + psmfMap.clear(); + + for (int i = 0; i < n; ++i) { + u32 key; + p.Do(key); + PsmfPlayer *psmfplayer = new PsmfPlayer(0); + psmfplayer->DoState(p); + psmfPlayerMap[key] = psmfplayer; + } + } else { + std::map::iterator it, end; + for (it = psmfPlayerMap.begin(), end = psmfPlayerMap.end(); it != end; ++it) { + p.Do(it->first); + it->second->DoState(p); + } + } + + // TODO: Actually load this from a map. + psmfPlayerStatus = PSMF_PLAYER_STATUS_NONE; + + p.DoMarker("scePsmfPlayer"); +} + void __PsmfShutdown() { for (auto it = psmfMap.begin(), end = psmfMap.end(); it != end; ++it) diff --git a/Core/HLE/scePsmf.h b/Core/HLE/scePsmf.h index 02baa33952..31cf34646c 100644 --- a/Core/HLE/scePsmf.h +++ b/Core/HLE/scePsmf.h @@ -22,4 +22,5 @@ void Register_scePsmfPlayer(); void __PsmfInit(); void __PsmfDoState(PointerWrap &p); +void __PsmfPlayerDoState(PointerWrap &p); void __PsmfShutdown(); From ccdc0b77c189f766fd603d58022838ebfb3a784c Mon Sep 17 00:00:00 2001 From: Xele02 Date: Sun, 20 Jan 2013 10:50:05 +0100 Subject: [PATCH 23/23] Set the PSP language in the config file --- Core/Config.cpp | 7 +++++++ Core/Config.h | 3 +++ Core/HLE/sceUtility.cpp | 19 +------------------ Core/HLE/sceUtility.h | 19 +++++++++++++++++++ 4 files changed, 30 insertions(+), 18 deletions(-) diff --git a/Core/Config.cpp b/Core/Config.cpp index 778e18793b..772682eb2b 100644 --- a/Core/Config.cpp +++ b/Core/Config.cpp @@ -18,6 +18,7 @@ #include "Config.h" #include "IniFile.h" +#include "HLE/sceUtility.h" SState g_State; CConfig g_Config; @@ -80,6 +81,9 @@ void CConfig::Load(const char *iniFileName) false); #endif + IniFile::Section *pspConfig = iniFile.GetOrCreateSection("SystemParam"); + pspConfig->Get("Language", &ilanguage, PSP_SYSTEMPARAM_LANGUAGE_ENGLISH); + // Ephemeral settings bDrawWireframe = false; } @@ -122,6 +126,9 @@ void CConfig::Save() control->Set("ShowStick", bShowAnalogStick); control->Set("ShowTouchControls", bShowTouchControls); + IniFile::Section *pspConfig = iniFile.GetOrCreateSection("SystemParam"); + pspConfig->Set("Language", ilanguage); + if (!iniFile.Save(iniFilename_.c_str())) { ERROR_LOG(LOADER, "Error saving config - can't write ini %s", iniFilename_.c_str()); return; diff --git a/Core/Config.h b/Core/Config.h index ed57ec93fa..8d1e79a7d0 100644 --- a/Core/Config.h +++ b/Core/Config.h @@ -68,6 +68,9 @@ public: bool bShowFPSCounter; bool bShowDebugStats; + // SystemParam + int ilanguage; + std::string currentDirectory; std::string memCardDirectory; std::string flashDirectory; diff --git a/Core/HLE/sceUtility.cpp b/Core/HLE/sceUtility.cpp index 6fa82cd432..b0209f97ff 100644 --- a/Core/HLE/sceUtility.cpp +++ b/Core/HLE/sceUtility.cpp @@ -273,23 +273,6 @@ int sceUtilityGamedataInstallGetStatus() #define PSP_SYSTEMPARAM_BUTTON_CIRCLE 0 #define PSP_SYSTEMPARAM_BUTTON_CROSS 1 -/** -* Valid values for PSP_SYSTEMPARAM_ID_INT_LANGUAGE -*/ -#define PSP_SYSTEMPARAM_LANGUAGE_JAPANESE 0 -#define PSP_SYSTEMPARAM_LANGUAGE_ENGLISH 1 -#define PSP_SYSTEMPARAM_LANGUAGE_FRENCH 2 -#define PSP_SYSTEMPARAM_LANGUAGE_SPANISH 3 -#define PSP_SYSTEMPARAM_LANGUAGE_GERMAN 4 -#define PSP_SYSTEMPARAM_LANGUAGE_ITALIAN 5 -#define PSP_SYSTEMPARAM_LANGUAGE_DUTCH 6 -#define PSP_SYSTEMPARAM_LANGUAGE_PORTUGUESE 7 -#define PSP_SYSTEMPARAM_LANGUAGE_RUSSIAN 8 -#define PSP_SYSTEMPARAM_LANGUAGE_KOREAN 9 -#define PSP_SYSTEMPARAM_LANGUAGE_CHINESE_TRADITIONAL 10 -#define PSP_SYSTEMPARAM_LANGUAGE_CHINESE_SIMPLIFIED 11 - - //TODO: should save to config file u32 sceUtilitySetSystemParamString(u32 id, u32 strPtr) { @@ -339,7 +322,7 @@ u32 sceUtilityGetSystemParamInt(u32 id, u32 destaddr) param = PSP_SYSTEMPARAM_TIME_FORMAT_24HR; break; case PSP_SYSTEMPARAM_ID_INT_LANGUAGE: - param = PSP_SYSTEMPARAM_LANGUAGE_ENGLISH; + param = g_Config.ilanguage; break; case PSP_SYSTEMPARAM_ID_INT_BUTTON_PREFERENCE: param = PSP_SYSTEMPARAM_BUTTON_CROSS; diff --git a/Core/HLE/sceUtility.h b/Core/HLE/sceUtility.h index 1518332972..a9eba9f7fb 100644 --- a/Core/HLE/sceUtility.h +++ b/Core/HLE/sceUtility.h @@ -17,6 +17,25 @@ #pragma once +#include "../../Common/ChunkFile.h" + +/** +* Valid values for PSP_SYSTEMPARAM_ID_INT_LANGUAGE +*/ +#define PSP_SYSTEMPARAM_LANGUAGE_JAPANESE 0 +#define PSP_SYSTEMPARAM_LANGUAGE_ENGLISH 1 +#define PSP_SYSTEMPARAM_LANGUAGE_FRENCH 2 +#define PSP_SYSTEMPARAM_LANGUAGE_SPANISH 3 +#define PSP_SYSTEMPARAM_LANGUAGE_GERMAN 4 +#define PSP_SYSTEMPARAM_LANGUAGE_ITALIAN 5 +#define PSP_SYSTEMPARAM_LANGUAGE_DUTCH 6 +#define PSP_SYSTEMPARAM_LANGUAGE_PORTUGUESE 7 +#define PSP_SYSTEMPARAM_LANGUAGE_RUSSIAN 8 +#define PSP_SYSTEMPARAM_LANGUAGE_KOREAN 9 +#define PSP_SYSTEMPARAM_LANGUAGE_CHINESE_TRADITIONAL 10 +#define PSP_SYSTEMPARAM_LANGUAGE_CHINESE_SIMPLIFIED 11 + + void __UtilityInit(); void __UtilityDoState(PointerWrap &p); void __UtilityShutdown();