From 021736c53383db75ef68547fb64ae8c86eeeee89 Mon Sep 17 00:00:00 2001 From: Henrik Rydgard Date: Sat, 9 Feb 2013 18:18:32 +0100 Subject: [PATCH 001/347] Initial FPU regcache --- Core/MIPS/ARM/ArmRegCache.cpp | 2 +- Core/MIPS/ARM/ArmRegCacheFPU.cpp | 237 +++++++++++++++++++++++++++++++ Core/MIPS/ARM/ArmRegCacheFPU.h | 76 +++++++++- 3 files changed, 310 insertions(+), 5 deletions(-) diff --git a/Core/MIPS/ARM/ArmRegCache.cpp b/Core/MIPS/ARM/ArmRegCache.cpp index 6463e1349cd5..7841324e2239 100644 --- a/Core/MIPS/ARM/ArmRegCache.cpp +++ b/Core/MIPS/ARM/ArmRegCache.cpp @@ -30,7 +30,7 @@ void ArmRegCache::Init(ARMXEmitter *emitter) { } void ArmRegCache::Start(MIPSAnalyst::AnalysisResults &stats) { - for (int i = 0; i < 16; i++) { + for (int i = 0; i < NUM_ARMREG; i++) { ar[i].mipsReg = -1; ar[i].isDirty = false; } diff --git a/Core/MIPS/ARM/ArmRegCacheFPU.cpp b/Core/MIPS/ARM/ArmRegCacheFPU.cpp index 59314f3d5f8c..5261c0dd0c4e 100644 --- a/Core/MIPS/ARM/ArmRegCacheFPU.cpp +++ b/Core/MIPS/ARM/ArmRegCacheFPU.cpp @@ -18,3 +18,240 @@ #include "Common/ArmEmitter.h" #include "Core/MIPS/ARM/ArmRegCacheFPU.h" + +using namespace ArmGen; + +#define CTXREG (R10) + +ArmRegCacheFPU::ArmRegCacheFPU(MIPSState *mips) : mips_(mips) { +} + +void ArmRegCacheFPU::Init(ARMXEmitter *emitter) { + emit = emitter; +} + +void ArmRegCacheFPU::Start(MIPSAnalyst::AnalysisResults &stats) { + for (int i = 0; i < NUM_ARMFPUREG; i++) { + ar[i].mipsReg = -1; + ar[i].isDirty = false; + } + for (int i = 0; i < NUM_MIPSFPUREG; i++) { + mr[i].loc = ML_MEM; + mr[i].reg = INVALID_REG; + mr[i].imm = -1; + mr[i].spillLock = false; + } +} + +static const ARMReg *GetMIPSAllocationOrder(int &count) { + // We conservatively reserve both S0 and S1 as scratch for now. + // Will probably really only need one, if that. + static const ARMReg allocationOrder[] = { + S2, S3, S4, S5, S6, S7, S8, S9, S10, S11, S12, S13, S14, S15 + }; + count = sizeof(allocationOrder) / sizeof(const int); + return allocationOrder; +} + +ARMReg ArmRegCacheFPU::MapReg(MIPSReg mipsReg, int mapFlags) { + // Let's see if it's already mapped. If so we just need to update the dirty flag. + // We don't need to check for ML_NOINIT because we assume that anyone who maps + // with that flag immediately writes a "known" value to the register. + if (mr[mipsReg].loc == ML_ARMREG) { + if (ar[mr[mipsReg].reg].mipsReg != mipsReg) { + ERROR_LOG(HLE, "Register mapping out of sync! %i", mipsReg); + } + if (mapFlags & MAP_DIRTY) { + ar[mr[mipsReg].reg].isDirty = true; + } + return mr[mipsReg].reg; + } + + // Okay, not mapped, so we need to allocate an ARM register. + + int allocCount; + const ARMReg *allocOrder = GetMIPSAllocationOrder(allocCount); + +allocate: + for (int i = 0; i < allocCount; i++) { + int reg = allocOrder[i] - S0; + + if (ar[reg].mipsReg == -1) { + // That means it's free. Grab it, and load the value into it (if requested). + ar[reg].isDirty = (mapFlags & MAP_DIRTY) ? true : false; + if (!(mapFlags & MAP_NOINIT)) { + if (mr[mipsReg].loc == ML_MEM) { + emit->VLDR((ARMReg)(reg + S0), CTXREG, GetMipsRegOffset(mipsReg)); + } + } + ar[reg].mipsReg = mipsReg; + mr[mipsReg].loc = ML_ARMREG; + mr[mipsReg].reg = (ARMReg)reg; + return (ARMReg)reg; + } + } + + // Still nothing. Let's spill a reg and goto 10. + // TODO: Use age or something to choose which register to spill? + // TODO: Spill dirty regs first? or opposite? + int bestToSpill = -1; + for (int i = 0; i < allocCount; i++) { + int reg = allocOrder[i]; + if (ar[reg].mipsReg != -1 && mr[ar[reg].mipsReg].spillLock) + continue; + bestToSpill = reg; + break; + } + + if (bestToSpill != -1) { + // ERROR_LOG(JIT, "Out of registers at PC %08x - spills register %i.", mips_->pc, bestToSpill); + FlushArmReg((ARMReg)bestToSpill); + goto allocate; + } + + // Uh oh, we have all them spilllocked.... + ERROR_LOG(JIT, "Out of spillable registers at PC %08x!!!", mips_->pc); + return INVALID_REG; +} + +void ArmRegCacheFPU::MapInIn(MIPSReg rd, MIPSReg rs) { + SpillLock(rd, rs); + MapReg(rd); + MapReg(rs); + ReleaseSpillLocks(); +} + +void ArmRegCacheFPU::MapDirtyIn(MIPSReg rd, MIPSReg rs, bool avoidLoad) { + SpillLock(rd, rs); + bool overlap = avoidLoad && rd == rs; + MapReg(rd, MAP_DIRTY | (overlap ? 0 : MAP_NOINIT)); + MapReg(rs); + ReleaseSpillLocks(); +} + +void ArmRegCacheFPU::MapDirtyInIn(MIPSReg rd, MIPSReg rs, MIPSReg rt, bool avoidLoad) { + SpillLock(rd, rs, rt); + bool overlap = avoidLoad && (rd == rs || rd == rt); + MapReg(rd, MAP_DIRTY | (overlap ? 0 : MAP_NOINIT)); + MapReg(rt); + MapReg(rs); + ReleaseSpillLocks(); +} + +void ArmRegCacheFPU::FlushArmReg(ARMReg r) { + if (ar[r - S0].mipsReg == -1) { + // Nothing to do, reg not mapped. + return; + } + if (ar[r - S0].mipsReg != -1) { + if (ar[r - S0].isDirty && mr[ar[r - S0].mipsReg].loc == ML_ARMREG) + emit->VSTR(CTXREG, r, GetMipsRegOffset(ar[r - S0].mipsReg)); + // IMMs won't be in an ARM reg. + mr[ar[r - S0].mipsReg].loc = ML_MEM; + mr[ar[r - S0].mipsReg].reg = INVALID_REG; + mr[ar[r - S0].mipsReg].imm = 0; + } else { + ERROR_LOG(HLE, "Dirty but no mipsreg?"); + } + ar[r].isDirty = false; + ar[r].mipsReg = -1; +} + +void ArmRegCacheFPU::FlushMipsReg(MIPSReg r) { + switch (mr[r].loc) { + case ML_IMM: + // IMM is always "dirty". + emit->MOVI2R(R0, mr[r].imm); + emit->STR(CTXREG, R0, GetMipsRegOffset(r)); + break; + + case ML_ARMREG: + if (mr[r].reg == INVALID_REG) { + ERROR_LOG(HLE, "FlushMipsReg: MipsReg had bad ArmReg"); + } + if (ar[mr[r].reg].isDirty) { + emit->STR(CTXREG, mr[r].reg, GetMipsRegOffset(r)); + ar[mr[r].reg].isDirty = false; + } + ar[mr[r].reg].mipsReg = -1; + break; + + case ML_MEM: + // Already there, nothing to do. + break; + + default: + //BAD + break; + } + mr[r].loc = ML_MEM; + mr[r].reg = INVALID_REG; + mr[r].imm = 0; +} + +void ArmRegCacheFPU::FlushAll() { + for (int i = 0; i < NUM_MIPSFPUREG; i++) { + FlushMipsReg(i); + } + // Sanity check + for (int i = 0; i < NUM_ARMFPUREG; i++) { + if (ar[i].mipsReg != -1) { + ERROR_LOG(JIT, "Flush fail: ar[%i].mipsReg=%i", i, ar[i].mipsReg); + } + } +} + +void ArmRegCacheFPU::SetImm(MIPSReg r, u32 immVal) { + // Zap existing value if cached in a reg + if (mr[r].loc == ML_ARMREG) { + ar[mr[r].reg].mipsReg = -1; + ar[mr[r].reg].isDirty = false; + } + mr[r].loc = ML_IMM; + mr[r].imm = immVal; + mr[r].reg = INVALID_REG; +} + +bool ArmRegCacheFPU::IsImm(MIPSReg r) const { + return mr[r].loc == ML_IMM; +} + +u32 ArmRegCacheFPU::GetImm(MIPSReg r) const { + if (mr[r].loc != ML_IMM) { + ERROR_LOG(JIT, "Trying to get imm from non-imm register %i", r); + } + return mr[r].imm; +} + +int ArmRegCacheFPU::GetMipsRegOffset(MIPSReg r) { + // These are offsets within the MIPSState structure. First there are the GPRS, then FPRS, then the "VFPURs". + if (r < 32) + return (r + 32) * 4; + else if (r < 32 + 128) + return (r + 64) * 4; + ERROR_LOG(JIT, "bad mips register %i", r); + return 0; // or what? +} + +void ArmRegCacheFPU::SpillLock(MIPSReg r1, MIPSReg r2, MIPSReg r3, MIPSReg r4) { + mr[r1].spillLock = true; + if (r2 != -1) mr[r2].spillLock = true; + if (r3 != -1) mr[r3].spillLock = true; + if (r4 != -1) mr[r4].spillLock = true; +} + +// This is actually pretty slow with all the 160 regs... +void ArmRegCacheFPU::ReleaseSpillLocks() { + for (int i = 0; i < NUM_MIPSFPUREG; i++) { + mr[i].spillLock = false; + } +} + +ARMReg ArmRegCacheFPU::R(int mipsReg) { + if (mr[mipsReg].loc == ML_ARMREG) { + return mr[mipsReg].reg; + } else { + ERROR_LOG(JIT, "Reg %i not in arm reg. compilerPC = %08x", mipsReg, compilerPC_); + return INVALID_REG; // BAAAD + } +} diff --git a/Core/MIPS/ARM/ArmRegCacheFPU.h b/Core/MIPS/ARM/ArmRegCacheFPU.h index 6b9fef234559..2ad58cba40cc 100644 --- a/Core/MIPS/ARM/ArmRegCacheFPU.h +++ b/Core/MIPS/ARM/ArmRegCacheFPU.h @@ -17,13 +17,81 @@ #pragma once -#include "Common/ArmEmitter.h" +#pragma once + +#include "../MIPS.h" +#include "../MIPSAnalyst.h" +#include "ArmEmitter.h" +#include "ArmRegCache.h" + +using namespace ArmGen; + +enum { + TOTAL_MAPPABLE_MIPSFPUREGS = 32 + 128, +}; +struct FPURegARM { + int mipsReg; // if -1, no mipsreg attached. + bool isDirty; // Should the register be written back? +}; -// The PSP has 160 FP registers: 32 FPRs + 128 VFPU registers. +struct FPURegMIPS { + // Where is this MIPS register? + RegMIPSLoc loc; + // Data (only one of these is used, depending on loc. Could make a union). + u32 imm; + ARMReg reg; + bool spillLock; // if true, this register cannot be spilled. + // If loc == ML_MEM, it's back in its location in the CPU context struct. +}; -class FPURegCache { +class ArmRegCacheFPU +{ public: + ArmRegCacheFPU(MIPSState *mips); + ~ArmRegCacheFPU() {} + + void Init(ARMXEmitter *emitter); + void Start(MIPSAnalyst::AnalysisResults &stats); + + // Protect the arm register containing a MIPS register from spilling, to ensure that + // it's being kept allocated. + void SpillLock(MIPSReg reg, MIPSReg reg2 = -1, MIPSReg reg3 = -1, MIPSReg reg4 = -1); + void ReleaseSpillLocks(); + + void SetImm(MIPSReg reg, u32 immVal); + bool IsImm(MIPSReg reg) const; + u32 GetImm(MIPSReg reg) const; + + // Returns an ARM register containing the requested MIPS register. + ARMReg MapReg(MIPSReg reg, int mapFlags = 0); + void MapInIn(MIPSReg rd, MIPSReg rs); + void MapDirtyIn(MIPSReg rd, MIPSReg rs, bool avoidLoad = true); + void MapDirtyInIn(MIPSReg rd, MIPSReg rs, MIPSReg rt, bool avoidLoad = true); + void FlushArmReg(ARMReg r); + void FlushMipsReg(MIPSReg r); + + void FlushAll(); + + ARMReg R(int preg); // Returns a cached register + + void SetEmitter(ARMXEmitter *emitter) { emit = emitter; } + + // For better log output only. + void SetCompilerPC(u32 compilerPC) { compilerPC_ = compilerPC; } + +private: + int GetMipsRegOffset(MIPSReg r); + MIPSState *mips_; + ARMXEmitter *emit; + u32 compilerPC_; + + enum { + NUM_ARMFPUREG = 16, // TODO: Support 32, which you have with NEON + NUM_MIPSFPUREG = TOTAL_MAPPABLE_MIPSFPUREGS, + }; -}; \ No newline at end of file + RegARM ar[NUM_ARMFPUREG]; + RegMIPS mr[NUM_MIPSFPUREG]; +}; From f75d14d3b500be1e8426a37a95ee57edf6320f84 Mon Sep 17 00:00:00 2001 From: Henrik Rydgard Date: Sun, 10 Feb 2013 15:53:56 +0100 Subject: [PATCH 002/347] ARM FPU jit work --- Common/ArmEmitter.cpp | 43 +++++++++++- Common/ArmEmitter.h | 1 + Core/MIPS/ARM/ArmCompFPU.cpp | 109 ++++++++++++------------------- Core/MIPS/ARM/ArmJit.cpp | 7 +- Core/MIPS/ARM/ArmJit.h | 4 +- Core/MIPS/ARM/ArmRegCache.cpp | 10 +-- Core/MIPS/ARM/ArmRegCache.h | 2 +- Core/MIPS/ARM/ArmRegCacheFPU.cpp | 39 +++++------ Core/MIPS/ARM/ArmRegCacheFPU.h | 8 ++- Core/MIPS/x86/CompFPU.cpp | 59 +++++++++++++++++ ext/disarm.cpp | 4 +- 11 files changed, 180 insertions(+), 106 deletions(-) diff --git a/Common/ArmEmitter.cpp b/Common/ArmEmitter.cpp index ec3e7655be37..27d73a114c97 100644 --- a/Common/ArmEmitter.cpp +++ b/Common/ArmEmitter.cpp @@ -617,6 +617,7 @@ ARMReg ARMXEmitter::SubBase(ARMReg Reg) } return Reg; } + // NEON Specific void ARMXEmitter::VADD(IntegerSize Size, ARMReg Vd, ARMReg Vn, ARMReg Vm) { @@ -646,7 +647,6 @@ void ARMXEmitter::VSUB(IntegerSize Size, ARMReg Vd, ARMReg Vn, ARMReg Vm) Write32((0xF3 << 24) | ((Vd & 0x10) << 18) | (Size << 20) | ((Vn & 0xF) << 16) \ | ((Vd & 0xF) << 12) | (0x8 << 8) | ((Vn & 0x10) << 3) | (1 << 6) \ | ((Vm & 0x10) << 2) | (Vm & 0xF)); - } // VFP Specific @@ -655,7 +655,7 @@ void ARMXEmitter::VLDR(ARMReg Dest, ARMReg Base, Operand2 op) { _assert_msg_(DYNA_REC, Dest >= S0 && Dest <= D31, "Passed Invalid dest register to VLDR"); _assert_msg_(DYNA_REC, Base <= R15, "Passed invalid Base register to VLDR"); - _assert_msg_(DYNA_REC, !(op.Imm12() & 4), "Offset needs to be word aligned"); + _assert_msg_(DYNA_REC, !(op.Imm12() & 4), "VLDR: Offset needs to be word aligned"); bool single_reg = Dest < D0; Dest = SubBase(Dest); @@ -676,7 +676,7 @@ void ARMXEmitter::VSTR(ARMReg Src, ARMReg Base, Operand2 op) { _assert_msg_(DYNA_REC, Src >= S0 && Src <= D31, "Passed invalid src register to VSTR"); _assert_msg_(DYNA_REC, Base <= R15, "Passed invalid base register to VSTR"); - _assert_msg_(DYNA_REC, !(op.Imm12() & 4), "Offset needs to be word aligned"); + _assert_msg_(DYNA_REC, !(op.Imm12() & 4), "VSTR: Offset needs to be word aligned"); bool single_reg = Src < D0; Src = SubBase(Src); @@ -774,6 +774,7 @@ void ARMXEmitter::VSQRT(ARMReg Vd, ARMReg Vm) | ((Vd & 0xF) << 12) | (0x2F << 6) | ((Vm & 0x10) << 2) | (Vm & 0xF)); } } + // VFP and ASIMD void ARMXEmitter::VADD(ARMReg Vd, ARMReg Vn, ARMReg Vm) { @@ -845,6 +846,42 @@ void ARMXEmitter::VSUB(ARMReg Vd, ARMReg Vn, ARMReg Vm) } } } +// VFP and ASIMD +void ARMXEmitter::VMUL(ARMReg Vd, ARMReg Vn, ARMReg Vm) +{ + _assert_msg_(DYNA_REC, Vd >= S0, "Passed invalid dest register to VADD"); + _assert_msg_(DYNA_REC, Vn >= S0, "Passed invalid Vn to VADD"); + _assert_msg_(DYNA_REC, Vm >= S0, "Passed invalid Vm to VADD"); + bool single_reg = Vd < D0; + bool double_reg = Vd < Q0; + + Vd = SubBase(Vd); + Vn = SubBase(Vn); + Vm = SubBase(Vm); + + if (single_reg) + { + Write32(NO_COND | (0x1C << 23) | ((Vd & 0x1) << 22) | (0x1 << 20) \ + | ((Vn & 0x1E) << 15) | ((Vd & 0x1E) << 12) | (0x5 << 9) \ + | ((Vn & 0x1) << 7) | ((Vm & 0x1) << 5) | (Vm >> 1)); + } + else + { + if (double_reg) + { + Write32(NO_COND | (0x1C << 23) | ((Vd & 0x10) << 18) | (0x1 << 20) \ + | ((Vn & 0xF) << 16) | ((Vd & 0xF) << 12) | (0xB << 8) \ + | ((Vn & 0x10) << 3) | ((Vm & 0x10) << 2) | (Vm & 0xF)); + } + else + { + _assert_msg_(DYNA_REC, cpu_info.bNEON, "Trying to use VADD with Quad Reg without support!"); + //Write32((0xF2 << 24) | ((Vd & 0x10) << 18) | ((Vn & 0xF) << 16) + // | ((Vd & 0xF) << 12) | (0xD << 8) | ((Vn & 0x10) << 3) + // | (1 << 6) | ((Vm & 0x10) << 2) | (Vm & 0xF)); + } + } +} void ARMXEmitter::VMOV(ARMReg Dest, ARMReg Src) { diff --git a/Common/ArmEmitter.h b/Common/ArmEmitter.h index 636a9a646b82..1ae59ff99e8c 100644 --- a/Common/ArmEmitter.h +++ b/Common/ArmEmitter.h @@ -510,6 +510,7 @@ class ARMXEmitter // NEON and VFP void VADD(ARMReg Vd, ARMReg Vn, ARMReg Vm); void VSUB(ARMReg Vd, ARMReg Vn, ARMReg Vm); + void VMUL(ARMReg Vd, ARMReg Vn, ARMReg Vm); void VMOV(ARMReg Dest, ARMReg Src); void QuickCallFunction(ARMReg scratchreg, void *func); diff --git a/Core/MIPS/ARM/ArmCompFPU.cpp b/Core/MIPS/ARM/ArmCompFPU.cpp index 9b3dee1bc476..a1aa60bcf36d 100644 --- a/Core/MIPS/ARM/ArmCompFPU.cpp +++ b/Core/MIPS/ARM/ArmCompFPU.cpp @@ -28,46 +28,26 @@ #define _POS ((op>>6 ) & 0x1F) #define _SIZE ((op>>11 ) & 0x1F) -#define OLDD Comp_Generic(op); return; +#define DISABLE Comp_Generic(op); return; +#define CONDITIONAL_DISABLE ; namespace MIPSComp { - /* -void Jit::CompFPTriArith(u32 op, void (XEmitter::*arith)(X64Reg reg, OpArg), bool orderMatters) -{ - int ft = _FT; - int fs = _FS; - int fd = _FD; - fpr.Lock(ft, fs, fd); - - if (false && fs == fd) - { - fpr.BindToRegister(fd, true, true); - (this->*arith)(fpr.RX(fd), fpr.R(ft)); - } - else - { - MOVSS(XMM0, fpr.R(fs)); - MOVSS(XMM1, fpr.R(ft)); - fpr.BindToRegister(fd, true, true); - (this->*arith)(XMM0, R(XMM1)); - MOVSS(fpr.RX(fd), R(XMM0)); - } - fpr.UnlockAll(); -} -*/ - - void Jit::Comp_FPU3op(u32 op) { - OLDD + DISABLE + + int ft = _FT; + int fs = _FS; + int fd = _FD; + fpr.MapDirtyInIn(fd, fs, ft); switch (op & 0x3f) { - //case 0: CompFPTriArith(op, &XEmitter::ADDSS, false); break; //F(fd) = F(fs) + F(ft); //add - //case 1: CompFPTriArith(op, &XEmitter::SUBSS, true); break; //F(fd) = F(fs) - F(ft); //sub - //case 2: CompFPTriArith(op, &XEmitter::MULSS, false); break; //F(fd) = F(fs) * F(ft); //mul - //case 3: CompFPTriArith(op, &XEmitter::DIVSS, true); break; //F(fd) = F(fs) / F(ft); //div + case 0: VADD(fpr.R(fd), fpr.R(fs), fpr.R(fd)); break; //F(fd) = F(fs) + F(ft); //add + case 1: VSUB(fpr.R(fd), fpr.R(fs), fpr.R(fd)); break; //F(fd) = F(fs) - F(ft); //sub + case 2: VMUL(fpr.R(fd), fpr.R(fs), fpr.R(fd)); break; //F(fd) = F(fs) * F(ft); //mul + case 3: VDIV(fpr.R(fd), fpr.R(fs), fpr.R(fd)); break; //F(fd) = F(fs) / F(ft); //div default: Comp_Generic(op); return; @@ -76,7 +56,7 @@ void Jit::Comp_FPU3op(u32 op) void Jit::Comp_FPULS(u32 op) { - OLDD + DISABLE s32 offset = (s16)(op&0xFFFF); int ft = ((op>>16)&0x1f); @@ -85,28 +65,18 @@ void Jit::Comp_FPULS(u32 op) switch(op >> 26) { - /* case 49: //FI(ft) = Memory::Read_U32(addr); break; //lwc1 - gpr.Lock(rs); - fpr.Lock(ft); - fpr.BindToRegister(ft, false, true); - MOV(32, R(EAX), gpr.R(rs)); - AND(32, R(EAX), Imm32(Memory::MEMVIEW32_MASK)); - MOVSS(fpr.RX(ft), MDisp(EAX, (u32)Memory::base + offset)); - gpr.UnlockAll(); - fpr.UnlockAll(); + fpr.MapReg(ft, MAP_NOINIT | MAP_DIRTY); + SetR0ToEffectiveAddress(rs, offset); + VLDR(fpr.R(ft), R0, 0); break; + case 57: //Memory::Write_U32(FI(ft), addr); break; //swc1 - gpr.Lock(rs); - fpr.Lock(ft); - fpr.BindToRegister(ft, true, false); - MOV(32, R(EAX), gpr.R(rs)); - AND(32, R(EAX), Imm32(Memory::MEMVIEW32_MASK)); - MOVSS(MDisp(EAX, (u32)Memory::base + offset), fpr.RX(ft)); - gpr.UnlockAll(); - fpr.UnlockAll(); + fpr.MapReg(ft, 0); + SetR0ToEffectiveAddress(rs, offset); + VSTR(fpr.R(ft), R0, 0); break; - */ + default: Comp_Generic(op); return; @@ -115,44 +85,45 @@ void Jit::Comp_FPULS(u32 op) void Jit::Comp_FPU2op(u32 op) { - OLDD + DISABLE + int fs = _FS; int fd = _FD; switch (op & 0x3f) { - /* + /* case 5: //F(fd) = fabsf(F(fs)); break; //abs fpr.Lock(fd, fs); fpr.BindToRegister(fd, fd == fs, true); - MOVSS(fpr.RX(fd), fpr.R(fs)); - PAND(fpr.RX(fd), M((void *)ssNoSignMask)); + MOVSS(fpr.R(fd), fpr.R(fs)); + PAND(fpr.R(fd), M((void *)ssNoSignMask)); fpr.UnlockAll(); break; + */ + + case 4: //F(fd) = sqrtf(F(fs)); break; //sqrt + fpr.MapDirtyIn(fd, fs); + VSQRT(fpr.R(fd), fpr.R(fd)); + return; + case 6: //F(fd) = F(fs); break; //mov - if (fd != fs) { - fpr.Lock(fd, fs); - fpr.BindToRegister(fd, fd == fs, true); - MOVSS(fpr.RX(fd), fpr.R(fs)); - fpr.UnlockAll(); - } + fpr.MapDirtyIn(fd, fs); + VMOV(fpr.R(fd), fpr.R(fd)); break; + /* case 7: //F(fd) = -F(fs); break; //neg fpr.Lock(fd, fs); fpr.BindToRegister(fd, fd == fs, true); - MOVSS(fpr.RX(fd), fpr.R(fs)); - PXOR(fpr.RX(fd), M((void *)ssSignBits2)); + MOVSS(fpr.R(fd), fpr.R(fs)); + PXOR(fpr.R(fd), M((void *)ssSignBits2)); fpr.UnlockAll(); break; case 12: //FsI(fd) = (int)floorf(F(fs)+0.5f); break; //round.w.s - case 4: //F(fd) = sqrtf(F(fs)); break; //sqrt - Comp_Generic(op); - return; - case 13: //FsI(fd) = F(fs)>=0 ? (int)floorf(F(fs)) : (int)ceilf(F(fs)); break;//trunc.w.s fpr.Lock(fs, fd); fpr.StoreFromRegister(fd); @@ -174,7 +145,7 @@ void Jit::Comp_FPU2op(u32 op) void Jit::Comp_mxc1(u32 op) { - OLDD + DISABLE int fs = _FS; int rt = _RT; @@ -199,7 +170,7 @@ void Jit::Comp_mxc1(u32 op) gpr.StoreFromRegister(rt); fpr.Lock(fs); fpr.BindToRegister(fs, false, true); - MOVSS(fpr.RX(fs), gpr.R(rt)); + MOVSS(fpr.R(fs), gpr.R(rt)); fpr.UnlockAll(); return; */ diff --git a/Core/MIPS/ARM/ArmJit.cpp b/Core/MIPS/ARM/ArmJit.cpp index d34cb95f43c7..a1760d94bf61 100644 --- a/Core/MIPS/ARM/ArmJit.cpp +++ b/Core/MIPS/ARM/ArmJit.cpp @@ -54,11 +54,11 @@ void DisassembleArm(const u8 *data, int size) { namespace MIPSComp { -Jit::Jit(MIPSState *mips) : blocks(mips), gpr(mips), mips_(mips) +Jit::Jit(MIPSState *mips) : blocks(mips), gpr(mips), fpr(mips), mips_(mips) { blocks.Init(); gpr.SetEmitter(this); - //fpr.SetEmitter(this); + fpr.SetEmitter(this); AllocCodeSpace(1024 * 1024 * 16); // 32MB is the absolute max because that's what an ARM branch instruction can reach, backwards and forwards. GenerateFixedCode(); } @@ -66,7 +66,7 @@ Jit::Jit(MIPSState *mips) : blocks(mips), gpr(mips), mips_(mips) void Jit::FlushAll() { gpr.FlushAll(); - //fpr.Flush(FLUSH_ALL); + fpr.FlushAll(); } void Jit::ClearCache() @@ -148,6 +148,7 @@ const u8 *Jit::DoJit(u32 em_address, ArmJitBlock *b) MIPSAnalyst::AnalysisResults analysis; // = MIPSAnalyst::Analyze(em_address); gpr.Start(analysis); + fpr.Start(analysis); int numInstructions = 0; int cycles = 0; diff --git a/Core/MIPS/ARM/ArmJit.h b/Core/MIPS/ARM/ArmJit.h index 1172050eaaa1..b9b2c1752cc1 100644 --- a/Core/MIPS/ARM/ArmJit.h +++ b/Core/MIPS/ARM/ArmJit.h @@ -21,6 +21,7 @@ #include "ArmJitCache.h" #include "ArmRegCache.h" +#include "ArmRegCacheFPU.h" #include "ArmAsm.h" namespace MIPSComp @@ -139,7 +140,6 @@ class Jit : public ArmGen::ARMXCodeBlock void CompShiftImm(u32 op, void (ARMXEmitter::*shift)(int, OpArg, OpArg)); void CompShiftVar(u32 op, void (XEmitter::*shift)(int, OpArg, OpArg)); - void CompFPTriArith(u32 op, void (XEmitter::*arith)(X64Reg reg, OpArg), bool orderMatters); */ // Utils @@ -150,7 +150,7 @@ class Jit : public ArmGen::ARMXCodeBlock ArmJitState js; ArmRegCache gpr; - // FPURegCache fpr; + ArmRegCacheFPU fpr; MIPSState *mips_; diff --git a/Core/MIPS/ARM/ArmRegCache.cpp b/Core/MIPS/ARM/ArmRegCache.cpp index 7841324e2239..18815f4e5c39 100644 --- a/Core/MIPS/ARM/ArmRegCache.cpp +++ b/Core/MIPS/ARM/ArmRegCache.cpp @@ -50,7 +50,7 @@ static const ARMReg *GetMIPSAllocationOrder(int &count) { // R8 is used to preserve flags in nasty branches. // R9 and upwards are reserved for jit basics. static const ARMReg allocationOrder[] = { - R2, R3, R4, R5, R6, R7 + R12, R2, R3, R4, R5, R6, R7, }; count = sizeof(allocationOrder) / sizeof(const int); return allocationOrder; @@ -67,7 +67,7 @@ ARMReg ArmRegCache::MapReg(MIPSReg mipsReg, int mapFlags) { if (mapFlags & MAP_DIRTY) { ar[mr[mipsReg].reg].isDirty = true; } - return mr[mipsReg].reg; + return (ARMReg)mr[mipsReg].reg; } // Okay, not mapped, so we need to allocate an ARM register. @@ -189,11 +189,11 @@ void ArmRegCache::FlushMipsReg(MIPSReg r) { break; case ML_ARMREG: - if (mr[r].reg == INVALID_REG) { + if (mr[r].reg == (int)INVALID_REG) { ERROR_LOG(HLE, "FlushMipsReg: MipsReg had bad ArmReg"); } if (ar[mr[r].reg].isDirty) { - emit->STR(CTXREG, mr[r].reg, GetMipsRegOffset(r)); + emit->STR(CTXREG, (ARMReg)mr[r].reg, GetMipsRegOffset(r)); ar[mr[r].reg].isDirty = false; } ar[mr[r].reg].mipsReg = -1; @@ -274,7 +274,7 @@ void ArmRegCache::ReleaseSpillLocks() { ARMReg ArmRegCache::R(int mipsReg) { if (mr[mipsReg].loc == ML_ARMREG) { - return mr[mipsReg].reg; + return (ARMReg)mr[mipsReg].reg; } else { ERROR_LOG(JIT, "Reg %i not in arm reg. compilerPC = %08x", mipsReg, compilerPC_); return INVALID_REG; // BAAAD diff --git a/Core/MIPS/ARM/ArmRegCache.h b/Core/MIPS/ARM/ArmRegCache.h index a06d61a32cd5..e93a3fc78199 100644 --- a/Core/MIPS/ARM/ArmRegCache.h +++ b/Core/MIPS/ARM/ArmRegCache.h @@ -53,7 +53,7 @@ struct RegMIPS { RegMIPSLoc loc; // Data (only one of these is used, depending on loc. Could make a union). u32 imm; - ARMReg reg; + int reg; // reg index (need to add S0 to get ARMReg) bool spillLock; // if true, this register cannot be spilled. // If loc == ML_MEM, it's back in its location in the CPU context struct. }; diff --git a/Core/MIPS/ARM/ArmRegCacheFPU.cpp b/Core/MIPS/ARM/ArmRegCacheFPU.cpp index 5261c0dd0c4e..66af8a1db0a5 100644 --- a/Core/MIPS/ARM/ArmRegCacheFPU.cpp +++ b/Core/MIPS/ARM/ArmRegCacheFPU.cpp @@ -64,7 +64,7 @@ ARMReg ArmRegCacheFPU::MapReg(MIPSReg mipsReg, int mapFlags) { if (mapFlags & MAP_DIRTY) { ar[mr[mipsReg].reg].isDirty = true; } - return mr[mipsReg].reg; + return (ARMReg)(mr[mipsReg].reg + S0); } // Okay, not mapped, so we need to allocate an ARM register. @@ -86,8 +86,8 @@ ARMReg ArmRegCacheFPU::MapReg(MIPSReg mipsReg, int mapFlags) { } ar[reg].mipsReg = mipsReg; mr[mipsReg].loc = ML_ARMREG; - mr[mipsReg].reg = (ARMReg)reg; - return (ARMReg)reg; + mr[mipsReg].reg = reg; + return (ARMReg)(reg + S0); } } @@ -96,7 +96,7 @@ ARMReg ArmRegCacheFPU::MapReg(MIPSReg mipsReg, int mapFlags) { // TODO: Spill dirty regs first? or opposite? int bestToSpill = -1; for (int i = 0; i < allocCount; i++) { - int reg = allocOrder[i]; + int reg = allocOrder[i] - S0; if (ar[reg].mipsReg != -1 && mr[ar[reg].mipsReg].spillLock) continue; bestToSpill = reg; @@ -139,38 +139,39 @@ void ArmRegCacheFPU::MapDirtyInIn(MIPSReg rd, MIPSReg rs, MIPSReg rt, bool avoid } void ArmRegCacheFPU::FlushArmReg(ARMReg r) { - if (ar[r - S0].mipsReg == -1) { + int reg = r - S0; + if (ar[reg].mipsReg == -1) { // Nothing to do, reg not mapped. return; } - if (ar[r - S0].mipsReg != -1) { - if (ar[r - S0].isDirty && mr[ar[r - S0].mipsReg].loc == ML_ARMREG) - emit->VSTR(CTXREG, r, GetMipsRegOffset(ar[r - S0].mipsReg)); + if (ar[reg].mipsReg != -1) { + if (ar[reg].isDirty && mr[ar[reg].mipsReg].loc == ML_ARMREG) + emit->VSTR(CTXREG, r, GetMipsRegOffset(ar[reg].mipsReg)); // IMMs won't be in an ARM reg. - mr[ar[r - S0].mipsReg].loc = ML_MEM; - mr[ar[r - S0].mipsReg].reg = INVALID_REG; - mr[ar[r - S0].mipsReg].imm = 0; + mr[ar[reg].mipsReg].loc = ML_MEM; + mr[ar[reg].mipsReg].reg = INVALID_REG; + mr[ar[reg].mipsReg].imm = 0; } else { ERROR_LOG(HLE, "Dirty but no mipsreg?"); } - ar[r].isDirty = false; - ar[r].mipsReg = -1; + ar[reg].isDirty = false; + ar[reg].mipsReg = -1; } void ArmRegCacheFPU::FlushMipsReg(MIPSReg r) { switch (mr[r].loc) { case ML_IMM: // IMM is always "dirty". - emit->MOVI2R(R0, mr[r].imm); - emit->STR(CTXREG, R0, GetMipsRegOffset(r)); + // IMM is not allowed for FP (yet). + ERROR_LOG(HLE, "Imm in FP register?"); break; case ML_ARMREG: - if (mr[r].reg == INVALID_REG) { + if (mr[r].reg == (int)INVALID_REG) { ERROR_LOG(HLE, "FlushMipsReg: MipsReg had bad ArmReg"); } if (ar[mr[r].reg].isDirty) { - emit->STR(CTXREG, mr[r].reg, GetMipsRegOffset(r)); + emit->VSTR(CTXREG, (ARMReg)(mr[r].reg + S0), GetMipsRegOffset(r)); ar[mr[r].reg].isDirty = false; } ar[mr[r].reg].mipsReg = -1; @@ -185,7 +186,7 @@ void ArmRegCacheFPU::FlushMipsReg(MIPSReg r) { break; } mr[r].loc = ML_MEM; - mr[r].reg = INVALID_REG; + mr[r].reg = (int)INVALID_REG; mr[r].imm = 0; } @@ -249,7 +250,7 @@ void ArmRegCacheFPU::ReleaseSpillLocks() { ARMReg ArmRegCacheFPU::R(int mipsReg) { if (mr[mipsReg].loc == ML_ARMREG) { - return mr[mipsReg].reg; + return (ARMReg)(mr[mipsReg].reg + S0); } else { ERROR_LOG(JIT, "Reg %i not in arm reg. compilerPC = %08x", mipsReg, compilerPC_); return INVALID_REG; // BAAAD diff --git a/Core/MIPS/ARM/ArmRegCacheFPU.h b/Core/MIPS/ARM/ArmRegCacheFPU.h index 2ad58cba40cc..b7a3a953dab2 100644 --- a/Core/MIPS/ARM/ArmRegCacheFPU.h +++ b/Core/MIPS/ARM/ArmRegCacheFPU.h @@ -21,8 +21,8 @@ #include "../MIPS.h" #include "../MIPSAnalyst.h" -#include "ArmEmitter.h" -#include "ArmRegCache.h" +#include "Common/ArmEmitter.h" +#include "Core/MIPS/ARM/ArmRegCache.h" using namespace ArmGen; @@ -67,6 +67,7 @@ class ArmRegCacheFPU // Returns an ARM register containing the requested MIPS register. ARMReg MapReg(MIPSReg reg, int mapFlags = 0); void MapInIn(MIPSReg rd, MIPSReg rs); + void MapDirty(MIPSReg rd); void MapDirtyIn(MIPSReg rd, MIPSReg rs, bool avoidLoad = true); void MapDirtyInIn(MIPSReg rd, MIPSReg rs, MIPSReg rt, bool avoidLoad = true); void FlushArmReg(ARMReg r); @@ -83,6 +84,9 @@ class ArmRegCacheFPU private: int GetMipsRegOffset(MIPSReg r); + int GetMipsRegOffsetV(MIPSReg r) { + return GetMipsRegOffset(r + 32); + } MIPSState *mips_; ARMXEmitter *emit; u32 compilerPC_; diff --git a/Core/MIPS/x86/CompFPU.cpp b/Core/MIPS/x86/CompFPU.cpp index 7494d649f9f4..7ba16508a5e7 100644 --- a/Core/MIPS/x86/CompFPU.cpp +++ b/Core/MIPS/x86/CompFPU.cpp @@ -144,11 +144,70 @@ void Jit::Comp_FPULS(u32 op) } } +static const u64 GC_ALIGNED16(ssOneBits[2]) = {0x0000000100000001ULL, 0x0000000100000001ULL}; static const u64 GC_ALIGNED16(ssSignBits2[2]) = {0x8000000080000000ULL, 0x8000000080000000ULL}; static const u64 GC_ALIGNED16(ssNoSignMask[2]) = {0x7FFFFFFF7FFFFFFFULL, 0x7FFFFFFF7FFFFFFFULL}; +<<<<<<< Updated upstream void Jit::Comp_FPU2op(u32 op) { +======= +void Jit::Comp_FPUComp(u32 op) { + // TODO: Doesn't work yet. + DISABLE; + + // TODO: Compile this more efficiently by combining with the following branch, which usually is there. + // In that case, probably want to use COMISS rather than CMPSS. + int fs = _FS; + int ft = _FT; + switch (op & 0xf) + { + case 0: //f + case 1: //un + case 8: //sf + case 9: //ngle + // cond = false; + MOV(32, M(¤tMIPS->fpcond), Imm32(0)); + break; + + case 2: //eq // fs == ft + case 10: //seq + case 3: //ueq + case 11: //ngl + fpr.BindToRegister(fs, true, false); + CMPSS(fpr.RX(fs), fpr.R(ft), 0); + ANDPS(fpr.RX(fs), M((void *)&ssOneBits)); + MOVSS(M(¤tMIPS->fpcond), fpr.RX(fs)); + break; + + case 4: //olt // fs < ft + case 5: //ult + case 12: //lt + case 13: //nge + fpr.BindToRegister(fs, true, false); + CMPSS(fpr.RX(fs), fpr.R(ft), 1); + ANDPS(fpr.RX(fs), M((void *)&ssOneBits)); + MOVSS(M(¤tMIPS->fpcond), fpr.RX(fs)); + break; + + case 6: //ole // fs >= ft (ft < fs) + case 7: //ule + case 14: //le + case 15: //ngt + fpr.BindToRegister(ft, true, false); + CMPSS(fpr.RX(ft), fpr.R(fs), 1); + ANDPS(fpr.RX(ft), M((void *)&ssOneBits)); + MOVSS(M(¤tMIPS->fpcond), fpr.RX(ft)); + break; + + default: + _dbg_assert_msg_(CPU,0,"Trying to interpret FPUComp instruction that can't be interpreted"); + break; + } +} + +void Jit::Comp_FPU2op(u32 op) { +>>>>>>> Stashed changes CONDITIONAL_DISABLE; int fs = _FS; diff --git a/ext/disarm.cpp b/ext/disarm.cpp index ffd3d756b5f0..a700847367c0 100644 --- a/ext/disarm.cpp +++ b/ext/disarm.cpp @@ -308,8 +308,8 @@ instr_disassemble(word instr, address addr, pDisOptions opts) { fpn = ((instr>>15)&1) + ((instr>>21)&2); - result.undefined = - result.badbits = + result.undefined = 0; + result.badbits = 0; result.oddbits = 0; result.is_SWI = 0; result.target_type = target_None; From 4bdb2045a7a17bd70bf0bd82a573fa77290fa11e Mon Sep 17 00:00:00 2001 From: Henrik Rydgard Date: Mon, 11 Feb 2013 23:10:11 +0100 Subject: [PATCH 003/347] Armjit-FPU: Fix lots of bugs, impl some stuff. Still nothing working. --- Common/ArmEmitter.cpp | 31 ++++++++++++----- Common/ArmEmitter.h | 4 +-- Core/MIPS/ARM/ArmCompFPU.cpp | 26 +++++++++----- Core/MIPS/ARM/ArmJit.cpp | 19 +++++------ Core/MIPS/ARM/ArmRegCache.cpp | 2 -- Core/MIPS/ARM/ArmRegCache.h | 2 ++ Core/MIPS/ARM/ArmRegCacheFPU.cpp | 47 ++++++++------------------ Core/MIPS/ARM/ArmRegCacheFPU.h | 1 - android/jni/ArmEmitterTest.cpp | 58 ++++++++++++++------------------ android/jni/NativeApp.cpp | 2 +- 10 files changed, 91 insertions(+), 101 deletions(-) diff --git a/Common/ArmEmitter.cpp b/Common/ArmEmitter.cpp index 27d73a114c97..4245e544e58a 100644 --- a/Common/ArmEmitter.cpp +++ b/Common/ArmEmitter.cpp @@ -651,11 +651,18 @@ void ARMXEmitter::VSUB(IntegerSize Size, ARMReg Vd, ARMReg Vn, ARMReg Vm) // VFP Specific -void ARMXEmitter::VLDR(ARMReg Dest, ARMReg Base, Operand2 op) +void ARMXEmitter::VLDR(ARMReg Dest, ARMReg Base, u16 offset) { _assert_msg_(DYNA_REC, Dest >= S0 && Dest <= D31, "Passed Invalid dest register to VLDR"); _assert_msg_(DYNA_REC, Base <= R15, "Passed invalid Base register to VLDR"); - _assert_msg_(DYNA_REC, !(op.Imm12() & 4), "VLDR: Offset needs to be word aligned"); + _assert_msg_(DYNA_REC, (offset & 0xC003) == 0, "VLDR: Offset needs to be word aligned and small enough"); + + if (offset & 0xC03) { + ERROR_LOG(DYNA_REC, "VLDR: Bad offset %08x", offset); + } + + ERROR_LOG(DYNA_REC, "VLDR: s%i, r%i + %i", Dest - S0, Base, offset); + bool single_reg = Dest < D0; Dest = SubBase(Dest); @@ -663,20 +670,26 @@ void ARMXEmitter::VLDR(ARMReg Dest, ARMReg Base, Operand2 op) if (single_reg) { Write32(NO_COND | (0x1B << 23) | ((Dest & 0x1) << 22) | (1 << 20) | (Base << 16) \ - | ((Dest & 0x1E) << 11) | (10 << 8) | (op.Imm12() >> 2)); + | ((Dest & 0x1E) << 11) | (10 << 8) | (offset >> 2)); } else { Write32(NO_COND | (0x1B << 23) | ((Dest & 0x10) << 18) | (1 << 20) | (Base << 16) \ - | ((Dest & 0xF) << 12) | (11 << 8) | (op.Imm12() >> 2)); + | ((Dest & 0xF) << 12) | (11 << 8) | (offset >> 2)); } } -void ARMXEmitter::VSTR(ARMReg Src, ARMReg Base, Operand2 op) +void ARMXEmitter::VSTR(ARMReg Src, ARMReg Base, u16 offset) { _assert_msg_(DYNA_REC, Src >= S0 && Src <= D31, "Passed invalid src register to VSTR"); _assert_msg_(DYNA_REC, Base <= R15, "Passed invalid base register to VSTR"); - _assert_msg_(DYNA_REC, !(op.Imm12() & 4), "VSTR: Offset needs to be word aligned"); + _assert_msg_(DYNA_REC, (offset & 0xC003) == 0, "VSTR: Offset needs to be word aligned"); + + if (offset & 0xC03) { + ERROR_LOG(DYNA_REC, "VSTR: Bad offset %08x", offset); + } + ERROR_LOG(DYNA_REC, "VSTR: s%i, r%i + %i", Src - S0, Base, offset); + bool single_reg = Src < D0; Src = SubBase(Src); @@ -684,13 +697,13 @@ void ARMXEmitter::VSTR(ARMReg Src, ARMReg Base, Operand2 op) if (single_reg) { Write32(NO_COND | (0x1B << 23) | ((Src & 0x1) << 22) | (Base << 16) \ - | ((Src & 0x1E) << 11) | (10 << 8) | (op.Imm12() >> 2)); + | ((Src & 0x1E) << 11) | (10 << 8) | (offset >> 2)); } else { Write32(NO_COND | (0x1B << 23) | ((Src & 0x10) << 18) | (Base << 16) \ - | ((Src & 0xF) << 12) | (11 << 8) | (op.Imm12() >> 2)); + | ((Src & 0xF) << 12) | (11 << 8) | (offset >> 2)); } } void ARMXEmitter::VCMP(ARMReg Vd, ARMReg Vm) @@ -791,7 +804,7 @@ void ARMXEmitter::VADD(ARMReg Vd, ARMReg Vn, ARMReg Vm) if (single_reg) { Write32(NO_COND | (0x1C << 23) | ((Vd & 0x1) << 22) | (0x3 << 20) \ - | ((Vn & 0x1E) << 15) | ((Vd & 0x1E) << 12) | (0x5 << 9) \ + | ((Vn & 0x1E) << 15) | ((Vd & 0x1E) << 11) | (0x5 << 9) \ | ((Vn & 0x1) << 7) | ((Vm & 0x1) << 5) | (Vm >> 1)); } else diff --git a/Common/ArmEmitter.h b/Common/ArmEmitter.h index 1ae59ff99e8c..236dde11f105 100644 --- a/Common/ArmEmitter.h +++ b/Common/ArmEmitter.h @@ -499,8 +499,8 @@ class ARMXEmitter void VSUB(IntegerSize Size, ARMReg Vd, ARMReg Vn, ARMReg Vm); // VFP Only - void VLDR(ARMReg Dest, ARMReg Base, Operand2 op); - void VSTR(ARMReg Src, ARMReg Base, Operand2 op); + void VLDR(ARMReg Dest, ARMReg Base, u16 offset); + void VSTR(ARMReg Src, ARMReg Base, u16 offset); void VCMP(ARMReg Vd, ARMReg Vm); // Compares against zero void VCMP(ARMReg Vd); diff --git a/Core/MIPS/ARM/ArmCompFPU.cpp b/Core/MIPS/ARM/ArmCompFPU.cpp index 127cd705a38f..9e7b6efa2094 100644 --- a/Core/MIPS/ARM/ArmCompFPU.cpp +++ b/Core/MIPS/ARM/ArmCompFPU.cpp @@ -41,38 +41,46 @@ void Jit::Comp_FPU3op(u32 op) int ft = _FT; int fs = _FS; int fd = _FD; - fpr.MapDirtyInIn(fd, fs, ft); switch (op & 0x3f) { - case 0: VADD(fpr.R(fd), fpr.R(fs), fpr.R(fd)); break; //F(fd) = F(fs) + F(ft); //add - case 1: VSUB(fpr.R(fd), fpr.R(fs), fpr.R(fd)); break; //F(fd) = F(fs) - F(ft); //sub - case 2: VMUL(fpr.R(fd), fpr.R(fs), fpr.R(fd)); break; //F(fd) = F(fs) * F(ft); //mul - case 3: VDIV(fpr.R(fd), fpr.R(fs), fpr.R(fd)); break; //F(fd) = F(fs) / F(ft); //div + case 0: + fpr.MapDirtyInIn(fd, fs, ft); + INFO_LOG(HLE,"add.s %i %i %i -> VADD %i %i %i", fd, fs, ft, fpr.R(fd) - S0, fpr.R(fs) - S0, fpr.R(ft) - S0); + VADD(fpr.R(fd), fpr.R(fs), fpr.R(fd)); break; //F(fd) = F(fs) + F(ft); //add + //case 1: VSUB(fpr.R(fd), fpr.R(fs), fpr.R(fd)); break; //F(fd) = F(fs) - F(ft); //sub + //case 2: VMUL(fpr.R(fd), fpr.R(fs), fpr.R(fd)); break; //F(fd) = F(fs) * F(ft); //mul + //case 3: VDIV(fpr.R(fd), fpr.R(fs), fpr.R(fd)); break; //F(fd) = F(fs) / F(ft); //div default: - Comp_Generic(op); + DISABLE; return; } } +extern int logBlocks; + void Jit::Comp_FPULS(u32 op) { DISABLE - s32 offset = (s16)(op&0xFFFF); - int ft = ((op>>16)&0x1f); + s32 offset = (s16)(op & 0xFFFF); + int ft = _FT; int rs = _RS; // u32 addr = R(rs) + offset; - + logBlocks = 1; switch(op >> 26) { case 49: //FI(ft) = Memory::Read_U32(addr); break; //lwc1 + gpr.MapReg(rs); fpr.MapReg(ft, MAP_NOINIT | MAP_DIRTY); + ERROR_LOG(HLE, "lwc1 rs=%i offset=%i armr=%i", rs, offset, fpr.R(ft) - S0); SetR0ToEffectiveAddress(rs, offset); VLDR(fpr.R(ft), R0, 0); break; case 57: //Memory::Write_U32(FI(ft), addr); break; //swc1 + DISABLE; fpr.MapReg(ft, 0); + gpr.MapReg(rs); SetR0ToEffectiveAddress(rs, offset); VSTR(fpr.R(ft), R0, 0); break; diff --git a/Core/MIPS/ARM/ArmJit.cpp b/Core/MIPS/ARM/ArmJit.cpp index db8a391231f4..154f21cd995a 100644 --- a/Core/MIPS/ARM/ArmJit.cpp +++ b/Core/MIPS/ARM/ArmJit.cpp @@ -124,6 +124,8 @@ void Jit::RunLoopUntil(u64 globalticks) // TODO: copy globalticks somewhere ((void (*)())enterCode)(); } +static int dontLogBlocks = 20; +int logBlocks = 40; const u8 *Jit::DoJit(u32 em_address, ArmJitBlock *b) { @@ -152,8 +154,6 @@ const u8 *Jit::DoJit(u32 em_address, ArmJitBlock *b) int numInstructions = 0; int cycles = 0; - static int dontLogBlocks = 20; - static int logBlocks = 40; if (logBlocks > 0) logBlocks--; if (dontLogBlocks > 0) dontLogBlocks--; @@ -164,24 +164,21 @@ const u8 *Jit::DoJit(u32 em_address, ArmJitBlock *b) while (js.compiling) { gpr.SetCompilerPC(js.compilerPC); // Let it know for log messages + fpr.SetCompilerPC(js.compilerPC); u32 inst = Memory::Read_Instruction(js.compilerPC); -#ifdef LOGASM - if (logBlocks > 0 && dontLogBlocks == 0) { - MIPSDisAsm(inst, js.compilerPC, temp, true); - INFO_LOG(DYNA_REC, "M: %08x %s", js.compilerPC, temp); - } -#endif js.downcountAmount += MIPSGetInstructionCycleEstimate(inst); MIPSCompileOp(inst); - // FlushAll(); ///HACKK + FlushAll(); ///HACKK js.compilerPC += 4; numInstructions++; } #ifdef LOGASM if (logBlocks > 0 && dontLogBlocks == 0) { - MIPSDisAsm(Memory::Read_Instruction(js.compilerPC), js.compilerPC, temp, true); - INFO_LOG(DYNA_REC, "M: %08x %s", js.compilerPC, temp); + for (u32 cpc = em_address; cpc != js.compilerPC; cpc += 4) { + MIPSDisAsm(Memory::Read_Instruction(cpc), cpc, temp, true); + INFO_LOG(DYNA_REC, "M: %08x %s", cpc, temp); + } } #endif diff --git a/Core/MIPS/ARM/ArmRegCache.cpp b/Core/MIPS/ARM/ArmRegCache.cpp index 18815f4e5c39..c52ba13067f7 100644 --- a/Core/MIPS/ARM/ArmRegCache.cpp +++ b/Core/MIPS/ARM/ArmRegCache.cpp @@ -20,8 +20,6 @@ using namespace ArmGen; -#define CTXREG (R10) - ArmRegCache::ArmRegCache(MIPSState *mips) : mips_(mips) { } diff --git a/Core/MIPS/ARM/ArmRegCache.h b/Core/MIPS/ARM/ArmRegCache.h index e93a3fc78199..814cc3f1c83e 100644 --- a/Core/MIPS/ARM/ArmRegCache.h +++ b/Core/MIPS/ARM/ArmRegCache.h @@ -23,6 +23,8 @@ using namespace ArmGen; +#define CTXREG (R10) + // R2 to R8: mapped MIPS regs // R9 = code pointers // R10 = MIPS context diff --git a/Core/MIPS/ARM/ArmRegCacheFPU.cpp b/Core/MIPS/ARM/ArmRegCacheFPU.cpp index 66af8a1db0a5..d1db68042567 100644 --- a/Core/MIPS/ARM/ArmRegCacheFPU.cpp +++ b/Core/MIPS/ARM/ArmRegCacheFPU.cpp @@ -21,7 +21,6 @@ using namespace ArmGen; -#define CTXREG (R10) ArmRegCacheFPU::ArmRegCacheFPU(MIPSState *mips) : mips_(mips) { } @@ -38,7 +37,6 @@ void ArmRegCacheFPU::Start(MIPSAnalyst::AnalysisResults &stats) { for (int i = 0; i < NUM_MIPSFPUREG; i++) { mr[i].loc = ML_MEM; mr[i].reg = INVALID_REG; - mr[i].imm = -1; mr[i].spillLock = false; } } @@ -64,6 +62,7 @@ ARMReg ArmRegCacheFPU::MapReg(MIPSReg mipsReg, int mapFlags) { if (mapFlags & MAP_DIRTY) { ar[mr[mipsReg].reg].isDirty = true; } + INFO_LOG(HLE, "Already mapped %i to %i", mipsReg, mr[mipsReg].reg); return (ARMReg)(mr[mipsReg].reg + S0); } @@ -87,10 +86,12 @@ ARMReg ArmRegCacheFPU::MapReg(MIPSReg mipsReg, int mapFlags) { ar[reg].mipsReg = mipsReg; mr[mipsReg].loc = ML_ARMREG; mr[mipsReg].reg = reg; + INFO_LOG(HLE, "Mapped %i to %i", mipsReg, mr[mipsReg].reg); return (ARMReg)(reg + S0); } } + // Still nothing. Let's spill a reg and goto 10. // TODO: Use age or something to choose which register to spill? // TODO: Spill dirty regs first? or opposite? @@ -104,8 +105,9 @@ ARMReg ArmRegCacheFPU::MapReg(MIPSReg mipsReg, int mapFlags) { } if (bestToSpill != -1) { + INFO_LOG(HLE, "Spillin! %i", bestToSpill); // ERROR_LOG(JIT, "Out of registers at PC %08x - spills register %i.", mips_->pc, bestToSpill); - FlushArmReg((ARMReg)bestToSpill); + FlushArmReg((ARMReg)(S0 + bestToSpill)); goto allocate; } @@ -146,11 +148,14 @@ void ArmRegCacheFPU::FlushArmReg(ARMReg r) { } if (ar[reg].mipsReg != -1) { if (ar[reg].isDirty && mr[ar[reg].mipsReg].loc == ML_ARMREG) - emit->VSTR(CTXREG, r, GetMipsRegOffset(ar[reg].mipsReg)); + { + INFO_LOG(HLE, "Flushing ARM reg %i", reg); + + emit->VSTR(r, CTXREG, GetMipsRegOffset(ar[reg].mipsReg)); + } // IMMs won't be in an ARM reg. mr[ar[reg].mipsReg].loc = ML_MEM; mr[ar[reg].mipsReg].reg = INVALID_REG; - mr[ar[reg].mipsReg].imm = 0; } else { ERROR_LOG(HLE, "Dirty but no mipsreg?"); } @@ -171,7 +176,8 @@ void ArmRegCacheFPU::FlushMipsReg(MIPSReg r) { ERROR_LOG(HLE, "FlushMipsReg: MipsReg had bad ArmReg"); } if (ar[mr[r].reg].isDirty) { - emit->VSTR(CTXREG, (ARMReg)(mr[r].reg + S0), GetMipsRegOffset(r)); + INFO_LOG(HLE, "Flushing dirty reg %i", mr[r].reg); + emit->VSTR((ARMReg)(mr[r].reg + S0), CTXREG, GetMipsRegOffset(r)); ar[mr[r].reg].isDirty = false; } ar[mr[r].reg].mipsReg = -1; @@ -187,7 +193,6 @@ void ArmRegCacheFPU::FlushMipsReg(MIPSReg r) { } mr[r].loc = ML_MEM; mr[r].reg = (int)INVALID_REG; - mr[r].imm = 0; } void ArmRegCacheFPU::FlushAll() { @@ -202,34 +207,10 @@ void ArmRegCacheFPU::FlushAll() { } } -void ArmRegCacheFPU::SetImm(MIPSReg r, u32 immVal) { - // Zap existing value if cached in a reg - if (mr[r].loc == ML_ARMREG) { - ar[mr[r].reg].mipsReg = -1; - ar[mr[r].reg].isDirty = false; - } - mr[r].loc = ML_IMM; - mr[r].imm = immVal; - mr[r].reg = INVALID_REG; -} - -bool ArmRegCacheFPU::IsImm(MIPSReg r) const { - return mr[r].loc == ML_IMM; -} - -u32 ArmRegCacheFPU::GetImm(MIPSReg r) const { - if (mr[r].loc != ML_IMM) { - ERROR_LOG(JIT, "Trying to get imm from non-imm register %i", r); - } - return mr[r].imm; -} - int ArmRegCacheFPU::GetMipsRegOffset(MIPSReg r) { // These are offsets within the MIPSState structure. First there are the GPRS, then FPRS, then the "VFPURs". - if (r < 32) - return (r + 32) * 4; - else if (r < 32 + 128) - return (r + 64) * 4; + if (r < 32 + 128) + return (r + 32) << 2; ERROR_LOG(JIT, "bad mips register %i", r); return 0; // or what? } diff --git a/Core/MIPS/ARM/ArmRegCacheFPU.h b/Core/MIPS/ARM/ArmRegCacheFPU.h index b7a3a953dab2..13ab4565fe00 100644 --- a/Core/MIPS/ARM/ArmRegCacheFPU.h +++ b/Core/MIPS/ARM/ArmRegCacheFPU.h @@ -39,7 +39,6 @@ struct FPURegMIPS { // Where is this MIPS register? RegMIPSLoc loc; // Data (only one of these is used, depending on loc. Could make a union). - u32 imm; ARMReg reg; bool spillLock; // if true, this register cannot be spilled. // If loc == ML_MEM, it's back in its location in the CPU context struct. diff --git a/android/jni/ArmEmitterTest.cpp b/android/jni/ArmEmitterTest.cpp index b52a68e38a86..c9b5591a4e71 100644 --- a/android/jni/ArmEmitterTest.cpp +++ b/android/jni/ArmEmitterTest.cpp @@ -20,61 +20,53 @@ TestCode::TestCode() AllocCodeSpace(0x10000); } - -u32 TestLeaf(u32 a, u32 b, u32 c) -{ - ILOG("TestLeaf: %08x %08x %08x\n", a, b, c); - return 0xFF; -} - -void TestLeaf2(u32 a) -{ - ILOG("TestLeaf2 %08x\n"); -} - +static float abc[256] = {1.0f, 2.0f, 0.0f}; void TestCode::Generate() { testCodePtr = this->GetCodePtr(); // Sonic1 commented that R11 is the frame pointer in debug mode, whatever "debug mode" means. PUSH(2, R11, _LR); - MOVI2R(R0, 0x13371338); - AND(R1, R0, Operand2(0xFC, 4)); - BIC(R0, R0, Operand2(0xFC, 4)); - CMP(R1, Operand2(0x10, 4)); - SetCC(CC_EQ); - MOV(R2, Operand2(0x99, 0)); - SetCC(CC_NEQ); - MOV(R2, Operand2(0xFF, 0)); - SetCC(); - QuickCallFunction(R3, (void*)&TestLeaf); + MOVI2R(R11, (u32)&abc[0]); + MOVI2R(R1, 0x3f800000); + STR(R11, R1, 4 * (32 + 31)); + VLDR(S0, R11, 0); + VLDR(S1, R11, 4); + VADD(S12, S0, S1); + VSTR(S0, R11, 4 * (32 + 31)); + VSTR(S12, R11, 4 * (32 + 31)); + //VSTR(S2, R0, 8); + POP(2, R11, _PC); // Yup, this is how you return. + + //VLDR(S1, R0, 4); + //VADD(S2, S0, S1); + //VSTR(S2, R0, 8); + //QuickCallFunction(R3, (void*)&TestLeaf); //ARMABI_CallFunctionCCC((void*)&TestLeaf, 0x1, 0x100, 0x1337); //ARMABI_CallFunctionCCC((void*)&TestLeaf, 0x2, 0x100, 0x31337); //ARMABI_CallFunctionCCC((void*)&TestLeaf, 0x3, 0x100, 0x1337); - POP(2, R11, _PC); // Yup, this is how you return. - - testCodePtr2 = this->GetCodePtr(); - PUSH(2, R11, _LR); - QuickCallFunction(R3, (void*)&TestLeaf2); - POP(2, R11, _PC); } -void CallPtr(const void *ptr) +u32 CallPtr(const void *ptr) { - ((void(*)())ptr)(); + return ((u32(*)())ptr)(); } +extern void DisassembleArm(const u8 *data, int size); void ArmEmitterTest() { + // return; ILOG("Running ARM emitter test!"); TestCode gen; - gen.ReserveCodeSpace(0x4000); + gen.ReserveCodeSpace(0x1000); + const u8 *codeStart = gen.GetCodePtr(); gen.Generate(); + DisassembleArm(codeStart, gen.GetCodePtr()-codeStart); - CallPtr(gen.testCodePtr); - ILOG("ARM emitter test 1 passed!"); + u32 retval = CallPtr(gen.testCodePtr); + ILOG("ARM emitter test 1 passed if %f == 3.0! retval = %08x", abc[32 + 31], retval); } diff --git a/android/jni/NativeApp.cpp b/android/jni/NativeApp.cpp index a5fbc3a1a475..2979d3b57fe9 100644 --- a/android/jni/NativeApp.cpp +++ b/android/jni/NativeApp.cpp @@ -155,7 +155,7 @@ void NativeGetAppInfo(std::string *app_dir_name, std::string *app_nice_name, boo *app_dir_name = "ppsspp"; *landscape = true; - // ArmEmitterTest(); + ArmEmitterTest(); } void NativeInit(int argc, const char *argv[], const char *savegame_directory, const char *external_directory, const char *installID) From 69c3c91d7e3ebe3436900f2de2abdcebd02e60e8 Mon Sep 17 00:00:00 2001 From: Henrik Rydgard Date: Mon, 11 Feb 2013 23:23:42 +0100 Subject: [PATCH 004/347] add.s/sub.s now appear to work --- Common/ArmEmitter.cpp | 4 ++-- Core/MIPS/ARM/ArmCompFPU.cpp | 13 ++++++++----- 2 files changed, 10 insertions(+), 7 deletions(-) diff --git a/Common/ArmEmitter.cpp b/Common/ArmEmitter.cpp index 4245e544e58a..5ef68bbc52ed 100644 --- a/Common/ArmEmitter.cpp +++ b/Common/ArmEmitter.cpp @@ -839,7 +839,7 @@ void ARMXEmitter::VSUB(ARMReg Vd, ARMReg Vn, ARMReg Vm) if (single_reg) { Write32(NO_COND | (0x1C << 23) | ((Vd & 0x1) << 22) | (0x3 << 20) \ - | ((Vn & 0x1E) << 15) | ((Vd & 0x1E) << 12) | (0x5 << 9) \ + | ((Vn & 0x1E) << 15) | ((Vd & 0x1E) << 11) | (0x5 << 9) \ | ((Vn & 0x1) << 7) | (1 << 6) | ((Vm & 0x1) << 5) | (Vm >> 1)); } else @@ -875,7 +875,7 @@ void ARMXEmitter::VMUL(ARMReg Vd, ARMReg Vn, ARMReg Vm) if (single_reg) { Write32(NO_COND | (0x1C << 23) | ((Vd & 0x1) << 22) | (0x1 << 20) \ - | ((Vn & 0x1E) << 15) | ((Vd & 0x1E) << 12) | (0x5 << 9) \ + | ((Vn & 0x1E) << 15) | ((Vd & 0x1E) << 11) | (0x5 << 9) \ | ((Vn & 0x1) << 7) | ((Vm & 0x1) << 5) | (Vm >> 1)); } else diff --git a/Core/MIPS/ARM/ArmCompFPU.cpp b/Core/MIPS/ARM/ArmCompFPU.cpp index 9e7b6efa2094..e6a5365ee27c 100644 --- a/Core/MIPS/ARM/ArmCompFPU.cpp +++ b/Core/MIPS/ARM/ArmCompFPU.cpp @@ -36,7 +36,7 @@ namespace MIPSComp void Jit::Comp_FPU3op(u32 op) { - DISABLE + // DISABLE int ft = _FT; int fs = _FS; @@ -45,10 +45,13 @@ void Jit::Comp_FPU3op(u32 op) { case 0: fpr.MapDirtyInIn(fd, fs, ft); - INFO_LOG(HLE,"add.s %i %i %i -> VADD %i %i %i", fd, fs, ft, fpr.R(fd) - S0, fpr.R(fs) - S0, fpr.R(ft) - S0); - VADD(fpr.R(fd), fpr.R(fs), fpr.R(fd)); break; //F(fd) = F(fs) + F(ft); //add - //case 1: VSUB(fpr.R(fd), fpr.R(fs), fpr.R(fd)); break; //F(fd) = F(fs) - F(ft); //sub - //case 2: VMUL(fpr.R(fd), fpr.R(fs), fpr.R(fd)); break; //F(fd) = F(fs) * F(ft); //mul + VADD(fpr.R(fd), fpr.R(fs), fpr.R(ft)); break; //F(fd) = F(fs) + F(ft); //add + case 1: + fpr.MapDirtyInIn(fd, fs, ft); + VSUB(fpr.R(fd), fpr.R(fs), fpr.R(ft)); break; //F(fd) = F(fs) - F(ft); //sub + //case 2: + // fpr.MapDirtyInIn(fd, fs, ft); + // VMUL(fpr.R(fd), fpr.R(fs), fpr.R(ft)); break; //F(fd) = F(fs) * F(ft); //mul //case 3: VDIV(fpr.R(fd), fpr.R(fs), fpr.R(fd)); break; //F(fd) = F(fs) / F(ft); //div default: DISABLE; From ba1171f15d8bed989e7c44f5dd96e23b8250a039 Mon Sep 17 00:00:00 2001 From: Henrik Rydgard Date: Mon, 11 Feb 2013 23:39:30 +0100 Subject: [PATCH 005/347] Couple more armjit-fpu instructions. Turn down logging a bit. --- Core/MIPS/ARM/ArmCompFPU.cpp | 12 ++++++------ Core/MIPS/ARM/ArmJit.cpp | 2 +- Core/MIPS/ARM/ArmRegCacheFPU.cpp | 10 ++++------ 3 files changed, 11 insertions(+), 13 deletions(-) diff --git a/Core/MIPS/ARM/ArmCompFPU.cpp b/Core/MIPS/ARM/ArmCompFPU.cpp index e6a5365ee27c..f8a94a0a246a 100644 --- a/Core/MIPS/ARM/ArmCompFPU.cpp +++ b/Core/MIPS/ARM/ArmCompFPU.cpp @@ -69,7 +69,7 @@ void Jit::Comp_FPULS(u32 op) int ft = _FT; int rs = _RS; // u32 addr = R(rs) + offset; - logBlocks = 1; + // logBlocks = 1; switch(op >> 26) { case 49: //FI(ft) = Memory::Read_U32(addr); break; //lwc1 @@ -100,10 +100,11 @@ void Jit::Comp_FPUComp(u32 op) { void Jit::Comp_FPU2op(u32 op) { - DISABLE + // DISABLE int fs = _FS; int fd = _FD; + logBlocks = 1; switch (op & 0x3f) { @@ -119,13 +120,13 @@ void Jit::Comp_FPU2op(u32 op) case 4: //F(fd) = sqrtf(F(fs)); break; //sqrt fpr.MapDirtyIn(fd, fs); - VSQRT(fpr.R(fd), fpr.R(fd)); + VSQRT(fpr.R(fd), fpr.R(fs)); return; case 6: //F(fd) = F(fs); break; //mov fpr.MapDirtyIn(fd, fs); - VMOV(fpr.R(fd), fpr.R(fd)); + VMOV(fpr.R(fd), fpr.R(fs)); break; /* @@ -153,8 +154,7 @@ void Jit::Comp_FPU2op(u32 op) case 36: //FsI(fd) = (int) F(fs); break; //cvt.w.s */ default: - Comp_Generic(op); - return; + DISABLE; } } diff --git a/Core/MIPS/ARM/ArmJit.cpp b/Core/MIPS/ARM/ArmJit.cpp index 154f21cd995a..48d481325306 100644 --- a/Core/MIPS/ARM/ArmJit.cpp +++ b/Core/MIPS/ARM/ArmJit.cpp @@ -169,7 +169,7 @@ const u8 *Jit::DoJit(u32 em_address, ArmJitBlock *b) js.downcountAmount += MIPSGetInstructionCycleEstimate(inst); MIPSCompileOp(inst); - FlushAll(); ///HACKK + // FlushAll(); ///HACKK js.compilerPC += 4; numInstructions++; } diff --git a/Core/MIPS/ARM/ArmRegCacheFPU.cpp b/Core/MIPS/ARM/ArmRegCacheFPU.cpp index d1db68042567..e59f1f417a1f 100644 --- a/Core/MIPS/ARM/ArmRegCacheFPU.cpp +++ b/Core/MIPS/ARM/ArmRegCacheFPU.cpp @@ -62,7 +62,7 @@ ARMReg ArmRegCacheFPU::MapReg(MIPSReg mipsReg, int mapFlags) { if (mapFlags & MAP_DIRTY) { ar[mr[mipsReg].reg].isDirty = true; } - INFO_LOG(HLE, "Already mapped %i to %i", mipsReg, mr[mipsReg].reg); + //INFO_LOG(HLE, "Already mapped %i to %i", mipsReg, mr[mipsReg].reg); return (ARMReg)(mr[mipsReg].reg + S0); } @@ -86,7 +86,7 @@ ARMReg ArmRegCacheFPU::MapReg(MIPSReg mipsReg, int mapFlags) { ar[reg].mipsReg = mipsReg; mr[mipsReg].loc = ML_ARMREG; mr[mipsReg].reg = reg; - INFO_LOG(HLE, "Mapped %i to %i", mipsReg, mr[mipsReg].reg); + //INFO_LOG(HLE, "Mapped %i to %i", mipsReg, mr[mipsReg].reg); return (ARMReg)(reg + S0); } } @@ -105,8 +105,6 @@ ARMReg ArmRegCacheFPU::MapReg(MIPSReg mipsReg, int mapFlags) { } if (bestToSpill != -1) { - INFO_LOG(HLE, "Spillin! %i", bestToSpill); - // ERROR_LOG(JIT, "Out of registers at PC %08x - spills register %i.", mips_->pc, bestToSpill); FlushArmReg((ARMReg)(S0 + bestToSpill)); goto allocate; } @@ -149,7 +147,7 @@ void ArmRegCacheFPU::FlushArmReg(ARMReg r) { if (ar[reg].mipsReg != -1) { if (ar[reg].isDirty && mr[ar[reg].mipsReg].loc == ML_ARMREG) { - INFO_LOG(HLE, "Flushing ARM reg %i", reg); + //INFO_LOG(HLE, "Flushing ARM reg %i", reg); emit->VSTR(r, CTXREG, GetMipsRegOffset(ar[reg].mipsReg)); } @@ -176,7 +174,7 @@ void ArmRegCacheFPU::FlushMipsReg(MIPSReg r) { ERROR_LOG(HLE, "FlushMipsReg: MipsReg had bad ArmReg"); } if (ar[mr[r].reg].isDirty) { - INFO_LOG(HLE, "Flushing dirty reg %i", mr[r].reg); + //INFO_LOG(HLE, "Flushing dirty reg %i", mr[r].reg); emit->VSTR((ARMReg)(mr[r].reg + S0), CTXREG, GetMipsRegOffset(r)); ar[mr[r].reg].isDirty = false; } From af4c7be0862900522c4e569acf620e050372fee5 Mon Sep 17 00:00:00 2001 From: Henrik Rydgard Date: Mon, 11 Feb 2013 23:58:06 +0100 Subject: [PATCH 006/347] mul.s div.s --- Common/ArmEmitter.cpp | 6 +++--- Core/MIPS/ARM/ArmCompFPU.cpp | 16 ++++++---------- 2 files changed, 9 insertions(+), 13 deletions(-) diff --git a/Common/ArmEmitter.cpp b/Common/ArmEmitter.cpp index 5ef68bbc52ed..779d6a376e45 100644 --- a/Common/ArmEmitter.cpp +++ b/Common/ArmEmitter.cpp @@ -756,7 +756,7 @@ void ARMXEmitter::VDIV(ARMReg Vd, ARMReg Vn, ARMReg Vm) if (single_reg) { - Write32(NO_COND | (0x1D << 23) | ((Vd & 0x1) << 22) | ((Vn & 0x1E) << 16) \ + Write32(NO_COND | (0x1D << 23) | ((Vd & 0x1) << 22) | ((Vn & 0x1E) << 15) \ | ((Vd & 0x1E) << 11) | (0xA << 8) | ((Vn & 0x1) << 7) | ((Vm & 0x1) << 5) \ | (Vm >> 1)); } @@ -874,7 +874,7 @@ void ARMXEmitter::VMUL(ARMReg Vd, ARMReg Vn, ARMReg Vm) if (single_reg) { - Write32(NO_COND | (0x1C << 23) | ((Vd & 0x1) << 22) | (0x1 << 20) \ + Write32(NO_COND | (0x1C << 23) | ((Vd & 0x1) << 22) | (0x2 << 20) \ | ((Vn & 0x1E) << 15) | ((Vd & 0x1E) << 11) | (0x5 << 9) \ | ((Vn & 0x1) << 7) | ((Vm & 0x1) << 5) | (Vm >> 1)); } @@ -882,7 +882,7 @@ void ARMXEmitter::VMUL(ARMReg Vd, ARMReg Vn, ARMReg Vm) { if (double_reg) { - Write32(NO_COND | (0x1C << 23) | ((Vd & 0x10) << 18) | (0x1 << 20) \ + Write32(NO_COND | (0x1C << 23) | ((Vd & 0x10) << 18) | (0x2 << 20) \ | ((Vn & 0xF) << 16) | ((Vd & 0xF) << 12) | (0xB << 8) \ | ((Vn & 0x10) << 3) | ((Vm & 0x10) << 2) | (Vm & 0xF)); } diff --git a/Core/MIPS/ARM/ArmCompFPU.cpp b/Core/MIPS/ARM/ArmCompFPU.cpp index f8a94a0a246a..cf67fef61097 100644 --- a/Core/MIPS/ARM/ArmCompFPU.cpp +++ b/Core/MIPS/ARM/ArmCompFPU.cpp @@ -41,18 +41,14 @@ void Jit::Comp_FPU3op(u32 op) int ft = _FT; int fs = _FS; int fd = _FD; + + fpr.MapDirtyInIn(fd, fs, ft); switch (op & 0x3f) { - case 0: - fpr.MapDirtyInIn(fd, fs, ft); - VADD(fpr.R(fd), fpr.R(fs), fpr.R(ft)); break; //F(fd) = F(fs) + F(ft); //add - case 1: - fpr.MapDirtyInIn(fd, fs, ft); - VSUB(fpr.R(fd), fpr.R(fs), fpr.R(ft)); break; //F(fd) = F(fs) - F(ft); //sub - //case 2: - // fpr.MapDirtyInIn(fd, fs, ft); - // VMUL(fpr.R(fd), fpr.R(fs), fpr.R(ft)); break; //F(fd) = F(fs) * F(ft); //mul - //case 3: VDIV(fpr.R(fd), fpr.R(fs), fpr.R(fd)); break; //F(fd) = F(fs) / F(ft); //div + case 0: VADD(fpr.R(fd), fpr.R(fs), fpr.R(ft)); break; //F(fd) = F(fs) + F(ft); //add + case 1: VSUB(fpr.R(fd), fpr.R(fs), fpr.R(ft)); break; //F(fd) = F(fs) - F(ft); //sub + case 2: VMUL(fpr.R(fd), fpr.R(fs), fpr.R(ft)); break; //F(fd) = F(fs) * F(ft); //mul + case 3: VDIV(fpr.R(fd), fpr.R(fs), fpr.R(ft)); break; //F(fd) = F(fs) / F(ft); //div default: DISABLE; return; From b115cd7320dec89f9f6aee07eee7a79198980285 Mon Sep 17 00:00:00 2001 From: Henrik Rydgard Date: Tue, 12 Feb 2013 18:53:04 +0100 Subject: [PATCH 007/347] VMOV gpr->fpu, fixes --- Common/ArmEmitter.cpp | 17 +++++++++++++++-- Common/ArmEmitter.h | 1 + 2 files changed, 16 insertions(+), 2 deletions(-) diff --git a/Common/ArmEmitter.cpp b/Common/ArmEmitter.cpp index 779d6a376e45..0b05c2a1cff0 100644 --- a/Common/ArmEmitter.cpp +++ b/Common/ArmEmitter.cpp @@ -621,16 +621,18 @@ ARMReg ARMXEmitter::SubBase(ARMReg Reg) // NEON Specific void ARMXEmitter::VADD(IntegerSize Size, ARMReg Vd, ARMReg Vn, ARMReg Vm) { - _assert_msg_(DYNA_REC, Vd >= Q0, "Pass invalid register to VADD(integer)"); + _assert_msg_(DYNA_REC, Vd >= D0, "Pass invalid register to VADD(integer)"); _assert_msg_(DYNA_REC, cpu_info.bNEON, "Can't use VADD(integer) when CPU doesn't support it"); + bool register_quad = Vd >= Q0; + // Gets encoded as a double register Vd = SubBase(Vd); Vn = SubBase(Vn); Vm = SubBase(Vm); Write32((0xF2 << 24) | ((Vd & 0x10) << 18) | (Size << 20) | ((Vn & 0xF) << 16) \ - | ((Vd & 0xF) << 12) | (0x8 << 8) | ((Vn & 0x10) << 3) | (1 << 6) \ + | ((Vd & 0xF) << 12) | (0x8 << 8) | ((Vn & 0x10) << 3) | (register_quad << 6) \ | ((Vm & 0x10) << 2) | (Vm & 0xF)); } @@ -896,6 +898,17 @@ void ARMXEmitter::VMUL(ARMReg Vd, ARMReg Vn, ARMReg Vm) } } +void ARMXEmitter::VMOV(ARMReg Dest, ARMReg Src, bool high) +{ + _assert_msg_(DYNA_REC, Src < S0, "This VMOV doesn't support SRC other than ARM Reg"); + _assert_msg_(DYNA_REC, Dest >= D0, "This VMOV doesn't support DEST other than VFP"); + + Dest = SubBase(Dest); + + Write32(NO_COND | (0xE << 24) | (high << 21) | ((Dest & 0xF) << 16) | (Src << 12) \ + | (11 << 8) | ((Dest & 0x10) << 3) | (1 << 4)); +} + void ARMXEmitter::VMOV(ARMReg Dest, ARMReg Src) { if (Dest > R15) diff --git a/Common/ArmEmitter.h b/Common/ArmEmitter.h index 236dde11f105..b50179bf57ae 100644 --- a/Common/ArmEmitter.h +++ b/Common/ArmEmitter.h @@ -511,6 +511,7 @@ class ARMXEmitter void VADD(ARMReg Vd, ARMReg Vn, ARMReg Vm); void VSUB(ARMReg Vd, ARMReg Vn, ARMReg Vm); void VMUL(ARMReg Vd, ARMReg Vn, ARMReg Vm); + void VMOV(ARMReg Dest, ARMReg Src, bool high); void VMOV(ARMReg Dest, ARMReg Src); void QuickCallFunction(ARMReg scratchreg, void *func); From b0c160fa93739a105f194e8d5ac0eb3d6f7e2343 Mon Sep 17 00:00:00 2001 From: Henrik Rydgard Date: Wed, 13 Feb 2013 21:07:06 +0100 Subject: [PATCH 008/347] Fix armjit fpu load / store --- Common/ArmEmitter.cpp | 8 ++++---- Core/MIPS/ARM/ArmCompFPU.cpp | 29 +++++++++++++++++++---------- Core/MIPS/ARM/ArmCompLoadStore.cpp | 1 - Core/MIPS/MIPSInt.cpp | 2 +- 4 files changed, 24 insertions(+), 16 deletions(-) diff --git a/Common/ArmEmitter.cpp b/Common/ArmEmitter.cpp index 0b05c2a1cff0..af6e6e3df7d6 100644 --- a/Common/ArmEmitter.cpp +++ b/Common/ArmEmitter.cpp @@ -657,13 +657,13 @@ void ARMXEmitter::VLDR(ARMReg Dest, ARMReg Base, u16 offset) { _assert_msg_(DYNA_REC, Dest >= S0 && Dest <= D31, "Passed Invalid dest register to VLDR"); _assert_msg_(DYNA_REC, Base <= R15, "Passed invalid Base register to VLDR"); - _assert_msg_(DYNA_REC, (offset & 0xC003) == 0, "VLDR: Offset needs to be word aligned and small enough"); + _assert_msg_(DYNA_REC, (offset & 0xC03) == 0, "VLDR: Offset needs to be word aligned and small enough"); if (offset & 0xC03) { ERROR_LOG(DYNA_REC, "VLDR: Bad offset %08x", offset); } - ERROR_LOG(DYNA_REC, "VLDR: s%i, r%i + %i", Dest - S0, Base, offset); + // ERROR_LOG(DYNA_REC, "VLDR: s%i, r%i + %i", Dest - S0, Base, offset); bool single_reg = Dest < D0; @@ -685,12 +685,12 @@ void ARMXEmitter::VSTR(ARMReg Src, ARMReg Base, u16 offset) { _assert_msg_(DYNA_REC, Src >= S0 && Src <= D31, "Passed invalid src register to VSTR"); _assert_msg_(DYNA_REC, Base <= R15, "Passed invalid base register to VSTR"); - _assert_msg_(DYNA_REC, (offset & 0xC003) == 0, "VSTR: Offset needs to be word aligned"); + _assert_msg_(DYNA_REC, (offset & 0xC03) == 0, "VSTR: Offset needs to be word aligned"); if (offset & 0xC03) { ERROR_LOG(DYNA_REC, "VSTR: Bad offset %08x", offset); } - ERROR_LOG(DYNA_REC, "VSTR: s%i, r%i + %i", Src - S0, Base, offset); + // ERROR_LOG(DYNA_REC, "VSTR: s%i, r%i + %i", Src - S0, Base, offset); bool single_reg = Src < D0; diff --git a/Core/MIPS/ARM/ArmCompFPU.cpp b/Core/MIPS/ARM/ArmCompFPU.cpp index cf67fef61097..bbbce6538bd1 100644 --- a/Core/MIPS/ARM/ArmCompFPU.cpp +++ b/Core/MIPS/ARM/ArmCompFPU.cpp @@ -59,8 +59,7 @@ extern int logBlocks; void Jit::Comp_FPULS(u32 op) { - DISABLE - + FlushAll(); s32 offset = (s16)(op & 0xFFFF); int ft = _FT; int rs = _RS; @@ -69,18 +68,28 @@ void Jit::Comp_FPULS(u32 op) switch(op >> 26) { case 49: //FI(ft) = Memory::Read_U32(addr); break; //lwc1 - gpr.MapReg(rs); fpr.MapReg(ft, MAP_NOINIT | MAP_DIRTY); - ERROR_LOG(HLE, "lwc1 rs=%i offset=%i armr=%i", rs, offset, fpr.R(ft) - S0); - SetR0ToEffectiveAddress(rs, offset); + if (gpr.IsImm(rs)) { + u32 addr = (offset + gpr.GetImm(rs)) & 0x3FFFFFFF; + MOVI2R(R0, addr + (u32)Memory::base); + } else { + gpr.MapReg(rs); + SetR0ToEffectiveAddress(rs, offset); + ADD(R0, R0, R11); + } VLDR(fpr.R(ft), R0, 0); break; case 57: //Memory::Write_U32(FI(ft), addr); break; //swc1 - DISABLE; - fpr.MapReg(ft, 0); - gpr.MapReg(rs); - SetR0ToEffectiveAddress(rs, offset); + fpr.MapReg(ft); + if (gpr.IsImm(rs)) { + u32 addr = (offset + gpr.GetImm(rs)) & 0x3FFFFFFF; + MOVI2R(R0, addr + (u32)Memory::base); + } else { + gpr.MapReg(rs); + SetR0ToEffectiveAddress(rs, offset); + ADD(R0, R0, R11); + } VSTR(fpr.R(ft), R0, 0); break; @@ -100,7 +109,7 @@ void Jit::Comp_FPU2op(u32 op) int fs = _FS; int fd = _FD; - logBlocks = 1; + // logBlocks = 1; switch (op & 0x3f) { diff --git a/Core/MIPS/ARM/ArmCompLoadStore.cpp b/Core/MIPS/ARM/ArmCompLoadStore.cpp index fff481a29591..854e5f207594 100644 --- a/Core/MIPS/ARM/ArmCompLoadStore.cpp +++ b/Core/MIPS/ARM/ArmCompLoadStore.cpp @@ -56,7 +56,6 @@ namespace MIPSComp { - void Jit::SetR0ToEffectiveAddress(int rs, s16 offset) { Operand2 op2; if (offset) { diff --git a/Core/MIPS/MIPSInt.cpp b/Core/MIPS/MIPSInt.cpp index 3c593aeb2087..f408055b5c5d 100644 --- a/Core/MIPS/MIPSInt.cpp +++ b/Core/MIPS/MIPSInt.cpp @@ -495,7 +495,7 @@ namespace MIPSInt void Int_FPULS(u32 op) { s32 offset = (s16)(op&0xFFFF); - int ft = ((op>>16)&0x1f); + int ft = _FT; int rs = _RS; u32 addr = R(rs) + offset; From c850bca8a29fe0dcf226d2938054c1cddf46cf07 Mon Sep 17 00:00:00 2001 From: Henrik Rydgard Date: Wed, 13 Feb 2013 21:15:47 +0100 Subject: [PATCH 009/347] Delete leftover FlushAll call --- Core/MIPS/ARM/ArmCompFPU.cpp | 1 - 1 file changed, 1 deletion(-) diff --git a/Core/MIPS/ARM/ArmCompFPU.cpp b/Core/MIPS/ARM/ArmCompFPU.cpp index bbbce6538bd1..c50996a898c2 100644 --- a/Core/MIPS/ARM/ArmCompFPU.cpp +++ b/Core/MIPS/ARM/ArmCompFPU.cpp @@ -59,7 +59,6 @@ extern int logBlocks; void Jit::Comp_FPULS(u32 op) { - FlushAll(); s32 offset = (s16)(op & 0xFFFF); int ft = _FT; int rs = _RS; From 048cf35922926acbbb6d8aa528b3b632464776c6 Mon Sep 17 00:00:00 2001 From: Henrik Rydgard Date: Thu, 14 Feb 2013 00:02:09 +0100 Subject: [PATCH 010/347] More ARMJit FPU work - some instructions and optimizations. --- Core/MIPS/ARM/ArmAsm.cpp | 3 ++ Core/MIPS/ARM/ArmCompALU.cpp | 8 +++- Core/MIPS/ARM/ArmCompBranch.cpp | 5 +-- Core/MIPS/ARM/ArmCompFPU.cpp | 79 ++++++++++++++++++++++++++------- Core/MIPS/ARM/ArmJit.cpp | 5 +-- Core/MIPS/ARM/ArmJit.h | 1 + Core/MIPS/ARM/ArmRegCache.cpp | 16 ++++++- Core/MIPS/ARM/ArmRegCache.h | 3 +- Core/MIPS/ARM/ArmRegCacheFPU.h | 3 +- GPU/GLES/Framebuffer.cpp | 3 +- 10 files changed, 94 insertions(+), 32 deletions(-) diff --git a/Core/MIPS/ARM/ArmAsm.cpp b/Core/MIPS/ARM/ArmAsm.cpp index 9a1ad4bc82ee..57c9d37fd4e3 100644 --- a/Core/MIPS/ARM/ArmAsm.cpp +++ b/Core/MIPS/ARM/ArmAsm.cpp @@ -121,6 +121,9 @@ void Jit::GenerateFixedCode() MOVI2R(R10, (u32)mips_); MOVI2R(R9, (u32)GetBlockCache()->GetCodePointers()); + MovFromPC(R0); + outerLoopPCInR0 = GetCodePtr(); + MovToPC(R0); outerLoop = GetCodePtr(); QuickCallFunction(R0, (void *)&CoreTiming::Advance); FixupBranch skipToRealDispatch = B(); //skip the sync and compare first time diff --git a/Core/MIPS/ARM/ArmCompALU.cpp b/Core/MIPS/ARM/ArmCompALU.cpp index 9fdc796c2d19..47bb07aeee08 100644 --- a/Core/MIPS/ARM/ArmCompALU.cpp +++ b/Core/MIPS/ARM/ArmCompALU.cpp @@ -191,8 +191,12 @@ namespace MIPSComp case 39: // R(rd) = ~(R(rs) | R(rt)); //nor gpr.MapDirtyInIn(rd, rs, rt); - ORR(gpr.R(rd), gpr.R(rs), gpr.R(rt)); - MVN(gpr.R(rd), gpr.R(rd)); + if (rt == 0) { + MVN(gpr.R(rd), gpr.R(rs)); + } else { + ORR(gpr.R(rd), gpr.R(rs), gpr.R(rt)); + MVN(gpr.R(rd), gpr.R(rd)); + } break; case 42: //R(rd) = (int)R(rs) < (int)R(rt); break; //slt diff --git a/Core/MIPS/ARM/ArmCompBranch.cpp b/Core/MIPS/ARM/ArmCompBranch.cpp index f3b149c6c7cb..c36b6111b03a 100644 --- a/Core/MIPS/ARM/ArmCompBranch.cpp +++ b/Core/MIPS/ARM/ArmCompBranch.cpp @@ -77,10 +77,7 @@ void Jit::BranchRSRTComp(u32 op, ArmGen::CCFlags cc, bool likely) } else { - gpr.SpillLock(rs, rt); - gpr.MapReg(rs); - gpr.MapReg(rt); - gpr.ReleaseSpillLocks(); + gpr.MapInIn(rs, rt); CMP(gpr.R(rs), gpr.R(rt)); } diff --git a/Core/MIPS/ARM/ArmCompFPU.cpp b/Core/MIPS/ARM/ArmCompFPU.cpp index c50996a898c2..e93445be24b3 100644 --- a/Core/MIPS/ARM/ArmCompFPU.cpp +++ b/Core/MIPS/ARM/ArmCompFPU.cpp @@ -36,7 +36,7 @@ namespace MIPSComp void Jit::Comp_FPU3op(u32 op) { - // DISABLE + CONDITIONAL_DISABLE; int ft = _FT; int fs = _FS; @@ -59,6 +59,8 @@ extern int logBlocks; void Jit::Comp_FPULS(u32 op) { + CONDITIONAL_DISABLE; + s32 offset = (s16)(op & 0xFFFF); int ft = _FT; int rs = _RS; @@ -100,11 +102,58 @@ void Jit::Comp_FPULS(u32 op) void Jit::Comp_FPUComp(u32 op) { DISABLE; + int fs = _FS; + int ft = _FT; + + switch (op & 0xf) { + case 0: //f + case 8: //sf + // MOV(32, M((void *) ¤tMIPS->fpcond), Imm32(0)); + break; + + case 1: //un + case 9: //ngle + // CompFPComp(fs, ft, CMPUNORDSS); + break; + + case 2: //eq + case 10: //seq + // CompFPComp(fs, ft, CMPEQSS); + break; + + case 3: //ueq + case 11: //ngl + // CompFPComp(fs, ft, CMPEQSS, true); + break; + + case 4: //olt + case 12: //lt + // CompFPComp(fs, ft, CMPLTSS); + break; + + case 5: //ult + case 13: //nge + // CompFPComp(ft, fs, CMPNLESS); + break; + + case 6: //ole + case 14: //le + // CompFPComp(fs, ft, CMPLESS); + break; + + case 7: //ule + case 15: //ngt + // CompFPComp(ft, fs, CMPNLTSS); + break; + + default: + DISABLE; + } } void Jit::Comp_FPU2op(u32 op) { - // DISABLE + CONDITIONAL_DISABLE; int fs = _FS; int fd = _FD; @@ -164,20 +213,18 @@ void Jit::Comp_FPU2op(u32 op) void Jit::Comp_mxc1(u32 op) { - DISABLE + CONDITIONAL_DISABLE; + int fs = _FS; int rt = _RT; switch((op >> 21) & 0x1f) { - /* case 0: // R(rt) = FI(fs); break; //mfc1 - // Cross move! slightly tricky - fpr.StoreFromRegister(fs); - gpr.Lock(rt); - gpr.BindToRegister(rt, false, true); - MOV(32, gpr.R(rt), fpr.R(fs)); - gpr.UnlockAll(); + // Let's just go through RAM for now. + fpr.FlushMipsReg(fs); + gpr.MapReg(rt, MAP_DIRTY | MAP_NOINIT); + LDR(gpr.R(rt), CTXREG, fpr.GetMipsRegOffset(fs)); return; case 2: // R(rt) = currentMIPS->ReadFCR(fs); break; //cfc1 @@ -185,14 +232,12 @@ void Jit::Comp_mxc1(u32 op) return; case 4: //FI(fs) = R(rt); break; //mtc1 - // Cross move! slightly tricky - gpr.StoreFromRegister(rt); - fpr.Lock(fs); - fpr.BindToRegister(fs, false, true); - MOVSS(fpr.R(fs), gpr.R(rt)); - fpr.UnlockAll(); + // Let's just go through RAM for now. + gpr.FlushMipsReg(rt); + fpr.MapReg(fs, MAP_DIRTY | MAP_NOINIT); + VLDR(fpr.R(fs), CTXREG, gpr.GetMipsRegOffset(rt)); return; - */ + case 6: //currentMIPS->WriteFCR(fs, R(rt)); break; //ctc1 Comp_Generic(op); return; diff --git a/Core/MIPS/ARM/ArmJit.cpp b/Core/MIPS/ARM/ArmJit.cpp index 48d481325306..ebef19109789 100644 --- a/Core/MIPS/ARM/ArmJit.cpp +++ b/Core/MIPS/ARM/ArmJit.cpp @@ -141,8 +141,7 @@ const u8 *Jit::DoJit(u32 em_address, ArmJitBlock *b) // Downcount flag check. The last block decremented downcounter, and the flag should still be available. SetCC(CC_LT); MOVI2R(R0, js.blockStart); - MovToPC(R0); - B((const void *)outerLoop); + B((const void *)outerLoopPCInR0); SetCC(CC_AL); b->normalEntry = GetCodePtr(); @@ -175,7 +174,7 @@ const u8 *Jit::DoJit(u32 em_address, ArmJitBlock *b) } #ifdef LOGASM if (logBlocks > 0 && dontLogBlocks == 0) { - for (u32 cpc = em_address; cpc != js.compilerPC; cpc += 4) { + for (u32 cpc = em_address; cpc != js.compilerPC + 4; cpc += 4) { MIPSDisAsm(Memory::Read_Instruction(cpc), cpc, temp, true); INFO_LOG(DYNA_REC, "M: %08x %s", cpc, temp); } diff --git a/Core/MIPS/ARM/ArmJit.h b/Core/MIPS/ARM/ArmJit.h index e9cd7cc54062..1a987bed4b8c 100644 --- a/Core/MIPS/ARM/ArmJit.h +++ b/Core/MIPS/ARM/ArmJit.h @@ -165,6 +165,7 @@ class Jit : public ArmGen::ARMXCodeBlock const u8 *enterCode; const u8 *outerLoop; + const u8 *outerLoopPCInR0; const u8 *dispatcherCheckCoreState; const u8 *dispatcher; const u8 *dispatcherNoCheck; diff --git a/Core/MIPS/ARM/ArmRegCache.cpp b/Core/MIPS/ARM/ArmRegCache.cpp index c52ba13067f7..8ea9a1b5e416 100644 --- a/Core/MIPS/ARM/ArmRegCache.cpp +++ b/Core/MIPS/ARM/ArmRegCache.cpp @@ -44,16 +44,18 @@ static const ARMReg *GetMIPSAllocationOrder(int &count) { // Note that R0 is reserved as scratch for now. // R1 could be used as it's only used for scratch outside "regalloc space" now. // R12 is also potentially usable. - // R4-R7 are registers we could use for static allocation. + // R4-R7 are registers we could use for static allocation or downcount. // R8 is used to preserve flags in nasty branches. // R9 and upwards are reserved for jit basics. static const ARMReg allocationOrder[] = { - R12, R2, R3, R4, R5, R6, R7, + R12, R1, R2, R3, R4, R5, R6, R7, }; count = sizeof(allocationOrder) / sizeof(const int); return allocationOrder; } +// TODO: Somewhat smarter spilling - currently simply spills the first available, should do +// round robin or FIFO or something. ARMReg ArmRegCache::MapReg(MIPSReg mipsReg, int mapFlags) { // Let's see if it's already mapped. If so we just need to update the dirty flag. // We don't need to check for ML_NOINIT because we assume that anyone who maps @@ -179,6 +181,11 @@ void ArmRegCache::FlushArmReg(ARMReg r) { } void ArmRegCache::FlushMipsReg(MIPSReg r) { + /* + if (r == 0) { + ERROR_LOG(JIT, "Flushing r0"); + return; + }*/ switch (mr[r].loc) { case ML_IMM: // IMM is always "dirty". @@ -223,6 +230,9 @@ void ArmRegCache::FlushAll() { } void ArmRegCache::SetImm(MIPSReg r, u32 immVal) { + if (r == 0) + ERROR_LOG(JIT, "Trying to set immediate %08x to r0", immVal); + // Zap existing value if cached in a reg if (mr[r].loc == ML_ARMREG) { ar[mr[r].reg].mipsReg = -1; @@ -234,10 +244,12 @@ void ArmRegCache::SetImm(MIPSReg r, u32 immVal) { } bool ArmRegCache::IsImm(MIPSReg r) const { + if (r == 0) return true; return mr[r].loc == ML_IMM; } u32 ArmRegCache::GetImm(MIPSReg r) const { + if (r == 0) return 0; if (mr[r].loc != ML_IMM) { ERROR_LOG(JIT, "Trying to get imm from non-imm register %i", r); } diff --git a/Core/MIPS/ARM/ArmRegCache.h b/Core/MIPS/ARM/ArmRegCache.h index 814cc3f1c83e..74a70ffa18d2 100644 --- a/Core/MIPS/ARM/ArmRegCache.h +++ b/Core/MIPS/ARM/ArmRegCache.h @@ -104,8 +104,9 @@ class ArmRegCache // For better log output only. void SetCompilerPC(u32 compilerPC) { compilerPC_ = compilerPC; } -private: int GetMipsRegOffset(MIPSReg r); + +private: MIPSState *mips_; ARMXEmitter *emit; u32 compilerPC_; diff --git a/Core/MIPS/ARM/ArmRegCacheFPU.h b/Core/MIPS/ARM/ArmRegCacheFPU.h index 13ab4565fe00..31a76eaf6d63 100644 --- a/Core/MIPS/ARM/ArmRegCacheFPU.h +++ b/Core/MIPS/ARM/ArmRegCacheFPU.h @@ -81,11 +81,12 @@ class ArmRegCacheFPU // For better log output only. void SetCompilerPC(u32 compilerPC) { compilerPC_ = compilerPC; } -private: int GetMipsRegOffset(MIPSReg r); int GetMipsRegOffsetV(MIPSReg r) { return GetMipsRegOffset(r + 32); } + + private: MIPSState *mips_; ARMXEmitter *emit; u32 compilerPC_; diff --git a/GPU/GLES/Framebuffer.cpp b/GPU/GLES/Framebuffer.cpp index 7ed3fefd6ada..9d7dcf1367f7 100644 --- a/GPU/GLES/Framebuffer.cpp +++ b/GPU/GLES/Framebuffer.cpp @@ -363,8 +363,6 @@ void FramebufferManager::SetRenderFrameBuffer() { vfb->last_frame_used = gpuStats.numFrames; fbo_bind_as_render_target(vfb->fbo); - - textureCache_->NotifyFramebuffer(vfb->fb_address, vfb->fbo); #ifdef USING_GLES2 // Some tiled mobile GPUs benefit IMMENSELY from clearing an FBO before rendering // to it. This broke stuff before, so now it only clears on the first use of an @@ -373,6 +371,7 @@ void FramebufferManager::SetRenderFrameBuffer() { if (vfb->last_frame_used != gpuStats.numFrames) glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT); #endif + textureCache_->NotifyFramebuffer(vfb->fb_address, vfb->fbo); glstate.viewport.set(0, 0, vfb->renderWidth, vfb->renderHeight); currentRenderVfb_ = vfb; } From 456172c5a6d240e212555fdb22ff8980a5948085 Mon Sep 17 00:00:00 2001 From: Henrik Rydgard Date: Fri, 15 Feb 2013 21:41:29 +0100 Subject: [PATCH 011/347] Small optimizations and fixes to vertex decoder --- GPU/GLES/TransformPipeline.cpp | 12 ++++++++---- GPU/GLES/VertexDecoder.cpp | 33 +++++++++++++++++---------------- 2 files changed, 25 insertions(+), 20 deletions(-) diff --git a/GPU/GLES/TransformPipeline.cpp b/GPU/GLES/TransformPipeline.cpp index 05297137b625..85fa40b63166 100644 --- a/GPU/GLES/TransformPipeline.cpp +++ b/GPU/GLES/TransformPipeline.cpp @@ -283,8 +283,13 @@ void Lighter::Light(float colorOut0[4], float colorOut1[4], const float colorIn[ bool doSpecular = (comp != GE_LIGHTCOMP_ONLYDIFFUSE); bool poweredDiffuse = comp == GE_LIGHTCOMP_BOTHWITHPOWDIFFUSE; - float dot = toLight * norm; - + float distanceToLight = toLight.Length(); + float dot = 0.0f; + if (distanceToLight > 0.0f) + { + toLight /= distanceToLight; + dot = toLight * norm; + } // Clamp dot to zero. if (dot < 0.0f) dot = 0.0f; @@ -292,10 +297,9 @@ void Lighter::Light(float colorOut0[4], float colorOut1[4], const float colorIn[ dot = powf(dot, specCoef_); float lightScale = 1.0f; - float distance = toLight.Normalize(); if (type != GE_LIGHTTYPE_DIRECTIONAL) { - lightScale = 1.0f / (gstate_c.lightatt[l][0] + gstate_c.lightatt[l][1]*distance + gstate_c.lightatt[l][2]*distance*distance); + lightScale = 1.0f / (gstate_c.lightatt[l][0] + gstate_c.lightatt[l][1]*distanceToLight + gstate_c.lightatt[l][2]*distanceToLight*distanceToLight); if (lightScale > 1.0f) lightScale = 1.0f; } diff --git a/GPU/GLES/VertexDecoder.cpp b/GPU/GLES/VertexDecoder.cpp index 8bfc77a451af..6e68bdec48ed 100644 --- a/GPU/GLES/VertexDecoder.cpp +++ b/GPU/GLES/VertexDecoder.cpp @@ -144,18 +144,16 @@ void VertexDecoder::Step_WeightsFloat() const void VertexDecoder::Step_TcU8() const { - u8 *uv = (u8*)(decoded_ + decFmt.uvoff); - const u8 *uvdata = (const u8*)(ptr_ + tcoff); - uv[0] = uvdata[0]; - uv[1] = uvdata[1]; + u16 *uv = (u16*)(decoded_ + decFmt.uvoff); + const u16 *uvdata = (const u16*)(ptr_ + tcoff); + *uv = *uvdata; } void VertexDecoder::Step_TcU16() const { - u16 *uv = (u16 *)(decoded_ + decFmt.uvoff); - const u16 *uvdata = (const u16*)(ptr_ + tcoff); - uv[0] = uvdata[0]; - uv[1] = uvdata[1]; + u32 *uv = (u32 *)(decoded_ + decFmt.uvoff); + const u32 *uvdata = (const u32*)(ptr_ + tcoff); + *uv = *uvdata; } void VertexDecoder::Step_TcU16Through() const @@ -305,7 +303,7 @@ void VertexDecoder::Step_NormalS16() const xorval = 0xFFFF; const s16 *sv = (const s16*)(ptr_ + nrmoff); for (int j = 0; j < 3; j++) - normal[j] = sv[j] ^ xorval ; + normal[j] = sv[j] ^ xorval; normal[3] = 0; } @@ -330,9 +328,10 @@ void VertexDecoder::Step_NormalS8Morph() const if (gstate.reversenormals & 1) { multiplier = -multiplier; } - const s8 *sv = (const s8*)(ptr_ + onesize_*n + nrmoff); + const s8 *bv = (const s8*)(ptr_ + onesize_*n + nrmoff); + multiplier *= (1.0f/127.0f); for (int j = 0; j < 3; j++) - normal[j] += (sv[j]/32767.0f) * multiplier; + normal[j] += bv[j] * multiplier; } } @@ -346,9 +345,10 @@ void VertexDecoder::Step_NormalS16Morph() const if (gstate.reversenormals & 1) { multiplier = -multiplier; } - const float *fv = (const float*)(ptr_ + onesize_*n + nrmoff); + const s16 *sv = (const s16 *)(ptr_ + onesize_*n + nrmoff); + multiplier *= (1.0f/32767.f); for (int j = 0; j < 3; j++) - normal[j] += fv[j] * multiplier; + normal[j] += sv[j] * multiplier; } } @@ -425,9 +425,10 @@ void VertexDecoder::Step_PosS8Morph() const float *v = (float *)(decoded_ + decFmt.posoff); memset(v, 0, sizeof(float) * 3); for (int n = 0; n < morphcount; n++) { + float multiplier = 1.0f / 127.0f; const s8 *sv = (const s8*)(ptr_ + onesize_*n + posoff); for (int j = 0; j < 3; j++) - v[j] += (sv[j] / 127.f) * gstate_c.morphWeights[n]; + v[j] += (float)sv[j] * (multiplier * gstate_c.morphWeights[n]); } } @@ -437,9 +438,9 @@ void VertexDecoder::Step_PosS16Morph() const memset(v, 0, sizeof(float) * 3); for (int n = 0; n < morphcount; n++) { float multiplier = 1.0f / 32767.0f; - const short *sv = (const short*)(ptr_ + onesize_*n + posoff); + const s16 *sv = (const s16*)(ptr_ + onesize_*n + posoff); for (int j = 0; j < 3; j++) - v[j] += (sv[j] * multiplier) * gstate_c.morphWeights[n]; + v[j] += (float)sv[j] * (multiplier * gstate_c.morphWeights[n]); } } From 23cddab1d7a4ff911513725e25555765a5164fa7 Mon Sep 17 00:00:00 2001 From: Henrik Rydgard Date: Fri, 15 Feb 2013 22:38:28 +0100 Subject: [PATCH 012/347] Some mostly disabled armjit VFPU stuff. --- Core/MIPS/ARM/ArmAsm.cpp | 2 +- Core/MIPS/ARM/ArmCompVFPU.cpp | 58 ++++++++++++++++++++++++++++++++ Core/MIPS/ARM/ArmJit.cpp | 35 +++++++++++++++++++ Core/MIPS/ARM/ArmJit.h | 49 +++++++++++++++++++++++++++ Core/MIPS/ARM/ArmRegCacheFPU.cpp | 34 ++++++++++++++++++- Core/MIPS/ARM/ArmRegCacheFPU.h | 17 +++++++++- 6 files changed, 192 insertions(+), 3 deletions(-) diff --git a/Core/MIPS/ARM/ArmAsm.cpp b/Core/MIPS/ARM/ArmAsm.cpp index 57c9d37fd4e3..95be71b9e567 100644 --- a/Core/MIPS/ARM/ArmAsm.cpp +++ b/Core/MIPS/ARM/ArmAsm.cpp @@ -165,7 +165,7 @@ void Jit::GenerateFixedCode() SetCC(CC_EQ); // IDEA - we have 26 bits, why not just use offsets from base of code? // Another idea: Shift the bloc number left by two in the op, this would let us do - // LDR(R0, R9, R0, true, true); here, replacing the two next instructions. + // LDR(R0, R9, R0, true, true); here, replacing the next instructions. ADD(R0, R9, Operand2(2, ST_LSL, R0)); LDR(R0, R0); B(R0); diff --git a/Core/MIPS/ARM/ArmCompVFPU.cpp b/Core/MIPS/ARM/ArmCompVFPU.cpp index 34bfa0802955..fab447c74d11 100644 --- a/Core/MIPS/ARM/ArmCompVFPU.cpp +++ b/Core/MIPS/ARM/ArmCompVFPU.cpp @@ -23,11 +23,69 @@ namespace MIPSComp void Jit::Comp_VPFX(u32 op) { DISABLE; + + int data = op & 0xFFFFF; + int regnum = (op >> 24) & 3; + switch (regnum) { + case 0: // S + js.prefixS = data; + js.prefixSFlag = ArmJitState::PREFIX_KNOWN_DIRTY; + break; + case 1: // T + js.prefixT = data; + js.prefixTFlag = ArmJitState::PREFIX_KNOWN_DIRTY; + break; + case 2: // D + js.prefixD = data; + js.prefixDFlag = ArmJitState::PREFIX_KNOWN_DIRTY; + break; + } } void Jit::Comp_SVQ(u32 op) { DISABLE; + + int imm = (signed short)(op&0xFFFC); + int vt = (((op >> 16) & 0x1f)) | ((op&1) << 5); + int rs = _RS; + + switch (op >> 26) + { + case 54: //lv.q + { + gpr.MapReg(rs); + SetR0ToEffectiveAddress(rs, imm); + u8 vregs[4]; + GetVectorRegs(vregs, V_Quad, vt); + fpr.MapRegsV(vregs, V_Quad, MAP_DIRTY | MAP_NOINIT); + fpr.ReleaseSpillLocks(); + // Just copy 4 words the easiest way while not wasting registers. + for (int i = 0; i < 4; i++) + VLDR(fpr.V(vregs[i]), R0, i * 4); + } + break; + + case 62: //sv.q + { + gpr.MapReg(rs); + SetR0ToEffectiveAddress(rs, imm); + + u8 vregs[4]; + GetVectorRegs(vregs, V_Quad, vt); + // Even if we don't use real SIMD there's still 8 or 16 scalar float registers. + fpr.MapRegsV(vregs, V_Quad, 0); + fpr.ReleaseSpillLocks(); + // Just copy 4 words the easiest way while not wasting registers. + for (int i = 0; i < 4; i++) + VSTR(fpr.V(vregs[i]), R0, i * 4); + } + break; + + default: + DISABLE; + break; + } } void Jit::Comp_VDot(u32 op) diff --git a/Core/MIPS/ARM/ArmJit.cpp b/Core/MIPS/ARM/ArmJit.cpp index ebef19109789..effffda4b7da 100644 --- a/Core/MIPS/ARM/ArmJit.cpp +++ b/Core/MIPS/ARM/ArmJit.cpp @@ -67,6 +67,41 @@ void Jit::FlushAll() { gpr.FlushAll(); fpr.FlushAll(); + FlushPrefixV(); +} + +void Jit::FlushPrefixV() +{ + return; + + if ((js.prefixSFlag & ArmJitState::PREFIX_DIRTY) != 0) + { + MOVI2R(R0, js.prefixS); + STR(CTXREG, R0, offsetof(MIPSState, vfpuCtrl[VFPU_CTRL_SPREFIX])); + js.prefixSFlag = (ArmJitState::PrefixState) (js.prefixSFlag & ~ArmJitState::PREFIX_DIRTY); + } + + if ((js.prefixTFlag & ArmJitState::PREFIX_DIRTY) != 0) + { + MOVI2R(R0, js.prefixT); + STR(CTXREG, R0, offsetof(MIPSState, vfpuCtrl[VFPU_CTRL_TPREFIX])); + js.prefixTFlag = (ArmJitState::PrefixState) (js.prefixTFlag & ~ArmJitState::PREFIX_DIRTY); + } + + if ((js.prefixDFlag & ArmJitState::PREFIX_DIRTY) != 0) + { + MOVI2R(R0, js.prefixD); + STR(CTXREG, R0, offsetof(MIPSState, vfpuCtrl[VFPU_CTRL_DPREFIX])); + //MOV(32, M((void *)&mips_->vfpuCtrl[VFPU_CTRL_DPREFIX]), Imm32(js.prefixD)); + // TODO: + /* + _dbg_assert_msg_(JIT, sizeof(bool) <= 4, "Bools shouldn't be that big?"); + const size_t bool_stride = 4 / sizeof(bool); + for (size_t i = 0; i < ARRAY_SIZE(mips_->vfpuWriteMask); i += bool_stride) + MOV(32, M((void *)&mips_->vfpuWriteMask[i]), Imm32(*(u32 *)&js.writeMask[i])); + */ + js.prefixDFlag = (ArmJitState::PrefixState) (js.prefixDFlag & ~ArmJitState::PREFIX_DIRTY); + } } void Jit::ClearCache() diff --git a/Core/MIPS/ARM/ArmJit.h b/Core/MIPS/ARM/ArmJit.h index 4bca7b11408a..b7a5aebe9aee 100644 --- a/Core/MIPS/ARM/ArmJit.h +++ b/Core/MIPS/ARM/ArmJit.h @@ -39,6 +39,14 @@ struct ArmJitOptions struct ArmJitState { + enum PrefixState + { + PREFIX_UNKNOWN = 0x00, + PREFIX_KNOWN = 0x01, + PREFIX_DIRTY = 0x10, + PREFIX_KNOWN_DIRTY = 0x11, + }; + u32 compilerPC; u32 blockStart; bool cancel; @@ -46,6 +54,46 @@ struct ArmJitState int downcountAmount; bool compiling; // TODO: get rid of this in favor of using analysis results to determine end of block ArmJitBlock *curBlock; + + // VFPU prefix magic + u32 prefixS; + u32 prefixT; + u32 prefixD; + bool writeMask[4]; + PrefixState prefixSFlag; + PrefixState prefixTFlag; + PrefixState prefixDFlag; + void PrefixStart() { + prefixSFlag = PREFIX_UNKNOWN; + prefixTFlag = PREFIX_UNKNOWN; + prefixDFlag = PREFIX_UNKNOWN; + } + bool MayHavePrefix() const { + if (!(prefixSFlag & PREFIX_KNOWN) || !(prefixTFlag & PREFIX_KNOWN) || !(prefixDFlag & PREFIX_KNOWN)) { + return true; + } else if (prefixS != 0xE4 || prefixT != 0xE4 || prefixD != 0) { + return true; + } else if (writeMask[0] || writeMask[1] || writeMask[2] || writeMask[3]) { + return true; + } + + return false; + } + void EatPrefix() { + if ((prefixSFlag & PREFIX_KNOWN) == 0 || prefixS != 0xE4) { + prefixSFlag = PREFIX_KNOWN_DIRTY; + prefixS = 0xE4; + } + if ((prefixTFlag & PREFIX_KNOWN) == 0 || prefixT != 0xE4) { + prefixTFlag = PREFIX_KNOWN_DIRTY; + prefixT = 0xE4; + } + if ((prefixDFlag & PREFIX_KNOWN) == 0 || prefixD != 0x0 || writeMask[0] || writeMask[1] || writeMask[2] || writeMask[3]) { + prefixDFlag = PREFIX_KNOWN_DIRTY; + prefixD = 0x0; + writeMask[0] = writeMask[1] = writeMask[2] = writeMask[3] = false; + } + } }; @@ -123,6 +171,7 @@ class Jit : public ArmGen::ARMXCodeBlock private: void GenerateFixedCode(); void FlushAll(); + void FlushPrefixV(); void WriteDownCount(int offset = 0); void MovFromPC(ARMReg r); diff --git a/Core/MIPS/ARM/ArmRegCacheFPU.cpp b/Core/MIPS/ARM/ArmRegCacheFPU.cpp index e59f1f417a1f..61d047b7c298 100644 --- a/Core/MIPS/ARM/ArmRegCacheFPU.cpp +++ b/Core/MIPS/ARM/ArmRegCacheFPU.cpp @@ -22,7 +22,7 @@ using namespace ArmGen; -ArmRegCacheFPU::ArmRegCacheFPU(MIPSState *mips) : mips_(mips) { +ArmRegCacheFPU::ArmRegCacheFPU(MIPSState *mips) : mips_(mips), vr(mr + 32) { } void ArmRegCacheFPU::Init(ARMXEmitter *emitter) { @@ -138,6 +138,38 @@ void ArmRegCacheFPU::MapDirtyInIn(MIPSReg rd, MIPSReg rs, MIPSReg rt, bool avoid ReleaseSpillLocks(); } +void ArmRegCacheFPU::SpillLockV(const u8 *v, VectorSize sz) { + for (int i = 0; i < GetNumVectorElements(sz); i++) { + vr[v[i]].spillLock = true; + } +} + +void ArmRegCacheFPU::SpillLockV(int vec, VectorSize sz) { + u8 v[4]; + GetVectorRegs(v, sz, vec); + SpillLockV(v, sz); +} + +void ArmRegCacheFPU::MapRegV(int vreg, int flags) { + MapReg(vreg + 32, flags); +} + +void ArmRegCacheFPU::MapRegsV(int vec, VectorSize sz, int flags) { + u8 v[4]; + GetVectorRegs(v, sz, vec); + SpillLockV(v, sz); + for (int i = 0; i < GetNumVectorElements(sz); i++) { + MapRegV(v[i], flags); + } +} + +void ArmRegCacheFPU::MapRegsV(const u8 *v, VectorSize sz, int flags) { + SpillLockV(v, sz); + for (int i = 0; i < GetNumVectorElements(sz); i++) { + MapRegV(v[i], flags); + } +} + void ArmRegCacheFPU::FlushArmReg(ARMReg r) { int reg = r - S0; if (ar[reg].mipsReg == -1) { diff --git a/Core/MIPS/ARM/ArmRegCacheFPU.h b/Core/MIPS/ARM/ArmRegCacheFPU.h index 31a76eaf6d63..d0fca1252199 100644 --- a/Core/MIPS/ARM/ArmRegCacheFPU.h +++ b/Core/MIPS/ARM/ArmRegCacheFPU.h @@ -23,6 +23,7 @@ #include "../MIPSAnalyst.h" #include "Common/ArmEmitter.h" #include "Core/MIPS/ARM/ArmRegCache.h" +#include "Core/MIPS/MIPSVFPUUtils.h" using namespace ArmGen; @@ -75,6 +76,19 @@ class ArmRegCacheFPU void FlushAll(); ARMReg R(int preg); // Returns a cached register + + // VFPU registers + + ARMReg V(int vreg) { return R(vreg + 32); } + + void MapRegV(int vreg, int flags); + + // NOTE: These require you to release spill locks manually! + void MapRegsV(int vec, VectorSize vsz, int flags); + void MapRegsV(const u8 *v, VectorSize vsz, int flags); + + void SpillLockV(const u8 *v, VectorSize vsz); + void SpillLockV(int vec, VectorSize vsz); void SetEmitter(ARMXEmitter *emitter) { emit = emitter; } @@ -86,7 +100,7 @@ class ArmRegCacheFPU return GetMipsRegOffset(r + 32); } - private: +private: MIPSState *mips_; ARMXEmitter *emit; u32 compilerPC_; @@ -98,4 +112,5 @@ class ArmRegCacheFPU RegARM ar[NUM_ARMFPUREG]; RegMIPS mr[NUM_MIPSFPUREG]; + RegMIPS *vr; }; From d22e25894311ed4754feb69d08b3376adb82f4f3 Mon Sep 17 00:00:00 2001 From: Henrik Rydgard Date: Fri, 15 Feb 2013 22:56:38 +0100 Subject: [PATCH 013/347] Don't need separate variables for writemask. Some optimizations. --- Core/HLE/sceChnnlsv.cpp | 2 +- Core/MIPS/MIPS.cpp | 10 ------- Core/MIPS/MIPS.h | 9 ++++-- Core/MIPS/MIPSIntVFPU.cpp | 3 -- Core/MIPS/MIPSVFPUUtils.cpp | 56 +++++++++++++++++++++---------------- Core/MIPS/x86/Jit.cpp | 6 ---- 6 files changed, 40 insertions(+), 46 deletions(-) diff --git a/Core/HLE/sceChnnlsv.cpp b/Core/HLE/sceChnnlsv.cpp index e5dd66b68151..27c583819e8e 100644 --- a/Core/HLE/sceChnnlsv.cpp +++ b/Core/HLE/sceChnnlsv.cpp @@ -760,7 +760,7 @@ int sceSdSetMember_(pspChnnlsvContext2& ctx, u8* data, int alignedLen) { return 0; } - if (alignedLen & 0xF != 0) + if ((alignedLen & 0xF) != 0) { return -1025; } diff --git a/Core/MIPS/MIPS.cpp b/Core/MIPS/MIPS.cpp index b751f5ba4a26..7fbaa7c97409 100644 --- a/Core/MIPS/MIPS.cpp +++ b/Core/MIPS/MIPS.cpp @@ -79,9 +79,6 @@ void MIPSState::Reset() vfpuCtrl[VFPU_CTRL_RCX6] = 0x3f800000; vfpuCtrl[VFPU_CTRL_RCX7] = 0x3f800000; - bool b[4] = {false, false, false, false}; - SetWriteMask(b); - pc = 0; hi = 0; lo = 0; @@ -115,7 +112,6 @@ void MIPSState::DoState(PointerWrap &p) p.DoArray(f, sizeof(f) / sizeof(f[0])); p.DoArray(v, sizeof(v) / sizeof(v[0])); p.DoArray(vfpuCtrl, sizeof(vfpuCtrl) / sizeof(vfpuCtrl[0])); - p.DoArray(vfpuWriteMask, sizeof(vfpuWriteMask) / sizeof(vfpuWriteMask[0])); p.Do(pc); p.Do(nextPC); p.Do(downcount); @@ -131,12 +127,6 @@ void MIPSState::DoState(PointerWrap &p) p.DoMarker("MIPSState"); } -void MIPSState::SetWriteMask(const bool wm[4]) -{ - for (int i = 0; i < 4; i++) - vfpuWriteMask[i] = wm[i]; -} - void MIPSState::SingleStep() { int cycles = MIPS_SingleStep(); diff --git a/Core/MIPS/MIPS.h b/Core/MIPS/MIPS.h index ad0d51cfa67d..30f9c616f04c 100644 --- a/Core/MIPS/MIPS.h +++ b/Core/MIPS/MIPS.h @@ -120,7 +120,6 @@ class MIPSState float f[32]; float v[128]; u32 vfpuCtrl[16]; - bool vfpuWriteMask[4]; u32 pc; u32 nextPC; @@ -144,7 +143,13 @@ class MIPSState void WriteFCR(int reg, int value); u32 ReadFCR(int reg); - void SetWriteMask(const bool wm[4]); + + u8 VfpuWriteMask() const { + return (vfpuCtrl[VFPU_CTRL_DPREFIX] >> 8) & 0xF; + } + bool VfpuWriteMask(int i) const { + return (vfpuCtrl[VFPU_CTRL_DPREFIX] >> (8 + i)) & 1; + } void Irq(); void SWI(); diff --git a/Core/MIPS/MIPSIntVFPU.cpp b/Core/MIPS/MIPSIntVFPU.cpp index edfa630ec36a..e770fc63b236 100644 --- a/Core/MIPS/MIPSIntVFPU.cpp +++ b/Core/MIPS/MIPSIntVFPU.cpp @@ -159,7 +159,6 @@ void ApplyPrefixD(float *v, VectorSize size, bool onlyWriteMask = false) } } } - currentMIPS->SetWriteMask(writeMask); } void EatPrefixes() @@ -167,8 +166,6 @@ void EatPrefixes() currentMIPS->vfpuCtrl[VFPU_CTRL_SPREFIX] = 0xe4; // passthru currentMIPS->vfpuCtrl[VFPU_CTRL_TPREFIX] = 0xe4; // passthru currentMIPS->vfpuCtrl[VFPU_CTRL_DPREFIX] = 0; - static const bool noWriteMask[4] = {false, false, false, false}; - currentMIPS->SetWriteMask(noWriteMask); } namespace MIPSInt diff --git a/Core/MIPS/MIPSVFPUUtils.cpp b/Core/MIPS/MIPSVFPUUtils.cpp index 7ba55a120a71..63881762a346 100644 --- a/Core/MIPS/MIPSVFPUUtils.cpp +++ b/Core/MIPS/MIPSVFPUUtils.cpp @@ -89,23 +89,20 @@ void ReadVector(float *rd, VectorSize size, int reg) int length = 0; int transpose = (reg>>5) & 1; - switch (size) - { + switch (size) { case V_Single: transpose = 0; row=(reg>>5)&3; length = 1; break; case V_Pair: row=(reg>>5)&2; length = 2; break; case V_Triple: row=(reg>>6)&1; length = 3; break; case V_Quad: row=(reg>>5)&2; length = 4; break; } - for (int i = 0; i < length; i++) - { - int index = mtx * 4; - if (transpose) - index += ((row+i)&3) + col*32; - else - index += col + ((row+i)&3)*32; - rd[i] = V(index); - } + if (transpose) { + for (int i = 0; i < length; i++) + rd[i] = V(mtx * 4 + ((row+i)&3) + col*32); + } else { + for (int i = 0; i < length; i++) + rd[i] = V(mtx * 4 + col + ((row+i)&3)*32); + } } void WriteVector(const float *rd, VectorSize size, int reg) @@ -124,18 +121,28 @@ void WriteVector(const float *rd, VectorSize size, int reg) case V_Quad: row=(reg>>5)&2; length = 4; break; } - for (int i = 0; i < length; i++) - { - if (!currentMIPS->vfpuWriteMask[i]) - { - int index = mtx * 4; - if (transpose) - index += ((row+i)&3) + col*32; - else - index += col + ((row+i)&3)*32; - V(index) = rd[i]; - } - } + if (currentMIPS->VfpuWriteMask() == 0) { + if (transpose) { + for (int i = 0; i < length; i++) + V(mtx * 4 + ((row+i)&3) + col*32) = rd[i]; + } else { + for (int i = 0; i < length; i++) + V(mtx * 4 + col + ((row+i)&3)*32) = rd[i]; + } + } else { + for (int i = 0; i < length; i++) + { + if (!currentMIPS->VfpuWriteMask(i)) + { + int index = mtx * 4; + if (transpose) + index += ((row+i)&3) + col*32; + else + index += col + ((row+i)&3)*32; + V(index) = rd[i]; + } + } + } } void ReadMatrix(float *rd, MatrixSize size, int reg) @@ -190,7 +197,8 @@ void WriteMatrix(const float *rd, MatrixSize size, int reg) { for (int j=0; jvfpuWriteMask[i]) + // Hm, I wonder if this should affect matrices at all. + if (!currentMIPS->VfpuWriteMask(i)) { int index = mtx * 4; if (transpose) diff --git a/Core/MIPS/x86/Jit.cpp b/Core/MIPS/x86/Jit.cpp index 0a859ca2ae22..9fb2487713e0 100644 --- a/Core/MIPS/x86/Jit.cpp +++ b/Core/MIPS/x86/Jit.cpp @@ -129,12 +129,6 @@ void Jit::FlushPrefixV() if ((js.prefixDFlag & JitState::PREFIX_DIRTY) != 0) { MOV(32, M((void *)&mips_->vfpuCtrl[VFPU_CTRL_DPREFIX]), Imm32(js.prefixD)); - - _dbg_assert_msg_(JIT, sizeof(bool) <= 4, "Bools shouldn't be that big?"); - const size_t bool_stride = 4 / sizeof(bool); - for (size_t i = 0; i < ARRAY_SIZE(mips_->vfpuWriteMask); i += bool_stride) - MOV(32, M((void *)&mips_->vfpuWriteMask[i]), Imm32(*(u32 *)&js.writeMask[i])); - js.prefixDFlag = (JitState::PrefixState) (js.prefixDFlag & ~JitState::PREFIX_DIRTY); } } From 526335cacfff615d42de5bbbd265919c25128a92 Mon Sep 17 00:00:00 2001 From: Henrik Rydgard Date: Fri, 15 Feb 2013 23:09:02 +0100 Subject: [PATCH 014/347] VFPUutil style & simplification --- Core/MIPS/MIPSVFPUUtils.cpp | 66 +++++++++++++++---------------------- 1 file changed, 26 insertions(+), 40 deletions(-) diff --git a/Core/MIPS/MIPSVFPUUtils.cpp b/Core/MIPS/MIPSVFPUUtils.cpp index 63881762a346..fd94a6cf0234 100644 --- a/Core/MIPS/MIPSVFPUUtils.cpp +++ b/Core/MIPS/MIPSVFPUUtils.cpp @@ -32,16 +32,14 @@ void GetVectorRegs(u8 regs[4], VectorSize N, int vectorReg) { int length = 0; int transpose = (vectorReg>>5) & 1; - switch (N) - { + switch (N) { case V_Single: transpose = 0; row=(vectorReg>>5)&3; length = 1; break; case V_Pair: row=(vectorReg>>5)&2; length = 2; break; case V_Triple: row=(vectorReg>>6)&1; length = 3; break; case V_Quad: row=(vectorReg>>5)&2; length = 4; break; } - for (int i = 0; i < length; i++) - { + for (int i = 0; i < length; i++) { int index = mtx * 4; if (transpose) index += ((row+i)&3) + col*32; @@ -58,8 +56,7 @@ void GetMatrixRegs(u8 regs[16], MatrixSize N, int matrixReg) { int row = 0; int side = 0; - switch (N) - { + switch (N) { case M_2x2: row = (matrixReg>>5)&2; side = 2; break; case M_3x3: row = (matrixReg>>6)&1; side = 3; break; case M_4x4: row = (matrixReg>>5)&2; side = 4; break; @@ -67,10 +64,8 @@ void GetMatrixRegs(u8 regs[16], MatrixSize N, int matrixReg) { int transpose = (matrixReg>>5) & 1; - for (int i = 0; i < side; i++) - { - for (int j = 0; j < side; j++) - { + for (int i = 0; i < side; i++) { + for (int j = 0; j < side; j++) { int index = mtx * 4; if (transpose) index += ((row+i)&3) + ((col+j)&3)*32; @@ -81,8 +76,7 @@ void GetMatrixRegs(u8 regs[16], MatrixSize N, int matrixReg) { } } -void ReadVector(float *rd, VectorSize size, int reg) -{ +void ReadVector(float *rd, VectorSize size, int reg) { int mtx = (reg >> 2) & 7; int col = reg & 3; int row = 0; @@ -97,24 +91,24 @@ void ReadVector(float *rd, VectorSize size, int reg) } if (transpose) { + int base = mtx * 4 + col * 32; for (int i = 0; i < length; i++) - rd[i] = V(mtx * 4 + ((row+i)&3) + col*32); + rd[i] = V(base + ((row+i)&3)); } else { + int base = mtx * 4 + col; for (int i = 0; i < length; i++) - rd[i] = V(mtx * 4 + col + ((row+i)&3)*32); + rd[i] = V(base + ((row+i)&3)*32); } } -void WriteVector(const float *rd, VectorSize size, int reg) -{ +void WriteVector(const float *rd, VectorSize size, int reg) { int mtx = (reg>>2)&7; int col = reg & 3; int row = 0; int length = 0; int transpose = (reg>>5)&1; - switch (size) - { + switch (size) { case V_Single: transpose = 0; row=(reg>>5)&3; length = 1; break; case V_Pair: row=(reg>>5)&2; length = 2; break; case V_Triple: row=(reg>>6)&1; length = 3; break; @@ -123,17 +117,17 @@ void WriteVector(const float *rd, VectorSize size, int reg) if (currentMIPS->VfpuWriteMask() == 0) { if (transpose) { + int base = mtx * 4 + col * 32; for (int i = 0; i < length; i++) - V(mtx * 4 + ((row+i)&3) + col*32) = rd[i]; + V(base + ((row+i)&3)) = rd[i]; } else { + int base = mtx * 4 + col; for (int i = 0; i < length; i++) - V(mtx * 4 + col + ((row+i)&3)*32) = rd[i]; + V(base + ((row+i)&3)*32) = rd[i]; } } else { - for (int i = 0; i < length; i++) - { - if (!currentMIPS->VfpuWriteMask(i)) - { + for (int i = 0; i < length; i++) { + if (!currentMIPS->VfpuWriteMask(i)) { int index = mtx * 4; if (transpose) index += ((row+i)&3) + col*32; @@ -145,16 +139,14 @@ void WriteVector(const float *rd, VectorSize size, int reg) } } -void ReadMatrix(float *rd, MatrixSize size, int reg) -{ +void ReadMatrix(float *rd, MatrixSize size, int reg) { int mtx = (reg >> 2) & 7; int col = reg & 3; int row = 0; int side = 0; - switch (size) - { + switch (size) { case M_2x2: row = (reg>>5)&2; side = 2; break; case M_3x3: row = (reg>>6)&1; side = 3; break; case M_4x4: row = (reg>>5)&2; side = 4; break; @@ -162,10 +154,8 @@ void ReadMatrix(float *rd, MatrixSize size, int reg) int transpose = (reg>>5) & 1; - for (int i = 0; i < side; i++) - { - for (int j = 0; j < side; j++) - { + for (int i = 0; i < side; i++) { + for (int j = 0; j < side; j++) { int index = mtx * 4; if (transpose) index += ((row+i)&3) + ((col+j)&3)*32; @@ -176,16 +166,14 @@ void ReadMatrix(float *rd, MatrixSize size, int reg) } } -void WriteMatrix(const float *rd, MatrixSize size, int reg) -{ +void WriteMatrix(const float *rd, MatrixSize size, int reg) { int mtx = (reg>>2)&7; int col = reg&3; int row = 0; int side = 0; - switch (size) - { + switch (size) { case M_2x2: row = (reg>>5)&2; side = 2; break; case M_3x3: row = (reg>>6)&1; side = 3; break; case M_4x4: row = (reg>>5)&2; side = 4; break; @@ -193,10 +181,8 @@ void WriteMatrix(const float *rd, MatrixSize size, int reg) int transpose = (reg>>5)&1; - for (int i=0; iVfpuWriteMask(i)) { From fdee111bca45037e515b3c9cdd2bf9d137df8d2f Mon Sep 17 00:00:00 2001 From: Henrik Rydgard Date: Fri, 15 Feb 2013 23:18:41 +0100 Subject: [PATCH 015/347] armjit-fpu: Compile VFPU prefix setting --- Core/MIPS/ARM/ArmCompVFPU.cpp | 2 +- Core/MIPS/ARM/ArmJit.cpp | 15 +++++---------- 2 files changed, 6 insertions(+), 11 deletions(-) diff --git a/Core/MIPS/ARM/ArmCompVFPU.cpp b/Core/MIPS/ARM/ArmCompVFPU.cpp index fab447c74d11..63e7b0185b12 100644 --- a/Core/MIPS/ARM/ArmCompVFPU.cpp +++ b/Core/MIPS/ARM/ArmCompVFPU.cpp @@ -22,7 +22,7 @@ namespace MIPSComp { void Jit::Comp_VPFX(u32 op) { - DISABLE; + CONDITIONAL_DISABLE; int data = op & 0xFFFFF; int regnum = (op >> 24) & 3; diff --git a/Core/MIPS/ARM/ArmJit.cpp b/Core/MIPS/ARM/ArmJit.cpp index effffda4b7da..2b093116752a 100644 --- a/Core/MIPS/ARM/ArmJit.cpp +++ b/Core/MIPS/ARM/ArmJit.cpp @@ -72,8 +72,6 @@ void Jit::FlushAll() void Jit::FlushPrefixV() { - return; - if ((js.prefixSFlag & ArmJitState::PREFIX_DIRTY) != 0) { MOVI2R(R0, js.prefixS); @@ -92,14 +90,6 @@ void Jit::FlushPrefixV() { MOVI2R(R0, js.prefixD); STR(CTXREG, R0, offsetof(MIPSState, vfpuCtrl[VFPU_CTRL_DPREFIX])); - //MOV(32, M((void *)&mips_->vfpuCtrl[VFPU_CTRL_DPREFIX]), Imm32(js.prefixD)); - // TODO: - /* - _dbg_assert_msg_(JIT, sizeof(bool) <= 4, "Bools shouldn't be that big?"); - const size_t bool_stride = 4 / sizeof(bool); - for (size_t i = 0; i < ARRAY_SIZE(mips_->vfpuWriteMask); i += bool_stride) - MOV(32, M((void *)&mips_->vfpuWriteMask[i]), Imm32(*(u32 *)&js.writeMask[i])); - */ js.prefixDFlag = (ArmJitState::PrefixState) (js.prefixDFlag & ~ArmJitState::PREFIX_DIRTY); } } @@ -170,6 +160,7 @@ const u8 *Jit::DoJit(u32 em_address, ArmJitBlock *b) js.curBlock = b; js.compiling = true; js.inDelaySlot = false; + js.PrefixStart(); // We add a check before the block, used when entering from a linked block. b->checkedEntry = GetCodePtr(); @@ -250,6 +241,10 @@ void Jit::Comp_Generic(u32 op) MOVI2R(R0, op); QuickCallFunction(R1, (void *)func); } + + // Might have eaten prefixes, hard to tell... + if ((MIPSGetInfo(op) & IS_VFPU) != 0) + js.PrefixStart(); } void Jit::MovFromPC(ARMReg r) { From 81589b67e582dc5e68e70460d33e5f6b28ae0679 Mon Sep 17 00:00:00 2001 From: Henrik Rydgard Date: Fri, 15 Feb 2013 23:33:35 +0100 Subject: [PATCH 016/347] Save one instruction on jal, shorten block exits by one instruction (moved to dispatcher). --- Core/MIPS/ARM/ArmAsm.cpp | 3 +++ Core/MIPS/ARM/ArmCompBranch.cpp | 9 +++------ Core/MIPS/ARM/ArmCompVFPU.cpp | 2 ++ Core/MIPS/ARM/ArmJit.cpp | 3 +-- Core/MIPS/ARM/ArmJit.h | 1 + 5 files changed, 10 insertions(+), 8 deletions(-) diff --git a/Core/MIPS/ARM/ArmAsm.cpp b/Core/MIPS/ARM/ArmAsm.cpp index 95be71b9e567..bd0c4af4aa74 100644 --- a/Core/MIPS/ARM/ArmAsm.cpp +++ b/Core/MIPS/ARM/ArmAsm.cpp @@ -140,6 +140,9 @@ void Jit::GenerateFixedCode() FixupBranch badCoreState = B_CC(CC_NEQ); FixupBranch skipToRealDispatch2 = B(); //skip the sync and compare first time + dispatcherPCInR0 = GetCodePtr(); + MovToPC(R0); + // At this point : flags = EQ. Fine for the next check, no need to jump over it. dispatcher = GetCodePtr(); diff --git a/Core/MIPS/ARM/ArmCompBranch.cpp b/Core/MIPS/ARM/ArmCompBranch.cpp index c36b6111b03a..bd5eed47c6f9 100644 --- a/Core/MIPS/ARM/ArmCompBranch.cpp +++ b/Core/MIPS/ARM/ArmCompBranch.cpp @@ -146,9 +146,8 @@ void Jit::BranchRSZeroComp(u32 op, ArmGen::CCFlags cc, bool andLink, bool likely // Take the branch if (andLink) { - ADD(R1, R10, MIPS_REG_RA * 4); // compute address of RA in ram MOVI2R(R0, js.compilerPC + 8); - STR(R1, R0); + STR(CTXREG, R0, MIPS_REG_RA * 4); } WriteExit(targetAddr, 0); @@ -340,9 +339,8 @@ void Jit::Comp_Jump(u32 op) break; case 3: //jal - ADD(R1, R10, MIPS_REG_RA * 4); // compute address of RA in ram MOVI2R(R0, js.compilerPC + 8); - STR(R1, R0); + STR(CTXREG, R0, MIPS_REG_RA * 4); WriteExit(targetAddr, 0); break; @@ -389,9 +387,8 @@ void Jit::Comp_JumpReg(u32 op) case 8: //jr break; case 9: //jalr - ADD(R1, R10, MIPS_REG_RA * 4); // compute address of RA in ram MOVI2R(R0, js.compilerPC + 8); - STR(R1, R0); + STR(CTXREG, R0, MIPS_REG_RA * 4); break; default: _dbg_assert_msg_(CPU,0,"Trying to compile instruction that can't be compiled"); diff --git a/Core/MIPS/ARM/ArmCompVFPU.cpp b/Core/MIPS/ARM/ArmCompVFPU.cpp index 63e7b0185b12..d6c378f478ad 100644 --- a/Core/MIPS/ARM/ArmCompVFPU.cpp +++ b/Core/MIPS/ARM/ArmCompVFPU.cpp @@ -68,6 +68,8 @@ namespace MIPSComp case 62: //sv.q { + DISABLE; + gpr.MapReg(rs); SetR0ToEffectiveAddress(rs, imm); diff --git a/Core/MIPS/ARM/ArmJit.cpp b/Core/MIPS/ARM/ArmJit.cpp index 2b093116752a..93aee6925306 100644 --- a/Core/MIPS/ARM/ArmJit.cpp +++ b/Core/MIPS/ARM/ArmJit.cpp @@ -293,8 +293,7 @@ void Jit::WriteExit(u32 destination, int exit_num) b->linkStatus[exit_num] = true; } else { MOVI2R(R0, destination); - MovToPC(R0); - B((const void *)dispatcher); + B((const void *)dispatcherPCInR0); } } diff --git a/Core/MIPS/ARM/ArmJit.h b/Core/MIPS/ARM/ArmJit.h index b7a5aebe9aee..9e8365ef5108 100644 --- a/Core/MIPS/ARM/ArmJit.h +++ b/Core/MIPS/ARM/ArmJit.h @@ -219,6 +219,7 @@ class Jit : public ArmGen::ARMXCodeBlock const u8 *outerLoop; const u8 *outerLoopPCInR0; const u8 *dispatcherCheckCoreState; + const u8 *dispatcherPCInR0; const u8 *dispatcher; const u8 *dispatcherNoCheck; From b8abb77eee3f924dbb77915069b458efb02f8687 Mon Sep 17 00:00:00 2001 From: Henrik Rydgard Date: Sat, 16 Feb 2013 02:06:02 +0100 Subject: [PATCH 017/347] More armjit-fpu work - dot product working for example. Add some non working DISABLEd stuff too. --- Core/HLE/sceKernelThread.cpp | 2 +- Core/MIPS/ARM/ArmAsm.cpp | 2 +- Core/MIPS/ARM/ArmCompFPU.cpp | 4 +- Core/MIPS/ARM/ArmCompVFPU.cpp | 239 +++++++++++++++++++++++++++++-- Core/MIPS/ARM/ArmRegCache.cpp | 9 +- Core/MIPS/ARM/ArmRegCache.h | 2 +- Core/MIPS/ARM/ArmRegCacheFPU.cpp | 59 ++++++-- Core/MIPS/ARM/ArmRegCacheFPU.h | 18 ++- Core/MIPS/x86/CompVFPU.cpp | 2 +- Core/MIPS/x86/RegCacheFPU.cpp | 5 + Core/MIPS/x86/RegCacheFPU.h | 1 + 11 files changed, 307 insertions(+), 36 deletions(-) diff --git a/Core/HLE/sceKernelThread.cpp b/Core/HLE/sceKernelThread.cpp index ea1f8730ef30..59a502767c5f 100644 --- a/Core/HLE/sceKernelThread.cpp +++ b/Core/HLE/sceKernelThread.cpp @@ -2802,7 +2802,7 @@ std::vector GetThreadsInfo() DebugThreadInfo info; info.id = *iter; strncpy(info.name,t->GetName(),KERNELOBJECT_MAX_NAME_LENGTH); - info.name[KERNELOBJECT_MAX_NAME_LENGTH+1] = 0; + info.name[KERNELOBJECT_MAX_NAME_LENGTH] = 0; info.status = t->nt.status; info.entrypoint = t->nt.entrypoint; info.curPC = t->context.pc; diff --git a/Core/MIPS/ARM/ArmAsm.cpp b/Core/MIPS/ARM/ArmAsm.cpp index bd0c4af4aa74..ff9b28336cfa 100644 --- a/Core/MIPS/ARM/ArmAsm.cpp +++ b/Core/MIPS/ARM/ArmAsm.cpp @@ -159,7 +159,7 @@ void Jit::GenerateFixedCode() // MOV(R0, R13); // QuickCallFunction(R1, (void *)&ShowPC); - LDR(R0, R10, offsetof(MIPSState, pc)); + LDR(R0, CTXREG, offsetof(MIPSState, pc)); BIC(R0, R0, Operand2(0xC0, 4)); // &= 0x3FFFFFFF LDR(R0, R11, R0, true, true); AND(R1, R0, Operand2(0xFC, 4)); // rotation is to the right, in 2-bit increments. diff --git a/Core/MIPS/ARM/ArmCompFPU.cpp b/Core/MIPS/ARM/ArmCompFPU.cpp index e93445be24b3..ce88687ffeac 100644 --- a/Core/MIPS/ARM/ArmCompFPU.cpp +++ b/Core/MIPS/ARM/ArmCompFPU.cpp @@ -222,7 +222,7 @@ void Jit::Comp_mxc1(u32 op) { case 0: // R(rt) = FI(fs); break; //mfc1 // Let's just go through RAM for now. - fpr.FlushMipsReg(fs); + fpr.FlushR(fs); gpr.MapReg(rt, MAP_DIRTY | MAP_NOINIT); LDR(gpr.R(rt), CTXREG, fpr.GetMipsRegOffset(fs)); return; @@ -233,7 +233,7 @@ void Jit::Comp_mxc1(u32 op) case 4: //FI(fs) = R(rt); break; //mtc1 // Let's just go through RAM for now. - gpr.FlushMipsReg(rt); + gpr.FlushR(rt); fpr.MapReg(fs, MAP_DIRTY | MAP_NOINIT); VLDR(fpr.R(fs), CTXREG, gpr.GetMipsRegOffset(rt)); return; diff --git a/Core/MIPS/ARM/ArmCompVFPU.cpp b/Core/MIPS/ARM/ArmCompVFPU.cpp index d6c378f478ad..f0085979d49c 100644 --- a/Core/MIPS/ARM/ArmCompVFPU.cpp +++ b/Core/MIPS/ARM/ArmCompVFPU.cpp @@ -42,9 +42,46 @@ namespace MIPSComp } } + void Jit::Comp_SV(u32 op) { + CONDITIONAL_DISABLE; + + s32 imm = (signed short)(op&0xFFFC); + int vt = ((op >> 16) & 0x1f) | ((op & 3) << 5); + int rs = _RS; + + switch (op >> 26) + { + case 50: //lv.s // VI(vt) = Memory::Read_U32(addr); + { + gpr.MapReg(rs); + SetR0ToEffectiveAddress(rs, imm); + ADD(R0, R0, R11); + fpr.MapRegV(vt, MAP_DIRTY | MAP_NOINIT); + fpr.ReleaseSpillLocks(); + VLDR(fpr.V(vt), R0, 0); + } + break; + + case 58: //sv.s // Memory::Write_U32(VI(vt), addr); + { + gpr.MapReg(rs); + SetR0ToEffectiveAddress(rs, imm); + ADD(R0, R0, R11); + fpr.MapRegV(vt); + fpr.ReleaseSpillLocks(); + VSTR(fpr.V(vt), R0, 0); + } + break; + + + default: + DISABLE; + } + } + void Jit::Comp_SVQ(u32 op) { - DISABLE; + CONDITIONAL_DISABLE; int imm = (signed short)(op&0xFFFC); int vt = (((op >> 16) & 0x1f)) | ((op&1) << 5); @@ -56,11 +93,12 @@ namespace MIPSComp { gpr.MapReg(rs); SetR0ToEffectiveAddress(rs, imm); + ADD(R0, R0, R11); + u8 vregs[4]; GetVectorRegs(vregs, V_Quad, vt); fpr.MapRegsV(vregs, V_Quad, MAP_DIRTY | MAP_NOINIT); fpr.ReleaseSpillLocks(); - // Just copy 4 words the easiest way while not wasting registers. for (int i = 0; i < 4; i++) VLDR(fpr.V(vregs[i]), R0, i * 4); } @@ -68,17 +106,14 @@ namespace MIPSComp case 62: //sv.q { - DISABLE; - gpr.MapReg(rs); SetR0ToEffectiveAddress(rs, imm); + ADD(R0, R0, R11); u8 vregs[4]; GetVectorRegs(vregs, V_Quad, vt); - // Even if we don't use real SIMD there's still 8 or 16 scalar float registers. fpr.MapRegsV(vregs, V_Quad, 0); fpr.ReleaseSpillLocks(); - // Just copy 4 words the easiest way while not wasting registers. for (int i = 0; i < 4; i++) VSTR(fpr.V(vregs[i]), R0, i * 4); } @@ -92,25 +127,205 @@ namespace MIPSComp void Jit::Comp_VDot(u32 op) { - DISABLE; + // DISABLE; + CONDITIONAL_DISABLE; + // WARNING: No prefix support! + if (js.MayHavePrefix()) { + Comp_Generic(op); + js.EatPrefix(); + return; + } + + int vd = _VD; + int vs = _VS; + int vt = _VT; + VectorSize sz = GetVecSize(op); + + // TODO: Force read one of them into regs? probably not. + u8 sregs[4], tregs[4]; + GetVectorRegs(sregs, sz, vs); + GetVectorRegs(tregs, sz, vt); + + // TODO: applyprefixST here somehow (shuffle, etc...) + fpr.MapRegsV(sregs, sz, 0); + fpr.MapRegsV(tregs, sz, 0); + VMUL(S0, fpr.V(sregs[0]), fpr.V(tregs[0])); + + int n = GetNumVectorElements(sz); + for (int i = 1; i < n; i++) + { + // sum += s[i]*t[i]; + VMUL(S1, fpr.V(sregs[i]), fpr.V(tregs[i])); + VADD(S0, S0, S1); + } + fpr.ReleaseSpillLocks(); + + fpr.MapRegV(vd, MAP_NOINIT | MAP_DIRTY); + + // TODO: applyprefixD here somehow (write mask etc..) + VMOV(fpr.V(vd), S0); + + fpr.ReleaseSpillLocks(); + + js.EatPrefix(); } void Jit::Comp_VecDo3(u32 op) { - DISABLE; + DISABLE; // Still buggy + + // WARNING: No prefix support! + if (js.MayHavePrefix()) + { + Comp_Generic(op); + js.EatPrefix(); + return; + } + + int vd = _VD; + int vs = _VS; + int vt = _VT; + VectorSize sz = GetVecSize(op); + + u8 sregs[4], tregs[4], dregs[4]; + GetVectorRegs(sregs, sz, vs); + GetVectorRegs(tregs, sz, vt); + GetVectorRegs(dregs, sz, vd); + + void (ARMXEmitter::*triop)(ARMReg, ARMReg, ARMReg) = NULL; + switch (op >> 26) + { + case 24: //VFPU0 + switch ((op >> 23)&7) + { + case 0: // d[i] = s[i] + t[i]; break; //vadd + triop = &ARMXEmitter::VADD; + break; + case 1: // d[i] = s[i] - t[i]; break; //vsub + triop = &ARMXEmitter::VSUB; + break; + case 7: // d[i] = s[i] / t[i]; break; //vdiv + triop = &ARMXEmitter::VDIV; + break; + } + break; + case 25: //VFPU1 + switch ((op >> 23)&7) + { + case 0: // d[i] = s[i] * t[i]; break; //vmul + triop = &ARMXEmitter::VMUL; + break; + } + break; + } + + if (triop == NULL) + { + Comp_Generic(op); + js.EatPrefix(); + return; + } + + int n = GetNumVectorElements(sz); + fpr.MapRegsV(sregs, sz, 0); + fpr.MapRegsV(tregs, sz, 0); + fpr.MapReg(TEMP1); + fpr.MapReg(TEMP2); + fpr.MapReg(TEMP3); + + for (int i = 0; i < n; ++i) { + fpr.MapReg(TEMP0 + i); + (this->*triop)(fpr.R(TEMP0 + i), fpr.V(sregs[i]), fpr.V(tregs[i])); + fpr.ReleaseSpillLock(sregs[i]); + fpr.ReleaseSpillLock(tregs[i]); + } + fpr.MapRegsV(dregs, sz, MAP_DIRTY | MAP_NOINIT); + // TODO: Can avoid this when no overlap + for (int i = 0; i < n; i++) { + VMOV(fpr.V(dregs[i]), fpr.R(TEMP0 + i)); + } + fpr.ReleaseSpillLocks(); + + js.EatPrefix(); } void Jit::Comp_Mftv(u32 op) { - DISABLE; - } + // DISABLE; + CONDITIONAL_DISABLE; - void Jit::Comp_SV(u32 op) { - DISABLE; + int imm = op & 0xFF; + int rt = _RT; + switch ((op >> 21) & 0x1f) + { + case 3: //mfv / mfvc + // rt = 0, imm = 255 appears to be used as a CPU interlock by some games. + if (rt != 0) { + if (imm < 128) { //R(rt) = VI(imm); + fpr.FlushV(imm); + gpr.MapReg(rt, MAP_NOINIT | MAP_DIRTY); + LDR(gpr.R(rt), CTXREG, fpr.GetMipsRegOffsetV(imm)); + } else if (imm < 128 + VFPU_CTRL_MAX) { //mtvc + DISABLE; + // In case we have a saved prefix. + //FlushPrefixV(); + //gpr.BindToRegister(rt, false, true); + //MOV(32, gpr.R(rt), M(¤tMIPS->vfpuCtrl[imm - 128])); + } else { + //ERROR - maybe need to make this value too an "interlock" value? + _dbg_assert_msg_(CPU,0,"mfv - invalid register"); + } + } + break; + + case 7: //mtv + if (imm < 128) { + gpr.FlushR(rt); + fpr.MapRegV(imm, MAP_DIRTY | MAP_NOINIT); + VLDR(fpr.V(imm), CTXREG, gpr.GetMipsRegOffset(rt)); + } else if (imm < 128 + VFPU_CTRL_MAX) { //mtvc //currentMIPS->vfpuCtrl[imm - 128] = R(rt); + DISABLE; + //gpr.BindToRegister(rt, true, false); + //MOV(32, M(¤tMIPS->vfpuCtrl[imm - 128]), gpr.R(rt)); + + // TODO: Optimization if rt is Imm? + //if (imm - 128 == VFPU_CTRL_SPREFIX) { + //js.prefixSFlag = JitState::PREFIX_UNKNOWN; + //} else if (imm - 128 == VFPU_CTRL_TPREFIX) { + // js.prefixTFlag = JitState::PREFIX_UNKNOWN; + //} else if (imm - 128 == VFPU_CTRL_DPREFIX) { + // js.prefixDFlag = JitState::PREFIX_UNKNOWN; + //} + } else { + //ERROR + _dbg_assert_msg_(CPU,0,"mtv - invalid register"); + } + break; + + default: + DISABLE; + } } void Jit::Comp_Vmtvc(u32 op) { DISABLE; + + int vs = _VS; + int imm = op & 0xFF; + if (imm >= 128 && imm < 128 + VFPU_CTRL_MAX) { + fpr.MapRegV(vs, 0); + ADD(R0, CTXREG, offsetof(MIPSState, vfpuCtrl[0]) + (imm - 128) * 4); + VSTR(fpr.V(vs), R0, 0); + fpr.ReleaseSpillLocks(); + + if (imm - 128 == VFPU_CTRL_SPREFIX) { + js.prefixSFlag = ArmJitState::PREFIX_UNKNOWN; + } else if (imm - 128 == VFPU_CTRL_TPREFIX) { + js.prefixTFlag = ArmJitState::PREFIX_UNKNOWN; + } else if (imm - 128 == VFPU_CTRL_DPREFIX) { + js.prefixDFlag = ArmJitState::PREFIX_UNKNOWN; + } + } } } diff --git a/Core/MIPS/ARM/ArmRegCache.cpp b/Core/MIPS/ARM/ArmRegCache.cpp index 8ea9a1b5e416..cba6b85743f4 100644 --- a/Core/MIPS/ARM/ArmRegCache.cpp +++ b/Core/MIPS/ARM/ArmRegCache.cpp @@ -180,12 +180,7 @@ void ArmRegCache::FlushArmReg(ARMReg r) { ar[r].mipsReg = -1; } -void ArmRegCache::FlushMipsReg(MIPSReg r) { - /* - if (r == 0) { - ERROR_LOG(JIT, "Flushing r0"); - return; - }*/ +void ArmRegCache::FlushR(MIPSReg r) { switch (mr[r].loc) { case ML_IMM: // IMM is always "dirty". @@ -219,7 +214,7 @@ void ArmRegCache::FlushMipsReg(MIPSReg r) { void ArmRegCache::FlushAll() { for (int i = 0; i < NUM_MIPSREG; i++) { - FlushMipsReg(i); + FlushR(i); } // Sanity check for (int i = 0; i < NUM_ARMREG; i++) { diff --git a/Core/MIPS/ARM/ArmRegCache.h b/Core/MIPS/ARM/ArmRegCache.h index 74a70ffa18d2..cba766b1bcc9 100644 --- a/Core/MIPS/ARM/ArmRegCache.h +++ b/Core/MIPS/ARM/ArmRegCache.h @@ -93,7 +93,7 @@ class ArmRegCache void MapDirtyInIn(MIPSReg rd, MIPSReg rs, MIPSReg rt, bool avoidLoad = true); void MapDirtyDirtyInIn(MIPSReg rd1, MIPSReg rd2, MIPSReg rs, MIPSReg rt, bool avoidLoad = true); void FlushArmReg(ARMReg r); - void FlushMipsReg(MIPSReg r); + void FlushR(MIPSReg r); void FlushAll(); diff --git a/Core/MIPS/ARM/ArmRegCacheFPU.cpp b/Core/MIPS/ARM/ArmRegCacheFPU.cpp index 61d047b7c298..bb5a21ef96e4 100644 --- a/Core/MIPS/ARM/ArmRegCacheFPU.cpp +++ b/Core/MIPS/ARM/ArmRegCacheFPU.cpp @@ -47,8 +47,19 @@ static const ARMReg *GetMIPSAllocationOrder(int &count) { static const ARMReg allocationOrder[] = { S2, S3, S4, S5, S6, S7, S8, S9, S10, S11, S12, S13, S14, S15 }; - count = sizeof(allocationOrder) / sizeof(const int); - return allocationOrder; + // With NEON, we'll have many more. + static const ARMReg allocationOrderNEON[] = { + S2, S3, S4, S5, S6, S7, S8, S9, S10, S11, S12, S13, S14, S15, + S16, S17, S18, S19, S20, S21, S22, S23, S24, S25, S26, S27, S28, S29, S30, S31 + }; + bool useNEON = false; // TODO: Use cpu detect + if (useNEON) { + count = sizeof(allocationOrderNEON) / sizeof(const int); + return allocationOrderNEON; + } else { + count = sizeof(allocationOrder) / sizeof(const int); + return allocationOrder; + } } ARMReg ArmRegCacheFPU::MapReg(MIPSReg mipsReg, int mapFlags) { @@ -79,7 +90,7 @@ ARMReg ArmRegCacheFPU::MapReg(MIPSReg mipsReg, int mapFlags) { // That means it's free. Grab it, and load the value into it (if requested). ar[reg].isDirty = (mapFlags & MAP_DIRTY) ? true : false; if (!(mapFlags & MAP_NOINIT)) { - if (mr[mipsReg].loc == ML_MEM) { + if (mr[mipsReg].loc == ML_MEM && mipsReg < TEMP0) { emit->VLDR((ARMReg)(reg + S0), CTXREG, GetMipsRegOffset(mipsReg)); } } @@ -180,7 +191,6 @@ void ArmRegCacheFPU::FlushArmReg(ARMReg r) { if (ar[reg].isDirty && mr[ar[reg].mipsReg].loc == ML_ARMREG) { //INFO_LOG(HLE, "Flushing ARM reg %i", reg); - emit->VSTR(r, CTXREG, GetMipsRegOffset(ar[reg].mipsReg)); } // IMMs won't be in an ARM reg. @@ -193,7 +203,7 @@ void ArmRegCacheFPU::FlushArmReg(ARMReg r) { ar[reg].mipsReg = -1; } -void ArmRegCacheFPU::FlushMipsReg(MIPSReg r) { +void ArmRegCacheFPU::FlushR(MIPSReg r) { switch (mr[r].loc) { case ML_IMM: // IMM is always "dirty". @@ -203,7 +213,7 @@ void ArmRegCacheFPU::FlushMipsReg(MIPSReg r) { case ML_ARMREG: if (mr[r].reg == (int)INVALID_REG) { - ERROR_LOG(HLE, "FlushMipsReg: MipsReg had bad ArmReg"); + ERROR_LOG(HLE, "FlushR: MipsReg had bad ArmReg"); } if (ar[mr[r].reg].isDirty) { //INFO_LOG(HLE, "Flushing dirty reg %i", mr[r].reg); @@ -225,9 +235,42 @@ void ArmRegCacheFPU::FlushMipsReg(MIPSReg r) { mr[r].reg = (int)INVALID_REG; } +void ArmRegCacheFPU::DiscardR(MIPSReg r) { + switch (mr[r].loc) { + case ML_IMM: + // IMM is always "dirty". + // IMM is not allowed for FP (yet). + ERROR_LOG(HLE, "Imm in FP register?"); + break; + + case ML_ARMREG: + if (mr[r].reg == (int)INVALID_REG) { + ERROR_LOG(HLE, "DiscardR: MipsReg had bad ArmReg"); + } + // Note that we DO NOT write it back here. That's the whole point of Discard. + ar[mr[r].reg].isDirty = false; + ar[mr[r].reg].mipsReg = -1; + break; + + case ML_MEM: + // Already there, nothing to do. + break; + + default: + //BAD + break; + } + mr[r].loc = ML_MEM; + mr[r].reg = (int)INVALID_REG; +} + void ArmRegCacheFPU::FlushAll() { + // Discard temps! + for (int i = TEMP0; i < TEMP0 + NUM_TEMPS; i++) { + DiscardR(i); + } for (int i = 0; i < NUM_MIPSFPUREG; i++) { - FlushMipsReg(i); + FlushR(i); } // Sanity check for (int i = 0; i < NUM_ARMFPUREG; i++) { @@ -239,7 +282,7 @@ void ArmRegCacheFPU::FlushAll() { int ArmRegCacheFPU::GetMipsRegOffset(MIPSReg r) { // These are offsets within the MIPSState structure. First there are the GPRS, then FPRS, then the "VFPURs". - if (r < 32 + 128) + if (r < 32 + 128 + NUM_TEMPS) return (r + 32) << 2; ERROR_LOG(JIT, "bad mips register %i", r); return 0; // or what? diff --git a/Core/MIPS/ARM/ArmRegCacheFPU.h b/Core/MIPS/ARM/ArmRegCacheFPU.h index d0fca1252199..ea1dd84b9636 100644 --- a/Core/MIPS/ARM/ArmRegCacheFPU.h +++ b/Core/MIPS/ARM/ArmRegCacheFPU.h @@ -28,7 +28,12 @@ using namespace ArmGen; enum { - TOTAL_MAPPABLE_MIPSFPUREGS = 32 + 128, + NUM_TEMPS = 4, + TEMP0 = 32 + 128, + TEMP1 = TEMP0 + 1, + TEMP2 = TEMP0 + 2, + TEMP3 = TEMP0 + 3, + TOTAL_MAPPABLE_MIPSFPUREGS = 32 + 128 + NUM_TEMPS, }; struct FPURegARM { @@ -59,6 +64,10 @@ class ArmRegCacheFPU // it's being kept allocated. void SpillLock(MIPSReg reg, MIPSReg reg2 = -1, MIPSReg reg3 = -1, MIPSReg reg4 = -1); void ReleaseSpillLocks(); + void ReleaseSpillLock(int mipsreg) + { + mr[mipsreg].spillLock = false; + } void SetImm(MIPSReg reg, u32 immVal); bool IsImm(MIPSReg reg) const; @@ -71,7 +80,10 @@ class ArmRegCacheFPU void MapDirtyIn(MIPSReg rd, MIPSReg rs, bool avoidLoad = true); void MapDirtyInIn(MIPSReg rd, MIPSReg rs, MIPSReg rt, bool avoidLoad = true); void FlushArmReg(ARMReg r); - void FlushMipsReg(MIPSReg r); + void FlushR(MIPSReg r); + void FlushV(MIPSReg r) { FlushR(r + 32); } + void DiscardR(MIPSReg r); + void DiscardV(MIPSReg r) { DiscardR(r + 32);} void FlushAll(); @@ -81,7 +93,7 @@ class ArmRegCacheFPU ARMReg V(int vreg) { return R(vreg + 32); } - void MapRegV(int vreg, int flags); + void MapRegV(int vreg, int flags = 0); // NOTE: These require you to release spill locks manually! void MapRegsV(int vec, VectorSize vsz, int flags); diff --git a/Core/MIPS/x86/CompVFPU.cpp b/Core/MIPS/x86/CompVFPU.cpp index e693afbba1b3..910847119354 100644 --- a/Core/MIPS/x86/CompVFPU.cpp +++ b/Core/MIPS/x86/CompVFPU.cpp @@ -304,7 +304,7 @@ void Jit::Comp_VDot(u32 op) { u8 sregs[4], tregs[4], dregs[4]; GetVectorRegs(sregs, sz, vs); GetVectorRegs(tregs, sz, vt); - GetVectorRegs(dregs, sz, vd); + GetVectorRegs(dregs, V_Single, vd); // TODO: applyprefixST here somehow (shuffle, etc...) diff --git a/Core/MIPS/x86/RegCacheFPU.cpp b/Core/MIPS/x86/RegCacheFPU.cpp index 9c2cb9c837a9..dfec86c9587b 100644 --- a/Core/MIPS/x86/RegCacheFPU.cpp +++ b/Core/MIPS/x86/RegCacheFPU.cpp @@ -79,6 +79,11 @@ void FPURegCache::MapRegsV(const u8 *v, VectorSize sz, int flags) { } } +void FPURegCache::ReleaseSpillLock(int mipsreg) +{ + regs[mipsreg].locked = false; +} + void FPURegCache::ReleaseSpillLocks() { for (int i = 0; i < NUM_MIPS_FPRS; i++) regs[i].locked = false; diff --git a/Core/MIPS/x86/RegCacheFPU.h b/Core/MIPS/x86/RegCacheFPU.h index cb4db210df2d..f1e4eab895e9 100644 --- a/Core/MIPS/x86/RegCacheFPU.h +++ b/Core/MIPS/x86/RegCacheFPU.h @@ -95,6 +95,7 @@ class FPURegCache // Register locking. Prevents them from being spilled. void SpillLock(int p1, int p2=0xff, int p3=0xff, int p4=0xff); + void ReleaseSpillLock(int mipsrega); void ReleaseSpillLocks(); void MapRegV(int vreg, int flags); From 2bf958b06f199648067f7935a8e39f1f20a7bf01 Mon Sep 17 00:00:00 2001 From: raven02 Date: Sun, 17 Feb 2013 20:50:17 +0800 Subject: [PATCH 018/347] Stylish the case DEC_U8_2/DEC_U16_2/DEC_FLOAT_2 --- GPU/GLES/VertexDecoder.h | 24 +++++++++++++++--------- 1 file changed, 15 insertions(+), 9 deletions(-) diff --git a/GPU/GLES/VertexDecoder.h b/GPU/GLES/VertexDecoder.h index 0be7140f138b..243983c5ac66 100644 --- a/GPU/GLES/VertexDecoder.h +++ b/GPU/GLES/VertexDecoder.h @@ -239,23 +239,29 @@ class VertexReader } void ReadUV(float uv[2]) { - const u8 *b = (const u8 *)(data_ + decFmt_.uvoff); - const u16 *s = (const u16 *)(data_ + decFmt_.uvoff); - const float *f = (const float *)(data_ + decFmt_.uvoff); switch (decFmt_.uvfmt) { case DEC_U8_2: - uv[0] = b[0] * (1.f / 128.f); - uv[1] = b[1] * (1.f / 128.f); + { + const u8 *b = (const u8 *)(data_ + decFmt_.uvoff); + uv[0] = b[0] * (1.f / 128.f); + uv[1] = b[1] * (1.f / 128.f); + } break; case DEC_U16_2: - uv[0] = s[0] * (1.f / 32768.f); - uv[1] = s[1] * (1.f / 32768.f); + { + const u16 *s = (const u16 *)(data_ + decFmt_.uvoff); + uv[0] = s[0] * (1.f / 32768.f); + uv[1] = s[1] * (1.f / 32768.f); + } break; case DEC_FLOAT_2: - uv[0] = f[0] * 2.0f; - uv[1] = f[1] * 2.0f; + { + const float *f = (const float *)(data_ + decFmt_.uvoff); + uv[0] = f[0] * 2.0f; + uv[1] = f[1] * 2.0f; + } break; case DEC_U16A_2: From 45e4919fe95f55c9c751c0827aea1c6d6a7b72e9 Mon Sep 17 00:00:00 2001 From: raven02 Date: Sun, 17 Feb 2013 21:26:23 +0800 Subject: [PATCH 019/347] Change .f to .0f etc. --- GPU/GLES/VertexDecoder.cpp | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/GPU/GLES/VertexDecoder.cpp b/GPU/GLES/VertexDecoder.cpp index 6e68bdec48ed..75614f67eacd 100644 --- a/GPU/GLES/VertexDecoder.cpp +++ b/GPU/GLES/VertexDecoder.cpp @@ -197,7 +197,7 @@ void VertexDecoder::Step_Color5551() const c[0] = Convert5To8(cdata & 0x1f); c[1] = Convert5To8((cdata>>5) & 0x1f); c[2] = Convert5To8((cdata>>10) & 0x1f); - c[3] = (cdata>>15) ? 255 : 0; + c[3] = (cdata>>15) ? 255.0f : 0.0f; } void VertexDecoder::Step_Color4444() const @@ -222,15 +222,15 @@ void VertexDecoder::Step_Color565Morph() const { float w = gstate_c.morphWeights[n]; u16 cdata = *(u16*)(ptr_ + onesize_*n + coloff); - col[0] += w * (cdata & 0x1f) / 31.f; - col[1] += w * ((cdata>>5) & 0x3f) / 63.f; - col[2] += w * ((cdata>>11) & 0x1f) / 31.f; + col[0] += w * (cdata & 0x1f) / 31.0f; + col[1] += w * ((cdata>>5) & 0x3f) / 63.0f; + col[2] += w * ((cdata>>11) & 0x1f) / 31.0f; } u8 *c = decoded_ + decFmt.c0off; for (int i = 0; i < 3; i++) { c[i] = (u8)(col[i] * 255.0f); } - c[3] = 255; + c[3] = 255.0f; } void VertexDecoder::Step_Color5551Morph() const @@ -240,9 +240,9 @@ void VertexDecoder::Step_Color5551Morph() const { float w = gstate_c.morphWeights[n]; u16 cdata = *(u16*)(ptr_ + onesize_*n + coloff); - col[0] += w * (cdata & 0x1f) / 31.f; - col[1] += w * ((cdata>>5) & 0x1f) / 31.f; - col[2] += w * ((cdata>>10) & 0x1f) / 31.f; + col[0] += w * (cdata & 0x1f) / 31.0f; + col[1] += w * ((cdata>>5) & 0x1f) / 31.0f; + col[2] += w * ((cdata>>10) & 0x1f) / 31.0f; col[3] += w * ((cdata>>15) ? 1.0f : 0.0f); } u8 *c = decoded_ + decFmt.c0off; @@ -259,7 +259,7 @@ void VertexDecoder::Step_Color4444Morph() const float w = gstate_c.morphWeights[n]; u16 cdata = *(u16*)(ptr_ + onesize_*n + coloff); for (int j = 0; j < 4; j++) - col[j] += w * ((cdata >> (j * 4)) & 0xF) / 15.f; + col[j] += w * ((cdata >> (j * 4)) & 0xF) / 15.0f; } u8 *c = decoded_ + decFmt.c0off; for (int i = 0; i < 4; i++) { @@ -346,7 +346,7 @@ void VertexDecoder::Step_NormalS16Morph() const multiplier = -multiplier; } const s16 *sv = (const s16 *)(ptr_ + onesize_*n + nrmoff); - multiplier *= (1.0f/32767.f); + multiplier *= (1.0f/32767.0f); for (int j = 0; j < 3; j++) normal[j] += sv[j] * multiplier; } From 8425a123e2ac5924ce655542c4613380f1ebfd9a Mon Sep 17 00:00:00 2001 From: raven02 Date: Mon, 18 Feb 2013 03:39:31 +0800 Subject: [PATCH 020/347] Browse and Boot --- Core/Config.cpp | 2 ++ Core/Config.h | 1 + Windows/main.cpp | 5 +++-- 3 files changed, 6 insertions(+), 2 deletions(-) diff --git a/Core/Config.cpp b/Core/Config.cpp index ae887f2cba66..fc5019750c79 100644 --- a/Core/Config.cpp +++ b/Core/Config.cpp @@ -49,6 +49,7 @@ void CConfig::Load(const char *iniFileName) general->Get("FirstRun", &bFirstRun, true); general->Get("AutoLoadLast", &bAutoLoadLast, false); general->Get("AutoRun", &bAutoRun, true); + general->Get("Browse", &bBrowse, false); general->Get("ConfirmOnQuit", &bConfirmOnQuit, false); general->Get("IgnoreBadMemAccess", &bIgnoreBadMemAccess, true); general->Get("CurrentDirectory", ¤tDirectory, ""); @@ -112,6 +113,7 @@ void CConfig::Save() general->Set("FirstRun", bFirstRun); general->Set("AutoLoadLast", bAutoLoadLast); general->Set("AutoRun", bAutoRun); + general->Set("Browse", bBrowse); general->Set("ConfirmOnQuit", bConfirmOnQuit); general->Set("IgnoreBadMemAccess", bIgnoreBadMemAccess); general->Set("CurrentDirectory", currentDirectory); diff --git a/Core/Config.h b/Core/Config.h index de5437206451..93554eeeb4f7 100644 --- a/Core/Config.h +++ b/Core/Config.h @@ -44,6 +44,7 @@ struct CConfig bool bSpeedLimit; bool bConfirmOnQuit; bool bAutoRun; // start immediately + bool bBrowse; // Core bool bIgnoreBadMemAccess; diff --git a/Windows/main.cpp b/Windows/main.cpp index f729c9abb881..b40541814f52 100644 --- a/Windows/main.cpp +++ b/Windows/main.cpp @@ -159,8 +159,9 @@ int WINAPI WinMain(HINSTANCE _hInstance, HINSTANCE hPrevInstance, LPSTR szCmdLin EmuThread_Start(fileToStart); } - // else - // MainWindow::BrowseAndBoot(); + if (g_Config.bBrowse) + MainWindow::BrowseAndBoot(); + if (!hideLog) SetForegroundWindow(hwndMain); From 6339c2fc9a2f909a291a2f44ffe61ef5a0f8a995 Mon Sep 17 00:00:00 2001 From: Xele02 Date: Sun, 17 Feb 2013 13:10:40 +0100 Subject: [PATCH 021/347] Correct crash when texture too small loaded in memory tex viewer Correct current thread PC in the list. --- Core/HLE/sceKernelThread.cpp | 5 ++++- Qt/debugger_memorytex.cpp | 2 ++ 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/Core/HLE/sceKernelThread.cpp b/Core/HLE/sceKernelThread.cpp index ea1f8730ef30..52aa4981c564 100644 --- a/Core/HLE/sceKernelThread.cpp +++ b/Core/HLE/sceKernelThread.cpp @@ -2805,7 +2805,10 @@ std::vector GetThreadsInfo() info.name[KERNELOBJECT_MAX_NAME_LENGTH+1] = 0; info.status = t->nt.status; info.entrypoint = t->nt.entrypoint; - info.curPC = t->context.pc; + if(*iter == currentThread) + info.curPC = currentMIPS->pc; + else + info.curPC = t->context.pc; info.isCurrent = (*iter == currentThread); threadList.push_back(info); } diff --git a/Qt/debugger_memorytex.cpp b/Qt/debugger_memorytex.cpp index bc9ea6272d0a..cdbf4ae640a7 100644 --- a/Qt/debugger_memorytex.cpp +++ b/Qt/debugger_memorytex.cpp @@ -70,8 +70,10 @@ void Debugger_MemoryTex::on_readBtn_clicked() state.clutaddr = ui->clutaddr->text().toInt(0,16); state.clutaddrupper = ui->clutaddrupper->text().toInt(0,16); state.loadclut = ui->loadclut->text().toInt(0,16); + int bufW = state.texbufwidth[0] & 0x3ff; int w = 1 << (state.texsize[0] & 0xf); int h = 1 << ((state.texsize[0]>>8) & 0xf); + w = std::max(bufW,w); uchar* newData = new uchar[w*h*4]; if(gpu->DecodeTexture(newData, state)) From 0fefca672d325fe15662cedd99ab1f2aff4fcde4 Mon Sep 17 00:00:00 2001 From: Xele02 Date: Sun, 17 Feb 2013 18:25:43 +0100 Subject: [PATCH 022/347] Add 2 step mode for display list : Go to selected line and go to next draw using selected texture --- Core/Host.h | 4 ++-- GPU/GPUCommon.cpp | 2 +- Qt/QtHost.cpp | 24 ++++++++++++++++--- Qt/QtHost.h | 5 ++-- Qt/debugger_displaylist.cpp | 47 +++++++++++++++++++++++++++++++++++++ Qt/debugger_displaylist.h | 8 +++++++ Qt/debugger_displaylist.ui | 6 +++++ 7 files changed, 88 insertions(+), 8 deletions(-) diff --git a/Core/Host.h b/Core/Host.h index 65d17824895c..c60d270a66bd 100644 --- a/Core/Host.h +++ b/Core/Host.h @@ -65,8 +65,8 @@ class Host virtual bool GpuStep() { return false; } virtual void SendGPUStart() {} - virtual void SendGPUWait(u32 cmd) {} - virtual void SetGPUStep(bool value, int flag = 0) {} + virtual void SendGPUWait(u32 cmd, u32 addr, void* data) {} + virtual void SetGPUStep(bool value, int flag = 0, int data = 0) {} virtual void NextGPUStep() {} // Used for headless. diff --git a/GPU/GPUCommon.cpp b/GPU/GPUCommon.cpp index ff050581ed82..8d710972ff5f 100644 --- a/GPU/GPUCommon.cpp +++ b/GPU/GPUCommon.cpp @@ -98,7 +98,7 @@ bool GPUCommon::InterpretList(DisplayList &list) #if defined(USING_QT_UI) if(host->GpuStep()) { - host->SendGPUWait(cmd); + host->SendGPUWait(cmd, list.pc, &gstate); } #endif u32 diff = op ^ gstate.cmdmem[cmd]; diff --git a/Qt/QtHost.cpp b/Qt/QtHost.cpp index ca55e43879fe..4295edf12663 100644 --- a/Qt/QtHost.cpp +++ b/Qt/QtHost.cpp @@ -28,6 +28,7 @@ recursive_mutex m_hGPUStepMutex; QtHost::QtHost(MainWindow *mainWindow_) : mainWindow(mainWindow_) , m_GPUStep(false) + , m_GPUFlag(0) { QObject::connect(this,SIGNAL(BootDoneSignal()),mainWindow,SLOT(Boot())); } @@ -162,7 +163,7 @@ void QtHost::SendGPUStart() EmuThread_LockDraw(true); } -void QtHost::SendGPUWait(u32 cmd) +void QtHost::SendGPUWait(u32 cmd, u32 addr, void *data) { EmuThread_LockDraw(false); @@ -173,19 +174,36 @@ void QtHost::SendGPUWait(u32 cmd) } else if(m_GPUFlag == 0) { - mainWindow->GetDialogDisasm()->UpdateDisplayList(); mainWindow->GetDialogDisplaylist()->Update(); m_hGPUStepEvent.wait(m_hGPUStepMutex); } + else if(m_GPUFlag == 2 && addr == m_GPUData) + { + mainWindow->GetDialogDisasm()->UpdateDisplayList(); + mainWindow->GetDialogDisplaylist()->Update(); + m_hGPUStepEvent.wait(m_hGPUStepMutex); + } + else if(m_GPUFlag == 3 && (cmd == GE_CMD_PRIM || cmd == GE_CMD_BEZIER || cmd == GE_CMD_SPLINE)) + { + GPUgstate *state = (GPUgstate*)data; + u32 texAddr = (state->texaddr[0] & 0xFFFFF0) | ((state->texbufwidth[0]<<8) & 0x0F000000); + if(texAddr == m_GPUData) + { + mainWindow->GetDialogDisasm()->UpdateDisplayList(); + mainWindow->GetDialogDisplaylist()->Update(); + m_hGPUStepEvent.wait(m_hGPUStepMutex); + } + } EmuThread_LockDraw(true); } -void QtHost::SetGPUStep(bool value, int flag) +void QtHost::SetGPUStep(bool value, int flag, int data) { m_GPUStep = value; m_GPUFlag = flag; + m_GPUData = data; } void QtHost::NextGPUStep() diff --git a/Qt/QtHost.h b/Qt/QtHost.h index 8f578c9fd5fc..3e9305694d0a 100644 --- a/Qt/QtHost.h +++ b/Qt/QtHost.h @@ -51,9 +51,9 @@ class QtHost : public QObject, public Host void SendCoreWait(bool); bool GpuStep(); - void SendGPUWait(u32 cmd); + void SendGPUWait(u32 cmd, u32 addr, void* data); void SendGPUStart(); - void SetGPUStep(bool value, int flag = 0); + void SetGPUStep(bool value, int flag = 0, int data = 0); void NextGPUStep(); signals: @@ -62,6 +62,7 @@ class QtHost : public QObject, public Host MainWindow* mainWindow; bool m_GPUStep; int m_GPUFlag; + int m_GPUData; }; #endif // QTAPP_H diff --git a/Qt/debugger_displaylist.cpp b/Qt/debugger_displaylist.cpp index 0f557354ca93..0d7dff132b89 100644 --- a/Qt/debugger_displaylist.cpp +++ b/Qt/debugger_displaylist.cpp @@ -2,6 +2,7 @@ #include #include +#include #include "Core/CPU.h" #include "ui_debugger_displaylist.h" @@ -1518,3 +1519,49 @@ void Debugger_DisplayList::on_indexList_itemClicked(QTreeWidgetItem *item, int c { UpdateIndexInfo(); } + +void Debugger_DisplayList::on_displayListData_customContextMenuRequested(const QPoint &pos) +{ + QTreeWidgetItem* item = ui->displayListData->itemAt(pos); + if(!item) + return; + displayListDataSelected = item; + + QMenu menu(this); + + QAction *runToHere = new QAction(tr("Run to here"), this); + connect(runToHere, SIGNAL(triggered()), this, SLOT(RunToDLPC())); + menu.addAction(runToHere); + + menu.exec( ui->displayListData->mapToGlobal(pos)); +} + +void Debugger_DisplayList::RunToDLPC() +{ + u32 addr = displayListDataSelected->text(0).toInt(0,16); + host->SetGPUStep(true, 2, addr); + host->NextGPUStep(); +} + +void Debugger_DisplayList::on_texturesList_customContextMenuRequested(const QPoint &pos) +{ + QTreeWidgetItem* item = ui->texturesList->itemAt(pos); + if(!item) + return; + textureDataSelected = item; + + QMenu menu(this); + + QAction *runToDraw = new QAction(tr("Run to draw using this texture"), this); + connect(runToDraw, SIGNAL(triggered()), this, SLOT(RunToDrawTex())); + menu.addAction(runToDraw); + + menu.exec( ui->texturesList->mapToGlobal(pos)); +} + +void Debugger_DisplayList::RunToDrawTex() +{ + u32 addr = textureDataSelected->text(0).toInt(0,16); + host->SetGPUStep(true, 3, addr); + host->NextGPUStep(); +} diff --git a/Qt/debugger_displaylist.h b/Qt/debugger_displaylist.h index e237a84f311e..a4ae4a0648c3 100644 --- a/Qt/debugger_displaylist.h +++ b/Qt/debugger_displaylist.h @@ -93,6 +93,12 @@ private slots: void on_indexList_itemClicked(QTreeWidgetItem *item, int column); + void on_displayListData_customContextMenuRequested(const QPoint &pos); + + void on_texturesList_customContextMenuRequested(const QPoint &pos); + void RunToDLPC(); + void RunToDrawTex(); + private: QString DisassembleOp(u32 pc, u32 op, u32 prev, const GPUgstate &state); @@ -100,6 +106,8 @@ private slots: DebugInterface* cpu; MainWindow* mainWindow; QTreeWidgetItem* displayListRowSelected; + QTreeWidgetItem* displayListDataSelected; + QTreeWidgetItem* textureDataSelected; int currentRenderFrameDisplay; FBO* currentTextureDisplay; float fboZoomFactor; diff --git a/Qt/debugger_displaylist.ui b/Qt/debugger_displaylist.ui index 77a3ee5415b2..894a479ad2dd 100644 --- a/Qt/debugger_displaylist.ui +++ b/Qt/debugger_displaylist.ui @@ -118,6 +118,9 @@ + + Qt::CustomContextMenu + false @@ -192,6 +195,9 @@ + + Qt::CustomContextMenu + Address From 9e0bc2ae893e695c2c825c4b52af54cbee51c1bc Mon Sep 17 00:00:00 2001 From: Xele02 Date: Sun, 17 Feb 2013 20:08:40 +0100 Subject: [PATCH 023/347] Better info for the display list code --- Qt/debugger_displaylist.cpp | 380 +++++++++++++++++++++++++++++++----- 1 file changed, 328 insertions(+), 52 deletions(-) diff --git a/Qt/debugger_displaylist.cpp b/Qt/debugger_displaylist.cpp index 0d7dff132b89..0d9771ac7c65 100644 --- a/Qt/debugger_displaylist.cpp +++ b/Qt/debugger_displaylist.cpp @@ -372,7 +372,7 @@ QString Debugger_DisplayList::DisassembleOp(u32 pc, u32 op, u32 prev, const GPUg { int bz_ucount = data & 0xFF; int bz_vcount = (data >> 8) & 0xFF; - return QString("DRAW BEZIER: %1 x %2").arg(bz_ucount).arg(bz_vcount); + return QString("DRAW BEZIER: U=%1 x V=%2").arg(bz_ucount).arg(bz_vcount); } break; @@ -380,9 +380,15 @@ QString Debugger_DisplayList::DisassembleOp(u32 pc, u32 op, u32 prev, const GPUg { int sp_ucount = data & 0xFF; int sp_vcount = (data >> 8) & 0xFF; + static const char* type[4] = { + "Close/Close", + "Open/Close", + "Close/Open", + "Open/Open" + }; int sp_utype = (data >> 16) & 0x3; int sp_vtype = (data >> 18) & 0x3; - return QString("DRAW SPLINE: %1 x %2, %3 x %4").arg(sp_ucount).arg(sp_vcount).arg(sp_utype).arg(sp_vtype); + return QString("DRAW SPLINE: U=%1 x V=%2, U Type = %3 , V Type = %4").arg(sp_ucount).arg(sp_vcount).arg(type[sp_utype]).arg(type[sp_vtype]); } break; @@ -459,13 +465,15 @@ QString Debugger_DisplayList::DisassembleOp(u32 pc, u32 op, u32 prev, const GPUg break; case GE_CMD_BJUMP: + { // bounding box jump. Let's just not jump, for now. - return QString("BBOX JUMP - unimplemented"); + u32 target = (((state.base & 0x00FF0000) << 8) | (op & 0xFFFFFC)) & 0x0FFFFFFF; + return QString("BBOX JUMP - %1 to %2").arg(pc,8,16,QChar('0')).arg(target,8,16,QChar('0')); break; - + } case GE_CMD_BOUNDINGBOX: // bounding box test. Let's do nothing. - return QString("BBOX TEST - unimplemented"); + return QString("BBOX TEST - number : %1").arg(data & 0xFFFF,4,16,QChar('0')); break; case GE_CMD_ORIGIN: @@ -473,9 +481,57 @@ QString Debugger_DisplayList::DisassembleOp(u32 pc, u32 op, u32 prev, const GPUg break; case GE_CMD_VERTEXTYPE: - return QString("SetVertexType: %1").arg(data,6,16,QChar('0')); - break; + { + const char* format[4] = + { + "No", + "8 Bits fixed", + "16 Bits fixed", + "Float" + }; + const char* colFormat[8] = + { + "No", + "", + "", + "", + "16-bit BGR-5650", + "16-bit ABGR-5551", + "16-bit ABGR-4444", + "32-bit ABGR-8888" + }; + QString retString = "SetVertexType:"; + + u32 transform = data & GE_VTYPE_THROUGH_MASK; + retString += QString(" Transform : %1").arg(transform==0?"Transformed":"Raw"); + + u32 numVertMorph = (data & GE_VTYPE_MORPHCOUNT_MASK) >> GE_VTYPE_MORPHCOUNT_SHIFT; + retString += QString(", Num Vtx Morph : %1").arg(numVertMorph); + + u32 numWeight = (data & GE_VTYPE_WEIGHTCOUNT_MASK) >> GE_VTYPE_WEIGHTCOUNT_SHIFT; + retString += QString(", Num Weights : %1").arg(numWeight); + + u32 indexFmt = (data & GE_VTYPE_IDX_MASK) >> GE_VTYPE_IDX_SHIFT; + retString += QString(", Index Format : %1").arg(format[indexFmt]); + + u32 weightFmt = (data & GE_VTYPE_WEIGHT_MASK) >> GE_VTYPE_WEIGHT_SHIFT; + retString += QString(", Weight Format : %1").arg(format[weightFmt]); + u32 posFmt = (data & GE_VTYPE_POS_MASK) >> GE_VTYPE_POS_SHIFT; + retString += QString(", Position Format : %1").arg(format[posFmt]); + + u32 nrmFmt = (data & GE_VTYPE_NRM_MASK) >> GE_VTYPE_NRM_SHIFT; + retString += QString(", Normal Format : %1").arg(format[nrmFmt]); + + u32 colFmt = (data & GE_VTYPE_COL_MASK) >> GE_VTYPE_COL_SHIFT; + retString += QString(", Color Format : %1").arg(colFormat[colFmt]); + + u32 tcFmt = (data & GE_VTYPE_TC_MASK) >> GE_VTYPE_TC_SHIFT; + retString += QString(", Texture UV Format : %1").arg(format[tcFmt]); + + return retString; + break; + } case GE_CMD_OFFSETADDR: return QString("OffsetAddr: %1").arg(data,6,16,QChar('0')); break; @@ -588,9 +644,17 @@ QString Debugger_DisplayList::DisassembleOp(u32 pc, u32 op, u32 prev, const GPUg break; case GE_CMD_FRAMEBUFPIXFORMAT: - return QString("FramebufPixeFormat: %1").arg(data); + { + const char* fmt[4] = + { + "16-bit BGR 5650", + "16-bit ABGR 5551", + "16-bit ABGR 4444", + "32-bit ABGR 8888" + }; + return QString("FramebufPixeFormat: %1").arg(fmt[data]); break; - + } case GE_CMD_TEXADDR0: case GE_CMD_TEXADDR1: case GE_CMD_TEXADDR2: @@ -610,7 +674,7 @@ QString Debugger_DisplayList::DisassembleOp(u32 pc, u32 op, u32 prev, const GPUg case GE_CMD_TEXBUFWIDTH5: case GE_CMD_TEXBUFWIDTH6: case GE_CMD_TEXBUFWIDTH7: - return QString("Texture BUFWIDTHess %1: %2").arg(cmd-GE_CMD_TEXBUFWIDTH0).arg(data,6,16,QChar('0')); + return QString("Texture BUFWIDTHess %1: %2 width : %3").arg(cmd-GE_CMD_TEXBUFWIDTH0).arg(data,6,16,QChar('0')).arg(data & 0xFFFF); break; case GE_CMD_CLUTADDR: @@ -623,20 +687,41 @@ QString Debugger_DisplayList::DisassembleOp(u32 pc, u32 op, u32 prev, const GPUg case GE_CMD_LOADCLUT: // This could be used to "dirty" textures with clut. - return QString("Clut load"); + return QString("Clut load, numColor : %1").arg(data*8); break; case GE_CMD_TEXMAPMODE: - return QString("Tex map mode: %1").arg(data,6,16,QChar('0')); + { + const char* texMapMode[3] = + { + "Texture Coordinates (UV)", + "Texture Matrix", + "Environment Map" + }; + const char* texProjMode[4] = + { + "Position", + "Texture Coordinates", + "Normalized Normal", + "Normal" + }; + return QString("Tex map mode: Map mode : %1, Proj Mode : %2").arg(texMapMode[data & 0x3]).arg(texProjMode[(data >> 8) & 0x3]); break; - + } case GE_CMD_TEXSHADELS: return QString("Tex shade light sources: %1").arg(data,6,16,QChar('0')); break; case GE_CMD_CLUTFORMAT: { - return QString("Clut format: %1").arg(data,6,16,QChar('0')); + const char* fmt[4] = + { + "16-bit BGR 5650", + "16-bit ABGR 5551", + "16-bit ABGR 4444", + "32-bit ABGR 8888" + }; + return QString("Clut format: %1 , Fmt : %2").arg(data,6,16,QChar('0')).arg(fmt[data & 0x3]); } break; @@ -696,7 +781,7 @@ QString Debugger_DisplayList::DisassembleOp(u32 pc, u32 op, u32 prev, const GPUg case GE_CMD_TRANSFERSTART: // Orphis calls this TRXKICK { - return QString("Block Transfer Start"); + return QString("Block Transfer Start : %1").arg(data ? "32-bit texel size" : "16-bit texel size"); break; } @@ -772,9 +857,22 @@ QString Debugger_DisplayList::DisassembleOp(u32 pc, u32 op, u32 prev, const GPUg case GE_CMD_LIGHTTYPE1: case GE_CMD_LIGHTTYPE2: case GE_CMD_LIGHTTYPE3: - return QString("Light %1 type: %2").arg(cmd-GE_CMD_LIGHTTYPE0).arg(data,6,16,QChar('0')); + { + const char* lightType[3] = + { + "Directional Light", + "Point Light", + "Spot Light" + }; + const char* lightComp[3] = + { + "Ambient & Diffuse", + "Diffuse & Specular", + "Unknown (diffuse color, affected by specular power)" + }; + return QString("Light %1 type: %2 %3").arg(cmd-GE_CMD_LIGHTTYPE0).arg(lightType[(data) >> 8 & 0x3]).arg(lightComp[data & 0x3]); break; - + } case GE_CMD_LX0:case GE_CMD_LY0:case GE_CMD_LZ0: case GE_CMD_LX1:case GE_CMD_LY1:case GE_CMD_LZ1: case GE_CMD_LX2:case GE_CMD_LY2:case GE_CMD_LZ2: @@ -855,42 +953,78 @@ QString Debugger_DisplayList::DisassembleOp(u32 pc, u32 op, u32 prev, const GPUg break; case GE_CMD_CULL: - return QString("cull: %1").arg(data,6,16,QChar('0')); + { + const char* cull[2] = + { + "Clockwise visible", + "Counter-clockwise visible" + }; + return QString("cull: %1").arg(cull[data & 0x1]); break; - + } case GE_CMD_PATCHDIVISION: { int patch_div_s = data & 0xFF; int patch_div_t = (data >> 8) & 0xFF; - return QString("Patch subdivision: %1 x %2").arg(patch_div_s).arg(patch_div_t); + return QString("Patch subdivision: S=%1 x T=%2").arg(patch_div_s).arg(patch_div_t); } break; case GE_CMD_PATCHPRIMITIVE: - return QString("Patch Primitive: %1").arg(data); + { + const char* type[3] = + { + "Triangles", + "Lines", + "Points" + }; + return QString("Patch Primitive: %1").arg(type[data]); break; - + } case GE_CMD_PATCHFACING: - return QString( "Patch Facing: %1").arg(data); + { + const char* val[2] = + { + "Clockwise", + "Counter-Clockwise" + }; + return QString( "Patch Facing: %1").arg(val[data]); break; - + } case GE_CMD_REVERSENORMAL: return QString("Reverse normal: %1").arg(data); break; case GE_CMD_MATERIALUPDATE: - return QString("Material Update: %1").arg(data); + { + QString txt = ""; + if(data & 1) txt += " Ambient"; + if(data & 2) txt += " Diffuse"; + if(data & 4) txt += " Specular"; + return QString("Material Update: %1").arg(txt); break; - + } ////////////////////////////////////////////////////////////////// // CLEARING ////////////////////////////////////////////////////////////////// case GE_CMD_CLEARMODE: + { // If it becomes a performance problem, check diff&1 - return QString("Clear mode: %1").arg(data,6,16,QChar('0')); + const char* clearMode[8] = + { + "", + "Clear Color Buffer", + "Clear Stencil/Alpha Buffer", + "", + "Clear Depth Buffer", + "", + "", + "" + }; + return QString("Clear mode: %1, enabled : %2").arg(clearMode[(data >> 8) & 0xF]).arg(data & 0x1); break; - + } ////////////////////////////////////////////////////////////////// // ALPHA BLENDING @@ -900,9 +1034,31 @@ QString Debugger_DisplayList::DisassembleOp(u32 pc, u32 op, u32 prev, const GPUg break; case GE_CMD_BLENDMODE: - return QString("Blend mode: %1").arg(data,6,16,QChar('0')); + { + const char* func[9] = + { + "Source Color", + "One Minus Source Color", + "Source Alpha", + "One Minus Source Alpha", + "Destination Color", + "One Minus Destination Color", + "Destination Alpha", + "One Minus Destination Alpha", + "Fix" + }; + const char* op[6] = + { + "Add", + "Subtract", + "Reverse Subtract", + "Minimum Value", + "Maximum Value", + "Absolute Value" + }; + return QString("Blend mode: Src : %1, Dest : %2, Op : %3").arg(func[(data >> 4) & 0xF]).arg(func[(data >> 8) & 0xF]).arg(op[(data) & 0x7]); break; - + } case GE_CMD_BLENDFIXEDA: return QString("Blend fix A: %1").arg(data,6,16,QChar('0')); break; @@ -916,9 +1072,21 @@ QString Debugger_DisplayList::DisassembleOp(u32 pc, u32 op, u32 prev, const GPUg break; case GE_CMD_ALPHATEST: - return QString("Alpha test settings"); + { + const char* testFunc[8] = + { + "Never pass pixel", + "Always pass pixel", + "Pass pixel if match", + "Pass pixel if difference", + "Pass pixel if less", + "Pass pixel if less or equal", + "Pass pixel if greater", + "Pass pixel if greater or equal" + }; + return QString("Alpha test settings, Mask : %1, Ref : %2, Test : %3").arg((data >> 8) & 0xFF).arg((data >> 16) & 0xFF).arg(testFunc[data & 0x7]); break; - + } case GE_CMD_ANTIALIASENABLE: return QString("Antialias enable: %1").arg(data); break; @@ -928,22 +1096,71 @@ QString Debugger_DisplayList::DisassembleOp(u32 pc, u32 op, u32 prev, const GPUg break; case GE_CMD_COLORTESTENABLE: - return QString("Color Test enable: %1").arg(data); + { + const char* colorTest[4] = + { + "Never pass pixel", + "Always pass pixel", + "Pass pixel if color matches", + "Pass pixel if color differs" + }; + return QString("Color Test enable: %1").arg(colorTest[data]); break; - + } case GE_CMD_LOGICOPENABLE: - return QString("Logic op enable: %1").arg(data); + { + const char* logicOp[16] = + { + "Clear", + "And", + "Reverse And", + "Copy", + "Inverted And", + "No Operation", + "Exclusive Or", + "Or", + "Negated Or", + "Equivalence", + "Inverted", + "Reverse Or", + "Inverted Copy", + "Inverted Or", + "Negated And", + "Set" + }; + return QString("Logic op enable: %1").arg(logicOp[data]); break; - + } case GE_CMD_TEXFUNC: - return QString("TexFunc %1").arg(data&7); + { + const char* effect[8] = + { + "Modulate", + "Decal", + "Blend", + "Replace", + "Add", + "","","" + }; + return QString("TexFunc %1 / %2 / %3").arg((data&0x100)?"Texture alpha is read":"Texture alpha is ignored").arg((data & 0x10000)?"Fragment color is doubled":"Fragment color is untouched").arg(effect[data & 0x7]); break; - + } case GE_CMD_TEXFILTER: { - int min = data & 7; - int mag = (data >> 8) & 1; - return QString("TexFilter min: %1 mag: %2").arg( min).arg(mag); + const char* filter[8]= + { + "Nearest", + "Linear", + "", + "", + "Nearest; Mipmap Nearest", + "Linear; Mipmap Nearest", + "Nearest; Mipmap Linear", + "Linear; Mipmap Linear" + }; + int min = data & 0x7; + int mag = (data >> 8) & 0x7; + return QString("TexFilter min: %1 mag: %2").arg(filter[min]).arg(filter[mag]); } break; @@ -952,13 +1169,30 @@ QString Debugger_DisplayList::DisassembleOp(u32 pc, u32 op, u32 prev, const GPUg break; case GE_CMD_TEXMODE: - return QString("TexMode %1").arg(data,8,16,QChar('0')); + { + u32 maxMipMap = (data >> 16) & 0xF; + return QString("TexMode MaxmipMap : %1, Swizzle : %2").arg(maxMipMap).arg(data & 0x1); break; - + } case GE_CMD_TEXFORMAT: - return QString("TexFormat %1").arg(data,8,16,QChar('0')); + { + const char* texFmt[11] = + { + "16-bit BGR 5650", + "16-bit ABGR 5551", + "16-bit ABGR 4444", + "32-bit ABGR 8888", + "4-bit indexed", + "8-bit indexed", + "16-bit indexed", + "32-bit indexed", + "DXT1", + "DXT3", + "DXT5" + }; + return QString("TexFormat %1").arg(texFmt[data]); break; - + } case GE_CMD_TEXFLUSH: return QString("TexFlush"); break; @@ -968,9 +1202,15 @@ QString Debugger_DisplayList::DisassembleOp(u32 pc, u32 op, u32 prev, const GPUg break; case GE_CMD_TEXWRAP: - return QString("TexWrap %1").arg(data,8,16,QChar('0')); + { + const char* wrapMode[2] = + { + "Repeat", + "Clamp" + }; + return QString("TexWrap U : %1, V : %2").arg(wrapMode[data & 0x1]).arg(wrapMode[(data >> 8) & 0x1]); break; - + } case GE_CMD_TEXLEVEL: return QString("TexWrap Mode: %1 Offset: %2").arg(data&3).arg(data >> 16); break; @@ -1000,21 +1240,57 @@ QString Debugger_DisplayList::DisassembleOp(u32 pc, u32 op, u32 prev, const GPUg break; case GE_CMD_STENCILOP: - return QString("Stencil op: %1").arg(data,6,16,QChar('0')); + { + const char* stencilOp[8] = + { + "Keep stencil value", + "Zero stencil value", + "Replace stencil value", + "Invert stencil value", + "Increment stencil value", + "Decrement stencil value", + "","" + }; + return QString("Stencil op: ZFail : %1, Fail : %2, Pass : %3").arg(stencilOp[(data >> 16) & 0x7]).arg(stencilOp[(data >> 8) & 0x7]).arg(stencilOp[(data) & 0x7]); break; - + } case GE_CMD_STENCILTEST: - return QString("Stencil test: %1").arg(data,6,16,QChar('0')); + { + const char* testFunc[8] = + { + "Never pass stencil pixel", + "Always pass stencil pixel", + "Pass test if match", + "Pass test if difference", + "Pass test if less", + "Pass test if less or equal", + "Pass test if greater", + "Pass test if greater or equal" + }; + return QString("Stencil test, Mask : %1, Ref : %2, Test : %3").arg((data >> 8) & 0xFF).arg((data >> 16) & 0xFF).arg(testFunc[data & 0x7]); break; + } case GE_CMD_STENCILTESTENABLE: return QString("Stencil test enable: %1").arg(data); break; case GE_CMD_ZTEST: - return QString("Z test mode: %1").arg(data); + { + const char* testFunc[8] = + { + "Never pass stencil pixel", + "Always pass stencil pixel", + "Pass pixel if match", + "Pass pixel if difference", + "Pass pixel if less", + "Pass pixel if less or equal", + "Pass pixel if greater", + "Pass pixel if greater or equal" + }; + return QString("Z test mode: %1").arg(testFunc[data & 0x7]); break; - + } case GE_CMD_MORPHWEIGHT0: case GE_CMD_MORPHWEIGHT1: case GE_CMD_MORPHWEIGHT2: From ec8d32378aacf67e5545af7ef45423a3266a9aeb Mon Sep 17 00:00:00 2001 From: Xele02 Date: Sun, 17 Feb 2013 21:42:54 +0100 Subject: [PATCH 024/347] Add possibility to modify memory values Optim time when parsing DList for debug. --- Qt/ctrlmemview.cpp | 28 ++++++++++++++++++++++++++++ Qt/ctrlmemview.h | 1 + Qt/debugger_displaylist.cpp | 15 ++++++++------- 3 files changed, 37 insertions(+), 7 deletions(-) diff --git a/Qt/ctrlmemview.cpp b/Qt/ctrlmemview.cpp index c7c66374369d..0ebaa97775bb 100644 --- a/Qt/ctrlmemview.cpp +++ b/Qt/ctrlmemview.cpp @@ -6,6 +6,7 @@ #include #include #include +#include #include "EmuThread.h" #include "Core/MemMap.h" @@ -221,6 +222,10 @@ void CtrlMemView::contextMenu(const QPoint &pos) connect(copyValue, SIGNAL(triggered()), this, SLOT(CopyValue())); menu.addAction(copyValue); + QAction *changeValue = new QAction(tr("C&hange value"), this); + connect(changeValue, SIGNAL(triggered()), this, SLOT(Change())); + menu.addAction(changeValue); + QAction *dump = new QAction(tr("Dump..."), this); connect(dump, SIGNAL(triggered()), this, SLOT(Dump())); menu.addAction(dump); @@ -230,7 +235,9 @@ void CtrlMemView::contextMenu(const QPoint &pos) void CtrlMemView::CopyValue() { + EmuThread_LockDraw(true); QApplication::clipboard()->setText(QString("%1").arg(Memory::ReadUnchecked_U32(selection),8,16,QChar('0'))); + EmuThread_LockDraw(false); } void CtrlMemView::Dump() @@ -238,6 +245,27 @@ void CtrlMemView::Dump() QMessageBox::information(this,"Sorry","This feature has not been implemented.",QMessageBox::Ok); } + +void CtrlMemView::Change() +{ + EmuThread_LockDraw(true); + QString curVal = QString("%1").arg(Memory::ReadUnchecked_U32(selection),8,16,QChar('0')); + EmuThread_LockDraw(false); + + bool ok; + QString text = QInputDialog::getText(this, tr("Set new value"), + tr("Set new value:"), QLineEdit::Normal, + curVal, &ok); + if (ok && !text.isEmpty()) + { + EmuThread_LockDraw(true); + Memory::WriteUnchecked_U32(text.toInt(0,16),selection); + EmuThread_LockDraw(false); + redraw(); + } +} + + int CtrlMemView::yToAddress(int y) { int ydiff=y-rect().bottom()/2-rowHeight/2; diff --git a/Qt/ctrlmemview.h b/Qt/ctrlmemview.h index 070b1af7f968..cc7f31c5062e 100644 --- a/Qt/ctrlmemview.h +++ b/Qt/ctrlmemview.h @@ -72,6 +72,7 @@ class CtrlMemView : public QWidget public slots: void CopyValue(); void Dump(); + void Change(); private: int curAddress; int align; diff --git a/Qt/debugger_displaylist.cpp b/Qt/debugger_displaylist.cpp index 0d9771ac7c65..c5103192f954 100644 --- a/Qt/debugger_displaylist.cpp +++ b/Qt/debugger_displaylist.cpp @@ -309,15 +309,16 @@ void Debugger_DisplayList::ShowDLCode() } usedIdxAddr.insert(iaddr); } - - for(int i = 0; i < ui->texturesList->columnCount(); i++) - ui->texturesList->resizeColumnToContents(i); - for(int i = 0; i < ui->vertexList->columnCount(); i++) - ui->vertexList->resizeColumnToContents(i); - for(int i = 0; i < ui->indexList->columnCount(); i++) - ui->indexList->resizeColumnToContents(i); } + + for(int i = 0; i < ui->texturesList->columnCount(); i++) + ui->texturesList->resizeColumnToContents(i); + for(int i = 0; i < ui->vertexList->columnCount(); i++) + ui->vertexList->resizeColumnToContents(i); + for(int i = 0; i < ui->indexList->columnCount(); i++) + ui->indexList->resizeColumnToContents(i); + UpdateVertexInfo(); UpdateIndexInfo(); } From 20597e4990edeaf6b812f8571a8f0361f8f52bb8 Mon Sep 17 00:00:00 2001 From: Xele02 Date: Sun, 17 Feb 2013 22:05:31 +0100 Subject: [PATCH 025/347] Sync native Put gui command in the gui thread. --- Qt/debugger_displaylist.cpp | 10 ++++++++-- Qt/debugger_displaylist.h | 2 ++ native | 2 +- 3 files changed, 11 insertions(+), 3 deletions(-) diff --git a/Qt/debugger_displaylist.cpp b/Qt/debugger_displaylist.cpp index c5103192f954..5b688d733720 100644 --- a/Qt/debugger_displaylist.cpp +++ b/Qt/debugger_displaylist.cpp @@ -31,6 +31,7 @@ Debugger_DisplayList::Debugger_DisplayList(DebugInterface *_cpu, MainWindow* mai QObject::connect(this, SIGNAL(updateDisplayList_()), this, SLOT(UpdateDisplayListGUI())); QObject::connect(this, SIGNAL(updateRenderBufferList_()), this, SLOT(UpdateRenderBufferListGUI())); + QObject::connect(this, SIGNAL(updateRenderBuffer_()), this, SLOT(UpdateRenderBufferGUI())); } @@ -1498,6 +1499,11 @@ void Debugger_DisplayList::on_stopBtn_clicked() } void Debugger_DisplayList::UpdateRenderBuffer() +{ + emit updateRenderBuffer_(); +} + +void Debugger_DisplayList::UpdateRenderBufferGUI() { EmuThread_LockDraw(true); @@ -1580,7 +1586,7 @@ void Debugger_DisplayList::on_texturesList_itemDoubleClicked(QTreeWidgetItem *it void Debugger_DisplayList::on_comboBox_currentIndexChanged(int index) { currentRenderFrameDisplay = index; - UpdateRenderBuffer(); + UpdateRenderBufferGUI(); } void Debugger_DisplayList::UpdateRenderBufferList() @@ -1622,7 +1628,7 @@ void Debugger_DisplayList::on_fboList_itemClicked(QTreeWidgetItem *item, int col u64 addr = item->data(0,Qt::UserRole).toULongLong(); FBO* fbo = (FBO*)addr; currentTextureDisplay = fbo; - UpdateRenderBuffer(); + UpdateRenderBufferGUI(); } void Debugger_DisplayList::on_nextDLBtn_clicked() diff --git a/Qt/debugger_displaylist.h b/Qt/debugger_displaylist.h index a4ae4a0648c3..7ecec8230237 100644 --- a/Qt/debugger_displaylist.h +++ b/Qt/debugger_displaylist.h @@ -54,10 +54,12 @@ class Debugger_DisplayList : public QDialog signals: void updateDisplayList_(); void updateRenderBufferList_(); + void updateRenderBuffer_(); private slots: void UpdateDisplayListGUI(); void UpdateRenderBufferListGUI(); + void UpdateRenderBufferGUI(); void releaseLock(); void on_displayList_itemClicked(QTreeWidgetItem *item, int column); diff --git a/native b/native index f5e7bd5a9c3e..f7db8ff0bea9 160000 --- a/native +++ b/native @@ -1 +1 @@ -Subproject commit f5e7bd5a9c3e4b39a4eac71b577f06ad54f2bc96 +Subproject commit f7db8ff0bea971ed6c1332ce746101d3f0146010 From 7f9516fce491e0b93337c964496515b9a706320b Mon Sep 17 00:00:00 2001 From: "Unknown W. Brackets" Date: Sun, 17 Feb 2013 15:10:30 -0800 Subject: [PATCH 026/347] Use SSE2 in debug and x64, not just x86. Apples to apples is nice. More accurate floats in debug is bad. --- Core/Core.vcxproj | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/Core/Core.vcxproj b/Core/Core.vcxproj index 265a9fd0f461..50c55c3a0174 100644 --- a/Core/Core.vcxproj +++ b/Core/Core.vcxproj @@ -68,6 +68,8 @@ Disabled ../common;..;../native;../native/ext/glew;../ext/zlib WIN32;_DEBUG;_LIB;%(PreprocessorDefinitions) + StreamingSIMDExtensions2 + Fast true @@ -79,6 +81,8 @@ Disabled ../common;..;../native;../native/ext/glew;../ext/zlib WIN32;_DEBUG;_LIB;%(PreprocessorDefinitions) + StreamingSIMDExtensions2 + Fast true @@ -108,6 +112,8 @@ true true ../common;..;../native;../native/ext/glew;../ext/zlib + StreamingSIMDExtensions2 + Fast true From be631dea64295256bbb83147012f5180fa548d08 Mon Sep 17 00:00:00 2001 From: "Unknown W. Brackets" Date: Sun, 17 Feb 2013 15:11:14 -0800 Subject: [PATCH 027/347] Disasm transposed vectors properly. --- Core/MIPS/MIPSVFPUUtils.cpp | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/Core/MIPS/MIPSVFPUUtils.cpp b/Core/MIPS/MIPSVFPUUtils.cpp index fd94a6cf0234..21ebfb844b76 100644 --- a/Core/MIPS/MIPSVFPUUtils.cpp +++ b/Core/MIPS/MIPSVFPUUtils.cpp @@ -278,7 +278,10 @@ const char *GetVectorNotation(int reg, VectorSize size) case V_Quad: c='C'; row=(reg>>5)&2; break; } if (transpose && c == 'C') c='R'; - sprintf(hej[yo],"%c%i%i%i",c,mtx,col,row); + if (transpose) + sprintf(hej[yo],"%c%i%i%i",c,mtx,row,col); + else + sprintf(hej[yo],"%c%i%i%i",c,mtx,col,row); return hej[yo]; } From 6191017a2cdc8967125cd30938a974f08dab854f Mon Sep 17 00:00:00 2001 From: "Unknown W. Brackets" Date: Sun, 17 Feb 2013 15:21:51 -0800 Subject: [PATCH 028/347] Fix jit VDot mapping vd incorrectly to a quad. --- Core/MIPS/x86/CompVFPU.cpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/Core/MIPS/x86/CompVFPU.cpp b/Core/MIPS/x86/CompVFPU.cpp index b011c6ae52c3..d8d0a0af8b05 100644 --- a/Core/MIPS/x86/CompVFPU.cpp +++ b/Core/MIPS/x86/CompVFPU.cpp @@ -331,10 +331,10 @@ void Jit::Comp_VDot(u32 op) { VectorSize sz = GetVecSize(op); // TODO: Force read one of them into regs? probably not. - u8 sregs[4], tregs[4], dregs[4]; + u8 sregs[4], tregs[4], dregs[1]; GetVectorRegs(sregs, sz, vs); GetVectorRegs(tregs, sz, vt); - GetVectorRegs(dregs, sz, vd); + GetVectorRegs(dregs, V_Single, vd); // TODO: applyprefixST here somehow (shuffle, etc...) @@ -347,7 +347,7 @@ void Jit::Comp_VDot(u32 op) { } // Need to start with +0.0f so it doesn't result in -0.0f. - MOVSS(tempxreg, M((void *) &zero)); + XORPS(tempxreg, R(tempxreg)); for (int i = 0; i < n; i++) { // sum += s[i]*t[i]; From b4fb06f51c80615ca1ff411c242048dd2546aabf Mon Sep 17 00:00:00 2001 From: "Unknown W. Brackets" Date: Sun, 17 Feb 2013 15:24:18 -0800 Subject: [PATCH 029/347] Respect the writemask in VDot. Although it's basically a no-op in that case... --- Core/MIPS/MIPSIntVFPU.cpp | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/Core/MIPS/MIPSIntVFPU.cpp b/Core/MIPS/MIPSIntVFPU.cpp index 7aa182f6b5e0..f861340d8c40 100644 --- a/Core/MIPS/MIPSIntVFPU.cpp +++ b/Core/MIPS/MIPSIntVFPU.cpp @@ -936,8 +936,7 @@ namespace MIPSInt } d = sum; ApplyPrefixD(&d,V_Single); - // TODO: Shouldn't this respect the mask? - V(vd) = d; + WriteVector(&d, V_Single, vd); PC += 4; EatPrefixes(); } From 6b223cf7d7ca19315a62a616daf0806e5b1eba60 Mon Sep 17 00:00:00 2001 From: "Unknown W. Brackets" Date: Sun, 17 Feb 2013 15:40:26 -0800 Subject: [PATCH 030/347] Add a flag for eating prefixes to the MIPS tables. Still incomplete, just filled in ones I've tested so far. --- Core/MIPS/MIPSTables.cpp | 14 +++++------ Core/MIPS/MIPSTables.h | 52 +++++++++++++++++++++------------------- 2 files changed, 34 insertions(+), 32 deletions(-) diff --git a/Core/MIPS/MIPSTables.cpp b/Core/MIPS/MIPSTables.cpp index 06e30466c30c..bcd83c2270e8 100644 --- a/Core/MIPS/MIPSTables.cpp +++ b/Core/MIPS/MIPSTables.cpp @@ -478,19 +478,19 @@ const MIPSInstruction tableCop1BC[32] = const MIPSInstruction tableVFPU0[8] = { - INSTR("vadd",&Jit::Comp_VecDo3, Dis_VectorSet3, Int_VecDo3, IS_VFPU), - INSTR("vsub",&Jit::Comp_VecDo3, Dis_VectorSet3, Int_VecDo3, IS_VFPU), + INSTR("vadd",&Jit::Comp_VecDo3, Dis_VectorSet3, Int_VecDo3, IS_VFPU|OUT_EAT_PREFIX), + INSTR("vsub",&Jit::Comp_VecDo3, Dis_VectorSet3, Int_VecDo3, IS_VFPU|OUT_EAT_PREFIX), INSTR("vsbn",&Jit::Comp_Generic, Dis_VectorSet3, Int_Vsbn, IS_VFPU), {-2}, {-2}, {-2}, {-2}, - INSTR("vdiv",&Jit::Comp_VecDo3, Dis_VectorSet3, Int_VecDo3, IS_VFPU), + INSTR("vdiv",&Jit::Comp_VecDo3, Dis_VectorSet3, Int_VecDo3, IS_VFPU|OUT_EAT_PREFIX), }; const MIPSInstruction tableVFPU1[8] = { - INSTR("vmul",&Jit::Comp_VecDo3, Dis_VectorSet3, Int_VecDo3, IS_VFPU), - INSTR("vdot",&Jit::Comp_VDot, Dis_VectorDot, Int_VDot, IS_VFPU), - INSTR("vscl",&Jit::Comp_Generic, Dis_VScl, Int_VScl, IS_VFPU), + INSTR("vmul",&Jit::Comp_VecDo3, Dis_VectorSet3, Int_VecDo3, IS_VFPU|OUT_EAT_PREFIX), + INSTR("vdot",&Jit::Comp_VDot, Dis_VectorDot, Int_VDot, IS_VFPU|OUT_EAT_PREFIX), + INSTR("vscl",&Jit::Comp_Generic, Dis_VScl, Int_VScl, IS_VFPU|OUT_EAT_PREFIX), {-2}, INSTR("vhdp",&Jit::Comp_Generic, Dis_Generic, Int_VHdp, IS_VFPU), INSTR("vcrs",&Jit::Comp_Generic, Dis_Vcrs, Int_Vcrs, IS_VFPU), @@ -582,7 +582,7 @@ const MIPSInstruction tableVFPU7[32] = // 110100 00000 10111 0000000000000000 const MIPSInstruction tableVFPU4[32] = //110100 00000 xxxxx { - INSTR("vmov", &Jit::Comp_Generic, Dis_VectorSet2, Int_VV2Op,IS_VFPU), + INSTR("vmov", &Jit::Comp_Generic, Dis_VectorSet2, Int_VV2Op,IS_VFPU|OUT_EAT_PREFIX), INSTR("vabs", &Jit::Comp_Generic, Dis_VectorSet2, Int_VV2Op,IS_VFPU), INSTR("vneg", &Jit::Comp_Generic, Dis_VectorSet2, Int_VV2Op,IS_VFPU), INSTR("vidt", &Jit::Comp_Generic, Dis_VectorSet1, Int_Vidt,IS_VFPU), diff --git a/Core/MIPS/MIPSTables.h b/Core/MIPS/MIPSTables.h index 2d71bc73d168..18ee23b42fe1 100644 --- a/Core/MIPS/MIPSTables.h +++ b/Core/MIPS/MIPSTables.h @@ -19,31 +19,33 @@ #include "../../Globals.h" -#define IS_CONDBRANCH 0x100 -#define IS_JUMP 0x200 -#define IS_VFPU 0x80000000 -#define LIKELY 0x80 -#define UNCONDITIONAL 0x40 -#define BAD_INSTRUCTION 0x20 -#define DELAYSLOT 0x10 - -#define IN_RS_ADDR 0x800 -#define IN_RS_SHIFT 0x400 -#define IN_RS 0x1000 -#define IN_RT 0x2000 -#define IN_SA 0x4000 -#define IN_IMM16 0x8000 -#define IN_IMM26 0x10000 -#define IN_MEM 0x20000 -#define IN_OTHER 0x40000 -#define IN_FPUFLAG 0x80000 - -#define OUT_RT 0x100000 -#define OUT_RD 0x200000 -#define OUT_RA 0x400000 -#define OUT_MEM 0x800000 -#define OUT_OTHER 0x1000000 -#define OUT_FPUFLAG 0x2000000 +#define DELAYSLOT 0x00000010 +#define BAD_INSTRUCTION 0x00000020 +#define UNCONDITIONAL 0x00000040 +#define LIKELY 0x00000080 +#define IS_CONDBRANCH 0x00000100 +#define IS_JUMP 0x00000200 + +#define IN_RS_SHIFT 0x00000400 +#define IN_RS_ADDR 0x00000800 +#define IN_RS 0x00001000 +#define IN_RT 0x00002000 +#define IN_SA 0x00004000 +#define IN_IMM16 0x00008000 +#define IN_IMM26 0x00010000 +#define IN_MEM 0x00020000 +#define IN_OTHER 0x00040000 +#define IN_FPUFLAG 0x00080000 + +#define OUT_RT 0x00100000 +#define OUT_RD 0x00200000 +#define OUT_RA 0x00400000 +#define OUT_MEM 0x00800000 +#define OUT_OTHER 0x01000000 +#define OUT_FPUFLAG 0x02000000 +#define OUT_EAT_PREFIX 0x04000000 + +#define IS_VFPU 0x80000000 #ifndef CDECL #define CDECL From f5329513318d3342be2811bb98bb5c400d428481 Mon Sep 17 00:00:00 2001 From: "Unknown W. Brackets" Date: Sun, 17 Feb 2013 15:50:31 -0800 Subject: [PATCH 031/347] Automatically eat prefixes in x86 jit. Simplifies the code and makes it easier to know they're eaten even for ops not yet jitted. --- Core/MIPS/ARM/ArmJit.h | 3 +++ Core/MIPS/MIPSTables.cpp | 4 ++++ Core/MIPS/x86/CompVFPU.cpp | 12 +++++------- Core/MIPS/x86/Jit.cpp | 3 ++- Core/MIPS/x86/Jit.h | 1 + 5 files changed, 15 insertions(+), 8 deletions(-) diff --git a/Core/MIPS/ARM/ArmJit.h b/Core/MIPS/ARM/ArmJit.h index 730a6938ce8f..0dc0338e7d88 100644 --- a/Core/MIPS/ARM/ArmJit.h +++ b/Core/MIPS/ARM/ArmJit.h @@ -119,6 +119,9 @@ class Jit : public ArmGen::ARMXCodeBlock void ClearCache(); void ClearCacheAt(u32 em_address); + // TODO: Eat VFPU prefixes here. + void EatPrefix() { } + private: void GenerateFixedCode(); void FlushAll(); diff --git a/Core/MIPS/MIPSTables.cpp b/Core/MIPS/MIPSTables.cpp index bcd83c2270e8..34319e8baea2 100644 --- a/Core/MIPS/MIPSTables.cpp +++ b/Core/MIPS/MIPSTables.cpp @@ -868,6 +868,7 @@ void MIPSCompileOp(u32 op) if (op==0) return; const MIPSInstruction *instr = MIPSGetInstruction(op); + const int info = MIPSGetInfo(op); if (instr) { if (instr->compile) @@ -877,6 +878,9 @@ void MIPSCompileOp(u32 op) ERROR_LOG(CPU,"MIPSCompileOp %08x failed",op); //MessageBox(0,"ARGH2",0,0);//compile an interpreter call } + + if (info & OUT_EAT_PREFIX) + MIPSComp::jit->EatPrefix(); } else { diff --git a/Core/MIPS/x86/CompVFPU.cpp b/Core/MIPS/x86/CompVFPU.cpp index d8d0a0af8b05..9cb5bf330686 100644 --- a/Core/MIPS/x86/CompVFPU.cpp +++ b/Core/MIPS/x86/CompVFPU.cpp @@ -318,10 +318,14 @@ void Jit::Comp_SVQ(u32 op) void Jit::Comp_VDot(u32 op) { DISABLE; + // No-op. + if (js.writeMask[0]) { + return; + } + // WARNING: No prefix support! if (js.MayHavePrefix()) { Comp_Generic(op); - js.EatPrefix(); return; } @@ -365,8 +369,6 @@ void Jit::Comp_VDot(u32 op) { // TODO: applyprefixD here somehow (write mask etc..) fpr.ReleaseSpillLocks(); - - js.EatPrefix(); } void Jit::Comp_VecDo3(u32 op) { @@ -376,7 +378,6 @@ void Jit::Comp_VecDo3(u32 op) { if (js.MayHavePrefix()) { Comp_Generic(op); - js.EatPrefix(); return; } @@ -420,7 +421,6 @@ void Jit::Comp_VecDo3(u32 op) { if (xmmop == NULL) { Comp_Generic(op); - js.EatPrefix(); return; } @@ -463,8 +463,6 @@ void Jit::Comp_VecDo3(u32 op) { } fpr.ReleaseSpillLocks(); - - js.EatPrefix(); } void Jit::Comp_Mftv(u32 op) { diff --git a/Core/MIPS/x86/Jit.cpp b/Core/MIPS/x86/Jit.cpp index 9fb2487713e0..7a817e5c8bb5 100644 --- a/Core/MIPS/x86/Jit.cpp +++ b/Core/MIPS/x86/Jit.cpp @@ -283,7 +283,8 @@ void Jit::Comp_Generic(u32 op) _dbg_assert_msg_(JIT, 0, "Trying to compile instruction that can't be interpreted"); // Might have eaten prefixes, hard to tell... - if ((MIPSGetInfo(op) & IS_VFPU) != 0) + const int info = MIPSGetInfo(op); + if ((info & IS_VFPU) != 0 && (info & OUT_EAT_PREFIX) == 0) js.PrefixStart(); } diff --git a/Core/MIPS/x86/Jit.h b/Core/MIPS/x86/Jit.h index 2d5f9ef3c1c8..4b20de372d78 100644 --- a/Core/MIPS/x86/Jit.h +++ b/Core/MIPS/x86/Jit.h @@ -173,6 +173,7 @@ class Jit : public Gen::XCodeBlock void ApplyPrefixST(u8 *vregs, u32 prefix, VectorSize sz); void ApplyPrefixD(const u8 *vregs, u32 prefix, VectorSize sz, bool onlyWriteMask = false); + void EatPrefix() { js.EatPrefix(); } JitBlockCache *GetBlockCache() { return &blocks; } AsmRoutineManager &Asm() { return asm_; } From 7fee4dfd13e45d3ff8b553c613a484f976c999e3 Mon Sep 17 00:00:00 2001 From: "Unknown W. Brackets" Date: Sun, 17 Feb 2013 15:51:07 -0800 Subject: [PATCH 032/347] Re-enable vdot and vadd/etc. in x86 jit. --- Core/MIPS/x86/CompVFPU.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Core/MIPS/x86/CompVFPU.cpp b/Core/MIPS/x86/CompVFPU.cpp index 9cb5bf330686..ff16fb25fb72 100644 --- a/Core/MIPS/x86/CompVFPU.cpp +++ b/Core/MIPS/x86/CompVFPU.cpp @@ -316,7 +316,7 @@ void Jit::Comp_SVQ(u32 op) } void Jit::Comp_VDot(u32 op) { - DISABLE; + CONDITIONAL_DISABLE; // No-op. if (js.writeMask[0]) { @@ -372,7 +372,7 @@ void Jit::Comp_VDot(u32 op) { } void Jit::Comp_VecDo3(u32 op) { - DISABLE; + CONDITIONAL_DISABLE; // WARNING: No prefix support! if (js.MayHavePrefix()) From 25c42c3532a2ef464a20f84fefcd8cf4b29e815d Mon Sep 17 00:00:00 2001 From: "Unknown W. Brackets" Date: Sun, 17 Feb 2013 17:32:29 -0800 Subject: [PATCH 033/347] Mark more instructions that eat prefixes. --- Core/MIPS/MIPSTables.cpp | 42 ++++++++++++++++++++-------------------- 1 file changed, 21 insertions(+), 21 deletions(-) diff --git a/Core/MIPS/MIPSTables.cpp b/Core/MIPS/MIPSTables.cpp index 34319e8baea2..d792c800ebdd 100644 --- a/Core/MIPS/MIPSTables.cpp +++ b/Core/MIPS/MIPSTables.cpp @@ -502,8 +502,8 @@ const MIPSInstruction tableVFPU3[8] = //011011 xxx { INSTR("vcmp",&Jit::Comp_Generic, Dis_Vcmp, Int_Vcmp, IS_VFPU), {-2}, - INSTR("vmin",&Jit::Comp_Generic, Dis_VectorSet3, Int_Vminmax, IS_VFPU), - INSTR("vmax",&Jit::Comp_Generic, Dis_VectorSet3, Int_Vminmax, IS_VFPU), + INSTR("vmin",&Jit::Comp_Generic, Dis_VectorSet3, Int_Vminmax, IS_VFPU|OUT_EAT_PREFIX), + INSTR("vmax",&Jit::Comp_Generic, Dis_VectorSet3, Int_Vminmax, IS_VFPU|OUT_EAT_PREFIX), {-2}, INSTR("vscmp",&Jit::Comp_Generic, Dis_VectorSet3, Int_Vscmp, IS_VFPU), INSTR("vsge",&Jit::Comp_Generic, Dis_VectorSet3, Int_Vsge, IS_VFPU), @@ -583,30 +583,30 @@ const MIPSInstruction tableVFPU7[32] = const MIPSInstruction tableVFPU4[32] = //110100 00000 xxxxx { INSTR("vmov", &Jit::Comp_Generic, Dis_VectorSet2, Int_VV2Op,IS_VFPU|OUT_EAT_PREFIX), - INSTR("vabs", &Jit::Comp_Generic, Dis_VectorSet2, Int_VV2Op,IS_VFPU), - INSTR("vneg", &Jit::Comp_Generic, Dis_VectorSet2, Int_VV2Op,IS_VFPU), + INSTR("vabs", &Jit::Comp_Generic, Dis_VectorSet2, Int_VV2Op,IS_VFPU|OUT_EAT_PREFIX), + INSTR("vneg", &Jit::Comp_Generic, Dis_VectorSet2, Int_VV2Op,IS_VFPU|OUT_EAT_PREFIX), INSTR("vidt", &Jit::Comp_Generic, Dis_VectorSet1, Int_Vidt,IS_VFPU), - INSTR("vsat0", &Jit::Comp_Generic, Dis_VectorSet2, Int_VV2Op, IS_VFPU), - INSTR("vsat1", &Jit::Comp_Generic, Dis_VectorSet2, Int_VV2Op, IS_VFPU), + INSTR("vsat0", &Jit::Comp_Generic, Dis_VectorSet2, Int_VV2Op, IS_VFPU|OUT_EAT_PREFIX), + INSTR("vsat1", &Jit::Comp_Generic, Dis_VectorSet2, Int_VV2Op, IS_VFPU|OUT_EAT_PREFIX), INSTR("vzero", &Jit::Comp_Generic, Dis_VectorSet1, Int_VVectorInit, IS_VFPU), INSTR("vone", &Jit::Comp_Generic, Dis_VectorSet1, Int_VVectorInit, IS_VFPU), //8 {-2},{-2},{-2},{-2},{-2},{-2},{-2},{-2}, //16 - INSTR("vrcp", &Jit::Comp_Generic, Dis_VectorSet2, Int_VV2Op, IS_VFPU), - INSTR("vrsq", &Jit::Comp_Generic, Dis_VectorSet2, Int_VV2Op, IS_VFPU), - INSTR("vsin", &Jit::Comp_Generic, Dis_VectorSet2, Int_VV2Op, IS_VFPU), - INSTR("vcos", &Jit::Comp_Generic, Dis_VectorSet2, Int_VV2Op, IS_VFPU), - INSTR("vexp2", &Jit::Comp_Generic, Dis_VectorSet2, Int_VV2Op, IS_VFPU), - INSTR("vlog2", &Jit::Comp_Generic, Dis_VectorSet2, Int_VV2Op, IS_VFPU), - INSTR("vsqrt", &Jit::Comp_Generic, Dis_VectorSet2, Int_VV2Op, IS_VFPU), - INSTR("vasin", &Jit::Comp_Generic, Dis_VectorSet2, Int_VV2Op, IS_VFPU), + INSTR("vrcp", &Jit::Comp_Generic, Dis_VectorSet2, Int_VV2Op, IS_VFPU|OUT_EAT_PREFIX), + INSTR("vrsq", &Jit::Comp_Generic, Dis_VectorSet2, Int_VV2Op, IS_VFPU|OUT_EAT_PREFIX), + INSTR("vsin", &Jit::Comp_Generic, Dis_VectorSet2, Int_VV2Op, IS_VFPU|OUT_EAT_PREFIX), + INSTR("vcos", &Jit::Comp_Generic, Dis_VectorSet2, Int_VV2Op, IS_VFPU|OUT_EAT_PREFIX), + INSTR("vexp2", &Jit::Comp_Generic, Dis_VectorSet2, Int_VV2Op, IS_VFPU|OUT_EAT_PREFIX), + INSTR("vlog2", &Jit::Comp_Generic, Dis_VectorSet2, Int_VV2Op, IS_VFPU|OUT_EAT_PREFIX), + INSTR("vsqrt", &Jit::Comp_Generic, Dis_VectorSet2, Int_VV2Op, IS_VFPU|OUT_EAT_PREFIX), + INSTR("vasin", &Jit::Comp_Generic, Dis_VectorSet2, Int_VV2Op, IS_VFPU|OUT_EAT_PREFIX), //24 - INSTR("vnrcp", &Jit::Comp_Generic, Dis_VectorSet2, Int_VV2Op,IS_VFPU), + INSTR("vnrcp", &Jit::Comp_Generic, Dis_VectorSet2, Int_VV2Op,IS_VFPU|OUT_EAT_PREFIX), {-2}, - INSTR("vnsin", &Jit::Comp_Generic, Dis_VectorSet2, Int_VV2Op,IS_VFPU), + INSTR("vnsin", &Jit::Comp_Generic, Dis_VectorSet2, Int_VV2Op,IS_VFPU|OUT_EAT_PREFIX), {-2}, - INSTR("vrexp2",&Jit::Comp_Generic, Dis_VectorSet2, Int_VV2Op, IS_VFPU), + INSTR("vrexp2",&Jit::Comp_Generic, Dis_VectorSet2, Int_VV2Op, IS_VFPU|OUT_EAT_PREFIX), {-2},{-2},{-2}, //32 }; @@ -651,10 +651,10 @@ const MIPSInstruction tableVFPU6[32] = //111100 xxx INSTR("vmscl",&Jit::Comp_Generic, Dis_Generic, Int_Vmscl, IS_VFPU), INSTR("vmscl",&Jit::Comp_Generic, Dis_Generic, Int_Vmscl, IS_VFPU), - INSTR("vcrsp.t/vqmul.q",&Jit::Comp_Generic, Dis_CrossQuat, Int_CrossQuat, IS_VFPU), - INSTR("vcrsp.t/vqmul.q",&Jit::Comp_Generic, Dis_CrossQuat, Int_CrossQuat, IS_VFPU), - INSTR("vcrsp.t/vqmul.q",&Jit::Comp_Generic, Dis_CrossQuat, Int_CrossQuat, IS_VFPU), - INSTR("vcrsp.t/vqmul.q",&Jit::Comp_Generic, Dis_CrossQuat, Int_CrossQuat, IS_VFPU), + INSTR("vcrsp.t/vqmul.q",&Jit::Comp_Generic, Dis_CrossQuat, Int_CrossQuat, IS_VFPU|OUT_EAT_PREFIX), + INSTR("vcrsp.t/vqmul.q",&Jit::Comp_Generic, Dis_CrossQuat, Int_CrossQuat, IS_VFPU|OUT_EAT_PREFIX), + INSTR("vcrsp.t/vqmul.q",&Jit::Comp_Generic, Dis_CrossQuat, Int_CrossQuat, IS_VFPU|OUT_EAT_PREFIX), + INSTR("vcrsp.t/vqmul.q",&Jit::Comp_Generic, Dis_CrossQuat, Int_CrossQuat, IS_VFPU|OUT_EAT_PREFIX), //24 {-2}, {-2}, From d63548799b93f100dd41bb82c8746a1f9539fbf3 Mon Sep 17 00:00:00 2001 From: "Unknown W. Brackets" Date: Sun, 17 Feb 2013 22:18:46 -0800 Subject: [PATCH 034/347] Add more temp regs, allow swapping if necessary. --- Core/MIPS/x86/RegCacheFPU.cpp | 20 ++++++++++++-------- Core/MIPS/x86/RegCacheFPU.h | 16 ++++++++++++++-- 2 files changed, 26 insertions(+), 10 deletions(-) diff --git a/Core/MIPS/x86/RegCacheFPU.cpp b/Core/MIPS/x86/RegCacheFPU.cpp index fa637f7fb59f..28ebf65c266a 100644 --- a/Core/MIPS/x86/RegCacheFPU.cpp +++ b/Core/MIPS/x86/RegCacheFPU.cpp @@ -21,6 +21,8 @@ #include "Core/MIPS/MIPSAnalyst.h" #include "Core/MIPS/x86/RegCacheFPU.h" +u32 FPURegCache::tempValues[NUM_TEMPS]; + FPURegCache::FPURegCache() : emit(0), mips(0) { memset(regs, 0, sizeof(regs)); memset(xregs, 0, sizeof(xregs)); @@ -79,6 +81,11 @@ void FPURegCache::MapRegsV(const u8 *v, VectorSize sz, int flags) { } } +void FPURegCache::ReleaseSpillLock(int mipsreg) +{ + regs[mipsreg].locked = false; +} + void FPURegCache::ReleaseSpillLocks() { for (int i = 0; i < NUM_MIPS_FPRS; i++) regs[i].locked = false; @@ -99,9 +106,7 @@ void FPURegCache::BindToRegister(const int i, bool doLoad, bool makeDirty) { if (!regs[i].location.IsImm() && (regs[i].location.offset & 0x3)) { PanicAlert("WARNING - misaligned fp register location %i", i); } - if (i < TEMP0) { - emit->MOVSS(xr, regs[i].location); - } + emit->MOVSS(xr, regs[i].location); } regs[i].location = newloc; regs[i].away = true; @@ -148,7 +153,7 @@ bool FPURegCache::IsTemp(X64Reg xr) { } void FPURegCache::Flush() { - for (int i = 0; i < TEMP0; i++) { + for (int i = 0; i < NUM_MIPS_FPRS; i++) { if (regs[i].locked) { PanicAlert("Somebody forgot to unlock MIPS reg %i.", i); } @@ -164,16 +169,15 @@ void FPURegCache::Flush() { } } } - for (int i = TEMP0; i < TEMP0 + NUM_TEMPS; ++i) { - DiscardR(i); - } } OpArg FPURegCache::GetDefaultLocation(int reg) const { if (reg < 32) { return M(&mips->f[reg]); - } else { + } else if (reg < 32 + 128) { return M(&mips->v[reg - 32]); + } else { + return M(&tempValues[reg - 32 - 128]); } } diff --git a/Core/MIPS/x86/RegCacheFPU.h b/Core/MIPS/x86/RegCacheFPU.h index af5d2f495323..cda5793bf4a5 100644 --- a/Core/MIPS/x86/RegCacheFPU.h +++ b/Core/MIPS/x86/RegCacheFPU.h @@ -27,14 +27,22 @@ using namespace Gen; // GPRs are numbered 0 to 31 // VFPU regs are numbered 32 to 159. -// Then we have some temp regs for VFPU handling from 160 to 167. +// Then we have some temp regs for VFPU handling from 160 to 171. enum { - NUM_TEMPS = 4, + NUM_TEMPS = 12, TEMP0 = 32 + 128, TEMP1 = TEMP0 + 1, TEMP2 = TEMP0 + 2, TEMP3 = TEMP0 + 3, + TEMP4 = TEMP0 + 4, + TEMP5 = TEMP0 + 5, + TEMP6 = TEMP0 + 6, + TEMP7 = TEMP0 + 7, + TEMP8 = TEMP0 + 8, + TEMP9 = TEMP0 + 9, + TEMP10 = TEMP0 + 10, + TEMP11 = TEMP0 + 11, NUM_MIPS_FPRS = 32 + 128 + NUM_TEMPS, }; @@ -108,6 +116,7 @@ class FPURegCache // Register locking. Prevents them from being spilled. void SpillLock(int p1, int p2=0xff, int p3=0xff, int p4=0xff); + void ReleaseSpillLock(int mipsrega); void ReleaseSpillLocks(); void MapRegV(int vreg, int flags); @@ -130,5 +139,8 @@ class FPURegCache X64CachedFPReg xregs[NUM_X_FPREGS]; MIPSCachedFPReg *vregs; + // TEMP0, etc. are swapped in here if necessary (e.g. on x86.) + static u32 tempValues[NUM_TEMPS]; + XEmitter *emit; }; From 08a42a1aafd00666e3c9612cc0cb6ec354063f84 Mon Sep 17 00:00:00 2001 From: "Unknown W. Brackets" Date: Sun, 17 Feb 2013 22:37:56 -0800 Subject: [PATCH 035/347] Preserve orig regs when applying vfpu prefixes. --- Core/MIPS/x86/CompVFPU.cpp | 21 +++++++++++++-------- Core/MIPS/x86/Jit.h | 8 +++++++- Core/MIPS/x86/RegCacheFPU.cpp | 13 ++++++++++++- Core/MIPS/x86/RegCacheFPU.h | 9 ++++++++- 4 files changed, 40 insertions(+), 11 deletions(-) diff --git a/Core/MIPS/x86/CompVFPU.cpp b/Core/MIPS/x86/CompVFPU.cpp index ff16fb25fb72..e014ffe78250 100644 --- a/Core/MIPS/x86/CompVFPU.cpp +++ b/Core/MIPS/x86/CompVFPU.cpp @@ -75,9 +75,6 @@ void Jit::Comp_VPFX(u32 op) } } - -// TODO: Got register value ownership issues. We need to be sure that if we modify input -// like this, it does NOT get written back! void Jit::ApplyPrefixST(u8 *vregs, u32 prefix, VectorSize sz) { if (prefix == 0xE4) return; @@ -86,10 +83,7 @@ void Jit::ApplyPrefixST(u8 *vregs, u32 prefix, VectorSize sz) { static const float constantArray[8] = {0.f, 1.f, 2.f, 0.5f, 3.f, 1.f/3.f, 0.25f, 1.f/6.f}; for (int i = 0; i < n; i++) - { - // TODO: This needs to be the original values, not the original regs. (e.g. [-x, |x|, x]) origV[i] = vregs[i]; - } for (int i = 0; i < n; i++) { @@ -98,22 +92,33 @@ void Jit::ApplyPrefixST(u8 *vregs, u32 prefix, VectorSize sz) { int negate = (prefix >> (16+i)) & 1; int constants = (prefix >> (12+i)) & 1; + // Unchanged, hurray. + if (!constants && regnum == i && !abs && !negate) + continue; + + // This puts the value into a temp reg, so we won't write the modified value back. + vregs[i] = fpr.GetTempV(); + fpr.MapRegV(vregs[i], MAP_NOINIT | MAP_DIRTY); + if (!constants) { // Prefix may say "z, z, z, z" but if this is a pair, we force to x. // TODO: But some ops seem to use const 0 instead? if (regnum > n) { regnum = 0; } - vregs[i] = origV[regnum]; + MOVSS(fpr.VX(vregs[i]), fpr.V(origV[regnum])); if (abs) { ANDPS(fpr.VX(vregs[i]), M((void *)&noSignMask)); } - } else { + } else { MOVSS(fpr.VX(vregs[i]), M((void *)&constantArray[regnum + (abs<<2)])); } if (negate) XORPS(fpr.VX(vregs[i]), M((void *)&signBitLower)); + + // TODO: This probably means it will swap out soon, inefficiently... + fpr.ReleaseSpillLockV(vregs[i]); } } diff --git a/Core/MIPS/x86/Jit.h b/Core/MIPS/x86/Jit.h index 4b20de372d78..13c38b354815 100644 --- a/Core/MIPS/x86/Jit.h +++ b/Core/MIPS/x86/Jit.h @@ -79,7 +79,7 @@ struct JitState prefixDFlag = PREFIX_UNKNOWN; } bool MayHavePrefix() const { - if (!(prefixSFlag & PREFIX_KNOWN) || !(prefixTFlag & PREFIX_KNOWN) || !(prefixDFlag & PREFIX_KNOWN)) { + if (HasUnknownPrefix()) { return true; } else if (prefixS != 0xE4 || prefixT != 0xE4 || prefixD != 0) { return true; @@ -89,6 +89,12 @@ struct JitState return false; } + bool HasUnknownPrefix() const { + if (!(prefixSFlag & PREFIX_KNOWN) || !(prefixTFlag & PREFIX_KNOWN) || !(prefixDFlag & PREFIX_KNOWN)) { + return true; + } + return false; + } void EatPrefix() { if ((prefixSFlag & PREFIX_KNOWN) == 0 || prefixS != 0xE4) { prefixSFlag = PREFIX_KNOWN_DIRTY; diff --git a/Core/MIPS/x86/RegCacheFPU.cpp b/Core/MIPS/x86/RegCacheFPU.cpp index 28ebf65c266a..34a03a47eeca 100644 --- a/Core/MIPS/x86/RegCacheFPU.cpp +++ b/Core/MIPS/x86/RegCacheFPU.cpp @@ -148,10 +148,21 @@ void FPURegCache::DiscardR(int i) { } } -bool FPURegCache::IsTemp(X64Reg xr) { +bool FPURegCache::IsTempX(X64Reg xr) { return xregs[xr].mipsReg >= TEMP0; } +int FPURegCache::GetTempR() { + for (int r = TEMP0; r < TEMP0 + NUM_TEMPS; ++r) { + if (!regs[r].away) { + return r; + } + } + + _assert_msg_(DYNA_REC, 0, "Regcache ran out of temp regs, might need to DiscardR() some."); + return -1; +} + void FPURegCache::Flush() { for (int i = 0; i < NUM_MIPS_FPRS; i++) { if (regs[i].locked) { diff --git a/Core/MIPS/x86/RegCacheFPU.h b/Core/MIPS/x86/RegCacheFPU.h index cda5793bf4a5..772dd0cb35ed 100644 --- a/Core/MIPS/x86/RegCacheFPU.h +++ b/Core/MIPS/x86/RegCacheFPU.h @@ -88,7 +88,11 @@ class FPURegCache void DiscardV(int vreg) { DiscardR(vreg + 32); } - bool IsTemp(X64Reg xreg); + bool IsTempX(X64Reg xreg); + int GetTempR(); + int GetTempV() { + return GetTempR() - 32; + } void SetEmitter(XEmitter *emitter) {emit = emitter;} @@ -127,6 +131,9 @@ class FPURegCache } void SpillLockV(const u8 *v, VectorSize vsz); void SpillLockV(int vec, VectorSize vsz); + void ReleaseSpillLockV(int vreg) { + ReleaseSpillLock(vreg + 32); + } MIPSState *mips; From 27942606ad480910a5db9a3228a3dcf52fa2b481 Mon Sep 17 00:00:00 2001 From: "Unknown W. Brackets" Date: Sun, 17 Feb 2013 22:46:12 -0800 Subject: [PATCH 036/347] Use prefixD directly in jit, just like interp now. --- Core/MIPS/MIPSIntVFPU.cpp | 29 ++++++++++++----------------- Core/MIPS/x86/CompVFPU.cpp | 35 +++++++++++++++++------------------ Core/MIPS/x86/Jit.h | 14 ++++++++++---- 3 files changed, 39 insertions(+), 39 deletions(-) diff --git a/Core/MIPS/MIPSIntVFPU.cpp b/Core/MIPS/MIPSIntVFPU.cpp index f861340d8c40..d66f33630861 100644 --- a/Core/MIPS/MIPSIntVFPU.cpp +++ b/Core/MIPS/MIPSIntVFPU.cpp @@ -145,27 +145,22 @@ inline void ApplySwizzleT(float *v, VectorSize size) void ApplyPrefixD(float *v, VectorSize size, bool onlyWriteMask = false) { u32 data = currentMIPS->vfpuCtrl[VFPU_CTRL_DPREFIX]; - if (!data) + if (!data || onlyWriteMask) return; int n = GetNumVectorElements(size); - bool writeMask[4]; for (int i = 0; i < n; i++) { - int mask = (data >> (8 + i)) & 1; - writeMask[i] = mask ? true : false; - if (!onlyWriteMask) { - int sat = (data >> (i * 2)) & 3; - if (sat == 1) - { - if (v[i] > 1.0f) v[i] = 1.0f; - // This includes -0.0f -> +0.0f. - if (v[i] <= 0.0f) v[i] = 0.0f; - } - else if (sat == 3) - { - if (v[i] > 1.0f) v[i] = 1.0f; - if (v[i] < -1.0f) v[i] = -1.0f; - } + int sat = (data >> (i * 2)) & 3; + if (sat == 1) + { + if (v[i] > 1.0f) v[i] = 1.0f; + // This includes -0.0f -> +0.0f. + if (v[i] <= 0.0f) v[i] = 0.0f; + } + else if (sat == 3) + { + if (v[i] > 1.0f) v[i] = 1.0f; + if (v[i] < -1.0f) v[i] = -1.0f; } } } diff --git a/Core/MIPS/x86/CompVFPU.cpp b/Core/MIPS/x86/CompVFPU.cpp index e014ffe78250..d4d689091c1f 100644 --- a/Core/MIPS/x86/CompVFPU.cpp +++ b/Core/MIPS/x86/CompVFPU.cpp @@ -124,27 +124,21 @@ void Jit::ApplyPrefixST(u8 *vregs, u32 prefix, VectorSize sz) { void Jit::ApplyPrefixD(const u8 *vregs, u32 prefix, VectorSize sz, bool onlyWriteMask) { _assert_(js.prefixDFlag & JitState::PREFIX_KNOWN); - if (!prefix) return; + if (!prefix || onlyWriteMask) return; int n = GetNumVectorElements(sz); for (int i = 0; i < n; i++) { - int mask = (prefix >> (8 + i)) & 1; - js.writeMask[i] = mask ? true : false; - if (onlyWriteMask) - continue; - if (!mask) { - int sat = (prefix >> (i * 2)) & 3; - if (sat == 1) - { - MAXSS(fpr.VX(vregs[i]), M((void *)&zero)); - MINSS(fpr.VX(vregs[i]), M((void *)&one)); - } - else if (sat == 3) - { - MAXSS(fpr.VX(vregs[i]), M((void *)&minus_one)); - MINSS(fpr.VX(vregs[i]), M((void *)&one)); - } + int sat = (prefix >> (i * 2)) & 3; + if (sat == 1) + { + MAXSS(fpr.VX(vregs[i]), M((void *)&zero)); + MINSS(fpr.VX(vregs[i]), M((void *)&one)); + } + else if (sat == 3) + { + MAXSS(fpr.VX(vregs[i]), M((void *)&minus_one)); + MINSS(fpr.VX(vregs[i]), M((void *)&one)); } } } @@ -323,8 +317,13 @@ void Jit::Comp_SVQ(u32 op) void Jit::Comp_VDot(u32 op) { CONDITIONAL_DISABLE; + if (js.HasUnknownPrefix()) { + Comp_Generic(op); + return; + } + // No-op. - if (js.writeMask[0]) { + if (js.VfpuWriteMask(0)) { return; } diff --git a/Core/MIPS/x86/Jit.h b/Core/MIPS/x86/Jit.h index 13c38b354815..fadc83f9b7a4 100644 --- a/Core/MIPS/x86/Jit.h +++ b/Core/MIPS/x86/Jit.h @@ -69,7 +69,6 @@ struct JitState u32 prefixS; u32 prefixT; u32 prefixD; - bool writeMask[4]; PrefixState prefixSFlag; PrefixState prefixTFlag; PrefixState prefixDFlag; @@ -83,7 +82,7 @@ struct JitState return true; } else if (prefixS != 0xE4 || prefixT != 0xE4 || prefixD != 0) { return true; - } else if (writeMask[0] || writeMask[1] || writeMask[2] || writeMask[3]) { + } else if (VfpuWriteMask() != 0) { return true; } @@ -104,12 +103,19 @@ struct JitState prefixTFlag = PREFIX_KNOWN_DIRTY; prefixT = 0xE4; } - if ((prefixDFlag & PREFIX_KNOWN) == 0 || prefixD != 0x0 || writeMask[0] || writeMask[1] || writeMask[2] || writeMask[3]) { + if ((prefixDFlag & PREFIX_KNOWN) == 0 || prefixD != 0x0 || VfpuWriteMask() != 0) { prefixDFlag = PREFIX_KNOWN_DIRTY; prefixD = 0x0; - writeMask[0] = writeMask[1] = writeMask[2] = writeMask[3] = false; } } + u8 VfpuWriteMask() const { + _assert_(prefixDFlag & JitState::PREFIX_KNOWN); + return (prefixD >> 8) & 0xF; + } + bool VfpuWriteMask(int i) const { + _assert_(prefixDFlag & JitState::PREFIX_KNOWN); + return (prefixD >> (8 + i)) & 1; + } }; enum CompileDelaySlotFlags From 18c03d0816ab2a03050337d64d8ac74451f84d97 Mon Sep 17 00:00:00 2001 From: "Unknown W. Brackets" Date: Sun, 17 Feb 2013 23:14:22 -0800 Subject: [PATCH 037/347] Handle temp regs better, no need for direct access. --- Core/MIPS/x86/RegCacheFPU.cpp | 5 ++++- Core/MIPS/x86/RegCacheFPU.h | 19 ++++++------------- 2 files changed, 10 insertions(+), 14 deletions(-) diff --git a/Core/MIPS/x86/RegCacheFPU.cpp b/Core/MIPS/x86/RegCacheFPU.cpp index 34a03a47eeca..f4279dd869c4 100644 --- a/Core/MIPS/x86/RegCacheFPU.cpp +++ b/Core/MIPS/x86/RegCacheFPU.cpp @@ -27,6 +27,7 @@ FPURegCache::FPURegCache() : emit(0), mips(0) { memset(regs, 0, sizeof(regs)); memset(xregs, 0, sizeof(xregs)); vregs = regs + 32; + tempRoundRobin = 0; } void FPURegCache::Start(MIPSState *mips, MIPSAnalyst::AnalysisResults &stats) { @@ -153,7 +154,9 @@ bool FPURegCache::IsTempX(X64Reg xr) { } int FPURegCache::GetTempR() { - for (int r = TEMP0; r < TEMP0 + NUM_TEMPS; ++r) { + for (int i = 0; i < NUM_TEMPS; ++i) { + // Make sure we don't give out the same one over and over, even if not locked. + int r = TEMP0 + (tempRoundRobin++ + i) % NUM_TEMPS; if (!regs[r].away) { return r; } diff --git a/Core/MIPS/x86/RegCacheFPU.h b/Core/MIPS/x86/RegCacheFPU.h index 772dd0cb35ed..4fbdd1022094 100644 --- a/Core/MIPS/x86/RegCacheFPU.h +++ b/Core/MIPS/x86/RegCacheFPU.h @@ -27,22 +27,14 @@ using namespace Gen; // GPRs are numbered 0 to 31 // VFPU regs are numbered 32 to 159. -// Then we have some temp regs for VFPU handling from 160 to 171. +// Then we have some temp regs for VFPU handling from 160 to 175. + +// Temp regs: 4 from S prefix, 4 from T prefix, 4 from D mask, and 4 for work (worst case.) +// But most of the time prefixes aren't used that heavily so we won't use all of them. enum { - NUM_TEMPS = 12, + NUM_TEMPS = 16, TEMP0 = 32 + 128, - TEMP1 = TEMP0 + 1, - TEMP2 = TEMP0 + 2, - TEMP3 = TEMP0 + 3, - TEMP4 = TEMP0 + 4, - TEMP5 = TEMP0 + 5, - TEMP6 = TEMP0 + 6, - TEMP7 = TEMP0 + 7, - TEMP8 = TEMP0 + 8, - TEMP9 = TEMP0 + 9, - TEMP10 = TEMP0 + 10, - TEMP11 = TEMP0 + 11, NUM_MIPS_FPRS = 32 + 128 + NUM_TEMPS, }; @@ -148,6 +140,7 @@ class FPURegCache // TEMP0, etc. are swapped in here if necessary (e.g. on x86.) static u32 tempValues[NUM_TEMPS]; + int tempRoundRobin; XEmitter *emit; }; From 8ea59990ab8413c54ae83db69d3299f98e4b2d07 Mon Sep 17 00:00:00 2001 From: "Unknown W. Brackets" Date: Sun, 17 Feb 2013 23:15:16 -0800 Subject: [PATCH 038/347] Make applying prefixes mostly automatic. And implement (hopefully) D prefixes. --- Core/MIPS/x86/CompVFPU.cpp | 51 ++++++++++++++++++++++++-------------- Core/MIPS/x86/Jit.h | 13 +++++++++- 2 files changed, 45 insertions(+), 19 deletions(-) diff --git a/Core/MIPS/x86/CompVFPU.cpp b/Core/MIPS/x86/CompVFPU.cpp index d4d689091c1f..16a59cd9ca6e 100644 --- a/Core/MIPS/x86/CompVFPU.cpp +++ b/Core/MIPS/x86/CompVFPU.cpp @@ -122,21 +122,42 @@ void Jit::ApplyPrefixST(u8 *vregs, u32 prefix, VectorSize sz) { } } -void Jit::ApplyPrefixD(const u8 *vregs, u32 prefix, VectorSize sz, bool onlyWriteMask) { +void Jit::GetVectorRegsPrefixD(u8 *regs, VectorSize sz, int vectorReg) { _assert_(js.prefixDFlag & JitState::PREFIX_KNOWN); - if (!prefix || onlyWriteMask) return; + + GetVectorRegs(regs, sz, vectorReg); + if (js.prefixD == 0) + return; + + int n = GetNumVectorElements(sz); + for (int i = 0; i < n; i++) + { + // Hopefully this is rare, we'll just write it into a reg we drop. + if (js.VfpuWriteMask(i)) + regs[i] = fpr.GetTempV(); + } +} + +void Jit::ApplyPrefixD(const u8 *vregs, VectorSize sz) { + _assert_(js.prefixDFlag & JitState::PREFIX_KNOWN); + if (!js.prefixD) return; int n = GetNumVectorElements(sz); for (int i = 0; i < n; i++) { - int sat = (prefix >> (i * 2)) & 3; + if (js.VfpuWriteMask(i)) + continue; + + int sat = (js.prefixD >> (i * 2)) & 3; if (sat == 1) { + fpr.MapRegV(vregs[i], MAP_DIRTY); MAXSS(fpr.VX(vregs[i]), M((void *)&zero)); MINSS(fpr.VX(vregs[i]), M((void *)&one)); } else if (sat == 3) { + fpr.MapRegV(vregs[i], MAP_DIRTY); MAXSS(fpr.VX(vregs[i]), M((void *)&minus_one)); MINSS(fpr.VX(vregs[i]), M((void *)&one)); } @@ -322,12 +343,7 @@ void Jit::Comp_VDot(u32 op) { return; } - // No-op. - if (js.VfpuWriteMask(0)) { - return; - } - - // WARNING: No prefix support! + // WARNING: No prefix support! (maybe soon) if (js.MayHavePrefix()) { Comp_Generic(op); return; @@ -340,11 +356,9 @@ void Jit::Comp_VDot(u32 op) { // TODO: Force read one of them into regs? probably not. u8 sregs[4], tregs[4], dregs[1]; - GetVectorRegs(sregs, sz, vs); - GetVectorRegs(tregs, sz, vt); - GetVectorRegs(dregs, V_Single, vd); - - // TODO: applyprefixST here somehow (shuffle, etc...) + GetVectorRegsPrefixS(sregs, sz, vs); + GetVectorRegsPrefixT(tregs, sz, vt); + GetVectorRegsPrefixD(dregs, V_Single, vd); int n = GetNumVectorElements(sz); X64Reg tempxreg = XMM0; @@ -370,7 +384,7 @@ void Jit::Comp_VDot(u32 op) { MOVSS(fpr.V(dregs[0]), tempxreg); } - // TODO: applyprefixD here somehow (write mask etc..) + ApplyPrefixD(dregs, V_Single); fpr.ReleaseSpillLocks(); } @@ -440,9 +454,10 @@ void Jit::Comp_VecDo3(u32 op) { tempxregs[i] = (X64Reg) (XMM0 + i); else { - fpr.BindToRegister(TEMP0 + i, false, true); - fpr.SpillLock(TEMP0 + i); - tempxregs[i] = fpr.RX(TEMP0 + i); + int reg = fpr.GetTempV(); + fpr.MapRegV(reg, MAP_NOINIT | MAP_DIRTY); + fpr.SpillLockV(reg); + tempxregs[i] = fpr.VX(reg); } } else diff --git a/Core/MIPS/x86/Jit.h b/Core/MIPS/x86/Jit.h index fadc83f9b7a4..a0f69d180ab1 100644 --- a/Core/MIPS/x86/Jit.h +++ b/Core/MIPS/x86/Jit.h @@ -184,7 +184,18 @@ class Jit : public Gen::XCodeBlock void Comp_DoNothing(u32 op); void ApplyPrefixST(u8 *vregs, u32 prefix, VectorSize sz); - void ApplyPrefixD(const u8 *vregs, u32 prefix, VectorSize sz, bool onlyWriteMask = false); + void ApplyPrefixD(const u8 *vregs, VectorSize sz); + void GetVectorRegsPrefixS(u8 *regs, VectorSize sz, int vectorReg) { + _assert_(js.prefixSFlag & JitState::PREFIX_KNOWN); + GetVectorRegs(regs, sz, vectorReg); + ApplyPrefixST(regs, js.prefixS, sz); + } + void GetVectorRegsPrefixT(u8 *regs, VectorSize sz, int vectorReg) { + _assert_(js.prefixTFlag & JitState::PREFIX_KNOWN); + GetVectorRegs(regs, sz, vectorReg); + ApplyPrefixST(regs, js.prefixT, sz); + } + void GetVectorRegsPrefixD(u8 *regs, VectorSize sz, int vectorReg); void EatPrefix() { js.EatPrefix(); } JitBlockCache *GetBlockCache() { return &blocks; } From 6855398add0235cecdf790a78b4965349e394c11 Mon Sep 17 00:00:00 2001 From: "Unknown W. Brackets" Date: Mon, 18 Feb 2013 00:09:19 -0800 Subject: [PATCH 039/347] Support known prefixes in the vfpu jit. --- Core/MIPS/x86/CompVFPU.cpp | 19 +++++++------------ 1 file changed, 7 insertions(+), 12 deletions(-) diff --git a/Core/MIPS/x86/CompVFPU.cpp b/Core/MIPS/x86/CompVFPU.cpp index 16a59cd9ca6e..6ebfb11fa762 100644 --- a/Core/MIPS/x86/CompVFPU.cpp +++ b/Core/MIPS/x86/CompVFPU.cpp @@ -104,6 +104,7 @@ void Jit::ApplyPrefixST(u8 *vregs, u32 prefix, VectorSize sz) { // Prefix may say "z, z, z, z" but if this is a pair, we force to x. // TODO: But some ops seem to use const 0 instead? if (regnum > n) { + ERROR_LOG(CPU, "Invalid VFPU swizzle: %08x / %d", prefix, sz); regnum = 0; } MOVSS(fpr.VX(vregs[i]), fpr.V(origV[regnum])); @@ -343,12 +344,6 @@ void Jit::Comp_VDot(u32 op) { return; } - // WARNING: No prefix support! (maybe soon) - if (js.MayHavePrefix()) { - Comp_Generic(op); - return; - } - int vd = _VD; int vs = _VS; int vt = _VT; @@ -392,9 +387,7 @@ void Jit::Comp_VDot(u32 op) { void Jit::Comp_VecDo3(u32 op) { CONDITIONAL_DISABLE; - // WARNING: No prefix support! - if (js.MayHavePrefix()) - { + if (js.HasUnknownPrefix()) { Comp_Generic(op); return; } @@ -405,9 +398,9 @@ void Jit::Comp_VecDo3(u32 op) { VectorSize sz = GetVecSize(op); u8 sregs[4], tregs[4], dregs[4]; - GetVectorRegs(sregs, sz, vs); - GetVectorRegs(tregs, sz, vt); - GetVectorRegs(dregs, sz, vd); + GetVectorRegsPrefixS(sregs, sz, vs); + GetVectorRegsPrefixT(tregs, sz, vt); + GetVectorRegsPrefixD(dregs, sz, vd); void (XEmitter::*xmmop)(X64Reg, OpArg) = NULL; switch (op >> 26) @@ -481,6 +474,8 @@ void Jit::Comp_VecDo3(u32 op) { MOVSS(fpr.V(dregs[i]), tempxregs[i]); } + ApplyPrefixD(dregs, sz); + fpr.ReleaseSpillLocks(); } From 0bfc380575986ad8128639cfe041bc2834b9f261 Mon Sep 17 00:00:00 2001 From: "Unknown W. Brackets" Date: Mon, 18 Feb 2013 00:32:42 -0800 Subject: [PATCH 040/347] Try to reuse temp regs for better caching. --- Core/MIPS/x86/CompVFPU.cpp | 1 + Core/MIPS/x86/RegCacheFPU.cpp | 11 ++++++----- Core/MIPS/x86/RegCacheFPU.h | 3 ++- 3 files changed, 9 insertions(+), 6 deletions(-) diff --git a/Core/MIPS/x86/CompVFPU.cpp b/Core/MIPS/x86/CompVFPU.cpp index 6ebfb11fa762..3343bddac0ac 100644 --- a/Core/MIPS/x86/CompVFPU.cpp +++ b/Core/MIPS/x86/CompVFPU.cpp @@ -431,6 +431,7 @@ void Jit::Comp_VecDo3(u32 op) { if (xmmop == NULL) { + fpr.ReleaseSpillLocks(); Comp_Generic(op); return; } diff --git a/Core/MIPS/x86/RegCacheFPU.cpp b/Core/MIPS/x86/RegCacheFPU.cpp index f4279dd869c4..9256a6d8fae7 100644 --- a/Core/MIPS/x86/RegCacheFPU.cpp +++ b/Core/MIPS/x86/RegCacheFPU.cpp @@ -27,7 +27,6 @@ FPURegCache::FPURegCache() : emit(0), mips(0) { memset(regs, 0, sizeof(regs)); memset(xregs, 0, sizeof(xregs)); vregs = regs + 32; - tempRoundRobin = 0; } void FPURegCache::Start(MIPSState *mips, MIPSAnalyst::AnalysisResults &stats) { @@ -40,6 +39,7 @@ void FPURegCache::Start(MIPSState *mips, MIPSAnalyst::AnalysisResults &stats) { regs[i].location = GetDefaultLocation(i); regs[i].away = false; regs[i].locked = false; + regs[i].tempLocked = false; } } @@ -144,8 +144,10 @@ void FPURegCache::DiscardR(int i) { xregs[xr].mipsReg = -1; regs[i].location = GetDefaultLocation(i); regs[i].away = false; + regs[i].tempLocked = false; } else { // _assert_msg_(DYNA_REC,0,"already stored"); + regs[i].tempLocked = false; } } @@ -154,10 +156,9 @@ bool FPURegCache::IsTempX(X64Reg xr) { } int FPURegCache::GetTempR() { - for (int i = 0; i < NUM_TEMPS; ++i) { - // Make sure we don't give out the same one over and over, even if not locked. - int r = TEMP0 + (tempRoundRobin++ + i) % NUM_TEMPS; - if (!regs[r].away) { + for (int r = TEMP0; r < TEMP0 + NUM_TEMPS; ++r) { + if (!regs[r].away && !regs[r].tempLocked) { + regs[r].tempLocked = true; return r; } } diff --git a/Core/MIPS/x86/RegCacheFPU.h b/Core/MIPS/x86/RegCacheFPU.h index 4fbdd1022094..37d7c4c2e6a4 100644 --- a/Core/MIPS/x86/RegCacheFPU.h +++ b/Core/MIPS/x86/RegCacheFPU.h @@ -53,6 +53,8 @@ struct MIPSCachedFPReg { OpArg location; bool away; // value not in source register bool locked; + // Only for temp regs. + bool tempLocked; }; enum { @@ -140,7 +142,6 @@ class FPURegCache // TEMP0, etc. are swapped in here if necessary (e.g. on x86.) static u32 tempValues[NUM_TEMPS]; - int tempRoundRobin; XEmitter *emit; }; From afb7c0b83c87cfbbe76c84c9ea023e8817f4b24c Mon Sep 17 00:00:00 2001 From: "Unknown W. Brackets" Date: Mon, 18 Feb 2013 01:14:57 -0800 Subject: [PATCH 041/347] Assume prefixes start default until proven wrong. Currently this means nothing since the MIPSTables flags are wrong. It will blow the cache once, after the first vfpu op. --- Core/MIPS/MIPS.cpp | 9 +++++++-- Core/MIPS/x86/Jit.cpp | 23 ++++++++++++++++++++++- Core/MIPS/x86/Jit.h | 9 +++++++++ 3 files changed, 38 insertions(+), 3 deletions(-) diff --git a/Core/MIPS/MIPS.cpp b/Core/MIPS/MIPS.cpp index 478d2c99e509..f7fc64a752b5 100644 --- a/Core/MIPS/MIPS.cpp +++ b/Core/MIPS/MIPS.cpp @@ -45,8 +45,11 @@ MIPSState::MIPSState() MIPSState::~MIPSState() { - delete MIPSComp::jit; - MIPSComp::jit = 0; + if (MIPSComp::jit) + { + delete MIPSComp::jit; + MIPSComp::jit = 0; + } } void MIPSState::Reset() @@ -107,6 +110,8 @@ void MIPSState::DoState(PointerWrap &p) // Reset the jit if we're loading. if (p.mode == p.MODE_READ) Reset(); + if (MIPSComp::jit) + MIPSComp::jit->DoState(p); p.DoArray(r, sizeof(r) / sizeof(r[0])); p.DoArray(f, sizeof(f) / sizeof(f[0])); diff --git a/Core/MIPS/x86/Jit.cpp b/Core/MIPS/x86/Jit.cpp index 7a817e5c8bb5..affcc7fd197b 100644 --- a/Core/MIPS/x86/Jit.cpp +++ b/Core/MIPS/x86/Jit.cpp @@ -17,6 +17,7 @@ #include #include +#include "Common/ChunkFile.h" #include "../../Core.h" #include "../../CoreTiming.h" #include "../../Config.h" @@ -103,6 +104,15 @@ Jit::Jit(MIPSState *mips) : blocks(mips), mips_(mips) gpr.SetEmitter(this); fpr.SetEmitter(this); AllocCodeSpace(1024 * 1024 * 16); + + // TODO: If it becomes possible to switch from the interpreter, this should be set right. + js.startDefaultPrefix = true; +} + +void Jit::DoState(PointerWrap &p) +{ + p.Do(js.startDefaultPrefix); + p.DoMarker("Jit"); } void Jit::FlushAll() @@ -202,6 +212,17 @@ void Jit::Compile(u32 em_address) int block_num = blocks.AllocateBlock(em_address); JitBlock *b = blocks.GetBlock(block_num); blocks.FinalizeBlock(block_num, jo.enableBlocklink, DoJit(em_address, b)); + + // Drat. The VFPU hit an uneaten prefix at the end of a block. + if (js.startDefaultPrefix && js.MayHavePrefix()) + { + js.startDefaultPrefix = false; + // Our assumptions are all wrong so it's clean-slate time. + ClearCache(); + + // Let's try that one more time. We won't get back here because we toggled the value. + Compile(em_address); + } } void Jit::RunLoopUntil(u64 globalticks) @@ -285,7 +306,7 @@ void Jit::Comp_Generic(u32 op) // Might have eaten prefixes, hard to tell... const int info = MIPSGetInfo(op); if ((info & IS_VFPU) != 0 && (info & OUT_EAT_PREFIX) == 0) - js.PrefixStart(); + js.PrefixUnknown(); } void Jit::WriteExit(u32 destination, int exit_num) diff --git a/Core/MIPS/x86/Jit.h b/Core/MIPS/x86/Jit.h index a0f69d180ab1..cf8637639318 100644 --- a/Core/MIPS/x86/Jit.h +++ b/Core/MIPS/x86/Jit.h @@ -66,6 +66,7 @@ struct JitState JitBlock *curBlock; // VFPU prefix magic + bool startDefaultPrefix; u32 prefixS; u32 prefixT; u32 prefixD; @@ -73,6 +74,13 @@ struct JitState PrefixState prefixTFlag; PrefixState prefixDFlag; void PrefixStart() { + if (startDefaultPrefix) { + EatPrefix(); + } else { + PrefixUnknown(); + } + } + void PrefixUnknown() { prefixSFlag = PREFIX_UNKNOWN; prefixTFlag = PREFIX_UNKNOWN; prefixDFlag = PREFIX_UNKNOWN; @@ -134,6 +142,7 @@ class Jit : public Gen::XCodeBlock { public: Jit(MIPSState *mips); + void DoState(PointerWrap &p); // Compiled ops should ignore delay slots // the compiler will take care of them by itself From dacbcbdf2bfeef7dd29e3e2ceccbd0395106137c Mon Sep 17 00:00:00 2001 From: "Unknown W. Brackets" Date: Mon, 18 Feb 2013 01:18:46 -0800 Subject: [PATCH 042/347] Add a MIPSTables flag for ignoring the prefix. --- Core/MIPS/MIPSTables.cpp | 14 +++++++------- Core/MIPS/MIPSTables.h | 1 + Core/MIPS/x86/Jit.cpp | 9 ++++++--- 3 files changed, 14 insertions(+), 10 deletions(-) diff --git a/Core/MIPS/MIPSTables.cpp b/Core/MIPS/MIPSTables.cpp index d792c800ebdd..3d4288912540 100644 --- a/Core/MIPS/MIPSTables.cpp +++ b/Core/MIPS/MIPSTables.cpp @@ -147,22 +147,22 @@ const MIPSInstruction tableImmediate[64] = //xxxxxx ..... //48 INSTR("ll", &Jit::Comp_Generic, Dis_Generic, Int_StoreSync, 0), INSTR("lwc1", &Jit::Comp_FPULS, Dis_FPULS, Int_FPULS, IN_RT|IN_RS_ADDR), - INSTR("lv.s", &Jit::Comp_SV, Dis_SV, Int_SV, IS_VFPU), + INSTR("lv.s", &Jit::Comp_SV, Dis_SV, Int_SV, IS_VFPU|VFPU_NO_PREFIX), {-2}, // HIT THIS IN WIPEOUT {VFPU4Jump}, - INSTR("lv", &Jit::Comp_SVQ, Dis_SVLRQ, Int_SVQ, IS_VFPU), - INSTR("lv.q", &Jit::Comp_SVQ, Dis_SVQ, Int_SVQ, IS_VFPU), //copU + INSTR("lv", &Jit::Comp_SVQ, Dis_SVLRQ, Int_SVQ, IS_VFPU|VFPU_NO_PREFIX), + INSTR("lv.q", &Jit::Comp_SVQ, Dis_SVQ, Int_SVQ, IS_VFPU|VFPU_NO_PREFIX), //copU {VFPU5}, //56 INSTR("sc", &Jit::Comp_Generic, Dis_Generic, Int_StoreSync, 0), INSTR("swc1", &Jit::Comp_FPULS, Dis_FPULS, Int_FPULS, 0), //copU - INSTR("sv.s", &Jit::Comp_SV, Dis_SV, Int_SV,IS_VFPU), + INSTR("sv.s", &Jit::Comp_SV, Dis_SV, Int_SV,IS_VFPU|VFPU_NO_PREFIX), {-2}, //60 {VFPU6}, - INSTR("sv", &Jit::Comp_SVQ, Dis_SVLRQ, Int_SVQ, IS_VFPU), //copU - INSTR("sv.q", &Jit::Comp_SVQ, Dis_SVQ, Int_SVQ, IS_VFPU), - INSTR("vflush", &Jit::Comp_Generic, Dis_Vflush, Int_Vflush, IS_VFPU), + INSTR("sv", &Jit::Comp_SVQ, Dis_SVLRQ, Int_SVQ, IS_VFPU|VFPU_NO_PREFIX), //copU + INSTR("sv.q", &Jit::Comp_SVQ, Dis_SVQ, Int_SVQ, IS_VFPU|VFPU_NO_PREFIX), + INSTR("vflush", &Jit::Comp_Generic, Dis_Vflush, Int_Vflush, IS_VFPU|VFPU_NO_PREFIX), }; const MIPSInstruction tableSpecial[64] = /// 000000 ...... ...... .......... xxxxxx diff --git a/Core/MIPS/MIPSTables.h b/Core/MIPS/MIPSTables.h index 18ee23b42fe1..68e453af9999 100644 --- a/Core/MIPS/MIPSTables.h +++ b/Core/MIPS/MIPSTables.h @@ -45,6 +45,7 @@ #define OUT_FPUFLAG 0x02000000 #define OUT_EAT_PREFIX 0x04000000 +#define VFPU_NO_PREFIX 0x08000000 #define IS_VFPU 0x80000000 #ifndef CDECL diff --git a/Core/MIPS/x86/Jit.cpp b/Core/MIPS/x86/Jit.cpp index affcc7fd197b..5b56caad72ca 100644 --- a/Core/MIPS/x86/Jit.cpp +++ b/Core/MIPS/x86/Jit.cpp @@ -303,10 +303,13 @@ void Jit::Comp_Generic(u32 op) else _dbg_assert_msg_(JIT, 0, "Trying to compile instruction that can't be interpreted"); - // Might have eaten prefixes, hard to tell... const int info = MIPSGetInfo(op); - if ((info & IS_VFPU) != 0 && (info & OUT_EAT_PREFIX) == 0) - js.PrefixUnknown(); + if ((info & IS_VFPU) != 0 && (info & VFPU_NO_PREFIX) == 0) + { + // If it does eat them, it'll happen in MIPSCompileOp(). + if ((info & OUT_EAT_PREFIX) == 0) + js.PrefixUnknown(); + } } void Jit::WriteExit(u32 destination, int exit_num) From 33c1a2b4facc2e04ea484e153e0e61115e5cfd30 Mon Sep 17 00:00:00 2001 From: "Unknown W. Brackets" Date: Mon, 18 Feb 2013 01:54:25 -0800 Subject: [PATCH 043/347] ARM buildfix. --- Core/MIPS/ARM/ArmJit.cpp | 5 +++++ Core/MIPS/ARM/ArmJit.h | 1 + 2 files changed, 6 insertions(+) diff --git a/Core/MIPS/ARM/ArmJit.cpp b/Core/MIPS/ARM/ArmJit.cpp index 7933a76f5ac1..132b2e9f928b 100644 --- a/Core/MIPS/ARM/ArmJit.cpp +++ b/Core/MIPS/ARM/ArmJit.cpp @@ -63,6 +63,11 @@ Jit::Jit(MIPSState *mips) : blocks(mips), gpr(mips), mips_(mips) GenerateFixedCode(); } +void Jit::DoState(PointerWrap &p) +{ + p.DoMarker("Jit"); +} + void Jit::FlushAll() { gpr.FlushAll(); diff --git a/Core/MIPS/ARM/ArmJit.h b/Core/MIPS/ARM/ArmJit.h index 0dc0338e7d88..1cb80e2d4f34 100644 --- a/Core/MIPS/ARM/ArmJit.h +++ b/Core/MIPS/ARM/ArmJit.h @@ -64,6 +64,7 @@ class Jit : public ArmGen::ARMXCodeBlock { public: Jit(MIPSState *mips); + void DoState(PointerWrap &p); // Compiled ops should ignore delay slots // the compiler will take care of them by itself From 7f2e13c82abbb81aafb8457512486b182585e578 Mon Sep 17 00:00:00 2001 From: Sacha Date: Mon, 18 Feb 2013 23:55:41 +1000 Subject: [PATCH 044/347] Fix framebuffer init. Why was it like that? --- GPU/GLES/Framebuffer.cpp | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/GPU/GLES/Framebuffer.cpp b/GPU/GLES/Framebuffer.cpp index bc513f90e07d..de4517bb6bf0 100644 --- a/GPU/GLES/Framebuffer.cpp +++ b/GPU/GLES/Framebuffer.cpp @@ -326,12 +326,12 @@ void FramebufferManager::SetRenderFrameBuffer() { vfb->renderHeight = (u16)(drawing_height * renderHeightFactor); vfb->format = fmt; - vfb->colorDepth = FBO_8888; switch (fmt) { - case GE_FORMAT_4444: vfb->colorDepth = FBO_4444; - case GE_FORMAT_5551: vfb->colorDepth = FBO_5551; - case GE_FORMAT_565: vfb->colorDepth = FBO_565; - case GE_FORMAT_8888: vfb->colorDepth = FBO_8888; + case GE_FORMAT_4444: vfb->colorDepth = FBO_4444; break; + case GE_FORMAT_5551: vfb->colorDepth = FBO_5551; break; + case GE_FORMAT_565: vfb->colorDepth = FBO_565; break; + case GE_FORMAT_8888: vfb->colorDepth = FBO_8888; break; + default: vfb->colorDepth = FBO_8888; break; } //#ifdef ANDROID // vfb->colorDepth = FBO_8888; From 9d490a8b508004ea04d86f085b95dde00d49c663 Mon Sep 17 00:00:00 2001 From: "Unknown W. Brackets" Date: Mon, 18 Feb 2013 08:03:45 -0800 Subject: [PATCH 045/347] Proper ARM buildfix. --- Core/MIPS/ARM/ArmJit.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/Core/MIPS/ARM/ArmJit.cpp b/Core/MIPS/ARM/ArmJit.cpp index 132b2e9f928b..273b3e1bddc5 100644 --- a/Core/MIPS/ARM/ArmJit.cpp +++ b/Core/MIPS/ARM/ArmJit.cpp @@ -15,6 +15,7 @@ // Official git repository and contact information can be found at // https://github.com/hrydgard/ppsspp and http://www.ppsspp.org/. +#include "Common/ChunkFile.h" #include "../../Core.h" #include "../../CoreTiming.h" #include "../MIPS.h" From d8b1ea22f5a7db0cf564b54a573edb587e7245e7 Mon Sep 17 00:00:00 2001 From: "Unknown W. Brackets" Date: Mon, 18 Feb 2013 08:34:51 -0800 Subject: [PATCH 046/347] Cleanup some warnings and reuse some vars. --- GPU/GLES/TextureCache.cpp | 10 +++++----- GPU/GLES/TextureCache.h | 4 ++-- GPU/GLES/TransformPipeline.cpp | 8 +++++--- 3 files changed, 12 insertions(+), 10 deletions(-) diff --git a/GPU/GLES/TextureCache.cpp b/GPU/GLES/TextureCache.cpp index 6487e9ce36aa..96ccc7768bc1 100644 --- a/GPU/GLES/TextureCache.cpp +++ b/GPU/GLES/TextureCache.cpp @@ -684,6 +684,8 @@ void TextureCache::SetTexture() { clutformat = gstate.clutformat & 3; clutaddr = GetClutAddr(clutformat == GE_CMODE_32BIT_ABGR8888 ? 4 : 2); cachekey |= (u64)clutaddr << 32; + } else { + clutaddr = 0; } int maxLevel = ((gstate.texmode >> 16) & 0x7); @@ -725,7 +727,7 @@ void TextureCache::SetTexture() { entry->hash != texhash || entry->format != format || entry->maxLevel != maxLevel || - ((format >= GE_TFMT_CLUT4 && format <= GE_TFMT_CLUT32) && + (hasClut && (entry->clutformat != clutformat || entry->clutaddr != clutaddr || entry->cluthash != Memory::Read_U32(entry->clutaddr)))) @@ -810,9 +812,9 @@ void TextureCache::SetTexture() { entry->lodBias = 0.0f; - if (format >= GE_TFMT_CLUT4 && format <= GE_TFMT_CLUT32) { + if (hasClut) { entry->clutformat = clutformat; - entry->clutaddr = GetClutAddr(clutformat == GE_CMODE_32BIT_ABGR8888 ? 4 : 2); + entry->clutaddr = clutaddr; entry->cluthash = Memory::Read_U32(entry->clutaddr); } else { entry->clutaddr = 0; @@ -1173,8 +1175,6 @@ bool TextureCache::DecodeTexture(u8* output, GPUgstate state) // TODO: Look into using BGRA for 32-bit textures when the GL_EXT_texture_format_BGRA8888 extension is available, as it's faster than RGBA on some chips. - // TODO: Actually decode the mipmaps. - switch (format) { case GE_TFMT_CLUT4: diff --git a/GPU/GLES/TextureCache.h b/GPU/GLES/TextureCache.h index 764ad6373524..65c64b4eb3a9 100644 --- a/GPU/GLES/TextureCache.h +++ b/GPU/GLES/TextureCache.h @@ -66,8 +66,8 @@ class TextureCache int numFrames; u32 framesUntilNextFullHash; u8 format; - u8 clutformat; u16 dim; + u8 clutformat; u32 clutaddr; u32 cluthash; u32 texture; //GLuint @@ -102,7 +102,7 @@ class TextureCache u32 *clutBuf32; u16 *clutBuf16; - int lastBoundTexture; + u32 lastBoundTexture; float maxAnisotropyLevel; }; diff --git a/GPU/GLES/TransformPipeline.cpp b/GPU/GLES/TransformPipeline.cpp index 85fa40b63166..72b2066c57f2 100644 --- a/GPU/GLES/TransformPipeline.cpp +++ b/GPU/GLES/TransformPipeline.cpp @@ -53,12 +53,14 @@ enum { }; TransformDrawEngine::TransformDrawEngine() - : numDrawCalls(0), - collectedVerts(0), + : collectedVerts(0), prevPrim_(-1), lastVType_(-1), curVbo_(0), - shaderManager_(0) { + shaderManager_(0), + textureCache_(0), + framebufferManager_(0), + numDrawCalls(0) { // Allocate nicely aligned memory. Maybe graphics drivers will // appreciate it. // All this is a LOT of memory, need to see if we can cut down somehow. From 363d1dbe199eb8cca0454e558a7e0f989c5405fe Mon Sep 17 00:00:00 2001 From: "Unknown W. Brackets" Date: Mon, 18 Feb 2013 08:44:59 -0800 Subject: [PATCH 047/347] Fix some misc. warnings. --- Common/ChunkFile.h | 2 +- Core/Dialog/SavedataParam.cpp | 2 +- Core/ELF/ElfReader.cpp | 2 +- Core/HLE/HLE.cpp | 2 +- Core/HW/SasAudio.cpp | 4 ++-- 5 files changed, 6 insertions(+), 6 deletions(-) diff --git a/Common/ChunkFile.h b/Common/ChunkFile.h index 095831678aa3..0344483514d1 100644 --- a/Common/ChunkFile.h +++ b/Common/ChunkFile.h @@ -625,7 +625,7 @@ class CChunkFileReader u8 *uncomp_buffer = new u8[header.UncompressedSize]; size_t uncomp_size = header.UncompressedSize; snappy_uncompress((const char *)buffer, sz, (char *)uncomp_buffer, &uncomp_size); - if (uncomp_size != header.UncompressedSize) { + if ((int)uncomp_size != header.UncompressedSize) { ERROR_LOG(COMMON,"Size mismatch: file: %i calc: %i", (int)header.UncompressedSize, (int)uncomp_size); } ptr = uncomp_buffer; diff --git a/Core/Dialog/SavedataParam.cpp b/Core/Dialog/SavedataParam.cpp index 22762fbaa16d..ce3b97089b3b 100644 --- a/Core/Dialog/SavedataParam.cpp +++ b/Core/Dialog/SavedataParam.cpp @@ -1080,7 +1080,7 @@ bool SavedataParam::CreatePNGIcon(u8* pngData, int pngSize, SaveFileInfo& info) u32 atlasPtr; if (success) atlasPtr = kernelMemory.Alloc(texSize, true, "SaveData Icon"); - if (success && atlasPtr != -1) + if (success && atlasPtr != (u32)-1) { info.textureData = atlasPtr; Memory::Memcpy(atlasPtr, textureData, texSize); diff --git a/Core/ELF/ElfReader.cpp b/Core/ELF/ElfReader.cpp index 77ff90de4dc7..9054e68d6a18 100644 --- a/Core/ELF/ElfReader.cpp +++ b/Core/ELF/ElfReader.cpp @@ -217,7 +217,7 @@ bool ElfReader::LoadInto(u32 loadAddress) vaddr = userMemory.Alloc(totalSize, false, "ELF"); } - if (vaddr == -1) { + if (vaddr == (u32)-1) { ERROR_LOG(LOADER, "Failed to allocate memory for ELF!"); return false; } diff --git a/Core/HLE/HLE.cpp b/Core/HLE/HLE.cpp index 6e7087c04d17..48c0f87688d6 100644 --- a/Core/HLE/HLE.cpp +++ b/Core/HLE/HLE.cpp @@ -297,7 +297,7 @@ bool hleExecuteDebugBreak(const HLEFunction &func) // Never break on these, they're noise. u32 blacklistedNIDs[] = {NID_SUSPEND_INTR, NID_RESUME_INTR, NID_IDLE}; - for (int i = 0; i < ARRAY_SIZE(blacklistedNIDs); ++i) + for (size_t i = 0; i < ARRAY_SIZE(blacklistedNIDs); ++i) { if (func.ID == blacklistedNIDs[i]) return false; diff --git a/Core/HW/SasAudio.cpp b/Core/HW/SasAudio.cpp index 97f1b8837a2d..aa22d3b87542 100644 --- a/Core/HW/SasAudio.cpp +++ b/Core/HW/SasAudio.cpp @@ -548,8 +548,8 @@ static int getExpCurveAt(int index, int duration) { } ADSREnvelope::ADSREnvelope() - : steps_(0), - state_(STATE_OFF), + : state_(STATE_OFF), + steps_(0), height_(0) { memset(this, 0, sizeof(*this)); } From 51d5b841082ffd79438deeedb31853942fff2d57 Mon Sep 17 00:00:00 2001 From: "Unknown W. Brackets" Date: Mon, 18 Feb 2013 09:04:43 -0800 Subject: [PATCH 048/347] Fix some misc HLE warnings. --- Core/HLE/sceAtrac.cpp | 4 ++-- Core/HLE/sceCtrl.cpp | 8 ++++---- Core/HLE/sceGe.cpp | 4 ++-- Core/HLE/sceKernelInterrupt.cpp | 8 ++++---- Core/HLE/sceSas.cpp | 2 +- Core/MIPS/MIPSAnalyst.cpp | 2 +- 6 files changed, 14 insertions(+), 14 deletions(-) diff --git a/Core/HLE/sceAtrac.cpp b/Core/HLE/sceAtrac.cpp index 4e6604add6ef..5ea398ca0739 100644 --- a/Core/HLE/sceAtrac.cpp +++ b/Core/HLE/sceAtrac.cpp @@ -187,7 +187,7 @@ u32 sceAtracDecodeData(int atracID, u32 outAddr, u32 numSamplesAddr, u32 finishF ret = ATRAC_ERROR_ALL_DATA_DECODED; } else { // TODO: This isn't at all right, but at least it makes the music "last" some time. - int numSamples = (atrac->decodeEnd - atrac->decodePos) / (sizeof(s16) * 2); + u32 numSamples = (atrac->decodeEnd - atrac->decodePos) / (sizeof(s16) * 2); if (atrac->decodePos >= atrac->decodeEnd) { numSamples = 0; } else if (numSamples > ATRAC_MAX_SAMPLES) { @@ -554,7 +554,7 @@ int sceAtracLowLevelInitDecoder(int atracID, u32 paramsAddr) int sceAtracLowLevelDecode(int atracID, u32 sourceAddr, u32 sourceBytesConsumedAddr, u32 samplesAddr, u32 sampleBytesAddr) { - ERROR_LOG(HLE, "UNIMPL sceAtracLowLevelDecode(%i, %i, %08x, %08x, %08x, %08x)", atracID, sourceAddr, sourceBytesConsumedAddr, samplesAddr, sampleBytesAddr); + ERROR_LOG(HLE, "UNIMPL sceAtracLowLevelDecode(%i, %08x, %08x, %08x, %08x)", atracID, sourceAddr, sourceBytesConsumedAddr, samplesAddr, sampleBytesAddr); return 0; } diff --git a/Core/HLE/sceCtrl.cpp b/Core/HLE/sceCtrl.cpp index 819b884819f8..348bdce8d2c9 100644 --- a/Core/HLE/sceCtrl.cpp +++ b/Core/HLE/sceCtrl.cpp @@ -35,7 +35,7 @@ const int PSP_CTRL_ERROR_INVALID_MODE = 0x80000107; const int PSP_CTRL_ERROR_INVALID_IDLE_PTR = 0x80000023; -const int NUM_CTRL_BUFFERS = 64; +const u32 NUM_CTRL_BUFFERS = 64; enum { @@ -68,8 +68,8 @@ static u32 ctrlOldButtons = 0; static _ctrl_data ctrlBufs[NUM_CTRL_BUFFERS]; static _ctrl_data ctrlCurrent; -static int ctrlBuf = 0; -static int ctrlBufRead = 0; +static u32 ctrlBuf = 0; +static u32 ctrlBufRead = 0; static CtrlLatch latch; static int ctrlIdleReset = -1; @@ -189,7 +189,7 @@ int __CtrlReadBuffer(u32 ctrlDataPtr, u32 nBufs, bool negative, bool peek) if (nBufs > NUM_CTRL_BUFFERS) return SCE_KERNEL_ERROR_INVALID_SIZE; - int resetRead = ctrlBufRead; + u32 resetRead = ctrlBufRead; u32 availBufs; // Peeks always work, they just go go from now X buffers. diff --git a/Core/HLE/sceGe.cpp b/Core/HLE/sceGe.cpp index 16e790d342e9..11ea18c71100 100644 --- a/Core/HLE/sceGe.cpp +++ b/Core/HLE/sceGe.cpp @@ -237,10 +237,10 @@ u32 sceGeSetCallback(u32 structAddr) DEBUG_LOG(HLE, "sceGeSetCallback(struct=%08x)", structAddr); int cbID = -1; - for (int i = 0; i < ARRAY_SIZE(ge_used_callbacks); ++i) + for (size_t i = 0; i < ARRAY_SIZE(ge_used_callbacks); ++i) if (!ge_used_callbacks[i]) { - cbID = i; + cbID = (int) i; break; } diff --git a/Core/HLE/sceKernelInterrupt.cpp b/Core/HLE/sceKernelInterrupt.cpp index 5241b1d9374c..a4791308e8a5 100644 --- a/Core/HLE/sceKernelInterrupt.cpp +++ b/Core/HLE/sceKernelInterrupt.cpp @@ -213,7 +213,7 @@ void __InterruptsInit() { interruptsEnabled = 1; inInterrupt = false; - for(int i = 0; i < ARRAY_SIZE(intrHandlers); ++i) + for (size_t i = 0; i < ARRAY_SIZE(intrHandlers); ++i) intrHandlers[i] = new IntrHandler(i); intState.clear(); } @@ -246,11 +246,11 @@ void __InterruptsDoStateLate(PointerWrap &p) void __InterruptsShutdown() { - for (int i = 0; i < ARRAY_SIZE(intrHandlers); ++i) + for (size_t i = 0; i < ARRAY_SIZE(intrHandlers); ++i) intrHandlers[i]->clear(); - for(int i = 0; i < ARRAY_SIZE(intrHandlers); ++i) + for (size_t i = 0; i < ARRAY_SIZE(intrHandlers); ++i) { - if(intrHandlers[i]) + if (intrHandlers[i]) { delete intrHandlers[i]; intrHandlers[i] = 0; diff --git a/Core/HLE/sceSas.cpp b/Core/HLE/sceSas.cpp index 26ad93e6abcd..16f3fec15d8e 100644 --- a/Core/HLE/sceSas.cpp +++ b/Core/HLE/sceSas.cpp @@ -430,7 +430,7 @@ u32 __sceSasSetVoiceATRAC3(u32 core, int voice, int atrac3Context) { } u32 __sceSasConcatenateATRAC3(u32 core, int voice, u32 atrac3DataAddr, int atrac3DataLength) { - ERROR_LOG(HLE,"UNIMPL __sceSasConcatenateATRAC3(%08x, %i, %i)", core, voice, atrac3DataAddr, atrac3DataLength); + ERROR_LOG(HLE,"UNIMPL __sceSasConcatenateATRAC3(%08x, %i, %08x, %i)", core, voice, atrac3DataAddr, atrac3DataLength); return 0; } diff --git a/Core/MIPS/MIPSAnalyst.cpp b/Core/MIPS/MIPSAnalyst.cpp index 82e771927b00..c9c548a73983 100644 --- a/Core/MIPS/MIPSAnalyst.cpp +++ b/Core/MIPS/MIPSAnalyst.cpp @@ -98,7 +98,7 @@ namespace MIPSAnalyst "slt", "sltu", }; const char *opName = MIPSGetName(op); - for (int i = 0; i < ARRAY_SIZE(safeOps); ++i) + for (size_t i = 0; i < ARRAY_SIZE(safeOps); ++i) { if (!strcmp(safeOps[i], opName)) return true; From 179fccaff7fed79fb32ac4a05240560da4871ead Mon Sep 17 00:00:00 2001 From: "Unknown W. Brackets" Date: Mon, 18 Feb 2013 12:59:41 -0800 Subject: [PATCH 049/347] Tests say matrices apply mask to last col (kinda.) It seems inconsistent but probably better than before. Also add an error. --- Core/MIPS/MIPSVFPUUtils.cpp | 18 +++++++++++------- 1 file changed, 11 insertions(+), 7 deletions(-) diff --git a/Core/MIPS/MIPSVFPUUtils.cpp b/Core/MIPS/MIPSVFPUUtils.cpp index 21ebfb844b76..0f6ad315eb50 100644 --- a/Core/MIPS/MIPSVFPUUtils.cpp +++ b/Core/MIPS/MIPSVFPUUtils.cpp @@ -179,19 +179,23 @@ void WriteMatrix(const float *rd, MatrixSize size, int reg) { case M_4x4: row = (reg>>5)&2; side = 4; break; } - int transpose = (reg>>5)&1; + int transpose = (reg>>5)&1; + + if (currentMIPS->VfpuWriteMask() != 0) { + ERROR_LOG(CPU, "Write mask used with vfpu matrix instruction."); + } for (int i=0; iVfpuWriteMask(i)) + if (j != side -1 || !currentMIPS->VfpuWriteMask(i)) { - int index = mtx * 4; + int index = mtx * 4; if (transpose) - index += ((row+i)&3) + ((col+j)&3)*32; - else - index += ((col+j)&3) + ((row+i)&3)*32; - V(index) = rd[j*4+i]; + index += ((row+i)&3) + ((col+j)&3)*32; + else + index += ((col+j)&3) + ((row+i)&3)*32; + V(index) = rd[j*4+i]; } } } From 0e0b70bb8e49ee43be74da008aa3052cf2a7e6da Mon Sep 17 00:00:00 2001 From: "Unknown W. Brackets" Date: Mon, 18 Feb 2013 13:38:29 -0800 Subject: [PATCH 050/347] vi2uc, etc. should apply the D prefix as float. So say tests on an actual PSP. --- Core/MIPS/MIPSIntVFPU.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Core/MIPS/MIPSIntVFPU.cpp b/Core/MIPS/MIPSIntVFPU.cpp index d66f33630861..d91aceb8e26d 100644 --- a/Core/MIPS/MIPSIntVFPU.cpp +++ b/Core/MIPS/MIPSIntVFPU.cpp @@ -856,7 +856,7 @@ namespace MIPSInt _dbg_assert_msg_(CPU,0,"Trying to interpret instruction that can't be interpreted"); break; } - ApplyPrefixD((float*)d,oz,true); + ApplyPrefixD((float*)d,oz); WriteVector((float*)d,oz,vd); PC += 4; EatPrefixes(); From d89a32e99f5440335f533559db6f1ae09351a9ff Mon Sep 17 00:00:00 2001 From: "Unknown W. Brackets" Date: Mon, 18 Feb 2013 14:37:53 -0800 Subject: [PATCH 051/347] Mark a bunch of VFPU functions which eat prefixes. --- Core/MIPS/MIPSIntVFPU.cpp | 3 +- Core/MIPS/MIPSTables.cpp | 84 +++++++++++++++++++-------------------- 2 files changed, 44 insertions(+), 43 deletions(-) diff --git a/Core/MIPS/MIPSIntVFPU.cpp b/Core/MIPS/MIPSIntVFPU.cpp index d91aceb8e26d..f823a70a2a53 100644 --- a/Core/MIPS/MIPSIntVFPU.cpp +++ b/Core/MIPS/MIPSIntVFPU.cpp @@ -722,7 +722,7 @@ namespace MIPSInt void Int_Vx2i(u32 op) { int s[4]; - u32 d[4] = {0}; + u32 d[4] = {0}; int vd = _VD; int vs = _VS; VectorSize sz = GetVecSize(op); @@ -1205,6 +1205,7 @@ namespace MIPSInt int seed = VI(vd); currentMIPS->rng.Init(seed); PC += 4; + EatPrefixes(); } void Int_VrndX(u32 op) diff --git a/Core/MIPS/MIPSTables.cpp b/Core/MIPS/MIPSTables.cpp index 3d4288912540..4be8f58ce755 100644 --- a/Core/MIPS/MIPSTables.cpp +++ b/Core/MIPS/MIPSTables.cpp @@ -516,7 +516,7 @@ const MIPSInstruction tableVFPU4Jump[32] = //110100 xxxxx {VFPU4}, {VFPU7}, {VFPU9}, - INSTR("vcst", &Jit::Comp_Generic, Dis_Vcst, Int_Vcst, IS_VFPU), + INSTR("vcst", &Jit::Comp_Generic, Dis_Vcst, Int_Vcst, IS_VFPU|OUT_EAT_PREFIX), {-2},{-2},{-2},{-2}, //8 @@ -524,12 +524,12 @@ const MIPSInstruction tableVFPU4Jump[32] = //110100 xxxxx {-2},{-2},{-2},{-2}, //16 - INSTR("vf2in", &Jit::Comp_Generic, Dis_Vf2i, Int_Vf2i, IS_VFPU), - INSTR("vf2iz", &Jit::Comp_Generic, Dis_Vf2i, Int_Vf2i, IS_VFPU), - INSTR("vf2iu", &Jit::Comp_Generic, Dis_Vf2i, Int_Vf2i, IS_VFPU), - INSTR("vf2id", &Jit::Comp_Generic, Dis_Vf2i, Int_Vf2i, IS_VFPU), + INSTR("vf2in", &Jit::Comp_Generic, Dis_Vf2i, Int_Vf2i, IS_VFPU|OUT_EAT_PREFIX), + INSTR("vf2iz", &Jit::Comp_Generic, Dis_Vf2i, Int_Vf2i, IS_VFPU|OUT_EAT_PREFIX), + INSTR("vf2iu", &Jit::Comp_Generic, Dis_Vf2i, Int_Vf2i, IS_VFPU|OUT_EAT_PREFIX), + INSTR("vf2id", &Jit::Comp_Generic, Dis_Vf2i, Int_Vf2i, IS_VFPU|OUT_EAT_PREFIX), //20 - INSTR("vi2f", &Jit::Comp_Generic, Dis_Vf2i, Int_Vi2f, IS_VFPU), + INSTR("vi2f", &Jit::Comp_Generic, Dis_Vf2i, Int_Vi2f, IS_VFPU|OUT_EAT_PREFIX), INSTR("vcmov", &Jit::Comp_Generic, Dis_Vcmov,Int_Vcmov,IS_VFPU), {-2}, {-2}, @@ -546,10 +546,10 @@ const MIPSInstruction tableVFPU4Jump[32] = //110100 xxxxx const MIPSInstruction tableVFPU7[32] = { - INSTR("vrnds", &Jit::Comp_Generic, Dis_Generic, Int_Vrnds, IS_VFPU), - INSTR("vrndi", &Jit::Comp_Generic, Dis_Generic, Int_VrndX, IS_VFPU), - INSTR("vrndf1", &Jit::Comp_Generic, Dis_Generic, Int_VrndX, IS_VFPU), - INSTR("vrndf2", &Jit::Comp_Generic, Dis_Generic, Int_VrndX, IS_VFPU), + INSTR("vrnds", &Jit::Comp_Generic, Dis_Generic, Int_Vrnds, IS_VFPU|OUT_EAT_PREFIX), + INSTR("vrndi", &Jit::Comp_Generic, Dis_Generic, Int_VrndX, IS_VFPU|OUT_EAT_PREFIX), + INSTR("vrndf1", &Jit::Comp_Generic, Dis_Generic, Int_VrndX, IS_VFPU|OUT_EAT_PREFIX), + INSTR("vrndf2", &Jit::Comp_Generic, Dis_Generic, Int_VrndX, IS_VFPU|OUT_EAT_PREFIX), {-2},{-2},{-2},{-2}, //8 @@ -559,8 +559,8 @@ const MIPSInstruction tableVFPU7[32] = //16 {-2}, {-2}, - INSTR("vf2h", &Jit::Comp_Generic, Dis_Generic, Int_Vf2h, IS_VFPU), - INSTR("vh2f", &Jit::Comp_Generic, Dis_Generic, Int_Vh2f, IS_VFPU), + INSTR("vf2h", &Jit::Comp_Generic, Dis_Generic, Int_Vf2h, IS_VFPU|OUT_EAT_PREFIX), + INSTR("vh2f", &Jit::Comp_Generic, Dis_Generic, Int_Vh2f, IS_VFPU|OUT_EAT_PREFIX), {-2}, {-2}, @@ -572,10 +572,10 @@ const MIPSInstruction tableVFPU7[32] = INSTR("vus2i", &Jit::Comp_Generic, Dis_Vs2i, Int_Vx2i, IS_VFPU), INSTR("vs2i", &Jit::Comp_Generic, Dis_Vs2i, Int_Vx2i, IS_VFPU), - INSTR("vi2uc", &Jit::Comp_Generic, Dis_Vi2x, Int_Vi2x, IS_VFPU), - INSTR("vi2c", &Jit::Comp_Generic, Dis_Vi2x, Int_Vi2x, IS_VFPU), - INSTR("vi2us", &Jit::Comp_Generic, Dis_Vi2x, Int_Vi2x, IS_VFPU), - INSTR("vi2s", &Jit::Comp_Generic, Dis_Vi2x, Int_Vi2x, IS_VFPU), + INSTR("vi2uc", &Jit::Comp_Generic, Dis_Vi2x, Int_Vi2x, IS_VFPU|OUT_EAT_PREFIX), + INSTR("vi2c", &Jit::Comp_Generic, Dis_Vi2x, Int_Vi2x, IS_VFPU|OUT_EAT_PREFIX), + INSTR("vi2us", &Jit::Comp_Generic, Dis_Vi2x, Int_Vi2x, IS_VFPU|OUT_EAT_PREFIX), + INSTR("vi2s", &Jit::Comp_Generic, Dis_Vi2x, Int_Vi2x, IS_VFPU|OUT_EAT_PREFIX), }; // 110100 00000 10100 0000000000000000 @@ -585,11 +585,11 @@ const MIPSInstruction tableVFPU4[32] = //110100 00000 xxxxx INSTR("vmov", &Jit::Comp_Generic, Dis_VectorSet2, Int_VV2Op,IS_VFPU|OUT_EAT_PREFIX), INSTR("vabs", &Jit::Comp_Generic, Dis_VectorSet2, Int_VV2Op,IS_VFPU|OUT_EAT_PREFIX), INSTR("vneg", &Jit::Comp_Generic, Dis_VectorSet2, Int_VV2Op,IS_VFPU|OUT_EAT_PREFIX), - INSTR("vidt", &Jit::Comp_Generic, Dis_VectorSet1, Int_Vidt,IS_VFPU), + INSTR("vidt", &Jit::Comp_Generic, Dis_VectorSet1, Int_Vidt,IS_VFPU|OUT_EAT_PREFIX), INSTR("vsat0", &Jit::Comp_Generic, Dis_VectorSet2, Int_VV2Op, IS_VFPU|OUT_EAT_PREFIX), INSTR("vsat1", &Jit::Comp_Generic, Dis_VectorSet2, Int_VV2Op, IS_VFPU|OUT_EAT_PREFIX), - INSTR("vzero", &Jit::Comp_Generic, Dis_VectorSet1, Int_VVectorInit, IS_VFPU), - INSTR("vone", &Jit::Comp_Generic, Dis_VectorSet1, Int_VVectorInit, IS_VFPU), + INSTR("vzero", &Jit::Comp_Generic, Dis_VectorSet1, Int_VVectorInit, IS_VFPU|OUT_EAT_PREFIX), + INSTR("vone", &Jit::Comp_Generic, Dis_VectorSet1, Int_VVectorInit, IS_VFPU|OUT_EAT_PREFIX), //8 {-2},{-2},{-2},{-2},{-2},{-2},{-2},{-2}, //16 @@ -626,25 +626,25 @@ MIPSInstruction tableVFPU5[8] = //110111 xxx const MIPSInstruction tableVFPU6[32] = //111100 xxx { //0 - INSTR("vmmul",&Jit::Comp_Generic, Dis_MatrixMult, Int_Vmmul, IS_VFPU), - INSTR("vmmul",&Jit::Comp_Generic, Dis_MatrixMult, Int_Vmmul, IS_VFPU), - INSTR("vmmul",&Jit::Comp_Generic, Dis_MatrixMult, Int_Vmmul, IS_VFPU), - INSTR("vmmul",&Jit::Comp_Generic, Dis_MatrixMult, Int_Vmmul, IS_VFPU), - - INSTR("v(h)tfm2",&Jit::Comp_Generic, Dis_Vtfm, Int_Vtfm, IS_VFPU), - INSTR("v(h)tfm2",&Jit::Comp_Generic, Dis_Vtfm, Int_Vtfm, IS_VFPU), - INSTR("v(h)tfm2",&Jit::Comp_Generic, Dis_Vtfm, Int_Vtfm, IS_VFPU), - INSTR("v(h)tfm2",&Jit::Comp_Generic, Dis_Vtfm, Int_Vtfm, IS_VFPU), + INSTR("vmmul",&Jit::Comp_Generic, Dis_MatrixMult, Int_Vmmul, IS_VFPU|OUT_EAT_PREFIX), + INSTR("vmmul",&Jit::Comp_Generic, Dis_MatrixMult, Int_Vmmul, IS_VFPU|OUT_EAT_PREFIX), + INSTR("vmmul",&Jit::Comp_Generic, Dis_MatrixMult, Int_Vmmul, IS_VFPU|OUT_EAT_PREFIX), + INSTR("vmmul",&Jit::Comp_Generic, Dis_MatrixMult, Int_Vmmul, IS_VFPU|OUT_EAT_PREFIX), + + INSTR("v(h)tfm2",&Jit::Comp_Generic, Dis_Vtfm, Int_Vtfm, IS_VFPU|OUT_EAT_PREFIX), + INSTR("v(h)tfm2",&Jit::Comp_Generic, Dis_Vtfm, Int_Vtfm, IS_VFPU|OUT_EAT_PREFIX), + INSTR("v(h)tfm2",&Jit::Comp_Generic, Dis_Vtfm, Int_Vtfm, IS_VFPU|OUT_EAT_PREFIX), + INSTR("v(h)tfm2",&Jit::Comp_Generic, Dis_Vtfm, Int_Vtfm, IS_VFPU|OUT_EAT_PREFIX), //8 - INSTR("v(h)tfm3",&Jit::Comp_Generic, Dis_Vtfm, Int_Vtfm, IS_VFPU), - INSTR("v(h)tfm3",&Jit::Comp_Generic, Dis_Vtfm, Int_Vtfm, IS_VFPU), - INSTR("v(h)tfm3",&Jit::Comp_Generic, Dis_Vtfm, Int_Vtfm, IS_VFPU), - INSTR("v(h)tfm3",&Jit::Comp_Generic, Dis_Vtfm, Int_Vtfm, IS_VFPU), - - INSTR("v(h)tfm4",&Jit::Comp_Generic, Dis_Vtfm, Int_Vtfm, IS_VFPU), - INSTR("v(h)tfm4",&Jit::Comp_Generic, Dis_Vtfm, Int_Vtfm, IS_VFPU), - INSTR("v(h)tfm4",&Jit::Comp_Generic, Dis_Vtfm, Int_Vtfm, IS_VFPU), - INSTR("v(h)tfm4",&Jit::Comp_Generic, Dis_Vtfm, Int_Vtfm, IS_VFPU), + INSTR("v(h)tfm3",&Jit::Comp_Generic, Dis_Vtfm, Int_Vtfm, IS_VFPU|OUT_EAT_PREFIX), + INSTR("v(h)tfm3",&Jit::Comp_Generic, Dis_Vtfm, Int_Vtfm, IS_VFPU|OUT_EAT_PREFIX), + INSTR("v(h)tfm3",&Jit::Comp_Generic, Dis_Vtfm, Int_Vtfm, IS_VFPU|OUT_EAT_PREFIX), + INSTR("v(h)tfm3",&Jit::Comp_Generic, Dis_Vtfm, Int_Vtfm, IS_VFPU|OUT_EAT_PREFIX), + + INSTR("v(h)tfm4",&Jit::Comp_Generic, Dis_Vtfm, Int_Vtfm, IS_VFPU|OUT_EAT_PREFIX), + INSTR("v(h)tfm4",&Jit::Comp_Generic, Dis_Vtfm, Int_Vtfm, IS_VFPU|OUT_EAT_PREFIX), + INSTR("v(h)tfm4",&Jit::Comp_Generic, Dis_Vtfm, Int_Vtfm, IS_VFPU|OUT_EAT_PREFIX), + INSTR("v(h)tfm4",&Jit::Comp_Generic, Dis_Vtfm, Int_Vtfm, IS_VFPU|OUT_EAT_PREFIX), //16 INSTR("vmscl",&Jit::Comp_Generic, Dis_Generic, Int_Vmscl, IS_VFPU), INSTR("vmscl",&Jit::Comp_Generic, Dis_Generic, Int_Vmscl, IS_VFPU), @@ -662,22 +662,22 @@ const MIPSInstruction tableVFPU6[32] = //111100 xxx {-2}, {VFPUMatrix1}, - INSTR("vrot",&Jit::Comp_Generic, Dis_VRot, Int_Vrot, IS_VFPU), + INSTR("vrot",&Jit::Comp_Generic, Dis_VRot, Int_Vrot, IS_VFPU|OUT_EAT_PREFIX), {-2}, {-2}, }; const MIPSInstruction tableVFPUMatrixSet1[16] = //111100 11100 0xxxx (rm x is 16) { - INSTR("vmmov",&Jit::Comp_Generic, Dis_MatrixSet2, Int_Vmmov, IS_VFPU), + INSTR("vmmov",&Jit::Comp_Generic, Dis_MatrixSet2, Int_Vmmov, IS_VFPU|OUT_EAT_PREFIX), {-2}, {-2}, - INSTR("vmidt",&Jit::Comp_Generic, Dis_MatrixSet1, Int_VMatrixInit, IS_VFPU), + INSTR("vmidt",&Jit::Comp_Generic, Dis_MatrixSet1, Int_VMatrixInit, IS_VFPU|OUT_EAT_PREFIX), {-2}, {-2}, - INSTR("vmzero", &Jit::Comp_Generic, Dis_MatrixSet1, Int_VMatrixInit, IS_VFPU), - INSTR("vmone", &Jit::Comp_Generic, Dis_MatrixSet1, Int_VMatrixInit, IS_VFPU), + INSTR("vmzero", &Jit::Comp_Generic, Dis_MatrixSet1, Int_VMatrixInit, IS_VFPU|OUT_EAT_PREFIX), + INSTR("vmone", &Jit::Comp_Generic, Dis_MatrixSet1, Int_VMatrixInit, IS_VFPU|OUT_EAT_PREFIX), {-2},{-2},{-2},{-2}, {-2},{-2},{-2},{-2}, From 653443070dfef504fedd91035025dbe56dceae5b Mon Sep 17 00:00:00 2001 From: "Unknown W. Brackets" Date: Mon, 18 Feb 2013 15:13:46 -0800 Subject: [PATCH 052/347] Add a few more OUT_EAT_PREFIX flags to VFPU. --- Core/MIPS/MIPSTables.cpp | 26 +++++++++++++------------- 1 file changed, 13 insertions(+), 13 deletions(-) diff --git a/Core/MIPS/MIPSTables.cpp b/Core/MIPS/MIPSTables.cpp index 4be8f58ce755..821fd72c903d 100644 --- a/Core/MIPS/MIPSTables.cpp +++ b/Core/MIPS/MIPSTables.cpp @@ -500,14 +500,14 @@ const MIPSInstruction tableVFPU1[8] = const MIPSInstruction tableVFPU3[8] = //011011 xxx { - INSTR("vcmp",&Jit::Comp_Generic, Dis_Vcmp, Int_Vcmp, IS_VFPU), + INSTR("vcmp",&Jit::Comp_Generic, Dis_Vcmp, Int_Vcmp, IS_VFPU|OUT_EAT_PREFIX), {-2}, INSTR("vmin",&Jit::Comp_Generic, Dis_VectorSet3, Int_Vminmax, IS_VFPU|OUT_EAT_PREFIX), - INSTR("vmax",&Jit::Comp_Generic, Dis_VectorSet3, Int_Vminmax, IS_VFPU|OUT_EAT_PREFIX), + INSTR("vmax",&Jit::Comp_Generic, Dis_VectorSet3, Int_Vminmax, IS_VFPU|OUT_EAT_PREFIX), {-2}, - INSTR("vscmp",&Jit::Comp_Generic, Dis_VectorSet3, Int_Vscmp, IS_VFPU), - INSTR("vsge",&Jit::Comp_Generic, Dis_VectorSet3, Int_Vsge, IS_VFPU), - INSTR("vslt",&Jit::Comp_Generic, Dis_VectorSet3, Int_Vslt, IS_VFPU), + INSTR("vscmp",&Jit::Comp_Generic, Dis_VectorSet3, Int_Vscmp, IS_VFPU|OUT_EAT_PREFIX), + INSTR("vsge",&Jit::Comp_Generic, Dis_VectorSet3, Int_Vsge, IS_VFPU|OUT_EAT_PREFIX), + INSTR("vslt",&Jit::Comp_Generic, Dis_VectorSet3, Int_Vslt, IS_VFPU|OUT_EAT_PREFIX), }; @@ -530,7 +530,7 @@ const MIPSInstruction tableVFPU4Jump[32] = //110100 xxxxx INSTR("vf2id", &Jit::Comp_Generic, Dis_Vf2i, Int_Vf2i, IS_VFPU|OUT_EAT_PREFIX), //20 INSTR("vi2f", &Jit::Comp_Generic, Dis_Vf2i, Int_Vi2f, IS_VFPU|OUT_EAT_PREFIX), - INSTR("vcmov", &Jit::Comp_Generic, Dis_Vcmov,Int_Vcmov,IS_VFPU), + INSTR("vcmov", &Jit::Comp_Generic, Dis_Vcmov,Int_Vcmov,IS_VFPU|OUT_EAT_PREFIX), {-2}, {-2}, @@ -646,10 +646,10 @@ const MIPSInstruction tableVFPU6[32] = //111100 xxx INSTR("v(h)tfm4",&Jit::Comp_Generic, Dis_Vtfm, Int_Vtfm, IS_VFPU|OUT_EAT_PREFIX), INSTR("v(h)tfm4",&Jit::Comp_Generic, Dis_Vtfm, Int_Vtfm, IS_VFPU|OUT_EAT_PREFIX), //16 - INSTR("vmscl",&Jit::Comp_Generic, Dis_Generic, Int_Vmscl, IS_VFPU), - INSTR("vmscl",&Jit::Comp_Generic, Dis_Generic, Int_Vmscl, IS_VFPU), - INSTR("vmscl",&Jit::Comp_Generic, Dis_Generic, Int_Vmscl, IS_VFPU), - INSTR("vmscl",&Jit::Comp_Generic, Dis_Generic, Int_Vmscl, IS_VFPU), + INSTR("vmscl",&Jit::Comp_Generic, Dis_Generic, Int_Vmscl, IS_VFPU|OUT_EAT_PREFIX), + INSTR("vmscl",&Jit::Comp_Generic, Dis_Generic, Int_Vmscl, IS_VFPU|OUT_EAT_PREFIX), + INSTR("vmscl",&Jit::Comp_Generic, Dis_Generic, Int_Vmscl, IS_VFPU|OUT_EAT_PREFIX), + INSTR("vmscl",&Jit::Comp_Generic, Dis_Generic, Int_Vmscl, IS_VFPU|OUT_EAT_PREFIX), INSTR("vcrsp.t/vqmul.q",&Jit::Comp_Generic, Dis_CrossQuat, Int_CrossQuat, IS_VFPU|OUT_EAT_PREFIX), INSTR("vcrsp.t/vqmul.q",&Jit::Comp_Generic, Dis_CrossQuat, Int_CrossQuat, IS_VFPU|OUT_EAT_PREFIX), @@ -687,12 +687,12 @@ const MIPSInstruction tableVFPU9[32] = //110100 00010 xxxxx { INSTR("vsrt1", &Jit::Comp_Generic, Dis_Vbfy, Int_Vsrt1, IS_VFPU), INSTR("vsrt2", &Jit::Comp_Generic, Dis_Vbfy, Int_Vsrt2, IS_VFPU), - INSTR("vbfy1", &Jit::Comp_Generic, Dis_Vbfy, Int_Vbfy, IS_VFPU), - INSTR("vbfy2", &Jit::Comp_Generic, Dis_Vbfy, Int_Vbfy, IS_VFPU), + INSTR("vbfy1", &Jit::Comp_Generic, Dis_Vbfy, Int_Vbfy, IS_VFPU|OUT_EAT_PREFIX), + INSTR("vbfy2", &Jit::Comp_Generic, Dis_Vbfy, Int_Vbfy, IS_VFPU|OUT_EAT_PREFIX), //4 INSTR("vocp", &Jit::Comp_Generic, Dis_Vbfy, Int_Vocp, IS_VFPU), // one's complement INSTR("vsocp", &Jit::Comp_Generic, Dis_Vbfy, Int_Vsocp, IS_VFPU), - INSTR("vfad", &Jit::Comp_Generic, Dis_Vfad, Int_Vfad, IS_VFPU), + INSTR("vfad", &Jit::Comp_Generic, Dis_Vfad, Int_Vfad, IS_VFPU|OUT_EAT_PREFIX), INSTR("vavg", &Jit::Comp_Generic, Dis_Vfad, Int_Vavg, IS_VFPU), //8 INSTR("vsrt3", &Jit::Comp_Generic, Dis_Vbfy, Int_Vsrt3, IS_VFPU), From f8058e4bae8393336499623813b52bd96cd81017 Mon Sep 17 00:00:00 2001 From: Henrik Rydgard Date: Mon, 18 Feb 2013 23:22:41 +0100 Subject: [PATCH 053/347] Disable warning for bad prefix as it floods in Wipeout Pulse. Cleanups. --- Core/MIPS/MIPSIntVFPU.cpp | 2 +- GPU/GLES/DisplayListInterpreter.cpp | 4 ++-- android/jni/EmuScreen.cpp | 2 +- native | 2 +- 4 files changed, 5 insertions(+), 5 deletions(-) diff --git a/Core/MIPS/MIPSIntVFPU.cpp b/Core/MIPS/MIPSIntVFPU.cpp index f823a70a2a53..90b3fbface6e 100644 --- a/Core/MIPS/MIPSIntVFPU.cpp +++ b/Core/MIPS/MIPSIntVFPU.cpp @@ -1185,7 +1185,7 @@ namespace MIPSInt float scale = V(vt); if (currentMIPS->vfpuCtrl[VFPU_CTRL_TPREFIX] != 0xE4) { - WARN_LOG(CPU, "Broken T prefix used with VScl: %08x / %08x", currentMIPS->vfpuCtrl[VFPU_CTRL_TPREFIX], op); + // WARN_LOG(CPU, "Broken T prefix used with VScl: %08x / %08x", currentMIPS->vfpuCtrl[VFPU_CTRL_TPREFIX], op); ApplySwizzleT(&scale, V_Single); } int n = GetNumVectorElements(sz); diff --git a/GPU/GLES/DisplayListInterpreter.cpp b/GPU/GLES/DisplayListInterpreter.cpp index e9f1bb78540a..6bf4220d86dd 100644 --- a/GPU/GLES/DisplayListInterpreter.cpp +++ b/GPU/GLES/DisplayListInterpreter.cpp @@ -38,7 +38,7 @@ extern u32 curTextureWidth; extern u32 curTextureHeight; -static const int flushOnChangedBeforeCommandList[] = { +static const u8 flushOnChangedBeforeCommandList[] = { GE_CMD_VERTEXTYPE, GE_CMD_BLENDMODE, GE_CMD_BLENDFIXEDA, @@ -137,7 +137,7 @@ static const int flushOnChangedBeforeCommandList[] = { GE_CMD_ZBUFWIDTH, }; -static const int flushBeforeCommandList[] = { +static const u8 flushBeforeCommandList[] = { GE_CMD_BEZIER, GE_CMD_SPLINE, GE_CMD_SIGNAL, diff --git a/android/jni/EmuScreen.cpp b/android/jni/EmuScreen.cpp index b3eb28e4fbb6..8a0d13f84ebd 100644 --- a/android/jni/EmuScreen.cpp +++ b/android/jni/EmuScreen.cpp @@ -156,7 +156,7 @@ void EmuScreen::render() // We just run the CPU until we get to vblank. This will quickly sync up pretty nicely. // The actual number of cycles doesn't matter so much here as we will break due to CORE_NEXTFRAME, most of the time hopefully... - int blockTicks = usToCycles(1000000 / 2); + int blockTicks = usToCycles(1000000 / 10); // Run until CORE_NEXTFRAME while (coreState == CORE_RUNNING) { diff --git a/native b/native index f7db8ff0bea9..f5e7bd5a9c3e 160000 --- a/native +++ b/native @@ -1 +1 @@ -Subproject commit f7db8ff0bea971ed6c1332ce746101d3f0146010 +Subproject commit f5e7bd5a9c3e4b39a4eac71b577f06ad54f2bc96 From cbb786c7f02270eb80a1949650d236ec21ca2819 Mon Sep 17 00:00:00 2001 From: Henrik Rydgard Date: Mon, 18 Feb 2013 23:25:06 +0100 Subject: [PATCH 054/347] Restructure Windows "gameloop" to be more similar to others. --- Core/Core.cpp | 14 ++- Core/HLE/sceDisplay.cpp | 189 ++++++++++++++++++------------- Core/Host.h | 1 - Windows/OpenGLBase.cpp | 9 +- Windows/OpenGLBase.h | 5 +- Windows/WindowsHost.cpp | 5 - Windows/WindowsHost.h | 1 - android/jni/NativeApp.cpp | 1 - headless/Headless.cpp | 20 ++-- headless/StubHost.h | 6 +- headless/WindowsHeadlessHost.cpp | 4 +- headless/WindowsHeadlessHost.h | 3 +- 12 files changed, 147 insertions(+), 111 deletions(-) diff --git a/Core/Core.cpp b/Core/Core.cpp index fb8f92966c5a..c2de39e7874b 100644 --- a/Core/Core.cpp +++ b/Core/Core.cpp @@ -22,6 +22,9 @@ #include "Core.h" #include "MemMap.h" #include "MIPS/MIPS.h" +#ifdef _WIN32 +#include "Windows/OpenGLBase.h" +#endif #include "Host.h" @@ -64,7 +67,16 @@ bool Core_IsStepping() void Core_RunLoop() { - currentMIPS->RunLoopUntil(0xFFFFFFFFFFFFFFFULL); + while (!coreState) { + currentMIPS->RunLoopUntil(0xFFFFFFFFFFFFFFFULL); + if (coreState == CORE_NEXTFRAME) + { +#ifdef _WIN32 + GL_SwapBuffers(); +#endif + coreState = CORE_RUNNING; + } + } } void Core_DoSingleStep() diff --git a/Core/HLE/sceDisplay.cpp b/Core/HLE/sceDisplay.cpp index 86bf36750a94..ed552dcbaa72 100644 --- a/Core/HLE/sceDisplay.cpp +++ b/Core/HLE/sceDisplay.cpp @@ -80,6 +80,7 @@ static bool framebufIsLatched; static int enterVblankEvent = -1; static int leaveVblankEvent = -1; +static int afterFlipEvent = -1; static int hCount; static int hCountTotal; //unused @@ -107,6 +108,7 @@ enum { void hleEnterVblank(u64 userdata, int cyclesLate); void hleLeaveVblank(u64 userdata, int cyclesLate); +void hleAfterFlip(u64 userdata, int cyclesLate); void __DisplayInit() { gpuStats.reset(); @@ -118,6 +120,7 @@ void __DisplayInit() { enterVblankEvent = CoreTiming::RegisterEvent("EnterVBlank", &hleEnterVblank); leaveVblankEvent = CoreTiming::RegisterEvent("LeaveVBlank", &hleLeaveVblank); + afterFlipEvent = CoreTiming::RegisterEvent("AfterFlip", &hleAfterFlip); CoreTiming::ScheduleEvent(msToCycles(frameMs - vblankMs), enterVblankEvent, 0); isVblank = 0; @@ -202,6 +205,93 @@ float calculateFPS() return fps; } +void DebugStats() +{ + gpu->UpdateStats(); + char stats[2048]; + + sprintf(stats, + "Frames: %i\n" + "DL processing time: %0.2f ms\n" + "Kernel processing time: %0.2f ms\n" + "Slowest syscall: %s : %0.2f ms\n" + "Most active syscall: %s : %0.2f ms\n" + "Draw calls: %i, flushes %i\n" + "Cached Draw calls: %i\n" + "Num Tracked Vertex Arrays: %i\n" + "Vertices Submitted: %i\n" + "Cached Vertices Drawn: %i\n" + "Uncached Vertices Drawn: %i\n" + "FBOs active: %i\n" + "Textures active: %i, decoded: %i\n" + "Texture invalidations: %i\n" + "Vertex shaders loaded: %i\n" + "Fragment shaders loaded: %i\n" + "Combined shaders loaded: %i\n", + gpuStats.numFrames, + gpuStats.msProcessingDisplayLists * 1000.0f, + kernelStats.msInSyscalls * 1000.0f, + kernelStats.slowestSyscallName ? kernelStats.slowestSyscallName : "(none)", + kernelStats.slowestSyscallTime * 1000.0f, + kernelStats.summedSlowestSyscallName ? kernelStats.summedSlowestSyscallName : "(none)", + kernelStats.summedSlowestSyscallTime * 1000.0f, + gpuStats.numDrawCalls, + gpuStats.numFlushes, + gpuStats.numCachedDrawCalls, + gpuStats.numTrackedVertexArrays, + gpuStats.numVertsSubmitted, + gpuStats.numCachedVertsDrawn, + gpuStats.numUncachedVertsDrawn, + gpuStats.numFBOs, + gpuStats.numTextures, + gpuStats.numTexturesDecoded, + gpuStats.numTextureInvalidations, + gpuStats.numVertexShaders, + gpuStats.numFragmentShaders, + gpuStats.numShaders + ); + + float zoom = 0.3f; /// g_Config.iWindowZoom; + float soff = 0.3f; + PPGeBegin(); + PPGeDrawText(stats, soff, soff, 0, zoom, 0xCC000000); + PPGeDrawText(stats, -soff, -soff, 0, zoom, 0xCC000000); + PPGeDrawText(stats, 0, 0, 0, zoom, 0xFFFFFFFF); + PPGeEnd(); + + gpuStats.resetFrame(); + kernelStats.ResetFrame(); +} + +// Let's collect all the throttling and frameskipping logic here. +void DoFrameTiming(bool &throttle) { +#ifdef _WIN32 + throttle = !GetAsyncKeyState(VK_TAB); +#else + throttle = false; +#endif + if (PSP_CoreParameter().headLess) + throttle = false; + + if (throttle) { + // Best place to throttle the frame rate on non vsynced platforms is probably here. Let's try it. + time_update(); + if (lastFrameTime == 0.0) + lastFrameTime = time_now_d(); + + // First, check if we are already behind. + // Wait until it's time. + while (time_now_d() < lastFrameTime + 1.0 / 60.0) { + Common::SleepCurrentThread(1); + time_update(); + } + // Advance lastFrameTime by a constant amount each frame, + // but don't let it get too far behind. + lastFrameTime = std::max(lastFrameTime + 1.0 / 60.0, time_now_d() - 1.5 / 60.0); + } +} + + void hleEnterVblank(u64 userdata, int cyclesLate) { int vbCount = userdata; @@ -223,7 +313,7 @@ void hleEnterVblank(u64 userdata, int cyclesLate) { // Trigger VBlank interrupt handlers. __TriggerInterrupt(PSP_INTR_IMMEDIATE | PSP_INTR_ONLY_IF_ENABLED | PSP_INTR_ALWAYS_RESCHED, PSP_VBLANK_INTR, PSP_INTR_SUB_ALL); - CoreTiming::ScheduleEvent(msToCycles(vblankMs) - cyclesLate, leaveVblankEvent, vbCount+1); + CoreTiming::ScheduleEvent(msToCycles(vblankMs) - cyclesLate, leaveVblankEvent, vbCount + 1); // TODO: Should this be done here or in hleLeaveVblank? if (framebufIsLatched) { @@ -233,65 +323,11 @@ void hleEnterVblank(u64 userdata, int cyclesLate) { gpu->SetDisplayFramebuffer(framebuf.topaddr, framebuf.pspFramebufLinesize, framebuf.pspFramebufFormat); } - // Draw screen overlays before blitting. Saves and restores the Ge context. gpuStats.numFrames++; // Now we can subvert the Ge engine in order to draw custom overlays like stat counters etc. if (g_Config.bShowDebugStats && gpuStats.numDrawCalls) { - gpu->UpdateStats(); - char stats[2048]; - - sprintf(stats, - "Frames: %i\n" - "DL processing time: %0.2f ms\n" - "Kernel processing time: %0.2f ms\n" - "Slowest syscall: %s : %0.2f ms\n" - "Most active syscall: %s : %0.2f ms\n" - "Draw calls: %i, flushes %i\n" - "Cached Draw calls: %i\n" - "Num Tracked Vertex Arrays: %i\n" - "Vertices Submitted: %i\n" - "Cached Vertices Drawn: %i\n" - "Uncached Vertices Drawn: %i\n" - "FBOs active: %i\n" - "Textures active: %i, decoded: %i\n" - "Texture invalidations: %i\n" - "Vertex shaders loaded: %i\n" - "Fragment shaders loaded: %i\n" - "Combined shaders loaded: %i\n", - gpuStats.numFrames, - gpuStats.msProcessingDisplayLists * 1000.0f, - kernelStats.msInSyscalls * 1000.0f, - kernelStats.slowestSyscallName ? kernelStats.slowestSyscallName : "(none)", - kernelStats.slowestSyscallTime * 1000.0f, - kernelStats.summedSlowestSyscallName ? kernelStats.summedSlowestSyscallName : "(none)", - kernelStats.summedSlowestSyscallTime * 1000.0f, - gpuStats.numDrawCalls, - gpuStats.numFlushes, - gpuStats.numCachedDrawCalls, - gpuStats.numTrackedVertexArrays, - gpuStats.numVertsSubmitted, - gpuStats.numCachedVertsDrawn, - gpuStats.numUncachedVertsDrawn, - gpuStats.numFBOs, - gpuStats.numTextures, - gpuStats.numTexturesDecoded, - gpuStats.numTextureInvalidations, - gpuStats.numVertexShaders, - gpuStats.numFragmentShaders, - gpuStats.numShaders - ); - - float zoom = 0.3f; /// g_Config.iWindowZoom; - float soff = 0.3f; - PPGeBegin(); - PPGeDrawText(stats, soff, soff, 0, zoom, 0xCC000000); - PPGeDrawText(stats, -soff, -soff, 0, zoom, 0xCC000000); - PPGeDrawText(stats, 0, 0, 0, zoom, 0xFFFFFFFF); - PPGeEnd(); - - gpuStats.resetFrame(); - kernelStats.ResetFrame(); + DebugStats(); } if (g_Config.bShowFPSCounter) { @@ -313,41 +349,32 @@ void hleEnterVblank(u64 userdata, int cyclesLate) { PPGeEnd(); } + // Draw screen overlays before blitting. Saves and restores the Ge context. // Yeah, this has to be the right moment to end the frame. Give the graphics backend opportunity // to blit the framebuffer, in order to support half-framerate games that otherwise wouldn't have // anything to draw here. gpu->CopyDisplayToOutput(); - host->EndFrame(); - -#ifdef _WIN32 - // Best place to throttle the frame rate on non vsynced platforms is probably here. Let's try it. - time_update(); - if (lastFrameTime == 0.0) - lastFrameTime = time_now_d(); - if (!GetAsyncKeyState(VK_TAB) && !PSP_CoreParameter().headLess) { - while (time_now_d() < lastFrameTime + 1.0 / 60.0) { - Common::SleepCurrentThread(1); - time_update(); - } - // Advance lastFrameTime by a constant amount each frame, - // but don't let it get too far behind. - lastFrameTime = std::max(lastFrameTime + 1.0 / 60.0, time_now_d() - 1.5 / 60.0); - } + bool throttle; + + DoFrameTiming(throttle); - // We are going to have to do something about audio timing for platforms that - // are vsynced to something that's not exactly 60fps.. + // Setting CORE_NEXTFRAME causes a swap. + coreState = CORE_NEXTFRAME; + + CoreTiming::ScheduleEvent(0 - cyclesLate, afterFlipEvent, 0); -#endif + // Returning here with coreState == CORE_NEXTFRAME causes a buffer flip to happen (next frame). + // Right after, we regain control for a little bit in hleAfterFlip. I think that's a great + // place to do housekeeping. +} +void hleAfterFlip(u64 userdata, int cyclesLate) +{ + // This checks input on PC. Fine to do even if not calling BeginFrame. host->BeginFrame(); - gpu->BeginFrame(); - // Tell the emu core that it's time to stop emulating - // Win32 doesn't need this. -#ifndef _WIN32 - coreState = CORE_NEXTFRAME; -#endif + gpu->BeginFrame(); // doesn't really matter if begin or end of frame. } void hleLeaveVblank(u64 userdata, int cyclesLate) { diff --git a/Core/Host.h b/Core/Host.h index c60d270a66bd..01573a1e655a 100644 --- a/Core/Host.h +++ b/Core/Host.h @@ -46,7 +46,6 @@ class Host virtual void InitGL() = 0; virtual void BeginFrame() {} - virtual void EndFrame() {} virtual void ShutdownGL() = 0; virtual void InitSound(PMixer *mixer) = 0; diff --git a/Windows/OpenGLBase.cpp b/Windows/OpenGLBase.cpp index f739dcab1e68..92d4af4c14ec 100644 --- a/Windows/OpenGLBase.cpp +++ b/Windows/OpenGLBase.cpp @@ -49,14 +49,7 @@ void GL_Resized() // Resize And Initialize The GL Window glstate.viewport.restore(); } - -void GL_BeginFrame() -{ - -} - - -void GL_EndFrame() +void GL_SwapBuffers() { SwapBuffers(hDC); } diff --git a/Windows/OpenGLBase.h b/Windows/OpenGLBase.h index 50a154089f67..b26ed0ebfda6 100644 --- a/Windows/OpenGLBase.h +++ b/Windows/OpenGLBase.h @@ -2,9 +2,10 @@ #pragma once +#define WIN32_LEAN_AND_MEAN +#include bool GL_Init(HWND window); void GL_Shutdown(); void GL_Resized(); -void GL_BeginFrame(); -void GL_EndFrame(); +void GL_SwapBuffers(); diff --git a/Windows/WindowsHost.cpp b/Windows/WindowsHost.cpp index f7afab484fe7..cef4e558e6d8 100644 --- a/Windows/WindowsHost.cpp +++ b/Windows/WindowsHost.cpp @@ -117,11 +117,6 @@ void WindowsHost::BeginFrame() for (auto iter = this->input.begin(); iter != this->input.end(); iter++) if ((*iter)->UpdateState() == 0) break; // *iter is std::shared_ptr, **iter is InputDevice - GL_BeginFrame(); -} -void WindowsHost::EndFrame() -{ - GL_EndFrame(); } void WindowsHost::BootDone() diff --git a/Windows/WindowsHost.h b/Windows/WindowsHost.h index c46c88854352..923acf10b8ca 100644 --- a/Windows/WindowsHost.h +++ b/Windows/WindowsHost.h @@ -21,7 +21,6 @@ class WindowsHost : public Host void InitGL(); void BeginFrame(); - void EndFrame(); void ShutdownGL(); void InitSound(PMixer *mixer); diff --git a/android/jni/NativeApp.cpp b/android/jni/NativeApp.cpp index 7bde05e9d266..786d51b9b785 100644 --- a/android/jni/NativeApp.cpp +++ b/android/jni/NativeApp.cpp @@ -101,7 +101,6 @@ class NativeHost : public Host virtual void InitGL() {} virtual void BeginFrame() {} - virtual void EndFrame() {} virtual void ShutdownGL() {} virtual void InitSound(PMixer *mixer); diff --git a/headless/Headless.cpp b/headless/Headless.cpp index 7129523f43fb..d9289c8cba70 100644 --- a/headless/Headless.cpp +++ b/headless/Headless.cpp @@ -4,12 +4,13 @@ #include -#include "../Core/Config.h" -#include "../Core/Core.h" -#include "../Core/CoreTiming.h" -#include "../Core/System.h" -#include "../Core/MIPS/MIPS.h" -#include "../Core/Host.h" +#include "Core/Config.h" +#include "Core/Core.h" +#include "Core/CoreTiming.h" +#include "Core/System.h" +#include "Core/MIPS/MIPS.h" +#include "Core/Host.h" +#include "Windows/OpenGLBase.h" #include "Log.h" #include "LogManager.h" @@ -46,6 +47,9 @@ class PrintfLogger : public LogListener } }; +// Temporary hack around annoying linking error. +void GL_SwapBuffers() { } + void printUsage(const char *progname, const char *reason) { if (reason != NULL) @@ -192,8 +196,10 @@ int main(int argc, const char* argv[]) mipsr4k.RunLoopUntil(nowTicks + frameTicks); // If we were rendering, this might be a nice time to do something about it. - if (coreState == CORE_NEXTFRAME) + if (coreState == CORE_NEXTFRAME) { + headlessHost->SwapBuffers(); coreState = CORE_RUNNING; + } } host->ShutdownGL(); diff --git a/headless/StubHost.h b/headless/StubHost.h index 1533c381c30f..19e71c3b68cb 100644 --- a/headless/StubHost.h +++ b/headless/StubHost.h @@ -35,7 +35,6 @@ class HeadlessHost : public Host virtual void InitGL() {} virtual void BeginFrame() {} - virtual void EndFrame() {} virtual void ShutdownGL() {} virtual void InitSound(PMixer *mixer) {} @@ -53,4 +52,9 @@ class HeadlessHost : public Host virtual void SetComparisonScreenshot(const std::string &filename) {} virtual bool isGLWorking() { return false; } + + + // Unique for HeadlessHost + virtual void SwapBuffers() {} + }; \ No newline at end of file diff --git a/headless/WindowsHeadlessHost.cpp b/headless/WindowsHeadlessHost.cpp index 5e7448ae2371..a6629982f2db 100644 --- a/headless/WindowsHeadlessHost.cpp +++ b/headless/WindowsHeadlessHost.cpp @@ -218,7 +218,7 @@ void WindowsHeadlessHost::BeginFrame() } -void WindowsHeadlessHost::EndFrame() +void WindowsHeadlessHost::SwapBuffers() { - SwapBuffers(hDC); + ::SwapBuffers(hDC); } diff --git a/headless/WindowsHeadlessHost.h b/headless/WindowsHeadlessHost.h index 5abc20ca0545..d624f4d3ccea 100644 --- a/headless/WindowsHeadlessHost.h +++ b/headless/WindowsHeadlessHost.h @@ -30,10 +30,11 @@ class WindowsHeadlessHost : public HeadlessHost public: virtual void InitGL(); virtual void BeginFrame(); - virtual void EndFrame(); virtual void ShutdownGL(); virtual bool isGLWorking() { return glOkay; } + virtual void SwapBuffers(); + virtual void SendDebugOutput(const std::string &output); virtual void SendDebugScreenshot(const u8 *pixbuf, u32 w, u32 h); virtual void SetComparisonScreenshot(const std::string &filename); From 7c91802e3cc32e17f914ea11c59ce84a52b842b7 Mon Sep 17 00:00:00 2001 From: Henrik Rydgard Date: Mon, 18 Feb 2013 23:44:32 +0100 Subject: [PATCH 055/347] Add some infrastructure to be used for frameskipping --- Core/HLE/sceDisplay.cpp | 29 ++++++++++++++++++++++------- GPU/GLES/DisplayListInterpreter.cpp | 3 +++ GPU/GLES/DisplayListInterpreter.h | 1 - GPU/GPUState.h | 8 +++++++- 4 files changed, 32 insertions(+), 9 deletions(-) diff --git a/Core/HLE/sceDisplay.cpp b/Core/HLE/sceDisplay.cpp index ed552dcbaa72..9ec7d75303b5 100644 --- a/Core/HLE/sceDisplay.cpp +++ b/Core/HLE/sceDisplay.cpp @@ -86,6 +86,7 @@ static int hCount; static int hCountTotal; //unused static int vCount; static int isVblank; +static int numSkippedFrames; static bool hasSetMode; // Don't include this in the state, time increases regardless of state. static double lastFrameTime; @@ -113,6 +114,7 @@ void hleAfterFlip(u64 userdata, int cyclesLate); void __DisplayInit() { gpuStats.reset(); hasSetMode = false; + numSkippedFrames = 0; framebufIsLatched = false; framebuf.topaddr = 0x04000000; framebuf.pspFramebufFormat = PSP_DISPLAY_PIXEL_FORMAT_8888; @@ -264,12 +266,15 @@ void DebugStats() } // Let's collect all the throttling and frameskipping logic here. -void DoFrameTiming(bool &throttle) { +void DoFrameTiming(bool &throttle, bool &skipFrame, bool &skipFlip) { #ifdef _WIN32 throttle = !GetAsyncKeyState(VK_TAB); #else throttle = false; #endif + skipFlip = false; + skipFrame = false; + if (PSP_CoreParameter().headLess) throttle = false; @@ -353,16 +358,26 @@ void hleEnterVblank(u64 userdata, int cyclesLate) { // Yeah, this has to be the right moment to end the frame. Give the graphics backend opportunity // to blit the framebuffer, in order to support half-framerate games that otherwise wouldn't have // anything to draw here. - gpu->CopyDisplayToOutput(); + gstate_c.skipDrawReason &= ~SKIPDRAW_SKIPFRAME; - bool throttle; + bool throttle, skipFrame, skipFlip; - DoFrameTiming(throttle); + DoFrameTiming(throttle, skipFrame, skipFlip); // Setting CORE_NEXTFRAME causes a swap. - coreState = CORE_NEXTFRAME; - - CoreTiming::ScheduleEvent(0 - cyclesLate, afterFlipEvent, 0); + if (skipFrame) { + gstate_c.skipDrawReason |= SKIPDRAW_SKIPFRAME; + numSkippedFrames++; + } else { + numSkippedFrames = 0; + } + + if (!skipFlip) { + coreState = CORE_NEXTFRAME; + CoreTiming::ScheduleEvent(0 - cyclesLate, afterFlipEvent, 0); + + gpu->CopyDisplayToOutput(); + } // Returning here with coreState == CORE_NEXTFRAME causes a buffer flip to happen (next frame). // Right after, we regain control for a little bit in hleAfterFlip. I think that's a great diff --git a/GPU/GLES/DisplayListInterpreter.cpp b/GPU/GLES/DisplayListInterpreter.cpp index 6bf4220d86dd..cde737feddf9 100644 --- a/GPU/GLES/DisplayListInterpreter.cpp +++ b/GPU/GLES/DisplayListInterpreter.cpp @@ -330,6 +330,9 @@ void GLES_GPU::ExecuteOp(u32 op, u32 diff) { case GE_CMD_PRIM: { + if (gstate_c.skipDrawReason) + return; + framebufferManager_.SetRenderFrameBuffer(); u32 count = data & 0xFFFF; diff --git a/GPU/GLES/DisplayListInterpreter.h b/GPU/GLES/DisplayListInterpreter.h index 52e1883730f8..048aab400b84 100644 --- a/GPU/GLES/DisplayListInterpreter.h +++ b/GPU/GLES/DisplayListInterpreter.h @@ -64,7 +64,6 @@ class GLES_GPU : public GPUCommon return textureCache_.DecodeTexture(dest, state); } - std::vector GetFramebufferList(); private: diff --git a/GPU/GPUState.h b/GPU/GPUState.h index ca036b25063a..8f12c7d045ab 100644 --- a/GPU/GPUState.h +++ b/GPU/GPUState.h @@ -224,7 +224,11 @@ struct GPUgstate // Real data in the context ends here }; - + +enum SkipDrawReasonFlags { + SKIPDRAW_SKIPFRAME = 1, +}; + // The rest is cached simplified/converted data for fast access. // Does not need to be saved when saving/restoring context. struct GPUStateCache @@ -236,6 +240,8 @@ struct GPUStateCache bool textureChanged; + int skipDrawReason; + float uScale,vScale; float uOff,vOff; bool flipTexture; From 1aa3a657c01c42f38f51b9594af5de3f5e911223 Mon Sep 17 00:00:00 2001 From: Henrik Rydgard Date: Tue, 19 Feb 2013 00:44:22 +0100 Subject: [PATCH 056/347] Very rough and basic implementation of frameskipping. --- Core/Config.cpp | 2 + Core/Config.h | 1 + Core/HLE/sceDisplay.cpp | 69 ++++++++++++++++++++++++--------- Windows/PPSSPP.vcxproj.filters | 4 +- Windows/WndMainWindow.cpp | 9 ++++- Windows/ppsspp.rc | Bin 56832 -> 56972 bytes Windows/resource.h | 3 +- android/jni/MenuScreens.cpp | 3 ++ 8 files changed, 69 insertions(+), 22 deletions(-) diff --git a/Core/Config.cpp b/Core/Config.cpp index fc5019750c79..fd22d7b7df7c 100644 --- a/Core/Config.cpp +++ b/Core/Config.cpp @@ -68,6 +68,7 @@ void CConfig::Load(const char *iniFileName) graphics->Get("LinearFiltering", &bLinearFiltering, false); graphics->Get("SSAA", &SSAntiAliasing, 0); graphics->Get("VBO", &bUseVBO, false); + graphics->Get("FrameSkip", &iFrameSkip, 0); #ifdef USING_GLES2 graphics->Get("AnisotropyLevel", &iAnisotropyLevel, 0); #else @@ -131,6 +132,7 @@ void CConfig::Save() graphics->Set("LinearFiltering", bLinearFiltering); graphics->Set("SSAA", SSAntiAliasing); graphics->Set("VBO", bUseVBO); + graphics->Set("FrameSkip", iFrameSkip); graphics->Set("AnisotropyLevel", iAnisotropyLevel); graphics->Set("DisableG3DLog", bDisableG3DLog); graphics->Set("VertexCache", bVertexCache); diff --git a/Core/Config.h b/Core/Config.h index 93554eeeb4f7..d39325cc4e1d 100644 --- a/Core/Config.h +++ b/Core/Config.h @@ -59,6 +59,7 @@ struct CConfig bool bLinearFiltering; bool bUseVBO; bool bStretchToDisplay; + int iFrameSkip; // 0 = off; 1 = auto; (future: 2 = skip every 2nd frame; 3 = skip every 3rd frame etc). int iWindowZoom; // for Windows bool SSAntiAliasing; //for Windows, too diff --git a/Core/HLE/sceDisplay.cpp b/Core/HLE/sceDisplay.cpp index 9ec7d75303b5..46b297a9285e 100644 --- a/Core/HLE/sceDisplay.cpp +++ b/Core/HLE/sceDisplay.cpp @@ -89,7 +89,8 @@ static int isVblank; static int numSkippedFrames; static bool hasSetMode; // Don't include this in the state, time increases regardless of state. -static double lastFrameTime; +static double curFrameTime; +static double nextFrameTime; std::vector vblankWaitingThreads; @@ -129,7 +130,8 @@ void __DisplayInit() { vCount = 0; hCount = 0; hCountTotal = 0; - lastFrameTime = 0; + curFrameTime = 0.0; + nextFrameTime = 0.0; InitGfxState(); } @@ -191,7 +193,7 @@ float calculateFPS() static int lastFpsFrame = 0; static double lastFpsTime = 0.0; static double fps = 0.0; - + time_update(); double now = time_now_d(); @@ -274,25 +276,56 @@ void DoFrameTiming(bool &throttle, bool &skipFrame, bool &skipFlip) { #endif skipFlip = false; skipFrame = false; - if (PSP_CoreParameter().headLess) throttle = false; - if (throttle) { - // Best place to throttle the frame rate on non vsynced platforms is probably here. Let's try it. - time_update(); - if (lastFrameTime == 0.0) - lastFrameTime = time_now_d(); - - // First, check if we are already behind. - // Wait until it's time. - while (time_now_d() < lastFrameTime + 1.0 / 60.0) { - Common::SleepCurrentThread(1); - time_update(); + // Check if the frameskipping code should be enabled. If neither throttling or frameskipping is on, + // we have nothing to do here. + bool doFrameSkip = g_Config.iFrameSkip == 1; + if (!throttle && !doFrameSkip) + return; + + time_update(); + + curFrameTime = time_now_d(); + if (nextFrameTime == 0.0) + nextFrameTime = time_now_d() + 1.0 / 60.0; + + if (curFrameTime > nextFrameTime && doFrameSkip) { + // Argh, we are falling behind! Let's skip a frame and see if we catch up. + skipFrame = true; + skipFlip = true; + INFO_LOG(HLE,"FRAMESKIP %i", numSkippedFrames); + } + + if (curFrameTime < nextFrameTime && throttle) + { + // If time gap is huge just jump (somebody unthrottled) + if (nextFrameTime - curFrameTime > 1.0 / 30.0) { + nextFrameTime = curFrameTime + 1.0 / 60.0; + } else { + // Wait until we've catched up. + while (time_now_d() < nextFrameTime) { + Common::SleepCurrentThread(1); + time_update(); + } } - // Advance lastFrameTime by a constant amount each frame, - // but don't let it get too far behind. - lastFrameTime = std::max(lastFrameTime + 1.0 / 60.0, time_now_d() - 1.5 / 60.0); + curFrameTime = time_now_d(); + } + // Advance lastFrameTime by a constant amount each frame, + // but don't let it get too far behind as things can get very jumpy. + const double maxFallBehindFrames = 5.5; + + if (throttle || doFrameSkip) { + nextFrameTime = std::max(nextFrameTime + 1.0 / 60.0, time_now_d() - maxFallBehindFrames / 60.0); + } else { + nextFrameTime = nextFrameTime + 1.0 / 60.0; + } + + // Max 6 skipped frames in a row - 10 fps is really the bare minimum for playability. + if (numSkippedFrames >= 4) { + skipFrame = false; + skipFlip = false; } } diff --git a/Windows/PPSSPP.vcxproj.filters b/Windows/PPSSPP.vcxproj.filters index d2538d562b2e..6c0a8b3408a6 100644 --- a/Windows/PPSSPP.vcxproj.filters +++ b/Windows/PPSSPP.vcxproj.filters @@ -209,10 +209,12 @@ Android - Android + + Windows + diff --git a/Windows/WndMainWindow.cpp b/Windows/WndMainWindow.cpp index 2f3b07e531c7..b97678aad568 100644 --- a/Windows/WndMainWindow.cpp +++ b/Windows/WndMainWindow.cpp @@ -73,8 +73,7 @@ namespace MainWindow void Init(HINSTANCE hInstance) { -#ifdef THEMES - WTL::CTheme::IsThemingSupported(); +#ifdef THEMES WTL::CTheme::IsThemingSupported(); #endif //Register classes WNDCLASSEX wcex; @@ -447,6 +446,11 @@ namespace MainWindow gpu->Resized(); // easy way to force a clear... break; + case ID_OPTIONS_FRAMESKIP: + g_Config.iFrameSkip = !g_Config.iFrameSkip; + UpdateMenus(); + break; + case ID_FILE_EXIT: DestroyWindow(hWnd); break; @@ -712,6 +716,7 @@ namespace MainWindow CHECKITEM(ID_OPTIONS_DISABLEG3DLOG, g_Config.bDisableG3DLog); CHECKITEM(ID_OPTIONS_VERTEXCACHE, g_Config.bVertexCache); CHECKITEM(ID_OPTIONS_SHOWFPS, g_Config.bShowFPSCounter); + CHECKITEM(ID_OPTIONS_FRAMESKIP, g_Config.iFrameSkip != 0); UINT enable = !Core_IsStepping() ? MF_GRAYED : MF_ENABLED; EnableMenuItem(menu,ID_EMULATION_RUN, g_State.bEmuThreadStarted ? enable : MF_GRAYED); diff --git a/Windows/ppsspp.rc b/Windows/ppsspp.rc index e0a82cd7f4231adcd17ae6abe95c146ffc5fc198..8d0a8e1004b522d9c2d97aa8a0af3f5eafb8b817 100644 GIT binary patch delta 68 zcmZqJ!`!o%d4rADe XWpD+`cr$o11WazUOWs`J)iD_WtS=L4 delta 18 acmeC#%iOSsd4rAD Date: Tue, 19 Feb 2013 01:01:40 +0100 Subject: [PATCH 057/347] Must restore the new scheduled event --- Core/HLE/sceDisplay.cpp | 2 ++ 1 file changed, 2 insertions(+) diff --git a/Core/HLE/sceDisplay.cpp b/Core/HLE/sceDisplay.cpp index 46b297a9285e..81d264e59003 100644 --- a/Core/HLE/sceDisplay.cpp +++ b/Core/HLE/sceDisplay.cpp @@ -152,6 +152,8 @@ void __DisplayDoState(PointerWrap &p) { CoreTiming::RestoreRegisterEvent(enterVblankEvent, "EnterVBlank", &hleEnterVblank); p.Do(leaveVblankEvent); CoreTiming::RestoreRegisterEvent(leaveVblankEvent, "LeaveVBlank", &hleLeaveVblank); + p.Do(afterFlipEvent); + CoreTiming::RestoreRegisterEvent(afterFlipEvent, "AfterFlipEVent", &hleAfterFlip); p.Do(gstate); p.Do(gstate_c); From 588bd50b4dd853413df45099b547a86c22bb9317 Mon Sep 17 00:00:00 2001 From: Henrik Rydgard Date: Tue, 19 Feb 2013 01:01:40 +0100 Subject: [PATCH 058/347] Must restore the new scheduled event --- Core/HLE/sceDisplay.cpp | 2 ++ 1 file changed, 2 insertions(+) diff --git a/Core/HLE/sceDisplay.cpp b/Core/HLE/sceDisplay.cpp index 46b297a9285e..81d264e59003 100644 --- a/Core/HLE/sceDisplay.cpp +++ b/Core/HLE/sceDisplay.cpp @@ -152,6 +152,8 @@ void __DisplayDoState(PointerWrap &p) { CoreTiming::RestoreRegisterEvent(enterVblankEvent, "EnterVBlank", &hleEnterVblank); p.Do(leaveVblankEvent); CoreTiming::RestoreRegisterEvent(leaveVblankEvent, "LeaveVBlank", &hleLeaveVblank); + p.Do(afterFlipEvent); + CoreTiming::RestoreRegisterEvent(afterFlipEvent, "AfterFlipEVent", &hleAfterFlip); p.Do(gstate); p.Do(gstate_c); From 65b2e7ca4be68845c677d85244e2d99fb9ba6f9c Mon Sep 17 00:00:00 2001 From: Henrik Rydgard Date: Tue, 19 Feb 2013 01:28:13 +0100 Subject: [PATCH 059/347] typo --- Windows/WndMainWindow.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/Windows/WndMainWindow.cpp b/Windows/WndMainWindow.cpp index b97678aad568..30674cf9b474 100644 --- a/Windows/WndMainWindow.cpp +++ b/Windows/WndMainWindow.cpp @@ -73,7 +73,8 @@ namespace MainWindow void Init(HINSTANCE hInstance) { -#ifdef THEMES WTL::CTheme::IsThemingSupported(); +#ifdef THEMES + WTL::CTheme::IsThemingSupported(); #endif //Register classes WNDCLASSEX wcex; From 2dfdf3ffeb1748d178248d70f108a8a1371c221c Mon Sep 17 00:00:00 2001 From: "Unknown W. Brackets" Date: Mon, 18 Feb 2013 20:02:58 -0800 Subject: [PATCH 060/347] Implement Comp_VV2Op vfpu ops in the x86 jit. Also, some cleanup. No need for this extra boilerplate, simplify... This makes the Bink video issue slightly better, in jit only. --- Core/MIPS/ARM/ArmCompVFPU.cpp | 5 + Core/MIPS/ARM/ArmJit.h | 1 + Core/MIPS/MIPSIntVFPU.cpp | 4 +- Core/MIPS/MIPSTables.cpp | 32 +++---- Core/MIPS/x86/CompVFPU.cpp | 170 +++++++++++++++++++++++++++------- Core/MIPS/x86/Jit.h | 1 + 6 files changed, 161 insertions(+), 52 deletions(-) diff --git a/Core/MIPS/ARM/ArmCompVFPU.cpp b/Core/MIPS/ARM/ArmCompVFPU.cpp index 34bfa0802955..ab9a76e330f7 100644 --- a/Core/MIPS/ARM/ArmCompVFPU.cpp +++ b/Core/MIPS/ARM/ArmCompVFPU.cpp @@ -40,6 +40,11 @@ namespace MIPSComp DISABLE; } + void Jit::Comp_VV2Op(u32 op) + { + DISABLE; + } + void Jit::Comp_Mftv(u32 op) { DISABLE; diff --git a/Core/MIPS/ARM/ArmJit.h b/Core/MIPS/ARM/ArmJit.h index 1cb80e2d4f34..0acda3f24290 100644 --- a/Core/MIPS/ARM/ArmJit.h +++ b/Core/MIPS/ARM/ArmJit.h @@ -112,6 +112,7 @@ class Jit : public ArmGen::ARMXCodeBlock void Comp_VPFX(u32 op); void Comp_VDot(u32 op); void Comp_VecDo3(u32 op); + void Comp_VV2Op(u32 op); void Comp_Mftv(u32 op); void Comp_Vmtvc(u32 op); diff --git a/Core/MIPS/MIPSIntVFPU.cpp b/Core/MIPS/MIPSIntVFPU.cpp index 90b3fbface6e..f4273a10bea9 100644 --- a/Core/MIPS/MIPSIntVFPU.cpp +++ b/Core/MIPS/MIPSIntVFPU.cpp @@ -492,8 +492,8 @@ namespace MIPSInt case 17: d[i] = 1.0f / sqrtf(s[i]); break; //vrsq case 18: d[i] = sinf((float)M_PI_2 * s[i]); break; //vsin 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 20: d[i] = powf(2.0f, s[i]); break; //vexp2 + case 21: d[i] = logf(s[i])/log(2.0f); break; //vlog2 case 22: d[i] = sqrtf(s[i]); break; //vsqrt case 23: d[i] = asinf(s[i] * (float)M_2_PI); break; //vasin case 24: d[i] = -1.0f / s[i]; break; // vnrcp diff --git a/Core/MIPS/MIPSTables.cpp b/Core/MIPS/MIPSTables.cpp index 821fd72c903d..c039f3747340 100644 --- a/Core/MIPS/MIPSTables.cpp +++ b/Core/MIPS/MIPSTables.cpp @@ -582,31 +582,31 @@ const MIPSInstruction tableVFPU7[32] = // 110100 00000 10111 0000000000000000 const MIPSInstruction tableVFPU4[32] = //110100 00000 xxxxx { - INSTR("vmov", &Jit::Comp_Generic, Dis_VectorSet2, Int_VV2Op,IS_VFPU|OUT_EAT_PREFIX), - INSTR("vabs", &Jit::Comp_Generic, Dis_VectorSet2, Int_VV2Op,IS_VFPU|OUT_EAT_PREFIX), - INSTR("vneg", &Jit::Comp_Generic, Dis_VectorSet2, Int_VV2Op,IS_VFPU|OUT_EAT_PREFIX), + INSTR("vmov", &Jit::Comp_VV2Op, Dis_VectorSet2, Int_VV2Op,IS_VFPU|OUT_EAT_PREFIX), + INSTR("vabs", &Jit::Comp_VV2Op, Dis_VectorSet2, Int_VV2Op,IS_VFPU|OUT_EAT_PREFIX), + INSTR("vneg", &Jit::Comp_VV2Op, Dis_VectorSet2, Int_VV2Op,IS_VFPU|OUT_EAT_PREFIX), INSTR("vidt", &Jit::Comp_Generic, Dis_VectorSet1, Int_Vidt,IS_VFPU|OUT_EAT_PREFIX), - INSTR("vsat0", &Jit::Comp_Generic, Dis_VectorSet2, Int_VV2Op, IS_VFPU|OUT_EAT_PREFIX), - INSTR("vsat1", &Jit::Comp_Generic, Dis_VectorSet2, Int_VV2Op, IS_VFPU|OUT_EAT_PREFIX), + INSTR("vsat0", &Jit::Comp_VV2Op, Dis_VectorSet2, Int_VV2Op, IS_VFPU|OUT_EAT_PREFIX), + INSTR("vsat1", &Jit::Comp_VV2Op, Dis_VectorSet2, Int_VV2Op, IS_VFPU|OUT_EAT_PREFIX), INSTR("vzero", &Jit::Comp_Generic, Dis_VectorSet1, Int_VVectorInit, IS_VFPU|OUT_EAT_PREFIX), INSTR("vone", &Jit::Comp_Generic, Dis_VectorSet1, Int_VVectorInit, IS_VFPU|OUT_EAT_PREFIX), //8 {-2},{-2},{-2},{-2},{-2},{-2},{-2},{-2}, //16 - INSTR("vrcp", &Jit::Comp_Generic, Dis_VectorSet2, Int_VV2Op, IS_VFPU|OUT_EAT_PREFIX), - INSTR("vrsq", &Jit::Comp_Generic, Dis_VectorSet2, Int_VV2Op, IS_VFPU|OUT_EAT_PREFIX), - INSTR("vsin", &Jit::Comp_Generic, Dis_VectorSet2, Int_VV2Op, IS_VFPU|OUT_EAT_PREFIX), - INSTR("vcos", &Jit::Comp_Generic, Dis_VectorSet2, Int_VV2Op, IS_VFPU|OUT_EAT_PREFIX), - INSTR("vexp2", &Jit::Comp_Generic, Dis_VectorSet2, Int_VV2Op, IS_VFPU|OUT_EAT_PREFIX), - INSTR("vlog2", &Jit::Comp_Generic, Dis_VectorSet2, Int_VV2Op, IS_VFPU|OUT_EAT_PREFIX), - INSTR("vsqrt", &Jit::Comp_Generic, Dis_VectorSet2, Int_VV2Op, IS_VFPU|OUT_EAT_PREFIX), - INSTR("vasin", &Jit::Comp_Generic, Dis_VectorSet2, Int_VV2Op, IS_VFPU|OUT_EAT_PREFIX), + INSTR("vrcp", &Jit::Comp_VV2Op, Dis_VectorSet2, Int_VV2Op, IS_VFPU|OUT_EAT_PREFIX), + INSTR("vrsq", &Jit::Comp_VV2Op, Dis_VectorSet2, Int_VV2Op, IS_VFPU|OUT_EAT_PREFIX), + INSTR("vsin", &Jit::Comp_VV2Op, Dis_VectorSet2, Int_VV2Op, IS_VFPU|OUT_EAT_PREFIX), + INSTR("vcos", &Jit::Comp_VV2Op, Dis_VectorSet2, Int_VV2Op, IS_VFPU|OUT_EAT_PREFIX), + INSTR("vexp2", &Jit::Comp_VV2Op, Dis_VectorSet2, Int_VV2Op, IS_VFPU|OUT_EAT_PREFIX), + INSTR("vlog2", &Jit::Comp_VV2Op, Dis_VectorSet2, Int_VV2Op, IS_VFPU|OUT_EAT_PREFIX), + INSTR("vsqrt", &Jit::Comp_VV2Op, Dis_VectorSet2, Int_VV2Op, IS_VFPU|OUT_EAT_PREFIX), + INSTR("vasin", &Jit::Comp_VV2Op, Dis_VectorSet2, Int_VV2Op, IS_VFPU|OUT_EAT_PREFIX), //24 - INSTR("vnrcp", &Jit::Comp_Generic, Dis_VectorSet2, Int_VV2Op,IS_VFPU|OUT_EAT_PREFIX), + INSTR("vnrcp", &Jit::Comp_VV2Op, Dis_VectorSet2, Int_VV2Op,IS_VFPU|OUT_EAT_PREFIX), {-2}, - INSTR("vnsin", &Jit::Comp_Generic, Dis_VectorSet2, Int_VV2Op,IS_VFPU|OUT_EAT_PREFIX), + INSTR("vnsin", &Jit::Comp_VV2Op, Dis_VectorSet2, Int_VV2Op,IS_VFPU|OUT_EAT_PREFIX), {-2}, - INSTR("vrexp2",&Jit::Comp_Generic, Dis_VectorSet2, Int_VV2Op, IS_VFPU|OUT_EAT_PREFIX), + INSTR("vrexp2",&Jit::Comp_VV2Op, Dis_VectorSet2, Int_VV2Op, IS_VFPU|OUT_EAT_PREFIX), {-2},{-2},{-2}, //32 }; diff --git a/Core/MIPS/x86/CompVFPU.cpp b/Core/MIPS/x86/CompVFPU.cpp index 3343bddac0ac..a022cb9a8f05 100644 --- a/Core/MIPS/x86/CompVFPU.cpp +++ b/Core/MIPS/x86/CompVFPU.cpp @@ -28,9 +28,9 @@ // All functions should have CONDITIONAL_DISABLE, so we can narrow things down to a file quickly. // Currently known non working ones should have DISABLE. -// #define CONDITIONAL_DISABLE { Comp_Generic(op); return; } +// #define CONDITIONAL_DISABLE { fpr.ReleaseSpillLocks(); Comp_Generic(op); return; } #define CONDITIONAL_DISABLE ; -#define DISABLE { Comp_Generic(op); return; } +#define DISABLE { fpr.ReleaseSpillLocks(); Comp_Generic(op); return; } #define _RS ((op>>21) & 0x1F) @@ -167,7 +167,7 @@ void Jit::ApplyPrefixD(const u8 *vregs, VectorSize sz) { // Vector regs can overlap in all sorts of swizzled ways. // This does allow a single overlap in sregs[i]. -bool IsOverlapSafeAllowS(int dreg, int di, int sn, u8 sregs[], int tn, u8 tregs[]) +bool IsOverlapSafeAllowS(int dreg, int di, int sn, u8 sregs[], int tn = 0, u8 tregs[] = NULL) { for (int i = 0; i < sn; ++i) { @@ -184,7 +184,7 @@ bool IsOverlapSafeAllowS(int dreg, int di, int sn, u8 sregs[], int tn, u8 tregs[ return true; } -bool IsOverlapSafe(int dreg, int di, int sn, u8 sregs[], int tn, u8 tregs[]) +bool IsOverlapSafe(int dreg, int di, int sn, u8 sregs[], int tn = 0, u8 tregs[] = NULL) { return IsOverlapSafeAllowS(dreg, di, sn, sregs, tn, tregs) && sregs[di] != dreg; } @@ -339,23 +339,18 @@ void Jit::Comp_SVQ(u32 op) void Jit::Comp_VDot(u32 op) { CONDITIONAL_DISABLE; - if (js.HasUnknownPrefix()) { - Comp_Generic(op); - return; - } + if (js.HasUnknownPrefix()) + DISABLE; - int vd = _VD; - int vs = _VS; - int vt = _VT; VectorSize sz = GetVecSize(op); + int n = GetNumVectorElements(sz); // TODO: Force read one of them into regs? probably not. u8 sregs[4], tregs[4], dregs[1]; - GetVectorRegsPrefixS(sregs, sz, vs); - GetVectorRegsPrefixT(tregs, sz, vt); - GetVectorRegsPrefixD(dregs, V_Single, vd); + GetVectorRegsPrefixS(sregs, sz, _VS); + GetVectorRegsPrefixT(tregs, sz, _VT); + GetVectorRegsPrefixD(dregs, V_Single, _VD); - int n = GetNumVectorElements(sz); X64Reg tempxreg = XMM0; if (IsOverlapSafe(dregs[0], 0, n, sregs, n, tregs)) { @@ -387,20 +382,8 @@ void Jit::Comp_VDot(u32 op) { void Jit::Comp_VecDo3(u32 op) { CONDITIONAL_DISABLE; - if (js.HasUnknownPrefix()) { - Comp_Generic(op); - return; - } - - int vd = _VD; - int vs = _VS; - int vt = _VT; - VectorSize sz = GetVecSize(op); - - u8 sregs[4], tregs[4], dregs[4]; - GetVectorRegsPrefixS(sregs, sz, vs); - GetVectorRegsPrefixT(tregs, sz, vt); - GetVectorRegsPrefixD(dregs, sz, vd); + if (js.HasUnknownPrefix()) + DISABLE; void (XEmitter::*xmmop)(X64Reg, OpArg) = NULL; switch (op >> 26) @@ -430,14 +413,16 @@ void Jit::Comp_VecDo3(u32 op) { } if (xmmop == NULL) - { - fpr.ReleaseSpillLocks(); - Comp_Generic(op); - return; - } + DISABLE; + VectorSize sz = GetVecSize(op); int n = GetNumVectorElements(sz); + u8 sregs[4], tregs[4], dregs[4]; + GetVectorRegsPrefixS(sregs, sz, _VS); + GetVectorRegsPrefixT(tregs, sz, _VT); + GetVectorRegsPrefixD(dregs, sz, _VD); + X64Reg tempxregs[4]; for (int i = 0; i < n; ++i) { @@ -480,6 +465,123 @@ void Jit::Comp_VecDo3(u32 op) { fpr.ReleaseSpillLocks(); } +void Jit::Comp_VV2Op(u32 op) { + CONDITIONAL_DISABLE; + + if (js.HasUnknownPrefix()) + DISABLE; + + VectorSize sz = GetVecSize(op); + int n = GetNumVectorElements(sz); + + u8 sregs[4], dregs[4]; + GetVectorRegsPrefixS(sregs, sz, _VS); + GetVectorRegsPrefixD(dregs, sz, _VD); + + X64Reg tempxregs[4]; + for (int i = 0; i < n; ++i) + { + if (!IsOverlapSafeAllowS(dregs[i], i, n, sregs)) + { + int reg = fpr.GetTempV(); + fpr.MapRegV(reg, MAP_NOINIT | MAP_DIRTY); + fpr.SpillLockV(reg); + tempxregs[i] = fpr.VX(reg); + } + else + { + fpr.MapRegV(dregs[i], (dregs[i] == sregs[i] ? 0 : MAP_NOINIT) | MAP_DIRTY); + fpr.SpillLockV(dregs[i]); + tempxregs[i] = fpr.VX(dregs[i]); + } + } + + // Warning: sregs[i] and tempxregs[i] may be the same reg. + // Helps for vmov, hurts for vrcp, etc. + for (int i = 0; i < n; ++i) + { + switch ((op >> 16) & 0x1f) + { + case 0: // d[i] = s[i]; break; //vmov + // Probably for swizzle. + if (!fpr.V(sregs[i]).IsSimpleReg(tempxregs[i])) + MOVSS(tempxregs[i], fpr.V(sregs[i])); + break; + case 1: // d[i] = fabsf(s[i]); break; //vabs + if (!fpr.V(sregs[i]).IsSimpleReg(tempxregs[i])) + MOVSS(tempxregs[i], fpr.V(sregs[i])); + ANDPS(tempxregs[i], M((void *)&noSignMask)); + break; + case 2: // d[i] = -s[i]; break; //vneg + if (!fpr.V(sregs[i]).IsSimpleReg(tempxregs[i])) + MOVSS(tempxregs[i], fpr.V(sregs[i])); + XORPS(tempxregs[i], M((void *)&signBitLower)); + break; + case 4: // if (s[i] < 0) d[i] = 0; else {if(s[i] > 1.0f) d[i] = 1.0f; else d[i] = s[i];} break; // vsat0 + if (!fpr.V(sregs[i]).IsSimpleReg(tempxregs[i])) + MOVSS(tempxregs[i], fpr.V(sregs[i])); + MAXSS(tempxregs[i], M((void *)&zero)); + MINSS(tempxregs[i], M((void *)&one)); + break; + case 5: // if (s[i] < -1.0f) d[i] = -1.0f; else {if(s[i] > 1.0f) d[i] = 1.0f; else d[i] = s[i];} break; // vsat1 + if (!fpr.V(sregs[i]).IsSimpleReg(tempxregs[i])) + MOVSS(tempxregs[i], fpr.V(sregs[i])); + MAXSS(tempxregs[i], M((void *)&minus_one)); + MINSS(tempxregs[i], M((void *)&one)); + break; + case 16: // d[i] = 1.0f / s[i]; break; //vrcp + MOVSS(XMM0, M((void *)&one)); + DIVSS(XMM0, fpr.V(sregs[i])); + MOVSS(tempxregs[i], R(XMM0)); + break; + case 17: // d[i] = 1.0f / sqrtf(s[i]); break; //vrsq + SQRTSS(XMM0, fpr.V(sregs[i])); + MOVSS(tempxregs[i], M((void *)&one)); + DIVSS(tempxregs[i], R(XMM0)); + break; + case 18: // d[i] = sinf((float)M_PI_2 * s[i]); break; //vsin + DISABLE; + break; + case 19: // d[i] = cosf((float)M_PI_2 * s[i]); break; //vcos + DISABLE; + break; + case 20: // d[i] = powf(2.0f, s[i]); break; //vexp2 + DISABLE; + break; + case 21: // d[i] = logf(s[i])/log(2.0f); break; //vlog2 + DISABLE; + break; + case 22: // d[i] = sqrtf(s[i]); break; //vsqrt + SQRTSS(tempxregs[i], fpr.V(sregs[i])); + break; + case 23: // d[i] = asinf(s[i] * (float)M_2_PI); break; //vasin + DISABLE; + break; + case 24: // d[i] = -1.0f / s[i]; break; // vnrcp + MOVSS(XMM0, M((void *)&one)); + DIVSS(XMM0, fpr.V(sregs[i])); + XORPS(XMM0, M((void *)&signBitLower)); + MOVSS(tempxregs[i], R(XMM0)); + break; + case 26: // d[i] = -sinf((float)M_PI_2 * s[i]); break; // vnsin + DISABLE; + break; + case 28: // d[i] = 1.0f / expf(s[i] * (float)M_LOG2E); break; // vrexp2 + DISABLE; + break; + } + } + for (int i = 0; i < n; ++i) + { + if (!fpr.V(dregs[i]).IsSimpleReg(tempxregs[i])) + MOVSS(fpr.V(dregs[i]), tempxregs[i]); + } + + ApplyPrefixD(dregs, sz); + + fpr.ReleaseSpillLocks(); +} + void Jit::Comp_Mftv(u32 op) { CONDITIONAL_DISABLE; diff --git a/Core/MIPS/x86/Jit.h b/Core/MIPS/x86/Jit.h index cf8637639318..b4803e202b83 100644 --- a/Core/MIPS/x86/Jit.h +++ b/Core/MIPS/x86/Jit.h @@ -187,6 +187,7 @@ class Jit : public Gen::XCodeBlock void Comp_VPFX(u32 op); void Comp_VDot(u32 op); void Comp_VecDo3(u32 op); + void Comp_VV2Op(u32 op); void Comp_Mftv(u32 op); void Comp_Vmtvc(u32 op); From a3eba1e96ef951a340e44a53b07ace44aad3632e Mon Sep 17 00:00:00 2001 From: "Unknown W. Brackets" Date: Mon, 18 Feb 2013 20:04:02 -0800 Subject: [PATCH 061/347] Fix typo, should definitely be VX(). --- Core/MIPS/x86/CompVFPU.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Core/MIPS/x86/CompVFPU.cpp b/Core/MIPS/x86/CompVFPU.cpp index a022cb9a8f05..e85bce740584 100644 --- a/Core/MIPS/x86/CompVFPU.cpp +++ b/Core/MIPS/x86/CompVFPU.cpp @@ -643,7 +643,7 @@ void Jit::Comp_Vmtvc(u32 op) { int imm = op & 0xFF; if (imm >= 128 && imm < 128 + VFPU_CTRL_MAX) { fpr.MapRegV(vs, 0); - MOVSS(M(¤tMIPS->vfpuCtrl[imm - 128]), fpr.RX(vs)); + MOVSS(M(¤tMIPS->vfpuCtrl[imm - 128]), fpr.VX(vs)); fpr.ReleaseSpillLocks(); if (imm - 128 == VFPU_CTRL_SPREFIX) { From 2e6f0006fd235866d092a422aae771a929b982b1 Mon Sep 17 00:00:00 2001 From: "Unknown W. Brackets" Date: Mon, 18 Feb 2013 20:42:04 -0800 Subject: [PATCH 062/347] Oops, correct the bounds check. --- Core/MIPS/x86/CompVFPU.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Core/MIPS/x86/CompVFPU.cpp b/Core/MIPS/x86/CompVFPU.cpp index e85bce740584..7a2ab488f77b 100644 --- a/Core/MIPS/x86/CompVFPU.cpp +++ b/Core/MIPS/x86/CompVFPU.cpp @@ -103,7 +103,7 @@ void Jit::ApplyPrefixST(u8 *vregs, u32 prefix, VectorSize sz) { if (!constants) { // Prefix may say "z, z, z, z" but if this is a pair, we force to x. // TODO: But some ops seem to use const 0 instead? - if (regnum > n) { + if (regnum >= n) { ERROR_LOG(CPU, "Invalid VFPU swizzle: %08x / %d", prefix, sz); regnum = 0; } From 40b2a8dec132dd79cd7f7e65e3a8c4151cba5ea6 Mon Sep 17 00:00:00 2001 From: "Unknown W. Brackets" Date: Mon, 18 Feb 2013 21:46:33 -0800 Subject: [PATCH 063/347] Drop the sign in vsqrt, but not vrsq. --- Core/MIPS/MIPSIntVFPU.cpp | 2 +- Core/MIPS/x86/CompVFPU.cpp | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/Core/MIPS/MIPSIntVFPU.cpp b/Core/MIPS/MIPSIntVFPU.cpp index f4273a10bea9..a64be2caf77b 100644 --- a/Core/MIPS/MIPSIntVFPU.cpp +++ b/Core/MIPS/MIPSIntVFPU.cpp @@ -494,7 +494,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; //vexp2 case 21: d[i] = logf(s[i])/log(2.0f); break; //vlog2 - case 22: d[i] = sqrtf(s[i]); break; //vsqrt + case 22: d[i] = fabsf(sqrtf(s[i])); break; //vsqrt case 23: d[i] = asinf(s[i] * (float)M_2_PI); break; //vasin case 24: d[i] = -1.0f / s[i]; break; // vnrcp case 26: d[i] = -sinf((float)M_PI_2 * s[i]); break; // vnsin diff --git a/Core/MIPS/x86/CompVFPU.cpp b/Core/MIPS/x86/CompVFPU.cpp index 7a2ab488f77b..13ca0a02ee4e 100644 --- a/Core/MIPS/x86/CompVFPU.cpp +++ b/Core/MIPS/x86/CompVFPU.cpp @@ -553,6 +553,7 @@ void Jit::Comp_VV2Op(u32 op) { break; case 22: // d[i] = sqrtf(s[i]); break; //vsqrt SQRTSS(tempxregs[i], fpr.V(sregs[i])); + ANDPS(tempxregs[i], M((void *)&noSignMask)); break; case 23: // d[i] = asinf(s[i] * (float)M_2_PI); break; //vasin DISABLE; From a001b8b6f07d005e9222d7b1351969add9c47006 Mon Sep 17 00:00:00 2001 From: "Unknown W. Brackets" Date: Mon, 18 Feb 2013 22:06:49 -0800 Subject: [PATCH 064/347] Tweak and note vsat0/vsat1 NaN handling. --- Core/MIPS/MIPSIntVFPU.cpp | 10 +++++----- Core/MIPS/x86/CompVFPU.cpp | 2 ++ 2 files changed, 7 insertions(+), 5 deletions(-) diff --git a/Core/MIPS/MIPSIntVFPU.cpp b/Core/MIPS/MIPSIntVFPU.cpp index a64be2caf77b..97f43c75c552 100644 --- a/Core/MIPS/MIPSIntVFPU.cpp +++ b/Core/MIPS/MIPSIntVFPU.cpp @@ -85,6 +85,9 @@ #ifdef __APPLE__ using std::isnan; #endif +#ifdef _MSC_VER +#define isnan _isnan +#endif void ApplyPrefixST(float *v, u32 data, VectorSize size) { @@ -486,7 +489,8 @@ namespace MIPSInt case 0: d[i] = s[i]; break; //vmov case 1: d[i] = fabsf(s[i]); break; //vabs case 2: d[i] = -s[i]; break; //vneg - case 4: if (s[i] < 0) d[i] = 0; else {if(s[i] > 1.0f) d[i] = 1.0f; else d[i] = s[i];} break; // vsat0 + // vsat0 changes -0.0 to +0.0. + case 4: if (s[i] <= 0) d[i] = 0; else {if(s[i] > 1.0f) d[i] = 1.0f; else d[i] = s[i];} break; // vsat0 case 5: if (s[i] < -1.0f) d[i] = -1.0f; else {if(s[i] > 1.0f) d[i] = 1.0f; else d[i] = s[i];} break; // vsat1 case 16: d[i] = 1.0f / s[i]; break; //vrcp case 17: d[i] = 1.0f / sqrtf(s[i]); break; //vrsq @@ -1452,10 +1456,6 @@ namespace MIPSInt VC_NS }; -#ifdef _MSC_VER -#define isnan _isnan -#endif - void Int_Vcmp(u32 op) { int vs = _VS; diff --git a/Core/MIPS/x86/CompVFPU.cpp b/Core/MIPS/x86/CompVFPU.cpp index 13ca0a02ee4e..8e7ccce3d32d 100644 --- a/Core/MIPS/x86/CompVFPU.cpp +++ b/Core/MIPS/x86/CompVFPU.cpp @@ -520,12 +520,14 @@ void Jit::Comp_VV2Op(u32 op) { case 4: // if (s[i] < 0) d[i] = 0; else {if(s[i] > 1.0f) d[i] = 1.0f; else d[i] = s[i];} break; // vsat0 if (!fpr.V(sregs[i]).IsSimpleReg(tempxregs[i])) MOVSS(tempxregs[i], fpr.V(sregs[i])); + // TODO: Doesn't handle NaN correctly. MAXSS(tempxregs[i], M((void *)&zero)); MINSS(tempxregs[i], M((void *)&one)); break; case 5: // if (s[i] < -1.0f) d[i] = -1.0f; else {if(s[i] > 1.0f) d[i] = 1.0f; else d[i] = s[i];} break; // vsat1 if (!fpr.V(sregs[i]).IsSimpleReg(tempxregs[i])) MOVSS(tempxregs[i], fpr.V(sregs[i])); + // TODO: Doesn't handle NaN correctly. MAXSS(tempxregs[i], M((void *)&minus_one)); MINSS(tempxregs[i], M((void *)&one)); break; From b8e2177591297839a1ad2edac412c30b15d9d41d Mon Sep 17 00:00:00 2001 From: "Unknown W. Brackets" Date: Mon, 18 Feb 2013 22:15:47 -0800 Subject: [PATCH 065/347] Jit vzero/vone, which are easy and common (x86.) --- Core/MIPS/ARM/ArmCompVFPU.cpp | 5 +++++ Core/MIPS/ARM/ArmJit.h | 1 + Core/MIPS/MIPSTables.cpp | 4 ++-- Core/MIPS/x86/CompVFPU.cpp | 34 ++++++++++++++++++++++++++++++++++ Core/MIPS/x86/Jit.h | 1 + 5 files changed, 43 insertions(+), 2 deletions(-) diff --git a/Core/MIPS/ARM/ArmCompVFPU.cpp b/Core/MIPS/ARM/ArmCompVFPU.cpp index ab9a76e330f7..79a30cf52ced 100644 --- a/Core/MIPS/ARM/ArmCompVFPU.cpp +++ b/Core/MIPS/ARM/ArmCompVFPU.cpp @@ -30,6 +30,11 @@ namespace MIPSComp DISABLE; } + void Jit::Comp_VVectorInit(u32 op) + { + DISABLE; + } + void Jit::Comp_VDot(u32 op) { DISABLE; diff --git a/Core/MIPS/ARM/ArmJit.h b/Core/MIPS/ARM/ArmJit.h index 0acda3f24290..80a6a0d3c4a9 100644 --- a/Core/MIPS/ARM/ArmJit.h +++ b/Core/MIPS/ARM/ArmJit.h @@ -110,6 +110,7 @@ class Jit : public ArmGen::ARMXCodeBlock void Comp_SV(u32 op); void Comp_SVQ(u32 op); void Comp_VPFX(u32 op); + void Comp_VVectorInit(u32 op); void Comp_VDot(u32 op); void Comp_VecDo3(u32 op); void Comp_VV2Op(u32 op); diff --git a/Core/MIPS/MIPSTables.cpp b/Core/MIPS/MIPSTables.cpp index c039f3747340..1dde164e3912 100644 --- a/Core/MIPS/MIPSTables.cpp +++ b/Core/MIPS/MIPSTables.cpp @@ -588,8 +588,8 @@ const MIPSInstruction tableVFPU4[32] = //110100 00000 xxxxx INSTR("vidt", &Jit::Comp_Generic, Dis_VectorSet1, Int_Vidt,IS_VFPU|OUT_EAT_PREFIX), INSTR("vsat0", &Jit::Comp_VV2Op, Dis_VectorSet2, Int_VV2Op, IS_VFPU|OUT_EAT_PREFIX), INSTR("vsat1", &Jit::Comp_VV2Op, Dis_VectorSet2, Int_VV2Op, IS_VFPU|OUT_EAT_PREFIX), - INSTR("vzero", &Jit::Comp_Generic, Dis_VectorSet1, Int_VVectorInit, IS_VFPU|OUT_EAT_PREFIX), - INSTR("vone", &Jit::Comp_Generic, Dis_VectorSet1, Int_VVectorInit, IS_VFPU|OUT_EAT_PREFIX), + INSTR("vzero", &Jit::Comp_VVectorInit, Dis_VectorSet1, Int_VVectorInit, IS_VFPU|OUT_EAT_PREFIX), + INSTR("vone", &Jit::Comp_VVectorInit, Dis_VectorSet1, Int_VVectorInit, IS_VFPU|OUT_EAT_PREFIX), //8 {-2},{-2},{-2},{-2},{-2},{-2},{-2},{-2}, //16 diff --git a/Core/MIPS/x86/CompVFPU.cpp b/Core/MIPS/x86/CompVFPU.cpp index 8e7ccce3d32d..6928a57f0154 100644 --- a/Core/MIPS/x86/CompVFPU.cpp +++ b/Core/MIPS/x86/CompVFPU.cpp @@ -336,6 +336,40 @@ void Jit::Comp_SVQ(u32 op) } } +void Jit::Comp_VVectorInit(u32 op) { + CONDITIONAL_DISABLE; + + if (js.HasUnknownPrefix()) + DISABLE; + + VectorSize sz = GetVecSize(op); + int n = GetNumVectorElements(sz); + + u8 dregs[4]; + GetVectorRegsPrefixD(dregs, sz, _VD); + fpr.MapRegsV(dregs, sz, MAP_NOINIT | MAP_DIRTY); + + for (int i = 0; i < n; ++i) + { + switch ((op >> 16) & 0xF) + { + case 6: // v=zeros; break; //vzero + MOVSS(fpr.VX(dregs[i]), M((void *) &zero)); + break; + case 7: // v=ones; break; //vone + MOVSS(fpr.VX(dregs[i]), M((void *) &one)); + break; + default: + DISABLE; + break; + } + } + + ApplyPrefixD(dregs, sz); + + fpr.ReleaseSpillLocks(); +} + void Jit::Comp_VDot(u32 op) { CONDITIONAL_DISABLE; diff --git a/Core/MIPS/x86/Jit.h b/Core/MIPS/x86/Jit.h index b4803e202b83..dc5082ff81e2 100644 --- a/Core/MIPS/x86/Jit.h +++ b/Core/MIPS/x86/Jit.h @@ -185,6 +185,7 @@ class Jit : public Gen::XCodeBlock void Comp_SV(u32 op); void Comp_SVQ(u32 op); void Comp_VPFX(u32 op); + void Comp_VVectorInit(u32 op); void Comp_VDot(u32 op); void Comp_VecDo3(u32 op); void Comp_VV2Op(u32 op); From a438791e7c250e61409c1fe658b75a6dbd340633 Mon Sep 17 00:00:00 2001 From: "Unknown W. Brackets" Date: Mon, 18 Feb 2013 23:21:18 -0800 Subject: [PATCH 066/347] Initial (very inefficient) vmmov for x86 jit. This makes #464 work (at least LittleBigPlanet), but only in x86 jit. --- Core/MIPS/ARM/ArmCompVFPU.cpp | 4 ++++ Core/MIPS/ARM/ArmJit.h | 1 + Core/MIPS/MIPSTables.cpp | 2 +- Core/MIPS/x86/CompVFPU.cpp | 42 +++++++++++++++++++++++++++++++++++ Core/MIPS/x86/Jit.h | 1 + 5 files changed, 49 insertions(+), 1 deletion(-) diff --git a/Core/MIPS/ARM/ArmCompVFPU.cpp b/Core/MIPS/ARM/ArmCompVFPU.cpp index 79a30cf52ced..ca909fe19338 100644 --- a/Core/MIPS/ARM/ArmCompVFPU.cpp +++ b/Core/MIPS/ARM/ArmCompVFPU.cpp @@ -63,4 +63,8 @@ namespace MIPSComp DISABLE; } + void Comp_Vmmov(u32 op) { + DISABLE; + } + } diff --git a/Core/MIPS/ARM/ArmJit.h b/Core/MIPS/ARM/ArmJit.h index 80a6a0d3c4a9..194c5571398b 100644 --- a/Core/MIPS/ARM/ArmJit.h +++ b/Core/MIPS/ARM/ArmJit.h @@ -116,6 +116,7 @@ class Jit : public ArmGen::ARMXCodeBlock void Comp_VV2Op(u32 op); void Comp_Mftv(u32 op); void Comp_Vmtvc(u32 op); + void Comp_Vmmov(u32 op); ArmJitBlockCache *GetBlockCache() { return &blocks; } diff --git a/Core/MIPS/MIPSTables.cpp b/Core/MIPS/MIPSTables.cpp index 1dde164e3912..ed6be36317de 100644 --- a/Core/MIPS/MIPSTables.cpp +++ b/Core/MIPS/MIPSTables.cpp @@ -669,7 +669,7 @@ const MIPSInstruction tableVFPU6[32] = //111100 xxx const MIPSInstruction tableVFPUMatrixSet1[16] = //111100 11100 0xxxx (rm x is 16) { - INSTR("vmmov",&Jit::Comp_Generic, Dis_MatrixSet2, Int_Vmmov, IS_VFPU|OUT_EAT_PREFIX), + INSTR("vmmov",&Jit::Comp_Vmmov, Dis_MatrixSet2, Int_Vmmov, IS_VFPU|OUT_EAT_PREFIX), {-2}, {-2}, INSTR("vmidt",&Jit::Comp_Generic, Dis_MatrixSet1, Int_VMatrixInit, IS_VFPU|OUT_EAT_PREFIX), diff --git a/Core/MIPS/x86/CompVFPU.cpp b/Core/MIPS/x86/CompVFPU.cpp index 6928a57f0154..928684fae93b 100644 --- a/Core/MIPS/x86/CompVFPU.cpp +++ b/Core/MIPS/x86/CompVFPU.cpp @@ -693,4 +693,46 @@ void Jit::Comp_Vmtvc(u32 op) { } } +void Jit::Comp_Vmmov(u32 op) { + CONDITIONAL_DISABLE; + + // TODO: This probably ignores prefixes? + if (js.MayHavePrefix()) + DISABLE; + + MatrixSize sz = GetMtxSize(op); + int n = GetMatrixSide(sz); + + u8 sregs[16], dregs[16]; + GetMatrixRegs(sregs, sz, _VS); + GetMatrixRegs(dregs, sz, _VD); + + // TODO: gas doesn't allow overlap, what does the PSP do? + // Potentially detect overlap or the safe direction to move in, or just DISABLE? + // This is very not optimal, blows the regcache everytime. + u8 tempregs[16]; + for (int a = 0; a < n; a++) + { + for (int b = 0; b < n; b++) + { + u8 temp = (u8) fpr.GetTempV(); + fpr.MapRegV(temp, MAP_NOINIT | MAP_DIRTY); + MOVSS(fpr.VX(temp), fpr.V(sregs[a * 4 + b])); + fpr.StoreFromRegisterV(temp); + tempregs[a * 4 + b] = temp; + } + } + for (int a = 0; a < n; a++) + { + for (int b = 0; b < n; b++) + { + u8 temp = tempregs[a * 4 + b]; + fpr.MapRegV(temp, 0); + MOVSS(fpr.V(dregs[a * 4 + b]), fpr.VX(temp)); + } + } + + fpr.ReleaseSpillLocks(); +} + } \ No newline at end of file diff --git a/Core/MIPS/x86/Jit.h b/Core/MIPS/x86/Jit.h index dc5082ff81e2..54c443b53a8f 100644 --- a/Core/MIPS/x86/Jit.h +++ b/Core/MIPS/x86/Jit.h @@ -191,6 +191,7 @@ class Jit : public Gen::XCodeBlock void Comp_VV2Op(u32 op); void Comp_Mftv(u32 op); void Comp_Vmtvc(u32 op); + void Comp_Vmmov(u32 op); void Comp_DoNothing(u32 op); From 038394b08186ab8410a59c35b1545b77af676a6f Mon Sep 17 00:00:00 2001 From: "Unknown W. Brackets" Date: Tue, 19 Feb 2013 00:35:15 -0800 Subject: [PATCH 067/347] Divide from -1.0 directly in x86 jit vnrcp. --- Core/MIPS/x86/CompVFPU.cpp | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/Core/MIPS/x86/CompVFPU.cpp b/Core/MIPS/x86/CompVFPU.cpp index 928684fae93b..670c9df44c44 100644 --- a/Core/MIPS/x86/CompVFPU.cpp +++ b/Core/MIPS/x86/CompVFPU.cpp @@ -595,9 +595,8 @@ void Jit::Comp_VV2Op(u32 op) { DISABLE; break; case 24: // d[i] = -1.0f / s[i]; break; // vnrcp - MOVSS(XMM0, M((void *)&one)); + MOVSS(XMM0, M((void *)&minus_one)); DIVSS(XMM0, fpr.V(sregs[i])); - XORPS(XMM0, M((void *)&signBitLower)); MOVSS(tempxregs[i], R(XMM0)); break; case 26: // d[i] = -sinf((float)M_PI_2 * s[i]); break; // vnsin From 83b284919213daf7955a48e70df3d5e61b8256dd Mon Sep 17 00:00:00 2001 From: oioitff Date: Tue, 19 Feb 2013 19:17:15 +0800 Subject: [PATCH 068/347] pos[2] is limited between 0 and 65535 fix the black screen issue for Toaru Majutsu no Index, and Toaru Kagaku no Railgun. --- GPU/GLES/VertexDecoder.h | 3 +++ 1 file changed, 3 insertions(+) diff --git a/GPU/GLES/VertexDecoder.h b/GPU/GLES/VertexDecoder.h index 243983c5ac66..4235b158f897 100644 --- a/GPU/GLES/VertexDecoder.h +++ b/GPU/GLES/VertexDecoder.h @@ -192,6 +192,9 @@ class VertexReader switch (decFmt_.posfmt) { case DEC_FLOAT_3: memcpy(pos, data_ + decFmt_.posoff, 12); + // pos[2] is limited between 0 and 65535 + if (pos[2] < 0.0 || pos[2] > 65535.0) + pos[2] = 0.0; break; case DEC_S16_3: { From 73842db15971bad4ccfec0a3ff14a8d73da5616c Mon Sep 17 00:00:00 2001 From: Sacha Date: Wed, 20 Feb 2013 00:08:00 +1000 Subject: [PATCH 069/347] Fix Qt for Windows (should compile now) Stride needs to be allocated dynamically. Maybe g++ ignores this, msvc doesn't. Home dir should use QDir::homePath() to be cross-platform. Windows has its own DrawText(), compile with NODRAWTEXT. Allow compiling on release and debug for windows. Ignore some warnings. --- Qt/PPSSPP.pro | 9 ++++++++- Qt/Settings.pri | 2 +- Qt/debugger_displaylist.cpp | 3 ++- Qt/mainwindow.cpp | 4 ++-- native | 2 +- 5 files changed, 14 insertions(+), 6 deletions(-) diff --git a/Qt/PPSSPP.pro b/Qt/PPSSPP.pro index 77b2c18df835..64c09839d296 100755 --- a/Qt/PPSSPP.pro +++ b/Qt/PPSSPP.pro @@ -10,7 +10,14 @@ include(Settings.pri) # Libs symbian: LIBS += -lCore.lib -lCommon.lib -lNative.lib -lcone -leikcore -lavkon -lezlib blackberry: LIBS += -L. -lCore -lCommon -lNative -lscreen -lsocket -lstdc++ -win32: LIBS += -L$$OUT_PWD/release -lCore -lCommon -lNative -lwinmm -lws2_32 -lkernel32 -luser32 -lgdi32 -lshell32 -lcomctl32 -ldsound -lxinput +win32 { + CONFIG(release, debug|release) { + LIBS += -L$$OUT_PWD/release + } else { + LIBS += -L$$OUT_PWD/debug + } + LIBS += -lCore -lCommon -lNative -lwinmm -lws2_32 -lkernel32 -luser32 -lgdi32 -lshell32 -lcomctl32 -ldsound -lxinput +} linux: LIBS += -L. -lCore -lCommon -lNative linux:!mobile_platform { diff --git a/Qt/Settings.pri b/Qt/Settings.pri index 953e138ec321..9956e529ebac 100644 --- a/Qt/Settings.pri +++ b/Qt/Settings.pri @@ -8,7 +8,7 @@ INCLUDEPATH += ../ext/zlib ../native/ext/glew ../Common win32-msvc* { QMAKE_CXXFLAGS_RELEASE += /O2 /arch:SSE2 /fp:fast - DEFINES += _MBCS GLEW_STATIC NOMINMAX + DEFINES += _MBCS GLEW_STATIC NOMINMAX NODRAWTEXT _CRT_SECURE_NO_WARNINGS PRECOMPILED_HEADER = ../Windows/stdafx.h PRECOMPILED_SOURCE = ../Windows/stdafx.cpp } else { diff --git a/Qt/debugger_displaylist.cpp b/Qt/debugger_displaylist.cpp index 5b688d733720..330dcbb9b8a6 100644 --- a/Qt/debugger_displaylist.cpp +++ b/Qt/debugger_displaylist.cpp @@ -1686,9 +1686,10 @@ void Debugger_DisplayList::UpdateVertexInfo() VertexDecoder vtcDec; vtcDec.SetVertexType(state.vertType); - u8 tmp[20*vtcDec.GetDecVtxFmt().stride]; + u8* tmp = u8(20*vtcDec.GetDecVtxFmt().stride); vtcDec.DecodeVerts(tmp,Memory::GetPointer(vaddr),0,0,0,0,19); VertexReader vtxRead(tmp,vtcDec.GetDecVtxFmt(),state.vertType); + delete tmp; for(int i = 0; i < maxVtxDisplay; i++) { diff --git a/Qt/mainwindow.cpp b/Qt/mainwindow.cpp index c6b45a5dcc4a..80f99d991924 100644 --- a/Qt/mainwindow.cpp +++ b/Qt/mainwindow.cpp @@ -154,10 +154,10 @@ void NativeInit(int argc, const char *argv[], const char *savegame_directory, co if (g_Config.currentDirectory == "") { - g_Config.currentDirectory = getenv("HOME"); + g_Config.currentDirectory = QDir::homePath().toStdString(); } - g_Config.memCardDirectory = std::string(getenv("HOME"))+"/.ppsspp/"; + g_Config.memCardDirectory = QDir::homePath().toStdString()+"/.ppsspp/"; g_Config.flashDirectory = g_Config.memCardDirectory+"/flash/"; LogManager::Init(); diff --git a/native b/native index f5e7bd5a9c3e..14386f87b044 160000 --- a/native +++ b/native @@ -1 +1 @@ -Subproject commit f5e7bd5a9c3e4b39a4eac71b577f06ad54f2bc96 +Subproject commit 14386f87b044ff59bf509a35591debf89d917fb2 From 6be288b67852215e7adccc91c777139af4150a6b Mon Sep 17 00:00:00 2001 From: Sacha Date: Wed, 20 Feb 2013 00:34:03 +1000 Subject: [PATCH 070/347] Add new file 'OpenGLBase' to Qt Windows build. Fixup previous mistake, missing 'new'. Update native. --- Qt/Core.pro | 5 +++++ Qt/debugger_displaylist.cpp | 2 +- native | 2 +- 3 files changed, 7 insertions(+), 2 deletions(-) diff --git a/Qt/Core.pro b/Qt/Core.pro index d9f62601856a..bd22ca070af4 100755 --- a/Qt/Core.pro +++ b/Qt/Core.pro @@ -18,6 +18,11 @@ x86 { HEADERS += ../Core/MIPS/x86/*.h } +win32 { + SOURCES += ../Windows/OpenGLBase.cpp + HEADERS += ../Windows/OpenGLBase.h +} + SOURCES += ../Core/CPU.cpp \ # Core ../Core/Config.cpp \ ../Core/Core.cpp \ diff --git a/Qt/debugger_displaylist.cpp b/Qt/debugger_displaylist.cpp index 330dcbb9b8a6..ed63f5bc484b 100644 --- a/Qt/debugger_displaylist.cpp +++ b/Qt/debugger_displaylist.cpp @@ -1686,7 +1686,7 @@ void Debugger_DisplayList::UpdateVertexInfo() VertexDecoder vtcDec; vtcDec.SetVertexType(state.vertType); - u8* tmp = u8(20*vtcDec.GetDecVtxFmt().stride); + u8* tmp = new u8(20*vtcDec.GetDecVtxFmt().stride); vtcDec.DecodeVerts(tmp,Memory::GetPointer(vaddr),0,0,0,0,19); VertexReader vtxRead(tmp,vtcDec.GetDecVtxFmt(),state.vertType); delete tmp; diff --git a/native b/native index 14386f87b044..f807e225f75b 160000 --- a/native +++ b/native @@ -1 +1 @@ -Subproject commit 14386f87b044ff59bf509a35591debf89d917fb2 +Subproject commit f807e225f75b131e614c92770fb93a5e902be22b From 5ba1775572bfdbefad17fc907aabff01fd953fad Mon Sep 17 00:00:00 2001 From: raven02 Date: Tue, 19 Feb 2013 22:39:38 +0800 Subject: [PATCH 071/347] pos[2] larger than 65535 is clamped to 65535 and not 0 --- GPU/GLES/VertexDecoder.h | 22 ++++++++++++++-------- 1 file changed, 14 insertions(+), 8 deletions(-) diff --git a/GPU/GLES/VertexDecoder.h b/GPU/GLES/VertexDecoder.h index 4235b158f897..be9f584f88db 100644 --- a/GPU/GLES/VertexDecoder.h +++ b/GPU/GLES/VertexDecoder.h @@ -192,9 +192,15 @@ class VertexReader switch (decFmt_.posfmt) { case DEC_FLOAT_3: memcpy(pos, data_ + decFmt_.posoff, 12); - // pos[2] is limited between 0 and 65535 - if (pos[2] < 0.0 || pos[2] > 65535.0) - pos[2] = 0.0; + // pos[2] is an integer value clamped between 0 and 65535 + if (pos[2] < 0.f) { + pos[2] = 0.f; + } else if (pos[2] > 65535.f) { + pos[2] = 65535.f; + } else { + // 2D positions are always integer values: truncate float value + pos[2] = (int) pos[2]; + } break; case DEC_S16_3: { @@ -232,7 +238,7 @@ class VertexReader { const s8 *p = (s8 *)(data_ + decFmt_.nrmoff); for (int i = 0; i < 3; i++) - nrm[i] = p[i] * (1.f / 128.0f); + nrm[i] = p[i] * (1.f / 128.f); } break; default: @@ -262,8 +268,8 @@ class VertexReader case DEC_FLOAT_2: { const float *f = (const float *)(data_ + decFmt_.uvoff); - uv[0] = f[0] * 2.0f; - uv[1] = f[1] * 2.0f; + uv[0] = f[0] * 2.f; + uv[1] = f[1] * 2.f; } break; @@ -324,7 +330,7 @@ class VertexReader case DEC_FLOAT_3: case DEC_FLOAT_4: for (int i = 0; i <= decFmt_.w0fmt - DEC_FLOAT_1; i++) - weights[i] = f[i] * 2.0; + weights[i] = f[i] * 2.f; break; case DEC_U8_1: weights[0] = p[0] * (1.f / 128.f); break; case DEC_U8_2: for (int i = 0; i < 2; i++) weights[i] = p[i] * (1.f / 128.f); break; @@ -351,7 +357,7 @@ class VertexReader case DEC_FLOAT_3: case DEC_FLOAT_4: for (int i = 0; i <= decFmt_.w1fmt - DEC_FLOAT_1; i++) - weights[i+4] = f[i] * 2.0; + weights[i+4] = f[i] * 2.f; break; case DEC_U16_1: weights[4] = s[0] * (1.f / 32768.f); break; case DEC_U16_2: for (int i = 0; i < 2; i++) weights[i+4] = s[i] * (1.f / 32768.f); break; From 9eaf58773b16b14f1d15cc11aa1db2f81eb28c4f Mon Sep 17 00:00:00 2001 From: raven02 Date: Tue, 19 Feb 2013 22:55:46 +0800 Subject: [PATCH 072/347] Add 8 bit for weight type 1 --- GPU/GLES/VertexDecoder.h | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/GPU/GLES/VertexDecoder.h b/GPU/GLES/VertexDecoder.h index be9f584f88db..151abb81485f 100644 --- a/GPU/GLES/VertexDecoder.h +++ b/GPU/GLES/VertexDecoder.h @@ -359,6 +359,10 @@ class VertexReader for (int i = 0; i <= decFmt_.w1fmt - DEC_FLOAT_1; i++) weights[i+4] = f[i] * 2.f; break; + case DEC_U8_1: weights[4] = p[0] * (1.f / 128.f); break; + case DEC_U8_2: for (int i = 0; i < 2; i++) weights[i+4] = p[i] * (1.f / 128.f); break; + case DEC_U8_3: for (int i = 0; i < 3; i++) weights[i+4] = p[i] * (1.f / 128.f); break; + case DEC_U8_4: for (int i = 0; i < 4; i++) weights[i+4] = p[i] * (1.f / 128.f); break; case DEC_U16_1: weights[4] = s[0] * (1.f / 32768.f); break; case DEC_U16_2: for (int i = 0; i < 2; i++) weights[i+4] = s[i] * (1.f / 32768.f); break; case DEC_U16_3: for (int i = 0; i < 3; i++) weights[i+4] = s[i] * (1.f / 32768.f); break; From b9a137d62184d5bf09d63a8861199d1446588963 Mon Sep 17 00:00:00 2001 From: Sacha Date: Wed, 20 Feb 2013 01:36:06 +1000 Subject: [PATCH 073/347] Note about Qt UI only working on X11, needing to be thread-aware. Allocate tmp as an array instead. --- Qt/debugger_displaylist.cpp | 4 ++-- Qt/mainwindow.cpp | 2 ++ 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/Qt/debugger_displaylist.cpp b/Qt/debugger_displaylist.cpp index ed63f5bc484b..9c0f00182e8d 100644 --- a/Qt/debugger_displaylist.cpp +++ b/Qt/debugger_displaylist.cpp @@ -1686,10 +1686,10 @@ void Debugger_DisplayList::UpdateVertexInfo() VertexDecoder vtcDec; vtcDec.SetVertexType(state.vertType); - u8* tmp = new u8(20*vtcDec.GetDecVtxFmt().stride); + u8* tmp = new u8[20*vtcDec.GetDecVtxFmt().stride]; vtcDec.DecodeVerts(tmp,Memory::GetPointer(vaddr),0,0,0,0,19); VertexReader vtxRead(tmp,vtcDec.GetDecVtxFmt(),state.vertType); - delete tmp; + delete [] tmp; for(int i = 0; i < maxVtxDisplay; i++) { diff --git a/Qt/mainwindow.cpp b/Qt/mainwindow.cpp index 80f99d991924..9c74aad70663 100644 --- a/Qt/mainwindow.cpp +++ b/Qt/mainwindow.cpp @@ -23,6 +23,8 @@ const char *stateToLoad = NULL; +// TODO: Make this class thread-aware. Can't send events to a different thread. Currently only works on X11. +// Needs to use QueuedConnection for signals/slots. MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent), ui(new Ui::MainWindow), From 01f3c4ecde177a1656744ea131f8924baa916dea Mon Sep 17 00:00:00 2001 From: "Unknown W. Brackets" Date: Tue, 19 Feb 2013 07:46:29 -0800 Subject: [PATCH 074/347] Log an error if we hit a 1x1 matrix. --- Core/MIPS/MIPSVFPUUtils.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/Core/MIPS/MIPSVFPUUtils.cpp b/Core/MIPS/MIPSVFPUUtils.cpp index 0f6ad315eb50..626eab23de69 100644 --- a/Core/MIPS/MIPSVFPUUtils.cpp +++ b/Core/MIPS/MIPSVFPUUtils.cpp @@ -247,6 +247,7 @@ MatrixSize GetMtxSize(u32 op) a += (b<<1); switch (a) { + case 0: ERROR_LOG(CPU, "Unexpected matrix size 1x1."); return M_2x2; case 1: return M_2x2; case 2: return M_3x3; case 3: return M_4x4; From a0ae126a01032576ad53ea4eea61b02d5c7ecdc1 Mon Sep 17 00:00:00 2001 From: "Unknown W. Brackets" Date: Tue, 19 Feb 2013 07:46:57 -0800 Subject: [PATCH 075/347] Exit Core_RunLoop() again in non-Windows. --- Core/Core.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Core/Core.cpp b/Core/Core.cpp index c2de39e7874b..252800ebac57 100644 --- a/Core/Core.cpp +++ b/Core/Core.cpp @@ -73,8 +73,8 @@ void Core_RunLoop() { #ifdef _WIN32 GL_SwapBuffers(); -#endif coreState = CORE_RUNNING; +#endif } } } From c7a545ecda3d369c73b1e5c6e9f3a13be11ca279 Mon Sep 17 00:00:00 2001 From: "Unknown W. Brackets" Date: Tue, 19 Feb 2013 08:00:05 -0800 Subject: [PATCH 076/347] Buildfix for headless on non-Windows. --- headless/Headless.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/headless/Headless.cpp b/headless/Headless.cpp index d9289c8cba70..0eb3f0d51def 100644 --- a/headless/Headless.cpp +++ b/headless/Headless.cpp @@ -10,13 +10,13 @@ #include "Core/System.h" #include "Core/MIPS/MIPS.h" #include "Core/Host.h" -#include "Windows/OpenGLBase.h" #include "Log.h" #include "LogManager.h" #include "Compare.h" #include "StubHost.h" #ifdef _WIN32 +#include "Windows/OpenGLBase.h" #include "WindowsHeadlessHost.h" #endif From de7e18982c773b619611df6559bc21330ac91bc1 Mon Sep 17 00:00:00 2001 From: "Unknown W. Brackets" Date: Tue, 19 Feb 2013 08:01:10 -0800 Subject: [PATCH 077/347] Buildfix for ARM, darn. --- Core/MIPS/ARM/ArmCompVFPU.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Core/MIPS/ARM/ArmCompVFPU.cpp b/Core/MIPS/ARM/ArmCompVFPU.cpp index ca909fe19338..e599aacf23f8 100644 --- a/Core/MIPS/ARM/ArmCompVFPU.cpp +++ b/Core/MIPS/ARM/ArmCompVFPU.cpp @@ -63,7 +63,7 @@ namespace MIPSComp DISABLE; } - void Comp_Vmmov(u32 op) { + void Jit::Comp_Vmmov(u32 op) { DISABLE; } From 2ed1b9ee0b727f53de26d6072e310dbd447e703d Mon Sep 17 00:00:00 2001 From: raven02 Date: Wed, 20 Feb 2013 00:20:00 +0800 Subject: [PATCH 078/347] Minor cleanup and use byte(b)/short(s)/float(p) --- GPU/GLES/VertexDecoder.h | 83 +++++++++++++++++++++++----------------- 1 file changed, 48 insertions(+), 35 deletions(-) diff --git a/GPU/GLES/VertexDecoder.h b/GPU/GLES/VertexDecoder.h index 151abb81485f..cf59c55b63b8 100644 --- a/GPU/GLES/VertexDecoder.h +++ b/GPU/GLES/VertexDecoder.h @@ -191,29 +191,35 @@ class VertexReader void ReadPos(float pos[3]) { switch (decFmt_.posfmt) { case DEC_FLOAT_3: - memcpy(pos, data_ + decFmt_.posoff, 12); - // pos[2] is an integer value clamped between 0 and 65535 - if (pos[2] < 0.f) { - pos[2] = 0.f; - } else if (pos[2] > 65535.f) { - pos[2] = 65535.f; - } else { - // 2D positions are always integer values: truncate float value - pos[2] = (int) pos[2]; + { + //memcpy(pos, data_ + decFmt_.posoff, 12); + const float *f = (const float *)(data_ + decFmt_.posoff); + for (int i = 0; i < 3; i++) + pos[i] = f[i] ; + + // pos[2] is an integer value clamped between 0 and 65535 + if (pos[2] < 0.f) { + pos[2] = 0.f; + } else if (pos[2] > 65535.f) { + pos[2] = 65535.f; + } else { + // 2D positions are always integer values: truncate float value + pos[2] = (int) pos[2]; + } } break; case DEC_S16_3: { - const s16 *p = (s16 *)(data_ + decFmt_.posoff); + const s16 *s = (const s16 *)(data_ + decFmt_.posoff); for (int i = 0; i < 3; i++) - pos[i] = p[i] * (1.f / 32768.f); + pos[i] = s[i] * (1.f / 32767.f); } break; case DEC_S8_3: { - const s8 *p = (s8 *)(data_ + decFmt_.posoff); + const s8 *b = (const s8 *)(data_ + decFmt_.posoff); for (int i = 0; i < 3; i++) - pos[i] = p[i] * (1.f / 128.f); + pos[i] = b[i] * (1.f / 127.f); } break; default: @@ -225,20 +231,25 @@ class VertexReader void ReadNrm(float nrm[3]) { switch (decFmt_.nrmfmt) { case DEC_FLOAT_3: - memcpy(nrm, data_ + decFmt_.nrmoff, 12); + //memcpy(nrm, data_ + decFmt_.nrmoff, 12); + { + const float *f = (const float *)(data_ + decFmt_.nrmoff); + for (int i = 0; i < 3; i++) + nrm[i] = f[i] ; + } break; case DEC_S16_3: { - const s16 *p = (s16 *)(data_ + decFmt_.nrmoff); + const s16 *s = (const s16 *)(data_ + decFmt_.nrmoff); for (int i = 0; i < 3; i++) - nrm[i] = p[i] * (1.f / 32768.f); + nrm[i] = s[i] * (1.f / 32767.f); } break; case DEC_S8_3: { - const s8 *p = (s8 *)(data_ + decFmt_.nrmoff); + const s8 *b = (const s8 *)(data_ + decFmt_.nrmoff); for (int i = 0; i < 3; i++) - nrm[i] = p[i] * (1.f / 128.f); + nrm[i] = b[i] * (1.f / 127.f); } break; default: @@ -290,13 +301,14 @@ class VertexReader switch (decFmt_.c0fmt) { case DEC_U8_4: { - const u8 *p = (const u8 *)(data_ + decFmt_.c0off); + const u8 *b = (const u8 *)(data_ + decFmt_.c0off); for (int i = 0; i < 4; i++) - color[i] = p[i] * (1.f / 255.f); + color[i] = b[i] * (1.f / 255.f); } break; case DEC_FLOAT_4: - memcpy(color, data_ + decFmt_.c0off, 16); break; + memcpy(color, data_ + decFmt_.c0off, 16); + break; default: ERROR_LOG(G3D, "Reader: Unsupported C0 Format"); break; @@ -307,13 +319,14 @@ class VertexReader switch (decFmt_.c1fmt) { case DEC_U8_4: { - const u8 *p = (const u8 *)(data_ + decFmt_.c1off); + const u8 *b = (const u8 *)(data_ + decFmt_.c1off); for (int i = 0; i < 3; i++) - color[i] = p[i] * (1.f / 255.f); + color[i] = b[i] * (1.f / 255.f); } break; case DEC_FLOAT_4: - memcpy(color, data_ + decFmt_.c1off, 12); break; + memcpy(color, data_ + decFmt_.c1off, 12); + break; default: ERROR_LOG(G3D, "Reader: Unsupported C1 Format"); break; @@ -322,7 +335,7 @@ class VertexReader void ReadWeights(float weights[8]) { const float *f = (const float *)(data_ + decFmt_.w0off); - const u8 *p = (const u8 *)(data_ + decFmt_.w0off); + const u8 *b = (const u8 *)(data_ + decFmt_.w0off); const u16 *s = (const u16 *)(data_ + decFmt_.w0off); switch (decFmt_.w0fmt) { case DEC_FLOAT_1: @@ -332,10 +345,10 @@ class VertexReader for (int i = 0; i <= decFmt_.w0fmt - DEC_FLOAT_1; i++) weights[i] = f[i] * 2.f; break; - case DEC_U8_1: weights[0] = p[0] * (1.f / 128.f); break; - case DEC_U8_2: for (int i = 0; i < 2; i++) weights[i] = p[i] * (1.f / 128.f); break; - case DEC_U8_3: for (int i = 0; i < 3; i++) weights[i] = p[i] * (1.f / 128.f); break; - case DEC_U8_4: for (int i = 0; i < 4; i++) weights[i] = p[i] * (1.f / 128.f); break; + case DEC_U8_1: weights[0] = b[0] * (1.f / 128.f); break; + case DEC_U8_2: for (int i = 0; i < 2; i++) weights[i] = b[i] * (1.f / 128.f); break; + case DEC_U8_3: for (int i = 0; i < 3; i++) weights[i] = b[i] * (1.f / 128.f); break; + case DEC_U8_4: for (int i = 0; i < 4; i++) weights[i] = b[i] * (1.f / 128.f); break; case DEC_U16_1: weights[0] = s[0] * (1.f / 32768.f); break; case DEC_U16_2: for (int i = 0; i < 2; i++) weights[i] = s[i] * (1.f / 32768.f); break; case DEC_U16_3: for (int i = 0; i < 3; i++) weights[i] = s[i] * (1.f / 32768.f); break; @@ -345,8 +358,8 @@ class VertexReader break; } - f = (const float*)(data_ + decFmt_.w1off); - p = (const u8 *)(data_ + decFmt_.w1off); + f = (const float *)(data_ + decFmt_.w1off); + b = (const u8 *)(data_ + decFmt_.w1off); s = (const u16 *)(data_ + decFmt_.w1off); switch (decFmt_.w1fmt) { case 0: @@ -359,10 +372,10 @@ class VertexReader for (int i = 0; i <= decFmt_.w1fmt - DEC_FLOAT_1; i++) weights[i+4] = f[i] * 2.f; break; - case DEC_U8_1: weights[4] = p[0] * (1.f / 128.f); break; - case DEC_U8_2: for (int i = 0; i < 2; i++) weights[i+4] = p[i] * (1.f / 128.f); break; - case DEC_U8_3: for (int i = 0; i < 3; i++) weights[i+4] = p[i] * (1.f / 128.f); break; - case DEC_U8_4: for (int i = 0; i < 4; i++) weights[i+4] = p[i] * (1.f / 128.f); break; + case DEC_U8_1: weights[4] = b[0] * (1.f / 128.f); break; + case DEC_U8_2: for (int i = 0; i < 2; i++) weights[i+4] = b[i] * (1.f / 128.f); break; + case DEC_U8_3: for (int i = 0; i < 3; i++) weights[i+4] = b[i] * (1.f / 128.f); break; + case DEC_U8_4: for (int i = 0; i < 4; i++) weights[i+4] = b[i] * (1.f / 128.f); break; case DEC_U16_1: weights[4] = s[0] * (1.f / 32768.f); break; case DEC_U16_2: for (int i = 0; i < 2; i++) weights[i+4] = s[i] * (1.f / 32768.f); break; case DEC_U16_3: for (int i = 0; i < 3; i++) weights[i+4] = s[i] * (1.f / 32768.f); break; From 9e38174b14b1747e6df069a989b5d1fb7d40aca0 Mon Sep 17 00:00:00 2001 From: raven02 Date: Wed, 20 Feb 2013 01:11:26 +0800 Subject: [PATCH 079/347] Clamp pos[2] when transform 2D only --- GPU/GLES/VertexDecoder.h | 16 +++++++++------- 1 file changed, 9 insertions(+), 7 deletions(-) diff --git a/GPU/GLES/VertexDecoder.h b/GPU/GLES/VertexDecoder.h index cf59c55b63b8..4917965dd1ce 100644 --- a/GPU/GLES/VertexDecoder.h +++ b/GPU/GLES/VertexDecoder.h @@ -198,13 +198,15 @@ class VertexReader pos[i] = f[i] ; // pos[2] is an integer value clamped between 0 and 65535 - if (pos[2] < 0.f) { - pos[2] = 0.f; - } else if (pos[2] > 65535.f) { - pos[2] = 65535.f; - } else { - // 2D positions are always integer values: truncate float value - pos[2] = (int) pos[2]; + if ((vtype_ >> 23) & 0x1) { + if (pos[2] < 0.f) { + pos[2] = 0.f; + } else if (pos[2] > 65535.f) { + pos[2] = 65535.f; + } else { + // 2D positions are always integer values: truncate float value + pos[2] = (int) pos[2]; + } } } break; From 4f18639ca64c44c3c4502a9ac0617a8510480986 Mon Sep 17 00:00:00 2001 From: Apology11 Date: Tue, 19 Feb 2013 18:23:18 +0100 Subject: [PATCH 080/347] Adding missing languages to resources --- Qt/resources.qrc | 2 ++ 1 file changed, 2 insertions(+) diff --git a/Qt/resources.qrc b/Qt/resources.qrc index a6d411f82e87..1eee7d4c455c 100644 --- a/Qt/resources.qrc +++ b/Qt/resources.qrc @@ -22,5 +22,7 @@ languages/ppsspp_en.qm languages/ppsspp_fr.qm languages/ppsspp_pl.qm + languages/ppsspp_de.qm + languages/ppsspp_tc.qm From 2745bb4f14e172363cbbd4cc268bf26c135fa499 Mon Sep 17 00:00:00 2001 From: raven02 Date: Wed, 20 Feb 2013 01:37:19 +0800 Subject: [PATCH 081/347] pos[0]/[1] are signed while pos[2] is unsigned in 2D transform --- GPU/GLES/VertexDecoder.h | 24 ++++++++++++++++++++---- 1 file changed, 20 insertions(+), 4 deletions(-) diff --git a/GPU/GLES/VertexDecoder.h b/GPU/GLES/VertexDecoder.h index 4917965dd1ce..5357ee66215a 100644 --- a/GPU/GLES/VertexDecoder.h +++ b/GPU/GLES/VertexDecoder.h @@ -212,16 +212,32 @@ class VertexReader break; case DEC_S16_3: { + // X and Y are signed 16 bit, Z is unsigned 16 bit const s16 *s = (const s16 *)(data_ + decFmt_.posoff); - for (int i = 0; i < 3; i++) - pos[i] = s[i] * (1.f / 32767.f); + const u16 *u = (const u16 *)(data_ + decFmt_.posoff); + if ((vtype_ >> 23) & 0x1) { + for (int i = 0; i < 2; i++) + pos[i] = s[i] ; + pos[2] = u[2] ; + } else { + for (int i = 0; i < 3; i++) + pos[i] = s[i] * (1.f / 32767.f); + } } break; case DEC_S8_3: { + // X and Y are signed 8 bit, Z is unsigned 8 bit const s8 *b = (const s8 *)(data_ + decFmt_.posoff); - for (int i = 0; i < 3; i++) - pos[i] = b[i] * (1.f / 127.f); + const u8 *u = (const u8 *)(data_ + decFmt_.posoff); + if ((vtype_ >> 23) & 0x1) { + for (int i = 0; i < 2; i++) + pos[i] = b[i] ; + pos[2] = u[2] ; + } else { + for (int i = 0; i < 3; i++) + pos[i] = b[i] * (1.f / 127.f); + } } break; default: From c0dc85b99d786e54f18507ccdec55f47fa9aa145 Mon Sep 17 00:00:00 2001 From: raven02 Date: Wed, 20 Feb 2013 02:07:42 +0800 Subject: [PATCH 082/347] Toggle 32 bit truecolor in option , default true Update Core/Config.cpp --- Core/Config.cpp | 2 ++ Core/Config.h | 1 + GPU/GLES/Framebuffer.cpp | 4 ++++ 3 files changed, 7 insertions(+) diff --git a/Core/Config.cpp b/Core/Config.cpp index ae887f2cba66..49890bcd846c 100644 --- a/Core/Config.cpp +++ b/Core/Config.cpp @@ -76,6 +76,7 @@ void CConfig::Load(const char *iniFileName) graphics->Get("VertexCache", &bVertexCache, true); graphics->Get("FullScreen", &bFullScreen, false); graphics->Get("StretchToDisplay", &bStretchToDisplay, false); + graphics->Get("TrueColor", &bTrueColor, true); IniFile::Section *sound = iniFile.GetOrCreateSection("Sound"); sound->Get("Enable", &bEnableSound, true); @@ -134,6 +135,7 @@ void CConfig::Save() graphics->Set("VertexCache", bVertexCache); graphics->Set("FullScreen", bFullScreen); graphics->Set("StretchToDisplay", bStretchToDisplay); + graphics->Set("TrueColor", bTrueColor); IniFile::Section *sound = iniFile.GetOrCreateSection("Sound"); sound->Set("Enable", bEnableSound); diff --git a/Core/Config.h b/Core/Config.h index de5437206451..6ba92051defc 100644 --- a/Core/Config.h +++ b/Core/Config.h @@ -65,6 +65,7 @@ struct CConfig bool bVertexCache; bool bFullScreen; int iAnisotropyLevel; + bool bTrueColor; // Sound bool bEnableSound; diff --git a/GPU/GLES/Framebuffer.cpp b/GPU/GLES/Framebuffer.cpp index bc513f90e07d..aff1ac686806 100644 --- a/GPU/GLES/Framebuffer.cpp +++ b/GPU/GLES/Framebuffer.cpp @@ -333,6 +333,10 @@ void FramebufferManager::SetRenderFrameBuffer() { case GE_FORMAT_565: vfb->colorDepth = FBO_565; case GE_FORMAT_8888: vfb->colorDepth = FBO_8888; } + + if (g_Config.bTrueColor) + vfb->colorDepth = FBO_8888; + //#ifdef ANDROID // vfb->colorDepth = FBO_8888; //#endif From 67272ec271b270776b8bb00ba2ae1646dd989715 Mon Sep 17 00:00:00 2001 From: Henrik Rydgard Date: Tue, 19 Feb 2013 21:38:19 +0100 Subject: [PATCH 083/347] Scale Z to 0...1 in through mode. (alternatively, could try setting through mode depth range to 65536..0) --- GPU/GLES/VertexDecoder.h | 25 ++++++++++++------------- 1 file changed, 12 insertions(+), 13 deletions(-) diff --git a/GPU/GLES/VertexDecoder.h b/GPU/GLES/VertexDecoder.h index 5357ee66215a..2fbaddce51ef 100644 --- a/GPU/GLES/VertexDecoder.h +++ b/GPU/GLES/VertexDecoder.h @@ -192,21 +192,20 @@ class VertexReader switch (decFmt_.posfmt) { case DEC_FLOAT_3: { - //memcpy(pos, data_ + decFmt_.posoff, 12); const float *f = (const float *)(data_ + decFmt_.posoff); - for (int i = 0; i < 3; i++) - pos[i] = f[i] ; - + memcpy(pos, f, 12); + // pos[2] is an integer value clamped between 0 and 65535 - if ((vtype_ >> 23) & 0x1) { - if (pos[2] < 0.f) { - pos[2] = 0.f; + if (isThrough()) { + if (pos[2] < 0.f && pos[2] != 0.0f) { // make sure we get negative zero + pos[2] = 0.f; } else if (pos[2] > 65535.f) { pos[2] = 65535.f; } else { // 2D positions are always integer values: truncate float value pos[2] = (int) pos[2]; } + pos[2] /= 65535.0f; } } break; @@ -215,10 +214,10 @@ class VertexReader // X and Y are signed 16 bit, Z is unsigned 16 bit const s16 *s = (const s16 *)(data_ + decFmt_.posoff); const u16 *u = (const u16 *)(data_ + decFmt_.posoff); - if ((vtype_ >> 23) & 0x1) { + if (isThrough()) { for (int i = 0; i < 2; i++) - pos[i] = s[i] ; - pos[2] = u[2] ; + pos[i] = s[i]; + pos[2] = u[2] / 65535.0f; } else { for (int i = 0; i < 3; i++) pos[i] = s[i] * (1.f / 32767.f); @@ -230,10 +229,10 @@ class VertexReader // X and Y are signed 8 bit, Z is unsigned 8 bit const s8 *b = (const s8 *)(data_ + decFmt_.posoff); const u8 *u = (const u8 *)(data_ + decFmt_.posoff); - if ((vtype_ >> 23) & 0x1) { + if (isThrough()) { for (int i = 0; i < 2; i++) - pos[i] = b[i] ; - pos[2] = u[2] ; + pos[i] = b[i]; + pos[2] = u[2] / 255.0f; } else { for (int i = 0; i < 3; i++) pos[i] = b[i] * (1.f / 127.f); From 5a09885a5920789bf535d5a0c8b7b5740bd887f1 Mon Sep 17 00:00:00 2001 From: Henrik Rydgard Date: Wed, 20 Feb 2013 00:03:47 +0100 Subject: [PATCH 084/347] Port over much of unknown's vfpu jit work to arm. Untested. --- Common/ArmEmitter.cpp | 10 ++ Common/ArmEmitter.h | 2 + Core/MIPS/ARM/ArmCompVFPU.cpp | 247 +++++++++++++++++++++++++++++- Core/MIPS/ARM/ArmJit.cpp | 17 ++- Core/MIPS/ARM/ArmJit.h | 51 ++++++- Core/MIPS/ARM/ArmRegCache.h | 2 +- Core/MIPS/ARM/ArmRegCacheFPU.cpp | 32 +++- Core/MIPS/ARM/ArmRegCacheFPU.h | 21 ++- Core/MIPS/x86/CompVFPU.cpp | 254 ++++++++++++++++++++++++++----- native | 2 +- 10 files changed, 576 insertions(+), 62 deletions(-) diff --git a/Common/ArmEmitter.cpp b/Common/ArmEmitter.cpp index ebc801c0338c..3b0c02cf26a3 100644 --- a/Common/ArmEmitter.cpp +++ b/Common/ArmEmitter.cpp @@ -903,6 +903,16 @@ void ARMXEmitter::VMUL(ARMReg Vd, ARMReg Vn, ARMReg Vm) } } +void ARMXEmitter::VABS(ARMReg Vd, ARMReg Vn) +{ + _assert_msg_(DYNA_REC, 0, "VABS not implemented"); +} + +void ARMXEmitter::VNEG(ARMReg Vd, ARMReg Vn) +{ + _assert_msg_(DYNA_REC, 0, "VNEG not implemented"); +} + void ARMXEmitter::VMOV(ARMReg Dest, ARMReg Src, bool high) { _assert_msg_(DYNA_REC, Src < S0, "This VMOV doesn't support SRC other than ARM Reg"); diff --git a/Common/ArmEmitter.h b/Common/ArmEmitter.h index b50179bf57ae..a9319c8dd6bf 100644 --- a/Common/ArmEmitter.h +++ b/Common/ArmEmitter.h @@ -510,6 +510,8 @@ class ARMXEmitter // NEON and VFP void VADD(ARMReg Vd, ARMReg Vn, ARMReg Vm); void VSUB(ARMReg Vd, ARMReg Vn, ARMReg Vm); + void VABS(ARMReg Vd, ARMReg Vn); + void VNEG(ARMReg Vd, ARMReg Vn); void VMUL(ARMReg Vd, ARMReg Vn, ARMReg Vm); void VMOV(ARMReg Dest, ARMReg Src, bool high); void VMOV(ARMReg Dest, ARMReg Src); diff --git a/Core/MIPS/ARM/ArmCompVFPU.cpp b/Core/MIPS/ARM/ArmCompVFPU.cpp index f0085979d49c..73e12d32311d 100644 --- a/Core/MIPS/ARM/ArmCompVFPU.cpp +++ b/Core/MIPS/ARM/ArmCompVFPU.cpp @@ -16,10 +16,35 @@ // #define CONDITIONAL_DISABLE Comp_Generic(op); return; #define CONDITIONAL_DISABLE ; -#define DISABLE Comp_Generic(op); return; +#define DISABLE {fpr.ReleaseSpillLocks(); Comp_Generic(op); return;} namespace MIPSComp { + + // Vector regs can overlap in all sorts of swizzled ways. + // This does allow a single overlap in sregs[i]. + bool IsOverlapSafeAllowS(int dreg, int di, int sn, u8 sregs[], int tn = 0, u8 tregs[] = NULL) + { + for (int i = 0; i < sn; ++i) + { + if (sregs[i] == dreg && i != di) + return false; + } + for (int i = 0; i < tn; ++i) + { + if (tregs[i] == dreg) + return false; + } + + // Hurray, no overlap, we can write directly. + return true; + } + + bool IsOverlapSafe(int dreg, int di, int sn, u8 sregs[], int tn = 0, u8 tregs[] = NULL) + { + return IsOverlapSafeAllowS(dreg, di, sn, sregs, tn, tregs) && sregs[di] != dreg; + } + void Jit::Comp_VPFX(u32 op) { CONDITIONAL_DISABLE; @@ -42,6 +67,103 @@ namespace MIPSComp } } + void Jit::ApplyPrefixST(u8 *vregs, u32 prefix, VectorSize sz) { + if (prefix == 0xE4) return; + + int n = GetNumVectorElements(sz); + u8 origV[4]; + static const float constantArray[8] = {0.f, 1.f, 2.f, 0.5f, 3.f, 1.f/3.f, 0.25f, 1.f/6.f}; + + for (int i = 0; i < n; i++) + origV[i] = vregs[i]; + + for (int i = 0; i < n; i++) + { + int regnum = (prefix >> (i*2)) & 3; + int abs = (prefix >> (8+i)) & 1; + int negate = (prefix >> (16+i)) & 1; + int constants = (prefix >> (12+i)) & 1; + + // Unchanged, hurray. + if (!constants && regnum == i && !abs && !negate) + continue; + + // This puts the value into a temp reg, so we won't write the modified value back. + vregs[i] = fpr.GetTempV(); + fpr.MapRegV(vregs[i], MAP_NOINIT | MAP_DIRTY); + + if (!constants) { + // Prefix may say "z, z, z, z" but if this is a pair, we force to x. + // TODO: But some ops seem to use const 0 instead? + if (regnum >= n) { + ERROR_LOG(CPU, "Invalid VFPU swizzle: %08x / %d", prefix, sz); + regnum = 0; + } + + if (abs) { + VABS(fpr.V(vregs[i]), fpr.V(origV[regnum])); + } else { + VMOV(fpr.V(vregs[i]), fpr.V(origV[regnum])); + } + } else { + MOVI2R(R0, (u32)(constantArray[regnum + (abs<<2)])); + VMOV(fpr.V(vregs[i]), R0); + } + + // TODO: This can be integrated into the VABS / VMOV above, and also the constants. + if (negate) + VNEG(fpr.V(vregs[i]), fpr.V(vregs[i])); + + // TODO: This probably means it will swap out soon, inefficiently... + fpr.ReleaseSpillLockV(vregs[i]); + } + } + + void Jit::GetVectorRegsPrefixD(u8 *regs, VectorSize sz, int vectorReg) { + _assert_(js.prefixDFlag & JitState::PREFIX_KNOWN); + + GetVectorRegs(regs, sz, vectorReg); + if (js.prefixD == 0) + return; + + int n = GetNumVectorElements(sz); + for (int i = 0; i < n; i++) + { + // Hopefully this is rare, we'll just write it into a reg we drop. + if (js.VfpuWriteMask(i)) + regs[i] = fpr.GetTempV(); + } + } + + void Jit::ApplyPrefixD(const u8 *vregs, VectorSize sz) { + _assert_(js.prefixDFlag & JitState::PREFIX_KNOWN); + if (!js.prefixD) return; + + int n = GetNumVectorElements(sz); + for (int i = 0; i < n; i++) + { + if (js.VfpuWriteMask(i)) + continue; + + int sat = (js.prefixD >> (i * 2)) & 3; + if (sat == 1) + { + fpr.MapRegV(vregs[i], MAP_DIRTY); + // ARGH this is a pain - no MIN/MAX in non-NEON VFP! + // TODO + + //MAXSS(fpr.VX(vregs[i]), M((void *)&zero)); + //MINSS(fpr.VX(vregs[i]), M((void *)&one)); + } + else if (sat == 3) + { + fpr.MapRegV(vregs[i], MAP_DIRTY); + //MAXSS(fpr.VX(vregs[i]), M((void *)&minus_one)); + //MINSS(fpr.VX(vregs[i]), M((void *)&one)); + } + } + } + void Jit::Comp_SV(u32 op) { CONDITIONAL_DISABLE; @@ -125,6 +247,11 @@ namespace MIPSComp } } + void Jit::Comp_VVectorInit(u32 op) + { + DISABLE; + } + void Jit::Comp_VDot(u32 op) { // DISABLE; @@ -229,9 +356,6 @@ namespace MIPSComp int n = GetNumVectorElements(sz); fpr.MapRegsV(sregs, sz, 0); fpr.MapRegsV(tregs, sz, 0); - fpr.MapReg(TEMP1); - fpr.MapReg(TEMP2); - fpr.MapReg(TEMP3); for (int i = 0; i < n; ++i) { fpr.MapReg(TEMP0 + i); @@ -249,6 +373,117 @@ namespace MIPSComp js.EatPrefix(); } + void Jit::Comp_VV2Op(u32 op) { + CONDITIONAL_DISABLE; + + DISABLE; + + if (js.HasUnknownPrefix()) + DISABLE; + + VectorSize sz = GetVecSize(op); + int n = GetNumVectorElements(sz); + + u8 sregs[4], dregs[4]; + GetVectorRegsPrefixS(sregs, sz, _VS); + GetVectorRegsPrefixD(dregs, sz, _VD); + + ARMReg tempxregs[4]; + for (int i = 0; i < n; ++i) + { + if (!IsOverlapSafeAllowS(dregs[i], i, n, sregs)) + { + int reg = fpr.GetTempV(); + fpr.MapRegV(reg, MAP_NOINIT | MAP_DIRTY); + fpr.SpillLockV(reg); + tempxregs[i] = fpr.V(reg); + } + else + { + fpr.MapRegV(dregs[i], (dregs[i] == sregs[i] ? 0 : MAP_NOINIT) | MAP_DIRTY); + fpr.SpillLockV(dregs[i]); + tempxregs[i] = fpr.V(dregs[i]); + } + } + + // Warning: sregs[i] and tempxregs[i] may be the same reg. + // Helps for vmov, hurts for vrcp, etc. + for (int i = 0; i < n; ++i) + { + switch ((op >> 16) & 0x1f) + { + case 0: // d[i] = s[i]; break; //vmov + // Probably for swizzle. + VMOV(tempxregs[i], fpr.V(sregs[i])); + break; + case 1: // d[i] = fabsf(s[i]); break; //vabs + //if (!fpr.V(sregs[i]).IsSimpleReg(tempxregs[i])) + VABS(tempxregs[i], fpr.V(sregs[i])); + break; + case 2: // d[i] = -s[i]; break; //vneg + VNEG(tempxregs[i], fpr.V(sregs[i])); + break; + case 4: // if (s[i] < 0) d[i] = 0; else {if(s[i] > 1.0f) d[i] = 1.0f; else d[i] = s[i];} break; // vsat0 + DISABLE; + break; + case 5: // if (s[i] < -1.0f) d[i] = -1.0f; else {if(s[i] > 1.0f) d[i] = 1.0f; else d[i] = s[i];} break; // vsat1 + DISABLE; + break; + case 16: // d[i] = 1.0f / s[i]; break; //vrcp + MOVI2R(R0, 0x3F800000); // 1.0f + VMOV(S0, R0); + VDIV(tempxregs[i], S0, fpr.V(sregs[i])); + break; + case 17: // d[i] = 1.0f / sqrtf(s[i]); break; //vrsq + MOVI2R(R0, 0x3F800000); // 1.0f + VMOV(S0, R0); + VSQRT(S1, fpr.V(sregs[i])); + VDIV(tempxregs[i], S0, S1); + break; + case 18: // d[i] = sinf((float)M_PI_2 * s[i]); break; //vsin + DISABLE; + break; + case 19: // d[i] = cosf((float)M_PI_2 * s[i]); break; //vcos + DISABLE; + break; + case 20: // d[i] = powf(2.0f, s[i]); break; //vexp2 + DISABLE; + break; + case 21: // d[i] = logf(s[i])/log(2.0f); break; //vlog2 + DISABLE; + break; + case 22: // d[i] = sqrtf(s[i]); break; //vsqrt + VSQRT(tempxregs[i], fpr.V(sregs[i])); + VABS(tempxregs[i], tempxregs[i]); + break; + case 23: // d[i] = asinf(s[i] * (float)M_2_PI); break; //vasin + DISABLE; + break; + case 24: // d[i] = -1.0f / s[i]; break; // vnrcp + MOVI2R(R0, 0x80000000 | 0x3F800000); // -1.0f + VMOV(S0, R0); + VDIV(tempxregs[i], S0, fpr.V(sregs[i])); + break; + case 26: // d[i] = -sinf((float)M_PI_2 * s[i]); break; // vnsin + DISABLE; + break; + case 28: // d[i] = 1.0f / expf(s[i] * (float)M_LOG2E); break; // vrexp2 + DISABLE; + break; + } + } + + fpr.MapRegsV(dregs, sz, MAP_NOINIT | MAP_DIRTY); + for (int i = 0; i < n; ++i) + { + VMOV(fpr.V(dregs[i]), tempxregs[i]); + } + + ApplyPrefixD(dregs, sz); + + fpr.ReleaseSpillLocks(); + } + void Jit::Comp_Mftv(u32 op) { // DISABLE; @@ -328,4 +563,8 @@ namespace MIPSComp } } + void Jit::Comp_Vmmov(u32 op) { + DISABLE; + } + } diff --git a/Core/MIPS/ARM/ArmJit.cpp b/Core/MIPS/ARM/ArmJit.cpp index 4f2cc26c9076..7901f91aba7c 100644 --- a/Core/MIPS/ARM/ArmJit.cpp +++ b/Core/MIPS/ARM/ArmJit.cpp @@ -62,11 +62,15 @@ Jit::Jit(MIPSState *mips) : blocks(mips), gpr(mips), fpr(mips), mips_(mips) fpr.SetEmitter(this); AllocCodeSpace(1024 * 1024 * 16); // 32MB is the absolute max because that's what an ARM branch instruction can reach, backwards and forwards. GenerateFixedCode(); + + js.startDefaultPrefix = true; } void Jit::DoState(PointerWrap &p) { + p.Do(js.startDefaultPrefix); p.DoMarker("Jit"); + FlushPrefixV(); } void Jit::FlushAll() @@ -148,6 +152,17 @@ void Jit::Compile(u32 em_address) int block_num = blocks.AllocateBlock(em_address); ArmJitBlock *b = blocks.GetBlock(block_num); blocks.FinalizeBlock(block_num, jo.enableBlocklink, DoJit(em_address, b)); + + // Drat. The VFPU hit an uneaten prefix at the end of a block. + if (js.startDefaultPrefix && js.MayHavePrefix()) + { + js.startDefaultPrefix = false; + // Our assumptions are all wrong so it's clean-slate time. + ClearCache(); + + // Let's try that one more time. We won't get back here because we toggled the value. + Compile(em_address); + } } void Jit::RunLoopUntil(u64 globalticks) @@ -200,7 +215,7 @@ const u8 *Jit::DoJit(u32 em_address, ArmJitBlock *b) js.downcountAmount += MIPSGetInstructionCycleEstimate(inst); MIPSCompileOp(inst); - // FlushAll(); ///HACKK + js.compilerPC += 4; numInstructions++; } diff --git a/Core/MIPS/ARM/ArmJit.h b/Core/MIPS/ARM/ArmJit.h index 8d6ad7ef8462..48be4fa9bb4d 100644 --- a/Core/MIPS/ARM/ArmJit.h +++ b/Core/MIPS/ARM/ArmJit.h @@ -56,29 +56,42 @@ struct ArmJitState ArmJitBlock *curBlock; // VFPU prefix magic + bool startDefaultPrefix; u32 prefixS; u32 prefixT; u32 prefixD; - bool writeMask[4]; PrefixState prefixSFlag; PrefixState prefixTFlag; PrefixState prefixDFlag; void PrefixStart() { + if (startDefaultPrefix) { + EatPrefix(); + } else { + PrefixUnknown(); + } + } + void PrefixUnknown() { prefixSFlag = PREFIX_UNKNOWN; prefixTFlag = PREFIX_UNKNOWN; prefixDFlag = PREFIX_UNKNOWN; } bool MayHavePrefix() const { - if (!(prefixSFlag & PREFIX_KNOWN) || !(prefixTFlag & PREFIX_KNOWN) || !(prefixDFlag & PREFIX_KNOWN)) { + if (HasUnknownPrefix()) { return true; } else if (prefixS != 0xE4 || prefixT != 0xE4 || prefixD != 0) { return true; - } else if (writeMask[0] || writeMask[1] || writeMask[2] || writeMask[3]) { + } else if (VfpuWriteMask() != 0) { return true; } return false; } + bool HasUnknownPrefix() const { + if (!(prefixSFlag & PREFIX_KNOWN) || !(prefixTFlag & PREFIX_KNOWN) || !(prefixDFlag & PREFIX_KNOWN)) { + return true; + } + return false; + } void EatPrefix() { if ((prefixSFlag & PREFIX_KNOWN) == 0 || prefixS != 0xE4) { prefixSFlag = PREFIX_KNOWN_DIRTY; @@ -88,12 +101,19 @@ struct ArmJitState prefixTFlag = PREFIX_KNOWN_DIRTY; prefixT = 0xE4; } - if ((prefixDFlag & PREFIX_KNOWN) == 0 || prefixD != 0x0 || writeMask[0] || writeMask[1] || writeMask[2] || writeMask[3]) { + if ((prefixDFlag & PREFIX_KNOWN) == 0 || prefixD != 0x0 || VfpuWriteMask() != 0) { prefixDFlag = PREFIX_KNOWN_DIRTY; prefixD = 0x0; - writeMask[0] = writeMask[1] = writeMask[2] = writeMask[3] = false; } } + u8 VfpuWriteMask() const { + _assert_(prefixDFlag & JitState::PREFIX_KNOWN); + return (prefixD >> 8) & 0xF; + } + bool VfpuWriteMask(int i) const { + _assert_(prefixDFlag & JitState::PREFIX_KNOWN); + return (prefixD >> (8 + i)) & 1; + } }; @@ -159,10 +179,14 @@ class Jit : public ArmGen::ARMXCodeBlock void Comp_SV(u32 op); void Comp_SVQ(u32 op); void Comp_VPFX(u32 op); + void Comp_VVectorInit(u32 op); void Comp_VDot(u32 op); void Comp_VecDo3(u32 op); + void Comp_VV2Op(u32 op); void Comp_Mftv(u32 op); void Comp_Vmtvc(u32 op); + void Comp_Vmmov(u32 op); + ArmJitBlockCache *GetBlockCache() { return &blocks; } @@ -196,12 +220,27 @@ class Jit : public ArmGen::ARMXCodeBlock void CompShiftImm(u32 op, ArmGen::ShiftType shiftType); void LogBlockNumber(); + + void ApplyPrefixST(u8 *vregs, u32 prefix, VectorSize sz); + void ApplyPrefixD(const u8 *vregs, VectorSize sz); + void GetVectorRegsPrefixS(u8 *regs, VectorSize sz, int vectorReg) { + _assert_(js.prefixSFlag & JitState::PREFIX_KNOWN); + GetVectorRegs(regs, sz, vectorReg); + ApplyPrefixST(regs, js.prefixS, sz); + } + void GetVectorRegsPrefixT(u8 *regs, VectorSize sz, int vectorReg) { + _assert_(js.prefixTFlag & JitState::PREFIX_KNOWN); + GetVectorRegs(regs, sz, vectorReg); + ApplyPrefixST(regs, js.prefixT, sz); + } + void GetVectorRegsPrefixD(u8 *regs, VectorSize sz, int vectorReg); + + /* void CompImmLogic(u32 op, void (ARMXEmitter::*arith)(int, const OpArg &, const OpArg &)); void CompTriArith(u32 op, void (ARMXEmitter::*arith)(int, const OpArg &, const OpArg &)); void CompShiftImm(u32 op, void (ARMXEmitter::*shift)(int, OpArg, OpArg)); void CompShiftVar(u32 op, void (XEmitter::*shift)(int, OpArg, OpArg)); - */ // Utils diff --git a/Core/MIPS/ARM/ArmRegCache.h b/Core/MIPS/ARM/ArmRegCache.h index cba766b1bcc9..3cbe27f4daa2 100644 --- a/Core/MIPS/ARM/ArmRegCache.h +++ b/Core/MIPS/ARM/ArmRegCache.h @@ -55,7 +55,7 @@ struct RegMIPS { RegMIPSLoc loc; // Data (only one of these is used, depending on loc. Could make a union). u32 imm; - int reg; // reg index (need to add S0 to get ARMReg) + ARMReg reg; // reg index bool spillLock; // if true, this register cannot be spilled. // If loc == ML_MEM, it's back in its location in the CPU context struct. }; diff --git a/Core/MIPS/ARM/ArmRegCacheFPU.cpp b/Core/MIPS/ARM/ArmRegCacheFPU.cpp index bb5a21ef96e4..98a0f5bca861 100644 --- a/Core/MIPS/ARM/ArmRegCacheFPU.cpp +++ b/Core/MIPS/ARM/ArmRegCacheFPU.cpp @@ -38,6 +38,7 @@ void ArmRegCacheFPU::Start(MIPSAnalyst::AnalysisResults &stats) { mr[i].loc = ML_MEM; mr[i].reg = INVALID_REG; mr[i].spillLock = false; + mr[i].tempLock = false; } } @@ -109,7 +110,7 @@ ARMReg ArmRegCacheFPU::MapReg(MIPSReg mipsReg, int mapFlags) { int bestToSpill = -1; for (int i = 0; i < allocCount; i++) { int reg = allocOrder[i] - S0; - if (ar[reg].mipsReg != -1 && mr[ar[reg].mipsReg].spillLock) + if (ar[reg].mipsReg != -1 && (mr[ar[reg].mipsReg].spillLock || mr[ar[reg].mipsReg].tempLock)) continue; bestToSpill = reg; break; @@ -242,7 +243,7 @@ void ArmRegCacheFPU::DiscardR(MIPSReg r) { // IMM is not allowed for FP (yet). ERROR_LOG(HLE, "Imm in FP register?"); break; - + case ML_ARMREG: if (mr[r].reg == (int)INVALID_REG) { ERROR_LOG(HLE, "DiscardR: MipsReg had bad ArmReg"); @@ -262,8 +263,28 @@ void ArmRegCacheFPU::DiscardR(MIPSReg r) { } mr[r].loc = ML_MEM; mr[r].reg = (int)INVALID_REG; + mr[r].tempLock = false; + // spill lock? +} + + +bool ArmRegCacheFPU::IsTempX(ARMReg r) const { + return ar[r - S0].mipsReg >= TEMP0; +} + +int ArmRegCacheFPU::GetTempR() { + for (int r = TEMP0; r < TEMP0 + NUM_TEMPS; ++r) { + if (mr[r].loc == ML_MEM && !mr[r].tempLock) { + mr[r].tempLock = true; + return r; + } + } + + _assert_msg_(DYNA_REC, 0, "Regcache ran out of temp regs, might need to DiscardR() some."); + return -1; } + void ArmRegCacheFPU::FlushAll() { // Discard temps! for (int i = TEMP0; i < TEMP0 + NUM_TEMPS; i++) { @@ -271,7 +292,7 @@ void ArmRegCacheFPU::FlushAll() { } for (int i = 0; i < NUM_MIPSFPUREG; i++) { FlushR(i); - } + } // Sanity check for (int i = 0; i < NUM_ARMFPUREG; i++) { if (ar[i].mipsReg != -1) { @@ -297,9 +318,10 @@ void ArmRegCacheFPU::SpillLock(MIPSReg r1, MIPSReg r2, MIPSReg r3, MIPSReg r4) { // This is actually pretty slow with all the 160 regs... void ArmRegCacheFPU::ReleaseSpillLocks() { - for (int i = 0; i < NUM_MIPSFPUREG; i++) { + for (int i = 0; i < NUM_MIPSFPUREG; i++) mr[i].spillLock = false; - } + for (int i = TEMP0; i < TEMP0 + NUM_TEMPS; ++i) + DiscardR(i); } ARMReg ArmRegCacheFPU::R(int mipsReg) { diff --git a/Core/MIPS/ARM/ArmRegCacheFPU.h b/Core/MIPS/ARM/ArmRegCacheFPU.h index ea1dd84b9636..c22cbecf9e98 100644 --- a/Core/MIPS/ARM/ArmRegCacheFPU.h +++ b/Core/MIPS/ARM/ArmRegCacheFPU.h @@ -28,11 +28,8 @@ using namespace ArmGen; enum { - NUM_TEMPS = 4, + NUM_TEMPS = 16, TEMP0 = 32 + 128, - TEMP1 = TEMP0 + 1, - TEMP2 = TEMP0 + 2, - TEMP3 = TEMP0 + 3, TOTAL_MAPPABLE_MIPSFPUREGS = 32 + 128 + NUM_TEMPS, }; @@ -45,8 +42,9 @@ struct FPURegMIPS { // Where is this MIPS register? RegMIPSLoc loc; // Data (only one of these is used, depending on loc. Could make a union). - ARMReg reg; + int reg; bool spillLock; // if true, this register cannot be spilled. + bool tempLock; // If loc == ML_MEM, it's back in its location in the CPU context struct. }; @@ -63,11 +61,16 @@ class ArmRegCacheFPU // Protect the arm register containing a MIPS register from spilling, to ensure that // it's being kept allocated. void SpillLock(MIPSReg reg, MIPSReg reg2 = -1, MIPSReg reg3 = -1, MIPSReg reg4 = -1); + void SpillLockV(MIPSReg r) { SpillLock(r + 32); } + void ReleaseSpillLocks(); void ReleaseSpillLock(int mipsreg) { mr[mipsreg].spillLock = false; } + void ReleaseSpillLockV(int mipsreg) { + ReleaseSpillLock(mipsreg + 32); + } void SetImm(MIPSReg reg, u32 immVal); bool IsImm(MIPSReg reg) const; @@ -84,7 +87,11 @@ class ArmRegCacheFPU void FlushV(MIPSReg r) { FlushR(r + 32); } void DiscardR(MIPSReg r); void DiscardV(MIPSReg r) { DiscardR(r + 32);} + bool IsTempX(ARMReg r) const; + MIPSReg GetTempR(); + MIPSReg GetTempV() { return GetTempR() - 32; } + void FlushAll(); ARMReg R(int preg); // Returns a cached register @@ -123,6 +130,6 @@ class ArmRegCacheFPU }; RegARM ar[NUM_ARMFPUREG]; - RegMIPS mr[NUM_MIPSFPUREG]; - RegMIPS *vr; + FPURegMIPS mr[NUM_MIPSFPUREG]; + FPURegMIPS *vr; }; diff --git a/Core/MIPS/x86/CompVFPU.cpp b/Core/MIPS/x86/CompVFPU.cpp index 4d1db52c7bfb..095471bebda0 100644 --- a/Core/MIPS/x86/CompVFPU.cpp +++ b/Core/MIPS/x86/CompVFPU.cpp @@ -23,14 +23,14 @@ #include "../MIPSVFPUUtils.h" #include "RegCache.h" -// VERY UNFINISHED +// VERY UNFINISHED! // All functions should have CONDITIONAL_DISABLE, so we can narrow things down to a file quickly. // Currently known non working ones should have DISABLE. -// #define CONDITIONAL_DISABLE { Comp_Generic(op); return; } +// #define CONDITIONAL_DISABLE { fpr.ReleaseSpillLocks(); Comp_Generic(op); return; } #define CONDITIONAL_DISABLE ; -#define DISABLE { Comp_Generic(op); return; } +#define DISABLE { fpr.ReleaseSpillLocks(); Comp_Generic(op); return; } #define _RS ((op>>21) & 0x1F) @@ -103,7 +103,7 @@ void Jit::ApplyPrefixST(u8 *vregs, u32 prefix, VectorSize sz) { if (!constants) { // Prefix may say "z, z, z, z" but if this is a pair, we force to x. // TODO: But some ops seem to use const 0 instead? - if (regnum > n) { + if (regnum >= n) { ERROR_LOG(CPU, "Invalid VFPU swizzle: %08x / %d", prefix, sz); regnum = 0; } @@ -167,7 +167,7 @@ void Jit::ApplyPrefixD(const u8 *vregs, VectorSize sz) { // Vector regs can overlap in all sorts of swizzled ways. // This does allow a single overlap in sregs[i]. -bool IsOverlapSafeAllowS(int dreg, int di, int sn, u8 sregs[], int tn, u8 tregs[]) +bool IsOverlapSafeAllowS(int dreg, int di, int sn, u8 sregs[], int tn = 0, u8 tregs[] = NULL) { for (int i = 0; i < sn; ++i) { @@ -184,7 +184,7 @@ bool IsOverlapSafeAllowS(int dreg, int di, int sn, u8 sregs[], int tn, u8 tregs[ return true; } -bool IsOverlapSafe(int dreg, int di, int sn, u8 sregs[], int tn, u8 tregs[]) +bool IsOverlapSafe(int dreg, int di, int sn, u8 sregs[], int tn = 0, u8 tregs[] = NULL) { return IsOverlapSafeAllowS(dreg, di, sn, sregs, tn, tregs) && sregs[di] != dreg; } @@ -336,26 +336,55 @@ void Jit::Comp_SVQ(u32 op) } } -void Jit::Comp_VDot(u32 op) { +void Jit::Comp_VVectorInit(u32 op) { CONDITIONAL_DISABLE; - if (js.HasUnknownPrefix()) { - Comp_Generic(op); - return; + if (js.HasUnknownPrefix()) + DISABLE; + + VectorSize sz = GetVecSize(op); + int n = GetNumVectorElements(sz); + + u8 dregs[4]; + GetVectorRegsPrefixD(dregs, sz, _VD); + fpr.MapRegsV(dregs, sz, MAP_NOINIT | MAP_DIRTY); + + for (int i = 0; i < n; ++i) + { + switch ((op >> 16) & 0xF) + { + case 6: // v=zeros; break; //vzero + MOVSS(fpr.VX(dregs[i]), M((void *) &zero)); + break; + case 7: // v=ones; break; //vone + MOVSS(fpr.VX(dregs[i]), M((void *) &one)); + break; + default: + DISABLE; + break; + } } - int vd = _VD; - int vs = _VS; - int vt = _VT; + ApplyPrefixD(dregs, sz); + + fpr.ReleaseSpillLocks(); +} + +void Jit::Comp_VDot(u32 op) { + CONDITIONAL_DISABLE; + + if (js.HasUnknownPrefix()) + DISABLE; + VectorSize sz = GetVecSize(op); + int n = GetNumVectorElements(sz); // TODO: Force read one of them into regs? probably not. u8 sregs[4], tregs[4], dregs[1]; - GetVectorRegsPrefixS(sregs, sz, vs); - GetVectorRegsPrefixT(tregs, sz, vt); - GetVectorRegsPrefixD(dregs, V_Single, vd); + GetVectorRegsPrefixS(sregs, sz, _VS); + GetVectorRegsPrefixT(tregs, sz, _VT); + GetVectorRegsPrefixD(dregs, V_Single, _VD); - int n = GetNumVectorElements(sz); X64Reg tempxreg = XMM0; if (IsOverlapSafe(dregs[0], 0, n, sregs, n, tregs)) { @@ -387,20 +416,8 @@ void Jit::Comp_VDot(u32 op) { void Jit::Comp_VecDo3(u32 op) { CONDITIONAL_DISABLE; - if (js.HasUnknownPrefix()) { - Comp_Generic(op); - return; - } - - int vd = _VD; - int vs = _VS; - int vt = _VT; - VectorSize sz = GetVecSize(op); - - u8 sregs[4], tregs[4], dregs[4]; - GetVectorRegsPrefixS(sregs, sz, vs); - GetVectorRegsPrefixT(tregs, sz, vt); - GetVectorRegsPrefixD(dregs, sz, vd); + if (js.HasUnknownPrefix()) + DISABLE; void (XEmitter::*xmmop)(X64Reg, OpArg) = NULL; switch (op >> 26) @@ -430,14 +447,16 @@ void Jit::Comp_VecDo3(u32 op) { } if (xmmop == NULL) - { - fpr.ReleaseSpillLocks(); - Comp_Generic(op); - return; - } + DISABLE; + VectorSize sz = GetVecSize(op); int n = GetNumVectorElements(sz); + u8 sregs[4], tregs[4], dregs[4]; + GetVectorRegsPrefixS(sregs, sz, _VS); + GetVectorRegsPrefixT(tregs, sz, _VT); + GetVectorRegsPrefixD(dregs, sz, _VD); + X64Reg tempxregs[4]; for (int i = 0; i < n; ++i) { @@ -480,6 +499,125 @@ void Jit::Comp_VecDo3(u32 op) { fpr.ReleaseSpillLocks(); } +void Jit::Comp_VV2Op(u32 op) { + CONDITIONAL_DISABLE; + + if (js.HasUnknownPrefix()) + DISABLE; + + VectorSize sz = GetVecSize(op); + int n = GetNumVectorElements(sz); + + u8 sregs[4], dregs[4]; + GetVectorRegsPrefixS(sregs, sz, _VS); + GetVectorRegsPrefixD(dregs, sz, _VD); + + X64Reg tempxregs[4]; + for (int i = 0; i < n; ++i) + { + if (!IsOverlapSafeAllowS(dregs[i], i, n, sregs)) + { + int reg = fpr.GetTempV(); + fpr.MapRegV(reg, MAP_NOINIT | MAP_DIRTY); + fpr.SpillLockV(reg); + tempxregs[i] = fpr.VX(reg); + } + else + { + fpr.MapRegV(dregs[i], (dregs[i] == sregs[i] ? 0 : MAP_NOINIT) | MAP_DIRTY); + fpr.SpillLockV(dregs[i]); + tempxregs[i] = fpr.VX(dregs[i]); + } + } + + // Warning: sregs[i] and tempxregs[i] may be the same reg. + // Helps for vmov, hurts for vrcp, etc. + for (int i = 0; i < n; ++i) + { + switch ((op >> 16) & 0x1f) + { + case 0: // d[i] = s[i]; break; //vmov + // Probably for swizzle. + if (!fpr.V(sregs[i]).IsSimpleReg(tempxregs[i])) + MOVSS(tempxregs[i], fpr.V(sregs[i])); + break; + case 1: // d[i] = fabsf(s[i]); break; //vabs + if (!fpr.V(sregs[i]).IsSimpleReg(tempxregs[i])) + MOVSS(tempxregs[i], fpr.V(sregs[i])); + ANDPS(tempxregs[i], M((void *)&noSignMask)); + break; + case 2: // d[i] = -s[i]; break; //vneg + if (!fpr.V(sregs[i]).IsSimpleReg(tempxregs[i])) + MOVSS(tempxregs[i], fpr.V(sregs[i])); + XORPS(tempxregs[i], M((void *)&signBitLower)); + break; + case 4: // if (s[i] < 0) d[i] = 0; else {if(s[i] > 1.0f) d[i] = 1.0f; else d[i] = s[i];} break; // vsat0 + if (!fpr.V(sregs[i]).IsSimpleReg(tempxregs[i])) + MOVSS(tempxregs[i], fpr.V(sregs[i])); + // TODO: Doesn't handle NaN correctly. + MAXSS(tempxregs[i], M((void *)&zero)); + MINSS(tempxregs[i], M((void *)&one)); + break; + case 5: // if (s[i] < -1.0f) d[i] = -1.0f; else {if(s[i] > 1.0f) d[i] = 1.0f; else d[i] = s[i];} break; // vsat1 + if (!fpr.V(sregs[i]).IsSimpleReg(tempxregs[i])) + MOVSS(tempxregs[i], fpr.V(sregs[i])); + // TODO: Doesn't handle NaN correctly. + MAXSS(tempxregs[i], M((void *)&minus_one)); + MINSS(tempxregs[i], M((void *)&one)); + break; + case 16: // d[i] = 1.0f / s[i]; break; //vrcp + MOVSS(XMM0, M((void *)&one)); + DIVSS(XMM0, fpr.V(sregs[i])); + MOVSS(tempxregs[i], R(XMM0)); + break; + case 17: // d[i] = 1.0f / sqrtf(s[i]); break; //vrsq + SQRTSS(XMM0, fpr.V(sregs[i])); + MOVSS(tempxregs[i], M((void *)&one)); + DIVSS(tempxregs[i], R(XMM0)); + break; + case 18: // d[i] = sinf((float)M_PI_2 * s[i]); break; //vsin + DISABLE; + break; + case 19: // d[i] = cosf((float)M_PI_2 * s[i]); break; //vcos + DISABLE; + break; + case 20: // d[i] = powf(2.0f, s[i]); break; //vexp2 + DISABLE; + break; + case 21: // d[i] = logf(s[i])/log(2.0f); break; //vlog2 + DISABLE; + break; + case 22: // d[i] = sqrtf(s[i]); break; //vsqrt + SQRTSS(tempxregs[i], fpr.V(sregs[i])); + ANDPS(tempxregs[i], M((void *)&noSignMask)); + break; + case 23: // d[i] = asinf(s[i] * (float)M_2_PI); break; //vasin + DISABLE; + break; + case 24: // d[i] = -1.0f / s[i]; break; // vnrcp + MOVSS(XMM0, M((void *)&minus_one)); + DIVSS(XMM0, fpr.V(sregs[i])); + MOVSS(tempxregs[i], R(XMM0)); + break; + case 26: // d[i] = -sinf((float)M_PI_2 * s[i]); break; // vnsin + DISABLE; + break; + case 28: // d[i] = 1.0f / expf(s[i] * (float)M_LOG2E); break; // vrexp2 + DISABLE; + break; + } + } + for (int i = 0; i < n; ++i) + { + if (!fpr.V(dregs[i]).IsSimpleReg(tempxregs[i])) + MOVSS(fpr.V(dregs[i]), tempxregs[i]); + } + + ApplyPrefixD(dregs, sz); + + fpr.ReleaseSpillLocks(); +} + void Jit::Comp_Mftv(u32 op) { CONDITIONAL_DISABLE; @@ -541,7 +679,7 @@ void Jit::Comp_Vmtvc(u32 op) { int imm = op & 0xFF; if (imm >= 128 && imm < 128 + VFPU_CTRL_MAX) { fpr.MapRegV(vs, 0); - MOVSS(M(¤tMIPS->vfpuCtrl[imm - 128]), fpr.RX(vs)); + MOVSS(M(¤tMIPS->vfpuCtrl[imm - 128]), fpr.VX(vs)); fpr.ReleaseSpillLocks(); if (imm - 128 == VFPU_CTRL_SPREFIX) { @@ -554,4 +692,46 @@ void Jit::Comp_Vmtvc(u32 op) { } } +void Jit::Comp_Vmmov(u32 op) { + CONDITIONAL_DISABLE; + + // TODO: This probably ignores prefixes? + if (js.MayHavePrefix()) + DISABLE; + + MatrixSize sz = GetMtxSize(op); + int n = GetMatrixSide(sz); + + u8 sregs[16], dregs[16]; + GetMatrixRegs(sregs, sz, _VS); + GetMatrixRegs(dregs, sz, _VD); + + // TODO: gas doesn't allow overlap, what does the PSP do? + // Potentially detect overlap or the safe direction to move in, or just DISABLE? + // This is very not optimal, blows the regcache everytime. + u8 tempregs[16]; + for (int a = 0; a < n; a++) + { + for (int b = 0; b < n; b++) + { + u8 temp = (u8) fpr.GetTempV(); + fpr.MapRegV(temp, MAP_NOINIT | MAP_DIRTY); + MOVSS(fpr.VX(temp), fpr.V(sregs[a * 4 + b])); + fpr.StoreFromRegisterV(temp); + tempregs[a * 4 + b] = temp; + } + } + for (int a = 0; a < n; a++) + { + for (int b = 0; b < n; b++) + { + u8 temp = tempregs[a * 4 + b]; + fpr.MapRegV(temp, 0); + MOVSS(fpr.V(dregs[a * 4 + b]), fpr.VX(temp)); + } + } + + fpr.ReleaseSpillLocks(); +} + } diff --git a/native b/native index f5e7bd5a9c3e..f807e225f75b 160000 --- a/native +++ b/native @@ -1 +1 @@ -Subproject commit f5e7bd5a9c3e4b39a4eac71b577f06ad54f2bc96 +Subproject commit f807e225f75b131e614c92770fb93a5e902be22b From eb130db38738a95ddb7414ee11ea124408c2bcbb Mon Sep 17 00:00:00 2001 From: Henrik Rydgard Date: Wed, 20 Feb 2013 00:12:31 +0100 Subject: [PATCH 085/347] Fix sign of depth in "Through" projection matrix. Thanks xele02. Fixes ToE, Dissidia, etc. --- GPU/GLES/ShaderManager.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/GPU/GLES/ShaderManager.cpp b/GPU/GLES/ShaderManager.cpp index 6a985c844623..30c294b78093 100644 --- a/GPU/GLES/ShaderManager.cpp +++ b/GPU/GLES/ShaderManager.cpp @@ -243,7 +243,7 @@ void LinkedShader::updateUniforms() { if (u_proj_through != -1 && (dirtyUniforms & DIRTY_PROJTHROUGHMATRIX)) { Matrix4x4 proj_through; - proj_through.setOrtho(0.0f, 480, 272, 0, -1, 0); // TODO: Store this somewhere instead of regenerating! And not in each LinkedShader object! + proj_through.setOrtho(0.0f, 480, 272, 0, 1, 0); glUniformMatrix4fv(u_proj_through, 1, GL_FALSE, proj_through.getReadPtr()); } if (u_texenv != -1 && (dirtyUniforms & DIRTY_TEXENV)) { From 570ff5d5b9190ed495ab40b9d07b2752862cccac Mon Sep 17 00:00:00 2001 From: Henrik Rydgard Date: Wed, 20 Feb 2013 00:22:58 +0100 Subject: [PATCH 086/347] gl ui: Make sure LoadState is on screen even on small screens --- android/jni/MenuScreens.cpp | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/android/jni/MenuScreens.cpp b/android/jni/MenuScreens.cpp index c170f74a2a2c..5c9e2b2ce83d 100644 --- a/android/jni/MenuScreens.cpp +++ b/android/jni/MenuScreens.cpp @@ -256,13 +256,12 @@ void InGameMenuScreen::render() { g_Config.iFrameSkip = fs ? 1 : 0; // TODO: Add UI for more than one slot. - VLinear vlinear1(x, y + 80, 20); - UIText(UBUNTU24, vlinear1, "Save states are experimental (and large)", 0xFFFFFFFF); - if (UIButton(GEN_ID, vlinear1, LARGE_BUTTON_WIDTH, "Save State", ALIGN_LEFT)) { + HLinear hlinear1(x, y + 80, 20); + if (UIButton(GEN_ID, hlinear1, LARGE_BUTTON_WIDTH, "Save State", ALIGN_LEFT)) { SaveState::SaveSlot(0, 0, 0); screenManager()->finishDialog(this, DR_CANCEL); } - if (UIButton(GEN_ID, vlinear1, LARGE_BUTTON_WIDTH, "Load State", ALIGN_LEFT)) { + if (UIButton(GEN_ID, hlinear1, LARGE_BUTTON_WIDTH, "Load State", ALIGN_LEFT)) { SaveState::LoadSlot(0, 0, 0); screenManager()->finishDialog(this, DR_CANCEL); } From 620603c23618b811b97ca90688d48d12d0c0f2cc Mon Sep 17 00:00:00 2001 From: Henrik Rydgard Date: Wed, 20 Feb 2013 00:24:21 +0100 Subject: [PATCH 087/347] Fix bug in Vh2f (this instr needs more testing) --- Core/MIPS/MIPSIntVFPU.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Core/MIPS/MIPSIntVFPU.cpp b/Core/MIPS/MIPSIntVFPU.cpp index 97f43c75c552..b04d2385c211 100644 --- a/Core/MIPS/MIPSIntVFPU.cpp +++ b/Core/MIPS/MIPSIntVFPU.cpp @@ -690,8 +690,8 @@ namespace MIPSInt _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); + ApplyPrefixD(d, outsize); //TODO: and the mask to kill everything but mask + WriteVector(d, outsize, vd); PC += 4; EatPrefixes(); } From 804bd0837491637da0a721a0126c76234e14c72d Mon Sep 17 00:00:00 2001 From: Xele02 Date: Tue, 19 Feb 2013 23:32:59 +0100 Subject: [PATCH 088/347] Correct vertex info not displayed correctly anymore --- Qt/debugger_displaylist.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Qt/debugger_displaylist.cpp b/Qt/debugger_displaylist.cpp index 9c0f00182e8d..9cbcadb07a5a 100644 --- a/Qt/debugger_displaylist.cpp +++ b/Qt/debugger_displaylist.cpp @@ -1689,7 +1689,6 @@ void Debugger_DisplayList::UpdateVertexInfo() u8* tmp = new u8[20*vtcDec.GetDecVtxFmt().stride]; vtcDec.DecodeVerts(tmp,Memory::GetPointer(vaddr),0,0,0,0,19); VertexReader vtxRead(tmp,vtcDec.GetDecVtxFmt(),state.vertType); - delete [] tmp; for(int i = 0; i < maxVtxDisplay; i++) { @@ -1739,6 +1738,7 @@ void Debugger_DisplayList::UpdateVertexInfo() item->setText(2,QString("X: %1, Y: %2, Z: %3").arg(pos[0]).arg(pos[1]).arg(pos[2])); itemTop->addChild(item); } + delete [] tmp; for(int i = 0; i < ui->vertexData->columnCount(); i++) { ui->vertexData->resizeColumnToContents(i); From d90a024fc62637214054c22814760e44305cd8bc Mon Sep 17 00:00:00 2001 From: Xele02 Date: Tue, 19 Feb 2013 23:34:00 +0100 Subject: [PATCH 089/347] Parse in UInt or big int fail to decode. --- Qt/ctrlmemview.cpp | 2 +- Qt/debugger_displaylist.cpp | 4 ++-- Qt/debugger_memory.cpp | 2 +- Qt/debugger_memorytex.cpp | 18 +++++++++--------- 4 files changed, 13 insertions(+), 13 deletions(-) diff --git a/Qt/ctrlmemview.cpp b/Qt/ctrlmemview.cpp index 0ebaa97775bb..98571d03d25b 100644 --- a/Qt/ctrlmemview.cpp +++ b/Qt/ctrlmemview.cpp @@ -259,7 +259,7 @@ void CtrlMemView::Change() if (ok && !text.isEmpty()) { EmuThread_LockDraw(true); - Memory::WriteUnchecked_U32(text.toInt(0,16),selection); + Memory::WriteUnchecked_U32(text.toUInt(0,16),selection); EmuThread_LockDraw(false); redraw(); } diff --git a/Qt/debugger_displaylist.cpp b/Qt/debugger_displaylist.cpp index 9cbcadb07a5a..baf4d3824d4c 100644 --- a/Qt/debugger_displaylist.cpp +++ b/Qt/debugger_displaylist.cpp @@ -1822,7 +1822,7 @@ void Debugger_DisplayList::on_displayListData_customContextMenuRequested(const Q void Debugger_DisplayList::RunToDLPC() { - u32 addr = displayListDataSelected->text(0).toInt(0,16); + u32 addr = displayListDataSelected->text(0).toUInt(0,16); host->SetGPUStep(true, 2, addr); host->NextGPUStep(); } @@ -1845,7 +1845,7 @@ void Debugger_DisplayList::on_texturesList_customContextMenuRequested(const QPoi void Debugger_DisplayList::RunToDrawTex() { - u32 addr = textureDataSelected->text(0).toInt(0,16); + u32 addr = textureDataSelected->text(0).toUInt(0,16); host->SetGPUStep(true, 3, addr); host->NextGPUStep(); } diff --git a/Qt/debugger_memory.cpp b/Qt/debugger_memory.cpp index 3b5cdedf08d8..d044145f5d24 100644 --- a/Qt/debugger_memory.cpp +++ b/Qt/debugger_memory.cpp @@ -51,7 +51,7 @@ void Debugger_Memory::Goto(u32 addr) void Debugger_Memory::on_editAddress_textChanged(const QString &arg1) { - ui->memView->gotoAddr(arg1.toInt(0,16) & ~3); + ui->memView->gotoAddr(arg1.toUInt(0,16) & ~3); } void Debugger_Memory::on_normalBtn_clicked() diff --git a/Qt/debugger_memorytex.cpp b/Qt/debugger_memorytex.cpp index cdbf4ae640a7..e3fbc38285bf 100644 --- a/Qt/debugger_memorytex.cpp +++ b/Qt/debugger_memorytex.cpp @@ -61,15 +61,15 @@ void Debugger_MemoryTex::on_readBtn_clicked() EmuThread_LockDraw(true); GPUgstate state; - state.texaddr[0] = ui->texaddr->text().toInt(0,16); - state.texbufwidth[0] = ui->texbufwidth0->text().toInt(0,16); - state.texformat = ui->texformat->text().toInt(0,16); - state.texsize[0] = ui->texsize->text().toInt(0,16); - state.texmode = ui->texmode->text().toInt(0,16); - state.clutformat = ui->clutformat->text().toInt(0,16); - state.clutaddr = ui->clutaddr->text().toInt(0,16); - state.clutaddrupper = ui->clutaddrupper->text().toInt(0,16); - state.loadclut = ui->loadclut->text().toInt(0,16); + state.texaddr[0] = ui->texaddr->text().toUInt(0,16); + state.texbufwidth[0] = ui->texbufwidth0->text().toUInt(0,16); + state.texformat = ui->texformat->text().toUInt(0,16); + state.texsize[0] = ui->texsize->text().toUInt(0,16); + state.texmode = ui->texmode->text().toUInt(0,16); + state.clutformat = ui->clutformat->text().toUInt(0,16); + state.clutaddr = ui->clutaddr->text().toUInt(0,16); + state.clutaddrupper = ui->clutaddrupper->text().toUInt(0,16); + state.loadclut = ui->loadclut->text().toUInt(0,16); int bufW = state.texbufwidth[0] & 0x3ff; int w = 1 << (state.texsize[0] & 0xf); int h = 1 << ((state.texsize[0]>>8) & 0xf); From 0c3d310a31650ed658a69f3501970267ab5258af Mon Sep 17 00:00:00 2001 From: Xele02 Date: Wed, 20 Feb 2013 00:10:38 +0100 Subject: [PATCH 090/347] Avoid exit crash --- Qt/debugger_disasm.cpp | 2 ++ Qt/debugger_displaylist.cpp | 2 ++ 2 files changed, 4 insertions(+) diff --git a/Qt/debugger_disasm.cpp b/Qt/debugger_disasm.cpp index 2b670bb1504c..a94f80c0ec08 100644 --- a/Qt/debugger_disasm.cpp +++ b/Qt/debugger_disasm.cpp @@ -132,6 +132,8 @@ void Debugger_Disasm::StepHLE() void Debugger_Disasm::UpdateDialog() { + if(!isVisible()) + return; ui->DisasmView->setAlign(cpu->getInstructionSize(0)); ui->DisasmView->redraw(); ui->RegList->redraw(); diff --git a/Qt/debugger_displaylist.cpp b/Qt/debugger_displaylist.cpp index baf4d3824d4c..9c125a2a7656 100644 --- a/Qt/debugger_displaylist.cpp +++ b/Qt/debugger_displaylist.cpp @@ -1467,6 +1467,8 @@ void Debugger_DisplayList::FillDisplayListCmd(std::map& data, u32 void Debugger_DisplayList::Update() { + if(!isVisible()) + return; UpdateRenderBuffer(); UpdateRenderBufferList(); UpdateDisplayList(); From 1540869e9579f15da91d35018bb4cb6b9514c5eb Mon Sep 17 00:00:00 2001 From: Sacha Date: Wed, 20 Feb 2013 13:12:03 +1000 Subject: [PATCH 091/347] All mobile devices now have file logging disabled. Change save dir on blackberry/symbian. Update native. --- Common/LogManager.cpp | 60 ++++++++++++++++++++------------------- android/jni/NativeApp.cpp | 4 ++- native | 2 +- 3 files changed, 35 insertions(+), 31 deletions(-) diff --git a/Common/LogManager.cpp b/Common/LogManager.cpp index ebbff872653f..69d0b3ce0169 100644 --- a/Common/LogManager.cpp +++ b/Common/LogManager.cpp @@ -46,30 +46,30 @@ LogManager *LogManager::m_logManager = NULL; LogManager::LogManager() { // create log files - m_Log[LogTypes::MASTER_LOG] = new LogContainer("*", "Master Log"); - m_Log[LogTypes::BOOT] = new LogContainer("BOOT", "Boot"); - m_Log[LogTypes::COMMON] = new LogContainer("COMMON", "Common"); - m_Log[LogTypes::CPU] = new LogContainer("CPU", "CPU"); - m_Log[LogTypes::LOADER] = new LogContainer("LOAD", "Loader"); - m_Log[LogTypes::IO] = new LogContainer("IO", "IO"); - m_Log[LogTypes::DISCIO] = new LogContainer("DIO", "DiscIO"); - m_Log[LogTypes::PAD] = new LogContainer("PAD", "Pad"); - m_Log[LogTypes::FILESYS] = new LogContainer("FileSys", "File System"); - m_Log[LogTypes::G3D] = new LogContainer("G3D", "3D Graphics"); - m_Log[LogTypes::DMA] = new LogContainer("DMA", "DMA"); - m_Log[LogTypes::INTC] = new LogContainer("INTC", "Interrupts"); - m_Log[LogTypes::MEMMAP] = new LogContainer("MM", "Memory Map"); - m_Log[LogTypes::SOUND] = new LogContainer("SND", "Sound"); - m_Log[LogTypes::SAS] = new LogContainer("SAS", "Sound Mixer (Sas)"); - m_Log[LogTypes::HLE] = new LogContainer("HLE", "HLE"); - m_Log[LogTypes::TIMER] = new LogContainer("TMR", "Timer"); - m_Log[LogTypes::VIDEO] = new LogContainer("VID", "Video"); - m_Log[LogTypes::DYNA_REC] = new LogContainer("Jit", "JIT compiler"); - m_Log[LogTypes::NETPLAY] = new LogContainer("NET", "Net play"); - m_Log[LogTypes::ME] = new LogContainer("ME", "Media Engine"); + m_Log[LogTypes::MASTER_LOG] = new LogContainer("*", "Master Log"); + m_Log[LogTypes::BOOT] = new LogContainer("BOOT", "Boot"); + m_Log[LogTypes::COMMON] = new LogContainer("COMMON", "Common"); + m_Log[LogTypes::CPU] = new LogContainer("CPU", "CPU"); + m_Log[LogTypes::LOADER] = new LogContainer("LOAD", "Loader"); + m_Log[LogTypes::IO] = new LogContainer("IO", "IO"); + m_Log[LogTypes::DISCIO] = new LogContainer("DIO", "DiscIO"); + m_Log[LogTypes::PAD] = new LogContainer("PAD", "Pad"); + m_Log[LogTypes::FILESYS] = new LogContainer("FileSys", "File System"); + m_Log[LogTypes::G3D] = new LogContainer("G3D", "3D Graphics"); + m_Log[LogTypes::DMA] = new LogContainer("DMA", "DMA"); + m_Log[LogTypes::INTC] = new LogContainer("INTC", "Interrupts"); + m_Log[LogTypes::MEMMAP] = new LogContainer("MM", "Memory Map"); + m_Log[LogTypes::SOUND] = new LogContainer("SND", "Sound"); + m_Log[LogTypes::SAS] = new LogContainer("SAS", "Sound Mixer (Sas)"); + m_Log[LogTypes::HLE] = new LogContainer("HLE", "HLE"); + m_Log[LogTypes::TIMER] = new LogContainer("TMR", "Timer"); + m_Log[LogTypes::VIDEO] = new LogContainer("VID", "Video"); + m_Log[LogTypes::DYNA_REC] = new LogContainer("Jit", "JIT compiler"); + m_Log[LogTypes::NETPLAY] = new LogContainer("NET", "Net play"); + m_Log[LogTypes::ME] = new LogContainer("ME", "Media Engine"); // Remove file logging on small devices -#if !defined(ANDROID) && !defined(IOS) && !defined(BLACKBERRY) +#ifndef USING_GLES2 m_fileLog = new FileLogListener(File::GetUserPath(F_MAINLOG_IDX).c_str()); m_consoleLog = new ConsoleListener(); m_debuggerLog = new DebuggerLogListener(); @@ -82,7 +82,7 @@ LogManager::LogManager() for (int i = 0; i < LogTypes::NUMBER_OF_LOGS; ++i) { m_Log[i]->SetEnable(true); -#if !defined(ANDROID) && !defined(IOS) && !defined(BLACKBERRY) +#ifndef USING_GLES2 m_Log[i]->AddListener(m_fileLog); m_Log[i]->AddListener(m_consoleLog); #ifdef _MSC_VER @@ -97,11 +97,13 @@ LogManager::~LogManager() { for (int i = 0; i < LogTypes::NUMBER_OF_LOGS; ++i) { +#ifndef USING_GLES2 if (m_fileLog != NULL) m_logManager->RemoveListener((LogTypes::LOG_TYPE)i, m_fileLog); -#if !defined(ANDROID) && !defined(IOS) && !defined(BLACKBERRY) m_logManager->RemoveListener((LogTypes::LOG_TYPE)i, m_consoleLog); +#ifdef _MSC_VER m_logManager->RemoveListener((LogTypes::LOG_TYPE)i, m_debuggerLog); +#endif #endif } @@ -109,7 +111,7 @@ LogManager::~LogManager() delete m_Log[i]; if (m_fileLog != NULL) delete m_fileLog; -#if !defined(ANDROID) && !defined(IOS) && !defined(BLACKBERRY) +#ifndef USING_GLES2 delete m_consoleLog; delete m_debuggerLog; #endif @@ -214,6 +216,9 @@ void LogContainer::RemoveListener(LogListener *listener) void LogContainer::Trigger(LogTypes::LOG_LEVELS level, const char *msg) { +#ifdef __SYMBIAN32__ + RDebug::Printf("%s",msg); +#else std::lock_guard lk(m_listeners_lock); std::set::const_iterator i; @@ -221,6 +226,7 @@ void LogContainer::Trigger(LogTypes::LOG_LEVELS level, const char *msg) { (*i)->Log(level, msg); } +#endif } FileLogListener::FileLogListener(const char *filename) @@ -235,11 +241,7 @@ void FileLogListener::Log(LogTypes::LOG_LEVELS, const char *msg) return; std::lock_guard lk(m_log_lock); -#ifdef __SYMBIAN32__ - RDebug::Printf("%s",msg); -#else m_logfile << msg << std::flush; -#endif } void DebuggerLogListener::Log(LogTypes::LOG_LEVELS, const char *msg) diff --git a/android/jni/NativeApp.cpp b/android/jni/NativeApp.cpp index 786d51b9b785..c0a9497dbf9a 100644 --- a/android/jni/NativeApp.cpp +++ b/android/jni/NativeApp.cpp @@ -231,8 +231,10 @@ void NativeInit(int argc, const char *argv[], const char *savegame_directory, co LogManager::GetInstance()->ChangeFileLog(fileToLog); if (g_Config.currentDirectory == "") { -#if defined(ANDROID) || defined(BLACKBERRY) || defined(__SYMBIAN32__) +#if defined(ANDROID) g_Config.currentDirectory = external_directory; +#elif defined(BLACKBERRY) || defined(__SYMBIAN32__) + g_Config.currentDirectory = savegame_directory; #else g_Config.currentDirectory = getenv("HOME"); #endif diff --git a/native b/native index f807e225f75b..f4cc78cbfdb5 160000 --- a/native +++ b/native @@ -1 +1 @@ -Subproject commit f807e225f75b131e614c92770fb93a5e902be22b +Subproject commit f4cc78cbfdb5c9d9c3d83353e66625db43cf54b5 From d3413681e5f98abf2b19422ce73b46ee8457fb81 Mon Sep 17 00:00:00 2001 From: raven02 Date: Wed, 20 Feb 2013 20:32:18 +0800 Subject: [PATCH 092/347] Fix texture stretched vertically in HW T&L --- GPU/GLES/VertexShaderGenerator.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/GPU/GLES/VertexShaderGenerator.cpp b/GPU/GLES/VertexShaderGenerator.cpp index d5cb6c1e2cfe..bddcd1ab19d5 100644 --- a/GPU/GLES/VertexShaderGenerator.cpp +++ b/GPU/GLES/VertexShaderGenerator.cpp @@ -401,7 +401,7 @@ void GenerateVertexShader(int prim, char *buffer) { break; } if (flipV) - WRITE(p, " v_texcoord.y = 1.0 - v_texcoord.y;\n"); + WRITE(p, " v_texcoord.y = 1.0 - v_texcoord.y * 2.0;\n"); } // Compute fogdepth From 7a39633ce61b9a2b77f817c57862bfd2b889a12e Mon Sep 17 00:00:00 2001 From: HuangKangJing Date: Wed, 20 Feb 2013 22:40:11 +0800 Subject: [PATCH 093/347] Updated chinese simplified translation --- Qt/languages/ppsspp_cn.ts | 58 +++++++++++++++++++-------------------- 1 file changed, 29 insertions(+), 29 deletions(-) diff --git a/Qt/languages/ppsspp_cn.ts b/Qt/languages/ppsspp_cn.ts index 7e628dd6f7c4..450a3250dacd 100644 --- a/Qt/languages/ppsspp_cn.ts +++ b/Qt/languages/ppsspp_cn.ts @@ -1,13 +1,13 @@ - + Controls Controls Controls window title - ζ§ε¶ε™¨ + ζ§ε¶ε™¨ @@ -65,7 +65,7 @@ New function name: - + 新函数εη§°οΌ @@ -116,7 +116,7 @@ Set new value: - + θ®Ύη½®ζ–°ε€ΌοΌ @@ -125,7 +125,7 @@ Disassembler Window title - + ε汇编器 @@ -330,7 +330,7 @@ Memory Viewer - %1 - + ε†…ε­ζ¥η‹ε™¨ - %1 @@ -338,7 +338,7 @@ VFPU - + VFPU @@ -527,37 +527,37 @@ Lo&g Levels - + (&G)ζ—¥εΏ—ηΊ§ε« &Language - + (&L)语言选择 &Video - + (&V)视频 &Anisotropic filtering - + (&A)ε„ε‘异性过滤 &Zoom - + (&Z)ηΌ©ζ”Ύ Co&ntrols - + (&N)ζ§ε¶ &Core - + (&C)ζ ΈεΏƒ @@ -702,47 +702,47 @@ &Keyboard - + (&K)ι”®η› &Toggle fullscreen - + (&T)ε…¨ε± Show &debug statistics - + (&D)ζΎη¤Ίθ°ƒθ―•δΏ΅ζ― I&gnore illegal reads/writes - + (&G)εΏ½η•¥ι法读写 &Gamepad - + (&G)ζ‰‹ζ„ Run on loa&d - + (&D)θ½½ε…¥ζ—¶θΏθ΅ Show &FPS counter - + (&F)ζΎη¤ΊεΈ§η‡θ®΅ζ•°ε™¨ S&tretch to display - + (&T)拉伸ζΎη¤Ί &Sound emulation - + (&S)模ζ‹ε£°ι³ @@ -890,32 +890,32 @@ Simple 2xAA - + Simple 2xAA Off - + Off 2x - + 2x 4x - + 4x 8x - + 8x 16x - + 16x From a1d9576e6218312683a7bfa5b24f68a3bdc061f7 Mon Sep 17 00:00:00 2001 From: HuangKangJing Date: Wed, 20 Feb 2013 22:46:59 +0800 Subject: [PATCH 094/347] Updated zh_CN translation. --- Qt/languages/ppsspp_cn.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Qt/languages/ppsspp_cn.ts b/Qt/languages/ppsspp_cn.ts index 450a3250dacd..0185206b1a8a 100644 --- a/Qt/languages/ppsspp_cn.ts +++ b/Qt/languages/ppsspp_cn.ts @@ -890,12 +890,12 @@ Simple 2xAA - Simple 2xAA + Off - Off + ε…³ι—­ From 197e5fc630f02fa601e1eba2238e2dcc6b29242b Mon Sep 17 00:00:00 2001 From: StorMyu Date: Wed, 20 Feb 2013 21:04:19 +0100 Subject: [PATCH 095/347] Change %i/%d to %X Cause it's just an easier read for every instruction to do Hexadecimal operation on Hexadecimal Immediate. --- Core/MIPS/MIPSDis.cpp | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/Core/MIPS/MIPSDis.cpp b/Core/MIPS/MIPSDis.cpp index 3a72a794188b..89469f56bf34 100644 --- a/Core/MIPS/MIPSDis.cpp +++ b/Core/MIPS/MIPSDis.cpp @@ -76,7 +76,7 @@ namespace MIPSDis int ft = _FT; int rs = _RS; const char *name = MIPSGetName(op); - sprintf(out, "%s\t%s, %d(%s)",name,FN(ft),offset,RN(rs)); + sprintf(out, "%s\t%s, %X(%s)",name,FN(ft),offset,RN(rs)); } void Dis_FPUComp(u32 op, char *out) { @@ -151,7 +151,7 @@ namespace MIPSDis int rt = _RT; int rs = _RS; const char *name = MIPSGetName(op); - sprintf(out, "%s\t%s, %s, %i",name,RN(rt),RN(rs),imm); + sprintf(out, "%s\t%s, %s, %X",name,RN(rt),RN(rs),imm); } void Dis_ori(u32 op, char *out) { @@ -160,9 +160,9 @@ namespace MIPSDis int rs = _RS; const char *name = MIPSGetName(op); if (rs == 0) - sprintf(out, "li\t%s, %i",RN(rt),imm); + sprintf(out, "li\t%s, %X",RN(rt),imm); else - sprintf(out, "%s\t%s, %s, %i",name,RN(rt),RN(rs),imm); + sprintf(out, "%s\t%s, %s, %X",name,RN(rt),RN(rs),imm); } void Dis_IType1(u32 op, char *out) @@ -170,7 +170,7 @@ namespace MIPSDis int imm = (signed short)(op&0xFFFF); int rt = _RT; const char *name = MIPSGetName(op); - sprintf(out, "%s\t%s, %i",name,RN(rt),imm); + sprintf(out, "%s\t%s, %X",name,RN(rt),imm); } void Dis_addi(u32 op, char *out) @@ -179,7 +179,7 @@ namespace MIPSDis int rt = _RT; int rs = _RS; if (rs == 0) - sprintf(out, "li\t%s, %i",RN(rt),imm); + sprintf(out, "li\t%s, %X",RN(rt),imm); else Dis_IType(op,out); } @@ -190,7 +190,7 @@ namespace MIPSDis int rt = _RT; int rs = _RS; const char *name = MIPSGetName(op); - sprintf(out, "%s\t%s, %i(%s)",name,RN(rt),imm,RN(rs)); + sprintf(out, "%s\t%s, %X(%s)",name,RN(rt),imm,RN(rs)); } void Dis_RType2(u32 op, char *out) @@ -237,7 +237,7 @@ namespace MIPSDis name = "rotr"; if (((op & 0x3f) == 6) && sa == 1) name = "rotrv"; - sprintf(out, "%s\t%s, %s, %d",name,RN(rd),RN(rt),sa); + sprintf(out, "%s\t%s, %s, %X",name,RN(rd),RN(rt),sa); } void Dis_VarShiftType(u32 op, char *out) @@ -271,13 +271,13 @@ namespace MIPSDis case 0x0: //ext { int size = _SIZE + 1; - sprintf(out,"%s\t%s, %s, %i, %i",name,RN(Rt),RN(rs),pos,size); + sprintf(out,"%s\t%s, %s, %X, %X",name,RN(Rt),RN(rs),pos,size); } break; case 0x4: // ins { int size = (_SIZE + 1) - pos; - sprintf(out,"%s\t%s, %s, %i, %i",name,RN(Rt),RN(rs),pos,size); + sprintf(out,"%s\t%s, %s, %X, %X",name,RN(Rt),RN(rs),pos,size); } break; } From 0d6d58fed4bc2857cc6eda9de5279adbcfa2baf0 Mon Sep 17 00:00:00 2001 From: "Unknown W. Brackets" Date: Wed, 20 Feb 2013 00:48:05 -0800 Subject: [PATCH 096/347] Add min and max to the x86 jit portfolio. --- Core/MIPS/x86/CompALU.cpp | 80 +++++++++++++++++++++++++++++---------- 1 file changed, 60 insertions(+), 20 deletions(-) diff --git a/Core/MIPS/x86/CompALU.cpp b/Core/MIPS/x86/CompALU.cpp index e7da0341341b..22f4f1681900 100644 --- a/Core/MIPS/x86/CompALU.cpp +++ b/Core/MIPS/x86/CompALU.cpp @@ -17,6 +17,7 @@ #include "Jit.h" #include "RegCache.h" +#include using namespace MIPSAnalyst; #define _RS ((op>>21) & 0x1F) @@ -248,32 +249,71 @@ namespace MIPSComp break; case 42: //R(rd) = (int)R(rs) < (int)R(rt); break; //slt - gpr.Lock(rt, rs, rd); - gpr.BindToRegister(rs, true, true); - gpr.BindToRegister(rd, true, true); - XOR(32, R(EAX), R(EAX)); - CMP(32, gpr.R(rs), gpr.R(rt)); - SETcc(CC_L, R(EAX)); - MOV(32, gpr.R(rd), R(EAX)); - gpr.UnlockAll(); + if (gpr.IsImmediate(rs) && gpr.IsImmediate(rt)) + gpr.SetImmediate32(rd, (s32)gpr.GetImmediate32(rs) < (s32)gpr.GetImmediate32(rt)); + else + { + gpr.Lock(rt, rs, rd); + gpr.BindToRegister(rs, true, false); + gpr.BindToRegister(rd, rd == rt, true); + XOR(32, R(EAX), R(EAX)); + CMP(32, gpr.R(rs), gpr.R(rt)); + SETcc(CC_L, R(EAX)); + MOV(32, gpr.R(rd), R(EAX)); + gpr.UnlockAll(); + } break; case 43: //R(rd) = R(rs) < R(rt); break; //sltu - gpr.Lock(rd, rs, rt); - gpr.BindToRegister(rs, true, true); - gpr.BindToRegister(rd, true, true); - XOR(32, R(EAX), R(EAX)); - CMP(32, gpr.R(rs), gpr.R(rt)); - SETcc(CC_B, R(EAX)); - MOV(32, gpr.R(rd), R(EAX)); - gpr.UnlockAll(); + if (gpr.IsImmediate(rs) && gpr.IsImmediate(rt)) + gpr.SetImmediate32(rd, gpr.GetImmediate32(rs) < gpr.GetImmediate32(rt)); + else + { + gpr.Lock(rd, rs, rt); + gpr.BindToRegister(rs, true, false); + gpr.BindToRegister(rd, rd == rt, true); + XOR(32, R(EAX), R(EAX)); + CMP(32, gpr.R(rs), gpr.R(rt)); + SETcc(CC_B, R(EAX)); + MOV(32, gpr.R(rd), R(EAX)); + gpr.UnlockAll(); + } break; - // case 44: R(rd) = (R(rs) > R(rt)) ? R(rs) : R(rt); break; //max - // CMP(a,b); CMOVLT(a,b) + case 44: //R(rd) = (R(rs) > R(rt)) ? R(rs) : R(rt); break; //max + if (gpr.IsImmediate(rs) && gpr.IsImmediate(rt)) + gpr.SetImmediate32(rd, std::max((s32)gpr.GetImmediate32(rs), (s32)gpr.GetImmediate32(rt))); + else + { + int rsrc = rd == rt ? rs : rt; + gpr.Lock(rd, rs, rt); + gpr.KillImmediate(rsrc, true, false); + gpr.BindToRegister(rd, rd == rs || rd == rt, true); + if (rd != rt && rd != rs) + MOV(32, gpr.R(rd), gpr.R(rs)); + CMP(32, gpr.R(rd), gpr.R(rsrc)); + CMOVcc(32, gpr.RX(rd), gpr.R(rsrc), CC_L); + gpr.UnlockAll(); + } + break; + + case 45: //R(rd) = (R(rs) < R(rt)) ? R(rs) : R(rt); break; //min + if (gpr.IsImmediate(rs) && gpr.IsImmediate(rt)) + gpr.SetImmediate32(rd, std::min((s32)gpr.GetImmediate32(rs), (s32)gpr.GetImmediate32(rt))); + else + { + int rsrc = rd == rt ? rs : rt; + gpr.Lock(rd, rs, rt); + gpr.KillImmediate(rsrc, true, false); + gpr.BindToRegister(rd, rd == rs || rd == rt, true); + if (rd != rt && rd != rs) + MOV(32, gpr.R(rd), gpr.R(rs)); + CMP(32, gpr.R(rd), gpr.R(rsrc)); + CMOVcc(32, gpr.RX(rd), gpr.R(rsrc), CC_G); + gpr.UnlockAll(); + } + break; - // case 45: R(rd) = (R(rs) < R(rt)) ? R(rs) : R(rt); break; //min - // CMP(a,b); CMOVGT(a,b) default: Comp_Generic(op); break; From c3be50acbbdd315f997b0a0b7d6c2aea0b83eea8 Mon Sep 17 00:00:00 2001 From: "Unknown W. Brackets" Date: Wed, 20 Feb 2013 08:52:03 -0800 Subject: [PATCH 097/347] Implement movz/movn in the x86 jit. --- Core/MIPS/x86/CompALU.cpp | 56 ++++++++++++++++++++++++++++++++++++--- 1 file changed, 52 insertions(+), 4 deletions(-) diff --git a/Core/MIPS/x86/CompALU.cpp b/Core/MIPS/x86/CompALU.cpp index 22f4f1681900..5df461450fe6 100644 --- a/Core/MIPS/x86/CompALU.cpp +++ b/Core/MIPS/x86/CompALU.cpp @@ -219,15 +219,63 @@ namespace MIPSComp switch (op & 63) { - //case 10: if (!R(rt)) R(rd) = R(rs); break; //movz - //case 11: if (R(rt)) R(rd) = R(rs); break; //movn + case 10: //if (R(rt) == 0) R(rd) = R(rs); break; //movz + if (rd == rs) + break; + gpr.Lock(rt, rs, rd); + if (!gpr.IsImmediate(rt)) + { + gpr.KillImmediate(rs, true, false); + // Need to load rd in case the condition fails. + gpr.BindToRegister(rd, true, true); + CMP(32, gpr.R(rt), Imm32(0)); + CMOVcc(32, gpr.RX(rd), gpr.R(rs), CC_E); + } + else if (gpr.GetImmediate32(rt) == 0) + { + // Yes, this actually happens. + if (gpr.IsImmediate(rs)) + gpr.SetImmediate32(rd, gpr.GetImmediate32(rs)); + else if (rd != rs) + { + gpr.BindToRegister(rd, false, true); + MOV(32, gpr.R(rd), gpr.R(rs)); + } + } + gpr.UnlockAll(); + break; + + case 11: //if (R(rt) != 0) R(rd) = R(rs); break; //movn + if (rd == rs) + break; + gpr.Lock(rt, rs, rd); + if (!gpr.IsImmediate(rt)) + { + gpr.KillImmediate(rs, true, false); + // Need to load rd in case the condition fails. + gpr.BindToRegister(rd, true, true); + CMP(32, gpr.R(rt), Imm32(0)); + CMOVcc(32, gpr.RX(rd), gpr.R(rs), CC_NE); + } + else if (gpr.GetImmediate32(rt) != 0) + { + if (gpr.IsImmediate(rs)) + gpr.SetImmediate32(rd, gpr.GetImmediate32(rs)); + else if (rd != rs) + { + gpr.BindToRegister(rd, false, true); + MOV(32, gpr.R(rd), gpr.R(rs)); + } + } + gpr.UnlockAll(); + break; - // case 32: //R(rd) = R(rs) + R(rt); break; //add + case 32: //R(rd) = R(rs) + R(rt); break; //add case 33: //R(rd) = R(rs) + R(rt); break; //addu CompTriArith(op, &XEmitter::ADD, &RType3_ImmAdd); break; case 34: //R(rd) = R(rs) - R(rt); break; //sub - case 35: + case 35: //R(rd) = R(rs) - R(rt); break; //subu CompTriArith(op, &XEmitter::SUB, &RType3_ImmSub); break; case 36: //R(rd) = R(rs) & R(rt); break; //and From c8f85ace41a75b1611de2a64f91a5cd1e7b837c8 Mon Sep 17 00:00:00 2001 From: "Unknown W. Brackets" Date: Wed, 20 Feb 2013 09:45:50 -0800 Subject: [PATCH 098/347] Implement bitrev in x86 jit + some imms. --- Core/MIPS/MIPSTables.cpp | 2 +- Core/MIPS/x86/CompALU.cpp | 75 ++++++++++++++++++++++++++++++++++----- 2 files changed, 68 insertions(+), 9 deletions(-) diff --git a/Core/MIPS/MIPSTables.cpp b/Core/MIPS/MIPSTables.cpp index ed6be36317de..4da7c400fd43 100644 --- a/Core/MIPS/MIPSTables.cpp +++ b/Core/MIPS/MIPSTables.cpp @@ -738,7 +738,7 @@ const MIPSInstruction tableALLEGREX0[32] = //111111 {-2}, {-2}, //20 - INSTR("bitrev",&Jit::Comp_Generic, Dis_Allegrex,Int_Allegrex, IN_RT|OUT_RD), + INSTR("bitrev",&Jit::Comp_Allegrex, Dis_Allegrex,Int_Allegrex, IN_RT|OUT_RD), {-2}, {-2}, {-2}, diff --git a/Core/MIPS/x86/CompALU.cpp b/Core/MIPS/x86/CompALU.cpp index 5df461450fe6..97116be8bb71 100644 --- a/Core/MIPS/x86/CompALU.cpp +++ b/Core/MIPS/x86/CompALU.cpp @@ -438,23 +438,82 @@ namespace MIPSComp switch ((op >> 6) & 31) { case 16: // seb // R(rd) = (u32)(s32)(s8)(u8)R(rt); + if (gpr.IsImmediate(rt)) + { + gpr.SetImmediate32(rd, (u32)(s32)(s8)(u8)gpr.GetImmediate32(rt)); + break; + } + + gpr.Lock(rd, rt); + gpr.BindToRegister(rd, rd == rt, true); +#ifdef _M_IX86 + // work around the byte-register addressing problem + if (!gpr.R(rt).IsSimpleReg(EDX) && !gpr.R(rt).IsSimpleReg(ECX)) + { + MOV(32, R(EAX), gpr.R(rt)); + MOVSX(32, 8, gpr.RX(rd), R(EAX)); + } + else +#endif + { + gpr.KillImmediate(rt, true, false); + MOVSX(32, 8, gpr.RX(rd), gpr.R(rt)); + } + gpr.UnlockAll(); + break; + + case 20: //bitrev + if (gpr.IsImmediate(rt)) + { + u32 result = 0; + u32 src = gpr.GetImmediate32(rt); + for (int sa = 31; sa >= 0; --sa) + { + result |= (src & 1) << sa; + src >>= 1; + } + gpr.SetImmediate32(rd, result); + break; + } + gpr.Lock(rd, rt); - gpr.BindToRegister(rd, true, true); - MOV(32, R(EAX), gpr.R(rt)); // work around the byte-register addressing problem - MOVSX(32, 8, gpr.RX(rd), R(EAX)); + gpr.FlushLockX(EDX); + gpr.BindToRegister(rd, rd == rt, true); + MOV(32, R(EDX), gpr.R(rt)); + // This is okay even if rd == rt, since we saved it above. + XOR(32, gpr.R(rd), gpr.R(rd)); + for (int sa = 31; sa >= 0; --sa) + { + MOV(32, R(EAX), R(EDX)); + AND(32, R(EAX), Imm32(1)); + if (sa == 0) + OR(32, gpr.R(rd), R(EAX)); + else + { + SHL(32, R(EAX), Imm8(sa)); + OR(32, gpr.R(rd), R(EAX)); + SHR(32, R(EDX), Imm8(1)); + } + } + gpr.UnlockAllX(); gpr.UnlockAll(); break; - case 24: // seh + case 24: // seh // R(rd) = (u32)(s32)(s16)(u16)R(rt); + if (gpr.IsImmediate(rt)) + { + gpr.SetImmediate32(rd, (u32)(s32)(s16)(u16)gpr.GetImmediate32(rt)); + break; + } + gpr.Lock(rd, rt); - // MOVSX doesn't like immediate arguments, for example, so let's force it to a register. - gpr.BindToRegister(rt, true, false); - gpr.BindToRegister(rd, true, true); + // MOVSX doesn't like immediate arguments, for example. + gpr.KillImmediate(rt, true, false); + gpr.BindToRegister(rd, rd == rt, true); MOVSX(32, 16, gpr.RX(rd), gpr.R(rt)); gpr.UnlockAll(); break; - case 20: //bitrev default: Comp_Generic(op); return; From 3a365fef6493c8bc6bba8322c48ecafe36a5f275 Mon Sep 17 00:00:00 2001 From: "Unknown W. Brackets" Date: Sat, 16 Feb 2013 17:56:27 -0800 Subject: [PATCH 099/347] Protect against some writes to $0. --- Core/MIPS/MIPSInt.cpp | 53 ++++++++++++++++++++++++++++++++++++++++--- 1 file changed, 50 insertions(+), 3 deletions(-) diff --git a/Core/MIPS/MIPSInt.cpp b/Core/MIPS/MIPSInt.cpp index 9fb5d01308be..0e616952dcff 100644 --- a/Core/MIPS/MIPSInt.cpp +++ b/Core/MIPS/MIPSInt.cpp @@ -304,7 +304,6 @@ namespace MIPSInt _dbg_assert_msg_(CPU,0,"Jump in delay slot :("); } - int rs = (op>>21)&0x1f; u32 addr = R(rs); switch (op & 0x3f) @@ -362,13 +361,17 @@ namespace MIPSInt switch (op >> 26) { case 48: // ll - R(rt) = Memory::Read_U32(addr); + if (rt != 0) { + R(rt) = Memory::Read_U32(addr); + } currentMIPS->llBit = 1; break; case 56: // sc if (currentMIPS->llBit) { Memory::Write_U32(R(rt), addr); - R(rt) = 1; + if (rt != 0) { + R(rt) = 1; + } } else { R(rt) = 0; } @@ -388,6 +391,13 @@ namespace MIPSInt int rd = _RD; static bool has_warned = false; + // Don't change $zr. + if (rd == 0) + { + PC += 4; + return; + } + switch (op & 63) { case 10: if (R(rt) == 0) R(rd) = R(rs); break; //movz @@ -533,6 +543,14 @@ namespace MIPSInt { int rs = _RS; int rd = _RD; + + // Don't change $zr. + if (rd == 0) + { + PC += 4; + return; + } + switch (op & 63) { case 22: //clz @@ -675,6 +693,13 @@ namespace MIPSInt int rs = _RS; int rd = _RD; int sa = _FD; + + // Don't change $zr. + if (rd == 0) + { + PC += 4; + return; + } switch (op & 0x3f) { @@ -720,6 +745,14 @@ namespace MIPSInt { int rt = _RT; int rd = _RD; + + // Don't change $zr. + if (rd == 0) + { + PC += 4; + return; + } + switch((op>>6)&31) { case 16: // seb @@ -756,6 +789,13 @@ namespace MIPSInt int rt = _RT; int rd = _RD; + // Don't change $zr. + if (rd == 0) + { + PC += 4; + return; + } + switch (op & 0x3ff) { case 0xA0: //wsbh @@ -777,6 +817,13 @@ namespace MIPSInt int rt = _RT; int pos = _POS; + // Don't change $zr. + if (rt == 0) + { + PC += 4; + return; + } + switch (op & 0x3f) { case 0x0: //ext From 2bdc9dc49185c345d6cb6a87b8497d220b05ed21 Mon Sep 17 00:00:00 2001 From: "Unknown W. Brackets" Date: Mon, 18 Feb 2013 10:27:15 -0800 Subject: [PATCH 100/347] Reset llBit on thread switch. Never actually seen ll used, though... but this way it should work as advertized, as long as a syscall doesn't happen in between... --- Core/HLE/sceKernelThread.cpp | 3 +++ Core/MIPS/MIPSInt.cpp | 2 +- 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/Core/HLE/sceKernelThread.cpp b/Core/HLE/sceKernelThread.cpp index 52aa4981c564..dea4f8a6dd20 100644 --- a/Core/HLE/sceKernelThread.cpp +++ b/Core/HLE/sceKernelThread.cpp @@ -1034,6 +1034,9 @@ void __KernelLoadContext(ThreadContext *ctx) currentMIPS->fcr0 = ctx->fcr0; currentMIPS->fcr31 = ctx->fcr31; currentMIPS->fpcond = ctx->fpcond; + + // Reset the llBit, the other thread may have touched memory. + currentMIPS->llBit = 0; } u32 __KernelResumeThreadFromWait(SceUID threadID) diff --git a/Core/MIPS/MIPSInt.cpp b/Core/MIPS/MIPSInt.cpp index 0e616952dcff..233f46128e97 100644 --- a/Core/MIPS/MIPSInt.cpp +++ b/Core/MIPS/MIPSInt.cpp @@ -372,7 +372,7 @@ namespace MIPSInt if (rt != 0) { R(rt) = 1; } - } else { + } else if (rt != 0) { R(rt) = 0; } break; From 7b612cf28d9ff28fa9a5151e33548046b615492e Mon Sep 17 00:00:00 2001 From: "Unknown W. Brackets" Date: Wed, 20 Feb 2013 12:16:57 -0800 Subject: [PATCH 101/347] Don't need this with the imm code path. --- Core/MIPS/x86/CompALU.cpp | 2 -- 1 file changed, 2 deletions(-) diff --git a/Core/MIPS/x86/CompALU.cpp b/Core/MIPS/x86/CompALU.cpp index 97116be8bb71..266e03b1ebcc 100644 --- a/Core/MIPS/x86/CompALU.cpp +++ b/Core/MIPS/x86/CompALU.cpp @@ -507,8 +507,6 @@ namespace MIPSComp } gpr.Lock(rd, rt); - // MOVSX doesn't like immediate arguments, for example. - gpr.KillImmediate(rt, true, false); gpr.BindToRegister(rd, rd == rt, true); MOVSX(32, 16, gpr.RX(rd), gpr.R(rt)); gpr.UnlockAll(); From 282e5be93ed38658d9baffda0d597d44b07bcc3c Mon Sep 17 00:00:00 2001 From: StorMyu Date: Wed, 20 Feb 2013 22:10:54 +0100 Subject: [PATCH 102/347] Update Core/MIPS/MIPSDis.cpp --- Core/MIPS/MIPSDis.cpp | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/Core/MIPS/MIPSDis.cpp b/Core/MIPS/MIPSDis.cpp index 89469f56bf34..638f84ecdfa6 100644 --- a/Core/MIPS/MIPSDis.cpp +++ b/Core/MIPS/MIPSDis.cpp @@ -76,7 +76,7 @@ namespace MIPSDis int ft = _FT; int rs = _RS; const char *name = MIPSGetName(op); - sprintf(out, "%s\t%s, %X(%s)",name,FN(ft),offset,RN(rs)); + sprintf(out, "%s\t%s, 0x%X(%s)",name,FN(ft),offset,RN(rs)); } void Dis_FPUComp(u32 op, char *out) { @@ -151,7 +151,7 @@ namespace MIPSDis int rt = _RT; int rs = _RS; const char *name = MIPSGetName(op); - sprintf(out, "%s\t%s, %s, %X",name,RN(rt),RN(rs),imm); + sprintf(out, "%s\t%s, %s, 0x%X",name,RN(rt),RN(rs),imm); } void Dis_ori(u32 op, char *out) { @@ -160,9 +160,9 @@ namespace MIPSDis int rs = _RS; const char *name = MIPSGetName(op); if (rs == 0) - sprintf(out, "li\t%s, %X",RN(rt),imm); + sprintf(out, "li\t%s, 0x%X",RN(rt),imm); else - sprintf(out, "%s\t%s, %s, %X",name,RN(rt),RN(rs),imm); + sprintf(out, "%s\t%s, %s, 0x%X",name,RN(rt),RN(rs),imm); } void Dis_IType1(u32 op, char *out) @@ -170,7 +170,7 @@ namespace MIPSDis int imm = (signed short)(op&0xFFFF); int rt = _RT; const char *name = MIPSGetName(op); - sprintf(out, "%s\t%s, %X",name,RN(rt),imm); + sprintf(out, "%s\t%s, 0x%X",name,RN(rt),imm); } void Dis_addi(u32 op, char *out) @@ -179,7 +179,7 @@ namespace MIPSDis int rt = _RT; int rs = _RS; if (rs == 0) - sprintf(out, "li\t%s, %X",RN(rt),imm); + sprintf(out, "li\t%s, 0x%X",RN(rt),imm); else Dis_IType(op,out); } @@ -190,7 +190,7 @@ namespace MIPSDis int rt = _RT; int rs = _RS; const char *name = MIPSGetName(op); - sprintf(out, "%s\t%s, %X(%s)",name,RN(rt),imm,RN(rs)); + sprintf(out, "%s\t%s, 0x%X(%s)",name,RN(rt),imm,RN(rs)); } void Dis_RType2(u32 op, char *out) @@ -237,7 +237,7 @@ namespace MIPSDis name = "rotr"; if (((op & 0x3f) == 6) && sa == 1) name = "rotrv"; - sprintf(out, "%s\t%s, %s, %X",name,RN(rd),RN(rt),sa); + sprintf(out, "%s\t%s, %s, 0x%X",name,RN(rd),RN(rt),sa); } void Dis_VarShiftType(u32 op, char *out) @@ -271,13 +271,13 @@ namespace MIPSDis case 0x0: //ext { int size = _SIZE + 1; - sprintf(out,"%s\t%s, %s, %X, %X",name,RN(Rt),RN(rs),pos,size); + sprintf(out,"%s\t%s, %s, 0x%X, 0x%X",name,RN(Rt),RN(rs),pos,size); } break; case 0x4: // ins { int size = (_SIZE + 1) - pos; - sprintf(out,"%s\t%s, %s, %X, %X",name,RN(Rt),RN(rs),pos,size); + sprintf(out,"%s\t%s, %s, 0x%X, 0x%X",name,RN(Rt),RN(rs),pos,size); } break; } From 958d95a0299d57ffb1fbb180d8bf28f2cbb1a9c2 Mon Sep 17 00:00:00 2001 From: "Unknown W. Brackets" Date: Wed, 20 Feb 2013 13:42:38 -0800 Subject: [PATCH 103/347] Make bitrev use less instructions in the x86 jit. Much less. --- Core/MIPS/x86/CompALU.cpp | 70 ++++++++++++++++++++++++--------------- 1 file changed, 44 insertions(+), 26 deletions(-) diff --git a/Core/MIPS/x86/CompALU.cpp b/Core/MIPS/x86/CompALU.cpp index 266e03b1ebcc..3a7f31b2cfa0 100644 --- a/Core/MIPS/x86/CompALU.cpp +++ b/Core/MIPS/x86/CompALU.cpp @@ -465,37 +465,55 @@ namespace MIPSComp case 20: //bitrev if (gpr.IsImmediate(rt)) { - u32 result = 0; - u32 src = gpr.GetImmediate32(rt); - for (int sa = 31; sa >= 0; --sa) - { - result |= (src & 1) << sa; - src >>= 1; - } - gpr.SetImmediate32(rd, result); + // http://graphics.stanford.edu/~seander/bithacks.html#ReverseParallel + u32 v = gpr.GetImmediate32(rt); + // swap odd and even bits + v = ((v >> 1) & 0x55555555) | ((v & 0x55555555) << 1); + // swap consecutive pairs + v = ((v >> 2) & 0x33333333) | ((v & 0x33333333) << 2); + // swap nibbles ... + v = ((v >> 4) & 0x0F0F0F0F) | ((v & 0x0F0F0F0F) << 4); + // swap bytes + v = ((v >> 8) & 0x00FF00FF) | ((v & 0x00FF00FF) << 8); + // swap 2-byte long pairs + v = ( v >> 16 ) | ( v << 16); + gpr.SetImmediate32(rd, v); break; } gpr.Lock(rd, rt); - gpr.FlushLockX(EDX); gpr.BindToRegister(rd, rd == rt, true); - MOV(32, R(EDX), gpr.R(rt)); - // This is okay even if rd == rt, since we saved it above. - XOR(32, gpr.R(rd), gpr.R(rd)); - for (int sa = 31; sa >= 0; --sa) - { - MOV(32, R(EAX), R(EDX)); - AND(32, R(EAX), Imm32(1)); - if (sa == 0) - OR(32, gpr.R(rd), R(EAX)); - else - { - SHL(32, R(EAX), Imm8(sa)); - OR(32, gpr.R(rd), R(EAX)); - SHR(32, R(EDX), Imm8(1)); - } - } - gpr.UnlockAllX(); + if (rd != rt) + MOV(32, gpr.R(rd), gpr.R(rt)); + + LEA(32, EAX, MScaled(gpr.RX(rd), 2, 0)); + SHR(32, gpr.R(rd), Imm8(1)); + XOR(32, gpr.R(rd), R(EAX)); + AND(32, gpr.R(rd), Imm32(0x55555555)); + XOR(32, gpr.R(rd), R(EAX)); + + LEA(32, EAX, MScaled(gpr.RX(rd), 4, 0)); + SHR(32, gpr.R(rd), Imm8(2)); + XOR(32, gpr.R(rd), R(EAX)); + AND(32, gpr.R(rd), Imm32(0x33333333)); + XOR(32, gpr.R(rd), R(EAX)); + + MOV(32, R(EAX), gpr.R(rd)); + SHL(32, R(EAX), Imm8(4)); + SHR(32, gpr.R(rd), Imm8(4)); + XOR(32, gpr.R(rd), R(EAX)); + AND(32, gpr.R(rd), Imm32(0x0F0F0F0F)); + XOR(32, gpr.R(rd), R(EAX)); + + MOV(32, R(EAX), gpr.R(rd)); + SHL(32, R(EAX), Imm8(8)); + SHR(32, gpr.R(rd), Imm8(8)); + XOR(32, gpr.R(rd), R(EAX)); + AND(32, gpr.R(rd), Imm32(0x00FF00FF)); + XOR(32, gpr.R(rd), R(EAX)); + + ROL(32, gpr.R(rd), Imm8(16)); + gpr.UnlockAll(); break; From 690ebb2e5879b1ce845ea9687936b4420993c695 Mon Sep 17 00:00:00 2001 From: Henrik Rydgard Date: Wed, 20 Feb 2013 22:49:05 +0100 Subject: [PATCH 104/347] Proper fix for the annoying through-mode depth issues. --- GPU/GLES/VertexDecoder.h | 13 ++----------- 1 file changed, 2 insertions(+), 11 deletions(-) diff --git a/GPU/GLES/VertexDecoder.h b/GPU/GLES/VertexDecoder.h index 2fbaddce51ef..3bebacd81c9e 100644 --- a/GPU/GLES/VertexDecoder.h +++ b/GPU/GLES/VertexDecoder.h @@ -194,18 +194,9 @@ class VertexReader { const float *f = (const float *)(data_ + decFmt_.posoff); memcpy(pos, f, 12); - - // pos[2] is an integer value clamped between 0 and 65535 if (isThrough()) { - if (pos[2] < 0.f && pos[2] != 0.0f) { // make sure we get negative zero - pos[2] = 0.f; - } else if (pos[2] > 65535.f) { - pos[2] = 65535.f; - } else { - // 2D positions are always integer values: truncate float value - pos[2] = (int) pos[2]; - } - pos[2] /= 65535.0f; + // Integer value passed in a float. Wraps and all, required for Monster Hunter. + pos[2] = (float)((u16)pos[2]) * (1.0f / 65535.0f); } } break; From 59a046c4e7ade916c0a3b58bc2d66bd8361fe567 Mon Sep 17 00:00:00 2001 From: raven02 Date: Thu, 21 Feb 2013 07:15:37 +0800 Subject: [PATCH 105/347] Better centering of OSK title --- Core/Dialog/PSPOskDialog.cpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/Core/Dialog/PSPOskDialog.cpp b/Core/Dialog/PSPOskDialog.cpp index 519291130412..270d095cf9bc 100644 --- a/Core/Dialog/PSPOskDialog.cpp +++ b/Core/Dialog/PSPOskDialog.cpp @@ -108,9 +108,9 @@ void PSPOskDialog::RenderKeyboard() if (limit <= 0) limit = 16; - const float keyboardLeftSide = (480.0f - (23.0f * KEYSPERROW)) / 2.0f; - float previewLeftSide = (480.0f - (15.0f * limit)) / 2.0f; - float title = (480.0f - (7.0f * limit)) / 2.0f; + const float keyboardLeftSide = (480.0f - (24.0f * KEYSPERROW)) / 2.0f; + float previewLeftSide = (480.0f - (16.0f * limit)) / 2.0f; + float title = (480.0f - limit) / 2.0f; PPGeDrawText(oskDesc.c_str(), title , 20, PPGE_ALIGN_CENTER, 0.5f, CalcFadedColor(0xFFFFFFFF)); for (u32 i = 0; i < limit; ++i) From 8e88cc37d240098c6d0caec0b2d91941558e7265 Mon Sep 17 00:00:00 2001 From: Sacha Date: Thu, 21 Feb 2013 15:59:02 +1000 Subject: [PATCH 106/347] Fix crash on Return to Menu in Symbian. We don't want to free the executable code (actually a Chunk+Heap) using same method we use to free memory pages (delete). This would be the same situation on jailbroken iOS and WP. Now the JIT code is always allocated and never freed on Symbian. --- Common/ArmEmitter.h | 2 ++ Common/MemoryUtil.cpp | 5 ++++- 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/Common/ArmEmitter.h b/Common/ArmEmitter.h index 636a9a646b82..e050cd53f4a6 100644 --- a/Common/ArmEmitter.h +++ b/Common/ArmEmitter.h @@ -552,7 +552,9 @@ class ARMXCodeBlock : public ARMXEmitter // Call this when shutting down. Don't rely on the destructor, even though it'll do the job. void FreeCodeSpace() { +#ifndef __SYMBIAN32__ FreeMemoryPages(region, region_size); +#endif region = NULL; region_size = 0; } diff --git a/Common/MemoryUtil.cpp b/Common/MemoryUtil.cpp index 6b0d089b7ba8..59dadba5fd25 100644 --- a/Common/MemoryUtil.cpp +++ b/Common/MemoryUtil.cpp @@ -62,6 +62,7 @@ void* AllocateExecutableMemory(size_t size, bool low) #elif defined(__SYMBIAN32__) //This function may be called more than once, and we want to create only one big //memory chunk for all the executable code for the JIT + void* ptr; if( g_code_chunk == NULL && g_code_heap == NULL) { TInt minsize = SYMBIAN_CODECHUNK_SIZE; @@ -69,8 +70,10 @@ void* AllocateExecutableMemory(size_t size, bool low) g_code_chunk = new RChunk(); g_code_chunk->CreateLocalCode(minsize, maxsize); g_code_heap = UserHeap::ChunkHeap(*g_code_chunk, minsize, 1, maxsize); + ptr = (void*) g_code_heap->Alloc( size ); } - void* ptr = (void*) g_code_heap->Alloc( size ); + else + ptr = g_code_heap->Base(); #else static char *map_hint = 0; #if defined(__x86_64__) && !defined(MAP_32BIT) From e085c3ee760d1321545e9d8d010092e3ed572003 Mon Sep 17 00:00:00 2001 From: "Unknown W. Brackets" Date: Thu, 21 Feb 2013 01:05:37 -0800 Subject: [PATCH 107/347] Fix crash on quit / pause not working. --- Core/Core.cpp | 2 +- Core/HLE/sceDisplay.cpp | 7 +++++-- headless/Headless.cpp | 2 +- 3 files changed, 7 insertions(+), 4 deletions(-) diff --git a/Core/Core.cpp b/Core/Core.cpp index 252800ebac57..fefd4e04d386 100644 --- a/Core/Core.cpp +++ b/Core/Core.cpp @@ -72,8 +72,8 @@ void Core_RunLoop() if (coreState == CORE_NEXTFRAME) { #ifdef _WIN32 - GL_SwapBuffers(); coreState = CORE_RUNNING; + GL_SwapBuffers(); #endif } } diff --git a/Core/HLE/sceDisplay.cpp b/Core/HLE/sceDisplay.cpp index 81d264e59003..152b322fed4b 100644 --- a/Core/HLE/sceDisplay.cpp +++ b/Core/HLE/sceDisplay.cpp @@ -403,12 +403,15 @@ void hleEnterVblank(u64 userdata, int cyclesLate) { if (skipFrame) { gstate_c.skipDrawReason |= SKIPDRAW_SKIPFRAME; numSkippedFrames++; - } else { + } else { numSkippedFrames = 0; } if (!skipFlip) { - coreState = CORE_NEXTFRAME; + // Might've just quit / been paused. + if (coreState == CORE_RUNNING) { + coreState = CORE_NEXTFRAME; + } CoreTiming::ScheduleEvent(0 - cyclesLate, afterFlipEvent, 0); gpu->CopyDisplayToOutput(); diff --git a/headless/Headless.cpp b/headless/Headless.cpp index 0eb3f0d51def..37e616bf77f6 100644 --- a/headless/Headless.cpp +++ b/headless/Headless.cpp @@ -197,8 +197,8 @@ int main(int argc, const char* argv[]) // If we were rendering, this might be a nice time to do something about it. if (coreState == CORE_NEXTFRAME) { - headlessHost->SwapBuffers(); coreState = CORE_RUNNING; + headlessHost->SwapBuffers(); } } From 2db368c29a1769bd340694419acede492348bd47 Mon Sep 17 00:00:00 2001 From: "Unknown W. Brackets" Date: Wed, 20 Feb 2013 20:44:12 -0800 Subject: [PATCH 108/347] Add more imm handling for shifts in x86 jit. This is actually hit, and propagates more imms through. --- Core/MIPS/x86/CompALU.cpp | 81 ++++++++++++++++++++++++++++++--------- Core/MIPS/x86/Jit.h | 4 +- 2 files changed, 65 insertions(+), 20 deletions(-) diff --git a/Core/MIPS/x86/CompALU.cpp b/Core/MIPS/x86/CompALU.cpp index 3a7f31b2cfa0..a3e8c955a2cb 100644 --- a/Core/MIPS/x86/CompALU.cpp +++ b/Core/MIPS/x86/CompALU.cpp @@ -368,13 +368,40 @@ namespace MIPSComp } } + static u32 ShiftType_ImmLogicalLeft(const u32 a, const u32 b) + { + return a << (b & 0x1f); + } + + static u32 ShiftType_ImmLogicalRight(const u32 a, const u32 b) + { + return a >> (b & 0x1f); + } + + static u32 ShiftType_ImmArithRight(const u32 a, const u32 b) + { + return ((s32) a) >> (b & 0x1f); + } + + static u32 ShiftType_ImmRotateRight(const u32 a, const u32 b) + { + const s8 sa = b & 0x1f; + return (a >> sa) | (a << (32 - sa)); + } - void Jit::CompShiftImm(u32 op, void (XEmitter::*shift)(int, OpArg, OpArg)) + void Jit::CompShiftImm(u32 op, void (XEmitter::*shift)(int, OpArg, OpArg), u32 (*doImm)(const u32, const u32)) { int rd = _RD; int rt = _RT; - gpr.Lock(rd, rt); int sa = _SA; + + if (doImm && gpr.IsImmediate(rt)) + { + gpr.SetImmediate32(rd, doImm(gpr.GetImmediate32(rt), sa)); + return; + } + + gpr.Lock(rd, rt); gpr.BindToRegister(rd, rd == rt, true); if (rd != rt) MOV(32, gpr.R(rd), gpr.R(rt)); @@ -383,38 +410,56 @@ namespace MIPSComp } // "over-shifts" work the same as on x86 - only bottom 5 bits are used to get the shift value - void Jit::CompShiftVar(u32 op, void (XEmitter::*shift)(int, OpArg, OpArg)) + void Jit::CompShiftVar(u32 op, void (XEmitter::*shift)(int, OpArg, OpArg), u32 (*doImm)(const u32, const u32)) { int rd = _RD; int rt = _RT; int rs = _RS; - gpr.FlushLockX(ECX); + + if (doImm && gpr.IsImmediate(rs) && gpr.IsImmediate(rt)) + { + gpr.SetImmediate32(rd, doImm(gpr.GetImmediate32(rt), gpr.GetImmediate32(rs))); + return; + } + gpr.Lock(rd, rt, rs); - gpr.BindToRegister(rd, rd == rt || rd == rs, true); - MOV(32, R(ECX), gpr.R(rs)); // Only ECX can be used for variable shifts. - AND(32, R(ECX), Imm32(0x1f)); - if (rd != rt) - MOV(32, gpr.R(rd), gpr.R(rt)); - (this->*shift)(32, gpr.R(rd), R(ECX)); + if (gpr.IsImmediate(rs)) + { + int sa = gpr.GetImmediate32(rs); + gpr.BindToRegister(rd, rd == rt, true); + if (rd != rt) + MOV(32, gpr.R(rd), gpr.R(rt)); + (this->*shift)(32, gpr.R(rd), Imm8(sa)); + } + else + { + gpr.FlushLockX(ECX); + gpr.BindToRegister(rd, rd == rt || rd == rs, true); + MOV(32, R(ECX), gpr.R(rs)); // Only ECX can be used for variable shifts. + AND(32, R(ECX), Imm32(0x1f)); + if (rd != rt) + MOV(32, gpr.R(rd), gpr.R(rt)); + (this->*shift)(32, gpr.R(rd), R(ECX)); + gpr.UnlockAllX(); + } gpr.UnlockAll(); - gpr.UnlockAllX(); } void Jit::Comp_ShiftType(u32 op) { - CONDITIONAL_DISABLE + CONDITIONAL_DISABLE; int rs = _RS; int fd = _FD; // WARNIGN : ROTR switch (op & 0x3f) { - case 0: CompShiftImm(op, &XEmitter::SHL); break; - case 2: CompShiftImm(op, rs == 1 ? &XEmitter::ROR : &XEmitter::SHR); break; // srl, rotr - case 3: CompShiftImm(op, &XEmitter::SAR); break; // sra + case 0: CompShiftImm(op, &XEmitter::SHL, &ShiftType_ImmLogicalLeft); break; + case 2: CompShiftImm(op, rs == 1 ? &XEmitter::ROR : &XEmitter::SHR, rs == 1 ? &ShiftType_ImmRotateRight : &ShiftType_ImmLogicalRight); break; // srl, rotr + case 3: CompShiftImm(op, &XEmitter::SAR, &ShiftType_ImmArithRight); break; // sra - case 4: CompShiftVar(op, &XEmitter::SHL); break; //sllv - case 6: CompShiftVar(op, fd == 1 ? &XEmitter::ROR : &XEmitter::SHR); break; //srlv - case 7: CompShiftVar(op, &XEmitter::SAR); break; //srav + case 4: CompShiftVar(op, &XEmitter::SHL, &ShiftType_ImmLogicalLeft); break; //sllv + case 6: CompShiftVar(op, fd == 1 ? &XEmitter::ROR : &XEmitter::SHR, fd == 1 ? &ShiftType_ImmRotateRight : &ShiftType_ImmLogicalRight); break; //srlv + case 7: CompShiftVar(op, &XEmitter::SAR, &ShiftType_ImmArithRight); break; //srav default: Comp_Generic(op); diff --git a/Core/MIPS/x86/Jit.h b/Core/MIPS/x86/Jit.h index 54c443b53a8f..2d3acba3127e 100644 --- a/Core/MIPS/x86/Jit.h +++ b/Core/MIPS/x86/Jit.h @@ -241,8 +241,8 @@ class Jit : public Gen::XCodeBlock // Utilities to reduce duplicated code void CompImmLogic(u32 op, void (XEmitter::*arith)(int, const OpArg &, const OpArg &)); void CompTriArith(u32 op, void (XEmitter::*arith)(int, const OpArg &, const OpArg &), u32 (*doImm)(const u32, const u32)); - void CompShiftImm(u32 op, void (XEmitter::*shift)(int, OpArg, OpArg)); - void CompShiftVar(u32 op, void (XEmitter::*shift)(int, OpArg, OpArg)); + void CompShiftImm(u32 op, void (XEmitter::*shift)(int, OpArg, OpArg), u32 (*doImm)(const u32, const u32)); + void CompShiftVar(u32 op, void (XEmitter::*shift)(int, OpArg, OpArg), u32 (*doImm)(const u32, const u32)); void CompITypeMemRead(u32 op, u32 bits, void (XEmitter::*mov)(int, int, X64Reg, OpArg), void *safeFunc); void CompITypeMemWrite(u32 op, u32 bits, void *safeFunc); From 9e479b4391d034a80d10f15d02606bd4437564a1 Mon Sep 17 00:00:00 2001 From: "Unknown W. Brackets" Date: Wed, 20 Feb 2013 21:04:05 -0800 Subject: [PATCH 109/347] Optimize addi/addiu to just LEA when possible. --- Core/MIPS/x86/CompALU.cpp | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/Core/MIPS/x86/CompALU.cpp b/Core/MIPS/x86/CompALU.cpp index a3e8c955a2cb..5935af9be773 100644 --- a/Core/MIPS/x86/CompALU.cpp +++ b/Core/MIPS/x86/CompALU.cpp @@ -78,11 +78,14 @@ namespace MIPSComp gpr.Lock(rt, rs); gpr.BindToRegister(rt, rt == rs, true); - if (rt != rs) + if (rt == rs || gpr.R(rs).IsSimpleReg()) + LEA(32, gpr.RX(rt), MDisp(gpr.RX(rs), simm)); + else + { MOV(32, gpr.R(rt), gpr.R(rs)); - if (simm != 0) - ADD(32, gpr.R(rt), Imm32((u32)(s32)simm)); - // TODO: Can also do LEA if both operands happen to be in registers. + if (simm != 0) + ADD(32, gpr.R(rt), Imm32((u32)(s32)simm)); + } gpr.UnlockAll(); } break; From abde404c0040178b0a4b7e196dd63bae651a748a Mon Sep 17 00:00:00 2001 From: "Unknown W. Brackets" Date: Wed, 20 Feb 2013 21:21:39 -0800 Subject: [PATCH 110/347] Optimize out some addu/etc. calls against imms. --- Core/MIPS/x86/CompALU.cpp | 32 ++++++++++++++++++++++++++------ 1 file changed, 26 insertions(+), 6 deletions(-) diff --git a/Core/MIPS/x86/CompALU.cpp b/Core/MIPS/x86/CompALU.cpp index 5935af9be773..277a58018c4c 100644 --- a/Core/MIPS/x86/CompALU.cpp +++ b/Core/MIPS/x86/CompALU.cpp @@ -184,17 +184,37 @@ namespace MIPSComp return; } + // Act like zero was used if the operand is equivalent. This happens. + if (gpr.IsImmediate(rs) && gpr.GetImmediate32(rs) == 0) + rs = 0; + if (gpr.IsImmediate(rt) && gpr.GetImmediate32(rt) == 0) + rt = 0; + gpr.Lock(rt, rs, rd); - // Optimize out + 0 and | 0. - if ((doImm == &RType3_ImmAdd || doImm == &RType3_ImmOr) && (rs == 0 || rt == 0)) + // Optimize out operations against 0... and is the only one that isn't a MOV. + if (rt == 0 || (rs == 0 && doImm != &RType3_ImmSub)) { - int rsource = rt == 0 ? rs : rt; - if (rsource != rd) + if (doImm == &RType3_ImmAnd) + gpr.SetImmediate32(rd, 0); + else { - gpr.BindToRegister(rd, false, true); - MOV(32, gpr.R(rd), gpr.R(rsource)); + int rsource = rt == 0 ? rs : rt; + if (rsource != rd) + { + gpr.BindToRegister(rd, false, true); + MOV(32, gpr.R(rd), gpr.R(rsource)); + } } } + else if (gpr.IsImmediate(rt)) + { + // No temporary needed. + u32 rtval = gpr.GetImmediate32(rt); + gpr.BindToRegister(rd, rs == rd, true); + if (rs != rd) + MOV(32, gpr.R(rd), gpr.R(rs)); + (this->*arith)(32, gpr.R(rd), Imm32(rtval)); + } else { // Use EAX as a temporary if we'd overwrite it. From dede852c0399a4be6c66bd0a7a234059cc12df95 Mon Sep 17 00:00:00 2001 From: "Unknown W. Brackets" Date: Wed, 20 Feb 2013 21:29:50 -0800 Subject: [PATCH 111/347] Optimize out slti in the x86 jit. I'm kinda surprised this actually happens... --- Core/MIPS/x86/CompALU.cpp | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/Core/MIPS/x86/CompALU.cpp b/Core/MIPS/x86/CompALU.cpp index 277a58018c4c..e78ba370a95b 100644 --- a/Core/MIPS/x86/CompALU.cpp +++ b/Core/MIPS/x86/CompALU.cpp @@ -91,6 +91,13 @@ namespace MIPSComp break; case 10: // R(rt) = (s32)R(rs) < simm; break; //slti + // There's a mips compiler out there asking it already knows the answer to... + if (gpr.IsImmediate(rs)) + { + gpr.SetImmediate32(rt, (s32)gpr.GetImmediate32(rs) < simm); + break; + } + gpr.Lock(rt, rs); gpr.BindToRegister(rs, true, false); gpr.BindToRegister(rt, rt == rs, true); @@ -102,6 +109,12 @@ namespace MIPSComp break; case 11: // R(rt) = R(rs) < uimm; break; //sltiu + if (gpr.IsImmediate(rs)) + { + gpr.SetImmediate32(rt, gpr.GetImmediate32(rs) < uimm); + break; + } + gpr.Lock(rt, rs); gpr.BindToRegister(rs, true, false); gpr.BindToRegister(rt, rt == rs, true); From 08923c092b696b9df5b416370b8f166e374524d1 Mon Sep 17 00:00:00 2001 From: "Unknown W. Brackets" Date: Thu, 21 Feb 2013 00:00:30 -0800 Subject: [PATCH 112/347] Implement ins and ext in the x86 jit. --- Core/MIPS/MIPSInt.cpp | 2 +- Core/MIPS/x86/CompALU.cpp | 66 ++++++++++++++++++++++++++++++++++-- Core/MIPS/x86/CompBranch.cpp | 2 +- 3 files changed, 66 insertions(+), 4 deletions(-) diff --git a/Core/MIPS/MIPSInt.cpp b/Core/MIPS/MIPSInt.cpp index 233f46128e97..479cff313288 100644 --- a/Core/MIPS/MIPSInt.cpp +++ b/Core/MIPS/MIPSInt.cpp @@ -832,7 +832,7 @@ namespace MIPSInt R(rt) = (R(rs) >> pos) & ((1<> (32 - size); + + // Don't change $zr. + if (rt == 0) + return; + + switch (op & 0x3f) + { + case 0x0: //ext + if (gpr.IsImmediate(rs)) + { + gpr.SetImmediate32(rt, (gpr.GetImmediate32(rs) >> pos) & mask); + return; + } + + gpr.Lock(rs, rt); + gpr.BindToRegister(rt, rs == rt, true); + if (rs != rt) + MOV(32, gpr.R(rt), gpr.R(rs)); + SHR(32, gpr.R(rt), Imm8(pos)); + AND(32, gpr.R(rt), Imm32(mask)); + gpr.UnlockAll(); + break; + + case 0x4: //ins + { + u32 sourcemask = mask >> pos; + u32 destmask = ~(sourcemask << pos); + if (gpr.IsImmediate(rs)) + { + u32 inserted = (gpr.GetImmediate32(rs) & sourcemask) << pos; + if (gpr.IsImmediate(rt)) + { + gpr.SetImmediate32(rt, (gpr.GetImmediate32(rt) & destmask) | inserted); + return; + } + + gpr.Lock(rs, rt); + gpr.BindToRegister(rt, true, true); + AND(32, gpr.R(rt), Imm32(destmask)); + OR(32, gpr.R(rt), Imm32(inserted)); + gpr.UnlockAll(); + } + else + { + gpr.Lock(rs, rt); + gpr.BindToRegister(rt, true, true); + MOV(32, R(EAX), gpr.R(rs)); + AND(32, R(EAX), Imm32(sourcemask)); + SHL(32, R(EAX), Imm8(pos)); + AND(32, gpr.R(rt), Imm32(destmask)); + OR(32, gpr.R(rt), R(EAX)); + gpr.UnlockAll(); + } + } + break; + } } @@ -620,6 +681,7 @@ namespace MIPSComp void Jit::Comp_MulDivType(u32 op) { + CONDITIONAL_DISABLE; int rt = _RT; int rs = _RS; int rd = _RD; diff --git a/Core/MIPS/x86/CompBranch.cpp b/Core/MIPS/x86/CompBranch.cpp index 1ac36e07999d..d5c76463aab8 100644 --- a/Core/MIPS/x86/CompBranch.cpp +++ b/Core/MIPS/x86/CompBranch.cpp @@ -144,7 +144,7 @@ void Jit::BranchRSRTComp(u32 op, Gen::CCFlags cc, bool likely) if (rt == 0) { - gpr.KillImmediate(rs, true, true); + gpr.KillImmediate(rs, true, false); CMP(32, gpr.R(rs), Imm32(0)); } else From 313ffdb495aae6fb658d7ef9f23767670c397814 Mon Sep 17 00:00:00 2001 From: "Unknown W. Brackets" Date: Thu, 21 Feb 2013 00:52:37 -0800 Subject: [PATCH 113/347] Add a stub for clz/clo in x86 jit. --- Core/MIPS/ARM/ArmCompALU.cpp | 7 ++++++- Core/MIPS/ARM/ArmJit.h | 1 + Core/MIPS/MIPSTables.cpp | 4 ++-- Core/MIPS/x86/CompALU.cpp | 23 +++++++++++++++++++++++ Core/MIPS/x86/Jit.h | 1 + 5 files changed, 33 insertions(+), 3 deletions(-) diff --git a/Core/MIPS/ARM/ArmCompALU.cpp b/Core/MIPS/ARM/ArmCompALU.cpp index 9fdc796c2d19..82ff108c240d 100644 --- a/Core/MIPS/ARM/ArmCompALU.cpp +++ b/Core/MIPS/ARM/ArmCompALU.cpp @@ -145,7 +145,12 @@ namespace MIPSComp break; } } - + + void Jit::Comp_RType2(u32 op) + { + DISABLE; + } + void Jit::Comp_RType3(u32 op) { int rt = _RT; diff --git a/Core/MIPS/ARM/ArmJit.h b/Core/MIPS/ARM/ArmJit.h index 194c5571398b..3cd6673991d9 100644 --- a/Core/MIPS/ARM/ArmJit.h +++ b/Core/MIPS/ARM/ArmJit.h @@ -94,6 +94,7 @@ class Jit : public ArmGen::ARMXCodeBlock void Comp_Break(u32 op); void Comp_IType(u32 op); + void Comp_RType2(u32 op); void Comp_RType3(u32 op); void Comp_ShiftType(u32 op); void Comp_Allegrex(u32 op); diff --git a/Core/MIPS/MIPSTables.cpp b/Core/MIPS/MIPSTables.cpp index 4da7c400fd43..2d6ec44494d6 100644 --- a/Core/MIPS/MIPSTables.cpp +++ b/Core/MIPS/MIPSTables.cpp @@ -194,8 +194,8 @@ const MIPSInstruction tableSpecial[64] = /// 000000 ...... ...... .......... xxx INSTR("mtlo", &Jit::Comp_MulDivType, Dis_ToHiloTransfer, Int_MulDivType, IN_RS|OUT_OTHER), {-2}, {-2}, - INSTR("clz", &Jit::Comp_Generic, Dis_RType2, Int_RType2, OUT_RD|IN_RS|IN_RT), - INSTR("clo", &Jit::Comp_Generic, Dis_RType2, Int_RType2, OUT_RD|IN_RS|IN_RT), + INSTR("clz", &Jit::Comp_RType2, Dis_RType2, Int_RType2, OUT_RD|IN_RS|IN_RT), + INSTR("clo", &Jit::Comp_RType2, Dis_RType2, Int_RType2, OUT_RD|IN_RS|IN_RT), //24 INSTR("mult", &Jit::Comp_MulDivType, 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 42d2b6527c22..7b447674f2eb 100644 --- a/Core/MIPS/x86/CompALU.cpp +++ b/Core/MIPS/x86/CompALU.cpp @@ -158,6 +158,29 @@ namespace MIPSComp } } + void Jit::Comp_RType2(u32 op) + { + CONDITIONAL_DISABLE; + int rs = _RS; + int rd = _RD; + + // Don't change $zr. + if (rd == 0) + return; + + switch (op & 63) + { + case 22: //clz + DISABLE; + break; + case 23: //clo + DISABLE; + break; + default: + DISABLE; + } + } + static u32 RType3_ImmAdd(const u32 a, const u32 b) { return a + b; diff --git a/Core/MIPS/x86/Jit.h b/Core/MIPS/x86/Jit.h index 2d3acba3127e..f5bf0bdf538b 100644 --- a/Core/MIPS/x86/Jit.h +++ b/Core/MIPS/x86/Jit.h @@ -171,6 +171,7 @@ class Jit : public Gen::XCodeBlock void Comp_Break(u32 op); void Comp_IType(u32 op); + void Comp_RType2(u32 op); void Comp_RType3(u32 op); void Comp_ShiftType(u32 op); void Comp_Allegrex(u32 op); From fc86a5737ab88b4ada2dd9aceaeb7b19131167ea Mon Sep 17 00:00:00 2001 From: raven02 Date: Thu, 21 Feb 2013 21:20:26 +0800 Subject: [PATCH 114/347] Fix duplicate OK and ENTER button on same message screen --- Core/Dialog/PSPMsgDialog.cpp | 9 +-------- 1 file changed, 1 insertion(+), 8 deletions(-) diff --git a/Core/Dialog/PSPMsgDialog.cpp b/Core/Dialog/PSPMsgDialog.cpp index d6d58c8db843..280cf3734905 100644 --- a/Core/Dialog/PSPMsgDialog.cpp +++ b/Core/Dialog/PSPMsgDialog.cpp @@ -149,14 +149,9 @@ void PSPMsgDialog::DisplayYesNo() } void PSPMsgDialog::DisplayOk() -{ - PPGeDrawText("OK", 250, 150, PPGE_ALIGN_LEFT, 0.5f, CalcFadedColor(0xFF0000FF)); -} - -void PSPMsgDialog::DisplayEnter() { PPGeDrawImage(okButtonImg, 200, 220, 20, 20, 0, CalcFadedColor(0xFFFFFFFF)); - PPGeDrawText("Enter", 230, 220, PPGE_ALIGN_LEFT, 0.5f, CalcFadedColor(0xFFFFFFFF)); + PPGeDrawText("Ok", 230, 220, PPGE_ALIGN_LEFT, 0.5f, CalcFadedColor(0xFFFFFFFF)); } int PSPMsgDialog::Update() @@ -199,8 +194,6 @@ int PSPMsgDialog::Update() if(flag & DS_OK) DisplayOk(); - if(flag & DS_VALIDBUTTON) - DisplayEnter(); if(flag & DS_CANCELBUTTON) DisplayBack(); From 643efb3cb91520094612ac9ee44778f971938a23 Mon Sep 17 00:00:00 2001 From: raven02 Date: Thu, 21 Feb 2013 23:48:03 +0800 Subject: [PATCH 115/347] Fix (flag & (DS_OK | DS_VALIDBUTTON)) --- Core/Dialog/PSPMsgDialog.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Core/Dialog/PSPMsgDialog.cpp b/Core/Dialog/PSPMsgDialog.cpp index 280cf3734905..23473a6fdaf6 100644 --- a/Core/Dialog/PSPMsgDialog.cpp +++ b/Core/Dialog/PSPMsgDialog.cpp @@ -191,7 +191,7 @@ int PSPMsgDialog::Update() if(flag & DS_YESNO) DisplayYesNo(); - if(flag & DS_OK) + if (flag & (DS_OK | DS_VALIDBUTTON)) DisplayOk(); if(flag & DS_CANCELBUTTON) From 7995d1418c967390017713e04f41a6997414f823 Mon Sep 17 00:00:00 2001 From: Henrik Rydgard Date: Thu, 21 Feb 2013 19:10:30 +0100 Subject: [PATCH 116/347] Safer float->u16 cast. --- GPU/GLES/VertexDecoder.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/GPU/GLES/VertexDecoder.h b/GPU/GLES/VertexDecoder.h index 3bebacd81c9e..496e29b24cb7 100644 --- a/GPU/GLES/VertexDecoder.h +++ b/GPU/GLES/VertexDecoder.h @@ -196,7 +196,7 @@ class VertexReader memcpy(pos, f, 12); if (isThrough()) { // Integer value passed in a float. Wraps and all, required for Monster Hunter. - pos[2] = (float)((u16)pos[2]) * (1.0f / 65535.0f); + pos[2] = (float)((u16)(s32)pos[2]) * (1.0f / 65535.0f); } } break; @@ -208,7 +208,7 @@ class VertexReader if (isThrough()) { for (int i = 0; i < 2; i++) pos[i] = s[i]; - pos[2] = u[2] / 65535.0f; + pos[2] = u[2] * (1.0f / 65535.0f); } else { for (int i = 0; i < 3; i++) pos[i] = s[i] * (1.f / 32767.f); From 28979e9250704ee1a9d4e69270590530dd7aadf7 Mon Sep 17 00:00:00 2001 From: Henrik Rydgard Date: Thu, 21 Feb 2013 21:37:19 +0100 Subject: [PATCH 117/347] Some work toward better FBO handling. Fixes some things, breaks some things.. --- GPU/GLES/Framebuffer.cpp | 11 ++++---- GPU/GLES/Framebuffer.h | 47 ++++++++++++++++++++-------------- GPU/GLES/ShaderManager.cpp | 2 +- GPU/GLES/StateMapping.cpp | 2 +- GPU/GLES/TextureCache.cpp | 41 ++++++++++++++--------------- GPU/GLES/TextureCache.h | 10 +++++--- GPU/GLES/TransformPipeline.cpp | 2 +- GPU/GPUState.h | 1 + 8 files changed, 63 insertions(+), 53 deletions(-) diff --git a/GPU/GLES/Framebuffer.cpp b/GPU/GLES/Framebuffer.cpp index 54783dcde33a..ed3d624ed0ac 100644 --- a/GPU/GLES/Framebuffer.cpp +++ b/GPU/GLES/Framebuffer.cpp @@ -235,7 +235,7 @@ void FramebufferManager::DrawActiveTexture(float x, float y, float w, float h, b glsl_unbind(); } -FramebufferManager::VirtualFramebuffer *FramebufferManager::GetDisplayFBO() { +VirtualFramebuffer *FramebufferManager::GetDisplayFBO() { for (auto iter = vfbs_.begin(); iter != vfbs_.end(); ++iter) { VirtualFramebuffer *v = *iter; if (MaskedEqual(v->fb_address, displayFramebufPtr_) && v->format == displayFormat_) { @@ -325,6 +325,7 @@ void FramebufferManager::SetRenderFrameBuffer() { vfb->renderWidth = (u16)(drawing_width * renderWidthFactor); vfb->renderHeight = (u16)(drawing_height * renderHeightFactor); vfb->format = fmt; + vfb->usageFlags = FB_USAGE_RENDERTARGET; switch (fmt) { case GE_FORMAT_4444: vfb->colorDepth = FBO_4444; break; @@ -342,7 +343,7 @@ void FramebufferManager::SetRenderFrameBuffer() { //#endif vfb->fbo = fbo_create(vfb->renderWidth, vfb->renderHeight, 1, true, vfb->colorDepth); - textureCache_->NotifyFramebuffer(vfb->fb_address, vfb->fbo); + textureCache_->NotifyFramebuffer(vfb->fb_address, vfb); vfb->last_frame_used = gpuStats.numFrames; vfbs_.push_back(vfb); @@ -368,7 +369,7 @@ void FramebufferManager::SetRenderFrameBuffer() { fbo_bind_as_render_target(vfb->fbo); - textureCache_->NotifyFramebuffer(vfb->fb_address, vfb->fbo); + textureCache_->NotifyFramebuffer(vfb->fb_address, vfb); #ifdef USING_GLES2 // Some tiled mobile GPUs benefit IMMENSELY from clearing an FBO before rendering // to it. This broke stuff before, so now it only clears on the first use of an @@ -482,7 +483,7 @@ void FramebufferManager::DecimateFBOs() { } if ((*iter)->last_frame_used + FBO_OLD_AGE < gpuStats.numFrames) { INFO_LOG(HLE, "Destroying FBO for %08x (%i x %i x %i)", vfb->fb_address, vfb->width, vfb->height, vfb->format) - textureCache_->NotifyFramebufferDestroyed(vfb->fb_address, vfb->fbo); + textureCache_->NotifyFramebufferDestroyed(vfb->fb_address, vfb); fbo_destroy(vfb->fbo); delete vfb; vfbs_.erase(iter++); @@ -495,7 +496,7 @@ void FramebufferManager::DecimateFBOs() { void FramebufferManager::DestroyAllFBOs() { for (auto iter = vfbs_.begin(); iter != vfbs_.end(); ++iter) { VirtualFramebuffer *vfb = *iter; - textureCache_->NotifyFramebufferDestroyed(vfb->fb_address, vfb->fbo); + textureCache_->NotifyFramebufferDestroyed(vfb->fb_address, vfb); fbo_destroy(vfb->fbo); delete vfb; } diff --git a/GPU/GLES/Framebuffer.h b/GPU/GLES/Framebuffer.h index c5a86426c9ee..c40fcc7c24aa 100644 --- a/GPU/GLES/Framebuffer.h +++ b/GPU/GLES/Framebuffer.h @@ -38,6 +38,34 @@ enum PspDisplayPixelFormat { PSP_DISPLAY_PIXEL_FORMAT_8888 = 3, }; +enum { + FB_USAGE_RENDERTARGET = 1, + FB_USAGE_TEXTURE = 2, +}; + + +struct VirtualFramebuffer { + int last_frame_used; + + u32 fb_address; + u32 z_address; + int fb_stride; + int z_stride; + + // There's also a top left of the drawing region, but meh... + u16 width; + u16 height; + u16 renderWidth; + u16 renderHeight; + + u16 usageFlags; + + int format; // virtual, right now they are all RGBA8888 + FBOColorDepth colorDepth; + FBO *fbo; +}; + + class FramebufferManager { public: FramebufferManager(); @@ -47,25 +75,6 @@ class FramebufferManager { textureCache_ = tc; } - struct VirtualFramebuffer { - int last_frame_used; - - u32 fb_address; - u32 z_address; - int fb_stride; - int z_stride; - - // There's also a top left of the drawing region, but meh... - u16 width; - u16 height; - u16 renderWidth; - u16 renderHeight; - - int format; // virtual, right now they are all RGBA8888 - FBOColorDepth colorDepth; - FBO *fbo; - }; - void DrawPixels(const u8 *framebuf, int pixelFormat, int linesize); void DrawActiveTexture(float x, float y, float w, float h, bool flip = false); diff --git a/GPU/GLES/ShaderManager.cpp b/GPU/GLES/ShaderManager.cpp index 30c294b78093..4471a48e8617 100644 --- a/GPU/GLES/ShaderManager.cpp +++ b/GPU/GLES/ShaderManager.cpp @@ -243,7 +243,7 @@ void LinkedShader::updateUniforms() { if (u_proj_through != -1 && (dirtyUniforms & DIRTY_PROJTHROUGHMATRIX)) { Matrix4x4 proj_through; - proj_through.setOrtho(0.0f, 480, 272, 0, 1, 0); + proj_through.setOrtho(0.0f, 480, 272, 0, 0, 1); glUniformMatrix4fv(u_proj_through, 1, GL_FALSE, proj_through.getReadPtr()); } if (u_texenv != -1 && (dirtyUniforms & DIRTY_TEXENV)) { diff --git a/GPU/GLES/StateMapping.cpp b/GPU/GLES/StateMapping.cpp index 9d9deca2571f..d6bf5b57ab4c 100644 --- a/GPU/GLES/StateMapping.cpp +++ b/GPU/GLES/StateMapping.cpp @@ -236,7 +236,7 @@ void TransformDrawEngine::UpdateViewportAndProjection() { if (throughmode) { // No viewport transform here. Let's experiment with using region. glstate.viewport.set((0 + regionX1) * renderWidthFactor, (0 - regionY1) * renderHeightFactor, (regionX2 - regionX1) * renderWidthFactor, (regionY2 - regionY1) * renderHeightFactor); - glstate.depthRange.set(1.0, 0.0); + glstate.depthRange.set(0.0, 1.0); } else { // These we can turn into a glViewport call, offset by offsetX and offsetY. Math after. float vpXa = getFloat24(gstate.viewportx1); diff --git a/GPU/GLES/TextureCache.cpp b/GPU/GLES/TextureCache.cpp index 96ccc7768bc1..7ea3c85bcc9f 100644 --- a/GPU/GLES/TextureCache.cpp +++ b/GPU/GLES/TextureCache.cpp @@ -18,11 +18,12 @@ #include #include -#include "../../Core/MemMap.h" -#include "../ge_constants.h" -#include "../GPUState.h" -#include "TextureCache.h" -#include "../Core/Config.h" +#include "Core/MemMap.h" +#include "GPU/ge_constants.h" +#include "GPU/GPUState.h" +#include "GPU/GLES/TextureCache.h" +#include "GPU/GLES/Framebuffer.h" +#include "Core/Config.h" // If a texture hasn't been seen for this many frames, get rid of it. #define TEXTURE_KILL_AGE 200 @@ -131,21 +132,21 @@ TextureCache::TexCacheEntry *TextureCache::GetEntryAt(u32 texaddr) { return 0; } -void TextureCache::NotifyFramebuffer(u32 address, FBO *fbo) { +void TextureCache::NotifyFramebuffer(u32 address, VirtualFramebuffer *framebuffer) { // Must be in VRAM so | 0x04000000 it is. TexCacheEntry *entry = GetEntryAt(address | 0x04000000); if (entry) { DEBUG_LOG(HLE, "Render to texture detected at %08x!", address); - if (!entry->fbo) - entry->fbo = fbo; + if (!entry->framebuffer) + entry->framebuffer= framebuffer; // TODO: Delete the original non-fbo texture too. } } -void TextureCache::NotifyFramebufferDestroyed(u32 address, FBO *fbo) { +void TextureCache::NotifyFramebufferDestroyed(u32 address, VirtualFramebuffer *fbo) { TexCacheEntry *entry = GetEntryAt(address | 0x04000000); - if (entry && entry->fbo) { - entry->fbo = 0; + if (entry && entry->framebuffer) { + entry->framebuffer = 0; } } @@ -699,19 +700,15 @@ void TextureCache::SetTexture() { if (iter != cache.end()) { entry = &iter->second; // Check for FBO - slow! - if (entry->fbo) { - int w = 1 << (gstate.texsize[0] & 0xf); - int h = 1 << ((gstate.texsize[0] >> 8) & 0xf); - - fbo_bind_color_as_texture(entry->fbo, 0); + if (entry->framebuffer) { + fbo_bind_color_as_texture(entry->framebuffer->fbo, 0); UpdateSamplingParams(*entry, false); - int fbow, fboh; - fbo_get_dimensions(entry->fbo, &fbow, &fboh); - // This isn't right. - gstate_c.curTextureWidth = w; //w; //RoundUpToPowerOf2(fbow); - gstate_c.curTextureHeight = h; // RoundUpToPowerOf2(fboh); + gstate_c.curTextureWidth = entry->framebuffer->width; + gstate_c.curTextureHeight = entry->framebuffer->height; + int h = 1 << ((gstate.texsize[0] >> 8) & 0xf); + gstate_c.actualTextureHeight = h; gstate_c.flipTexture = true; entry->lastFrame = gpuStats.numFrames; return; @@ -807,7 +804,7 @@ void TextureCache::SetTexture() { entry->hash = texhash; entry->format = format; entry->lastFrame = gpuStats.numFrames; - entry->fbo = 0; + entry->framebuffer = 0; entry->maxLevel = maxLevel; entry->lodBias = 0.0f; diff --git a/GPU/GLES/TextureCache.h b/GPU/GLES/TextureCache.h index 65c64b4eb3a9..62008ec0ddeb 100644 --- a/GPU/GLES/TextureCache.h +++ b/GPU/GLES/TextureCache.h @@ -21,6 +21,8 @@ #include "gfx_es2/fbo.h" #include "GPU/GPUState.h" +struct VirtualFramebuffer; + class TextureCache { public: @@ -36,16 +38,16 @@ class TextureCache // FramebufferManager keeps TextureCache updated about what regions of memory // are being rendered to. This is barebones so far. - void NotifyFramebuffer(u32 address, FBO *fbo); - void NotifyFramebufferDestroyed(u32 address, FBO *fbo); + void NotifyFramebuffer(u32 address, VirtualFramebuffer *framebuffer); + void NotifyFramebufferDestroyed(u32 address, VirtualFramebuffer *framebuffer); size_t NumLoadedTextures() const { return cache.size(); } bool DecodeTexture(u8 *output, GPUgstate state); + private: - struct TexCacheEntry { // After marking STATUS_UNRELIABLE, if it stays the same this many frames we'll trust it again. const static int FRAMES_REGAIN_TRUST = 1000; @@ -60,7 +62,7 @@ class TextureCache int status; u32 addr; u32 hash; - FBO *fbo; // if null, not sourced from an FBO. + VirtualFramebuffer *framebuffer; // if null, not sourced from an FBO. u32 sizeInRAM; int lastFrame; int numFrames; diff --git a/GPU/GLES/TransformPipeline.cpp b/GPU/GLES/TransformPipeline.cpp index 72b2066c57f2..87153a40f274 100644 --- a/GPU/GLES/TransformPipeline.cpp +++ b/GPU/GLES/TransformPipeline.cpp @@ -640,7 +640,7 @@ void TransformDrawEngine::SoftwareTransformAndDraw( transformed[index].fog = fogCoef; memcpy(&transformed[index].u, uv, 2 * sizeof(float)); if (gstate_c.flipTexture) - transformed[index].v = 1.0f - transformed[index].v * 2.0f; + transformed[index].v = 1.0f - transformed[index].v; //(float)gstate_c.actualTextureHeight / gstate_c.curTextureHeight - transformed[index].v; for (int i = 0; i < 4; i++) { transformed[index].color0[i] = c0[i] * 255.0f; } diff --git a/GPU/GPUState.h b/GPU/GPUState.h index 8f12c7d045ab..6522ae567f00 100644 --- a/GPU/GPUState.h +++ b/GPU/GPUState.h @@ -255,6 +255,7 @@ struct GPUStateCache u32 curTextureWidth; u32 curTextureHeight; + u32 actualTextureHeight; float vpWidth; float vpHeight; From 44e2a6925899455ac79f096c7d7919d22f0e203b Mon Sep 17 00:00:00 2001 From: Henrik Rydgard Date: Thu, 21 Feb 2013 21:52:12 +0100 Subject: [PATCH 118/347] gpu: Clean up "Clear" mode handling. --- GPU/GLES/DisplayListInterpreter.cpp | 26 --------- GPU/GLES/StateMapping.cpp | 83 ++++++++++++++--------------- 2 files changed, 41 insertions(+), 68 deletions(-) diff --git a/GPU/GLES/DisplayListInterpreter.cpp b/GPU/GLES/DisplayListInterpreter.cpp index cde737feddf9..bb7bec66479f 100644 --- a/GPU/GLES/DisplayListInterpreter.cpp +++ b/GPU/GLES/DisplayListInterpreter.cpp @@ -280,26 +280,6 @@ void GLES_GPU::Break() { } -static void EnterClearMode(u32 data) { - bool colMask = (data >> 8) & 1; - bool alphaMask = (data >> 9) & 1; - bool updateZ = (data >> 10) & 1; - glstate.colorMask.set(colMask, colMask, colMask, alphaMask); - glstate.depthWrite.set(updateZ ? GL_TRUE : GL_FALSE); -} - -static void LeaveClearMode() { - // We have to reset the following state as per the state of the command registers: - // Back face culling - // Texture map enable (meh) - // Fogging - // Antialiasing - // Alpha test - glstate.colorMask.set(1,1,1,1); - glstate.depthWrite.set(!(gstate.zmsk & 1) ? GL_TRUE : GL_FALSE); - // dirtyshader? -} - void GLES_GPU::PreExecuteOp(u32 op, u32 diff) { u32 cmd = op >> 24; if (flushBeforeCommand_[cmd] == 1 || (diff && flushBeforeCommand_[cmd] == 2)) @@ -826,14 +806,8 @@ void GLES_GPU::ExecuteOp(u32 op, u32 diff) { // CLEARING ////////////////////////////////////////////////////////////////// case GE_CMD_CLEARMODE: - // If it becomes a performance problem, check diff&1 - if (data & 1) - EnterClearMode(data); - else - LeaveClearMode(); break; - ////////////////////////////////////////////////////////////////// // ALPHA BLENDING ////////////////////////////////////////////////////////////////// diff --git a/GPU/GLES/StateMapping.cpp b/GPU/GLES/StateMapping.cpp index d6bf5b57ab4c..1c13ac261431 100644 --- a/GPU/GLES/StateMapping.cpp +++ b/GPU/GLES/StateMapping.cpp @@ -87,19 +87,10 @@ void TransformDrawEngine::ApplyDrawState(int prim) { // TODO: The top bit of the alpha channel should be written to the stencil bit somehow. This appears to require very expensive multipass rendering :( Alternatively, one could do a // single fullscreen pass that converts alpha to stencil (or 2 passes, to set both the 0 and 1 values) very easily. - // Set cull - bool wantCull = !gstate.isModeClear() && !gstate.isModeThrough() && prim != GE_PRIM_RECTANGLES && gstate.isCullEnabled(); - glstate.cullFace.set(wantCull); - - if (wantCull) { - u8 cullMode = gstate.getCullMode(); - glstate.cullFaceMode.set(cullingMode[cullMode]); - } - // Set blend bool wantBlend = !gstate.isModeClear() && (gstate.alphaBlendEnable & 1); glstate.blend.set(wantBlend); - if(wantBlend) { + if (wantBlend) { // This can't be done exactly as there are several PSP blend modes that are impossible to do on OpenGL ES 2.0, and some even on regular OpenGL for desktop. // HOWEVER - we should be able to approximate the 2x modes in the shader, although they will clip wrongly. @@ -168,46 +159,54 @@ void TransformDrawEngine::ApplyDrawState(int prim) { } } - bool wantDepthTest = gstate.isModeClear() || gstate.isDepthTestEnabled(); - glstate.depthTest.set(wantDepthTest); - if(wantDepthTest) { - // Force GL_ALWAYS if mode clear - without depth test, no depth write. - int depthTestFunc = gstate.isModeClear() ? 1 : gstate.getDepthTestFunc(); - glstate.depthFunc.set(ztests[depthTestFunc]); - } + // Dither + glstate.dither.set(gstate.ditherEnable & 1); + // Set cull - // PSP color/alpha mask is per bit but we can only support per byte. - // But let's do that, at least. And let's try a threshold. - if (!gstate.isModeClear()) { - bool rmask = (gstate.pmskc & 0xFF) < 128; - bool gmask = ((gstate.pmskc >> 8) & 0xFF) < 128; - bool bmask = ((gstate.pmskc >> 16) & 0xFF) < 128; - bool amask = (gstate.pmska & 0xFF) < 128; - glstate.colorMask.set(rmask, gmask, bmask, amask); - } + if (gstate.isModeClear()) { + bool colMask = (gstate.clearmode >> 8) & 1; + bool alphaMask = (gstate.clearmode >> 9) & 1; + bool updateZ = (gstate.clearmode >> 10) & 1; + + glstate.colorMask.set(colMask, colMask, colMask, alphaMask); - // Stencil test - if (!gstate.isModeClear() && gstate.isStencilTestEnabled()) { - glstate.stencilTest.enable(); - glstate.stencilFunc.set(ztests[gstate.stenciltest & 0x7], // func - (gstate.stenciltest >> 8) & 0xFF, // ref - (gstate.stenciltest >> 16) & 0xFF); // mask - glstate.stencilOp.set(stencilOps[gstate.stencilop & 0x7], // stencil fail - stencilOps[(gstate.stencilop >> 8) & 0x7], // depth fail - stencilOps[(gstate.stencilop >> 16) & 0x7]); - } else if (gstate.isModeClear()) { glstate.stencilTest.enable(); glstate.stencilOp.set(GL_REPLACE, GL_REPLACE, GL_REPLACE); glstate.stencilFunc.set(GL_ALWAYS, 0, 0xFF); + + glstate.depthTest.enable(); + glstate.depthFunc.set(GL_ALWAYS); + glstate.depthWrite.set(updateZ ? GL_TRUE : GL_FALSE); } else { - glstate.stencilTest.disable(); - } + u8 cullMode = gstate.getCullMode(); + bool wantCull = !gstate.isModeThrough() && prim != GE_PRIM_RECTANGLES && gstate.isCullEnabled(); + glstate.cullFace.set(wantCull); + glstate.cullFaceMode.set(cullingMode[cullMode]); - // Dither - glstate.dither.set(gstate.ditherEnable & 1); + glstate.depthTest.set(gstate.isDepthTestEnabled()); + glstate.depthFunc.set(ztests[gstate.getDepthTestFunc()]); + glstate.depthWrite.set(gstate.isDepthWriteEnabled() ? GL_TRUE : GL_FALSE); + + // PSP color/alpha mask is per bit but we can only support per byte. + // But let's do that, at least. And let's try a threshold. + bool rmask = (gstate.pmskc & 0xFF) < 128; + bool gmask = ((gstate.pmskc >> 8) & 0xFF) < 128; + bool bmask = ((gstate.pmskc >> 16) & 0xFF) < 128; + bool amask = (gstate.pmska & 0xFF) < 128; + glstate.colorMask.set(rmask, gmask, bmask, amask); - bool wantDepthWrite = gstate.isModeClear() || gstate.isDepthWriteEnabled(); - glstate.depthWrite.set(wantDepthWrite ? GL_TRUE : GL_FALSE); + if (gstate.isStencilTestEnabled()) { + glstate.stencilTest.enable(); + glstate.stencilFunc.set(ztests[gstate.stenciltest & 0x7], // func + (gstate.stenciltest >> 8) & 0xFF, // ref + (gstate.stenciltest >> 16) & 0xFF); // mask + glstate.stencilOp.set(stencilOps[gstate.stencilop & 0x7], // stencil fail + stencilOps[(gstate.stencilop >> 8) & 0x7], // depth fail + stencilOps[(gstate.stencilop >> 16) & 0x7]); + } else { + glstate.stencilTest.disable(); + } + } } void TransformDrawEngine::UpdateViewportAndProjection() { From 31ada1ea07f5207348223aa01e9384231ea6105d Mon Sep 17 00:00:00 2001 From: "Unknown W. Brackets" Date: Fri, 22 Feb 2013 00:38:22 -0800 Subject: [PATCH 119/347] Don't process threadsafe events from HLE. Only from the runloop where blowing the jit cache is safe. --- Core/CoreTiming.cpp | 20 +++++++++++--------- Core/CoreTiming.h | 1 + Core/HLE/sceKernelThread.cpp | 4 ++-- 3 files changed, 14 insertions(+), 11 deletions(-) diff --git a/Core/CoreTiming.cpp b/Core/CoreTiming.cpp index ce1180bd1be6..52ca228a8ae5 100644 --- a/Core/CoreTiming.cpp +++ b/Core/CoreTiming.cpp @@ -422,12 +422,6 @@ void RemoveAllEvents(int event_type) //This raise only the events required while the fifo is processing data void ProcessFifoWaitEvents() { - if (Common::AtomicLoadAcquire(hasTsEvents)) - MoveEvents(); - - if (!first) - return; - while (first) { if (first->time <= globalTimer) @@ -471,14 +465,12 @@ void MoveEvents() } } -void Advance() +void AdvanceQuick() { int cyclesExecuted = slicelength - currentMIPS->downcount; globalTimer += cyclesExecuted; currentMIPS->downcount = slicelength; - ProcessFifoWaitEvents(); - if (!first) { // WARN_LOG(CPU, "WARNING - no events in queue. Setting currentMIPS->downcount to 10000"); @@ -486,6 +478,8 @@ void Advance() } else { + ProcessFifoWaitEvents(); + slicelength = (int)(first->time - globalTimer); if (slicelength > MAX_SLICE_LENGTH) slicelength = MAX_SLICE_LENGTH; @@ -495,6 +489,14 @@ void Advance() advanceCallback(cyclesExecuted); } +void Advance() +{ + if (Common::AtomicLoadAcquire(hasTsEvents)) + MoveEvents(); + + AdvanceQuick(); +} + void LogPendingEvents() { Event *ptr = first; diff --git a/Core/CoreTiming.h b/Core/CoreTiming.h index 0a05d722c3e3..e61928145015 100644 --- a/Core/CoreTiming.h +++ b/Core/CoreTiming.h @@ -100,6 +100,7 @@ namespace CoreTiming void RemoveAllEvents(int event_type); bool IsScheduled(int event_type); void Advance(); + void AdvanceQuick(); void MoveEvents(); void ProcessFifoWaitEvents(); diff --git a/Core/HLE/sceKernelThread.cpp b/Core/HLE/sceKernelThread.cpp index dea4f8a6dd20..b4ceae39f2f3 100644 --- a/Core/HLE/sceKernelThread.cpp +++ b/Core/HLE/sceKernelThread.cpp @@ -795,7 +795,7 @@ void __KernelIdle() CoreTiming::Idle(); // Advance must happen between Idle and Reschedule, so that threads that were waiting for something // that was triggered at the end of the Idle period must get a chance to be scheduled. - CoreTiming::Advance(); + CoreTiming::AdvanceQuick(); // We must've exited a callback? if (__KernelInCallback()) @@ -1263,7 +1263,7 @@ void __KernelReSchedule(const char *reason) } // Execute any pending events while we're doing scheduling. - CoreTiming::Advance(); + CoreTiming::AdvanceQuick(); if (__IsInInterrupt() || __KernelInCallback()) { reason = "In Interrupt Or Callback"; From 94bb98d4774734eb931e32222ca97d73f6adea4a Mon Sep 17 00:00:00 2001 From: Henrik Rydgard Date: Fri, 22 Feb 2013 22:14:17 +0100 Subject: [PATCH 120/347] Enable color and depth buffer write before clearing. --- GPU/GLES/DisplayListInterpreter.cpp | 3 ++- GPU/GLES/Framebuffer.cpp | 12 ++++++++++++ android/jni/MenuScreens.cpp | 3 +++ android/jni/NativeApp.cpp | 3 +++ native | 2 +- 5 files changed, 21 insertions(+), 2 deletions(-) diff --git a/GPU/GLES/DisplayListInterpreter.cpp b/GPU/GLES/DisplayListInterpreter.cpp index bb7bec66479f..6ec35e8ba169 100644 --- a/GPU/GLES/DisplayListInterpreter.cpp +++ b/GPU/GLES/DisplayListInterpreter.cpp @@ -202,8 +202,9 @@ void GLES_GPU::DeviceLost() { void GLES_GPU::InitClear() { if (!g_Config.bBufferedRendering) { + glstate.depthWrite.set(GL_TRUE); + glstate.colorMask.set(GL_TRUE, GL_TRUE, GL_TRUE, GL_TRUE); glClearColor(0,0,0,1); - // glClearColor(1,0,1,1); glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT); } glstate.viewport.set(0, 0, PSP_CoreParameter().pixelWidth, PSP_CoreParameter().pixelHeight); diff --git a/GPU/GLES/Framebuffer.cpp b/GPU/GLES/Framebuffer.cpp index ed3d624ed0ac..643f1fc78162 100644 --- a/GPU/GLES/Framebuffer.cpp +++ b/GPU/GLES/Framebuffer.cpp @@ -125,6 +125,8 @@ FramebufferManager::FramebufferManager() : // And an initial clear. We don't clear per frame as the games are supposed to handle that // by themselves. + glstate.depthWrite.set(GL_TRUE); + glstate.colorMask.set(GL_TRUE, GL_TRUE, GL_TRUE, GL_TRUE); glClearColor(0, 0, 0, 0); glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT); @@ -352,6 +354,8 @@ void FramebufferManager::SetRenderFrameBuffer() { glEnable(GL_DITHER); glstate.viewport.set(0, 0, vfb->renderWidth, vfb->renderHeight); currentRenderVfb_ = vfb; + glstate.depthWrite.set(GL_TRUE); + glstate.colorMask.set(GL_TRUE, GL_TRUE, GL_TRUE, GL_TRUE); glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT); INFO_LOG(HLE, "Creating FBO for %08x : %i x %i x %i", vfb->fb_address, vfb->width, vfb->height, vfb->format); return; @@ -376,7 +380,11 @@ void FramebufferManager::SetRenderFrameBuffer() { // FBO in a frame. This means that some games won't be able to avoid the on-some-GPUs // performance-crushing framebuffer reloads from RAM, but we'll have to live with that. if (vfb->last_frame_used != gpuStats.numFrames) + { + glstate.depthWrite.set(GL_TRUE); + glstate.colorMask.set(GL_TRUE, GL_TRUE, GL_TRUE, GL_TRUE); glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT); + } #endif glstate.viewport.set(0, 0, vfb->renderWidth, vfb->renderHeight); currentRenderVfb_ = vfb; @@ -391,6 +399,8 @@ void FramebufferManager::CopyDisplayToOutput() { if (!vfb) { DEBUG_LOG(HLE, "Found no FBO! displayFBPtr = %08x", displayFramebufPtr_); // No framebuffer to display! Clear to black. + glstate.depthWrite.set(GL_TRUE); + glstate.colorMask.set(GL_TRUE, GL_TRUE, GL_TRUE, GL_TRUE); glClearColor(0,0,0,1); glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT); return; @@ -413,6 +423,8 @@ void FramebufferManager::CopyDisplayToOutput() { fbo_bind_color_as_texture(vfb->fbo, 0); if (resized_) { + glstate.depthWrite.set(GL_TRUE); + glstate.colorMask.set(GL_TRUE, GL_TRUE, GL_TRUE, GL_TRUE); glClearColor(0,0,0,1); glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT); } diff --git a/android/jni/MenuScreens.cpp b/android/jni/MenuScreens.cpp index 5c9e2b2ce83d..a85866758827 100644 --- a/android/jni/MenuScreens.cpp +++ b/android/jni/MenuScreens.cpp @@ -24,6 +24,7 @@ #include "base/timeutil.h" #include "base/NativeApp.h" #include "gfx_es2/glsl_program.h" +#include "gfx_es2/gl_state.h" #include "input/input_state.h" #include "math/curves.h" #include "ui/ui.h" @@ -83,6 +84,8 @@ static void DrawBackground(float alpha) { ybase[i] = rng.F() * dp_yres; } } + glstate.depthWrite.set(GL_TRUE); + glstate.colorMask.set(GL_TRUE, GL_TRUE, GL_TRUE, GL_TRUE); glClearColor(0.1f,0.2f,0.43f,1.0f); glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT); ui_draw2d.DrawImageStretch(I_BG, 0, 0, dp_xres, dp_yres); diff --git a/android/jni/NativeApp.cpp b/android/jni/NativeApp.cpp index c0a9497dbf9a..2962fc4c6d9b 100644 --- a/android/jni/NativeApp.cpp +++ b/android/jni/NativeApp.cpp @@ -318,6 +318,9 @@ void NativeInitGraphics() void NativeRender() { EnableFZ(); + glstate.depthWrite.set(GL_TRUE); + glstate.colorMask.set(GL_TRUE, GL_TRUE, GL_TRUE, GL_TRUE); + // Clearing the screen at the start of the frame is an optimization for tiled mobile GPUs, as it then doesn't need to keep it around between frames. glClearColor(0,0,0,1); glClear(GL_DEPTH_BUFFER_BIT | GL_COLOR_BUFFER_BIT | GL_STENCIL_BUFFER_BIT); diff --git a/native b/native index f4cc78cbfdb5..a9a067ef8473 160000 --- a/native +++ b/native @@ -1 +1 @@ -Subproject commit f4cc78cbfdb5c9d9c3d83353e66625db43cf54b5 +Subproject commit a9a067ef8473628f170dfdab1f7692b53a5f130b From 2cfaa4979705c96c59452c073a3806d7401eb020 Mon Sep 17 00:00:00 2001 From: Sacha Date: Sat, 23 Feb 2013 12:56:39 +1000 Subject: [PATCH 121/347] iOS needs a back key as well due to lack of hardware buttons. At least until a gesture can replace this function. --- android/jni/GamepadEmu.cpp | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/android/jni/GamepadEmu.cpp b/android/jni/GamepadEmu.cpp index 83e0b5342985..826c1900b145 100644 --- a/android/jni/GamepadEmu.cpp +++ b/android/jni/GamepadEmu.cpp @@ -32,7 +32,7 @@ TouchButton buttonLeft(&ui_atlas, I_DIR, I_ARROW, PAD_BUTTON_LEFT, 0); TouchButton buttonUp(&ui_atlas, I_DIR, I_ARROW, PAD_BUTTON_UP, 90); TouchButton buttonRight(&ui_atlas, I_DIR, I_ARROW, PAD_BUTTON_RIGHT, 180); TouchButton buttonDown(&ui_atlas, I_DIR, I_ARROW, PAD_BUTTON_DOWN, 270); -#ifdef __SYMBIAN32__ +#if defined(__SYMBIAN32__) || defined(IOS) TouchButton buttonPause(&ui_atlas, I_RECT, I_ARROW, PAD_BUTTON_BACK, 90); #endif @@ -75,7 +75,7 @@ void LayoutGamepad(int w, int h) buttonLShoulder.setPos(button_spacing + 10 * controlScale, 15 * controlScale, controlScale); buttonRShoulder.setPos(w - button_spacing - 10 * controlScale, 15 * controlScale, controlScale); -#ifdef __SYMBIAN32__ +#if defined(__SYMBIAN32__) || defined(IOS) buttonPause.setPos(halfW, 15 * controlScale, controlScale); #endif @@ -101,7 +101,7 @@ void UpdateGamepad(InputState &input_state) buttonLShoulder.update(input_state); buttonRShoulder.update(input_state); -#ifdef __SYMBIAN32__ +#if defined(__SYMBIAN32__) || defined(IOS) buttonPause.update(input_state); #endif @@ -128,7 +128,7 @@ void DrawGamepad(DrawBuffer &db) buttonLShoulder.draw(db, color, colorOverlay); buttonRShoulder.draw(db, color, colorOverlay); -#ifdef __SYMBIAN32__ +#if defined(__SYMBIAN32__) || defined(IOS) buttonPause.draw(db, color, colorOverlay); #endif From dd90e93403461ba9dfe42c6f2a9e5ce65880bd4b Mon Sep 17 00:00:00 2001 From: raven02 Date: Sat, 23 Feb 2013 16:23:24 +0800 Subject: [PATCH 122/347] glClearColor(0,0,0,1); --- GPU/GLES/Framebuffer.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/GPU/GLES/Framebuffer.cpp b/GPU/GLES/Framebuffer.cpp index 643f1fc78162..51a2f178d5b4 100644 --- a/GPU/GLES/Framebuffer.cpp +++ b/GPU/GLES/Framebuffer.cpp @@ -127,7 +127,7 @@ FramebufferManager::FramebufferManager() : // by themselves. glstate.depthWrite.set(GL_TRUE); glstate.colorMask.set(GL_TRUE, GL_TRUE, GL_TRUE, GL_TRUE); - glClearColor(0, 0, 0, 0); + glClearColor(0,0,0,1); glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT); convBuf = new u8[480 * 272 * 4]; From 689da2c577db7398bd6dbd0e0ebfe09606975c22 Mon Sep 17 00:00:00 2001 From: raven02 Date: Sat, 23 Feb 2013 18:22:55 +0800 Subject: [PATCH 123/347] Add glClearColor(0,0,0,1); --- GPU/GLES/Framebuffer.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/GPU/GLES/Framebuffer.cpp b/GPU/GLES/Framebuffer.cpp index 51a2f178d5b4..12c78238d4fd 100644 --- a/GPU/GLES/Framebuffer.cpp +++ b/GPU/GLES/Framebuffer.cpp @@ -356,6 +356,7 @@ void FramebufferManager::SetRenderFrameBuffer() { currentRenderVfb_ = vfb; glstate.depthWrite.set(GL_TRUE); glstate.colorMask.set(GL_TRUE, GL_TRUE, GL_TRUE, GL_TRUE); + glClearColor(0,0,0,1); glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT); INFO_LOG(HLE, "Creating FBO for %08x : %i x %i x %i", vfb->fb_address, vfb->width, vfb->height, vfb->format); return; From 8e550d957843b1ab897c14eba74124fc6d1d3bd3 Mon Sep 17 00:00:00 2001 From: raven02 Date: Sat, 23 Feb 2013 23:26:58 +0800 Subject: [PATCH 124/347] Set float for glstate.depthRange.set(0.0f, 1.0f) --- GPU/GLES/StateMapping.cpp | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/GPU/GLES/StateMapping.cpp b/GPU/GLES/StateMapping.cpp index 1c13ac261431..8cbb92e981bf 100644 --- a/GPU/GLES/StateMapping.cpp +++ b/GPU/GLES/StateMapping.cpp @@ -164,11 +164,11 @@ void TransformDrawEngine::ApplyDrawState(int prim) { // Set cull if (gstate.isModeClear()) { - bool colMask = (gstate.clearmode >> 8) & 1; + bool colorMask = (gstate.clearmode >> 8) & 1; bool alphaMask = (gstate.clearmode >> 9) & 1; - bool updateZ = (gstate.clearmode >> 10) & 1; + bool depthMask = (gstate.clearmode >> 10) & 1; - glstate.colorMask.set(colMask, colMask, colMask, alphaMask); + glstate.colorMask.set(colorMask, colorMask, colorMask, alphaMask); glstate.stencilTest.enable(); glstate.stencilOp.set(GL_REPLACE, GL_REPLACE, GL_REPLACE); @@ -176,7 +176,7 @@ void TransformDrawEngine::ApplyDrawState(int prim) { glstate.depthTest.enable(); glstate.depthFunc.set(GL_ALWAYS); - glstate.depthWrite.set(updateZ ? GL_TRUE : GL_FALSE); + glstate.depthWrite.set(depthMask ? GL_TRUE : GL_FALSE); } else { u8 cullMode = gstate.getCullMode(); bool wantCull = !gstate.isModeThrough() && prim != GE_PRIM_RECTANGLES && gstate.isCullEnabled(); @@ -202,7 +202,7 @@ void TransformDrawEngine::ApplyDrawState(int prim) { (gstate.stenciltest >> 16) & 0xFF); // mask glstate.stencilOp.set(stencilOps[gstate.stencilop & 0x7], // stencil fail stencilOps[(gstate.stencilop >> 8) & 0x7], // depth fail - stencilOps[(gstate.stencilop >> 16) & 0x7]); + stencilOps[(gstate.stencilop >> 16) & 0x7]); // depth pass } else { glstate.stencilTest.disable(); } @@ -235,7 +235,7 @@ void TransformDrawEngine::UpdateViewportAndProjection() { if (throughmode) { // No viewport transform here. Let's experiment with using region. glstate.viewport.set((0 + regionX1) * renderWidthFactor, (0 - regionY1) * renderHeightFactor, (regionX2 - regionX1) * renderWidthFactor, (regionY2 - regionY1) * renderHeightFactor); - glstate.depthRange.set(0.0, 1.0); + glstate.depthRange.set(0.0f, 1.0f); } else { // These we can turn into a glViewport call, offset by offsetX and offsetY. Math after. float vpXa = getFloat24(gstate.viewportx1); @@ -268,8 +268,8 @@ void TransformDrawEngine::UpdateViewportAndProjection() { // Sadly, as glViewport takes integers, we will not be able to support sub pixel offsets this way. But meh. // shaderManager_->DirtyUniform(DIRTY_PROJMATRIX); - float zScale = getFloat24(gstate.viewportz1) / 65535.f; - float zOff = getFloat24(gstate.viewportz2) / 65535.f; + float zScale = getFloat24(gstate.viewportz1) / 65535.0f; + float zOff = getFloat24(gstate.viewportz2) / 65535.0f; float depthRangeMin = zOff - zScale; float depthRangeMax = zOff + zScale; glstate.depthRange.set(depthRangeMin, depthRangeMax); From cee27a9db6870a0252863f6f072db8d692b28f27 Mon Sep 17 00:00:00 2001 From: raven02 Date: Sun, 24 Feb 2013 02:05:06 +0800 Subject: [PATCH 125/347] Group GE_CMD_CLUTFORMAT --- GPU/GLES/DisplayListInterpreter.cpp | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/GPU/GLES/DisplayListInterpreter.cpp b/GPU/GLES/DisplayListInterpreter.cpp index 6ec35e8ba169..82cafa1b3f67 100644 --- a/GPU/GLES/DisplayListInterpreter.cpp +++ b/GPU/GLES/DisplayListInterpreter.cpp @@ -623,6 +623,7 @@ void GLES_GPU::ExecuteOp(u32 op, u32 diff) { case GE_CMD_CLUTADDR: case GE_CMD_CLUTADDRUPPER: case GE_CMD_LOADCLUT: + case GE_CMD_CLUTFORMAT: gstate_c.textureChanged = true; // This could be used to "dirty" textures with clut. break; @@ -631,10 +632,6 @@ void GLES_GPU::ExecuteOp(u32 op, u32 diff) { case GE_CMD_TEXSHADELS: break; - case GE_CMD_CLUTFORMAT: - gstate_c.textureChanged = true; - break; - case GE_CMD_TRANSFERSRC: case GE_CMD_TRANSFERSRCW: case GE_CMD_TRANSFERDST: From b1db09b84fbedb69fee12112a32b4555c960fe29 Mon Sep 17 00:00:00 2001 From: raven02 Date: Sun, 24 Feb 2013 02:17:16 +0800 Subject: [PATCH 126/347] Add missing glClearColor(0,0,0,1); --- GPU/GLES/Framebuffer.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/GPU/GLES/Framebuffer.cpp b/GPU/GLES/Framebuffer.cpp index 12c78238d4fd..4ed482d1c19a 100644 --- a/GPU/GLES/Framebuffer.cpp +++ b/GPU/GLES/Framebuffer.cpp @@ -384,6 +384,7 @@ void FramebufferManager::SetRenderFrameBuffer() { { glstate.depthWrite.set(GL_TRUE); glstate.colorMask.set(GL_TRUE, GL_TRUE, GL_TRUE, GL_TRUE); + glClearColor(0,0,0,1); glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT); } #endif From 6b22266a00f4310857de9ab8e49adb054d8a9543 Mon Sep 17 00:00:00 2001 From: raven02 Date: Sun, 24 Feb 2013 02:18:18 +0800 Subject: [PATCH 127/347] Add glstate.depthTest.disable(); --- GPU/GLES/StateMapping.cpp | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/GPU/GLES/StateMapping.cpp b/GPU/GLES/StateMapping.cpp index 8cbb92e981bf..4590c80205cf 100644 --- a/GPU/GLES/StateMapping.cpp +++ b/GPU/GLES/StateMapping.cpp @@ -183,9 +183,13 @@ void TransformDrawEngine::ApplyDrawState(int prim) { glstate.cullFace.set(wantCull); glstate.cullFaceMode.set(cullingMode[cullMode]); - glstate.depthTest.set(gstate.isDepthTestEnabled()); - glstate.depthFunc.set(ztests[gstate.getDepthTestFunc()]); - glstate.depthWrite.set(gstate.isDepthWriteEnabled() ? GL_TRUE : GL_FALSE); + if (gstate.isDepthTestEnabled()) { + glstate.depthTest.enable(); + glstate.depthFunc.set(ztests[gstate.getDepthTestFunc()]); + glstate.depthWrite.set(gstate.isDepthWriteEnabled() ? GL_TRUE : GL_FALSE); + } else { + glstate.depthTest.disable(); + } // PSP color/alpha mask is per bit but we can only support per byte. // But let's do that, at least. And let's try a threshold. From 5105c6cd93131ced24ec13042d1581d9532b08f8 Mon Sep 17 00:00:00 2001 From: raven02 Date: Sun, 24 Feb 2013 02:44:52 +0800 Subject: [PATCH 128/347] Add glstate.stencilTest.disable(); --- GPU/GLES/Framebuffer.cpp | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/GPU/GLES/Framebuffer.cpp b/GPU/GLES/Framebuffer.cpp index 4ed482d1c19a..f4caeaf64795 100644 --- a/GPU/GLES/Framebuffer.cpp +++ b/GPU/GLES/Framebuffer.cpp @@ -421,7 +421,8 @@ void FramebufferManager::CopyDisplayToOutput() { glstate.cullFace.disable(); glstate.depthTest.disable(); glstate.scissorTest.disable(); - + glstate.stencilTest.disable(); + fbo_bind_color_as_texture(vfb->fbo, 0); if (resized_) { @@ -451,6 +452,8 @@ void FramebufferManager::BeginFrame() { glstate.cullFace.disable(); glstate.depthTest.disable(); glstate.blend.disable(); + glstate.scissorTest.disable(); + glstate.stencilTest.disable(); DrawPixels(pspframebuf, displayFormat_, displayStride_); // TODO: restore state? } From a1835e04432c0b5b82b1452fb378ed2367ac92d6 Mon Sep 17 00:00:00 2001 From: sum2012 Date: Sun, 24 Feb 2013 03:07:17 +0800 Subject: [PATCH 129/347] Updated Trad Chinese for Qt interface. Based on https://github.com/hrydgard/ppsspp/pull/749 --- Qt/languages/ppsspp_tc.ts | 2028 ++++++++++++++++++------------------- 1 file changed, 1014 insertions(+), 1014 deletions(-) diff --git a/Qt/languages/ppsspp_tc.ts b/Qt/languages/ppsspp_tc.ts index a42937ece9f6..8b4520c1a079 100644 --- a/Qt/languages/ppsspp_tc.ts +++ b/Qt/languages/ppsspp_tc.ts @@ -1,1014 +1,1014 @@ - - - - - Controls - - - Controls - Controls window title - ζ§ε¶ε™¨ - - - - CtrlDisAsmView - - - Copy &address - (&A)複製ε°ε€ - - - - Copy instruction (&hex) - (&H)複製ζ‡δ»¤(εε…­ι€²ε¶ε‹) - - - - Copy instruction (&disasm) - (&D)複製ζ‡δ»¤(εε½™η·¨ε‹) - - - - &Run to here - (&R)ε·θ΅ε°ζ­¤θ™• - - - - &Set Next Statement - (&S)θ¨­η½®δΈ‹δΈ€θε¥ - - - - &Toggle breakpoint - (&T)ι–ε®ζ–·ι» - - - - &Follow branch - (&F)θ·ι¨ε†ζ”― - - - - Go to in &Memory View - (&M)轉ε°ε…§ε­θ¦–ε– - - - - &Rename function... - (&R)ι‡ε‘½ε函數... - - - - New function name - 新函數ε稱 - - - - New function name: - - - - - CtrlMemView - - - Go to in &disasm - (&D)轉ε°ε彙編器 - - - - &Copy value - (&C)複製值 - - - - Dump... - 轉儲... - - - - CtrlRegisterList - - - Go to in &memory view - (&M)轉ε°ε…§ε­θ¦–ε– - - - - Go to in &disasm - (&D)轉ε°ε彙編器 - - - - &Copy value - (&C)複製值 - - - - C&hange... - (&H)ζ›΄ζ”Ή... - - - - Set new value - θ¨­η½®ζ–°ε€Ό - - - - Set new value: - - - - - Debugger_Disasm - - - Disassembler - Window title - - - - - Ctr: - θ¨ζ•Έε™¨: - - - - &Go to - (&G)θ½‰ε° - - - - &PC - (&P)PCε―„ε­ε™¨ - - - - &LR - (&L)ι€£ζ¥ε―„ε­ε™¨ - - - - Show VFPU - ι΅―η¤ΊVFPU - - - - Regs - ε―„ε­ε™¨ - - - - Funcs - 函數 - - - - &Go - (&G)θ½‰ε° - - - - Stop - εζ­Ά - - - - Step &Into - (&I)ε–®ζ­¥θ·ι€² - - - - Step &Over - (&O)ε–®ζ­¥ζ­¥ι - - - - S&kip - (&K)θ·³ι - - - - Next &HLE - (&H)δΈ‹δΈ€HLE - - - - Breakpoints - ζ–·ι» - - - - Address - ε°ε€ - - - - Clear All - ζΈ…η©Ίζ‰€ζ‰ - - - - Callstack - θΏη”¨ζ£§ - - - - Display Lists - ι΅―η¤Ίε—表 - - - - - Id - Id - - - - - Status - η‹€ζ…‹ - - - - Start Address - 起始ε°ε€ - - - - Current Address - 當ε‰ε°ε€ - - - - Run - ε·θ΅ - - - - Step - ε–®ζ­¥ε·θ΅ - - - - Threads - η·η¨‹ - - - - Name - ε稱 - - - - Current PC - 當ε‰PCε―„ε­ε™¨ - - - - Entry point - ε…¥ε£ι» - - - - Remove breakpoint - η§»ι™¤ζ–·ι» - - - - Go to entry point - 轉ε°ε…¥ε£ι» - - - - Running - ε·θ΅δΈ­ - - - - Wait - η­‰εΎ… - - - - Suspend - ζ›θµ· - - - - Show code - 顯示代碼 - - - - Debugger_Memory - - - Dialog - ε°θ©±ζ΅† - - - - Goto: - 轉ε°: - - - - Mode - ζ¨΅εΌ - - - - Normal - ζ™®ι€ζ¨΅εΌ - - - - Symbols - η‰ΉεΎµη¬¦ζ¨΅εΌ - - - - Memory Viewer - %1 - - - - - Debugger_VFPU - - - VFPU - - - - - Float - ζµ®ι»ε‹ - - - - HalfFloat - εζµ®ι»ε‹ - - - - Hex - εε…­ι€²ε¶ε‹ - - - - Bytes - ε­—η―€ε‹ - - - - Shorts - η­ζ•΄ε‹ - - - - Ints - ζ•΄ε‹ - - - - GamePadDialog - - - Gamepad Configuration - 手ζ„θ¨­η½® - - - - GamePad List - 手ζ„ε—表 - - - - Refresh - ε·ζ–° - - - - Select - ιΈδΈ­ - - - - Gamepad Values : - 手ζ„ε€Ό: - - - - TextLabel - TextLabel - TextLabel - - - - Assign Gamepad input - ζ‡ε®θ©²ζ‰‹ζ„ - - - - to PSP button/axis - δ½η‚ΊPSPζ‰ιµ/ζ–ζ΅ΏθΌΈε…¥ - - - - Assign - ζ‡ε® - - - - Press buttons on your gamePad to verify mapping : - ζ‰δΈ‹ζ‰‹ζ„ζ‰ιµδΎ†ηΆΊθιµδ½ζ ε°„: - - - - - <b>No gamepad</b> - <b>ζη™ΌηΎζ‰‹ζ„</b> - - - - <b>Unknown gamepad</b> - <b>ζθ­ε¥η„手ζ„</b> - - - - Buttons - ζ‰ι• - - - - - Button %1 - ζ‰ι• %1 - - - - Axes - ζ–ζ΅Ώ - - - - %1 Neg - %1 Neg - - - - Axes %1 Neg - Axes %1 Neg - - - - %1 Pos - %1 Pos - - - - Axes %1 Pos - Axes %1 Pos - - - - Hats - Hats - - - - <b>Current gamepad: %1</b> - <b>當ε‰ζ‰‹ζ„: %1</b> - - - - MainWindow - - - PPSSPP - PPSSPP - - - - &File - (&F)文件 - - - - &Emulation - (&E)模擬 - - - - Debu&g - (&G)ι™¤ι― - - - - &Options - (&O)ιΈι … - - - - G3D - - - - - HLE - - - - - Default - ι»θ - - - - Lo&g Levels - - - - - &Language - - - - - &Video - - - - - &Anisotropic filtering - - - - - &Zoom - - - - - Co&ntrols - - - - - &Core - - - - - &Help - (&H)εΉ«ε© - - - - &Open... - (&O)打開... - - - - &Close - (&C)ι—ι–‰ - - - - - - - - - - - Quickload state - εΏ«ι€θ®€ζ” - - - - F4 - F4 - - - - Quicksave state - εΏ«ι€ε­ζ” - - - - F2 - F2 - - - - &Load State File... - (&L)讀ε–ε­ζ”... - - - - &Save State File... - (&S)δΏε­ε­ζ”... - - - - E&xit - (&X)ι€€ε‡Ί - - - - &Run - (&R)ι‹θ΅ - - - - F7 - F7 - - - - &Pause - (&P)ζ«ε - - - - F8 - F8 - - - - R&eset - (&E)ι‡η½® - - - - &Interpreter - (&I)解釋器 - - - - &Slightly Faster Interpreter - (&S)θΌƒεΏ«η„解釋器 - - - - &Dynarec - (&D)動態解釋器 - - - - Load &Map File... - (&M)讀ε–Map文件... - - - - &Save Map File... - (&S)δΏε­Map文件... - - - - &Reset Symbol Table - (&R)ι‡η½®η¬¦θ™θ΅¨ - - - - &Disassembly - (&D)ε彙編器 - - - - Ctrl+D - Ctrl+D - - - - &Log Console - (&L)ζ¥η‹ζ§ε¶ε°ζ—¥θ - - - - Ctrl+L - Ctrl+L - - - - Memory &View... - (&V)ε…§ε­θ¦–ε–... - - - - Ctrl+M - Ctrl+M - - - - &Keyboard - - - - - &Toggle fullscreen - - - - - Show &debug statistics - - - - - I&gnore illegal reads/writes - - - - - &Gamepad - - - - - Run on loa&d - - - - - Show &FPS counter - - - - - S&tretch to display - - - - - &Sound emulation - - - - - F12 - F12 - - - - &Buffered Rendering - (&B)ζΈ²ζ“η·©θ΅ - - - - F5 - F5 - - - - &Hardware Transform - (&H)硬件ε ι€ - - - - F6 - F6 - - - - &Linear Filtering - (&L)η·ζ€§ιζΏΎ - - - - &Wireframe (experimental) - (&W)使用η·ζ΅† (實驗性) - - - - &Display Raw Framebuffer - (&D)ι΅―η¤Ίε始?η·©θ΅ - - - - Screen &1x - &1ε€η—ε£ - - - - Ctrl+1 - Ctrl+1 - - - - Screen &2x - &2ε€η—ε£ - - - - Ctrl+2 - Ctrl+2 - - - - Screen &3x - &3ε€η—ε£ - - - - Ctrl+3 - Ctrl+3 - - - - Screen &4x - &4ε€η—ε£ - - - - Ctrl+4 - Ctrl+4 - - - - &Fast Memory (dynarec, unstable) - (&F)ι«ι€ι–ƒε­ (ε‹•ζ…‹ι‡η·¨θ­―,δΈη©©ε®) - - - - &Go to http://www.ppsspp.org/ - (&G)θ½‰ε° http://www.ppsspp.org/ - - - - &About PPSSPP... - (&A)ι—ζ–Ό PPSSPP... - - - - &Use VBO - (&U)使用 VBO - - - - - - Debug - ι™¤ι― - - - - - - Warning - θ­¦ε‘ - - - - - - Error - ι―θ¤ - - - - - - Info - δΏ΅ζ― - - - - D&ump next frame to log - (&U)將下一幀轉儲至日θ - - - - &Vertex Cache - (&V)ι ‚ι»η·©ε­ - - - - Memory View Texture... - ε…§ε­η΄‹η†θ¦–ε–... - - - - Simple 2xAA - - - - - Off - - - - - 2x - - - - - 4x - - - - - 8x - - - - - 16x - - - - - No translations - ζηΏ»θ­― - - - - gamepadMapping - - - Cross - Γ— - - - - Circle - β—‹ - - - - Square - β–΅ - - - - Triangle - β–³ - - - - Left Trigger - L - - - - Right Trigger - R - - - - Start - 開始 - - - - Select - ιΈζ“‡ - - - - Up - ↑ - - - - Down - ↓ - - - - Left - β† - - - - Right - β†’ - - - - Home - Home - - - - Stick left - ζ–ζ΅Ώε·¦ - - - - Stick right - ζ–ζ΅Ώε³ - - - - Stick up - ζ–ζ΅ΏδΈ - - - - Stick bottom - ζ–ζ΅ΏδΈ‹ - - - +ο»Ώ + + + + Controls + + + Controls + Controls window title + ζ§ε¶ε™¨ + + + + CtrlDisAsmView + + + Copy &address + (&A)複製ε°ε€ + + + + Copy instruction (&hex) + (&H)複製ζ‡δ»¤(εε…­ι€²ε¶ε‹) + + + + Copy instruction (&disasm) + (&D)複製ζ‡δ»¤(ε½™η·¨ε‹) + + + + &Run to here + (&R)ε·θ΅ε°ζ­¤θ™• + + + + &Set Next Statement + (&S)θ¨­η½®δΈ‹δΈ€θε¥ + + + + &Toggle breakpoint + (&T)ι–ε®ζ–·ι» + + + + &Follow branch + (&F)θ·ι¨ε†ζ”― + + + + Go to in &Memory View + (&M)轉ε°ε…§ε­θ¦–ε– + + + + &Rename function... + (&R)ι‡ε‘½ε函數... + + + + New function name + 新函數ε稱 + + + + New function name: + 新函數εη¨±οΌ + + + + CtrlMemView + + + Go to in &disasm + (&D)轉ε°ε½™η·¨θ¦–ε– + + + + &Copy value + (&C)複製值 + + + + Dump... + 轉儲... + + + + CtrlRegisterList + + + Go to in &memory view + (&M)轉ε°ε…§ε­θ¦–ε– + + + + Go to in &disasm + (&D)轉ε°ε½™η·¨θ¦–ε– + + + + &Copy value + (&C)複製值 + + + + C&hange... + (&H)ζ›΄ζ”Ή... + + + + Set new value + θ¨­η½®ζ–°ε€Ό + + + + Set new value: + θ¨­η½®ζ–°ε€ΌοΌ + + + + Debugger_Disasm + + + Disassembler + Window title + ε彙編器 + + + + Ctr: + θ¨ζ•Έε™¨: + + + + &Go to + (&G)θ½‰ε° + + + + &PC + (&P)PCε―„ε­ε™¨ + + + + &LR + (&L)ι€£ζ¥ε―„ε­ε™¨ + + + + Show VFPU + ι΅―η¤ΊVFPU + + + + Regs + ε―„ε­ε™¨ + + + + Funcs + 函數 + + + + &Go + (&G)θ½‰ε° + + + + Stop + εζ­Ά + + + + Step &Into + (&I)ε–®ζ­¥θ·ι€² + + + + Step &Over + (&O)ε–®ζ­¥ζ­¥ι + + + + S&kip + (&K)θ·³ι + + + + Next &HLE + (&H)δΈ‹δΈ€HLE + + + + Breakpoints + ζ–·ι» + + + + Address + ε°ε€ + + + + Clear All + ζΈ…η©Ίζ‰€ζ‰ + + + + Callstack + θΏη”¨ζ£§ + + + + Display Lists + ι΅―η¤Ίε—表 + + + + + Id + Id + + + + + Status + η‹€ζ…‹ + + + + Start Address + 起始ε°ε€ + + + + Current Address + 當ε‰ε°ε€ + + + + Run + ε·θ΅ + + + + Step + ε–®ζ­¥ε·θ΅ + + + + Threads + η·η¨‹ + + + + Name + ε稱 + + + + Current PC + 當ε‰PCε―„ε­ε™¨ + + + + Entry point + ε…¥ε£ι» + + + + Remove breakpoint + η§»ι™¤ζ–·ι» + + + + Go to entry point + 轉ε°ε…¥ε£ι» + + + + Running + ε·θ΅δΈ­ + + + + Wait + η­‰εΎ… + + + + Suspend + ζ›θµ· + + + + Show code + 顯示代碼 + + + + Debugger_Memory + + + Dialog + ε°θ©±ζ΅† + + + + Goto: + 轉ε°: + + + + Mode + ζ¨΅εΌ + + + + Normal + ζ™®ι€ζ¨΅εΌ + + + + Symbols + η‰ΉεΎµη¬¦ζ¨΅εΌ + + + + Memory Viewer - %1 + ε…§ε­ζ¥η‹ε™¨ - %1 + + + + Debugger_VFPU + + + VFPU + VFPU + + + + Float + ζµ®ι»ε‹ + + + + HalfFloat + εζµ®ι»ε‹ + + + + Hex + εε…­ι€²ε¶ε‹ + + + + Bytes + ε­—η―€ε‹ + + + + Shorts + η­ζ•΄ε‹ + + + + Ints + ζ•΄ε‹ + + + + GamePadDialog + + + Gamepad Configuration + 手ζ„θ¨­η½® + + + + GamePad List + 手ζ„ε—表 + + + + Refresh + ε·ζ–° + + + + Select + ιΈδΈ­ + + + + Gamepad Values : + 手ζ„ε€Ό: + + + + TextLabel + TextLabel + TextLabel + + + + Assign Gamepad input + ζ‡ε®θ©²ζ‰‹ζ„ + + + + to PSP button/axis + δ½η‚ΊPSPζ‰ιµ/ζ–ζ΅ΏθΌΈε…¥ + + + + Assign + ζ‡ε® + + + + Press buttons on your gamePad to verify mapping : + ζ‰δΈ‹ζ‰‹ζ„ζ‰ιµδΎ†ηΆΊθιµδ½ζ ε°„: + + + + + <b>No gamepad</b> + <b>ζη™ΌηΎζ‰‹ζ„</b> + + + + <b>Unknown gamepad</b> + <b>ζθ­ε¥η„手ζ„</b> + + + + Buttons + ζ‰ι• + + + + + Button %1 + ζ‰ι• %1 + + + + Axes + ζ–ζ΅Ώ + + + + %1 Neg + %1 Neg + + + + Axes %1 Neg + Axes %1 Neg + + + + %1 Pos + %1 Pos + + + + Axes %1 Pos + Axes %1 Pos + + + + Hats + Hats + + + + <b>Current gamepad: %1</b> + <b>當ε‰ζ‰‹ζ„: %1</b> + + + + MainWindow + + + PPSSPP + PPSSPP + + + + &File + (&F)文件 + + + + &Emulation + (&E)模擬 + + + + Debu&g + (&G)θΏθ©¦ + + + + &Options + (&O)ιΈι … + + + + G3D + + + + + HLE + + + + + Default + ι»θ + + + + Lo&g Levels + (&G)ζ—¥θη΄ε¥ + + + + &Language + (&L)θ言ιΈζ“‡ + + + + &Video + (&V)θ¦–ι » + + + + &Anisotropic filtering + (&A)ε„ε‘異性ιζΏΎ + + + + &Zoom + (&Z)ηΈ®ζ”Ύ + + + + Co&ntrols + (&N)ζ§ε¶ + + + + &Core + (&C)ζ ΈεΏƒ + + + + &Help + (&H)εΉ«ε© + + + + &Open... + (&O)打開... + + + + &Close + (&C)ι—ι–‰ + + + + - + - + + + + Quickload state + εΏ«ι€θ®€ζ” + + + + F4 + F4 + + + + Quicksave state + εΏ«ι€ε­ζ” + + + + F2 + F2 + + + + &Load State File... + (&L)讀ε–ε­ζ”... + + + + &Save State File... + (&S)δΏε­ε­ζ”... + + + + E&xit + (&X)ι€€ε‡Ί + + + + &Run + (&R)ι‹θ΅ + + + + F7 + F7 + + + + &Pause + (&P)ζ«ε + + + + F8 + F8 + + + + R&eset + (&E)ι‡η½® + + + + &Interpreter + (&I)解釋器 + + + + &Slightly Faster Interpreter + (&S)θΌƒεΏ«η„解釋器 + + + + &Dynarec + (&D)ε‹•ζ…‹ι‡η·¨θ­― + + + + Load &Map File... + (&M)讀ε–Map文件... + + + + &Save Map File... + (&S)δΏε­Map文件... + + + + &Reset Symbol Table + (&R)ι‡η½®η¬¦θ™θ΅¨ + + + + &Disassembly + (&D)ε½™η·¨θ¦–ε– + + + + Ctrl+D + Ctrl+D + + + + &Log Console + (&L)ζ¥η‹ζ§ε¶ε°ζ—¥θ + + + + Ctrl+L + Ctrl+L + + + + Memory &View... + (&V)ε…§ε­θ¦–ε–... + + + + Ctrl+M + Ctrl+M + + + + &Keyboard + (&K)ιµη›¤ + + + + &Toggle fullscreen + (&T)ε…¨ε± + + + + Show &debug statistics + (&D)ι΅―η¤ΊθΏθ©¦δΏ΅ζ― + + + + I&gnore illegal reads/writes + (&G)εΏ½η•¥ι法讀寫 + + + + &Gamepad + (&G)ζ‰‹ζ„ + + + + Run on loa&d + (&D)θΌ‰ε…¥ζ™‚ι‹θ΅ + + + + Show &FPS counter + (&F)ι΅―η¤ΊεΉ€η‡θ¨ζ•Έε™¨ + + + + S&tretch to display + (&T)拉伸顯示 + + + + &Sound emulation + (&S)模擬θ²ι³ + + + + F12 + F12 + + + + &Buffered Rendering + (&B)ζΈ²ζ“η·©θ΅ + + + + F5 + F5 + + + + &Hardware Transform + (&H)硬件ε ι€ + + + + F6 + F6 + + + + &Linear Filtering + (&L)η·ζ€§ιζΏΎ + + + + &Wireframe (experimental) + (&W)使用η·ζ΅† (實驗性ιΈι …) + + + + &Display Raw Framebuffer + (&D)ι΅―η¤Ί Raw εε§‹η·©θ΅ + + + + Screen &1x + &1ε€η—ε£ + + + + Ctrl+1 + Ctrl+1 + + + + Screen &2x + &2ε€η—ε£ + + + + Ctrl+2 + Ctrl+2 + + + + Screen &3x + &3ε€η—ε£ + + + + Ctrl+3 + Ctrl+3 + + + + Screen &4x + &4ε€η—ε£ + + + + Ctrl+4 + Ctrl+4 + + + + &Fast Memory (dynarec, unstable) + (&F)ι«ι€ι–ƒε­ (ε‹•ζ…‹ι‡η·¨θ­―,δΈη©©ε®) + + + + &Go to http://www.ppsspp.org/ + (&G)θ½‰ε° http://www.ppsspp.org/ + + + + &About PPSSPP... + (&A)ι—ζ–Ό PPSSPP... + + + + &Use VBO + (&U)使用 VBO + + + + + + Debug + θΏθ©¦ + + + + + + Warning + θ­¦ε‘ + + + + + + Error + ι―θ¤ + + + + + + Info + δΏ΅ζ― + + + + D&ump next frame to log + (&U)將下一幀轉儲至日θ + + + + &Vertex Cache + (&V)ι ‚ι»η·©ε­ + + + + Memory View Texture... + ε…§ε­η΄‹η†θ¦–ε–... + + + + Simple 2xAA + + + + + Off + ι—ι–‰ + + + + 2x + 2x + + + + 4x + 4x + + + + 8x + 8x + + + + 16x + 16x + + + + No translations + ζηΏ»θ­― + + + + gamepadMapping + + + Cross + Γ— + + + + Circle + β—‹ + + + + Square + β–΅ + + + + Triangle + β–³ + + + + Left Trigger + L + + + + Right Trigger + R + + + + Start + 開始 + + + + Select + ιΈζ“‡ + + + + Up + ↑ + + + + Down + ↓ + + + + Left + β† + + + + Right + β†’ + + + + Home + Home + + + + Stick left + ζ–ζ΅Ώε·¦ + + + + Stick right + ζ–ζ΅Ώε³ + + + + Stick up + ζ–ζ΅ΏδΈ + + + + Stick bottom + ζ–ζ΅ΏδΈ‹ + + + From 42c231389322b34709d06545db0704c22df03005 Mon Sep 17 00:00:00 2001 From: "Unknown W. Brackets" Date: Sat, 23 Feb 2013 09:52:24 -0800 Subject: [PATCH 130/347] Initial implementation of vf2h. Fixes Fat Princess and possibly other stuff. --- Core/MIPS/MIPSIntVFPU.cpp | 79 +++++++++++++++++++++++++++++---------- 1 file changed, 60 insertions(+), 19 deletions(-) diff --git a/Core/MIPS/MIPSIntVFPU.cpp b/Core/MIPS/MIPSIntVFPU.cpp index b04d2385c211..574f2a2fecd1 100644 --- a/Core/MIPS/MIPSIntVFPU.cpp +++ b/Core/MIPS/MIPSIntVFPU.cpp @@ -620,8 +620,8 @@ namespace MIPSInt int imm = (op >> 16) & 0x1f; float mult = 1.0f/(float)(1 << imm); VectorSize sz = GetVecSize(op); - ReadVector((float*)&s, sz, vs); - ApplySwizzleS((float*)&s, sz); //TODO: and the mask to kill everything but swizzle + ReadVector((float*)&s[0], sz, vs); + ApplySwizzleS((float*)&s[0], sz); //TODO: and the mask to kill everything but swizzle for (int i = 0; i < GetNumVectorElements(sz); i++) { d[i] = (float)s[i] * mult; @@ -642,6 +642,7 @@ namespace MIPSInt }; // magic code from ryg: http://fgiesen.wordpress.com/2012/03/28/half-to-float-done-quic/ + // See also SSE2 version: https://gist.github.com/rygorous/2144712 static FP32 half_to_float_fast5(FP16 h) { static const FP32 magic = { (127 + (127 - 15)) << 23 }; @@ -662,6 +663,42 @@ namespace MIPSInt return fp.f; } + // More magic code: https://gist.github.com/rygorous/2156668 + static FP16 float_to_half_fast3(FP32 f) + { + static const FP32 f32infty = { 255 << 23 }; + static const FP32 f16infty = { 31 << 23 }; + static const FP32 magic = { 15 << 23 }; + static const u32 sign_mask = 0x80000000u; + static const u32 round_mask = ~0xfffu; + FP16 o = { 0 }; + + u32 sign = f.u & sign_mask; + f.u ^= sign; + + if (f.u >= f32infty.u) // Inf or NaN (all exponent bits set) + o.u = (f.u > f32infty.u) ? 0x7e00 : 0x7c00; // NaN->qNaN and Inf->Inf + else // (De)normalized number or zero + { + f.u &= round_mask; + f.f *= magic.f; + f.u -= round_mask; + if (f.u > f16infty.u) f.u = f16infty.u; // Clamp to signed infinity if overflowed + + o.u = f.u >> 13; // Take the bits! + } + + o.u |= sign >> 16; + return o; + } + + static u16 ShrinkToHalf(float full) { + FP32 fp32; + fp32.f = full; + FP16 fp = float_to_half_fast3(fp32); + return fp.u; + } + void Int_Vh2f(u32 op) { u32 s[4]; @@ -669,7 +706,7 @@ namespace MIPSInt int vd = _VD; int vs = _VS; VectorSize sz = GetVecSize(op); - ReadVector((float*)&s, sz, vs); + ReadVector((float*)&s[0], sz, vs); VectorSize outsize = V_Pair; switch (sz) { @@ -698,27 +735,31 @@ namespace MIPSInt void Int_Vf2h(u32 op) { - _dbg_assert_msg_(CPU,0,"Trying to interpret instruction that can't be interpreted"); - // See http://stackoverflow.com/questions/1659440/32-bit-to-16-bit-floating-point-conversion - - /* - int s[4]; - float d[4]; + float s[4]; + u32 d[4]; int vd = _VD; int vs = _VS; - int imm = (op >> 16) & 0x1f; - float mult = 1.0f/(float)(1 << imm); VectorSize sz = GetVecSize(op); - ReadVector((float*)&s, sz, vs); - ApplySwizzleS((float*)&s, sz); //TODO: and the mask to kill everything but swizzle + ReadVector(s, sz, vs); - for (int i = 0; i < GetNumVectorElements(sz); i++) - { - d[i] = (float)s[i] * mult; + VectorSize outsize = V_Single; + switch (sz) { + case V_Pair: + outsize = V_Single; + d[0] = ShrinkToHalf(s[0]) | ((u32)ShrinkToHalf(s[1]) << 16); + break; + case V_Quad: + outsize = V_Pair; + d[0] = ShrinkToHalf(s[0]) | ((u32)ShrinkToHalf(s[1]) << 16); + d[1] = ShrinkToHalf(s[2]) | ((u32)ShrinkToHalf(s[3]) << 16); + break; + case V_Single: + case V_Triple: + _dbg_assert_msg_(CPU, 0, "Trying to interpret Int_Vf2h instruction that can't be interpreted"); + break; } - ApplyPrefixD(d, sz); //TODO: and the mask to kill everything but mask - WriteVector(d, sz, vd); - */ + ApplyPrefixD((float*)&d[0], outsize); //TODO: and the mask to kill everything but mask + WriteVector((float*)&d[0], outsize, vd); PC += 4; EatPrefixes(); } From 6c6bd0bd9cfccf4fc4bf90a2a8faf0afcd49661f Mon Sep 17 00:00:00 2001 From: "Unknown W. Brackets" Date: Sat, 23 Feb 2013 11:34:32 -0800 Subject: [PATCH 131/347] Correct prefix handling in vf2h/vh2f. --- Core/MIPS/MIPSIntVFPU.cpp | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/Core/MIPS/MIPSIntVFPU.cpp b/Core/MIPS/MIPSIntVFPU.cpp index 574f2a2fecd1..4cc701ece9d1 100644 --- a/Core/MIPS/MIPSIntVFPU.cpp +++ b/Core/MIPS/MIPSIntVFPU.cpp @@ -707,6 +707,7 @@ namespace MIPSInt int vs = _VS; VectorSize sz = GetVecSize(op); ReadVector((float*)&s[0], sz, vs); + ApplySwizzleS((float*)&s[0], sz); VectorSize outsize = V_Pair; switch (sz) { @@ -727,7 +728,7 @@ namespace MIPSInt _dbg_assert_msg_(CPU, 0, "Trying to interpret Int_Vh2f instruction that can't be interpreted"); break; } - ApplyPrefixD(d, outsize); //TODO: and the mask to kill everything but mask + ApplyPrefixD(d, outsize); WriteVector(d, outsize, vd); PC += 4; EatPrefixes(); @@ -741,6 +742,7 @@ namespace MIPSInt int vs = _VS; VectorSize sz = GetVecSize(op); ReadVector(s, sz, vs); + ApplySwizzleS(s, sz); VectorSize outsize = V_Single; switch (sz) { @@ -758,7 +760,7 @@ namespace MIPSInt _dbg_assert_msg_(CPU, 0, "Trying to interpret Int_Vf2h instruction that can't be interpreted"); break; } - ApplyPrefixD((float*)&d[0], outsize); //TODO: and the mask to kill everything but mask + ApplyPrefixD((float*)&d[0], outsize); WriteVector((float*)&d[0], outsize, vd); PC += 4; EatPrefixes(); From 608fb85f0d268be33c5c5e31f74e5c94ae6f0d0a Mon Sep 17 00:00:00 2001 From: "Unknown W. Brackets" Date: Sat, 23 Feb 2013 12:25:51 -0800 Subject: [PATCH 132/347] Make changing register values actually work. --- Core/MIPS/MIPSDebugInterface.h | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/Core/MIPS/MIPSDebugInterface.h b/Core/MIPS/MIPSDebugInterface.h index 46ae3ae43955..7a3ff5466242 100644 --- a/Core/MIPS/MIPSDebugInterface.h +++ b/Core/MIPS/MIPSDebugInterface.h @@ -77,4 +77,8 @@ class MIPSDebugInterface : public DebugInterface return cpu->r[index]; } + void SetRegValue(int cat, int index, u32 value) + { + cpu->r[index] = value; + } }; From 0c1b6fecfe55335eca03e5187eeca3e15152fcc4 Mon Sep 17 00:00:00 2001 From: "Unknown W. Brackets" Date: Sat, 23 Feb 2013 12:30:18 -0800 Subject: [PATCH 133/347] Allow changing fpu/vfpu regs. --- Core/MIPS/MIPSDebugInterface.h | 33 +++++++++++++++++++++++++++++++-- 1 file changed, 31 insertions(+), 2 deletions(-) diff --git a/Core/MIPS/MIPSDebugInterface.h b/Core/MIPS/MIPSDebugInterface.h index 7a3ff5466242..70e70a900f98 100644 --- a/Core/MIPS/MIPSDebugInterface.h +++ b/Core/MIPS/MIPSDebugInterface.h @@ -74,11 +74,40 @@ class MIPSDebugInterface : public DebugInterface u32 GetRegValue(int cat, int index) { - return cpu->r[index]; + switch (cat) + { + case 0: + return cpu->r[index]; + + case 1: + return *(u32 *)&cpu->f[index]; + + case 2: + return *(u32 *)&cpu->v[index]; + + default: + return 0; + } } void SetRegValue(int cat, int index, u32 value) { - cpu->r[index] = value; + switch (cat) + { + case 0: + cpu->r[index] = value; + break; + + case 1: + cpu->f[index] = *(float *)&value; + break; + + case 2: + cpu->v[index] = *(float *)&value; + break; + + default: + break; + } } }; From 12e2a56ef2c5825c514219b42f22b16680c1f0a8 Mon Sep 17 00:00:00 2001 From: "Unknown W. Brackets" Date: Sat, 23 Feb 2013 12:55:05 -0800 Subject: [PATCH 134/347] Fix bIgnoreBadMemAccess ignored in GetPointer. --- Core/MemMapFunctions.cpp | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/Core/MemMapFunctions.cpp b/Core/MemMapFunctions.cpp index d174cdb7e144..dcc895d212b1 100644 --- a/Core/MemMapFunctions.cpp +++ b/Core/MemMapFunctions.cpp @@ -56,6 +56,10 @@ u8 *GetPointer(const u32 address) else { ERROR_LOG(MEMMAP, "Unknown GetPointer %08x PC %08x LR %08x", address, currentMIPS->pc, currentMIPS->r[MIPS_REG_RA]); + if (!g_Config.bIgnoreBadMemAccess) { + Core_EnableStepping(true); + host->SetDebugMode(true); + } return 0; } } From 2164a7fdf9e5ea476e693554b4f8c94769230cac Mon Sep 17 00:00:00 2001 From: "Unknown W. Brackets" Date: Sat, 23 Feb 2013 12:59:40 -0800 Subject: [PATCH 135/347] Keep track of whether we're in the runloop or not. --- Core/Core.cpp | 39 +++++++++++++++++++++++++++++++---- Core/Core.h | 4 ++++ Core/Debugger/Breakpoints.cpp | 4 ++-- Core/MIPS/MIPSInt.cpp | 2 +- Core/MIPS/x86/Jit.cpp | 2 +- 5 files changed, 43 insertions(+), 8 deletions(-) diff --git a/Core/Core.cpp b/Core/Core.cpp index fefd4e04d386..e2928c935653 100644 --- a/Core/Core.cpp +++ b/Core/Core.cpp @@ -33,13 +33,24 @@ // HANDLE m_hStepEvent; event m_hStepEvent; recursive_mutex m_hStepMutex; +event m_hInactiveEvent; +recursive_mutex m_hInactiveMutex; // This can be read and written from ANYWHERE. volatile CoreState coreState = CORE_STEPPING; +// Note: intentionally not used for CORE_NEXTFRAME. +volatile bool coreStatePending = false; + +void Core_UpdateState(CoreState newState) +{ + if ((coreState == CORE_RUNNING || coreState == CORE_NEXTFRAME) && newState != CORE_RUNNING) + coreStatePending = true; + coreState = newState; +} void Core_ErrorPause() { - coreState = CORE_ERROR; + Core_UpdateState(CORE_ERROR); } void Core_Pause() @@ -56,7 +67,7 @@ void Core_Halt(const char *msg) void Core_Stop() { - coreState = CORE_POWERDOWN; + Core_UpdateState(CORE_POWERDOWN); m_hStepEvent.notify_one(); } @@ -65,6 +76,16 @@ bool Core_IsStepping() return coreState == CORE_STEPPING || coreState == CORE_POWERDOWN; } +bool Core_IsInactive() +{ + return coreState != CORE_RUNNING && coreState != CORE_NEXTFRAME && !coreStatePending; +} +void Core_WaitInactive() +{ + while (!Core_IsInactive()) + m_hInactiveEvent.wait(m_hInactiveMutex); +} + void Core_RunLoop() { while (!coreState) { @@ -110,6 +131,10 @@ void Core_Run() // We should never get here on Android. case CORE_STEPPING: + if (coreStatePending) + m_hInactiveEvent.notify_one(); + coreStatePending = false; + //1: wait for step command.. #if defined(USING_QT_UI) || defined(_DEBUG) host->UpdateDisassembly(); @@ -142,8 +167,13 @@ void Core_Run() case CORE_POWERDOWN: case CORE_ERROR: - case CORE_NEXTFRAME: //1: Exit loop!! + if (coreStatePending) + m_hInactiveEvent.notify_one(); + coreStatePending = false; + return; + + case CORE_NEXTFRAME: return; } } @@ -158,7 +188,7 @@ void Core_EnableStepping(bool step) #if defined(_DEBUG) host->SetDebugMode(true); #endif - coreState = CORE_STEPPING; + Core_UpdateState(CORE_STEPPING); } else { @@ -166,6 +196,7 @@ void Core_EnableStepping(bool step) host->SetDebugMode(false); #endif coreState = CORE_RUNNING; + coreStatePending = false; m_hStepEvent.notify_one(); } } diff --git a/Core/Core.h b/Core/Core.h index d9b07c7f6a10..3d57df287056 100644 --- a/Core/Core.h +++ b/Core/Core.h @@ -43,5 +43,9 @@ enum CoreState CORE_NEXTFRAME, }; +void Core_UpdateState(CoreState newState); +bool Core_IsInactive(); +void Core_WaitInactive(); + extern volatile CoreState coreState; diff --git a/Core/Debugger/Breakpoints.cpp b/Core/Debugger/Breakpoints.cpp index 3aed03de74f1..47b106197f92 100644 --- a/Core/Debugger/Breakpoints.cpp +++ b/Core/Debugger/Breakpoints.cpp @@ -133,14 +133,14 @@ void CBreakPoints::AddBreakPoint(u32 _iAddress, bool temp) void CBreakPoints::InvalidateJit(u32 _iAddress) { // Don't want to clear cache while running, I think? - if (MIPSComp::jit && coreState == CORE_STEPPING) + if (MIPSComp::jit && Core_IsStepping()) MIPSComp::jit->ClearCacheAt(_iAddress); } void CBreakPoints::InvalidateJit() { // Don't want to clear cache while running, I think? - if (MIPSComp::jit && coreState == CORE_STEPPING) + if (MIPSComp::jit && Core_IsStepping()) MIPSComp::jit->ClearCache(); } diff --git a/Core/MIPS/MIPSInt.cpp b/Core/MIPS/MIPSInt.cpp index 479cff313288..c8abb819314c 100644 --- a/Core/MIPS/MIPSInt.cpp +++ b/Core/MIPS/MIPSInt.cpp @@ -187,7 +187,7 @@ namespace MIPSInt void Int_Break(u32 op) { ERROR_LOG(CPU, "BREAK!"); - coreState = CORE_STEPPING; + Core_UpdateState(CORE_STEPPING); PC += 4; } diff --git a/Core/MIPS/x86/Jit.cpp b/Core/MIPS/x86/Jit.cpp index 5b56caad72ca..3c3a385476fd 100644 --- a/Core/MIPS/x86/Jit.cpp +++ b/Core/MIPS/x86/Jit.cpp @@ -359,7 +359,7 @@ void Jit::WriteExitDestInEAX() // TODO: "Ignore" this so other threads can continue? if (g_Config.bIgnoreBadMemAccess) - MOV(32, M((void*)&coreState), Imm32(CORE_ERROR)); + ABI_CallFunctionA(thunks.ProtectFunction((void *) Core_UpdateState, 1), Imm32(CORE_ERROR)); JMP(asm_.dispatcherCheckCoreState, true); } else From 7c3c06fd23f57770f2b97c188cbf8aff3159cc77 Mon Sep 17 00:00:00 2001 From: "Unknown W. Brackets" Date: Sat, 23 Feb 2013 13:21:28 -0800 Subject: [PATCH 136/347] Wait for the runloop to end in savestates/debug. This way, even if the runloop hasn't checked coreState yet, we will wait. --- Core/Core.cpp | 7 +++++++ Core/Core.h | 1 + Core/Debugger/Breakpoints.cpp | 4 ++-- Core/SaveState.cpp | 2 +- Windows/WndMainWindow.cpp | 35 ++++------------------------------- 5 files changed, 15 insertions(+), 34 deletions(-) diff --git a/Core/Core.cpp b/Core/Core.cpp index e2928c935653..a7d9e90b4ce1 100644 --- a/Core/Core.cpp +++ b/Core/Core.cpp @@ -80,12 +80,19 @@ bool Core_IsInactive() { return coreState != CORE_RUNNING && coreState != CORE_NEXTFRAME && !coreStatePending; } + void Core_WaitInactive() { while (!Core_IsInactive()) m_hInactiveEvent.wait(m_hInactiveMutex); } +void Core_WaitInactive(int milliseconds) +{ + // TODO + Core_WaitInactive(); +} + void Core_RunLoop() { while (!coreState) { diff --git a/Core/Core.h b/Core/Core.h index 3d57df287056..2b9d359fad27 100644 --- a/Core/Core.h +++ b/Core/Core.h @@ -46,6 +46,7 @@ enum CoreState void Core_UpdateState(CoreState newState); bool Core_IsInactive(); void Core_WaitInactive(); +void Core_WaitInactive(int milliseconds); extern volatile CoreState coreState; diff --git a/Core/Debugger/Breakpoints.cpp b/Core/Debugger/Breakpoints.cpp index 47b106197f92..cbb960f8ab02 100644 --- a/Core/Debugger/Breakpoints.cpp +++ b/Core/Debugger/Breakpoints.cpp @@ -133,14 +133,14 @@ void CBreakPoints::AddBreakPoint(u32 _iAddress, bool temp) void CBreakPoints::InvalidateJit(u32 _iAddress) { // Don't want to clear cache while running, I think? - if (MIPSComp::jit && Core_IsStepping()) + if (MIPSComp::jit && Core_IsInactive()) MIPSComp::jit->ClearCacheAt(_iAddress); } void CBreakPoints::InvalidateJit() { // Don't want to clear cache while running, I think? - if (MIPSComp::jit && Core_IsStepping()) + if (MIPSComp::jit && Core_IsInactive()) MIPSComp::jit->ClearCache(); } diff --git a/Core/SaveState.cpp b/Core/SaveState.cpp index 8a450081c34f..a320c4e70b63 100644 --- a/Core/SaveState.cpp +++ b/Core/SaveState.cpp @@ -90,7 +90,7 @@ namespace SaveState // Don't actually run it until next CoreTiming::Advance(). // It's possible there might be a duplicate but it won't hurt us. - if (Core_IsStepping() && __KernelIsRunning()) + if (Core_IsInactive() && __KernelIsRunning()) { // Warning: this may run on a different thread. Process(0, 0); diff --git a/Windows/WndMainWindow.cpp b/Windows/WndMainWindow.cpp index 30674cf9b474..d8c35701eff6 100644 --- a/Windows/WndMainWindow.cpp +++ b/Windows/WndMainWindow.cpp @@ -308,7 +308,7 @@ namespace MainWindow if (disasmWindow[i]) SendMessage(disasmWindow[i]->GetDlgHandle(), WM_COMMAND, IDC_STOP, 0); - Sleep(100);//UGLY wait for event instead + Core_WaitInactive(); for (int i=0; iGetDlgHandle(), WM_COMMAND, IDC_STOP, 0); - Sleep(100);//UGLY wait for event instead + Core_WaitInactive(); for (int i=0; iGetDlgHandle(), WM_COMMAND, IDC_STOP, 0); - } if (W32Util::BrowseForFileName(true, hWnd, "Load state",0,"Save States (*.ppst)\0*.ppst\0All files\0*.*\0\0","ppst",fn)) { SetCursor(LoadCursor(0,IDC_WAIT)); @@ -369,13 +362,6 @@ namespace MainWindow break; case ID_FILE_SAVESTATEFILE: - if (g_State.bEmuThreadStarted) - { - nextState = Core_IsStepping() ? CORE_STEPPING : CORE_RUNNING; - for (int i=0; iGetDlgHandle(), WM_COMMAND, IDC_STOP, 0); - } if (W32Util::BrowseForFileName(false, hWnd, "Save state",0,"Save States (*.ppst)\0*.ppst\0All files\0*.*\0\0","ppst",fn)) { SetCursor(LoadCursor(0,IDC_WAIT)); @@ -386,25 +372,11 @@ namespace MainWindow // TODO: Add UI for multiple slots case ID_FILE_QUICKLOADSTATE: - if (g_State.bEmuThreadStarted) - { - nextState = Core_IsStepping() ? CORE_STEPPING : CORE_RUNNING; - for (int i=0; iGetDlgHandle(), WM_COMMAND, IDC_STOP, 0); - } SetCursor(LoadCursor(0,IDC_WAIT)); SaveState::LoadSlot(0, SaveStateActionFinished); break; case ID_FILE_QUICKSAVESTATE: - if (g_State.bEmuThreadStarted) - { - nextState = Core_IsStepping() ? CORE_STEPPING : CORE_RUNNING; - for (int i=0; iGetDlgHandle(), WM_COMMAND, IDC_STOP, 0); - } SetCursor(LoadCursor(0,IDC_WAIT)); SaveState::SaveSlot(0, SaveStateActionFinished); break; @@ -643,7 +615,8 @@ namespace MainWindow break; case WM_CLOSE: - Sleep(100);//UGLY wait for event instead + Core_Stop(); + Core_WaitInactive(200); EmuThread_Stop(); /* From 3dee0e0149f85f4b2fb37823bf11374be97c0938 Mon Sep 17 00:00:00 2001 From: "Unknown W. Brackets" Date: Sat, 23 Feb 2013 13:32:12 -0800 Subject: [PATCH 137/347] Add a timeout so quit doesn't hang. Kinda like before except now it'll quit faster if possible. --- Core/Core.cpp | 4 ++-- native | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/Core/Core.cpp b/Core/Core.cpp index a7d9e90b4ce1..481c1f4b2abc 100644 --- a/Core/Core.cpp +++ b/Core/Core.cpp @@ -89,8 +89,8 @@ void Core_WaitInactive() void Core_WaitInactive(int milliseconds) { - // TODO - Core_WaitInactive(); + while (!Core_IsInactive()) + m_hInactiveEvent.wait_for(m_hInactiveMutex, milliseconds); } void Core_RunLoop() diff --git a/native b/native index a9a067ef8473..9c183fcca841 160000 --- a/native +++ b/native @@ -1 +1 @@ -Subproject commit a9a067ef8473628f170dfdab1f7692b53a5f130b +Subproject commit 9c183fcca8416a34d510880d483ccf5f2ec573f4 From 8f9ea31a87e74f4b595d21bf633859205e1a0ec1 Mon Sep 17 00:00:00 2001 From: "Unknown W. Brackets" Date: Sat, 23 Feb 2013 13:54:47 -0800 Subject: [PATCH 138/347] Don't bother resuming/pausing around savestates. Only makes things more likely to crash. --- Qt/mainwindow.cpp | 40 --------------------------------------- Windows/WndMainWindow.cpp | 7 ------- 2 files changed, 47 deletions(-) diff --git a/Qt/mainwindow.cpp b/Qt/mainwindow.cpp index 9c74aad70663..7304c06cbf84 100644 --- a/Qt/mainwindow.cpp +++ b/Qt/mainwindow.cpp @@ -388,26 +388,10 @@ void SaveStateActionFinished(bool result, void *userdata) msgBox.exec(); return; } - - MainWindow* mainWindow = (MainWindow*)userdata; - - if (g_State.bEmuThreadStarted && mainWindow->GetNextState() == CORE_RUNNING) - { - if(mainWindow->GetDialogDisasm()) - mainWindow->GetDialogDisasm()->Go(); - } } void MainWindow::on_action_FileLoadStateFile_triggered() { - if (g_State.bEmuThreadStarted) - { - nextState = Core_IsStepping() ? CORE_STEPPING : CORE_RUNNING; - if(dialogDisasm) - { - dialogDisasm->Stop(); - } - } QFileDialog dialog(0,"Load state"); dialog.setFileMode(QFileDialog::ExistingFile); QStringList filters; @@ -425,14 +409,6 @@ void MainWindow::on_action_FileLoadStateFile_triggered() void MainWindow::on_action_FileSaveStateFile_triggered() { - if (g_State.bEmuThreadStarted) - { - nextState = Core_IsStepping() ? CORE_STEPPING : CORE_RUNNING; - if(dialogDisasm) - { - dialogDisasm->Stop(); - } - } QFileDialog dialog(0,"Save state"); dialog.setFileMode(QFileDialog::AnyFile); dialog.setAcceptMode(QFileDialog::AcceptSave); @@ -449,27 +425,11 @@ void MainWindow::on_action_FileSaveStateFile_triggered() void MainWindow::on_action_FileQuickloadState_triggered() { - if (g_State.bEmuThreadStarted) - { - nextState = Core_IsStepping() ? CORE_STEPPING : CORE_RUNNING; - if(dialogDisasm) - { - dialogDisasm->Stop(); - } - } SaveState::LoadSlot(0, SaveStateActionFinished, this); } void MainWindow::on_action_FileQuickSaveState_triggered() { - if (g_State.bEmuThreadStarted) - { - nextState = Core_IsStepping() ? CORE_STEPPING : CORE_RUNNING; - if(dialogDisasm) - { - dialogDisasm->Stop(); - } - } SaveState::SaveSlot(0, SaveStateActionFinished, this); } diff --git a/Windows/WndMainWindow.cpp b/Windows/WndMainWindow.cpp index d8c35701eff6..2a233ff0349a 100644 --- a/Windows/WndMainWindow.cpp +++ b/Windows/WndMainWindow.cpp @@ -869,13 +869,6 @@ namespace MainWindow if (!result) MessageBox(0, "Savestate failure. Please try again later.", "Sorry", MB_OK); SetCursor(LoadCursor(0, IDC_ARROW)); - - if (g_State.bEmuThreadStarted && nextState == CORE_RUNNING) - { - for (int i=0; iGetDlgHandle(), WM_COMMAND, IDC_GO, 0); - } } void SetNextState(CoreState state) From 7eb9af271bff2a82f16e11da7693d6fec81e10e5 Mon Sep 17 00:00:00 2001 From: "Unknown W. Brackets" Date: Sat, 23 Feb 2013 14:27:57 -0800 Subject: [PATCH 139/347] Fix downcount check without fastmem in jr. --- Core/MIPS/x86/Jit.cpp | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/Core/MIPS/x86/Jit.cpp b/Core/MIPS/x86/Jit.cpp index 3c3a385476fd..92d1d893b33d 100644 --- a/Core/MIPS/x86/Jit.cpp +++ b/Core/MIPS/x86/Jit.cpp @@ -348,6 +348,8 @@ void Jit::WriteExitDestInEAX() CMP(32, R(EAX), Imm32(PSP_GetUserMemoryEnd())); FixupBranch tooHigh = J_CC(CC_GE); + // Need to set neg flag again if necessary. + SUB(32, M(¤tMIPS->downcount), Imm32(0)); JMP(asm_.dispatcher, true); SetJumpTarget(tooLow); @@ -355,12 +357,18 @@ void Jit::WriteExitDestInEAX() ABI_CallFunctionA(thunks.ProtectFunction((void *) Memory::GetPointer, 1), R(EAX)); CMP(32, R(EAX), Imm32(0)); - J_CC(CC_NE, asm_.dispatcher, true); + FixupBranch skip = J_CC(CC_NE); // TODO: "Ignore" this so other threads can continue? if (g_Config.bIgnoreBadMemAccess) ABI_CallFunctionA(thunks.ProtectFunction((void *) Core_UpdateState, 1), Imm32(CORE_ERROR)); + + SUB(32, M(¤tMIPS->downcount), Imm32(0)); JMP(asm_.dispatcherCheckCoreState, true); + SetJumpTarget(skip); + + SUB(32, M(¤tMIPS->downcount), Imm32(0)); + J_CC(CC_NE, asm_.dispatcher, true); } else JMP(asm_.dispatcher, true); From 2cb26014562fa6f1a925e6fd7e01a37fcb87a1b2 Mon Sep 17 00:00:00 2001 From: "Unknown W. Brackets" Date: Sat, 23 Feb 2013 18:35:22 -0800 Subject: [PATCH 140/347] Fix crash executing the sascore test. --- Core/HW/SasAudio.cpp | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/Core/HW/SasAudio.cpp b/Core/HW/SasAudio.cpp index aa22d3b87542..ce79551865dd 100644 --- a/Core/HW/SasAudio.cpp +++ b/Core/HW/SasAudio.cpp @@ -88,6 +88,11 @@ void VagDecoder::GetSamples(s16 *outSamples, int numSamples) { return; } u8 *readp = Memory::GetPointer(read_); + if (!readp) + { + WARN_LOG(HLE, "Bad VAG samples address?"); + return; + } u8 *origp = readp; for (int i = 0; i < numSamples; i++) { if (curSample == 28) { From e3a953972aefc86b76ec14300f8e59d8cfeb3d6f Mon Sep 17 00:00:00 2001 From: Sacha Date: Sun, 24 Feb 2013 13:23:04 +1000 Subject: [PATCH 141/347] Fix for iOS CMake Update toolchain file to reflect that we want to use clang (rock88 is using clang). Set target in the CMake. Fix for packaging and signing (thanks rock88). Update linking to include audio and GLKit (thanks rock88). Update README --- CMakeLists.txt | 38 ++++++++++++++++++++++++++------------ README.md | 2 -- ios/ios.toolchain.cmake | 19 +++++++++++-------- 3 files changed, 37 insertions(+), 22 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 0a1402a5d020..1c7d7a9bc76c 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -63,12 +63,12 @@ else() endif() #find_package(Qt5Widgets) -if(USING_GLES2) +if(USING_GLES2 AND NOT IOS) set(OPENGL_LIBRARIES GLESv2) -else() +elseif(NOT IOS) include(FindOpenGL REQUIRED) endif() -if (NOT BLACKBERRY AND NOT ANDROID) +if (NOT BLACKBERRY AND NOT ANDROID AND NOT IOS) include(FindSDL) endif() include(FindThreads) @@ -119,9 +119,8 @@ if(NOT MSVC) add_definitions(-D_XOPEN_SOURCE=600 -D_XOPEN_SOURCE_EXTENDED -D__BSD_VISIBLE=1) add_definitions(-D_LARGEFILE64_SOURCE=1 -D_FILE_OFFSET_BITS=64) endif() - - if(APPLE) - set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -stdlib=libc++") + if(IOS) + add_definitions(-DGL_ETC1_RGB8_OES=0) endif() if(BLACKBERRY) @@ -133,6 +132,9 @@ if(NOT MSVC) add_definitions(-msse2) endif() + if(APPLE) + set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -stdlib=libc++") + endif() if(CMAKE_COMPILER_IS_GNUCXX AND CMAKE_CXX_COMPILER_VERSION VERSION_LESS 4.7.0) set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++0x") else() @@ -415,9 +417,8 @@ elseif(IOS) ios/AppDelegate.h ios/ViewController.mm ios/ViewController.h) - set(CMAKE_EXE_LINKER_FLAGS "-framework Foundation -framework CoreGraphics -framework QuartzCore -framework OpenGLES -framework UIKit") - # No target - # set(TargetBin PPSSPP) + set(nativeExtraLibs ${nativeExtraLibs} "-framework Foundation -framework AudioToolbox -framework CoreGraphics -framework QuartzCore -framework OpenGLES -framework UIKit -framework GLKit") + set(TargetBin PPSSPP) elseif(USING_QT_UI) # Currently unused find_package(Qt4 COMPONENTS QtMultimedia QtOpenGL QtGui QtCore) @@ -950,15 +951,28 @@ set(NativeAssets set(LinkCommon ${CoreLibName} ${CMAKE_THREAD_LIBS_INIT} ${nativeExtraLibs}) if (TargetBin) - add_executable(${TargetBin} ${NativeAppSource}) + if (IOS) + add_executable(${TargetBin} MACOSX_BUNDLE ${NativeAppSource}) + else() + add_executable(${TargetBin} ${NativeAppSource}) + endif() target_link_libraries(${TargetBin} ${LinkCommon}) endif() +# installs file(INSTALL ${NativeAssets} DESTINATION assets) -# code signing +# packaging and code signing if (IOS) - set_target_properties(${NAME} PROPERTIES MACOSX_BUNDLE_INFO_PLIST PPSSPP-Info.plist XCODE_ATTRIBUTE_CODE_SIGN_IDENTITY "iPhone Developer: My Name") + set(RSRC_XIB_FILES assets/Icon@2x.png) + set(RSRC_PATH /Developer/Library/PrivateFrameworks/DevToolsCore.framework/Resources) + SET_SOURCE_FILES_PROPERTIES(${RSRC_XIB_FILES} PROPERTIES MACOSX_PACKAGE_LOCATION Resources) + set(APP_DIR_NAME \${TARGET_BUILD_DIR}/\${FULL_PRODUCT_NAME}) + set(RES_DIR assets) + add_custom_command(TARGET PPSSPP POST_BUILD + COMMAND ${RSRC_PATH}/pbxcp -exclude .DS_Store -exclude CVS -exclude .git -resolve-src-symlinks ${RES_DIR} ${APP_DIR_NAME} + ) + set_target_properties(${TargetBin} PROPERTIES MACOSX_BUNDLE_INFO_PLIST ../ios/PPSSPP-Info.plist XCODE_ATTRIBUTE_CODE_SIGN_IDENTITY "iPhone Developer: My Name") endif() #include(CPack) diff --git a/README.md b/README.md index 6131a815d850..7b644667cf12 100644 --- a/README.md +++ b/README.md @@ -103,8 +103,6 @@ other than Microsoft's, but `NMake Makefiles` works fine. Building for iOS ---------------- -Note: This does not work yet. - Create a `build-ios` directory and inside it run: cmake -DCMAKE_TOOLCHAIN_FILE=../ios/ios.toolchain.cmake -GXcode .. diff --git a/ios/ios.toolchain.cmake b/ios/ios.toolchain.cmake index 9af6cb06e6de..93feb5d322e4 100644 --- a/ios/ios.toolchain.cmake +++ b/ios/ios.toolchain.cmake @@ -31,9 +31,12 @@ # Standard settings set (CMAKE_SYSTEM_NAME Darwin) set (CMAKE_SYSTEM_VERSION 1) +set (CMAKE_SYSTEM_PROCESSOR arm) set (UNIX True) set (APPLE True) set (IOS True) +set (APP_TYPE MACOSX_BUNDLE) +set (CMAKE_XCODE_ATTRIBUTE_IPHONEOS_DEPLOYMENT_TARGET 5.0) # Determine the cmake host system version so we know where to find the iOS SDKs find_program (CMAKE_UNAME uname /bin /usr/bin /usr/local/bin) @@ -42,12 +45,8 @@ if (CMAKE_UNAME) string (REGEX REPLACE "^([0-9]+)\\.([0-9]+).*$" "\\1" DARWIN_MAJOR_VERSION "${CMAKE_HOST_SYSTEM_VERSION}") endif (CMAKE_UNAME) -# Force the compilers to gcc for iOS -include (CMakeForceCompiler) -CMAKE_FORCE_C_COMPILER (gcc gcc) -CMAKE_FORCE_CXX_COMPILER (g++ g++) - # Skip the platform compiler checks for cross compiling +set (CMAKE_CROSSCOMPILING TRUE) set (CMAKE_CXX_COMPILER_WORKS TRUE) set (CMAKE_C_COMPILER_WORKS TRUE) @@ -105,12 +104,9 @@ endif (${IOS_PLATFORM} STREQUAL "OS") # Setup iOS developer location unless specified manually with CMAKE_IOS_DEVELOPER_ROOT # Note Xcode 4.3 changed the installation location, choose the most recent one available set (XCODE_POST_43_ROOT "/Applications/Xcode.app/Contents/Developer/Platforms/${IOS_PLATFORM_LOCATION}/Developer") -set (XCODE_PRE_43_ROOT "/Developer/Platforms/${IOS_PLATFORM_LOCATION}/Developer") if (NOT DEFINED CMAKE_IOS_DEVELOPER_ROOT) if (EXISTS ${XCODE_POST_43_ROOT}) set (CMAKE_IOS_DEVELOPER_ROOT ${XCODE_POST_43_ROOT}) - elseif(EXISTS ${XCODE_PRE_43_ROOT}) - set (CMAKE_IOS_DEVELOPER_ROOT ${XCODE_PRE_43_ROOT}) endif (EXISTS ${XCODE_POST_43_ROOT}) endif (NOT DEFINED CMAKE_IOS_DEVELOPER_ROOT) set (CMAKE_IOS_DEVELOPER_ROOT ${CMAKE_IOS_DEVELOPER_ROOT} CACHE PATH "Location of iOS Platform") @@ -132,6 +128,13 @@ set (CMAKE_IOS_SDK_ROOT ${CMAKE_IOS_SDK_ROOT} CACHE PATH "Location of the select # Set the sysroot default to the most recent SDK set (CMAKE_OSX_SYSROOT ${CMAKE_IOS_SDK_ROOT} CACHE PATH "Sysroot used for iOS support") +# Force the compilers to clang for iOS +include (CMakeForceCompiler) +CMAKE_FORCE_C_COMPILER ("${CMAKE_IOS_DEVELOPER_ROOT}/usr/bin/clang") +CMAKE_FORCE_CXX_COMPILER ("${CMAKE_IOS_DEVELOPER_ROOT}/usr/bin/clang++") +set(CMAKE_XCODE_ATTRIBUTE_CLANG_CXX_LANGUAGE_STANDARD "c++0x") +set(CMAKE_XCODE_ATTRIBUTE_CLANG_CXX_LIBRARY "libstdc++") + # set the architecture for iOS # NOTE: Currently both ARCHS_STANDARD_32_BIT and ARCHS_UNIVERSAL_IPHONE_OS set armv7 only, so set both manually if (${IOS_PLATFORM} STREQUAL "OS") From 0b8706684ab921facce1c5135f5ac18868f26e55 Mon Sep 17 00:00:00 2001 From: Sacha Date: Sun, 24 Feb 2013 13:32:23 +1000 Subject: [PATCH 142/347] Add iOS icons to project (from rock88). --- ios/PPSSPP-Info.plist | 17 +++++++++++------ ios/ViewController.mm | 2 +- ios/assets/Icon-72.png | Bin 0 -> 9846 bytes ios/assets/Icon-72@2x.png | Bin 0 -> 14445 bytes ios/assets/Icon.png | Bin 0 -> 7861 bytes ios/assets/Icon@2x.png | Bin 0 -> 16720 bytes 6 files changed, 12 insertions(+), 7 deletions(-) create mode 100644 ios/assets/Icon-72.png create mode 100644 ios/assets/Icon-72@2x.png create mode 100644 ios/assets/Icon.png create mode 100644 ios/assets/Icon@2x.png diff --git a/ios/PPSSPP-Info.plist b/ios/PPSSPP-Info.plist index 5fe1a739c6dd..0f42d9ca8a07 100644 --- a/ios/PPSSPP-Info.plist +++ b/ios/PPSSPP-Info.plist @@ -5,15 +5,15 @@ CFBundleDevelopmentRegion en CFBundleDisplayName - ${PRODUCT_NAME} + PPSSPP CFBundleExecutable - ${EXECUTABLE_NAME} + PPSSPP CFBundleIdentifier - com.rock88dev.${PRODUCT_NAME:rfc1034identifier} + com.rock88dev.PPSSPP CFBundleInfoDictionaryVersion 6.0 CFBundleName - ${PRODUCT_NAME} + PPSSPP CFBundlePackageType APPL CFBundleShortVersionString @@ -37,10 +37,15 @@ UISupportedInterfaceOrientations~ipad - UIInterfaceOrientationPortrait - UIInterfaceOrientationPortraitUpsideDown UIInterfaceOrientationLandscapeLeft UIInterfaceOrientationLandscapeRight + CFBundleIconFiles + + assets/Icon-72.png + assets/Icon-72@2x.png + assets/Icon.png + assets/Icon@2x.png + diff --git a/ios/ViewController.mm b/ios/ViewController.mm index 576d3b68cac2..8194b3235bab 100644 --- a/ios/ViewController.mm +++ b/ios/ViewController.mm @@ -53,7 +53,7 @@ - (id)init self.touches = [[[NSMutableArray alloc] init] autorelease]; self.documentsPath = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) objectAtIndex:0]; - self.bundlePath = [[[NSBundle mainBundle] resourcePath] stringByAppendingString:@"/"]; + self.bundlePath = [[[NSBundle mainBundle] resourcePath] stringByAppendingString:@"/assets"]; memset(&input_state, 0, sizeof(input_state)); diff --git a/ios/assets/Icon-72.png b/ios/assets/Icon-72.png new file mode 100644 index 0000000000000000000000000000000000000000..1ae6c4655737a2b2660a434fa9196b654e6669a8 GIT binary patch literal 9846 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 literal 0 HcmV?d00001 diff --git a/ios/assets/Icon.png b/ios/assets/Icon.png new file mode 100644 index 0000000000000000000000000000000000000000..5852d4fb0a62d61a0ff994200dbe126a646ca3f2 GIT binary patch literal 7861 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 T9KT^}00000NkvXXu0mjfieMu^ literal 0 HcmV?d00001 diff --git a/ios/assets/Icon@2x.png b/ios/assets/Icon@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..fa0829e92648e00fbdcdfd15b49a5293d513820e GIT binary patch literal 16720 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 Date: Sat, 23 Feb 2013 19:31:03 -0800 Subject: [PATCH 143/347] Update tests. --- pspautotests | 2 +- test.py | 32 ++++++++++++++++++++++---------- 2 files changed, 23 insertions(+), 11 deletions(-) diff --git a/pspautotests b/pspautotests index c4427bd55d57..90be520fceff 160000 --- a/pspautotests +++ b/pspautotests @@ -1 +1 @@ -Subproject commit c4427bd55d57af2484f5ccd4ec1bed2bcf674395 +Subproject commit 90be520fceff14f58fde21cf9650103865560549 diff --git a/test.py b/test.py index 2d98e03079bc..d37baac4e90c 100755 --- a/test.py +++ b/test.py @@ -60,13 +60,14 @@ def target(): "misc/testgp", "misc/libc", "misc/dcache", + "mstick/mstick", "string/string", "gpu/callbacks/ge_callbacks", - "gpu/displaylist/state", "threads/alarm/alarm", "threads/alarm/cancel/cancel", "threads/alarm/refer/refer", "threads/alarm/set/set", + "threads/callbacks/callbacks", "threads/events/events", "threads/events/cancel/cancel", "threads/events/clear/clear", @@ -109,12 +110,17 @@ def target(): "threads/semaphores/refer/refer", "threads/semaphores/signal/signal", "threads/semaphores/wait/wait", - "threads/vpl/vpl", + "threads/threads/release", + "threads/threads/rotate", + "threads/threads/threadend", + "threads/threads/threads", + "threads/vpl/cancel", "threads/vpl/delete", "threads/vpl/free", "threads/vpl/priority", "threads/vpl/refer", "threads/vpl/try", + "threads/vpl/vpl", "power/power", "umd/callbacks/umd", "umd/wait/wait", @@ -122,42 +128,48 @@ def target(): ] tests_next = [ +# These are the next tests up for fixing. These run by default. + "audio/atrac/atractest", + "audio/mp3/mp3test", "audio/sascore/sascore", + "display/vblankmulti", "malloc/malloc", -# These are the next tests up for fixing. These run by default. "threads/fpl/fpl", "threads/k0/k0", "threads/msgpipe/msgpipe", "threads/scheduling/scheduling", - "threads/threads/threads", + "threads/threads/create", "threads/vtimers/vtimer", "threads/vpl/allocate", "threads/vpl/create", "threads/wakeup/wakeup", + "gpu/commands/basic", + "gpu/complex/complex", + "gpu/displaylist/state", + "gpu/reflection/reflection", + "gpu/rendertarget/rendertarget", + "gpu/signals/jumps", + "gpu/signals/simple", "gpu/simple/simple", "gpu/triangle/triangle", - "gpu/commands/basic", "hle/check_not_used_uids", "font/fonttest", "io/cwd/cwd", + "io/file/file", "io/io/io", "io/iodrv/iodrv", "modules/loadexec/loader", "rtc/rtc", + "sysmem/sysmem", "umd/io/umd_io", "umd/raw_access/raw_access", "utility/systemparam/systemparam", "video/pmf/pmf", "video/pmf_simple/pmf_simple", - - # Currently hang or crash. - "audio/atrac/atractest", ] # These don't even run (or run correctly) on the real PSP test_broken = [ - "sysmem/sysmem", - "mstick/mstick", ] From 2cc0e08ce574828ef571737cba69ee341e2d8d3d Mon Sep 17 00:00:00 2001 From: "Unknown W. Brackets" Date: Sat, 23 Feb 2013 19:31:34 -0800 Subject: [PATCH 144/347] Switch on jit again by default. --- headless/Headless.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/headless/Headless.cpp b/headless/Headless.cpp index 37e616bf77f6..f8db1ff0fbbb 100644 --- a/headless/Headless.cpp +++ b/headless/Headless.cpp @@ -78,7 +78,7 @@ void printUsage(const char *progname, const char *reason) int main(int argc, const char* argv[]) { bool fullLog = false; - bool useJit = false; + bool useJit = true; bool autoCompare = false; bool useGraphics = false; From 90081f144168c06cca354f4b94792bd085b868a9 Mon Sep 17 00:00:00 2001 From: "Unknown W. Brackets" Date: Sat, 23 Feb 2013 19:34:06 -0800 Subject: [PATCH 145/347] Ignore __testfailure.bmp. --- .gitignore | 1 + 1 file changed, 1 insertion(+) diff --git a/.gitignore b/.gitignore index a99238ff41ba..ce3a06d2d19c 100644 --- a/.gitignore +++ b/.gitignore @@ -42,6 +42,7 @@ build*/ __testoutput.txt __testerror.txt __testfinish.txt +__testfailure.bmp GameLogNotes.txt android/ui_atlas.zim From e848d19dbea6b8972b093490008bedd257ee6eac Mon Sep 17 00:00:00 2001 From: Sacha Date: Sun, 24 Feb 2013 13:47:45 +1000 Subject: [PATCH 146/347] Fix for FBO on iOS devices. Allows buffered rendering (from rock88). --- ios/ViewController.mm | 13 +++++++++++++ native | 2 +- 2 files changed, 14 insertions(+), 1 deletion(-) diff --git a/ios/ViewController.mm b/ios/ViewController.mm index 8194b3235bab..996ba92c5087 100644 --- a/ios/ViewController.mm +++ b/ios/ViewController.mm @@ -34,6 +34,8 @@ extern std::string ram_temp_file; +ViewController* sharedViewController; + @interface ViewController () @property (strong, nonatomic) EAGLContext *context; @@ -50,6 +52,7 @@ - (id)init { self = [super init]; if (self) { + sharedViewController = self; self.touches = [[[NSMutableArray alloc] init] autorelease]; self.documentsPath = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) objectAtIndex:0]; @@ -230,11 +233,21 @@ - (void)touchesEnded:(NSSet *)_touches withEvent:(UIEvent *)event } } +- (void)bindDefaultFBO +{ + [(GLKView*)self.view bindDrawable]; +} + void LaunchBrowser(char const* url) { [[UIApplication sharedApplication] openURL:[NSURL URLWithString:[NSString stringWithCString:url encoding:NSStringEncodingConversionAllowLossy]]]; } +void bindDefaultFBO() +{ + [sharedViewController bindDefaultFBO]; +} + void EnableFZ(){}; void DisableFZ(){}; diff --git a/native b/native index 9c183fcca841..318e75a66544 160000 --- a/native +++ b/native @@ -1 +1 @@ -Subproject commit 9c183fcca8416a34d510880d483ccf5f2ec573f4 +Subproject commit 318e75a66544ef7a1ddbc2423603d3d7a8116d24 From 9311c079e0227429fd2b03e57700f6bbbd57e9be Mon Sep 17 00:00:00 2001 From: "Unknown W. Brackets" Date: Sat, 23 Feb 2013 19:49:36 -0800 Subject: [PATCH 147/347] Buildfix for Mac. --- native | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/native b/native index 318e75a66544..e77cea0211a9 160000 --- a/native +++ b/native @@ -1 +1 @@ -Subproject commit 318e75a66544ef7a1ddbc2423603d3d7a8116d24 +Subproject commit e77cea0211a9cf480a815113f6e598c6666d453f From f9a0c3f41a120641c1585fad7bda2e7fd3954798 Mon Sep 17 00:00:00 2001 From: "Unknown W. Brackets" Date: Sat, 23 Feb 2013 19:53:17 -0800 Subject: [PATCH 148/347] Arg, buildfix for Mac. Submodules make this hard. --- native | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/native b/native index e77cea0211a9..17c8eb1ae7ca 160000 --- a/native +++ b/native @@ -1 +1 @@ -Subproject commit e77cea0211a9cf480a815113f6e598c6666d453f +Subproject commit 17c8eb1ae7ca285a4228bac56059ca441b53ba6f From 0af9d2e360c48fed859cce761dea82b28232a434 Mon Sep 17 00:00:00 2001 From: sum2012 Date: Sun, 24 Feb 2013 12:16:18 +0800 Subject: [PATCH 149/347] Add support of another patchers --- Core/PSPLoaders.cpp | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/Core/PSPLoaders.cpp b/Core/PSPLoaders.cpp index e73ec60564d8..e1beb4cadef5 100644 --- a/Core/PSPLoaders.cpp +++ b/Core/PSPLoaders.cpp @@ -89,6 +89,10 @@ bool Load_PSP_ISO(const char *filename, std::string *error_string) if (pspFileSystem.GetFileInfo("disc0:/PSP_GAME/SYSDIR/EBOOT.OLD").exists) { bootpath = "disc0:/PSP_GAME/SYSDIR/EBOOT.OLD"; } + // bypass another patchers + if (pspFileSystem.GetFileInfo("disc0:/PSP_GAME/SYSDIR/EBOOT.DAT").exists) { + bootpath = "disc0:/PSP_GAME/SYSDIR/EBOOT.DAT"; + } bool hasEncrypted = false; u32 fd; if ((fd = pspFileSystem.OpenFile(bootpath, FILEACCESS_READ)) != 0) From 24ff1431584c2b45b43b193ee10392a898094d8e Mon Sep 17 00:00:00 2001 From: Sacha Date: Sun, 24 Feb 2013 14:42:12 +1000 Subject: [PATCH 150/347] Set frame rate to 60 on iOS. Default was 30. --- ios/AppDelegate.m | 1 + 1 file changed, 1 insertion(+) diff --git a/ios/AppDelegate.m b/ios/AppDelegate.m index 8601d4fee799..17534789f5bc 100644 --- a/ios/AppDelegate.m +++ b/ios/AppDelegate.m @@ -19,6 +19,7 @@ - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:( self.viewController = [[[ViewController alloc] init] autorelease]; self.window.rootViewController = self.viewController; [self.window makeKeyAndVisible]; + [self setFrameRate:60]; return YES; } From d284a5a41364d62f960cec028b00150aaf835ad1 Mon Sep 17 00:00:00 2001 From: Sacha Date: Sun, 24 Feb 2013 17:19:49 +1000 Subject: [PATCH 151/347] Fix for iOS Revert CLang to gcc. Revert 60 fps (this wasn't working). Revert rock88's pbxcp usage. This file is no longer available in XCode 4.4+. --- CMakeLists.txt | 5 ++--- ios/AppDelegate.m | 1 - ios/ios.toolchain.cmake | 12 +++++------- 3 files changed, 7 insertions(+), 11 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 1c7d7a9bc76c..fb502b23a07e 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -965,14 +965,13 @@ file(INSTALL ${NativeAssets} DESTINATION assets) # packaging and code signing if (IOS) set(RSRC_XIB_FILES assets/Icon@2x.png) - set(RSRC_PATH /Developer/Library/PrivateFrameworks/DevToolsCore.framework/Resources) SET_SOURCE_FILES_PROPERTIES(${RSRC_XIB_FILES} PROPERTIES MACOSX_PACKAGE_LOCATION Resources) set(APP_DIR_NAME \${TARGET_BUILD_DIR}/\${FULL_PRODUCT_NAME}) set(RES_DIR assets) add_custom_command(TARGET PPSSPP POST_BUILD - COMMAND ${RSRC_PATH}/pbxcp -exclude .DS_Store -exclude CVS -exclude .git -resolve-src-symlinks ${RES_DIR} ${APP_DIR_NAME} + COMMAND tar -c -C . --exclude .DS_Store --exclude .git -H `find {RES_DIR}` | tar -x -C ${APP_DIR_NAME} ) - set_target_properties(${TargetBin} PROPERTIES MACOSX_BUNDLE_INFO_PLIST ../ios/PPSSPP-Info.plist XCODE_ATTRIBUTE_CODE_SIGN_IDENTITY "iPhone Developer: My Name") + set_target_properties(${TargetBin} PROPERTIES MACOSX_BUNDLE_INFO_PLIST "../ios/PPSSPP-Info.plist" XCODE_ATTRIBUTE_CODE_SIGN_IDENTITY "iPhone Developer: My Name") endif() #include(CPack) diff --git a/ios/AppDelegate.m b/ios/AppDelegate.m index 17534789f5bc..8601d4fee799 100644 --- a/ios/AppDelegate.m +++ b/ios/AppDelegate.m @@ -19,7 +19,6 @@ - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:( self.viewController = [[[ViewController alloc] init] autorelease]; self.window.rootViewController = self.viewController; [self.window makeKeyAndVisible]; - [self setFrameRate:60]; return YES; } diff --git a/ios/ios.toolchain.cmake b/ios/ios.toolchain.cmake index 93feb5d322e4..7c0e2a778f97 100644 --- a/ios/ios.toolchain.cmake +++ b/ios/ios.toolchain.cmake @@ -45,6 +45,11 @@ if (CMAKE_UNAME) string (REGEX REPLACE "^([0-9]+)\\.([0-9]+).*$" "\\1" DARWIN_MAJOR_VERSION "${CMAKE_HOST_SYSTEM_VERSION}") endif (CMAKE_UNAME) +# Force the compilers to clang for iOS +include (CMakeForceCompiler) +CMAKE_FORCE_C_COMPILER (gcc gcc) +CMAKE_FORCE_CXX_COMPILER (g++ g++) + # Skip the platform compiler checks for cross compiling set (CMAKE_CROSSCOMPILING TRUE) set (CMAKE_CXX_COMPILER_WORKS TRUE) @@ -128,13 +133,6 @@ set (CMAKE_IOS_SDK_ROOT ${CMAKE_IOS_SDK_ROOT} CACHE PATH "Location of the select # Set the sysroot default to the most recent SDK set (CMAKE_OSX_SYSROOT ${CMAKE_IOS_SDK_ROOT} CACHE PATH "Sysroot used for iOS support") -# Force the compilers to clang for iOS -include (CMakeForceCompiler) -CMAKE_FORCE_C_COMPILER ("${CMAKE_IOS_DEVELOPER_ROOT}/usr/bin/clang") -CMAKE_FORCE_CXX_COMPILER ("${CMAKE_IOS_DEVELOPER_ROOT}/usr/bin/clang++") -set(CMAKE_XCODE_ATTRIBUTE_CLANG_CXX_LANGUAGE_STANDARD "c++0x") -set(CMAKE_XCODE_ATTRIBUTE_CLANG_CXX_LIBRARY "libstdc++") - # set the architecture for iOS # NOTE: Currently both ARCHS_STANDARD_32_BIT and ARCHS_UNIVERSAL_IPHONE_OS set armv7 only, so set both manually if (${IOS_PLATFORM} STREQUAL "OS") From 65467bae1fdb02388b518845994d196c7030c15c Mon Sep 17 00:00:00 2001 From: "Unknown W. Brackets" Date: Sat, 23 Feb 2013 23:25:32 -0800 Subject: [PATCH 152/347] Flush on any clutaddr change, even just upper. Fixes ClaDun black boxes, wrong colors in game. --- GPU/GLES/DisplayListInterpreter.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/GPU/GLES/DisplayListInterpreter.cpp b/GPU/GLES/DisplayListInterpreter.cpp index 82cafa1b3f67..32cbee9b7cda 100644 --- a/GPU/GLES/DisplayListInterpreter.cpp +++ b/GPU/GLES/DisplayListInterpreter.cpp @@ -119,6 +119,7 @@ static const u8 flushOnChangedBeforeCommandList[] = { GE_CMD_MASKALPHA, GE_CMD_TEXBUFWIDTH0, GE_CMD_CLUTADDR, + GE_CMD_CLUTADDRUPPER, GE_CMD_LOADCLUT, GE_CMD_CLUTFORMAT, GE_CMD_TEXADDR0,GE_CMD_TEXADDR1,GE_CMD_TEXADDR2,GE_CMD_TEXADDR3, From 0f2f59a3f630ec4cb3ebe58517d3c763d0534245 Mon Sep 17 00:00:00 2001 From: Sacha Date: Sun, 24 Feb 2013 17:28:31 +1000 Subject: [PATCH 153/347] Potential JIT for iOS fix. --- CMakeLists.txt | 2 +- Common/ArmEmitter.cpp | 6 +++++- 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index fb502b23a07e..f88157a94464 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -969,7 +969,7 @@ if (IOS) set(APP_DIR_NAME \${TARGET_BUILD_DIR}/\${FULL_PRODUCT_NAME}) set(RES_DIR assets) add_custom_command(TARGET PPSSPP POST_BUILD - COMMAND tar -c -C . --exclude .DS_Store --exclude .git -H `find {RES_DIR}` | tar -x -C ${APP_DIR_NAME} + COMMAND tar -c -C . --exclude .DS_Store --exclude .git -H `find ${RES_DIR}` | tar -x -C ${APP_DIR_NAME} ) set_target_properties(${TargetBin} PROPERTIES MACOSX_BUNDLE_INFO_PLIST "../ios/PPSSPP-Info.plist" XCODE_ATTRIBUTE_CODE_SIGN_IDENTITY "iPhone Developer: My Name") endif() diff --git a/Common/ArmEmitter.cpp b/Common/ArmEmitter.cpp index 0e3e8bdb93fd..e4306c0324bd 100644 --- a/Common/ArmEmitter.cpp +++ b/Common/ArmEmitter.cpp @@ -151,6 +151,9 @@ void ARMXEmitter::SetCodePtr(u8 *ptr) { code = ptr; startcode = code; +#ifdef IOS + lastCacheFlushEnd = ptr; +#endif } const u8 *ARMXEmitter::GetCodePtr() const @@ -194,7 +197,8 @@ void ARMXEmitter::FlushIcacheSection(u8 *start, u8 *end) #elif defined(BLACKBERRY) msync(start, end - start, MS_SYNC | MS_INVALIDATE_ICACHE); #elif defined(IOS) - sys_cache_control(kCacheFunctionPrepareForExecution, start, end - start); + if (start != NULL) + sys_cache_control(kCacheFunctionPrepareForExecution, start, end - start); #elif !defined(_WIN32) __builtin___clear_cache(start, end); #endif From 3fbb5d438854879d0a214f0158ab48e93ec1561c Mon Sep 17 00:00:00 2001 From: "Unknown W. Brackets" Date: Sun, 24 Feb 2013 00:11:50 -0800 Subject: [PATCH 154/347] Avoid using CALL() directly in case of far calls. This mainly matters for x64. --- Common/Thunk.cpp | 6 +++--- Core/MIPS/x86/Asm.cpp | 8 +------- Core/MIPS/x86/Jit.cpp | 2 +- 3 files changed, 5 insertions(+), 11 deletions(-) diff --git a/Common/Thunk.cpp b/Common/Thunk.cpp index 70dc351b9dec..0cc7fb966aaf 100644 --- a/Common/Thunk.cpp +++ b/Common/Thunk.cpp @@ -112,9 +112,9 @@ void *ThunkManager::ProtectFunction(void *function, int num_params) #else SUB(64, R(ESP), Imm8(0x8)); #endif - CALL((void*)save_regs); - CALL((void*)function); - CALL((void*)load_regs); + ABI_CallFunction((void*)save_regs); + ABI_CallFunction((void*)function); + ABI_CallFunction((void*)load_regs); #ifdef _WIN32 ADD(64, R(ESP), Imm8(0x28)); #else diff --git a/Core/MIPS/x86/Asm.cpp b/Core/MIPS/x86/Asm.cpp index 1d4367c7577a..e02d7cc9c37a 100644 --- a/Core/MIPS/x86/Asm.cpp +++ b/Core/MIPS/x86/Asm.cpp @@ -129,13 +129,7 @@ void AsmRoutineManager::Generate(MIPSState *mips, MIPSComp::Jit *jit) SetJumpTarget(notfound); //Ok, no block, let's jit -#ifdef _M_IX86 - ABI_AlignStack(0); - CALL(reinterpret_cast(&Jit)); - ABI_RestoreStack(0); -#elif _M_X64 - CALL((void *)&Jit); -#endif + ABI_CallFunction((void *)&Jit); JMP(dispatcherNoCheck); // Let's just dispatch again, we'll enter the block since we know it's there. SetJumpTarget(bail); diff --git a/Core/MIPS/x86/Jit.cpp b/Core/MIPS/x86/Jit.cpp index 92d1d893b33d..6a5bb0ac54ca 100644 --- a/Core/MIPS/x86/Jit.cpp +++ b/Core/MIPS/x86/Jit.cpp @@ -386,7 +386,7 @@ bool Jit::CheckJitBreakpoint(u32 addr, int downcountOffset) { FlushAll(); MOV(32, M(&mips_->pc), Imm32(js.compilerPC)); - CALL((void *)&JitBreakpoint); + ABI_CallFunction((void *)&JitBreakpoint); WriteDowncount(downcountOffset); JMP(asm_.dispatcherCheckCoreState, true); From 7abcd37909e9147d55cc8d0cf9a4cd20ae726398 Mon Sep 17 00:00:00 2001 From: "Unknown W. Brackets" Date: Sun, 24 Feb 2013 00:15:56 -0800 Subject: [PATCH 155/347] This isn't needed if ABI_CallFunction* is used. AFAICT the only reason for it is to avoid far calls, so we just can't use CALL() directly. It's works even when it throws on Mac. --- Common/MemoryUtil.cpp | 5 ----- 1 file changed, 5 deletions(-) diff --git a/Common/MemoryUtil.cpp b/Common/MemoryUtil.cpp index 59dadba5fd25..a7119b307c93 100644 --- a/Common/MemoryUtil.cpp +++ b/Common/MemoryUtil.cpp @@ -119,11 +119,6 @@ void* AllocateExecutableMemory(size_t size, bool low) } #endif -#if defined(_M_X64) - if ((u64)ptr >= 0x80000000 && low == true) - PanicAlert("Executable memory ended up above 2GB!"); -#endif - return ptr; } From a4f65624c3771708716e1ff5dcb40b586341c182 Mon Sep 17 00:00:00 2001 From: tpu Date: Sun, 24 Feb 2013 16:28:40 +0800 Subject: [PATCH 156/347] add PGD file support. --- Core/HLE/sceIo.cpp | 111 ++++- ext/libkirk/amctrl.c | 671 ++++++++++++++++++++++++++++ ext/libkirk/amctrl.h | 64 +++ ext/libkirk/kirk_engine.h | 2 +- ext/libkirk/libkirk.vcxproj | 1 + ext/libkirk/libkirk.vcxproj.filters | 3 + 6 files changed, 846 insertions(+), 6 deletions(-) create mode 100644 ext/libkirk/amctrl.c create mode 100644 ext/libkirk/amctrl.h diff --git a/Core/HLE/sceIo.cpp b/Core/HLE/sceIo.cpp index 7ea643ab06f1..a46d6060f9b7 100644 --- a/Core/HLE/sceIo.cpp +++ b/Core/HLE/sceIo.cpp @@ -31,6 +31,10 @@ #include "../FileSystems/ISOFileSystem.h" #include "../FileSystems/DirectoryFileSystem.h" +extern "C" { +#include "ext/libkirk/amctrl.h" +}; + #include "sceIo.h" #include "sceRtc.h" #include "sceKernel.h" @@ -76,6 +80,7 @@ umd01: block access - umd #define O_CREAT 0x0200 #define O_TRUNC 0x0400 #define O_NOWAIT 0x8000 +#define O_NPDRM 0x40000000 typedef s32 SceMode; @@ -168,8 +173,17 @@ class FileNode : public KernelObject { PSPFileInfo info; u32 openMode; + + u32 npdrm; + PGD_DESC *pgdInfo; }; +/******************************************************************************/ + + + +/******************************************************************************/ + static void TellFsThreadEnded (SceUID threadID) { pspFileSystem.ThreadEnded(threadID); } @@ -342,6 +356,42 @@ u32 sceIoGetstat(const char *filename, u32 addr) { } } +u32 npdrmRead(FileNode *f, u8 *data, int size) { + PGD_DESC *pgd = f->pgdInfo; + u32 block, offset; + u32 remain_size, copy_size; + + block = pgd->file_offset/pgd->block_size; + offset = pgd->file_offset%pgd->block_size; + + remain_size = size; + + while(remain_size){ + + if(pgd->current_block!=block){ + pspFileSystem.ReadFile(f->handle, pgd->block_buf, pgd->block_size); + pgd_decrypt_block(pgd, block); + pgd->current_block = block; + } + + if(offset+remain_size>pgd->block_size){ + copy_size = pgd->block_size-offset; + block += 1; + offset = 0; + }else{ + copy_size = remain_size; + } + + memcpy(data, pgd->block_buf+offset, copy_size); + + data += copy_size; + remain_size -= copy_size; + pgd->file_offset += copy_size; + } + + return size; +} + //Not sure about wrapping it or not, since the log seems to take the address of the data var u32 sceIoRead(int id, u32 data_addr, int size) { if (id == 3) { @@ -358,7 +408,11 @@ u32 sceIoRead(int id, u32 data_addr, int size) { } else if (Memory::IsValidAddress(data_addr)) { u8 *data = (u8*) Memory::GetPointer(data_addr); - f->asyncResult = (u32) pspFileSystem.ReadFile(f->handle, data, size); + if(f->npdrm){ + f->asyncResult = (u32) npdrmRead(f, data, size); + }else{ + f->asyncResult = (u32) pspFileSystem.ReadFile(f->handle, data, size); + } DEBUG_LOG(HLE, "%i=sceIoRead(%d, %08x , %i)", f->asyncResult, id, data_addr, size); return f->asyncResult; } else { @@ -445,6 +499,26 @@ u32 sceIoCancel(int id) return error; } +u32 npdrmLseek(FileNode *f, s32 where, FileMove whence) +{ + u32 newPos; + + if(whence==FILEMOVE_BEGIN){ + newPos = where; + }else if(whence==FILEMOVE_CURRENT){ + newPos = f->pgdInfo->file_offset+where; + }else{ + newPos = f->pgdInfo->data_size+where; + } + + if(newPos<0 || newPos>f->pgdInfo->data_size){ + return -EINVAL; + } + + f->pgdInfo->file_offset = newPos; + return newPos; +} + s64 sceIoLseek(int id, s64 offset, int whence) { u32 error; FileNode *f = kernelObjects.Get < FileNode > (id, error); @@ -468,7 +542,11 @@ s64 sceIoLseek(int id, s64 offset, int whence) { if(newPos < 0) return -1; - f->asyncResult = (u32) pspFileSystem.SeekFile(f->handle, (s32) offset, seek); + if(f->npdrm){ + f->asyncResult = npdrmLseek(f, (s32)offset, seek); + }else{ + f->asyncResult = (u32) pspFileSystem.SeekFile(f->handle, (s32) offset, seek); + } DEBUG_LOG(HLE, "%i = sceIoLseek(%d,%i,%i)", f->asyncResult, id, (int) offset, whence); return f->asyncResult; } else { @@ -500,7 +578,11 @@ u32 sceIoLseek32(int id, int offset, int whence) { if(newPos < 0) return -1; - f->asyncResult = (u32) pspFileSystem.SeekFile(f->handle, (s32) offset, seek); + if(f->npdrm){ + f->asyncResult = npdrmLseek(f, (s32)offset, seek); + }else{ + f->asyncResult = (u32) pspFileSystem.SeekFile(f->handle, (s32) offset, seek); + } DEBUG_LOG(HLE, "%i = sceIoLseek32(%d,%i,%i)", f->asyncResult, id, (int) offset, whence); return f->asyncResult; } else { @@ -520,6 +602,8 @@ u32 sceIoOpen(const char* filename, int flags, int mode) { access |= FILEACCESS_APPEND; if (flags & O_CREAT) access |= FILEACCESS_CREATE; + if (flags & O_NPDRM) + PSPFileInfo info = pspFileSystem.GetFileInfo(filename); u32 h = pspFileSystem.OpenFile(filename, (FileAccess) access); @@ -535,14 +619,23 @@ u32 sceIoOpen(const char* filename, int flags, int mode) { f->handle = h; f->fullpath = filename; f->asyncResult = id; - f->info = info; + f->info = pspFileSystem.GetFileInfo(filename); f->openMode = access; + + f->npdrm = (flags & O_NPDRM)? true: false; + DEBUG_LOG(HLE, "%i=sceIoOpen(%s, %08x, %08x)", id, filename, flags, mode); return id; } u32 sceIoClose(int id) { + u32 error; DEBUG_LOG(HLE, "sceIoClose(%d)", id); + FileNode *f = kernelObjects.Get < FileNode > (id, error); + if(f && f->npdrm){ + free(f->pgdInfo->block_buf); + free(f->pgdInfo); + } return kernelObjects.Destroy < FileNode > (id); } @@ -1091,8 +1184,16 @@ u32 sceIoIoctl(u32 id, u32 cmd, u32 indataPtr, u32 inlen, u32 outdataPtr, u32 ou case 0x04100001: if (Memory::IsValidAddress(indataPtr) && inlen == 16) { u8 keybuf[16]; + u8 pgd_header[0x90]; memcpy(keybuf, Memory::GetPointer(indataPtr), 16); - ERROR_LOG(HLE, "PGD DRM not yet supported, sorry."); + pspFileSystem.ReadFile(f->handle, pgd_header, 0x90); + f->pgdInfo = pgd_open(pgd_header, 2, keybuf); + if(f->pgdInfo==NULL){ + DEBUG_LOG(HLE, "Not a valid PGD file. Open as normal file."); + f->npdrm = false; + pspFileSystem.SeekFile(f->handle, (s32)0, FILEMOVE_BEGIN); + } + f->asyncResult = 0; } break; diff --git a/ext/libkirk/amctrl.c b/ext/libkirk/amctrl.c new file mode 100644 index 000000000000..32d8db8b7f80 --- /dev/null +++ b/ext/libkirk/amctrl.c @@ -0,0 +1,671 @@ +/* + * amctrl.c -- Reverse engineering of amctrl.prx + * written by tpu. + */ + +#include +#include +#include + +#include "kirk_engine.h" +#include "AES.h" +#include "SHA1.h" +#include "amctrl.h" + +/*************************************************************/ + +static u8 loc_1CD4[16] = {0xE3, 0x50, 0xED, 0x1D, 0x91, 0x0A, 0x1F, 0xD0, 0x29, 0xBB, 0x1C, 0x3E, 0xF3, 0x40, 0x77, 0xFB}; +static u8 loc_1CE4[16] = {0x13, 0x5F, 0xA4, 0x7C, 0xAB, 0x39, 0x5B, 0xA4, 0x76, 0xB8, 0xCC, 0xA9, 0x8F, 0x3A, 0x04, 0x45}; +static u8 loc_1CF4[16] = {0x67, 0x8D, 0x7F, 0xA3, 0x2A, 0x9C, 0xA0, 0xD1, 0x50, 0x8A, 0xD8, 0x38, 0x5E, 0x4B, 0x01, 0x7E}; + +static u8 kirk_buf[0x0814]; // 1DC0 1DD4 + +/*************************************************************/ + +static int kirk4(u8 *buf, int size, int type) +{ + int retv; + u32 *header = (u32*)buf; + + header[0] = 4; + header[1] = 0; + header[2] = 0; + header[3] = type; + header[4] = size; + + retv = sceUtilsBufferCopyWithRange(buf, size+0x14, buf, size, 4); + + if(retv) + return 0x80510311; + + return 0; +} + +static int kirk7(u8 *buf, int size, int type) +{ + int retv; + u32 *header = (u32*)buf; + + header[0] = 5; + header[1] = 0; + header[2] = 0; + header[3] = type; + header[4] = size; + + retv = sceUtilsBufferCopyWithRange(buf, size+0x14, buf, size, 7); + if(retv) + return 0x80510311; + + return 0; +} + +static int kirk5(u8 *buf, int size) +{ + int retv; + u32 *header = (u32*)buf; + + header[0] = 4; + header[1] = 0; + header[2] = 0; + header[3] = 0x0100; + header[4] = size; + + retv = sceUtilsBufferCopyWithRange(buf, size+0x14, buf, size, 5); + if(retv) + return 0x80510312; + + return 0; +} + +static int kirk8(u8 *buf, int size) +{ + int retv; + u32 *header = (u32*)buf; + + header[0] = 5; + header[1] = 0; + header[2] = 0; + header[3] = 0x0100; + header[4] = size; + + retv = sceUtilsBufferCopyWithRange(buf, size+0x14, buf, size, 8); + if(retv) + return 0x80510312; + + return 0; +} + +static int kirk14(u8 *buf) +{ + int retv; + + retv = sceUtilsBufferCopyWithRange(buf, 0x14, 0, 0, 14); + if(retv) + return 0x80510315; + + return 0; +} + +/*************************************************************/ + +// Called by sceDrmBBMacUpdate +// encrypt_buf +static int sub_158(u8 *buf, int size, u8 *key, int key_type) +{ + int i, retv; + + for(i=0; i<16; i++){ + buf[0x14+i] ^= key[i]; + } + + retv = kirk4(buf, size, key_type); + if(retv) + return retv; + + // copy last 16 bytes to keys + memcpy(key, buf+size+4, 16); + + return 0; +} + + +// type: +// 2: use fuse id +// 3: use fixed id +int sceDrmBBMacInit(MAC_KEY *mkey, int type) +{ + mkey->type = type; + mkey->pad_size = 0; + + memset(mkey->key, 0, 16); + memset(mkey->pad, 0, 16); + + return 0; +} + +int sceDrmBBMacUpdate(MAC_KEY *mkey, u8 *buf, int size) +{ + int retv = 0, ksize, p, type; + u8 *kbuf; + + if(mkey->pad_size>16){ + retv = 0x80510302; + goto _exit; + } + + if(mkey->pad_size+size<=16){ + memcpy(mkey->pad+mkey->pad_size, buf, size); + mkey->pad_size += size; + retv = 0; + }else{ + kbuf = kirk_buf+0x14; + // copy pad data first + memcpy(kbuf, mkey->pad, mkey->pad_size); + + p = mkey->pad_size; + + mkey->pad_size += size; + mkey->pad_size &= 0x0f; + if(mkey->pad_size==0) + mkey->pad_size = 16; + + size -= mkey->pad_size; + // save last data to pad buf + memcpy(mkey->pad, buf+size, mkey->pad_size); + + type = (mkey->type==2)? 0x3A : 0x38; + + while(size){ + ksize = (size+p>=0x0800)? 0x0800 : size+p; + memcpy(kbuf+p, buf, ksize-p); + retv = sub_158(kirk_buf, ksize, mkey->key, type); + if(retv) + goto _exit; + size -= (ksize-p); + buf += ksize-p; + p = 0; + } + } + +_exit: + return retv; + +} + +int sceDrmBBMacFinal(MAC_KEY *mkey, u8 *buf, u8 *vkey) +{ + int i, retv, code; + u8 *kbuf, tmp[16], tmp1[16]; + u32 t0, v0, v1; + + if(mkey->pad_size>16) + return 0x80510302; + + code = (mkey->type==2)? 0x3A : 0x38; + kbuf = kirk_buf+0x14; + + memset(kbuf, 0, 16); + retv = kirk4(kirk_buf, 16, code); + if(retv) + goto _exit; + memcpy(tmp, kbuf, 16); + + // left shift tmp 1 bit + t0 = (tmp[0]&0x80)? 0x87 : 0; + for(i=0; i<15; i++){ + v1 = tmp[i+0]; + v0 = tmp[i+1]; + v1 <<= 1; + v0 >>= 7; + v0 |= v1; + tmp[i+0] = v0; + } + v0 = tmp[15]; + v0 <<= 1; + v0 ^= t0; + tmp[15] = v0; + + // padding remain data + if(mkey->pad_size<16){ + // left shift tmp 1 bit + t0 = (tmp[0]&0x80)? 0x87 : 0; + for(i=0; i<15; i++){ + v1 = tmp[i+0]; + v0 = tmp[i+1]; + v1 <<= 1; + v0 >>= 7; + v0 |= v1; + tmp[i+0] = v0; + } + v0 = tmp[15]; + v0 <<= 1; + v0 ^= t0; + tmp[15] = v0; + + mkey->pad[mkey->pad_size] = 0x80; + if(mkey->pad_size+1<16) + memset(mkey->pad+mkey->pad_size+1, 0, 16-mkey->pad_size-1); + } + + for(i=0; i<16; i++){ + mkey->pad[i] ^= tmp[i]; + } + + memcpy(kbuf, mkey->pad, 16); + memcpy(tmp1, mkey->key, 16); + + retv = sub_158(kirk_buf, 0x10, tmp1, code); + if(retv) + return retv; + + for(i=0; i<0x10; i++){ + tmp1[i] ^= loc_1CD4[i]; + } + + if(mkey->type==2){ + memcpy(kbuf, tmp1, 16); + + retv = kirk5(kirk_buf, 0x10); + if(retv) + goto _exit; + + retv = kirk4(kirk_buf, 0x10, code); + if(retv) + goto _exit; + + memcpy(tmp1, kbuf, 16); + } + + if(vkey){ + for(i=0; i<0x10; i++){ + tmp1[i] ^= vkey[i]; + } + memcpy(kbuf, tmp1, 16); + + retv = kirk4(kirk_buf, 0x10, code); + if(retv) + goto _exit; + + memcpy(tmp1, kbuf, 16); + } + + memcpy(buf, tmp1, 16); + + memset(mkey->key, 0, 16); + memset(mkey->pad, 0, 16); + + mkey->pad_size = 0; + mkey->type = 0; + retv = 0; + +_exit: + return retv; +} + +int sceDrmBBMacFinal2(MAC_KEY *mkey, u8 *out, u8 *vkey) +{ + int i, retv, type; + u8 *kbuf, tmp[16]; + + type = mkey->type; + retv = sceDrmBBMacFinal(mkey, tmp, vkey); + if(retv) + return retv; + + kbuf = kirk_buf+0x14; + + // decrypt bbmac + if(type==3){ + memcpy(kbuf, out, 0x10); + kirk7(kirk_buf, 0x10, 0x63); + }else{ + memcpy(kirk_buf, out, 0x10); + } + + retv = 0; + for(i=0; i<0x10; i++){ + if(kirk_buf[i]!=tmp[i]){ + retv = 0x80510300; + break; + } + } + + return retv; +} + +/*************************************************************/ + +static int sub_1F8(u8 *buf, int size, u8 *key, int key_type) +{ + int i, retv; + u8 tmp[16]; + + // copy last 16 bytes to tmp + memcpy(tmp, buf+size+0x14-16, 16); + + retv = kirk7(buf, size, key_type); + if(retv) + return retv; + + for(i=0; i<16; i++){ + buf[i] ^= key[i]; + } + + // copy last 16 bytes to keys + memcpy(key, tmp, 16); + + return 0; +} + + +static int sub_428(u8 *kbuf, u8 *dbuf, int size, CIPHER_KEY *ckey) +{ + int i, retv; + u8 tmp1[16], tmp2[16]; + + memcpy(kbuf+0x14, ckey->key, 16); + + for(i=0; i<16; i++){ + kbuf[0x14+i] ^= loc_1CF4[i]; + } + + if(ckey->type==2) + retv = kirk8(kbuf, 16); + else + retv = kirk7(kbuf, 16, 0x39); + if(retv) + return retv; + + for(i=0; i<16; i++){ + kbuf[i] ^= loc_1CE4[i]; + } + + memcpy(tmp2, kbuf, 0x10); + + if(ckey->seed==1){ + memset(tmp1, 0, 0x10); + }else{ + memcpy(tmp1, tmp2, 0x10); + *(u32*)(tmp1+0x0c) = ckey->seed-1; + } + + for(i=0; iseed; + ckey->seed += 1; + } + + retv = sub_1F8(kbuf, size, tmp1, 0x63); + if(retv) + return retv; + + for(i=0; itype = type; + if(mode==2){ + ckey->seed = seed+1; + for(i=0; i<16; i++){ + ckey->key[i] = header_key[i]; + } + if(version_key){ + for(i=0; i<16; i++){ + ckey->key[i] ^= version_key[i]; + } + } + retv = 0; + }else if(mode==1){ + ckey->seed = 1; + retv = kirk14(kirk_buf); + if(retv) + return retv; + + memcpy(kbuf, kirk_buf, 0x10); + memset(kbuf+0x0c, 0, 4); + + if(ckey->type==2){ + for(i=0; i<16; i++){ + kbuf[i] ^= loc_1CE4[i]; + } + retv = kirk5(kirk_buf, 0x10); + for(i=0; i<16; i++){ + kbuf[i] ^= loc_1CF4[i]; + } + }else{ + for(i=0; i<16; i++){ + kbuf[i] ^= loc_1CE4[i]; + } + retv = kirk4(kirk_buf, 0x10, 0x39); + for(i=0; i<16; i++){ + kbuf[i] ^= loc_1CF4[i]; + } + } + if(retv) + return retv; + + memcpy(ckey->key, kbuf, 0x10); + memcpy(header_key, kbuf, 0x10); + + if(version_key){ + for(i=0; i<16; i++){ + ckey->key[i] ^= version_key[i]; + } + } + }else{ + retv = 0; + } + + return retv; +} + +int sceDrmBBCipherUpdate(CIPHER_KEY *ckey, u8 *data, int size) +{ + int p, retv, dsize; + + retv = 0; + p = 0; + + while(size>0){ + dsize = (size>=0x0800)? 0x0800 : size; + retv = sub_428(kirk_buf, data+p, dsize, ckey); + if(retv) + break; + size -= dsize; + p += dsize; + } + + return retv; +} + +int sceDrmBBCipherFinal(CIPHER_KEY *ckey) +{ + memset(ckey->key, 0, 16); + ckey->type = 0; + ckey->seed = 0; + + return 0; +} + +/*************************************************************/ + +// AES128 encrypt key +static u8 key_357C[0x30] = { + 0x07,0x3D,0x9E,0x9D,0xA8,0xFD,0x3B,0x2F,0x63,0x18,0x93,0x2E,0xF8,0x57,0xA6,0x64, + 0x37,0x49,0xB7,0x01,0xCA,0xE2,0xE0,0xC5,0x44,0x2E,0x06,0xB6,0x1E,0xFF,0x84,0xF2, + 0x9D,0x31,0xB8,0x5A,0xC8,0xFA,0x16,0x80,0x73,0x60,0x18,0x82,0x18,0x77,0x91,0x9D, +}; + +static u8 key_363C[16] = { + 0x38,0x20,0xD0,0x11,0x07,0xA3,0xFF,0x3E,0x0A,0x4C,0x20,0x85,0x39,0x10,0xB5,0x54, +}; + +int sceNpDrmGetFixedKey(u8 *key, char *npstr, int type) +{ + AES_ctx akey; + MAC_KEY mkey; + char strbuf[0x30]; + int retv; + + if((type&0x01000000)==0) + return 0x80550901; + type &= 0x000000ff; + + memset(strbuf, 0, 0x30); + strncpy(strbuf, npstr, 0x30); + + retv = sceDrmBBMacInit(&mkey, 1); + if(retv) + return retv; + + retv = sceDrmBBMacUpdate(&mkey, (u8*)strbuf, 0x30); + if(retv) + return retv; + + retv = sceDrmBBMacFinal(&mkey, key, key_363C); + if(retv) + return 0x80550902; + + if(type==0) + return 0; + if(type>3) + return 0x80550901; + type = (type-1)*16; + + AES_set_key(&akey, &key_357C[type], 128); + AES_encrypt(&akey, key, key); + + return 0; +} + + +/*************************************************************/ + + +static u8 dnas_key1A90[] = {0xED,0xE2,0x5D,0x2D,0xBB,0xF8,0x12,0xE5,0x3C,0x5C,0x59,0x32,0xFA,0xE3,0xE2,0x43}; +static u8 dnas_key1AA0[] = {0x27,0x74,0xFB,0xEB,0xA4,0xA0, 1,0xD7, 2,0x56,0x9E,0x33,0x8C,0x19,0x57,0x83}; + +PGD_DESC *pgd_open(u8 *pgd_buf, int pgd_flag, u8 *pgd_vkey) +{ + PGD_DESC *pgd; + MAC_KEY mkey; + CIPHER_KEY ckey; + u8 *fkey; + int retv; + + //DEBUG_LOG(HLE, "Open PGD ..."); + + pgd = (PGD_DESC*)malloc(sizeof(PGD_DESC)); + memset(pgd, 0, sizeof(PGD_DESC)); + + pgd->key_index = *(u32*)(pgd_buf+4); + pgd->drm_type = *(u32*)(pgd_buf+8); + + if(pgd->drm_type==1){ + pgd->mac_type = 1; + pgd_flag |= 4; + if(pgd->key_index>1){ + pgd->mac_type = 3; + pgd_flag |= 8; + } + pgd->cipher_type = 1; + }else{ + pgd->mac_type = 2; + pgd->cipher_type = 2; + } + pgd->open_flag = pgd_flag; + + // select fixed key + fkey = NULL; + if(pgd_flag&2) + fkey = dnas_key1A90; + if(pgd_flag&1) + fkey = dnas_key1AA0; + if(fkey==NULL){ + //ERROR_LOG(HLE, "pgd_open: invalid pgd_flag! %08x\n", pgd_flag); + free(pgd); + return NULL; + } + + // MAC_0x80 check + sceDrmBBMacInit(&mkey, pgd->mac_type); + sceDrmBBMacUpdate(&mkey, pgd_buf+0x00, 0x80); + retv = sceDrmBBMacFinal2(&mkey, pgd_buf+0x80, fkey); + if(retv){ + //ERROR_LOG(HLE, "pgd_open: MAC_80 check failed!: %08x(%d)\n", retv, retv); + free(pgd); + return NULL; + } + + // MAC_0x70 + sceDrmBBMacInit(&mkey, pgd->mac_type); + sceDrmBBMacUpdate(&mkey, pgd_buf+0x00, 0x70); + if(pgd_vkey){ + // use given vkey + retv = sceDrmBBMacFinal2(&mkey, pgd_buf+0x70, pgd_vkey); + if(retv){ + //ERROR_LOG(HLE, "pgd_open: MAC_70 check failed!: %08x(%d)\n", retv, retv); + free(pgd); + return NULL; + }else{ + memcpy(pgd->vkey, pgd_vkey, 16); + } + }else{ + //ERROR_LOG(HLE, "pgd_open: need key!\n"); + free(pgd); + return NULL; + } + + + // decrypt PGD_DESC + sceDrmBBCipherInit(&ckey, pgd->cipher_type, 2, pgd_buf+0x10, pgd->vkey, 0); + sceDrmBBCipherUpdate(&ckey, pgd_buf+0x30, 0x30); + sceDrmBBCipherFinal(&ckey); + + pgd->data_size = *(u32*)(pgd_buf+0x44); + pgd->block_size = *(u32*)(pgd_buf+0x48); + pgd->data_offset = *(u32*)(pgd_buf+0x4c); + memcpy(pgd->dkey, pgd_buf+0x30, 16); + + pgd->align_size = (pgd->data_size+15)&~15; + pgd->table_offset = pgd->data_offset+pgd->align_size; + pgd->block_nr = (pgd->align_size+pgd->block_size-1)&~(pgd->block_size-1); + pgd->block_nr = pgd->block_nr/pgd->block_size; + + pgd->file_offset = 0; + pgd->current_block = -1; + pgd->block_buf = (u8*)malloc(pgd->block_size*2); + + return pgd; +} + +int pgd_decrypt_block(PGD_DESC *pgd, int block) +{ + CIPHER_KEY ckey; + u32 block_offset; + + block_offset = block*pgd->block_size; + + // decrypt block data + sceDrmBBCipherInit(&ckey, pgd->cipher_type, 2, pgd->dkey, pgd->vkey, block_offset>>4); + sceDrmBBCipherUpdate(&ckey, pgd->block_buf, pgd->block_size); + sceDrmBBCipherFinal(&ckey); + + return pgd->block_size; +} + +/*************************************************************/ + diff --git a/ext/libkirk/amctrl.h b/ext/libkirk/amctrl.h new file mode 100644 index 000000000000..fd1187effe62 --- /dev/null +++ b/ext/libkirk/amctrl.h @@ -0,0 +1,64 @@ +#ifndef AMCTRL_H +#define AMCTRL_H + +typedef struct { + int type; + u8 key[16]; + u8 pad[16]; + int pad_size; +} MAC_KEY; + +typedef struct +{ + u32 type; + u32 seed; + u8 key[16]; +} CIPHER_KEY; + +typedef struct { + u8 vkey[16]; // key to decrypt PGD header + u8 dkey[16]; // key to decrypt PGD data + + u32 open_flag; + u32 key_index; + u32 drm_type; + u32 mac_type; + u32 cipher_type; + + u32 data_size; + u32 align_size; + u32 block_size; + u32 block_nr; + u32 data_offset; + u32 table_offset; + + u8 *block_buf; + u32 current_block; + u32 file_offset; +}PGD_DESC; + + +// type: +// 2: use fuse id +// 3: use fixed key. MAC need encrypt again +int sceDrmBBMacInit(MAC_KEY *mkey, int type); +int sceDrmBBMacUpdate(MAC_KEY *mkey, u8 *buf, int size); +int sceDrmBBMacFinal(MAC_KEY *mkey, u8 *buf, u8 *vkey); +int sceDrmBBMacFinal2(MAC_KEY *mkey, u8 *out, u8 *vkey); + +// type: 1 use fixed key +// 2 use fuse id +// mode: 1 for encrypt +// 2 for decrypt +int sceDrmBBCipherInit(CIPHER_KEY *ckey, int type, int mode, u8 *header_key, u8 *version_key, u32 seed); +int sceDrmBBCipherUpdate(CIPHER_KEY *ckey, u8 *data, int size); +int sceDrmBBCipherFinal(CIPHER_KEY *ckey); + +// npdrm.prx +int sceNpDrmGetFixedKey(u8 *key, char *npstr, int type); + +PGD_DESC *pgd_open(u8 *pgd_buf, int pgd_flag, u8 *pgd_vkey); +int pgd_decrypt_block(PGD_DESC *pgd, int block); + +#endif + diff --git a/ext/libkirk/kirk_engine.h b/ext/libkirk/kirk_engine.h index e89fa54689bd..7edbe4a8dfe3 100644 --- a/ext/libkirk/kirk_engine.h +++ b/ext/libkirk/kirk_engine.h @@ -184,7 +184,7 @@ typedef struct 0x0C: Mul1 0x0D: Mul2 0x0E: Random Number Gen - 0x0F: (absolutely no idea – could be KIRK initialization) + 0x0F: (absolutely no idea ?could be KIRK initialization) 0x10: Signature Gen // Sig Checks 0x11: Signature Check (checks for generated sigs) diff --git a/ext/libkirk/libkirk.vcxproj b/ext/libkirk/libkirk.vcxproj index 3c248e88ea99..2ac107623b04 100644 --- a/ext/libkirk/libkirk.vcxproj +++ b/ext/libkirk/libkirk.vcxproj @@ -116,6 +116,7 @@ + diff --git a/ext/libkirk/libkirk.vcxproj.filters b/ext/libkirk/libkirk.vcxproj.filters index b43b401d6dae..968c010a2478 100644 --- a/ext/libkirk/libkirk.vcxproj.filters +++ b/ext/libkirk/libkirk.vcxproj.filters @@ -30,6 +30,9 @@ Source Files + + Source Files + From 24debfd259cb971c0ff6eb62501de2b82dab6533 Mon Sep 17 00:00:00 2001 From: raven02 Date: Sun, 24 Feb 2013 13:48:09 +0800 Subject: [PATCH 157/347] Add !(gstate.zmsk & 1); to depthMask and remove duplicate GE_CMD_MATERIALUPDATE (exists in line69) --- GPU/GLES/DisplayListInterpreter.cpp | 10 +++++----- GPU/GLES/StateMapping.cpp | 4 ++-- 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/GPU/GLES/DisplayListInterpreter.cpp b/GPU/GLES/DisplayListInterpreter.cpp index 82cafa1b3f67..95a932b9bcaf 100644 --- a/GPU/GLES/DisplayListInterpreter.cpp +++ b/GPU/GLES/DisplayListInterpreter.cpp @@ -48,9 +48,11 @@ static const u8 flushOnChangedBeforeCommandList[] = { GE_CMD_TEXSCALEU, GE_CMD_TEXSCALEV, GE_CMD_CULLFACEENABLE, + GE_CMD_CULL, GE_CMD_TEXTUREMAPENABLE, GE_CMD_LIGHTINGENABLE, GE_CMD_FOGENABLE, + GE_CMD_DITHERENABLE, GE_CMD_ALPHABLENDENABLE, GE_CMD_ALPHATESTENABLE, GE_CMD_ALPHATEST, @@ -97,9 +99,7 @@ static const u8 flushOnChangedBeforeCommandList[] = { GE_CMD_VIEWPORTX2,GE_CMD_VIEWPORTY2, GE_CMD_VIEWPORTZ1,GE_CMD_VIEWPORTZ2, GE_CMD_LIGHTENABLE0,GE_CMD_LIGHTENABLE1,GE_CMD_LIGHTENABLE2,GE_CMD_LIGHTENABLE3, - GE_CMD_CULL, GE_CMD_PATCHDIVISION, - GE_CMD_MATERIALUPDATE, GE_CMD_CLEARMODE, GE_CMD_TEXMAPMODE, GE_CMD_TEXSHADELS, @@ -523,6 +523,7 @@ void GLES_GPU::ExecuteOp(u32 op, u32 diff) { break; case GE_CMD_CULLFACEENABLE: + case GE_CMD_CULL: break; case GE_CMD_TEXTUREMAPENABLE: @@ -785,9 +786,6 @@ void GLES_GPU::ExecuteOp(u32 op, u32 diff) { case GE_CMD_LIGHTENABLE3: break; - case GE_CMD_CULL: - break; - case GE_CMD_SHADEMODE: break; @@ -817,6 +815,8 @@ void GLES_GPU::ExecuteOp(u32 op, u32 diff) { case GE_CMD_ALPHATESTENABLE: case GE_CMD_COLORTESTENABLE: + case GE_CMD_COLORTEST: + case GE_CMD_COLORTESTMASK: // This is done in the shader. break; diff --git a/GPU/GLES/StateMapping.cpp b/GPU/GLES/StateMapping.cpp index 4590c80205cf..a0c7a5136012 100644 --- a/GPU/GLES/StateMapping.cpp +++ b/GPU/GLES/StateMapping.cpp @@ -166,8 +166,8 @@ void TransformDrawEngine::ApplyDrawState(int prim) { if (gstate.isModeClear()) { bool colorMask = (gstate.clearmode >> 8) & 1; bool alphaMask = (gstate.clearmode >> 9) & 1; - bool depthMask = (gstate.clearmode >> 10) & 1; - + bool depthMask = ((gstate.clearmode >> 10) & 1) || !(gstate.zmsk & 1); + glstate.colorMask.set(colorMask, colorMask, colorMask, alphaMask); glstate.stencilTest.enable(); From 630ee68b05fb6247fd62da73024efa0d4789877d Mon Sep 17 00:00:00 2001 From: Sacha Date: Sun, 24 Feb 2013 22:17:52 +1000 Subject: [PATCH 158/347] Build fix for iOS. Now compiles. --- CMakeLists.txt | 4 +++- Common/ChunkFile.h | 4 ++++ ios/ViewController.mm | 3 +-- 3 files changed, 8 insertions(+), 3 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index f88157a94464..5da94fb77314 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -132,7 +132,9 @@ if(NOT MSVC) add_definitions(-msse2) endif() - if(APPLE) + if(IOS) + set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -stdlib=libstdc++") + elseif(APPLE) set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -stdlib=libc++") endif() if(CMAKE_COMPILER_IS_GNUCXX AND CMAKE_CXX_COMPILER_VERSION VERSION_LESS 4.7.0) diff --git a/Common/ChunkFile.h b/Common/ChunkFile.h index 0344483514d1..8bf1c8223290 100644 --- a/Common/ChunkFile.h +++ b/Common/ChunkFile.h @@ -34,8 +34,12 @@ #include #include #ifndef __SYMBIAN32__ +#ifdef IOS +#include +#else #include #endif +#endif #include "Common.h" #include "FileUtil.h" diff --git a/ios/ViewController.mm b/ios/ViewController.mm index 996ba92c5087..e979295676b9 100644 --- a/ios/ViewController.mm +++ b/ios/ViewController.mm @@ -13,10 +13,9 @@ #include "file/zip_read.h" #include "input/input_state.h" #include "net/resolve.h" -#include "ui_atlas.h" #include "ui/screen.h" -#include "Config.h" +#include "Core/Config.h" #include "gfx_es2/fbo.h" #define IS_IPAD() ([UIDevice currentDevice].userInterfaceIdiom == UIUserInterfaceIdiomPad) From 25a54edc49b13706574dcc2e62a1abd1fb0f85d4 Mon Sep 17 00:00:00 2001 From: tpu Date: Sun, 24 Feb 2013 20:19:54 +0800 Subject: [PATCH 159/347] add pgd_close, match with pgd_open --- Core/HLE/sceIo.cpp | 3 +-- ext/libkirk/amctrl.c | 28 ++++++++++++++++++---------- ext/libkirk/amctrl.h | 1 + ext/libkirk/libkirk.vcxproj | 2 ++ ext/libkirk/libkirk.vcxproj.filters | 3 +++ 5 files changed, 25 insertions(+), 12 deletions(-) diff --git a/Core/HLE/sceIo.cpp b/Core/HLE/sceIo.cpp index a46d6060f9b7..d1787ea56f08 100644 --- a/Core/HLE/sceIo.cpp +++ b/Core/HLE/sceIo.cpp @@ -633,8 +633,7 @@ u32 sceIoClose(int id) { DEBUG_LOG(HLE, "sceIoClose(%d)", id); FileNode *f = kernelObjects.Get < FileNode > (id, error); if(f && f->npdrm){ - free(f->pgdInfo->block_buf); - free(f->pgdInfo); + pgd_close(f->pgdInfo); } return kernelObjects.Destroy < FileNode > (id); } diff --git a/ext/libkirk/amctrl.c b/ext/libkirk/amctrl.c index 32d8db8b7f80..c499e7cff86e 100644 --- a/ext/libkirk/amctrl.c +++ b/ext/libkirk/amctrl.c @@ -3,6 +3,7 @@ * written by tpu. */ + #include #include #include @@ -14,9 +15,9 @@ /*************************************************************/ -static u8 loc_1CD4[16] = {0xE3, 0x50, 0xED, 0x1D, 0x91, 0x0A, 0x1F, 0xD0, 0x29, 0xBB, 0x1C, 0x3E, 0xF3, 0x40, 0x77, 0xFB}; -static u8 loc_1CE4[16] = {0x13, 0x5F, 0xA4, 0x7C, 0xAB, 0x39, 0x5B, 0xA4, 0x76, 0xB8, 0xCC, 0xA9, 0x8F, 0x3A, 0x04, 0x45}; -static u8 loc_1CF4[16] = {0x67, 0x8D, 0x7F, 0xA3, 0x2A, 0x9C, 0xA0, 0xD1, 0x50, 0x8A, 0xD8, 0x38, 0x5E, 0x4B, 0x01, 0x7E}; +static const u8 loc_1CD4[16] = {0xE3, 0x50, 0xED, 0x1D, 0x91, 0x0A, 0x1F, 0xD0, 0x29, 0xBB, 0x1C, 0x3E, 0xF3, 0x40, 0x77, 0xFB}; +static const u8 loc_1CE4[16] = {0x13, 0x5F, 0xA4, 0x7C, 0xAB, 0x39, 0x5B, 0xA4, 0x76, 0xB8, 0xCC, 0xA9, 0x8F, 0x3A, 0x04, 0x45}; +static const u8 loc_1CF4[16] = {0x67, 0x8D, 0x7F, 0xA3, 0x2A, 0x9C, 0xA0, 0xD1, 0x50, 0x8A, 0xD8, 0x38, 0x5E, 0x4B, 0x01, 0x7E}; static u8 kirk_buf[0x0814]; // 1DC0 1DD4 @@ -503,13 +504,13 @@ int sceDrmBBCipherFinal(CIPHER_KEY *ckey) /*************************************************************/ // AES128 encrypt key -static u8 key_357C[0x30] = { +static const u8 key_357C[0x30] = { 0x07,0x3D,0x9E,0x9D,0xA8,0xFD,0x3B,0x2F,0x63,0x18,0x93,0x2E,0xF8,0x57,0xA6,0x64, 0x37,0x49,0xB7,0x01,0xCA,0xE2,0xE0,0xC5,0x44,0x2E,0x06,0xB6,0x1E,0xFF,0x84,0xF2, 0x9D,0x31,0xB8,0x5A,0xC8,0xFA,0x16,0x80,0x73,0x60,0x18,0x82,0x18,0x77,0x91,0x9D, }; -static u8 key_363C[16] = { +static const u8 key_363C[16] = { 0x38,0x20,0xD0,0x11,0x07,0xA3,0xFF,0x3E,0x0A,0x4C,0x20,0x85,0x39,0x10,0xB5,0x54, }; @@ -535,7 +536,7 @@ int sceNpDrmGetFixedKey(u8 *key, char *npstr, int type) if(retv) return retv; - retv = sceDrmBBMacFinal(&mkey, key, key_363C); + retv = sceDrmBBMacFinal(&mkey, key, (u8*)key_363C); if(retv) return 0x80550902; @@ -555,8 +556,8 @@ int sceNpDrmGetFixedKey(u8 *key, char *npstr, int type) /*************************************************************/ -static u8 dnas_key1A90[] = {0xED,0xE2,0x5D,0x2D,0xBB,0xF8,0x12,0xE5,0x3C,0x5C,0x59,0x32,0xFA,0xE3,0xE2,0x43}; -static u8 dnas_key1AA0[] = {0x27,0x74,0xFB,0xEB,0xA4,0xA0, 1,0xD7, 2,0x56,0x9E,0x33,0x8C,0x19,0x57,0x83}; +static const u8 dnas_key1A90[] = {0xED,0xE2,0x5D,0x2D,0xBB,0xF8,0x12,0xE5,0x3C,0x5C,0x59,0x32,0xFA,0xE3,0xE2,0x43}; +static const u8 dnas_key1AA0[] = {0x27,0x74,0xFB,0xEB,0xA4,0xA0, 1,0xD7, 2,0x56,0x9E,0x33,0x8C,0x19,0x57,0x83}; PGD_DESC *pgd_open(u8 *pgd_buf, int pgd_flag, u8 *pgd_vkey) { @@ -591,9 +592,9 @@ PGD_DESC *pgd_open(u8 *pgd_buf, int pgd_flag, u8 *pgd_vkey) // select fixed key fkey = NULL; if(pgd_flag&2) - fkey = dnas_key1A90; + fkey = (u8*)dnas_key1A90; if(pgd_flag&1) - fkey = dnas_key1AA0; + fkey = (u8*)dnas_key1AA0; if(fkey==NULL){ //ERROR_LOG(HLE, "pgd_open: invalid pgd_flag! %08x\n", pgd_flag); free(pgd); @@ -667,5 +668,12 @@ int pgd_decrypt_block(PGD_DESC *pgd, int block) return pgd->block_size; } +int pgd_close(PGD_DESC *pgd) +{ + free(pgd->block_buf); + free(pgd); + return 0; +} + /*************************************************************/ diff --git a/ext/libkirk/amctrl.h b/ext/libkirk/amctrl.h index fd1187effe62..9a22ac956730 100644 --- a/ext/libkirk/amctrl.h +++ b/ext/libkirk/amctrl.h @@ -59,6 +59,7 @@ int sceNpDrmGetFixedKey(u8 *key, char *npstr, int type); PGD_DESC *pgd_open(u8 *pgd_buf, int pgd_flag, u8 *pgd_vkey); int pgd_decrypt_block(PGD_DESC *pgd, int block); +int pgd_close(PGD_DESC *pgd); #endif diff --git a/ext/libkirk/libkirk.vcxproj b/ext/libkirk/libkirk.vcxproj index 2ac107623b04..20cba7c8c29e 100644 --- a/ext/libkirk/libkirk.vcxproj +++ b/ext/libkirk/libkirk.vcxproj @@ -71,6 +71,7 @@ Level3 Disabled Default + _MBCS;%(PreprocessorDefinitions);_CRT_SECURE_NO_WARNINGS true @@ -124,6 +125,7 @@ + diff --git a/ext/libkirk/libkirk.vcxproj.filters b/ext/libkirk/libkirk.vcxproj.filters index 968c010a2478..cea5d1c8cdf3 100644 --- a/ext/libkirk/libkirk.vcxproj.filters +++ b/ext/libkirk/libkirk.vcxproj.filters @@ -44,6 +44,9 @@ Header Files + + Header Files + From 25a37e40ddb313fa4aa47859cfdb61b8495669e7 Mon Sep 17 00:00:00 2001 From: Sacha Date: Sun, 24 Feb 2013 23:29:04 +1000 Subject: [PATCH 160/347] Fix iOS directory structure in init/NativeInit. --- CMakeLists.txt | 3 +-- android/jni/NativeApp.cpp | 8 +++++--- ios/ViewController.mm | 2 +- 3 files changed, 7 insertions(+), 6 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 5da94fb77314..f55edd8a16c4 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -969,9 +969,8 @@ if (IOS) set(RSRC_XIB_FILES assets/Icon@2x.png) SET_SOURCE_FILES_PROPERTIES(${RSRC_XIB_FILES} PROPERTIES MACOSX_PACKAGE_LOCATION Resources) set(APP_DIR_NAME \${TARGET_BUILD_DIR}/\${FULL_PRODUCT_NAME}) - set(RES_DIR assets) add_custom_command(TARGET PPSSPP POST_BUILD - COMMAND tar -c -C . --exclude .DS_Store --exclude .git -H `find ${RES_DIR}` | tar -x -C ${APP_DIR_NAME} + COMMAND tar -c -C . --exclude .DS_Store --exclude .git -H `find assets` | tar -x -C ${APP_DIR_NAME} ) set_target_properties(${TargetBin} PROPERTIES MACOSX_BUNDLE_INFO_PLIST "../ios/PPSSPP-Info.plist" XCODE_ATTRIBUTE_CODE_SIGN_IDENTITY "iPhone Developer: My Name") endif() diff --git a/android/jni/NativeApp.cpp b/android/jni/NativeApp.cpp index 2962fc4c6d9b..5a8fabb9c96e 100644 --- a/android/jni/NativeApp.cpp +++ b/android/jni/NativeApp.cpp @@ -166,6 +166,8 @@ void NativeInit(int argc, const char *argv[], const char *savegame_directory, co #ifdef BLACKBERRY // Packed assets are included in app/native/ dir VFSRegister("", new DirectoryAssetReader("app/native/assets/")); +#elif defined(IOS) + VFSRegister("", new DirectoryAssetReader(external_directory); #else VFSRegister("", new DirectoryAssetReader("assets/")); #endif @@ -179,7 +181,7 @@ void NativeInit(int argc, const char *argv[], const char *savegame_directory, co LogManager *logman = LogManager::GetInstance(); ILOG("Logman: %p", logman); - config_filename = user_data_path + "ppsspp.ini"; + config_filename = user_data_path + "/ppsspp.ini"; g_Config.Load(config_filename.c_str()); @@ -233,7 +235,7 @@ void NativeInit(int argc, const char *argv[], const char *savegame_directory, co if (g_Config.currentDirectory == "") { #if defined(ANDROID) g_Config.currentDirectory = external_directory; -#elif defined(BLACKBERRY) || defined(__SYMBIAN32__) +#elif defined(BLACKBERRY) || defined(__SYMBIAN32__) || defined(IOS) g_Config.currentDirectory = savegame_directory; #else g_Config.currentDirectory = getenv("HOME"); @@ -246,7 +248,7 @@ void NativeInit(int argc, const char *argv[], const char *savegame_directory, co // most sense. g_Config.memCardDirectory = std::string(external_directory) + "/"; g_Config.flashDirectory = std::string(external_directory)+"/flash/"; -#elif defined(BLACKBERRY) || defined(__SYMBIAN32__) +#elif defined(BLACKBERRY) || defined(__SYMBIAN32__) || defined(IOS) g_Config.memCardDirectory = user_data_path; g_Config.flashDirectory = user_data_path+"/flash/"; #else diff --git a/ios/ViewController.mm b/ios/ViewController.mm index e979295676b9..da3699e19449 100644 --- a/ios/ViewController.mm +++ b/ios/ViewController.mm @@ -62,7 +62,7 @@ - (id)init net::Init(); ram_temp_file = [[NSTemporaryDirectory() stringByAppendingPathComponent:@"ram_tmp.file"] fileSystemRepresentation]; - NativeInit(0, NULL, [self.bundlePath UTF8String], [self.documentsPath UTF8String], NULL); + NativeInit(0, NULL, [self.documentsPath UTF8String], [self.bundlePath UTF8String], NULL); } return self; From 8ea497d59a2a9732f50374460ef2d8134a675774 Mon Sep 17 00:00:00 2001 From: Sacha Date: Mon, 25 Feb 2013 00:45:10 +1000 Subject: [PATCH 161/347] Build fix for most platforms. New libkirk file. --- CMakeLists.txt | 2 ++ android/jni/Android.mk | 1 + android/jni/NativeApp.cpp | 2 +- 3 files changed, 4 insertions(+), 1 deletion(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index f55edd8a16c4..88a62d7f65bd 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -592,6 +592,8 @@ endif() add_library(kirk STATIC ext/libkirk/AES.c ext/libkirk/AES.h + ext/libkirk/amctrl.c + ext/libkirk/amctrl.h ext/libkirk/SHA1.c ext/libkirk/SHA1.h ext/libkirk/bn.c diff --git a/android/jni/Android.mk b/android/jni/Android.mk index f1ea86ef5c0d..13f6736dc982 100644 --- a/android/jni/Android.mk +++ b/android/jni/Android.mk @@ -54,6 +54,7 @@ LOCAL_SRC_FILES := \ $(SRC)/native/android/app-android.cpp \ $(SRC)/ext/disarm.cpp \ $(SRC)/ext/libkirk/AES.c \ + $(SRC)/ext/libkirk/amctrl.c \ $(SRC)/ext/libkirk/SHA1.c \ $(SRC)/ext/libkirk/bn.c \ $(SRC)/ext/libkirk/ec.c \ diff --git a/android/jni/NativeApp.cpp b/android/jni/NativeApp.cpp index 5a8fabb9c96e..77d9e9710077 100644 --- a/android/jni/NativeApp.cpp +++ b/android/jni/NativeApp.cpp @@ -167,7 +167,7 @@ void NativeInit(int argc, const char *argv[], const char *savegame_directory, co // Packed assets are included in app/native/ dir VFSRegister("", new DirectoryAssetReader("app/native/assets/")); #elif defined(IOS) - VFSRegister("", new DirectoryAssetReader(external_directory); + VFSRegister("", new DirectoryAssetReader(external_directory)); #else VFSRegister("", new DirectoryAssetReader("assets/")); #endif From 02371b2949bcddf9d31fbb9a02610b82dffa6468 Mon Sep 17 00:00:00 2001 From: vakko Date: Sun, 24 Feb 2013 19:27:37 +0200 Subject: [PATCH 162/347] DLC encryption --- CMakeLists.txt | 2 ++ Core/HLE/HLETables.cpp | 1 + Core/HLE/sceKernel.cpp | 1 + Core/HLE/scePspNpDrm_user.cpp | 68 +++++++++++++++++++++++++++++++++++ Core/HLE/scePspNpDrm_user.h | 5 +++ 5 files changed, 77 insertions(+) create mode 100644 Core/HLE/scePspNpDrm_user.cpp create mode 100644 Core/HLE/scePspNpDrm_user.h diff --git a/CMakeLists.txt b/CMakeLists.txt index 88a62d7f65bd..960e9f6f0ba7 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -769,6 +769,8 @@ add_library(${CoreLibName} ${CoreLinkType} Core/HLE/sceUtility.h Core/HLE/sceVaudio.cpp Core/HLE/sceVaudio.h + Core/HLE/scePspNpDrm_user.cpp + Core/HLE/scePspNpDrm_user.h Core/HW/MediaEngine.cpp Core/HW/MediaEngine.h Core/HW/MemoryStick.cpp diff --git a/Core/HLE/HLETables.cpp b/Core/HLE/HLETables.cpp index 3f9597b443e7..bd2302fa58c1 100644 --- a/Core/HLE/HLETables.cpp +++ b/Core/HLE/HLETables.cpp @@ -54,6 +54,7 @@ #include "sceVaudio.h" #include "sceUsb.h" #include "sceChnnlsv.h" +#include "scePspNpDrm_user.h" #define N(s) s diff --git a/Core/HLE/sceKernel.cpp b/Core/HLE/sceKernel.cpp index 04e5a8368e02..afbdc73473cf 100644 --- a/Core/HLE/sceKernel.cpp +++ b/Core/HLE/sceKernel.cpp @@ -60,6 +60,7 @@ #include "scePsmf.h" #include "sceImpose.h" #include "sceUsb.h" +#include "scePspNpDrm_user.h" #include "../Util/PPGeDraw.h" diff --git a/Core/HLE/scePspNpDrm_user.cpp b/Core/HLE/scePspNpDrm_user.cpp new file mode 100644 index 000000000000..f47f4e56a0c7 --- /dev/null +++ b/Core/HLE/scePspNpDrm_user.cpp @@ -0,0 +1,68 @@ +#include "scePspNpDrm_user.h" + +#include "HLE.h" + +int sceNpDrmSetLicenseeKey() +{ + ERROR_LOG(HLE, "UNIMPL sceNpDrmSetLicenseeKey"); + return 0; +} + +int sceNpDrmClearLicenseeKey() +{ + ERROR_LOG(HLE, "UNIMPL sceNpDrmClearLicenseeKey"); + return 0; +} + +int sceNpDrmRenameCheck() +{ + ERROR_LOG(HLE, "UNIMPL sceNpDrmRenameCheck"); + return 0; +} + +int sceNpDrmEdataSetupKey(u32 edataFd) +{ + ERROR_LOG(HLE, "UNIMPL sceNpDrmEdataSetupKey %x", edataFd); + return 0; +} + +int sceNpDrmEdataGetDataSize(u32 edataFd) +{ + ERROR_LOG(HLE, "UNIMPL sceNpDrmEdataGetDataSize %x", edataFd); + return 0; +} + +int sceNpDrmOpen() +{ + ERROR_LOG(HLE, "UNIMPL sceNpDrmOpen"); + return 0; +} + +int sceKernelLoadModuleNpDrm() +{ + ERROR_LOG(HLE, "UNIMPL sceKernelLoadModuleNpDrm"); + return 0; +} + +int sceKernelLoadExecNpDrm() +{ + ERROR_LOG(HLE, "UNIMPL sceKernelLoadExecNpDrm"); + return 0; +} + +const HLEFunction sceNpDrm[] = +{ + {0xA1336091, 0, "sceNpDrmSetLicenseeKey"}, + {0x9B745542, 0, "sceNpDrmClearLicenseeKey"}, + {0x275987D1, 0, "sceNpDrmRenameCheck"}, + {0x08d98894, WrapI_U, "sceNpDrmEdataSetupKey"}, + {0x219EF5CC, WrapI_U, "sceNpDrmEdataGetDataSize"}, + {0x2BAA4294, 0, "sceNpDrmOpen"}, + {0xC618D0B1, 0, "sceKernelLoadModuleNpDrm"}, + {0xAA5FC85B, 0, "sceKernelLoadExecNpDrm"}, +}; + +void Register_sceNpDrm() +{ + RegisterModule("sceNpDrm", ARRAY_SIZE(sceNpDrm), sceNpDrm); +} diff --git a/Core/HLE/scePspNpDrm_user.h b/Core/HLE/scePspNpDrm_user.h new file mode 100644 index 000000000000..3e59c6aa390d --- /dev/null +++ b/Core/HLE/scePspNpDrm_user.h @@ -0,0 +1,5 @@ +#pragma once + +class PointerWrap; + +void Register_sceNpDrm(); From 64c42ffaf29d1165020968ae08e0632b4cf13268 Mon Sep 17 00:00:00 2001 From: "Unknown W. Brackets" Date: Sun, 24 Feb 2013 10:23:31 -0800 Subject: [PATCH 163/347] Fix some warnings generated by clang. --- Core/CoreTiming.cpp | 4 ++-- Core/FileSystems/ISOFileSystem.cpp | 1 - Core/HLE/HLE.cpp | 2 +- Core/HLE/sceAtrac.cpp | 7 ++++--- Core/HLE/sceKernelThread.cpp | 2 +- Core/HLE/sceMpeg.cpp | 2 +- Core/HLE/sceUmd.cpp | 2 -- Core/MIPS/x86/RegCache.cpp | 2 +- Core/MIPS/x86/RegCacheFPU.cpp | 2 +- GPU/GLES/TextureCache.cpp | 7 ------- GPU/GLES/TransformPipeline.cpp | 4 ---- GPU/GPUState.cpp | 3 +++ 12 files changed, 14 insertions(+), 24 deletions(-) diff --git a/Core/CoreTiming.cpp b/Core/CoreTiming.cpp index 52ca228a8ae5..77776468b5bf 100644 --- a/Core/CoreTiming.cpp +++ b/Core/CoreTiming.cpp @@ -471,6 +471,8 @@ void AdvanceQuick() globalTimer += cyclesExecuted; currentMIPS->downcount = slicelength; + ProcessFifoWaitEvents(); + if (!first) { // WARN_LOG(CPU, "WARNING - no events in queue. Setting currentMIPS->downcount to 10000"); @@ -478,8 +480,6 @@ void AdvanceQuick() } else { - ProcessFifoWaitEvents(); - slicelength = (int)(first->time - globalTimer); if (slicelength > MAX_SLICE_LENGTH) slicelength = MAX_SLICE_LENGTH; diff --git a/Core/FileSystems/ISOFileSystem.cpp b/Core/FileSystems/ISOFileSystem.cpp index 1c92fa9f039e..0a91212a6470 100644 --- a/Core/FileSystems/ISOFileSystem.cpp +++ b/Core/FileSystems/ISOFileSystem.cpp @@ -203,7 +203,6 @@ void ISOFileSystem::ReadDirectory(u32 startsector, u32 dirsize, TreeEntry *root) bool isFile = (dir.flags & 2) ? false : true; bool relative; - int fnLength = dir.identifierLength; TreeEntry *e = new TreeEntry(); if (dir.identifierLength == 1 && (dir.firstIdChar == '\x00' || dir.firstIdChar == '.')) diff --git a/Core/HLE/HLE.cpp b/Core/HLE/HLE.cpp index 48c0f87688d6..cc9e98ca6a5d 100644 --- a/Core/HLE/HLE.cpp +++ b/Core/HLE/HLE.cpp @@ -64,7 +64,7 @@ void HLEInit() void HLEDoState(PointerWrap &p) { - Syscall sc = {0}; + Syscall sc = {""}; p.Do(unresolvedSyscalls, sc); p.Do(exportedCalls, sc); p.DoMarker("HLE"); diff --git a/Core/HLE/sceAtrac.cpp b/Core/HLE/sceAtrac.cpp index 5ea398ca0739..6e05803c5bd6 100644 --- a/Core/HLE/sceAtrac.cpp +++ b/Core/HLE/sceAtrac.cpp @@ -395,10 +395,11 @@ u32 sceAtracGetStreamDataInfo(int atracID, u32 writeAddr, u32 writableBytesAddr, Atrac *atrac = getAtrac(atracID); if (!atrac) { //return -1; + } else { + Memory::Write_U32(atrac->first.addr, writeAddr); + Memory::Write_U32(atrac->first.writableBytes, writableBytesAddr); + Memory::Write_U32(atrac->first.fileoffset, readOffsetAddr); } - Memory::Write_U32(atrac->first.addr, writeAddr); - Memory::Write_U32(atrac->first.writableBytes, writableBytesAddr); - Memory::Write_U32(atrac->first.fileoffset, readOffsetAddr); return 0; } diff --git a/Core/HLE/sceKernelThread.cpp b/Core/HLE/sceKernelThread.cpp index b4ceae39f2f3..f6586bbe656d 100644 --- a/Core/HLE/sceKernelThread.cpp +++ b/Core/HLE/sceKernelThread.cpp @@ -2805,7 +2805,7 @@ std::vector GetThreadsInfo() DebugThreadInfo info; info.id = *iter; strncpy(info.name,t->GetName(),KERNELOBJECT_MAX_NAME_LENGTH); - info.name[KERNELOBJECT_MAX_NAME_LENGTH+1] = 0; + info.name[KERNELOBJECT_MAX_NAME_LENGTH] = 0; info.status = t->nt.status; info.entrypoint = t->nt.entrypoint; if(*iter == currentThread) diff --git a/Core/HLE/sceMpeg.cpp b/Core/HLE/sceMpeg.cpp index e5a870a01084..c1afe5c0feb6 100644 --- a/Core/HLE/sceMpeg.cpp +++ b/Core/HLE/sceMpeg.cpp @@ -833,7 +833,7 @@ int sceMpegAvcDecodeYCbCr(u32 mpeg, u32 auAddr, u32 bufferAddr, u32 initAddr) { MpegContext *ctx = getMpegCtx(mpeg); if (!ctx) { - WARN_LOG(HLE, "sceMpegAvcDecodeYCbCr(%08x, %08x, %d, %08x, %08x): bad mpeg handle", mpeg, auAddr, bufferAddr, initAddr); + WARN_LOG(HLE, "sceMpegAvcDecodeYCbCr(%08x, %08x, %08x, %08x): bad mpeg handle", mpeg, auAddr, bufferAddr, initAddr); return 0; } diff --git a/Core/HLE/sceUmd.cpp b/Core/HLE/sceUmd.cpp index 77996f6793df..b38218581154 100644 --- a/Core/HLE/sceUmd.cpp +++ b/Core/HLE/sceUmd.cpp @@ -128,7 +128,6 @@ int sceUmdActivate(u32 unknown, const char *name) if (unknown < 1 || unknown > 2) return PSP_ERROR_UMD_INVALID_PARAM; - bool changed = umdActivated == 0; __KernelUmdActivate(); if (unknown == 1) @@ -152,7 +151,6 @@ int sceUmdDeactivate(u32 unknown, const char *name) if (unknown > 18) return PSP_ERROR_UMD_INVALID_PARAM; - bool changed = umdActivated != 0; __KernelUmdDeactivate(); if (unknown == 1) diff --git a/Core/MIPS/x86/RegCache.cpp b/Core/MIPS/x86/RegCache.cpp index cb863533ef19..7c36b0f37e3e 100644 --- a/Core/MIPS/x86/RegCache.cpp +++ b/Core/MIPS/x86/RegCache.cpp @@ -38,7 +38,7 @@ static const int allocationOrder[] = #endif }; -GPRRegCache::GPRRegCache() : emit(0), mips(0) { +GPRRegCache::GPRRegCache() : mips(0), emit(0) { memset(regs, 0, sizeof(regs)); memset(xregs, 0, sizeof(xregs)); } diff --git a/Core/MIPS/x86/RegCacheFPU.cpp b/Core/MIPS/x86/RegCacheFPU.cpp index 9256a6d8fae7..0973863d6347 100644 --- a/Core/MIPS/x86/RegCacheFPU.cpp +++ b/Core/MIPS/x86/RegCacheFPU.cpp @@ -23,7 +23,7 @@ u32 FPURegCache::tempValues[NUM_TEMPS]; -FPURegCache::FPURegCache() : emit(0), mips(0) { +FPURegCache::FPURegCache() : mips(0), emit(0) { memset(regs, 0, sizeof(regs)); memset(xregs, 0, sizeof(xregs)); vregs = regs + 32; diff --git a/GPU/GLES/TextureCache.cpp b/GPU/GLES/TextureCache.cpp index 7ea3c85bcc9f..32d404896c80 100644 --- a/GPU/GLES/TextureCache.cpp +++ b/GPU/GLES/TextureCache.cpp @@ -677,7 +677,6 @@ void TextureCache::SetTexture() { } bool hasClut = formatUsesClut[format]; - const u8 *texptr = Memory::GetPointer(texaddr); u64 cachekey = texaddr; u32 clutformat, clutaddr; @@ -1150,14 +1149,8 @@ bool TextureCache::DecodeTexture(u8* output, GPUgstate state) } u32 clutformat = gstate.clutformat & 3; - u32 clutaddr = GetClutAddr(clutformat == GE_CMODE_32BIT_ABGR8888 ? 4 : 2); const u8 *texptr = Memory::GetPointer(texaddr); - u32 texhash = texptr ? MiniHash((const u32*)texptr) : 0; - - u64 cachekey = texaddr ^ texhash; - if (formatUsesClut[format]) - cachekey |= (u64) clutaddr << 32; int bufw = gstate.texbufwidth[0] & 0x3ff; diff --git a/GPU/GLES/TransformPipeline.cpp b/GPU/GLES/TransformPipeline.cpp index 87153a40f274..5a642bcfe598 100644 --- a/GPU/GLES/TransformPipeline.cpp +++ b/GPU/GLES/TransformPipeline.cpp @@ -660,10 +660,6 @@ void TransformDrawEngine::SoftwareTransformAndDraw( numTrans = vertexCount; drawIndexed = true; } else { - // Temporary storage for RECTANGLES emulation - float v2[3] = {0}; - float uv2[2] = {0}; - numTrans = 0; drawBuffer = transformedExpanded; TransformedVertex *trans = &transformedExpanded[0]; diff --git a/GPU/GPUState.cpp b/GPU/GPUState.cpp index 75474fcb6fa3..35a5be2b7d02 100644 --- a/GPU/GPUState.cpp +++ b/GPU/GPUState.cpp @@ -64,6 +64,9 @@ void InitGfxState() case GPU_GLES: gpu = new GLES_GPU(); break; + case GPU_SOFTWARE: + gpu = new NullGPU(); + break; } } From de7ada1982fbffa1c2d5ff5116e08d7c76e67f56 Mon Sep 17 00:00:00 2001 From: "Unknown W. Brackets" Date: Sun, 24 Feb 2013 10:38:30 -0800 Subject: [PATCH 164/347] Fix some x64 type warnings. --- Common/ConsoleListener.cpp | 10 +++++----- Core/Debugger/Breakpoints.cpp | 2 +- Core/Dialog/PSPOskDialog.cpp | 2 +- Core/HLE/HLE.h | 2 +- Core/HLE/sceKernelInterrupt.cpp | 2 +- Core/HLE/sceKernelThread.cpp | 2 +- GPU/GLES/DisplayListInterpreter.cpp | 4 ++-- GPU/GLES/TransformPipeline.cpp | 2 +- Windows/Debugger/Debugger_Disasm.cpp | 4 ++-- 9 files changed, 15 insertions(+), 15 deletions(-) diff --git a/Common/ConsoleListener.cpp b/Common/ConsoleListener.cpp index 0fadc6ef2a13..24ae9672b118 100644 --- a/Common/ConsoleListener.cpp +++ b/Common/ConsoleListener.cpp @@ -313,19 +313,19 @@ void ConsoleListener::SendToThread(LogTypes::LOG_LEVELS Level, const char *Text) if (logPendingWritePos == (u32) -1) return; - size_t Len = strlen(Text); + int Len = (int)strlen(Text); if (Len > LOG_PENDING_MAX) Len = LOG_PENDING_MAX - 16; char ColorAttr[16] = ""; - size_t ColorLen = 0; + int ColorLen = 0; if (bUseColor) { // Not ANSI, since the console doesn't support it, but ANSI-like. snprintf(ColorAttr, 16, "\033%d", Level); // For now, rather than properly support it. _dbg_assert_msg_(COMMON, strlen(ColorAttr) == 2, "Console logging doesn't support > 9 levels."); - ColorLen = strlen(ColorAttr); + ColorLen = (int)strlen(ColorAttr); } EnterCriticalSection(&criticalSection); @@ -333,7 +333,7 @@ void ConsoleListener::SendToThread(LogTypes::LOG_LEVELS Level, const char *Text) u32 prevLogWritePos = logWritePos; if (logWritePos + ColorLen + Len >= LOG_PENDING_MAX) { - for (size_t i = 0; i < ColorLen; ++i) + for (int i = 0; i < ColorLen; ++i) logPending[(logWritePos + i) % LOG_PENDING_MAX] = ColorAttr[i]; logWritePos += ColorLen; if (logWritePos >= LOG_PENDING_MAX) @@ -370,7 +370,7 @@ void ConsoleListener::SendToThread(LogTypes::LOG_LEVELS Level, const char *Text) // Okay, have it go right after the next newline. if (nextNewline != NULL) - logPendingReadPos = nextNewline - logPending + 1; + logPendingReadPos = (u32)(nextNewline - logPending + 1); } // Double check we didn't start quitting. diff --git a/Core/Debugger/Breakpoints.cpp b/Core/Debugger/Breakpoints.cpp index cbb960f8ab02..c3ae09d5d6ee 100644 --- a/Core/Debugger/Breakpoints.cpp +++ b/Core/Debugger/Breakpoints.cpp @@ -146,7 +146,7 @@ void CBreakPoints::InvalidateJit() int CBreakPoints::GetNumBreakpoints() { - return m_iBreakPoints.size(); + return (int)m_iBreakPoints.size(); } int CBreakPoints::GetBreakpointAddress(int i) diff --git a/Core/Dialog/PSPOskDialog.cpp b/Core/Dialog/PSPOskDialog.cpp index 270d095cf9bc..be6ed1cbebcb 100644 --- a/Core/Dialog/PSPOskDialog.cpp +++ b/Core/Dialog/PSPOskDialog.cpp @@ -229,7 +229,7 @@ int PSPOskDialog::Update() Memory::Write_U16(value, oskData.outtextPtr + (2 * i)); } - oskData.outtextlength = inputChars.size(); + oskData.outtextlength = (u32)inputChars.size(); oskParams.base.result= 0; oskData.result = PSP_UTILITY_OSK_RESULT_CHANGED; Memory::WriteStruct(oskParams.SceUtilityOskDataPtr, &oskData); diff --git a/Core/HLE/HLE.h b/Core/HLE/HLE.h index 8ff39c328c63..3b5558fbe579 100644 --- a/Core/HLE/HLE.h +++ b/Core/HLE/HLE.h @@ -57,7 +57,7 @@ struct Syscall #define RETURNF(fl) currentMIPS->f[0]=fl #ifndef ARRAY_SIZE -#define ARRAY_SIZE(a) sizeof(a) / sizeof(a[0]) +#define ARRAY_SIZE(a) (sizeof(a) / sizeof(a[0])) #endif #include "FunctionWrappers.h" diff --git a/Core/HLE/sceKernelInterrupt.cpp b/Core/HLE/sceKernelInterrupt.cpp index a4791308e8a5..d5a0a41848bd 100644 --- a/Core/HLE/sceKernelInterrupt.cpp +++ b/Core/HLE/sceKernelInterrupt.cpp @@ -213,7 +213,7 @@ void __InterruptsInit() { interruptsEnabled = 1; inInterrupt = false; - for (size_t i = 0; i < ARRAY_SIZE(intrHandlers); ++i) + for (int i = 0; i < (int)ARRAY_SIZE(intrHandlers); ++i) intrHandlers[i] = new IntrHandler(i); intState.clear(); } diff --git a/Core/HLE/sceKernelThread.cpp b/Core/HLE/sceKernelThread.cpp index f6586bbe656d..aa093cc09c21 100644 --- a/Core/HLE/sceKernelThread.cpp +++ b/Core/HLE/sceKernelThread.cpp @@ -1216,7 +1216,7 @@ u32 __KernelDeleteThread(SceUID threadID, int exitStatus, const char *reason, bo { // TODO: Unless they should be run before deletion? for (int i = 0; i < THREAD_CALLBACK_NUM_TYPES; i++) - readyCallbacksCount -= t->readyCallbacks[i].size(); + readyCallbacksCount -= (int)t->readyCallbacks[i].size(); } return kernelObjects.Destroy(threadID); diff --git a/GPU/GLES/DisplayListInterpreter.cpp b/GPU/GLES/DisplayListInterpreter.cpp index 8fda96471210..d7a6f5897e12 100644 --- a/GPU/GLES/DisplayListInterpreter.cpp +++ b/GPU/GLES/DisplayListInterpreter.cpp @@ -965,8 +965,8 @@ void GLES_GPU::UpdateStats() { gpuStats.numVertexShaders = shaderManager_->NumVertexShaders(); gpuStats.numFragmentShaders = shaderManager_->NumFragmentShaders(); gpuStats.numShaders = shaderManager_->NumPrograms(); - gpuStats.numTextures = textureCache_.NumLoadedTextures(); - gpuStats.numFBOs = framebufferManager_.NumVFBs(); + gpuStats.numTextures = (int)textureCache_.NumLoadedTextures(); + gpuStats.numFBOs = (int)framebufferManager_.NumVFBs(); } void GLES_GPU::DoBlockTransfer() { diff --git a/GPU/GLES/TransformPipeline.cpp b/GPU/GLES/TransformPipeline.cpp index 5a642bcfe598..ee9687fd057b 100644 --- a/GPU/GLES/TransformPipeline.cpp +++ b/GPU/GLES/TransformPipeline.cpp @@ -926,7 +926,7 @@ void TransformDrawEngine::Flush() { gpuStats.numFlushes++; - gpuStats.numTrackedVertexArrays = vai_.size(); + gpuStats.numTrackedVertexArrays = (int)vai_.size(); // TODO: This should not be done on every drawcall, we should collect vertex data // until critical state changes. That's when we draw (flush). diff --git a/Windows/Debugger/Debugger_Disasm.cpp b/Windows/Debugger/Debugger_Disasm.cpp index 6692978d967a..7f0d044c5de0 100644 --- a/Windows/Debugger/Debugger_Disasm.cpp +++ b/Windows/Debugger/Debugger_Disasm.cpp @@ -66,11 +66,11 @@ CDisasm::CDisasm(HINSTANCE _hInstance, HWND _hParent, DebugInterface *_cpu) : Di tcItem.mask = TCIF_TEXT; tcItem.dwState = 0; tcItem.pszText = "Regs"; - tcItem.cchTextMax = strlen(tcItem.pszText)+1; + tcItem.cchTextMax = (int)strlen(tcItem.pszText)+1; tcItem.iImage = 0; int result1 = TabCtrl_InsertItem(tabs, TabCtrl_GetItemCount(tabs),&tcItem); tcItem.pszText = "Funcs"; - tcItem.cchTextMax = strlen(tcItem.pszText)+1; + tcItem.cchTextMax = (int)strlen(tcItem.pszText)+1; int result2 = TabCtrl_InsertItem(tabs, TabCtrl_GetItemCount(tabs),&tcItem); ShowWindow(GetDlgItem(m_hDlg, IDC_REGLIST), SW_NORMAL); ShowWindow(GetDlgItem(m_hDlg, IDC_FUNCTIONLIST), SW_HIDE); From b213c8e6ef63702df6ab641b53f9f0b1382a6807 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marcin=20Miko=C5=82ajczyk?= Date: Tue, 19 Feb 2013 21:59:53 +0100 Subject: [PATCH 165/347] Mainwindow class code cleanup --- Qt/mainwindow.cpp | 840 ++++++++++++++++++++++------------------------ Qt/mainwindow.h | 184 ++++------ Qt/mainwindow.ui | 15 +- 3 files changed, 483 insertions(+), 556 deletions(-) diff --git a/Qt/mainwindow.cpp b/Qt/mainwindow.cpp index 7304c06cbf84..a7e08e35f9e9 100644 --- a/Qt/mainwindow.cpp +++ b/Qt/mainwindow.cpp @@ -16,7 +16,6 @@ #include "ConsoleListener.h" #include "base/display.h" #include "GPU/GPUInterface.h" -#include "GPU/GPUState.h" #include "QtHost.h" #include "EmuThread.h" @@ -35,7 +34,6 @@ MainWindow::MainWindow(QWidget *parent) : displaylistWindow(0) { ui->setupUi(this); - qApp->installEventFilter(this); controls = new Controls(this); #if QT_HAS_SDL @@ -59,25 +57,23 @@ MainWindow::MainWindow(QWidget *parent) : SetZoom(zoom); EmuThread_Start(emugl); + SetGameTitle(fileToStart); if (!fileToStart.isNull()) { - SetGameTitle(fileToStart); - UpdateMenus(); - EmuThread_StartGame(fileToStart); + UpdateMenus(); if (stateToLoad != NULL) SaveState::Load(stateToLoad); } - else - SetGameTitle(""); } MainWindow::~MainWindow() { delete ui; } + void NativeInit(int argc, const char *argv[], const char *savegame_directory, const char *external_directory, const char *installID) { std::string config_filename; @@ -175,110 +171,91 @@ void NativeInit(int argc, const char *argv[], const char *savegame_directory, co #endif } -void MainWindow::SetNextState(CoreState state) +void MainWindow::ShowMemory(u32 addr) { - nextState = state; + if(memoryWindow) + memoryWindow->Goto(addr); } -void MainWindow::SetGameTitle(QString text) +void MainWindow::Update() { - QString title = "PPSSPP " + QString(PPSSPP_VERSION_STR); - if (text != "") - title += QString(" - %1").arg(text); - - setWindowTitle(title); -} + UpdateInputState(&input_state); -void MainWindow::BrowseAndBoot(void) -{ - QString filename = QFileDialog::getOpenFileName(NULL, "Load File", g_Config.currentDirectory.c_str(), "PSP ROMs (*.pbp *.elf *.iso *.cso *.prx)"); - if (QFile::exists(filename)) + for (int i = 0; i < controllistCount; i++) { - QFileInfo info(filename); - g_Config.currentDirectory = info.absolutePath().toStdString(); - EmuThread_StartGame(filename); + if (pressedKeys.contains(controllist[i].key) || + input_state.pad_buttons_down & controllist[i].emu_id) + __CtrlButtonDown(controllist[i].psp_id); + else + __CtrlButtonUp(controllist[i].psp_id); } -} - -void MainWindow::Boot() -{ - dialogDisasm = new Debugger_Disasm(currentDebugMIPS, this, this); - if(g_Config.bShowDebuggerOnLoad) - dialogDisasm->show(); - - if(g_Config.bFullScreen != isFullScreen()) - on_action_OptionsFullScreen_triggered(); - - memoryWindow = new Debugger_Memory(currentDebugMIPS, this, this); - memoryTexWindow = new Debugger_MemoryTex(this); - displaylistWindow = new Debugger_DisplayList(currentDebugMIPS, this, this); - - if (dialogDisasm) - dialogDisasm->NotifyMapLoaded(); - if (memoryWindow) - memoryWindow->NotifyMapLoaded(); - - if (nextState == CORE_RUNNING) - on_action_EmulationRun_triggered(); - UpdateMenus(); -} - -void MainWindow::CoreEmitWait(bool isWaiting) -{ - // Unlock mutex while core is waiting; - EmuThread_LockDraw(!isWaiting); + __CtrlSetAnalog(input_state.pad_lstick_x, input_state.pad_lstick_y); } void MainWindow::UpdateMenus() { - ui->action_OptionsDisplayRawFramebuffer->setChecked(g_Config.bDisplayFramebuffer); - ui->action_OptionsIgnoreIllegalReadsWrites->setChecked(g_Config.bIgnoreBadMemAccess); - ui->action_CPUInterpreter->setChecked(!g_Config.bJit); - ui->action_CPUDynarec->setChecked(g_Config.bJit); - ui->action_OptionsBufferedRendering->setChecked(g_Config.bBufferedRendering); - ui->action_OptionsShowDebugStatistics->setChecked(g_Config.bShowDebugStats); - ui->action_OptionsWireframe->setChecked(g_Config.bDrawWireframe); - ui->action_OptionsHardwareTransform->setChecked(g_Config.bHardwareTransform); - ui->action_OptionsFastMemory->setChecked(g_Config.bFastMemory); - ui->action_OptionsLinearFiltering->setChecked(g_Config.bLinearFiltering); - ui->action_EmulationRunLoad->setChecked(g_Config.bAutoRun); - ui->action_OptionsUseVBO->setChecked(g_Config.bUseVBO); - ui->action_OptionsVertexCache->setChecked(g_Config.bVertexCache); - ui->action_AFOff->setChecked(g_Config.iAnisotropyLevel == 0); - ui->action_AF2x->setChecked(g_Config.iAnisotropyLevel == 2); - ui->action_AF4x->setChecked(g_Config.iAnisotropyLevel == 4); - ui->action_AF8x->setChecked(g_Config.iAnisotropyLevel == 8); - ui->action_AF16x->setChecked(g_Config.iAnisotropyLevel == 16); - ui->action_Simple_2xAA->setChecked(g_Config.SSAntiAliasing); - ui->action_Show_FPS_counter->setChecked(g_Config.bShowFPSCounter); - ui->action_Stretch_to_display->setChecked(g_Config.bStretchToDisplay); - ui->action_Sound->setChecked(g_Config.bEnableSound); - - bool enable = !Core_IsStepping() ? false : true; - ui->action_EmulationRun->setEnabled(g_State.bEmuThreadStarted ? enable : false); - ui->action_EmulationPause->setEnabled(g_State.bEmuThreadStarted ? !enable : false); - ui->action_EmulationReset->setEnabled(g_State.bEmuThreadStarted ? true : false); - - enable = g_State.bEmuThreadStarted ? false : true; + // enabling + bool enable = g_State.bEmuThreadStarted ? false : true; ui->action_FileLoad->setEnabled(enable); + ui->action_FileClose->setEnabled(!enable); ui->action_FileSaveStateFile->setEnabled(!enable); ui->action_FileLoadStateFile->setEnabled(!enable); ui->action_FileQuickloadState->setEnabled(!enable); ui->action_FileQuickSaveState->setEnabled(!enable); ui->action_CPUDynarec->setEnabled(enable); ui->action_CPUInterpreter->setEnabled(enable); - ui->action_EmulationStop->setEnabled(!enable); ui->action_DebugDumpFrame->setEnabled(!enable); ui->action_DebugDisassembly->setEnabled(!enable); ui->action_DebugMemoryView->setEnabled(!enable); ui->action_DebugMemoryViewTexture->setEnabled(!enable); ui->action_DebugDisplayList->setEnabled(!enable); + enable = !Core_IsStepping() ? false : true; + ui->action_EmulationRun->setEnabled(g_State.bEmuThreadStarted ? enable : false); + ui->action_EmulationPause->setEnabled(g_State.bEmuThreadStarted ? !enable : false); + ui->action_EmulationReset->setEnabled(g_State.bEmuThreadStarted ? true : false); + + // checking + ui->action_EmulationRunLoad->setChecked(g_Config.bAutoRun); + + ui->action_CPUInterpreter->setChecked(!g_Config.bJit); + ui->action_CPUDynarec->setChecked(g_Config.bJit); + ui->action_OptionsFastMemory->setChecked(g_Config.bFastMemory); + ui->action_OptionsIgnoreIllegalReadsWrites->setChecked(g_Config.bIgnoreBadMemAccess); + + ui->action_AFOff->setChecked(g_Config.iAnisotropyLevel == 0); + ui->action_AF2x->setChecked(g_Config.iAnisotropyLevel == 2); + ui->action_AF4x->setChecked(g_Config.iAnisotropyLevel == 4); + ui->action_AF8x->setChecked(g_Config.iAnisotropyLevel == 8); + ui->action_AF16x->setChecked(g_Config.iAnisotropyLevel == 16); + + ui->action_OptionsBufferedRendering->setChecked(g_Config.bBufferedRendering); + ui->action_OptionsLinearFiltering->setChecked(g_Config.bLinearFiltering); + ui->action_Simple_2xAA->setChecked(g_Config.SSAntiAliasing); + ui->action_OptionsScreen1x->setChecked(0 == (g_Config.iWindowZoom - 1)); ui->action_OptionsScreen2x->setChecked(1 == (g_Config.iWindowZoom - 1)); ui->action_OptionsScreen3x->setChecked(2 == (g_Config.iWindowZoom - 1)); ui->action_OptionsScreen4x->setChecked(3 == (g_Config.iWindowZoom - 1)); + ui->action_Stretch_to_display->setChecked(g_Config.bStretchToDisplay); + ui->action_OptionsHardwareTransform->setChecked(g_Config.bHardwareTransform); + ui->action_OptionsUseVBO->setChecked(g_Config.bUseVBO); + ui->action_OptionsVertexCache->setChecked(g_Config.bVertexCache); + ui->action_OptionsWireframe->setChecked(g_Config.bDrawWireframe); + ui->action_OptionsDisplayRawFramebuffer->setChecked(g_Config.bDisplayFramebuffer); +// ui->actionFrameskip->setChecked(g_Config.iFrameSkip != 0); + + ui->action_Sound->setChecked(g_Config.bEnableSound); + + ui->action_OptionsShowDebugStatistics->setChecked(g_Config.bShowDebugStats); + ui->action_Show_FPS_counter->setChecked(g_Config.bShowFPSCounter); + + ui->actionLogDefDebug->setChecked(LogManager::GetInstance()->GetLogLevel(LogTypes::COMMON) == LogTypes::LDEBUG); + ui->actionLogDefInfo->setChecked(LogManager::GetInstance()->GetLogLevel(LogTypes::COMMON) == LogTypes::LINFO); + ui->actionLogDefWarning->setChecked(LogManager::GetInstance()->GetLogLevel(LogTypes::COMMON) == LogTypes::LWARNING); + ui->actionLogDefError->setChecked(LogManager::GetInstance()->GetLogLevel(LogTypes::COMMON) == LogTypes::LERROR); + ui->actionLogG3DDebug->setChecked(LogManager::GetInstance()->GetLogLevel(LogTypes::G3D) == LogTypes::LDEBUG); ui->actionLogG3DInfo->setChecked(LogManager::GetInstance()->GetLogLevel(LogTypes::G3D) == LogTypes::LINFO); ui->actionLogG3DWarning->setChecked(LogManager::GetInstance()->GetLogLevel(LogTypes::G3D) == LogTypes::LWARNING); @@ -288,71 +265,78 @@ void MainWindow::UpdateMenus() ui->actionLogHLEInfo->setChecked(LogManager::GetInstance()->GetLogLevel(LogTypes::HLE) == LogTypes::LINFO); ui->actionLogHLEWarning->setChecked(LogManager::GetInstance()->GetLogLevel(LogTypes::HLE) == LogTypes::LWARNING); ui->actionLogHLEError->setChecked(LogManager::GetInstance()->GetLogLevel(LogTypes::HLE) == LogTypes::LERROR); +} - ui->actionLogDefDebug->setChecked(LogManager::GetInstance()->GetLogLevel(LogTypes::COMMON) == LogTypes::LDEBUG); - ui->actionLogDefInfo->setChecked(LogManager::GetInstance()->GetLogLevel(LogTypes::COMMON) == LogTypes::LINFO); - ui->actionLogDefWarning->setChecked(LogManager::GetInstance()->GetLogLevel(LogTypes::COMMON) == LogTypes::LWARNING); - ui->actionLogDefError->setChecked(LogManager::GetInstance()->GetLogLevel(LogTypes::COMMON) == LogTypes::LERROR); +void MainWindow::changeEvent(QEvent *e) +{ + if (e->type() == QEvent::LanguageChange) + ui->retranslateUi(this); } -void MainWindow::SetZoom(float zoom) { - if (zoom < 5) - g_Config.iWindowZoom = (int) zoom; +void MainWindow::closeEvent(QCloseEvent *) +{ + on_action_FileExit_triggered(); +} - pixel_xres = 480 * zoom; - pixel_yres = 272 * zoom; - dp_xres = pixel_xres; - dp_yres = pixel_yres; +void MainWindow::keyPressEvent(QKeyEvent *e) +{ + if(isFullScreen() && e->key() == Qt::Key_F12) + { + on_action_OptionsFullScreen_triggered(); + return; + } - emugl->resize(pixel_xres, pixel_yres); - emugl->setMinimumSize(pixel_xres, pixel_yres); - emugl->setMaximumSize(pixel_xres, pixel_yres); + pressedKeys.insert(e->key()); +} - ui->centralwidget->setFixedSize(pixel_xres, pixel_yres); - ui->centralwidget->resize(pixel_xres, pixel_yres); +void MainWindow::keyReleaseEvent(QKeyEvent *e) +{ + pressedKeys.remove(e->key()); +} - setFixedSize(sizeHint()); - resize(sizeHint()); +/* SLOTS */ +void MainWindow::Boot() +{ + dialogDisasm = new Debugger_Disasm(currentDebugMIPS, this, this); + if(g_Config.bShowDebuggerOnLoad) + dialogDisasm->show(); - PSP_CoreParameter().pixelWidth = pixel_xres; - PSP_CoreParameter().pixelHeight = pixel_yres; - PSP_CoreParameter().outputWidth = pixel_xres; - PSP_CoreParameter().outputHeight = pixel_yres; + if(g_Config.bFullScreen != isFullScreen()) + on_action_OptionsFullScreen_triggered(); - if (g_Config.SSAntiAliasing) - { - zoom *= 2; - PSP_CoreParameter().renderWidth = 480 * zoom; - PSP_CoreParameter().renderHeight = 272 * zoom; - } + memoryWindow = new Debugger_Memory(currentDebugMIPS, this, this); + memoryTexWindow = new Debugger_MemoryTex(this); + displaylistWindow = new Debugger_DisplayList(currentDebugMIPS, this, this); - if (gpu) - gpu->Resized(); + notifyMapsLoaded(); + + if (nextState == CORE_RUNNING) + on_action_EmulationRun_triggered(); + UpdateMenus(); } -void MainWindow::on_action_FileLoad_triggered() +void MainWindow::CoreEmitWait(bool isWaiting) { - BrowseAndBoot(); + // Unlock mutex while core is waiting; + EmuThread_LockDraw(!isWaiting); } -void MainWindow::on_action_EmulationRun_triggered() +void MainWindow::on_action_FileLoad_triggered() { - if (g_State.bEmuThreadStarted) + QString filename = QFileDialog::getOpenFileName(NULL, "Load File", g_Config.currentDirectory.c_str(), "PSP ROMs (*.pbp *.elf *.iso *.cso *.prx)"); + if (QFile::exists(filename)) { - if(dialogDisasm) - { - dialogDisasm->Stop(); - dialogDisasm->Go(); - } + QFileInfo info(filename); + g_Config.currentDirectory = info.absolutePath().toStdString(); + EmuThread_StartGame(filename); } } -void MainWindow::on_action_EmulationStop_triggered() +void MainWindow::on_action_FileClose_triggered() { if(dialogDisasm) - { dialogDisasm->Stop(); - } + // This will wait for ppsspp to pause EmuThread_LockDraw(true); EmuThread_LockDraw(false); @@ -371,12 +355,6 @@ void MainWindow::on_action_EmulationStop_triggered() UpdateMenus(); } -void MainWindow::on_action_EmulationPause_triggered() -{ - if(dialogDisasm) - dialogDisasm->Stop(); -} - void SaveStateActionFinished(bool result, void *userdata) { // TODO: Improve messaging? @@ -390,6 +368,16 @@ void SaveStateActionFinished(bool result, void *userdata) } } +void MainWindow::on_action_FileQuickloadState_triggered() +{ + SaveState::LoadSlot(0, SaveStateActionFinished, this); +} + +void MainWindow::on_action_FileQuickSaveState_triggered() +{ + SaveState::SaveSlot(0, SaveStateActionFinished, this); +} + void MainWindow::on_action_FileLoadStateFile_triggered() { QFileDialog dialog(0,"Load state"); @@ -398,15 +386,13 @@ void MainWindow::on_action_FileLoadStateFile_triggered() filters << "Save States (*.ppst)" << "|All files (*.*)"; dialog.setNameFilters(filters); dialog.setAcceptMode(QFileDialog::AcceptOpen); - QStringList fileNames; if (dialog.exec()) { - fileNames = dialog.selectedFiles(); + QStringList fileNames = dialog.selectedFiles(); SaveState::Load(fileNames[0].toStdString(), SaveStateActionFinished, this); } } - void MainWindow::on_action_FileSaveStateFile_triggered() { QFileDialog dialog(0,"Save state"); @@ -415,82 +401,63 @@ void MainWindow::on_action_FileSaveStateFile_triggered() QStringList filters; filters << "Save States (*.ppst)" << "|All files (*.*)"; dialog.setNameFilters(filters); - QStringList fileNames; if (dialog.exec()) { - fileNames = dialog.selectedFiles(); + QStringList fileNames = dialog.selectedFiles(); SaveState::Save(fileNames[0].toStdString(), SaveStateActionFinished, this); } } -void MainWindow::on_action_FileQuickloadState_triggered() +void MainWindow::on_action_FileExit_triggered() { - SaveState::LoadSlot(0, SaveStateActionFinished, this); + on_action_FileClose_triggered(); + EmuThread_Stop(); + QApplication::exit(0); } -void MainWindow::on_action_FileQuickSaveState_triggered() +void MainWindow::on_action_EmulationRun_triggered() { - SaveState::SaveSlot(0, SaveStateActionFinished, this); + if (g_State.bEmuThreadStarted) + { + if(dialogDisasm) + { + dialogDisasm->Stop(); + dialogDisasm->Go(); + } + } } -void MainWindow::on_action_OptionsScreen1x_triggered() +void MainWindow::on_action_EmulationPause_triggered() { - SetZoom(1); - UpdateMenus(); + if(dialogDisasm) + dialogDisasm->Stop(); } -void MainWindow::on_action_OptionsScreen2x_triggered() +void MainWindow::on_action_EmulationReset_triggered() { - SetZoom(2); - UpdateMenus(); -} + if(dialogDisasm) + dialogDisasm->Stop(); -void MainWindow::on_action_OptionsScreen3x_triggered() -{ - SetZoom(3); - UpdateMenus(); -} - -void MainWindow::on_action_OptionsScreen4x_triggered() -{ - SetZoom(4); - UpdateMenus(); -} - -void MainWindow::on_action_OptionsBufferedRendering_triggered() -{ - g_Config.bBufferedRendering = !g_Config.bBufferedRendering; - UpdateMenus(); -} - -void MainWindow::on_action_OptionsShowDebugStatistics_triggered() -{ - g_Config.bShowDebugStats = !g_Config.bShowDebugStats; - UpdateMenus(); -} + EmuThread_LockDraw(true); + EmuThread_LockDraw(false); -void MainWindow::on_action_OptionsHardwareTransform_triggered() -{ - g_Config.bHardwareTransform = !g_Config.bHardwareTransform; - UpdateMenus(); -} + if(dialogDisasm) + dialogDisasm->close(); + if(memoryWindow) + memoryWindow->close(); + if(memoryTexWindow) + memoryTexWindow->close(); + if(displaylistWindow) + displaylistWindow->close(); -void MainWindow::on_action_FileExit_triggered() -{ - on_action_EmulationStop_triggered(); - EmuThread_Stop(); - QApplication::exit(0); -} + EmuThread_StopGame(); -void MainWindow::on_action_CPUDynarec_triggered() -{ - g_Config.bJit = true; - UpdateMenus(); + EmuThread_StartGame(GetCurrentFilename()); } -void MainWindow::on_action_CPUInterpreter_triggered() +void MainWindow::on_action_EmulationRunLoad_triggered() { - g_Config.bJit = false; + g_Config.bAutoRun = !g_Config.bAutoRun; UpdateMenus(); } @@ -507,10 +474,7 @@ void MainWindow::on_action_DebugLoadMapFile_triggered() { fileNames = dialog.selectedFiles(); symbolMap.LoadSymbolMap(fileNames[0].toStdString().c_str()); - if (dialogDisasm) - dialogDisasm->NotifyMapLoaded(); - if (memoryWindow) - memoryWindow->NotifyMapLoaded(); + notifyMapsLoaded(); } } @@ -533,10 +497,12 @@ void MainWindow::on_action_DebugSaveMapFile_triggered() void MainWindow::on_action_DebugResetSymbolTable_triggered() { symbolMap.ResetSymbolMap(); - if (dialogDisasm) - dialogDisasm->NotifyMapLoaded(); - if (memoryWindow) - memoryWindow->NotifyMapLoaded(); + notifyMapsLoaded(); +} + +void MainWindow::on_action_DebugDumpFrame_triggered() +{ + gpu->DumpNextFrame(); } void MainWindow::on_action_DebugDisassembly_triggered() @@ -545,15 +511,45 @@ void MainWindow::on_action_DebugDisassembly_triggered() dialogDisasm->show(); } +void MainWindow::on_action_DebugDisplayList_triggered() +{ + if(displaylistWindow) + displaylistWindow->show(); +} + +void MainWindow::on_action_DebugLog_triggered() +{ + LogManager::GetInstance()->GetConsoleListener()->Show(LogManager::GetInstance()->GetConsoleListener()->Hidden()); +} + void MainWindow::on_action_DebugMemoryView_triggered() { if (memoryWindow) memoryWindow->show(); } -void MainWindow::on_action_DebugLog_triggered() +void MainWindow::on_action_DebugMemoryViewTexture_triggered() { - LogManager::GetInstance()->GetConsoleListener()->Show(LogManager::GetInstance()->GetConsoleListener()->Hidden()); + if(memoryTexWindow) + memoryTexWindow->show(); +} + +void MainWindow::on_action_CPUDynarec_triggered() +{ + g_Config.bJit = true; + UpdateMenus(); +} + +void MainWindow::on_action_CPUInterpreter_triggered() +{ + g_Config.bJit = false; + UpdateMenus(); +} + +void MainWindow::on_action_OptionsFastMemory_triggered() +{ + g_Config.bFastMemory = !g_Config.bFastMemory; + UpdateMenus(); } void MainWindow::on_action_OptionsIgnoreIllegalReadsWrites_triggered() @@ -562,6 +558,142 @@ void MainWindow::on_action_OptionsIgnoreIllegalReadsWrites_triggered() UpdateMenus(); } +void MainWindow::on_action_OptionsControls_triggered() +{ + controls->show(); +} + +void MainWindow::on_action_OptionsGamePadControls_triggered() +{ +#if QT_HAS_SDL + gamePadDlg->show(); +#else + QMessageBox::information(this,tr("Gamepad"),tr("You need to compile with SDL to have Gamepad support."), QMessageBox::Ok); +#endif +} + +void MainWindow::on_action_AFOff_triggered() +{ + g_Config.iAnisotropyLevel = 0; + UpdateMenus(); +} + +void MainWindow::on_action_AF2x_triggered() +{ + g_Config.iAnisotropyLevel = 2; + UpdateMenus(); +} + +void MainWindow::on_action_AF4x_triggered() +{ + g_Config.iAnisotropyLevel = 4; + UpdateMenus(); +} + +void MainWindow::on_action_AF8x_triggered() +{ + g_Config.iAnisotropyLevel = 8; + UpdateMenus(); +} + +void MainWindow::on_action_AF16x_triggered() +{ + g_Config.iAnisotropyLevel = 16; + UpdateMenus(); +} + +void MainWindow::on_action_OptionsBufferedRendering_triggered() +{ + g_Config.bBufferedRendering = !g_Config.bBufferedRendering; + UpdateMenus(); +} + +void MainWindow::on_action_OptionsLinearFiltering_triggered() +{ + g_Config.bLinearFiltering = !g_Config.bLinearFiltering; + UpdateMenus(); +} + +void MainWindow::on_action_Simple_2xAA_triggered() +{ + g_Config.SSAntiAliasing = !g_Config.SSAntiAliasing; + UpdateMenus(); +} + +void MainWindow::on_action_OptionsScreen1x_triggered() +{ + SetZoom(1); + UpdateMenus(); +} + +void MainWindow::on_action_OptionsScreen2x_triggered() +{ + SetZoom(2); + UpdateMenus(); +} + +void MainWindow::on_action_OptionsScreen3x_triggered() +{ + SetZoom(3); + UpdateMenus(); +} + +void MainWindow::on_action_OptionsScreen4x_triggered() +{ + SetZoom(4); + UpdateMenus(); +} + +void MainWindow::on_action_Stretch_to_display_triggered() +{ + g_Config.bStretchToDisplay = !g_Config.bStretchToDisplay; + UpdateMenus(); + if (gpu) + gpu->Resized(); +} + +void MainWindow::on_action_OptionsHardwareTransform_triggered() +{ + g_Config.bHardwareTransform = !g_Config.bHardwareTransform; + UpdateMenus(); +} + +void MainWindow::on_action_OptionsUseVBO_triggered() +{ + g_Config.bUseVBO = !g_Config.bUseVBO; + UpdateMenus(); +} + +void MainWindow::on_action_OptionsVertexCache_triggered() +{ + g_Config.bVertexCache = !g_Config.bVertexCache; + UpdateMenus(); +} + +void MainWindow::on_action_OptionsWireframe_triggered() +{ + g_Config.bDrawWireframe = !g_Config.bDrawWireframe; + UpdateMenus(); +} + +void MainWindow::on_action_OptionsDisplayRawFramebuffer_triggered() +{ + g_Config.bDisplayFramebuffer = !g_Config.bDisplayFramebuffer; + UpdateMenus(); +} + +void MainWindow::on_actionFrameskip_triggered() +{ +// g_Config.iFrameSkip = !g_Config.iFrameSkip; + UpdateMenus(); +} + +void MainWindow::on_action_Sound_triggered() +{ + g_Config.bEnableSound = !g_Config.bEnableSound; + UpdateMenus(); +} + void MainWindow::on_action_OptionsFullScreen_triggered() { if(isFullScreen()) { @@ -605,69 +737,50 @@ void MainWindow::on_action_OptionsFullScreen_triggered() } } -void MainWindow::on_action_OptionsWireframe_triggered() +void MainWindow::on_action_OptionsShowDebugStatistics_triggered() { - g_Config.bDrawWireframe = !g_Config.bDrawWireframe; + g_Config.bShowDebugStats = !g_Config.bShowDebugStats; UpdateMenus(); } -void MainWindow::on_action_OptionsDisplayRawFramebuffer_triggered() +void MainWindow::on_action_Show_FPS_counter_triggered() { - g_Config.bDisplayFramebuffer = !g_Config.bDisplayFramebuffer; + g_Config.bShowFPSCounter = !g_Config.bShowFPSCounter; UpdateMenus(); } -void MainWindow::on_action_OptionsFastMemory_triggered() +void setDefLogLevel(LogTypes::LOG_LEVELS level) { - g_Config.bFastMemory = !g_Config.bFastMemory; - UpdateMenus(); + for (int i = 0; i < LogTypes::NUMBER_OF_LOGS; i++) + { + LogTypes::LOG_TYPE type = (LogTypes::LOG_TYPE)i; + if(type == LogTypes::G3D || type == LogTypes::HLE) continue; + LogManager::GetInstance()->SetLogLevel(type, level); + } } -void MainWindow::on_action_OptionsLinearFiltering_triggered() +void MainWindow::on_actionLogDefDebug_triggered() { - g_Config.bLinearFiltering = !g_Config.bLinearFiltering; + setDefLogLevel(LogTypes::LDEBUG); UpdateMenus(); } -void MainWindow::on_action_OptionsControls_triggered() -{ - controls->show(); -} - -void MainWindow::on_action_HelpOpenWebsite_triggered() -{ - QDesktopServices::openUrl(QUrl("http://www.ppsspp.org/")); -} - -void MainWindow::on_action_HelpAbout_triggered() -{ - // TODO display about -} - -void MainWindow::closeEvent(QCloseEvent *event) -{ - on_action_FileExit_triggered(); -} - -void MainWindow::keyPressEvent(QKeyEvent *e) +void MainWindow::on_actionLogDefWarning_triggered() { - if(isFullScreen() && e->key() == Qt::Key_F12) - { - on_action_OptionsFullScreen_triggered(); - return; - } - - pressedKeys.insert(e->key()); + setDefLogLevel(LogTypes::LWARNING); + UpdateMenus(); } -void MainWindow::keyReleaseEvent(QKeyEvent *e) +void MainWindow::on_actionLogDefInfo_triggered() { - pressedKeys.remove(e->key()); + setDefLogLevel(LogTypes::LINFO); + UpdateMenus(); } -void MainWindow::on_MainWindow_destroyed() +void MainWindow::on_actionLogDefError_triggered() { - + setDefLogLevel(LogTypes::LERROR); + UpdateMenus(); } void MainWindow::on_actionLogG3DDebug_triggered() @@ -718,65 +831,64 @@ void MainWindow::on_actionLogHLEError_triggered() UpdateMenus(); } -void MainWindow::on_actionLogDefDebug_triggered() +void MainWindow::on_action_HelpOpenWebsite_triggered() { - for (int i = 0; i < LogTypes::NUMBER_OF_LOGS; i++) - { - LogTypes::LOG_TYPE type = (LogTypes::LOG_TYPE)i; - if(type == LogTypes::G3D || type == LogTypes::HLE) continue; - LogManager::GetInstance()->SetLogLevel(type, LogTypes::LDEBUG); - } - UpdateMenus(); + QDesktopServices::openUrl(QUrl("http://www.ppsspp.org/")); } -void MainWindow::on_actionLogDefWarning_triggered() +void MainWindow::on_action_HelpAbout_triggered() { - for (int i = 0; i < LogTypes::NUMBER_OF_LOGS; i++) - { - LogTypes::LOG_TYPE type = (LogTypes::LOG_TYPE)i; - if(type == LogTypes::G3D || type == LogTypes::HLE) continue; - LogManager::GetInstance()->SetLogLevel(type, LogTypes::LWARNING); - } - UpdateMenus(); + // TODO display about } -void MainWindow::on_actionLogDefInfo_triggered() +void MainWindow::on_language_changed(QAction *action) { - for (int i = 0; i < LogTypes::NUMBER_OF_LOGS; i++) - { - LogTypes::LOG_TYPE type = (LogTypes::LOG_TYPE)i; - if(type == LogTypes::G3D || type == LogTypes::HLE) continue; - LogManager::GetInstance()->SetLogLevel(type, LogTypes::LINFO); - } - UpdateMenus(); + loadLanguage(action->data().toString()); } -void MainWindow::on_actionLogDefError_triggered() -{ - for (int i = 0; i < LogTypes::NUMBER_OF_LOGS; i++) +/* Private functions */ +void MainWindow::SetZoom(float zoom) { + if (zoom < 5) + g_Config.iWindowZoom = (int) zoom; + + pixel_xres = 480 * zoom; + pixel_yres = 272 * zoom; + dp_xres = pixel_xres; + dp_yres = pixel_yres; + + emugl->resize(pixel_xres, pixel_yres); + emugl->setMinimumSize(pixel_xres, pixel_yres); + emugl->setMaximumSize(pixel_xres, pixel_yres); + + ui->centralwidget->setFixedSize(pixel_xres, pixel_yres); + ui->centralwidget->resize(pixel_xres, pixel_yres); + + setFixedSize(sizeHint()); + resize(sizeHint()); + + PSP_CoreParameter().pixelWidth = pixel_xres; + PSP_CoreParameter().pixelHeight = pixel_yres; + PSP_CoreParameter().outputWidth = pixel_xres; + PSP_CoreParameter().outputHeight = pixel_yres; + + if (g_Config.SSAntiAliasing) { - LogTypes::LOG_TYPE type = (LogTypes::LOG_TYPE)i; - if(type == LogTypes::G3D || type == LogTypes::HLE) continue; - LogManager::GetInstance()->SetLogLevel(type, LogTypes::LERROR); + zoom *= 2; + PSP_CoreParameter().renderWidth = 480 * zoom; + PSP_CoreParameter().renderHeight = 272 * zoom; } - UpdateMenus(); -} -void MainWindow::on_action_OptionsGamePadControls_triggered() -{ -#if QT_HAS_SDL - gamePadDlg->show(); -#else - QMessageBox::information(this,"Gamepad","You need to compile with SDL to have Gamepad support.", QMessageBox::Ok); -#endif + if (gpu) + gpu->Resized(); } -void MainWindow::on_language_changed(QAction *action) +void MainWindow::SetGameTitle(QString text) { - if (0 != action) - { - loadLanguage(action->data().toString()); - } + QString title = "PPSSPP " + QString(PPSSPP_VERSION_STR); + if (text != "") + title += QString(" - %1").arg(text); + + setWindowTitle(title); } void switchTranslator(QTranslator &translator, const QString &filename) @@ -792,9 +904,7 @@ void MainWindow::loadLanguage(const QString& language) if (currentLanguage != language) { currentLanguage = language; - QLocale locale = QLocale(currentLanguage); - QLocale::setDefault(locale); - QString languageName = QLocale::languageToString(locale.language()); + QLocale::setDefault(QLocale(currentLanguage)); switchTranslator(translator, QString(":/languages/ppsspp_%1.qm").arg(language)); } } @@ -806,8 +916,6 @@ void MainWindow::createLanguageMenu() connect(langGroup, SIGNAL(triggered(QAction *)), this, SLOT(on_language_changed(QAction *))); - QString defaultLocale = QLocale::system().name(); - defaultLocale.truncate(defaultLocale.lastIndexOf('_')); QStringList fileNames = QDir(":/languages").entryList(QStringList("ppsspp_*.qm")); if (fileNames.size() == 0) @@ -846,160 +954,10 @@ void MainWindow::createLanguageMenu() } } -void MainWindow::changeEvent(QEvent *event) +void MainWindow::notifyMapsLoaded() { - QMainWindow::changeEvent(event); - - if (0 != event) - { - switch (event->type()) - { - case QEvent::LanguageChange: - ui->retranslateUi(this); - break; - case QEvent::LocaleChange: - { - QString locale = QLocale::system().name(); - locale.truncate(locale.lastIndexOf('_')); - loadLanguage(locale); - } - break; - default: - break; - } - } -} - -void MainWindow::ShowMemory(u32 addr) -{ - if(memoryWindow) - memoryWindow->Goto(addr); -} - -void MainWindow::Update() -{ - UpdateInputState(&input_state); - - for (int i = 0; i < controllistCount; i++) - { - if (pressedKeys.contains(controllist[i].key) || - input_state.pad_buttons_down & controllist[i].emu_id) - __CtrlButtonDown(controllist[i].psp_id); - else - __CtrlButtonUp(controllist[i].psp_id); - } - __CtrlSetAnalog(input_state.pad_lstick_x, input_state.pad_lstick_y); -} - -void MainWindow::on_action_EmulationReset_triggered() -{ - if(dialogDisasm) - dialogDisasm->Stop(); - - EmuThread_LockDraw(true); - EmuThread_LockDraw(false); - - if(dialogDisasm) - dialogDisasm->close(); - if(memoryWindow) - memoryWindow->close(); - if(memoryTexWindow) - memoryTexWindow->close(); - if(displaylistWindow) - displaylistWindow->close(); - - EmuThread_StopGame(); - - EmuThread_StartGame(GetCurrentFilename()); -} - -void MainWindow::on_action_DebugDumpFrame_triggered() -{ - gpu->DumpNextFrame(); -} - -void MainWindow::on_action_EmulationRunLoad_triggered() -{ - g_Config.bAutoRun = !g_Config.bAutoRun; - UpdateMenus(); -} - -void MainWindow::on_action_OptionsVertexCache_triggered() -{ - g_Config.bVertexCache = !g_Config.bVertexCache; - UpdateMenus(); -} - -void MainWindow::on_action_OptionsUseVBO_triggered() -{ - g_Config.bUseVBO = !g_Config.bUseVBO; - UpdateMenus(); -} - -void MainWindow::on_action_Simple_2xAA_triggered() -{ - g_Config.SSAntiAliasing = !g_Config.SSAntiAliasing; - UpdateMenus(); -} - -void MainWindow::on_action_AFOff_triggered() -{ - g_Config.iAnisotropyLevel = 0; - UpdateMenus(); -} - -void MainWindow::on_action_AF2x_triggered() -{ - g_Config.iAnisotropyLevel = 2; - UpdateMenus(); -} - -void MainWindow::on_action_AF4x_triggered() -{ - g_Config.iAnisotropyLevel = 4; - UpdateMenus(); -} - -void MainWindow::on_action_AF8x_triggered() -{ - g_Config.iAnisotropyLevel = 8; - UpdateMenus(); -} - -void MainWindow::on_action_AF16x_triggered() -{ - g_Config.iAnisotropyLevel = 16; - UpdateMenus(); -} - -void MainWindow::on_action_Show_FPS_counter_triggered() -{ - g_Config.bShowFPSCounter = !g_Config.bShowFPSCounter; - UpdateMenus(); -} - -void MainWindow::on_action_Stretch_to_display_triggered() -{ - g_Config.bStretchToDisplay = !g_Config.bStretchToDisplay; - UpdateMenus(); - if (gpu) - gpu->Resized(); -} - -void MainWindow::on_action_Sound_triggered() -{ - g_Config.bEnableSound = !g_Config.bEnableSound; - UpdateMenus(); -} - -void MainWindow::on_action_DebugMemoryViewTexture_triggered() -{ - if(memoryTexWindow) - memoryTexWindow->show(); -} - -void MainWindow::on_action_DebugDisplayList_triggered() -{ - if(displaylistWindow) - displaylistWindow->show(); + if (dialogDisasm) + dialogDisasm->NotifyMapLoaded(); + if (memoryWindow) + memoryWindow->NotifyMapLoaded(); } diff --git a/Qt/mainwindow.h b/Qt/mainwindow.h index d2de2879276a..cb0af14bb0ef 100644 --- a/Qt/mainwindow.h +++ b/Qt/mainwindow.h @@ -24,182 +24,142 @@ class MainWindow : public QMainWindow public: explicit MainWindow(QWidget *parent = 0); - ~MainWindow(); - - void UpdateMenus(); - void SetZoom(float zoom); - void Create(int argc, const char *argv[], const char *savegame_directory, const char *external_directory, const char *installID); - void BrowseAndBoot(); - void SetNextState(CoreState state); - void SetGameTitle(QString text); + ~MainWindow(); Debugger_Disasm* GetDialogDisasm() { return dialogDisasm; } Debugger_Memory* GetDialogMemory() { return memoryWindow; } Debugger_MemoryTex* GetDialogMemoryTex() { return memoryTexWindow; } Debugger_DisplayList* GetDialogDisplaylist() { return displaylistWindow; } CoreState GetNextState() { return nextState; } - void closeEvent(QCloseEvent *event); - void keyPressEvent(QKeyEvent *); - void keyReleaseEvent(QKeyEvent *e); + void ShowMemory(u32 addr); void Update(); -public slots: + void UpdateMenus(); + +protected: + void changeEvent(QEvent *e); + void closeEvent(QCloseEvent *); + void keyPressEvent(QKeyEvent *e); + void keyReleaseEvent(QKeyEvent *e); +public slots: void Boot(); void CoreEmitWait(bool); private slots: + // File void on_action_FileLoad_triggered(); - - void on_action_EmulationRun_triggered(); - - void on_action_EmulationStop_triggered(); - - void on_action_EmulationPause_triggered(); - - void on_action_FileLoadStateFile_triggered(); - - void on_action_FileSaveStateFile_triggered(); - + void on_action_FileClose_triggered(); void on_action_FileQuickloadState_triggered(); - void on_action_FileQuickSaveState_triggered(); - - void on_action_OptionsScreen1x_triggered(); - - void on_action_OptionsScreen2x_triggered(); - - void on_action_OptionsScreen3x_triggered(); - - void on_action_OptionsScreen4x_triggered(); - - void on_action_OptionsBufferedRendering_triggered(); - - void on_action_OptionsShowDebugStatistics_triggered(); - - void on_action_OptionsHardwareTransform_triggered(); - + void on_action_FileLoadStateFile_triggered(); + void on_action_FileSaveStateFile_triggered(); void on_action_FileExit_triggered(); - void on_action_CPUDynarec_triggered(); - - void on_action_CPUInterpreter_triggered(); + // Emulation + void on_action_EmulationRun_triggered(); + void on_action_EmulationPause_triggered(); + void on_action_EmulationReset_triggered(); + void on_action_EmulationRunLoad_triggered(); + // Debug void on_action_DebugLoadMapFile_triggered(); - void on_action_DebugSaveMapFile_triggered(); - void on_action_DebugResetSymbolTable_triggered(); - + void on_action_DebugDumpFrame_triggered(); void on_action_DebugDisassembly_triggered(); - - void on_action_DebugMemoryView_triggered(); - + void on_action_DebugDisplayList_triggered(); void on_action_DebugLog_triggered(); + void on_action_DebugMemoryView_triggered(); + void on_action_DebugMemoryViewTexture_triggered(); + // Options + // Core + void on_action_CPUDynarec_triggered(); + void on_action_CPUInterpreter_triggered(); + void on_action_OptionsFastMemory_triggered(); void on_action_OptionsIgnoreIllegalReadsWrites_triggered(); - void on_action_OptionsFullScreen_triggered(); - - void on_action_OptionsWireframe_triggered(); - - void on_action_OptionsDisplayRawFramebuffer_triggered(); + // Controls + void on_action_OptionsControls_triggered(); + void on_action_OptionsGamePadControls_triggered(); - void on_action_OptionsFastMemory_triggered(); + // Video + void on_action_AFOff_triggered(); + void on_action_AF2x_triggered(); + void on_action_AF4x_triggered(); + void on_action_AF8x_triggered(); + void on_action_AF16x_triggered(); + void on_action_OptionsBufferedRendering_triggered(); void on_action_OptionsLinearFiltering_triggered(); + void on_action_Simple_2xAA_triggered(); - void on_action_OptionsControls_triggered(); + void on_action_OptionsScreen1x_triggered(); + void on_action_OptionsScreen2x_triggered(); + void on_action_OptionsScreen3x_triggered(); + void on_action_OptionsScreen4x_triggered(); - void on_action_HelpOpenWebsite_triggered(); + void on_action_Stretch_to_display_triggered(); + void on_action_OptionsHardwareTransform_triggered(); + void on_action_OptionsUseVBO_triggered(); + void on_action_OptionsVertexCache_triggered(); + void on_action_OptionsWireframe_triggered(); + void on_action_OptionsDisplayRawFramebuffer_triggered(); + void on_actionFrameskip_triggered(); - void on_action_HelpAbout_triggered(); + // Sound + void on_action_Sound_triggered(); - void on_MainWindow_destroyed(); + void on_action_OptionsFullScreen_triggered(); + void on_action_OptionsShowDebugStatistics_triggered(); + void on_action_Show_FPS_counter_triggered(); - void on_actionLogG3DDebug_triggered(); + // Logs + void on_actionLogDefDebug_triggered(); + void on_actionLogDefWarning_triggered(); + void on_actionLogDefInfo_triggered(); + void on_actionLogDefError_triggered(); + void on_actionLogG3DDebug_triggered(); void on_actionLogG3DWarning_triggered(); - void on_actionLogG3DError_triggered(); - void on_actionLogG3DInfo_triggered(); void on_actionLogHLEDebug_triggered(); - void on_actionLogHLEWarning_triggered(); - void on_actionLogHLEInfo_triggered(); - void on_actionLogHLEError_triggered(); - void on_actionLogDefDebug_triggered(); - - void on_actionLogDefWarning_triggered(); - - void on_actionLogDefInfo_triggered(); - - void on_actionLogDefError_triggered(); - - void on_action_OptionsGamePadControls_triggered(); + // Help + void on_action_HelpOpenWebsite_triggered(); + void on_action_HelpAbout_triggered(); + // Others void on_language_changed(QAction *action); - void on_action_EmulationReset_triggered(); - - void on_action_DebugDumpFrame_triggered(); - - void on_action_EmulationRunLoad_triggered(); - - void on_action_OptionsVertexCache_triggered(); - - void on_action_OptionsUseVBO_triggered(); - - void on_action_Simple_2xAA_triggered(); - - void on_action_AFOff_triggered(); - - void on_action_AF2x_triggered(); - - void on_action_AF4x_triggered(); - - void on_action_AF8x_triggered(); - - void on_action_AF16x_triggered(); - - void on_action_Show_FPS_counter_triggered(); - - void on_action_Stretch_to_display_triggered(); - - void on_action_Sound_triggered(); - - void on_action_DebugMemoryViewTexture_triggered(); - - void on_action_DebugDisplayList_triggered(); - private: + void SetZoom(float zoom); + void SetGameTitle(QString text); void loadLanguage(const QString &language); void createLanguageMenu(); - void changeEvent(QEvent *); + void notifyMapsLoaded(); QTranslator translator; - QTranslator qtTranslator; QString currentLanguage; - QString languagePath; Ui::MainWindow *ui; - QtEmuGL* emugl; + QtEmuGL *emugl; CoreState nextState; - InputState input_state; Debugger_Disasm *dialogDisasm; Debugger_Memory *memoryWindow; Debugger_MemoryTex *memoryTexWindow; Debugger_DisplayList *displaylistWindow; - Controls* controls; - GamePadDialog* gamePadDlg; + Controls *controls; + GamePadDialog *gamePadDlg; QSet pressedKeys; }; diff --git a/Qt/mainwindow.ui b/Qt/mainwindow.ui index a6ef9df025a5..6cabbd9838cc 100644 --- a/Qt/mainwindow.ui +++ b/Qt/mainwindow.ui @@ -44,7 +44,7 @@ 0 0 800 - 23 + 21 @@ -52,7 +52,7 @@ &File - + @@ -169,6 +169,7 @@ + @@ -220,7 +221,7 @@ &Open... - + &Close @@ -695,6 +696,14 @@ &Sound emulation + + + true + + + Frameskip + + From 924709b9af5381b1a416ae82d64b693c37949348 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marcin=20Miko=C5=82ajczyk?= Date: Wed, 20 Feb 2013 15:52:12 +0100 Subject: [PATCH 166/347] Ctrl widgets code cleanup --- Qt/ctrldisasmview.cpp | 62 ++++++++++++++++------------------------- Qt/ctrldisasmview.h | 2 -- Qt/ctrlmemview.cpp | 53 +++++++++++++---------------------- Qt/ctrlmemview.h | 1 - Qt/ctrlregisterlist.cpp | 49 ++++++++++++-------------------- Qt/ctrlvfpuview.cpp | 6 ++-- Qt/ctrlvfpuview.h | 6 +--- 7 files changed, 65 insertions(+), 114 deletions(-) diff --git a/Qt/ctrldisasmview.cpp b/Qt/ctrldisasmview.cpp index 92d43f8e51f6..90f794bc8b2d 100644 --- a/Qt/ctrldisasmview.cpp +++ b/Qt/ctrldisasmview.cpp @@ -33,26 +33,15 @@ void CtrlDisAsmView::keyPressEvent(QKeyEvent *e) { int page=(rect().bottom()/rowHeight)/2-1; - if(e->key() == Qt::Key_Down) + switch (e->key()) { - curAddress += align; - e->accept(); - } - else if(e->key() == Qt::Key_Up) - { - curAddress -= align; - e->accept(); - } - else if(e->key() == Qt::Key_PageDown) - { - curAddress += page*align; - e->accept(); - } - else if(e->key() == Qt::Key_PageUp) - { - curAddress -= page*align; - e->accept(); + case Qt::Key_Down: curAddress += align; break; + case Qt::Key_Up: curAddress -= align; break; + case Qt::Key_PageDown: curAddress += page*align; break; + case Qt::Key_PageUp: curAddress -= page*align; break; + default: QWidget::keyPressEvent(e); break; } + update(); } @@ -68,7 +57,6 @@ void CtrlDisAsmView::mousePressEvent(QMouseEvent *e) selecting=true; if (!oldselecting || (selection!=oldSelection)) redraw(); - e->accept(); } else { @@ -77,7 +65,6 @@ void CtrlDisAsmView::mousePressEvent(QMouseEvent *e) EmuThread_LockDraw(false); parentWindow->Update(); redraw(); - e->accept(); } } @@ -85,12 +72,11 @@ void CtrlDisAsmView::wheelEvent(QWheelEvent* e) { int numDegrees = e->delta() / 8; int numSteps = numDegrees / 15; - if (e->orientation() == Qt::Horizontal) { - } else { + if (e->orientation() == Qt::Vertical) + { curAddress -= numSteps*align; - e->accept(); update(); - } + } } void CtrlDisAsmView::redraw() @@ -243,7 +229,7 @@ void CtrlDisAsmView::RenameFunction() } else { - QMessageBox::information(this,"Warning","No symbol selected",QMessageBox::Ok); + QMessageBox::information(this,tr("Warning"),tr("No symbol selected"),QMessageBox::Ok); } } @@ -265,20 +251,20 @@ void CtrlDisAsmView::paintEvent(QPaintEvent *) int width = rect().width(); int numRows=(rect().height()/rowHeight)/2+1; - QColor bgColor = QColor(0xFFFFFFFF); - QPen nullPen= QPen(bgColor); - QPen currentPen=QPen(QColor(0,0,0)); - QPen selPen=QPen(QColor(0xFF808080)); - QPen condPen=QPen(QColor(0xFFFF3020)); + QColor bgColor(0xFFFFFFFF); + QPen nullPen(bgColor); + QPen currentPen(QColor(0,0,0)); + QPen selPen(QColor(0xFF808080)); + QPen condPen(QColor(0xFFFF3020)); QBrush lbr; lbr.setColor(bgColor); - QBrush currentBrush=QBrush(QColor(0xFFFFEfE8)); - QBrush pcBrush=QBrush(QColor(0xFF70FF70)); + QBrush currentBrush(QColor(0xFFFFEfE8)); + QBrush pcBrush(QColor(0xFF70FF70)); - QFont normalFont = QFont("Arial", 10); - QFont boldFont = QFont("Arial", 10); - QFont alignedFont = QFont("Monospace", 10); + QFont normalFont("Arial", 10); + QFont boldFont("Arial", 10); + QFont alignedFont("Monospace", 10); boldFont.setBold(true); painter.setFont(normalFont); @@ -305,7 +291,7 @@ void CtrlDisAsmView::paintEvent(QPaintEvent *) else painter.setPen(i==0 ? currentPen : nullPen); - QBrush mojsBrush=QBrush(lbr.color()); + QBrush mojsBrush(lbr.color()); painter.setBrush(mojsBrush); if (address == debugger->getPC()) @@ -315,7 +301,7 @@ void CtrlDisAsmView::paintEvent(QPaintEvent *) painter.drawRect(16,rowY1,width-16-1,rowY2-rowY1); painter.setBrush(currentBrush); - QPen textPen = QPen(QColor(halfAndHalf(bg.rgba(),0))); + QPen textPen(QColor(halfAndHalf(bg.rgba(),0))); painter.setPen(textPen); painter.setFont(alignedFont); painter.drawText(17,rowY1-3+rowHeight,QString("%1").arg(address,8,16,QChar('0'))); @@ -412,7 +398,7 @@ void CtrlDisAsmView::paintEvent(QPaintEvent *) { painter.setPen(branches[i].conditional ? condPen : currentPen); int x=280+(branches[i].srcAddr%9)*8; - QPoint curPos = QPoint(x-2,branches[i].src); + QPoint curPos(x-2,branches[i].src); if (branches[i].dst-200) { diff --git a/Qt/ctrldisasmview.h b/Qt/ctrldisasmview.h index dd1bce826bc1..d60be7ac77b9 100644 --- a/Qt/ctrldisasmview.h +++ b/Qt/ctrldisasmview.h @@ -12,7 +12,6 @@ class CtrlDisAsmView : public QWidget Q_OBJECT public: explicit CtrlDisAsmView(QWidget *parent = 0); - void redraw(); void setAlign(int l) @@ -73,7 +72,6 @@ class CtrlDisAsmView : public QWidget void mousePressEvent(QMouseEvent *e); void keyPressEvent(QKeyEvent *); void wheelEvent(QWheelEvent *e); -signals: public slots: void CopyAddress(); diff --git a/Qt/ctrlmemview.cpp b/Qt/ctrlmemview.cpp index 98571d03d25b..978e3a230ba7 100644 --- a/Qt/ctrlmemview.cpp +++ b/Qt/ctrlmemview.cpp @@ -15,7 +15,6 @@ CtrlMemView::CtrlMemView(QWidget *parent) : QWidget(parent) { - curAddress=0; rowHeight=14; align=4; @@ -32,44 +31,30 @@ void CtrlMemView::redraw() update(); } - void CtrlMemView::wheelEvent(QWheelEvent* e) { int numDegrees = e->delta() / 8; int numSteps = numDegrees / 15; - if (e->orientation() == Qt::Horizontal) { - } else { + if (e->orientation() == Qt::Vertical) + { curAddress -= numSteps*align*alignMul; - e->accept(); redraw(); - } + } } - void CtrlMemView::keyPressEvent(QKeyEvent *e) { int page=(rect().bottom()/rowHeight)/2-1; - if(e->key() == Qt::Key_Up) - { - curAddress-=align*alignMul; - e->accept(); - } - else if(e->key() == Qt::Key_Down) - { - curAddress+=align*alignMul; - e->accept(); - } - else if(e->key() == Qt::Key_PageUp) + switch (e->key()) { - curAddress-=page*align*alignMul; - e->accept(); - } - else if(e->key() == Qt::Key_PageDown) - { - curAddress+=page*align*alignMul; - e->accept(); + case Qt::Key_Up: curAddress -= align*alignMul; break; + case Qt::Key_Down: curAddress += align*alignMul; break; + case Qt::Key_PageUp: curAddress -= page*align*alignMul; break; + case Qt::Key_PageDown: curAddress += page*align*alignMul; break; + default: QWidget::keyPressEvent(e); break; } + redraw(); } @@ -86,17 +71,17 @@ void CtrlMemView::paintEvent(QPaintEvent *) int width = rect().width(); int numRows=(rect().bottom()/rowHeight)/2+1; - QPen nullPen=QPen(0xFFFFFF); - QPen currentPen=QPen(0xFF000000); - QPen selPen=QPen(0x808080); - QBrush lbr = QBrush(0xFFFFFF); - QBrush nullBrush=QBrush(0xFFFFFF); - QBrush currentBrush=QBrush(0xFFEfE8); - QBrush pcBrush=QBrush(0x70FF70); + QPen nullPen(0xFFFFFF); + QPen currentPen(0xFF000000); + QPen selPen(0x808080); + QBrush lbr(0xFFFFFF); + QBrush nullBrush(0xFFFFFF); + QBrush currentBrush(0xFFEFE8); + QBrush pcBrush(0x70FF70); QPen textPen; - QFont normalFont = QFont("Arial", 10); - QFont alignedFont = QFont("Monospace", 10); + QFont normalFont("Arial", 10); + QFont alignedFont("Monospace", 10); painter.setFont(normalFont); int i; diff --git a/Qt/ctrlmemview.h b/Qt/ctrlmemview.h index cc7f31c5062e..e4b52cfe6360 100644 --- a/Qt/ctrlmemview.h +++ b/Qt/ctrlmemview.h @@ -67,7 +67,6 @@ class CtrlMemView : public QWidget void keyPressEvent(QKeyEvent *e); void wheelEvent(QWheelEvent *e); void mousePressEvent(QMouseEvent *e); -signals: public slots: void CopyValue(); diff --git a/Qt/ctrlregisterlist.cpp b/Qt/ctrlregisterlist.cpp index a52c5c88abb2..64c19644a0e1 100644 --- a/Qt/ctrlregisterlist.cpp +++ b/Qt/ctrlregisterlist.cpp @@ -68,26 +68,15 @@ void CtrlRegisterList::scrollChanged(int action) void CtrlRegisterList::keyPressEvent(QKeyEvent *e) { - if(e->key() == Qt::Key_Down) + switch (e->key()) { - selection += 1; - e->accept(); - } - else if(e->key() == Qt::Key_Up) - { - selection -= 1; - e->accept(); - } - else if(e->key() == Qt::Key_PageDown) - { - selection += 4; - e->accept(); - } - else if(e->key() == Qt::Key_PageUp) - { - selection -= 4; - e->accept(); + case Qt::Key_Down: selection += 1; break; + case Qt::Key_Up: selection -= 1; break; + case Qt::Key_PageDown: selection += 4; break; + case Qt::Key_PageUp: selection -= 4; break; + default: QWidget::keyPressEvent(e); break; } + int maxRowsDisplay =rect().bottom()/rowHeight - 1; curVertOffset = std::min(std::max(curVertOffset, selection-maxRowsDisplay),selection); update(); @@ -127,19 +116,17 @@ void CtrlRegisterList::mousePressEvent(QMouseEvent *e) { redraw(); } - e->accept(); } void CtrlRegisterList::wheelEvent(QWheelEvent* e) { int numDegrees = e->delta() / 8; int numSteps = numDegrees / 15; - if (e->orientation() == Qt::Horizontal) { - } else { + if (e->orientation() == Qt::Vertical) + { curVertOffset -= numSteps; - e->accept(); update(); - } + } } @@ -175,17 +162,17 @@ void CtrlRegisterList::paintEvent(QPaintEvent *) int width = rect().width(); - QColor bgColor = QColor(0xffffff); - QPen nullPen=QPen(bgColor); - QPen currentPen=QPen(QColor(0xFF000000)); - QPen selPen=QPen(0x808080); + QColor bgColor(0xffffff); + QPen nullPen(bgColor); + QPen currentPen(QColor(0xFF000000)); + QPen selPen(0x808080); QPen textPen; QBrush lbr; lbr.setColor(bgColor); - QBrush nullBrush=QBrush(bgColor); - QBrush currentBrush=QBrush(0xFFEfE8); - QBrush pcBrush=QBrush(0x70FF70); + QBrush nullBrush(bgColor); + QBrush currentBrush(0xFFEfE8); + QBrush pcBrush(0x70FF70); int nc = cpu->GetNumCategories(); for (int i=0; i Date: Sun, 24 Feb 2013 16:34:32 +0100 Subject: [PATCH 167/347] Fix some warnings --- Qt/ctrldisasmview.cpp | 4 ++-- Qt/ctrlmemview.cpp | 3 ++- Qt/debugger_disasm.cpp | 10 +++++----- Qt/debugger_disasm.h | 20 +------------------- Qt/debugger_displaylist.cpp | 14 +++++++------- Qt/debugger_displaylist.h | 17 ----------------- Qt/debugger_vfpu.cpp | 2 +- Qt/gamepaddialog.cpp | 13 ++++--------- Qt/gamepaddialog.h | 7 ------- 9 files changed, 22 insertions(+), 68 deletions(-) diff --git a/Qt/ctrldisasmview.cpp b/Qt/ctrldisasmview.cpp index 90f794bc8b2d..3bf021f23ea8 100644 --- a/Qt/ctrldisasmview.cpp +++ b/Qt/ctrldisasmview.cpp @@ -281,12 +281,12 @@ void CtrlDisAsmView::paintEvent(QPaintEvent *) int rowY1 = rect().bottom()/2 + rowHeight*i - rowHeight/2; int rowY2 = rect().bottom()/2 + rowHeight*i + rowHeight/2 - 1; - lbr.setColor(marker==address?QColor(0xFFFFEEE0):QColor(debugger->getColor(address))); + lbr.setColor((unsigned int)marker == address ? QColor(0xFFFFEEE0) : QColor(debugger->getColor(address))); QColor bg = lbr.color(); painter.setPen(nullPen); painter.drawRect(0,rowY1,16-1,rowY2-rowY1); - if (selecting && address == selection) + if (selecting && address == (unsigned int)selection) painter.setPen(selPen); else painter.setPen(i==0 ? currentPen : nullPen); diff --git a/Qt/ctrlmemview.cpp b/Qt/ctrlmemview.cpp index 978e3a230ba7..5023d4f5f4a6 100644 --- a/Qt/ctrlmemview.cpp +++ b/Qt/ctrlmemview.cpp @@ -97,7 +97,7 @@ void CtrlMemView::paintEvent(QPaintEvent *) painter.setBrush(currentBrush); - if (selecting && address == selection) + if (selecting && address == (unsigned int)selection) painter.setPen(selPen); else painter.setPen(i==0 ? currentPen : nullPen); @@ -173,6 +173,7 @@ void CtrlMemView::paintEvent(QPaintEvent *) painter.drawText(85,rowY1 - 2 + rowHeight, temp); break; } + case MV_MAX: break; } } } diff --git a/Qt/debugger_disasm.cpp b/Qt/debugger_disasm.cpp index a94f80c0ec08..342f4aede0cb 100644 --- a/Qt/debugger_disasm.cpp +++ b/Qt/debugger_disasm.cpp @@ -346,7 +346,7 @@ void Debugger_Disasm::FillFunctions() if(symbolMap.GetSymbolType(i) & ST_FUNCTION) { QListWidgetItem* item = new QListWidgetItem(); - item->setText(QString(symbolMap.GetSymbolName(i)) + " ("+ QString::number(symbolMap.GetSymbolSize(i)) +")"); + item->setText(QString("%1 (%2)").arg(symbolMap.GetSymbolName(i)).arg(symbolMap.GetSymbolSize(i))); item->setData(Qt::UserRole, symbolMap.GetAddress(i)); ui->FuncList->addItem(item); } @@ -431,7 +431,7 @@ void Debugger_Disasm::UpdateThreadGUI() std::vector threads = GetThreadsInfo(); EmuThread_LockDraw(false); - for(int i = 0; i < threads.size(); i++) + for(size_t i = 0; i < threads.size(); i++) { QTreeWidgetItem* item = new QTreeWidgetItem(); item->setText(0,QString::number(threads[i].id)); @@ -480,7 +480,7 @@ void Debugger_Disasm::on_threadList_customContextMenuRequested(const QPoint &pos connect(gotoEntryPoint, SIGNAL(triggered()), this, SLOT(GotoThreadEntryPoint())); menu.addAction(gotoEntryPoint); - QMenu* changeStatus = menu.addMenu("Change status"); + QMenu* changeStatus = menu.addMenu(tr("Change status")); QAction *statusRunning = new QAction(tr("Running"), this); connect(statusRunning, SIGNAL(triggered()), this, SLOT(SetThreadStatusRun())); @@ -566,7 +566,7 @@ void Debugger_Disasm::UpdateDisplayListGUI() item->setText(3,QString("%1").arg(dl->pc,8,16,QChar('0'))); item->setData(3, Qt::UserRole, dl->pc); ui->displayList->addTopLevelItem(item); - if(curDlId == dl->id) + if(curDlId == (u32)dl->id) { ui->displayList->setCurrentItem(item); displayListRowSelected = item; @@ -595,7 +595,7 @@ void Debugger_Disasm::UpdateDisplayListGUI() item->setText(3,QString("%1").arg(it->pc,8,16,QChar('0'))); item->setData(3, Qt::UserRole, it->pc); ui->displayList->addTopLevelItem(item); - if(curDlId == it->id) + if(curDlId == (u32)it->id) { ui->displayList->setCurrentItem(item); displayListRowSelected = item; diff --git a/Qt/debugger_disasm.h b/Qt/debugger_disasm.h index 5ca646e4be27..4788b42fbf79 100644 --- a/Qt/debugger_disasm.h +++ b/Qt/debugger_disasm.h @@ -58,49 +58,31 @@ private slots: void UpdateThreadGUI(); void on_GotoPc_clicked(); - void on_Go_clicked(); - void on_Stop_clicked(); - void on_StepInto_clicked(); - void on_StepOver_clicked(); - void on_Skip_clicked(); - void on_NextHLE_clicked(); - void on_GotoLr_clicked(); - void on_GotoInt_currentIndexChanged(int index); - void on_Address_textChanged(const QString &arg1); - void on_DisasmView_customContextMenuRequested(const QPoint &pos); - void releaseLock(); void on_RegList_customContextMenuRequested(const QPoint &pos); - void on_vfpu_clicked(); - void on_FuncList_itemClicked(QListWidgetItem *item); - void on_breakpointsList_itemClicked(QTreeWidgetItem *item, int column); - void on_breakpointsList_customContextMenuRequested(const QPoint &pos); - void on_clearAllBP_clicked(); - void on_threadList_itemClicked(QTreeWidgetItem *item, int column); - void on_threadList_customContextMenuRequested(const QPoint &pos); void SetThreadStatusRun(); void SetThreadStatusWait(); void SetThreadStatusSuspend(); void on_displayList_customContextMenuRequested(const QPoint &pos); - + void releaseLock(); private: void SetThreadStatus(ThreadStatus status); diff --git a/Qt/debugger_displaylist.cpp b/Qt/debugger_displaylist.cpp index 9c125a2a7656..43b89f9b0d58 100644 --- a/Qt/debugger_displaylist.cpp +++ b/Qt/debugger_displaylist.cpp @@ -99,7 +99,7 @@ void Debugger_DisplayList::UpdateDisplayListGUI() item->setText(3,QString("%1").arg(dl->pc,8,16,QChar('0'))); item->setData(3, Qt::UserRole, dl->pc); ui->displayList->addTopLevelItem(item); - if(curDlId == dl->id) + if(curDlId == (u32)dl->id) { ui->displayList->setCurrentItem(item); displayListRowSelected = item; @@ -129,7 +129,7 @@ void Debugger_DisplayList::UpdateDisplayListGUI() item->setText(3,QString("%1").arg(it->pc,8,16,QChar('0'))); item->setData(3, Qt::UserRole, it->pc); ui->displayList->addTopLevelItem(item); - if(curDlId == it->id) + if(curDlId == (u32)it->id) { ui->displayList->setCurrentItem(item); displayListRowSelected = item; @@ -171,7 +171,7 @@ void Debugger_DisplayList::ShowDLCode() item->setText(1,QString("%1").arg(it->second.cmd,2,16,QChar('0'))); item->setText(2,QString("%1").arg(it->second.data,6,16,QChar('0'))); item->setText(3,it->second.comment); - if(curPc == it->first) + if(curPc == (u32)it->first) { curTexAddr = it->second.texAddr; curVtxAddr = it->second.vtxAddr; @@ -187,7 +187,7 @@ void Debugger_DisplayList::ShowDLCode() } ui->displayListData->addTopLevelItem(item); - if(curPc == it->first) + if(curPc == (u32)it->first) { ui->displayListData->setCurrentItem(item); } @@ -1573,7 +1573,7 @@ void Debugger_DisplayList::on_gotoPCBtn_clicked() for(int i = 0; i < ui->displayListData->topLevelItemCount(); i++) { - if(ui->displayListData->topLevelItem(i)->data(0, Qt::UserRole).toInt() == currentPC) + if((u32)ui->displayListData->topLevelItem(i)->data(0, Qt::UserRole).toInt() == currentPC) { ui->displayListData->setCurrentItem(ui->displayListData->topLevelItem(i)); } @@ -1610,7 +1610,7 @@ void Debugger_DisplayList::UpdateRenderBufferListGUI() std::vector fboList = gpu->GetFramebufferList(); - for(int i = 0; i < fboList.size(); i++) + for(size_t i = 0; i < fboList.size(); i++) { QTreeWidgetItem* item = new QTreeWidgetItem(); item->setText(0,QString("%1").arg(fboList[i].fb_address,8,16,QChar('0'))); @@ -1643,7 +1643,7 @@ void Debugger_DisplayList::setCurrentFBO(u32 addr) { for(int i = 0; i < ui->fboList->topLevelItemCount(); i++) { - if(ui->fboList->topLevelItem(i)->data(0,Qt::UserRole+1).toInt() == addr) + if((u32)ui->fboList->topLevelItem(i)->data(0,Qt::UserRole+1).toInt() == addr) { for(int j = 0; j < ui->fboList->colorCount(); j++) ui->fboList->topLevelItem(i)->setTextColor(j,Qt::green); diff --git a/Qt/debugger_displaylist.h b/Qt/debugger_displaylist.h index 7ecec8230237..78b19d86b45a 100644 --- a/Qt/debugger_displaylist.h +++ b/Qt/debugger_displaylist.h @@ -63,40 +63,23 @@ private slots: void releaseLock(); void on_displayList_itemClicked(QTreeWidgetItem *item, int column); - void on_stepBtn_clicked(); - void on_runBtn_clicked(); - void on_stopBtn_clicked(); - void on_nextDrawBtn_clicked(); - void on_gotoPCBtn_clicked(); - void on_texturesList_itemDoubleClicked(QTreeWidgetItem *item, int column); - void on_comboBox_currentIndexChanged(int index); - void on_fboList_itemClicked(QTreeWidgetItem *item, int column); - void on_nextDLBtn_clicked(); void setCurrentFBO(u32 addr); - void on_zoommBtn_clicked(); - void on_zoompBtn_clicked(); - void on_vertexList_itemClicked(QTreeWidgetItem *item, int column); - void on_pushButton_clicked(); - void on_nextIdx_clicked(); - void on_indexList_itemClicked(QTreeWidgetItem *item, int column); - void on_displayListData_customContextMenuRequested(const QPoint &pos); - void on_texturesList_customContextMenuRequested(const QPoint &pos); void RunToDLPC(); void RunToDrawTex(); diff --git a/Qt/debugger_vfpu.cpp b/Qt/debugger_vfpu.cpp index 5c30f3e12f1a..290dd26f08a6 100644 --- a/Qt/debugger_vfpu.cpp +++ b/Qt/debugger_vfpu.cpp @@ -12,7 +12,7 @@ Debugger_VFPU::Debugger_VFPU(DebugInterface *_cpu, MainWindow* mainWindow_, QWid { ui->setupUi(this); - setWindowTitle(QString("VFPU - ")+cpu->GetName()); + setWindowTitle(QString("VFPU - %1").arg(cpu->GetName())); ui->vfpu->setCPU(_cpu); } diff --git a/Qt/gamepaddialog.cpp b/Qt/gamepaddialog.cpp index 5094fc032c5d..2b1fb03e0393 100644 --- a/Qt/gamepaddialog.cpp +++ b/Qt/gamepaddialog.cpp @@ -44,10 +44,10 @@ const int configOffset = 200; GamePadDialog::GamePadDialog(InputState* state, QWidget *parent) : QDialog(parent), ui(new Ui::GamePadDialog), - m_inputState(state), #if QT_HAS_SDL m_joystick(0), #endif + m_inputState(state), m_isInit(false) { ui->setupUi(this); @@ -108,15 +108,10 @@ void GamePadDialog::showEvent(QShowEvent *) void GamePadDialog::changeEvent(QEvent *event) { - QDialog::changeEvent(event); - - if (0 != event) + if (event->type() == QEvent::LanguageChange) { - if (event->type() == QEvent::LanguageChange) - { - ui->retranslateUi(this); - on_refreshListBtn_clicked(); - } + ui->retranslateUi(this); + on_refreshListBtn_clicked(); } } diff --git a/Qt/gamepaddialog.h b/Qt/gamepaddialog.h index 24163731ccbd..4157fa2aa5a2 100644 --- a/Qt/gamepaddialog.h +++ b/Qt/gamepaddialog.h @@ -21,23 +21,16 @@ class GamePadDialog : public QDialog ~GamePadDialog(); void SetViewMode(); - void SetCalibMode(); - void CalibNextButton(); protected: void showEvent(QShowEvent *); void changeEvent(QEvent *); private slots: void releaseLock(); void on_refreshListBtn_clicked(); - void on_SelectPadBtn_clicked(); - void pollJoystick(); - void on_AssignBtn_clicked(); - void on_buttonBox_accepted(); - private: int GetIntFromMapping(int inputId, int type, int sign); void GetMappingFromInt(int value, int &inputId, int &type, int &sign); From 7f1eb1bb2aca2f9068fbb0ade36891c55da21fb5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marcin=20Miko=C5=82ajczyk?= Date: Sun, 24 Feb 2013 18:58:26 +0100 Subject: [PATCH 168/347] Displaylist cleanup --- Qt/debugger_displaylist.cpp | 46 +++++++++---------------------------- 1 file changed, 11 insertions(+), 35 deletions(-) diff --git a/Qt/debugger_displaylist.cpp b/Qt/debugger_displaylist.cpp index 43b89f9b0d58..ffbf6b004716 100644 --- a/Qt/debugger_displaylist.cpp +++ b/Qt/debugger_displaylist.cpp @@ -13,7 +13,6 @@ #include "base/display.h" #include "mainwindow.h" #include "GPU/GLES/VertexDecoder.h" -#include Debugger_DisplayList::Debugger_DisplayList(DebugInterface *_cpu, MainWindow* mainWindow_, QWidget *parent) : @@ -78,39 +77,8 @@ void Debugger_DisplayList::UpdateDisplayListGUI() EmuThread_LockDraw(true); const std::deque& dlQueue = gpu->GetDisplayLists(); - DisplayList* dl = gpu->GetCurrentDisplayList(); - if(dl) - { - QTreeWidgetItem* item = new QTreeWidgetItem(); - item->setText(0,QString::number(dl->id)); - item->setData(0, Qt::UserRole, dl->id); - switch(dl->status) - { - case PSP_GE_LIST_DONE: item->setText(1,"Done"); break; - case PSP_GE_LIST_QUEUED: item->setText(1,"Queued"); break; - case PSP_GE_LIST_DRAWING: item->setText(1,"Drawing"); break; - case PSP_GE_LIST_STALL_REACHED: item->setText(1,"Stall Reached"); break; - case PSP_GE_LIST_END_REACHED: item->setText(1,"End Reached"); break; - case PSP_GE_LIST_CANCEL_DONE: item->setText(1,"Cancel Done"); break; - default: break; - } - item->setText(2,QString("%1").arg(dl->startpc,8,16,QChar('0'))); - item->setData(2, Qt::UserRole, dl->startpc); - item->setText(3,QString("%1").arg(dl->pc,8,16,QChar('0'))); - item->setData(3, Qt::UserRole, dl->pc); - ui->displayList->addTopLevelItem(item); - if(curDlId == (u32)dl->id) - { - ui->displayList->setCurrentItem(item); - displayListRowSelected = item; - ShowDLCode(); - } - } - for(auto it = dlQueue.begin(); it != dlQueue.end(); ++it) { - if(dl && it->id == dl->id) - continue; QTreeWidgetItem* item = new QTreeWidgetItem(); item->setText(0,QString::number(it->id)); item->setData(0, Qt::UserRole, it->id); @@ -138,6 +106,14 @@ void Debugger_DisplayList::UpdateDisplayListGUI() } for(int i = 0; i < ui->displayList->columnCount(); i++) ui->displayList->resizeColumnToContents(i); + + if (ui->displayList->selectedItems().size() == 0 && ui->displayList->topLevelItemCount() != 0) + { + ui->displayList->setCurrentItem(ui->displayList->topLevelItem(0)); + displayListRowSelected = ui->displayList->topLevelItem(0); + ShowDLCode(); + } + EmuThread_LockDraw(false); } @@ -209,7 +185,7 @@ void Debugger_DisplayList::ShowDLCode() // Textures QTreeWidgetItem* item = new QTreeWidgetItem(); u32 texaddr = (drawGPUState[i].texaddr[0] & 0xFFFFF0) | ((drawGPUState[i].texbufwidth[0]<<8) & 0x0F000000); - if(!(usedTexAddr.find(texaddr) != usedTexAddr.end() || !Memory::IsValidAddress(texaddr))) + if(usedTexAddr.find(texaddr) == usedTexAddr.end() && Memory::IsValidAddress(texaddr)) { u32 format = drawGPUState[i].texformat & 0xF; int w = 1 << (drawGPUState[i].texsize[0] & 0xf); @@ -234,7 +210,7 @@ void Debugger_DisplayList::ShowDLCode() QTreeWidgetItem* vertexItem = new QTreeWidgetItem(); u32 baseExtended = ((drawGPUState[i].base & 0x0F0000) << 8) | (drawGPUState[i].vaddr & 0xFFFFFF); u32 vaddr = ((drawGPUState[i].offsetAddr & 0xFFFFFF) + baseExtended) & 0x0FFFFFFF; - if(!((drawGPUState[i].vaddr) == 0 || !Memory::IsValidAddress(vaddr) || usedVtxAddr.find(vaddr) != usedVtxAddr.end())) + if(drawGPUState[i].vaddr != 0 && Memory::IsValidAddress(vaddr) && usedVtxAddr.find(vaddr) == usedVtxAddr.end()) { vertexItem->setText(0, QString("%1").arg(vaddr,8,16,QChar('0'))); vertexItem->setData(0,Qt::UserRole, i); @@ -296,7 +272,7 @@ void Debugger_DisplayList::ShowDLCode() QTreeWidgetItem* indexItem = new QTreeWidgetItem(); baseExtended = ((drawGPUState[i].base & 0x0F0000) << 8) | (drawGPUState[i].iaddr & 0xFFFFFF); u32 iaddr = ((drawGPUState[i].offsetAddr & 0xFFFFFF) + baseExtended) & 0x0FFFFFFF; - if(!((drawGPUState[i].iaddr & 0xFFFFFF) == 0 || !Memory::IsValidAddress(iaddr) || usedIdxAddr.find(iaddr) != usedIdxAddr.end())) + if((drawGPUState[i].iaddr & 0xFFFFFF) != 0 && Memory::IsValidAddress(iaddr) && usedIdxAddr.find(iaddr) == usedIdxAddr.end()) { indexItem->setText(0, QString("%1").arg(iaddr,8,16,QChar('0'))); indexItem->setData(0,Qt::UserRole, i); From 9e63cc6af15198a8277b4e0bb8c4066a1d805419 Mon Sep 17 00:00:00 2001 From: Carlos Estrague Date: Sun, 24 Feb 2013 20:18:40 +0100 Subject: [PATCH 169/347] Update android/jni/Android.mk build fix android build --- android/jni/Android.mk | 1 + 1 file changed, 1 insertion(+) diff --git a/android/jni/Android.mk b/android/jni/Android.mk index 13f6736dc982..5f6640f5a0e6 100644 --- a/android/jni/Android.mk +++ b/android/jni/Android.mk @@ -158,6 +158,7 @@ LOCAL_SRC_FILES := \ $(SRC)/Core/HLE/sceUsb.cpp \ $(SRC)/Core/HLE/sceUtility.cpp \ $(SRC)/Core/HLE/sceVaudio.cpp \ + $(SRC)/Core/HLE/scePspNpDrm_user.cpp \ $(SRC)/Core/FileSystems/BlockDevices.cpp \ $(SRC)/Core/FileSystems/ISOFileSystem.cpp \ $(SRC)/Core/FileSystems/MetaFileSystem.cpp \ From 0538592f3ec478010a411e554530ef73f4884d12 Mon Sep 17 00:00:00 2001 From: sum2012 Date: Mon, 25 Feb 2013 05:22:01 +0800 Subject: [PATCH 170/347] Make default FastMM off UNIMPL _sceAtracGetContextAddress make game crash when FastMM on --- Core/Config.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/Core/Config.cpp b/Core/Config.cpp index af73c258c550..1352c3fb0c74 100644 --- a/Core/Config.cpp +++ b/Core/Config.cpp @@ -57,7 +57,8 @@ void CConfig::Load(const char *iniFileName) IniFile::Section *cpu = iniFile.GetOrCreateSection("CPU"); cpu->Get("Jit", &bJit, true); - cpu->Get("FastMemory", &bFastMemory, true); + //FastMemory Default set back to True when solve UNIMPL _sceAtracGetContextAddress making game crash + cpu->Get("FastMemory", &bFastMemory, false); IniFile::Section *graphics = iniFile.GetOrCreateSection("Graphics"); graphics->Get("ShowFPSCounter", &bShowFPSCounter, false); From d99ca71a473255377e0e8a20074997e3e9563477 Mon Sep 17 00:00:00 2001 From: raven02 Date: Mon, 25 Feb 2013 05:42:23 +0800 Subject: [PATCH 171/347] Add u_colormask and use it in enableColorTest --- GPU/GLES/FragmentShaderGenerator.cpp | 6 +++--- GPU/GLES/ShaderManager.cpp | 4 ++++ GPU/GLES/ShaderManager.h | 3 ++- 3 files changed, 9 insertions(+), 4 deletions(-) diff --git a/GPU/GLES/FragmentShaderGenerator.cpp b/GPU/GLES/FragmentShaderGenerator.cpp index b0e8fc6a7ca0..3394acc5e2f0 100644 --- a/GPU/GLES/FragmentShaderGenerator.cpp +++ b/GPU/GLES/FragmentShaderGenerator.cpp @@ -94,6 +94,7 @@ void GenerateFragmentShader(char *buffer) WRITE(p, "uniform sampler2D tex;\n"); if (enableAlphaTest || enableColorTest) { WRITE(p, "uniform vec4 u_alphacolorref;\n"); + WRITE(p, "uniform vec4 u_colormask;\n"); } if (gstate.textureMapEnable & 1) { WRITE(p, "uniform vec3 u_texenv;\n"); @@ -189,9 +190,8 @@ void GenerateFragmentShader(char *buffer) const char *colorTestFuncs[] = { "#", "#", " == ", " != " }; // never/always don't make sense} int colorTestMask = gstate.colormask; if (colorTestFuncs[colorTestFunc][0] != '#') - WRITE(p, "if (!(v.rgb %s u_alphacolorref.rgb)) discard;\n", colorTestFuncs[colorTestFunc]); - }*/ - + WRITE(p, "if (!(v.rgb %s (u_alphacolorref.rgb & u_colormask.rgb)) discard;\n", colorTestFuncs[colorTestFunc]); + }*/ if (enableFog) { WRITE(p, " float fogCoef = clamp(v_fogdepth, 0.0, 1.0);\n"); WRITE(p, " gl_FragColor = mix(vec4(u_fogcolor, v.a), v, fogCoef);\n"); diff --git a/GPU/GLES/ShaderManager.cpp b/GPU/GLES/ShaderManager.cpp index 4471a48e8617..ac789f572670 100644 --- a/GPU/GLES/ShaderManager.cpp +++ b/GPU/GLES/ShaderManager.cpp @@ -89,6 +89,7 @@ LinkedShader::LinkedShader(Shader *vs, Shader *fs) u_fogcolor = glGetUniformLocation(program, "u_fogcolor"); u_fogcoef = glGetUniformLocation(program, "u_fogcoef"); u_alphacolorref = glGetUniformLocation(program, "u_alphacolorref"); + u_colormask = glGetUniformLocation(program, "u_colormask"); // Transform u_view = glGetUniformLocation(program, "u_view"); @@ -252,6 +253,9 @@ void LinkedShader::updateUniforms() { if (u_alphacolorref != -1 && (dirtyUniforms & DIRTY_ALPHACOLORREF)) { SetColorUniform3Alpha(u_alphacolorref, gstate.colorref, (gstate.alphatest >> 8) & 0xFF); } + if (u_colormask != -1 && (dirtyUniforms & DIRTY_COLORMASK)) { + SetColorUniform3(u_colormask, gstate.colormask); + } if (u_fogcolor != -1 && (dirtyUniforms & DIRTY_FOGCOLOR)) { SetColorUniform3(u_fogcolor, gstate.fogcolor); } diff --git a/GPU/GLES/ShaderManager.h b/GPU/GLES/ShaderManager.h index c83ad3a66ac4..38bb73e80563 100644 --- a/GPU/GLES/ShaderManager.h +++ b/GPU/GLES/ShaderManager.h @@ -58,6 +58,7 @@ class LinkedShader // Fragment processing inputs int u_alphacolorref; + int u_colormask; int u_fogcolor; int u_fogcoef; @@ -88,7 +89,7 @@ enum DIRTY_TEXENV = (1 << 4), DIRTY_ALPHACOLORREF = (1 << 5), DIRTY_COLORREF = (1 << 6), - + DIRTY_COLORMASK = (1 << 7), DIRTY_LIGHT0 = (1 << 8), DIRTY_LIGHT1 = (1 << 9), DIRTY_LIGHT2 = (1 << 10), From 65e6b90f7cb138ffe0dcedbd2b9e730514cbce4e Mon Sep 17 00:00:00 2001 From: raven02 Date: Mon, 25 Feb 2013 05:59:53 +0800 Subject: [PATCH 172/347] Add DirtyUniform(DIRTY_COLORMASK) --- GPU/GLES/DisplayListInterpreter.cpp | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/GPU/GLES/DisplayListInterpreter.cpp b/GPU/GLES/DisplayListInterpreter.cpp index d7a6f5897e12..e5e68a72553f 100644 --- a/GPU/GLES/DisplayListInterpreter.cpp +++ b/GPU/GLES/DisplayListInterpreter.cpp @@ -816,9 +816,12 @@ void GLES_GPU::ExecuteOp(u32 op, u32 diff) { case GE_CMD_ALPHATESTENABLE: case GE_CMD_COLORTESTENABLE: + // They are done in the fragment shader. + break; + case GE_CMD_COLORTEST: case GE_CMD_COLORTESTMASK: - // This is done in the shader. + shaderManager_->DirtyUniform(DIRTY_COLORMASK); break; case GE_CMD_COLORREF: From 84c95526bc325fa8013d500e7a2fe37635542584 Mon Sep 17 00:00:00 2001 From: "Unknown W. Brackets" Date: Sun, 24 Feb 2013 14:38:37 -0800 Subject: [PATCH 173/347] Mark more instructions which eat prefixes. --- Core/MIPS/MIPSTables.cpp | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/Core/MIPS/MIPSTables.cpp b/Core/MIPS/MIPSTables.cpp index 2d6ec44494d6..a27774bd3d31 100644 --- a/Core/MIPS/MIPSTables.cpp +++ b/Core/MIPS/MIPSTables.cpp @@ -492,7 +492,7 @@ const MIPSInstruction tableVFPU1[8] = INSTR("vdot",&Jit::Comp_VDot, Dis_VectorDot, Int_VDot, IS_VFPU|OUT_EAT_PREFIX), INSTR("vscl",&Jit::Comp_Generic, Dis_VScl, Int_VScl, IS_VFPU|OUT_EAT_PREFIX), {-2}, - INSTR("vhdp",&Jit::Comp_Generic, Dis_Generic, Int_VHdp, IS_VFPU), + INSTR("vhdp",&Jit::Comp_Generic, Dis_Generic, Int_VHdp, IS_VFPU|OUT_EAT_PREFIX), INSTR("vcrs",&Jit::Comp_Generic, Dis_Vcrs, Int_Vcrs, IS_VFPU), INSTR("vdet",&Jit::Comp_Generic, Dis_Generic, Int_Vdet, IS_VFPU), {-2}, @@ -619,8 +619,8 @@ MIPSInstruction tableVFPU5[8] = //110111 xxx INSTR("vpfxt",&Jit::Comp_VPFX, Dis_VPFXST, Int_VPFX, IS_VFPU), INSTR("vpfxd", &Jit::Comp_VPFX, Dis_VPFXD, Int_VPFX, IS_VFPU), INSTR("vpfxd", &Jit::Comp_VPFX, Dis_VPFXD, Int_VPFX, IS_VFPU), - INSTR("viim.s",&Jit::Comp_Generic, Dis_Viim,Int_Viim, IS_VFPU), - INSTR("vfim.s",&Jit::Comp_Generic, Dis_Viim,Int_Viim, IS_VFPU), + INSTR("viim.s",&Jit::Comp_Generic, Dis_Viim,Int_Viim, IS_VFPU|OUT_EAT_PREFIX), + INSTR("vfim.s",&Jit::Comp_Generic, Dis_Viim,Int_Viim, IS_VFPU|OUT_EAT_PREFIX), }; const MIPSInstruction tableVFPU6[32] = //111100 xxx @@ -690,14 +690,14 @@ const MIPSInstruction tableVFPU9[32] = //110100 00010 xxxxx INSTR("vbfy1", &Jit::Comp_Generic, Dis_Vbfy, Int_Vbfy, IS_VFPU|OUT_EAT_PREFIX), INSTR("vbfy2", &Jit::Comp_Generic, Dis_Vbfy, Int_Vbfy, IS_VFPU|OUT_EAT_PREFIX), //4 - INSTR("vocp", &Jit::Comp_Generic, Dis_Vbfy, Int_Vocp, IS_VFPU), // one's complement - INSTR("vsocp", &Jit::Comp_Generic, Dis_Vbfy, Int_Vsocp, IS_VFPU), + INSTR("vocp", &Jit::Comp_Generic, Dis_Vbfy, Int_Vocp, IS_VFPU|OUT_EAT_PREFIX), // one's complement + INSTR("vsocp", &Jit::Comp_Generic, Dis_Vbfy, Int_Vsocp, IS_VFPU|OUT_EAT_PREFIX), INSTR("vfad", &Jit::Comp_Generic, Dis_Vfad, Int_Vfad, IS_VFPU|OUT_EAT_PREFIX), INSTR("vavg", &Jit::Comp_Generic, Dis_Vfad, Int_Vavg, IS_VFPU), //8 INSTR("vsrt3", &Jit::Comp_Generic, Dis_Vbfy, Int_Vsrt3, IS_VFPU), INSTR("vsrt4", &Jit::Comp_Generic, Dis_Vbfy, Int_Vsrt4, IS_VFPU), - INSTR("vsgn", &Jit::Comp_Generic, Dis_Vbfy, Int_Vsgn, IS_VFPU), + INSTR("vsgn", &Jit::Comp_Generic, Dis_Vbfy, Int_Vsgn, IS_VFPU|OUT_EAT_PREFIX), {-2}, //12 {-2}, @@ -715,9 +715,9 @@ const MIPSInstruction tableVFPU9[32] = //110100 00010 xxxxx {-2},{-2},{-2},{-2}, //24 {-2}, - INSTR("vt4444", &Jit::Comp_Generic, Dis_Generic, Int_ColorConv, IS_VFPU), - INSTR("vt5551", &Jit::Comp_Generic, Dis_Generic, Int_ColorConv, IS_VFPU), - INSTR("vt5650", &Jit::Comp_Generic, Dis_Generic, Int_ColorConv, IS_VFPU), + INSTR("vt4444", &Jit::Comp_Generic, Dis_Generic, Int_ColorConv, IS_VFPU|OUT_EAT_PREFIX), + INSTR("vt5551", &Jit::Comp_Generic, Dis_Generic, Int_ColorConv, IS_VFPU|OUT_EAT_PREFIX), + INSTR("vt5650", &Jit::Comp_Generic, Dis_Generic, Int_ColorConv, IS_VFPU|OUT_EAT_PREFIX), //28 {-2},{-2},{-2},{-2}, From 4d1f07990a13f0e27cf815db0ee18862689d2765 Mon Sep 17 00:00:00 2001 From: "Unknown W. Brackets" Date: Sun, 24 Feb 2013 14:39:13 -0800 Subject: [PATCH 174/347] Fix some NaN handling in a few funcs. --- Core/MIPS/MIPSIntVFPU.cpp | 32 ++++++++++++++++++++++++++------ 1 file changed, 26 insertions(+), 6 deletions(-) diff --git a/Core/MIPS/MIPSIntVFPU.cpp b/Core/MIPS/MIPSIntVFPU.cpp index 4cc701ece9d1..d2e2e281fc0b 100644 --- a/Core/MIPS/MIPSIntVFPU.cpp +++ b/Core/MIPS/MIPSIntVFPU.cpp @@ -89,6 +89,25 @@ using std::isnan; #define isnan _isnan #endif +// Preserves NaN in first param, takes sign of equal second param. +// Technically, std::max may do this but it's undefined. +inline float nanmax(float f, float cst) +{ + return f <= cst ? cst : f; +} + +// Preserves NaN in first param, takes sign of equal second param. +inline float nanmin(float f, float cst) +{ + return f >= cst ? cst : f; +} + +// Preserves NaN in first param, takes sign of equal value in others. +inline float nanclamp(float f, float lower, float upper) +{ + return nanmin(nanmax(f, lower), upper); +} + void ApplyPrefixST(float *v, u32 data, VectorSize size) { // Possible optimization shortcut: @@ -523,7 +542,8 @@ namespace MIPSInt ReadVector(s, sz, vs); for (int i = 0; i < GetNumVectorElements(sz); i++) { - d[i] = 1.0f - s[i]; + // Always positive NaN. + d[i] = isnan(s[i]) ? fabsf(s[i]) : 1.0f - s[i]; } ApplyPrefixD(d, sz); WriteVector(d, sz, vd); @@ -540,13 +560,13 @@ namespace MIPSInt ReadVector(s, sz, vs); int n = GetNumVectorElements(sz); float x = s[0]; - d[0] = std::min(std::max(0.0f, 1.0f - x), 1.0f); - d[1] = std::min(std::max(0.0f, x), 1.0f); + d[0] = nanclamp(1.0f - x, 0.0f, 1.0f); + d[1] = nanclamp(x, 0.0f, 1.0f); VectorSize outSize = V_Pair; if (n > 1) { float y = s[1]; - d[2] = std::min(std::max(0.0f, 1.0f - y), 1.0f); - d[3] = std::min(std::max(0.0f, y), 1.0f); + d[2] = nanclamp(1.0f - y, 0.0f, 1.0f); + d[3] = nanclamp(y, 0.0f, 1.0f); outSize = V_Quad; } WriteVector(d, outSize, vd); @@ -1001,7 +1021,7 @@ namespace MIPSInt { sum += (i == n - 1) ? t[i] : s[i]*t[i]; } - d = sum; + d = isnan(sum) ? fabsf(sum) : sum; ApplyPrefixD(&d,V_Single); V(vd) = d; PC += 4; From 06425ae9e7e074c76321b996b3a33e84b3e8f6db Mon Sep 17 00:00:00 2001 From: "Unknown W. Brackets" Date: Sun, 24 Feb 2013 15:07:29 -0800 Subject: [PATCH 175/347] Correct the more obscure vcmp cases. --- Core/MIPS/MIPSIntVFPU.cpp | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 deletions(-) diff --git a/Core/MIPS/MIPSIntVFPU.cpp b/Core/MIPS/MIPSIntVFPU.cpp index d2e2e281fc0b..0267af829ebd 100644 --- a/Core/MIPS/MIPSIntVFPU.cpp +++ b/Core/MIPS/MIPSIntVFPU.cpp @@ -84,9 +84,11 @@ #ifdef __APPLE__ using std::isnan; +using std::isinf; #endif #ifdef _MSC_VER #define isnan _isnan +#define isinf(x) (!_finite(x) && !_isnan(x)) #endif // Preserves NaN in first param, takes sign of equal second param. @@ -1554,16 +1556,18 @@ namespace MIPSInt case VC_EZ: c = s[i] == 0.0f || s[i] == -0.0f; break; case VC_EN: c = isnan(s[i]); break; - case VC_EI: c = 0; break; - case VC_ES: c = (s[i] != s[i]) || (s[i] == std::numeric_limits::infinity()); break; // Tekken Dark Resurrection + case VC_EI: c = isinf(s[i]); break; + case VC_ES: c = isnan(s[i]) || isinf(s[i]); break; // Tekken Dark Resurrection case VC_NZ: c = s[i] != 0; break; - case VC_NN: c = s[i] != 0; break; - case VC_NI: c = s[i] != 0; break; - case VC_NS: c = s[i] != 0; break; + case VC_NN: c = !isnan(s[i]); break; + case VC_NI: c = !isinf(s[i]); break; + case VC_NS: c = !isnan(s[i]) && !isinf(s[i]); break; + default: _dbg_assert_msg_(CPU,0,"Unsupported vcmp condition code %d", cond); PC += 4; + EatPrefixes(); return; } cc |= (c< Date: Sun, 24 Feb 2013 20:28:39 -0800 Subject: [PATCH 176/347] Fix sceKernelReferMutexStatus(). --- Core/HLE/sceKernelMutex.cpp | 33 ++++++++++++++++++--------------- 1 file changed, 18 insertions(+), 15 deletions(-) diff --git a/Core/HLE/sceKernelMutex.cpp b/Core/HLE/sceKernelMutex.cpp index a1828cb2e3f6..0b1fcd2caf84 100644 --- a/Core/HLE/sceKernelMutex.cpp +++ b/Core/HLE/sceKernelMutex.cpp @@ -54,6 +54,7 @@ struct NativeMutex SceUInt attr; int initialCount; int lockLevel; + SceUID lockThread; int numWaitThreads; }; @@ -69,13 +70,11 @@ struct Mutex : public KernelObject p.Do(nm); SceUID dv = 0; p.Do(waitingThreads, dv); - p.Do(lockThread); p.DoMarker("Mutex"); } NativeMutex nm; std::vector waitingThreads; - int lockThread; // The thread holding the lock }; // Guesswork - not exposed anyway @@ -178,7 +177,7 @@ void __KernelMutexAcquireLock(Mutex *mutex, int count, SceUID thread) mutexHeldLocks.insert(std::make_pair(thread, mutex->GetUID())); mutex->nm.lockLevel = count; - mutex->lockThread = thread; + mutex->nm.lockThread = thread; } void __KernelMutexAcquireLock(Mutex *mutex, int count) @@ -188,10 +187,10 @@ void __KernelMutexAcquireLock(Mutex *mutex, int count) void __KernelMutexEraseLock(Mutex *mutex) { - if (mutex->lockThread != -1) + if (mutex->nm.lockThread != -1) { SceUID id = mutex->GetUID(); - std::pair locked = mutexHeldLocks.equal_range(mutex->lockThread); + std::pair locked = mutexHeldLocks.equal_range(mutex->nm.lockThread); for (MutexMap::iterator iter = locked.first; iter != locked.second; ++iter) { if ((*iter).second == id) @@ -201,7 +200,7 @@ void __KernelMutexEraseLock(Mutex *mutex) } } } - mutex->lockThread = -1; + mutex->nm.lockThread = -1; } std::vector::iterator __KernelMutexFindPriority(std::vector &waiting) @@ -245,7 +244,7 @@ int sceKernelCreateMutex(const char *name, u32 attr, int initialCount, u32 optio Mutex *mutex = new Mutex(); SceUID id = kernelObjects.Create(mutex); - mutex->nm.size = sizeof(mutex); + mutex->nm.size = sizeof(mutex->nm); strncpy(mutex->nm.name, name, KERNELOBJECT_MAX_NAME_LENGTH); mutex->nm.name[KERNELOBJECT_MAX_NAME_LENGTH] = 0; mutex->nm.attr = attr; @@ -253,7 +252,7 @@ int sceKernelCreateMutex(const char *name, u32 attr, int initialCount, u32 optio if (initialCount == 0) { mutex->nm.lockLevel = 0; - mutex->lockThread = -1; + mutex->nm.lockThread = -1; } else __KernelMutexAcquireLock(mutex, initialCount); @@ -307,7 +306,7 @@ int sceKernelDeleteMutex(SceUID id) for (iter = mutex->waitingThreads.begin(), end = mutex->waitingThreads.end(); iter != end; ++iter) wokeThreads |= __KernelUnlockMutexForThread(mutex, *iter, error, SCE_KERNEL_ERROR_WAIT_DELETE); - if (mutex->lockThread != -1) + if (mutex->nm.lockThread != -1) __KernelMutexEraseLock(mutex); mutex->waitingThreads.clear(); @@ -343,7 +342,7 @@ bool __KernelLockMutex(Mutex *mutex, int count, u32 &error) return true; } - if (mutex->lockThread == __KernelGetCurThread()) + if (mutex->nm.lockThread == __KernelGetCurThread()) { // Recursive mutex, let's just increase the lock count and keep going if (mutex->nm.attr & PSP_MUTEX_ATTR_ALLOW_RECURSIVE) @@ -379,7 +378,7 @@ bool __KernelUnlockMutex(Mutex *mutex, u32 &error) } if (!wokeThreads) - mutex->lockThread = -1; + mutex->nm.lockThread = -1; return wokeThreads; } @@ -528,7 +527,7 @@ int sceKernelUnlockMutex(SceUID id, int count) return SCE_KERNEL_ERROR_ILLEGAL_COUNT; if ((mutex->nm.attr & PSP_MUTEX_ATTR_ALLOW_RECURSIVE) == 0 && count > 1) return SCE_KERNEL_ERROR_ILLEGAL_COUNT; - if (mutex->nm.lockLevel == 0 || mutex->lockThread != __KernelGetCurThread()) + if (mutex->nm.lockLevel == 0 || mutex->nm.lockThread != __KernelGetCurThread()) return PSP_MUTEX_ERROR_NOT_LOCKED; if (mutex->nm.lockLevel < count) return PSP_MUTEX_ERROR_UNLOCK_UNDERFLOW; @@ -605,9 +604,13 @@ int sceKernelReferMutexStatus(SceUID id, u32 infoAddr) if (!Memory::IsValidAddress(infoAddr)) return -1; - // Refresh and write - m->nm.numWaitThreads = m->waitingThreads.size(); - Memory::WriteStruct(infoAddr, &m->nm); + // Don't write if the size is 0. Anything else is A-OK, though, apparently. + if (Memory::Read_U32(infoAddr) != 0) + { + // Refresh and write + m->nm.numWaitThreads = m->waitingThreads.size(); + Memory::WriteStruct(infoAddr, &m->nm); + } return 0; } From 37dffb62107298c15299d014ab30c4e351a9232d Mon Sep 17 00:00:00 2001 From: "Unknown W. Brackets" Date: Sun, 24 Feb 2013 22:50:48 -0800 Subject: [PATCH 177/347] Implement sceKernelReferLwMutexStatus() and ByID(). --- Core/HLE/sceKernel.cpp | 60 ++++++++------- Core/HLE/sceKernelInterrupt.cpp | 1 + Core/HLE/sceKernelMutex.cpp | 129 +++++++++++++++++++++++++------- Core/HLE/sceKernelMutex.h | 2 + 4 files changed, 135 insertions(+), 57 deletions(-) diff --git a/Core/HLE/sceKernel.cpp b/Core/HLE/sceKernel.cpp index afbdc73473cf..0fc342f1c304 100644 --- a/Core/HLE/sceKernel.cpp +++ b/Core/HLE/sceKernel.cpp @@ -540,35 +540,37 @@ u32 sceKernelReferGlobalProfiler(u32 statusPtr) { const HLEFunction ThreadManForUser[] = { - {0x55C20A00,&WrapI_CUUU, "sceKernelCreateEventFlag"}, - {0x812346E4,&WrapU_IU, "sceKernelClearEventFlag"}, - {0xEF9E4C70,&WrapU_I, "sceKernelDeleteEventFlag"}, - {0x1fb15a32,&WrapU_IU, "sceKernelSetEventFlag"}, - {0x402FCF22,&WrapI_IUUUU, "sceKernelWaitEventFlag"}, - {0x328C546A,&WrapI_IUUUU, "sceKernelWaitEventFlagCB"}, - {0x30FD48F0,&WrapI_IUUUU, "sceKernelPollEventFlag"}, - {0xCD203292,&WrapU_IUU, "sceKernelCancelEventFlag"}, - {0xA66B0120,&WrapU_IU, "sceKernelReferEventFlagStatus"}, - - {0x8FFDF9A2,&WrapI_IIU, "sceKernelCancelSema"}, - {0xD6DA4BA1,&WrapI_CUIIU, "sceKernelCreateSema"}, - {0x28b6489c,&WrapI_I, "sceKernelDeleteSema"}, - {0x58b1f937,&WrapI_II, "sceKernelPollSema"}, - {0xBC6FEBC5,&WrapI_IU, "sceKernelReferSemaStatus"}, - {0x3F53E640,&WrapI_II, "sceKernelSignalSema"}, - {0x4E3A1105,&WrapI_IIU, "sceKernelWaitSema"}, - {0x6d212bac,&WrapI_IIU, "sceKernelWaitSemaCB"}, - - {0x60107536,&WrapI_U, "sceKernelDeleteLwMutex"}, - {0x19CFF145,&WrapI_UCUIU, "sceKernelCreateLwMutex"}, - {0xf8170fbe,&WrapI_I, "sceKernelDeleteMutex"}, - {0xB011B11F,&WrapI_IIU, "sceKernelLockMutex"}, - {0x5bf4dd27,&WrapI_IIU, "sceKernelLockMutexCB"}, - {0x6b30100f,&WrapI_II, "sceKernelUnlockMutex"}, - {0xb7d098c6,&WrapI_CUIU, "sceKernelCreateMutex"}, - {0x0DDCD2C9,&WrapI_II, "sceKernelTryLockMutex"}, - {0xA9C2CB9A,&WrapI_IU, "sceKernelReferMutexStatus"}, - // NOTE: LockLwMutex and UnlockLwMutex are in Kernel_Library, see sceKernelInterrupt.cpp. + {0x55C20A00,&WrapI_CUUU, "sceKernelCreateEventFlag"}, + {0x812346E4,&WrapU_IU, "sceKernelClearEventFlag"}, + {0xEF9E4C70,&WrapU_I, "sceKernelDeleteEventFlag"}, + {0x1fb15a32,&WrapU_IU, "sceKernelSetEventFlag"}, + {0x402FCF22,&WrapI_IUUUU, "sceKernelWaitEventFlag"}, + {0x328C546A,&WrapI_IUUUU, "sceKernelWaitEventFlagCB"}, + {0x30FD48F0,&WrapI_IUUUU, "sceKernelPollEventFlag"}, + {0xCD203292,&WrapU_IUU, "sceKernelCancelEventFlag"}, + {0xA66B0120,&WrapU_IU, "sceKernelReferEventFlagStatus"}, + + {0x8FFDF9A2,&WrapI_IIU, "sceKernelCancelSema"}, + {0xD6DA4BA1,&WrapI_CUIIU, "sceKernelCreateSema"}, + {0x28b6489c,&WrapI_I, "sceKernelDeleteSema"}, + {0x58b1f937,&WrapI_II, "sceKernelPollSema"}, + {0xBC6FEBC5,&WrapI_IU, "sceKernelReferSemaStatus"}, + {0x3F53E640,&WrapI_II, "sceKernelSignalSema"}, + {0x4E3A1105,&WrapI_IIU, "sceKernelWaitSema"}, + {0x6d212bac,&WrapI_IIU, "sceKernelWaitSemaCB"}, + + {0x60107536,&WrapI_U, "sceKernelDeleteLwMutex"}, + {0x19CFF145,&WrapI_UCUIU, "sceKernelCreateLwMutex"}, + {0x4C145944,&WrapI_IU, "sceKernelReferLwMutexStatusByID"}, + // NOTE: LockLwMutex, UnlockLwMutex, and ReferLwMutexStatus are in Kernel_Library, see sceKernelInterrupt.cpp. + + {0xf8170fbe,&WrapI_I, "sceKernelDeleteMutex"}, + {0xB011B11F,&WrapI_IIU, "sceKernelLockMutex"}, + {0x5bf4dd27,&WrapI_IIU, "sceKernelLockMutexCB"}, + {0x6b30100f,&WrapI_II, "sceKernelUnlockMutex"}, + {0xb7d098c6,&WrapI_CUIU, "sceKernelCreateMutex"}, + {0x0DDCD2C9,&WrapI_II, "sceKernelTryLockMutex"}, + {0xA9C2CB9A,&WrapI_IU, "sceKernelReferMutexStatus"}, {0xFCCFAD26,sceKernelCancelWakeupThread,"sceKernelCancelWakeupThread"}, {0xea748e31,sceKernelChangeCurrentThreadAttr,"sceKernelChangeCurrentThreadAttr"}, diff --git a/Core/HLE/sceKernelInterrupt.cpp b/Core/HLE/sceKernelInterrupt.cpp index d5a0a41848bd..299a67b40ad5 100644 --- a/Core/HLE/sceKernelInterrupt.cpp +++ b/Core/HLE/sceKernelInterrupt.cpp @@ -553,6 +553,7 @@ const HLEFunction Kernel_Library[] = {0xbea46419,WrapI_UIU, "sceKernelLockLwMutex"}, {0x1FC64E09,WrapI_UIU, "sceKernelLockLwMutexCB"}, {0x15b6446b,WrapI_UI, "sceKernelUnlockLwMutex"}, + {0xc1734599,WrapI_UU, "sceKernelReferLwMutexStatus"}, {0x293b45b8,sceKernelGetThreadId, "sceKernelGetThreadId"}, {0x1839852A,WrapU_UUU,"sce_paf_private_memcpy"}, }; diff --git a/Core/HLE/sceKernelMutex.cpp b/Core/HLE/sceKernelMutex.cpp index 0b1fcd2caf84..cd87a8f190be 100644 --- a/Core/HLE/sceKernelMutex.cpp +++ b/Core/HLE/sceKernelMutex.cpp @@ -46,7 +46,6 @@ #define PSP_LWMUTEX_ERROR_UNLOCK_UNDERFLOW 0x800201CE #define PSP_LWMUTEX_ERROR_ALREADY_LOCKED 0x800201CF -// Guesswork - not exposed anyway struct NativeMutex { SceSize size; @@ -55,6 +54,7 @@ struct NativeMutex int initialCount; int lockLevel; SceUID lockThread; + // Not kept up to date. int numWaitThreads; }; @@ -77,13 +77,21 @@ struct Mutex : public KernelObject std::vector waitingThreads; }; -// Guesswork - not exposed anyway + struct NativeLwMutex { SceSize size; char name[KERNELOBJECT_MAX_NAME_LENGTH + 1]; SceUInt attr; - SceUInt workareaPtr; + SceUID uid; + u32 workareaPtr; + int initialCount; + // Not kept up to date. + int currentCount; + // Not kept up to date. + SceUID lockThread; + // Not kept up to date. + int numWaitThreads; }; struct NativeLwMutexWorkarea @@ -543,6 +551,32 @@ int sceKernelUnlockMutex(SceUID id, int count) return 0; } +int sceKernelReferMutexStatus(SceUID id, u32 infoAddr) +{ + u32 error; + Mutex *m = kernelObjects.Get(id, error); + if (!m) + { + ERROR_LOG(HLE, "sceKernelReferMutexStatus(%i, %08x): invalid mutex id", id, infoAddr); + return error; + } + + DEBUG_LOG(HLE, "sceKernelReferMutexStatus(%08x, %08x)", id, infoAddr); + + // Should we crash the thread somehow? + if (!Memory::IsValidAddress(infoAddr)) + return -1; + + // Don't write if the size is 0. Anything else is A-OK, though, apparently. + if (Memory::Read_U32(infoAddr) != 0) + { + // Refresh and write + m->nm.numWaitThreads = m->waitingThreads.size(); + Memory::WriteStruct(infoAddr, &m->nm); + } + return 0; +} + int sceKernelCreateLwMutex(u32 workareaPtr, const char *name, u32 attr, int initialCount, u32 optionsPtr) { if (!name) @@ -563,11 +597,13 @@ int sceKernelCreateLwMutex(u32 workareaPtr, const char *name, u32 attr, int init LwMutex *mutex = new LwMutex(); SceUID id = kernelObjects.Create(mutex); - mutex->nm.size = sizeof(mutex); + mutex->nm.size = sizeof(mutex->nm); strncpy(mutex->nm.name, name, KERNELOBJECT_MAX_NAME_LENGTH); mutex->nm.name[KERNELOBJECT_MAX_NAME_LENGTH] = 0; mutex->nm.attr = attr; + mutex->nm.uid = id; mutex->nm.workareaPtr = workareaPtr; + mutex->nm.initialCount = initialCount; NativeLwMutexWorkarea workarea; workarea.init(); workarea.lockLevel = initialCount; @@ -590,30 +626,6 @@ int sceKernelCreateLwMutex(u32 workareaPtr, const char *name, u32 attr, int init return 0; } -int sceKernelReferMutexStatus(SceUID id, u32 infoAddr) -{ - u32 error; - Mutex *m = kernelObjects.Get(id, error); - if (!m) - { - ERROR_LOG(HLE, "sceKernelReferMutexStatus(%i, %08x): invalid mbx id", id, infoAddr); - return error; - } - - // Should we crash the thread somehow? - if (!Memory::IsValidAddress(infoAddr)) - return -1; - - // Don't write if the size is 0. Anything else is A-OK, though, apparently. - if (Memory::Read_U32(infoAddr) != 0) - { - // Refresh and write - m->nm.numWaitThreads = m->waitingThreads.size(); - Memory::WriteStruct(infoAddr, &m->nm); - } - return 0; -} - bool __KernelUnlockLwMutexForThread(LwMutex *mutex, NativeLwMutexWorkarea &workarea, SceUID threadID, u32 &error, int result) { SceUID waitID = __KernelGetWaitID(threadID, WAITTYPE_LWMUTEX, error); @@ -928,3 +940,64 @@ int sceKernelUnlockLwMutex(u32 workareaPtr, int count) return 0; } + +int __KernelReferLwMutexStatus(SceUID uid, u32 infoPtr) +{ + u32 error; + LwMutex *m = kernelObjects.Get(uid, error); + if (!m) + return error; + + // Should we crash the thread somehow? + if (!Memory::IsValidAddress(infoPtr)) + return -1; + + if (Memory::Read_U32(infoPtr) != 0) + { + NativeLwMutexWorkarea workarea; + Memory::ReadStruct(m->nm.workareaPtr, &workarea); + + // Refresh and write + m->nm.currentCount = workarea.lockLevel; + m->nm.lockThread = workarea.lockThread == 0 ? -1 : workarea.lockThread; + m->nm.numWaitThreads = m->waitingThreads.size(); + Memory::WriteStruct(infoPtr, &m->nm); + } + return 0; +} + +int sceKernelReferLwMutexStatusByID(SceUID uid, u32 infoPtr) +{ + int error = __KernelReferLwMutexStatus(uid, infoPtr); + if (error >= 0) + { + DEBUG_LOG(HLE, "sceKernelReferLwMutexStatusByID(%08x, %08x)", uid, infoPtr); + return error; + } + else + { + ERROR_LOG(HLE, "%08x=sceKernelReferLwMutexStatusByID(%08x, %08x)", error, uid, infoPtr); + return error; + } +} + +int sceKernelReferLwMutexStatus(u32 workareaPtr, u32 infoPtr) +{ + if (!Memory::IsValidAddress(workareaPtr)) + return -1; + + NativeLwMutexWorkarea workarea; + Memory::ReadStruct(workareaPtr, &workarea); + + int error = __KernelReferLwMutexStatus(workarea.uid, infoPtr); + if (error >= 0) + { + DEBUG_LOG(HLE, "sceKernelReferLwMutexStatus(%08x, %08x)", workareaPtr, infoPtr); + return error; + } + else + { + ERROR_LOG(HLE, "%08x=sceKernelReferLwMutexStatus(%08x, %08x)", error, workareaPtr, infoPtr); + return error; + } +} \ No newline at end of file diff --git a/Core/HLE/sceKernelMutex.h b/Core/HLE/sceKernelMutex.h index 259f9f886c9e..9e7bf5797347 100644 --- a/Core/HLE/sceKernelMutex.h +++ b/Core/HLE/sceKernelMutex.h @@ -32,6 +32,8 @@ int sceKernelTryLockLwMutex_600(u32 workareaPtr, int count); int sceKernelLockLwMutex(u32 workareaPtr, int count, u32 timeoutPtr); int sceKernelLockLwMutexCB(u32 workareaPtr, int count, u32 timeoutPtr); int sceKernelUnlockLwMutex(u32 workareaPtr, int count); +int sceKernelReferLwMutexStatusByID(SceUID uid, u32 infoPtr); +int sceKernelReferLwMutexStatus(u32 workareaPtr, u32 infoPtr); void __KernelMutexTimeout(u64 userdata, int cyclesLate); void __KernelLwMutexTimeout(u64 userdata, int cyclesLate); From 6145efe3863690e8d5a63866813db9f0c9857e3a Mon Sep 17 00:00:00 2001 From: "Unknown W. Brackets" Date: Sun, 24 Feb 2013 22:51:55 -0800 Subject: [PATCH 178/347] Update tests. --- pspautotests | 2 +- test.py | 28 +++++++++++++++------------- 2 files changed, 16 insertions(+), 14 deletions(-) diff --git a/pspautotests b/pspautotests index 90be520fceff..a013aed6f1ca 160000 --- a/pspautotests +++ b/pspautotests @@ -1 +1 @@ -Subproject commit 90be520fceff14f58fde21cf9650103865560549 +Subproject commit a013aed6f1ca37f9a665a0010e8971090a73116c diff --git a/test.py b/test.py index d37baac4e90c..f2f4abbe2b4d 100755 --- a/test.py +++ b/test.py @@ -78,13 +78,14 @@ def target(): "threads/events/set/set", "threads/events/wait/wait", "threads/k0/k0", - "threads/lwmutex/create/create", - "threads/lwmutex/delete/delete", - "threads/lwmutex/lock/lock", - "threads/lwmutex/priority/priority", - "threads/lwmutex/try/try", - "threads/lwmutex/try600/try600", - "threads/lwmutex/unlock/unlock", + "threads/lwmutex/create", + "threads/lwmutex/delete", + "threads/lwmutex/lock", + "threads/lwmutex/priority", + "threads/lwmutex/refer", + "threads/lwmutex/try", + "threads/lwmutex/try600", + "threads/lwmutex/unlock", "threads/mbx/mbx", "threads/mbx/cancel/cancel", "threads/mbx/create/create", @@ -94,13 +95,14 @@ def target(): "threads/mbx/receive/receive", "threads/mbx/refer/refer", "threads/mbx/send/send", + "threads/mutex/create", + "threads/mutex/delete", + "threads/mutex/lock", "threads/mutex/mutex", - "threads/mutex/create/create", - "threads/mutex/delete/delete", - "threads/mutex/lock/lock", - "threads/mutex/priority/priority", - "threads/mutex/try/try", - "threads/mutex/unlock/unlock", + "threads/mutex/priority", + "threads/mutex/refer", + "threads/mutex/try", + "threads/mutex/unlock", "threads/semaphores/semaphores", "threads/semaphores/cancel/cancel", "threads/semaphores/create/create", From 4e8359bae2963a24426e283b72a13bfa3d832b68 Mon Sep 17 00:00:00 2001 From: "Unknown W. Brackets" Date: Sun, 24 Feb 2013 22:58:31 -0800 Subject: [PATCH 179/347] Fix Comp_ShiftType not using ROR. Untested but looks right? Reported by @xsacha. --- Core/MIPS/ARM/ArmCompALU.cpp | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/Core/MIPS/ARM/ArmCompALU.cpp b/Core/MIPS/ARM/ArmCompALU.cpp index 82ff108c240d..cf2752a56fb6 100644 --- a/Core/MIPS/ARM/ArmCompALU.cpp +++ b/Core/MIPS/ARM/ArmCompALU.cpp @@ -264,15 +264,17 @@ namespace MIPSComp */ void Jit::Comp_ShiftType(u32 op) { + int rs = _RS; + int fd = _FD; // WARNIGN : ROTR switch (op & 0x3f) { case 0: CompShiftImm(op, ST_LSL); break; - case 2: CompShiftImm(op, ST_LSR); break; // srl + case 2: CompShiftImm(op, rs == 1 ? ST_ROR : ST_LSR); break; // srl case 3: CompShiftImm(op, ST_ASR); break; // sra // case 4: CompShiftVar(op, &XEmitter::SHL); break; // R(rd) = R(rt) << R(rs); break; //sllv - // case 6: CompShiftVar(op, &XEmitter::SHR); break; // R(rd) = R(rt) >> R(rs); break; //srlv + // case 6: CompShiftVar(op, fd == 1 ? &XEmitter::ROR : &XEmitter::SHR); break; // R(rd) = R(rt) >> R(rs); break; //srlv // case 7: CompShiftVar(op, &XEmitter::SAR); break; // R(rd) = ((s32)R(rt)) >> R(rs); break; //srav default: From fd8bcf98df46931ef2bcc66a1645a84061f94abb Mon Sep 17 00:00:00 2001 From: raven02 Date: Mon, 25 Feb 2013 22:44:51 +0800 Subject: [PATCH 180/347] Remove DisableG3Dlog --- Core/Config.cpp | 2 -- Core/Config.h | 1 - Windows/EmuThread.cpp | 1 - Windows/WndMainWindow.cpp | 9 --------- Windows/ppsspp.rc | Bin 56972 -> 16047 bytes 5 files changed, 13 deletions(-) diff --git a/Core/Config.cpp b/Core/Config.cpp index 1352c3fb0c74..e01790a52f9d 100644 --- a/Core/Config.cpp +++ b/Core/Config.cpp @@ -75,7 +75,6 @@ void CConfig::Load(const char *iniFileName) #else graphics->Get("AnisotropyLevel", &iAnisotropyLevel, 8); #endif - graphics->Get("DisableG3DLog", &bDisableG3DLog, false); graphics->Get("VertexCache", &bVertexCache, true); graphics->Get("FullScreen", &bFullScreen, false); graphics->Get("StretchToDisplay", &bStretchToDisplay, false); @@ -136,7 +135,6 @@ void CConfig::Save() graphics->Set("VBO", bUseVBO); graphics->Set("FrameSkip", iFrameSkip); graphics->Set("AnisotropyLevel", iAnisotropyLevel); - graphics->Set("DisableG3DLog", bDisableG3DLog); graphics->Set("VertexCache", bVertexCache); graphics->Set("FullScreen", bFullScreen); graphics->Set("StretchToDisplay", bStretchToDisplay); diff --git a/Core/Config.h b/Core/Config.h index 842a93b10cbc..e3d4139a19fb 100644 --- a/Core/Config.h +++ b/Core/Config.h @@ -63,7 +63,6 @@ struct CConfig int iWindowZoom; // for Windows bool SSAntiAliasing; //for Windows, too - bool bDisableG3DLog; bool bVertexCache; bool bFullScreen; int iAnisotropyLevel; diff --git a/Windows/EmuThread.cpp b/Windows/EmuThread.cpp index ac7e4fc1532f..ed65398786e3 100644 --- a/Windows/EmuThread.cpp +++ b/Windows/EmuThread.cpp @@ -79,7 +79,6 @@ DWORD TheThread(LPVOID x) coreParameter.pixelWidth = 480 * g_Config.iWindowZoom; coreParameter.pixelHeight = 272 * g_Config.iWindowZoom; coreParameter.startPaused = !g_Config.bAutoRun; - coreParameter.disableG3Dlog = g_Config.bDisableG3DLog; coreParameter.useMediaEngine = false; std::string error_string; diff --git a/Windows/WndMainWindow.cpp b/Windows/WndMainWindow.cpp index 2a233ff0349a..57208e38729d 100644 --- a/Windows/WndMainWindow.cpp +++ b/Windows/WndMainWindow.cpp @@ -533,14 +533,6 @@ namespace MainWindow UpdateMenus(); ResizeDisplay(true); break; - case ID_OPTIONS_DISABLEG3DLOG: - g_Config.bDisableG3DLog = !g_Config.bDisableG3DLog; - if (!g_Config.bDisableG3DLog ) - LogManager::GetInstance()->SetEnable(LogTypes::G3D, true); - else - LogManager::GetInstance()->SetEnable(LogTypes::G3D, false); - UpdateMenus(); - break; case ID_OPTIONS_CONTROLS: DialogManager::EnableAll(FALSE); DialogBox(hInst, (LPCTSTR)IDD_CONTROLS, hWnd, (DLGPROC)Controls); @@ -687,7 +679,6 @@ namespace MainWindow CHECKITEM(ID_OPTIONS_STRETCHDISPLAY, g_Config.bStretchToDisplay); CHECKITEM(ID_EMULATION_RUNONLOAD, g_Config.bAutoRun); CHECKITEM(ID_OPTIONS_USEVBO, g_Config.bUseVBO); - CHECKITEM(ID_OPTIONS_DISABLEG3DLOG, g_Config.bDisableG3DLog); CHECKITEM(ID_OPTIONS_VERTEXCACHE, g_Config.bVertexCache); CHECKITEM(ID_OPTIONS_SHOWFPS, g_Config.bShowFPSCounter); CHECKITEM(ID_OPTIONS_FRAMESKIP, g_Config.iFrameSkip != 0); diff --git a/Windows/ppsspp.rc b/Windows/ppsspp.rc index 8d0a8e1004b522d9c2d97aa8a0af3f5eafb8b817..bcde41f217e1e9974a7c2c59cddc1f4e51ea83de 100644 GIT binary patch literal 16047 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⋘DP-7f<+1&v+t)wvG(UCE#Xm+T z)pe-+Sj7s6u6i?nlNFl4xi>8SY{1si?4ngMBR{TPH7@!yYYW!$bNj=Z^s~M{s`NXS;~<6em^a9hor7NTr02UW+gs#{X!% zAC8ETbB(pVvKH=x`enQ^pZ6=by6xU*4`|!?$v9Pka#eWS+FpVEx8d9s!$<~a z%)6UAicZp#>s+P2Ml|BMI~3h3f_4&4u6I>{gZ|Zyns>m_4)_xE2w%^eq7DF_q^DO2 z$3a&_!Fxid;bbkfR9PYCJU#qiAw4=tk9~w5I`u|pWr?YGz`4Dd^svFa{eYfAe?NP) zrKhNVG#zjAY(ItRyt%(e#^LlEGNmnUARV1vEA$3<2+#Ul zq9fS6=fJnTAG5(id!PhP>z!~49fA@#?RUZ{Gzm)JblwMt7Wbkk-b_9R?are@CLovP zKn_}yl|b-@N`9d;N_PEQJl?L`LoTv2WyjpDT+r$orgFpZCK|PfX}?roJ<<6bT9@1~ekq1F zI*l)l&Lib3+2ZXDq}#lMfVZE*CDoi%d)3l+FY@me`eKDcTO6Yztf8+C9kQJ)5#%XPau8egh0|uD0u4xZ;vF5sy=bxCHGoN#hWPQ zNKB9$fIE^QLEH)N+<(oEC3AKiPi>TN3-1nG->0341H)c4f|7biC!&M>$S4vL(BNOu#kE zOX#g@x~4JX5#L!sFTvH+bWm-)3TRt~49uTlaLU(vaP_s3ot>Mj_3^G$w!(x=wk&E9 mWVGSR zy?-vBR^gkoQb#8{E^mxyZF&Cz*XpF)ZOh#=ay>3jT2hzZ(Q?P-|C7?q@zY z3roz&)9wZ(uM3?oO7BO;rYDW8F4t(zXt^$`s+Y;K(InR-E20y zAa6jGG5K#!zT(?qKI&-1NCU5<(&8cc?w2pzzB@bOTC=*K)=4Q@ z)QZ(OCQv*qJ!b5V3SQ1Q>hBglp*PffAUnF*2H0gJ&d6unNeMU*9)er+=`nc@zE8-L zQ7Hr7C!-R`nPZL$ZFzEG<5^ouf(@nb!}4E8%Fs%PH>iWe0A_jzw_2aM4rRmAmunH$ zj!P-9#Ao+LzYe-P2W!^d6`EWVIRm{7gYYI}fEE;2in#-c7U<7}Ge1799>H;D~*jtsZo^+?UmFbvS!M zWLzGPr=-W=aldf(Lvk&~V>uVJr7yPyd*JbeaM^gWU;2a=k4i7J#dNQ#jwkqfOfbb* z=t_;sbNgNGM;-scCA;18W+SQYXqb^v7;+G!K{*x~qVQRt!8-8OZDUe;oN9ynU>Esm zZRp60+d%S6$(WvYU-Vb}v9V^bBgJQ3o#0YyKIHi2u#<|TQV)^}N-#E6;v;R)nx@@U z(wvn$c{!y|khRpK*a~q1yg;DRErwO4(5P6YYi{(e2u4HPAeT*ZpOxR^BJp-h36=ND z0xLG%G5M}I%Xv|(Q{L~Di?Q|$VO6>!?e=YGiKE$J`R{=IACK1Kt`A6bu-}V$lc%ku zB=WjQIR|}#t-O-Ff3z9HE&2Ev@o`yJ+uBRo>gjNU4dsT)-m^s z|G*}8IHL}$Y1UmCKmBcS>?-iwlE1V^haJkVrl1X z%uwFL2PcIOu!zz4Tw~kN%SiRYu%@x1_^W-g`pSKRu$7kBYaI};V z{ejoiiZIoZdXat~mnRFZUT^}O4{lPc*YD9D;md-fdTBfo%Ep}Q`>ZwPesl$e(F<*MAZm=$H{!BuBPQ|^{vg!hOnJu1IvH~POQdVO75 zC+c<0)quuoNxk|XF`0F#i|1G6-m3h<)4V9Zz$URSEOp`o*QG8n4@IuaTQ}q{kvF1f zz_2Q%fZE=@>Ppg6?ygD+-kg{6EqR;wXaTsW4;U%8Bv;y@&Zp$rx?G8x`5KnxDW&j< z6-)GfPbm$}Rxm0eagh~uMg(K7CGF?2YJCP@^8)jde4vL(fg-+A|HdGy%U7dLuT47) z!4cO4F1QHnt!>cL$EB}$2O;D5@TP9YL#hiQa*FSmNI`4=g9784e3iEt z-IpEA@Rml`9w>$Ckc>r@s!gDJS~%yb(8(bBs9+2VJ}CF$I6UIxa_8zMk0F6l*hMNC z?Wg1yW4a~s@RGa<{plV3EPA^P`$wE_3a2*dCvaSnUc_UY7&l{&`)hq;KH4gFXh>r{o8WSY4g>>#06@-Fl`F-whEFGFgG4?x&gO7Je>ZNXUZ@+k7 zD8=h}%jyN0x1#);@{^TPoMe@XrXRA z;(X82{KK4rYS?1E14iH`cnFJ$5x!qO`7u@{f~JuaotJ@2k@LHqMmyrLZZYibilC*n z6ww2G_^MvC`p!t!hvZXNPi?&qT~&_(X}&D6tSio9!9K;SW7Mt7?`E@5Td#GH2WY_< zHt*%0b#ma0i;(ENooXOB>xi>d;xSQG3+1`O^cr#+KbRLobY7S3OOh;Ln97#B2GKks+)0q$E-E8 zoaJ-7hOv7yuFCaPDDgE$Ok_`EHy1=6jtf5w5;0bNfvy;F65b-lF+U-bc4lUTCVb~)_1L+Il&N4D~|=EbM8~l_6wmR8W%@1?JXkgo$O<|R$`m3f7yIYHs)V@*RY?D z$ZrP)(mgGv0aju><7rT*X#mYq6eucPhrams>DqOkGtWQqES|yLj~9?LaU8Ed#ljdx zb7~c1pQuJ`Em!FUcsdkOp?@!Wt(C1F`DscN_ZvFIJ+OXn6{YdiLO$(}A=AIxL1TQR zG=BPVDt=WwE`1ODuMdhIA@;8MlZr!hQZ>y2e)ztgbnHnN9bMgoJM059$;3`qrT=8m zGOyDTyOtRbqTI|VAd5q9!DbV%fSF++`;?gx%Ia(b7$!$p=UpyJyqEb0a*6#sNXz|C z%Z5*#eIZUkE->>G3K@}hYPY!&g;wV$$SGzHo~J8v)vRJ5&d=l7Xh~hm<^}Wb47naL z2SCsEZ1hAeQEM9;g>04lyZQg?w+$Y_!M>7~&2q6>`N3NT&&*ThTQ&;r%u!*`*%e7% zo|79}{Axe;%gfa$JJOICq)O5{p4rZeW58p~s9M|&{MDWJuN%K;;?olw*J!Us$+yq1 zhq4;`?blNIe6?oJj7#L76%@!xBqi9^8CMdwYdZXOipnBVTvASKrGeueE)@{hl1s zD~<(tF7v;B_v~Zl9#=({*(kFShb7mMY%n}p*0=1Fac{pVlaBa=YiP)~oe&9#bXDun zY_RmZ_S9No%?C67x)Neqq%n~0aUUeAl`p%}lR1Gz*VN33^qLl_rm?d8yXm$^r4O2m zRHt3)*0$-z8EIGLJ~?=-QBn&TT$V$DEG9{SbI@rhtHodQm^Jyy!@ulL^;24vPrMAvNo1 z!b9fIr}?oLFJ1zKxlro6GWS>wL(S#dnDENFXdI|Zro67!B=1X_~B2jh`w^F{e0rO7)ZCWEfAHGLnFGAX*G`eAd&V3v$7R!CRt z1G0g!Lxg2iu0+I%#Hrr%uuN8jg^_c-a@%p{EbFZ_cUEn|7#mYL2zv2=Cbzt0%l-_p zP$rLt1$OofQ9Fhl!0_!RzLa9rN7z#IH2#dQ+B+iqw&srYeffAo2%o**YtJ+vZ^P0$ zyuq#^_zx2@`g9M2u4oZ-37(=_NMx*r{Y&?Nm4vMA*Y&gGLa{nl89Aeu<%2%eSs|nw z^K9H9GPtw>%|j6^Cgbz?MBY!x2fd2+;x8-q_@8)Nbxy{gfX-N43vPBx=ct$gWd26i z#f11VdKJNjhozbx4Xd*(GlIEewZ`@dkuj{Oy5+9Wa8~|jt;3q&Q8RXxeupYy?1a<( zW0EVxUWmz~trXHADN%bh% z6^acz9iu$IU$hLG6Fqz^ha*oz{gsA`%p>#+8gjpA8mp^1rp`Dm!LCTer;G8Dho=Zr z>V;@+)uA}+Mi~?WBjhK->BOAMVnk`YSY`^^mkd|6B&)+S;W&9kAb>u8cZgmrJ)t;h%9(8I^d@oqq`5SG;M{_tsS)$wHZrOwx}4(@w}bmitWz}qo&5rCO06Gu8F06x zf45{diaY_I4Fz77pD$!gLp{k}c5mclv3 zkg{0zNO99o>{t|95>}60m5+7&m`^_^JgfUrVcDBzVpqcuQ&vMSM1#;5kDh%k!c4_} z@Ea5+?eaarqn{Cv&aa26)(5rMG!|CQTOJDimBy;Y!$Jr=msuS#r>K96{Dh9-oAvp` z<91l&D{J17e2n;V3~P@xQ+K$3t_ZA_3{WS?2OXzEHeLwNPpe0LvurS2_NJC z+>Y#W>g)#%JgdI_8EM0!JB<74`o9`%A#F@gHGwU}YBlT)GQw=;N8=~p7cMC0fOOAv z-jA7lFpQR~)&sTWiRQF~UKVL4#-lqAn^%^GD@A{BGAm;pnm2(aj>OG7tXveYm)tox zw0Nd31r0D9mk$=e!yDTFl+zyYXVn=#urwj<6BAUg47i9c5gAD1#>QNlUPO_wOW0ux zxOBbaiHcMkgzvoP7SEO82P1`ue6rIzs4l+v5Ag=+Eg zYA}UbQ}qy*Ai76)6s$Hf2Ep;E4J(#xek^G(O?!J_n9*wr$12x#KhA2f!>>@2nNUV> zFC6`JX$l4?%X}#K%6Tz zo|x_mAua1CvfTC{AH0{T5u&y$-ho3V@c>c_(&3Ao?4h z0-&oq$hAV>f(Q00qxbdp|F6FyeCKn6=L+H>WIbT-jS8l~zK#Lo9?Fu9oG#gNm`!V@ z^r;$;%8C%xYko}8#{PzF6xDa2aeX%=p381TKxGnSNbaTK4&{NB26u1VHJ!!fL8qQU*axRM|n0G#qQqJJnnWNF5vn$-PARpqW z_`0^or#pKZC4#(lVHR7Jrex$9sT+`>g|_hGwnn{;|F7Yu{6?o4mDL z4R*b%+xn2$Ddl=6pD`HDPLn&}@z&e-I9rpF{WxJLmp_@uhhn22JY*1TB|ODB1i)4f z4|xPz2~Tk*K{a^DCfGW7Y~-@TZJt)e@Pt`U>5Nlq>*b|>oMVu%J3)0w$}>5eLqaZa z3YIj_q;i7w?P_?4y-Bm1UoY0bW>wlg?*=_rzMM2PCx2D%=^m`Q8i<(^I3;|7FVB76 zB%@YW;>Kmz4NmukWseEl)r(a{oD!mQl2zWY+9$;N<*Y{L-^q4ihj=~7?yx)ok~ofn zeQGOhVmN(GR)f8dZ^Sx@{^dtD+tZwIJj3`6_RH704{nt8SmHbtaz^yI)#aaSlqp>* z?P;+NV_GaZFv6aUMBs=8F9~IIwf0H*k1Xss;*hS*Ms{2)JNu5vPH|l4-xW7Y!rY?GdkqPW$ZOP7OUQ9apQVt7!`e%=#7Ug160>j1l^DM2 z<{`0zp=QxJAz*Mp{Qo-b8TN^ShG)gv`c-64+|MSp$K%?1!`Oqv_^XgX*?+y&@(tJ#t)wLycUDF_X!c?Q5Q94mr(YgeNg1Rp21>gG4!KaGYECv z0xLa;`{=1F2IDc256gm4J$psZLSg3K=K0p-x2}C8!;Bb9To3C^o1D>7rzg{nhdFml zDQ8@0Fj`;2@wG>Kdt1JB+L@7d*d1JRRr351*516*!}VYa%ye znWNl9UXPxt6OMhfmr7MesqVyYdQ#!_(E4ADI=(y8?f@!-&aRp_Z#pSl4{9a2^3{AL z^v7|D^pTlJypbnqU4@;8-9m0D(FB`A#%JZsUZc8Qk+#G=?c{B{Z}kvk^J{3RQTIY3 zqdoi#iTy%Em=&T#Q_&+TFIhVdyfMADs$ZN`-4+W9>mmFw53JfNKZdPmtS@E-s^Tep zH~tNVILCuNvC<_!OJVipG4Ab^e0{T`YguEG!b|bY2Dwnp<`Q@IxPUiyHiSUe${uWg zdU03w+$XxzJ7LzAC?#jegFQQ^J#}(B<&YlC7ip{}KW7`y>QY~oIa_u}KD5#P>w|&@ zWwqTQeGa(oOGj+K_|*2_os%NhPJf}Tk_&$qZP1e4Fwxg_Ph3~cp4MY{s(J!w(b?Op zx4-rXmK*Z-jdDihi5t6@?#(HYCvJ=`ePsS!OL!D|He}jw&^63$W%A z&c}bdaH!KvgKhn8$Guu?t9Cp7x9(?FJYQ-yzn)&SRl6MjZ21o_viI;SPfm62Ywulr z%fc@&A6Q2S~<7Du8CymZKn{gyNHUI6Uw~qXHG5ZST-t+2O_g@#* zy1Ujrw7PfXn|lbyCuxTJ6r+z~j~Y9OT|j*f3j2!oAK9F!pb=3{gwazs@XV{8Z_Z4_ zd4YqN!v*<<@P@0^{Mmu|^VIwktwAFUXQG;jTd*6zDX|F2w4#jmpB+6sw7Ls3xs^Uw zi(Pzdz9fcE%dr}#+F7Hz4_h<2p*Xg`gPtp@dqefp2)bK3`(QI0sC(6$^#Zk6BWk&& zcHge>5tfmkE7J9RM1p3eHrpYcUwWn+ZQx(dNel=Jk$ExbjK`@Qp-=6ENj%q4H|xck zhOh*29M+cTPJtITo-qT9m!b55HDgO?zm^-hP#1?H8Z_&K+7i)zg~p1w$)`+?);d zr?FSwieF1OEb@dXYMxSHP@mAsQO5(t{i-^S;x(|~2QE_%)6+=9QxThtpwKrd#{)a8 zjz)dA)oI)}_>7j!l;uy|snQ1f8ie?@Hn>mkv5Kt?9cu?79}63`$_c4fFEK8p(?K`3 zv}Vph;B)|_;dY&nYEm<{sqL=6GOMd6D=@dK`A=TbTGr^4j4R9f;|*ramPOXFyUsEB zuE=x0s;XBWhWa-?*FfnC=h?~0M_t|>JI2TIq5KTou^51 zh3E`d$jM~lzv9{K0=1OW_BWD<*55oGIo_!Q z>eP)GBgc{9mbanVP1KZ*8ka}r{(kXKXRtNeIa|ZeQQM55o-6ZuJQcY&rmz*KA{WOK z>Ys*;2WR`mmiwrj2ni2p917}(UZ2i)<7?pQ*^C5!r9RoYK5BK}b4oPXip)am%4%-| z?2IwBeCHR>_wz=fo}K`uqY0=@2Q{^#)eFGJIJBXm(Ng{V%&^sRtsPoxy0@HZOXb~^ zou*Xs)TwW8;OCf!gJq`wp?gB;O+T0E^>C+fR&Jop&3j_jhW}KrZG|>hjod_6ms4Z) z@*m$#No_q-4?V0q;4(jpO~r1->|@4mL1=fiRV@BM42c-XwA@EeGY;FrkvC_B zu|*Fi;2}5%na{Z1FQ1S%p=A}n%~lqHd3f`PlMsw&JtfZKCEMkv30&>`oF;=3Zbx(K9+glWJIbDNtp&G?wNd6}OeP=+U~&YUJ~Aum{7r4Ing|B3+X`H6NTc6CH^K0~xg;(ZX7+ zeDR6hZ=Ms6Y%u;Xd>O^!v5Jh}YKo;#5bsB?BLy_p_(7f{()FV|)n=FyO&9YJ)>Y97 zj3I9sj^JQ+w`T><*5fCJ#OPCuAEa??G1xo0Drr_m%NcyM$( zPj8N$;{M{<$M&Pqs2>Lr2Z*uMzZYhsY)20?9vWh_N)NE3W1r6V!2c@F1+Sugfr;b!!_tj#=v7 zx8pnY+cv!Iliv1g+4P{r{^NF`Yu#RhXLb?Jw``oXGe?C%XII@9f4j~u{`BIn+C)_* zTwH=S4e$LeXtV<7C5JnWcjvP?>LO#H-tK_5pMhoR_SuNKcgvT#MugzCTJg7r+H_n7m$g!JyyQ5BoO z^Pkh_ABo{9K3~IN;aUujouz0ICC%Up-{p6Tx*=|$@?;GT%fr))6~kRs?1Y#B8e)1? z`8^L!FHY(~!<+~48o&Ek)m~(G|MxV|pKm;33{u8U{nLxdi>Li@*M10feaZ7LcP2kW zT^*@Q$4>Q=iV>;=j23sGC)s*@WTsb!zcTUtE3G(_^b7C^250mkTLuW4?E+ zH|J+$#2?Il@9DK}$PLwWK^YHVZJFHI?tc8_v)}#Vm9tR7GW-l%+t6|f0fWZ;(#tvuseczb-3o+_FAM0(HLp3PKsd*xae3mfAq|b@TPYWo@4Ptk?snF`|FK^@|MKF$I}7zp#XjkH3aMkGk`CXjFOOI?)4Ke&N2#x_ zAEQ0X?@yPHzlZQ`$5?x3XMW+z>1o%4*$uv!5dXW1=aB9}YIm|~y%@@}xxKUdSAVed zzGwfzS-KBzLX<{t5r)N4_@2n(sYbdKJmWG@tMRxi0#lH!Zciio=prydX6wqRMl$zsMzFe zVxV~PtKYnC;|!VH9~+*Z(s;4CCUk7wvx%E~5cC6i@vUbjuCONlZyx#F*Y1CuRls2P zT;E=$`_cS7U}VGByWhKT|6_*L>h^aUmRL>@FBtSZU|?ib`+rSedmIcE%P~)H`;~^# zGOxYGWw9dNf0!7s?yhe2*tOSUR4YYK?yU=**|B+jYVc{TRpr_9PwiUQGkeWu+8SEg zPEhyqJYYQm_#K@W?|gbKwz&H5=L?;RXii@LxP01TDV(q94{(+gaySJ^xwTOaNuBe6 zhh-iw4N3n!e5>K4&UwJYGMAc$q&${fj+1+F9x#z-Ec|c1@XD8vyB2|X>)l=Ja^^|< zz|&uQ#3ZuLS@=j*x(9=t0{ok~#q}RAo>=_97yk0}OP3yN9}%JoXK@ z4h!2&XY@=W*7rZad7ZO=!G^7)wbAWQ&_#AKrtj?;!0b#E&Z7e3F~Loh$c|FX_rT|y zg_7QTg#H)Ld3&dx0nBQ>eEguEg{FS8dC2ieZ8mdzFU|nI@4}(Z^^NsA&3xp1Pwfhi-lba0r`@EYnKmwq1SL z!hVDlw%+zyzssm!5dr1@PP~`s*_q=cESRHKNI>yIsl1A&17V+waQ%ugw|2 z>{Ii1i{HEsR)}p4IyT6+*@`oOfAsk~Uw%htuk1@{SscZq!uZ9mDNZEs`?WX&7;jRo zy&pXD*DfAa-JeYLBc65AS%|u40HZhKcyoEAryp*^oeEU;-`g{Q-@bb3%fC5&-SLX; zv|;d;T~j!2at82AU;O0keX|Ay@};`&Ou+zUZM|-O6?-Tvy|rdNjrHhOp8-5LuB|t= z)^8`C0X+B!fqvU@2JqlEZ$HTHrA8jy=FRt{xy}2^^id~0u)V8~TODyadV681eg-h( zneWcb+yp9v&aQ9n@~)P)&a}j{{%QXNE=lcP|GTrxdzD?rclHQ?`*p40sypk0(>IT3deU#bQbFd?95nOTfpfbE7Dt5Ca{{ocG!de{W;Gqi5Tnpfi)@5$^%v>=xP9K e1ss|b*_n7zDuV@L5YSjZK+EYboS0CJ?*9+2o)gso From a569fd4a18f0deb60699f97a93a5029fdd492a25 Mon Sep 17 00:00:00 2001 From: raven02 Date: Mon, 25 Feb 2013 23:31:32 +0800 Subject: [PATCH 181/347] Add INFO_LOG for PGD DRM decryption --- Core/HLE/sceIo.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/Core/HLE/sceIo.cpp b/Core/HLE/sceIo.cpp index d1787ea56f08..b6899606e0aa 100644 --- a/Core/HLE/sceIo.cpp +++ b/Core/HLE/sceIo.cpp @@ -1184,6 +1184,7 @@ u32 sceIoIoctl(u32 id, u32 cmd, u32 indataPtr, u32 inlen, u32 outdataPtr, u32 ou if (Memory::IsValidAddress(indataPtr) && inlen == 16) { u8 keybuf[16]; u8 pgd_header[0x90]; + INFO_LOG(HLE, "Decrypting PGD DRM files"); memcpy(keybuf, Memory::GetPointer(indataPtr), 16); pspFileSystem.ReadFile(f->handle, pgd_header, 0x90); f->pgdInfo = pgd_open(pgd_header, 2, keybuf); From b36782a0646d8b39ac87da8ea6bcd94043cf532c Mon Sep 17 00:00:00 2001 From: raven02 Date: Tue, 26 Feb 2013 00:41:37 +0800 Subject: [PATCH 182/347] Fix shadow abormal in FF Type-0 --- GPU/GLES/StateMapping.cpp | 16 +++++++++------- 1 file changed, 9 insertions(+), 7 deletions(-) diff --git a/GPU/GLES/StateMapping.cpp b/GPU/GLES/StateMapping.cpp index a0c7a5136012..2374c6d56399 100644 --- a/GPU/GLES/StateMapping.cpp +++ b/GPU/GLES/StateMapping.cpp @@ -84,6 +84,12 @@ void TransformDrawEngine::ApplyDrawState(int prim) { gstate_c.textureChanged = false; } + // Set cull + bool wantCull = !gstate.isModeClear() && !gstate.isModeThrough() && prim != GE_PRIM_RECTANGLES && gstate.isCullEnabled(); + glstate.cullFace.set(wantCull); + if (wantCull) + glstate.cullFaceMode.set(cullingMode[gstate.getCullMode()]); + // TODO: The top bit of the alpha channel should be written to the stencil bit somehow. This appears to require very expensive multipass rendering :( Alternatively, one could do a // single fullscreen pass that converts alpha to stencil (or 2 passes, to set both the 0 and 1 values) very easily. @@ -159,10 +165,10 @@ void TransformDrawEngine::ApplyDrawState(int prim) { } } - // Dither + // Set Dither glstate.dither.set(gstate.ditherEnable & 1); - // Set cull + // Set ColorMask/Stencil/Depth if (gstate.isModeClear()) { bool colorMask = (gstate.clearmode >> 8) & 1; bool alphaMask = (gstate.clearmode >> 9) & 1; @@ -177,12 +183,8 @@ void TransformDrawEngine::ApplyDrawState(int prim) { glstate.depthTest.enable(); glstate.depthFunc.set(GL_ALWAYS); glstate.depthWrite.set(depthMask ? GL_TRUE : GL_FALSE); - } else { - u8 cullMode = gstate.getCullMode(); - bool wantCull = !gstate.isModeThrough() && prim != GE_PRIM_RECTANGLES && gstate.isCullEnabled(); - glstate.cullFace.set(wantCull); - glstate.cullFaceMode.set(cullingMode[cullMode]); + } else { if (gstate.isDepthTestEnabled()) { glstate.depthTest.enable(); glstate.depthFunc.set(ztests[gstate.getDepthTestFunc()]); From d3a66d0a9090fed81d21299eac3dac4a734d1b30 Mon Sep 17 00:00:00 2001 From: "Unknown W. Brackets" Date: Mon, 25 Feb 2013 10:48:32 -0800 Subject: [PATCH 183/347] Android buildfix. --- Core/MIPS/MIPSIntVFPU.cpp | 3 +++ 1 file changed, 3 insertions(+) diff --git a/Core/MIPS/MIPSIntVFPU.cpp b/Core/MIPS/MIPSIntVFPU.cpp index 0267af829ebd..3e80912b1c4d 100644 --- a/Core/MIPS/MIPSIntVFPU.cpp +++ b/Core/MIPS/MIPSIntVFPU.cpp @@ -90,6 +90,9 @@ using std::isinf; #define isnan _isnan #define isinf(x) (!_finite(x) && !_isnan(x)) #endif +#ifdef ANDROID +using __captured::isinf; +#endif // Preserves NaN in first param, takes sign of equal second param. // Technically, std::max may do this but it's undefined. From d73fcebc3f4cbb275ef5cbc08b31eed2246c514e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Henrik=20Rydg=C3=A5rd?= Date: Mon, 25 Feb 2013 21:10:15 +0100 Subject: [PATCH 184/347] Quickfix for a symbol collision. Should really share the AES code. --- Common/Crypto/aes.h | 4 ++-- Common/Crypto/aes_cbc.cpp | 12 ++++++------ Common/Crypto/aes_core.cpp | 4 ++-- ext/libkirk/AES.c | 4 ++-- pspautotests | 2 +- 5 files changed, 13 insertions(+), 13 deletions(-) diff --git a/Common/Crypto/aes.h b/Common/Crypto/aes.h index 8d5059e1bebd..c3006a775c89 100644 --- a/Common/Crypto/aes.h +++ b/Common/Crypto/aes.h @@ -89,9 +89,9 @@ int AES_set_encrypt_key(const unsigned char* userKey, const int bits, int AES_set_decrypt_key(const unsigned char* userKey, const int bits, AES_KEY* key); -void AES_encrypt(const unsigned char* in, unsigned char* out, +void AES_encrypt1(const unsigned char* in, unsigned char* out, const AES_KEY* key); -void AES_decrypt(const unsigned char* in, unsigned char* out, +void AES_decrypt1(const unsigned char* in, unsigned char* out, const AES_KEY* key); void AES_ecb_encrypt(const unsigned char* in, unsigned char* out, diff --git a/Common/Crypto/aes_cbc.cpp b/Common/Crypto/aes_cbc.cpp index 780c35a88d77..954878a5bba6 100644 --- a/Common/Crypto/aes_cbc.cpp +++ b/Common/Crypto/aes_cbc.cpp @@ -75,7 +75,7 @@ void AES_cbc_encrypt(const unsigned char *in, unsigned char *out, while (len >= AES_BLOCK_SIZE) { for(n=0; n < AES_BLOCK_SIZE; ++n) out[n] = in[n] ^ iv[n]; - AES_encrypt(out, out, key); + AES_encrypt1(out, out, key); iv = out; len -= AES_BLOCK_SIZE; in += AES_BLOCK_SIZE; @@ -86,13 +86,13 @@ void AES_cbc_encrypt(const unsigned char *in, unsigned char *out, out[n] = in[n] ^ iv[n]; for(n=len; n < AES_BLOCK_SIZE; ++n) out[n] = iv[n]; - AES_encrypt(out, out, key); + AES_encrypt1(out, out, key); iv = out; } memcpy(ivec,iv,AES_BLOCK_SIZE); } else if (in != out) { while (len >= AES_BLOCK_SIZE) { - AES_decrypt(in, out, key); + AES_decrypt1(in, out, key); for(n=0; n < AES_BLOCK_SIZE; ++n) out[n] ^= iv[n]; iv = in; @@ -101,7 +101,7 @@ void AES_cbc_encrypt(const unsigned char *in, unsigned char *out, out += AES_BLOCK_SIZE; } if (len) { - AES_decrypt(in,tmp,key); + AES_decrypt1(in,tmp,key); for(n=0; n < len; ++n) out[n] = tmp[n] ^ iv[n]; iv = in; @@ -110,7 +110,7 @@ void AES_cbc_encrypt(const unsigned char *in, unsigned char *out, } else { while (len >= AES_BLOCK_SIZE) { memcpy(tmp, in, AES_BLOCK_SIZE); - AES_decrypt(in, out, key); + AES_decrypt1(in, out, key); for(n=0; n < AES_BLOCK_SIZE; ++n) out[n] ^= ivec[n]; memcpy(ivec, tmp, AES_BLOCK_SIZE); @@ -120,7 +120,7 @@ void AES_cbc_encrypt(const unsigned char *in, unsigned char *out, } if (len) { memcpy(tmp, in, AES_BLOCK_SIZE); - AES_decrypt(tmp, out, key); + AES_decrypt1(tmp, out, key); for(n=0; n < len; ++n) out[n] ^= ivec[n]; for(n=len; n < AES_BLOCK_SIZE; ++n) diff --git a/Common/Crypto/aes_core.cpp b/Common/Crypto/aes_core.cpp index ad54bc6006f8..2bce4429a98f 100644 --- a/Common/Crypto/aes_core.cpp +++ b/Common/Crypto/aes_core.cpp @@ -778,7 +778,7 @@ int AES_set_decrypt_key(const unsigned char *userKey, const int bits, * Encrypt a single block * in and out can overlap */ -void AES_encrypt(const unsigned char *in, unsigned char *out, +void AES_encrypt1(const unsigned char *in, unsigned char *out, const AES_KEY *key) { const u32 *rk; @@ -969,7 +969,7 @@ void AES_encrypt(const unsigned char *in, unsigned char *out, * Decrypt a single block * in and out can overlap */ -void AES_decrypt(const unsigned char *in, unsigned char *out, +void AES_decrypt1(const unsigned char *in, unsigned char *out, const AES_KEY *key) { const u32 *rk; diff --git a/ext/libkirk/AES.c b/ext/libkirk/AES.c index c75748510b2a..c7a84621f2c8 100644 --- a/ext/libkirk/AES.c +++ b/ext/libkirk/AES.c @@ -37,11 +37,11 @@ //CMAC GLOBS #define AES_128 0 -const unsigned char const_Rb[16] = { +static const unsigned char const_Rb[16] = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x87 }; -const unsigned char const_Zero[16] = { +static const unsigned char const_Zero[16] = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }; diff --git a/pspautotests b/pspautotests index a013aed6f1ca..24620b2ae15d 160000 --- a/pspautotests +++ b/pspautotests @@ -1 +1 @@ -Subproject commit a013aed6f1ca37f9a665a0010e8971090a73116c +Subproject commit 24620b2ae15d640bdb74cb2f455152855629d2b0 From 347eb253dcb7c844277b1ee99812c0ef3dfcaf09 Mon Sep 17 00:00:00 2001 From: "Unknown W. Brackets" Date: Mon, 25 Feb 2013 00:59:23 -0800 Subject: [PATCH 185/347] Oops, will crash if we remove the end? --- GPU/GLES/TextureCache.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/GPU/GLES/TextureCache.cpp b/GPU/GLES/TextureCache.cpp index 32d404896c80..cd1a4b6b52a4 100644 --- a/GPU/GLES/TextureCache.cpp +++ b/GPU/GLES/TextureCache.cpp @@ -80,7 +80,7 @@ void TextureCache::Clear(bool delete_them) { // Removes old textures. void TextureCache::Decimate() { glBindTexture(GL_TEXTURE_2D, 0); - for (TexCache::iterator iter = cache.begin(), end = cache.end(); iter != end; ) { + for (TexCache::iterator iter = cache.begin(); iter != cache.end(); ) { if (iter->second.lastFrame + TEXTURE_KILL_AGE < gpuStats.numFrames) { glDeleteTextures(1, &iter->second.texture); cache.erase(iter++); From 0b6574ce677ad47cdc70e0f7fc579add406077d5 Mon Sep 17 00:00:00 2001 From: "Unknown W. Brackets" Date: Mon, 25 Feb 2013 02:19:08 -0800 Subject: [PATCH 186/347] Properly wake threads on sceUmdActivate(). And also delay it a bit since the PSP seems to. --- Core/HLE/sceUmd.cpp | 106 +++++++++++++++++++++++++++++++------------- 1 file changed, 76 insertions(+), 30 deletions(-) diff --git a/Core/HLE/sceUmd.cpp b/Core/HLE/sceUmd.cpp index b38218581154..47034f960d5e 100644 --- a/Core/HLE/sceUmd.cpp +++ b/Core/HLE/sceUmd.cpp @@ -24,6 +24,8 @@ const int PSP_ERROR_UMD_INVALID_PARAM = 0x80010016; +const u64 MICRO_DELAY_ACTIVATE = 4000; + #define UMD_NOT_PRESENT 0x01 #define UMD_PRESENT 0x02 #define UMD_CHANGED 0x04 @@ -31,12 +33,27 @@ const int PSP_ERROR_UMD_INVALID_PARAM = 0x80010016; #define UMD_READY 0x10 #define UMD_READABLE 0x20 +struct UmdWaitingThread +{ + SceUID threadID; + u32 stat; + + inline static UmdWaitingThread Make(SceUID threadID, u32 stat) + { + UmdWaitingThread th; + th.threadID = threadID; + th.stat = stat; + return th; + } +}; static u8 umdActivated = 1; static u32 umdStatus = 0; static u32 umdErrorStat = 0; static int driveCBId = -1; -static int umdStatTimer = -1; +static int umdStatTimeoutEvent = -1; +static int umdStatChangeEvent = -1; +static std::vector umdWaitingThreads; #define PSP_UMD_TYPE_GAME 0x10 @@ -49,10 +66,12 @@ struct PspUmdInfo { }; void __UmdStatTimeout(u64 userdata, int cyclesLate); +void __UmdStatChange(u64 userdata, int cyclesLate); void __UmdInit() { - umdStatTimer = CoreTiming::RegisterEvent("UmdTimeout", __UmdStatTimeout); + umdStatTimeoutEvent = CoreTiming::RegisterEvent("UmdTimeout", __UmdStatTimeout); + umdStatChangeEvent = CoreTiming::RegisterEvent("UmdChange", __UmdStatChange); umdActivated = 1; umdStatus = 0; umdErrorStat = 0; @@ -65,8 +84,11 @@ void __UmdDoState(PointerWrap &p) p.Do(umdStatus); p.Do(umdErrorStat); p.Do(driveCBId); - p.Do(umdStatTimer); - CoreTiming::RestoreRegisterEvent(umdStatTimer, "UmdTimeout", __UmdStatTimeout); + p.Do(umdStatTimeoutEvent); + CoreTiming::RestoreRegisterEvent(umdStatTimeoutEvent, "UmdTimeout", __UmdStatTimeout); + p.Do(umdStatChangeEvent); + CoreTiming::RestoreRegisterEvent(umdStatChangeEvent, "UmdChange", __UmdStatChange); + p.Do(umdWaitingThreads); p.DoMarker("sceUmd"); } @@ -83,24 +105,52 @@ u8 __KernelUmdGetState() return state; } +void __UmdStatChange(u64 userdata, int cyclesLate) +{ + // TODO: Why not a bool anyway? + umdActivated = userdata & 0xFF; + + u32 notifyArg = UMD_PRESENT | (umdActivated ? UMD_READABLE : UMD_READY); + __KernelNotifyCallbackType(THREAD_CALLBACK_UMD, -1, notifyArg); + + // Wake anyone waiting on this. + for (size_t i = 0; i < umdWaitingThreads.size(); ++i) + { + UmdWaitingThread &info = umdWaitingThreads[i]; + + u32 error; + SceUID waitID = __KernelGetWaitID(info.threadID, WAITTYPE_UMD, error); + bool keep = false; + if (waitID == 1) + { + if ((info.stat & __KernelUmdGetState()) != 0) + __KernelResumeThreadFromWait(info.threadID, 0); + // Only if they are still waiting do we keep them in the list. + else + keep = true; + } + + if (!keep) + umdWaitingThreads.erase(umdWaitingThreads.begin() + i--); + } +} + void __KernelUmdActivate() { - umdActivated = 1; + // Don't activate immediately, take time to "spin up." + CoreTiming::RemoveAllEvents(umdStatChangeEvent); + CoreTiming::ScheduleEvent(usToCycles(MICRO_DELAY_ACTIVATE), umdStatChangeEvent, 1); } void __KernelUmdDeactivate() { - umdActivated = 0; + CoreTiming::RemoveAllEvents(umdStatChangeEvent); + __UmdStatChange(0, 0); } -// typedef int (*UmdCallback)(int unknown, int event); - - -//int sceUmdCheckMedium(int a); int sceUmdCheckMedium() { - DEBUG_LOG(HLE,"1=sceUmdCheckMedium(?)"); - //ignore PARAM(0) + DEBUG_LOG(HLE, "1=sceUmdCheckMedium()"); return 1; //non-zero: disc in drive } @@ -139,9 +189,6 @@ int sceUmdActivate(u32 unknown, const char *name) ERROR_LOG(HLE, "UNTESTED 0=sceUmdActivate(%d, %s)", unknown, name); } - u32 notifyArg = UMD_PRESENT | UMD_READABLE; - __KernelNotifyCallbackType(THREAD_CALLBACK_UMD, -1, notifyArg); - return 0; } @@ -162,9 +209,6 @@ int sceUmdDeactivate(u32 unknown, const char *name) ERROR_LOG(HLE, "UNTESTED 0=sceUmdDeactivate(%d, %s)", unknown, name); } - u32 notifyArg = UMD_PRESENT | UMD_READY; - __KernelNotifyCallbackType(THREAD_CALLBACK_UMD, -1, notifyArg); - return 0; } @@ -223,6 +267,12 @@ void __UmdStatTimeout(u64 userdata, int cyclesLate) // Assuming it's still waiting. if (waitID == 1) __KernelResumeThreadFromWait(threadID, SCE_KERNEL_ERROR_WAIT_TIMEOUT); + + for (size_t i = 0; i < umdWaitingThreads.size(); ++i) + { + if (umdWaitingThreads[i].threadID = threadID) + umdWaitingThreads.erase(umdWaitingThreads.begin() + i--); + } } void __UmdWaitStat(u32 timeout) @@ -233,7 +283,7 @@ void __UmdWaitStat(u32 timeout) else if (timeout <= 215) timeout = 250; - CoreTiming::ScheduleEvent(usToCycles((int) timeout), umdStatTimer, __KernelGetCurThread()); + CoreTiming::ScheduleEvent(usToCycles((int) timeout), umdStatTimeoutEvent, __KernelGetCurThread()); } /** @@ -248,7 +298,10 @@ int sceUmdWaitDriveStat(u32 stat) DEBUG_LOG(HLE,"0=sceUmdWaitDriveStat(stat = %08x)", stat); if ((stat & __KernelUmdGetState()) == 0) + { + umdWaitingThreads.push_back(UmdWaitingThread::Make(__KernelGetCurThread(), stat)); __KernelWaitCurThread(WAITTYPE_UMD, 1, stat, 0, 0, "umd stat waited"); + } return 0; } @@ -260,7 +313,8 @@ int sceUmdWaitDriveStatWithTimer(u32 stat, u32 timeout) if ((stat & __KernelUmdGetState()) == 0) { __UmdWaitStat(timeout); - __KernelWaitCurThread(WAITTYPE_UMD, 1, stat, 0, 0, "umd stat waited"); + umdWaitingThreads.push_back(UmdWaitingThread::Make(__KernelGetCurThread(), stat)); + __KernelWaitCurThread(WAITTYPE_UMD, 1, stat, 0, 0, "umd stat waited with timer"); } else hleReSchedule("umd stat waited with timer"); @@ -270,14 +324,7 @@ int sceUmdWaitDriveStatWithTimer(u32 stat, u32 timeout) int sceUmdWaitDriveStatCB(u32 stat, u32 timeout) { - if (driveCBId != -1) - { - DEBUG_LOG(HLE,"0=sceUmdWaitDriveStatCB(stat = %08x, timeout = %d)", stat, timeout); - } - else - { - WARN_LOG(HLE, "0=sceUmdWaitDriveStatCB(stat = %08x, timeout = %d) without callback", stat, timeout); - } + DEBUG_LOG(HLE,"0=sceUmdWaitDriveStatCB(stat = %08x, timeout = %d)", stat, timeout); hleCheckCurrentCallbacks(); if ((stat & __KernelUmdGetState()) == 0) @@ -286,6 +333,7 @@ int sceUmdWaitDriveStatCB(u32 stat, u32 timeout) timeout = 8000; __UmdWaitStat(timeout); + umdWaitingThreads.push_back(UmdWaitingThread::Make(__KernelGetCurThread(), stat)); __KernelWaitCurThread(WAITTYPE_UMD, 1, stat, 0, true, "umd stat waited"); } else @@ -322,8 +370,6 @@ u32 sceUmdReplacePermit() return 0; } - - const HLEFunction sceUmdUser[] = { {0xC6183D47,WrapI_UC,"sceUmdActivate"}, From 183acbeb28dd4e83f603b2e07e56a97ed75ddba7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marcin=20Miko=C5=82ajczyk?= Date: Mon, 25 Feb 2013 23:55:37 +0100 Subject: [PATCH 187/347] Enable frameskip option --- Qt/mainwindow.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Qt/mainwindow.cpp b/Qt/mainwindow.cpp index a7e08e35f9e9..498aaf4f4151 100644 --- a/Qt/mainwindow.cpp +++ b/Qt/mainwindow.cpp @@ -244,7 +244,7 @@ void MainWindow::UpdateMenus() ui->action_OptionsVertexCache->setChecked(g_Config.bVertexCache); ui->action_OptionsWireframe->setChecked(g_Config.bDrawWireframe); ui->action_OptionsDisplayRawFramebuffer->setChecked(g_Config.bDisplayFramebuffer); -// ui->actionFrameskip->setChecked(g_Config.iFrameSkip != 0); + ui->actionFrameskip->setChecked(g_Config.iFrameSkip != 0); ui->action_Sound->setChecked(g_Config.bEnableSound); @@ -684,7 +684,7 @@ void MainWindow::on_action_OptionsDisplayRawFramebuffer_triggered() void MainWindow::on_actionFrameskip_triggered() { -// g_Config.iFrameSkip = !g_Config.iFrameSkip; + g_Config.iFrameSkip = !g_Config.iFrameSkip; UpdateMenus(); } From 12a393f7479ae69586e8d344cd4abc3099d9fabd Mon Sep 17 00:00:00 2001 From: "Unknown W. Brackets" Date: Mon, 25 Feb 2013 15:34:20 -0800 Subject: [PATCH 188/347] Update the umd callback right away. This fixes umd/callbacks/umd. --- Core/HLE/sceUmd.cpp | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/Core/HLE/sceUmd.cpp b/Core/HLE/sceUmd.cpp index 47034f960d5e..7f2fa8720d7e 100644 --- a/Core/HLE/sceUmd.cpp +++ b/Core/HLE/sceUmd.cpp @@ -110,9 +110,6 @@ void __UmdStatChange(u64 userdata, int cyclesLate) // TODO: Why not a bool anyway? umdActivated = userdata & 0xFF; - u32 notifyArg = UMD_PRESENT | (umdActivated ? UMD_READABLE : UMD_READY); - __KernelNotifyCallbackType(THREAD_CALLBACK_UMD, -1, notifyArg); - // Wake anyone waiting on this. for (size_t i = 0; i < umdWaitingThreads.size(); ++i) { @@ -137,6 +134,9 @@ void __UmdStatChange(u64 userdata, int cyclesLate) void __KernelUmdActivate() { + u32 notifyArg = UMD_PRESENT | UMD_READABLE; + __KernelNotifyCallbackType(THREAD_CALLBACK_UMD, -1, notifyArg); + // Don't activate immediately, take time to "spin up." CoreTiming::RemoveAllEvents(umdStatChangeEvent); CoreTiming::ScheduleEvent(usToCycles(MICRO_DELAY_ACTIVATE), umdStatChangeEvent, 1); @@ -144,6 +144,9 @@ void __KernelUmdActivate() void __KernelUmdDeactivate() { + u32 notifyArg = UMD_PRESENT | UMD_READY; + __KernelNotifyCallbackType(THREAD_CALLBACK_UMD, -1, notifyArg); + CoreTiming::RemoveAllEvents(umdStatChangeEvent); __UmdStatChange(0, 0); } From 76433a4fada7c36507d04356238d688f3aceee94 Mon Sep 17 00:00:00 2001 From: Sacha Date: Wed, 27 Feb 2013 05:03:56 +1000 Subject: [PATCH 189/347] Future-proof the Qt platform detection --- Qt/Settings.pri | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/Qt/Settings.pri b/Qt/Settings.pri index 9956e529ebac..7b9a23800817 100644 --- a/Qt/Settings.pri +++ b/Qt/Settings.pri @@ -1,5 +1,4 @@ DEFINES += USING_QT_UI -blackberry|symbian|contains(MEEGO_EDITION,harmattan): CONFIG += mobile_platform unix:!blackberry:!symbian:!macx: CONFIG += linux # Global specific @@ -17,7 +16,8 @@ win32-msvc* { } # Arch specific -contains(QT_ARCH, i686)|contains(QT_ARCH, x86)|contains(QT_ARCH, x86_64)|contains(QT_ARCH, windows): { +xarch = $$find(QT_ARCH, "86") +contains(QT_ARCH, windows)|count(xarch, 1) { !win32-msvc*: QMAKE_CXXFLAGS += -msse2 CONFIG += x86 } @@ -25,8 +25,13 @@ else { # Assume ARM DEFINES += ARM CONFIG += arm } -mobile_platform: DEFINES += USING_GLES2 +gleslib = $$lower($$QMAKE_LIBS_OPENGL) +gleslib = $$find(gleslib, "gles") +!count(gleslib,0) { + DEFINES += USING_GLES2 + CONFIG += mobile_platform +} # Platform specific contains(MEEGO_EDITION,harmattan): DEFINES += MEEGO_EDITION_HARMATTAN "_SYS_UCONTEXT_H=1" From fe8b80c12ec5e29b69e7edce172c267fcdfebe02 Mon Sep 17 00:00:00 2001 From: Sacha Date: Wed, 27 Feb 2013 17:09:47 +1000 Subject: [PATCH 190/347] ARM JIT: Add and simplify some half-word load/store instructions. --- Common/ArmEmitter.cpp | 13 +++++++++++++ Common/ArmEmitter.h | 10 +++++++--- Core/MIPS/ARM/ArmCompLoadStore.cpp | 23 ++++++++++------------- 3 files changed, 30 insertions(+), 16 deletions(-) diff --git a/Common/ArmEmitter.cpp b/Common/ArmEmitter.cpp index e4306c0324bd..15c60f8a6fb2 100644 --- a/Common/ArmEmitter.cpp +++ b/Common/ArmEmitter.cpp @@ -542,11 +542,20 @@ void ARMXEmitter::WriteStoreOp(u32 op, ARMReg dest, ARMReg src, Operand2 op2) Write32(condition | (op << 20) | (3 << 23) | (dest << 16) | (src << 12) | op2.Imm12()); } void ARMXEmitter::STR (ARMReg dest, ARMReg src, Operand2 op) { WriteStoreOp(0x40, dest, src, op);} +void ARMXEmitter::STRH(ARMReg dest, ARMReg src, Operand2 op) +{ + u8 Imm = op.Imm8(); + Write32(condition | (0x04 << 20) | (src << 16) | (dest << 12) | ((Imm >> 4) << 8) | (0xB << 4) | (Imm & 0x0F)); +} void ARMXEmitter::STRB(ARMReg dest, ARMReg src, Operand2 op) { WriteStoreOp(0x44, dest, src, op);} void ARMXEmitter::STR (ARMReg dest, ARMReg base, ARMReg offset, bool Index, bool Add) { Write32(condition | (0x60 << 20) | (Index << 24) | (Add << 23) | (dest << 16) | (base << 12) | offset); } +void ARMXEmitter::STRB (ARMReg dest, ARMReg base, ARMReg offset, bool Index, bool Add) +{ + Write32(condition | (0x64 << 20) | (Index << 24) | (Add << 23) | (dest << 16) | (base << 12) | offset); +} void ARMXEmitter::LDREX(ARMReg dest, ARMReg base) { Write32(condition | (25 << 20) | (base << 16) | (dest << 12) | 0xF9F); @@ -577,6 +586,10 @@ void ARMXEmitter::LDR (ARMReg dest, ARMReg base, ARMReg offset, bool Index, bool { Write32(condition | (0x61 << 20) | (Index << 24) | (Add << 23) | (base << 16) | (dest << 12) | offset); } +void ARMXEmitter::LDRB (ARMReg dest, ARMReg base, ARMReg offset, bool Index, bool Add) +{ + Write32(condition | (0x65 << 20) | (Index << 24) | (Add << 23) | (base << 16) | (dest << 12) | offset); +} void ARMXEmitter::WriteRegStoreOp(u32 op, ARMReg dest, bool WriteBack, u16 RegList) { Write32(condition | (op << 20) | (WriteBack << 21) | (dest << 16) | RegList); diff --git a/Common/ArmEmitter.h b/Common/ArmEmitter.h index e050cd53f4a6..90160707e1f5 100644 --- a/Common/ArmEmitter.h +++ b/Common/ArmEmitter.h @@ -468,15 +468,19 @@ class ARMXEmitter // Memory load/store operations void LDR (ARMReg dest, ARMReg src, Operand2 op2 = 0); + void LDRH(ARMReg dest, ARMReg src, Operand2 op2 = 0); + void LDRB(ARMReg dest, ARMReg src, Operand2 op2 = 0); // Offset adds to the base register in LDR void LDR (ARMReg dest, ARMReg base, ARMReg offset, bool Index, bool Add); - void LDRH(ARMReg dest, ARMReg src, Operand2 op = 0); - void LDRB(ARMReg dest, ARMReg src, Operand2 op2 = 0); + void LDRB (ARMReg dest, ARMReg base, ARMReg offset, bool Index, bool Add); + void STR (ARMReg dest, ARMReg src, Operand2 op2 = 0); + void STRH(ARMReg dest, ARMReg src, Operand2 op2 = 0); + void STRB(ARMReg dest, ARMReg src, Operand2 op2 = 0); // Offset adds on to the destination register in STR void STR (ARMReg dest, ARMReg base, ARMReg offset, bool Index, bool Add); + void STRB (ARMReg dest, ARMReg base, ARMReg offset, bool Index, bool Add); - void STRB(ARMReg dest, ARMReg src, Operand2 op2 = 0); void STMFD(ARMReg dest, bool WriteBack, const int Regnum, ...); void LDMFD(ARMReg dest, bool WriteBack, const int Regnum, ...); diff --git a/Core/MIPS/ARM/ArmCompLoadStore.cpp b/Core/MIPS/ARM/ArmCompLoadStore.cpp index fff481a29591..db7e843474c4 100644 --- a/Core/MIPS/ARM/ArmCompLoadStore.cpp +++ b/Core/MIPS/ARM/ArmCompLoadStore.cpp @@ -94,12 +94,9 @@ namespace MIPSComp } switch (o) { - case 37: //R(rt) = ReadMem16(addr); break; //lhu - Comp_Generic(op); - return; - - case 35: //R(rt) = ReadMem32(addr); //lw + case 35: //R(rt) = ReadMem32(addr); break; //lw case 36: //R(rt) = ReadMem8 (addr); break; //lbu + case 37: //R(rt) = ReadMem16(addr); break; //lhu if (g_Config.bFastMemory) { if (gpr.IsImm(rs)) { // We can compute the full address at compile time. Kickass. @@ -113,8 +110,10 @@ namespace MIPSComp if (o == 35) { LDR(gpr.R(rt), R11, R0, true, true); } else if (o == 36) { + LDRB(gpr.R(rt), R11, R0, true, true); + } else if (o == 37) { ADD(R0, R0, R11); // TODO: Merge with next instruction - LDRB(gpr.R(rt), R0); + LDRH(gpr.R(rt), R0); } } else { Comp_Generic(op); @@ -122,11 +121,8 @@ namespace MIPSComp } break; + case 40: //WriteMem8 (addr, R(rt)); break; //sb case 41: //WriteMem16(addr, R(rt)); break; //sh - Comp_Generic(op); - return; - - case 40: //sb case 43: //WriteMem32(addr, R(rt)); break; //sw if (g_Config.bFastMemory) { if (gpr.IsImm(rs)) { @@ -141,15 +137,16 @@ namespace MIPSComp if (o == 43) { STR(R0, gpr.R(rt), R11, true, true); } else if (o == 40) { - ADD(R0, R0, R11); - STRB(R0, gpr.R(rt)); + STRB(R0, gpr.R(rt), R11, true, true); + } else if (o == 41) { + ADD(R0, R0, R11); // TODO: Merge with next instruction + STRH(gpr.R(rt), R0); } } else { Comp_Generic(op); return; } break; - // break; /* case 34: //lwl { From 2c59de95e909eb58e328ca76c8edc9080dd2245e Mon Sep 17 00:00:00 2001 From: Sacha Date: Wed, 27 Feb 2013 18:05:45 +1000 Subject: [PATCH 191/347] JIT the signed load/store variants too --- Common/ArmEmitter.cpp | 10 ++++++++++ Common/ArmEmitter.h | 2 ++ Core/MIPS/ARM/ArmCompLoadStore.cpp | 15 +++++++++++++-- 3 files changed, 25 insertions(+), 2 deletions(-) diff --git a/Common/ArmEmitter.cpp b/Common/ArmEmitter.cpp index 15c60f8a6fb2..80cb17f91ae7 100644 --- a/Common/ArmEmitter.cpp +++ b/Common/ArmEmitter.cpp @@ -580,7 +580,17 @@ void ARMXEmitter::LDRH(ARMReg dest, ARMReg src, Operand2 op) u8 Imm = op.Imm8(); Write32(condition | (0x05 << 20) | (src << 16) | (dest << 12) | ((Imm >> 4) << 8) | (0xB << 4) | (Imm & 0x0F)); } +void ARMXEmitter::LDRSH(ARMReg dest, ARMReg src, Operand2 op) +{ + u8 Imm = op.Imm8(); + Write32(condition | (0x05 << 20) | (src << 16) | (dest << 12) | ((Imm >> 4) << 8) | (0xF << 4) | (Imm & 0x0F)); +} void ARMXEmitter::LDRB(ARMReg dest, ARMReg src, Operand2 op) { WriteStoreOp(0x45, src, dest, op);} +void ARMXEmitter::LDRSB(ARMReg dest, ARMReg src, Operand2 op) +{ + u8 Imm = op.Imm8(); + Write32(condition | (0x05 << 20) | (src << 16) | (dest << 12) | ((Imm >> 4) << 8) | (0xD << 4) | (Imm & 0x0F)); +} void ARMXEmitter::LDR (ARMReg dest, ARMReg base, ARMReg offset, bool Index, bool Add) { diff --git a/Common/ArmEmitter.h b/Common/ArmEmitter.h index 90160707e1f5..fbf636338536 100644 --- a/Common/ArmEmitter.h +++ b/Common/ArmEmitter.h @@ -469,7 +469,9 @@ class ARMXEmitter // Memory load/store operations void LDR (ARMReg dest, ARMReg src, Operand2 op2 = 0); void LDRH(ARMReg dest, ARMReg src, Operand2 op2 = 0); + void LDRSH(ARMReg dest, ARMReg src, Operand2 op2 = 0); void LDRB(ARMReg dest, ARMReg src, Operand2 op2 = 0); + void LDRBH(ARMReg dest, ARMReg src, Operand2 op2 = 0); // Offset adds to the base register in LDR void LDR (ARMReg dest, ARMReg base, ARMReg offset, bool Index, bool Add); void LDRB (ARMReg dest, ARMReg base, ARMReg offset, bool Index, bool Add); diff --git a/Core/MIPS/ARM/ArmCompLoadStore.cpp b/Core/MIPS/ARM/ArmCompLoadStore.cpp index db7e843474c4..879454538356 100644 --- a/Core/MIPS/ARM/ArmCompLoadStore.cpp +++ b/Core/MIPS/ARM/ArmCompLoadStore.cpp @@ -94,6 +94,8 @@ namespace MIPSComp } switch (o) { + case 32: //R(rt) = (u32)(s32)(s8) ReadMem8 (addr); break; //lb + case 33: //R(rt) = (u32)(s32)(s16)ReadMem16(addr); break; //lh case 35: //R(rt) = ReadMem32(addr); break; //lw case 36: //R(rt) = ReadMem8 (addr); break; //lbu case 37: //R(rt) = ReadMem16(addr); break; //lhu @@ -108,12 +110,21 @@ namespace MIPSComp SetR0ToEffectiveAddress(rs, offset); } if (o == 35) { + // 32-bit LDR(gpr.R(rt), R11, R0, true, true); - } else if (o == 36) { - LDRB(gpr.R(rt), R11, R0, true, true); } else if (o == 37) { + // 16-bit ADD(R0, R0, R11); // TODO: Merge with next instruction LDRH(gpr.R(rt), R0); + } else if (o == 33) { + ADD(R0, R0, R11); // TODO: Merge with next instruction + LDRSH(gpr.R(rt), R0); + } else if (o == 36) { + // 8-bit + LDRB(gpr.R(rt), R11, R0, true, true); + } else if (o == 32) { + ADD(R0, R0, R11); // TODO: Merge with next instruction + LDRSB(gpr.R(rt), R0); } } else { Comp_Generic(op); From ff14815fdadf6b7d11a65eb0f5cf966c1070b58e Mon Sep 17 00:00:00 2001 From: Sacha Date: Wed, 27 Feb 2013 19:45:01 +1000 Subject: [PATCH 192/347] ARMJIT: Combine to one instruction for load/stores. --- Common/ArmEmitter.cpp | 26 +++++++++++++++++++++----- Common/ArmEmitter.h | 22 +++++++++++++--------- Core/MIPS/ARM/ArmCompLoadStore.cpp | 17 ++++++++--------- 3 files changed, 42 insertions(+), 23 deletions(-) diff --git a/Common/ArmEmitter.cpp b/Common/ArmEmitter.cpp index 80cb17f91ae7..6e24f2692da4 100644 --- a/Common/ArmEmitter.cpp +++ b/Common/ArmEmitter.cpp @@ -541,17 +541,21 @@ void ARMXEmitter::WriteStoreOp(u32 op, ARMReg dest, ARMReg src, Operand2 op2) else Write32(condition | (op << 20) | (3 << 23) | (dest << 16) | (src << 12) | op2.Imm12()); } -void ARMXEmitter::STR (ARMReg dest, ARMReg src, Operand2 op) { WriteStoreOp(0x40, dest, src, op);} -void ARMXEmitter::STRH(ARMReg dest, ARMReg src, Operand2 op) +void ARMXEmitter::STR (ARMReg dest, ARMReg src, Operand2 op) { WriteStoreOp(0x40, dest, src, op);} +void ARMXEmitter::STRH (ARMReg dest, ARMReg src, Operand2 op) { u8 Imm = op.Imm8(); Write32(condition | (0x04 << 20) | (src << 16) | (dest << 12) | ((Imm >> 4) << 8) | (0xB << 4) | (Imm & 0x0F)); } -void ARMXEmitter::STRB(ARMReg dest, ARMReg src, Operand2 op) { WriteStoreOp(0x44, dest, src, op);} -void ARMXEmitter::STR (ARMReg dest, ARMReg base, ARMReg offset, bool Index, bool Add) +void ARMXEmitter::STRB (ARMReg dest, ARMReg src, Operand2 op) { WriteStoreOp(0x44, dest, src, op);} +void ARMXEmitter::STR (ARMReg dest, ARMReg base, ARMReg offset, bool Index, bool Add) { Write32(condition | (0x60 << 20) | (Index << 24) | (Add << 23) | (dest << 16) | (base << 12) | offset); } +void ARMXEmitter::STRH (ARMReg dest, ARMReg base, ARMReg offset, bool Index, bool Add) +{ + Write32(condition | (0x00 << 20) | (Index << 24) | (Add << 23) | (dest << 16) | (base << 12) | (0xB << 4) | offset); +} void ARMXEmitter::STRB (ARMReg dest, ARMReg base, ARMReg offset, bool Index, bool Add) { Write32(condition | (0x64 << 20) | (Index << 24) | (Add << 23) | (dest << 16) | (base << 12) | offset); @@ -592,14 +596,26 @@ void ARMXEmitter::LDRSB(ARMReg dest, ARMReg src, Operand2 op) Write32(condition | (0x05 << 20) | (src << 16) | (dest << 12) | ((Imm >> 4) << 8) | (0xD << 4) | (Imm & 0x0F)); } -void ARMXEmitter::LDR (ARMReg dest, ARMReg base, ARMReg offset, bool Index, bool Add) +void ARMXEmitter::LDR (ARMReg dest, ARMReg base, ARMReg offset, bool Index, bool Add) { Write32(condition | (0x61 << 20) | (Index << 24) | (Add << 23) | (base << 16) | (dest << 12) | offset); } +void ARMXEmitter::LDRH (ARMReg dest, ARMReg base, ARMReg offset, bool Index, bool Add) +{ + Write32(condition | (0x01 << 20) | (Index << 24) | (Add << 23) | (base << 16) | (dest << 12) | (0xB << 4) | offset); +} +void ARMXEmitter::LDRSH(ARMReg dest, ARMReg base, ARMReg offset, bool Index, bool Add) +{ + Write32(condition | (0x01 << 20) | (Index << 24) | (Add << 23) | (base << 16) | (dest << 12) | (0xF << 4) | offset); +} void ARMXEmitter::LDRB (ARMReg dest, ARMReg base, ARMReg offset, bool Index, bool Add) { Write32(condition | (0x65 << 20) | (Index << 24) | (Add << 23) | (base << 16) | (dest << 12) | offset); } +void ARMXEmitter::LDRSB(ARMReg dest, ARMReg base, ARMReg offset, bool Index, bool Add) +{ + Write32(condition | (0x01 << 20) | (Index << 24) | (Add << 23) | (base << 16) | (dest << 12) | (0xD << 4) | offset); +} void ARMXEmitter::WriteRegStoreOp(u32 op, ARMReg dest, bool WriteBack, u16 RegList) { Write32(condition | (op << 20) | (WriteBack << 21) | (dest << 16) | RegList); diff --git a/Common/ArmEmitter.h b/Common/ArmEmitter.h index fbf636338536..8aa466dc571d 100644 --- a/Common/ArmEmitter.h +++ b/Common/ArmEmitter.h @@ -467,20 +467,24 @@ class ARMXEmitter void MRS (ARMReg dest); // Memory load/store operations - void LDR (ARMReg dest, ARMReg src, Operand2 op2 = 0); - void LDRH(ARMReg dest, ARMReg src, Operand2 op2 = 0); + void LDR (ARMReg dest, ARMReg src, Operand2 op2 = 0); + void LDRH (ARMReg dest, ARMReg src, Operand2 op2 = 0); void LDRSH(ARMReg dest, ARMReg src, Operand2 op2 = 0); - void LDRB(ARMReg dest, ARMReg src, Operand2 op2 = 0); - void LDRBH(ARMReg dest, ARMReg src, Operand2 op2 = 0); + void LDRB (ARMReg dest, ARMReg src, Operand2 op2 = 0); + void LDRSB(ARMReg dest, ARMReg src, Operand2 op2 = 0); // Offset adds to the base register in LDR - void LDR (ARMReg dest, ARMReg base, ARMReg offset, bool Index, bool Add); + void LDR (ARMReg dest, ARMReg base, ARMReg offset, bool Index, bool Add); + void LDRH (ARMReg dest, ARMReg base, ARMReg offset, bool Index, bool Add); + void LDRSH(ARMReg dest, ARMReg base, ARMReg offset, bool Index, bool Add); void LDRB (ARMReg dest, ARMReg base, ARMReg offset, bool Index, bool Add); + void LDRSB(ARMReg dest, ARMReg base, ARMReg offset, bool Index, bool Add); - void STR (ARMReg dest, ARMReg src, Operand2 op2 = 0); - void STRH(ARMReg dest, ARMReg src, Operand2 op2 = 0); - void STRB(ARMReg dest, ARMReg src, Operand2 op2 = 0); + void STR (ARMReg dest, ARMReg src, Operand2 op2 = 0); + void STRH (ARMReg dest, ARMReg src, Operand2 op2 = 0); + void STRB (ARMReg dest, ARMReg src, Operand2 op2 = 0); // Offset adds on to the destination register in STR - void STR (ARMReg dest, ARMReg base, ARMReg offset, bool Index, bool Add); + void STR (ARMReg dest, ARMReg base, ARMReg offset, bool Index, bool Add); + void STRH (ARMReg dest, ARMReg base, ARMReg offset, bool Index, bool Add); void STRB (ARMReg dest, ARMReg base, ARMReg offset, bool Index, bool Add); void STMFD(ARMReg dest, bool WriteBack, const int Regnum, ...); diff --git a/Core/MIPS/ARM/ArmCompLoadStore.cpp b/Core/MIPS/ARM/ArmCompLoadStore.cpp index 879454538356..fbf6f4eb8afe 100644 --- a/Core/MIPS/ARM/ArmCompLoadStore.cpp +++ b/Core/MIPS/ARM/ArmCompLoadStore.cpp @@ -114,17 +114,14 @@ namespace MIPSComp LDR(gpr.R(rt), R11, R0, true, true); } else if (o == 37) { // 16-bit - ADD(R0, R0, R11); // TODO: Merge with next instruction - LDRH(gpr.R(rt), R0); + LDRH(gpr.R(rt), R11, R0, true, true); } else if (o == 33) { - ADD(R0, R0, R11); // TODO: Merge with next instruction - LDRSH(gpr.R(rt), R0); + LDRSH(gpr.R(rt), R11, R0, true, true); } else if (o == 36) { // 8-bit LDRB(gpr.R(rt), R11, R0, true, true); } else if (o == 32) { - ADD(R0, R0, R11); // TODO: Merge with next instruction - LDRSB(gpr.R(rt), R0); + LDRSB(gpr.R(rt), R11, R0, true, true); } } else { Comp_Generic(op); @@ -146,12 +143,14 @@ namespace MIPSComp SetR0ToEffectiveAddress(rs, offset); } if (o == 43) { + // 32-bit STR(R0, gpr.R(rt), R11, true, true); + } else if (o == 41) { + // 16-bit + STRH(R0, gpr.R(rt), R11, true, true); } else if (o == 40) { + // 8-bit STRB(R0, gpr.R(rt), R11, true, true); - } else if (o == 41) { - ADD(R0, R0, R11); // TODO: Merge with next instruction - STRH(gpr.R(rt), R0); } } else { Comp_Generic(op); From 8d4400fba1882d20180b76f2acc76980e91dcc54 Mon Sep 17 00:00:00 2001 From: Sacha Date: Wed, 27 Feb 2013 22:17:38 +1000 Subject: [PATCH 193/347] ARMJIT: Clean up for load/stores --- Core/MIPS/ARM/ArmCompLoadStore.cpp | 74 ++++++++++-------------------- 1 file changed, 25 insertions(+), 49 deletions(-) diff --git a/Core/MIPS/ARM/ArmCompLoadStore.cpp b/Core/MIPS/ARM/ArmCompLoadStore.cpp index fbf6f4eb8afe..4c0dab733b12 100644 --- a/Core/MIPS/ARM/ArmCompLoadStore.cpp +++ b/Core/MIPS/ARM/ArmCompLoadStore.cpp @@ -85,6 +85,7 @@ namespace MIPSComp void Jit::Comp_ITypeMem(u32 op) { int offset = (signed short)(op&0xFFFF); + bool load = false; int rt = _RT; int rs = _RS; int o = op>>26; @@ -94,63 +95,38 @@ namespace MIPSComp } switch (o) { - case 32: //R(rt) = (u32)(s32)(s8) ReadMem8 (addr); break; //lb - case 33: //R(rt) = (u32)(s32)(s16)ReadMem16(addr); break; //lh - case 35: //R(rt) = ReadMem32(addr); break; //lw - case 36: //R(rt) = ReadMem8 (addr); break; //lbu - case 37: //R(rt) = ReadMem16(addr); break; //lhu + case 32: //lb + case 33: //lh + case 35: //lw + case 36: //lbu + case 37: //lhu + load = true; + case 40: //sb + case 41: //sh + case 43: //sw if (g_Config.bFastMemory) { if (gpr.IsImm(rs)) { // We can compute the full address at compile time. Kickass. u32 addr = (offset + gpr.GetImm(rs)) & 0x3FFFFFFF; - gpr.MapReg(rt, MAP_NOINIT | MAP_DIRTY); // must be OK even if rs == rt since we have the value from imm already. + // Must be OK even if rs == rt since we have the value from imm already. + gpr.MapReg(rt, load ? MAP_NOINIT | MAP_DIRTY : 0); MOVI2R(R0, addr); } else { - gpr.MapDirtyIn(rt, rs); + load ? gpr.MapDirtyIn(rt, rs) : gpr.MapInIn(rt, rs); SetR0ToEffectiveAddress(rs, offset); } - if (o == 35) { - // 32-bit - LDR(gpr.R(rt), R11, R0, true, true); - } else if (o == 37) { - // 16-bit - LDRH(gpr.R(rt), R11, R0, true, true); - } else if (o == 33) { - LDRSH(gpr.R(rt), R11, R0, true, true); - } else if (o == 36) { - // 8-bit - LDRB(gpr.R(rt), R11, R0, true, true); - } else if (o == 32) { - LDRSB(gpr.R(rt), R11, R0, true, true); - } - } else { - Comp_Generic(op); - return; - } - break; - - case 40: //WriteMem8 (addr, R(rt)); break; //sb - case 41: //WriteMem16(addr, R(rt)); break; //sh - case 43: //WriteMem32(addr, R(rt)); break; //sw - if (g_Config.bFastMemory) { - if (gpr.IsImm(rs)) { - // We can compute the full address at compile time. Kickass. - u32 addr = (offset + gpr.GetImm(rs)) & 0x3FFFFFFF; - gpr.MapReg(rt); - MOVI2R(R0, addr); - } else { - gpr.MapInIn(rt, rs); - SetR0ToEffectiveAddress(rs, offset); - } - if (o == 43) { - // 32-bit - STR(R0, gpr.R(rt), R11, true, true); - } else if (o == 41) { - // 16-bit - STRH(R0, gpr.R(rt), R11, true, true); - } else if (o == 40) { - // 8-bit - STRB(R0, gpr.R(rt), R11, true, true); + switch (o) + { + // Load + case 35: LDR (gpr.R(rt), R11, R0, true, true); break; + case 37: LDRH (gpr.R(rt), R11, R0, true, true); break; + case 33: LDRSH(gpr.R(rt), R11, R0, true, true); break; + case 36: LDRB (gpr.R(rt), R11, R0, true, true); break; + case 32: LDRSB(gpr.R(rt), R11, R0, true, true); break; + // Store + case 43: STR (R0, gpr.R(rt), R11, true, true); break; + case 41: STRH (R0, gpr.R(rt), R11, true, true); break; + case 40: STRB (R0, gpr.R(rt), R11, true, true); break; } } else { Comp_Generic(op); From fe90d5cd06338bf5bcefd1c0fd3c2d0be7183107 Mon Sep 17 00:00:00 2001 From: Sacha Date: Wed, 27 Feb 2013 23:33:59 +1000 Subject: [PATCH 194/347] Add VNEG and VABS implementations and use in FPU2op. --- Common/ArmEmitter.cpp | 41 +++++++++++++++++++++++++++++------- Common/ArmEmitter.h | 4 ++-- Core/MIPS/ARM/ArmCompFPU.cpp | 33 +++++++++-------------------- 3 files changed, 45 insertions(+), 33 deletions(-) diff --git a/Common/ArmEmitter.cpp b/Common/ArmEmitter.cpp index 3b0c02cf26a3..1da5f05b603f 100644 --- a/Common/ArmEmitter.cpp +++ b/Common/ArmEmitter.cpp @@ -895,22 +895,47 @@ void ARMXEmitter::VMUL(ARMReg Vd, ARMReg Vn, ARMReg Vm) } else { - _assert_msg_(DYNA_REC, cpu_info.bNEON, "Trying to use VADD with Quad Reg without support!"); - //Write32((0xF2 << 24) | ((Vd & 0x10) << 18) | ((Vn & 0xF) << 16) - // | ((Vd & 0xF) << 12) | (0xD << 8) | ((Vn & 0x10) << 3) - // | (1 << 6) | ((Vm & 0x10) << 2) | (Vm & 0xF)); + _assert_msg_(DYNA_REC, cpu_info.bNEON, "Trying to use VMUL with Quad Reg without support!"); } } } -void ARMXEmitter::VABS(ARMReg Vd, ARMReg Vn) +void ARMXEmitter::VABS(ARMReg Vd, ARMReg Vm) { - _assert_msg_(DYNA_REC, 0, "VABS not implemented"); + bool single_reg = Vd < D0; + + Vd = SubBase(Vd); + Vm = SubBase(Vm); + + if (single_reg) + { + Write32(NO_COND | (0x1D << 23) | ((Vd & 0x1) << 22) | (0x30 << 16) \ + | ((Vd & 0x1E) << 11) | (0x2B << 6) | ((Vm & 0x1) << 5) | (Vm >> 1)); + } + else + { + Write32(NO_COND | (0x1D << 23) | ((Vd & 0x10) << 18) | (0x30 << 16) \ + | ((Vd & 0xF) << 12) | (0x2F << 6) | ((Vm & 0x10) << 2) | (Vm & 0xF)); + } } -void ARMXEmitter::VNEG(ARMReg Vd, ARMReg Vn) +void ARMXEmitter::VNEG(ARMReg Vd, ARMReg Vm) { - _assert_msg_(DYNA_REC, 0, "VNEG not implemented"); + bool single_reg = Vd < D0; + + Vd = SubBase(Vd); + Vm = SubBase(Vm); + + if (single_reg) + { + Write32(NO_COND | (0x1D << 23) | ((Vd & 0x1) << 22) | (0x31 << 16) \ + | ((Vd & 0x1E) << 11) | (0x29 << 6) | ((Vm & 0x1) << 5) | (Vm >> 1)); + } + else + { + Write32(NO_COND | (0x1D << 23) | ((Vd & 0x10) << 18) | (0x31 << 16) \ + | ((Vd & 0xF) << 12) | (0x2D << 6) | ((Vm & 0x10) << 2) | (Vm & 0xF)); + } } void ARMXEmitter::VMOV(ARMReg Dest, ARMReg Src, bool high) diff --git a/Common/ArmEmitter.h b/Common/ArmEmitter.h index a9319c8dd6bf..8813680f09d2 100644 --- a/Common/ArmEmitter.h +++ b/Common/ArmEmitter.h @@ -510,8 +510,8 @@ class ARMXEmitter // NEON and VFP void VADD(ARMReg Vd, ARMReg Vn, ARMReg Vm); void VSUB(ARMReg Vd, ARMReg Vn, ARMReg Vm); - void VABS(ARMReg Vd, ARMReg Vn); - void VNEG(ARMReg Vd, ARMReg Vn); + void VABS(ARMReg Vd, ARMReg Vm); + void VNEG(ARMReg Vd, ARMReg Vm); void VMUL(ARMReg Vd, ARMReg Vn, ARMReg Vm); void VMOV(ARMReg Dest, ARMReg Src, bool high); void VMOV(ARMReg Dest, ARMReg Src); diff --git a/Core/MIPS/ARM/ArmCompFPU.cpp b/Core/MIPS/ARM/ArmCompFPU.cpp index ce88687ffeac..38fdf73629c9 100644 --- a/Core/MIPS/ARM/ArmCompFPU.cpp +++ b/Core/MIPS/ARM/ArmCompFPU.cpp @@ -161,36 +161,23 @@ void Jit::Comp_FPU2op(u32 op) switch (op & 0x3f) { - /* - case 5: //F(fd) = fabsf(F(fs)); break; //abs - fpr.Lock(fd, fs); - fpr.BindToRegister(fd, fd == fs, true); - MOVSS(fpr.R(fd), fpr.R(fs)); - PAND(fpr.R(fd), M((void *)ssNoSignMask)); - fpr.UnlockAll(); - break; - */ - case 4: //F(fd) = sqrtf(F(fs)); break; //sqrt fpr.MapDirtyIn(fd, fs); VSQRT(fpr.R(fd), fpr.R(fs)); - return; - - - case 6: //F(fd) = F(fs); break; //mov + break; + case 5: //F(fd) = fabsf(F(fs)); break; //abs + fpr.MapDirtyIn(fd, fs); + VABS(fpr.R(fd), fpr.R(fs)); + break; + case 6: //F(fd) = F(fs); break; //mov fpr.MapDirtyIn(fd, fs); VMOV(fpr.R(fd), fpr.R(fs)); break; - - /* - case 7: //F(fd) = -F(fs); break; //neg - fpr.Lock(fd, fs); - fpr.BindToRegister(fd, fd == fs, true); - MOVSS(fpr.R(fd), fpr.R(fs)); - PXOR(fpr.R(fd), M((void *)ssSignBits2)); - fpr.UnlockAll(); + case 7: //F(fd) = -F(fs); break; //neg + fpr.MapDirtyIn(fd, fs); + VNEG(fpr.R(fd), fpr.R(fs)); break; - + /* case 12: //FsI(fd) = (int)floorf(F(fs)+0.5f); break; //round.w.s case 13: //FsI(fd) = F(fs)>=0 ? (int)floorf(F(fs)) : (int)ceilf(F(fs)); break;//trunc.w.s From ecb4de09a67b0c214546bb45e007b0b059135fba Mon Sep 17 00:00:00 2001 From: raven02 Date: Wed, 27 Feb 2013 22:36:09 +0800 Subject: [PATCH 195/347] Put ditherenable & alphaBlendEnable as function --- GPU/GLES/StateMapping.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/GPU/GLES/StateMapping.cpp b/GPU/GLES/StateMapping.cpp index 2374c6d56399..1b377de734c0 100644 --- a/GPU/GLES/StateMapping.cpp +++ b/GPU/GLES/StateMapping.cpp @@ -94,7 +94,7 @@ void TransformDrawEngine::ApplyDrawState(int prim) { // single fullscreen pass that converts alpha to stencil (or 2 passes, to set both the 0 and 1 values) very easily. // Set blend - bool wantBlend = !gstate.isModeClear() && (gstate.alphaBlendEnable & 1); + bool wantBlend = !gstate.isModeClear() && gstate.isAlphaBlendEnabled(); glstate.blend.set(wantBlend); if (wantBlend) { // This can't be done exactly as there are several PSP blend modes that are impossible to do on OpenGL ES 2.0, and some even on regular OpenGL for desktop. @@ -166,7 +166,7 @@ void TransformDrawEngine::ApplyDrawState(int prim) { } // Set Dither - glstate.dither.set(gstate.ditherEnable & 1); + glstate.dither.set(gstate.isDitherEnabled()); // Set ColorMask/Stencil/Depth if (gstate.isModeClear()) { From e15df27c4aa0a70a02533d16d3c36e2f152f9259 Mon Sep 17 00:00:00 2001 From: raven02 Date: Wed, 27 Feb 2013 22:37:17 +0800 Subject: [PATCH 196/347] New isAlphaBlendEnabled() & isDitherEnabled() --- GPU/GPUState.h | 2 ++ 1 file changed, 2 insertions(+) diff --git a/GPU/GPUState.h b/GPU/GPUState.h index 6522ae567f00..7ddb5853c0c1 100644 --- a/GPU/GPUState.h +++ b/GPU/GPUState.h @@ -209,6 +209,8 @@ struct GPUgstate int getDepthTestFunc() const { return ztestfunc & 0x7; } bool isFogEnabled() const { return fogEnable & 1; } bool isStencilTestEnabled() const { return stencilTestEnable & 1; } + bool isAlphaBlendEnabled() const { return alphaBlendEnable & 1; } + bool isDitherEnabled() const { return ditherEnable & 1; } // UV gen int getUVGenMode() const { return texmapmode & 3;} // 2 bits From ba0362d817130f68cfdc33f9558ece78a4347a53 Mon Sep 17 00:00:00 2001 From: Henrik Rydgard Date: Fri, 22 Feb 2013 20:05:07 +0100 Subject: [PATCH 197/347] PGF font support. Mostly an adaptation and cleanup of JPCSP's font system. --- Common/LogManager.cpp | 2 +- Core/CMakeLists.txt | 1 + Core/Core.vcxproj | 3 +- Core/Core.vcxproj.filters | 14 +- Core/Font/PGF.cpp | 531 +++++++++++++++++++ Core/Font/PGF.h | 289 +++++++++++ Core/HLE/FunctionWrappers.h | 12 +- Core/HLE/HLE.h | 1 + Core/HLE/sceFont.cpp | 969 +++++++++++++++++++++++++---------- Core/HLE/sceFont.h | 1 + Core/HLE/sceIo.cpp | 17 +- Core/HLE/sceKernel.cpp | 2 + Core/Util/BlockAllocator.cpp | 17 + Core/Util/BlockAllocator.h | 19 +- Core/Util/Pool.h | 25 - android/jni/Android.mk | 1 + 16 files changed, 1585 insertions(+), 319 deletions(-) create mode 100644 Core/Font/PGF.cpp create mode 100644 Core/Font/PGF.h delete mode 100644 Core/Util/Pool.h diff --git a/Common/LogManager.cpp b/Common/LogManager.cpp index 69d0b3ce0169..f47521917333 100644 --- a/Common/LogManager.cpp +++ b/Common/LogManager.cpp @@ -28,7 +28,7 @@ // Unfortunately this is quite slow. // #define LOG_MSC_OUTPUTDEBUG true -#define LOG_MSC_OUTPUTDEBUG false +#define LOG_MSC_OUTPUTDEBUG true void GenericLog(LogTypes::LOG_LEVELS level, LogTypes::LOG_TYPE type, const char *file, int line, const char* fmt, ...) diff --git a/Core/CMakeLists.txt b/Core/CMakeLists.txt index 3706931498ec..3bbd94a38439 100644 --- a/Core/CMakeLists.txt +++ b/Core/CMakeLists.txt @@ -21,6 +21,7 @@ set(SRCS ELF/ElfReader.cpp ELF/ParamSFO.cpp ELF/PrxDecrypter.cpp + Font/PGF.cpp HLE/HLE.cpp HLE/HLETables.cpp HLE/sceAtrac.cpp diff --git a/Core/Core.vcxproj b/Core/Core.vcxproj index 50c55c3a0174..c744df54b3a1 100644 --- a/Core/Core.vcxproj +++ b/Core/Core.vcxproj @@ -144,6 +144,7 @@ + @@ -312,6 +313,7 @@ + @@ -412,7 +414,6 @@ - diff --git a/Core/Core.vcxproj.filters b/Core/Core.vcxproj.filters index aeafbe3ada86..04d25d780a24 100644 --- a/Core/Core.vcxproj.filters +++ b/Core/Core.vcxproj.filters @@ -49,6 +49,9 @@ {0b77054f-7fc7-4c33-ada3-762aecde69e5} + + {1c79e88d-1c48-450b-8af6-f22ce7d40c66} + @@ -375,6 +378,10 @@ MIPS\ARM + + + Font + @@ -533,9 +540,6 @@ Util - - Util - Debugger @@ -695,6 +699,10 @@ MIPS\ARM + + + Font + diff --git a/Core/Font/PGF.cpp b/Core/Font/PGF.cpp new file mode 100644 index 000000000000..2fd2c4140b42 --- /dev/null +++ b/Core/Font/PGF.cpp @@ -0,0 +1,531 @@ +// Copyright (c) 2012- PPSSPP Project. + +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, version 2.0 or later versions. + +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License 2.0 for more details. + +// A copy of the GPL 2.0 should have been included with the program. +// If not, see http://www.gnu.org/licenses/ + +// Official git repository and contact information can be found at +// https://github.com/hrydgard/ppsspp and http://www.ppsspp.org/. + +// ============== NOTE!!!! + +// Thanks to the JPCSP project! This sceFont implementation is basically a C++ take on JPCSP's font code. +// Some parts, especially in this file, were simply copied, so I guess this really makes this file GPL3. + +#include "Common/CommonTypes.h" +#include "Core/MemMap.h" +#include "Core/Font/PGF.h" + +// These fonts, created by ttf2pgf, don't have complete glyph info and need to be identified. +static bool isJPCSPFont(const char *fontName) { + return !strcmp(fontName, "Liberation") || !strcmp(fontName, "Sazanami") || !strcmp(fontName, "UnDotum"); +} + +// Gets a number of bits from an offset. +// TODO: Make more efficient. +static int getBits(int numBits, const u8 *buf, size_t pos) { + int v = 0; + for (int i = 0; i < numBits; i++) { + v = v | (((buf[pos >> 3] >> (pos & 7)) & 1) << i); + pos++; + } + return v; +} + +static std::vector getTable(const u8 *buf, int bpe, int length) { + std::vector vec; + vec.resize(length); + for (int i = 0; i < length; i++) { + vec[i] = getBits(bpe, buf, bpe * i); + } + return vec; +} + +PGF::PGF() + : fontData(0), charMap(0), shadowCharMap(0), charPointerTable(0) { + +} + +PGF::~PGF() { + delete [] fontData; + delete [] charMap; + delete [] shadowCharMap; + delete [] charPointerTable; +} + +void PGF::DoState(PointerWrap &p) { + // TODO! +} + +void PGF::ReadPtr(const u8 *ptr, size_t dataSize) { + const u8 *const startPtr = ptr; + + INFO_LOG(HLE, "Reading %i bytes of PGF header", sizeof(header)); + memcpy(&header, ptr, sizeof(header)); + ptr += sizeof(header); + + if (header.revision == 3) { + memcpy(&rev3extra, ptr, sizeof(rev3extra)); + rev3extra.compCharMapLength1 &= 0xFFFF; + rev3extra.compCharMapLength2 &= 0xFFFF; + ptr += sizeof(rev3extra); + } + + const u32 *wptr = (const u32 *)ptr; + dimensionTable[0].resize(header.dimTableLength); + dimensionTable[1].resize(header.dimTableLength); + for (int i = 0; i < header.dimTableLength; i++) { + dimensionTable[0][i] = *wptr++; + dimensionTable[1][i] = *wptr++; + } + + xAdjustTable[0].resize(header.xAdjustTableLength); + xAdjustTable[1].resize(header.xAdjustTableLength); + for (int i = 0; i < header.xAdjustTableLength; i++) { + xAdjustTable[0][i] = *wptr++; + xAdjustTable[1][i] = *wptr++; + } + + yAdjustTable[0].resize(header.yAdjustTableLength); + yAdjustTable[1].resize(header.yAdjustTableLength); + for (int i = 0; i < header.yAdjustTableLength; i++) { + yAdjustTable[0][i] = *wptr++; + yAdjustTable[1][i] = *wptr++; + } + + advanceTable[0].resize(header.advanceTableLength); + advanceTable[1].resize(header.advanceTableLength); + for (int i = 0; i < header.advanceTableLength; i++) { + advanceTable[0][i] = *wptr++; + advanceTable[1][i] = *wptr++; + } + + const u8 *uptr = (const u8 *)wptr; + + int shadowCharMapSize = ((header.shadowMapLength * header.shadowMapBpe + 31) & ~31) / 8; + shadowCharMap = new u8[shadowCharMapSize]; + for (int i = 0; i < shadowCharMapSize; i++) { + shadowCharMap[i] = *uptr++; + } + + const u16 *sptr = (const u16 *)uptr; + if (header.revision == 3) { + charmapCompressionTable1[0].resize(rev3extra.compCharMapLength1); + charmapCompressionTable1[1].resize(rev3extra.compCharMapLength1); + for (int i = 0; i < rev3extra.compCharMapLength1; i++) { + charmapCompressionTable1[0][i] = *sptr++; + charmapCompressionTable1[1][i] = *sptr++; + } + + charmapCompressionTable2[0].resize(rev3extra.compCharMapLength2); + charmapCompressionTable2[1].resize(rev3extra.compCharMapLength2); + for (int i = 0; i < rev3extra.compCharMapLength2; i++) { + charmapCompressionTable2[0][i] = *sptr++; + charmapCompressionTable2[1][i] = *sptr++; + } + } + + uptr = (const u8 *)sptr; + + int charMapSize = ((header.charMapLength * header.charMapBpe + 31) & ~31) / 8; + + charMap = new u8[charMapSize]; + for (int i = 0; i < charMapSize; i++) { + charMap[i] = *uptr++; + } + + int charPointerSize = (((header.charPointerLength * header.charPointerBpe + 31) & ~31) / 8); + charPointerTable = new u8[charPointerSize]; + for (int i = 0; i < charPointerSize; i++) { + charPointerTable[i] = *uptr++; + } + + // PGF Fontdata. + u32 fontDataOffset = uptr - startPtr; + + fontDataSize = dataSize - fontDataOffset; + fontData = new u8[fontDataSize]; + memcpy(fontData, uptr, fontDataSize); + + // charmap.resize(); + charmap.resize(header.charMapLength); + int charmap_compr_len = header.revision == 3 ? 7 : 1; + charmap_compr.resize(charmap_compr_len * 4); + glyphs.resize(header.charPointerLength); + shadowGlyphs.resize(header.shadowMapLength); + firstGlyph = header.firstGlyph; + + // Parse out the char map (array where each entry is an irregular number of bits) + // BPE = bits per entry, I think. + for (int i = 0; i < header.charMapLength; i++) { + charmap[i] = getBits(header.charMapBpe, charMap, i * header.charMapBpe); + // This check seems a little odd. + if ((size_t)charmap[i] >= glyphs.size()) + charmap[i] = 65535; + } + + std::vector charPointers = getTable(charPointerTable, header.charPointerBpe, glyphs.size()); + std::vector shadowMap = getTable(shadowCharMap, header.shadowMapBpe, shadowGlyphs.size()); + + // Pregenerate glyphs. + for (size_t i = 0; i < glyphs.size(); i++) { + GetGlyph(fontData, charPointers[i] * 4 * 8 /* ??? */, FONT_PGF_CHARGLYPH, glyphs[i]); + } + + // And shadow glyphs. + for (size_t i = 0; i < shadowGlyphs.size(); i++) { + size_t shadowId = glyphs[i].shadowID; + if (shadowId >= 0 && shadowId < shadowMap.size()) { + size_t charId = shadowMap[shadowId]; + if (charId >= 0 && charId < glyphs.size()) { + // TODO: check for pre existing shadow glyph + GetGlyph(fontData, charPointers[charId] * 4 * 8 /* ??? */, FONT_PGF_SHADOWGLYPH, shadowGlyphs[i]); + } + } + } +} + +int PGF::GetCharIndex(int charCode, const std::vector &charmapCompressed) { + int charIndex = 0; + for (size_t i = 0; i < charmapCompressed.size(); i += 2) { + if (charCode >= charmapCompressed[i] && charCode < charmapCompressed[i] + charmapCompressed[i + 1]) { + charIndex += charCode - charmapCompressed[i]; + return charIndex; + } + charIndex += charmapCompressed[i + 1]; + } + return -1; +} + +bool PGF::GetCharInfo(int charCode, PGFCharInfo *charInfo) { + Glyph glyph; + if (!GetCharGlyph(charCode, FONT_PGF_CHARGLYPH, glyph)) { + // Character not in font, return zeroed charInfo as on real PSP. + return false; + } + memset(charInfo, 0, sizeof(charInfo)); + + charInfo->bitmapWidth = glyph.w; + charInfo->bitmapHeight = glyph.h; + charInfo->bitmapLeft = glyph.left; + charInfo->bitmapTop = glyph.top; + charInfo->sfp26Width = glyph.dimensionWidth; + charInfo->sfp26Height = glyph.dimensionHeight; + charInfo->sfp26Ascender = glyph.top << 6; + charInfo->sfp26Descender = (glyph.h - glyph.top) << 6; + charInfo->sfp26BearingHX = glyph.xAdjustH; + charInfo->sfp26BearingHY = glyph.yAdjustH; + charInfo->sfp26BearingVX = glyph.xAdjustV; + charInfo->sfp26BearingVY = glyph.yAdjustV; + charInfo->sfp26AdvanceH = glyph.advanceH; + charInfo->sfp26AdvanceV = glyph.advanceV; + return true; +} + +void PGF::GetFontInfo(PGFFontInfo *fi) { + fi->maxGlyphWidthI = header.maxSize[0]; + fi->maxGlyphHeightI = header.maxSize[1]; + fi->maxGlyphAscenderI = header.maxAscender; + fi->maxGlyphDescenderI = header.maxDescender; + fi->maxGlyphLeftXI = header.maxLeftXAdjust; + fi->maxGlyphBaseYI = header.maxBaseYAdjust; + fi->minGlyphCenterXI = header.minCenterXAdjust; + fi->maxGlyphTopYI = header.maxTopYAdjust; + fi->maxGlyphAdvanceXI = header.maxAdvance[0]; + fi->maxGlyphAdvanceYI = header.maxAdvance[1]; + fi->maxGlyphWidthF = header.maxSize[0] / 64.0f; + fi->maxGlyphHeightF = header.maxSize[1] / 64.0f; + fi->maxGlyphAscenderF = header.maxAscender / 64.0f; + fi->maxGlyphDescenderF = header.maxDescender / 64.0f; + fi->maxGlyphLeftXF = header.maxLeftXAdjust / 64.0f; + fi->maxGlyphBaseYF = header.maxBaseYAdjust / 64.0f; + fi->minGlyphCenterXF = header.minCenterXAdjust / 64.0f; + fi->maxGlyphTopYF = header.maxTopYAdjust / 64.0f; + fi->maxGlyphAdvanceXF = header.maxAdvance[0] / 64.0f; + fi->maxGlyphAdvanceYF = header.maxAdvance[1] / 64.0f; + + fi->maxGlyphWidth = header.maxGlyphWidth; + fi->maxGlyphHeight = header.maxGlyphHeight; + fi->charMapLength = header.charMapLength; + fi->shadowMapLength = 0; // header.shadowMapLength; TODO + + fi->BPP = header.bpp; +} + +bool PGF::GetGlyph(const u8 *fontdata, size_t charPtr, int glyphType, Glyph &glyph) { + if (glyphType == FONT_PGF_SHADOWGLYPH) { + if (charPtr + 96 > fontDataSize * 8) + return false; + charPtr += getBits(14, fontdata, charPtr) * 8; + if (charPtr + 96 > fontDataSize * 8) + return false; + } + charPtr += 14; + + glyph.w = getBits(7, fontdata, charPtr); + charPtr += 7; + + glyph.h = getBits(7, fontdata, charPtr); + charPtr += 7; + + glyph.left = getBits(7, fontdata, charPtr); + charPtr += 7; + if (glyph.left >= 64) { + glyph.left -= 128; + } + + glyph.top = getBits(7, fontdata, charPtr); + charPtr += 7; + if (glyph.top >= 64) { + glyph.top -= 128; + } + + glyph.flags = getBits(6, fontdata, charPtr); + charPtr += 6; + + if (glyph.flags & FONT_PGF_CHARGLYPH) { + // Skip magic number + charPtr += 7; + + glyph.shadowID = getBits(9, fontdata, charPtr); + charPtr += 9; + + int dimensionIndex = getBits(8, fontdata, charPtr); + charPtr += 8; + + int xAdjustIndex = getBits(8, fontdata, charPtr); + charPtr += 8; + + int yAdjustIndex = getBits(8, fontdata, charPtr); + charPtr += 8; + + charPtr += + ((glyph.flags & FONT_PGF_METRIC_FLAG1) ? 0 : 56) + + ((glyph.flags & FONT_PGF_METRIC_FLAG2) ? 0 : 56) + + ((glyph.flags & FONT_PGF_METRIC_FLAG3) ? 0 : 56); + + int advanceIndex = getBits(8, fontdata, charPtr); + charPtr += 8; + + if (dimensionIndex < header.dimTableLength) { + glyph.dimensionWidth = dimensionTable[0][dimensionIndex]; + glyph.dimensionHeight = dimensionTable[1][dimensionIndex]; + } + + if (xAdjustIndex < header.xAdjustTableLength) { + glyph.xAdjustH = xAdjustTable[0][xAdjustIndex]; + glyph.xAdjustV = xAdjustTable[1][xAdjustIndex]; + } + + if (yAdjustIndex < header.xAdjustTableLength) { + glyph.yAdjustH = yAdjustTable[0][yAdjustIndex]; + glyph.yAdjustV = yAdjustTable[1][yAdjustIndex]; + } + + if (dimensionIndex == 0 && xAdjustIndex == 0 && yAdjustIndex == 0 && isJPCSPFont(fileName.c_str())) { + // Fonts created by ttf2pgf do not contain complete Glyph information. + // Provide default values. + glyph.dimensionWidth = glyph.w << 6; + glyph.dimensionHeight = glyph.h << 6; + // This stuff doesn't exactly look right. + glyph.xAdjustH = glyph.left << 6; + glyph.xAdjustV = glyph.left << 6; + glyph.yAdjustH = glyph.top << 6; + glyph.yAdjustV = glyph.top << 6; + } + + if (advanceIndex < header.advanceTableLength) { + glyph.advanceH = advanceTable[0][advanceIndex]; + glyph.advanceV = advanceTable[1][advanceIndex]; + } + } else { + glyph.shadowID = 65535; + glyph.advanceH = 0; + } + + glyph.ptr = (u32)(charPtr / 8); + return true; +} + +bool PGF::GetCharGlyph(int charCode, int glyphType, Glyph &glyph) { + if (charCode < firstGlyph) + return false; + charCode -= firstGlyph; + if (charCode < (int)charmap.size()) { + charCode = charmap[charCode]; + } + if (glyphType == FONT_PGF_CHARGLYPH) { + if (charCode >= (int)glyphs.size()) + return false; + glyph = glyphs[charCode]; + } else { + if (charCode >= (int)shadowGlyphs.size()) + return false; + glyph = shadowGlyphs[charCode]; + } + return true; +} + +void PGF::DrawCharacter(u32 base, int bpl, int bufWidth, int bufHeight, int x, int y, int clipX, int clipY, int clipWidth, int clipHeight, int pixelformat, int charCode, int altCharCode, int glyphType) { + Glyph glyph; + if (!GetCharGlyph(charCode, glyphType, glyph)) { + // No Glyph available for this charCode, try to use the alternate char. + charCode = altCharCode; + if (!GetCharGlyph(charCode, glyphType, glyph)) { + return; + } + } + + if (glyph.w <= 0 || glyph.h <= 0) { + return; + } + + if (((glyph.flags & FONT_PGF_BMP_OVERLAY) != FONT_PGF_BMP_H_ROWS) && + ((glyph.flags & FONT_PGF_BMP_OVERLAY) != FONT_PGF_BMP_V_ROWS)) { + return; + } + + u32 bitPtr = glyph.ptr * 8; + int numberPixels = glyph.w * glyph.h; + int pixelIndex = 0; + + while (pixelIndex < numberPixels && bitPtr + 8 < fontDataSize * 8) { + // This is some kind of nibble based RLE compression. + int nibble = getBits(4, fontData, bitPtr); + bitPtr += 4; + + int count; + int value; + if (nibble < 8) { + value = getBits(4, fontData, bitPtr); + bitPtr += 4; + count = nibble + 1; + } else { + count = 16 - nibble; + } + + for (int i = 0; i < count && pixelIndex < numberPixels; i++) { + if (nibble >= 8) { + value = getBits(4, fontData, bitPtr); + bitPtr += 4; + } + + int xx, yy; + if ((glyph.flags & FONT_PGF_BMP_OVERLAY) == FONT_PGF_BMP_H_ROWS) { + xx = pixelIndex % glyph.w; + yy = pixelIndex / glyph.w; + } else { + xx = pixelIndex / glyph.h; + yy = pixelIndex % glyph.h; + } + + int pixelX = x + xx; + int pixelY = y + yy; + if (pixelX >= clipX && pixelX < clipX + clipWidth && pixelY >= clipY && pixelY < clipY + clipHeight) { + // 4-bit color value + int pixelColor = value; + switch (pixelformat) { + case PSP_FONT_PIXELFORMAT_8: + // 8-bit color value + pixelColor |= pixelColor << 4; + break; + case PSP_FONT_PIXELFORMAT_24: + // 24-bit color value + pixelColor |= pixelColor << 4; + pixelColor |= pixelColor << 8; + pixelColor |= pixelColor << 8; + break; + case PSP_FONT_PIXELFORMAT_32: + // 32-bit color value + pixelColor |= pixelColor << 4; + pixelColor |= pixelColor << 8; + pixelColor |= pixelColor << 16; + break; + } + + SetFontPixel(base, bpl, bufWidth, bufHeight, pixelX, pixelY, pixelColor, pixelformat); + } + + pixelIndex++; + } + } +} + +void PGF::SetFontPixel(u32 base, int bpl, int bufWidth, int bufHeight, int x, int y, int pixelColor, int pixelformat) { + if (x < 0 || x >= bufWidth || y < 0 || y >= bufHeight) { + return; + } + + static const u8 fontPixelSizeInBytes[] = { 0, 0, 1, 3, 4 }; // 0 means 2 pixels per byte + int pixelBytes = fontPixelSizeInBytes[pixelformat]; + int bufMaxWidth = (pixelBytes == 0 ? bpl * 2 : bpl / pixelBytes); + if (x >= bufMaxWidth) { + return; + } + + int framebufferAddr = base + (y * bpl) + (pixelBytes == 0 ? x / 2 : x * pixelBytes); + + switch (pixelformat) { + case PSP_FONT_PIXELFORMAT_4: + case PSP_FONT_PIXELFORMAT_4_REV: + { + int oldColor = Memory::Read_U8(framebufferAddr); + int newColor; + if ((x & 1) != pixelformat) { + newColor = (pixelColor << 4) | (oldColor & 0xF); + } else { + newColor = (oldColor & 0xF0) | pixelColor; + } + Memory::Write_U8(newColor, framebufferAddr); + break; + } + case PSP_FONT_PIXELFORMAT_8: + { + Memory::Write_U8((u8)pixelColor, framebufferAddr); + break; + } + case PSP_FONT_PIXELFORMAT_24: + { + Memory::Write_U8(pixelColor & 0xFF, framebufferAddr + 0); + Memory::Write_U8(pixelColor >> 8, framebufferAddr + 1); + Memory::Write_U8(pixelColor >> 16, framebufferAddr + 2); + break; + } + case PSP_FONT_PIXELFORMAT_32: + { + Memory::Write_U32(pixelColor, framebufferAddr); + break; + } + } +} + +u32 GetFontPixelColor(int color, int pixelformat) { + switch (pixelformat) { + case PSP_FONT_PIXELFORMAT_4: + case PSP_FONT_PIXELFORMAT_4_REV: + // Use only 4-bit alpha + color = (color >> 28) & 0xF; + break; + case PSP_FONT_PIXELFORMAT_8: + // Use only 8-bit alpha + color = (color >> 24) & 0xFF; + break; + case PSP_FONT_PIXELFORMAT_24: + // Use RGB with 8-bit values + color = color & 0x00FFFFFF; + break; + case PSP_FONT_PIXELFORMAT_32: + // Use RGBA with 8-bit values + break; + } + + return color; +} \ No newline at end of file diff --git a/Core/Font/PGF.h b/Core/Font/PGF.h new file mode 100644 index 000000000000..bba9f29d3d43 --- /dev/null +++ b/Core/Font/PGF.h @@ -0,0 +1,289 @@ +// Copyright (c) 2012- PPSSPP Project. + +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, version 2.0 or later versions. + +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License 2.0 for more details. + +// A copy of the GPL 2.0 should have been included with the program. +// If not, see http://www.gnu.org/licenses/ + +// Official git repository and contact information can be found at +// https://github.com/hrydgard/ppsspp and http://www.ppsspp.org/. + +// Thanks to the JPCSP project! This sceFont implementation is basically a C++ take on JPCSP's font code. + +#pragma once + +#include +#include + +#include "Common/Log.h" +#include "Common/ChunkFile.h" +#include "Common/CommonTypes.h" + +enum { + FONT_FILETYPE_PGF = 0x00, + FONT_FILETYPE_BWFON = 0x01, +}; + +enum { + FONT_PGF_BMP_H_ROWS = 0x01, + FONT_PGF_BMP_V_ROWS = 0x02, + FONT_PGF_BMP_OVERLAY = 0x03, + FONT_PGF_METRIC_FLAG1 = 0x04, + FONT_PGF_METRIC_FLAG2 = 0x08, + FONT_PGF_METRIC_FLAG3 = 0x10, + FONT_PGF_CHARGLYPH = 0x20, + FONT_PGF_SHADOWGLYPH = 0x40, +}; + +enum Family { + FONT_FAMILY_SANS_SERIF = 1, + FONT_FAMILY_SERIF = 2, +}; + +enum Style { + FONT_STYLE_REGULAR = 1, + FONT_STYLE_ITALIC = 2, + FONT_STYLE_BOLD = 5, + FONT_STYLE_BOLD_ITALIC = 6, + FONT_STYLE_DB = 103, // Demi-Bold / semi-bold +}; + +enum Language { + FONT_LANGUAGE_JAPANESE = 1, + FONT_LANGUAGE_LATIN = 2, + FONT_LANGUAGE_KOREAN = 3, + FONT_LANGUAGE_CHINESE = 4, +}; + +enum FontPixelFormat { + PSP_FONT_PIXELFORMAT_4 = 0, // 2 pixels packed in 1 byte (natural order) + PSP_FONT_PIXELFORMAT_4_REV = 1, // 2 pixels packed in 1 byte (reversed order) + PSP_FONT_PIXELFORMAT_8 = 2, // 1 pixel in 1 byte + PSP_FONT_PIXELFORMAT_24 = 3, // 1 pixel in 3 bytes (RGB) + PSP_FONT_PIXELFORMAT_32 = 4, // 1 pixel in 4 bytes (RGBA) +}; + + +struct PGFFontStyle { + float fontH; + float fontV; + float fontHRes; + float fontVRes; + float fontWeight; + u16 fontFamily; + u16 fontStyle; + // Check. + u16 fontStyleSub; + u16 fontLanguage; + u16 fontRegion; + u16 fontCountry; + char fontName[64]; + char fontFileName[64]; + u32 fontAttributes; + u32 fontExpire; +}; + + +class Glyph { +public: + int x; + int y; + int w; + int h; + int left; + int top; + int flags; + int shadowID; + int advanceH; + int advanceV; + int dimensionWidth, dimensionHeight; + int xAdjustH, xAdjustV; + int yAdjustH, yAdjustV; + u32 ptr; +}; + +#pragma pack(push,1) +struct PGFHeader +{ + u16 headerOffset; + u16 headerSize; + + char PGFMagic[4]; + int revision; + int version; + + int charMapLength; + int charPointerLength; + int charMapBpe; + int charPointerBpe; + + u8 pad1[2]; + u8 bpp; + u8 pad2[1]; + + int hSize; + int vSize; + int hResolution; + int vResolution; + + u8 pad3[1]; + char fontName[64]; + char fontType[64]; + u8 pad4[1]; + + u16 firstGlyph; + u16 lastGlyph; + + u8 pad5[26]; + + int maxAscender; + int maxDescender; + int maxLeftXAdjust; + int maxBaseYAdjust; + int minCenterXAdjust; + int maxTopYAdjust; + + int maxAdvance[2]; + int maxSize[2]; + u16 maxGlyphWidth; + u16 maxGlyphHeight; + u8 pad6[2]; + + u8 dimTableLength; + u8 xAdjustTableLength; + u8 yAdjustTableLength; + u8 advanceTableLength; + u8 pad7[102]; + + int shadowMapLength; + int shadowMapBpe; + float unknown1; + int shadowScale[2]; + u8 pad8[8]; +}; + +struct PGFHeaderRev3Extra { + int compCharMapBpe1; + int compCharMapLength1; + int compCharMapBpe2; + int compCharMapLength2; + u32 unknown; +}; + +struct PGFCharInfo { + u32 bitmapWidth; + u32 bitmapHeight; + u32 bitmapLeft; + u32 bitmapTop; + // Glyph metrics (in 26.6 signed fixed-point). + u32 sfp26Width; + u32 sfp26Height; + s32 sfp26Ascender; + s32 sfp26Descender; + s32 sfp26BearingHX; + s32 sfp26BearingHY; + s32 sfp26BearingVX; + s32 sfp26BearingVY; + s32 sfp26AdvanceH; + s32 sfp26AdvanceV; + u8 pad[4]; +}; + +struct PGFFontInfo { + // Glyph metrics (in 26.6 signed fixed-point). + int maxGlyphWidthI; + int maxGlyphHeightI; + int maxGlyphAscenderI; + int maxGlyphDescenderI; + int maxGlyphLeftXI; + int maxGlyphBaseYI; + int minGlyphCenterXI; + int maxGlyphTopYI; + int maxGlyphAdvanceXI; + int maxGlyphAdvanceYI; + + // Glyph metrics (replicated as float). + float maxGlyphWidthF; + float maxGlyphHeightF; + float maxGlyphAscenderF; + float maxGlyphDescenderF; + float maxGlyphLeftXF; + float maxGlyphBaseYF; + float minGlyphCenterXF; + float maxGlyphTopYF; + float maxGlyphAdvanceXF; + float maxGlyphAdvanceYF; + + // Bitmap dimensions. + short maxGlyphWidth; + short maxGlyphHeight; + int charMapLength; // Number of elements in the font's charmap. + int shadowMapLength; // Number of elements in the font's shadow charmap. + + // Font style (used by font comparison functions). + PGFFontStyle fontStyle; + + int BPP; // Font's BPP. +}; + +#pragma pack(pop) + +class PGF { +public: + PGF(); + ~PGF(); + + void ReadPtr(const u8 *ptr, size_t dataSize); + + bool GetCharInfo(int charCode, PGFCharInfo *ci); + void GetFontInfo(PGFFontInfo *fi); + void DrawCharacter(u32 base, int bpl, int bufWidth, int bufHeight, int x, int y, int clipX, int clipY, int clipWidth, int clipHeight, int pixelformat, int charCode, int altCharCode, int glyphType); + + void DoState(PointerWrap &p); + + PGFHeader header; + +private: + bool GetGlyph(const u8 *fontdata, size_t charPtr, int glyphType, Glyph &glyph); + bool GetCharGlyph(int charCode, int glyphType, Glyph &glyph); + + // Unused + int GetCharIndex(int charCode, const std::vector &charmapCompressed); + + void SetFontPixel(u32 base, int bpl, int bufWidth, int bufHeight, int x, int y, int pixelColor, int pixelformat); + + PGFHeaderRev3Extra rev3extra; + + // Font character image data + u8 *fontData; + size_t fontDataSize; + + std::string fileName; + + std::vector dimensionTable[2]; + std::vector xAdjustTable[2]; + std::vector yAdjustTable[2]; + std::vector advanceTable[2]; + + // Unused + std::vector charmapCompressionTable1[2]; + std::vector charmapCompressionTable2[2]; + + u8 *charMap; + u8 *shadowCharMap; + u8 *charPointerTable; + + std::vector charmap_compr; + std::vector charmap; + + std::vector glyphs; + std::vector shadowGlyphs; + int firstGlyph; +}; diff --git a/Core/HLE/FunctionWrappers.h b/Core/HLE/FunctionWrappers.h index 85468754b8cf..4ef0f7199123 100644 --- a/Core/HLE/FunctionWrappers.h +++ b/Core/HLE/FunctionWrappers.h @@ -96,6 +96,11 @@ template void WrapF_V() { RETURNF(func()); } +// TODO: Not sure about the floating point parameter passing +template void WrapF_IFU() { + RETURNF(func(PARAM(0), PARAMF(0), PARAM(1))); +} + template void WrapU_U() { u32 retval = func(PARAM(0)); RETURN(retval); @@ -133,7 +138,7 @@ template void WrapI_UU() { template void WrapI_UFF() { // Not sure about the float arguments. - int retval = func(PARAM(0), currentMIPS->f[0], currentMIPS->f[1]); + int retval = func(PARAM(0), currentMIPS->f[12], currentMIPS->f[13]); RETURN(retval); } @@ -481,6 +486,11 @@ template void WrapU_UUUU() { RETURN(retval); } +template void WrapU_UCUU() { + u32 retval = func(PARAM(0), Memory::GetCharPointer(PARAM(1)), PARAM(2), PARAM(3)); + RETURN(retval); +} + template void WrapU_UUUI() { u32 retval = func(PARAM(0), PARAM(1), PARAM(2), PARAM(3)); RETURN(retval); diff --git a/Core/HLE/HLE.h b/Core/HLE/HLE.h index 3b5558fbe579..40b4a17dbc60 100644 --- a/Core/HLE/HLE.h +++ b/Core/HLE/HLE.h @@ -53,6 +53,7 @@ struct Syscall }; #define PARAM(n) currentMIPS->r[4+n] +#define PARAMF(n) currentMIPS->f[12+n] #define RETURN(n) currentMIPS->r[2]=n #define RETURNF(fl) currentMIPS->f[0]=fl diff --git a/Core/HLE/sceFont.cpp b/Core/HLE/sceFont.cpp index 867d7ea664d1..c33032a3a0e0 100644 --- a/Core/HLE/sceFont.cpp +++ b/Core/HLE/sceFont.cpp @@ -5,6 +5,33 @@ #include "HLE.h" #include "../MIPS/MIPS.h" #include "ChunkFile.h" +#include "Core/FileSystems/FileSystem.h" +#include "Core/System.h" +#include "Core/HLE/sceKernel.h" +#include "Core/Font/PGF.h" +#include "Core/HLE/sceKernelThread.h" + +enum { + ERROR_FONT_INVALID_LIBID = 0x80460002, + ERROR_FONT_INVALID_PARAMETER = 0x80460003, + ERROR_FONT_TOO_MANY_OPEN_FONTS = 0x80460009, +}; + +enum { + FONT_IS_CLOSED = 0, + FONT_IS_OPEN = 1, +}; + +// Actions +static int actionPostAllocCallback; +static int actionPostOpenCallback; + +// Monster Hunter sequence: +// 36:46:998 c:\dev\ppsspp\core\hle\scefont.cpp:469 E[HLE]: sceFontNewLib 89ad4a0, 9fff5cc +// 36:46:998 c:\dev\ppsspp\core\hle\scefont.cpp:699 E[HLE]: UNIMPL sceFontGetNumFontList 1, 9fff5cc +// 36:46:998 c:\dev\ppsspp\core\hle\scefont.cpp:526 E[HLE]: sceFontFindOptimumFont 1, 9fff524, 9fff5cc +// 36:46:999 c:\dev\ppsspp\core\hle\scefont.cpp:490 E[HLE]: sceFontOpenFont 1, 1, 0, 9fff5cc +// 36:46:999 c:\dev\ppsspp\core\hle\scefont.cpp:542 E[HLE]: sceFontGetFontInfo 1, 997140c typedef u32 FontLibraryHandle; typedef u32 FontHandle; @@ -25,298 +52,635 @@ struct FontNewLibParams { u32 ioFinishFuncAddr; }; -typedef enum Family { - FONT_FAMILY_SANS_SERIF = 1, - FONT_FAMILY_SERIF = 2, +struct GlyphImage { + FontPixelFormat pixelFormat; + s32 xPos64; + s32 yPos64; + u16 bufWidth; + u16 bufHeight; + u16 bytesPerLine; + u16 pad; + u32 bufferPtr; }; -typedef enum Style { - FONT_STYLE_REGULAR = 1, - FONT_STYLE_ITALIC = 2, - FONT_STYLE_BOLD = 5, - FONT_STYLE_BOLD_ITALIC = 6, - FONT_STYLE_DB = 103, // Demi-Bold / semi-bold +struct FontRegistryEntry { + int hSize; + int vSize; + int hResolution; + int vResolution; + int extraAttributes; + int weight; + int familyCode; + int style; + int styleSub; + int languageCode; + int regionCode; + int countryCode; + const char *fileName; + const char *fontName; + int expireDate; + int shadow_option; }; -typedef enum Language { - FONT_LANGUAGE_JAPANESE = 1, - FONT_LANGUAGE_LATIN = 2, - FONT_LANGUAGE_KOREAN = 3, +static const FontRegistryEntry fontRegistry[] = { + {0x288, 0x288, 0x2000, 0x2000, 0, 0, FONT_FAMILY_SANS_SERIF, FONT_STYLE_DB, 0, FONT_LANGUAGE_JAPANESE, 0, 1, "jpn0.pgf", "FTT-NewRodin Pro DB", 0, 0}, + {0x288, 0x288, 0x2000, 0x2000, 0, 0, FONT_FAMILY_SANS_SERIF, FONT_STYLE_REGULAR, 0, FONT_LANGUAGE_LATIN, 0, 1, "ltn0.pgf", "FTT-NewRodin Pro Latin", 0, 0}, + {0x288, 0x288, 0x2000, 0x2000, 0, 0, FONT_FAMILY_SERIF, FONT_STYLE_REGULAR, 0, FONT_LANGUAGE_LATIN, 0, 1, "ltn1.pgf", "FTT-Matisse Pro Latin", 0, 0}, + {0x288, 0x288, 0x2000, 0x2000, 0, 0, FONT_FAMILY_SANS_SERIF, FONT_STYLE_ITALIC, 0, FONT_LANGUAGE_LATIN, 0, 1, "ltn2.pgf", "FTT-NewRodin Pro Latin", 0, 0}, + {0x288, 0x288, 0x2000, 0x2000, 0, 0, FONT_FAMILY_SERIF, FONT_STYLE_ITALIC, 0, FONT_LANGUAGE_LATIN, 0, 1, "ltn3.pgf", "FTT-Matisse Pro Latin", 0, 0}, + {0x288, 0x288, 0x2000, 0x2000, 0, 0, FONT_FAMILY_SANS_SERIF, FONT_STYLE_BOLD, 0, FONT_LANGUAGE_LATIN, 0, 1, "ltn4.pgf", "FTT-NewRodin Pro Latin", 0, 0}, + {0x288, 0x288, 0x2000, 0x2000, 0, 0, FONT_FAMILY_SERIF, FONT_STYLE_BOLD, 0, FONT_LANGUAGE_LATIN, 0, 1, "ltn5.pgf", "FTT-Matisse Pro Latin", 0, 0}, + {0x288, 0x288, 0x2000, 0x2000, 0, 0, FONT_FAMILY_SANS_SERIF, FONT_STYLE_BOLD_ITALIC, 0, FONT_LANGUAGE_LATIN, 0, 1, "ltn6.pgf", "FTT-NewRodin Pro Latin", 0, 0}, + {0x288, 0x288, 0x2000, 0x2000, 0, 0, FONT_FAMILY_SERIF, FONT_STYLE_BOLD_ITALIC, 0, FONT_LANGUAGE_LATIN, 0, 1, "ltn7.pgf", "FTT-Matisse Pro Latin", 0, 0}, + {0x1c0, 0x1c0, 0x2000, 0x2000, 0, 0, FONT_FAMILY_SANS_SERIF, FONT_STYLE_REGULAR, 0, FONT_LANGUAGE_LATIN, 0, 1, "ltn8.pgf", "FTT-NewRodin Pro Latin", 0, 0}, + {0x1c0, 0x1c0, 0x2000, 0x2000, 0, 0, FONT_FAMILY_SERIF, FONT_STYLE_REGULAR, 0, FONT_LANGUAGE_LATIN, 0, 1, "ltn9.pgf", "FTT-Matisse Pro Latin", 0, 0}, + {0x1c0, 0x1c0, 0x2000, 0x2000, 0, 0, FONT_FAMILY_SANS_SERIF, FONT_STYLE_ITALIC, 0, FONT_LANGUAGE_LATIN, 0, 1, "ltn10.pgf", "FTT-NewRodin Pro Latin", 0, 0}, + {0x1c0, 0x1c0, 0x2000, 0x2000, 0, 0, FONT_FAMILY_SERIF, FONT_STYLE_ITALIC, 0, FONT_LANGUAGE_LATIN, 0, 1, "ltn11.pgf", "FTT-Matisse Pro Latin", 0, 0}, + {0x1c0, 0x1c0, 0x2000, 0x2000, 0, 0, FONT_FAMILY_SANS_SERIF, FONT_STYLE_BOLD, 0, FONT_LANGUAGE_LATIN, 0, 1, "ltn12.pgf", "FTT-NewRodin Pro Latin", 0, 0}, + {0x1c0, 0x1c0, 0x2000, 0x2000, 0, 0, FONT_FAMILY_SERIF, FONT_STYLE_BOLD, 0, FONT_LANGUAGE_LATIN, 0, 1, "ltn13.pgf", "FTT-Matisse Pro Latin", 0, 0}, + {0x1c0, 0x1c0, 0x2000, 0x2000, 0, 0, FONT_FAMILY_SANS_SERIF, FONT_STYLE_BOLD_ITALIC, 0, FONT_LANGUAGE_LATIN, 0, 1, "ltn14.pgf", "FTT-NewRodin Pro Latin", 0, 0}, + {0x1c0, 0x1c0, 0x2000, 0x2000, 0, 0, FONT_FAMILY_SERIF, FONT_STYLE_BOLD_ITALIC, 0, FONT_LANGUAGE_LATIN, 0, 1, "ltn15.pgf", "FTT-Matisse Pro Latin", 0, 0}, + {0x288, 0x288, 0x2000, 0x2000, 0, 0, FONT_FAMILY_SANS_SERIF, FONT_STYLE_REGULAR, 0, FONT_LANGUAGE_KOREAN, 0, 3, "kr0.pgf", "AsiaNHH(512Johab)", 0, 0}, }; -struct FontStyle { - float fontH; - float fontV; - float fontHRes; - float fontVRes; - float fontWeight; - u16 fontFamily; - u16 fontStyle; - // Check. - u16 fontStyleSub; - u16 fontLanguage; - u16 fontRegion; - u16 fontCountry; - char fontName[64]; - char fontFileName[64]; - u32 fontAttributes; - u32 fontExpire; +static const float pointDPI = 72.f; + +class FontLib; + +// TODO: Merge this class with PGF? That'd make it harder to support .bwfon +// fonts though, unless that's added directly to PGF. +class Font { +public: + Font(const u8 *data, size_t dataSize) { + pgf_.ReadPtr(data, dataSize); + style_.fontH = pgf_.header.hSize / 64.0f; + style_.fontV = pgf_.header.vSize / 64.0f; + style_.fontHRes = pgf_.header.hResolution / 64.0f; + style_.fontVRes = pgf_.header.vResolution / 64.0f; + } + + Font(const u8 *data, size_t dataSize, const FontRegistryEntry &entry) { + pgf_.ReadPtr(data, dataSize); + style_.fontH = entry.hSize / 64.f; + style_.fontV = entry.vSize / 64.f; + style_.fontHRes = entry.hResolution / 64.f; + style_.fontVRes = entry.vResolution / 64.f; + style_.fontWeight = (float)entry.weight; + style_.fontFamily = (u16)entry.familyCode; + style_.fontStyle = (u16)entry.style; + style_.fontStyleSub = (u16)entry.styleSub; + style_.fontLanguage = (u16)entry.languageCode; + style_.fontRegion = (u16)entry.regionCode; + style_.fontCountry = (u16)entry.countryCode; + strncpy(style_.fontName, entry.fontName, sizeof(style_.fontName)); + strncpy(style_.fontFileName, entry.fileName, sizeof(style_.fontFileName)); + style_.fontAttributes = entry.extraAttributes; + style_.fontExpire = entry.expireDate; + } + + const PGFFontStyle &GetFontStyle() const { return style_; } + + bool MatchesStyle(const PGFFontStyle &style, bool optimum) const { + // TODO + return true; + } + + PGF *GetPGF() { return &pgf_; } + +private: + PGF pgf_; + PGFFontStyle style_; + DISALLOW_COPY_AND_ASSIGN(Font); }; -struct FontInfo { - // Glyph metrics (in 26.6 signed fixed-point). - u32 maxGlyphWidthI; - u32 maxGlyphHeightI; - u32 maxGlyphAscenderI; - u32 maxGlyphDescenderI; - u32 maxGlyphLeftXI; - u32 maxGlyphBaseYI; - u32 minGlyphCenterXI; - u32 maxGlyphTopYI; - u32 maxGlyphAdvanceXI; - u32 maxGlyphAdvanceYI; - - // Glyph metrics (replicated as float). - float maxGlyphWidthF; - float maxGlyphHeightF; - float maxGlyphAscenderF; - float maxGlyphDescenderF; - float maxGlyphLeftXF; - float maxGlyphBaseYF; - float minGlyphCenterXF; - float maxGlyphTopYF; - float maxGlyphAdvanceXF; - float maxGlyphAdvanceYF; - - // Bitmap dimensions. - short maxGlyphWidth; - short maxGlyphHeight; - u32 charMapLength; // Number of elements in the font's charmap. - u32 shadowMapLength; // Number of elements in the font's shadow charmap. - - // Font style (used by font comparison functions). - FontStyle fontStyle; - - u8 BPP; // Font's BPP. - u8 pad[3]; +class LoadedFont { +public: + LoadedFont(Font *font, FontLib *fontLib, u32 handle) + : font_(font), fontLib_(fontLib), handle_(handle) {} + + Font *GetFont() { return font_; } + FontLib *GetFontLib() { return fontLib_; } + u32 Handle() const { return handle_; } + + bool IsOpen() const { return fontLib_ != 0; } + void Close() { + fontLib_ = 0; + // We keep the rest around until deleted, as some queries are allowed + // on closed fonts (which is rather strange). + } + +private: + FontLib *fontLib_; + Font *font_; + u32 handle_; + DISALLOW_COPY_AND_ASSIGN(LoadedFont); }; -struct CharInfo { - u32 bitmapWidth; - u32 bitmapHeight; - u32 bitmapLeft; - u32 bitmapTop; - // Glyph metrics (in 26.6 signed fixed-point). - u32 spf26Width; - u32 spf26Height; - s32 spf26Ascender; - s32 spf26Descender; - s32 spf26BearingHX; - s32 spf26BearingHY; - s32 spf26BearingVX; - s32 spf26BearingVY; - s32 spf26AdvanceH; - s32 spf26AdvanceV; - u8 pad[4]; +class FontLib; + +class PostAllocCallback : public Action { +public: + PostAllocCallback() {} + static Action *Create() { return new PostAllocCallback(); } + void DoState(PointerWrap &p) { /*TODO*/ p.DoMarker("PostAllocCallback"); } + void run(MipsCall &call); + void SetFontLib(FontLib *fontLib) { fontLib_ = fontLib; } + +private: + FontLib *fontLib_; }; -enum FontPixelFormat { - PSP_FONT_PIXELFORMAT_4 = 0, - PSP_FONT_PIXELFORMAT_4_REV = 1, - PSP_FONT_PIXELFORMAT_8 = 2, - PSP_FONT_PIXELFORMAT_24 = 3, - PSP_FONT_PIXELFORMAT_32 = 4 +class PostOpenCallback : public Action { +public: + PostOpenCallback() {} + static Action *Create() { return new PostOpenCallback(); } + void DoState(PointerWrap &p) { /*TODO*/ p.DoMarker("PostOpenCallback"); } + void run(MipsCall &call); + void SetFontLib(FontLib *fontLib) { fontLib_ = fontLib; } + +private: + FontLib *fontLib_; }; -struct GlyphImage { - FontPixelFormat pixelFormat; - s32 xPos64; - s32 yPos64; - u16 bufWidth; - u16 bufHeight; - u16 bytesPerLine; - u16 pad; - u32 bufferPtr; +// A "fontLib" is a container of loaded fonts. +// One can open either "internal" fonts or custom fonts into a fontlib. +class FontLib { +public: + FontLib(u32 paramPtr) : fontHRes_(128.0f), fontVRes_(128.0f) { + Memory::ReadStruct(paramPtr, ¶ms_); + + // We use the same strange scheme that JPCSP uses. + int allocSize = 4 + 4 * params_.numFonts; + PostAllocCallback *action = (PostAllocCallback*) __KernelCreateAction(actionPostAllocCallback); + action->SetFontLib(this); + u32 args[1] = { allocSize }; + __KernelDirectMipsCall(params_.allocFuncAddr, action, args, 1, false); + } + + void Close() { + __KernelDirectMipsCall(params_.closeFuncAddr, 0, 0, 0, false); + } + + void Done() { + u32 args[1] = { handle_ }; + __KernelDirectMipsCall(params_.freeFuncAddr, 0, args, 1, false); + } + + void AllocDone(u32 allocatedAddr) { + handle_ = allocatedAddr; + fonts_.resize(params_.numFonts); + for (size_t i = 0; i < fonts_.size(); i++) { + u32 addr = allocatedAddr + 4 + i * 4; + Memory::Write_U32(FONT_IS_CLOSED, addr); + fonts_[i] = addr; + } + } + + u32 handle() const { return handle_; } + int numFonts() const { return params_.numFonts; } + + void SetResolution(float hres, float vres) { + fontHRes_ = hres; + fontVRes_ = vres; + } + + float FontHRes() const { return fontHRes_; } + float FontVRes() const { return fontVRes_; } + + void SetAltCharCode(int charCode) { altCharCode_ = charCode; } + + int GetFontHandle(int index) { + return fonts_[index]; + } + + LoadedFont *OpenFont(Font *font) { + int freeFontIndex = -1; + for (size_t i = 0; i < fonts_.size(); i++) { + if (Memory::Read_U32(fonts_[i]) == FONT_IS_CLOSED) { + freeFontIndex = (int)i; + break; + } + } + if (freeFontIndex < 0) { + ERROR_LOG(HLE, "Too many fonts opened in FontLib"); + return 0; + } + LoadedFont *loadedFont = new LoadedFont(font, this, fonts_[freeFontIndex]); + Memory::Write_U32(FONT_IS_OPEN, fonts_[freeFontIndex]); + return loadedFont; + } + + void CloseFont(LoadedFont *font) { + for (size_t i = 0; i < fonts_.size(); i++) { + if (fonts_[i] == font->Handle()) { + Memory::Write_U32(FONT_IS_CLOSED, font->Handle()); + } + } + font->Close(); + } + + void DoState(PointerWrap &p) { + p.Do(fonts_); + p.Do(params_); + p.Do(fontHRes_); + p.Do(fontVRes_); + p.Do(fileFontHandle_); + p.Do(handle_); + p.Do(altCharCode_); + } + + void SetFileFontHandle(u32 handle) { + fileFontHandle_ = handle; + } + + u32 GetAltCharCode() const { return altCharCode_; } + +private: + std::vector fonts_; + + FontNewLibParams params_; + float fontHRes_; + float fontVRes_; + int fileFontHandle_; + int handle_; + int altCharCode_; + DISALLOW_COPY_AND_ASSIGN(FontLib); }; -FontNewLibParams fontLib; -void __FontInit() -{ - memset(&fontLib, 0, sizeof(fontLib)); +// These should not need to be state saved. +static std::vector internalFonts; +// However, these we must save - but we could take a shortcut +// for LoadedFonts that point to internal fonts. +static std::map fontMap; +static std::map fontLibMap; + +void PostAllocCallback::run(MipsCall &call) { + u32 v0 = currentMIPS->r[0]; + fontLib_->AllocDone(call.savedV0); + fontLibMap[fontLib_->handle()] = fontLib_; + call.setReturnValue(fontLib_->handle()); +} + +void PostOpenCallback::run(MipsCall &call) { + fontLib_->SetFileFontHandle(call.savedV0); +} + +FontLib *GetFontLib(u32 handle) { + if (fontLibMap.find(handle) != fontLibMap.end()) { + return fontLibMap[handle]; + } else { + ERROR_LOG(HLE, "No fontlib with handle %08x", handle); + return 0; + } +} + +LoadedFont *GetLoadedFont(u32 handle, bool allowClosed) { + auto iter = fontMap.find(handle); + if (iter != fontMap.end()) { + if (iter->second->IsOpen() || allowClosed) { + return fontMap[handle]; + } else { + ERROR_LOG(HLE, "Font exists but is closed, which was not allowed in this call."); + return 0; + } + } else { + ERROR_LOG(HLE, "No font with handle %08x", handle); + return 0; + } +} + +void __LoadInternalFonts() { + std::string fontPath = "flash0:/font/"; + for (size_t i = 0; i < ARRAY_SIZE(fontRegistry); i++) { + const FontRegistryEntry &entry = fontRegistry[i]; + std::string fontFilename = fontPath + entry.fileName; + PSPFileInfo info = pspFileSystem.GetFileInfo(fontFilename); + if (info.exists) { + u8 *buffer = new u8[(size_t)info.size]; + u32 handle = pspFileSystem.OpenFile(fontFilename, FILEACCESS_READ); + pspFileSystem.ReadFile(handle, buffer, info.size); + pspFileSystem.CloseFile(handle); + + internalFonts.push_back(new Font(buffer, (size_t)info.size, entry)); + + delete [] buffer; + INFO_LOG(HLE, "Loaded font %s", fontFilename.c_str()); + } else { + INFO_LOG(HLE, "Font file not found: %s", fontFilename.c_str()); + } + } +} + +Style FontStyleFromString(const std::string &str) { + if (str == "Regular") + return FONT_STYLE_REGULAR; + else if (str == "Italic") + return FONT_STYLE_ITALIC; + else if (str == "Bold") + return FONT_STYLE_BOLD; + else if (str == "Bold Italic") + return FONT_STYLE_BOLD_ITALIC; + return FONT_STYLE_REGULAR; +} + +Font *GetOptimumFont(const PGFFontStyle &requestedStyle, Font *optimumFont, Font *candidateFont) { + if (!optimumFont) + return candidateFont; + PGFFontStyle optimumStyle = optimumFont->GetFontStyle(); + PGFFontStyle candidateStyle = candidateFont->GetFontStyle(); + + bool testH = requestedStyle.fontH != 0.0f || requestedStyle.fontV == 0.0f; + if (testH && fabsf(requestedStyle.fontH - optimumStyle.fontH) > fabsf(requestedStyle.fontH - candidateStyle.fontH)) { + return candidateFont; + } + + // Check the fontV if it is specified or both fontH and fontV are unspecified + bool testV = requestedStyle.fontV != 0.f || requestedStyle.fontH == 0.f; + if (testV && fabsf(requestedStyle.fontV - optimumStyle.fontV) > fabsf(requestedStyle.fontV - candidateStyle.fontV)) { + return candidateFont; + } + + return optimumFont; +} + +int GetInternalFontIndex(Font *font) { + for (size_t i = 0; i < internalFonts.size(); i++) { + if (internalFonts[i] == font) + return i; + } + return 0; +} + +void __FontInit() { + __LoadInternalFonts(); + actionPostAllocCallback = __KernelRegisterActionType(PostAllocCallback::Create); + actionPostOpenCallback = __KernelRegisterActionType(PostOpenCallback::Create); +} + +void __FontShutdown() { + for (auto iter = fontMap.begin(); iter != fontMap.end(); iter++) { + iter->second->GetFontLib()->CloseFont(iter->second); + } + fontMap.clear(); + for (auto iter = fontLibMap.begin(); iter != fontLibMap.end(); iter++) { + delete iter->second; + } + fontLibMap.clear(); + for (auto iter = internalFonts.begin(); iter != internalFonts.end(); ++iter) { + delete *iter; + } + internalFonts.clear(); } -void __FontDoState(PointerWrap &p) -{ - p.Do(fontLib); +void __FontDoState(PointerWrap &p) { + // TODO: Needs much work. + + p.Do(actionPostAllocCallback); + __KernelRestoreActionType(actionPostAllocCallback, PostAllocCallback::Create); + p.Do(actionPostOpenCallback); + __KernelRestoreActionType(actionPostOpenCallback, PostOpenCallback::Create); p.DoMarker("sceFont"); } -u32 sceFontNewLib(u32 FontNewLibParamsPtr, u32 errorCodePtr) -{ - ERROR_LOG(HLE, "sceFontNewLib %x, %x", FontNewLibParamsPtr, errorCodePtr); +u32 sceFontNewLib(u32 paramPtr, u32 errorCodePtr) { + INFO_LOG(HLE, "sceFontNewLib(%08x, %08x)", paramPtr, errorCodePtr); - if (Memory::IsValidAddress(FontNewLibParamsPtr)&&Memory::IsValidAddress(errorCodePtr)) - { + if (Memory::IsValidAddress(paramPtr) && Memory::IsValidAddress(errorCodePtr)) { Memory::Write_U32(0, errorCodePtr); - Memory::ReadStruct(FontNewLibParamsPtr, &fontLib); + + FontLib *newLib = new FontLib(paramPtr); + // The game should never see this value, the return value is replaced + // by the action. + return 0xDEADDEAD; } - return 1; + return 0; } - -int sceFontDoneLib(u32 FontLibraryHandlePtr) -{ - ERROR_LOG(HLE, "sceFontDoneLib %x", FontLibraryHandlePtr); +int sceFontDoneLib(u32 fontLibHandle) { + INFO_LOG(HLE, "sceFontDoneLib(%08x)", fontLibHandle); + FontLib *fl = GetFontLib(fontLibHandle); + if (fl) { + fl->Done(); + } return 0; } +// Open internal font into a FontLib +u32 sceFontOpen(u32 libHandle, u32 index, u32 mode, u32 errorCodePtr) { + INFO_LOG(HLE, "sceFontOpen(%x, %x, %x, %x)", libHandle, index, mode, errorCodePtr); + if (!Memory::IsValidAddress(errorCodePtr)) { + Memory::Write_U32(ERROR_FONT_INVALID_PARAMETER, errorCodePtr); + return 0; + } -u32 sceFontOpen(u32 libHandle, u32 index, u32 mode, u32 errorCodePtr) -{ - ERROR_LOG(HLE, "sceFontDoneLib %x, %x, %x, %x", libHandle, index, mode, errorCodePtr); - if (Memory::IsValidAddress(errorCodePtr)) - { + FontLib *fontLib = GetFontLib(libHandle); + if (index < 0 || index >= internalFonts.size()) { + Memory::Write_U32(ERROR_FONT_INVALID_PARAMETER, errorCodePtr); + return 0; + } + + LoadedFont *font = fontLib->OpenFont(internalFonts[index]); + if (font) { + fontMap[font->Handle()] = font; Memory::Write_U32(0, errorCodePtr); + return font->Handle(); + } else { + Memory::Write_U32(ERROR_FONT_TOO_MANY_OPEN_FONTS, errorCodePtr); + return 0; } - return 1; } -u32 sceFontOpenUserMemory(u32 libHandle, u32 memoryFontAddrPtr, u32 memoryFontLength, u32 errorCodePtr) -{ +// Open a user font in RAM into a FontLib +u32 sceFontOpenUserMemory(u32 libHandle, u32 memoryFontAddrPtr, u32 memoryFontLength, u32 errorCodePtr) { ERROR_LOG(HLE, "sceFontOpenUserMemory %x, %x, %x, %x", libHandle, memoryFontAddrPtr, memoryFontLength, errorCodePtr); - if (Memory::IsValidAddress(errorCodePtr)) - { + if (!Memory::IsValidAddress(errorCodePtr) || !Memory::IsValidAddress(memoryFontAddrPtr)) { + Memory::Write_U32(ERROR_FONT_INVALID_PARAMETER, errorCodePtr); + return 0; + } + + FontLib *fontLib = GetFontLib(libHandle); + if (!fontLib) { + Memory::Write_U32(ERROR_FONT_INVALID_PARAMETER, errorCodePtr); + return 0; + } + + const u8 *fontData = Memory::GetPointer(memoryFontAddrPtr); + LoadedFont *font = fontLib->OpenFont(new Font(fontData, memoryFontLength)); + if (font) { + fontMap[font->Handle()] = font; Memory::Write_U32(0, errorCodePtr); + return font->Handle(); + } else { + Memory::Write_U32(ERROR_FONT_TOO_MANY_OPEN_FONTS, errorCodePtr); + return 0; } - return 1; } -u32 sceFontOpenUserFile(u32 libHandle, u32 fileNamePtr, u32 mode, u32 errorCodePtr) -{ - ERROR_LOG(HLE, "sceFontOpenUserFile %x, %x, %x, %x", libHandle, fileNamePtr, mode, errorCodePtr); - if (Memory::IsValidAddress(errorCodePtr)) - { +// Open a user font in a file into a FontLib +u32 sceFontOpenUserFile(u32 libHandle, const char *fileName, u32 mode, u32 errorCodePtr) { + ERROR_LOG(HLE, "sceFontOpenUserFile(%08x, %s, %08x, %08x)", libHandle, fileName, mode, errorCodePtr); + if (!Memory::IsValidAddress(errorCodePtr)) + return ERROR_FONT_INVALID_PARAMETER; + + PSPFileInfo info = pspFileSystem.GetFileInfo(fileName); + if (!info.exists) { + Memory::Write_U32(ERROR_FONT_INVALID_PARAMETER, errorCodePtr); + return 0; + } + + FontLib *fontLib = GetFontLib(libHandle); + if (!fontLib) { + Memory::Write_U32(ERROR_FONT_INVALID_PARAMETER, errorCodePtr); + return 0; + } + + u8 *buffer = new u8[(size_t)info.size]; + + u32 fileHandle = pspFileSystem.OpenFile(fileName, FILEACCESS_READ); + pspFileSystem.ReadFile(fileHandle, buffer, info.size); + pspFileSystem.CloseFile(fileHandle); + + LoadedFont *font = fontLib->OpenFont(new Font(buffer, (size_t)info.size)); + if (font) { + fontMap[font->Handle()] = font; Memory::Write_U32(0, errorCodePtr); + return font->Handle(); + } else { + Memory::Write_U32(ERROR_FONT_TOO_MANY_OPEN_FONTS, errorCodePtr); + return 0; } - return 1; } -int sceFontClose(u32 fontHandle) -{ - ERROR_LOG(HLE, "sceFontClose %x", fontHandle); +int sceFontClose(u32 fontHandle) { + INFO_LOG(HLE, "sceFontClose(%x)", fontHandle); + LoadedFont *font = GetLoadedFont(fontHandle, false); + FontLib *fontLib = font->GetFontLib(); + fontLib->CloseFont(font); return 0; } -int sceFontFindOptimumFont(u32 libHandlePtr, u32 fontStylePtr, u32 errorCodePtr) -{ - ERROR_LOG(HLE, "sceFontFindOptimumFont %x, %x, %x", libHandlePtr, fontStylePtr, errorCodePtr); - if (Memory::IsValidAddress(errorCodePtr)) - { +int sceFontFindOptimumFont(u32 libHandlePtr, u32 fontStylePtr, u32 errorCodePtr) { + ERROR_LOG(HLE, "sceFontFindOptimumFont(%08x, %08x, %08x)", libHandlePtr, fontStylePtr, errorCodePtr); + if (!fontStylePtr) + return 0; + + if (!Memory::IsValidAddress(errorCodePtr)) + return SCE_KERNEL_ERROR_INVALID_ARGUMENT; + + PGFFontStyle requestedStyle; + Memory::ReadStruct(fontStylePtr, &requestedStyle); + + Font *optimumFont = 0; + for (size_t i = 0; i < internalFonts.size(); i++) { + if (internalFonts[i]->MatchesStyle(requestedStyle, true)) { + optimumFont = GetOptimumFont(requestedStyle, optimumFont, internalFonts[i]); + } + } + if (optimumFont) { Memory::Write_U32(0, errorCodePtr); + return GetInternalFontIndex(optimumFont); + } else { + Memory::Write_U32(0, errorCodePtr); + return 0; } - return 1; } -int sceFontFindFont(u32 libHandlePtr, u32 fontStylePtr, u32 errorCodePtr) -{ - ERROR_LOG(HLE, "sceFontFindFont %x, %x, %x", libHandlePtr, fontStylePtr, errorCodePtr); - return 1; +// Returns the font index, not handle +int sceFontFindFont(u32 libHandlePtr, u32 fontStylePtr, u32 errorCodePtr) { + ERROR_LOG(HLE, "sceFontFindFont(%x, %x, %x)", libHandlePtr, fontStylePtr, errorCodePtr); + if (!Memory::IsValidAddress(errorCodePtr)) { + Memory::Write_U32(ERROR_FONT_INVALID_PARAMETER, errorCodePtr); + return 0; + } + + PGFFontStyle style; + Memory::ReadStruct(fontStylePtr, &style); + + for (size_t i = 0; i < internalFonts.size(); i++) { + if (internalFonts[i]->MatchesStyle(style, false)) { + Memory::Write_U32(0, errorCodePtr); + return i; + } + } + return -1; } -int sceFontGetFontInfo(u32 fontHandle, u32 fontInfoPtr) -{ - ERROR_LOG(HLE, "sceFontGetFontInfo %x, %x", fontHandle, fontInfoPtr); +int sceFontGetFontInfo(u32 fontHandle, u32 fontInfoPtr) { + ERROR_LOG(HLE, "sceFontGetFontInfo(%x, %x)", fontHandle, fontInfoPtr); - FontInfo fi; + PGFFontInfo fi; memset (&fi, 0, sizeof(fi)); - if (Memory::IsValidAddress(fontInfoPtr)) - { - fi.BPP = 4; - fi.charMapLength = 255; - fi.maxGlyphAdvanceXF = 2.0; - fi.maxGlyphAdvanceXI = 2; - fi.maxGlyphAdvanceYF = 2.0; - fi.maxGlyphAdvanceYI = 32 << 6; - fi.maxGlyphAscenderF = 32 << 6; - fi.maxGlyphAscenderI = 32 << 6; - fi.maxGlyphBaseYF = 0.0; - fi.maxGlyphBaseYI = 0; - fi.maxGlyphDescenderF = 0; - fi.maxGlyphDescenderI = 0; - fi.maxGlyphHeight = 32; - fi.maxGlyphHeightF = 32; - fi.maxGlyphHeightI = 32; - fi.maxGlyphLeftXF = 0; - fi.maxGlyphLeftXI = 0; - fi.maxGlyphTopYF = 0; - fi.maxGlyphTopYI = 0; - fi.maxGlyphWidth = 32; - fi.maxGlyphWidthF = 32; - fi.maxGlyphWidthI = 32; - fi.minGlyphCenterXF = 16; - fi.minGlyphCenterXI = 16; - fi.shadowMapLength = 0; - fi.fontStyle.fontAttributes=1; - fi.fontStyle.fontCountry= 1; - fi.fontStyle.fontExpire= 1; - fi.fontStyle.fontFamily= 1; - strcpy(fi.fontStyle.fontFileName, "asd"); - fi.fontStyle.fontH=32; - fi.fontStyle.fontHRes=32; - fi.fontStyle.fontLanguage=1; - strcpy(fi.fontStyle.fontName, "ppsspp"); - fi.fontStyle.fontRegion=9; - fi.fontStyle.fontV=32; - fi.fontStyle.fontVRes=32; - fi.fontStyle.fontWeight= 32; - Memory::WriteStruct(fontInfoPtr, &fi); - } + if (!Memory::IsValidAddress(fontInfoPtr)) + return 0; + + LoadedFont * font = GetLoadedFont(fontHandle, true); + if (!font) + return 0; + PGF *pgf = font->GetFont()->GetPGF(); + pgf->GetFontInfo(&fi); + fi.fontStyle = font->GetFont()->GetFontStyle(); + Memory::WriteStruct(fontInfoPtr, &fi); return 0; } -int sceFontGetFontInfoByIndexNumber(u32 libHandle, u32 fontInfoPtr, u32 unknown, u32 fontIndex) -{ - ERROR_LOG(HLE, "HACK sceFontGetFontInfoByIndexNumber %x, %x, %x, %x", libHandle, fontInfoPtr, unknown, fontIndex); - // clearly wrong.. - return sceFontGetFontInfo(libHandle, fontInfoPtr); +int sceFontGetFontInfoByIndexNumber(u32 libHandle, u32 fontInfoPtr, u32 unknown, u32 fontIndex) { + ERROR_LOG(HLE, "HACK sceFontGetFontInfoByIndexNumber(%x, %x, %i, %i)", libHandle, fontInfoPtr, unknown, fontIndex); + FontLib *fl = GetFontLib(libHandle); + u32 fontHandle = fl->GetFontHandle(fontIndex); + return sceFontGetFontInfo(fontHandle, fontInfoPtr); +} +int sceFontGetCharInfo(u32 fontHandle, u32 charCode, u32 charInfoPtr) { + INFO_LOG(HLE, "sceFontGetCharInfo(%08x, %i, %08x)", fontHandle, charCode, charInfoPtr); + if (!Memory::IsValidAddress(charInfoPtr)) + return -1; + + PGFCharInfo charInfo; + memset(&charInfo, 0, sizeof(charInfo)); + LoadedFont *font = GetLoadedFont(fontHandle, false); + if (font) { + font->GetFont()->GetPGF()->GetCharInfo(charCode, &charInfo); + } else { + ERROR_LOG(HLE, "sceFontGetCharInfo - invalid font"); + } + Memory::WriteStruct(charInfoPtr, &charInfo); + return 0; } -int sceFontGetCharInfo(u32 fontHandle, u32 charCode, u32 charInfoPtr) -{ - ERROR_LOG(HLE, "HACK sceFontGetCharInfo %x, %x, %x", fontHandle, charCode, charInfoPtr); - if (Memory::IsValidAddress(charInfoPtr)) - { - CharInfo pspCharInfo; - memset(&pspCharInfo, 0, sizeof(pspCharInfo)); - pspCharInfo.bitmapWidth = 16; - pspCharInfo.bitmapHeight = 16; +// Not sure about the arguments. +int sceFontGetShadowInfo(u32 fontHandle, u32 charCode, u32 shadowCharInfoPtr) { + ERROR_LOG(HLE, "UNIMPL sceFontGetShadowInfo(%08x, %i, %08x)", fontHandle, charCode, shadowCharInfoPtr); + // TODO + return 0; +} - pspCharInfo.spf26Width = pspCharInfo.bitmapWidth << 6; - pspCharInfo.spf26Height = pspCharInfo.bitmapHeight << 6; - pspCharInfo.spf26AdvanceH = pspCharInfo.bitmapWidth << 6; - pspCharInfo.spf26AdvanceV = pspCharInfo.bitmapHeight << 6; - Memory::WriteStruct(charInfoPtr, &pspCharInfo); +int sceFontGetCharImageRect(u32 fontHandle, u32 charCode, u32 charRectPtr) { + ERROR_LOG(HLE, "HACK sceFontGetCharImageRect(%08x, %i, %08x) (char: %c)", fontHandle, charCode, charRectPtr, (char)charCode); + if (!Memory::IsValidAddress(charRectPtr)) + return -1; + + PGFCharInfo charInfo; + LoadedFont *font = GetLoadedFont(fontHandle, false); + if (font) { + font->GetFont()->GetPGF()->GetCharInfo(charCode, &charInfo); + Memory::Write_U16(charInfo.bitmapWidth, charRectPtr); // character bitmap width in pixels + Memory::Write_U16(charInfo.bitmapHeight, charRectPtr + 2); // character bitmap height in pixels + } else { + ERROR_LOG(HLE, "sceFontGetCharImageRect - invalid font"); } return 0; } -int sceFontGetCharImageRect(u32 fontHandle, u32 charCode, u32 charRectPtr) -{ - ERROR_LOG(HLE, "HACK sceFontGetCharImageRect %x, %x (%c)", fontHandle, charRectPtr, charCode); - if (Memory::IsValidAddress(charRectPtr)) { - Memory::Write_U16(16, charRectPtr); // character bitmap width in pixels - Memory::Write_U16(16, charRectPtr + 2); // character bitmap height in pixels - } +int sceFontGetShadowImageRect(u32 fontHandle, u32 charCode, u32 charRectPtr) { + ERROR_LOG(HLE, "UNIMPL sceFontGetShadowImageRect()"); return 0; } -int sceFontGetCharGlyphImage(u32 fontHandle, u32 charCode, u32 glyphImagePtr) -{ - ERROR_LOG(HLE, "HACK sceFontGetCharGlyphImage %x, %x, %x (%c)", fontHandle, charCode, glyphImagePtr, charCode); +int sceFontGetCharGlyphImage(u32 fontHandle, u32 charCode, u32 glyphImagePtr) { + ERROR_LOG(HLE, "HACK sceFontGetCharGlyphImage(%x, %x, %x) (char: %c)", fontHandle, charCode, glyphImagePtr, (char)charCode); int pixelFormat = Memory::Read_U32(glyphImagePtr); int xPos64 = Memory::Read_U32(glyphImagePtr+4); @@ -326,74 +690,119 @@ int sceFontGetCharGlyphImage(u32 fontHandle, u32 charCode, u32 glyphImagePtr) int bytesPerLine = Memory::Read_U16(glyphImagePtr+16); int buffer = Memory::Read_U32(glyphImagePtr+20); - // Small chessboard. Does not respect pixelformat currently... + LoadedFont *font = GetLoadedFont(fontHandle, false); + int altCharCode = font->GetFontLib()->GetAltCharCode(); + font->GetFont()->GetPGF()->DrawCharacter(buffer, bytesPerLine, bufWidth, bufHeight, xPos64 >> 6, yPos64 >> 6, 0, 0, 8192, 8192, pixelFormat, charCode, altCharCode, FONT_PGF_CHARGLYPH); + return 0; +} + +int sceFontGetCharGlyphImage_Clip(u32 fontHandle, u32 charCode, u32 glyphImagePtr, int clipXPos, int clipYPos, int clipWidth, int clipHeight) { + ERROR_LOG(HLE, "sceFontGetCharGlyphImage_Clip(%08x, %i, %08x, %i, %i, %i, %i) (%c)", fontHandle, charCode, glyphImagePtr, clipXPos, clipYPos, clipWidth, clipHeight, charCode); - // Actually should be really easy to substitute in a proper font here... - // could even grab pixel data from the PPGe one. - for (int y = 0; y < bufHeight; y++) - { - for (int x = 0; x < bytesPerLine; x++) - { - Memory::Write_U8((((x >> 1) ^ (y >> 1)) & 1) ? 0xff : 0x00, buffer + (y * bytesPerLine + x)); - } - } + int pixelFormat = Memory::Read_U32(glyphImagePtr); + int xPos64 = Memory::Read_U32(glyphImagePtr+4); + int yPos64 = Memory::Read_U32(glyphImagePtr+8); + int bufWidth = Memory::Read_U16(glyphImagePtr+12); + int bufHeight = Memory::Read_U16(glyphImagePtr+14); + int bytesPerLine = Memory::Read_U16(glyphImagePtr+16); + int buffer = Memory::Read_U32(glyphImagePtr+20); + LoadedFont *font = GetLoadedFont(fontHandle, false); + if (!font) { + ERROR_LOG(HLE, "%08x is not a valid font handle!", fontHandle); + return 0; + } + int altCharCode = font->GetFontLib()->GetAltCharCode(); + font->GetFont()->GetPGF()->DrawCharacter(buffer, bytesPerLine, bufWidth, bufHeight, xPos64 >> 6, yPos64 >> 6, clipXPos, clipYPos, clipXPos + clipWidth, clipYPos + clipHeight, pixelFormat, charCode, altCharCode, FONT_PGF_CHARGLYPH); return 0; } -int sceFontGetCharGlyphImage_Clip(u32 libHandler, u32 charCode, u32 glyphImagePtr, int clipXPos, int clipYPos, int clipWidth, int clipHeight) -{ - ERROR_LOG(HLE, "sceFontGetCharGlyphImage_Clip %x, %x, %x (%c)", libHandler, charCode, glyphImagePtr, charCode); - //sceFontGetCharGlyphImage(libHandler, charCode, glyphImagePtr); +int sceFontSetAltCharacterCode(u32 fontLibHandle, u32 charCode) { + INFO_LOG(HLE, "sceFontSetAltCharacterCode(%08x) (%c)", fontLibHandle, charCode); + FontLib *fl = GetFontLib(fontLibHandle); + if (fl) { + fl->SetAltCharCode(charCode); + } return 0; } -int sceFontSetAltCharacterCode(u32 libHandle, u32 charCode) -{ - ERROR_LOG(HLE, "sceFontSetAltCharacterCode %x (%c)", libHandle, charCode); +int sceFontFlush(u32 fontHandle) { + INFO_LOG(HLE, "sceFontFlush(%i)", fontHandle); + // Probably don't need to do anything here. return 0; } -int sceFontFlush(u32 fontHandle) -{ - DEBUG_LOG(HLE, "sceFontFlush(%i)", fontHandle); +// One would think that this should loop through the fonts loaded in the fontLibHandle, +// but it seems not. +int sceFontGetFontList(u32 fontLibHandle, u32 fontStylePtr, u32 numFonts) { + ERROR_LOG(HLE, "sceFontGetFontList(%08x, %08x, %i)", fontLibHandle, fontStylePtr, numFonts); + numFonts = std::min(numFonts, (u32)internalFonts.size()); + for (u32 i = 0; i < numFonts; i++) + { + PGFFontStyle style = internalFonts[i]->GetFontStyle(); + Memory::WriteStruct(fontStylePtr, &style); + fontStylePtr += sizeof(style); + } return 0; } -int sceFontGetFontList(u32 fontLibHandle, u32 fontStylePtr, u32 numFonts) -{ - ERROR_LOG(HLE, "sceFontGetFontList %x, %x, %x", fontLibHandle, fontStylePtr, numFonts); +int sceFontGetNumFontList(u32 fontLibHandle, u32 errorCodePtr) { + INFO_LOG(HLE, "sceFontGetNumFontList(%08x, %08x)", fontLibHandle, errorCodePtr); + if (Memory::IsValidAddress(errorCodePtr)) + Memory::Write_U32(0, errorCodePtr); + return internalFonts.size(); +} - FontStyle style; - memset(&style, 0, sizeof (style)); +int sceFontSetResolution(u32 fontLibHandle, float hRes, float vRes) { + INFO_LOG(HLE, "sceFontSetResolution(%08x, %f, %f)", fontLibHandle, hRes, vRes); + FontLib *fl = GetFontLib(fontLibHandle); + if (fl) { + fl->SetResolution(hRes, vRes); + } + return 0; +} - style.fontH = 20 / 64.f; - style.fontV = 20 / 64.f; - style.fontHRes = 20 / 64.f; - style.fontVRes = 20 / 64.f; - style.fontStyle = 1; - //style.fontFamily +float sceFontPixelToPointH(int fontLibHandle, float fontPixelsH, u32 errorCodePtr) { + INFO_LOG(HLE, "sceFontPixelToPointH(%08x, %f, %08x)", fontLibHandle, fontPixelsH, errorCodePtr); + if (Memory::IsValidAddress(errorCodePtr)) + Memory::Write_U32(0, errorCodePtr); + FontLib *fl = GetFontLib(fontLibHandle); + if (fl) { + return fontPixelsH * pointDPI / fl->FontHRes(); + } + return 0; +} - for (u32 i = 0; i < numFonts; i++) - { - Memory::WriteStruct(fontStylePtr + (sizeof(style)) * i, &style); +float sceFontPixelToPointV(int fontLibHandle, float fontPixelsV, u32 errorCodePtr) { + INFO_LOG(HLE, "UNIMPL sceFontPixelToPointV(%08x, %f, %08x)", fontLibHandle, fontPixelsV, errorCodePtr); + if (Memory::IsValidAddress(errorCodePtr)) + Memory::Write_U32(0, errorCodePtr); + FontLib *fl = GetFontLib(fontLibHandle); + if (fl) { + return fontPixelsV * pointDPI / fl->FontVRes(); } return 0; } -int sceFontGetNumFontList(u32 libHandle, u32 errorCodePtr) -{ - ERROR_LOG(HLE, "UNIMPL sceFontGetNumFontList %x, %x", libHandle, errorCodePtr); +float sceFontPointToPixelH(int fontLibHandle, float fontPointsH, u32 errorCodePtr) { + INFO_LOG(HLE, "UNIMPL sceFontPointToPixelH(%08x, %f, %08x)", fontLibHandle, fontPointsH, errorCodePtr); if (Memory::IsValidAddress(errorCodePtr)) - { Memory::Write_U32(0, errorCodePtr); + FontLib *fl = GetFontLib(fontLibHandle); + if (fl) { + return fontPointsH * fl->FontHRes() / pointDPI; } - return 1; + return 0; } -int sceFontSetResolution(u32 fontLibHandle, float hRes, float vRes) -{ - ERROR_LOG(HLE, "UNIMPL sceFontSetResolution(%i, %f, %f)", fontLibHandle, hRes, vRes); +float sceFontPointToPixelV(int fontLibHandle, float fontPointsV, u32 errorCodePtr) { + INFO_LOG(HLE, "UNIMPL sceFontPointToPixelV(%08x, %f, %08x)", fontLibHandle, fontPointsV, errorCodePtr); + if (Memory::IsValidAddress(errorCodePtr)) + Memory::Write_U32(0, errorCodePtr); + FontLib *fl = GetFontLib(fontLibHandle); + if (fl) { + return fontPointsV * fl->FontVRes() / pointDPI; + } return 0; } @@ -402,10 +811,17 @@ int sceFontCalcMemorySize() { return 0; } +int sceFontGetShadowGlyphImage() { + ERROR_LOG(HLE, "UNIMPL sceFontGetShadowGlyphImage()"); + return 0; +} +int sceFontGetShadowGlyphImage_Clip() { + ERROR_LOG(HLE, "UNIMPL sceFontGetShadowGlyphImage_Clip()"); + return 0; +} -const HLEFunction sceLibFont[] = -{ +const HLEFunction sceLibFont[] = { {0x67f17ed7, WrapU_UU, "sceFontNewLib"}, {0x574b6fbc, WrapI_U, "sceFontDoneLib"}, {0x48293280, WrapI_UFF, "sceFontSetResolution"}, @@ -416,28 +832,27 @@ const HLEFunction sceLibFont[] = {0x2f67356a, WrapI_V, "sceFontCalcMemorySize"}, {0x5333322d, WrapI_UUUU, "sceFontGetFontInfoByIndexNumber"}, {0xa834319d, WrapU_UUUU, "sceFontOpen"}, - {0x57fcb733, WrapU_UUUU, "sceFontOpenUserFile"}, + {0x57fcb733, WrapU_UCUU, "sceFontOpenUserFile"}, {0xbb8e7fe6, WrapU_UUUU, "sceFontOpenUserMemory"}, {0x3aea8cb6, WrapI_U, "sceFontClose"}, {0x0da7535e, WrapI_UU, "sceFontGetFontInfo"}, {0xdcc80c2f, WrapI_UUU, "sceFontGetCharInfo"}, + {0xaa3de7b5, WrapI_UUU, "sceFontGetShadowInfo"}, {0x5c3e4a9e, WrapI_UUU, "sceFontGetCharImageRect"}, + {0x48b06520, WrapI_UUU, "sceFontGetShadowImageRect"}, {0x980f4895, WrapI_UUU, "sceFontGetCharGlyphImage"}, {0xca1e6945, WrapI_UUUIIII, "sceFontGetCharGlyphImage_Clip"}, - {0x74b21701, 0, "sceFontPixelToPointH"}, - {0xf8f0752e, 0, "sceFontPixelToPointV"}, - {0x472694cd, 0, "sceFontPointToPixelH"}, - {0x3c4b7e82, 0, "sceFontPointToPixelV"}, + {0x74b21701, WrapF_IFU, "sceFontPixelToPointH"}, + {0xf8f0752e, WrapF_IFU, "sceFontPixelToPointV"}, + {0x472694cd, WrapF_IFU, "sceFontPointToPixelH"}, + {0x3c4b7e82, WrapF_IFU, "sceFontPointToPixelV"}, {0xee232411, WrapI_UU, "sceFontSetAltCharacterCode"}, - {0xaa3de7b5, 0, "sceFontGetShadowInfo"}, - {0x48b06520, 0, "sceFontGetShadowImageRect"}, - {0x568be516, 0, "sceFontGetShadowGlyphImage"}, - {0x5dcf6858, 0, "sceFontGetShadowGlyphImage_Clip"}, + {0x568be516, WrapI_V, "sceFontGetShadowGlyphImage"}, + {0x5dcf6858, WrapI_V, "sceFontGetShadowGlyphImage_Clip"}, {0x02d7f94b, WrapI_U, "sceFontFlush"}, - }; -void Register_sceFont() -{ + +void Register_sceFont() { RegisterModule("sceLibFont", ARRAY_SIZE(sceLibFont), sceLibFont); } diff --git a/Core/HLE/sceFont.h b/Core/HLE/sceFont.h index 81d095c5bb17..c8b8cf9b079c 100644 --- a/Core/HLE/sceFont.h +++ b/Core/HLE/sceFont.h @@ -5,4 +5,5 @@ class PointerWrap; void Register_sceFont(); void __FontInit(); +void __FontShutdown(); void __FontDoState(PointerWrap &p); diff --git a/Core/HLE/sceIo.cpp b/Core/HLE/sceIo.cpp index b6899606e0aa..3e076e02b8ab 100644 --- a/Core/HLE/sceIo.cpp +++ b/Core/HLE/sceIo.cpp @@ -197,7 +197,7 @@ void __IoInit() { char path_buffer[_MAX_PATH], drive[_MAX_DRIVE] ,dir[_MAX_DIR], file[_MAX_FNAME], ext[_MAX_EXT]; char memstickpath[_MAX_PATH]; - char flashpath[_MAX_PATH]; + char flash0path[_MAX_PATH]; GetModuleFileName(NULL,path_buffer,sizeof(path_buffer)); @@ -210,24 +210,23 @@ void __IoInit() { // Mount a couple of filesystems sprintf(memstickpath, "%s%sMemStick\\", drive, dir); - sprintf(flashpath, "%s%sFlash\\", drive, dir); + sprintf(flash0path, "%s%sflash0\\", drive, dir); #else // TODO std::string memstickpath = g_Config.memCardDirectory; - std::string flashpath = g_Config.flashDirectory; + std::string flash0path = g_Config.flashDirectory; #endif - DirectoryFileSystem *memstick; - DirectoryFileSystem *flash; - memstick = new DirectoryFileSystem(&pspFileSystem, memstickpath); - flash = new DirectoryFileSystem(&pspFileSystem, flashpath); + DirectoryFileSystem *memstick = new DirectoryFileSystem(&pspFileSystem, memstickpath); + DirectoryFileSystem *flash0 = new DirectoryFileSystem(&pspFileSystem, flash0path); + DirectoryFileSystem *flash1 = new DirectoryFileSystem(&pspFileSystem, flash0path); pspFileSystem.Mount("ms0:", memstick); pspFileSystem.Mount("fatms0:", memstick); pspFileSystem.Mount("fatms:", memstick); - pspFileSystem.Mount("flash0:", flash); - pspFileSystem.Mount("flash1:", flash); + pspFileSystem.Mount("flash0:", flash0); + pspFileSystem.Mount("flash1:", flash1); __KernelListenThreadEnd(&TellFsThreadEnded); } diff --git a/Core/HLE/sceKernel.cpp b/Core/HLE/sceKernel.cpp index 0fc342f1c304..3b31b7fbe349 100644 --- a/Core/HLE/sceKernel.cpp +++ b/Core/HLE/sceKernel.cpp @@ -128,6 +128,8 @@ void __KernelShutdown() INFO_LOG(HLE, "Shutting down kernel - %i kernel objects alive", kernelObjects.GetCount()); kernelObjects.Clear(); + __FontShutdown(); + __MpegShutdown(); __PsmfShutdown(); __PPGeShutdown(); diff --git a/Core/Util/BlockAllocator.cpp b/Core/Util/BlockAllocator.cpp index 227d28f1abeb..abd5bf9cf16a 100644 --- a/Core/Util/BlockAllocator.cpp +++ b/Core/Util/BlockAllocator.cpp @@ -1,3 +1,20 @@ +// Copyright (c) 2012- PPSSPP Project. + +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, version 2.0 or later versions. + +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License 2.0 for more details. + +// A copy of the GPL 2.0 should have been included with the program. +// If not, see http://www.gnu.org/licenses/ + +// Official git repository and contact information can be found at +// https://github.com/hrydgard/ppsspp and http://www.ppsspp.org/. + #include "Log.h" #include "BlockAllocator.h" #include "ChunkFile.h" diff --git a/Core/Util/BlockAllocator.h b/Core/Util/BlockAllocator.h index 98cb3e1cd2cd..b385fedcb91d 100644 --- a/Core/Util/BlockAllocator.h +++ b/Core/Util/BlockAllocator.h @@ -1,3 +1,19 @@ +// Copyright (c) 2012- PPSSPP Project. + +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, version 2.0 or later versions. + +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License 2.0 for more details. + +// A copy of the GPL 2.0 should have been included with the program. +// If not, see http://www.gnu.org/licenses/ + +// Official git repository and contact information can be found at +// https://github.com/hrydgard/ppsspp and http://www.ppsspp.org/. #pragma once @@ -9,8 +25,7 @@ class PointerWrap; -// Generic allocator thingy -// Allocates blocks from a range +// Generic allocator thingy. Allocates blocks from a range. class BlockAllocator { diff --git a/Core/Util/Pool.h b/Core/Util/Pool.h deleted file mode 100644 index dee8633c103b..000000000000 --- a/Core/Util/Pool.h +++ /dev/null @@ -1,25 +0,0 @@ -#pragma once - -#include "../../Globals.h" - -// pool allocator -template -class Pool -{ - T pool[size]; - int count; -public: - Pool() - { - Reset(); - } - void Reset() - { - count=0; - } - T* Alloc() - { - _dbg_assert_msg_(CPU,count Date: Wed, 27 Feb 2013 00:59:30 +0100 Subject: [PATCH 198/347] Allow mounting VFS directories. Used to provide flash0 from within APK on Android. --- .gitignore | 1 + Core/FileSystems/DirectoryFileSystem.cpp | 152 ++++++++++++++++++++++- Core/FileSystems/DirectoryFileSystem.h | 38 ++++++ Core/HLE/sceFont.cpp | 34 +++-- Core/HLE/sceIo.cpp | 6 +- android/ab.cmd | 1 + android/ab.sh | 1 + native | 2 +- 8 files changed, 223 insertions(+), 12 deletions(-) diff --git a/.gitignore b/.gitignore index ce3a06d2d19c..86e02e32ae31 100644 --- a/.gitignore +++ b/.gitignore @@ -46,5 +46,6 @@ __testfailure.bmp GameLogNotes.txt android/ui_atlas.zim +android/assets/flash0 ppge_atlas.zim.png local.properties diff --git a/Core/FileSystems/DirectoryFileSystem.cpp b/Core/FileSystems/DirectoryFileSystem.cpp index 00a163fc5c78..6938ed4fe004 100644 --- a/Core/FileSystems/DirectoryFileSystem.cpp +++ b/Core/FileSystems/DirectoryFileSystem.cpp @@ -18,7 +18,7 @@ #include "ChunkFile.h" #include "FileUtil.h" #include "DirectoryFileSystem.h" - +#include "file/zip_read.h" #ifdef _WIN32 #include @@ -595,3 +595,153 @@ void DirectoryFileSystem::DoState(PointerWrap &p) { ERROR_LOG(FILESYS, "FIXME: Open files during savestate, could go badly."); } } + + +VFSFileSystem::VFSFileSystem(IHandleAllocator *_hAlloc, std::string _basePath) : basePath(_basePath) { + INFO_LOG(HLE, "Creating VFS file system"); + hAlloc = _hAlloc; +} + +VFSFileSystem::~VFSFileSystem() { + for (auto iter = entries.begin(); iter != entries.end(); ++iter) { + delete [] iter->second.fileData; + } + entries.clear(); +} + +std::string VFSFileSystem::GetLocalPath(std::string localPath) { + return basePath + localPath; +} + +bool VFSFileSystem::MkDir(const std::string &dirname) { + // NOT SUPPORTED - READ ONLY + return false; +} + +bool VFSFileSystem::RmDir(const std::string &dirname) { + // NOT SUPPORTED - READ ONLY + return false; +} + +bool VFSFileSystem::RenameFile(const std::string &from, const std::string &to) { + // NOT SUPPORTED - READ ONLY + return false; +} + +bool VFSFileSystem::RemoveFile(const std::string &filename) { + // NOT SUPPORTED - READ ONLY + return false; +} + +u32 VFSFileSystem::OpenFile(std::string filename, FileAccess access) { + if (access != FILEACCESS_READ) { + ERROR_LOG(HLE, "VFSFileSystem only supports plain reading"); + return 0; + } + + std::string fullName = GetLocalPath(filename); + const char *fullNameC = fullName.c_str(); + INFO_LOG(HLE,"VFSFileSystem actually opening %s (%s)", fullNameC, filename.c_str()); + + size_t size; + u8 *data = VFSReadFile(fullNameC, &size); + if (!data) { + ERROR_LOG(HLE, "VFSFileSystem failed to open %s", filename.c_str()); + return 0; + } + + OpenFileEntry entry; + entry.fileData = data; + entry.size = size; + entry.seekPos = 0; + u32 newHandle = hAlloc->GetNewHandle(); + entries[newHandle] = entry; + return newHandle; +} + +PSPFileInfo VFSFileSystem::GetFileInfo(std::string filename) { + PSPFileInfo x; + x.name = filename; + + std::string fullName = GetLocalPath(filename); + INFO_LOG(HLE,"Getting VFS file info %s (%s)", fullName.c_str(), filename.c_str()); + FileInfo fo; + VFSGetFileInfo(fullName.c_str(), &fo); + x.exists = fo.exists; + if (x.exists) { + x.size = fo.size; + x.type = fo.isDirectory ? FILETYPE_DIRECTORY : FILETYPE_NORMAL; + } + INFO_LOG(HLE,"Got VFS file info: size = %i", (int)x.size); + return x; +} + +void VFSFileSystem::CloseFile(u32 handle) { + EntryMap::iterator iter = entries.find(handle); + if (iter != entries.end()) { + delete [] iter->second.fileData; + entries.erase(iter); + } else { + //This shouldn't happen... + ERROR_LOG(HLE,"Cannot close file that hasn't been opened: %08x", handle); + } +} + +bool VFSFileSystem::OwnsHandle(u32 handle) { + EntryMap::iterator iter = entries.find(handle); + return (iter != entries.end()); +} + +size_t VFSFileSystem::ReadFile(u32 handle, u8 *pointer, s64 size) { + INFO_LOG(HLE,"VFSFileSystem::ReadFile %08x %p %i", handle, pointer, (u32)size); + EntryMap::iterator iter = entries.find(handle); + if (iter != entries.end()) + { + size_t bytesRead = size; + memcpy(pointer, iter->second.fileData + iter->second.seekPos, size); + iter->second.seekPos += size; + return bytesRead; + } else { + ERROR_LOG(HLE,"Cannot read file that hasn't been opened: %08x", handle); + return 0; + } +} + +size_t VFSFileSystem::WriteFile(u32 handle, const u8 *pointer, s64 size) { + // NOT SUPPORTED - READ ONLY + return 0; +} + +size_t VFSFileSystem::SeekFile(u32 handle, s32 position, FileMove type) { + EntryMap::iterator iter = entries.find(handle); + if (iter != entries.end()) { + switch (type) { + case FILEMOVE_BEGIN: iter->second.seekPos = position; break; + case FILEMOVE_CURRENT: iter->second.seekPos += position; break; + case FILEMOVE_END: iter->second.seekPos = iter->second.size + position; break; + } + return iter->second.seekPos; + } else { + //This shouldn't happen... + ERROR_LOG(HLE,"Cannot seek in file that hasn't been opened: %08x", handle); + return 0; + } +} + + +bool VFSFileSystem::GetHostPath(const std::string &inpath, std::string &outpath) { + // NOT SUPPORTED + return false; +} + +std::vector VFSFileSystem::GetDirListing(std::string path) { + std::vector myVector; + // TODO + return myVector; +} + +void VFSFileSystem::DoState(PointerWrap &p) { + if (!entries.empty()) { + ERROR_LOG(FILESYS, "FIXME: Open files during savestate, could go badly."); + } +} diff --git a/Core/FileSystems/DirectoryFileSystem.h b/Core/FileSystems/DirectoryFileSystem.h index 61ee605406f2..1ee0ac474a6d 100644 --- a/Core/FileSystems/DirectoryFileSystem.h +++ b/Core/FileSystems/DirectoryFileSystem.h @@ -95,3 +95,41 @@ class DirectoryFileSystem : public IFileSystem { bool FixPathCase(std::string &path, FixPathCaseBehavior behavior); #endif }; + +// VFSFileSystem: Ability to map in Android APK paths as well! Does not support all features, only meant for fonts. +// Very inefficient - always load the whole file on open. +class VFSFileSystem : public IFileSystem { +public: + VFSFileSystem(IHandleAllocator *_hAlloc, std::string _basePath); + ~VFSFileSystem(); + + void DoState(PointerWrap &p); + std::vector GetDirListing(std::string path); + u32 OpenFile(std::string filename, FileAccess access); + void CloseFile(u32 handle); + size_t ReadFile(u32 handle, u8 *pointer, s64 size); + size_t WriteFile(u32 handle, const u8 *pointer, s64 size); + size_t SeekFile(u32 handle, s32 position, FileMove type); + PSPFileInfo GetFileInfo(std::string filename); + bool OwnsHandle(u32 handle); + + bool MkDir(const std::string &dirname); + bool RmDir(const std::string &dirname); + bool RenameFile(const std::string &from, const std::string &to); + bool RemoveFile(const std::string &filename); + bool GetHostPath(const std::string &inpath, std::string &outpath); + +private: + struct OpenFileEntry { + u8 *fileData; + size_t size; + size_t seekPos; + }; + + typedef std::map EntryMap; + EntryMap entries; + std::string basePath; + IHandleAllocator *hAlloc; + + std::string GetLocalPath(std::string localpath); +}; diff --git a/Core/HLE/sceFont.cpp b/Core/HLE/sceFont.cpp index c33032a3a0e0..f9ccf1d3d8e7 100644 --- a/Core/HLE/sceFont.cpp +++ b/Core/HLE/sceFont.cpp @@ -178,6 +178,13 @@ class LoadedFont { class FontLib; +// These should not need to be state saved. +static std::vector internalFonts; +// However, these we must save - but we could take a shortcut +// for LoadedFonts that point to internal fonts. +static std::map fontMap; +static std::map fontLibMap; + class PostAllocCallback : public Action { public: PostAllocCallback() {} @@ -222,8 +229,17 @@ class FontLib { } void Done() { + for (size_t i = 0; i < fonts_.size(); i++) { + if (Memory::Read_U32(fonts_[i]) == FONT_IS_OPEN) { + fontMap[fonts_[i]]->Close(); + delete fontMap[fonts_[i]]; + fontMap.erase(fonts_[i]); + } + } u32 args[1] = { handle_ }; __KernelDirectMipsCall(params_.freeFuncAddr, 0, args, 1, false); + handle_ = 0; + fonts_.clear(); } void AllocDone(u32 allocatedAddr) { @@ -274,6 +290,7 @@ class FontLib { for (size_t i = 0; i < fonts_.size(); i++) { if (fonts_[i] == font->Handle()) { Memory::Write_U32(FONT_IS_CLOSED, font->Handle()); + } } font->Close(); @@ -296,7 +313,7 @@ class FontLib { u32 GetAltCharCode() const { return altCharCode_; } private: - std::vector fonts_; + std::vector fonts_; FontNewLibParams params_; float fontHRes_; @@ -308,18 +325,13 @@ class FontLib { }; -// These should not need to be state saved. -static std::vector internalFonts; -// However, these we must save - but we could take a shortcut -// for LoadedFonts that point to internal fonts. -static std::map fontMap; -static std::map fontLibMap; - void PostAllocCallback::run(MipsCall &call) { + INFO_LOG(HLE, "Entering PostAllocCallback::run"); u32 v0 = currentMIPS->r[0]; fontLib_->AllocDone(call.savedV0); fontLibMap[fontLib_->handle()] = fontLib_; call.setReturnValue(fontLib_->handle()); + INFO_LOG(HLE, "Leaving PostAllocCallback::run"); } void PostOpenCallback::run(MipsCall &call) { @@ -357,8 +369,14 @@ void __LoadInternalFonts() { std::string fontFilename = fontPath + entry.fileName; PSPFileInfo info = pspFileSystem.GetFileInfo(fontFilename); if (info.exists) { + INFO_LOG(HLE, "Loading font %s (%i bytes)", fontFilename.c_str(), (int)info.size); u8 *buffer = new u8[(size_t)info.size]; u32 handle = pspFileSystem.OpenFile(fontFilename, FILEACCESS_READ); + if (!handle) { + ERROR_LOG(HLE, "Failed opening font"); + delete [] buffer; + continue; + } pspFileSystem.ReadFile(handle, buffer, info.size); pspFileSystem.CloseFile(handle); diff --git a/Core/HLE/sceIo.cpp b/Core/HLE/sceIo.cpp index 3e076e02b8ab..d1003f5db130 100644 --- a/Core/HLE/sceIo.cpp +++ b/Core/HLE/sceIo.cpp @@ -220,13 +220,15 @@ void __IoInit() { DirectoryFileSystem *memstick = new DirectoryFileSystem(&pspFileSystem, memstickpath); +#ifdef ANDROID + VFSFileSystem *flash0 = new VFSFileSystem(&pspFileSystem, "flash0"); +#else DirectoryFileSystem *flash0 = new DirectoryFileSystem(&pspFileSystem, flash0path); - DirectoryFileSystem *flash1 = new DirectoryFileSystem(&pspFileSystem, flash0path); +#endif pspFileSystem.Mount("ms0:", memstick); pspFileSystem.Mount("fatms0:", memstick); pspFileSystem.Mount("fatms:", memstick); pspFileSystem.Mount("flash0:", flash0); - pspFileSystem.Mount("flash1:", flash1); __KernelListenThreadEnd(&TellFsThreadEnded); } diff --git a/android/ab.cmd b/android/ab.cmd index a3ca5c5b51da..36eecad80298 100644 --- a/android/ab.cmd +++ b/android/ab.cmd @@ -1,3 +1,4 @@ +xcopy ..\flash0 assets\flash0 /s /y SET NDK=C:\AndroidNDK SET NDK_MODULE_PATH=..;..\native\ext REM Need to force target-platform to android-9 to get access to OpenSL headers. diff --git a/android/ab.sh b/android/ab.sh index 6190b3e541de..cf79aab3bcf8 100755 --- a/android/ab.sh +++ b/android/ab.sh @@ -1 +1,2 @@ +cp -r ../flash0 assets NDK_MODULE_PATH=..:../native/ext $NDK/ndk-build -j3 TARGET_PLATFORM=android-9 $* diff --git a/native b/native index 17c8eb1ae7ca..3f6353af5afe 160000 --- a/native +++ b/native @@ -1 +1 @@ -Subproject commit 17c8eb1ae7ca285a4228bac56059ca441b53ba6f +Subproject commit 3f6353af5afe1542a50c33eb0bb554ea25653258 From 1429d0206ac152fe4c77936f57016c9279467b12 Mon Sep 17 00:00:00 2001 From: Henrik Rydgard Date: Wed, 27 Feb 2013 01:00:35 +0100 Subject: [PATCH 199/347] Add JPCSP's free font files. --- flash0/font/jpn0.pgf | Bin 0 -> 1428860 bytes flash0/font/kr0.pgf | Bin 0 -> 883164 bytes flash0/font/ltn0.pgf | Bin 0 -> 67660 bytes flash0/font/ltn1.pgf | Bin 0 -> 63504 bytes flash0/font/ltn10.pgf | Bin 0 -> 55788 bytes flash0/font/ltn11.pgf | Bin 0 -> 54572 bytes flash0/font/ltn12.pgf | Bin 0 -> 58352 bytes flash0/font/ltn13.pgf | Bin 0 -> 57660 bytes flash0/font/ltn14.pgf | Bin 0 -> 63388 bytes flash0/font/ltn15.pgf | Bin 0 -> 62364 bytes flash0/font/ltn2.pgf | Bin 0 -> 76692 bytes flash0/font/ltn3.pgf | Bin 0 -> 71900 bytes flash0/font/ltn4.pgf | Bin 0 -> 78920 bytes flash0/font/ltn5.pgf | Bin 0 -> 76216 bytes flash0/font/ltn6.pgf | Bin 0 -> 88716 bytes flash0/font/ltn7.pgf | Bin 0 -> 84860 bytes flash0/font/ltn8.pgf | Bin 0 -> 51432 bytes flash0/font/ltn9.pgf | Bin 0 -> 50116 bytes 18 files changed, 0 insertions(+), 0 deletions(-) create mode 100644 flash0/font/jpn0.pgf create mode 100644 flash0/font/kr0.pgf create mode 100644 flash0/font/ltn0.pgf create mode 100644 flash0/font/ltn1.pgf create mode 100644 flash0/font/ltn10.pgf create mode 100644 flash0/font/ltn11.pgf create mode 100644 flash0/font/ltn12.pgf create mode 100644 flash0/font/ltn13.pgf create mode 100644 flash0/font/ltn14.pgf create mode 100644 flash0/font/ltn15.pgf create mode 100644 flash0/font/ltn2.pgf create mode 100644 flash0/font/ltn3.pgf create mode 100644 flash0/font/ltn4.pgf create mode 100644 flash0/font/ltn5.pgf create mode 100644 flash0/font/ltn6.pgf create mode 100644 flash0/font/ltn7.pgf create mode 100644 flash0/font/ltn8.pgf create mode 100644 flash0/font/ltn9.pgf diff --git a/flash0/font/jpn0.pgf b/flash0/font/jpn0.pgf new file mode 100644 index 0000000000000000000000000000000000000000..913bd73b114cdd37499e776340dccf7f057796ae GIT binary patch literal 1428860 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

1w9az+KE5WYx64}_Ure{sTHOX)JGU(sIfrwbJ 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�mok$^yw#NjBHN#Vpmu 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�C$TIa}>xT;m_jwsdSS)db?j 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

t<;A0bgymtwggXo&A{Avv-0~9KJ`a0bVQBHiI zYp)HZ03xHHV+JzfRPKux;7p92e{rK$?=Iz-(_1$}Fh1QsTiR-Bm^8RRTkT0h^c?h( zzHM5Uh0gk=ZR2-3<%x0jkGH;Lf4^Z<9`qXPi?SWdr!bX9;QaDQd&n$MCQkw?g;P(aOwvtTYzy03ju)7n`9&pFkd>2^FOTswYBzfl5N) zkCbw*?XN;%6mk}|uO0I}DdwzqK3Rog&Ydyh_1D#ou2?de4|#u{D+*3xp>e_&xhx`} zV|Zocxaqn`HfH*>FRvP(VoTZe(UE)o%i#F_|VSJu6*{Z5lqbdU2pAuYB&>_`0S+fGl#R06Nf8DLG>e~ zDQAR@0DVwWlgAJ2ExK_Hl)lUyQO823`4S!y2aW1`72q-%f&jRvRqg~FlZSLX35uVS z>sz&fdd(tj*9PaF>I>2!zTABYO6R64*hhX$9 z1r~XL_80S?B$GpGa4L>fl0zF7NO6Yt8sx-x*Mdj|x{-Ao9{HfxLNUyf2V<8LUxbY* zN&+U^QD2}vcW3Ra6wLh7#Y2VJVp$O+^8E<)1&i~lg}foZNUVmsi1!4PJu{&Rco zfiCwypmb?F+#2(sLHok<`@{b~ouNS}^V`}2qvQQC95V}}(1{qm4%Bgu(=-9D z9VNQAK!KYQsEc$CILMTbu8F}0R)@?GKQz>$Q9_=e(M`z^vm-51Scic82>rMY5sTe@ z_O3H;Ciy&!nNZ@%AR+7v%{hm-i?U{n_?H4bo_`a(1oA57n+-_eE_+}q{-2{}nBb`3 z;*Yu7mxXxDTp(W6U5}PWI(}TnRw8-FP`$r_9aHs3+MBPV_WUMdD=M|mR^6i-p{zlr zsahXtMR}hZI*SL9mUK2Km-)sBW8SQ#O~UZpTFV>3N5q8G8viMG$w4fJZBDUGYXOL^ux z6w~SNIcNZ{a`n(T&p_^LtJYPx(+rpxx~HL7a~Pi;wlU9M(T{*nZzU?RVV*}cf1jQ> zY5wQLHUgYmIBq>Sg^!alAn`CIui9)ke$qI(@D&U4Dresj4#RL zTFNZuZ3&XuRY5oX%vHOyc?$tdG?+I+d9iJ&M+hfuAm+?g6}qM(-m6G#f7*3Ok>0Qz zG^<=CH2;S5zS{2cIwSjiO#LWn>cM`F(IGt+JuwI}6BP$;l>aeRfd43V88y%gEhFd3oz9anZ*6rin#{)jxwjv6rR zD{4#-Y9WV{4XzG08Hbo;gZPh}@b>0rM9|hpgUp$!spi#pr;A^r{Mjh5A}+Bt8rMoX z$ZE0^T!}EQ5v$`TDho-S5ZIAZOu(0NP(EQt|0b=yqY|STb~XXBOA?m?T37P#;~8`2 zi;bPbigiL$z^Xz`0(2VL>IUEY|EEFKEN-wmktfjZ{&-liI|o{w;W^BnLgKfaB5vds zy*~K5{#?uASq4B_JMP!*7TDPT;#BB5#O7>tlajx`1_tVG zbbDJq#+228qAs;{kB8sW_8_^R^zbT!_*)H*l`cia5T4)(#e@fk|8oe}C@nC$cC-Ra z(-0#u93CYAEvZ+uS^)j!agNpWZqz%<+&=HHQ9=|1L=XT~PXaQEyo$OmO48&O;?f2Sd?CgY*j$TSR4oRlP4rYs7a6W1&+S)NZy2XYk3NdK*H~OA-oCl<& zu^w(1rH4I=(VciTT6)>Fms8B4uW!`a7XZcg%@n_hw82@X*X!shC)9_C_qT}2;yWSi ztH_)N$l9~B8MM}4x=Fg;ARC$6I#13fekZ5Qn50Nv;CT64PxA`ciq+R!w!T85?kEsM zcbkxe#bl`BH;}|A6CLFX?1bm7tnFA!9fV?qW4@P4%0<3|sOMdG;iFc+tCEpC$R!Hu z1=uLFUe{ZnwrR2hPr0TrjYIvoK;~4ey8Vj7;FztYqH9o$;0#X)Y&p+Mn}gf+(sJ)h zgDS)JX=v_M#zu3@*biC?^^PwVbM&lPnS{6?ggpj@H62bKG%dimvVi>1lZ()8ku&1j#_x)uGh%0i0 z^OV58AA2c*q`1l1O;l80PXwY1eG9BJiBOKmeU5>c^9p~2fH*~N>mJg(A*fkS0osS@ zVqv`dth_%qxJm8$!qdKe&>(OEei~cK*eH&f8oDQUNbopJ3BY_J-U6!SL+ofcyp+6y zN}JGTNH#N! zWQ;8wGCn-e6bK&(owFizs!RTuLa}JG@wEE(wruguL4)2RI9um{p2g5z90QWU161Jg zLY$<7DARXrivkEsHI*2(&cm2;5}YljykMH6yBiF)vc9SS^XVL2bOaDWx8Zo6C7 zw=Yl*^cKlFnL6uHeJ&X%I_sO+2B`rJdr2M-r#(}Lxn=@>X6KpOG93*F_tsiKxT{HG z$Ikzl>o)4e7srCnbh40#X3ZVJ@dk{A#&t9*bdJlP*1D5Ie`CI3*k}RE;ZWT@UBQ zFs2_GNIcBOz0O4-qe)9FU{ZL1v3rNxLuej{m-=|eZwh`AVY=1VOVoO#Z0dwTrz=*O;hH?ib8g}czq-`I`NAsVGScH z;{^ObfqGK~p~ixAX{$vLFlZVvY(7RG5~#fm0xSe_){jdDKF2qbdb)@K^+%j% z5k6G|M+xZ#3~;NIzy=gfXys;$D@eeFIDMAHRgUXRVPp492Vd$H<~6Eg0?^<3*>+QY za&-^W6>0s_;8U8eB&bXE_Zm9ZU-8^$-={uG@0w`sIpB;1E?Jso6C7qmRg$0-dhhbg zl8-KXR2}K!6h~_tXcR2oB|U3WR$P;`b2aXiX_L+(aAIvlDpx+8o7iY8wO1<>$qm}&=|#M*>9S4YTo5W8~} zj(rc<=^9aC8dl(1t<1<$9FJ2})+vq~Agss6ZRe$Vj_zd_R5Pg!udAi>U{c<>dDCem z7Ijx%gASej<)%nS$84r=#MhphNc*?`@m9lK;VXAaFWWcTW*9C|b***uR)Yl61f}zE zf#Fu6tf7j{KpJacbzU$<{QG#ZVTKDnBd}fHyk8L@DEH=S7BSnAj{Pt{ahZcQlXxP* zQuDE<4sFGp+~MYe6*aoHI}bNFqTqpeuyHUoD{8V_o*gxYwmU32#vz>(3__yz{US%N z1Rp(VACoi9-pQI=tC)`lUmq!%)UDZ6Y%&{ozU>{b$7{Qr=izsM4}S?7db30R5-z0) zU0-Y~%noz>%TKH%9REaDPgzK(hthfBfvj>k)nAn8(6BoHmE7gTTUKW|eJ3yp(_lbT z{kP=K5oqp1;F1EPG5kD*AWYa4Z$r#0F{ z*LjftorL^vChO+TQ2$P?{f_Y1G7Esa^ntG1NpKfjU}y-If_c=sCEuYv#+hKp-(t<@ z&2(%PWkz2WsMXCBf2Blbuv|B#IPS`f=l)7%ETYcEqB`1;?cRW-o_@ld^B@bq%Fr%= zgaMi%2z8utd*9YP@lT}t4B8l;m;OjFT};o3UlWcvoXr{i+ru1jJrt4HNH!}{?42sU zztDQnYEs7B&R}JQyz`p#IcVUvSov!Kjpdp+wpz|^c+vGM3O;oK2gu8qZ^+G0-=41* zKP_JMdH+6NchhiaCJW>@ucrR7m550YVom6$Gj2be5(j=+OUI%Et%m!^bKI~JNR)0( zrJn!%vH|sll?P;o@{I0PPq5zfF#T&pL6JH7Y=0Kj!@T@S z$JN^M2CJd>;3Sf~9?ckrvkeymFH87Jr4HouD$+mUACWxILHLVrAoXZH)J`O{26ocs z3bL&*Gfq5frioNsATQzFhi}5)1||>=zJ)SuTw5RnEX}lECZTwQ>c`l8EZ9#bX6vxd z(fD*Ol}ld(5vxU!rE^U{UBFrdo_{WrK)~)W$MK;SV0sT2rlUbsV3QF2eMoV1bVhT^ zq}MoRCY2d4Jz;b*0##xN0foH_{ZGPZKpE&uiQ3SSKvbl7XDTr>x|^dynknvc_2bDo z4xu1a6R|g;>2agL2>O7D`8W|(e)m&@{tJB+w(yMYGcj&4`oJko;yFSJ?@;D;)4HzJ z+8xMg?bv}Q(uLhz%2aWPryvmeI1(yR%X;UK{Taat(n|uh@5xdo89{X40#JevHa&ya z6f6;0#d>RkL?3RRE}o496cS`AlbMem=^BBW6bV`?)-VsW;8>p8Kw^u|esC!`M)yx51?w?k)jHNc`s()m)M~ zsMzZCz)*clS|}k)R$yXtXJypQDB*p+12A^&GU}v&O)tG+Rn=0+btJxIQ0-i=CCZi7 zTImhvI2ctC@}t7PJSMzbl3yvwF><==m!dGi^(~q3UC_R(Fro&9d@@sUpA^4%z&AMq z7ccjf`N5tZO$V{nIettGH`Mc?rm2$k=juo1x%HiH>H;56=U7BrI*Q+3NU8(sl^0Z_ z1_10*d`^AkUn9_iRWf}%39GcqV_^e_=J|u+STm0> z;&1MQwm~<=wN$+X#=-I=uo1mPl5k;&$3Xx0Y~WnU!5LOhYMmyc+q*q5-s;oy*A74} zWsgN&rSI2!8X)#|>Jw@-KC!&JmT(l#zXrtielC~E=j({LMfm%O)|cK4hi<4>alC=N zUM4up09Uv+l;aMD;1rnzA=SM(>%i z&>&b_yi>hP8oUu}h+*Kx;}THS&OjdELYNmVcwLuwZNM8Lwd!6W{y^AnqLX5{B%V#S zh*}=W{!lkT@#QFSCNIT9^a@(ZrjS~S?MBBsCYgsm_1>vwUuQ&SN8VIYc!WQt)shoT zcqhIjb3B`Df^$tJsle_?Qk7pRZvwxg17)14j9e(IR9D{b{UzDYzTW&Cek&^~Fvjs! zCU<#}Vm-Y*gr%N57|KIq;vQcVJ0KKq-O}+XRbIo( zlcl(`s=EN7PF=vIY|}N2*IH2L!;p__Vtgz@FsBc5-)7T8ka=YxPd$KvaV$ zYtx}k5OiZJ993r(l4I!Z`yjpn%9bLau-zUApVGBfAuxe8_I?R9RsxUuy3bJM1ONX} ze_+;+;hJ9{bRq=g4T#F8feh!Qo!wB|;+;r(CL#ZC5b}4J0ES$RaQ;PFCk*MNoXKED zfrn4~S`gVc%436w?JJh}qZN?Zx!>@RLjZV_&}y3Cr7smbOUdhxPhsBp4e1;3LDq*k zc`-$q9BToNkN6e=@}RyyP{mpynPL0W!^+e*bPLOG^9jriGg zJl6zO$GiRWq?dR{U$TPV`S#2HNzw@G)0;o+cY6+YkCu4rKi_z&=zco2q^VoEfnVY% ztEV$Z+H|&9wkA@%GFs9BoP6_<#wo}@iPF-a(~n8;ej{Du74Gg9j!s_C27v0f|LL<0 z`3KV0?h@Ml*20GjSS?czSm91lp5uL%N zZ+G!TxO%lRYl=i3~^M5!O1+4TpIkpZcu2J1dc)-XTeL(X4Z%tMgX+Z;8lJj@^ z!kWBX@f&rX@E41HNb#dkf7c7|$9f+nkj7s5a(r_XmIR4EAQ+n>Lw)%a-xF<}f?kb@ zw|OMw_9KL0d>d-In7bhI<^PFE&g0McyI{-_XYKvc)EJdCP(zDM#}O?$v;rq}jaKJ04{?1Fb=5rqR7o z*NARC8kb@R8Ve~jsvpbq4MdDW`CgY!+DT6KJp2)plH_Cq?Tr01r&!rv$|;sT#t~JA zN-N3i^gm@^E~L2TDKq14#!~4$D{L}XNoR~!7&&hVL z=IF(ze>GkF5Xom>Iyr9WEA%e(C*TqGR)Q4`E6hd)9>=ala4)q85-+X4D=Xt|Eam9AD{ zS&!Ib;H7h|5x$7Y5_5alMdq{V{ZKaED&hWAl75XfBE%!7csi1+pY3XapQ0R)`6arh zfpU}=BBpMxV>P@W4N{@U8d|oRguG!b>t@Xud`L=vakrV?OFI#fBd!t2Mpza4K*&=9 zpFg}uoUH%nn`?+HBcO;us2@P?OPJGvd_v{gQ()oD@LXOvE5sDm(I$_e%qp_JJNwz+ zokn$pLX&$PQ$xIt|9*49Jkf((#fxXDnnbDC;8f?*`}oa{iFr^Ia>pvxBpZ)5xfdx` zwU4l$@~2d%{0Zb!xv@F3W$lYnam)5XU^-)`?~HNJRlLc6u+VW*V9lQUiad}Ai=1$1FR-n*2 zLOTC(4BmCJ^t#cS(tXrl#|>LhTfgG1P1cIFMH=Renwgd<(UqCZ>SQXT6xMmp64%#M z=>!D9KBlXlmP&(Lw63C^Bq+F#V1EA@W1@Bwf)r{Bz%f!wliC7QlVOFll$Vy~Vu3=( z3bzN|!GDUJDCJu~t-8F6nFhw}Y6Fuw+kOwe^qp}C!r8iz$?{;XtxYT7t6;Q`vU?Qc zMgKfpP0l>zRe}Ti9P%XI3*(P7h=0IjzU~@BM}1H$&V-t}G@^m^4u`$wX>cy(KFocu8qV>B8^NE!7S`yO5-7s^>m+^Q+0jBeEGEP zgDoRzjUR=|fJGzQsv^WQ9l$7afCE(YZ#3GwDhvOef3ZruzB%8aKgeZmGFHo4AwT_e z;JPM1x8;5$8T0}IVlDU?vJf8?ofw)XWKBqo9utP#&ZDlas*$>Q?yjo! zb{nQuPtm{Q-L za3$KSJjTeQh5G&1AL$zB@KT;r+In>$LG)^DEw%O3iDlK_j1fknxW+Tq^BobL%L73A z;X)?Au0PHg%^;;e;z zgL`gUeI;}0wcuSKe{`tK)OjF5iVULJgFSwvWL~Ae*9m{xXX-mpZMMP&m?NJWZ@pEn z>TEB!SgpCj-4j5S#zB~wS_UF>Tz{k}r@zsEq}JBX6t~=)DE1bK+IdnDNh-5iL%I)# zL-;AC)byTBMztGcl8}oype>PjW}{l|p9sx_4T*Y-h)@LIrs^Il!(Z!_n)oL8UZfQf z^1=X8ORc@ABm)<(aTq)~n8a|?h)?JCw}x8b4}0-HqkbJ8gMSYB=oU8lDLlc_OtEXR zO~^LU$1RG!;#?-{B{lR2m`2aXFLsvZJB9J|J1WRi5;B#eE*D<|M!+QT$^=Yz^dSo{ zV;_n;47sY}Yn*QXnCd63DxT!X%#tDzvFVW_EX-%q!VS*X$3?LhKONNq)9h>=$7R7V z*hBn8%;N*`fJaikK|Hkm&?dE1Q1mb6bxX@I)U%D|xc;{8AolFEE;sv`rjAdVU< zF))duO5*+0{6kV;z2)9aX)9!_<(hp9zIyr1EVgO523IQ@c&YQ(OL#N_bj6-}{H zio~yRXDN|whcSO)dKD| z3dUPMl1>k9GVKYdbEVH(9loJ|M>%>V+&k&r05TIvRTm_6Y$sj37UJ`PRTU67Kp>~$uI>Ha%i#=qbatJ44RsXa0 zqo5)7t*Em;0!FRi=4(_(r8K)B@O#jRh@v01Rt^)oh8)dsDuwfpTC8#)ghu z)G|z9>b$K@W4;*hm|+W%b!#@M-Nxf@b;}w>CA9Vlrx)c2$PF-F3fwP)Fu75V3yuY! zga|CLORv42?Kn?jY`WIHlzZ0$gOq~%P8KkoMbfs_?_}piw9~ieyT;P@AaPW)6oti+ z0O@C%r`tNFCqWuUn&w(dQa(;3g*m`akoA1$056>MQ95=Ey&F*}+Q(+%p)%+bUdBhK z&jqYof#}pX-X$cO?WZrzw&?PCmp7%){z!Rk1@+paUUjRQ7<8Ei`)3Xd!gMBI0D{(3 zY;)NILt3?0dw(pk@SrUhg)cW_JtnywD2N1b!$9~77{i*h?|RC z>KXm}W~B@(BGlS=D)Dlv>m@dUw_2u%-3tIE!BVPd%~e#zp6k8mX?k*mw9Uf1a;Z1? zzA>x@wQ*(YxQ>~-T2Jq-t!Jk7j%BYNo2I0^@o{Zu)K%%u6m`7SQ}L*fGe*2J14-Z=^s)Qn zTu`^G8*aN>o=FA9OOcMRlBuI6iP``3)rJ&lv}j0oFXP7QK1p_uRV=&DE@{tYW2Z9F z*Q#^z{fMkp@z-M%nTyr`eYO;g`FAN2CS$Dd(eO;e^B*wFm_LHYU?HN>5csD-gNe)V zmm-GMy*ZBvh2(3cgkY)OCi^w1u?T{y_!WqUJD|VVEAQjm+#LgpK+mTE93lWn_)RPk z;T9rlko0hKh?h?CZ&f4a2><71Y9hH`13W1#-LZ+(YI-NTs(!e5CtGLznx!yO2|3zJMgJ@;VPj^vo@HXDh*aVyskRr4#M+LFs#Y{A z<6&lN)bpg5+r}WaPV9Z;tRL!%4vkAH@dMPmb#E(hW&3=7eMUP`(MfFIoNX^MBJRA+ zWUzMn+no_q{YaME{q4Ga0sBxHx%6AEKMKje=tFY;MRsa~ z>h)Y{j9bmA3YZ@bqLvSq?h@X;jBP@{$ivut7xN}!db11W|FCA*JbAKfF{kSSV9$~0 z0A&G1vujA})VA6(DpBB1jp>haU1xP&jp@94p}phkSb3!V!`6BB4(lSvl`2I7-$_q! z^v19WEl0B4+Q!7Yv&8N(QglmCg5w_>=v*fK>a*%`>VHWi#2;t6j?ghl64J<+Pb0n< zgFwMkYATuUm?W9S)<~$-)gh8X^AmYRNbmh8EOaP>{+LgjEb@3@lnp+QnNCybym-K)kvL>N!LOjt*xd)k!+G? z1vdbS%5au7t;biUorvpr8UOb+mg@G+wvOyvD&1WGF!BZA?yGn^@$M-5t#v8Z4r6aL zTXJ7nrsIafh};@phYu6}F^Mrm-y)?QF)nvLFfYtEqs-TI5T&)QujtjK%AMc6;a?Ss zF6Ac_hZY(vHZE!RgYXMEqDHiSAEF8DLc*jyB6Ik5#9i6;f zdfrX&k}}wcB#!XP6QnNz7X`jWx>Ekdi^E>GxYbN4qK`xXKu0B~x*lgvB5nSlOm$U3 zncvEb0)JKDt#@eoseZYvN4}j%Rl;51lij7vzPgp}fZ~l7NiOS`6IR@AN&mQ6!FG% zb(@x0sKs$z?DFe9)K&vBw2B+v&s6V=2S%^zXcHPA-7yp?+Z|C2hw`gv(u#18`ZUr; zT8{{~W``OoPtyqNC9AGh*D`MLNMk&sY??F+K&BW;)$p|@aM{M)V%{q+r8i={I)W)RTiwys5KYf__uWjL zITwAI)Zu>o>>9?hyByqo&b=d85&ZXt(y}uclGF$)+OtPWC=FnJde@0hmPv{rm7ba+ zPS3@$c(HSp6opjkAID2$Qq<9yp1&Md{UzO)0GN2Xp2{L-d~VxcXq~d5>%rsX8r~;4 zKp&_6fshAh;x7@$NZIVKiRAxy#!|Nb@ab#G!3=3lZSy-97q~7`mC5wd{zYQrXx9?z z^M>j9mIkMk74@rAPU~pftA}Hmbn7JRZom2(Pk|5^6X&Ni(IZ`-vD56e) zb(t5_zz)MD4muKwV}|VjMdAgRUhZw+kHBRPtsktWZ?ii4#?NQL$O}=5GX4T90XSpB zxA12L0+2iJxGloifqGu{ye zEqDnpoPeymAT4PyP%&phZ)@+=QJQAnKEXP{6;G#sgKHenjZFI$404WHmtBx&_Z(R* z68hDEw5qu~MD1$^BIv;@Mur(G}-p3DR za)?cSh^!S4?YCioiRQJH7#+TK9HpB+Z`Sl-5ZBN$B}kZ*7ip; zX_xJvc+}k~)_*k2%k9tp_{=Mwp*>}1vb);sg0s=2X5UuHv6|1+a}m&yv)!@Ov4)XW zU`pq+e)kf2(OgKzuv6 zKk)027eMki+4Tt^ahOSUQ>Pb<9pn=RRzah-{0ANt=G6QB^W+43;Am=IaJK!&mLhFl zu*4`{O>S#peRAjMd-IWA3uL1isqO3~Q=h;0iF{s|n(Z&4cY01dE{&XOf6*F!<=&I7 zm+3i|fmQzaSam1o87unZr4g;s)Jk4W*ZN?@zl3ar$$&}+)#5pV+ZM(~6q)k?ZzPq{ zvDVI%Rh`pZt!06jV}{S(LC@pup7uhQwexbyxmr5Pf4b*}zVo%iEjp+~M+=VfPAmh2 zb{!8Q8zO85=pCDp?P868+6rXVt{B#ALy~E6wwk1*#+U}s9d&$V_Kk-tQQv)sIersKz;2jqd8F^J>%Mp z-;>rHla+*g(zU0{7xihbRE7m^l(TckiU9kS zPj>!4f+y>HD*As#M4+})IRJE+%sAINu760y=>sN`%WcA>@S6~i3|tVRl>|=8)ZZd0 z%JI=;ju|tCr*7YNE3!}_8u@!eUsA-*<^KCvo&$*A;Dr~D2%ipk&wHcVE>I& z+$u9`Il+g3 zklHZa)k;NQ z;5^jQW5d;NG*(epoy;1;*Ho(7|G0x0MH{HnpFz6x97s-;G0aC17b9WUr0VJ8QA}{x zgLrAav^KbCz&`l+x0Iylu!*wq@k zqA3G@;3X6Q<$N8A7m=UeQ(j}T|L6@h434i!Y0wkXT<|8ah|`(z;nw$@5Sdg!XU&jC z*rJVQ7IoBbQ(!&MwtZ_&CSLFuP)XlG<;~~Yu2FIGC7`IdKO_bYn>dVbbKpOKlY)_f zF^95E(6Sia7APa~BP2T6L3ysyeg|)LI#f42-#Uaq8R{lk|J%8GyRKI3UNs+PW&ef z8u!+&<$anJy>s8Hs#83pE)2FB*rnf&ur89)s~^m;USa>140){WL*s4o_^}k?fl-OB z*{r4e!ISXgjlg8EP7;nRpv+2b!$R%ysh_$PLUP$!}4*q_e@W-F_#~2<*DCW&Y7sycRTLhKbFq-$Ju}T z)VS*Nug#2?W?Gp~sV)nfGt+(wYh~wSqCDKz1&eFLQlx1&je-;oQWI||&eZM<5MesV z>koP>gn9gg+f#|(Aa?G4fuko+)(wzWmSrLaB)={dxO$W)rdd6gcBz_1qi!L6nxMl% zULB8|*c$%#I%j{v_3Bn%_uxf6G8vfAo#?;f?_K?Abu$i5^T3mpKFw10%UByDh@=Im zwv`4*=3rr}-%b>qj{r$SJt*?5QTK(|rtz80+A8HGONox(#8Ph7O@I5(`qA_)`iEIcH=Xn??PPNz zrDPHH)E5U!MD=F9V}y&YS>h_7lQl@IJJ0@Aac($}k5Ov+^Z0nl0(fgATYJ%rKKD-e zdD=so_+(|;!ewNU@V%4EL`VTDF`^g1zUU>XtAWe}t=YAfi)pbChtdmOVQX7wZ(DG8 z8Fk<>p1p_3J5vX3Dma1CXnE|_Gb`XB$_l5n9)4$L9O`bbL!)Xe8X8w3NjLG1usWq7 z9Xfgr@569Xw_M7!d;j$d+by>Oc{&q*nu}S@juO4yeQ=ZX`gZ^8mf&>pdkEM4W;yEh zwGZhMe10kJ^MK4wm7(4VO_iy=z1f0X=wG#0fob|)Oe?vB&tnGX6w<;hK)?XjO zJMBX5=>WK#af$9jG%9A^#r^~x+P0l)2kJzIQllQF-rV>tRZC~>6l(-1E* zR*fbuhsc%a6n#-u5C}a&3((9eZc*`pab#su@uyTRk@omn(u7TgU}6~x(D@3V-Bo0FRV?$F9RZga`3QS=j z?1?^&-QC8Y!k-i=R7ykqsD$dL=JW?P8F<@2ofmgkP~Z86Y|eI!!192~YKi$#2qICt zcaYDMnT#<*28a|$rS~LBL#{MUM+v*T&^@70fXe2~)=@eXAu28FesP9A$_ zCA1G>W9ZlzsQ4n|6Z&W#72)Ie>|l7LM=Fyo*E^NSAVs6CC;Wmvj$RK^9g-=j9S}sk zUsujVU6|?`ZaukY-AoL=bv$)Yv?|3jtv#TvO@+mEWQ>7LA5@07TMHMRjJZzjx>o% z{3r!@K7TmG#!z3)2JY$FObZG(k%=_yf_&znJ?QJOm(z&$o-*+y#O~bt3S6+1{o15! z{iT{!(41R9K&-z#jsRPKME5=^L0wVjol`fb&O6qNn3td@tO6iWLBcVuixAYv9Xk8P zorIPu+TGRq-RUh8Y~9dNWgmc$!Z9T}C|!7Cs~`cG*nX2i{*{=$Rr|0`%q)WUv-q2T ziPUMyMV*#fHdujw`?6KiSO^(-`6qa3T5^|)b8{S0(D{$>0o1c z6yomL-zzOlcCa}AQQ>!NT#-#5pQ5PR=*aFvKmpFzC+?aNQUbK5kFA(5r9nOfB+7Wy z>xh}(jLekQ?++5Y)Pi}MVAEutrfX92*GMM(H%$`x51aCH)ud&zUw6jmo5YiRPkvg0 z?N_QepO^lNM=jAoSa3l$NTVow5Q%=l0yfC_0?$aft}p5R%Am3`<}f0%$7{J^xsHFV zYs^&!si}XepJ4xW{VyDEkK*R3NIj#_?+^HR;MnVYinwHZ#{nL>-m$~V-Vwk6My2-F z{9In-@rD)zVJ0E2g$6u+((}D~mxVbxIxZ7?gIm=EEYEedBCQ->f{cLwy^~CG$U!wK zB&RJqM6Ie_Ufr7A{+Rtp-LvB1&5pMs1|15=`wk7@2SWmqgn`tE!$$PpSb;1s2~{s z4RrnEuD%}wTebNl_hA?M4eAM;7D5S#F4=(c(jw{{lQeM39gURPR zM&uQ!Dg%@t1$fj}S-YeXG5ewKchu)=6084EBOxV7u}a7{IL>3S$lMnw>f6rKC~DzD znbf-G&sxskQwh+uv=`iY4eYZYAa0Eg42~6v&8A(`qaq@Q^dMKPqG_gmy>+#CFWz=r zYhu?Y({l}C_po?dtK#1ImgzcbiPp_7Yw4(?D|4BpwZk1f`K=}@=A^*9sX8`+WW?2Z{{7%^zjeqgk~iH|SB9P}jq)HezJGT)(w-NySs zq|22TASZ0Pq-(3)iP$g-tp;a_9<^+i!6v7JJ5OZ6%CU5tVYf>K@+{YF^z$GCzF}d| z;5ruC2~5TggdE0MpN~5mGxQ%+eUjs}hu$;aF)N7tX(_922>rG)b8;JW3^7Hco+$KD zAL0nZij1yk6fN7$1Q9yxVEW!aw#%aMSLX)}VuTJUEXnp(X#}(#tshJ25^TiZbGk<% zp?Zf>al0)*uu*D0NR>5jO_Oxe#^54}cYRUT^G;*MD12IKb}v3@!U4mj$k>B zo(^6v1n+`utg4HOBeEDBDD8xfnpMg>UXZX@N6We>$4rSWe&ij=_q=4XzH?BmdY_3i zSq-#zXe86TR7$l?wI$NahO;>_`0au$=D3Ec)L=nNRF1RXqNYP!AFbFv} zq@NA=dCHiI9FEEDI8mT?{5^r_e1!DgSBc*Oxr#^1jr5d%61ua{`DV7&1m>0;Vc6F& zi8K;a`*cyLBjXP=534drTN@e>!djzsA~bdINB)|doYT9&`vW0<)ivMjWxLRF_t?#HnJ6)Vth1eOUwxbZ#y0l7;wXL|69Mo1+Bqs@w z03rFV=L9=_-~aE^A7@W;&U2pUe(vSEuUk3!V9kcXZa{~0;~RXN!x!_{)(R$%llW0h zm_EG(rR&}67wi4R$D15TCkNrXv?28!Tm8Kz*Lxy4ZI36w*H=ML;1tL9pR#?(H32mZ88!~1rL!8 z^)@^Z-O^L%!oKsptPH~gC)v7qnf^O`dp#!C7R@m_P}g$-d>GEts*dStImAz0jJX9k ztH&HZ{pOrs4-~oy(T8kKVF4NBD(Jfao|BJqEp?)Dz0JIw8^C_h7`fn;NhG}exw zCgRS!)sVzG1h@l_NgG1-&mna^3}Zyh-15r^#d7G)T(XD%b{WI4)^WLY?F7lSz$X-4o#F?^lJ@VQ{GNz$Pbt2 zScP0orDxwUSmNvcC>G{w#f0Yat&Izk z#d!F-m^EBzLX1uR38iME26jXY+`*>yFA8kyzc89zJ;K^PlP<`W?dR_3{e$?fLE_lb zG^Hi{YNvJ19_r{s74V)f5BxEyqC4~>c6Q^l$}z&TR26lqfGr8*uK`?U z`9dCM`H@Z{5+h6)1I5pb_xq7#n^#LYC2+vVmsMS%TQ>+<&MUtD8|>6Db6Qq?O|ie| zyXYKe)i!^G&=XcOL|D^aOFMO_rVClW(Eb)|B#<5KZF`PvsD$gNQ_uRN4|jcmQoH4& zazOmEtWh>|cEc-TtYrhN-KR;gJ=Nzg~lWYM`q9YbxI z98YH|cdd`nixW-J)TIlfK+_5+vYc}zilfAZfhaLgNN+1!&&RwKc-i!dZ+Cgh{TEFg zE2%ZEl2=TLAM~t@J7?cK#1&=V`-W-V4cTapBY2KCB;VBx+)E_>vTrSC5v?Rg+QUCD-Oe3COEc&TQ5bM6-cr84g;?SnrVwq6Wjc{hkCw+MEYJSz~sPYDy~oBe(CGCflkQE?NL$g5{mIOjx=%4w6R$|og`%sf6l z+p(JMbCAR>o2x%3_5^9OIZexDW^VPf!Y+BjLjL$BcpxI1-|}Zz&kU2NZHlRgUDuKb zyRa2#<%ch^Why?jFb46+M*^p%_UQfhnvb#GD}u6K5a@|;Ubm7hL~H}WE!l2GQ*5I{ z<&UrM{%CI+5Sq!~9wvlhBU*f22)%c#j>R_({8CoVQHL1R;3K%4UcC%ZA>yO5zZ?V( z!1M~pQVwC3H&c&7#)WJULw?j6Aj{27P`Q>{?u+3O-;2vFH^el!wnx!lAGHzJLY%sy z1zsw+7J9t&1G(gGXed|n+8EV!oP|D4^*nG5G|RH1tmYq)s%A~9#>B9MFlIdjkJfFf zBNwUT)OOSBq}?pUP9^*WgvKp2FUPvA5;d~G1}Lt{5;ucdE*ZQ_AniIzfO%UCfLUi5 z(}CD%RkZI{E)%`vmg;R~)XNtoC&vZFezrXn{*V1kBw!uH6SAM${oUhpl#c50H~F&y z^Roh3E!@A-VQ>6UeLxtA&L7PAmZyaY?}J-RsHOHBHHsg6FA27--|HJ;ij(~x~_c_HQprNDfPjaPlF*Y(U+v)+TJ_MUWGjl6y2psHyK9|7EMQln>5(V58XChoBt;B~FA z84|Fv*czTCa049&AI%}+v$~rk*{}iV0dvkS&mJqj6YfQA_aTT$1fD=fMB@yk9X~CO zL`Jz?7I}^Ay{Pn%ouBIfM9?t{`{BwoA%z~PWa7jLrccvHB+QE51m)fy+dw~+bzGS> zK^!8E78WtZli;(drBugNOi36tHaoK_ie53`@3fswi5V=s%{q3}4;L4SZ#klf9a&D= z6&T50p5^|p9+WVWO3l^AjgO5cz6sfUzuGuGdqlBT7Il-3>|XwlSU9m!0=(EnA1*{3Hv5F!%6u1C150)7`E;GBl7M2pK&zn^AVw`|-6W3iin&>#@0cK^> zSb8rDGER&6?%J%-2t>l^cz^1lFq za&|3mG9u2jM`1p_Qk-`bW7%~{oJYpA89YT$@9x+TVhlIehIpq)8&KkqTIcoN09?si z>J@RW6I=a|h;18SZX;{3mz)LQ2i>mEY6;s?{SlFM6Un%}PsVJF!Ef{zD#b!gPS5I9 zhO|PF?1)kNMn{2F^H+Lh!6HMnUtef2C?B6Rq-Bf4#0cvb6PUDN6~{RzGb=(#9q14K z)3=&eQF>V|Xrf8&7ZUS*tY^yz2fx+vHi}4|w?WAs#XAWmbc3i-1LjP!0{mGpmqj8H z8g0@R1ORrtYK;TpieTnF?kS<J0&9oiBm*)&sPRD8NlA?;SC7#X$u794(HDA}_Fh z-t=1KR+VxSXfR1#7;p;QNV&YoWv*;I0$Z` za>*vGy%__{S9odVCP;ZR2To%PXs9%Oc1f|Y>dzz&SEh2K^%luZM`((0_M-|aoH$P+ zPBlIurhxVNG$&4WrX7yC3{u4YpZWGFc9sk)UFy5C#sO+ms~T}@B>&l%dNnEeUJn;C z9LNNF-n&oI33ADv3J5QH8-9lOWkDIBFC!}){g%`rd5pWDc7UXj>KM2b>1ctiDi0X7 z3THt!4iU8%6o=@9Wm&fQ(NvKvz;w%YQmxNssjV3w%HbEJCp~(lLbs!fUU6V4yV&-U zlmB?Q<%^Ov*4jyIN;k@aSY9}{7!cn^qh%|-pvIFTF3pu55l`gtS=G&cdWt{(j~13;A-%GQqT3bbiG&IgZ3TOByT(Lh-%uU16zEt4^&jjTsx>rpI!XJo}g+D9t6 zEYROYkq1zD*V1JRpwl!z1WOI7S!c5E^ybYb1$hZmu5AFGD3y~^)1`segn@U5Fz>=G zYp+-NjYm=71a2(Q%?u#>>e8xIU5<+P4FN-^(sl;aKGX!eV}!NbwJ$*XN4iE>rR)8p zD?UV?PT;)1Fc*Y~z=9JF#$Y@|3q$eRCXMwrfR2c%;dc|^=$5Zi%T?e}koo^4sM+k? z)6PMoA`7!@-mR|H5fYj*&g)ffCAq;}TR}Gdz>Ipdku#Mc&(vhntj|!S+Mzdp&((Sm15o`WN&7HWC(T z%IkSX1i4ji4fSt3pd<(my+jwt5p)0o2FHzKK`ON5MlK!vmp(sw(q(_M} z9NeYq%ti#7iW*C!0Fk5a5p;d&v$j+gv1nYN=tN=l)Fpk^25p?9QeA7xjNqPwqwO#@ zZ94)x0=-MK2mIk$PaCq&17L-BAQ1+nqp0b_BqVsX_@5@`!6=ILMmGC)FlmwKspk^G zjdKicJti@9v~|1^L3jUJCEOgS^7on+OAwK{dh@X+q9ExXmtN2u`Va*^K`A*Kcfnf}=nS>76l zkoM@(x0>EmIdin8kfvBg5$v>)p|^owwKSzq%F$bzawdpRdtbCPnZ}Vl%jg`vwaLnK z$Ra}%#Y}Iu&?M`iKMCp*QlAC#4h5+^r-qY=QxAW}5Avx~ZKxQJfhm7a8 zpzni@k7fdNf}Y3QQu8iw(=>EPhx4&&)5qWW_v)EP9Zcb{Hoe8^&exTv$5$;xfGuQ~ z>oz=zDly_?1>*t-2QcXgYRS>)q7$%JRECJ0;BhMSVrpT`L@_!&+OqY^XfaxhR#pnHy-&^bH%2R4h1s$eYcy=2Bw34~ zimvrX5A%<(hPF^m1523ew;hk94IA|+{citbfK^bBc*a59sAePi&{Wgb@i7Bzba=++ zdnQ{4FLd5C59J071ZW2(i5NRq^SYQ?5&MZwZg(|(yLk@aR0gj$lOfij zHucPCjPaCCc#VF5MK_#mnBK$?F zkE#?Gks2$6_lD>rD4E*MzqvPSx=~Ov# zN`Xo;%i_A~YI{@FbwD$un~Q8bZ$$ zBNpU>2r9!Hd7=2PTh+9Uc{$?Vh-mK=Kp^UhI`oX4it4HJDGN;l>ze6y2Qy;eI)U=- zSHao-J$f0Aq@{?_R>Y)?O!h1>+MpIb=a50MnN3MA;Q1lePn=XuoUnq5Qz^5ZD&aWL z3Bs3D=5P^`liD*VO;+V@eM-zDY8;8(lDS8cBZvz|tOd1}(N({eG@O7oo|#0YBtM$=Q&<1cz77Wu=Kd(B;4{>)KEmKju%l$7}+ZTNsPgkI8pTu4G?^3yenmPW5iiLe%MeSj_8vFs z8W5271w@3z3ozMYt#xq#8?Ptqnqx5WALa8VPqrnivEFFE4&OTTmq2tN z$`p$&h0EsD#~Pix&1Qt~aISn*V0a)2^F#ZRs!SRmRo1!}Ct#oPrkO2(i*#(lS94q_ z)#vkc^e@Z-L4CaB9VPFU913a3cEF8On3m)CWR*CLBwUWrs;$7qrKUO;0HS8GS=FY` z-Pe3@Pof3s>(dnHadr|IrbseG?-y*Xb(L>t(zGV;(E3=gW2LFAzxGfs+ii19?sT)8 zK2$5mA<9k7`Y0Dnt=2r7bAib=6^>22^VD=&3uIR!cr6Krfp8rMxg%t&Vw{&>1Ky3V z9i;NT4F4TaAKQ9Ls3K>PKgyehyb*s& zOtWn(Jb|WI+y1Ya;##J*?NKdrIfGd|ho7web{{p-?%B8axIil)Ki z>2g_o0#*1N(1%+z;v6@TZRNxczgzwJ@9-6fJFXtnaDN8e%v9!czO>UW_{$c|R?e^XiRDWk0|B7MQFY`srVN9P^w%K|GAXehy#a1L0m8))Ete0YHrV^ufTN;GcYr#k7n2&QqAZ~(xB$Xl^UbE%vp>iCdYOIlVe5Gp&VY&0CHmZ=(} zBJt1nNlf-}j3}0qja=tjpJlnXVvPoXED4`M0K!WC%oc;>W$FGTgK)mkXjV{WsFjC7KWA>+W3b6*fl)q}N*HY& zY^74|=ihrssqUA1Tsq2mOD386skDEP&_Y$g3C>-t8dM2@AaIle3D}H--nku%z`jaVr@B*%Ff~vjIOTx3iomc6u)~CktCiq~ zq2GS+eUdFk(MEm!OV*4FF^cU}vA`uDdoV#$7o!-$IJm+BrMOzz5g}yA9I{>VHxA1k zOhya6DoXC4;S`9a@=^Zs83B2T|VGy~^V6E3z{B>x^sze_~yOVy@}xRj#f^>mMmBU(@f7ywGG}o>88( zqCh#7Oi^F{cTR#~h3Sj5^o)TgxP&lem_S>8*Z0`SwVQKDELRhArn8{8G-*jxV1%Qq zF0l1D=F|UCR1tgoyQr8eUx9X_DR3GjFjt%oh~>-?t-9&S$6hd~n(ZFvAw9L+0j(1K zFd~p_Iu1p%$R8FMFV56kyeRWD%$H!U-~2-^`;5#>MZOm8Sjc9px>Tl5Y;!y7rdY0ccsw(4MYxTeCuf{{B_9+y)Y-Yu zD~yY6^4^nYA}j=)5Rr4$pFP$wQTv72Vt+}}&k4y&EPod~-e-pcd21e}qAE8DX4f8* zn(Oqs_Iq~4mg}4~1g5WAZ0|>aZe|jj=-AiQ>4H=Qa;YoaHQpXi@cZT&wXP7=d*l+Y z7hBTBUT<4S@$f;knd)fnzj!D{x6;QXD8sVfT+7{K;Aev zD=^ZL)~?Um9|lijFU% z=$|I=_ujFTZkxcz#so60>}JGn9Za-JTmXLhXzS=ECYN?OsFOp}ghP~;GE$B(2NRxl z`^C?4LYnCLIsMC5mw%%=e*Om?S+h=5b|qEZuuyFwKUoqTJ&Ov{%`N&J znvtPvH1AD!D!CO8=22}C-HWN4x4)+XTbq}w2fo`c^ks3YGhFe~1WV|j)2sR_{tS4g zkxHG#YUyVpMLK>3v%BAyVF0=f#U!?g5H@dtL_l4^#6EqtlQ?}_(nL_yOTId~egS_0 z+@@Sf~}ds|055TxMNWc9F@L!5AwO&o<(x&$sSNF zbzx`^Y3y7Jut+&|D1j<@((;em$rTS6AHBjiOTIt1r_^4Orxb_T20V`;Gz=QXpYdMb zYfef|LOUhnZ-->YfDv$oxMuLxZx@Lh)q&T5xv1X^zVcPk94d;th6;%+_*q}0OBUh` z1;)wK4|9je%i_gV_Oda2+ZZv-)&yn9ZCw{#eEw4cpvi802GgiiTM=7^t3H4M|CdXbu z;X>7pR=syLTuyV$Pi|=(Q-^k7VdEe zS7i#FJ0jW&*;-GUGFv#tMOC6xM;STrNVf28ubCbm@9P_QUw$|tCijxc$VNUKB@VG? zFXJ!F=0BF=O8*_SGlTcQq`}IxIKD^S3!8F@;jp*lK~XNOV2m=Z2D$NEnNe_}2$6iE zVi-G9XGpAYTcgt7Pqy?ZJjyE#-{<%T}U7(`lYh{(QghTW)Bc-PsX9zz+ z^Ny+jwVXVzMv&JI=vc(xjxe>k2b`2;)H1owquy{YN?CD!&E)VGQUvrS(4UaRlgWb2tsYGSUB zB|3@D>0lxsy}`e~0TwTO;6ztVCb(`GC`hGU)Rl)Se%GC-tNL_RU&=2nve(@RY{ah=7rRVP%+_kb{~AR0aPCg+7yogS%8 z2iwf)R_#eYwOL=4t<1%24QAq!gbHuE7SPGnaTc%Ud0~sJ#AxZDr(W_;W8=|up3W82 zDMn52*1j8If3yaeM!VC@*FEO?Eet`-t0lf^9@D{!bls9Xt5U;fCGe-nAi5pQUAjEs}+W^Q` za8l17M;z^RtG?wT{4H%dwpc}#=#(#$b0}*ZE2h=fzl3!3DdI?9cJ0izr=X;IsY&lf z29{VZ7iq2c@~>!_@U9-^b^8;%=gHD-isR2gbU-F)PooaGmvcBD$#;|cyqlDqhw!1(!Z_6o6M|h_m4tJF?yxI3I^6ZU<3OBV5y_Ma|cvvFMvzc$i#V>P9vBiBXP%boxYo6qXJ^wO&pMgIP=oIIMu_J}<) z?j5OKacCZId6KW&%!|p^U!o|rI|XSd-;}fVIxkau-!Yy;d6MFF8VhPbis>iqzQPtb z8hSLGJYl||St7Y+B*xa2hG-70+waWhZ^l;EQTqs^VT*@>($&yWIb;Ea9k1qrvK>V!NT{Pa(cNm+hD5_K+HucxB8H$enKc17VP5@-v z>RbihCSj9PPuH(9eXTK;JE-_ds&KUFP-&XVJM5HNX{MY{<|ZpP-nw!E+Z~DWY!%-! zNEubT=9R9@+vjx|55lmdV0BH=guN%i%yt0>0+MB zD7bc%8GqaO-JU$bD6VO_#nEMd;2WnC0D9KtfDJn4StOnko-XTXs%vch*z+#MccB8o^SL zwz+n?7lXzPXagnN|I;)$q7#Rc2GWXaj5c%oxUnT8FwSOM$0Rm%F7!@-y=n{?t#>C< z88t#bTpQt+Z)(|GO!8vdc$Ne{CKFP~%NoZP5IZ>e(Y57>V znvu*8_cTzk3NL^eYWHrGkhCi&5spinKVeb~%D}ZK{EH39241WL!*#g$2QuU;$#@BA zrao@ySj&4r@fmMBG!`KA=ZSjpfK}%;xJ7%&MhHA5R`IEaQ(Hm`AXUlLH^<$K$ zwOOpr4JQ46pX>|qbkzFEAjD15FC-#w1kOT@s5b<{#X&y(UbE&h!jMRUy3{=a226xV zGQ9E;J!GW>uxK9~fgt#5UkG{8St7I!rdN?_Nz{nB|^klBs>WdO!VgsPhTsS7*+~La@I@ zdHgvlg!sEk{K`8elM&h{4oB-A4U&uLJ^d>w$y=+ow7W=-7;??%$l7>#2^mFpwq2$5V#~q#anJGRN5cz6O6vThg|ey-DZt zrw$SHvYlr7>yWbq25-4wD#)?4@zZm3)^e2;j0ce(!6*9ILn^id>JNgx2-?$e=IaJL z3SF-<-R|dX2bdw@uwPR~uk=Ue*gKx)JGbyzuM00qDGdaZFU2m-!s#wk!@0uvrwT|Z z39!D>xf-wbglJf3Ko+2o$pzSMY9p5ZXVbm9=Bn*Pp3s|&`?OU3o8m?=6pp4(`9Y(6 zIDO#PbfSmyxu*zj?1%F=76vye+SpC#DIr&kRuwstu)qH9d6l@kQx zuXC*)5{SA}JefYMx3&LjqblbqA2F__Vx;9n&frq&)q)A#!%V-3vZ7n&Fy)SWGN*@r zZ4M-ddIA*SEv0pR8u0+9dgE@(eM@Nxwf10&fjS)u9EUO|XGIYq*I+csK(!jQlN}lxU_VY9BIwVyzQ?*W{ zbS={YVvcp;G~q7p=@ZFsm6U!^(&Gn?=0d}^KKH>xJ==lSd)=xAQlZT#kE8B5s@(g{ z?!8AwR5-n^B7d?iX9*awT>Asbwo)y&+&!M;z(}oNbe6}4CfheI6*eKkN7ya%gYx<< z)}N;oc2nc)yQayb@|oGoYkQ7;$^5tu>H4W3I9s2yyeSScZGZIUtz1TTrIWrkpILZo zvc*X+6300DpCn`GZgmCm|E1$^8%!W3Os3yjm~_|>`UPFUe+w5eUraY!g5y6<^ui!f-0q$X;nPO zIoR%)Xxe@|aQnJIeIR$Rjf2Fu#Y}(|$QlSu%tbG_<*>dZu*-hB1U;)Kr^-+>%MSY)bhTzi` zm?W(Hbi%Pk^ppiePuYQC(}7gy-gN*G)JQ|FZGiJ#=esMFdgQwU1JORftqCt^NY4~b zZP(GOQ^i*U3Bq}1AIjsFO+Zu*p7wkystkFF6*^75JTtP?{eJCi>wlF{#eLVvQ+G=# zQSgCEG3}Y_z;#IMXM=T34bwqS=q#L^6K?HZ3O*w>r`R#@HUYc2c4!f_Pf@G|q!qEy z^k^7M(b&i$8|sdMKT&|nUwwDr1+xC9{5V;CCT|VL*^-xdCrU%HHH-NUOj=-?Q^o_A zma1Zx=>et}F3NR`e<3`2O5k#&HmTOep*@D;Z{fd*?nW59f=jeVy$TLmrEz(K5($hh zD4wW+BhBxs6Mk}AQZD&-il4}tFMm5zfud%;XYzykfy&~8ZEpjun@{<(J^@>Yxz7dr zfjC$s*(kV-Sl#QcooA~*8i4zF+&8-*;~_bz3F~jHusnA--gfX!ne)NHr$F>pwR1b1 zGabkeSV!tx+$oZGDr_-2>Ab}TWPpwPpIRPy7u>h0IeCUYeg4ZTjg9oHM3(oR^Ld7R;`(o0 zm)?3#jHo^ObY6@ye_pbfuh$BD;pYRjGqx_j+nSLq6oM52WxfN^JYW;!b>88;YfQzR z0zH)wi*(9;&S>SO^jdnk%3G$gxVw|Z5vK|@NZS7c$VSstme}in%|2mzrK+djf5TG2 z{CMfDQ5C<0yh&%SB_?s79VTL%BuyvpFp|7O46*;bz@6J$F}~)J@#Pulu;GCpQKj62BBG80RLVi;EvEY)36}2H(g^K3nH4+mE~}RV=l*NoqCQ*=~)|N`PgPuT0gNR2ILExYljGK*{s@O4EX{N$L4o$ zO6Qy3>eFXUpC@6rRnt3=9}1m8xdF8(nEFjvB2dDp!zNd%?=(-noZ#^kXyA_HU0`_f zQmYH$^`dGvX)3(RG>$1TYQ+3pd(`Hox8SBnOoxL_^q&yQ0$$q$tAk0Er`8y1i})f z;3=@dH}Ntkj+Y9*K+=$6+iH%(+)olDzpNl2Se(&xcr53Z~6C;a9dK z5kQCfS!dd=c{(0VCfSK!b4*u=3-@WxLhXv*KSMe=Si#Xa$!IXzSjYJ@H82W)_lP;< znTmtYiMvb_TC!!aDY+NeQpY-PTN_YA}A&c1DH2V{L8 z-a9w(z77pRy5*kW{Y)S}V$#MNr28qB?#G>I-Jm?(s&45y>yH)-^|gK(@kYjL*;86_ zOBdKvI#Qn`n@)K&+ENH2zA($a+C-S~vpTcEiBLNGx^08i(c&sut29WQ+KKBQ05_jw z*^2jWG1!rd{e1#pey2E25vw5l6~z9YMBV|5d-+hhmuzMYg+{sBk#y%FM4}M^1N5&p z;!mX-x1?8iW5%KsEAkaNwuUS*ZvqIc5gwjy&Gp5J>v97_g=0*KzSJ4woeW25cStT< zk_#r5*>JfmGa>^)XmGaXp(C$2IE?VFDh%igu)8LZ`=H{7qa3&zLkZA#c(Lehty(Xs z1_^*KP^IpR3MxPT0m#y$RNc(kIb?Ts@bIWK)al+TW7?%KAvwn5{d zJb^0@T<<@F3pVO>+5V@n5!UZumcGKBR{)m7gKYG0dqJ$VMoni=3_Qno%oM62OO{nZ zCA2hkKM#TOKLhX2#`hLzsYZMa1Nd;fnNIDdR~ezV z|JgKX1M>_iK2n~(&rTEC!<+Qk`gAx1$*hBpA=O1l0Q{T zmu~g$=F%cdS6*|xZi2cWzNEVl=m5t^fF&zt_gr>WPJzQ})gr-h{P3ovt~b#71v)Ab zt{^@~b*2a1xr)-AKhuLWqg@<;WW;Nj%ntW?gUJ3* z{%`wa4|&`^&^UYBCj-&i38aONu*(~1vm~j~!u{jm9t)qd0{U zS4|WgPP=~Buc_#DLWVq5D-UpKM$w2~2StT~@7W7`EJsIL}4{3YE9=l3nTXAb!h&8xiDxhB*+ZFe zt7qA*o>zrioc}rgA$*)nWJ?||j<$XuDVw;Xg^Au`xw|J%3Q9r;CVe~k25OIy&a}U` zZwF49bV4(dHh+_;^$VdwU>InykfKli;=~Ot2k|W8 zMpa-KT%jeoypv!$kb41;2Y5W`!noe8(@nG=Qy^+zZ_e`(2nV(B*cf3jNjruN+AiH! zZ=X_bgg7T|w>ME*3qnu2v0O-dIwalH3aN>Na)5o*b<0_gf1NU?!ME1Hw{6I=?pr3; zw&haaDO}XVOy$}-m?9^1x8D+q+mE-tjSd1UrNGP;#)DDdke+MZ;P_Tvn2Ic;cs(1h zLuwX(574`Q9#>5ya$Gc+5JoK1jFdG22Yz(Qd3%p9%mGr>_9cv6RdTssYe;$3VT7hQ5Z|q**?8< zqBJ+dy+`H@7ZT;ky(8|Ai4H>xnP>39B7@s4?_F5juN11(7I)7qq}vYsv$JG2nHV?y zpDFS2t}Fwc(LKN&Zb%MU{(t7gos#I!W-Avw&Xs$0maz{jvY!;H*Ch zl6PlUa9%1uuMLjfe@bI_53{!~(R?$EQ;wnn9ptX`Y|!S>3ear{t7@_&Ip92)j#x^8 zks)i$0#6A>D%^e4-#yBpwwKL`X>lB{3`cROfkvk5h~ss^h~)92a#@F&jz7tMoSCc)Hd6{eh)e;vm1ChOw3seQ5lQoJ+#<$&()Ik}CsmLy zDEf)-8EGUd=wD{kNCmxEU^&tl(^?)M!Orhb8v@T*ogwGTL15)ytFg2lTq_v`tBHO9 z9g(yVk!K(F_KT(LAl%3*-ISAxO}X|E(j=Iw(J_=;G!Po&nMKU`Gp#8GU0{sx8AsJm zzBOHX?%sYc!!NGDFCxsD$X|#h zC$C!*UrDoT5qX}$)-L)R)O)<`W{@+ab zm8dR`c78{J(4}UA#hZiT&EBr{>DKm%2pp1vWA73_6lD01iFb&l3OGb%GO{2^&upJ| zr;A3;d@ZdeZSR?E-9}XM()>A}M+K6Vm;8^~e~x3_&6f{6P4J?~9W4Ya@R!&?QZwDS zWo0DqL{@VaIeI|4Y>}{(9)X$KS--(hk=K(7&XzM9(K+!?;tBLt$C0rDA0yggH=_>f z=F_e|Fc`~`V5_pU-+hS`0TLr0M$3@rti0)e4Pmllh!*qNZ7%xkk`rcWA34WHXoN#B>p^99Z*5a8o-2W8+rOJBGNRRXu zhFR|&c9tx%7TMX74KYe5X&+M41AQ~~24r@yeReS_7M;a4g>PPKv=599Ds9h@k=ji9 zO5G447E}>zVZJ4%JXScsmW{UlLr=9niLyy}qwy+P{9@Va0)y~((0tbUGksf(4iz`R zg|c6;WJ@+1F#mC(i}2gqF<*fDZ(Q)*aCkRwF)ApGyla}ZA;;sn6%&ODO+VYu*8Bm( zVGp`d=xnINbj?gGsa3g*{~hbTa@Ic`l`c59FErEsO}4` zdbmLqm_|Mp1TVauRz?tut`+5nG25VX!=h`Tk)kxP7^=pk zTdvVKL1R+IGHp7R+`xYkob+GP$yljA(Ay3eE2we$B~|P3I4JY!R@4q%=KCXV06G_( z-*jpuo}e_nOFp{Aan9jv9U`vP+H0N?!|+7th=r4UFM%QKPk4^;*NkRac;~wht59Z@ zscrvxKIVtg3paJMt&|z?zKU2#vRn^xO2qKU179EQMtvS+u;+-2`jkP}LA%T#_eAX4 z&+zP8VHJ}-L>vX7wM;*yMkQ{7BnNaEgV?o>%q(RE5F=C>yzxq*h($BUG|VUBd-D1l z{~nsXwzlT2(H0*w1c#hIkH=I!7hB%lJqudnWkl(s^v?QM$e}oIW#CP0xEhD??TfLI zk<6mVsUM^5S13}Xm}sw0;$w1u z%7vKec*kJPAvpp?(!5vwDZv?%9Ntf*Z{5PA4bt4HO3XlW1?{mhc+A!f>2SmpW?9S? zC;~}3X}Do7bWJ$7VNqcAOX-@Ay{;MHT6)o7vxm$5(MKKM<`OyN54Zf~a+vS|Hjq|} ztInUUA!;hoPd}4zK}pg*phgZ_Wq)uyIj5pfz1`Dc2fPQa5i+3go{FPoT3CdqlPuf( zuT;doe!_X_TC&F6c;IPtbX8EoSM6N5aD|iCDME7 zRSpIOe1LxJsVbM_lB+ec_CH$9CTAJyQ_Kdwd;{Qy^R50AKpL4?jwbQSQmZr{CX?78 z-kmb&k;`QYhLJJnnR>PRv3G2licE)aH9_taL4bV8$!8rhwVRo=kv7hI#*4}!$L`6z zOy>#5462*)GQP!#T@#O+S++Wgs6%mJj*$PhTYCg>uYcs`d{fS3PgIG^&GP%U zZ2|nQ$rpYI?M|aBBpnvu9a-~LgtYbU>ed=_?B27$gmsW90!~GB&yD2Sw0(w zChAi`uvD;LAN!U5C5^vgridO@rvAQt+U*Ab2mWSi%taXyPyi)czl0e!ed;amU~z-q z?i$SR1Lp+$T|X^dIUbELL5n=3)x>#+A08|Yt~zy54UD3HaOw5+UnSW0juy0(f11fV z=kvx~CLt3a)qX@~gIsiHNF{yU&swyOILaOY4i0JFC=bdkGOzw_-dJa}N1@3i(T!@; zR1K-jrdf!#Rl%RCRL+FOg$eWiWU>y2>5mDg)SOfQEcUxwjI15L&ykpST#j!rsw=8G zXUWM0N-r|{Nbc($f*Kr%ddEzk0^*|wr_A`}kLRx~!TGB_k#B&yol5SbQQsoXU#Cbv z`X(<1=HN;sllqtA-r%2rC`A1~`nO$7@lJ?cGV!IM{r=A-WCW2^RDUvgPaA{3|5552 zkAMG2@9$6L8;}%C=Fi8!FR67gk(}cEX+4tt!DEfVj#&Z=Y|i~oO}B3FWn05DLvp~x6U>>Rn!^XHQvCcUFRNf?dd zE*Qby8F#uU7{X?n7{bE0P`jX7n#60tw{rL)`^MJd4 z8Ya_v+fca{Y9%2Hkxr9j2`6@EivPJ%AFHF#^0H8pitd?w2vhb~3f~Cs{27`of%T>o{68k=6TA(&li1hJHb z_<6+SB;7@t1EB>GzdV*lu^b1#JU=+*YTI}OI4&tR8_nDxAP|Wo5EE^Kq!z6Pa+X`e z(dsF47H`;pBTn3;vR$6f)IeI|JaiZ;dmY~%hIM5j3~{J2P+m*4k-A6>Unb)at7fv7 zh=~{ji0{I_ss8k@XnQgje=ga4t9pIl?Mafq#u)V1xFsL>apHg&ErJ|YXS>A+~z29p75TnFOn_1sOz{1XWda@~FyW^~Xvl6O0 zG(IeA#!B-r^p-S9Z^8HNLTkkF&Lr#3n92SLS39Skd1weKbl}Q|UeFcdT%TSsSozv{ z4!qEkVFv9C589P$y%U5am}qd6?F0;?MPoB_+9|oGi8dSbN*rWX%7|BDl@S*BI^va(d^3_) zLP?@D$~cZWe~uyaZcx|p68H{jt+I3n52!5joYD~;{1BvHkYR`mb?Bh2+FSk(A<%u}}v7inz8YrI-@2CvT zj-ANSfQR`S6r2J$=J4#h&>rB5_%sDR2&mAhI)q4Q*q@H=tt3L^M`ceEAtGx-07P>* z2k;_^$IjBN;DD&BTyr7$M<+hkRkKmYJ4eG^2t)H4Q?G(hi&`CAmt_c#;9=w2o~&pz zbOR2}#@P&oeA7ZPBJhGRn2iL(G5m5wR-EB@)a~GuJK6=L_=`Ei~<6;YwA-P316X(J7$Q#A3{*;O{MIxDazV zSqZZPvg>F2830W%R7oNsDN(auG}7i=yoQY_#XhYqqCMu~j>6I8TjZ9qtDQUIZ5@baSQn3K4RZ zOL5JJ$$zoSkUrb`oH%;YzyG>%3~sXzvl1Xhh@KbwY*n68nO0n)O{Xg<36=0Aol!si46^Nt&=x+TiL>s|C?W{?wET2>$^soe_qIui(_uh@t|&9~$c<*g+} z%-Cxdmp3AaHW#%P1Jea9vI?qX{<-MHi=`biv$T`!C0p;=&vu76>Tdb-?IGiBjk5r6 zA$@rpRm|2_Z5)Pmy$&*MyP^o;Z-WEO_nAh-wKLVipXvHs z(@$%9`g`bdSJ@yX9R2-%wf_ma*TVZ7P!cUl%>wV8jd-$u8;~Hp6#=xhSi)gXArR6I zN3su)YZ7EwZz8g#`e0DD5FHTOYMNF9C6h`s0ue{TcVw?aK~CU^Y?fjU3u+2?SGb{E z@v&oU49-@$fL2ej&U14pt>z{gW}2EPs=-f?kFl$|p_B6M@8CP}{>y{@)mf6B6Fmhq zx{}wwea4+{iRul>1dgyDb<8AxtSPbEKaq*_4asp#0($0&(vv+&QRTBtc9>ht>S!?X zzi0f)e`#YO*KflMNd4KA!@sZUep7jT?gvq|eO*&>Y^R3P$T2jc(h~HbchUtTia8kJ zk2Xwd@l%y3KzKY_=;WBajv+*!&@w6tT%?lyD*5)vjJs2^U$dF)!6KP*Nq|}fNeWtFT2y0Rpa~s} z)qPHe7x`x!YSyrq96E!_I@ZmS8nwW1;WgE3;gJOv()asaoTZDqSr2`z5a)Ow?!}D0 z40$q+;FO3hg+!=i;d$D8+8=eRC$+^7)e_;2gs=*&H5%nc2B+X6sI_bP(pM~6BtW{~ zBr7yMJRnmWH(9l&4jtKM3NwWTwcwn^DW-;ecAkyI)1$C6A8@ACI36Z2=FEg9in2 zi!8KI77uY*-C`!K5nXqS2uz0|6yno;J&H)rLi7=BA3n^#}{cbms{}-`#BKh{| z;-8x3e<5>rum6M0mDSQ*xtCd^AkwXE`tR^1dP#>w90NUQ8c-AfOu#<5On4{37L?aB z9wH>1_e47;AVSi!MvwCZcr2=tzbKb=g?u;K($P2>a(|w0X!mI7 z;gbMtzK?h}tCf|rsJBe?mXAq%Jm_Ehpx0kL6aFL`-b0 zwG;enP*tdv{$b)+C@c3Bz7Zf6a1MN$g%<{Apu-^#G;6jv4rd=I0Mp#4Qjtu>p#4D; zmnptU#{+RE8SN9+OLlLy6tid4Ov&09lQTjIkEu=`cO)H{qc;t?+Vm6U-e{<@AE#-{oK#}=)U_jmuqZrd3;^Rg?n$; zW|wpcFTwGpz!)U&u=2hwWyGIU)zr$l)g3ZsHuKH64~O_dTOcllJ?Wn1YDIu`F(1%9 zA$t%{LJLXA@)G{5jl4L)QRRNtE~@_k2Q0@Et>19N<^N$8Rz2G+A1Y;|n{W&-Io_j8 zpIR#J^)UTvX+*bhqIrhRY7^3GR>-LCaMaJ=pIc{&j#-(Op9`14^`7& zMLpBaUO7$&6=yWkRKS^lg^Sn{U2Kld6=-D^MV=5--~f$^J>mKb2MpFoo$IG2^$+}N zx-F39ehhs8ideWuUu+kM-I>AU&BIbi*XQtWTeaWzp~fF*e{5?RKYu!GPwn8Cj;~+D zCtMUC)1jGzJ|V_5ab!peW-&%I{FO8!1I8&n%+$s^AE5mt-JSwTWM`|dHrer}^KN(Z za#i|xz*?KKT&u`SU49>eHsQ13qXk_km{>(9B+*U9zxYY08n_;U>yvu)c-;s}yuB;c zg+|3zlGbwg`yPWuJu~dPsU%iOyq2sDXP0^U#=1UQ!pzZ}SmzEcq~=&Wt6H<}r{;1^ zYLu6QLx{DN1Uq|vEk`>hSTDruVFlcKw*m&}zkW6HM-cZIQI!iThRYdZA#pTfH+jw{ z&4(!Kk3gIXudlkfQVltuRK&#H1+@O1N<%E8AwBT)dR=S&Ud4`Wq@OoHrm#A?^>PHi zC=H>1yzqc>_ouH{MN1c8PL?A|gU#^$CsNyAi%88T&*zyku1c3aicuO}OFm@^5wUd> zCZA5*E-Z(W5+p;%4e|l{rGz}iM*Ue%JVr@1 z?Ei~4K^&I3hQw_*8@3^d(?D+Pzd%T8Gr6|(z#$q&$s9zuWVc8bWXp`qWVz8@W~F9L zM-7u4qrLO{QgBByNAMqS0P&XzFzN5)p;ezP@a*@(;nCO z63BYQA0>OI@Ldzg0)%G|97B%VzmRj-s=}sF^bv7%Y+_eib&M{Z6eE;*RAs!jv@fK- z%ET0i5XZ*u#Gb4E^le`%V)W+mfr+uZ&}Hpy&%m#s^OcwGjQo5z-!s`ZbML+nk6p}+ zm5L9$Ywt-$_|C|LZLmJdyF5FT>Fs8<>bzO4dCexTIWo^LzUI8g%;AO3 zE!zx;&r?J|?l{5qjTJdqoAgf6iez4Fjz6zLVmGMF zNBNWTI0+EeXrS6e7g@yV!fowG)T#i`9*$)`xGgeBPdK;poFnXnD{u-f`aZj4j_ZFY9~# z^^M{vXIjrBm$Zmkr+41bzeGysP_NO~6!QP@2|Y1ze;8tN_5k&NUKa6hvSNkcR%Fyt zmL0X@Z^hVyJXK;(cMax}rn$O`u`p^$LO{-G%kdFGnUEM^3<~5~j37gJcf*fyoN64) z2WHr$)9#3sZc%W)4^KAG`;Cek6Qv84N@K*uCWr-qq;uk?g~?2dJr1qW`})7!Zh|nz zUwtMT`MO$zm=ekMHY#dO;wX6CbAF&jhQ*ddb_2-sNzhjOd$Th%cAD zGfrO1A_O~v-n)86D9lVoKXoA|mtJe6t-gn**)pj8O^SkR3BDuM(HHDle-(Tk=!tdX zX3x$06rBI+xn1MbdF#=LY}TDD$zm63nMqTEXaajL|8p8I&4BBo7tl;~UAQ*nb!S4AjW~Y&GeD>oNFZz=fo(g6d%xDGGBC@n z`86iKb2Q(Z>UvLNGS1P_iLNygy{IkQrntjb)n7dDlr8-2TSBCi;R1)7{cXSV{=^4MY-Inz4;ey|F6L-WwY7`=C()Y=D1$r6gsKq4%=TFQ>HEd(+wf5 zW9nx2=8>xPPtEjIV9f($XE7244-P%*cjWmG_%6wfl2fNznGVuBu>(}R&MdwTkt(_a z1k3qxW`hyeLhAn>xlE+=8bPaGi;P8*8|*q>1m}))KdBm?b46Ist*3gDo+gz@$B6UY zMfE2Je~l$YXBHD9kGR}FQ+t)}t4p(DFBn<-H-cij58>xoX@$!dMNsMp_WTc={C^~U zt0Gb8Nbi2Kra-*n(gczc*~%$$57X!G&yPIrtx`i_oY;uhY_Olm3(QzT{N?}75#Gv; z!ACs1P>W{?kFE4}8+sB*O>~V3j)gcTI?8pTh>7g#w9memD4rki$gaq`G(m zZE2O8jlD2-inUhia2}o8PwV>&_<;$wT5bOlWle*!b|X)2U=6Xc$Ze9fn8ZMv5lo=s zVwyHYLg?Bh|0hp=QO&$;kn$8r=)QK{J&NQsQ|zB?LZn~-%46=Vu;Eqxv{IrYCqtp4 z&3fXaKW6{yP;z43viCa1$Zyf6f7b-wI34|s>z_@i{YSH+D8U?FC-*IQWDfE9DHgt9 zc=#q`44rjt6*;IkbAu3DS0%LS%5~!1kXJC0JtYqJE1OD0wwr^C!1`J?_wP0Cd|4Yw zYM-S6h+ISMb&Geh_8RR)rcZAUP@C6vOm(?~fL1#>W#1l6fYSFpWOJX(Z}`r0c_nS} zS0;OEQe0JTYF{+do1@B{?wvszXUUv`A7}0-&y>_I<&z;tpx%%`JUwB1J?V=F_otI4 zSg*LG>nh!&AqTDH5NmxVM;gZmHX38;b?b#*J!r2wr(JMEIl2vU<-;bx3HLkUW1!Nn zb{v+aXhpI7lP?}cUbogc5|3gbFgO)g$9UK8*vcFraY=CI{xvHJzM!g~u$q7KzT#L8 zzbq}b0B#$`cdn43>`(NMa*PlcX%7mkSt!;N3*Up}iWbEa%8fR6&&$lTXzp~8od@4f z<#SS%cvY;4WSqAbVxwK!H|*wZy|hkTVH8v^A#r$%FIa zHx8v9WP&TsGn4*!Av1QDcMLJLL;f7k;qQ<8{$zfFWr&~am>Ru|#uw^kB#%I?m=_Qs zay;ODh$(DP7n3QNQqi=V;J6fN_3y!O5YB%i$ikwlPV76V<%%Mc(wwRRktqi@Es>cRMutfLPz z^Jp^eS2j&Qq(P6fRJpccKXQ059xGJqvXO$xUBDDtXlcQF(E+TVbF_x;QA`b|kcR%V z>2J?=AkD1Z=5M=4Ok3fpcvRf%+5LNQgx#8T%GdFnO`Pzp@bo~sD$q7g92s4vbsw1m zhWcGLYkpKmv*#6Pny8D7=l!$sH5ucXmEdi~W8hoZUp&Xg%2<8~OQ`nW9QA9mQ)X2w zc5B{N(<_ml@@qm$)}KK7ewb~62)LCAl5%;Ih6CJh7N3VEXMZ$&6-Q4E&moyAxqF%!{Kr6QSdtV61H_C@{`{Kdthi6 z@n*U=N&cw#Zk$zavIkZTt7B-K(HY26ahaz%8(1IAk z5t(b{^C6>ty`NMrp3O{&Jzn=$4Sb8g_%6P#v-=;kDCV?A9~Pf2#(mlmAK%5rGH(R* z7XJKf*8`+-4UnHc&J~jp^flt$n10Q_@m`~Pm6lErbdUp^|I|?dxpJBd{IGyRYbscH zaKV^1*ryZS_|f9=HKDhL#s9+=7@yBis*u6}FITY&3gQtv$}!5ft_aHv*%#vR-oNo{ zBOPMm_Xpr5MBh-qN)YUFw#-BB5jlpNgkw}uxzQdtJ!}V^se{NA4No3}ZrJJ|iBWGw zdWcT3^2ya>xO-uc$~OWhKT>4Q6N{8IQ?Xgh6 zLBb!t$m^EJ#gZ;Jkb4|LZE1kYESE;x1FsIl4vX(grCSkRkrBJ2Jf^=IVxlSm&Q2NqR@uSMrb@E|@_b9cwUw-3> zXd!PcXN5w1VhMT%#joehI9C}qS34_?>CGO5H-E_Up2@63d$D|-u)$ z6k+Eghrg=QF{y3y)UgROpu-C6x)}@Bbu4B7|C6Oy{Jcjy4VB^@S^Hy z5u&?Wv4_zBbG|KFdNfOV8ZpVu#fYKh+Fj%p;`SKX+sw!L&|^r}xH_$f@EzY>LDEGr z$H>nC!dFFQRIV!I=$?f0iQ$%>G~$0<4*gI>&D8|9q3h`?dagN>X|sxBVjEGJ>dz~m zez|UbjM*XE?m_cTto<*{I#V;igqWI2W(N(9Gx29<4)*X?&Nb$TqJ@~{?2cM+00>Ed z@B+F58@t&OA@EW+v3l4Ec-0%E&lyy6%nN}Wsm;E%J#pm!t7ieuPbI15aJUtc~MuhywCgke?P(7F#$2QHdVgW5TuHI%XTtLnc{F9E06?~?8F{vV164mnL6>3UyFs(u$ZU7CKBGBTUEn*mbR zTh%UgH0a1^AqmzVMsETs5O^e1kg4kamm{f2(_Nt(Gx}I8B@w14gvO zd3l(whvlzL2l*u%mzb>SQ6i)hwvnH1M@{HeTEt(y*So&DG8>OZ?pH%_ zlz7hW|1-9Y^G>fYtZJ9lF^Ye69UmNJ&l#Aj%x$L9O)08^4(hAe{XzzHJ-6I%J^6!` zT3!-e9-VK4&vziLOt=%dtNZK+LtCl-gn>zpj}wx0UMsb*G0SIR_C#*43#fVv`0aPu zLexKBF{-JK@%E40I+a10dlc(S9mY52+CG_|sLH!roNCK{;Am6;Mq1u;e7vHFt*d(C zq*X>`9S6}>oz0JFcSgIoXcd57TiB%mNVpr}GTf}tGpgz{p|g%G6)(oAK))N&j;@2L+j%ssR-_Be^oSBuAzsf3m>|p%w3jAqd5e)PQ44!`U8J; zLkP}cA=imj>yZI;X*uS>pXDr@Cf6I1`&sSMOeOd86PKo!yc4o4VQQrTbAb(B-7dNAy#2Z6vRGCHSUyuP_cs<)% zrl^U7m)J38Mi>8epq5q|4Er6@{^K@#{b*OQl3OP&KL zoob(-Nt>9=Og@+O9;KTn)OD5(GoYhwQC?lAoi^FhT=d%l6P<{*z7QU6fU}G1+9Ugo zGi8n+ZBXq`$K+JD5yVz@`Oq3AopeWm4PR`aR%TK?RERjJ6p`!{(zRf)DI@=`;XifK0MW>i02E?gv11iX8DuJkdj@=nttNbU3~(s z?|n2l_lnvj-A?&UQ(w)O)D0@YJr}Ayc_TqD8-hrx+lJixC!$pf+p`NO+xXIC{U|Ze72{Se2 z;s}vl?Ns-o@V!;TDUNe+m%`$5{;SE@ADh6ppj=))l}SGg_f*u0OI`k6vf;g^TpO+G zwW@wV`y!*7{(C$o8eES_%>Q{j*OAL1*Fh8n#9w5Uy%$su(Of>5l1VeE)kbl7EftK^ zT_`tEeF?_{RWa&f^bP|SqDP6__r!9>RKooOy^ zKBAZFW6l9MFqF8%Wxlp-p40B@*`XN|n@2vP!p63ZK2AqAclIZ|H4Zvxw!Vt_X4Og- zT^f_n2b9!m1dqHIUpv((Mf`gcQ<#hH@6M$xjjZyb&3fP_82bLpzcCV@BFFy1xOH%~ zsv4@%Kj@ZB2V&zeJ=-ws!R?EmqtQs14tnUxUGN2&gY?;5X2&k?9cYxJoX4$z$v$jE zdB5vCho#DXeqKHCYu2_=Q_hXxua0qj-Jk$zdloYFmGV4|V-!^8GXCVFgc%b6$O()N z)N;@^x>SgCV7HaMZm5uxWY~+*DfU4ADf~9O$%^0fwkkmtR)!OEV#zp42kxWv z3WfGVLFo>72qnDdXQWUr~msufCzVGkhm< z&}QH8f*9gyO7Nj}Ct6_R?DZP>ROpxVsZqlDr~@0(P-N2-fMPT;mg17iPFko1p{Po- zcxO<31(lMjjkTktBR`A(->K9D2G&DbtxnT755oTG ztT+P%vG98a@5_)o+ZZ75rrrj*F%2G}tbpbx%U6F-zM=fBw@|N3y%1J|3|vu*$1>#4 zwmAPO{V5XvqGJKBq_Buu>)d7qUW&d!1?2Mk zz?M`s@S#Of;4B?zQ@&G8ZxyCSQYmX7>530Mpz6Z*C*V1%Ky85gXy}>+HxOIKK=&+p z4-C1y@-2ngs_B=V?ZcJyEK*N^emkW0Nya1yckDhud`8iv9V1i6)-Aa_K$!`f!$6VB zLyRflBb!T*NSlCk4E`28xp(OMGPF~OUo6q*Ge<^95LV0D`>r>jIcDI8F-+6vXPu9h zr=&cPB32?_BaVR@snAJ^bIO9q>Wh)YyMW&D6-!--5xFq7rBH{^x9g+vmVtaMX7?G zK9)G@kn@^*RbSrMdPb_{e*U?|*MNd#uKd%1@B=QZcwVY!dhf2Y7C(6xx`0Q~t;>fB z@O%KKZ^dor2StN;lF|D<`2OHyo{WM)My@cP&*S@lBi@C=f%>~2e(8EfxgebX$F6a5 zi(csca;LHbMtGWBk-(fl>HxecIyxQkJs}hiZaB#Yl0D9l|Gy3lp3&dNO}=4dqAB@8 zS72(us4^-tbHlQ*#~Cc^27!AbA#mwD`H3StR4li!G=Q__wkZ znAs?z+O*C)fhwpsyZ@yfSLauqPxl_9);3ca$LWJqucDKq^cUyzJrB8l%%IbcG%=Gt zb7qTrVI9?$D=b#*f0%IxntyM9eN!u8Qv!2c}%S-RsYej&^;mrw(VLe}Nr6 zL=_$B-iHveC;o3-7Z7~7IF3oi-&66tvJ8T_307pq01TtjjWDiWC@u~!<-eI;9J}4I z>gK&RqnPkVw~s@!15Uho-+5IZgOw8v2H2_h8^wo_Q#A#OP$50iM)?@jFEY{l$XkG7 zER4T4E(X|xFYQwVvrSB`iG2F+h#iS*&mP%F^2xyP5YFFNDz}hB$Q#G~fV#2p1Jz8A z8jFp%2L1K4R2zixn0b~=1c_}%msE-!umgk*;O?akJz)f79j(TSsr}kTWU2y8=frTi z0gIEp9}51Bxv(UMi-05Bx7r4%b;*2Bo;{_mQn_{s!4-iQk@a{G(?sGT?e0J7aU%lE zZ=Hw7BhaI(EU(acv#_x_BQ#QbgV;EoZNK-neghoU<*FMW|B6^HIWn@k0$(GbG5MU^ z-2QDzN1)a$_)W~QO(y%5NIU)_Ti~>2KWwJ$QbIV3Xi`y&YvF_OmnR}PE~R1rmQppq zJuR}cN@|7wD6dg7>*M|ci5-Fa5v(XUjl}gr(usd_$Fu6yniCHjUs>c$r~FTuY(}2+ z)h;JyZKa7GD5!02X3D=3<@^OYbDVJKP0cj{hWbKz~qT7?8wyC`d z{R6#-x+o8MAz~`n9i!Z#7}j$UUMLK`#9{@C#XV6V1@Ucr*y}_WDep_vIn7eV@g`lzfb2lFU<5>R1N;jtoFW#j@nOS zT*B2swLb6v6^7y3JgOP~7xSHT+@J)>n;9Rwm+vy#K6Wl`X3njno{p@fbGNE?mIQ$5j50*9o<80)5FpKp7UQ+;C8O+St7fLKj((TQxxu?z_D8iFmQyU~|9y zl5eHhQboi5H{;gjk@7?B2)=K;YY+1O;Cx91hy+40=HDN!&`arJ1Rl( z*q%I=s7k=Gd|s0sLE0bX=x44_~Loq0LOEc>NA2r}=)U(<9 zu+mr90|#b?qSIZ$j;ZqTWbfZm?L%A%<%$JZvB`TtMnvp{g#ZCQc`JU9x5~f57qL)< z{iNi@NoCa1MOH0tlZ+`N)__kBvV>e)Jy?_OpY3WdCVUuT@dq^?^0$Bmq4NewMLZhq zpikZlF*DDN;n4Tqt(2lY3GM_*u_>$<55hPpF7&sD{OvTu?F!?BSW9$*mP6ra0`c5v z=~^E-8!Ly4y9A|_96OgUoYn^(7k}gUY0Is6>;qy?=_O0;`|a}-(UnkZHIqB;rvZzi z7pOr3*=_;$8X=}len+B;jHze^0Qh~h#I`@eERjWOwmPTR6CHz8LX2ps&F0_AM!EQj z?%5D{n1Ng&YL}@cO9nTZ?<33;96!~K8vuGGA0(m*KBzv_m~mfi&Q{Ow&KpP_9Y^J% zI}2X=bFQ%0INa_m&sJDb!mKZxpe$@7CF(?08RZ*zhBo-rT}R%?9Q0qG0v&=l)X#bKj6ZlGx_Q zne`I}uj_y0B?zT$M&z(CG`H6q$WgaD=L~?sO^wCDM2Fs!?7ioO9c>rpO*DnvPGJX9b5T4I8;=JU+~yie;(E-<1$h zU%9TPHbt2$&uLwRIQV+pj=nnqHR&=>;w*AyF+I!?$kaOdwW7|J*u{3acT}~N#40?T zypuquwR(Fv3z=3U+{!ae0~H>d-X2-v2JZHr}n8g0K)<%-EPLKN$KTaFu`y!bVC;WP)rQMM9 z=~VVu)s4_NJ`sIF98IQH^g&l}faD>qiiHgl)njEIcG|4PS~m?i#d2ORZ9>c3FD2>o z7Us*Sq(mz#tE6nS@ZWBVRd}tRH9mu;V2I6z9K<>e8~VWy{~>EMU?J6_r!LW4RMcni z{@V%k#!_j`Ed?d9v5;;6x~p6m)f4=jdb8=x?t5&3pAWhh94@~3cj{HP1H=_Ky<+kt z*0&YR`6q+$5nzhD@zAk_$%`8sz*eDt&xwt-&gaF-N-it63*iqj|f+Q4=kBkH-f z-J>owsEq32Dd@3*>m1|@k@yXeH2T0*ZbYx#>EhhjgSgc0)UKNZG-j#hd88ZZ@VjEO z%Y>}z{Z>*kVPx^8?6&Ai;N+*q^Vimkqur^+=c6O+EeThA2I^qtrNpX>^nw7b%R1N4 zt%u{|3QhER@JEWHI!5Kj?!};6onIgRsezyfp@eAu)s1oUE}EUjz0qD^%k_J|eZq$Wg}ib>cEDEgMl{ z9O|L_q_!y3gZAW$l5EfwIrSWeFd>?weKEgZYQrEEh*;ky6S8RjO=zAcBz)dBq0Sdh zsEp0FtGO&SwF-x``11y@ClqX=BiBAZ!NEr*u@e0KBXh`_$zTQ$u}bi&rfbKL0_|GU zFEv}Q67I%pgrN9S@8@pi@g!u&INxx#b?9z|w5d_U=}P^Np$%lTTH|TUID1Z@e2>^P zq3%)k0fofqKYze>wOX^RDR6uwbMUa{`WsJfzhUBU%tt{$qCcHql`gDQR~YhyW`D<0 zyXtrWHSfDhuNFLT^yDGAsX^W^I;l~?H}1+Hp?Rv5=Dv}JE&J1`~ZYY>B444e|%b9AYWSU`p8TdHiUXu03Fut-DVy59ZS6t_1YlTGE9Vg zDNU${w{7wwQT-v16a?$@*bxbaQTsbxc9%|tDiyC`C8of zkZ~`<^`N7ROJXZQEvfqQdk!=vSO46&>;fCpm&EehBbi-oOmu}f#+i5kB(HpG&W&J& zO*nqOY0e@7gSR!I{Kgt6CzN}*WQ;77Ptg%wXdYQ&vDe|b0o9NHABP2;^n5Y!71&ukzklBw z2Amvs2r`JMgaRj z?CWV%D@Ug|dWPN|TZoT&oy|8&_h5spP&lH8X;~3e1M(F!gOg+F6LahxioelmFM{{A zd9Y_eJTEjeu6Kh6M7K<6Rh8I7 z%;yZDD1HtOFteL}4Y%1~f7MxxG@KJ$KQyOD{tq!c^h$SBkvBZc!uS%|NBmgfsOkqJ z(sf>uHG9LZ!S|aZzCeEV@7F@nYgo|#8eL|uDb*x(nY5HNZgsgdyEx(*XfBLfK z8Ql1R7d0&`JOy|Z_i3a9aYyG3cl0zY9*Ae5on;1_>>24C91rY2e(FHNLj?1YrByh@ z&gBArTJtfEYFzLy2J^#Yd?yCR%03+_V?LH@iXrdzpPQIuFyX2q@xtMjXOyBMcF&9X9t}eK*X+vHrXNLiiqf?Et;LbOeq= z?>Q+zaxO9t0_!EQTXf?naU&kQ2cybOK0>bT0AUfZ?E3yn7YfwrVA6kf;uLZ|@7{s| zm168_*r7QOX4q4)JeSfd{yd`b-b_&;t;lm-I6p?jMNM`jHR`>79Q#V& zl}DB4*{Ynrp*xMX{<*de1@ohkI@Gux2@d>w3(t|PJsZK@j@K&eiTf6Tsjha=;YfX4 z9HD4ty{APqEo_@liZLUB9vgWs4(FV06>7&39J$cx<)% z)jXt=M?z4W^_~bRXPavM47`bKd;@;)v=B7*F>qO@;(}8|5>0r6N8zaXtL`eputJ6 z_S{^BLBPASNOP>dMBi;82JF*Wh*|p+(ecR*p8Bw#%UQOrL$Rq`hrVBgt0B+JI8LGN zAd;R_pamS6wwRl~Z}=vwpiZVbkUw9a??nfk4P`vH@#3)Ti!{3_mYL;Yz(CO2DI@wJ zL1%^GwhF2d1B~GNY_YGik8z^dF^p3z;TbNR60*p@nV}}{FC-n5n%OLT&}w0w3Wd9} zPfako{ksO&?0o=g4SdgZ{@@+(BcNy*h1!vdptul^huD-sedl6}+S7Z}*0W3D)7g%q zBilLH<}tQ4pqM8iK2-a%_kj_V^M{6QiK7}o16m8<%chCspuMckUrkP;2$^&nY3@cf z7V*aA&V;}?m+#TjYw9MU;bN9JRa{Sk+(B-BJ;7cHH-9IIm!z2o;`fcm6&dMP)X{(Ds*8+naSIF;aLIP;{VrI*?TzeF}7n zgNT65;7T=a;ma~&W4+Gp2IQv<-k*A!XhMkGbB2OwFdX!svbpn3$~l_OQLbQ{YOZE4 zUCDNjq4fuiwv(2!C|vF96G%~P=|;W;I&AL~`!RUEa@-U&A}03=>!YK@QSjm|GzM(4 z_;5^bmuml|97uFif#y^US@iiFnSW4_YN_xVR+|0|sY>O7@>fF4C419OKXBs>WDX}m7=_qlLEwl!YfpDkyD!z}- zu|N97O`nloLYQ)hqhvpOW<9A>k$nvB5vFJwaWYWYLby5UaaiLh0|5`27NPb*tVx*k@@50%jHuztr zKB`Rqh*|Pm@KKvb+!}vzn?}Z;-4^Ez$m^-9C>wg6>7P02LL+lutB`}Z_oEEYo)nQl zm0LEwLa(qQ#;X2Dk{O-u%DCQ-hlW^$&o=+YA`2cOzly!!G33|->w)mm@JQ~2t@{uf zDBIvj2IA%5a#bJwdb*3{zf8t>Y6A*L!mV3dEdMtH($p;9GeLajG6T(cvQE4kU+)Rt z@t(X+xcq7Ko+RX-GsJk2)M*oBqAtBq4jC9_tjY(RV!6obU|o<}*0BfOh(q?fdeGHS zD&Sk$O!lCLBPWL9r!~3-4x*P;5+aDB!^!czIG&sv{|G2M>V(xN!_BjBg9!_r8FBz| z9^qQ7{1u)ldjI8)Ru(p(kpcz5lJF|rEmNEyR-dWM>*^p*(N0UgS$jMWAuzgR@qf7+ zKJ)vT+T&OPc<>*h6QyKF;Oor>j(*j%YaL6}BuFu;5l|_qMnyNYW9RM@_ zMC?VtQe!-+6+k0UpedJtQiqnyDPKKu%OtBypcD8F^T^X9Z^MOEpepiX*7eppD*ZwZ zol|LVy36rT=X_M#Cq9e006&S$+XFIgY*c@lFi{a*%e#{oLiWsL;N2x?zNqOz&`lA4 zH;mSTgDYBmYap?OEMOg9$dS519OW4bgcEFgR5B^|^;Yn%hXy|=OPY(t3pr4}IT^?B z`U+m<0@nWfwUG_{_qUU|$;mnIneVh>!GaxWd;&QMEOX~bqWYX>`ws#*ZCzO{1M2ta z9_oFwEfehay3N<`n&t{;(dN$eH!bv;22YXDc0gh-dp_PW^DbU7i7n5OL1U;t0LPg^ z7G|;qs1T!FkpB|01xK79GFXLC?{a({wWC@Sk4M0HlsP=Z@9~Z#Fui|{cO?;k06+Yy zGO8z)TCG9?#L>qTn*psN?2+jquvZIsVI}S$sQFwdI9wMiK#w{VVWe89Ywf$uURk&4-OP)$QAXP1< zdlFmHTvyWIblF=@FILaiQ0qIPzA%?_``l{A>NBr``Krux(!mUbm2|_>7}X3kmxL#B z5X^V!vBb1+WcYg!M}dEY+k-!XJZM){KS?+oCkbi_evv%h<+>Tv@i#xii;MYz^$sy{ zL(J@O=bJISs|IQVFLnbq9^8c~6_yWs=2{m3tGF}dYoMBZXY;LH3#f;Ki5pmY1BpVFR2$7gv5mW&)AS%@+@j^L;IVGdx~?dp1A{md+~~NkL2T)3 za`tisQ=3ZAjFqP8jsK}8K(`^16F;Qdr&_kbA*xC}w#DEMnh0%tiK9LXiJpTRX$iH9 zMY0`)>8`%Dna1K-uYfvaM&0^mr^cwpcia zD9ZNNQTdw}X%PZ3JF4h8>`PdqQ8wJ1QYMWSb7IrVVtUtu!8oc8=uOy0Y?h)I7Rv;q zApe3NZhGYacG8QjikB=D`k`a(>6%&p3oeEns__5Hc0G>r3*!waw-Lx)CzlsN+MC?4 zy^MvL3*0)GaB|q?Z$zj8+nm-!R6)XzOpsDteNSPr-UE#O$Bt1MCC-G?^QbpgvD(o*}zr4gPf_ys*jGUHqB2Dr;8OS-A?ebV`%CY0cIEQxK^ zmc=$|i!VNn`8lXD>>%@#SvSvnkKE#g_s?^64MunXk3X|AHQ_3saNrwrG&KKh!anK`PlRhW4T#a0)p9+`MiI;ZCSsPQ#9+dJT)Uw z@JZDeAUR=cxN_J;N0+-et6-%Whm{ zb7$qBW2wnuonqklnot8W7-F)!-t)_n!uAd8)i=a%iKC|KF_rJ_wJKSUVGfxR4=-iiSHq?VM z{};@{E?He-ML%=^1L?A6%O7O_=Exiw7o!bOr%~pb)R`v7`3tK+Cp~l9_sdWo2@*ri z5*mEc_Mc7d;ncF&BSLAXiAv90sHRGjaYC=4Ov}5?)OA&9@RhEL71{nb%J{d}7rE}g zM450fGt=Aqq7^UV=GYPtOd}x_U-F&WYkoy$QQcd4iI2vL(0W2#B|+(!@Q}!J`fVBR z#qejd`0C`kP{PmXz(iR?(J8LL0Ut7tps0P&U?%xYGw_&()Dk~pFpgs?i_oEhB+H%5VrCjj(R*in-491!?&ksM znkLHl;$vct$$J%g!t;0u3hdOUBL<$gNhh3wNj+TWToKvinAWf31DgYrj1YXLb3BD4 zdQ-e?=n26Do9d(!x5+y=pNAsxo=F@XPODq9ENdLDhxB}f-z@W|37YY)Z0Rd+n}GLBw?6r9Qmudf5ioX@%rW%Q(=QBK;q!zhCR8?&xL zdp%p`a8l9di1FvLjKdC$p<@T6z?{%u-?}gvljTw~W~1ZNp3(NNl$`SHZL8s#*ApM` z2=Onvj=Wa{0QPSD9}Lsu?a4A)`^wGS%f!kd|q@^IA)%MOSL0h%8v>BYDE#-Xv zqvRP6@&(_G^WaFVzK2;k1~?V8D2b9}Zw)C<*KS5>zB>V_RTxW~#rC*tL2ZGAR%|4o z+k2O0jkpu0)CL5>u!|Vg;RW2~PdV{}w~PhhF>ZfCs6A&uDJ1yb5AXdRvYt|c^9)yZ zY}WSnPyz>;*W1O}LP981TV4@XfhSMm5IH|V_~`$G=tJhzsEcIM0=V}5yZSQQ_mJFJ zQqR&>V~MGR>r9Bg`-qK2%2J!|2t-GDQ%UwRM0|gvN2) zuH2$7G?GZ;PaEyj@}Nw1Aw28p|+uD>ANruB>%C3LG39GLli4oKDJGg0!E2D(7uJbvy&D5nO!FixL%yDgyzHy$ z6WgMU?}y&1Xt7a#BkUo8b=A$}<3fH|ab3Co#$-IdeX=iheNxNKTz6) z43e}**z0cW>x>k@86(uPrlH}op4O!U=Q>)9aIx}Y>8-UCb~SC25<7bjxln@s2JL3hQMT@N?ICeq9UQaF!vZVsy7cE!uE0DH1guz9?vsXv zRfnC_M2{k@I$JnoAAB=#AL<8nUva{K8LqDUK`oG5B3VQ^51z(CrgBj^>uxnG zqU+9b!i3hJ~pa zM$DTu^W?RE3rJpBpXHLYo$BG)DSYn}UsHDo{|oIFDpSjap`^A)EU-0UA`IoQVe}_( zw?Vx-P`Z^BmY?vo!<%roag3zr2x|iyprDZrDw}L!(s0H8c_O(`R;{QcIQJ{^`Z%-x zlpYCv>Ub_L7$|8dWQL)-*|Z%*l(A?m5Y>$*NM=tt_6~3 zTMaLETUxcv%KaX7QjT)}64G1Yy||yfp9eRJf!-n@Pu#5I%$nPtv$}_0B02NOXIAnA z57Ft*o};VU*n&Jy{q0`QANTxj8HO%nmh%ycB3%U9v>+L~zP?Yg;m_<;_!KW+$&O3>U zKA+|K7NBtwMQYLs_pKm4=9K61pyyeJ9=PC0RcpXgK@b$fozO~%!K)IhNo(cMKt2h0 zh`tkb1~-hHsw*=ag(*~TK}bb=4&7l3Yrpo?d{PyiEUxyvG3K}4PY&$svJfgZlrYtC zDt5PZwd;set(xatFA@%~93$1syg+6hGIQWD$w>%+GI$b%!-VBLo|A_p=^)k}Pu4r! zTKw+tynkn_&|U?s@qKFQa{-Qa`rH&7_Ft+gLSAoZ^D-pso z*K$l7(f1)QAif{wm^0Qh=Jx&qusJ`&IRH@%io=tYdrqO9xO#Yn1(3k@22>uknH=ps zD05~unaY}g`m(N57IYjPZ@clw=se}tMnx5>wOCx!;5__b!Tp2t(EBt~7+);seBBQn z)r667BPzE7)7Cz%PHY;D9#C4F)50fMK3gkReGsBnLryi{n)oS8Jou)9@3sqIqKgT= zoiQvj94empZ6nw^>|rw;*Q(^RxYjvlTYO9R^{_w2w}yQ?KNLv_HGHp?|ygJe?i3Vk^9|sZ!F_akMN#UQy;!0&J)rG*nD$-cFnPecYR8=YxV@E*#o2YQx9co-%+O98t885l0HGNBa6DM z1#)WU+mqmjkRIRp*moV;-=J+kmdNEYFixmZ0kM;e;*;)I4e+!U=l7m7qm<-aes42W zp-{;dEsLdzkFj+jI+Q|kpw;w08jCQ7DXXt-Y}VfB-WzGchn?rffLa~Zf1jTtmJ0PR z{z5U);(D(^t=iLs$spI6N=M%NPyO;I;AW4Nx!GrPk;fXyd5G8=~Z{+26zhfYc3TtyQbg3KzqRhThC8mR9NFT)U@^83lL zN^yBZ{VMm;I_bkFr=u~XqOwxUfAl=bF8=wy@^(gqO{^;V4B>(LnKnbQWXf@LaV3&j zmmdS>2n23Ve=6V|G?p)kl^FOiYEu}Xk2$t*(yE4L(yE?AS(vbU9E=d<_EDwN%E-HR zVCq7t2b+pX7I6(GaPCbink%OAKeLW^gc0Jr7}{p)_=~f=>#Noc<~{!uzkde?F)MVY zYcBA(#p-KUgRf(59Zw3y1Diwvo~Vs1=dgwX>*XCtarg ziRJ-B02A56C7Uql{}I2gf_Pn{{9K_cOPOWwmQ)3pAW;&pqUcH%(aOp${k)ReocPrQ z*ZlW7`;`aSZ=EA-H{I7CKi^;Y_6!@t+0RALfGXDMYn16p^-?=zTrF*L(5+3ae-cJj@PG9p~w(1Byl6tuzI*Dc}mi}<9L@fxbzn$;>xGKgx z>1De#l+TQ%%PjC3HAL?QX ztj-sHGBO>LT!BMO3sY#N<_S~1?<#5(0ZquMnA1D9^y~0lXy;g}6LicxX9XLZTs|nS8XjWx48;XY3 z&GBmf>J}b$dFp*bgJO>NPn5LW?LKD`PWV#AO?v{3sa(f3RTC)6Rf;JFZET!0&;(UMnv1CXhbVu$8iY9%=Tl39P4C-b`lw@MO|$<)<0P3yF9MxS2-pvPRJGf<~G2KEJ_mi(R8ZP)tKCS0gB7%(O zofW*k93-lX-RrV^t=J%9*6q7{YN{0j2ZhsXdS=?44Hnf_q(s-0S9=spD&QbnrzZn=KS5!DI~U%0P!4e2>I7# zJ7$RJ^V8C8C5+F^W6|Arqm22T=vc3nc%G6vv9SGtjgJiCMYWF%5NJXG*M zCv-)UyZMjbs#eTJbK16F$G{q*%+--8+mNFOK-kshw)M9LTY_!*LU`NSFxdEWQNQ12 zaRgcnu6M)ql5~6ESVNWYQ8cydIJMCEjsMvEJol7xSebLFRNHLFcN!88?Sti3m0zB;e9xR09LKY=>t9%l=r4op%!9W7MUKI1BZ?HR1^kLM<- zY|5bAKZiO>ho}8;{&uX?2NT1^`q?CB76kVhHQ9IYop%%?Q##VSN6}^=JcBTV#q$ar z;ZKUYJk^Zbw+{X530aX3J%9u+QP2xh+y3EpZ$swNF;KM<%k+~LZKVSB8o^0KjqoP} zFWqnJnOnvU``M~0T&u`URnt3)WgJhwE`pnFlX1M+gh2vBx_>h2PvtfVez^;)lDA^20xQR{3p~2irchts zD>3?IXR7rIUBeGD0uGrK23=40B?oQKwsclevp`kXR9^|YQssadpFAC$J+JZO0gMp?P zy)}ZA3R0cGkT;M-C4M8xE<{;D`CF*T(NrqB!uF%aKj(sQ=#}d95{_!37kyC_+ZyL^ zeH6#d<9Y*%iaUP8f4Sb_>AlMp)`o&^8r`E`Y%@xuZC%`@{6MKC-+fuTZL)DUF6^iL zz_4b6qE+*GenXe0Z@De}>CiwzxW(X|O}9EN`5qU0`~nER@XAl^2;2Ufxk2z{WHNE6iCBER&NQ9BJOLkMQNZW>9nJGv`p$8cE0i?3FGPL<%t9E6u7JI zvR=w}CR`iKhoGm5tE}tS^-hLu9@?u)IYvqOF&+QoT-()c8sQ7>V~g@2NF@%TX1y&8 zGkEOl^{&pu!0x&X^;!eUm}}Ol+cuE8ND?LuX&mGX?Sq~=u*cldsA!U<|G|AD^AFgg z@BO|#&Z@+N?9O6ydD2=F9XxnkTMD7sBGz%^t2MDPIH|C~4{uvau?5~Oj{>!GD@?u@ zicJCRJjncHramhAy;JoD2qAgo7_!7E-?~}2;zlTF@qPaj8x40oJWoDm@P?)WvY5xe z%{l_NZQzQztY+xZEEnZwTW=Dq=*O8K%oy|&kw!pf1B-HzoIhu(yP@6&j3ZD=;D*?S zZsWJ^G8h^rIvKmWweE8o-wzES7PV+wKi5=8C)hooP*oLSZPyr@^>wGnCwS#Kah6I&k{-dh97f*5wNRV!AdJH6M7UTs+_O-rh$p%JnGpSrZCHkglSl znJ8+4uSu>NwS9@$qX$?4RZo4f39?WYm=4gd9pS8e{KlMZf{3Pict-3wv*7S$qKDOF zfJTX*vG7ByjuWfQVyPes9ai3j@=y5#AeAa{Nv2Gr{S5A`22t6 zz`RV`8hx2E1rLu5`5_A)R#s>0}Ta`Oc( z?u}fF89ed^xi@6sz{-@wR*?L0UY8pTlakmx@G@3c`Oo%ccBz8yVD0o6^7Ag%7AW9E zHyut~BoqYjdhDLA3s`dvDA=w9#a&1W1&6-xE|$_`vq>C!zi=EJ6lOK|`N_L*t8=a^ zKIgx_vkq+sk|E%t`$8*SD4Xj2Ty@^0s$7KY8suod{mldn=)7ccnz*6PWeAMsea}0> z`6v~A0Oh(*3bv3>sA|@?+a5|02B_xoqG_kf6=sy!EV~?;39uF73Ix&nI}p7! z&h*JgyIaoykZtTIWQUwC8C`(Yg*j9k(?}$ z0O92Se8Em>HTl}KpRR0tL)&&v1yh< z3CKhzC0SfCPxzmxYx~TFLhgyqsTC?^&Ckk(6m7nI4hWgvRdk{9aX%}eAgwyyeP*nF$hM^7Cvz~_y6&p(;-uKb-Xe1 zU+ZSSG;s3Oq;8gADUm}8 zxKXZbWJdJPLXAVP3s!9bI5yv95uMD;Q_ejN369Yn|L&q?pwOY zb>dolpl7_%{&xOxDZ!Zri}<-z9v^((Xn%V5w*J7C=3&N4`_Q*s8^yTZIK|PozgbDG zPNUMv{C$}C-r!Fmd1->z!p*J%BQ~lmbwH2h+aEhgElZ$wIX6~cl}1@_7@{(q0`;}h z;c~KlL(ZVE*6s*S<{eQ0c8Y!}0LYXIhPRXaC?tscBb{Lng(W zW){}i>C0;7vXYqcGA+z_Yr*Y)WbXAroKVX&Q(HAPz9Bb%5C8Iu!k$+V<4#(;Ff63& z2z+X2eMPOFAaeTN&Z5-p;4I#b*4OZO}+H{d7-}qAQD;LLo5gxudiz=040O% zgibW{6Q49<^uwx7SHF8VrRn5gDk%{)J<~zBY{mjiDIc_M%A8kCtWM zP|6dL<}HqJWvAUW--Hv>LhB$CN%z_w-(tJq+b32^3VXlQ)*A@NRjb<%d?h(Di33N~ zcBFZtvc>SOeGm(S+aI!mDFmFyhqql0v>VrWdPUzsAR zY>{nLc7n(hs**9$^)M9^ll@O9NG=e3c?9G3VMwcEXsMVVOcZ8u_j@YK^*$-z`Mxg@ zk#wyGNUOo9FuvP^jF^&7SJgOs4j`(5vUB0QFYs>s1Q_q;W1V2q(*{Q`y!q33YG=J+ zBP4Ky?>O1~JDV2TJaOEwSkZy}20ATO{VX3S6&xr|w}}{4c7oj6xyxSUZ}yi}mSkM8 z^WN6<;1j`Aqdh~qc-{4f1-v~v7}vn~(%ImZ>^2>JDh)}izbRU`ePNGxAL zdIKu!J|7;4IUQ|iIR5gcG|E;q;$lPA|J6*ms3Y*+r% zdpN(Z*HUF2R&%&U_kwd49j8HNSeYK2DO{%-;Tv6x94QS~Tu6SJ+KZZwI}~_=hOx0d za!@>n&;8h0frOaR#JBdTkQ==-&oS%aVQF=yW2leNQGFc?LOEorHG%J#QD>szzgN_V zQr!qhmkrrIN6`gNGu$uibqGsGFIUQQ(^!JgMLz{9S8(n)1nCoHy94_!f+oah{qFa= z*+x(D@!Y}PWo(xD)QqeBOKSEz=v6B41Vstnt(_>?^Qgq-FamUvx?Lg_e4!I1%mWV9 z{9zRdC|{pyyemI#VD{Qy6jEeq;cpWk2^eX@{YY?DF-#ufXLK&ovnrpjH8~WOKgFKz zR0a%$@R5vBztTpJMbSJtSnw%1I1%~FWR_DxH}U)I^3^#w=|jW|M&S~iWnO#M*7LiUaU8%n%szL$MJDl&UE)+YcuNJ|E*eBb5ho zj9ise$TrS4-gk`h!Qb=A_C3rbUT`&!18*L=PuOaL0mkoCEEiPVP=g332Z6>W)kx*nQFR`@~<%| zj4Iw#6pX=Y_OkrkLB_zbo03HC{OLm)ifA6`X#XYx?NGLB8P^vBM=AypFmjEMsT)8d za(fhZNMU4?9Q%NeIe=w-fW;X((6d@3k_#n_*!7`YXf7A&p;qtq4OLdFdiOc|rPD)| zyX+U)qd%Y-3fqea#FEFj-jDIAXnL|zD0wP-q(MJG)c)05n_cu4%w_S_3`SW zdrrIig4zFbnpo_Fx1M^6S{3>&Kca5qYW$0@L6(7 z*U^z>wCn9NgH^8k`>>Q5q4XdDkG#hoXZV%Ex%T@@DbGWVI#r$hl!^)rndt1R@)|%k zwtMmK>?zYI6sSY9Bs%zSh&aVdLqHH(h6PVLFhq8CnRKNAik8N1Z^9|S+l}vO#32bC z(`xMdt@2x7AFmrKyPcIPDpk2z6O1>yC62BbG155ujiUZ6nb*6Ar@Rv*OM`T= z%z5CFEQ?Op3O~6}==LimRXKK#Q}J%l>YwR!E~SpijeoQx*e`hf4U9x zcEF_GXnJ1iZ8=E&9pV;R_ZwpBAtp=tgR?sk&9&{=W%~|HqCs}zRZ~>me)~K+_nyn~ z=Fyg}iOE}5IW~>BHJjN{s|_iKg*2Y~c5+L5%k(yHYA9Dvutu1>J|cD*nDqKmTe6Z( z()efKTPnMmbR|-xCI(@&+(@IPL6 zTj|9Lk^aJ0lq9ZETinKk(9RMU+6g0#Z`Jnht{rQ1d+2X4T+ZbuS@ze*+s2Aj2Zs!& zI_}O9X9hRviw3YW*QWici-0h0ghaRp(me;6ia2qL4(28X=7wZRNe1yGrj-%$f@qKr z6lvw1F*PP@;1!#1j`!$R-(iI$RX^mHqz>n3qp9I?&l@I_1`KIiO^CvC^Z}E}q(jP~ z9sA(qI+N*`3&C|~l+oSSf5hL@)6lSANzt3s;@$h9cS)lZ_IS7`q2C4TNNo}-0O4rB zVFCSy??$*uc0PM3D3O%hKi9}%UAF=rshDIlvLJ26A7{&Z zsAbdXn4Y4~>%+|l+BEdVLFY$NCQkz1-wU#U&2q1yT`(4Pm}HvJ=kc37 zO3LcF!{hANS+;;Z3g^<1xUKY50 zVLya$K2#FOiAJ*swWmpmKwW0%?vcm)*3m0-lBk~on=)(8t>DsXBi8O6Vf(PvrDSJ) zFD2I8*Zui%Q=tDRI#-~Ut*hENRxGM2YClWeo}@9;Cj|ZAbYpY4E_^!eC4hUMK!CVI=K@ zb|J*fEt889zP%Cc8Y_-Kl-rwO+Tvf^Uyu*4rT?C%eweMw+sx77cNgeL-gS zmf-mku5Q?rP`wkS#tmDk+f?utW2JCkRFHP!h+LqetWlx8_qXc^EJjS0axH^1vm|wa zCA%U|tgzT-DB4S>^AxE*8!(OYThk ztYZQ_FZ?fdU#6|9nO!{`Ojo$Kng{Jha>!^h4maeud9r4MAW)Yrl;#%$MJ_b>P|lo$ zj=9klRU-`@60eZ75U&de|DW{`MZveqE0>(2%!F^@w8; zC~f3}=unp{?nP3hZh zUt6c>SwKzd%Z9k>GFet%`REoq2(+ql^=tHKgH56Q(edn19(^d#cBsVX^1y=&ZG{bj zXQ!H+@EHc2cR6WgWxe6rg%Y7eo~V;olqk0F{F9(Sv}I`Nau7m4r!{IgcBMU!lf57< z;FzqwQ9bu3$Y1E2NXJ}rY<}-8=@Bk{)E5~mON;Q)VVfU(-?dABEN0VkIIaXAW!bC; zLvR+9l(pda`Mq#~JK7*?F1B?0GkMoDbzSmmred|Qf)KHHLYDGtsv7hnZL>6-ELGZ6 z1d+(K`NmuEJ+bhsP4v_KF>L%V3uMLpGn217Usu!|SMOi9P{5q>#=x53-GMqcEI79y zKEGMt5&(zVRoRTp1?H)w+0*CR_UmNJRLrEFLix2pEA9jnoiDKUiN=nvBWE9R4Cn7e z6G3z)w&!A=tXeC^1z*JC>&c#yQ}Vs$c;^ei&&YOLm(1opj}ceDJSpVr?+b0WL(g#` zX@`Br&=`6DbY=^l`}>Rac8yY2DLvhOm5b1@jjJyxpl=_@(D2?UBAGee8qqsk_=%}b zyw)=k*}Dr&C6%tc51rVJb)MFoVKhX)&W?rAFXt}vr zI7ppHO1?bD);sNricaX8QFp`>FROS-TuV|cSc}6qy*BNA&~Jo=wGQ}yL)YkS3(?34 zy&D$Vd^sGG_zU9SZ@Fqqb50t|(N(D#QzN1&B`&^0KeDiIne0i`>`y%PkJW)@^NK(7 zuTG*lW*J5*WLkaC3w{~Qo4i_STzuEuZIJD=yHAaz7HHT#rt$Izt#pvI67L=@e8e$i zxQ5l{ZyRI0FfEJVM6<~ct`VFlvSd<<-r<-mmL4>^f>*w5vZhqca{TJ1MK~vw9PUKl7HW zfeSaUyK9|wWsAaoY95n#3M3ac1tb+WDtPx}0x)(&U+m2RpI*JT9M5sVB#hmwFnEod zk{3F}E!RRU4LTnvQxTgw!X!eEB+{EJbb-g`iZlj5m6_(G3c7VejpuQF67N}qI9Aj> z?h7v5^Zwv3b%fZ=nM*+nb@2BF=3VDv%WYF;o$td!S^aDvGHkv$Zt!<`Og75jvIDWm zDX@u;kV%(t6(XOVwT;*mPL2p5e>+o9bJ@KK;QR$M{#~bzjs`-o?b7Zk;uJgMmrqJl z5D|Jd{yQauebW_p^IVHsk!HS}RW!Lyz5Iv_M6{{f6P$5ud}F?6-(Ovg!}(jOmK1Sp z&4*V1Yl50dj|*-xY8GE}l=)xIaO@e&cR$PPN_pQLd@|KIpKOyh>&fEm4}^;y_ec7E z1jNxw2*e@@dBdC3vMJ3Y4}MuN#UW3 z=$GL=8c?(yJSR=9TONp&ZH!ocF_`Em%QSY;p0E9iZ4lk_jRW&BTbR_5E5lvC4~Yv5 zfNg>Kca?B2U6)hn#-$ej^hNxYCyBAh)r8E%38rv!hCu2pJ|6H*@=1=7$ip%v8!{mO zT{3E66yG!tUW)5h**8nDm$G=@b_hO)y+od}p^^I)X zE8lH>^%CYo>CNSXA{Q46Wm2#gw zElsr@Q?q|cG%gaRVHMsm5OWOaEU_A-B?tSn*<6+UIb9#Li*&p02M-$D?VSzE$J;e zDfI3r=8sHj8|mxM@k!%_KSK0P4Sow@FP(62EFz6GF8(|PWf|^1)ZvsZyXd<19OZpZ__Q?0UIK2`!|YD#ense_A!@v=fywF}ax6Gi93~Bi z(qCJuEO8>(7ipqZ0e|n<+052rrgo9=A~(dpnD2T~T;nj53w=B57oY>K7nj|(6}`jA~# zqC9O5pnw>_Rqt5{x-1hnH$>Lfvbt?j{NXzp1}?mZ?jFv2H`O7a$P~PuA+8zV=K~Hj z)F)XLw^#WDf9sVx|LIx?8*l*guNcuk&UPJCbLtN1Y#?Hj&XijN-j|b8Uo-leBab;p z-_Mn)_DhQDI7Q#Yh+O)O$PP9AeCnMje#NBVzgfCvISqdZRM6!*YRh;(oiwWXFIqCl zZ@N@ukgpAtH_9=_f6SuN8fANQ!)0l;U@e2inMOuV?JQw2C;MOk%MnR+Wb%;|y(2rmzH!Kq3H=p#cZrrOz`7`yNK9%D8r zx%;dB&$=O7lR$oz4IgMadp!Qlb`S;cc`4}?~G-U^D5Qwj;j+(0?4$6H20UZ$BXixe_ zA*!}j4JendVv?YdHLDeIL^deEbSi}|#@EwNUtlstwN;i5G1rIMdQ5ENBS!b2uk)ox`0mklzCWm_C#|!!^jD7Fsg`fT zCtD`xuO3gu*AwP;6x=C+oO4n=bpgaR#PZKgPNzODnw9HcS{wD_3Qq(@p1DGyJvu_kS^R1n(GdSZFies7YFW-J2jt9oX=4! ztqs%y6{h*{(?6~;*pi!>BS%V3M7PdF$zh*t1hkmO3R)lp`M_}AJ%>~~z3Yq>x@Fy$ zuTr&J5Z4*g$5e2aB1bE3co!-D5^xW*c}~ec|1xqneMlpVQ3mqU`2J-?#mEKq;wwrz zP7O2+z_v}Db3w7h_e|w`XYwt>_#2CbKX60WCd1Bz)*+#O$RrM9Fe;5DDi53b*xv`Uc#k4pc!z5Ky~PVk(t4_MJjQE;Yi!21cZYv)U+I;XtEt%O z+Viq52lZa#Jfm-FZw}D<8akzg_FP>YBXqEPUOwS&jpL=Myf@*Fn%PsG&M2u8bxjw0 zce3pRE4|D_pUR_Ctx>%9Ns!TEA^9;GEBpFPxl!>o#+qmem+{9%%4PgHI;HfXGyo*HkYb`ImZ2jW%6X; z(Ykek95%(8ahP}y`^NCM5{y6X?o-S=Z(S3dB_i6y79<7N8~uuPeH}fUcz=@P&~X0d zN}GS0Jgt7fkC-QXkLp%T+96*WcIN?3xu9&y6yCo{4W8I$8Hx-S#8ZLr$CrwuZ6>1^ zW2cSR2esl(vaBnUsu588ucVbg0%|N&bu`YiwRw7He z$nJai=+fgz%@zeX1jn|t(`A8EAKkJ!-aAb z2^s;rNS5Z}QYSEfZ!TM?vVE;X76E|PG^aeYSG#nw!2CF6-IZ4jjK=+GzoLm+is$*k za7*CZ9NTGw%nsST)p0URb{NXw8Gv7idBmMYd>!VCM9(n(=8FVMCES+zTop?dC#1uw z_Uq_}UqyPO#KIs%4WprYG9#yd1agPyV0$ybgw$Xfd=Axphoz~J`>_W%X2;*hp_-Au zriL%l4DiJ)oY_1{1249;0J_S49oZ4p8V{58j`Kc>$$mVeRH!=}wb z9oo&q?n2ikviqy|#+KoD^ToC+Ctn>FWf}caOx)+i<3=mmCO^AiY!nkcZkTK<6#% z-y+W{(n8t z01ATN{7h9pEiN(-*YLkf-qjahH(x3>y5)?!bCd1GhBm5P!xkjk`=?X!&FSn)%FX;~ z$ek7NWA-Ic`*ciBPaJ<|vaLITO0iPyi-on^&{C`vNo@t`Lu3rHz*D^WBJcVgCIO_{ z)ouq><#IqPN$H<%>AnSqTiH`uJy@c_{xsfpo$=mB0YZv0SzQE!_K;>F0EjBfzM6RP z@oPA^D2x>6J8Yj7q8V&v&nz#l zs=M>@1Bxh=Pbt*0#151JBQ%f=W3kV1_L!fU^LBzWhkf3h0q11sFZP%I zI2mU8+2$t<|_D^}was{HT?=Gp(JI&o@R6pI-*y53^TB7Lip6v1r7k;K=8Y#Q2-Aq;IKz#1g zD83^>*aKBoR3K7Xrt+wH>q8};OnpP-wTp6asmzCzyG}MylL4^q;<{f}9zif*DbOjw z@s_XJUN9cBr|Wy@n+de8?a7)$8ak$f?aSitJ|jYkMK7Y}HT0Yhku@Y+@H;{#d>*__ zpuiHR1lOmaRIf@!b=!%&6i9uDNR}ke8hP@ZFVBh#(j{*}1UObR`D&9u)fUBuv>VRyLln$~t zI*F8y!moP_G399=K7zGw9DYDi64nulDMxNIZ!I90p-tk$$TXC!B89>IRn18;=uvsf zWLS$&;VSi%D|Czw`k(g7O+S|^D&(e?o{N~^oU8jSKI5piXue(f+%*!!gYFjw7H zA!2U60wm|H z>{pyogNp&bRhvrw1V~Y&7%?%pY_BxznZpiO<6L7G*LUCl@6JxBWULC`Gp9rllk@hwuD+YWMvbH3Cd#H9e;mJ|_`=!aowky=%Azxdu z1)`2yYd0!Dom*LM>xS>sbziJ%0=WwyjqYe+GaF;-IndfYTv)&=yPWT#(0$Ru13SOW zui#y?ZOQ{Igr?spV5^!JTu63u5nohk=+-TQ;BgW+Kwg+FDlMP3&*9sq7$bk8eo#TT zgNaYiqu3ML6><>WS! zgimBXx3z1@0aFj|w=?#zIYrTRFJDasS+L~n;(FxYz%aJE4lc|#x(=A`Jo(fR@E0Sx z8EAUccA%jWwG4iF1yJ;}(8Gmlrm|MmURycXo5WVc30Ilcn5XLw*;VvA5m&N|%j;X1 z@^mU@-@?AWVV3XiO%e7-70ymBCAI6J`waPd^s*Qh-M+ri7-%>3?&)omT`)<9orhia zZ9`E}Kmd*JsPgmlD!c3)vlTe}I6L=8PD-fxqR}=%uW^Xu6zv^Vt*UD#H89+9;M+fH zWqh7o9f&j7WmZOq(vuTyy$@q1Yq+;aL;7FOFrF|SQJ3?Wl8p+;8lvs~l2824<5}NM zXbs`Z=v5V&!cLBQ-qfEW9OQ=hM%8?l%fDj#vyR;}s9{@tU0xTZ?p8C~sgfjNCA&3p z>!3br8LBlsN>`5fsL?KpL!?p7534{n9BHpneXvrS5zJ89y1tghoTC;6M=OG_2=CB` zpuDM)1JZRLUL2Mk+M!)LlJdjL5J!I{Sw=p zbb3X;da%S#whf1`MdCy7%^{DHYa;%1uh^#(m1Q+J>PjA4e~_>@oJOQQ1HK zfmUv-O>EdyQ_CeFDU|7Z+?ctp;fAZFE6U<(P544L6(S+yAvpbm>_|(d<*ok5Ep3+R zHuq{-30OMOCBim5h{3;7N^%a+{rWZM05my~_R$DG%UU;p9ga!ESnHf2`~niAT%nqy z)3nrT703K3N!Ww{{6Qrr0}VMRHvxB?U(++HW4*$5T1%JNpS65oonv|5G3wYI>pG+2 zDqF1NW(Tt&L>g1`XSO|>Z`zVk*Yipv$EK$`AC{-Q zbltpld0%63da15KVjkPM`%VJ@l7F$T&A0W<0?sUif&Vp2Qe<1>0K0{K&4WC{v{|A4 zGo&N*9YZ;lt&IiO`euQJeQ9|qBLh7qoS5ZK4RV@)z7Z$TKFWh z;I6FDps$G*!iU9nkNKOL zaf*i(R}W-cPtBXn9~)sbDPH=ae<`zBaxbxzHcz%OCK-yDWT0N1}Ud&3n{fPN_?C1g>T#?%WE?K&>#2K4?wz%cJ%+-f#>gNkdah( zQ_UIyWq8=$f>w$~_^Z#=tTAp$mf4e{(KJ~qTfBLd&ZagVsY?_u)))d*VoTIJqkH0w z&j*qnD)xRZ1MI^(cpc#L3fiuDYhDoev4Ok7ZIn9d&uRQUftfZX0m22Fj7og_l z^GTZ$0@^ajqm&j2KXDxHS+Q9!lyO|^dOhsf_JJHiZs>F5g_-=?DB%gVT*K&Gmpmyp zXx7Jk>N>#=(V`oc-sStd*uKfl}kO26uR3-*VX-BNZlk*?F0Yo)nlx zHO{lSUqIZMlAg6yR>(-2QNL85no!Uo_}3B5^;;c5xKFYLyOQgxr5dCNtBZu zkK5#*_9?L?ET$r*EU{3Y*u%#5L(_0&Up5mH2pE-$o@nD?MgMjjLd3g+*BE`C17L7* zbm#&p##5*dAAD@2EDf0rrRA)1PTe<533DojEg5V3PD9$G_XS!@p(yLK=MYEWBHoc1 z&XZytW2j*wJh*foKYQ>q9S!pad=1pN=R?cAm}r0+{!N9Q-kEYmD%hv3vbw7kg$+{w z3nW)z0^5g%?N9M}FHoj7=wC{SCk-gf2O^s}M+d=WqE5yFifsZ(!h9qETu<0MPf@vF zz}Cx_27V`e%?(|Ii{e^?(%E+Yvh*cKw{Ft&Zlq1$Cm43bJ3{#!@{G`tTTm2j@_|EB z+2ofPzr`O&59Bv6eq(nyZBi5VH4~C(4)U(^5#*2;HzteE0+3|srH1kD6~=Eh8Ro<; zSwc_3A=zj9bB$F_`Tou^!n?EzJh7BCz3zl{Ieh6C9N(X9Rp;2g$%BfgMR7kZonac7bKAxNL;Irr9voRASoZFzNSsSQ*)b{7ETtCj^vKyX2qSH_WJvF%&hJ-57fL&Ha zRiIE25o*gEu}tWtUU1sE)*SdV#ex}y2+f&DT3PItnS2jqR>0MfXqHJ!A)YOj6@e%T z7zg4zJ(&9#R9+oQq%S9N)FCyK+Pd6wOf%coRKPB49WBieZn^3aU`ye^4t{EQpneJ=rVn!A9LRzb%NZQ-BxepBWRaCT?P!4dkVNsf-WDBd}L zijwNfI`4Bs1nv4}PcfD_#Fk=x4pSSVMnjTK86;=tK`R=w-hO`vL)&|e4hFJ}sI1enFNrB4%a)$@!;qCTt^7eDDiC>HrM-#@E z1ZO#O9~>&zPrf>*&P#5mK9Sr=qJgS5WbnQym>&oKh~PhedVvZzk}Q0HMVOw?-;^Ax z$B*9CKJD0e^ph<7T==0la>4`^>fd}575XTA?ad~ze7tA(g-`k=hmxWdRoi?m4#QX} z8WkFojc-XO?HWdkHh$OO36J;3;~l~ZT1u%omL$F?jAOUFrIN=?e(6N3bAq_Mq4mf- zwggqu9Md{pFi#i_oB*0?FGF(LsK++JxR9UcIqL0Dto3+))&ls5G9{H5i;-O?uBfMu z1S$flSpJr4gHvi~0#3psdpQ(Y$HAkD&l)~Zo@tnihXqBaqYZSbxKVIrb|RR<4Kc+9 z$B3ifpZoenck6VZlF2jN^RTQo3GGG5cgUlJ!lYV>q!l5}$sp~OA-qr8OCkIMu=D^w z#e?U^rI*&huF}ouG4!5DKeaE3@!xsAr_NuKM^E&m#6Uda@?_LD!~p%+;W``6nEoED zP^yd$^H!zFrIkZSVppX9yKjq15rNHaPoO71`SQ-|uFe_ai`LfN&(`_mq+5laCR|_A zt*(*#`n6l-;6%?G@sqIu&+;?Ux9}{-;5ibk!qt}I$Qd(oF^&7fC&wDE_tYSlX(~!; z=-XpJ10rE3*luTukp!#HhYxJ9@%bE!3F8dnM_B z|GvXC)KqitT3}nlp~eO=#<-$Q=MU!slY%LVn`>vk_VVE*X8{HJq3b6%O@ZDm>3>~_ z2%JA1afr|ltybcWlZC2K|I2tC_Y529-g$P~#3bBrD*1ukbRm{vFXoOWpeq24L^T^S z7Pd<$lZLk~uib(t0XKn?Uh|g<$v&x^*RO=*7_my;Y(NwXnpO3ig!^)&H#(Q{Z7}Xn ziBV;?d>x~@qU3V#vw#M6IN@tfmVK1Jo!F^Q3HFIq$q@w>l(It_jta_MFrqG5ne%yl zP-&^}o|Ej+yrowOn?w!7;Q6i<*!xEdEi$ENm3umW^C`hydDs3a(h@UK8F0~2*#PlF z;d=_?z^hGM#6_xA&HL5}?^127hD+2@fx+uCz^UyX*=E23Cmu9K z_x96B(Imo)91F=2s{si*Ki|}LW~m6U0n<4gdd4W`_0xr_4#U8a)pMP4jS+m@;P)Fj zt`Lkp#(X?a*#1G^leOK;rFd8Yj)5b|R6!}gu~nW}&K$~bAWZTckgn7h^qt@3?3F3rp?z5kN% zcAJs~t!LT0a~|-NP0QLI!k%yvp6U0jwANA-cv4VPag)(r%MdSWyR>-<+6!uS^7I6x zS4e{ii>?r^mw^VukvQJmx`&x9D!bwe`LkKVes}G#4|hNvydXAMXl;INbdCEfT@uU+ z6=yVKg5a3FR{Z*TW*=byU;qV^Adu-t;Ef{?5^M`*fX^c`tZu-zJ;={cO11(?+5fu$ zZJhGVCsN;Bah|gA)N`3wpWQOa_ftv=sbX{V2hVF z-FYEOOi4^G2An&cYLIF%u!JdiM}!GX>)3#SN22q9RSI3EYjHQBBPy{m6l!)(B6A(y z|D?R&Iou!Y2*FYSlPy!B$I|I2`dvp700vT#W^CIXsI6Y7vfne%%E?mN2VK?uoRo{u zUx1SqAX`|)C_VQXR1~NPZGa9jeMD#ja#((ARi`>dxJXNzgDMP%L=%k#tZM}Cd6)!9 zM`5z!yTAiOfad> zE^t3eSilY17KjCAxjnJjYF$EhS^dvi1bGejM?R( zyZfyRK5T8?jI!LdP$7>s6amK8r&k$Er9^*(^GiDAkjdx}H)a^2e2Z>}nm0e^C+FaD zH!-zK>#*;3$a=&53p<_$RxE@)@lTr_@;!(hNz;(PzIy~QZL^^U;&7B|PA&AUg4CC+LVlTks!*Sn|7({zH6r`_?;8Ow+40Vw#9TUpi6CI8d;QQE>zZy<4}bh3hzQ zbqt?^QDC4;HlWlpjBpz5Iy)^ZAM*m?cZ)&03L$79tHe5psLlTsOml4gzh}5L(TTzI z{&hLhFUWB9^=`RH*qK>tvEIc4DNUyO!ZPN+g)BPO~ z&=M{pU(wLbfPm67cqgbFVWyWM|Dz>+vIpEVvQA(M@{p-Jtg4Z^*V@&~sK2dN>@@wO zHa+CivDMRsN8s@hDV@;H;j1rI23NMrDi4{f0yj1Ryf@6!uT!Ax6Swv2 zIUhGO^+^f+h4z@_Olw#Bsd@RgY;KtMCH$2Q*e3k8YiixJH>Ec%0j_vylERt%}ek|-a8b;H*_zi#ZVU7L(hxt}6J|-6a zxT}7$-g^1Dkkdd~aOfyvfR>0+dE_2rYBIND8APmOCu}N}M+UoWk5Ww)Y!URXLF(j+ zu6^&hYn5AT#r|f0mUQZZy@c|62u*n_;aGEm^V#Qn!|14URYw`sSi9_NxZ*#bCT_){ ze_ph@rhgHbylLF;mM?YWhVjhTk@)QG%V09*KP#qpZfAX6#0Avze1)DD5GQeM zR4lyKyBReUL4##)&4&CsXcBR3V;t6g%mSGCvShxE)E6oNnq{Q=~z7^@&*`!Mj(k~*Uq`tl|`BLo0a%^MAlN(f{$b!twUvAQ7@8g*VodXVV# zD^lLY9xvXDJnh;`Zw#tzKR0k(#U{bPDz8NNK{r^}1c^2S4Yf|HTC>-X(Tl~WMpU*~ zAFcDxKH=*tF?w2h3KOhG%^1NT!>WaabZKSZ7GRj)(@{zJ@97twot8ZaZ7~}^zr#HS zLN=GEhJ}SK3S;Kz&rVBu6gZPay#5hhFO-78redG_vU6u3P-e5+xd%I`OyvkvT=?z6 zf4Tm9u7bqaUdSI8y%EoV*myhsZlj9bg$7bLXO5}gL^xz2B@FEBA zut=B-sKm~l=zzhn#l~Bi`U}T%KEmH68sKa2dFi;{uZn%$j`Lq4CW1Pl^XEuGdbP#^ zsXwGI_eB0rCvc(8-UkVESlGs}m&WWmdwk|){LSh3o1`!`4uA71o?xzuqecTi7r*YJ z>qLg(aGL4p6VVwxr#6j4QNuz&tQEF1ge8s2+YsY_SbRMt3;Zo=I8Mz2n}M^Po&V($ z-k1{h3~49t@fm;0v=sx%09#jq0#_ndGH?{S6gndtat6UA|LY2LO$3L?aA|k$;6gzf zTp+O;d01tBXw1Dk9N&YCyVb45h>vozqv;&0^m#gm3BH|Gh;k$O(mSNPG`Y?$a7eoc zvSSDG?p7kAW2dET1jvDFAs0h?tUVHtr$X^A*=G%0_e>}6>RP){xXZB#eH#`EM^P3L zM)bxJQ~qdReKRyucpfPWgcD)$ujIgQ9{de(<4Y`=Jrl(ZD#xM8@YjEh6hP?S1OuVt zxWv#U>ipR$me|*Z=8Q=l!0Sr9u6dNO#Hzo=&+ab9~}dY zis@txt-#OKzZN5HE+Z6{r#rQneu!WF>#1IC(CZiCW~%YZzic|3=h6N8@y?Cp?flz39)ZC7rC>( zf@CTTHrE|a{%ORg9D6{eI8|!N=oo7|R>4j@*RTi><(NN9fCSYYr^j*Jy8LnfXtTQ* z6IV~7&AgxjB}0bLePU<{I3;5XQc)T^mwEndhe?B$+56wN`_OLHnhxp9|F<{n)s-Pt zv3X#wm_gzk#173pU5u|ge?At!US;i_ZrIOFmY(moZPd%^Xi?AX5X042h?f6+E~47kZY4dA8(Iq0@SkW1A4ZgHhDk=7#!53jRLnAM$KWMu!Qdl{1fSOh<>gyY0@l{0I0^42n&l)T5Q{zzoCMyr|yd9rGVvppr4W}{ZSLx)i zUPJ}jK5zg#_uCm>24Wuna{&K%nCI?Np6xHFK6cecBlR``Wi;Wr$R>IKaZUcu zAM>=fS%2{~j=E{ydO&?=^IY+HXLuAQe~iO5-~%G#kl1m8<*Bxkap)!^P#V|_oWcJO zT_RtZn)UmlC+fETvBQ1IrZKu(dvozH6hZ^j3|1Vay1i#xrzT7I9CH+@J_*Q{c07wo zY*qDgG#S#+VdcceAfGelI&ymdt8vK?b|YYBQS?2GQp|XN4g((`b9={AbVHNVyYFF{ z-E;D=K_KcgcwLECu>(v8zJf~8w8D;5kN7(9$KWtMf9%L6!u)`*81_1`4|vuya6+E- z_R!e*|27k_B$!q!BS~;3!pc$G57~E;93gkB;1H z=hIyHM-4??rA7GMCC0In@ww_2jGF{}uFF;&iH8YHksVGOe5B9;p7n2Mco}3aUU(Lj z@Eu_9eml0=aZxJM1c$6A_2iNFZi4|*3^2$IezFO!L!}9T|}^G1uq@6QSq zT^EHowvNvV)j1OGi_1!^qxA-7H5%WS*p2Hyz#W2Kd}xjawL@s8`Slds>Ee35?YLSVJ9#}KL*qyq z0>O>Vx({G*TS6gf*GP;Erh-KN9kz)iT%D*11*(5$NVxhxupJ1qE7l~VeTn8Z89zht z*<}3K1{(W+u~}>-aC22;tgyN1kO;3(1|J9D=tS##~zPlLY6f~;WHJy};4#L#$m?3Lb;mhE@T`R~SBx(}5SG))z;CGE$LlC~gy z;5z1s|87#im6o(NCkNjWNj>r{_rg+~b2S}8f7c-YiwLu(NJcB<`J@_qz?Y+w12jc|8tGmte*2v>vl7>my*b7FDR|IfMjP&`K? zl+lbfZbR9*>dMwmU5xE^B7;D$XE3<}xhXBF;2OY%pr`C6SUmsnLy0XR+lfRSp86T7 z80E>u`kcT>VKy=YON4etIaQhmu!Xn;#R9jUMpOxK+)68m9BiilfK=&j)k}{!%4dt^ z4(B>C_K0+Fq`S71H>&H*S9M%9iI1)}%S~M-I;~cwJB#8r4~U;lY;`%=CMJgZ`Bu^o zuN`lASdB(-h89WxTR%i$>CMeWb+-m1kF>f09Zz9=&tx(Nx$vK~;x(he)|*BJ!Z%uZ z=SXC;bP2{vt1BG+&)6hE^Qv~GrB}WrSZ)g}KU=?scOhw!3}KFy#1HZwAHW$!0J;tN zP8wO!ZH*OK`R$i?kk#{`3mK{qQfccU`&OwSi~n}M&6~p}#pwKT)~6K{DwL*1^D#{D zV2{fb0z0Ku0QChyIF01#KTeUDc|A059d8)X_F&!u^~4$C6k~--yxbVH@&f}KP?Yjw z7XQsu7*ix#e?}!T-4lKmHHa#U{r=;iKsxO{=L8BQ3NQ5a&*G|8HKxjjMda-v-M;yF99w9Puc!ZPT_nXiw#*ei zaCIzxJ?7dI(WG5Li^54c4~}+X^@IiwohIO`hV2M@bj+>`$B#1j%ozO4#hi-W5pjkB_X`;hSPT^I_)S{>3T%SAX=u8QeO|DTI%4 zi7*3rmVDk5C$0_7=KG=q&klBV15~n;>%3C!@*qb&X-#f--#htE)ez59HH#0oqz4m4 z#M<%wwOF5#HB@cp$>RSyJHa#jr@3n243#%AB=`WbLzUvz`e{d>&SZ}!A+*Uw9HA4B za?~TL_mZW&Q4Fw)DqCj>vD+4h2M%s4)8TGvq`G(vU2I&d;xJ84}t# zB16Bqk;vys;>IEefCZb9i7rD$a=x>W-a+h_|M<}){&c8!VQ>x%=z-oPLx+>;&Y$7v z=#;rHzukdVXY;5!85FHABU7VHZw9+bbtfEDYnjFRMM?8g&qo*>2l(ZT5ySX z1Nlv=;i$%?IPebfO|g}>a)nRX+y&s}MP6cO*m%N$J7c51sW`F=jnR$8Xgb=piYRXd zWbV+8>!H_xDb-+WsPi#yt?O@U#Msn|U3(oG5l32Mw#rNnG{!bD-$Z_qEel7@QxJcN z?VwcR%WAL)2SJ-K>l3;=t6G}Q=6bS?X|LJ zl@vmdcE#b@`XD@6XgCvp7U3HRMBvB&JN-t&3*(Fo+m^qLJeQe?SAb`NT^n$03=bTe zUr$N!p-7yZJZ9L3FTeeji|Hmw_eWvim|DOQfG$c1W&we@<106agrgOgOdtt&FasDCis-eI^&r6y5&L%t;~zexoP?YP zHled$S7^jfr|vSIHNtQ@2!3{90)0I_Imzfze5s}5PUXk*p6JdPHY#^Bm2H2XNjRJq zj52!u&>u^ERs0$BB2#s%5vfpyw?GWU3o|0(4= zqW9NWUWCW%Y1S*vVzoU3wcQWd#re3@H^k0DR}G}dhTtkb5N&b#F@=F=6$^(;U<{V3 za7Yy(okJ77$6PhltjYk*`C;OOh@)YeF@_iN{_=(V)v+)GVP&KpU2VJ6;wa55|jYfJQYEKN>s*8O@k)XG~GDK97mToQGJ} zJTi*&IuQHvm@ros3r|xz#K@21kIFV+T#`9}_?2WHI8N4U zJ57Xwj#;LYC7QX`SmCd9Z6bf=VPp5}KUfEOix0b2*SPK+Ev|Q8JGe9A=5RJ)4yj5B zs`P6;a}nHxf4{SHAe`{8XQAu3qzMaqh1gzvF5zn$h9AQTd@h*py6Iyokk6A$@g)8< zDDhB+*E5R5sy4=K)aPS8w3IB2mXZb2z~+Cr6nY1)!=KTI!Tw#C_AZHall9vyJZ}=~ z{*jD2lgvQER{z+Mh9>_QP(u7;J@Ac+_?Nb?`^a=`Vp5G*L6XPd2m3gHw1x~3Y!Mt& zKStcBaSpBstsACI&BJGrITc-sOfCP?k^Z%RaSY}K<&I86`*fcVtlGS1t`2TSBF7Qp% zS^GGXNitOnNdcjym$V{Kplwp1QlM>$ctHhH&{agB;AO1}BrOFBv`tDu?wz{szU!)O zs;j%~DsA1}y6g%h1*CXs6Vz2ywn;^$U}+{zFOxP+e$SZ{)P48;{6C*R+PUR2lkeqx z&w0){&p|GK5`J3=bPKW-NWRhin<4i9o2{UL%;%sfo3gq@#Ane@1NYlAh;(9Nd*1T4 zkGG4KzOGm2G>R5IVA0wroDaZf2wwv0kEqZ~2k>*bPW|AZFOc-)-i!t57{}CtE-lSVtHG8mgomrdGS4Q3Jwy+zZG_Tw)St=f>r9wKC;v8do(YJHLqqLBtFmxo&-voSo^yMD2UIfe8pz5GK@% zC!2e|9(R=eD!Ol?<$cXis~nL&df6e>*btI*#Yk~R`_<)^-)|b; zmTKi2ZA^e&=zdkPDqncQ{XG}yTkq^BqV&cnk~iQF2R77nG^Oq5ofC#ne*~U2?pRK_ zCZAKpwt?SYb}qrD^vb^@7-6=k!5u?sOIAI@cqFXH*IK88H7eBjaQ_#;F#*m^4T|`OgmGI`0!>3!H<~ zoS!cgZhL8P|6oj}um#k)_jLMqb?b$4y&i6*G_z2Y?_$%>4Fz`xXI2+ooT|6}sm$}^RBkHPQRpNm-K&Za+;45NA8feAi$HY^6jfD$Hj z12VuB#5|Wa{u*weSGb7Z3K1P|bJ2Ai-?vs<_p-qHJZEGptyRNcc}px#tHRUjIm^`K zV-Agp3dO-qoQ%NhD?T}o*yH;6#va93T*EMvH6UQKw;QZ!6ssJ@S?A+9Xbuu?jV9%& zZMmNvXm$_oZv`B!u{Tx8Ap@o#8$2*pC^Cn}gA`rmDhc{`w65btQt;PDHJ<( ze0^2c?$AD zkvfG^bWg#_p16015jSFRY_|#Kv@mUqb_3$la}vBVjcSy z4(z|_mjx%li;;t}F;UpBQo$44qnuY;9VbgOyX^yB8%kAw+WQ>YUkDrA8^lH#Z-WfR zD_SVC(C^fw2SV4Nwjc$N@LD|I(V1;_$S);U^2$w#m#-G9P;H_7v1*49`BW&5c4IqF z!Y+jNk>y^Cg$l|?mYY^AU8vOHh;;0&gz~{bXaVU&Ar-)!ImitsJ%p@4RDY26a6Ch9 zIR(51Q-=BmvE0yoGHM7fMvU_gIPT`A)#+P+*?)#OQdR=6P3#kFj41VZ7dw;yl z>TO%-+(k8d4-!6)wwUsTt3a6@%W-Yn)IySL%oZ&_p1|V83%ds&k zud*L%jc>FUteqh?n!l2$aeJY5N2|O?5<0I`gm%sJst5WOd(~t5W55L@y~i@aU4kP` zPgmXe##M=BC^Mo7Z4w^oJYE6!T-+c$Q)P0r17zd%b%Y^{X{Rh8@4d+v8Ib#{1}y{P zK%}puy`o#c≪tqCrMbwL|AZ{h8fRzq*bX+|NTn^idChuN^($8|eW$pdRQA?{@#B zAE3JkCIlW;jJmtW4D9+Rm^nPG+!%AGAH6hkaO2FpcaI*`WXz~gu$NaPq@iYn^ApqJ zOy?PsLEre2I>G&}EdGG}BSnYotGQPe*Yz+RGHnOyiM`A$Hh*aQd;8)j_m|APqXpw+ zS?9)$n54u#k2Ne~!Syxl#vE;!g+w4}j)I|y8}p?502f~+ukoBRvPTm@5g1B#4vw#W z(bXGm=L-=Rp!FJng(P~)_lu-0KKF;KsPGK~s|7})a8Hdif zGB=cLe;mL_LcAxAQ-Ii_i24HS>HoJ6!-ObKp6egYb7HV9h(i%!KM*T(Xb)~HNAE%2 z(w~eFcWZ^>wZ63juAKe4K`(+P0Us&(FJlFo|V~BiX zb_WwszeU>m)&sY)f7V(M zjO`_=GZsbXVB5z-!8NCJU1mv7Mcf^tt#_l!Az@HYA^x*z-VD?gfW8(#k)6KfE3+a; zYx%~p<93a#KeG3kPNu@ub2x7xIL_i7t}(d~L1($xyQ{GQldi5g&Bq`_5J#WOd{h=K zz}?jQS`NHq0@}IM?V3wI33xTG`!Pn&=n}obG}$)`&#_IK?@fQ6{u#+V%y&hbA(!e% zRo)D3&}3CPknu=1Ux0D+e*kTfF;;YIQGp452E!3gr)t0lcdL$+Lt%q8Qrdy(7;kRN zo#+n002emkX+RH#jVxto2ezm&GHM%Pe`lKXBGv-3eec4v$PwQGjSO}!nZYbQKTEdo z|2~8Bb&nDMBSo;U)qy%32#-JkWb$fZ^M7A;0CNNmg0V)JV-)`O{k=d=hBa=;(Y?Y4 z)K+wb+&gJAj&X%WYT*IL91XWG7p2Kt1?nS;%adOu-*nLc$O63?LVWtTv&!mBEj!(KB(^9z3G#dSX|NZMQ6iDb?m< z7_?!tw>uwp-p|i8c#KgmLcWoFpZW#$_rE70NM*GSiXkbnxTs6!R>4s=gBpk^TswGB^djtBq%=nGQnz?{pX^2&}#U#3o+ zT34py87)_zQ0=?Pd#5lFVR`AH)y|sq#?2*#rbNldC+Wi1ap2#EagZDB7e0`NGj&SE zJG*M*DC7oZ6^#ONNgi}5?uExb$8dptTsm7Qorw?HKk*=~v~l4d6FeJ`@g6%)uasI-01QhwZzTupI02m|r#8jh?q%K99b^8?&o6>-2wwut_$ zWQ$z)s1fu)_&bm(;CDzcL5g4imM<^i>*Phfanuz)Vop@_(vgL)*6wERix9`N2l5fv zC|Y{{IXM8{MKW1(V?8;NAIhQ^yN0Iy1Jbesk(>33fSw~|A-OLA-{b2np^2ncAJ9ca<`j|g>MzGAy|*%XGb#F3-mfSrX0Bo z&~;!R(|3|D^&;X}rcH+Gt3VJ7gk?Sju^^#~u1F>_?*mygbHEYIJI!FP67w9K^jm~| z0fb^R`?P)p8~052C-KO^p~S;qY0aRDy#CIE8b5u3nX*926Gr`-@BzsF^tKMVF&QYK z$-&#d@l#U+@&VpIm3&YJ_fmLC62I}YYqQbTy|UP4>ZD-IU$g*QKba^L@G`MtlOhG=UbqT%a`=WH`9yTz? z5!2s0RTv+7!o5OPuKBWIv;DKRjQ%z5XpC}HX?Q)Vz2h9or-gtDu^eF;!eZpS5VOw@ zq12{zA7ZMg_@B1!QlcKfV}Lz=enD=?q(`KWDft*JLcfd-FG(8OVfwa>98`8|a z^2xmoiuqOF#5j8wTRP^p<-Qtx(88Q!dfSkhMDkjSW9ecMm}oPq1>>1n*4YZM=YYA@Bi@I8{$;8O{~0joiZlXN)vk|Am2&>wBygdiJy zNdFBy=<5zC^*RGDedpoFPjRDD*l;{w)7-HbyJXkfuufe5M(N?kY%-;70$I3QdHEZT z1wL`PNNp zeN~$Mo0?Ln2D85yuuC!>aJqLKl?e?ptz7n2S ze=@MmE|hq?j&4@t9;$M*KgOh_t70ht4<%gBL7;G+-JLWkV5Xw(9*{ZG)WTQ8`)jIR z8W>eUIf%XnBLlkVoR=^FOqvF4W%G=VY*@uXW-%`;@hE!Jc6bc()TLB)n#dSNLRX=i z)sjutnK76AGNdo1{~c39gBaX396P_o7B%+8hqnGB)$;&i?~X2(hbo5DUn94#V#q%U zyN;d~Fg2Qa)+)B55*RO33dwRd8o%AHr*ihmX*`;Qg?H_fn<@F0)tuuS0BP{TC849| z6dfQpw*epTFfeCRQ5MURPv0J5Ho>oR2k~%#k4Luevy3;QGBH_trT74(twip=+v%I- z+#KtvWd_E?yAIDu1iBGtTraHlqzt?Smd$exAAalw`D)jaH0Uws_(8Gj3(~SyhvH`7 zg0Z4rbK(1G(6+1tU~zWH47>hpy)gHBuw2=t|K_2YJ4;Kt-gC6Z^ftXsIY3GSs|QTL zhNR$tJ)z1Fg6+NB7_$gHU1N3&dqbS+uc5zj?4}*SQ9~Ntxi4R>XgJ@ni;4Sn8G;6) zzd4v=KBxUHoWXdf^ie_jC`@Mj=CHlq^k<6I;FuHf;nCqdHfi7Bexa&c>wcR#ik?Q7 zPa1tWsSddBfbSzaLc)3(VAfoD@eoQ!rT#1p=CsbcSUeWm}(iKPB^@yQN35G+*XlYgHNa;nCsY-*s~G&D#FuLJgcv)SU#NT zb)8x5pHtn?_Vse7f2z|K-?34-wnQjQlGnlmsqKwz6ZkO&k*(BfwPU1pR}2{8%fYC$Vq zG`aY3_RkF{5>t2~`2|lPcGA4gyA}8U@ghJ4tQ8V}VFZx>iDTta)5fxKv+jC-&RAJg z)>D~ZJ~A$s`k7ED$)xNil+SR2P@v*l=kCZ& z9KLtF5q%$7U(jiMV;#q>%(KA>neInG10BD3BwqB=@Qn!3>tSr+&;Z#hlKc+KNnml; z^=OmcXv*5)=4X!{$5cJ+=6y)i6uEoWU6d+qK4DyNZJoCY)ETzk?kV8V=vH~x9G7XR zu=wE3MkY0Z5i?snyBBH_+vDCO*3g4eUy}C*MfX#3gNzYkqobud^1c9B;!EOZq?>)!@bu{YtpF#%-;R9rTK_y z*QST!L3Xq>8#i97_%}33n#QTV+oWmiy$O?fZv~m@q|ZRfsq7xnXGYVZ+ujeXW4E3B zd>L<0-Z$xe^(YOxCPw}|%pq|0>H9}N#RL}!Pgtv!zD(f>PhJ0U-O>v;PuS;rd!=p& zNt6a=CE{+XeQnQ-uTa+uDMOR3mG33BGX9gAy56q-8TNs-GUFawrQ~39T=(7LKwjY) z=#j$l80at(zB#EKGO9h={Wcf2*rB?1gg}c1PzeYsk{BRnL(M^x)+2NbnSzD>az9YR zHfUNpUT7ZZZ>B;?`#eV+BJkGhm&0!l=3e$}R>6pXmtSwlg$WCfEoEQeCy!vw8FPQ1 z{tpRjemv}N)=z#1L3Gdb#(_JW;@`+YmG-d>eU*@i3QexqlkW94jlG za4e$OFMrE^AG++}PG-7Sa?ESv-?pVEiaX*0*+OBi5QTe|lO79Qo9vtz{9Pn_vb450S#7f2(IcC*c3n31l^?z0*j4H%GP-ItCNWy4fwqauNN1z!;B*8% zGmwH+zJf*wj_?LuK9+0bLMxFe1yU1(9<|1?E+V!_YV$CzqX+I}RM2g)CPL#eNaxjWfkZdq1oT$ap46)b3FgqaqB!nb4c<0 z7)`*Or-Qy7()rZC@68;Zt&Hhn0y18{Ha0X~xG$7$zdRjFX!&LcCh&>o?k2pgHnr_5 zlGE3ND@JTwxCNnXYvsI`J11LXc^SQp#OrjC5sy18kI8oAH%_YaA5-;Q_!X}Ujjg*{ zp=x&dx=u~69y+R@V6j;P39@s~iT#Is;?oYcGg?gC-`h7lV3ZBN>y?$<@IE;w|V>q4bYXx|P_)sMeB($G%e#-;V_$ei$c#)VE1Y5DaXH4~QJ z34uA5q;-lJ2>A<5v;4uGsh6R=lcu`7|9ouSDG%QhA%3$rG!_s`GT(P#iE+%>Mz5F| zin9((8i=x^=u?*N0axU#P_kAS=Q=U1aX6T)wI6L$;7fSj3H1pCKZK?UDbAh@_l9Nz zH#!+^KRnwm!be~m%{qs*-n`qmn|1Ws5Tnormy@G5f7dnrE)Q6v?h8HQ%7RJ7I&iWy z^q8w&d)fa&FlDZ$x>+$iwc6oJENk#)8GE2l>=UxAi)l(9VH`e)q8to5On1F58i?2v zZXaF|kzoK=!%75~A(7xE3!Y)bw;qSS`tQE=a3l|6(9I^)%hFIn`SC>0Q)dc9vG1g5 z%wo+x-gEiGmjD!mvKwysv;k$A#V#yRzL=US6$&x)suX@Lu6ca7wNJE&zQL}+U}UUI zCVepQnT^}W8_mw%t#uYn98@VpC|l(f%hda5)?Ky3Vw*F!Z(oE$E33+LG zX{fd&{oyz#F=z;CVD7OAWpt=b$P1d&mN~aaxgTK?rZlEsctD7CPh?!)*4O1(5!0Pd zfq1q04f)@mbbt0*`DA+`s?$#8B8$lH_dAl47*oU_MgH(M$;|zk`Vgn?$nCFE?|Sf$ z2=DTo-Y9llJTwmQMb1Tw!9G5>{}xew=f`8lhwc*!TsPmY@7~+9-)h! z3mhV-Kk&g#YaH>p-iFy@l0#`O?nyvz`_1@9N9CAgYoI6MNlj+MXtVC@#>-4aTo$#> zL!&0&iM)g4yJ3fo!L!xi8s&jD6=?SE(hv0HnC$@{_p$z`yH@G?x!`|Z$Ga{BH)~bp zG>^|U&9~z_$);O}?@YvZ!rOzG8^RpV1Oa$aSdLzb{gn?tC_#~Dh94Xl$VvLyOBB_C zcM6)xl(}aJXf~Te;Y-&)Jn{~l;@ex^hp%(gQ!>kE8GpEs1l|?NUgIiYPhKaXL6|Q} zG*=R%H_Em<2M{YQ*AMi`a}1p}cpQ*$gy_fcCC#21>uyfoJ`H69<MtDAlv%CmmdfFpTW|TBm5X@%>V$6OZNMCOVbmV7SLaQoK&Ws$J1(=Y%vi!HKU9gu zd9b>w$^=t>KJL|Ot?b6~jv8Dnay#f!WiSg0FC3{y!&mYy`0oR&U>W3`vMdMWI|_}r zJ_!-lVTca9EwG`agbw{+Pz1S9#{26>d{2gzs zHG^j*mMi4sGgUogi|=`b_dkymN;$ME|4UlYfbWE2g{!+lpuTVHNz@7kwH7t$v_XSu z;c{WK#^}EEd~J9moqeiIGtz-j*ja+i;|y|WL2e&;zhL-Dmt=}&Pv@s zo+*|dtb@C{i^FSZFNtBq}hrOSa3qi>Wx7 z6K&F%^o@O;i%?ai?xW^3*#la$e5rvsnNoLnoso$XGo9?%6w5$l2j@VDe%eBJ;Q3mZ zg+>JGj49R75gg^C1MsPb4{;IUps*7uNAt(n3kzfbnbBoHbgu7%JK=#xMAEJS-!3Tu zAPr>3oLt+>^lN2lz$}=sUFiM;Fh$u;v zx)Ag%yjT3)_bvo)0@dvKTHebdG=q1nKDjU?9fhLp?|vA?^nuYTD*GDq{-%wtwdj^n z#iI}#eWvLSsyRZknQ|iUl>Fp?5gqc-UW6!_Ay*P;gP-GI^|;PL+`&0pj!i8&&@mJo zY;X&flBF6BKI9Jp^CK;UwkOLhi4Cvmm6=!c=Zo#$)$oOGg`9!ynz;z~y9<94zbW80 zm4F-se|<&jyy)_10`O3`aN9a0l?7Kfp8p^pvH3IV?O3hYjaJ4nfIAtHFaU@8=m2@c z?E`eQCs^vF_k=IP`C>m~#W9;@OTzEsEr2+obBGKYg|4w0}A+4#}Zr{O&Z55 zQwhNT$w!EZQp(c%EmU?ef1C-H8$D}B{VEr6gvcK`3Vf45Z$--G`z=X}wtUc20~GG# z9dpPzfKPJR;ND0ckWS@0Z$gb+*Z^mS#|#X>WrHyc@2#+`%X79%SZwzsvpcomW&Oy? z{39P_tAA_Ob)6?dn8x$LiKx;$EsysX1h)jo>nWKxD=2bMO|k z;GFtlbmB+{26DUD6tqEMN z=pT#3o7+@#|9#=-ku7~zL7jvw&~efOVIDE%$b_U^u<+iRRHgaGe|vqr$>=G^Pf$*k zO_6!}WS(9vqm|Xp1+BSOQ9E(nH-;(oh&&HX6qeJ4ZBAi@dpp~wWhNh;E_+`C)-_h6 zuo4#@YA}2k8@@lY^iOnuWMr5D176%o?LnEwbbH#%wJ6VUX)wLsaA^p+qAq!Py7QaK zPCqguJgb-^@w%aVEfqDn{HD0jz12yJp3m_tknwP|PLr=qdGEj@MQ%&WSu0~57}%(0 zCuR4}c6t|EzKu5-ASLXBlVl~@q`o`ca};T}hjy-Wk7Gyuj^xU@rZ>rFMI2icb2ET3 z?JAIrK#bu&z3fO{1M4|)tcaV!!FUABkpFM3WL_up0hM!SEpTQAQB zJLt*~d4}Ex2THKOzPm<_U%LfUB3c@fi~i&1-uT(&;1U@b+h}*!GCanpKT_LWXv*zL z#0k}d2S$Z|vIMG9f9re_l1WQno%0^|FM^^XV9z-)U4N-f&T7d zlgXsBoJv1Dp2B~bWPfa~Kc0_BcYHPcfWqMO^wchNu8$8T*Exn#Wcl8=dy=bpU0|H^ z9XQM>nQ;hpqj|QQ5-=I?fkI~%Gf=aU`gk<5RkAuC!>E7gw{fm2Ft2JHZ_h=V9{qH) zQwox}u{Q{}h23?cygorFF^A%WtsA;f!joA$$F#Z&fku5U)Ct3nN_KYKD%=L*SH}C^ zgm=MfOjn27Q3nhhRSAdqb!E%s1N(Xvy{M$@o8i99$*po!FFip0d!gyg83|~^>-zk% zByd}$T0DWa;F$|3;C2LjO!AX4LcBGCx9FYUrxOXS$h_Tuw@HHuf43>6@l3Fpl)lU%$H2=;=martM!j4EtnDD85Ci3N}8|24TU^0r_y5Zss+}=nr8}L6I z0Vh4kfI$uj1=F+Znra}+n|2|n_8Bhe`eh*ns&2Ju;fZ(#8~1P}oJ48t(gsBJ3v(S# ztt>vs=2yJhHODzTDX+6;cUwG!eMkd#P)ZMhwC14Ll$bRtaLPz=bVp*B!)J=jrV&nP zg($WLj|YX77G7^r5z&vPcfLhcz&is$3YQP0rC505@AYr}$Pvxm%>QLN+?`83ULzYd zqADZ7lC5p0SAk#gO&wxy~&Rc1~$EpSP2TTa=Cd2ny z7W4e6BR$9EB^uk?5cB`NSze9Aco>cGKs9t5$<`K|>ZP?p8UL^%DtXbCV+o-cliqPM zlbThUF<36KN8m1i<}L^cLtFwne4ELwmVr9Pd8c|n9pe1{p0MHJ>GqehFA9KEv(3U4>~G4{B6M_y@z>5@B5PL^mzC4iEZEqlRo=x zy!#>@@l1RI>L|-LY=ATO9xReIqz{Wt3%A`#jhJ(nI_h<4A;IIeJxXn59$92TA}l|Q z1+Cju`my4y?69ikoW+`qSj3@DqqkGVn?EbchqLmi+VHu zB5^xXT?>Sc(0rgj(uY;gyLzm9xSsZs-0I7LzQRO{_pGXhlO2QiJycw6(IWk(^Ks|E zco-fhQsoGrZPPn{7-v7V3=_55Kg|YZU9p6L)pz4-uU92gj^n_K9fi>2v~k}~9xIQX z^<+h9#@Hlv#hrh=cyRUPBz5zHU-rCr4;+5kfAD?168^v91-6%3#f-By@an44HgMFH?{GxbAnQ}%u%`hjYP zP{z_9m*qZT#Ok4OOrK-txH~4IOxKn{Eg*wZXQ>u#uyBd&Vbg|IszZH;1 zT-ROrnfSeS{|x3;8=*S$x|o%4;z?hu8nsbs+oo)(Z9xkM)l~XZ?G1*hlAHo)>B4`= z|JCOuhnAJNE#7Nz#;nYDTrN_hM3SSfyT~~(5uwQ^^1*#I1^VtG2WlvTnm4QZuZGjV zfaXbGjNd5n;NdqOcnq~%eo`Oh$G+_8*rU9!H6J46A1$imoGep=UfiN?EJH7fMaTj~ z>Bfu8onN7lnM{N7izydxgL6Fknq2&W{4{Uf^eFwhk<#w82ZtGr?~EC*fb*4;=RA!l zx23!iWDovrn9dv8H#b_e(ZOwrs93o{8c?UZJm$EpMzI$IO3ZBo&#uVCKZ_+=)pGW@ zvfS)R;uP`l?F2WQ+1%~iUu<%!gzpd<7vBHFB};#Bc70dI?iB!6QM6g zT$VQVn-I?y8(7OJb4axT?+tW#wCl(mDbm$_%LF(g4g^K99zlI=seqZ~HK-44R-;BG zE=P7Q0rNE7lXLYT{=K0&(6=Sga-~_-Z{%+JK^9=vSQV6Wg{;p{vzV-*O!ya~{S)em z_XlcFn;G{llYVc;TU09nWo1gxw%I2+w5_-uDuMl9YdL1W_A<}0sAIDgffkyO?&Dyv zrCEN^00M*ks!Lf|E)c2z!ZiEiLtz?|)=buSr4^iv*@e_JCP8Oyf9sK=L`%|>M}pT@ zamtuCQTLu(O`>+xGb4Q~)iso-70~_bsc*&Y=v!llfr}7#Nqy_uNCk29(%spE1}i7W z-Lp9v-5fFN4{IRK9O^;BTkNP31~P;x3x*AdWg{eckJIK$D33 z);mwoitC+yw*%qds7AoGqDITL<=9UfxX~w>nM2v^$ExJeIA_Nr)q%vP)2S8KiD{w7 z3WS(eBlsXPFP>6eHYzg*W8n1qb|W*XrC~DKx@1_ngG7^lq^tW-EH90Sjra`!W+;n>CykiV=RPJ=yveIKnC| z#Q&RNRX>CWP;4r8!nite^l#2} z-_FU5V2!iqwPQjw77iCc^UQAX)~=|V<@msRZI!a;it7N_$N*$gp)Go=?wSG+Kzv&0 zVc{NY`|)R@5I-MYvwr_W8Z|-=_*@i+F{kyygdma>bys)|IzG5z{q-&nW}`OoCV82W zts9~0hBItyNIUR!DtavARRcoU#o|egOTSnA9vc6{QAzGl!mRA zbp|04IhQpCJpseTQ~(>|&t`d{Y!GMe+9 zXg1#a?+M(P9Vq;gOw$g@>tb(#^XjZ>QP(zE7&m+;MrHJN9Rv%nnDIr!ok-~~z8X0E z_&TKeGR@~bzJDik@{~QXo&_AYVHnwYd2O(~KfwX4lN<2`5)U=yvTX|YO;)&XBw4W0 zhB0CPmyz42stk&S)fSI!>-8bg%dpp9+A|*HF4aL1Yvu-V}-prjTxqSz;3W5S@`{1hpw(1zQ@j=^(MKz-77FwrvKAZ zfDA|R;Bf66yBI5b&o-A!=_*DD`4;l7fNwEux6L?5_0kk+B~DAe^U@Bdg@htler2n# z6(?4cRLm8kT^kBXDr>@0SwV79c|dh3ZjpN;#B$>c;$)}yF6R$Ps3Bjw1hvncJ-0i3 zvz6z|P;UQTjeNq2T7IeTw+_D{y+%d&ZZP;6?NEEQS7JmkAoMhuorJ_ayy z&1me5wAnJuTltb9tjNs#3)Uj180&eC%mZXsdt5CJbWk8!>Y&f>Z3KN27PXsr?&jqI zlxzgkuS9tTu5mD4{bbs1p!azru;fevxpCv;$Ko9dUTN;RR?4x*aGF8(NFie`teZ@3n^KrNwkaGgW4ZrR(eiGdU^G3UfA7vZEu9NctD69ILVYuSSIS)~yf3U|^ne4XoD%(n94IBg-*0lj_88m(XJP z0z7H*9AJ%?%Ai}6x{4r}vjQb*3!ghQgH2ml=L$|&oWO$*-*P&L;T%J)j`~9MCyl#8 z>Ap>2JstN&ord>~oEWkEs%JVkMicLOj{GvJ)4_yLSzrk`ky@cYslkU5{u+xA;hhJ= zG1`6xPC$UX>DYoN^@t9-QFCB)nbEOUN22h?J>fu;Y6r{5sm3XzlEx-Q$)ofOXD!Sg z%f>#jw|LDsS?rz1nr*Mu+#7|kyC1xtoLEdngj2L_hsMid9{&Lt&%H_Zq~G8z?`_K6_xaXplsw;}M(xo0J=@gw zCwS&L*8~V3S!`!M2b${5)Skdkco2vYsAFXeEvJsJ!nzxlyRV1k+cGGx;N8ZSnRM1# zL<|204Hh3ykE^A%8oiV#J7_kOs2RwTM9pawA9Jf|Jzb|oLG1L#_17M1myQXX3i=1;uZ)&|g!LWBZ`i!9T2%X~><6qJQ!c)bIyX=K-pl>S179Pl z!bvx!+y3Eg+gjbRT1al(eC_GFiko;v*3~UQI2xOSJMcU%@4scE!s9GshSUxUsU1=V z!|l)@wL__f6d+ei8>X~}n!!rV(7#k_hS#^E8K5cvHom@b@_AjsmOuoiL&QSDm7zwC zY-qGapue||tovabLXul4gCw^moy9%HbB>9M@GVJ&lpQeJiqY3Rm1iY$IzDAoCHLTIzD?(B9<=TT)OGkY`iRLg~n>?$Oq zMiSa4=cT#1A|NCmH4-eyAJB$)Am~jnj=JH*HmkwezB$)&{sTS@6tE}ks;fC% z(p%vaUGH?=iPEiv3&jszsBnP=^M}jw8Yi1AZ;@A6v}oZppj+YQ zTJ>g5woe;a7us4~XMjlWUupj=hb*aYQ<%pBlVFj9An*JFh;;WXvVCQHx{Zj_2D8Uc za1C$*J`-;H%yAE*?-k3oO6w(!by_d&7Mu4Z=`$hS@nDc-s(8vQHToJXcAAzm;Cjc? zkEZljk%3DF*%)SxP?(3|jVmC8xaLrJU>w4LML(nN9m%v2-8KQd>xw1q>p^m{B(U8g za7DxQNXOK)dXk~sw=^Rs!=<{d(d;kDt2VE5ZP7u+O+7${0~`N$P~5>|^ZZxCGZ}C< zy}dHsZCig5oRp;LI@Pp%SLxO7%sLy7BlAE{K5$?mCNB1?68Lr~yqn4|gftiV*LxBDFOzj$U4N^v^Pvf?^Q@$0bu^tzDN2k)vY8eYI=U7PIu zYXUq_vHn;#c7vZyhz@SWAa8ubvn{bsyyEcI7pogT-8r`LP1jaaom$N1xLaN`LTM_? z$7ZAKVECEd+CvzfB4-=vbOX@rpxna5-ltkW46R2TD&?5d9xo==b<69Z*}y5W1jKM; zW%oVoo~W4AWLxCyThuswc!krq(mjE#ALs0yX*zV#Xlh_x1A_|!C`Z`%x&!WxV&+xH z7F}I`*4>;kWe72MLQx`dnmtAGAgsgvY)p1GNMo{fqLg)U`UekeKxh_c;Yl8|Tv!NZ zLaHZb=59Hi#s=qFlJ*2Z%{4L6*1qF$j2zbhe4cUyQ3wvMcaVO^4#J#(VFqq+Sy&wcb55X&viEE&Nhjmlu0q(!ak zS&sYl+o&!Y#;ded5w7iNX@daQFh5?G*Ds<+%egpw4}GK!wx=YI#ir!&eb-_YU>95{ zS02ni)=_`AE|3!{Cm=yDJ8bBvq7_jsM&~Pn1;W_Xuye9nmqWWMYe3pR*{Y2~GDbq8 zWNDo0E{nSe9=p;+EEsXEgW}+aAKw5m22R%(-00(jr9OnPx8};XgvTPdVM`u zml=Ajq`E)&WudOF_pGWJm5q6TfvxN9sD1#-uI9CD>}3!-1Djov=rMv#%=xQvC}kH$ z6?N|MFuK#C)QjqRl;6wVVGbkwX{I}$LDj#P64V!y)HB@wko`0AwRF^#$<{FO`O37} z!W_4JOL(qIHI=0G312Abw-Ab%VOtcb>yj-BYH#Czy`swuO)pW`eLwsG&Del_2vRv8 zQu&96?cZlZZVD4>@B5W!E|#WM_g6zGlZ<#KjCsvH^caF+!YVQD(uU|MDJovljp;IY zs5lly8Yw1(ge973b%8Lc)tJvQ$rqbd-&>U_gE3eLGp|ilw*mh^4+I1AOZARMOpl`k+63S}gh{VO=^|su3I3aaISmVJyArDqpC3aWGi_%S%oudAjS`jUQ$R zX88A8avKXP%!!uAhf+jt%uLTrNZh(S8Sx?L5c%D0&LY0h@ad0REVvR4@Tf!5+-`bR z(sLkZr1b`<9@d-i+&(dZCe@gkSa8Y%OYGvhW<4h>pC=UR?Ec2S2JY=K(?1TDa?PmT zm3YZEr(W-iLMEC%(FB-J>-0`jKZfZ7=cJLbp1S6MGsM{&C9Kk79Y~leEN@&$G^ZV| zl66A*sPZtzGkYt^Jh`NEW&MY(*Z}=HnN*KJ7S=w#kdWFnuX5xo9vIjl5U>C%5If~i z1X1at#$>1f%2)Ub;zsBs=c4C6yEkIM#?1I*uvpjF`*txRphmE2G2;(EkuTx<{}-K4 z4<)y@kaWHaTTmJj$QDna0ePF`!L=88Oz;Rm2|r%8-X47P6I=#q9S@yc+CVQ2|K{s! z@Y*NQ{;LD9E|_I8kZFf)-g>DXaBBEBJH>I`V827Zcf#|#4$C^6xIb?F(KAJ^1X+LG zgDoAm@Errb0^!SLL*_)aEe-{D3e{5^#ZxKUj8`@#lmC2WZ+^vx6C6Qjz)EMpuX-uXJ0`_FEl5PI4fM=Toc$OWO z=S);5QL5yTI9IINT-$o^ZrmI2I%yzq<2QrZAv)2uGYVi7MJ$MqUTL_}Ky{XQCM_-m zdCiCi0vrE@%p#uo$dxIJ>w;Y-({M)RX4c|nH4gR!Ll zC-%%H)S9L2c=!fwS#xfk=p z#=PI19~Ugd7)xD-Z)8(9vF{^vez@6)R|CwQ&Vh%W-Upq7Tj4Fuy7q*9xrQB{q{vAK zEf$KM>n3BkKu$?^@QBX1jC?B+4r{->lcmfCq#<$^Ps&yq zrO7B_dj8}D1X=@!gq*J6*`HkwpOAtWjCfv>kJojOP53VPhHJ$D5Z`n`SqPmE9NtW# zUiUFnkY@Q{i48z3p9r!glY0?c1s6#FT(oiic>~lUOZt|f)$A!x@5j$9&vm>qgpy5C z%nDp9=%1>5sum_P<=VL6gwP#0N=UV}9|U$uT*~{U`I2GvNH{cfW>K-aZ9PT-Noxy0 zM<|SSV(_`}f+(4Y4*3D?HI&qVGSZ;1ajQ{sxOo)3XI}-B8N#oI^IRllPoC-@V5DU4KVgv2zfhpQ)U*GMc*A^|CNNK(gB`j}v!5 z*3T3HNb;4#!KV{_b6kf<1_Tqs4*>Y_bHC!*r70Y$pE#1#-m!m0xRz%lVhFFazJl_x zao_kkdG`bwkf_f_)lT0+V2H0f1^#%LkILH;2S`bE^gvDWCiaC&ykU5f&Iio zo^Hczz8^j~w{SjCzeO4+T^=uula;Qm7$<6fu_;f$d{Wky)4*y26h;95R&}-QOI!E@ zS9!;_=4^C!N;8<@~&@lf2};o->QhOQqW-UrO_&T2gNuOohyLB zhPiki!1$$D;uxq;QhFE?0=p5wC{?ti^e}i3etKo(6d69bFqI%8yv&{tgTYk=mX6+1 zK$y{og~+R^T;!z~*jNNA_$iM&GjLzxmyX%U3%Kuq`aZ-YN@KM)Y|q^27qYSbW|n+N zUs&N(CLfYgPfny(9o+~%q(4bMB;DX491D4}yA|LWhENyQ z6UE>wu33G7e#Cw0C_uG-=eL4S~6E5UvXBsqJ!SnYn10KLzM zAX$t^|DSH)@t#wC*XFSeeLuVcKdTXBg{Xc=cST#P&O);*#R=K+R7YmNB;%V#F#AoU zlPr;R5+Htsz`k4(_BCQU$qpFWiX}^H6E}A*zK_g0dv5>>t@^&kzWw;+%*uAfUx-a6 zm{}(dXOXN$sM;3}&j)g39~KNB9$WWrK4`U9CKGG{=Quh@!^xKt4hIe~!ouDnU4T72 z9Xus^6L2neFWY9$1%1{o6+GIi0U5$v5PSr?Aq8=aNcUx;U1q(P4)U9W>Ohgk@?0Qy zuIu@mdz!WGH@MeE2V|R`MX|krtU_4Ol3f= z#Aekee%e-OuV{czKbn1Da1GNw$MU&N(Q$H$^J~ONI^Q6_nR@skA*yodz@NVMczL-N zUh=mJmUk}{icQxs{~v8~9_uh{Om`u=@YUg zm1YwzpdT!x1N3IhlWY~>$=&dhe#GV!s?k*T!5CJP{&7R}mmem8d&%tUY<+9{=euX3 zex6(_|6j%;Iyh__=85w{YgSr5{m5X|aG8ST#n5DDk|{TW z$G=r0#g(K%_fx>GhY#TMO_-LtE0X^Y4oAu890_|ktUaGEK{1!_c79fvXMX{PiuXW; zXNuc%HW=@ThDDMXTout$a4VL`1o}KxStwTvb2aU&M-j(5 z=15In4Cd*{EqUq-{#aC)cre=Jy6F);Xu=0?k>asZ4cCv_W>otk2FBL~)L+XS-fUA} zOH<=>aN-L_pRi3Jlv4f z)iBHH%dGn=cdH^BLJZYVF;*mgYBA%@>C`}Mdo-@l?6>6hxYPr#!eRE8os+lg!kc0ngkIGVS0BHMsIahu;RQgo(bjzraJXIv|t0(Bif2Wnf0a8+5IS?W0VCE zNDcK6n|5~8AAY8L5SD7N{~o;-2G!N%g$@f!1_&nHSc?7HYZJqhHq%+T!=fh7b88OE zL#VuR?|C0t35RTVxococU_nb^>eu4RKGk>mSM)N(za+$lGEfx;%82_luU1*5v5R>f ztGkxtO$S`oDECp&S!}6Eclz#X><<>ZFQ9vv_?sZ#ESN)L)9=^ZB~5C=H?w}~b8;ms z$lZs9cLy*_T6n_{XB8sV@Nlj>G%TuKTt!M?mEI!jk$KCbyMl`HR3|?_-(4z0&L-ld ze9%*nOX_}0R+cZT(tdpNy&z4aPjjlm@crNX;a0kT0){JW8$31HHjSc=K-QbY;3}G% zBOt4xJ^TcR@dQjDVr$mhHzBjZ_W?y+N3XbGOR{^q`s)|vh2lfoPzOj;SJ|~dwnK<0 z(IWs{if`Eyw(G+7Bw@?EDM4vj3hxQRIAXsBCHmxILB<$x5kCE4{G)4$?P?OdJHwZQUjUXqq{}lHl+$~~r$H7Dc$CNsv zoE_UyxqYe-wZZ)+v{U=}IA+uBmgCkh%!^O{h4IfsnF_|}ZD9Tx-!t3Juj@ErVBWjw zLv{$;r*bb6rMKrbHZ>F{I+yRr*9enb$2Vui)jbWn5|&Fe9vpI{@iK)f z@odgE7&RP|5Kndqx!+G2p@GBo4jln+Z`+!SCK^?WwTJuwQBoWj>`hUgBI%`%4b32# z;t0nXlyya7gh+0|?Qjd`d0;Uip7Lc*)^e5-6oatDp=C4{2SyIs{ow;)EPPL-hM@8< zy#+z_r@QqRgFrA?e&VzdmnNVX&;TM$BpXkV) zI4hXyDAQVTSu_BqBR6q3*zJw~N`w`XW9Vyi3U96`SiCQtVoHVTDniMrA=HOYV6J zB;MZ+=P>({K2R4dwj_430j7pm%=Ax!@*~_@HBmj3#X@uaVj`SxHzJ5hj!UtpbKgWg zAtc6Xl)H|--Q|K`>x^qIz~bSEJ=UJe2CqT!+{s~fX$*V6e@#@m+wT3xtyip^YQ09* z3W>$EYAL}%a@xP%Gliu`9fZiVCuN~J>kHA%S(!28YxZ0DXa6ssyrF(G;j_cVsDbiC;GV|Qsp~?~jg{A6Z6WBy`5Ve31jM9-Rl*Ca zfxLjyb9fUHjL=6j{c%*ai2AR%GU z1ThDSZGY4yf{DGlZ1s1@{;5=@> z!?Q}6kFNi;Sqi0gierbRmEkaI5x1O?Q~EbdT{Z}t6OlfGW;QGgtl=OsaIv%?QHtk{ zx6n&ndX$6FgAXOVKFt4GN3m^?IcCKgD;Jz={|mqaGqYeYg=75NQ6X)1Putc@lS%N5 zt@EB+#wq-qAHXAOJpL8H2UqfM0q0s3i%GUZ)_Z339 zQn4iJ;|yKzLJT?ox=(~aB|U?DzahAUlv%hU$5+1~L=^dMfALChM2Ue{@`)dk zsRuAR+Fe6OhnT^Lo+s;oi4SozLA{B+jV z?1eHd%<$YS`Rv7vny^e>`%B=DO9D^BYf8Q&i|s1m1ORl%!>X5s3WM7b8=H6)>Key| z5nq@durrVIWM1G=01f}|gYbLEp#u6f`Y1%Cn}j_;l*&v}gOpXj>fgK-Lk0{;O z>D^`sCE5GcTAWpts3J;iepA>jr433Qv`u3Er&n)Y_IVzbQ>*>RJ+R998!vh zZVA|z29#o)Hqa7@edN4An=C*{>Xkn0E{=J&-CC-%^q)~3N9eU*9!+ppXZ6t`xQH(qLJDpfyt)p@ptpb`C8y}f<3jn8 z;CwrS-B^f182Uw(oLJ>@IE>E_1HTT8r4y=}aqzY8_TuYW?&;CEU-UPmh zI)5K$W^$oGQm&R>({gBq(i9LZS5t6RR3OD`QH~U^#Rb}wTcAw}qM)TyTz8ihXoI`@ zWq%88T*XDd(4-)TB2DnDP@7ay3KV9Nw9T}+{?BJ7WpVfWf4wxBPOf2QKA+F~{k)&& zc}McpF9T1yotKV#ZmuM9pCQrI`~Ez2Nr8g%(v~RX-c|A}3DC@H zm16eVk%i8WyzMl@i3vEmV|P5;H;G}W(0 ztXL35OG%_EFA=FSU4Q0t(gtY@i(C~Y;5#^B)BRsbg?%`So1}WbDAoJpe>_J10A!(w z^Hp!vI`G?bC2($9d;J>1;gk7Ng9rdaib`Sy&<>;xW^*C<6~G@VwHsq5v>CD#k_V85 z*jUD~XosXxvzl~IV6O>N5qaBh5yRoM_Ip**=p5NMb>6>6+bId-c;qVTD{e6r>|{Nz z*1!uV`aq6IqEe4985(=Q-8CC+X2&r}z3SbeG`58s0$%7S=ayRBzn2`(+v?X{^c^3r z*7P>Kgc3dE-7G4DXAnka={E>Ep7$BXyIO%-B!`#;kH8bSQm1gJt!`cJ42!JI$fZM4ps4AEHUq2bH}`u> zsfn`}EZg|^>n@*J?`Ya|7cTQgXGIB|8aPz$Uk!(0Us~um{?cqoTCOTjke->8)kdmE z!I#TnaH_iM=@&_PQ{`Qv_)2PV)Yl%E!M>-S>!=cQ748 zPZCU!JLIt&=i!j~5w$qN^OGO)pC@n7&o!Uay5!hFi!o8_*jT2rlny z?{En@2)XL3D3R*w*fa@WA-NXTB6dP=78JR`u^{DNk^_)szcHF~C^`V_ZTQ!!RZ`s) z{W9NJ1j8~6o%}*rc;2Xgg{4a1rrI2xmM3f}K{1N3Qo~rGu?|XasJLms3+Q5ue;&fC zc9L%!)DBLv(#Ha|%cZC83G8YrfH^)d7EL~dBQNZeu{g$xhVzv?%9%NxMQ8|U52``1l z@MTn652T@1wYK_l8uW+35#amYgMY=GXx0UO90}Xb(4*p-TKJMnady1UB*)nw{0cku ztSH5;$;yo6#S$aA0H@JJBkBNPpL} z_=JHDDCej0`AlPnagz5_U(*7s7+P{Q{OI5%fE|t?yxD^b|Kl*8P^Cc1{C!HYvl!m!9lEB97w;+?0;sRdeJbDr)>!X)DK|_s#e-zDfa& z%#F|sptE^l>;3Kuz1BMc?2&-qhE%q2Kmc25&YNP9F_fD0fRqxa8Oq=P=i%rBF5 zYTM(nNF2l5aBE$Bq}_pa(G_18wQ(MCC7T!_#w3H)s?;D{X%fAE^Lsv}Q(Y4~nHQEjnmpO4M7TC7GMgZ)w1?}#9Eklfk`c$kbS!g>35E-i8F z<9ZSj8z3eslk_BUK`mk;lLJI5@nHLgT<7~aY9$=j<)|C%&VV5p^V)+(9UzB9ZPy zx=Ko{-0#TWz7A5$B=oW;NLGifg`|Lnmy}&p${$PA3WM+F%kZzE`!sy};~G9mbMaS9 zzW{c=1O6;!NYXeHWGWyA+E<(usXKOGG*zJ}4x5AvB=Vdl3e zq^~X#hIha-trF`O;?;QF2HY!Au`;p_qvVm^s#2>J*bgZQNEA_M5^Q2c1BSjHKF&ZF z42%JqeX>D8w2VE~hKgtw9E%=zO+t<2WSBwfj#m?uCvF-J8M+DMXKF@IHlbu;H=P}x z0?Z+Lzxx-A*vGxpAIY(F%Ev;F&sOYDQImCqW)=B*OoSC>CMF*X&DcVNEo@7tD|{8q zIfGH@t1%l`VRY<%I95}TrcZYteb(M$O!xj1iDfFMclMOsOK-~84rzUBnwaU_6`=M} zb7Lv?u8Bskp1zrE|8uTU80Gdq2&cIL-LvpG{Ltt&{EN2-R+=erHLxeS8UdM)M>FK zl71QvDTe}&%OVh+w8Mh?shegIr(k4ZczrMVieNf&|2Q5m1^p)MC_vSzVG>Hn1mMHm zLwo~ozjnaSNZw82|Nn#ED+@|Eq)3>)Nl8Z;{hfCi4I+Lb_&3L>c?MckcPCX}qkhb@ z*7vmht(UowQpjl<^D}Owfy3|1Dr%*_b}g`3tQ^cImILik3~LzE3PL@zYXsJ~R2r-V z_ck&HcN0#9c*K5L!g7moHv!KgoG}zgB|NM5If7?BBV%f#?c(*dh1H_1RzA2iMGng0 zc9bh(!|Z$q+rfW&b37?9VYW##Ap`?-vNAz8U8*^`LW>cZgK45U(=^e{<&{($=`)Ax z;WenHS|9d)59zrI4ny#LEs*Ag58{{-j)rh5fOREC*V(Mvw|qnlk`?!i7&HzPhZE6x zbFJd}s%u!VkJjtL^TT&J->;?E;LeOI_4Khwo}0_$I0a>57~0}wRJ$yNJi z5Kb~JUdq1GMt139cRT+*1H9?9Gggu#*;hvI9cHee)3G5S9>oy8mA}O_vhYg zX6@hG77N+1=9#WHDqb#eeL{b!m{ThZ7-Q{LE-Z{DBVb92Xu>d=jAmQEoNI!XE!7r8 zw;N^emgqEh&ojCU2OswmeH?muky=ommj&0L_*r<`MAO8HXcWl#vKnJy>)^r82Wpsx9M^#dj8e3c3ZDj^{!aRnW5rzKZKv$wOoIiSAxrq;KBe9;! z=x^GXYwbF#uR~sHaXK=|LdqHHlyQjRe(M5k5^bg#H&gW~)=!#76 zj9lC%(T(WmPM*+76SJota|HQIeu-3!2*lT~oWvgSdJ%IxO?i{_gC+Kx41z#n<`L9x zy~)nOiS9;i3x-(3VQ8_H_V}PWjZw)i?qQJjHl5SY$J6(xwYYXU2MYj$1bdwQ@kQCT zE{Z&%(JAp2K<`=d07wZTF!fr+EgkxFnRAd1%J5=$H&!x z?BVeJkR|IJTELYeIeF3b2Zhyy+!+|{y$6AVJD6oX;ZQ=hkQjZ^`nLg&&m!f(^Uu#w zosPb&6N+OS2}yB6Fp|wAi{e7JFVXrp4}|Cl20j~uY3b4TAok7E{jh?pr_yzjaC7E7 zR*)uESi_qL=PdA=UV2hfxKizb*Qjm-%-=cR%3M9JrOTfdfZ3zf7kwk3?WUKXH|EE5 z2=VE&XS5IE4T|Y3`pJ`x|Lq^93_x>B4IrTG&p5Krq?ey~f)1@$1{8>+QMy zr+dmDv#$NP_4nBYNs)=pZByv;AYU@^(w@nBfUgA^xwQ3!!|a#@@V%Ifpm#iZZINd% zf^4hD>45C?>-Q$X4zaFFxhNy$qL|4^`nih5BZ{3dMLuhNEp)KHf>lR6GTIzl z5t|BU)2XYP|2Wcq#j_2v?N{ZSoPJyr2(PN->m=PX=&OlwmTG2=C=_qKX(Xd) zyah#aGQoK-Qsv{!T&}60SFiBh9PAFKu+jU3(cA!krAJ%A>Z@eLqRY*J^S+;*s}eNwvRaP@lua zutc@Pbd>M;&22igou)YJ4pl#*iAH5lt?tpBE;@~t_M){LYY|#lV|MC$miNlNX6eX3@QG`>lf3c_-X)_MO-m5PitSRv*fwM3Elw8 z_9PRoLk_-`yu!dYDuA;trNO({0MG7!aaOdx))?k3gMw*%$oJm#J3gWsE~x7gI*Me7x7NCjOKhM zstGp=x-(p-(2_OV>I?rFFVM@+X$OXl=sJ4#v{n%&w-QDyP2LJ0E3&b}m8*BgXjk_a zRtVJaQ2P6B6?H_+X(o9qBQdAbA(PoaE1Zsi1W4V={C zQIEumr$6I*5&`d6e&v1jsIWjG9^8OKC_KL=*E%^P6hQ~vpnt!GcFr;=Ftw=$okC)E8+wBqkiG_z25kD&bsD0Hi8OlW^o+ z`TQ(JvZc2zxCX2p#fH}3lbRbVjQt|o;q#pGs6qO>-~Ht*@85h4v)xyQxL+OTxpA)q zNHjT^cYG_Zatideo)Ap&l$8o>x?}&J;4+ZVJ^80z@Xz4)hzSXv56DFs$R-)X)QLtD&Vu2Hh6o)oV5& zAsw6{8nSG@=w8Lm1-5U(XnY={J~^XJ$~b%clL|1qOLWbjC6Hp3^BX-ys#R8hf5o4v zCR25zMVO9d(Qsjf!G(#Tdbf)j9>X5W;hC$BB^Zk2Mz}ZyP%|YjJ3S3YZ zP^@q&)Z^3zRuP(OM0?7>@Z6)km}YlX=a@O8kZMx;+NpmC9Y>W0e~s<~Vew=3zq`tL z7jvy^UkOJ0OM_fbAaJsm31mX|UZKJR${Yjy!<;VjtDyn^Lz8(vKIKOi!{^!UTGPB7 z{d`D{gf)@WFpxkg8&;EAUMDWC$=$or?KC=l*OWL@S@w3{Lq%-0Pu;!%=W2}iI^DWR zNUKjbyS5%KXHs44_g#;AIlk;#z!_)4+BUV~W z0MBSPx~M@0vK1gN!pn+5s1_>0(63kUzU&NBdx$akzbJYJ#O*zyj>*r)?zI)WzNNMu zw=g(M)l6#dL-t+5VmB1DSIBocv}9SNC$<{CD$2t8*aWOU{-{_LB^Stj(1a1YuDR<+~1&go;T5ZR)EST zQmOFRDp&4c+mA;R-2TU)_$;SdQ=L~fDRvo|tOng{o*I0kGUq;LX(|p|=;NN+XG*b! zr1@BR1IRmcs8BZo<9S#`X7Vh_cLJimM)aj5Q|Q_P^9*R%CD2_!gEvtbt0+S!KdZ^c z1$*1V9mW@-9>Eci(t~Jp{z%yI7lb5r+2bFKQup_4fQG3vT z1F;WTTM%zawPUqnDY6CT(W@NtxubmVleyvfmJXuG*3mnS*QaAyRT@-p&>VfLgnmRX zWEIAsbWSA8XqJt8vzCwt_!9vO_;TlyWCx`3m8rll09i;fAhc5?Tg&m#1&e}HB}$o7 ze+%0td}-7{u*O2mR=)-nJz(1;)t05%;7piX*P;~@gb~Gatb+y3U}_h*uITOA{!P~o zK~p>0)05KzJv6kikOlF*-{T%9Tb$7RA6pSkH%E0joW^kB_LO`$VF&+r*z_*E4aQnIy1G_fGUAWzfE>k^C%pU?NNE zXV_H{qY!}%l6N%mC*oUpN&d{~m+&@_f3k2Kf0k?df7>&wWjU?KzqgHeJ1C|<_A#L@ zi17K$w!M&1Pet}B7G{Xbb|V%3DjPDomDcD8t4}vWCzes|v1IqTCBkIq@50ooJY+_) z!%ksf3|})@m7ey6(Fh93g%RN*P`tWRQ77q6MkSGy^z$P3Wc*N1Tys{ zYii|KV81wy)E)_@h5H4vSkqBY&l6JqALoL;Zt*~#DrSTpb5bHR;;C7~={fo0bHus( zO8t@W9b>r7fvmM2U(*=fL}9$6;k(T`=Yk>hcoTD-F%apjv2D09&@-U8}B>S`9^+WGBf+)j^PT>{h66#fwvVc*}= zC$Ilnu1&yN2F&ic$H3Y)5<6|(qs_jG7~OSk3&o0hAZ#XF##_&3mjxYXB?NBs%J|j^ zPa`fl9oB5r>k)yf-X<|y=j1vmme(d=?#-chVO_~Lc$?I8zFt_*>Jf?G+}y6IKscYS zrn;e_xn^o8icJ;q382d*Mq7Zkyz;-bbLf1F`P$*B~+CqRRw!Yxq>E+Q1ByhxDdv7Vae1E`LY)CFC696`8HvGx90RRDNO}P?gtU?0A#WfJz~5@c zqkw{mC!oeZN|B<&=)NkEao0QSaCwaf4%k+qGv2NXb+KFz0pR0Qw%ZP0R zES02fG zg?LA(=HKrQJZt~JF#&z7rhQkx03po&1D zA<;wX!nW&{D0-@goqAg>i?APCY;|{MZn~MRJ{%}W_ww5{T@$t4X~^gossh$j{QOe5 zBc z!{el(z0#<`r?|@Oece~zwA=|pUK7$2?tTBylaj`q^ z6bl+yW(GI3Rw0I8v~liM^dE|B^!-3`9ZHN|QJ?iJRf+SgcOKPtFGODTDB^&baPP=+ z>P32cu(`m@^SF_suY3gM$98)xZpZlh{iE`w|5!P9*rfgD_taGFDGSP zspaRzpgkqJzuV}|P^ zh57^E?pPyo{zh?7C#czAWe97`giDBX{vWvHz`sj?2y}ZcZTPkA*8xqBH~UMNbJ|y_ z8BIga_9juqS^zur+cI^am0IH9b_B8Qwn$u=&`dw4^`yGvPwOmv7;pacvNbtdvkX zRdjJt%*?X7EYGeCF)cPe3$D;(&=+*JZJ+C3^yi^tGmxKUTN~3|7tT^aCYEZwJYE>U zHc|$vXFzEZsu9(~05KcF724R%tEnYCvxHO6313Tf|G32#nU-;3Mr)~eu;L3B^rIiZ z+Hg@ASA0{bW=)|^Tw8?R801`ulWp>vAjOICaSYG6+cW_ZH6Jk z+|Ri|zlM9ekjJ?ER8woTHdt#HyZJQhCsyq$1x$<=-6^VEz7sTB=gjB5&=1WNR?N`F zHsnGk?J3W#?h%?{7w;d)Hs7%+6$JO6?7`OIIND4#T8Tt6;dnlEc2}o{(}=$$GYg;L!#6w7Ba>l+U7GD3 z9LA#FJDA#?Co}<7qw7q$cwQ z!f^8nM0pgnqliY}u<-6GuLz2D!*gyi-?eubBFrI3sT(E;8x8zL#V)APX`Qu#3OoYk8ke0|C++@7J3Fk?|V}XUs zdK736Bp)7dXxCi_hnCR8c!}ISvRb^nO4h(E1sYxqG#vaq1U&yt1@?zolA6(T57~m# zN6kbx=$*XA*BJ1eA~e39*D)QC4IrQISR`g2KKa!U`E6&;ln^cni5L605z^S}^9ik8 z4W6lExTM+aGYALlfU8xFfU#Qa|MmUeIZWC$$W>>eN5>UR!Yla%=Zz49b~vpgop*_h z@5T!JKKKvI?GCGa(B;!5H|3j_ibfLG*ywH${&nt7C$Cw zy;6{4f?u7ivjy+{BxvtEB1xDnUtOhOQQGpt`Zgc`Mt9(T_gCX^O3Kr16F#bCdR_{b z`C2y5&R{R5tk&5a)Z1zbm6adv>!yx{lbogtrx-{_AhO~<(k|!IsGfs-(WxISAVU5; zQ#rnbtTe;unzY!a0{85ZxMmXHP&_heAMsHbn5Z-X_H-UFD5G~(bEQp>xjRSMdCxjT zJ6Jx_II7WqdO+hmdwtVH`zM~+cJ9O!w`V=NehchNNF_hhaQh%;5)yD78)wuM{3`^IpyL7&R%vSUlK@ox{c6ax^(I~=59!ckyuw9dfFn6ubBidfvDo-ECuHS+n& z!M&v1g}hd_Z6PuBZ+{(9$91>6YLw}@qlRu@zvuHNEqY)rA42lk>UTw9jJhh)&3T#rZ1|%3Q_VNh+u^fVnSOF)b{3Nn28Z!7) zNDV-0j-+MVe)1GEQ;n`!RMt{g*HGJ!8d%Pk3j;pl3WWMWvn=7(XtrW9A;#cPa3rt6o0vBc)ROEmKV$rFxlIwS5-z_~J(Gb6gGduPS#vpRG z;mX<*&=5CmCVbJ}J+XrvN@flVxrE(%;9&OmPP7QkZERS{DYTvXO* z5g!19eOv1~ySOgp=2VGA3%|0LiLoo@Nekh?7oFKq=wsL?--5ZL9h`|LkTnFqxxXBbHeLe(vC zH{*p>&gk+}4bP#EFjW0sxv$moeB2#jDP+lzYmR9S)H}LaU zu1cg=B?4eVtr0_l-o|%tQ@IeVlO1Xl3dt61pvk>8>M%F@aLGtI8v|i5y|I>B*1~1F z!beOe&Q#17a$QBS_m`A>sT<-DDmum4CPx6|d zj|t}?=U;2pU{H=dQx7dXQTE0AeUSBE4{aZm=n!01lqm^~70$V~G@M(T@OchtQa4hE zL;xJE#z?+I#3IQF4B(K8B)J_E`d;+i9A!4SKFgs}(U(imv;cLi7Bm-D7h`Top@`-bJO=QK|YOSWb;3M9RS3Za--Hpo1W}F7Z+9ud#o)I^voqRzE3_#8b`Nx+;XEPF7sciZck}eCC5m&A zbFV>PFpe_?{VwY5`RtS6OeR|bW~*T<`>hP$_tsglYsfy1EixJS82etMET#a^(vsDLUDUS5}|=Qulm z-2|o6p47|Lk2uDN$w7D0n_&7php3R$yBNR5rO`(G%_h;1?G zt(QHnJ<*i*maX)j-edin2M+nsplI)!QNS_b(h~Y zO0YQa13pyRQHXzq2=_@Pio60|rZoRaz1fucWS+^E_>ajS$z0!G>7O#_*Nt+qyk}z( zjJoN`RpmP2d3JfNrpq_9dY;(9R&wTn28|y>7=VVoiOb3)n-GO?$=IO8=ilXeyQb z13*HS0{xzK83jYY7&a<9X9!S&-VdCYwQ;}9R1%ynJZHH3wajDK1qn@?Hb6i=k7_V^ z4{{DQc}r-HQ5DMS0a;mGSm0tT)Dm<&W&VKU!5TVM#;AzKS@IIZ@x+@9)fiN8x0HQ2 zz+f}E$kAlxDXxkQf6j6lzlq>N>!*E!AJO7Z6utZ*c|MSC6*FSx2 zmH6-k7Yqz})C-2CH^$P9 z=!(lX`aLH}tZ*k}y<*b0Jmxxt(stejQ$MO}(K{w&+Zpb!N+r))84o`4o>VteNb}<2 z@b7N-t=s>^8XS`(vAkQ!f>iOQ<*gSE)|m}l>t>om`2aZ;WJ_`T( z(*O2zK`@48oy)y83*WHCn;|P*qZn=C zvyIu(&e(yQPkFiSHwvm?4ip~l_Cpr{kK7Fs$hn=Y8^F(hcR%9P3H1JC+N9nOb`D@d zBa@%f9zm?t98DI72`^h5gZ%3X?UflLge`jhQ;q))rvA^3+P>`QC?R{N@u%Rlgr<+d=qM-mS04u> zCM)j>Xln7gz>aWo_AWi{8RyDe7rk&8!JFR}=f@zo0 zv&A!0x0PJ86}>4+TqVxEYw(gn_F%ehKcPZ)j&TPT;1|>92*dgvmhm)M^8ja!=uG$J zq247baN&GIy&V|hX7Iy6w`(v;R08@Qqb(H(+TKcovV)&342eA@jEc<=5}Qg2m>r>( z$vb&EhMi)4n>~ zaxXdqcPSjfLC<-@`0kP3z$;>dzIwXwd@Xaady@Ccc9uF`uV{Lyx}v^mn7ebLtrQM( zo1#fiI6L%;`6N`AOyddzS)LmYJZ=@wupLIVrEMO$epH7WQdDA5!~K`t0xLL? z${7(`h2rsF`3*6HT|76&{b{~?x~?UfU_&t#>AR5Qc`u!Pn;&v*Fp|_mwF}Gt$%n{P zBu@S8#)$ANY<=ST{V4av37ANjCM*bUU=Rn%xchYS^xqcPbihDyrDwAJEzf8StE6{$-g z4KaII5swdK{+2Qyc$*StDX3}xLSzU9S3}R``bKzmt!cCW7`W1=c)g^Cq#^yk8}2@_ z)?2AqVo~p9(Mn$Zb`(Twl${rWW zV#u=c2nkiKssB^>=EJI!o%|UYg@EHnMPwDS0?h{oR3;KsdSX4p(sjeU^XVQDMcCJk z=6uX1&i+XuMPQ1R<2@C=6}rQ8W~ir_x>{R%o`LkdQkxi?;8b#fjbc~F(|FT$&bK!g z-O#{Y{b?#)HNTqUtR>*Og!1ZDpxhT=wI=mt#0`>u6s{(U@vJ(>n{3+S8C3YP<2E!9Uw0 z)_f?S|@PKy;)EmHq&48u1_E(nLkBsVvf zxVuVQi6r)Pl3YBC1f5?S?FXmNl1?^v3=~iNWUIw$*T?o1`M`#2IiWmCRfzih@Hq9k)Qh8YkA|y8+Lyr?lZz}asAB2y#q{UezrEpX7@k_qTxW$N3xu8ecS-@J|{T z?xPKh5<7W?zQ|(-RG{Ec)@UFbE?)<=!eH}-|D;yDbWS@UsHZITZ<_`ofmzQcV&Ww;r~LhjB>?=wiY3LE-}g)P_jo>o&=v2qr*$js{0@G#jaQNLmOS6iLL%_*0(IUsWxB4|qYhBk7Fpvyyf zYk)kb)+4!7VkYkaQfRW)hqh@6Y1-hs%81qg?t}sV0xUst9)_sTthL zcb0q)pS=a`_1@PM$m z3qvin%dFhDOF7M_B?Tj$+*`P@+}+7J@C(f%exd(RzDd>_+~X1kPJFg*<;nj)npku^ z!$PQQzfT}u<5b!zWF_8Q^d7Hb3mgl15+Hy{&NVI|8vuNm{dW?IOHuv6b5XK`KiM!+ zde0Y}Sw%jR1KR;-rD@TY;nn|ex<=}Dy1voP7|=V@Hs4jCNV}U}G{~h^ zoP*JRuzwdtIIH^RB0@0v_fNP`C_$>ZUIh0(j#<9fhl}AH{R*@EFWoR4=*T(hSzTxz z>4$^6PzsAuTn{~&i9vTmX^GG{s$6_n17-%89f+tod$40b0+ z4j}`SGCS&jnfL~{8I65=>80f+6o3x_p(N>Plo|)uZjuNh_3Qhfw3R;Cn@RSqfsur| zLdN8Oh1Z2piHhTO-@_XWMLObTDw{Z1WWcU@HC8#veWi;O-e}@Zj17sNwb&`ff zu9?+a`EU~!Kl$@y#U=kEF@9H$o8FbRrAyZme(R|cf-DmfkfiV4QVQ?@j*yZC7OK#t zEu+1eq}SJk=dS^Lu41i`{mf`;avl5A!by;Dm04nm)=`+32K+MF`;`K4a>g!)qBBhf zGriyX>zP2CI4nbq{06n4=aOB~#j4({?J4z#qDe~L|HYh4_%SKcMysikHc*u)GURZa zF8~Lcd_X!*#cdwf-~8L-nuFDz*9H=m^#q|5Ku~d_mcDjpvy_YjX2vIiCH4C94^< z0ggg#S07!BDYwEi#D2tcuZ^p=DD?+a>1zsbnEfpB{q>&YcO&-!FC+Cm=swoN@V}>u zRSzN!IqL~&IZj6XYOWfylluxRqjW`KGq35s1Gw}Tgi>YIqWn!NaX5>D1|*_i?W}S| z$xhNt$Q;`!n8T`mzmtFeT^VnaCitr0y5j`^4)v60d!6nBau4^(iIya0BTF$lFiI zz1J$W!#m(vDk>6gu0bl(1im?j@@9fa4g4}#Rp{zoar*ZdkYl{r~|*^P%Kjqw7>%Z4Y1V-s{sMRzqvS-#9Ijwe;>C)~m50Cj$R*mj^q1pfH*qt;*k!D*9Sktx=1 z=Ue$`x~CXKiC7{;)|-8;4_MbWZR288Xm73Rb)EyrnXzBBxHb=8;eXEEIW>Hj_Y-y1 z%iiaapJ$MJ;t$d>9&!#FaO zuElbLr6-^Q{_s^(^ zr!+Dt7ZRmG50LJ3phC+J_`^J72Dz91N8-I4*(cA}IZ!bhoo_nGd`$pxU@QNJA9RUp zZ6P|gwdbknl$SYJ=`u}&y>I#!ab{#qb!pbl^V<5OCN85Rjb5?4)_06%FV$uW`Hqk# z(Ni{C7%F7d-!XwxPq!Lb8S zz{R;9(i*2I2Ubjv{Ydtbt2E%U1f%1^`NVTlJmAaI&HgC0@TYIPT8EnJU3>3CJZj%s zS8C@9H|tq%y}uqkr+PPTWrbzVa~y@1k9mr=&XOmb(Q;>kx5xZm);`WCQBc8bGo6} z;C(j^e1W(*a4Dnu2)z}crfVI^`c$eo^tbH3_ehV$O#(h7Kh(_2EBRFjc6b7;eq{i zG}CO1&5+np995GS-?(|N1k0Y0l4&gr(BRpO1q#jpNkCJ?sp85;tAXCPD%1OQ0D@8&o7!x!HzOUv9!1_w9=cY zn)1kRx8;w*I?vktYT_>Ad(3+cKj_zV&4gF>Qpz%+cdGp^n@=&A&TFlHA=BH=B)!Gc zI8B{nGCaEyboGmK!4g{Nt{v7p;(+>frZ8 zx7z!-o$H*2cD|gdwnN@L>C(JeixMUX zZ<7f{OIXfBnLEESs=EZjdeFC{mE!EQL{=#SJ`ks(h?;Xe+v>`xO%*idEL&+2H24b4 zo)!V2^c=fbfQS{5BzS9aj+lH*3gWQ_Z`652OYZ6Ujc^alD$2u~h=5?H3C+r}GX2w_ zzRyH1GZa)A?h33%op6N;4nq}`$Kvd-?7)_V<9$uZH-Qa{LGksjg;?gv)(#<3gGFl& zsC6p>z1a9d#ZiZm1`@Rs){K>i%ivQx8|TU<-GA`*Ailmb*3#$AB=a9vsB0y2>pnSc zFTuyGuC=+CGiI&?yqk$SgEhsi-lv(cu0N;w&Ncv3Z|`|6x6p9)%}Azz5Rd0OW?o7- ztK@o)xF(K6-9ypEK_z_SQR?BnzXcJz9w$lEbgO@?gX^R7F87ZcoSY73f|zjQIjK#` zlhulu2IbA?P&JP(11^g~12G}G_KLQP3PuUINL73h8k?o#`)_OM$xcGCVyzyNDSwWJ ziPv%FfY{0OCb)kbTV0~Pdoy?EsX#`@b;FLRdS!rV!gJxE0ORVun3-h5x?HY)EbKRkI za|}IU)vuK>^P(33c<${zR8d!+)dy9lNDsuX81nb^qm+e6lMadMrI zgX_t#0ABR&XH#NW(vL>#if6%_&7-}$B|1Kq)^WqHPX9eW9}w8}<8wd_bPt;n9u9A0 zY;8f%hh|oQIEcq_l6Nl><8}Jj7%OLUMNw`8WXO#UGdmpkqN|kQ z#QTR|rVw^j$m=PzQWCdKtpb|ey4sy#bo)x(83uFA0HnEUF|XNLqfZjjMSY^V-mdYh zefxA}F}?R^->QPwIQswfbe85?eVw-cL3-mj?VEzJy@&1?V}K`5bA~}M?&!%iWW<=@ z!1YuP{%r42kSDL7JQ>_)=HoYFOy$ykHge8T|03D|8tNn=H#P@Ey-@i-D18NlcT?;x zTcQAtiS8)h{u{eXNCm-z1$I!Al6#OBt0+h3{)~!Hm5b*6Z(J+v0vpnI$#5E!7!=%- z4{C$d!JdvIK>#{isrIgYp?l%Q^NiLtBv#6DdxQbKB}5$LYD=l#)RnFjj}0tc8M`Y3 ziuKvUgL8DN3;MKMvY#d5T1YAp*Undk_oaIF|0Zq&h@LkyNTY^H$W%u&kt}*{2&$S{ zR4D1KwjImV+&BD_`qUcXd(S$SSNZA^2yG$(l0_G7Q1xoo3~_(60+SZ{)~Lldt`oHt zW=ZZum*+GiPW@B3V>k#5&IQ+@{Fw;vM69KqN9@EKfXP{gel`O=s^}5|SpAzG3I5BY zLUL@eFqn z2=EjkYTxqK-!Eg3B)25-5z^=X?q%A&iiFx3z3a_h9VTmourZeLQ}3iY!?Eaqau@)K zl!*eQDo#3VkX~iY;qf{AQh>G{hbGHGfzsE5#O#fc=%v`kagRA{f8H*;o$SF zMcu1ekj&qsCMD?=G6IUM5}kPzy;)Zm!vvgDu*$l-v6j&@4Kh=p4H7ocXb*9@b*K$3 z@91H#l`|+)C2H!t>ddDEcI?DtS&J211bD^s zcvdvx5KjTyJ2_~+CvS7DmgWlNmmNquMXD4Z;5$qmJo$8>gw8KTW{X;2ffOrFmvfI_ zVaAASa4a>5Yx+1t8MM@mg4{*lZYlJhQLD2p8)HW6g+XG()pi15;W6zFZB^%5M2Ht( z)9x_*{p3eH<$K!-lj9^CqC|S?cb-J%X^U7G@c3ba-r1;We26;nKPk*Sj!Js&+9S)H z-Mjrar^g<*DL$M+rMw6GEV>T^>^omF21rD&k6d-ECHP67?~~l$8vNH5ITKN%u@A~! zgE9#<-!TW9ZwO2US+I=|OA$Ax=(PTqR za^YN5Hfc7I$~fXcE6H(>yqAspp7>MIycDvWJxSxLO8Ub!t_lXdq82=5imCg&0G@ozkYHUvqN{0UAHz;7{W@3FQJ zN4zRWS-0Bkw6e;eZ;43-IIGo_9=p5XB!H}t)yP0j1Y)JpN&~fsRrFdtvtX*C0Vh{% zfz?dVmsSHv)d`ab1`-O9E~DZaD>?5_ls|_-v-k!&V}ck= z#4yc{7X;~g$wBiQ^(BNBERL0Wb)N(YpHtN&=6Wze6jQObsF{ro71(Ai3+TTERL+Ws zK(5%&q-HMc4h5#ZKVcBt4pD&??zDs7d_qc1qWfg~i=+P#W?w}Z<>OqbMbdGkrsM$+STkjeYWx~4{+gLBd6 zDKFKqQDeop2euz?+V#4jL9T-Uctw)`p_*hYB9>7qtVzY}OcS;oyV1iejitFzf)E*o z6NcBrrwWml+mTvZW`J1QP!N4YQyV-VWjhR1(?|eXvFAuOLol}6=fpU75o4StEqtw3 zwB0RHO{(`dZ3vLm6&%l!8u@tc_fA%^nUB11Fb%51wXCD*_nGMZNo1$${`;&Tm|!ka zib7QwWq=(;jt&lUwg4-ILvt}N3z|@#0Rw~&<8|&EdKccmD+A2FTrxNQ{a51(cq#h* zd<2%!ovzP(H=dDoQ_-B*s_;@Pw>3g1&pw+kY~=aIvL~1-JyKyq@67M8<>Wr_T`DnQ z%gv=Zn9#%cSM_9xMZWUM*y>OxdWwg|GBJ}E4|Vq@=34B!aF(#d)w&mQO{TPlb!Ps} z*W$R>xjRCqGz_Pf98zHI&J;#=)RS_Z*WW;nRq|5=<}Z&s0=gj=wA}K!h>tsBbYZwS zmSNFY#tkLu9smotglR_k`F%Q=2WWDn`#f%H#0SwQNv35Gq9#?WB5Kxycyd(hNsY}9 zgQHL0afws#-BX36<7kn)5MA5A-Xq_)gq6OJK1^Zm#(j>Ot)zux(#d^R)&wj9%%F8v zs{?)oDBj>kLtwzXZn&{N7q-S%ku)cvs=Qf;@2V^*GRy7~X+ zpTpCC^=(>di2?vRRYmJM{8;`hyFti9rHVYk))kqlK{yoAcD+8vpmVioPc8q%AT*mx zDkCDeLA71&`vfMIhmez6I1rz(a_+ZHcVNR=`=ReFMfQYi9-lkVpw_FR3_OEnZnIpE zl(4oLlCC`Yw9F-0DUHKh>M2#qawyMPL1GwP5zJPwi7FeM!!bt=`o2#`bO=jqts4RmB!w?MM!A{>RsK<@B(AkEkkg0t_k3Wy( ziZPNg`S!2s1v!$2;D}4z-;(<;U&9l*Kk7-g85+eEkp|`A|O7E<{c-=#D3%{ z@4u)W`t9NHbKdKXeAg+Oz)SP>@Hja?%bNtr0q?J6=3f1s)wAOH&%#xi8L5%^p2{bL zG6(<60%4+aLFj>l`#a<4wje6H;Q7}v_I1mru^eI`M8 zc9eG!&7$J2BXR>0WT=g8kxDhhwx`$|+3KV#+0J@h?=)sn?-D|S{E$~RLW>qwqzzYt z#V6pH2xhbcwFBZ``2haUxr}8=3Pm3l&_fP*%wmet~y^$!S7VhJy~ zz$1^qQmyyyXSyMBZkSt*GA`S$haW{AF1cePpXmJTCm*JMKAd0a@phwJA8Z{>iZR@P zuYNBTeee9~u(Eq+*PX?%DsW&LQ!^%}30+Jxs9o|nwQZLKd{V%d+JjjZUU}1{I{mM_ zj)_Ga)O$chO9`g61ey|@`l?c$6{U^qp3}=S4B}VkH`Z&qt-db^4u@5AGqDk(dh$FS zzK#y|$J)$rUb0R6^7Wtva^$v`NdhqcWjN-SlGD|1vsAmByni0i7)u@l;4y%aOgy0_ z-v_A|lR>)UFqOT7e}(Wo{7o^7N)`Ah@Nhx$4wweRJVI#bu9Ti$oh$!Ug&9wJ^QjVO zvdAKhhHiN5=A;<-w)z0ULg$7yqWtz&6h4x|g}(YgJm2fdLnl^(1)YMu>J$_{SAtRn zt}cuW6pQX85iSl}{KNw#1X{31Dc|mnaC!>|L&sWY_v~dlj7sAXPxLg?cJ#i2ORK#_XPVX{(%`U;;=7`AFbButWjrjB^3ILY z8%oYJO_6JbmnZ+fLX0cI;~k5TbNo`Zdb}2C(x{tNv$sZTHidGw(U-_BxnRA?*{Is!4k0w)oYI*A&Urw>U zmSMOw)_!B1)4!FP)>88*lp8EuPJ`h8C?q_tq=+#t|LsxQ20-d|4NRko>Q3N&r-usaxHFFq1 z%jm{Pv@HT$dX7*oji{=-Ndm=L!s&2+>k%u$;)C4M!id<`6V-95=t6u5Q#h^|a17LW z`r-p{afoJ)P`NC+cU$XM>qsXGxlab^_(`CQ|BtIHfp4PB+s;gmBG80#l{U?^f>5As z$|VI#Q*>42Xo~DA%F*JnRs`B|%h9A9aVEDgkm7pa3Qf>;MHiYBR1l;Ix+|#A zq##hB?M#xknWQ12{lXXbt1|M491z|hONSdesbusXXf)Htyz0-GiShoz`|46fTd6tZM>ZmoJ9e>d0`f_ zGB1kUy8Kv88X4yjh8S4SSe!0Rh!|^RoFir-y||M@NCb5c{sLTLculdDqRZXIr|L7@ z%am{hrshH_&2TX#8^S+Te4@3h2O47PstEN?DMH#%T$YXL)F1^7#!-n}(#;ekqv=-h zSW3$Ul+x)ZhV;4_7 zo8g&O7}Y=&E(4XWRW=W|3WQmQ?A!3@!f0+?*YienAR(<**S#B>L0gPW5eW^R1maOe z{+J!+PV;v8%!bhQ&??g>X1gl62kh9(Hu$r^%xGat+b9MI`faNvb}Td&V>L~w-$iR* za6hP=4xn-c%Ig4r<)OmLs#}9dq@obtZ+m)$Gm;D#q>#qnU)iAnO^qt@d{|V-QkkX9 zk)8oHo$_&CfqrzSyKotIbW?s_lrAk_9G0KRL9Ny18>d%`S4|;b zPb?e@>H_i*Ri6u(_2L2wSjjPDwI%T#iGP<%xKk<5>cySH(g_Qi>j_dDQ%N~F>IC0G zg#~qjOXd0M=q5K&-QfL?I2$ufW+6^bC;L-q&v8z8>TFMiEV!G`<>$z}HQA0K2#LiU zi|{>ouxt${FdVJb0a~1>?~iV?3*W+pt`~dS4j?X2yLwg^y2p`P#y(QZ=!|)oF@T&Z zzEy2z_12KRv^4-hmbI^?D7W4vjs;!0LIzfA&SQYyj08G$QQb@;?~>vEhL{BxxcjAz z6K7dpvCir}r7KRieh!4`XeQlY$CvUSP~WN&PCveF0@I|c>sG8(G$D2vYQHv2c23nZ z$$lzNf!ZqJ9-%&+0L;9^(Sl(Y8k(Ueoo$eA0hd{a`$;)GW@c-L{;k4NaeOiBZlXG- zxn1KIsKgoH`9>kd%`q5+3&o|BA9Fdh=N0^_13ZL-k7o)Q!fGAL)+nh+y}wK$g%iLz0s}nu)J)LmOC!p1DIww9;k0ai=x5&J>{MCh^n> z=MVKV@hqPXp1OpILrod}-leuRD3<|&UACHp%A`ShiOS6zByEY*Ig5)$tJD!`N^#5; z(KcxsjIkYA`2Cs@*Mp={C*Du08Ki+P^;Sva1O<|Tz#$HBKSZtQAHx>)av_FG?mN1Ir$6Vnvb(w8V^jAMOoun40V50Zzs?Aa-OZjhP2&`(-5d(!6c+8OA zAz={j;ZL>D{_avVe!)JG^?Z;94uIMROl_1(KGUE$9X)fZtuIXH6~hH1LK0|@zm@+e zsb}Pz9(T2bSyJvUR6OB%>TNnFLEk#q)Yct*mYQk#x~Y4Rb6`sALgtC<|4O9NZ}(jq zPB8tWH2ZD1EuirR<7fE6LHZmpQH*r5OL91l`_XZ?JipHG(_Cbg^sXY5(8H_j9~a>6 z*c(e_@Fan5v^_AF%5eM+w`lq>8mZOhvQ*qNYJY6}^>%?2>5*K_i!dcS#mNz}_Hm5~~JzzbTI=qZi|4d(^y(sG#yEdyI;DyTYl7z9k zLSH<4xiroF8H2ZWS(=nNj2ECV*4_zZQJ?SYvk?5?7Vfsu=VDtkm}V$y_4Ya@_10dO zARlEwQCI9yJ(tXnVI~{}eBy~o61t&Q{G|R7EK%Bl&ZRTpqsprQpe#56z6!}|goJb8 znPHHxI^hTwqCwkgVMNU5Vw~led6p<-5qH+QcWu9Z2z3{UnYJMn6+|R2!0qED;mzKh zDyGLG>7XnRy$l}WKRgW+AfGV{@CKk8B58JUYa^10=5lv!SM$@MA?oQ@jv`Cyqz9Om z0eUCK9WCTG8AM^XP*O_e+~!3o$fg&DcXaI%a$31zCI|m5r*p1~=E^1K zKB>?l+4e!T1=@Tp#bT;AwJxe#;8N0o4f=Y@AIBSh-i`dEsa3_lUh{oCC+sz;x;G$0 zaf+#$_PwO5VB+kGsvEH_;c(_bN*rzeQ&ervI{$f@S;)IHs6t(gK)>*=a&HVf(_8P9 zv_7jX&_uD8H?JZ1%0)_Q4`01nfTRZIEaE)Gpu9i?BvN};=d1ZSN>ESykwRM>&qj1t zge<5aP@Jr`H zEY3sa2n^2Y?W{924qHtuXktx7Lmgmk>XfHZhr89Sl>d`Q`-%28l%)g5?+D9xmePL- zZtjO(cx#tN9-V^^EL1t@2)g3bc?gmC&la*mF8a9B^%RjAWU{pGFW`P^P4vBhV?iB? zXe14G$-e>KHL+R{?ia-VT5}cRvg0oC5nNu3jBOrhb1A#|+Vp!7|vQK)(g4oxp@-abiDqc_H>fwoUe@MOv z^jHi&`QONW>YP;f-SDd=vYN@lLmQmlTw!{V@JLi+)!Bz~OXPuLH`D$pB-@eTG(&$w$|aTx62^&8b){rtX3toh{Ja53NP?m`6E8iu2!0zi zt|u6*3`UR@_gTsw=2V<)m>`NR*i&NXI6ud*jXjY_rHHvVoK(#2!V#SgM*1+v;7XR9 z4mCVZl3RQyf~?+JMsH354l!`R?Q7w;_a1MQV8930kc=`L9-DIn_6$En$v_vRK&GR% zEP{etU8nq*2LPnD8YXWj2168x70<}BT#frEOc$x+{XgeO=LK`$Tk$X7+dQbtcM*XU zsz#UJX6gjuu*_+~8jVNlK8e2xe1xR$Ks+q7mN>m@ovB66woSlESkGNt2l&EnO=R)0A-vY1^I)y`JC9)0eza-97u2i48XKNQyq+Yc7hdVKb!(E`(9uNoO_p4Bs) zMd>5YdOVeN`*#@WF}hS%SQgEK2Tm62tk=6+6r)v_yo`2bo!36Ri&tdngn1%#eueAykhm`4=4jvNVZeei}#A%H(4I3U*}4E4Dj-Qs}UHhrtj9ZVdg?I@zoQ;aN&=0 zoGn9y5&+4^n#dAOWr)K}s{o1LZHr8$4>vgY6Oqj$20DjtD2gUXN2F(8_5p8;V@thP z(3lc~N5eDka>7udgst;`WKha9KdqB)AnDxzAJn_fNO;4q2;LB+QsOOV2oKRd!gl^WD3YL^-?T9JtFl(C=f0&fcx+CccXCAEfu2qov(G2 z8C`6?xH-z^I9F{!=5y{@^i!14oi!Ek1u1K7-AO*Bc)4Q9VrATW2kCnCk2&<)ZO<}1 zo%nur_H#l7(b+*Be6N=;Tk;&Kg|(rlMHM7Q*4u>(o`x5N^+vuZR>#P#wfvQoH!33o zh1IBU8JWlujXIilMJRE4=DLI&)^x+nnR*1VB}(OViE+nOv4s|C11c6+XwgK+;?w)e z;5nIzPXSRHnHegMqV7aIZwOus_<|UQMm|F-T#$YaqlMF|m3muhrd zq=noS-3fF!Q58dhUBS`NL1EA87gGn4sV|PG&;$x>)Y5q=xEE1sN&O&dHQ45=lccx4b&an(83Y%@nsWPrIz~k2_=f?+ovo%w81^fUES5V-9)yyf_6mlEEG{tR-H`_sOx=`FwX0V2hYJTZz<D_J^62>Ya@BOW;Xs5hbId8CQ9HN) z3)&2LxlZaU#5dwMIt5b1

*xzws%)|_6&R*~GI23=e43v*T9j-!#Ra!e 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

@f7>+mcS0v377+$1<4Cy20_}Mkk%&-oBCa(? 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 literal 0 HcmV?d00001 diff --git a/flash0/font/kr0.pgf b/flash0/font/kr0.pgf new file mode 100644 index 0000000000000000000000000000000000000000..5d4f615b9cffad1617d547156d4233c5248a9a01 GIT binary patch literal 883164 zcmeF434BcV-v1}El0OB*RlOB-uZ z+C!-|B$32YG)Ylf+K@%HP5S+RzUQ17(dGVo?{n{S@AEwQy_|W^cmMu=bC#JgnNg{h z8pMT%3H4Mel?k>IQmHz&RH+)`z8y9rBO}#P7$nx4_0VnVg@=cBalAjQj42p2>P9>pie>Jd^7&yDH>-EOS04 z$1yq16C3+8*^kM7O!i~4UrTJ=6tbRW*0;jOaZJ`TS?{IDOqN??<2p?CW3s*tHjZbq zzHKeC-CL2{)gtTLD>9R1A4L{wk@X!ExnnJ|-nZ7qby;S;A2yyRll8o>>B#oZip*rW z3pQRaCj0qg<9RZ5GW+pkq1(DE_j%r|<9H_fGufYe;QLIrGuh5$JLlkijLCVJ?8jt3 zCi}6?UZImhXNBA++jaY_E*I-~<9tlc$K-sh<70{0M4_`n&c}Mr$JFg}yjCph=Bk^M zu4i2>_Ti1|F}Yq(Y#hgAKPKCl?8jt3H8$>x*;FC-#d0%+%@uNgtmk8g$@?CY_c12# zQ%vrg$@Q7sH)O!6_vaeVACd0m*gV~vk7migFX z^0CF#9YcJ~uw45XVVRE!Ca))x*OSTX$>jB9@_I6Lk8PkL^ZK%0x9Qe56gs}o^JenA zncOdv`(tulCf8+hT_)FMa$P3ZVR9V}HqOiBJWTdyvOkmkne5NKus@UQG1;HV{!I2~ zvVRyh_Ghx4$#y2&!?AHZlkH5lGua-2jrB~{Gg;pY8^tCnk8LWh-%P&7Gqu=woW%1J=Gk9mUQ<}2kZrcuydm3z zh45#72|9p93R!Lh`KCghd<(K8^w$;MP^i=2hU^48>zN$KWPM|h^D%Yu9Yrn%n<#cB z=VP)Tll_?N=L~WlCg*2<1vUdYj>-N^ou1=Z{u*qq*qLl+vYq)r;rE~mWS$3;>oK_= zlj|_KKPJ~>ay};KW0oi^Rmk;Oe^22z3cpqONa16JKPW6ySPr@(p8H^OJto&ki<@*Y`KFd6B=0kl|Ozw}#{V|^?e5z2_Z-pXPDy&lY zOyQ598{&CAnLIBh&x^_PVe)*KJRc^{hspC{@_d*)A12R-$@5|Ie3(2BCeMS(^I-Bk zm^=?A&x6VRGr4~z_s!(K-9he;$^9|8KPLCb~^13p)4<^@Va(yP(XZ{L$ zfLw>kb(ma-$#s}qhspEx1lf)V3t&*b%C^5f;L=$Y)t)aiNs+Ck?0Or6Yq zw^#H`)-!c_UT>E7;(X`>a$Y9unfy2~`Ed{wJCob|{gBD~A@gU@U$HZPg4_+{c{AD0`~~a| zavmnzncP2<`)6|hOwP~L#Z^NNfXx0(_Ghv`ljq6g}wa$iig_X2snnP!lCgAKq) zg;5}{Gt&rqra2f5T7ofPLogQn42%bD!M@-Sa4_hsa1}TNa#L_9*bJNi^7VKTr~xy; zSa2se5_}&V2kr$YfEKvs^Yz^uwkyzRi(|0kdc_zYBmJf0cK@5S)*WA1Y|_y#xu zTn&x_*MK9zjbI9R1@r<7!4}|cunBkvYz*E9ZNR6XF<1^7fhGp%0X^A*_driDA8ZNc zf$hQb;1qBXI1ii&&Iexw(?Nbdvjj{7*MY;q55ZpG$6z3M0c;1}1e<}ypd(lUHUjU1 zHsE(4uhnC)0r)*wA1nh+!3xk2tOV;WDFgTTXJFn9}dI0SqXOa?cBeC+ZuJPce94hPqPe2nw4 zJ_cL`js;hOd=B7q!DR4ta0<8xoCcHGzh^ifoB?XVS>Rl74)_{47n}vo180I- za0WOZd=*>(^0kRMT;X(ZA>^sxB5(@$Iyf0z3{C=BbWki0+YebAfKDx0{Ps%1snu!1qXs} zg9E^Kz$7pe>h_uNm)yd@cC^bh}7(5IHfggi`;8CzAcns_TegX!7$3ecf zp8&gopMqV%&p>_-aT4qdo&r08pM!qjY0wuu19k+z06T!^Kp*ft*dDw9wgWGM-ryy$ zEtmtg0WX8C!CbHv$nQb(bIyFw6TAv~fCZpCSO~TNi$FKpfh+2 zYzp26n}A<|PGB+U2$q12z*5iw{2H_e?}B#VH=s560JH)hf(^lMK}+xvXbyf4)(6W# zQ;@H@Cg4-h7%T^kzzPumr1#kkz-KIA@N50uxOOLlo4^s^T5u$|23!F0|3##O(?DCq z%*TB`$1&{{Hd5G1p_f8`h20eLIh5lf6!JNoWj?1f2P+(+aFoJj3i;Z_ewhllDdcM% z>-n0<{6yjB3NI_Xq3}nA2K8irV}<4l`8v#b_*&2GsF0rvupFu|N#RI^d>v)`+Y0%* z!SZJc`MSaK*9yN;_?^P<75<=*pWCoMUssrXJz@T$&$*^pNE)yK4J2CgvsXzCZ89We0($cIAij0#^mFS$;T0sj~^xxgrl zAI^K7aSijwd9er1slhnUYH;oi!+AIY=jPrxUq|5_9)t6F9M19aIPWLoTF?*Ig(O@n z2I4w1Of?)=p^>;EjmA}KEUsMRRTFSMdj;3HNx1G!!L@LjYC5i%GjJ81g)8fJ)h^XX zs{MElaZ+_%bwd?zP-F0>;c-KIqsB&FMlIZ?dQA72>^a4AiRS^&gPtFI9`QWk`Kjkg z&r_afJT7 z!en8JFjbf)Oc!1iW(YHdS;A|=Y+;TtSC}Vgh55n)AzfG~ED~N977I&+rNT1d4Pm*k zLRcxR5;BCTonq0LZL{wCR`V82secJV(N})=4Cj2No7k(0c7ODmJj_o@x>^R$Zp6^n> z7TuS2|FY-0-~`Rcu!oV2V%o)o#>|U37GoaUBX)UgVXR4%FE3zgVvL!pRCkJXoj^sp*sR=bDXKF^x$%S0Wjara9d5|Zyq*mlb zt*H&QC2wj+?a7A(>OdXIm;9&`b*3)lPhF`Sb*BL8K|M)LffPi+6haybr7#Mo2 zDUzZnnqnxH;;0YBQvxMYU+PEwDTxNqKpI4YX$TFaR2oLZX#|a=Q8b#y&{!Hr<7om- zq*o}7CedV?LQ`oPO{Z7!3V0^XqSt6P&7rw8kF+$O7En4Zq($^PEv6;3l$OyOw47GZ zN?Ju3w3*V#Xq)i_gTaB0CC1gb>i=USS>s&SmjW`ohHCaX<$ z8;n;q%`-V_kfw6BHa%}JRn;uc^oGF%+jxcW);HmO>!u0N*U7FDaf`ZMcgs=TZlEUmX) z)jF=h=6btSZB{qfU2l)7ZC-<;^|Dpo*5>Ey9aOc8Grv*qh^qZ+^N010t96#%XT!z9%{l6484s?hM+$sY5q?iv1kl0>T~hBbd*p|F_-C{$2L8!| z^Iu7hv$DOB$*G|E)*eO;P6eN|_A_dDDnw2E$eZZ=4!-5+LpH62?m-;}lsn z)|lvY;s^nMM7QA-r8U-jZaO7f)ua9iJMEitvbRo+I@x%d$vdY;*UGsqXpC!<6(&1^ z#-=pcYO*_MTrHcf!N1H8l&=4Bz+ZCwFSWFnTRLJw;&^#t_!C8CkygRvTB}rH^67%KC#Y~TXp*b5h3T1~$tljxrsspEY;*QD zRa(jknp)x+&9zySX<^XxlxBlv+i;!BZL)GEo#axYmxwZ5(2_WBpUV@|8l?$Qi$bQV;Q6ku7G_4l3sPM5U7OZRuhm5T z^cRwk*&p;Rsd8V0zwBa}zEGD8f5Ho!i(5pkENc9@>&pQzq-3`wwrSl`{=`MQc$?b< zGw09c5bcr@w`y`xB=u5V*%t}_{N9p3sqp6!|38aQixqz}r-#xf=h^go&$Jf$hvWZO zsm}g?as{-1Z4dDZeq&pUy=LCQ%S&3EFcX4TxVq<<`30{`aldWmAG~Ut`(v|!;EWRY zYO}!L)vg{E^)7wDuAfwE-_@`E zfb@;~JSWv3lD_GQ=luGq>6-=onfl1|Hz&2+R)1{zTl-q>t3NS)%afKT>rYPKD&TL| zr>DO?sZ~k+S?TZWYxSi5-1N*RtyB#bq;C`O2koz?XHD{QZLlo;-F;p{gO%yqpWrY4 z*QDqQSo4y{>I@8XOA#Fs1G721kQG+Sc}QgA>8oC2gx4oDAOQ>TO|uCU}2} zx3l^A-~-#dz0Gri50-cbnCAr_a%~r7UKo5hrQKlj8^IrMYd69CcJPssc5}>2f{(hk zUtxYP_*hE&t>zDdKiSrPuleKP<0b7+m_G?V;p&rPt}I^VAFU^B$v%AA{`BP&nU@7@ApPDatSTs2O`ANagLUCw#`t-}G zS#KS3#>RntVF0(0Rh^ z4@Ydr^%gBpUzp#qc3Glbe>1Ml>5C^j9>v%dR(6{h!=B(xY zyStrFllFHxf9Lgkg@4GEZN85!0zz_2e5)-2L-JhxEG#u4`6+(RmcRG@Kc&g=d-(zX z^T}uaWzRp)@s}*w|6n1}Pq2($Snvd2LDFYoq0s5CPV5hwQWyRHp!@^3I#t~Y)U80> z3e>GY-3rvLK-~(|tw7xh)UCk(vK8oWNg`ejBwLdD+7lXWIq>wglbxnn4n2+EvY2m~ zy6}e3d9~%pg*Ts2ru<@ZyXDx0U+(L?&vN2vD(hTLX@eDCGN;?zbBr4f$bP_s0!Sgp`$Z zuWooUR_8;?w*`1x<%Cp}1O!;+g;cush_WgSsY>ZF*y={evu!;l zSltf!v82ZwtCEoCu02;+-3$3CrRP?whao?2>$%tJamX(vJx^FY38{8f=U7#S)TF3y zTRji?b({LJRdooJsH?5;WwdUA7S=`@gVaE0Ycox~tUzyT3yooEV1Tu?#>g!w%GzFI zoEkLP+DT)Q6*R%xSz}rnG{@RiW9AmT!rDVqKQ(x(wU?$rR`6bHZ;g3r@Cj={W8oH( zW9_H0Obxkh?XPK=74q0RKx0)JQf(cmv3Ao~*l091sTyaS2#sx)#@i-JV^^vPu!+;y zyM;#CBx)Q|LkHU=X&PmPPOurQaV!m;W0RtBatm8wGeXliHEgTR7)_I`u)Q`DG) z57&PkubgRW5PrsH${FXN@Isqc&oo;Qe$VE$Gx%<{N}G9STnr+NY}3!U)~dHiyg zb8NS1yxe-Pu-&0)o!Wb=?QTt*tloQV_iEaf_C8^|Pvh+tnPYoM(=Ijgw(U_(`>e>v zwkI?`rIFRPCpCgwl!e_HO^4JdXS?&7j#*LOb~zf~(x?EtJdK}Qbd+78rc-M4V7nWd z&RNkD>~3qilt$07E2%Y=C3at*@ehhY*V?YBF0TOh!tRMCz%4e% zu2Rz@HTJgMb4|~z*vEF&8g*%GwVf(7&@Ilw-Y7IEHO|@IEHpSP&fDH1G^8{xz}`Ak zZ(ry;o@OtoXh5-l37D z@h9ws&?vWr9DBde=+uPU_Wq$USqYEr143g<6RPb4L*v{Mf491S{-D%Z{#UI)h;g4j ziB1mT#_?+sy&NKq6Y>-N9b%0WZTdzyBpCPY(>KYXzj41ceaAQqGVY(>ccw$Kagt5H zr4GZ52lVN;+2Ox!Ek+v;T+?s2!+7IC`TdSMq!|yk>3`l~s_~FM{ckwTFdn+5|3in_ z#>x5ppF3!cQ*4sV8Z9(V?UUrxXo>N#HA!BLmKzVxPx5b+VLZZSKt!W;#v}U-NNTj{ zi+`;B&7q^R225zQHFR|8fH{q}g^qC>xT4XH(6Ollw>H`xIxcJA-bQ;v$CnN~(P&@j z1h+vsjShuQOdWK)(b3RXvIaeFbRsmZbWnAplcAH`23t6u37woexSGxxPgyhA%kh%& z)cnEzj=9FuY=%TQ78pG_UT7jg#$Jd^jV~snOZj7o?7GYI1h*snlssf5#e$ zOKP3qr8upVYuHk^VJq}m)XVw|+w9cJ9kXa#Va}t z&vWXuc;#e#G^Fd|Rr`nk_AC_;mQgyqTAx~%L`SO;)f6PB4rbu9Bw=f6H5kT9m&Ori zDHERm^^q-QSzD{Z-?{gt!@SCR-kSL{;C(v zI{tsb9RB-Pt*+wVzXF5)=`R4L*6q80|HDuh@h@G0A^-Hf{I9n=yY6`S>x=cj)wAw- z`G4votKR(Yed_Kqs_y@w|5Nvky1wdGpl$`~R-kSL>Q0`A{A@4DJ` zEAT&S1%{iv`II&_9(5Mj-gxZdxAu?P*O;_hO7S`;&15UT*qXd}YlqQ!ji)buTY2fF z9bE#KcN8gmbT!RBOSz*f8_zqN`IHQsELgm)!x-shQtTM}CX3HzJtg-h%lMSgw#jmn z?fGN;n`D^m;P5r9jBG-L?*~i-oo9FbN~d!%&YoTepVN1xL2rgu$_Da$IkYLBJ9 zQcVxg5`dBU%5J$(cGJgU$Dh*ire!84p3*s8brMf>NXu(V+D}u{ZZ~}%_L-DSlz~M^ ztETEOv33Qi%u6@FG$pxD)j4vRR895H;kyIvolVZ2(#N?wb1##;fX^kR`gHyze`hPx zGfyep+4da1WiZj1#4je}%LW@SIlF&yH94PqsfhNRKG|$%7q%^QChd8*Dbh66Q&u~B zF1aunUs5PV?P6rZ*7h9bPC10sm!6X7OzIq)snyi+9I2<~Id?ioX;W`Qd4*GVT_QmW zS8mE+%gvwqT+YeLT!U#+J;lLgnprd4RZp{S7OJ!>=1*o9_0=`gyqZOt7Cfac&0^T5 zZWf2-nI3_F!l#tbtnZSdrF+D_%cOSe)*L4AOJYnY~qqzPobQILNj0!Z+DoH$H|gs+yL;ki}#wncJ8ZF zGb)?SJ6CKl)2Mm+xssrnoJ=>8SrSX1l1p<%we%ci&h%nQoGCP4x#X_CU3K%-%A~dT z+-60wOYE#_+MpE~I`gSCF#c#$}$= ziz52yqzo5mV&|=Q`GzZGx;za38GDG!Bhz2<=N)w^Gp)AKo_DD*t?8q!re~-JJlC&a zCZwNPD&s7UwMEd%2pM8M0(~o>kNkU>CKK z?E*kF>Im3J7?;x^S4T6GwF}0$5}ACyV45q5rcxG?;2L4pBE6d2&FaSkEzjfYFL$`M zk#n{+GryXC)YZq#!gk?#giFKM%rbr<_kwZDwToH9wJeDZ%c;yYAi_#cEt@ePohP{l zMp(C4R81jfHi}E~A}2Q@n{+69Eww!WL`B%KE#|ykz1OR$&rySGUGmUvwwX&g{it)92ip=U8IfTN(z>=- z%93k2*|m6msoNBm)GgLZO6c3RSZ?Nib*X=g3^R{foskw&WD7W8|B;c;t-6E5*kmFq5Kt0i`;~T46>|ENqoHARGx(#P}f2jl_346~| zF+4vy-?p4iqigSSy42#JSv#qoR>H^UNxPhzZ(mLiT6}UIsDP)>*UPJ0oIFo1E6m(a zpQqRr_U_1DYn(+KzHgDV9XZ*>^Bq55!3#pgEBxJa&HQXva)W*ySH`&)ou{;wgWXBp zxtvD3f2o^T=g(J8b0@J&IeV)8IZNqMAjAEh&V`a!NjZtOpnBJG+OBKj+ojzOtlGy? z@v5WlWo7~8bPmY^I%ed#S1s)^1z-C3)6$;OG^yw38I|t8N;%zC7szEbE}s`j4H)$b zl3geb5|JdCU7*a>ULNN4L$0p&_pqw3DW`A`+Y2zqdXPG_ocep%h zq;|_9%h#Ut=&&rR<2uEY$nOFrue$-4==62>JV=beA&S(oSJyrFP}h&MU0+SX7w}D& z_MTxE`lPS-@a%md{`2*Io+KueuMhO>bAfy|=#vp8mQ#XfU%B0W7y71e7~whaLch;9 zO!FLiq5p4ZyU>%gNjNAyhwJ7?u^ZPT^#JUco@06qe0QUgI@=S|$%Qm=*`RU~Jty@V z++tIX=QK3GNpeX8X4D_LmL+lM0fstRs;8BqTMzITPNp01oR7zLvsp_;v#@?@IXSjm zd;#Cq=^-oIwp?C+I44^v_qht#ES0r-Q`2(og%QDTCbry&$Kg#$nIVJoy{Sx09CZN7 zt-VHbmUk`y3tMI_8-s_DE5yFFURV9S3uD=3cdv2pzO}dI-d^Lseyf_YFOb!iGc6BX zm>|taJy8POUW~)~6_j-1#3@^N30_$Xd~)FxIWFxgD{;b=p^KJ0CzX?FD@F4;_VTUP zItj|;txm1Z$ra9HFW)L<(S`pp+j6*w?=&Ut)N<+$2_VYrHBD*W=k01LkaHIHnm!B? zh8DQN%F%N5@lqCiB`O;+?kt;84wsT%GqKy~l(Ok>+-9`8haKgeYWjv#XSRBXIlQyG z)uZ~eufB6s$^zTV<4LbMEi$XAqW;|Y%o{HiDsJ_>*SvQ#AGfN$K*ezRRh|QfL;Ay^ z>OH@l%)S25W_VGjj@?#G#w<0JJzc!a^fsN(Z`jI<#B_N*(?3V}i%|@z;l+i@T3cml zbk%Jyk~%BS%Yjo5(kUHZE~H+p#Nly3g~bQ5@Ra`|6=%)#a;fFHki%WxeNk3iiXGa^ z<02)$yVnBE}>Ahx{q+G+wh>Mi@BA~ZiD6+x2 zt2_K#E7fBgthe1M<@AxT9_KpQ*1vT>^tm&oHEB1#3)>(LpW1qezFj3l8EnZH$?CmD zx|}3#?)V;Zs^7%3lGdX*AhY!tId1G5Zymtb`Qr6^IUSb*-a83tYl~ggG*xz)#<<>^ z#J9_-m|Ze<-D~}tY{Q8Lm*m!SS^A~5mSNat0mHlvZg?!bNU^(>RdQry8l)u`DPy-s zn>Q}LTWhgMy}h=im84Y{x7T|g;o2Q781h)h75;D}aE0U-o*OUjET`dZ-mDcco?U8< zEwXJZcE0y#w#n3cT76JWS+evlBcqKHv_tR0ik&QNVVf3TZ2Ue;dsq??j*@DN7_l;3f( z?6#yn{&HDp<#9yLa$J|J3_E-F8J(m!m0vtjP6ez?&X$@;%f791dEWc8ce5X}l*=}) zC>0VJthCx!O$L|92QV~0h3mAp$tA$uyZ-Xe4?t;giHi66dn<*k%+E;SS|HNf?h?iB zPxNkd>5KIJ%G^hLlX&*P{z=}=mY>tjNM}P1^?BO^OTFDM;qE$bPX>l~VakDO@`}9p z?t#7D-ii`WC!uVA=@OnUdy_V&#lakJzsSqO4&L_0TNrB(D)k=L_MV} z-hq*Mip}ScMLSJoemOO57jAyFoLaT(eTl?FLOaqHuuIIPf_jHF?MN&vr`UFhkwwD} zS5trUYij{%jBhtc?rgBqp!T|yTD)FNXV`wh@{*26@mndEDEX*U`z88%astYLO&YD*OK1yxT~5C3S1O+3T~3yv zt8h=B8t+wNCps3@em&dzx8KM}ZcplOBp0m=PC8yr&3C`~{Fr`5Z_7E~x%5EEY4ypX z_9Q;6Re?jKp;N|wq7R2Y`IF6@S}Q9vfcKYw_ebG!5SP@dG!UQWg?HeF~)#-7*VX*m^=e-32=7}=*E3#7IxfYdX`%J7U) zhu|E1Z@zs85^bj9>+?x#TS09*MCMTL8D2BHy9^8<4!wL4(IG+ZC6Un|aSq&We~U)? z84(Rw(dgh8lR6Ap;aKs-{0^xroMf9*$k}QdnL}x3w{{?PlXYizcNlNcw1SQx3!n_K z1MXOztER~-oPE#bb(p@QnQW6V6H__&5H8J?fLwTz)`g{ca%Z|kFHtMo=0~}*XZjy| zN;a5d&sWpyE8Hr`rQ=e?Q`-XT(h)ZCywGuF4wan`=(rjSazS1mt|fX@P%OI;CCHHO zC)alIRJvx%CX1GelnIx&a_~a}Je5`zG`nM_Ty|TOm-|Jjg8Jg>j-+i}D_lyxMJ|-d z$Y4)x8+Q312R|}!sN+XDZ4ED-kzFn^)R*v|E;*EZ=?0{BzfC4({KK1!OZPZD8{ruI z!v&vW2_T6%*tLy(Uk>{Gk5^aVdS{|KR8Uhnz=e^KBjtQKLnf3LIg5|%>Fax0&UpoZ zEl;VS_2Zm)CyG&!L$Q~Co2&@Co2=C8Y{PwTuIPLa((R}&QaGo0F+@pOY~jzg(j4-+ zvceblVy{%weJ;BNQrCr$zFpDn;FW#8r0st9$_d{mY&*xEKDpckem0@d_gPMl3cBn2 z6Wboa*7J03rSGqha#em%x#TJBn)?}EhK!*ON`TVja?nDc{>tEkd4eBlLn>sebSu7) z)PAJa*yTs~*>QLR=Sf}PFPT`j+qtK%hiSf1PPVuJ;{W`_yJ*hAd zSrXlgqB?QY7>Ut+hZhZ&rQw|hT&C=z2`uFnNlg?N&4kpyf);j4U76&2ZM80Li`m7c^U~;HIC*p?8g}{yn$Qlvdn2Ip>gW;D#6%#rGpR?i zv|;7QsW($PzlpAIPUyV#G8NyfrgtunmORyC7+GlI%WB$wnPP#RE5}w)CQ?(zmpeLt zaCscN?2R5T1&HG-;Ic1zg8Qu;RG64>>qh4zmankw*h-*`}~fUR^FpHp+>fdiQof7bz~JOa97f99Mu|?%+DTaym=b*>iZ8 zn=4;E2qmd!6x^992WY#LM9;*2*5$6{EcU#=QUdPb%Gu>%^lPjnQNkn3*^X%v5T zv`d-g99BMEImfrSnku8`vh+;uj0n=*E~K5u%AYSwAhnjI8g}`m3t7&`gX53;e>i+f zEc}hGP;v>n78gt{arGx{`t}lUe~XxfoTcFv38Y?RR~q4O*YNd((j+-qvOlR8SJ3EM zsk2L^-AyipFQc8twlYOoIv=T*a?Tc4Nc}ah(lVAvyKFd11Zlf}>s4KV<7D{H3>kcP6Arbmq}|M(!;s~h)m=wkp|o$db{!M*7LGC5GrQ{q-HbSh zCa&62@y*Guldq7^gPg9@V%{G9;I=O3%$Rp7=n+fegKC-+lPOO#v*LlO8)>(>KeXt! zC?-qkEbXClx22rARkt^;ysK~5x7$j&-YOXxGFCIfyWxh%+AH{0-$a(uzOANBY#ZL~ z%`24s?SyVyV|LwzQX1NBq~6V`vsUf){f-~a_bX_V6!+a$*gmMBUEMz5@N8D*es`$b zM_2Y#(CKdbSMBwEl&7nA80+##%BhusALV0PCQIT+2Z0kY*<9!|B!hG^W}o|Gr3tI< z(DOLMg&ez|y|N!qO1ob`yRwTYBUeVTj4~PYIFQ3#zK`f$(C~1=_etHaH~g3j-Q;9{ zIL6EM(ipklD^1k)EQazcgnvK3dnq2qAFAnY!($0QZ0`QxrJN6AKG_c2qlU)|fFG_L zH!M5Tz5EKkC0WXuTy_H$K3!OLuRDpKDUYAXHnmtFyOfnxcUR?-%M-Hz!(57ef;VV$ z(MZz(+-UJ7%k?upuOJ_ma-aAGG|W9+K_LM)8E1T-a+WVDsDA)HI58EH6UU8a&umCd zS(?fck7g`Mqm1L|oYIR`IVA0QmRjVJx_otjXD+3cZw>H@y(qbe7Z0+FGSrs}%8v&4 zSmoGNoDcBjoCN`$5K!^L1?hCs-GHu2S@DWoPlh_Tf_@C>nF~n6suJHHnUUvPY270< zBY!HSh}f&R=JbfPDk!M*?-9#cLVEPcD8$94M`COd$MwsVAZO6sCdFRcUNxZysjuV7 zLJtzJS5(dKp%_zh$>-S$*ls2~Q`+6qW3<(m>mZHG{Zi^heM@PHVNOl5*>fEuq34E-`>foQOBp|n z==oMIi9boUj|RE+l-6Lho{`=Mk$P*0B;xAVd7+NzYG}oMIU~rRwaUej>$b zpSV{`0jxW1^)#W{NsW8j7fLqBBZHONaw$#(eAGFdx{LY>P#vgN-13!rxCqrqsntNC ztSri?(zlCiKUPV0$&`^TLzJQ9Q;^F_?T;M(m7J`Yu~4npOZ8=mmP7emDy04i=T@By zJkx%~r?pV_*B!N#c!O6bJ*t%j?%3ykJ*39#eqGlHCv~+QNfTpxd2Y2_s0J5Wc-BmX z?RhR`zHlM&S6pG$)wxtm&((-ARMlWAs!B2sgrsIkZIH-7gMeus-y^d;%9NEXHOQ-X zM%5{hM8ir|5XbSbVb4fN_@ee2a>%1JgCT6oFc=9>lS5EC%gLIpHm&4{KO69LjWc7H z7I_kIFSg!>z?O12BrU!JzBNmGbk*Bhn-|tQ7U*MbQAy`m>0@|VXCt*`C0!5ftP8hX zWOyGfHI$oZc*d|QuxFl?B&n_KjikBz7+D5!StADqk1#nrJdZNq(rdMCCHVwJ>2k_G zTDyBjJ%UJWUrFIX@p%BA*5^^OaSip$bCBynH9Uy4jVft;&>#+<3dxaeL-T-za=j%% z!}6ReX<^l_x@o0})HRNqpvfF?iL3R6xd?gMdUY40P4wmlVgC>}}nI}uxX6=GW z?Oq7aRj6kcB)fzMug&w2I+G*TWA60_1aFe(usNtWLvUqVo)@m=m z21?m=!8_Sy3v#wz)L>`u2XX-ZL$8t!27k!XajBjz;B+uPLQ+YWf)84^OEkX;Tf0T( z_k%ylYk$VPD)_TJpGqLx|1YnC0xrRtz`|}z(E2?V?3u8Whoc9BhTThye=G9l1DBLm%+uK zrF&SVhHr*EuNpkS9iPqTXQ?ktfjiXK2dK>O6tdi0+&iPbqGfU%=Pgb^2Y9lIXIpTnI9G(ni z%luwk)+?VfZQs|lwTY~xBWx?<0D?p$%EdYzZ-E?5Z?9 z^J9(djYCO{^Ru@JWg|I;hUJqMKg=LWxY5SrVT1(uhDP(G@qZdJaAB;Z5cYI&sG<1$ zL@t}yr|$?z7+Qw9A1kFXI&@$@-YA?LIwYUU9Oj0m^hv_RbcKf73}DZZ`IOd34wsS9 zXlLlS{DIh8Lnm_ChLm9bFsHYu%kD(jGjT(oBt(6yK zoz2L^#x=B2mNwap;?!@hk+8*PbYbIJVVQVPo77O2>_XxgKS(?Jj2+SB?Xca7Qai4a z_Jr-R8IK25u6|sGSgRMMzE#s2+P`LkU(>dgng0^ycp`V!lpkd zS;9_oJ=1W>Y7R`QB)jl0@Blb-mdT5pJ;N_5EzuM_{Nb0^Os&MvWsr87M>BSrrU8m{ zE>fOr*n6P7(dX42%_fH9b$=zz2>%K$P?q$W>Ct>;_&x0N&6O4068^yEwMyD0H?b%D zk&;Y3yRiAO@G_e@_AZJivWs*4AXUmPRcq$*#D27y$M}hrkHUYk(H6S=gk)MHSK|n% zq#@4tbG3;uzN$$0$fR2YUexb!ts(QPlnW@sQg&&0b)k_Pl-fm=6p1WAf8hUj$d*QaIsx#-(s0A-2Ey(6Sx5`%cix+Vr6EF_aoZcF2^Gs z(f%rc<2HVUhx_FSzxb6S+-q0R%2EbHyNW%#U6l~PUH=%-Q*K_ZOcT#4J&b$7A`Nl1 zp9kX9YZ8Glc5#ty?u<;2*1%dk#Imvrqs*g6uef-8imZkbI3R(Q$({px^|#%~)$#d> z9k5}DGH~_nHRLLldCu)c>dlf1%CwYRd?Y}*t`|OfRY_Zr?9D~2)V`&7X1DyX*90zf zM5^BM(_WL}x8gzs2`G@Nx4H?uy{OfFmUz5&^_?@Vs#q#(RYO{N?(^ffd3e>(LffoF zfW)k640$Y#e|LvhyWT6*=@h?eFBBr{v;`p z`Xnbajr{y7sl99HjMDXs4D!8X@5YfY>(1F8P^OZJxECW^mc&|0^}#~#u93O6hwy|h z@+wz|{Y^4fwL=!|;Yu15dENHo^(=`WA7b#B$^pggW&uaIYzfw-eGPrh$uc7EUB!P4 zbHK4m%9K-YkNkG+Cx_bakNke^@k+L-@jsYKvP_ zgHKiDuds1|8vnyrKZ@w2{(UzJ{(UAp| z`ywv70RNewWKl=Q6_87(UeQRV?j$K=JN1pmFOE%PNqud7r?IeII|FHmTw!RzbzZC# z#C2W<8-5Q7p4yuuI=>w~MrlHex6qXeQkP=q{am4#mEx^R5?SIgDdDz9m&?)967G!X zawnS9UvcVL>m=aC?3pe#G*`|!PeSzkgc1*b%NV>Bk?7wz2LG+Z0ZS9U-r?U4%DXJB z#Qgkw#H>bxU3v%6nO{o(mXLxc_QNGM%n|L;07<}ECFSDyQWLI#i72!DW=LY&2= z+p-tQ9&$LT@z&;>tkias0y4Voj3E*4P1ev}PJIN@qe`}^A9KL|brNvzPev}L@_l0W z8v3{Z|0kw2aX04Jx*ra)q%JE2K11s62C+(tQ(VYA_O#tosU>~lG zMa++tJbYvE4%t0Ps=(9G*nIs;$oAT|SJ@WJ^qw&(8Fi z&YopG=Ejz=a!Ksh1^CG;j>CIDHT1yl=k+Y%Y8dOnJC=Ff@^o%31 zUKRPoStQ~GcaJ#hL?h3j=r~dvS5g1CMuo<&2aVK)Hz|}dG_^M^3aX*zkN^y;;Ma97 zkbHt!iQnr2wDqgl0nZ#Ewc_yYajhA9Y6W1vvUHG99DGcYq%33=B2|E%hfBzXINw5w zeM!lNPMq^rTo;BkGT_oxmbw)-tfC4jHOGloN=p=C&`0t$W%y{MLTZf-OUW#WHdW-p zQU;`6>us@0eMoIrr0Loxwvens;i9##qR2i8_6|}`tqjp&I@|OkGVDDZdf~}XA^vuuhSsx7|9Cvrn+}Q8EjIvf zu`(@wD`vz>Wr(e+@S<@W+m^(?i}2nrZ0gokvSPiLjNjegDWM=k5y9PYiJ+bymY zpi3(8qr$cvun!Z9ydX_1GC%(C`gW{5BF{ncyBmM3kg_AckH^)$ihe{rT*$ee;1DJC z;v+$js;fKnjcS}g)S-&p0gP4&BzBZLlaPb?MRkSE*El*k{s>v?bv|EhYZ6 zPnN!2-|aBRsk=*a(8>_ISINn&Vx^oe3^72SrUK6WN24I2YCX=0rSjY#$as|Si@mxi z_NQ74QahG=F-(*+rZUVE4T~h%sBaLLH7NqzWt*h`gBxwI+@Nd{6{)t;f^&9BBr!zq zsn+GRW*df9}1KlZ>Zv#2Ib4c(IHH+WxlXAQL^Y=#Xgf0aY){Wi%St%#mno- z5FmLYkT%*&!Ku7he<=*m()p87M(_7Y7zPLTiJI+-vMkJg+BZ7R0eJU#ubs+Z-3v3 z8wOSNJJomchQUg>8b1p-oh#hxJA)yOjQ;og;;)eo_phNjeUq!`m%dtu6f8(T5>q-Q zDO0iQN7_^+ixQUx+Y%*4%-Rka);qXy14HB6mLAyP{OSSNI6|(=*@T)jz?Oj zOwh$`*f0`H*N@brHo*24CdMx6(MqynNbjJD0So$NVL=A2)Wsoh>_EKUETS|(8kxv4 zu8MZ)Ts|lo_l3>|2km&y`B9MsIYPcY-EaSf300Ka?@-@~N?A61T%?mS1}PP4M`aHB zRxVW5??m4;EUT`p=rD=1oZ2v{6Mh*H_mT%U1}3xeJob>mty!rIac~D&>eBy8(bQVi zVYeC*TFVp1&`Xk%AXcX=ETZHgHFT{=GF&gB3`nGXwTi~~zg0xJL#FrtO14Q3+WsYd zXL=4@*`L(2aOKivQL^HXucr^KJ?V_0JNtj94;Nv3+;?^r9j_fX^i+S+&Z(kHtW@I% zAgeaamt?$gfvjBcy5y3+ zlR@dMwCJ~x(U3iP;Fl(qLg7ia*A|7Q_D#Yc;ZD~nWv7>JGg3z;=@jDP!|-(Ox8y$H z(rBr}uo`M{jnw$rO3#hUrVqUNF9;ZKu#T%)q#HA#Wj$YlhQiK{!|7cn^{ISvTBwg#6FmNMC8xB0-iCuTk>I0R#G9ql}RwWzX>g2C;3bE^det zCvKA3)zyQvQ0JoPQm>KED5a$goo$4^Y%*-4u8|fPbB!`bz0WSTFRmxoj+i@K3pmyzFkGd17`Mnr&ceoU3=#X4$x-eP(w}t{~3j)8&gB+c#Ou_ z41^+iOk*JHbtso{&b9-WGkgcG+_=4JOc1-^^DhI}B4BKvfg4^byAfTFMFsVH8^(?u zxTVpqqOr3Ou!{?AQ#`f1J;$vaxTD|utb7jv<7#MkzYlhf`*0ws_Y{pgHZZ%<-YPmb z@Bjzo4m{NF!;$0f3_RNJBmGn!A?HV5jF;wKJpLz0*~Sx$2f^KEg5{ty{q~QX&}`6o zeP@{y;3*!^hx-g7^+CPVh2x|l9;})WG$?=LA+{AXI?O2AczF6msZhqmk%RDVQx&Cg zKrSn_N0cmOkct}}WvO%{kijmouSjvpue>?vfzpfm6L$GlmcGL-{L218-zzrpcohPk z;NeKSFsP!@r%G!0qtK@#)9#?_&t6h~wlj?@=#;r>RfB%LCK^wwA%pAWGs$wW6pI`6 zDULI~F3Bd>B}uyPu6M!SFsU_5;-n6PE!ngCV5{q7HCdX2iwqyYPR?R4gS20alx$yA z(eS~IH=R8U$+`czDw;jm#qqqu6de86Ney^hr{pPb4sPXmaRa0_*GZhRe{j3&R5s<) z!2%~c$JKqN){rkt1uP{)BJuL{silLvUZ-r9Vf^Q7j0A+7f2cr5HDC=3KcuosqPwd`9;?XsJt(LS!RWxWwf5&T8G@5PM z(`#tZb;<=Wih-eW*<{ATA*opTSJ`%hQ;%TfrXi!Q-^44vA!B7vsD3;4aBA_@{X-_o zF0Wk2uj3+%_IB+DT#lN8&hX2*)2~w+TxQ4tGxe!6XMD@a{?-s@JRLHZ1AZBzbu4k1 zS$`r=L=@ArjrD+wj`^uze?Y_NeH!V?(pq<@C_~dQXUSKrg9hOLLEv!M4MCTN;!{9Dn$2 zb$n)a(+`I^KwVZe`zL*$gdZ}lp;Op3fYXjomAGU`(rB726Sq2>qR5!znM`8&?+f8G zD7BP1a%Yzr-IH?}A<4LLnOj3w^bRIs#9)~mGBmSQc`PSdw88P*+u+WR^r#2Yv_9%_VYeXesY~$ zv^7+Iy_#*6`aYAPRK~OGHEes%wg<^S%Pzk#Dw1(i49{OBB};fsnSxK)JmY(!48CiX z!ng8>osZO7gHa6KFpvUtl8za&OXmF6DdsmMrA3kT`oGcVimxUMLViC5mNH^QgH%Pm%hWt6_gA{xS=jEK@!l&$63>S2rg8URPE( zHWgpz@{IbY_CqhPr>5ewIP5Y|p5`EBwp>jaQ*}9qux&OZM-E6ya(YI~AvuLDMrv(i zR*qtq%+xVSP2PiY{0)4^%i+{lexDOw)YN1N$2qrT@W@4H&7RTq)K_mbTa4$buiYU0 z+BX_>`9^Ya;R^GUTw5-+9JZ)dPRC(VIBxzQd+#0BMAx>9CIm?6p?4CBf{FqbL`6ae zE7-Bp5p19$Vom5Bf+AuC#DW!kY*<4Ru!0=~B~-Bj>H}C{?R#Yc^1Sc2zjJ>3>~Eia z_R0Dq*WCSHSCUC)GFijZ$1ZUi2AT1rhLp&l2TkxnY(s2ICF0U*kwQX0O3yN~1VF42 zK!^{VDuWk_PZr^FU|0n~{(^+{K8R)fGGUuf_ApzNPcD{{{?s#ZP87_@Gx31WDQwHb zwroOKka*tb99CW<0&e;gXqc)c-SfFri`?MbH{y-$L5)yoTxQaHa2bcYhO=TXli(bD ztyvGE_?BduTP7>|BDO_9vaT;!(~?K{!U?b*Waj&DsI$i8e)PC@f@F%2T^Hld*b_d*7PvAv-*!(RFEcY5c}KU@ZW>= zSUu<$Gy#ARX{qf=HYp%8nvz{Vp0$5i8Rx4kd^kp&^kVbvQ6 zTZiq zEv&#^(4H~f-yKUXL!N~H{JMobXo3Ht1B-Cnk~);OuOBTvuvnM{cB=j>h%74)Ea^e) z!EmoS#K`PNKG>G#4<}590`_Bbi#XtAnWY#IQ-^}Ha9MAx zj9=<=QXs*i5mQFVn z5$O8BF052I2v-o*Au|A2I&$&B0|BQr*JK_%4YoBn^*P-2wSWtCYhiu?7Z0qnJoF^s z%7OLRc1?3b=ArjQ1rYJ*47gQ?8V~&l;MF08!xF3E2myP-FPzSYg`KH`a%0$G{nhsl zY`O}{hq%Jz)sF!V+pT_rrCF=tfpr7|SX*ERxcX%sEL;f^JM83<_1IPo(i`k47@gRL zwn`q2fz;uaM{(S?#TaSyWXOg+U#;$`+ZCJLw)$rsER@-g`VX+7!fMiM#K@5fgiitI994inLmNx%9Q{D4 z*RU}Lq{xaKXo4Np4xsQFDdhGe#e>n704mF3deHJfb?gZrU&~^9(Aq$4ENu=%?6`Jt zVGuUNitj;jLxp%C!TVh+0mF!c31P=_hivS`lgFSQN*rS161FuSyB=t!m8_O`4@;~( z>;mH%mOQbsFr zPGZkPLxrlbl6|Tj13J}%qSoXRwqvjJg*n~M?89Y)&tMl=;{{F$EjuHy@c;_ez?mU| z#6H_jxFCQ+c#EDD1egI_(mF3phEoW}t2I|&6H3;FOzg?K(1SYH+=5ru*&l0oxCzQy zp)X<=jyxx~ww&nf?!k*;=k(X!JNVbtbAk$R0&MN0*QgVuYOTv^=i#{O^=0^UTKnSQ z6}eotH)d0wd~f&f=6q=FS{L3@MbNXJR%spbF$#`V7=eV zcEdK6r!yAH8RGeJVU(yJI)WiJI%Sr06|t9Yoq z2f2aE-NhH-o6b-cHb}#V?>fzTRPaZsU5~2&NZ{FcaoakEc9q&+2~fSt`7a1(-@{#x ztQWxWWO?fl`#!dfChCnLz;yWo!8Czg9F7OAo!gdS&DKm4s~-z@ROP z$QidD@oEQKx(fT&<#kvJzyaCo1BtkxL$8Omv=%EbtzUnr9xH?Ek-{~o$8H#T?a}(s zdgO^E&;xAMek+J$1AK&f0N)0uvg=S|58(-Kt_=}5r_2U8zXV?kH^jhesR(Cj8Y*kJ zA%W-x@tUs|S!_tDN1Xx}SaR8E1LC#9D{Di>^0t8M{b;{-dnUladboy9&`b68EgO#F zaQ23rdc?Sq0EIe+QiGoLe({Y18&1`uv>Sqe>>H;yoYnsL^2YTIuvGIf&x^t);IQT9 zBgg{d83C^d5UB9O)%wq|Hz67O3(Otccp%-XM~wh?Aj?g1Fen+fqyV~{ZwbnJ-qH-N z)cz{0mrW>fvf*P41bnR^Y>mTQc;ARP00*2}FxcNm-WH^WH)-(m<$njj$ zx&~Q(_1q~TQdbT&!Ta5Vs)N4^sblvC@ZMls8V}PmaFX{q`1f+ujwLvygdbqHQarpm zqgX10(jYL16Cl`D4-o)d1b~$cLNW}2|011&a2XxSD**WhO0UojfQ~&~LSP|WLMiT2 zA}q8dM6E$04ohrFY||Q6ND$8(^b|<{`mh;U(9pzULFc(~4 zWpIJgWh3IL5KVyWws9d2UxIDHcUNxoSfO_6?)r_0rQVCS5&?p!VGpYy;O@};;FOYj z1ssSCHlabxK@)>Np$upcNPkkKK|s)9SnpksrJ8^t^EIOE%|F$(sg-xJWLAj-bb8UV zjav@uZmn$E2-idj>hbihRd$2Kcqecf$^{Z+5;2wM7?x~)*?`!f6b#?Zb%!l+cs;glhO(34?Yp^gaP9&pK1}*CTp8YA}mCSWT8J3<+_ zP*f=VHEkFnaQV|@Sgs!yj2W&Rsuuk8NT|umnF1RRpdb`3hQiX=fA9Kcs2Nt4g<2e$ zJ^9%aqU@_s%OOwpv;LvP|Jbm4gR-B!hk&`g=o|Fn_U?}-OBl{_??u!t5N7sV4g(&J zLK}M?Zpr!0ytwBh25kZdIP3Oie&zE?TVOTi-skZ#bZl@WiU!gEr5h)Iv`Hme-Jy8V0git)Rk?gF;yJN^jURU>khehrzWX!hr1B zQJ@q^$wY;eH>k6AI^pR+0Guj&gUsp#Iave@rH1nngPr}+EeXqf&9Pt*>*za}93r%$qfpuLWgs?(?|NP4HYx zt-nhIJRksDg=3v?Vs7;i$6nuy>IYq}y+LW9ybfGr8!>L`1`7ik>wgG5>&aUYJERxM zY=zTrE)A+%;k?_{2K}w~aCNu<9)lU!1mocw)Yt&Yc$?vaXiy2a(NKRg1Ef%wH$#P9 z;JD?W+|o;grV+O6H$hwLb+-zYjfAojpb-ZMhQiwzh(l&?`%#PTHtgAU1RxtL1%tJH z|J&0b!7VYaZ2j_P2ena9mO%gczla+&^Ll4{}wi2|N0gwG&x}<9!hVc zU7BF;b~I)yz~ErT_M+9;rJ!m3pr;NI4$4OG)WZ@R+Z381jve2NlEMv#TtJVERwWE; z9u&dYb7-)ebHhgw0i&T$!d5Lvmeh-G3d(|Hj$JB=CLUm5wLA%*bTp+GHDW2Pr7e6a zgtv4PF1-Z&5#SJ;wUtLip5!M7D`uDF8nHh3s#9g9IYs&O29FMM`v zbNk1{1|5b_p{*aygF*l>SO5!G?Hii=a>%(auFZc~YC$9~6T2)YQm^<&g_TG5_qIh4 z0dd=W-olzda18qvdA1+ew)!nfYd-V?q(mqxwKaRG=qnmg!%7~3H{4U`FQ zQ9;L8ELDR9r^_wZm!^tsh zJNi}tuuu@}d$uDU0Q{i$7P);8(CP_r^6lwfl(+r#(KFXRT-<*CE$Reif!;anc@ds~ zj{;8+Up9MY#GqqNR`9Z|W7m(FB${g>eKZe3IBv3Y33R+;R8l#jT(E zQ5A6ZY19tzgtz(*xO(apC=u@x>{xcxyoEJ^X6$$deSRkT1bF%ON*q8PuD6zmgKuPS zVHF@a%TKWT7T|Nl4#X}p{*nSYulJ(;JKEm@2u9kMe)JxDp55`02oR_*5y`IYfa7kV zCjw9S=Uy+W-0^kL6C}8z0OsCVM+7wP=z}?Q_M@NhUg_-K(T_cU4R(f8gH13fJIRf( zA+wXhC|S}4zyD#0u@fEygH_s#jCV>mf?zhJgr^@oQT+yy|j z5d{k*P>2Td#Pp;M60&+HtllhqHhJ9}cj^L>U}FH0U;B}Mqku4j#wwwU8z=_{8*ahy zM}k-R*W8_>hya1h*}>;%4CBEo@ErHYhT~Wd1v%LdjlaQ#XN*Tn0EEMm@SH3RU_IUs zwyBMeD*>is<*%JA2CO3@wabC=WXX5UT`r9%?fZybGaC`_yTz_K*k#%-H^%c`w&YL+q*(M8;pAep4hgT@unBO+7;Fa7xOgjLhQG_=;N*( zji|c!?_IkgZqSpm8+-r1HzHuReR8|uzmL60eRpgl0Q^eo*$ju(yOW^ZzDfVuAg=|x zq%m4Cz+n8qybMZ&j*wVwLKi{_k4tc}Ue-J>ApaQG+RsS}2VO!6st=dIwS`bcXJ-zc&7clO1ft?q7}iQLoSiJGQX#BYKCS0DZciV?av&(F{K0@U(nyXpU#t&J;2<`o4^87J zFva_j3un*)CPv0t;8tM5WJ?I!atv%xYIsTZp|x1zkvCyz1f?FIN)v+sHVv0G;L}{O zG;HiAvcNAYe9&e?gVI@IXEwfl`?!;T!?yIQx)W#6luq5g!FhtcvjPQp=aX$<%PN6<+Ec61yYd1g3_hkijHq zLc>)uGa`Vm*@yBXf^xKqB>##)Z0!z#i#Cl~5wVG{;|iDg;nJv{0N7LTQ5qGpu=VmW zAiXMpT{#R~h|Na|G;Cv<07NnM`;dAhTwE3o_i00HgM8Y!$Yd|W4w_9Q*UQL6Y5?tJ zj=*vIplgu!Ge`EJ)ery>9C_Hw7~9|!VjtYt4K^6kkeX*=CA}x|1O$L|iaELuor*le zA6+GVHSz+cfEQWlWojaWJA+XjiCAL=S=a>d02*;J;YgEd$5H_V+~mXB?83NSXu=G~ z@tEcqN`{^eK^#w@6l@9}Sh9jRHv)$A>QRDCZ2*gSY-5kl2Y5gvdnnAwo*-zDhY$*Ak4HmYsCiS5uQHTcsyVZZTi(P&HhCEny= zz2GnyjZ7;I`NXIe<`fTkK@-6M@8DGc@E#XBJCqttt&+bQ^@Tr8kcDNfp)i2H4)wxP zcp8P+)B8|;RPT^dPy#;tz*8{Z!5nP*;1W*wS9vWc2f%aCMu`@BlbetkT@b(m5N{Hw zC7Mt$T`!vEZJ$pc7Y&!M)q+jF$pQC5Z$b>k0i;BDD(gE5r|GG1A% zuO8!!B}R;^_xyYan1!VYF>^3Xi*eIm2z%j}`Aq-|VnF4ox-4di{^FrRt7G6_gGH*F zu&q&b0Ih;J052d*EfFjKF+7Ii_Qv?*3W5==Hh@-RDK7@GmtmJRLpH(#l$XG^yaPOg zn~;KfMa-suaRJBbp?a*9Lxo-u%6fo5N zYbcpaY!p#88iRT);(3Q_Ko*vd&?Q@AbgUpbT$HNsTdOfOHVu0^U?oFy0PTSn1Hj;5 z`NKOdHj~H+KLOz^S>6Hp0+)a)&9K;`O>pbRSSSQHBi<8x0(%~cJ=KKL;38kxF3`fs z)(ERtYh4|z4q7}e-~e81Av_)0_rbPK=;@|CfUdxcUHdH&&=Px{XyV3TFB=APg6Hkr z;68w2p^Y6PwBZV+Fe9BmGs3E&Q9hVVpt%e6boAn2I}NTo9&!?F+{d0~ad3lNocd8N z-2HX{)%+tImeDfN9abn5UXeJ9Cn#Sw!7^Gywp#BnVS@#_8{!%UyWZL%aM?=J8$eCD z;n=0+pA|s!XS6oKx?7Nww{2*)*+kcQ|7iYH+y|VcAnp^9>~rppJ{%_;ter#QLQUmR zI8R{vroYRBF@Snt4giAD5(i6i6VC;KEMo zFc?5)!a}U%K2#Y$zB$>|Q1}9SMO3KAzy_t2PwKGLQ=3z(Ksmh`bpo&kvv4(x@N1Ae z%yale{%37F7^D+(Ab?2g+zhvy6*Qk_G%^8n1%xzI)C?=(^Dkk}F}O?U0CFEjvP;7J z<_y^BBrF=HgcYH&%rLmw01*0(rr7f$^v zfsKKZ7;!Ae%0&3&C@01ogWDPopm=!On~Y9OGRW&glM_>kUeXMXzro3@QTWL@S%iUgs#YMK>O<_roMyxrEl6!PIyDhO@i^{tI&k#SK`GzoOg`bl z8~qpLJlltE4%!M}Mq>uh#b#tS=5gX>pYwqr!LLN|W7-qpDn$6UhCQpXl3jp1y90d+ zTwoj45yM?mli^c?~x)O*1U5N*%gQo+a-T?07wLPg3+8qZU6UU1BP+Ah4i}e5ruCnSw*-0G) zgK&eZd{BNAO01i>!slaf$0%WgWzfs5KJ*~zo6rS!2`6D;4{Zj!dqUaUjMB{7@f-?3 z`3oz*K^#xeE_VNwgba!`%!N6z=FgBxhHVzu#9LrP9ZN$)`;SzDlhImG_J5oOj6Ap( zlAuC0{JTZIrHp1Ftmi^xnFUbpYOy#O)_e~Kn+7BU&}uTm0!r4zKXI%laNLNMaFI%i3$9?8G9&LPeDI~r z9@dM%;eX!4oEBJbP1po01+ktBpGL-{0W=?Y0T7G@L}yD<7PlZaC_VnKT3Vg547&f^8ZJ&fR?&=PzuJW6gX2##J#Qp<$A(%0|4B5 zdLtoi8Vql6ojicH<*VOTOwJ$Xm~@ z9DKCm`Be*Su<>WGKXwR|A8FHuTDpki9uS07r@|_69@xhFjB{QaYzd`JYsW4H)4m8& zV;6SkuwH~U?g#=>i!o5s5UP@ zgY_De{n)b)$GroR2jEjp5CF1Ze8W;B5hqmrI}AYhpbLddZbfFc@?1D?`U9zRC0oe} zwwQUb)3)P4NvX4)%2jCnlf;3mD3o~OQ|#t*RgX*j_+y174-)JGxUeKXR%#QTI<2VD zPB4|>j{m;BgNt=`kzD=bG$N-E{g)9!RHKMi3^aPU8v6Hbw0rJtYX4|E7C+0M9v)&b`;>1$h2 zHJ0Etfq@50O_yR9h6|Q-gvnSgPt&&uDZsvh5$y7osL+BT8wU_$JNE1(Y~L_6{;>&N zu!GA$I_F<={xSc5V2jQCfn@f;y&iuc-JobsPl1qJ5To zQd?+IWn};1&4~B|PPO;2+F_3T%Ln#2g^Q(BS<`0Q?jttj9L{fqn@CAd9)?>;Y6t*veXw z+ibPHgGqR>(5}JWd#$iw?zkZ(HclX<$rw6k+w6s}Wka)d8Rls=M>rKXaGCT2Ey1>6 zP`)DS)%sbU7Pwdrh2!-9$zV+;CO!H6oZXNU7L6TF)_)TCzu3gH!hN6_8?rEYLg(K!6T z0Skl7E123Z$qqw1ISU>E_+@ONU)?s!ordJhJyZ+ z4c>g*#4I9ww*P`*6Pw#6klfo4W6}SfFVp{IULuo-0TBZt21E>q7!WZaVnD=zhyf7; zA_hbZh!_wtAYwqofQSJR10n`Q42T#IF(6_<#DIta5d$IyL=1=+5HTQPK*WHE0TBZt z21E>q7!WZaVnD=zhyf7;A_hbZh!_wtAYwqofQSJR10n`Q42T#IF(6_<#DIta5d$Iy zL=1=+5HTQPK*WHE0TBZt21E>q7!WZaVnD=zhyf7;A_hbZh!_wtAYwqofQSJR10n`Q z42T#IF(6_<#DIta5d$IyL=1=+5HTQPK*WHE0TBZt21E>q7!WZaVnD=zhyf7;A_hbZ zh!_wtAYwqofQSJR10n`Q42T#IF(6_<#DIta5d$IyL=1=+5HTQPK*WHE0TBZt21E>q z7!WZaVnD=zhyf7;A_hbZh!_wtAYwqofQSJR10n`Q42T#IF(6_<#DIu_|05XSE&TC+ z#614jPhvsae@RWZMT_?>Zd;VFC}7{Rw#D}rh3#9_wnS=i>^`41j~Rx1nvh)RKyQo7z^0p2q)@r{lkyG}M1((2}?N!vAYt1^?Z$B7=wl5d$Iy zL=5}~3~W2G>iUwe`w-jn{gQ!w9DlD-9`c#d{@y_zdYSS5KBqm#WhRUE*Z%==|0624 z?|ToMOs>D*sHJl=GyMI7mafXo@((z@bVKH0|JCo8?#|5d4;-~DHS@TCP|&iYnfd-} zPA|KVdCq_B`(<}B3;oxPTK+imvj6&^{K{5PCl{w4F4fAIU|1DVDCA){8v?=Sb? z7_>rff0h5H(<{d9f9SvY{R*4?HU6QaR?gl3+Pp=w)nQgzf>gxV4Z9AkqEB1eF+d0GY<^G>HquJLmDfdWx&xQ zt4YykaRSAtkWrOC5@rx zOyRsBf0ZxZM&eWA8GJ-Cp}E?VG{pMoT?w3J;(>-F23bq0YX)hl*nkrKAc-#?YMjF& z8%i_h7atIlS7n|i&5_6&&0j>mCCyySxh(cwHKdS~BoS^}97vukLtk!NFZM-^Uc|X8 z!5_!pO1>u(=t&w7lhi0ICaFobnv>$muCiPoTXo7~4Q?gLS&}opcpte=)_pa{hN7g! zc|zJJ*)_5FG+b2HUNa*V;9WBr0{MRZbN-RK9O> z@iEFcUFHYUQtI!iId$ZEdDpGQw<*$k=G~-pYK^s52YH@C*LG4p<*S}~AE$!qWn=rD zd{KeF%l0ef9K(Eo)JOf!Dkh1k()&2J(&7QkVoJmanx7qCRxFHe5=|N*?yS$0iSVLX zIqpcFriCBeqK^B%}D0_=*uVW5@wg>t^x2#59y$4{#ofXO1kM6meCmZw_gbSgtbn z2&q&2pfP`XM6VRdof#=+ppunKQj|Dj;^iDM4W0+)Ua>PORVPT}CH@-4olD*+ExV9& zOw2$vIW0`Boo-)bHi{FU-QgbgNRY*9FBW)&U%P?1ZeGv0ikH1Oc zOX!)Awnx;;&^*0&43y@-YK<(s_rQ=aP7v=>`ZJEpkTkdx()huWT^%+lq5uw72=n#!#uKaxKe#<@m$ zq}%m{w4K^Mjo%m{t`HdRb(dnT7xf7neE^?v* zXD9z1WgbK07wHXEo>lmR{7ONVP5MRo#K=J$L{+lok|R~`~~6{3~E)$f6@MOavvwQLs2%_)<@jX zFh{ebhIZ7sW>Vxe#jcc`5b<=w4xNY(v<)s^)?yzO52x{Wi<6B4nGq6Fj;^*2Voarp z={bqwenwe_WPK^q86h*pRw$|LwLK`#HwrY4u#u9VX*(~Ht5lT1KPB!yqINWSxzx{@ ze2>USN`;yHtKtFVZF)8AL)X_O18^k!u9*6mD;;zPB zQ%l}RG2J*j#Xc+B=8z;Lrkmv3M`%k+&MQucT&7~0SFA1Zw@ILDiK}$zeEL4IODcUQ za>h#(jH;Ovu}S*s0`5_!w(%>be5{E(r6`(-mFsB4?== z-{9B64zYNvUAfHcRs3&}r`2Ie(O-mqmP1gqQ3{Ut6uHmm0Md{K=A47V)VO zVX_sz#d=XcHGWqz?Ie}Q^SKcTva9^Kh7wC;ulD^};_C_3$CHZqrC^I#8-nU&O zd38K3)9#Y&U;eh^DB+r)9^`mQDom)&inu516_7K5lBenT$ZM^n|AhEM<)?PllqAXT4kewSnCq6mw{@rPoyvScz965q zrR#juHeK0I93QIbH2Q11XYxg1U00(@bZx)nY^I)@R{MthP5#E#oI6p!bm?8pNUEN- zM-y3IAu*hJH_Ae>hWjomff zluX8_-?s0mOIcRG$?Xbr*7krLaq)4?<77J}TApo=guOZa zc|?dpG?!^2;XRHPZI>l07DQhY<)st-k(onnvY|=ZXVJyt>8qmohSA3Q;ZjX=XuIvh zRmAe?J~2$w=pcQrOztY0m_wF^*gbjx>{+7o_2cFAH_&!F1nNY#)91!l|wh#S9fK6LMxoFE^kodmp4VJ7yV2+A5Arw4EQF zWzeVMeVVqy$;wpBU(r5^zbyKbLB6^^k0$M0Yc7_gxGCAoFM70LmS*l_TC{W4M6rCu zRVl@5qx}rMw3`}eJ@7SH-E8D; ztZxlpd^+4Bqm*niNO{qW5muwTXGsOl%wHgut7Nc`e>!^6h>p=s9#Su7YAlJor8KaQ zbTK-0M82v1YAM%QRm&pll-e^%MbQ-_!pC`Ukt&*HvMTbsQpNt7VsW{Vhs`5mrR-*h z_>`(C*JQa@irbHL9AC0m>ip~)|56L(a|g^Hi*Fk#K9PJ(iZRD4sC2G!#zF22@k=8g zP9hgdrOzR)w_mFqeyFfP{L4rctB6u5{kb6#f+e0>Ly~h2rE~X^IB0s@ILYWj$rib~wSArrQrdfJ>6Ni_EX6O8kI2cd?+S|Y(5Bai)W?3eTv()EB{zRV z_-0Cuw!s_z``AU3`8Vtup$+o4z&wDw#F;`z^coa!Z1lJIY$Lts1#MCF>{4 z^2k5s-UPd|%lfrxd^(v*x4K+xN0oO8$%%B(&}rZoQmKws3rp=(@CaHF=?ZZrY@QC={|X>{EJP@{SLQuezz5xQ;cBY$w9waf zFXXR>xnC{2s{8zNVK6mjnqPxmoBXt`UN;DGR!*-EXP7Wy{gZ~5C>L++II>Na$C zv8gocXuh4KfT12SnXINz63(qCv(oG6cIQ$Pt&>|LMk+XL%en8c zRIlT!dlvP9_2G8%WQEFY#g84f>veq#$)UZ+qAVB}euO-Z+hJq!T|ZA@^e+DUvIUGAKlv}I#WvPGc9#_{?V^7v z3uRROVm4BdjcuQPxq|s_+E>axM(J&~JiPOzERbtVaOat;pDcXG7TCrmq^yeHas<;hPQcO{i#wzTGM|-xYHeDneOl{m1bn;CuKi}zCY4jwfr12ULtpF z{1&_KGWI_75m7msjy25Vk`|V<8}Qn--%LLn)ure7i#b5;wxucBKc|<*(>n)8PjP&tpDG`*CH{&- zhps_4{a_r^M*MI6`wAB9c#@+n^O(4zWxSWYqq+f~ZV^wL=@@MwrlwdPpYQBA)!?^c zH#a`jvDm2DSkWzkKeK$9!A~WN1GJ}(C#ToP@m_#=ZzHS(4C3r>Y&eL@tuNwk%YpAC}LEpF4kIXyIs z%6MmI?)cJ7#rw&90pimPziM8rp(Q&Xo>+QHaZ!r<+GtNhJ?)aZ z_~*`jmXS9U+fu56qazF_>U1~L^jwUll-^eiN~MKHpD>)S+x?Li0 z4R7e#^~RUD_}SS1t#~^vXSZXYVFTkLqDi_&+lo<@W^-v#(b`7R`Xy3QOI=MInzfaB zxEk^0&PMJA8 zqiCkj5~Z3w=KITU8IeXlF_%i2aeQ{3W9w$>_-=+DDPy6Ov|LUg(pr35v5@y-I1y3$k3xq8TIAEFu!5mduv*_0d-D%;Hx@ zJC0m9UNJ-J)a+#cNHgV(1GGotn@3hnxR@;^J?D5}sk5@f!P=+ghewhoMVwBUKc{ca zv8Bpw2f44xc_TF}(=STxozu6@V1shXA=;bhk0Vnjd*4pznbQ&6%u!|@4s42+H%_&( zyPIG>w`ikJnlksWZCkmS@wqA8j}xNix`+ClP_{Z^`@wOEal=${t<=4_Sz(dalph`G z`y#%>cwpMRrUX?t@olB|lzonde~ZpG9yi_YL&8colO2)u%AH3^edXoG?luwM5>C3U z+tvJ8IX1iMcl1Z&NS1ehLbn^AEheU-pTi-?&`plok|h(Z++`ypl~hjT<~;8{0fVr7+iA{_Yl&=MEbg(v*3#qF zInN{U;rw%%k=Ilnoah)Qv18QNS>9fW(hG93d@5CDouo~OIW$UqPWKw=kOeh|4EQRl zr(CB<)Qmbg*Dfsa)&kR`k>6AbPxVcY`8KN5&5kWCzHniVn1rfLe!P8*=I9UZ7vrVp zEIfQHQcbliztA~m+Gy$d`ss<>g&oJ6O;i`2cAe$qIoe=>_d)5#h3=;ermK?96uL_! zkKVq}`=s>rMLK697pOiuqp?Kd)@bR)PcBLySoHf`X^`sjv$o6czJcRii|f)gi#}Zt z+osxdw%AjGGG?ZScbT;D;*5*-sjBhky8N8RjEP@*@lj&(uaYK+11 z+}DZqi|N-&Z>#<~pA&L7aZKb2{Wj?dOTJ$}_Eh!ch5RiN7svdyGWSd3&Lvj2np;#& z3;MR*eKDqC6}eBkYDw~)<{s6mf~wtje~lq|S&(HEJ^01VQfgj>@lkNhG1}WsI%%1Q zMp>k`T6bYboRfp8wa-PRq@y0TckNBpLN0bB#rT+7`Zj6FGT5-%Ed2!(MUJWzw;`%43TIyPaj6miavu+oyKzGV|o!iDMrJdAlXW zF5CIs{-m1om8vr_OUHg+v(Y2z(X!%~V%ODPU9l~Y;EdH;m+LK~xtv*d?7o`+)!IuE zd1EctKUpK=x!kngph4~LtIVRicgMPKc(PgM^zy@R;QT<$wZdBxAI5G9j@T*FwfuRb z0a;zED7-|1KJH{ldaR7?3iswx74@4%Ar&!JWDJ$E`j&UQ=p85y6Ivp;MB-VpO{oYz*nTQZ+l7IhwDt1I22HA%>tC5O+un>1-v zNB6OG^~1M3+9b@(GPmVElG(OO{JTM(y2s7bmuv z#?JJnBy~@nACdRfSKlf8=9Ft@xy$0CjJK!tFR=#o&N~`?66I!dcYA-6Iq8|)Z{Mk& z!sGvT`e3%5ZP%al-Lnt*kTn>^A!KI-^DNF23E8P$6UCyGH7*xxNJ>sLe;6@OK{nRQ zPrPh|#`F>|X-N(c`7UNUB zH_2xEPSlP1s1a6aVjbIRVUyOhUAEbGAtUOyMt5Zwt3rIdBey$Jmf<&1KT1Y(Z57|a z*>L>Cbc-ZeKfi^BdAgdvtBPD>XN(Wulb#`a&M#wx!#GX$y^z_?LE{7Wb|04g;&;y2 zfu*T%Ut?Zu@_24W_X$}m|L>z5=4s~M=Ps%!9DinC$%W)y{!G(6AI;GZx|T}5fRFyB ztFp!Z?&I=8HE%u$UlrRszI}g0ak5MR*W55x)AnJwPptZc_AJFJS=WI0@xGawr4Pdc zBqvXJdqBTNHYMQJ#JqgXg^%3VR;-+$c8L5s`Bi|%1LD3N?uw^xVnjD0^L zEL*W(wsZA4mIKnH*5q(vr6=ypxhO7Y8kk{csGt>JlOG*Bdg9L9d2%VCfwc~K`f!|; zl~6Hn;?-kKYALq^na(ZawT?fDPm$a>@j~7cJvma)Le~~ot%Xlr_f}+2G&!L-T5d_u z_nCRiv_3y2WjU8koO$x%gp~ZC@HxI4v=X1uk2rssn0(4&x?ES#WjBXtt;x?ljyY>g zYRyk~O>tXOGv7B$>(%p+Q_gmiCZ5q>kdm{;ZxQ9Z*6tS`=VAjU`JDA$A=kO4c1d1| zmflN`i;}664xTIVmz%QIWLe8ot-_ZbS0pb_dVYRmuw2yI@D*k4T6163-iUoY>Fb4v z@Ra*&GgdkDXqCJQxl_?I>1Dwawj6EUPA^|cZQI(w(pWXi$Axxra!%`3_&BI)->!A9 zh_$l(e$ir&+>v$G{uEQ~^>rN&Vtp;`FX#ORVpIKhM+I>~-&U&K_Et|E^)zjX_ezUxK zt^1DLz}8*RP7Vlj(4%no=KZ#rFNB{k2hp6enl3r&v)kby^5L(ojj~C_i7qWr9^v ziG@OHbjZ%=mXSJ+O&!v4E3G8U$eO9oLb_rNr|2{`~U*T#-;VTW43Z zyGrE=E7!YnfjE%YWW@ zI4x?o4yCn*=^{OaQ?=1ae*C8L^s+Ratk%F0E*4X+-iw%~q|H`Yd1X50?ac8m`=-2nNDfS$vH9@9s8>1< z+G{MSx2C8(*58zRWV6W;!%sS4@4~IA@2B`wlXs@R+Z>YZ+pk0E$hW0RPYth0k4_yM zT9oUnpqtV`a;h|)n)u{NN~+*U*id)W`{EgK3#Q(9O5UGZ66$f%VUlj~`=YrnJEqc} z=jO_5Y|%MgHcL13gV(~!{HY-?O3uk|+R}Qq%u84EWB5{+r&DjeBwtItv&H;^;bz^! zkM64~d#8SRRZ^U)6xLB#mZ0nRiSJ7tF>QVw`C)26Sl}hYqq?-u#evkB)7HG!f1Y|a zjC;kfKsWYt);gCp({|R|y^;Srtm_)3RCnZ;oQ*E&)AAcE+Tjq|=!U~H-BVw3wzw2d zJO0M*i~O#wMz_kEbqzbKwo#u=D}8IxD_;&r)xLl0mUI^Frv94tweblljULV~Hk8s^ z)s-I=XJ9?PDMC8UE8Mm$N=NTkmwUX6tF>SAMHPkf;m_~pS?C?^E>3aTWPPKhL@#Y1 ze0CMZQE%*5(w@o;>+)7R<22iCw)dkJ>RtY7l397xn%|~qu8_Q~@S#JX-n?(5Lvan( z1MMYNX^*!RJ*I@~J^9vkwDPC5bcdZ?8hv|lO|^fow3h82ukvo|iTA`8#>Guv_9@pl z&16SbUCU#=y*m+m^3-`MpKA zsom4BcIva!C_CNxhT@FzeSIZVRh!bT^td#aojJ{UYK+o8euc|a8}YB*+_b$rYg+S6 z7z=)wJfN<$(fVe0Fs*iHS9{qMM)QxHYL`eG>+dDU()4ysd{3Fp2>xmHoO;q`=HD03 zrupyk`q;99@#CjgZDpm+iXMy0X%}`CefAAzB>(DasQh5V=~cX~@NL(pPQysXh~G6$ zE=sI(eHIl8*1O%m8fGxA{0?k)v0^p+u&YT+-CgzF_cX(!-{d3Jlcn^_yDsg;?%zF8 zHyB^~YdfittkJ*iniaI!Mn5PI7(oO4Z!X7Kw*B)yrunm@e>pTVsHm{dbelvQ#VnrR`J6$jS7I2tRqhEzBay6g}5ITR!zGi%yLUr5nXE zZN;w}RB77%rYX&!yGPb4wH{!0h~G1&+1uGjH_zuDi8N95JICBEF~hWKwcQGtzm{`5 zBE!}F?l4J`LFVysc57sP{J3UOMVfxq%y`Mu6J5{R#mbegr*DfA*AZ`K>QhUm(4N`- zC0`oGy%hy#m%cL3QcI>+b=%!i7|-U4N5?b8srqwhnhvgd_Dn^kMEdgRiH6ZS`oCxq zu2rt~UP@2*(oaP19N{-kpCc7C+cnUBgRPj$*3Y6mMLz;gn81Pk3eCSB(1T)kPKZ9D|4VjbV3o6jyVm??+!L{0la8O$-y|2b z&NaxvPur(~`#$#EWO1IpwEXoDT7rX*PIC*_B<}DOziRz7`B7Wq&p9OOKK)GJ64y7) zuSuVw;JwZDu|u+6>EGOIakB7g*FT~#Z&y{P!#T#D0WK+iwyn6hfhAotlBVK#hdG~` z?i9byUR=$fiGDrK)xmM1!BZv0+;}gi<6{lBE6zx!1vt($G|*0OjQ4OUpKkC=(T*D* z=jdb9Y?wYOA!CN)T!UDprVQ6Jj=M+f8JoT}fj-;F$G|{2;Q+11@!ZH}OU06eg>xN4 z4X!DBAEos0s8+E!<;rqW8NF$q z;@-qh3tLYctWZrqTjl9AdW`+D^x8y?C4M&zKB|@!#78^Xm`3`hn-1soX+etdBqQ4rPR`0%D_1)>QnLRsQBAM$Y zPBUDhkzQ71;B0SkEJ-mad8co*uA!LblPcP5I0H0)U;5Q#@c_pOh6S2UkK#j}A5Qph zOuYp_Q{Njm&S1n)Vgb@H7&W@PYYawgw19LeN-7{KAT>Hhce4RXDj+H#Al(>PqyiSH zqNwl1@9+Qq->b)acJJA_pY!z2dCqmMBKvH5q2G{+kQvv&{AiK!mg0V6Ha>kcz{^o+ zjf?m^dC*u|dA=Q5ogNlwcv_x zppf`{p#h$r_Y7(#Cu;I@(EJQ=xM7o!FK^XHjGGCM#{A3d7a5Y*zz>8z^NR0|CYfB) zY~O%NW|AVovqEKjkw?jQO=`75zGUCbG>=AY3hDE|{F%ILvajv&BYQe?_NLblp;`Xp zKgqvMxOA&QIqi?DH{SN3SrdsLeAuPXSv<3CdW7LSa!5AtJXagK4`d z%pvD6XQK$UiFzpt(Kkh71@W-b9Lc7L)_quC8aNho{Hd= z9Xm`bak7DH0dS8J!&j&`A|REq?y*T+{^huEcz21w+uD7RYL&=`kUiYJEBi5USn1FT z3Li+Y@0*j3>SR>r5taGQKMr~4zq1Jt=^R5U`jX8(Wu$Y1InEZH&^^dfDKazFL2G{UQu~)`=D%gkCd>Pdt zq>>s%-p!9 zD0@ExakEwyB`hQ^ZTix59FOnI+0RGJ)=rAhs);X|%2|%z#Pg8`t4N5t6|p*uI39b9 zXDq?*llB`C7Il4SZwK+`Sfu^YqU_e0X#A6P*jIFDV$OBdwylHSw_$QWH0 z-!p@{jnfjG3+0CpV)bEiM(N_$%#mK>!UU@#`~4Ss5ylj6}9#ITeGf@_)J zCsIH|vj**oIGZIjGG&U8Q|@s@YHR4%s{1OQV%Za&@{tf%5%L?c->{|Q4MKBRxyNFe zZPI`gA~xB^PCX+QbdHr;0#@1PZ55uCExobda99jYum+{3xY*Fu#Bt^=HBy<>siD`b z+cL*vYy@iOk!)<_*O&wh+8V!?GhS@7TRShth9j3^6YS7qct}CY1DkJkf^vD8ZCY&jf--XvsKjDu`78$As2gel3^2^r{Eo3>g;3EO0{JdQ1h z(n+YRM8j;48&hz$iIfoAy!(`0Tj4fzg{^x_N|0@NlfEn4Z;Gsg@DN(X4%v<+*)BHk z`?47~k(`X4p)-(&2t{n9cY#FpMP;moycIGv-1O*BQN?biJ{yJsDPWyhy1GcpmuPeegCH|auTw!Fe zck0$30-Q-iuy=+;j5B#7Ma&!ak*Ua4E0z&WmvGR*5W^ z?N2EI_Lm>%zs}pbQ+loLu>_-Q&n_d;-lq>p^^&;T8JRFEk?pE?gl)0Ue;D^UFXZm% z_04w@Y!{Hn*h%}WM{7rUU3bskq&<*mxiI&8{LsGt@%$gQ-*D_&ScQrq2;@r<3r+rbbH_VL!%!~|8zIrly0 ziD(C^p?Lvzrnb`L1Y=24VCvhf#DRLaTAbaX?J&j2QF6s&;GEfj18QVnjy=DPHJ$dN zq_<}__ryB~>8JYY>~Gq5GB>YF?t4N6CTJas<~ zZ1-kY>NqJHo|mlg*;7jGa$KIOzLI~t!>UwxLsHsTPu*R6lHnPZ%$!2zJxKZF&dNGr zS*b#Qaa`&pr?`dcviyTia3ih06mLMAb!x8D zyKA%=2nw7plFv`9I;lRFf55)hWq#KvTI$=yU^g@R^A0a^p5%+(D{QOFkV?9A>~%)s zeALV8N%kxEIy;Oiq|OFz`=y$nPh6&6%5S^Z-<8lRMGCYIOucfx{+0e)_Mi98c5ebvtI@AQAN zzqzmZIN?NU?}~WL1f8?nN*wr{RCnLNCW~}V&~f}33FoNQ!L#Rrx>ufT3P|$=7ZJ_y z&Rc6a90jx8vm=|T(yxQFGbdu4Q5zwG1$;dYW8UV{Q6XxiGY!smn}U)BzCA$`!miSP zLL3XtMxBG+uPL5u>zSM~3X(1el`Av*;#~OwuYK;ghi5h+PFg4|w(1PjrE@FC_?&hx zYJNCZx;@Oa-b}@1aeK|OAf>l)akF09FnoYA;pp;nN6@igq4&qLgkI^La8Rq+Z5PE) zIUWW451e0aPDw{!&F(a7baDHPzf^GPLEo#*6>08kdOc>dF0EhMubvxtp!v4$Q2N2O z*hgoMU3R~&#S}pMR#xg5WbhG?C#l@7-*(rM3-EorYjvD5%Mof%&2(JF_CstZ_R$Vu6&<=e2(^!*RFS>3^p3H zeunP?^KtvwIfq9A2b;w*U!qO7QcW%d{M278Xna(AlyFxj?*{a<+2sr6zvA8&{Cp&N zx?Z7j6S<$7e_`z;Wa}LEar{r==Q0yFA>Yj&Uf}qnzh6-H81tLs4Dv^Hk&0a&dm^hKrqk}7PbPc>_st=Z}yPeHDx$ibaf1q7RJs8G1k|=8sKPPyW$NeXRf@z`c z;0kP{NcK%USv1YSU71mVP*^t@&o**LHa%fZ(mc?;_>7Qi;jcjfj*%y_iir^U$vpSb zvvA)+gC`MOKF?%_633L&dfb07Cwq(yI>1mk1afh+Mqd1;F`NT(eEc-So zTW1pFA<3!`SI9r)j7&T$7o03^XfEn;33`ym5i&F+G{P^(PUJM5wD8D+5%M_h4V@K9 zRFG>Ynp&h?^LPe_S8|*kCW#pv%Ne9(<0lI|b`cAWh1SD|Xk$mY^^}+P=0hG9>@=Mm z&BOgtBEfQ%sbrV42OjO`4jyrUM{Hz`(80iIKH8^W&msRh%P}cU*Nac^3ACta6lF9bAs?1)nwIA6Wh~Ue zU9>e?XyT(SPnAQ?GEenNLp>2LQX3P)(%HzjD)%Smd_HI8 z6o^H(lRrG_IThX(5}&5&`iRMU<`k7pntRhpDTEi9PM-Dk!7Ch;6zxnV`@YvwI4Lrn zO-t~>Dt6QqiBBc_`&cL>7n2v$8hu=qo-`GCO*vc?aZxxaHhnSq)W<g&lJpCA>QhecneCa)yMC_qd1R??V!OI16Di`1qiL+El9>Pq)E&6RwI)Napk zCQp;X66+Q8%3kiAb@KhA9{RHA`Sk8pksgI-Wt?BrZu$yp-d^KG&S*x`O)12d2Omz> z`(Dx_eB!(^vvU3Yih@AJ-0|e1Z@;$Z_oAmWr8g75DGXGQ|D^r!{iy>76|>BC#w5}! z;wz7-nRxx^^k^W(ma{`~Bj*$sEA{AcT7F=CIFu`Ewl6+WRMD==`plGzpMZe@SMi%! zv7~wp#ht2S7N!J02SYfDOLDH2Xl$jJS8d8Rb;plnlq7#$LCHzM5;lfHqJ(UuFW1HR-ETGkDJ&{X) z(XZN=U1^{(*chi4@Y9-*&6U0Qsa6E7zLN$#!GR+6vvGcrF+_NNkhb~mStzc2hUxNY zRtjp_zL@TDQU3gs<>EKb1n$3opmfk89yFD7(ZN|^gG=gpU(d*lQo$W$IPUI6ii^RQ z;)v%weIsj1LU&^$ndUF{yB>Vwdh}fPk@1mI&)vwIOy4hVT~MInhP){3Po!5iYlYrU z=e@+`?#Wo<_(Jo^2)FXb*14o9y-SK7p|Fzj7goc@Qp&MyJ!!y%XN0E^Z^_{chEX~L zWvO<~946AGQLheBZo`++<34uEqwUA}Ob;)y`xwZV6u#t`@(ECO>+mm0e|t&9w?@6> z)l1bGpX=~`Y{s&7@!>9TIY1qGH~>~P^eTwZ)`+^@`ekJ!eP8#sAM!IxY2mDlpfqH@PQ z&^=s7;B=tD74D>0mtNCtD(l|&@5Q|g+_(&n;GTGu_V)cZ<>~vN$LS}5bU`$+CCsm9 zSKc$IICZN%VdA}v2!28=aePg+UeBqr-0k?3N&7Nmh){M(=IhoCAY0a|XL~%|>GGEl zgTj*O*NyK-R8$svKr>S}E^~yfSCz26S=kyfRk_gXzJRN`tQxM+#O?hi=3~993iE@P zFVZJ3-@N*yll#t_*3ZU4D)|r8-Z1T6ZoSs=i2Lsw#ohPuDms1SwRDavZzBk!+}O9x z`-ufAV|@efaT-@nB0FZev);Zq^dSRTQsj^6ZdXLE3oUcMe#`Scu~%jN;oMhT+!gKU z^|cbgcUH$flPcFASs&sWuejY1`ow+lUF)yoRYE_M#)2n^F4h22N?19hrsq;!@9&{!)(aAeBfv^aS1_~< zQmWAd!DlUegB)%P0hz8VG4u`Es^CE)D|2#?Yy7%UsrYIoq`^`(ZEy_1ObLoh=#b(G zTYY_o-d&aNi6bZTY*2BckaFq$)m^5f5Y?t9P(F*ppuVI9Z62yMXV#>6RgIw{!3?fo zDk8y@2fsE16D?AGHY6^}tP?DfavNV-yvD)iOHsWz43W(61QtYToJ-%Y`JJPGq{=Wt zmYq%w&Pen0E|pvF=WLi!O&RG?WF`kkqzeU>UR(dc-LR_4^^~ZVF%#UHLAc8EcwLf@ z{y??vX|@*gLGVy!?kyhhhO%nr@s zN!iFkC5ft8kI9)$yM_ql8Wfkl*x(TLRae^{+q1Mt2r(qxt|=AUj1c#=P>UJ&x5=mv zvB*1U;_=_Cl=$GP2A&`~WIPSA%ZGRJG;g*_`39+FO~|=Se+?-uFnCn@bCW^VhJmn?ij%}W$s@w|VZ ztn%TZ8pHH)P)2HKa%t`+kHUvZwWK+<>gmYv>DJKpGWb`XTOSNHKWwNe&R9oHKM#Ff z9{Pi4{6n+0$q%(xGkUkC|AtCe8c>&UZ2i!E%BX&2cJ=l&D$JoO_YAN1R=mMeUiDwI zvB??Ou*=mnY`mRYi$)D{>Q!?+>CC}l%{3i-yj0r`7+)iG)p^I9>7uax+I2Br!uBMV z-a-A@d}IOh<1kqLx*Tuuwl40&CH1fcNNL7Km}|omjk1kxH_H#v>QsvZl@^TQ@r?>b zyvjSDtm(7W^A@3X7Lwu7Z(;6A(hwX zQ;g?RJ`JXqtD_m_S4r);dAvQJPP~)kG>TqEPBCA(N&%Lc%f5fw^%d3A;9qv1v>w z-f2)@rutbRpaHK@y*##*(Q$RC>);OW&CiCHo_cC1yaFv-ELr7^1{C^MkI}Cc)XoEn6A1e z_7J|qYyTB-J?WLk;akoh86($RAJrU|HGR#xA^Jt*<~zp|=J(gIkA;4fZGO$V1teJh zdDlag35oFO_XL-V@5aP7Flk1usDW8TBfJI<&hYu{dfk4?t4Y1u!@yz|aTVBc!FPAJ zIl)9mGk?{c$?|eU+7kud@}u3e$)X0DGHXbfB`KnBh#<% zq{}1r1kxHjGzHfqIay{Raz^0Fd=K_iGkile+t&AZXZ9mnpAxkBj`vP7lVUXmH?onI zu*mLFArn4>{YyC}`I=8R+C(fhA{oYOtoaJ|KaoT!ny#B<2}{pN?8N%{@=yDP1-_3o z8QveuvZP1GP2TqAQ#s%$ZdlOld=F91?23FgWe~)dc0ejMd9P{m;aGjag78So8S@q|VHrNY+_GEFbi+uktCqmf04k0SkYW;M_W~{QRM2%?BPWs_g*`i+NPk zyk}nd{lnclUpcM9ZE;-YrKp<=p=IUY4|f|x^|aV`BCT06qZ$`;>-jW}&Qg*HTK9H1 z?N~aadY9mL`Qndanm_nx8Gc-KVtEtA{#>ZH{LK;OZqf}c@TZq=$#cIh6MJ&vN_5)vqqpTGI&{B^UI6&y=~J-&PP zReb(k`L*Ge4)jECm4)S2@sFC}3WYzjd!ku7g(s1lEHbw$k8e*`MEzkn6s^_~`%T`? zB-|SM34dNO_$TO_=slg0-`ihUqHj^32(9w7{eAr-X;jDNkKDmb=`Gmr_3aABzYM>U zmUXuNkiTd4-xB;o*yk_*tNT0Ylg`z@?kAaBw_N{vo>YAO+xpk{uMPthg({0NCYq`f zEFequ5`=;3mQmqptz=?qf$i}EQB+D`Ka{R2D1?#KDdvQ_lS5#Js)de0Rrfi_gT*Q) zMiRUzSSbKfgKU}UUZv(ju-3<5X;BiD7eJ0@8l8220~<54#$zti9V%9~gT|N`f_2Mj zD7;y_F`e{>+5&$-I99&|U48JNU>0}mPlh2(r8#vGtg%3M0jw`-r4`G-xM*EjL@meW z*Q^^!D=#_g8|!eU^Sr<|^^J3lk95Iw!pQk@2T(R#)5zTjyPYcv@RYjF+C)8NAc%Qrsvz;(p~2ZG!Y@ zxZZ;^`mR~u<9Im21_k)&tmPWh^n%Y)d(EP58*?g72zb!hDm0ereLIWy%QCs`!L_ka zNv5k(+PbTk&4doj3cQ`dZSzLpknTu@VNj2k86P~Ge!HB<@O`B!J(D_+(9ys=A3oc5 z`yTJ%m&#arJx#FRcTFl4C0FhuHO*!724#}lnI;t!EStjH{emxf~Ez}65-YL;6(pAd=*`IJVlrS$7e+vmYTjrKbXQ0PH8O-8H+>u2kSDBm*_84U|cmPZiSt%vX%N=G` zrJSwu5)(DB;9MTha!ULne^`i|K0Dr%|t=PjVdH36R*FYnL!ZO&cbYM zqJ@%S6Vi*x_9DjF;0G7_#q3C;hw?@TlFU>WIC|OOHh0eJ*$;^hDu_PhXQqKGjkgS- zJnE~gEJ-=48^cI-V1JxguEAZNwM{Geq(QZf>8cyddSRor1`52`oh;j=5p~k@s$pjL ztBsuo?Y!78tXGr9HEQ1>8Cb{>45J1(KE{KrlB92%@moksz-=YJFj(MI|IYd_iCKGS zuZqO-GP-fwz=>b|SJt~Ec^&XC53}un(jM?_U#wQd<^#p5GqMwT40+O0#?nW|?p^acQFBC~^#2R`C z_QJDklCegH64h={$5cOO!(Blq4(Ld-moZ6EunF3h?iXZ85(?mj?kD$|c=p?IEhg-5!8ig<&2UHJ5cf>bBe@%V2e(5EKH9CEH`Ti>!Yo0i7&7ud%-6# zTt24L@UHNh)LaO0)C_S!kQ$CFWEe737V(g`E+oD-5A&IvT&?>iJx$a zL4wKf@KVgCp`PfV`rIobqa`X*Z~;DbnwT>sIOAya3e4WC2Y5@v(VfO9qcw@~3s7*Xy2H?5H4i(k%`e?3Rx-qEP9)XK@o+-W zhuynlwAAQ8lG@MOAXU*RY+kUKovEv_$tXaI`qG?tD(3v+tLh#0?E8(6jm}6923ZqR zqnr_&g7W7!dm87Ailw8%v)fX;T~Md_|8jj|8%Am}0a4k{Q#V}0epFALd-!PdyV1PN z&zo~6smyM*AR!J8wt?g`#v!s?@lcU8H}}OeLOvX^Pa1iRf6A&STbrcWc#z;iH5|di zVp7Ie<+#$IUTNx{hTJt99F9-@G>v!Vb~3Z$(zLyX1ZxC1y~jq)jicqUr0j+?Kkr3J zp%Bi^iBUIWxB_+2+*Dej4@$YFkCSuSFT|Ll&|3!GORM(X(5m^#37OrBH5O4^tC~Zk zFZwN-2pMs?%qNqK+klkqY^C&N|60qMcrN0iUjx9feG1eio%*7eW6d1bz_Z5t#^Xw` zyK~pm=`MlYg%I3JFEFFV=YiB{>#}rkAi}@KntN=S;id7ia?bs^fppo+HX$`7+-h(9 zJ{d=;sP{qNr(>^>t_!VmtU~JzVMO1Z#_0Sr!Babot{}4?e)G!ji2}D)`Cfww$nH3?#xd& zhIVVxPIEZ7OssTvenQ`5B5oZX*DUjM{!RX6vaf@t!qaDY#T?Sqq6OMO;;fh=U3prV zOjc#=A`>cH;0+BCiQ&|fhrlee8skXpwT}h7>9&_ElLI!Dm6N!kRNIS$FmH!oYEN_j_Oc!&8S2#12wJm> zCt#EfodjX*+0)4zCbdR_2{7>j%!pyJ2uwA5mw0G}$`YJIh&N(vj2I}cieXWz+OyosVgMGE-Sn(AZ5^>a9LzGTHG*IJ;K1Wh?imoe%l zfN|r(7NcIFm_)bLO+TB$tmYGP97u~bC}AM$3Swaz zk4>?`lXHUd4x4L(g*PR{JxqnomL2C8az^qE@1vdyr%OYwnNFEeUx59|VJt)q)Ut{E zmK`ISdYDIf;stYci@YXk-9-Www#!WEa65i@TrR0NYzcK=lI9j_Qp4{{b8VTFyyi;=vl4$lZ*6zee<6Tq?o zdnjQRq?GDKHsNluBO`x#EXBGv9f;6+YijxGPQ>&u+lIhSOs*UliPT$LD^jN`?vM4i z!}j9`^XGd=TXjRS!a3qo<`93Z8)3Nwzd^ES0BZ_=5-+nP-o%1zLMn40c~OlvM#6IF zht^}6*mRruTD)W)i5!L#4nZFgOslY*wmD=xKChXAuovz}E7=h{uw>i87JP8ty(YyA z!n6|J4r4=D1v~0?JSnfQxzk5jPeRLyxPT?w&3EBD^7>m8uL#FTC^>JhV{S zLw63Z)(uK{yN(@Vd+g;O%^&8?-rcxW2a#-XgV389IgAg&c=8$BYKe6O$vF=Qr`d`_ z@6#NEd~ADIZe6`3(OX=`EYb1jWKLjyVF#+b?w2Igk7!_~;6y#2lb1iz8Q&m`kqQqm zwKaR}$Vv*Up^WX=(UID82a89^D`g52m#q5F$<>S0Z zf$oFF<+@dA(`(xg%#K`OyYmSJm_E|Fu((WF9N_yX@(uR(6B$Are0LGDAu3ZJjSgT43{X38}MSP50O2( zZHhD(bRUNhYzpTGz0TDS%0?#oE15rWA7>^+7qSl7AVto}L5bp6b6<}gcy4W>_V5t8 z-a{@nRs4cEi>Ey2!gOKQh>em+8?bms4l!@?l;H(5*i!|1gW3Z0_tu5n2!` zvKj-M*I$(H$sMaS=kcb9=UNqYj-%}B2j#=_P4AgM@gA3kM;9?q4!MhPC_swDC(QkP z_7w_YvD^#;|%F$J(Z$f zC4?5Ic;qvg=8TpKBp#oQpr+Y{8|NVF6K8 zzo0l*FRqH4_E)!r#}tb#BC18sDRGj?X1J>XTsDOIV&^5V=K9M@lhlR=F zm}iTfA}vZ~EyT;Xl#A3Zgpb9^&xan0{8D0SHNB0Ky|m+=3oE(vVq>IUOBvY?A>mqp z{HX<{lIfSEnffGUVke{lXBIdgkbAxa{Oa(9$h30LJ@Ibbbl}g+@arWEuMw*vEGk{y z;-ff=%gZ6T#U*raz}xkfDs8>u&v7G{DOYp5OWwW-+Z9Pw>FOhH;jFLhM=iW5VR)x_ zEHbOo^@#WbH+O~l7U5S3^~wg7C|q@~AFye5K_RyZ{G}YLHjJWVfm7c@_gRRVQb6L#i#Y>`r8fCADZ!JLAmb-H& z%ksZ?U2W*mka`O_u&BGX|8QZyto5tSP0?eG-|vVZOW}x|fdyFk_--; z6p`{YSErnPUol6tNKXF! zwY?3iT6$l%qb(1wbFIL^75E=sPa2Tg;d{gk%h>3UjRld4fMe8TgRge*0bp8xMyqeZ zjVkniZp=57Y2%Jen=NnLz<*lssj&G)dL_E9?f-qd&+_LD_1%TU3a1mp4N(c5mgDUi z%e0%+M}($|u-~LlqCq;Fzs6QA`EPj~6J{$)|8yRScI$}$@jtMn-0JK$1EXGqSB_BS(Knjt#!^$*tOjGM=}798UqIokVrjZ9V63Q>bu9V}$+?o1 zhL%h0m98HBj)v8@SbbKTq)IPv0;&AYn%uaifav?52Aoo53~*cHHVhqKAS_c@-biuz#bC z!Edhdm%wu9n#$sEl^e5nSYwO96mP(uRaMfU*5W}`H%s14vA+h60^_vSm}Eu+5_dH# zlr5$4yrHNFyyaVv=GEu=Y#sJ-@hKt$QxvLF1ZHunhW! zHC0-a8-l(D&(ZZn3}tL97m#ipk%sm{hyq(eHz&jbjH?uO%B{ia#eN7(jSm;?qFA$W zo)Y$s^{sTuC6ZrF5V!4Xv2EiUDk%@GkJF=q7Kt@+JewPhQYKYulxgeqjQOxda!n8~ z+h?&*lOql6s`a@{!AP6QnrJ@TBe6DueLVuvQHIut5AEK5Ij zk)^g>V3>}qi*eDXu;B-@<`Zo+YY~EZP;n9lWHgS(2WG3Mk$h_}3mNf{w=j_=6fOKo zHa3ftQ0s&WM~O?Arke&>;z>Ckc{X=yvxIG>#IKninK63e<#N@F5lgj$BAd$MPk?-9 z;2m=Ja|O$7zSk~_vgwMS#g18FiFkWbPR$~J9fx?HsW<`q8$VtI1ROgJ2!lFhbRC{t zf`!_qG~qAi%{SS2*EvhrI*WhAcG+VeS&~LRWHmE2r<6tf!~E)dhzE7w zq}YPVIc7)BDLZ)gg0%-WYjuV)Y}Ww?ntlQM2miOgqaOjO_mQOq5_Qaj-O)^htA*$x z5~|)tPB=|G(0s`g*j>t1)ILTc)Zdf$E+7w@oBE_E5;}^gr%B=UBMNmDWCmQB-;N2v zzBpiEv9exTX_!KG#&KR`bS8W*UVCmcSTCy_-cByZ*#?dW5)w*sUN3&AzpS#^NB)dk zx`K@%@RT~OBA6ReRF8(q8WzwHbPl1ubboVEv7ujWXcpK51;Okl~hd5h-H?$8!0D#fkqJZM>wfgg`f1g(qO8Y+|Yc&gS_vS{N8{Q&y}T zlL9ntcB=$gm*N`@4V8o_BG$n~G|uK~H5VeUzR}NUSdtQA{W%ruVZ#rI{L*Y=rE!-s z5IdS?q=eh_)X4KK9X9rxENP>ETkB;}Zrdo0x3a+o|1rfHVh3E)x1%%tHp3AnnGwRqwLz` zGyrdW_(D#zRJwuQCA_Ifp|XWG?&~fwQi7~(ABt_BvVL99ZymBZQZtKicFqq-fiorNFG&(kXE^o3#`v z+bZ&og>5Ef&Bm5Oxnw)s4E$5nlybqAtx3>vX_As`*VTpYw0(1$fSld5@4U1_39}FH z156P4?#@kHaPzWT9%ECYL)S1`(Qc_NCCfIuS>M}Mswv*FYYH7^x73kRX$x)H_glg? z1v%L+qRDpTuAMu!SuH;= zo#n7RO4DT*qfZon``8C5Z*6Jr&PT9KHIZENj?f+UQx7S7w#9eVZ{&S#qFgZgL-}Jb z*N+Cc2EcMx`+tpSN_YR%u=6Ih!v9omM_qISk@#VKqK&C4Ej z91?R54@Xi|>?Yc%Gi|RoGkCEfo8XRfqZEvtOZ#|kUR5*NI|1F~ZH}YueR~Ec@;vS+hYlAvy>*uR z5TIed(=$Gk7k5WFtggC=#|60!Csc718N>7y&{kMTi!=|>^^ zY{hpGH-tYn1zq4gp={dQJ^uNNZToJZLPgZzBvxb+yVCp%?H>3L|c9{0)9O3-tK`*jMlbYk+ zSi6;7Mtd)btr2*miLgYIiz9TR-7)`J`$@iVujINnS*9u0QErmrVaL~@UPL=78R{df z*i`3eHC26)-KXPf$?)suFFrjgA0IoiPBRAQr*$Nj8f`Yq`@T_=m~$+ib_!>|+c8vD zx7(cKyQ(R%;}|j18_iC2mI^oy*Qlt#G_1^2)N}k``u`nNRQxdlP|T8y#1w&;Nkx*)=rkCi5B8-|_K0G$qMG*>uYI(c$Ak2^( z^#^JyDiZK01ki6f@apnh1<(W90MK91*8HE(6-)(gTrmMz^uOnRz1;&Ynw?nyU1z8V zImN8c*`E%JoenA}Cj+J7(N}s8JeW&Ak+ati1&u-Gy?Q(02m^74e%yZ*aC&~Vw^J$% zZAIpDH)qrNC8HJ|>55I`CvoE}C`Pe(3yTp<9i zO;c(aYHh(?#9!W+_cRMik2n|ZhswO0WuLta=U9mang8LU^5_@(M{MvpdZ>&X&@GQV z8#~(}T&`a(F(<`W3E7HF(3om6fr7X_ULO1p4({(u1M@@EOMlf&hNg>;d@h14SCZ#{l4~@nk~M-rBnh{tA7IjQL>1 zC;QlX^(NG`|DF)Fo;?G-kpODBeBQ@zqY%(mxdh3((+)6z%-zzD%aoCoa`~@UU-`qS z0lK3n{NR94*#NMStb2k7h)qQ(4MGS?3kAUeVbaq*#qEY_05IPJiXwnp>J;~RS{Yi^ zKhhiNOW^xbT2s`kpq7WAIrr{LEwe9Dp!5qg++961?!2u)d%hUAf3lbZ)YSo5R0huX z0a>Jg)MZ%C0R2(91JCdS=>Ycv0N!DN`|iN~8W;^P49vT|zs2Ep<2Fd{g*QDjJ#Y`* z@Agl3w1M{iKzp|T+rHdACVL@3(d?cU$p7Ql^T2)C{sC6Z=n7~GsLudJ7--7{^qtGg zjM!ysy?T`u&O_j5MelMPa_+)bsL}natg1l!VnDvjfg%dD?*PWDBSrm=_8qnSJNa*? z6`*>m!!fL^Lu)i`KpQ)tZx!I&2=q-)E2hQ50hW&On3G}nzZ#~aF9QYf>RVgDp|eOh zKxGhAM^EcN-GZNrFcnX~0F}Uy8@K}KD+2f|4iq_{KQ7L>8F?z9IUO)P9pXQ>Q$y8k z0As)_kH^8NdE^mG0P|Mm^>m;#FhJ&@08xO0H%9j#zEd8Y+8I@#oZ^FkCAC<9x_tjB z-Q7T+f#>A_ygjv7jHk5Wp$FZf54=GO{B=&(>mTL>o0qz;py`1xX;7WY0|hJsw0{f~ z9pF2G0DT&9)VwenSE)=FHy04s(vsdTG;nsxAZBnKV-R5>urqUq+NYo9pPJE}qvO** zfa%R55$yNvP=I!MiE(Zj16IJZP<_lE5K~VwXJfG+9K;ny=4>FJRy-U3yTU_oIBmhL zfAw~>l3YKM;OQ)+2Z${k7Hkz9qzixn4yk@5ARlPj2w+^NHtGp*&G2+wxU;Kr{Y(Mi zHzP{#zW=3vclyV;e{J>DB(WgqS)hUl@F|CcV90*GtN*MkNHUDGm}rlJ_Ui$*;Pj02 z3O&^_K9~@obb3L1!9lD*|Ej0Y9HP*20MDxhiYag{44_Lbj#)IFp%K*9!cDDhx$=w# zQ072a5Kk{`c0qaN>!MH0e?pGi&tD*q{}-aP z5bOX37)Bd?YaE=K2XA-kDtJ6OI5|%F!sErsO>R16nAaF@Qy);__UwMrbZUC=1zb%j z#(;Gq0E9J$(?F#aPA&L3{{K9d;y-*8I!^#w1yF%|}wdLy;vVvynE57QBV zp)25-P6N*PZr)SFT`89^KKB4{G#vVgZ}cZdrdP#*;-JsUkWV6_1h|M&{{ zJ2X8f@TmqUIN;hTUvqKVI&Ty$R}R2hSLTuhZn2(V`VW!Rn48k9uNXu>(|i2S)3Ka` zo(>hU4ydUBt7RY#}|fwvIo!)#0D4@1sR}wZKd~s;PDVd zdrqCPUc>9YG$m*Ze(dv9qY4N)GB(xLXaYiR_6)Q&n?U>Vje`#&5dhOw#{o|B;FU-1 zfl&fbjR5u{Y(VEg?D3yIGOz*|Pwk8)fHUGB4QJ@z(elnyOTFBC!TQs&YIdE2 z=C>B@BX_EQfdT*xCIt95DFeI(3?KqQWb`yHkq_@VeI9V009-CLhkirT3t_n!y+ooi zKMfE5+zVs9Svle7C^^^>9VBwMPK`ne+cQWVBGEqO@Ks(&qmf zG71rZ$W3S*?2S5=vi#SB|J1>AjIX)nR4+Vxr20~nPhB#)`BZODBcJg|eYe!Bm{xc~TzhKKL(lhwL|5Q`SZ3E3J zKn#}O`+6b@z>4qYc~~j}TnOvwYXV{~s8)E~e^%EW2ta|j6kstOz+wOzl|al2tLo4i zs2QmD0KV~*#}vTkV$W#Gxb)8-2mHRyv^#I@tr+P&G|L(`k9{~Tc3zhV#?;TnJ z5rFSc0_8MjeGZJ5APTnNstiukud<|0yQJ6Og#}BE0uGa}KbBQ?XazC=v<(I1ObTdU z3A7heenwCG%s9sL)ML`a1OXo_X~4E91b7+(`*UOXzY(QeLIENb&h;Sj^z6m)(g6-- zoikv2W&{J`AbG$)1qBD~Qpx-ell}jLY3U!PJBF=s(R#aVKT$EkX}Y}^KvQD$)Ktp< z;^Q@84PcC?G1F=M;0d&^!!itg=3LhXHJ=v&jK&>_{ta#ruMW-sVeLx*nmV?>bMMXK z1}5wT0)%~sAd3sDxC^Lgts4kvYpkN8)mjyZR&A{t>Z|&&Dp;*rH?*6(q1u*e)gabg zxo)kt#RRb8&i6YviM8+F_kGy^*E$ex=A1cmX6DSWiUmPc4+34kR1yDBBP|+5;sk21&C!>ozSCZ@hYkeb$#Tvipxn5)HX-Mkle`cc-Nu zvTQw+b1;l^klCoC!gJ-<2j!;QNnA#));12%rEEDkBwT~ZQMV)Co^zS|oAGilwVgO7xn<9`ArJyxd(awHMfFI)eDSt}Y2kpKRn~qK`qNR6SEX$nEHn+nvuWt#inO?- zrsrYUdQkW}*2rEOKRZGf{;a6;y1x2Hp)X{qoiAy--ERA0a~$~o@`be2M(-0=Sm@Nw zhdw5mwDhr#3M`ho$*QUuuf64=?ry6op z3@e~u9NKW}I)C}>e5l!Id}}GKcIYuKKad=Fd$r4^)q+4+?JRsyjhbDYJ12`+IW4aM z$~dnXoQ|0r5fh$^nHULrgfXouZJPo5$YvalXG1~b%E83He0e@!C#@SN)`qN$o_m+w z@cj26kyQjRBm!vTRu6*4q}FSuEt@?n7Fy1#^5wH&US&e_(%NAIS}?zi)5X=9 z=nR>+b=hYN{E3aI2<=BR6^a*3je&U(0iZ5Qt&lib_R3(I`*)P>Zec#toV&jwH6Y@} zz|!EN1oJzjI0$dH1KZpA*keSa9q&WFYo-R$wo{R^DuhI2S?1ol>Ju|Cl=Iw#p)AQ< zwaxW7w#m@Z&JUfc20JjWsc&@0)gFvTRAUr2SZ6!29Sd`i5%q`OPx?-2J6c;r%Lwpl z70tC2^IS_Xg_*3Sv*{i4hC^zgg`%IL1&Um@PLIKmybX(rc0`bLXbm2Kq(hL1c(7{Q z^lWI0U8l_+ACscf3>u96fLC`AWH?BX73oPw7Uq`C1khofTfJ#+4WYS}5sHnPbms56 zn(V?%0fst-Nu{f>m=dLHo_Q!H0aHLonE9+?3*47LvLQE{qOo=aORh<-VfG6 zS1tcwA3o?b^Y?EhJ+VSFKWN)_K@XcBw12EGX29rz5693R8HHtF*>J$4Q1cqKi36>~ zx1o6U2Jvku_}0t`DzmJX>rmUFsrfC7z-aH#9vi+l`4K$49UAQK!@@~%bn-ig!Gzkk zwG=Ze=%W+cD!0?ja&>q65xYy+yxrxyvAY<$I=eVSabTeK`u;?+IMsens*hT(_Ey+w zlIyW)lYZ@?^P=@>`vE=^UAg#ukaYUiL|0<+4Z*L_-r1}!Kmmp*a$GeX>XuGD`uznn zyJHl)PMtji59HNRz8GG$SBf`Dc+mjAWOaSNs#4ouF;_kXZYSVgNb9PrECMEiF}7&D zF(lif1xp=dj9_`oU@4^AOBEg87~`AbH9PZtC_i@UL?TNcD93lt2N zs5fS>nGPFA5jJQtL<4j}ALxV&{X0x-RaCb`JB2*gPD6$bm=kDTN9_&Z z4app$YcI1}3VM|CRqQ?u-u(2rEl!%pD|R{3+);T;e~DJ!p3URoG~ z752uzgk2|U&?vzN=cDlku~_I}Pj;kv?Z|^crg5$kddciybnlhD8B z;f&_?FV+v)2oV~1wNwLhN2VsKLEYWyxg&fb1NR*)Ux>vK^3m_#900XuS?Eve%FX>G z9AxgJo&SA&jlY7|49G2BMiN?`s_FAa4A##LHF?;aVaY%@ilg~;N2!}Ma zCoyzsdgKIbY+rOU9Haf?D&ATbjQ!(RcKP!wE-&^EQX%ac9k7FxVFS(0wkJDyE=&`> zdfrEc4vcEl^4Z%K_%W&}%ND<}Y_a*nRQdqh@ZYOTd)n#MQ~$N72NvJxxT?XJcu}N_ zk`Af%guO-lgFix$*$OAnXC3RQ#J_&vAM^vWybd=dR4iQ4xnlPb&5Oxzhbf~-^o19c zbsy;LBG{yF2kpmBRzXUvV66ObhBgxn_cq$tAbz$^Cr#z;WgqtN5hg}7buN`WU$7;i zvxs{n=aI~@dk6Fc!KFevL3hxzX#`j&Nene+u^lHcxz8Q>F5*O$DPJFEkk+pqE*=sR zzHV;nUAB$uU1KminY@cwpntNEHeo9VA+^=>h%pe}%NA^X*OzgbvRdnWafqExv#NB} zfe-zlm~YvA{7^5u67|%5?k5*IFp6ID_Z_?lxo@_JNS0vD!1qg5D;ODPo`-hbKsU)s zS~K)|$rS_s!bd}~LcefD`NQGg9I2F_m$iS>D$c=8v6-8kg`1EQonUjZf%7h3`*DT? z8~Rb`;X}RD6`4PT{kX=F4g2Ve?L(kUyuWP00@w+d#RF)H{3*)q)Gvv0k=g!I+DC!5 zy(r{U90U43>1*@(^;3@g1g3LVgId1FFh0sq;BHiklPWV}DjIM2mF@HTt$K;*Pkjq^ zYm|?tSd}_zWJ);r@izPrSl!^|9%0!iN5KuTT~M>|;gIlQi@Vt|k@@}x+BD^r1EOVB&y8Wg$`1e%xSR&d`f0w zK?!DHfn42CAjig+j0W+apINVR=m8pbp){-*79Fn0F@{Me%rX_3vKt-VGAdsP6U%1o z=TQFdTShF#d z7v-ASWc9T9D5P*(-uAUa2*4jU83u23;6*LjW&^jJfX9e+%iLQ{cBxC$y!{71q!56) z0tCC9PGOW1WbX{gb4N)~j`AU4C;~8_$k- z-l?p7dohzgfk~=PcM}&Cn;7eQWt=_55CJ#H=@*eQlqMgPk}cX>Fw+L^J$NAoR@ISu4N~Bfug58nq4gE;z zRAL!#ThQ2%XiWE%J%3YwJ6^hYeFwJReWq{%7r!HgPmsxmS!D^VKUU$Rf|Q3+)FTPJ zgr5xx5INrVL)}+{m=g=hqRa%TzEGhzZ;SPmsPg7yPcBJ$BgVQQ>W&eldgxg|?L8;Tn8jH#yqo|fP1bff%7!j7n+@=VTH+lM7Q9}787tsjFSEHDmsk|h zUKFA;$2n{v|97CC59&N3yx!u8OvfL_Y_~UDimk}~xC6gJA>N2m zxgVxb+Kb=wl$PZV&Cnj=!4Zln{D~MeayBso_2DEBFO)j7nILK#I=M0d8{1MQ-<4V7 zWJ))wOc^GRlH)PQg39jH%CeI!9(IKvMfRdeNq{G7+3Z3HWktfu-R0zmQ^ap}+YSN9 zy5$KD1uo?6t-IkK`1|2oCG1irYi z~odxWsG7Yb6Q-hnc!CQ#XHUIttO4wNu~%()r1c)6M{7;5Te0` zPO$~nC3DM(10Rx|Y332QwrbC3*d<`ztX9$@21#bChCs#k<>MjVhnE-j2B|Bf{zY@;rBy} z{KzZ)>@ayHt$%CgA73Nry`$$~L|IkW%ru0AuEQ}QOczlqVt#^N>3SY>djr-T$yi6s z?N8inuE(rzs;ib zRHwaT1b3nLeS7Z|+8#+rO@cQP@1p8j-}9JK`2_tYTfiS}zK3}+GG6QvT6U~1pHcN= zio*B|rYOAZk88o~^GrkiD8oaK9bM!}Y+p~^*&=AS+!>lDoHOQ0jNoU+1VD^OJ$lRT z?OF##nR?#k8wUg*?#0FvfBC()^5S+(Yq!kzSHRChj!plc1Z&^V(`H24_&*kJMFiIiOwSLC~J<_6gdiJ-aV{@50!u zkcQ{nw0Y3kYS=rd;V26CIo2JPy<61i$+TT5quy}dD}>}ya|?w1D?AmL;RnLn0-gX- z?seGpZWLGU2YE~~jN-~G+RK;-8FQ759dRwknB7C~eTE`{GR8sdBy6IZu9=9^Vy)*E z%${j!$mQY~MAFr%v<6{aRY!HBK)IbCIeAD~#D5)V{Z%R5=b&F!z559Gxgv!4$%Unf z!-~WS`ISlRH9NykZl)BIba1j@y-OXC4}nlOA{E~15`^#^8q~V3t4d>VgLvlNLp|x& z52wZozplNNsKz2VI0T!i%fMAycw0y+k;?-TjsshX7PG&k)O`*<)BMZ9?<45@%2q^6 z=j1=rOVH?m6bk+%jGlt|4(`4&XBMV8=1lB)%x)mhL||ErPz**aT!%fNN~t;poZq9L zG-q5%-n|+7U_v)j7M~UK$As?mJ31qy{hOj=!X6;l;NkZ79cg$Fyqz<1FeL5hEqgwL z_q{B0vpGrG7!I#%hzG=rf+l%em zE7}V|x^8+u9m(KQ70u&sQ3in~n#V)pVjtv+YbDpZ-8_3gGg;VTi7GaN*1YG40s_5A^CPk z>9H4WQa-@`td0=+?5>6_<*xF(zlyJmFH}VzTRrJ{A>50W%@7I$LR#3 zH5RF_nXfzm)f}$7eWi=w%hOC3&S+ zBe#Rt33O127UYvgv|%9z#bwm{uamD&?c+dNqxS#^KQFW$C(xtxw9*r8p=Vek*u!}Q z({>ar-zN}MD?ZKi?wdMPbGnHL`MqpAc#Xr2IlyDoM;Yc@JSZtiRU@UgJa;;U_7IJ;5D`X zgREfADCsBZAri((;zV{FW{FNc8repSYP6s&U~=@b!`yJW8>e6cr%w0NkcyhZYr2Bk z>L@!fKyHb*3wpsZrPo5Va}6aFZ5_avWCh#$;nHZkvbXB-#^~QpN0-gc2xqjm-_<=~ zg(+&)3$TA#oFs5*1nh&D6MBxQqAum@x|1Kn_JCK4;^ayNU9nyv z2p|MQM1qX>x{p4S|Jem}NYUq+o~j$(p3IR4OPN~E!xLJQO@_$qlxHcN?qe@@?fOP{ zO*j_H+si+M+Z6jBBKWT(P}p_z?$4&fxmiuFmhO2uI+Rb+#ytE{}J-uPC=G`PW@E`tAvcpCfEG@uP3!J*T z^g>TT7dnBkj?3sR+b+OaqK1qD15NYSP8NMv>#$zrgo2%}FP2 z+|%Kl+xNRz52wYsmjew;rg(`mEDMv|r~X)7QQZ2Lt+;kq>M^3aN+C{gyyveG*W&UBcaqe!e%me#)4eH0}c zBn%uvvI2DF&?AR?c_aLWFx)~1jsg_hDE&-Gu7I|jgl-@>t%y*_+Cym;57U_W;!S>B zl2^nR^5gc27%5(Th&{V`(veVRWOWs{jXA$GhTkpCB*xHW#BG#fM@m49&_FGtS%wHZ z`8B30FO$6vV{&_;pw1&j1-wEiRj?^BG%vZ5C*>f{u2`oz*7-smw^QnEsinaFo^TWw&K#paB4hIJP@^Qovr6TT3+f>1au-~8zK~bk^ znYkBfZ{#OtcsLqNfy6F_t1)FWNhYkz zRr^cv9FkjzH$Z7{gy&RkQrjskQDu?`xzH7~%u}>G2I@lse$TYLK30LD%OPQ z8%}=SaB3!B=AkQ7^hcgnA?k#pF6GC4gSsEEanVipt@(3#FK|(gn;BPx%%(vT!A5AV zbu#|ku$~Kx2isvAb`=F8$89fU!YcgT4aFDu_ItIOeQmem)5^2ih&8^)^nZ9m$X$(y z(}Wj!8n4Ni>c9OLr@2<-*=#H5aviJg2sr?xbC4M#TUM09tmX^@0aV#+ zkgC52bIMnKNf%UcWvOSpp()zySwsSLZX(~vdFd$sF^4HaJH!u)iB)3!Hp-*hN8fLM zKb7+O@H&EG(9#z3r4`1R=JxkmTffD!dTw`GeYc7~);j1$udC{RWv3@J{swFQF=S#A+&9XuQv<*5f%GNKyiZEC*mhDr4c#H6c#S@O6Nxwo zvBTp9-jyKWCTvLZ%BVrPl9v{ykcEx3>5@ zL+=fL)6agZ&^OYf!D3Mi=wC4cyywdscCjb>sQ0(~+WoZq%*v&TMZxX~Wj5F18JBja z&V8WoKB8Tq+#vaE#K0Zw%x8tb9jq%CQ4Z)Je5O1RHSi5ad;eCjVL7uOUaCH`^X8^s z>W!Qye67i|g|+b-ct<&)JyG`@+D;1O0uRnfedwfeG?5+Q2aO^SxtgA+(;GN_@vI*8 z+)GSFH$u~;E+u)hMJ`ZvxN4x~}#^LWMlzph@8i~xXeogfeo6AM>@vN`V=QsUG ze_MePfoIg`l`r~S73_7K-yD7L`;_&^ZEV8iiw(TeP<8X{tq(>lD)xFPxfFBT+~GGZ zNy5n3rW6c#U&!8~?4R>Jpr_3qxMiCbS)<6CsynpM57y+|%hyi~rDWhOSOhU<^OEd- zMZ92NX#@)(e1J)TtQh1X$g#iYfIN|#NG&Iy(G2uI8-I^NNd;e5d)0{i!ABb7D11kS z_%jCIUD3AsCB1&m?fOjH5hu}4=!%M7b9p}#_~Vbi$@laD`rR9!ci^*@LDpoWI57eX zKt&($my9`wT|vm&WU;W}*1?{j5e$pjG-6WFcK~AY~Xp zGqiX7s=E(%1ha;in~9mm9fuoK+NHfxYR zQv*3lWX-2eIi8{yn!6_pna2E`(gf{Y z2_r_(-VvM&{RoZ=%8gl#pa>l5quw85R@=!MQ+V5BqR3bzs7HzNum!QKGf8)xwk2?Ib%vhbCErM%p@JcUFU^$z;nCs`7;!n%aqsU$la<>8AJ2HAJ?5II7)GPeJlu*6$khqdT6_`b`exj?CU);G{gz zn#>VPtia1p2O!$3GVv@K^;YHC2AhKTAyK>7`=@2=nSK)0P;tI17dBk{fikD<+!0>m zTJL4f#ys{h^_a-F7NrR>2QR6WFBl|L@h*&BYbGbs%PVP)@rQOzprq&EG`xVZ0tryPa)sRFJIdA15uoJo16f3QL2 zVG1)8xy^4^Q&s)j+#_6kU5ufrqwbrKoVMC5uVHs}OrP{mEVRWU4%o3u%Tg}drzo^< zQZ8EeKFHng@;scoAl=K}{F;5Ns`WNa!0R3>JtgF0P8Q8!a<-KEQ|{Ob>>rY1{CEcg zGf2i{DJ4UX_nOZ1y>y2=VZu7#hU_^anIPnm$&g1TV?1PUA>uj4oJfY0YK2r0oa!TF zlV#*0Eq4JtP%cyU&!C*Lz5lD6GBWDAzC`PCqO}M=rkiQaev9(m{Mu|>oLJHBh=VCy zH@)JB#K^*)`>K9IK}GJia<8|n-HIaGT17o|KK1>MDFbr> zz8Yg*4-^K(%~ok8_xe3cF>EQ8>yJX}{uotUmeZ=S29{d*vtoW218w9OiysL{ZGXmy zx|`$WzNFi411=J%FLLN4*=NIK-7Ba6_vSP&!O*zff1C=Xb4Jd~5J^}6 z+D?#YcKw(tCF6-TM*aE)d@ewF-e$rSxnbj^qnumQQ?CLO@xWgM9-uD8W2kN_o>4sJ zc^jL6xcJIRwM(Z>>W^n(y4lwW=W0v6%cv7A)RT#q%9!-laq-$owe4qmnF>f;!zXH{ zVIt}i-A2^yjqw8F#@kYtA81`Yys)l6)k&))}&6>8-twmdO=0@muH1xKU2IcxO0sz!QjW@2z+QZwB~jT)k!X?535gaC=PSCE9ji1*FY9hfugR|u z6Hf@%q48fMxWK!3gDw6`{(s@{<@<{JwCkB)VPi9)tgsc*UD_}=wnlFZH>3D}!S571 z13t8EzDe~9FTJEM>#qAW(raCx)L)}?%bzc1x>EbMN?Gc|Lh8elEG8rL+0;qNWuMmt zGYJ{YuyB2>{9?UEf2%><#nY4PYm?7?*6Nmn;b#SZta=CLyub&{f5I`Ja6HapF}Ei5 zZ#fE4iil;B=PCnk0N-_#)8Nfgj05Rd27K1qBES*GR!M5?p8D%+#&hmG&a{?{EUG+>I;-)_pEz^RbHb&Bz^x^*_*sBFggF zsZ(K_GYZOtL<*7wx{8p7B?zKJf;q9$gpw?0dWXqYmwMdn6$@}5j_PUS#Sl7Hu#xnwT1(7DW41_fqN^2hbL=Vuu8?-k(AI2ixGv{^owjmrPuv*62aH&VFZsYI-;Bvl%|+e{2_L1)>rY&J^P)h z>F33ZYB|Uq%#S-tU-BKF2i)e$D5-)A4Ygm|Lo%ac?3r&2h%;mPGZ*A-)!REJ^koy% zig`J5%l`{pvy-k|HttNjo+^_^h02B^)Km2z)_m^EAH6TLW&SJNQmHeww?}C2Bc9q* zE<$^98v%}VE9BD&be<+U_eV(-tr-NvwQXlqJg}=HxN2K!&W6CGjcG{Pz#jDyoSxuz z0FI^pIhC~<7jlRP*cAp~m2DSwNf^$ccLXNtB=oP8CBBF;hMVt1$*`-r&v`CoXS90j z%%evtlS+Q|ClBNf7Z#5&*bHS8qezorBYX1~5a`EST}v-)p@ zShqRMyf;u@#orPe&qS~tKkl1txZT0PSoZW3rvELaFU5k-0`@><43nK=`0jO6jQ-*h zW~Xb#%zB0XY(vfO^(p*^%m=N@uRWrEN9+FwoOmRcKZ_eF{`fyb$vcHm@>@G-a ze^E;P>y|zJd%%$HM0(PEr^&;?$_VY@ZUPXB|l{rSO zARvQuDc1=f?dMeQEb7pHPW6gq32kE6N*>tG}!=O^SXE13zXTYdUwYaI1799}6k8&@bblNZJ0ZttlPgB-{EDI5QOVi+QPd9B1o@XQ zq3-_5j^+lo43L)2mT#@(#lPj;7T2;1(oz?3GY}S|oX`IPVf2km?Wn3CCl!U!_VLfaXlZGT7Fa3UB)>vos9mMy!)i+{JtkT2GO zHcv(%&T@uE=+9At*+DR3K*&p!Wy|&hg2^x(mhWdb1et=Hd-G~mPnX2oj?=fZi(VIy)BeBL z8y}gXzp0o0I6e91yX*txIGXYK{uLja*uU0kg#PAG>5sdUKYv%A)83cn0r*GtC}-2O zqa)KHg8O5_aKp_!!$DwU9(2*qrnTTp{{5MdHBO+H{QH$bGHG2W@zqH62iKe<>-1du zlgfnm*)A75;d+Ae!)5UD!#7O+aI-umJA~#L#V}VS#zi$XFcTaN%VJDvNCD0;C6@dU z^F{B9JH|lN>8Q`8+%%z0I`?mFb4L&pAq{4Zbk`k9e!L_k(w!UnWbJM?ZGR8_#XxC4 zS!eQZV=pHgHxF=LKy`lXuN6 z|Hc`{_KJjXMPdX$f(`fN2jI*h-yrj74ZoUsPwEER$ah7s*+iSIIMF-u=GhKS^=$Y| zc?upwKPCU9(x29UA?jNFldr|aG7p#uV@&z{O=K%DRN_aVGuqq@Sfb?*=sKIUtfwY|ON?Ki?zP^b{9pZMNb)bs z?iI=l9g2*#cD44^&|FgE)b58<7^xP zj%9Qz|M)^WB)7S8H${)iaB{lx5>7jnY3KtE>?5AEyL>-FO*+l!_ovZ40tWSz`}S&6 zfn9@UlDZ&SZb@!UB3(UL^fUlV68UZ-}FD$KS-eTaLpz|44pVe7Y?Lw$8toY|s|NTK6u>!KQXkVG0DJJpTuK2H_wc zerLf^`3if6wf`^q(puaHYyV%;<6jZ>FFul2gf;7!7TvbRu$K8BNH*>{@XTuCR%%;_ zVggBf1TAFtI7Wp7V2GNY^%;O9NPnCr;}r34yKXDRF-m3Em7#|h;R+@7Jls$}IJU`vynC!35?wnrqi zkY3b(8OH_Spgx;(&tDzK7l5Z6?O5RW6m$%4xoT;pBVY&kZpA?{u;C+LosN~DfzB2X zKfWX!5wDJe;`YQ3+PCQLrhkA#@LL^3f5<;ceyhzb7saApq`!WkWHw{{W@0|N0!J9u z@I>HyAD>-X*d@!HW=^9ov=(93iT({*`h>O+0qR@l$O^z0Th_(bz|mdPavT97x)ZB} zX#zgVm7+X`dFW3c=ZWI6M#=5^1T|La+GOk>l?3E z$07Jo08h3g`B44|j=iAcuQ^h$PRIYuk9b8KTS}N@@SWBs7lH|O0-gB>{P;Ke@+ELU z{0RIw@DFfMe19IwRTQ$zcKibzlRyXI(W3PFhd3DEpt2q~bii@vAJB0H@HEHbQ0#!? zpUjW{4|D8q@*`exepHokD)i+U`a%4djJ~k1zz_3&U-I&Kuoe?wh1FqNPDk4!mzHk0 zR@nr(0=d)%^i!^e1hUD{aulLOT^=*!R;eH9d1S*jE!WB<*QFz#4bqR_Ck}4ksFAz! zg{&$G=WI-`H#_i!KF8bK*Hk>%-N#TbBfmO)zOWbVEbvD`1Kqo@Qj6HebK%x3QvzRy zJcsJs=W1QXwPVpcyHxy4B3TqlzDwA|8}Y|-z*8S~0(ONqPGiL3;Oo^gI62_km|+ri z)4@(ZR_aT67|T%d0Z;cRF4uDFw78uzQ@>`d*e&USc!@h-%-wV3FS6O;h6V?I5x2Wt zV~5HI%bS+QnA>A-qCN7ZTm%k^>8;Qv_00GiD>lT`#ncXU!U^t{k|n*K;GV9~p1m%< z7H_ztHZ;cY>$r6ZhCh4^*W=`UaU&hYh$)s*>KALN|Cl<|R4=ZzbSELXF=2{ldr=>u zPs+eqs7EoLIcTdZ==nm+c(`6&q%hoYHY`)|rQ#E^2=TbE_BCxA8zf!YM~H{pEEMl= z)!=WqpfGIkxJvt@hc20T8T0`@3p9e4!u=jX(}}tpOn;c-IO<9_C3HnvIzo;9l#U2< zJYX-9qj3pWz+R-ODiLur;E9v z#gle1`4ib;r|Wy@Z)Qou3n_S#Ons~>_4^q8qj8%I*eGG#WZ^^g-=1c}UG4=k!=DW2 zelHxLf8Iyh=kdCMB?ZqGXYwoRWww%zdNVJp084YEQQ&36RcA@?og;6QZ8Ub0j(?ht zRFn|im$lBx+l(E#XN9p%^3l6Qm(eU1Qf8 zo9aQ6FXh%^ezihfS_cR5Y!>KTsXd2e5EL1AuB*@&WgyuEG+ytaPAckruI1F?@XqT) zFp=0vmE1{$Z#z^l`@yrrw_VquE^O;~|FAd8TP5pceJk&0&UA zDLI;(gnJsE#R@cu)v_WFW05#NgUOn}UF*P~Wi-Z^W=&HgW0V-VQ!)H^Tzau)aX)c} zyD<$**DMRFN`oi{PW^iq&nO1IQY&ls)4+fG$;et0d^w_&1((dKfzpJL*<>;{SoQ3O|;Mp=Xs7)S*5A83f*(=M=6z{Iz zsSqJLPrk?i2jKV+Wjk<81CIXM!=v?&@}=YJ0y~&G?ee-ig8gxQD({Ri7UIvsy!HJZ zbdvA<6rOzun3YodT|<3UvVWjH_4Njx%?Hd1 ztt4E7==X+(V)jD+CG5P2N%>*iR#~09I4i5#Q+jeFavm*xtOP8r8_M6HyX}T*$={lb zqnSq8DecW$5AZyd`i8at1L}T-y0`F*;(HskOy4VAn2zp|;e20qR+}XK&4#nj8aQN~ zuzhW^*x9YlF*g+^=c{m%ntja5AQ|NDcffN5zYC#9bl1i{5YF*}-=zD0gYp#kHv)ej ze8((yXICFeEL+Pw{8r6Bko3cMLW~>p+Yz+TezytFXnfXarQx`KVOM@GBEEO(izUOK z_K|dXoG(%RB5RMst~Z2hQgD=pk_K@s5r>!*;ST3w2H-5*yM7YY6x%CbuJv$YY$tHav_xg&p`h? z&~yki%>hl_wQ>ELjN)v%NJAw=v1Duq%e=OpmH7j8>8wn5?Yge|C*wH}=X*h1`g6wR ze9=Z+GF*pz6j8h|*5)x7hp{I8n8pC}D?%LR#T+zx>rNU!EjhwmSeFw~QqSU+uh5G9 z-{$MjWW-q7I|$lnZrudz2EY!{vf*k|(9*V5?1r@}u3B8}$+{F~4O}b}!l00M=Jodw zFh@{o05=zKX>9xEn9l_ijT>@xr^@hxKrYj+3cbtL-_JeI&-^GmUhX0A|9;NMulsVjqZ}LZBh@9 z{^l!b^Z7GOhpfd+<2|~%S=2>m<{#w-Q@dpEkY8kgmQ^#^p+^$N+wtclb@Hf1ZT*dj z;_NK>y`h>lT`txmBgkU=`_=)DV)mB+OY&;dE9k~n9B%@i_PO_fgYKHx{K`0#0hE{4 z2{>qsJ_C;KuYvKptttN*je?~czoUu8KZ4;#;cIORa1CYoRQAsN7B`v!f*2* z&!DDT^n9hD=aW2aDtR?MKhB~%+XI&N?_nRzOhx&6jlLJm-!UVm~jWIA~#K?+NMRmuG?YPDu;KJ*aG&ykE zK3xAyyV?AGYp>y;Ck{35qxd1N-k93?AP(!$5l{~t0acf&-^K;jW08reh^OPfbl~}V z>S($R9Va@x>B`V#I+bI#eMgpOl0b6_z68pDC;O@d{OSXKZ3KPD)$6i8&1;EW+2o92lJqOGYFXVP$+!`<+@+EI z;|=6eZL$55Xl^HfVtpi6$nPTD$E58iYxir9l7`u*efaZC;FDobqfIVGSGF(ijqLK& zRlL?kI1}C%J`>RSH?|DYn=ECjYb&%Zc>G6!2}O)-x`NS&C~W*+2g=o^j3QXZ1^E?KPgL z8z#v1Qok_3)4cl_&)x$33hdD-$<5RFv%)OpqLH~y`&YOQ<8((E@-ym^+_@*rff>z| z77-Q^o4yMzh8G(e@@nqmmc|((b707PLqASb<192Tk8+^f5QS?ON8*+OT(dcC+4R*o z6|c`+RlbaF9;6#3R_`y3!-p-D79f16K3#p_U0kp5c5m}7;L|$opAKO4KwMx#x297r z^NTz2dnF5bFd<>!3Gs#Q%>EU*4FAEGKRIII(w`5^EK1g!b8y^&gZL8wJPp9JLMvm; z1~S>|Nl31G@jtIZI>d)*pY$@h8rviizc61YUzOHO4&c26{*p@qxxXGsIO=5nz`HSt ziTw8|r+QV~-8IRcL?-Sy1Nly-vX&W`?Qmd&`ILHB3Ye9lWgg>2str zUhgvJ3465uB$sNw6E5TtU@3pGFW|+1-%9&;GYi``OuVbHN_@w$EH@)TobbD}T3R<; z+^Y-jz`VoZ4&`9$9c@as8{mn5MZl3Q^q+~~RMGWy$LcSnOU4GSo>!n(qkI5=zXFMxJRh$ca4vPow&dq_;;% za7Qhj-w&X(nv`!u=lv*`D^)AeNRsMtYQ3tSssC+J15+z*W{lCz%mZ0{ghYcWfIMEa z{Y-Jj^C&;#8O0e#Xl=@`Z)4UlzsZ{Cl3z=S869GAG~WS{x{wwixLhNy=61e<*_U@xLP1pN1a z&(`9d95EjK+q=oDn9ye(bhpnjKij(AOT+h8n`AobQ|`JLd^jew8T)|CFJdApBbdd- z?A7cJ4=j35sUOuP-=MWF#wga4IonVyUQ=Aj_BzEL)0Y>sb&~5NJ5b6c{ITY-nFcuG zHJu0g*3yO|JYsiboty5y|CKZS*tHpA43590{vp(*vD^S0WFMw$C9%doc4nDiCyfG= zHOXdv(LKh*uM?=Z5cM#IO?81BIVnT$MCevrn_O4Q89Ne)D8PbyKI#+hXLxoyKKzK?;P}#|Zr_HK-7&f{*0J3NmO{f9#vlWH^>j*37UV!vvR;?kiUqoX=Y-C<>-m!7-Sifsi;fyg!~)d3H^(T zU>kRd!?SVNxKSm{51g+O#!n2KG=5}v7YX#lK9In_8Dq5mBHDcf8#@Vgy->bJ-Q534 z!(WL(ok-CQ6Uh|~!JrM2@mhhNB(uMOg~SrdkAuVYw7o4K?i zcio4(uhF@~jusvf{g(l=3(tuD5#%3Jh2cV|i_1d1%8lZC>GEd~)aPSE4kRM=)Q4X|Y$r>>J5ha~5-9BKS`4?{b0}=htEk*7#-4 zn)QGs9sJMtb+x#=mYlzwH5A_`9GpvwyN!Dcy+vNP{sMd6QRgE(dnq1!p61od&$IEj z$XhEsH}ioHdL4Zrm=*Z_8u;+=75Lz(&%xaW+Mvxq+Yj)IG3GmfdQVv^dCU3eL-#8j(+1J~07L`%&3gzm zz}7yq+~&p&;hl&A9o9P34%PWW8yIFI`8GEfe_LsxGc`mDjVYa}kvg@UmT>bOuR*?` zp)GhC4m|g;u8(P}`0>YmDE0GM>|J_ht4}Is4Ua_Nxf>%BUDIFr%WTwtK}{WA~T-mH-cB77fAu5B_L~ zbOR5ReDw2}w#~NwZlFhJ{vPf+(S6JJYT^4yj=|PlDR(rKt1IHl6(w~gO8M0* z^1DnWvygRV2e7M|$p#ODt22LsEjH70!!H!HkX;sx{{ISGD_&vk3OKg#f94m_1yjet zn3jv77radc4WtLt-Zzry5WOmIZ}?3E{1z0_9l8U@tNXjln6JTycHoI0aQLAs<;s@R z5kz;o;7*bo!0{MG4jk=)V~r9Xd&5{|+4#@7`<}Rt0ng3+FJmh3$1@a?6@jR`@)g>% z;y3_!8w<@oz)|)OaBK&TMig3mlykh|AK*9&__m86OKTcK zqQg3dzOT?1f7~k*SXIW=qJ6qohH`C|feufljVrTbZq&{$=8I+MuAjhTWv!{t4BGNS zJ?gW+GVpTR2>xgDT|dK_>t~=tTIzmhp(_M+RjBK$v~^t^!2RS^=f-LaB|qygrJ?S1 zYQHtjAv(lrokQMAHX~fWY!wqY;u9{lIogE87t8p!raAN!B@B3J4yj+Ezg8Rv0Z;Qj z064sX!|&B`a5RVNQLJ;w>(y}x{A>d{taIoe(9xRa5cS16hh7B-^km3bt#Ee*`HZ~4 zkIp1ZhO<}CaK(*xWanyh3HhOhHa6c-hF88}aqo&5W&VbF^o}j~+#d45j}$+*Sc;nY zpA#Ga(dmQ|h4$*O_q|FUTMyyf(v9HWfG1xS)B@2J;JBi-ooskC)}YGQe<@LmJvteK znX8?c&c7B6)vtD!cvh1mIYi>Vcrd?82A)}H;o^X&JqkjfqT9f8yv4nN?@3SozC6E< zfWHY^FbtwwFVT{fZ)h4b$>BcIeeCf+XZ?REmn7V~Y^EWPeF8w*mq`D7kM@LDpuy6Q zzp+4R6y72KTSq**4ju?`zbDUvBz>QBmIOaaOFp`>7JkGCNuo!sSXDA2 zxgG2^gN>?W;d^aW72llp2Anw`JV&_Ojrb9PXLPq4?f-A%^N1F9DKeSPhH1HU&_sTJ zkJWHoSiQhPhKBktMmaNl0I>C=)~hqDjc@p3<9=4RF5?LBcb^~w_`&3Ap$ z%dN~W=(N{(;Tl$iok-eY?-qQ?dQ~I$}jpf+nistw6$t6>*08H$?Jxv`G(3u zgMNU%VY4{!S;dIY=N|Duy4jCX8^H9`Bi?rFM$o&!LGj{;MlH9tP#QY2*l_6`{*0{M z4{z$L&qx)C_xL1Il z#jh|Y`-o^xc==I|&3Y8t1N?wvWuAvKJibAV36af3u+|3|mUTC*)EM@3H|(`9@i{up zp=?iR33JuJem1CIXxYtBI5PVau47)D0eC7mK*0i1}z9r5M;ro$b$9D!>?UR%b8+vR%WuwJy4z!oO{?R}G{);Mp%e{B#vM~tUfdB2eIz5v zj#!!JEoqq0slujB0&e6%$qLaq=JfO0*~9R)rsAkn4HnK`dUmk!17m1eWg~FDK`cz0 z0Qd}nhh={IfRpmrNdKZfugE*o%w*}6aLF;q<^{6t=wzANrT{mkz()Fauj z5OqVS4`!T9T_WYjoN2YtGXAXOj3wp=G&sK}?s&Be*MgW7<>`WW50YnIFwTg6|FZ zK%xDU0n$Eq3-ikUb*-Z`(Is2I=@dKU@p$H|C*w4R;klO3jwn%}KbWfnEcKPvc^jeq zLvhlv7mxIkxZ=e+l8(Q$AMnA`MGnsn^%75nSNG5Ui^y&a<|44RseO`BcOhq2Y9~x7 z`}Ihi#O0%>i$)uMiO|h`^6^KPPxs;uzcayml-8g# zaIDgL%F-uDN)rz$^tY5u>4dx8O-{{S%bNBkFrioM%O12^B95p`k`-I#PpSpa6AK=a z4V-|dXn@J?;u3{!Ly`PZ`Mo%PPyITDe!~()>5}U`4ar zB0E+E2ax}j{K4dZ7w+)Z7NzK)^x=Z<6lx6LB9L)9x2}{u9c#)Ia=eA{%SU@Oj|Ksz z587O*We>kyaehf&#l|CV7$qRO zQS-MXv{o_ig|T`Q?b7-gjc1f2hFoM@AG|&(JG|t!_(D`g&A}A?nVsU^*(L7mH6Q*L z)>EAEf`58pegs~$(BA_%9L)S1DPGE63`yR}%{-hT9(O98s|@MCj-AMYSx3@_7U zlPEZO_JAQ(IYCs9d~`GMJ0A1@I4+!>Y{)6Z1*f%^fF`}^KPedJW@vS3K?+)7k zsGpWi5_?4P?@A6k86Ia}#Z8IRB|BqGsd5FHM0}5M^Fd^TIszsOzg3|5Bxvqx^5f6P z%yOIJdAjxIk_mylTAYNhMR7VBo17rJPnSwLo{a!sXK3ArLP$eyVE(>!M#Zp@@!ELa#RRlfVW|`DuEHC_6E_U}BYWQNTzNxPyV+!h6 zYy?&gUf7^-G~N#}-jiNo&X{rVzP5n31)hDt@hWy4?R1G(&2{_amW%+yP^Mm$8e z&Vl}lq3455fjouftz#Ha4NzM5F?dFL@LR7yyM_Nj1aAPI%fPV~IDUL}953i7{s(ke z>^y-EI=^nEV+KCY0=|}#1DTAxyPSY&fTR8FJ;0JL^gZP3Ty>T%d^TR1)UdN#iOrWr z+%asp9bw2;9_bV5VjRz2t_={cqqWf)F?EV5Yz9w?fa5-%?Enshq;ZFOW&NE|w%e9R zUXdp7rl=xoq@?ZoS6$JckRa4AbNxf<>}@!i>L z?xs!^O?I&r_0v-fzrJp09A)Z^>Y~VGR*`%x2RFQ$W3LSYrjI<= zEX^LS|0%PEQiw$H$;b`Bo%{iyllJ&hJj+MBIMZ}4>$H^q9TEQRk}RGmE-V)3FBNC4 z7pL!%Tt8=_dChasI~j0#l-Ypwe+8PY{ifU5v<|BCGh;LjXq( zr8)RD2<_wiOa#-f{!WeL+pvUePyLaCx?q8st0OXzet{I`8nRxvK~=2{j*Qs zaugpPO|Pxxhe<=1bUW(x+kL#>^94-gOEB+hJE++|?!9Ta{RaOHz42C>(f8=wr2D@^ z0qP{$fVsd2QSKAzIrNT+V`%53R)$MOxl@H+{4bok!^qh--~DlS_#}TBQz>I7%`?IEvG*lvXA`25y^Apk4COdD|lXCos-SY_Nww6+lJ&}C-cm5e{HxY+@hWDd=y%?n@ z=py@MA?iL)U zEI7u#z_FBFGC=o<>=PGBuW^wdn&CLla<`nmjLTN`Yu}PB+}F{3XJ#jvwN_td5RE6% zVja(2EoX&Q@ACWK;OL-Z8SK6O-k^c}svAJtMDS$1mdWUQs12k>wp6%l&L%^apD4@v zz2=B0$_x|WV}UvF0w&_8b(0NEQ~15I#A3YTW65~^AHHWv)F8jAE4|Ogk6?PBSliKQ z8Q?sSlOeq~8mZez+2*GjZokccadsD65$AVBCwCQOIPG@?M=@nO8=}*mt?TlCxO)$% zsIDz;oO|ySHKH>VL12IpP(UezG(~z)gMt)em#Ps93btpgV=Q@gOrFMPEU1am*v1$v ziON`m8fDOE6pf70B*qd30WmL8zTduc2TL@W@muR#|Mic#4CS7E_St8*bIv|{ONRE5 z%p7AZsk2|4AAND>cv-^`2iK)2?g+gFzJSGN~od~E>? zAJQLKyOMrofX7kbL3cLCgPUuboM@f-YJun9ilc&`vo5q?MZ+5+`pk_n%KXiITx zKSKX(#QJ)x1vm?|dr7>E`F_^x@RMo$alo0%b*#o`CUCbTj;o_pu519}Y#K23=kswe zk*6xoIxwB41Zn0<#>?PD3hPy$cBHfMY&~y2k4o$V$ihRnO$ycK2dZ zkFbaHG+R8D5@i`hpIGn7sFgh~sBT>$Wq%kbePhLWY4b?6vqhw0vt&TU_Wd9YcWdRt1T>+F>3h{XSSt1n&n#JY<0_1DSn>)6Bgdh3eT z%Om%*mvsYoSG%xRU)jg7zwHC1zP6-v`mK|?>WfXEj1#@vt5V1G;eJCONFH)swnH-_ znsKyVn{Ykf<&(uL&U34(+eYg4$Leh8&RtOsR~P5ukB}0Xjc4KSRAQV@Pu0S459cj z)EVi-W%%Cr5xJc4)LjhME~+_yP~)iC8`w*IgG_Z-wP(PB^Rq?2-)rB(_<6n!}V;zsiwvNSW|%l>Q6bD1|*>A1hl z_utX#>t;%BL5mZbnz90?h_B{4$rkKRtkiK=Wvwb&MIwJd>k4ZZ#_^5sbZzUM>zo^0 zKlQQxvgUR#9e4Y$0y6Mr<8l1M4t%A%nz3hF%JkCGO%t^-m0UZn!g@p9Ary@nqg0P? zx%MZ?-4*9|X9i{NzQUDV!S#+cFNmJiE97}J$@9Tx$(ZeKcR~(snpobak`0hlu+@@^ zmYXt;=>|6Z@k;taW#BP5`M=JEw_4?94i z)BX2i_%F8Vp*~4}UiT=v{#UxcL|^1{j(^(8>^c%XR)Ze9Hrg558RY8stZ%w8`}-7I z{~25KU9q*F!AEVq`eNwJ0Ckji(&Ni(K0I?&?aV0tJTmJA!VEBu;dwphc*YH5(4M(t z8iTauCrP?X0Ww8#;fxwk{a2q_H-R?dMy8V6uhP0bukBuf`%KOVS9bS~-3IFuzub*T z6uU7=l}z}2=l?yF?Jz7H%?t(GAUL6@MmJEQU!&SO*hj(mJ1=wkJAK;eIeq#fzjzwt z?Vy45w`HhoErNP`lpU1vp5a>n4kZYv-3%Cn(|CNXPKbRM} z%trHxwO#eanjhGTRxbZp&+H}atBu%4YcqT*#{A-Bdpc5GQ?|VN^mA(3D*LZ}yo7&b zamDXhAE~KQma&zZe>3~CT5h+FGAN2$t-i>W$s)b)Z&hs>F{6{VtgPnl;HfXLkJa$M z_VJ9JEQVMeVgG$EBJr_}`iMBGviaEDC3!g5oyAJn6N%piYE{D%frPB1nwtlf~0PdTk+BfP} zQ*HB1Wb}~8QAV6W!8vSJbXRYx$%Ou{Y5QFsDq2e-f34kVr`a&tMjiXBGmc13N~P~K;=Z0{H)^0M^xo2DAAGT7 zUU1(l9pUrT+*@p8Wg-x+Wr|VmUF3qw?^}PS0REdVw^8lx+yh52zJ+ z!3O0{aIYTcpr61Os2NdL%#Vvn9;xrhUeDE+Fv&C226kagX~pf{nr7wp(QIC;vYND_ z&r$+ln5&su|4j9T|#wz_; zx`F|=v>5wWSR?^-W96+H+gaT z_WnVGKby|-ZVu{igsO8-X`{G5PA4(z zx@oOla7#;P9f{kc*R<{Q$GOWXL(`vx7@Rd1tJ>%X(QK49*zcLR%|`bgKiklKPvK*( zlM|7FrBB5YFQ)CBUfzi5!r|iBsK%a}lj%-3-sP?`E-b>+;8#>}xMHb%9V*Y@_9zN>Q!butITj6kGd2sT7&OR51p z;-0tYYQZw;z0>1$hAFzD3F;W%s{_EJJ55-l?%uO_o9JT1dv0%Uu|EhSyHQ+ID$1;x z>ZI;saJl6M#H*o==<5?3eFaxG`EdLnVVYYmZ5!JXX_kLc`p8HcK@gs!%?o`D@kWf= zIM(}#e^H`(YC(%H*5lr872_X;cqIj>U(S{?W4ozWZtDMgA5n%&)lS=&c40L@eGK$> z=Xp}BgpAgn3)TFz$VQ!7DO%xIELL=3lk?-jA@1Y#8|n_n=@z%sZR%~vK*6>{gM#vR zFoPo0ie=||L}9Z*Q&K1$gjoI+$h8CBx8Fmo6dYc#f@p3dv^p=Djmm+ z&F6Ih_Lc$-)7t@_?+g+e1q_QlvmxS{^W zF*m8xm7lY9C)(&;#fQ6GNCw&6bQ4q6t})HNJJes*YvmFy=}OK0(O5oP4d&_VzRjc~ z6~8{X9;W>UH2E~S;Afp!(UnOa8$^4x(HUPi!?*x7=2Li{?uzmoD|M z+Nsh^o!v%XB8cT(@yDvAE=BXdmpL!%HMnRU$h~hF>sMBDZyI3teU2W_@EcEWjaVVj zdsczFVMYujGUpUXJ*#4go#^U!UBs%EyVBI2%XjtwHD;K|Jd~G3BM;LBP2TPlZ`kF{ zxY}19aWD+hZ^R^m-TJ^sNHes7hj0%0x;DW<5G3;2@MyL5%+x1?yMA({=bwXEuj+0L zQDdtpN%(0LW@iFC$(%F4V}@1j=dPobDioX!VHuD3=E z8l9E6d&;p7K(U_P@h+XiZ^m8R8#`6{CCs{x`Ufnw_4bJaHn@pqM2eRv#ENK9C%-;F z1h%$%Q%mO$#hw&9eHiUy(Vl8HY{_edART=j_lI8u=W-xlf1Os+uKEDR@$BStbB_1i zx%=@t0f`WGJ7v$??tCtpjewE4A&+zUL#4U!v$FUi=gO>gVeT>qJKqm(XcYgJt#_p; z2Dr}%9jkPlQ)9mhysi{z}U*))gK$RzS+rK=jHDzv`QJm&5=wL%iBXOz6n0) zO-9IwNk|OvKVIzB0x*c)Nr3SOV64ph?zeIJsp6%mvy-aN7iZ+_M@yb4HRofZ^tE`W zCr>+fZ`y|`MLRk_ujXmjTF$_#*n@cwX=8tPQvXWJQ%Yo7Ii|rzU2!WjB54{o+uiN2N}PAlR`;RcGbZygD!^=KbW;Ye0mz)n;ZpbzA3s?q zS+0;R7vshq|NPh2eUW6EXgKD4w6xjDqILFrhTZYzy%Glq47Ts#Gdv4#3`6jo)2^gK z$FP~4t8aBD@rI7FGI6!28X(I#)qfM?r;%Ee%q ho6DVFz=8}6N*;-o`os+wI13l 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ަIFq}zs%81u(!VZ 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⋐ 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

9iq)aiX!a*_wKdrkX(X3}hvt^D!0_52no3;a zK~A54Nk|O*54QmO9otuJ494FI1@jjg6S%OxATA%4-T|PeG`CxTdaQPlNpz5?Ba8WU zWE;O$?#S-&c?{Fj=6(!l$J!UBrnzmu4)?+GF(xCIOMjl);#*_{W+c;S2QX)%Mo7x3 zP&#fyCM2MpSuBU)Zgc_FF8&Tb2WswayQbaOe?2j~%Ep<_<)Ah}8|3QYkR(Y3NG%&F zI6rbM=pD}bJ%P@+b?^O}(EYwaU}c{|A=23R+jzQd9qN@4ZT!8_+&uQR9PF2xwEJW) z!VPoooELAY$IHAK_a;))n8^y*m$KU~_=ll!>jksvBihqpnJDaupz*^hUgym>xEsekNvv&dIW8!MvvCNq;jA&n=42-0N%sE~RM#jU4|BA+5!h^UTanY zBzj>4MLAGGg5SYM`U^ANbE?&QUWc^-)3aRN+Lx*`Ok4l5Am--P5$x^ic5_wN?GVL9 z+n7|-M-Eg>D(;$HRi{WLY$Tql;X!7$dtNjDxS#UB!8#l2{k)3TCSb#EM_vZs?;OmeIh;n?yTSAP4^fFp+_z z1IRf6Cj(rIJ73YDP5jG980cSNJv1*yDc?*eTXf}F0Q9Ot#j74i-8HA6;^i=YnCszC zKb^5jPAE>Gt=>@CR6bWd52pZg%)4UEoaMF?@Tz~@W76E*q2J?xy&cv$a$s$o#5QE8 zV>$4gVU7RbwI%Hzy7;L(er&2d@&g{*Huqi|>Lmh>2lgqPUGW+rq`~)SL4-JMD(re^ z2I!-6OIU>_N~0)4)<~JOtsvZVL2qf7!6R3y(_igM>vtn$%kSe_fsEincYC+(47leP zpw}0_uJ$C}pGfxsQoc;N!q{m*Xw&B27wwiyL~CKUbgH_9?Tn+A*LON?BAdw~DuBLU zsxF^7b3!;;VP7A0VF!fqfA7vj=Wb1vgg#3FRDguJB}m44DZQ01F3HCE1{oWM`#l=@ z?($G0nV&24Sz2VgOfO+m(8WaN^k}*&GB2CIyC7Jo`NOAN1z&>euo>`G>cUzzLmsvl zUN*UHc;b~Y&~PPyBKtvG;5l&^ zzdy|PN&GLa?Z9xxU^?JOz@Hw+aXCL1$V~zb>7AZE;p`MdG$yjUTe-e-`%AB+Vfw;PK6!V@s7r_9}ws564OB{Vb-_d z+#9YnM)mcXrVm=s_7rBzIChtiQ2obF9?&KYd;Siv!&r~lAHv!3%Y-DjexWiF(kfw8 zN-T55pNlX&ocZtg)n3=PTVIUNRM{_RIkP5JF;-n@G~U5m4J{^h2p=8|>E2ySV0 ziu|z)EmCUOFVQ8(gNUoTJVLU{oD1a47lp(hxar;RB@BH$+}LBlT16-0xzPg-TOlFN z9TqeO)85^Cf6COXR^+GM?dtC26IaGKMi>w3lr9PL8Hgxjv=*QZ6cFp!ds@o?M+7kW z@jIa9rWS0EyT2Ij5w8k2ee|y}ele1TGl0xYH zc?|ve@QVN6Keu?MLsDqBL(d~j`9Kaunubah3F+MgRuk4f_sqrJ&S^R{4i(h3w-;rmy%fk-TH$eRtL zjLB*lvpXO7q>4@nK90Thm#z@Bw&K7TW{20{ewsKOyM^}?oUM;fNrZSxI?Z&b0rsfz zRumvuo=XkiC@}hSPFd#}!nu)rFpJAH9aUOf=3`mOnViaa7J3AdIDU@AG@IjJoX+V@ zcf>?dIkpo6SoTD$RgQ5yASLxe3%K5)R|@}Q@Ba(?cvuDdYpC-AwSC}<*B-;`3*|zF z7wuo1)CQ!xM3c;+E>-(AKGooC=M$RTyAvd+RkS0;&jH}?hzm+7=(qS(Ietx@5|9^v~Sm%|ZY+o(7$+jLt8-)6Q$ZbZVtFL>B7L=r->3qr*nRt*0rc%MTb*WF=UktTn?2UQsku;N zi&bg6`2RTj^0+4Mt#4jP98nq?Mw!O<(IVldX7h|Xf7Pqyp3>bjUnaqC3dEPs4~=$ocZGLyO(qd*A@leTz< zPHXbzAfw|{@~2N2zed zfrKE#*;i3#O0`w;UbjdC*uZ&;RnGPI)#uujM&h((#tb=m89g<36Kb<*i@!amqdr-g zm5Ck_U)+P9F_(RJwynN}{g)0Dop(fo@KWD7-u8=E45BQ1a;D47{J24#!2{v)z9vnaBz*3qd@D!5t8eS?7!y26M?yO@=p&RqgiFRAYU-NiS&Zu= z7g?|kNWMx%$|3TL>Phl1zmTUhJ7>D)tWSO;du+&i@op4AX6E-xFOF$I?U}C@A!$lc z#jMsP)ZNv1rl^YNuVleWzgb*hOXJvX9Wf~rGK_3tMbDSm{l2e)pS`ED$j>`vD5Z0x zLCZoOBc?5-#lFg`>(HsnwuMrqp*yC>%pbz& zx5}kjva|5YCYXogdO4e67sTPR3i; zk)}8)B7aJ(`W!NeG+b?zXHaW$ans2KAY0lHbdkHAs?!$V6rGO5RMrgQLJ?zzq=a9> zGo<68dkOt%KLmNPgXTu)On#_nVa!udc}TY#JVruW4?8_I^tk9JV*-``M;?(h;Cw2#x&L;LxtSK zH+28@k;DI2-8FLzLfwR(j&;EP75u)vJI4Tgf6wPsw+uKxtml(=KE?xf!I!^8V;)Kl zX31~LeIv@g8>3)%53sh^jkjD0`tH#Sot^T*@+cG>63qZrs@oY_nb{ir3kp~bj@WuM z!l?B`WMaItJI-{m<+sjsF`kFch>{8SXL&)&c!o}bk)j#1ro%qknASiUz`l#O~E4X>s_1RzF8 z*RJ?nkk^u>C<0X_j_?dQEWQwd@eFrVkG=dO^FPuzuD3d7p*Y-R4{8hU36&+1fU(E` z&IwIGIa-QFh#Tu7Hh`gvM|r}nVt1=b1e|GWZoOeg3+2f-3VsA>=tH&_idki@?cgZN z@!oCXTg6{}@T$?aiwY0q+6fZOUc4zRQ)aVCYrP;1wZ-Yfh!TJ-+9*_cMN(opufRB;c9Sir$@Xs+D4VhZWe!Dy&0bq>^bJ{v^6aRG^kk?;{LtQdxYhRCBrb(ppC+h>qs<{TTvT zTU$b~_}ZI)b2v?^7K7Pbr+>m|&`!H*!t?_|5<(iU~t<&i+AG>5d-^>bwp;TL;bN>sW|Fs)X5nO2lk z+*|~-&gS5PL={m`CGezspY_|`UkdSe(YT;Tn4DblzwLfRU(4JpGvT)bw) z`}UoV1+N?(UdF^Ph#K~Z@%{NA3D_!`%Bep~;+{8h-;DP>?!o*IV2F3py&!&@^9VOK zhC4aT(!c$k68*G_;Fv4ty*I}2<$Etq$zz?Z_O?2vVR~Kd!~CJPsdkb0j3q~PQ@-IC zz~3sS;qM_-Ahx01Xxwml8n?uKQwbt*w%fK$qx@t7Vq6}B%cbRgD-odtFs8t59|bCItcGjD}=86K|k?v_c0VymiAkpm12AQ zJI0Y%yjNTHU$%ym(tf``_*C)FB71~$*GkwInR-(tdpzwh^3YgE;u5$uW_x!h7Anq4+EeZ|wR&b{e+6i@n(xTrYU z_Fy>0W#e$)jktd4S9x_eGNF`E%n$zoG^&SXET4=mXd%KR>|v_FUGJ_p^qGS53~>W+ z-f^6FWILVrN5C}*Cn6>Y{74}5Dyes$>6U3NhB(4($nntstH-9kkPm?x1MyTNhB!nL zE@E3GS~7$8Au0ba5Ef09$QEbc4a$RG%%tFrtV4BZx-J83dDA^c+ig(&znQhQHOf-I z>Ww01jVQHxJU<^5Q3La?SGn=CpaWpQ;C2Oy^Pk=`!{>^-hsTjK#)}){`a2J?YaBvvtApD!pRXohCjn1i#nJ$%0 z(I1}Wnd3bCfQ6a#O2>@|TY5B`aDj>cM$d2WZkvGZ?WJuNPx(nbJ;y(e6)ChPV(^&K zb0|$<&Q*L$*fWx!z4+Pg`I=025Y-sTzu4nj?$!@mVpsNjkM%t5RgM|H8i?N_yK6Y) z$t{RLc+W$@$yYBTK4}FQwLMC3rK5lia=48&IlDwi^H73Wnx6moCj9!VW{bD>9Ro7H zbLn#lq&BXZPFR(e3KO-EjV3xcJrwi%<0^{VQ zAe@sek+rjq!pp~Qw-y$V8>f37l#E!>bDbjO_#87NJ%W2s;t`AM&=%@wo}{Lpv3JOT zPQ*8Sl zWzq{Xg?1W}sGY*1tUXx$rL{sV2 zO|OLoRJBgXl@wr@{bdLl#64Lq{#KHR-h=ZSW>5vj@n1l_C{cd*1B4+nU zi)`Suy@1;@$s=ai*2=FO$lA}mt-knZxHahO*Q}Gjc-dAQCl1J}c+#&V8(;3lT$`Ro zx~d|TbWT9dfiv}n7Ac$m2HikH0O)gw>jOv*n^!Mt)G^6grS8n>D9$TCn>7s3TiN}2 z+ne?2&(rtUrjnu$=pRv=?4frIcr>W5$FR9fjVL3^vfno4gky@e^YCEL16_q`_*CM! zpwxBs@<}$4GTjr;-Ce=UnLv)uc7dyGTv!{6xevetdJ&m_D7C2o2to_$?n7Q(rf`5~ z{(7YwmE9#OcH*r||6&{ii%Un^!nxWh@&~x)|4!?ZZK)D`w{t(hiUQ)6?$b00cb6bH zc(k47P6&1U%kvE4zmXP3^Sj0~WACxEHVwc2MdcC&kx|`7og`!N?)f3egk^UR;yyHW z&Ei^@>pZh)9SHrwnfuJ`gT2_viY+vMX&#eIxQTUwtV5(I zQVULpgFMDeH?BZv^I|NRbVhJ{rwzBAZEk1s&LJs3T}a9g9Rh!|8{6&&fVW!W#-1Px zI5X&Yf3B!znVg?Q5@v=|gE*OOKKdF+6pupf%XFci@UGYk;7Q=cl3*~0CGWZPVx3dj zScJNStSM|Z-Rl+qdLtQ@e*mfzIGEZS@S%7y^DcqI0|jiowQj6%qyN4CW1mU*3nubP zO4ypq!S9I9*SupAV~8mBIF0adh*z)8M?41MPF6D(zMBO8J(gfvH%4Im3)s}Mf9kRm z$Nt>!$vr0VTR?+4#fu@bCO~ev+Y9gxe0OlJ3pxQZ2A)0vAKFg)S7rVi;_d_%Sv$7>c#p zL~o1O2N>l7r+QJY|dLU995G@{DyOEw8-MVH1$$gTCOM6Ze)qQR}={TwZ zkbkDPddg5j>#TSB*gwvCEEtx!%P5q12l%h6X{4(g##?+)j2s;c~WS5IA+dA$94Fw>_e%Sjoh8Bf-M`p zDq?TpGHY7aIA4F_w4(jKz|lpvo>Sz8{KDKHM_kmd9O0mbS&TKr%njcAI4BGr%h?n9 zEytYa`1SbkBFE_g^}fjQZKrd(lzfvksc_vaF8 zMic6CGIwW1KK4ri9g;*fW>k2rJl6BR6>KRf)h;aT-v(51%#DG?{qKY-tmW%Rb0J_9y*HdoRbEb5b|c(l+EdDWEHyKJ zjO=W1^Xz192rUD_Uj z?cMhSt+H=WTNq>dlwTh1I5rm(h)qyo`CL=unHkr=4JN@tyuYZ96kqx@8g$IYkzfnV z^bNJjsv|9%gQYL+3|S@H=uBQCb?c{nb|^|-b2^#HHcDl$q24Rus|`uCcZ|ei_R&1i z?J)a|gr?&IaH|_~B`s-l>gy+htxf)YlnK`2bo0038w2kSX;ESsk5iU2Q*ZrrW*`5e z{OSvpW8^X;n=`n~E+%Y3U>rWDz9ddlsF@!3CH(Bd9C?%G$flqw;$CHyippjmF@9nX zrg#n_hx0~u#SF(je$plllZnq$!$$uOy0@|`FK?4HJh;>AHCv8-e05f%mr;qPF1C+$ zs!g7u&5M~`AL9n8?kjwqTLivR;&A$>$c_w&P7P_BZHqA7lH-eK$p809ek?aj-keb3 z7>8(Ha3?Wtq&YgF5@Ix+aooXyJ5P%gIt!W>Rrm2Fw4Rb7y9%#re*s)n;k8Et^ES zIi$;0_F`TK@LZn}Zcf;vGMae7w1KiGTYaQ(Fb4Ml%b$rgrSFShxWsvQM6oPJHiMqx zEs4f-<4;5QTi1U@#SL4?=K>BrQ0HPx&db2skWi2H8xOH$Nq7ov>SgTWJf<+Z_ywze z=tl7sCVFS)zM})UX!)gGqqxpxR(14(U6Sec#1G}Nd%tUHg6gG=W4W%+Z2$NR`&p@G zo*X4hO+~iQW>}(b(RCfdU7~C1&?*gW)7c1#OO1rNJz``H6!A-#AH54kTlO!qK5$R1 zWRTf*L8sy_EaML{3id^cM}X(=Niz5d|BLPjU76*{McptTal2)s1G*%RQP2ZsXD0_3 z2@?mI*~}oG(+{Cwd8@*%Q~7cr;k?pNJk{P9VEJolu$TQ^v<*(K+Ro)L+GzXN=V_`l zLpUV(W2I(k@MLdV8-Awb4R0lQ8RW;#Jq1&FoFWAiYN}Db7&@zD%sw^fr>*)hJ?z2f z+P6XTmW{geFD9~ir`qvzxaDnwd{M}`S^P9MJx0jY{de6IMRTGTHbcPID%3gc>B5{2 zIRsqY$Fz@;3YPv1$$g8A#{a_J%Sd;+5Vu^b6lK^eGbJ(S2Uu<| zV%D6VTD|aq=(uCGn!Eg}ocjfj6Az-x0~of7q!kk&$jk_cbK?K8I6CA#Y;KMdz(EgtGe?Y#BehbAjqzDE=ji72GL?OSIUea+RgvJ|#Ik-_7If$ec zrE*|kwlamFDB+)F8V9fq{~De3&VmVt2cL?KY57Pzbzk1VSFn#ugUk)s5rKWZ*nQ?Y zhm9fe+F^Mwp^+I3UnDj$Y^6gL1JN6*s?XG7ts|G6UI4vU+M2J!zrd9YMCGSic*&6A zLHginlDD|N4t*Gd$166_$Q-AUH))&NvCs%ofLkO?658;%55HC*#|Koe7T+Sq75F3T zhE($gt!ts4c>E?%MLLOQEIen}hxA!TzfnRuC$J9*Qm%wMnLVwz4(U zj%y4>)(o7$?m8C_${2hq>Z-fPe}@mQUwn<%vFEydFgto<#|Jn{Kc#(@R3#PFh#g8- zZBwHIJCfHWe?=RJ{z-eBYyj_o3~F+-9dX5rawO~6gJ-%^olpX`alG?}wg6HFl27M> zBd2@4QvHvf&X<6XddG!1JwJ!?|EI!^`D*UbJcp_pPNEws>|6oFLnX*RUQhcfFNXPQ z2cs?S`WwXAoWM&q_iOqgfg7u^I+8Vw?E}F^r{K5k%@j8*$WH56kp_DMINJ6Kp>HG? z+%FBlW?@eM;7`ygJH=5}xJprGRzZWJgjp_EKo=YN-|RK)MYVdb>;)$8aB|Eq2iSSc zud!cikwdjKt#cM1%L0Mbr_T!%!^PN-#@JKr{J-ld9ZBR|c36HFR{#6lgExj*WU}Wt zGZ?uB^}jpGBKx^`kSo~!yDUk`zk#A*q+Qqs&w|7^z3MCXLL)XNhLwmqtdYNZ#a(B* z#9fF?qy=O_i(v=t1<0qgsv$2FB?Gv&2*JMxtDCK1HjcGcGplVeSUGMl{AuD-44Ae> zrx=rSR@Nu49As}cPGnsGyNoXcEwxm@tm57u!u2Q~1eFogp)*rQbdV*2bVe^T6qhy4b|v4Q*KllOeVvW!i^@ve|s*i|9X^nU{`2Tjl>f9o~BDF-!vbY6%e=|(q{^;-sBGUE)CLao<>vr@l))5 zgcw97a*~h}0JGzuhEw`-p(bDoJXkygYTuH#V8LQY2!-wLP*|c<7p*BBVU=ATVcV_& z(u{{heEUc+c7R&6_5b0qtJp$zb5CW2zy(-u_uaiHxMl`~xc>1w-(|(TafAkS{*D+?z;Q^K>vV!_f3Ti%a z3brAkB5E}m*qj123F?GpBIJs>`lCtnXzv8QlYr}y-g&h$k5VZZxDjREAhPDWP=*r= zNS6seIDh|WDLLstcxXwG>y|}&Hy`*H_vz4+FxKN_-#v2|rpHe9ej6>|Gw5l5Q_V;C z-OA=IM;$K}W{P73PcNOZ6gBdt&;he(M69Q9lSCg9b5UN)eCW2><-Z$1G*;TO!Xt0m zhxAb7C?pJFbJ>=YFD<%!hINdxZgUT!Io2)nd(-cMb4uP>+Vdb#_c<$jG1t1!S(AUM z$NiP-w;R5kgs~%?zRsB!bcrpndPG`ik1;+6)~e`6jLC18Fj^QUr&ymoS=HVOFdB4g zhYLFvvRN2l>igEN9|48d$UXtpiYXG--Crfy*u(U6408xSfPA%wUZZ^ve!oaChLxxq zNiHqnpmaP*3}CRFi3#fQDx{3_-Vb#fUOU+Q)^MxyZg_R(BvDJrkKBpO2jEn%3Nfzf zi~{MNsS9lk*!4R|9+6JSzueu!&*2kmKlUZ6R7#ZXFi6UB}&q+;mdMD~JHhmujE z8}d^%we6$b?DI@y>6M7a zkJ2qG@-JKye`xI=RxeqZF43MPpW#;!zm)0UX;33?9 zqm%Wa`YYRTK9u}bf(4Rm-R;HSm&gy!f>kP>n$;okF10b+&t!IUGVc&{Q0S|$Iz^|A zm#UTVaE_-ezye3~hB>XePH=>1ChlldtWs-ek{PI26P=!jL}>`^g>THw)S#UupGVXW_z>?u3y9En*^h zh0t@lClhvq-^B;(fO^nxENF{2#G`VsviRdc`4RkV$?gaE*^n1hBNjf3&tHLaQnIS8 z?ZvW}%$u0g8K+L4#+@jU_ze5wz~SGc_>Ri)PCfdr6^WS%pfyOxFQT|B6TdOqcJ#08 zhYw_3IBFRxt{%!RSx#{wL6!@C$ze37zK6YE&xT)Pka3SWL?Ly&#Jf}pa4$jB8a;(+ z9wpW43Vh3kUuPdwTD-5bpUl%nOIDcLb-r0VvyAxz=hkBQlGX?D2F>Y3;b;H2R&4D} z-H5rs&=7W-Z0R8E=YvBgT3oWV`;uRj%HH^*>XU)NvgHNWeN7F{<}JIv_$SAlsy1Ec z*po9yNh(Wqo0smLQ8su@x~@phOx?IP{oS9f*;z$Q^m>61G}k8VjXotGJjpl%ws)aV zKz5;j7V*#M!_|WvE7~oQeWMP%VFDq3>@rHanIh@IbS{u zdDzo+@(i`Py<+Ps1Uld^WyxRK-rkP&0j5MVEL%%6%CWN=#mhbgZx1I5|=~%?%h(9^WjIknrz+_wA8F#(xb4+UMv-xI#@jKtw?#NsEX3@ILJ>J`M!@S|^ z?;N|UyHjb(J#x#YjPa>1xd4n3YZ0^b&9i!K5m}864f)(DCMVo4HWfxs6m$qZBNpkS zfI2K{NadxHt6>pytXn>Npi5c2CHW_{FS`7TaUr!QE59&ys5dZQO}}KWWv-d0dEG%; z++Md%C?(m^)A7NcL8t*tI*2%xNIdMG0uu=!{zr=wI$V&+7MZsy!K6h1woBnK;ydr< zF2p0vJ~Jm9h9N3DorQ9@rSG*mn{rVwZgT5VN#v!4Z(PsDJ>^U0 zebOc8up3tqPiJ1YauA;LUj}JDFRR;w;AUeDC}SGbj!+FS(j-9`6nQ!?M)8N2KAEQ%Jd!V*mpSB)qRVp`?d>i$XEwi=EgvK*c^!DmhL@fxuxyt#XS?R_1Kc<)tNLO3Yuw>r4(gXI(UJ$GTCXRdQ~tf!!BF!#^N+?oi_ zxUJ=nZX4o>w8TDlelED;7fQvDf5hjuQ>dFPnHnT}#WTYC+hryq^rpSY!B_OxAHe-@njWtk_3vNPr=EZHIYfu)Ldra`xZax%Jx z+McL`Y6tcQSdn8D4}@ZTE@Q!^piOtNl`78z<(f!Y0AmDI%K6vWoTrNCB;`NpiLMHn zhUm{~+Z4V@bYpUH{a-JrtP!tFwq8F(zOsOR8vPIOYW8%!2I4KLB$H_GH1DS#pW5ef zTI=l6rTi;2x$+pyI)->q))xEpYu%46?v|Z;lUY7Pe6?~%#J|Tl&4f)NpNP2^e*by4 zXDJ>($?eGJHxkID0ytPhmd+y&jnBtU?83Rz39d z)EHg=yTi+FSKPwPVwS|*p``A?u4*E{4SHoTHUKUi{NQKUj1_86l*adfrLx9#Jw_Mf zd8p}Udy${N3!D@*Zw1_uG|`!K8!-VWSolWoKReXk1TT>%%F&XwHcwLw{=UgC%9o&aKC_(NKzO} zE{(3bp!=j+sM2vCdzkW^?lE`(k>74LG zGeQfUn{bW4kdA1mNdC7R4YpBj&>}E#)6JeoUJg+baw7eCq)X~G%d}k@>Va%}GFoEr z>|`49&vKs_jX%>ln=tXiaNSv!wXwiDKJYH?m#|@l_-qpH_q#li)}R%+Z$dgWlE?Z2 zgDlX5vc>1>^cRM6FK-GhKSLk?j(R3m8LQxoihV}Zy2tEONIhAF5CVcA2 ziqr$Rk1jl(!+i|LeeBFj(ra(G?xxKRp$7hV)?gunqF?oYe^_UFS=H5V4(-Q}8BBCN zlJn07u1Bt`0)GZcCSr$ObuNl1BCWvxj1PSO@j>8YH$Il8hP})$!*!-wFvcwvNjq_E zvR!V&b`kpOh~T~njG)-52W8B7WueM__K$HDK6NCbpCyW=C5^aXp zP-_soZ{~vJ61&U$Pa?2h9W_&SNX%3cKu&v;SiaBgq1rIlS|!G2u4pYx=`Oc+VREIo|-lb{dia(WHM!Xahs|KI;fdPkwE zD-?epxJFVi&Zn3F+3Ou>V=v5vZtfM+Y1{|-ZOG;wiu>q!B%oW5R7~uRe=(p(KGB`- z`PvJd^JQ<&3D{7dj6mDS_kOzPE_>qb45wOZgl&*yjPVSsVppPiloQ20n`E+*zdgHH z*2qV1n!(jwmbly85@0(G7dURlR--X{f=A;F1w;h@4d_z8P1R8G$(&Ri{ER{Bd9%Ca zRImDKZXc{MtbOt+(i+=>COE~~!~~92Ty8^FuulHGN&ni`#kIn=(NeS zmmq%+t$A7x2!%=#v*QvIblwb@jH8&H&_Hhl59%*#;36%X`lG#CCT=LQL^<`2D{U>F z-GltQ96Ha&oPWq>{I)e$a^ZDR#69HAw=7q4vjh8!ij-d=b7=nD z=*3!ihQ=7WgK%Q>NJNuKt{?I14wO)$rXUDSN(0H>LdqM;xD0@uuINnksHy-Z2ABx{ zY6-Oi*x+Icw+5&_HAsEvUTHj)Of#9UV0I@CFaCwuZra4${i+Hfj|9uv1zVvoMec3$m6SwM8o}k6x@PiU zgCI??329GqrQ%Dnqe*8}l7AflEiXIP;h=#`F`H=s@q)&edpkPN3uSOe1D*TFSM(PX zosLj+fO2*KnbV;O!EFa*WfJKDk{J*6LXia4L|SiTvk+r~zvh2YECGJ)sAs=JUG&Dz zsN1tFZ+p|SMRjfU;#I%DH`B5&S@v~lgl%63plV%}asNQ7iOstJ^A>hNCNZAE2aN-b zFV`~@AfrG#QWDVynj^(M-}ZHneM)aQ6aP%xvq>I6<{2xouDS(5B8&zS1h;*wBq~wP zn6j9!t<1(j)}Ox(KQC8UHbmL>Y{1$|ioIqtGe$$}Zso7_OhGQwSjd2PdixX6Y{oRt zUp#1XpPYb=MR6D!%klWE9n%uTK@T z;8;b91ouud$cWE6{i0J96xkOHN{PiEc)7tK33gXCdZm4h@XoiOd`;JIi#JQo*F!bI zRz;;KT2Bx#esR;~7d~D13ZFg0vw?mpr!`CCP}z$$^%q+2m?N~N7%dc|`}Q6ddQpEm z(X*s0(L)Y`86x*>So2$C1H7@tvK2DrrhYRI2Q_e)nK!P+qY(A(fmWk2-K(_9zRu{H z=b?~A_Z#rY&1~N3n>yDg?AsyV-fX%j zy=LG4#58$F7I*;_i+F|D4I+}ajz)M?CC;#423kNw682)Q{Hpyo*R9JlizII|+Z5gX zM0PdxQ%x`W$$ze40*&Kc=oEb~{D@h?yfP$_-%eZWJ}XMqD$5WHVW&l7k+V}{`wVv|B(Mh{}bq_u}XXyXq~fDEWFp0c{^RLEzV9a6s5b< zey`buxRJ6^Q>bV(6&0h{eNKrfOrP5r7EVQS87_8J5Vr_)^qq=bexGqTyN8{yaWr)D<6XnSTApGp zbeMdTtY9ML)xy#wuU_V=j%LJY~}L>AlvEhLq&=p4&!&xtsduf3ITn$CG>hdo%pHb@XD? zNI;BS6%=L6it;>c`?PHG;jx|sW#j9Kd`J>|I$!Hqx&sDmlQIs+WaQfa?&#e?|QL{s}F9J@C_r*gbYh^j|~0$$rhyZY8K zdlK_jtDVJfmA$C9Wvit9WIMA6@-^=!b~l>U*mA`OZDn&F1U7`)1$*hX6!?csskloT zR^>hxxqwsCQhq^pS=}K|wJBa=YL_yTep@abvoOR}TO*F^*Cc9tjGxU+N>31hsOR^` zEa@+wAHAhyu$5Um!4rOq#0ZAs=~AZuhmB5{@ywVEwCXG8mdJRT=OPhlq~V*zE3SGGe>Yi7VP5$jb|PNDB=ynt%L+}5g*C>QWOLYw3;Q13Ec);>$=^HU zESGD)$qqgzdD1?@z`^hr_|}o5{Lpmthmx>TLGE)G<(xElZ=GNh!hs9>U|cAy7*+9J z7k$Rg<#k%0*;+*hqSu4Tz_A+fk(U2P*eoC(?zc}2$w|Ff7y|aCy<#-=pEOr0>3lh@ z!_*PZA?r8NlWc1{3uKv7Jm(xh`yfS3=f1E{`iSW3(z;w;_`Ehs`dt=B)an8J>ul}ahA>zHt$bN zRKv+(#rla?BW-n2%!)@M)1o~i`51Ajo_}8)|K>P8lAV4yNh%F{G7Z1cUa?DQxW&q;eN=4}yOKx%1?2>Ykrwf`)sH9j1e`BWN@nZ?b;eb=%}Xgr+Q zi^T6t=QoQFr@=}C$w55QE9NrMU{KH?Db%aw-;|uj?u^zotqVh1OEk?jVIXv1$>Nv- zwKYSAOTtOdfxa95ZeOPD4Bl#ylME;_V)gxGpIjL$S{AB6Q7lhPZDG`9RN0IE_|Z!F z+eA?aoCWUpO2sa+S7@xGp)xSmT_8O;26s7gsy5#zzgeKO$q1!7twC6H2fin=SJ0|V zXV-`}4(680M{}3ce456r*GLWtT%5-Y$&~+2*NnkuSFj($rM0*;1iND}>b}?}gq#cc zI)>{vux+9xyQ!D zzY@QUQx^FYm4i^>Wi+=~<%#%ty(r-_6LT+*(PI;6*Es@S*&`3IKGN%^lI*e8xEejW)A#r;AnV=XiG#%(Md#UE!rvhEzk)ef-K z_p2NloG5=ck*mP^BkmrOg~I&6Zzzj+{v7h8V<bH z0>;+JPOn#C8Q|kGJG@5Ab?%_CGr{s^Ut^)s85^9!l1Ky5PgHwq@8<{F(dl+gXABA$eEiDN=wPjGryu)#iZU-%q5%ZRDLGF zq$+D=*>FpU*EL=CGBdP)g_qeXn%H-$mst`k|DY@_>_JQFoB1-+C`+@hIh$Du%ci>> zhLnt{J-??w+XY$I({^;9L%O1O=NKmSM$VAlfDdmM*(pKywZ%uZf}J)?hFk_>0m3Yr zBq)wU$IpQpqF;T}C5O^7=Rob+ot~_iH;O;(*D4#su3S{Mk?b`8y&ER|nS1YztQNS| zuNWphgx^fTLx&+>Dr}R^*~esAt#vnsar2_BFFrcaGPD2e^?QQ$>;AfHf@i32@HoWZA9@1L=72Q)(P(csmoDl6ia}pUCW5Ig%kr!~OR3re6c~XuEA-$VmP& z_E?MpX}1@>JW_|WmKVZgpUS8}N5Yn$y=>}lSw0Q7XtmDrKH%vfIkn92dcDjYQN0cX zz<7O-J58SlFs%XEDD@k3g(ZuZ*#}PGf<6lh`SR1ztB#jWFeW zadiVTE&GGSvby6}Yxk)A|EoZ^FLu16zXuJYhZ1HyUP_>2Es$~e-TyNAn<7#BwGDZ44V zy_Gqi_<@yq8l*5o`LUe?S~xxI^Ok>(ym0vdds=MQrcVv$wjKO!NOkCo_86V2*egG;aTOsw<}@(a z0FSRt#nDxHS&RmB6Ph7>0&{o-pUjLKJC}`&d2Z)VD+V&*If=HJf9xCngbuIRO?GuJ zWku-=y{`S~*EzlXok>sjLWWZwBW$n~(*08D?g5^W@>u?5=79RQ2<~*krH>4p%m^1@ zge}1|i~vs#rFLUMoz8J1LUH<$Nw==aa+%t&x+Mv6m#Ox8RRr&9ZN8Kh&FPxGG-IodMyGoVjs z&(jw^9k}%%zCGCOaEwasDwSMpSFcGqJ~dokwPdXQf3psVTzqXvzp>U%nb!68X7M49 z{n}^Wie?8Z*4xApY>hrIY=r#wz_QD>c6MgyxH2Z_D)NE}8-aOVZ%BKCHdcO&fFQ1x zdU7cF%_+eqc#hH8S+BLHgn1+QkqoS^mVa_Dg9zRe`OZc|w)>*8Jv{jRpD3=jfxq4E zLvrKpq3;X4f5VH{$klY^ZriK$&&-wHoP&6~U?U6b)~}a}Hk2>$@UnqWXY#kgY9_wA zNAy*gikmji5_)o>uOTPxH~zXkI3}U&uc@t~qvCP>d`-FbJ?!6tE>H8O7B}e=BJUY3 zuO1a8_usJ|m6GnaCFO#yw{y5+XK!qaZu_e@?GM;J<%W!&-`flRn%4gKhg7zi*~2Oy zLRQG&PdBoyP4-iBCh)RYJ+owzP3CG%{Za2JP^q{&`JuXB#*}&SQFPf%)}E8yHAe2z z)XGXkcI5~cC${H|t-c)1UfjZa9k1)Snce+nnADqkaKij-Fr>|)S>(q@iMHYfi^Q|V zinDQ^)bg(e!{4QgsI4Ago8fA8sYTUS+O9u6u&l~svMUb6-V6Pu_4<{Oo<;ok?8#?A zgyRk8LZ0s$Y*`HykGKZ8H>l9leQy=Jdt>JZ#z*k?^i-BD5d4yc$rQJc#7fy#+S@pW zSW;hn#h_w7JhtSwvvX9Is_b|F`P03zOhdEF=2cmaX&j-addyyAC4qa|O}@mQ-cv4OYp7#k4Xham8jc4Gl)}PRS4SfL z$gDp*wx<8T#HrPp2rKb3v9oK1CG~NYk6zi-AC%Z}VJAF$QirAkb%u2PqF(R+4wD=- zR(&^)Pwv)7WtF|a*$3jjBgsen3kFF4N{^e<=W*b%GvTAH)L+bFYp-qkhj=R6^u~Gp z2uoc<(B{SCL3RX(TAacMv$3eG@{QW4|QNHj6PHBe#Ty0AV1o(plFL;7<-me*eU{A;n9`N5Vj zl>O*rP`EFN^N#X_-y3N8!eMf_z7Z!cO$fU;z@scVEV?wtqt$h!cvR(~qn3-}@0D|X-E!)GvBW?NzbOPP)D`<0)faR42Ii;o)N?fjWc_pAO2iW+m zulpT+P~C~6uxE*$vCpGaGZx(W6w?dAW9v70^_>~%e5wS|WZ+8(kwY6`dO}4X;1mv{+sFtgF8?z7nWpzbx*g-D@1OBEh(Uda*L?ZWp*eW8)(dd`0m=vy=8DfV;? zQT&l`hNI3A*5v_UU2ZL9GUBN><@9VsFFxtfgCXpvPX@CqhE@$)`)Xd_yKZrY862eR zUK(9?=^xXX(*tbrN)bvchde4$uGY~!75c&;^aXK3y!msU7_KI+?P=b7b}PaHKG2LI zzKZhPFXBy|F|3xQryx^qnya&Z6NDsUKaxIk2m^nmqJ;P~Y291{R5g}~LB-nH%o>xb z%;jop>Z%R)egrcRn@|%yA9biYkWbRo9)1DE2~l>{thIO@ov3}bRGy5iS^jHQL)!0Yy{I*!VHi_;CBx1@npAGKRYa&L%D-qGPnhC@W9ZXym8G)7Zm<`O!g3R;%UY z=LocWZ&k15pFbwj%P}eW6L#v}-k(#kvp47X>joLp=o|^^P>NTKv!=bvvL~G@KJuAb zNKhcN3$XF#SXZMxte*T%Az2da(R<+MdueKd=o? z*q;6E9rlaJ1p}Fl%hSNmLHW_(AER|pj`g5_3lOh@%XPQAnv$HieGaLk&|Bbi7w|3| zb{6uSG*m`B>cp`?=d{u}hw{Se-E|V7JdC8fY)nRx%~m22cujmt=w0xo0pWW8<(@7K z@H1FwH)M|!4-~jrOZ5ly!p?Nn2W?!fF590OFIiaN(N_;;zFI#3fU+ggo`-oe#61XM z;B^G`hRkICj~B2#(wB{n`}3zFWoIwu55-K-u9PWg*HAogDrh^T;@va(Dp5vC+2-g@ zd)H>hm<>w2ru@hF9n8kLmc4z?#8WF99T^s{M;F#5P7Vw6dNTb7Ag*=M|FBuGEszgj zrZ$Q+De?r{Dz)Cu6h?WJs?u|DS&E2iu5y{XwMC{l2v(O8esPE*!lh@*n_8Py>_&wx zA%?Z<8*Sn9S1Y%MzWu1)BkMDj@^)ZTk&PhA8RmPK`^I27H`+S1{;RKF%g^%7=ARcG z9_b06X0b=wT7bXveU1PIoTAiiW^)(S7`TR;3&^FEa(&OqjJnV1P5%nm=qrYa|JJ{f z!^_mRyoFNPQ%u2hvGMi#L-UzKQ9+0dH=l8fO}R)^q&NOqgh59K)1cFfR!$RvMtcg) zNA$yIs0qm;r{%w_6D<#o6JelSh@;~5rzr^|snla?HvISwuY&~d0B0WZHtA4b_*{PU&cn}3vx#qE!_jF-v zTY?6}%ipOGHv}&P77?Z~n+z;3?8yIkVY*ia#k?^m!OKYZB?*_VinqQ7nz7rpH^x~W zOY8ghgak0}huhi*Niqg;bEjE02mPH*T^(Vam-Pt$SGIdvVzemI&G8 z6sszueiMbuVx_D49UYeTnd?`aWg}Dv+;dQu_|%_X8(N zJ)rT+4wYYMxF9tAywirXPqFusN-#P=Hvv$PG0oy|gkA?RfX(}@#9iqq;uMN-oq}^H z3p~qpe3LL*Y$UoD1L=REc_m1`dVL9V% z@=EQ$JG3BeV5fF^^M5-o+Fb5s))$3aw&}`0oU8jTR+#QfNP@b9Qq3xlNhi#IjATGp zPVUWGBp)N@)n4MAmefea?s`_E@ns&;5R$CigJQN@>vFlAFZE+D_3-50?03@Ao{0swN9wbfUxcsT zh&i1JJFYU%l!<+vIMtkq?mFZ9|GiryRtBf_`6QOsFZs2^nIJsLP3y?G4oa_$g}zs^ z_-5eYg=%l6OxU&F`mVr{89)a_`;yKgzA0KQzXU|2Q5@GEa?%U;0!n`tze`mH2RbMXJ zo11vMjqRv--m0=bkmViW%~$zzmxaVsEE&pAr59evVRq!J!n$)RV{wlZUwj1j=>ZO< z7m#w`j3I}RBTUzzzV5!peMtL7;aBm?lzFSaEQ zRlz&MGw@jcewj z?}&rCyVk~w{>0|GYpj4a1#Sr41#}U(wDFM?G13f-%}pAW)zp3L!4!-Q->SzdQdvLO zVG%Lmv>mPQBKL3O)aXa{neqZ41*%VgHwTRB1mDu`_UwV=Ar93y`W zN&W76;72xhow=)9f&o(5#NPTF!dT(yOeZeUEgO?|^&){HVB735ob35P2zZkEifted z_t$a603f^q0+%;Bk}Zy}Rz8vt$87!Va3rV5gtMrz6<#Dxk&8Hs|0xIQODN=7s3`CI z^bB_PdeOH3;@-nXDBw%nHWvLt_V!0T-=3lF1$6MqigL<7A>JXtt^2sqr}w9-Fh^aO zqlNito-vIMlj|Z-SmE5u3Y$s6z^T)AVPc44olLPj(%sr<6CDvBVM|wW)mZbUIeLfPxV9qcfW<^JFUH+d#+-LONnxFKS?b>!);QFqg)SvBb#Vl^3xmvvTsiqxcX#Gkb~^eY_|N(JCL{_%q-UA(0?rP)OW?AUGFz;JJdaw>N;KSwVZ}pS zAb)y-I8~c!#Tg@cqeN*^bdKjLVL7jopD4_9g{={xI9d?a;!+P*Vvt#EhM)SWKCow7 zD)vx*A<2@`{6Cz%d010t-ahU*CyNRP0=Thc!4;JxfT9Q_0XwZ$1=Ma<1-0$GwTp;dY;6T& zmzil5q1!v1DiUfJr&WnsI&I$qacOH8Re)bi7YI^JqdRp zk-tnIo`=u;bx|emN~u&*7>Us!eW{X-?Wg+$jpm#w`->4y}}#>e?d)Dh5I z0FUMr@rlzn=3@X{Go2qVc0>r7StwY0v%ChRBSm(XtC21&w#WvdeBvsI1z!p^_aDxI z&s-=)3Ov$CT=7X{N8mE8wb-MI+-~NqRkF*{h^Awz74X^|b{Q>N!W^;;dXs(H;sJ3C-DQPW zhJQ`9a6~3Xo{QX@*!zz5fYslq`z*sTXA^u@1~VB>sd&h$ZEHP;0dU)FNv7DztbM4&n^>u!?$9kNVE-DcUK@ zQ1*hd3`{d{2Q3_5ZLflfL-2Y%;Su2-R{+>glH*#7FCP{{4#hEtd9IywJ1b+*leIB?{-e0xcJ zj+V25%O)@{NFJst?`=dtj)i722&Fu0KwAkQ^)wa+SBLwT#5<%wXBM4CRS2g?dlqv~?=ENOwZzXhez|kqc_oupKKAuw z%a&sLUi9T@v+2EH~wDXGtVCIvV(Fv*=b6=wyyWmY*^^qFTR7;NR|b+31pN%dF{sJ-vS{ zo|)+BMcCI{(9?lydg50TJyYY8gMaI3;+iy~7n}rg;8Sqvun65sZ0BAZ-`&Zb6nSNb zIa@O2ke%h-3_jYq2t<6{*ErDLBr}(a#wvyg!$;h0`y+1&{Hc6-kp9#xBKtlEpjhc- zfRjb=G0;CT^z?ejT7moJo@jPpHq)|He!M0#lCSOSOs=zXYi0=v)mDpvKxrixV)Tdn z+o7?3dEZauo#=>;Aat>hj~%fA!6qW>oQHMp^R2T~^1Qf$?w<#+wOfN%to>&_;{7-N zl@)9Bu=~R^TOy2}u;Oq-cOI37>frmC-_E2o1+K6NMEWF_gWM5q2&Fjul@|9M@oULU zG1(8|*OEOALUoMjtPhCYA@^yq2Y!ZpImI(IpAeZMF);Dj$?tE0N=>2qdVFyspkg9{ zGNV&Pp*cLWCwZ|d#QInE^Nq)6C8_1I0llTEnL69Z>|P@006wnxmA#pf*+juw_2@{$ zh_Am4=V6k=IeZ?lzhmU5^6bgiqPV{9%_5~VWYhb}iR)+cI*;pL5u-a+w+QNvobDwS zRx=b+UU8buM|+sd9?!Jy?dkeuvPEuT_U9u#PhxnV59zb<VWh>u5pT#w^7 zw3SloW?fya^XO)}#TpN)^|U`bp0M{#G-hx~w;U^t)f=CQ7VQwJ z(R>ID2y$NbleP8Rnh`rikS3D79ev%Te(a=v;uJo7+N-Q>tol@>H>yr&wRf3Fem z*PnVc3TH2TzCIFe2K8IVTzQ8EZiPm8$b4tgQsbMsHpj`Mle0xH0{yMDWd3-v?=Xv{*HB-%!lt_LqwPEyN zXyZ=VW$yUF{H(ZAzCjZ5f1}w*>Tlw7wyxoLOt~$LjTxG3e2i~MIv2seCC(*o^GKZi z!Gp%YSIReE*PA*wC6^=VFnZfr;snWG#zu%eq=@$m{?}R<1 z@+R_y68ToDVz1<&vM8i&rYLsozi9a`s?yrEIVqp(+m^)LdPZe=HoU2x&P-d!{~3&! z9+6@#?6NLVTsM>ZhQJ(=oE+)vNFcg`{3!u7mxRDFzb2&$wHSNjz5q4@a&_ynS_k#{ z+{Ne2GHtQRBK=6LK15f!c=aPkLN&tl;9Eg5Ir%p1HiDnAkeH?ol*!fE&iG#q_hk z!DZg{$@m7rA@b+w7X;IzH!O##X|Y%rV)yVUBf9SY7ex=>ybYwcc+|tbwXn`;*~m_m zQuVYW&pTe>5=0f~3$|T@=Sof&j*r#^uptWkYU_7nE-4`_WVMhdo4`r(gf!mOm`h@J ztSPwmAO37oW3k0v?0MTz1zfNn}NJog*(Q9?HjVF}HbJH?keK8)M!kzFJV!5CHN0?~L zk&KZv^HSX_fHwP<>Xg6Dzg#z^>%&&2x0&l1bBZmcn=g$y#pO&g>#fsG>?V%VEEYE4 zyb>LHCDlxNV+cO}G{;7&V4-E@gLDI3X*;}#%3UR-@<0NKR4Zy#XJ zZrNey$5*WG4OE5_`G5NPU7mIT?-<*T^?6X&J@MD1zIIng_**EJSgZsC-oHl`OYnP0 zZbKbJd;%`*?mYCHO~rM@PslyK5lNf#BF&3Q{G(FFfhoB^n%qq308*RgqYL1yPv-Z;;+CW#45ACvwLY zn-1ufN(&ztIV)+`aKk_a-mfp`6Q7Ofx_InOPmua@rG@w|scGb02p8fEJLaJzmsICx zdnUsU(_K^5V2T4TRj*XkKqJ$A{XwKe(!`r-#S2AAXf0dJpGM&4NI?U>meCcGhHL-& z&L?|Ae7f<+0)C|t-@Tg5(gwN?BfpQl18HgmCtIMG`k%EXlU&p#5ln^31GIY&X)p+h9(z9BD1Gim>Y^_0%6VWT_b z)T}Ue*^vAkXQi4|?>IV+p<-L06aK`%u!7jW-qeq`Vx|WZc;xI1e{@^>zj`o9X=Xji zM$a83e`u+Kh`rlV-&b@=PPxBjiWSn(n zqq*suIdYCFyYZTE=^_ODdKA25HB12^7OZEqbF^Z&r&`=Vw^~p(1^fiU@!^jt4iL=> zghkK4Up|>5y^S-P17CB$O*!(+!oU-0Bl1D^iTD*!K{yno2Ds`>>QPe5CVo*g)`UQt zlPMsvldek9QY}yA4#~|W)6~cYs_}x!{CH{T=@ido3t(yA<*st@(mH5xMqs&`dAAw= zNO$TyhZXA*Z$ifT}~7Vo{px^6m6s zygB*8B0*DKH=`U&du}R!l0pQ~+&nQyxMN7c{k}wiTOWCAnX&Z5r}UBe=3QBnK~XQ# z;IVI?tzdM_$lBfMUpr+GXUm@}_>|1W5Ig{~c9(o>7x3{!9s}!tWmrFv*k=ZT;{wJM zXcn)l5zcNBBjr!mr4W%-CgS7Qc?Pex_6y)~dFU97Q+Ih!P#Mnfh+HKq`()G*^NOe3 zCx_*zX79|6f$JG^7D(S1kt2c`9d!^#B1K5#j?Id)Y&vse7DwxjODT*g)oa*HL2kB+ z5>1~cZKB*KZ=KB$7hgi6(kXV&an8{cDV0i;|L+ zIFnz_A!1lC6l*SsQhRiu^KyHb*6C8JVEb|U^cHt)3dSawbv^hfB?A~6#VQS7z1WcHf zZZXSFJ(5AUSY#OMGZSBLqOaCk&>z-W zQ%P(OsnLxGofA>7CF#d)S!=4hKxKj9zeqvT>U>6KY34oas83neI(pILI&YNg>F%(C zvbDwd2EEzJ>Z}GT)%~9Lja(W{fZqdYfZV zGCH8Mq2H(X?A6}RtgnH;%MLzC5fEAtKJfNczCh4+75wzTW!eAxD#^JfzV>uW;5rz1%Dy$8jO$2FVk6dgKS;v4qv@x(mv1WM zNwp4DF~2%>P4n0rt|gQU`S6t7XPwT6PCc{q=Ea#jzMfOv*IkYG_HpoCsX3H~`w)MB zTpL;i<-ARd2|VDXpknOZ0i&eH2k^83842HHbhWf&f$1}6%gN46)f)boz3Zb1mN)yE z!8yQAF}Mt3MH*^bBWLUA%7nnzWq6LcCaY-%VxTZ|I(bCaE*(meeze5ITC70l>e^c2}7SH0~vN%Q(WzusecD4L4-->;B@8dYE+ zHos=C9ZF2H8A7S7N}0v2T}JS5iL}>sKKd=$}5tqU*e&q;5TCO+h?N+=4{zguLy0N`M(RVr4`-W0 zSY4^zzKX>#j}aYO{_Wrmmo8+Jf_cwXCPWU~I0pDR{&ujKRH#hL#i#cZ! z%b7@>nXK))Rye5=C#C*61-u;xKxxo5Z6umwG*R8#&4b@RYt(rM2Rkc^3g6W0bZSms zFa#dGMvew_xH~*Qd+_NTdA$^qi5xuF| zCk>=wPW&Ttk~u{!9sN8L`yB=DW%|fW0M=`g`8;UVy6MK7uH|=?w$YQko=)qg=)a78 z$`Jmy{WsgA$~_*HoVz*0=ou{E8dCETQXs3_^_n5{XO&Nl%A&vvNMe0z_mrGfOKa0-381L^S1^i>Y=4~ z7{Xr`FEE6!5@$G-ZTQC~k7qZHrk(b5-XJPW@+xlg1?~OL5coOxA0zZ}=kPO;I{2E# zjpA(RueeLoJrNf9FE`5Y7CK}u5oDu7Q7+^fxDTR?^3bEQvsKxh7K`+a*UvXZdB>Yx zPOt81pkJJ>+Zh%&$$0;aOVXdrcN^ab3w@L1Iea{UjWtJ}BgU7^;=^}QN}-G_?Jg$G zIk@~>56U{q{$r;snUtb&|3f9w;e3L3E)rYB*O0=;O&&io??oClWO!|Z=L#HZ){Dy?j=~c57%dQnr2e;m8 zIUSQpy?(bcvF#md$?`pMT*ubs_%(hX!$i(L$sMk-1-v!4uO&Xe1b++-fnV#FpCen> z1};DT-lk8;vl5%UrfH*i2XsPyX$swX{02R+2$m76?Cz!S=86*LjF!vC=r)Eh&a|2*%I#c~>z?GxMaVC-6p>2Xi2d68UJ&QTm-FdN%^-G~*z2{>o9iTl z5!`39Jn>xplS9)j>uhtJqJb^Bd0g53s1I+y1wiw{yQ#lf<2Va@2h$wKagj>?^PBRC z)G8bK-sisWU75rbMwuAtc^}5($Xfk7da2OTHq>_M#YmY~rPK^5&h~^^XKStCrh$^N zYP+4?4iJsG!>rrFtf4*E^6$2SnWzl1_5gfb5<|WR&RbFLLUO>TMse!ZN=s!U2_7kX z=Zi_TuZD%5ers_8o9JNlWn5uVnAh5y;BXoo>!M_Td(+YwfB1tFA))V3J44wxVTq7E zjGc(w@du6QvBSXJ)~z0c+2xFK{H#>Vi}%6@gJ3!=A=RlEUYU-j#Tk zrvoJo%6l1oZXEIxvvN%dd@r37$JA~Y`}3YN7bEB={S;wHOtt)1v(~Azz6&Dm@UL^` zEc{O5<1Gy$SF6vu1F=);tfm=l8^sCFa6-hM-3*&ISIq(&ODS#^tS@Gxr!F4sPa>4I z=3+2bgQ%ZG{>3~xJo8BHp}%I{?ll(hVKVxe7FK?ubr*e^zh`b7S5!HgRV%OWqnkNd zQh$u_lm`ub4Q03)6UX8n9E&0X)5?3?bm0r;A`D-Ux;CCCk;FezM$IKJedlq~`sJ7e zlDhe!Y)NG!H)RE`bC%)|SdyQm=ck1C^(^?oISHsVwcMs0Et)ElV{sHGS zP~jebMlOs_GcO*K`ZOO8Pw1G=u zo62Al?PKOw@0)I+&WPJz{nRP$#e1&V2POiMCPzr&PC_p39nSf`Pxu9-RD{@(jlLi> zfo_3`E+KXr40Cdmyl#~g;}qY%pTI{k8J#iophDjA0yaV@=CY6^jUt)eo74`V^@=K` zK8%F^R6V)pSelJI^=cf|%vs#77r?;SH;dzBo|R^no$XE(&uaibjg)DSGG|qGcazvD zYViF55-q_oewpZhAJ!>CVCw%k?o=6ockY-wo8xc(fcvb(?)G#Y+rrrw2x@cZyvbbt z5_e0F>kK#|lmA`uLFR*0eE!`FP&4E4{J{6XukZH-W4rXDFx!oNBR-#+OScUk7z*q7#&=@&t1eiAFUlYU%kIoV@-t)!cqssv)%dUKs z(ZmYNWKYZZTq#A0Fl2@SYx_RIx{-=oxberIxix`f<@IMDo6NB#^$aV23Ruq0eRuNt zRNOO5_$Fz{8ITD?k?BqEH2h0p)4x9m+XZsZ;j=e`*Yg__IhFmL7z@kxwBC*9?0b!6 zBk^lg?kA)n@pF;1aZ)q4sqD$kpFb(itzVin6+5Knr(zwD&)EbCJh4s1L+=gCK+TNT zU<0M1L{4UZ1w8j^_lru%(#=kA&h=zlSar|!Z5Gu%I0A0Z^++sZBF8Qr0vrnNnmGKi zLruIYPrdKmA0}t|qwiMZo}+1+ZMCx_dq7%C8+=iYpdYsNY9@d@>(R?d7L_ndt%M>!&@YiD2_ zaGnMS33WMk3Nq6?i$PlLT&)PLa5U;=_zxT-cxC(thD`kD`^kUkieP*>Qp+WEp(&6T zV&67e0M(sLvZ@WW526d6sH?I@E-6yf!X>%$sZUj^Ij9H1fkZ6^nKXP%c1$+2WAzPL z{QR8ozV1CEw#&ya9H`FnVd!Hmi0n%#gT#^SCN8aWK3>z^r{ky=)dsAEyr&K*Hu2d^ zzHe$$q-(?ixKo(EZr%De--^^Cmr5FX$j1>`09L_2kx(YkMvaJC$dEdcc0;zS;EzB% zOh&j5>euF$inSMP;Z5!)dS+7i6w$k5Jw<~PxMLIf8`P{HUXI{?NF~s|sM8!Ed6hK6 zFO8ml(VjRy-*!EoziF+lq4bHyf4+IYX_-0M^7aSx;WgrOi@ASIwS2*x4t?{5B4N3= zAV+q>BaqNGaILJmtd5$f%?CR_POUGt|7B@l0j9+!b}4BqCGT1*w~;cfu{da zRVSt633e%&m*4BVZ=OVJXWzohDqIFBx-qTH7WbBdm|u5`62nt?1!L&eYtfx%ykgKM z-x@oG+Bnd2?0CZ$k;WIp!&i9i^dv?2ny>qcW^=UCGR{MlqzfAE{F0IPt@@uWfj9j5 zdM1T_t<>|$;jfuJgHT%As80G;9ydsnF7s}>+3doI z5Xmd+Q2IyduRe^@4C(nEXqzLX571|4E693DnHFxc^GF14dCJQ5J;Ab*m14(2=ZeW$ z4PluybV=>=oT8PJ=}fqtmAS;*qg;;x@wQs8S4ndj-z;fw>W2%!=My&B`*?AY3UtHQ zWnKj#99EjTW$kuXQnzM@u|unMfXHk8fbcTV5lnvzNAj&yX$YU&4|tI)0tHUNLAs1m zB=9@&zWx}0{(r)8cKfyN8|Wc6d6o;q_{;{{z!=b9M`WzG#wYh- zlU=`|1F%3)Ab$QBdrzZNy$rlpLefa3d z?Q~kW#N$z0ZVV*%+fRJ@?$&fev8DHzSZgKu1%K^o{$<>k#E|#mdr>}oi9k>A?R;3( znDc?_XJ5Pp9E4o_PSV3V?q@=GLdOj}W8AX#bTqA)a8TsQs@fATB)2-&8N)w1;1TzK z``G+-f@VNIP{I{G&bOZ&R1W~Kka}#v0s(J%c3aaJbODL;Yq8eLi7vlVqa$lYV*9@$ z|2OO5ACiUXwS$Yda7mjmZ)(r_fp{V6C(1)@DxuEJfNUuM zE{6<%!El^_dJ5?aBQ@5^KVbHqj(zw&(dMeXJLZW1qL^>#-zQa8-7+UKvwn?H8h=?L zt4QB6dIEQ04j$4eWv`GAUyy=4ldp%bl`FUWIEmh2Jqy3qm#_5WO_6v$`3GQ8uAI*R z6TE)g!vx{ZIU;xFz3{)O>eVy-haF)IXL10KzpYl3B`hTN^}W)Du!Gt&SG$ ziRKS5N-J54QTGkUAo};R9Uz|)m2&hZWbQcCQLX5=j^7q_sQP+VP}j%(9tqk%G@qGP zX6+JdCbl$>FV8;nctp7(Y5PLnD&0HlZE4te?{g~dm*;0--7yask!G5*UP55^k@qdl^+?nL8c(<3c! z(gthSj)h5G-qXn0pjixgc6@pRHJcSg4iJC&eB{kc1NEb7J5!(Ba`mpKweAG!r*9&- zX@1ga2p&qjPkh|A#1lw&)DPC+WZaxIm>t(&8)8OE_5*`Nb&NTj^QP+?vR- z@y=ol>X{a8SW4}A(EQ5$@wm6&9{cdy1JyLJ$K4O0um1C74!t_@!Z?JlrxS$e<0ZA@ z?U;vmV#O}Z15Mgx)h4Q>D5^u+*Ij{_2Qg9c|N9B^&1gO=!F<^^l_2#$OIk2Jrv7Ux zgTaelYCJ%mANa7%;ETEg1l(NHqH=xV*K<2$eLZQPamVksJc3?Z$))8_Y%*<{$Vt#U zI2R{J#{o<9(!ZEZCids^Qc7(V57#2Er0ysBh}1ZgPPEf(OM>W!+pe!utA28{oD`!N zyGCR~rB$orPcU^4^6y!%?Rt;a%>wZ)e=+_@e2Z7nl9X(!`hBlB;UH~j+&!6}PG67Y z9vS8HeMVwSQ87pFnP#lw-rmIIJ9--HqRsM;r$D^rd@iMl5hi=o{4C1d+9-$`fUSv+6>M@hBXHB)SRDV=F7|3u08FGPnZ zHD3dsp?}L(8j+JgWy|l2>?3)aK(Fy(7hXxNB=&{8%Oa>jkPv?;wJtO|3REuZ;2a}+ zAPsGc7Y7|#-GIcd-0AGgF}l`1Vco$zcDZVKo3(R_hJC44zkY0@RBn=<--^^qY`;!? z$=I;fB8rqC|4;N+O&Y0#O7^4}$FRp@=mi=3OH$P9`})IH^FPGN=v@@MC3lGl=R7%~ z{29)pDGRedTjHJ@hU8J@FAS?TG8to8GNJGy$M=+poVPg$5>F=w-czuF#PH~0_nkkb zXe~oFt$cOInKV0%@yal{C0{MxfgW^BU`EQKryHB+sTa@qCmzMPYjbd!?= z(T~e7^96_FX9FZKC3}{Xzu$2YE4oct1|)+o zl%ibuN%j?qeD*vlF1pYipYkJGd+U3yp|ux(qwA@ETI}`|R5m+rmeHI4gMX-!*yTWF z*{{z`!Sp@(&NB2dxkjp)Z#l_PoAQ|l(+g|osLT6$Mr*hOGteg(CB$$u#@~wPHp(p< zrqSC&l#LE%+=G;6P8Oy({T58=EH|aS2)5!^zDKT_z26uk3a0j;qdv-r;B3n%`mS>kf;xs2513 zRIRG94(Z3`8(n*<@AJ*1x9w6ak>+E z?wYJ!%SU&3p8vf1ot`OWY#RFoz$&W8vj4;ggPp(pmq;Tkm!`9?NEzjb?cPt$LZI^H zn_C2S)S}tg)Zctb6_I9Bk*-x$;#Htg-_~USaw=k852Y#bYDnTK%Uhr>f60?IpLx@(L9mg&TJq(70`*DsYgium7L=|ZlffgxM8K0%=aC?E`^_?EGv}erwk&G4iy zt7;keaKF#&i0tcj9j98p$>z_~ipl&~YnY-sj2&x*ej3e=b)eB8Lm$)E{pA5Po{wf9 zzaS{eFm~K1ZZ%xuZCUo!;_qwSc@5os~a<&Qrrh;L2$!WIQ?>iits zsr%o`hVP}6v~rX@S~QbYZWzW1g>qdxYKDe z_skOFOph#HK%e1O-~D=4QfPJmNlJ~E`+ZD7EFaqK^yE=L@lmluQ^Ecc%QZbEX2b(fn6pIv3}WB%C+y2l}Voo zX$ea-4nBX}(rTd+bhRc+i-mfg-DEa*p@Uo(ayJjS zyrdK*emffk>yIc^13FN=EkA1;w6X^J59Y>rL0_RMuYSsOLfh38`h=1Tk3AfA4=BjE zdEp>&=ECJi!okBiBu-Q*1U*-S$04{0BzNP(l%^EVBTfUtYN8BD=zysDt)^qUC*fb&@~RAU=HLweD!nm(v-C#XC)9KgRYe_^V-!S* zSkG_6js#=F{MS?j&x=)aFqq#13>1Q;c#zCrkbKAVpErgwa{gmca@Tih9Vz5Ya}^H= z6D@2kqmk8zrN`M%s!IQQ{GV@YZHwPJ|LTp2UQIPRZ){`!^5DmyLEE`>sfOyldOT^J zWVdWO$zNgL5D$>tHJK-we+e_@iNCHc4ZD=r#-xX5E4y=DVHiOHU+jiFt1S~{hXGcd z*nD#Nz`@H#kRIiR*EBhlrLTC3-j#cpjBuUJdzQ-FOlGVIh6n;*zdTh0Gcz=d1N)KAU#3rhLAR&>j(eUa8um+8bgp_#H)i{5>TvWCTZWu;4Gj#Gf8 zp(}e(%e6B2X05$&9Qh~CcCaE)zrp9C;dfSF)e5E53Czh!#uYmLr;Y z)&A|~6t%IhyLCPF_)}78Yd)Yy&I!p61Zuzid;ig^LG-7S`8o0qzS$bBsDe1RCSC4}n4#?J z9(_0W#sg;d+Z0cvdD9QMO4+&7Y+t=!zf z1?Cu5)9|phJ6)}gz7fqI_Uu|2M_ru7u52^V&9AfnY+S!cNS6IhVug`43Z}+D`skqF z_SW2WQy=c&ts>{0hICSQvT41K5?RLYj)hNjb8elYZp-t zl~>lv#PIA(VQOG=@|1s{4_=%ecwFe4L+G#h$Y;wWhrv}H$1F%MI5dYyYO{rs_e~O# zjp`|C_Q(_q*w*7RV`Q%O?#>?%C$(OVEiE)p09fobk(z25RGb~WN?Y}ch9geq`m8$D zRfEr=CN4Vo46+Jl>6{+Y8Nx@SQt3=7vq4K~-BzigtAq<0+m5gU*W+05IHJC8ek19jAFHrw`-Du+*__uR+7Dk_~o zsSitZ`zXE2t10G^c98TDfy-Rz&2{00Rt(o#(n(%lWWX;46;@Zc+?XvJ;~C91j($nm zC;P@gf2~W#gAGnm4QL0HndGlgDp>0w8(lX8M1H!x%wQCE0lWqzck07kY)mzbQ{xNI za2%j`mTZAuDZlQufk45yREWPh)@GStzLc3EJf*@3(ed}vLy~ISb%QrXn8fYcVKzxO zbDu|nDEt9RUW@m=XV|w$+e-En&x*Img=2xoHQ$9>dN`GCbkFje#^e~8>3U2y>{-b) zA*0KATJ+?#r%i1O_2QfyYT2F$%V(KP^zR|bQaLlSpB1U;f$!%MBCEYMbCyBWumO~B zFA>`aNd?f6!ft%rb}GJDxvH0r?*+P#SLxzm|4OX}5iy7@v0Foi=6R zUZ;mKvdP?h5|)hMe-iNrN(q)M&#OHPaa}A8Pp($6k5l#5{W|_LEY-PbLZ12gmQ z-I}c8Cs-RbIGHb{3McVe>amQ`vD5&iXxO)v%2n`FsKukL8MyVR#gIijyNO_|13TLH z?2UtpR)f-*Ax!C?onK0QdiFe3vQ?NYFVOL`=}KBj5a6$`!KQ0z@DGJ8^yUS*kR&ii>5 z_vZ-9wN2>uc1lWZR7=$yZiAew`;&3y5$*+M-`-dg`}i~}Cy{bfGj|k4(86*J(z3m$C<*s!3R3{Y@@pTad4in!{zFx5~2lJvs?Ciln{OP;CjL&E2%`! zDdZnxa_g;wz$JMB;^h0_?@Cc+{%}W#2mx;1bjh2K`^$7*%X|A z;I`WO8ISCHad><`W3!JJVp0VRrRZB_KZ z6t(3K+e!BcV2+D(hy&<<->P72qF*N(hz<$V*YN9|{bXHlpP{RU@DG`pH*K%c)z$*} zzk%yB!)JSyCa@vfuDM_ZaMBdMgaS2iR%z+oLPdpMMw{QT&Tp(a9z)i>dw6~Fe4^=T z1c7goGbzSsSQvgXXBp)@nkz?>^g8ZglCR^wO!gY&{CH+aQppU7b3&llD7749$G&{! zCZq3+W)Z9i;_J=C?FsJu&l|;r6i2C)pb`R{FN<&8 z50g3qnfr~zJudpzU7{satYEr#8PKP;C)#94HBgsNO{8A0wWSD=gecE9eya77sD`9( zN4_-P6t%k?dh^L+llWVrNqW_@htE(psFttxG2>fHM(n`{-j0yIQ}AHOnn>MeQ4_W?9u-109&*Cbj=|$4^7sAs8ph=VRtoaeTc8x(s0i`vORI2e1=bwV>x)as*Ls#C_?%4 zkj`Cz!BX(mn4$AS%pg1w-v_!%DbiggqlEsxi<p@3)r$PB;gz?ps@blgU)Q^L4C_xBugR!O$4U)DKE|vAxVWBEl%k_;Hl$|#) zW_E7wpnT8in~#LQ`@bIg<#5l`^|?xOyGp}-3$F3>VOu_{68U%N8(&@BBWZLuO4$|S zx_JIGamh5<1N>X`k%!R%Tq4Awcua3$&bQe|^hs(a(N%%2zTaN_H`k;E(+}y-g}y%q zYfsKtQ{ay{q6gA87X`js{@>@r#vwf^ioh>LEf%`2KXo5jM>MC4etKy#03njkWNn?- zN{t)Rb6axFp(|pCmKwL$uX;sPNokXJ&tCy1j{5`vent^gcvQmTfH0*1^1r)x9gR5v zgEZW~)}QVO;ywJ=WW1Rj_zMirsn;Zu_=fbh;MYl|%|)x`wjD>9n)XHRvog;nVN%pk zF88+H$o}}))Oz6NmZn3C+R)7}b>iII zOX8F(H6M_k#XIn4v+p8crMqE=nb_ zDmFJ9azZ`{^CRQ8h(_eZXRCvgfAq(qXFkwtR^yCfmg~cpv9Oe4zVIM?ilx%OQ%9Xg z51%`FeU6bzu9Br0X>EC2c(Uvr;iM?GRP@rx_4?J^nrQRomf6M+4}F*57-#%?##`l% zr%f*%S}IDc8_yk(khvVP4#P14%3Gi^nfmqFbMk>j!fYY4NLRex_vV!tlLgG;tYL$C zfY2;yy)%W$SpPCGat>3Hj`$b*Uc&|j`fh&vnHJ17`6Sos@1?qlzBbUJKn%iSD;!*s zwmh{*gk2Ad1bz)9w@X;{EZ$qx@4; z;oS8IZXj+W@9}XkdTn*q!^r=pRuK6oKF?MJJ`EeR)TFV=ajzcy^XNa^bmI9b<@>x} zXO=HxcK#3l7IWDVXTKg%DqP)yT+L{#Qvj3 z>dV=OWtSh?HeM}zEA-(-(ZaaOu1*A<5vP^48`}J>oKG(&M1?ARNt`G z#V8#MHi5Lq-Q$pTv{256_K(Al-942|wPYlhNqh-1A2SW_Pp~ZlKmBBek;rGwr=78c zZ^D4c)a!tqbfH0HYJ`P3Nnfx_rEXi73T9K#S`f`4=-IDwI5es}BoNZv$}xWt82Z+x zh8153Q{rAMdHgq*iBDiTEhJTQnN&KYI_(Mj=NuPN0M!IAs z|F%e;OVtE&8OmZi983M?YzCt>5~(2F$wkp|MjCblCuDOJE8~3?_cWJNEc4y=ZbZD z`ud-Q$%FDs5Sm$q=7(`k87);970HhiEpy_$fX(lUD2|tVs8#FMkNGCVL#2t@sh=1R zvpTm3NXE<);&18wYxs|;6J^xB#AhHmPRtt6>qG{zJ`*_B&bF2qxuR6HmP=|8C-SLO zuBiwrv)5tj?xlK|}8TOSaeTr}|FQ*F@2{D@17ES4+>nFa> zri<2&i;>MSzmv2>Nc0-i{QnX|eGB;1JJkq!Vaj#eNWaQoAM zdcXioGmV_&C4KvF&+Ab5N|92Goaiypj`rqHy^dYqB!zy)z9v>bh=I^tIsc4Uo=B-H z=ygES{OQvK!V2muz4<=?!C$yf7?1j)PoEOrbO_HnQ65nkABnW>E$K>y+?a7vwq5bK zC1fX6hCP*@cAr8mLQkowb#CE$Z!Q3Sd_HM&&74;zVnGR>Nf2`Et4}qi zCcYPgYYA=!9%ToUC*CuY|3*}xY+a%~claZEi9V|sZGzeSd_o=6M)<%^tn(_*+WP_b zD?8>{9!pkDX?~1Q1%eVBU$yQZsX(;B;a-54Ht3i$UD zEVNaPH6LV-h;U}DNIqrfXBe2D~yb6?=g3GQIu*)uF!LiSfm7c1yJ$;Li! zoxROEX@V-rsY*_&9dzx$6AY88s*~_cB`AW}QM|ZqVMYGEObmK2n`;)_MQp@yzB=GF zT|u6^v1U#ZxpvqVOC==<+?8Y@a{u98G6D3`gr!uyC;|#6h0y;(C=b-F{i6sA$|oZa zz}X`4t=t$O+lSceNe%5W3Ts7^hVw|I@#pa@ zi{3PZWzBZ`9U4n9f1{Fq1FmBF7@I~=m$!=+%FFF{bf$89BCG2rt*0+XadQd@;W@zG zCJQg9aQERHCHnYDuLH?pfe%(1wu0-O&Yu)Fv|Fp&tkm;kPc3gPkL0W9f2^dFC2`)T z%9HXN7nvWrJjHk+A!#>)DXZ%YGM6%bwx0H?bjn8k-0uv2|cotE?C9=tUTN9wM}||%jlm*uMtmT7AD`v@1i2YmTU}#pk{l z<3S~7zv#wHRroie{ZZx<=V;RBu?q5~BK>{DC&I{_K}zQ&%n$jwt#5Vn zm>|CXQN;12zZUDKmFU&{OOo$hwawj*Sj!S4wR`y{i}*E6Pb;E-og~g|jxwHFOX4{uTGl!@iWv=Bx{asB=zhyLI$YTJe)~ z1FeX%P&X+h8T*i+5`%dxuzz4^uTSJbwy^xevNx9q5np;tbIW&@Bq?R^v%ZLeV^JD% z`<)H{A?E?>kB7*t*y+@d5^(lN%r*tjJDk5{Ptb)+OuxBnF|+nY$i_#ga}V>4Xwwtt(4QJZs!sfW)=&4PJB*td~u z*8DwiCGNkbDj4i1!kY-+_oMs*_*@1sFci$>4~hRdSnOAn< zn1FYDLN-NER2*q6nuZhrb@pF$EC%~@dGxA;{Y4d@o-jplUyQe0xZR(a9#s?g^OIaM z;ZG+1KJi^g)Gwy6^BApIPflNbo3#=;an+cyb|KRkXSPW8-z&_O%>mrL&T_wp+Vdxi z+Cw3a^H@gsR=!4=xE(AeY3ak{O~o9MAEk(nx2CMMsinLSg5eEvH?U)ZPw zHyf5;E**mpPmKOSJuty?bEasLZ1;*--Qd$%BkMG*OM`po)WZa~Akb@kJr4af={~<> zos`Z`oFCHP(KqI2E9Q9UPIT@AWNEfs7iy)KwM+!))95NK+iH=O%6!BO}4cso-+UiT*$RFNW)KPsvnv>x&*N*^^RKcL@eQO>77XgM@{ z32&`hy#AdZN_ST*UwUxG#OcTeT4GlW>v_V_}8NqD!3 z38P>Wpd_s1Zz90CyQQ%6+%HRTw-LQ!B6xX$uJ?Z^RY1QVF>FUWU8c`V}HR zi&W7xHp9HoG{N?CDu0MBh|V@o1$t%J0TGGtz{L%StF;RdtI!R@OwV>7)AJfBe!Nb& zgJ*_g@0zM7?|}Z%Y)RtN>5^5(EAAY}b!Dk)>;oUisYu6!K2L?JEJm~N*UfN3h9r7} z7vBSgmzCKwkGq)6eVNU5jt5OpPRMei)6qZwAAUCb4!9=2_qxuvS&OeU!LY0&(FsXy z!$cuPG(;ylG;)Q%7ia$@Sg<|d$7IgU!*BGT|HE60gI(v;!@j!Mr6;pzYS_bKwLod2&}8F0eXYH{5m2op ztcJ_d=teC9okHieq&R56hgQSwGgcK$O`2dt!@tY=kNlui{Nfn(oWyb^@ACZilw9VO z>A1QW@JSk})+DRJs+XH{IDMJ4M$FEkK4H6(w3fm~5o+bU%ImCT5Sw{3Yz(TBb4C+Qj)FROpAfab{#Tc> zG+t-f`RSiyq#?Ur5}j^4rG&WVK8DeOT7G#N&su*oUYKk=!FgnZ^SS?(?aBK(^bxt9 znzWBT-Ad2oG0*3V?ZCZE)*ksFEhr*1%Y=lwvlq3c>$5@^g^pdsN#tDBRD`0giS%i= z^%OJvi-*JovAO{bw-0*?CF3R85+qb?HBQn~huJj3$CgEWB;w{5k0zX>2Tz1qu_tm< z$9G|*jry{LC7)WQZQd{|75kzpHPNCF3Mxa}Ma5=*NscfLOQ7pGjpcIp=0TxTONZ-f z=_K|hdEL7@h}p^Dr!rroQS+*E=acIvo=niuLygzdfe&#cvA{#&2dkky-m5o%a1xU-wNn+Qz@`k;|Fqm#t@S z%my{sSCRbmKa+FUn3^?t0`5PY=cN==g@-V*CfAEzAFP|HC|w#m_ruT)lc9Idt|pa0 zR2apmF!rKNb8{Q1a(ETS_kgejEBhFgn4n%PO8N4&1l%{~puIMS-7ne@{o%NIwkOZo;h| z_#OVO^W>ifew8nGi+NXKyCnNp0_3-9?%4i?o9eR^8>jG<)D60Yddg@{N<>fOc;kmV z?qc7KHELSFj~a}A%fzbJD9iKe#>#(>H?m=OvhrA}UP>YV?~|#F`J|9W@?{7Fa^r=E zI9mjNN^G!tYpuZiJDO>hU08n~T5AUFJ5aGhK+gkTd=yx=L~YY^c2GQYF(9%r?QaIk6?9K4m*OU$_?|j) zHvBS{@#cTgbCvXd@b7;2&Y-VJe-wURpmu9yje|L7`J^uka|MK>LMkmuE9 zw$?n~^v&D3^q%eO|GmaFrhf+E$M|aprf@ax5F~l5e^0Z6iK#}`EtuX@zaM_+i4xLq zf<)IFsOnfZVJ#{n>M2xaHM#QK+w90(yIkWfECCrV&&U`|8D>Om<|OoPwktj?@!&o z616d@v=SI3d!DNg>y))}lc(?vR!r)yqb~D0;6X)+<#WlA`5hG2iLIR|O^-|7F4w=a)t z>e~KwpOX+!0$~utkO6T(B@==mk^p+!;=o|-wN_O zdOk{;&j~we?|;WQ%{G5AH-eqV`rWkTw;FjoPY8biW<1gOlxTX5HcP}Zv5YFGUEVVb zP;}__)mL@-ggCt?nE|?r6s8kLFFSv@nZeFtaXc^+&XYJU)z1NqW19AD%#{F_O73{p zyI0a!ujuiiCrH>4wo)FmXLX;cM+SBN?aH{g0)UURo>MCduX{og)YP3SX|#Ih_hyI3 z{RO{qtiefV^qfQH6Y#ltpp);o=GfvqXRopQ-~+wSJX`FgIL3C4A zB%$u@!bI-MRZStx=ciMU@Z7tqPGtk~0`Rc=t!8ful3kv?P3HJyI}JZx;iE5V5Hy;`==cpxr#Tux2E>HjK1Y6y_W};ctEZwv#MUwQ zwOdn_+ojVpq$tOqtgn)W7Xcy^^Qe@Jy(7)nxouK3g_w`bOfh z1Y|h!zZ&k^)U&K84=$Tr)E|6FC8InS3MjKU>uEl?|4x9*`glt z4FZ_Bbr7El1pzlK1foH3;#uD@kV6CC4LBDPM!*g1y&F7UPA01Ks)U%m(KRebu*0KG zZ7xu`-_7omP%Fy#J2J=ysUIB_O`WAXL&9C#I3i2iqu6F;pU)+oRPxITIP3&4%dPkY zlAxkEc^)Ihq|twW{}g}c{GKb;U3EflJN8`sKYnt4&;8Sh1aAKv{Cl&r_lZncI%VJr zy#GG$KrUyX`oLB@0(ID%VoiIw=E>J&Uk2KxU1hRl<0SLj=*74{x>6vNvQrKGcTIxl$qK`f_p4kl4gUQe1uw!{ zHn3^TQ zB)g+KYnxp>t6vPW0J%4*=xh?37Z5?GUV$ysU(cfR#T&@pTR70=?B8#?YpQ`aOiYJ5 z9Pqc)SO%aN4|h)vo}`p8YdN7}Yy2`TX^mImGx~f(3mpBfKP`3iiYx zbR0+kUGqAG4EoPGf5%?_jeJb;cY-$tF6)l{{x`-}9PJFR9`51Hd{%rE&nJp@kw{|& zpUp|R;tNPB03YVnefgi-+mBEH0K7?fnqllXh?E04Jy}2~!Yjugg38U_xl9ltPGa^E zA}GQhPFHgr_*s$BPr{h2A=>~vXem;?)pmR;h67(xb#4l^g!bM5DcanL)UV{(C?YXV zrl!Qmw21y;sNm>FJ9mtShYq-PK7qPglPZH+)L25TpFhHj;fG(D{PDORXF4_y^hUej>KQa_Rg^1A6qF+WTWho*ZQs;2i zD)`1xdLzJE?B-Y?{tA&-qF!sp-%}yJkN*pA2F5tRX$RaZ8*Yn@tBJ>n9z&=03=@3z zcH4;&YvLrj$@DtTv}v?p7{iZJHDU5xOpzeNK=}XjMGOe^vNrzHPH32gMgRxaqdgYk zF`T-<;h$NFR4J;CtMI7>f@u1b>R5IERx(`mxgWhCQ*UvZ`zc83+wa&=zynJzQ-K zYW7I)6Wf2__`Z()FONm!fxqEX{S80N&cQKIqm^N>J+njJLkyo*A<;HaZ`GgA2lYk- zCe7evE#n(~btsfZa!7y(fQ8R|P<4&gdNC7l-2GhF7|NaRdT%9h#k7TPg^uV)hnK}K zVMnp+ArN505$h^GR<3HmF?&uSud2iBYeLd0I5qDwq)8(PJ#&+xW>M z9{FI1#n?NP9aE?rQjErlS0liTYVt1(|1+Nm%^bbqur^2VdbH=R_)nxRvpqMFHbmSd zFV3r|nH#L}H%6oHgh~Zn%(df#L0kc^8Ban?0(yv@V_Bb{Og~1giR%;mK>wf;94Gki zp}+>lx)N=@P197;26r`-yd7=kq!;9r)3iH)CeGoj)lFXdGki_oC>HP#X4z!Sfh8*; zm&J(avnoM(+BVVzkd^4I>Ixyb(O<+w@d^Nv?YAR-tV~d`>>a?M>$ISZ$LKe00GnjE zD8|232CzBo%zi%~V$2E7?q%m>#g?-N+z{KGcuY2YRe{ptII)*~UJPedvbdfg?aT_( zY;9qMV7`uDE`_jc9qq0u5Cg?Qqlq|VeZW{awJ<9p05ag;piSy(+aL6~!oGIcC>_Sb z9jNR&uK64L%Ki*a-p46UK*!ilIg{t^p95#~L^94V!I}(D1v!-`QeV^3Tv9dH^hc=8 z<3ST$)N6T-I%^&ZuRDum?965aTrmDOn)aZ`iGrhxcP<<62})<~?H^_dwpIxOKg>fl*Y}M=&}#S_5KJ?j ze|Bj!Moo|{&njj`26qi0Izdw3{So{U_J=K{-Y-i|_4M@5{ZsJq{y)e?p)<8;_OUs4 zCb#j7b`^h**Mvyqwx-UZ+QL26WL0ZlOBLW>UwHh{2t#XkYp=Mu9_oC(rc1goZ@Q!> zMc--$XMzI&@O>tzuxB&uK}Rxe9-6;&xS?h$DIfL%aJFrB!?u1rj}Su^fC%kJs*R?h z-6O$RYPsrb;|+U_C^?2PKYAE$1sF?1t^@+G`N}3!1!QDX;ol-bp{YV`jHTrg4fIkt z#%z;4p2sYMRSNJS`bnNk^SMjnuJQn^ds!C|BcYS~hEjjIxnswtz35hr1k$5>6*rZ= z!>KB3=De7KP2Sa3!ME=f1QF4a6>}?1d;rX^&TFH$VZIxf4R;W`31tRh;o*NROZ=xli09wfz^;6VgbFVW5>w zw9U=z_rLz1?=y$&9CzL}04KI;;5-+O`y4c=oW=vQoqY$o9*+AEdlLpu&~B?&h8{VL zSBZNNr&MLRgnd1cRb6U+ceTC>{YzV}raqu|1^h1H@z1(#TY6QfeOnw?`2ZO5qd*H6oz9!FL&L!aX=pbCC`x*!jJJ`k5;s z%ws594;xbV<3ylhK>qSipi|4UxT8Ks!3OKBBdy#^&lhMiw8@^Kaa7Vo&!N3u%voH@ zANkjC0I&j{m_atXU^{PfA+|(l{B*CqeH8^Fd>szDPF5j$8aJ@}%GEpsVFxY$&scSP`i6*c*l9L4Q7o z2>uTd`?wU%39F%>si@JJiaie}=r@fErqHSvLKopw{%5P9{Hey5jbxWIu|#uZnu4%A zZgfeupD{;c-;l@6^=2ie&wZ$$q>`o`$nQ>V%F#XXvd3tv`nu`)D8Vje(85sgcc8om ze_1h8m-xT$SvX)i>O)T2d`$(Bf@Gu7K|g9piC^lC<)_Dw`E_Pemjx~GJS^Fz;L82k z;gItT0sv~_ri$jv+mgbQ;1~!n$%A6 zDxUZO#Q9xPFz}DGThwqsXoE^ zbXt46sT5rt9e8`rOzo}Aq+#qb<_Gkka5Qnww<6qc|EwX;HSEy7;cU>+_m`{#3|Jgi z@q#~E3p9w(8*KA|iVtA<VVHRY9us6PU9c- zXVC4sA$%FVD~eJl{j{88u{O=5y!i`v5G#r1@jHiFWguLxb{?E(kqMYL6{%cTsXp?e zZt2!G@7*;0)-(0?si{ftNK^{q9Qot!o^?vvO>RwUb9>rZ2yqI|0R{*!4+1&BG&YHy z3SVw7eXAlYp99r*cKZ{Vfb};&0+P-XKO#(C?PdG?S~r$8M~oR`s_JTwAN*_C+L365 z*U>p45g@iHa3-C>RE@6;muD*~$GV2!^wAq5;w7|ck)d-2WQ$&o#a16Z(6QKhRG>x- z=dVByFq4q_HMDiGb#vnqFMaJ#8AlDTh@QCal0OhkrX~n#Z}-h4!)^~}OvK)$D9Df{ zjhOBUsOpcuH@s(%?%&k5qLtct&uXbZ8#YR`cf7k>X>|V}gjouT8|SbvjwslI z1iZFf1@DxXj{oI#Bq{T6PxV3TCOv7dE<#)V+c(#sDb&5m8+Ul91!a43QD5t`rVR=A zY2vqvp@#Wz!WMbmKY`k7JCL!*i^?IE-`{iyIDrqo7Z3MXim~%+i;KFX@CNgB1Dv_b zilJK3oxag<}E)Nq?V0u}wD*R6ZQGc{HBmfnGBU>(}by ziBoXA{bf&?m1}yKB7&~8G^qW%{4gbq{v^oyCUttYd#zdztm>j(8S8EG^kKbpH4&b> zLY0NcD$!RD34z#S+#ts})fN*VGEg2Nj?^z@yzZ|<>rWM?Y$4|B+aD9>vP5qsP@Ia_ zr{<1g(+qnBaKxT}-j{u?dHq5RpeqJ8+CWkhO7ka~ZjGS%<0@~0nA&wV)Y0Jm2W6U8_LWGq z0q_Y7n}VPf=;dB4a_0Qx$oEcMv>UKRGI*Zhy|s74>n0di+@hMV#p>7E7qJ zM}svoy|KhwJLPQrTiJU{GYbR5`PuB%zaD(>)Cbpd~+m~?)0Y_dY|WhVcX$*gx<%*>U*ADG9jHyAnL z^`>fk&L-gv?~bY3hYP>KIt=RUajwwjGZGTmH=0q*9`sOLT!@tSppILMes*NFlRXa z8w+7T1+fx|Cs1hu#SOq2I^6J6`q6c%Zck7a`O8f3d_r}5h!BvTM(KETM*!qm=>p3n zNKj&lS`I`7ghe&qL)4~5R%pYA?E`rQyX~;W66C&Gw<+IvQC321IVY4}>i9EqO!BT4 z@FU&+ta&hz5Yjs0UJMGiMByp0eJZ?x&EH7k_rUDX&*ig!8`!yl>M^_Sv)k!`UV}Mc zA@^5gvw1G^NznK4*(!B*6|pu$)YbYqIVY}q&kSl^v|uL@XFabwItfiQD(9g&8?|5w znHl7NjAbZ!qTZb^r`C+gq=}8|y&Y%h$ONoQcs$J{015~iHwv`qZ=)ynD#V5|Igupc zrc&iv)aF$HEl-s{-QescWY&a9-v*s1!E zT*XADIqaO>juO|TKZa0mNl$H$Blh3$P2Qp$^4GntICN0_OPVidYw(}DA7r8^)k+*& z!Yc@ixANsHOgc=v?RPwKC6B}ql!I)%hOo~LdZuPjd_0}kkxk1qot8R2>ux8hUxK5;WR(FneWZ!obBS|HbZL1 z5qq`IHwa-05l55~4?e$vVwTs4tzOzQE&hO@Fl|@I2mjLl5;dAxEUP zW-BDXSO6Y8kdLG>?-R{{64)PWO29d-fv$VMopc^AJ~F}iYwTwiC&%Vgp4MiIz_+sX zQScs)V$P6pn>_rW&ERCpTnu%Yv=bVY3}@HCX}|#J|4?;SgkAOTZ-Rxd@W-z&6F4Axe>K$jg1@^j@_0{yF#DcK^`1YXE1B~s`G#nl&z|n3cUw4?`dYc|Ed`o;v3=UnA7;V{dqvPMSrO!Nw5h)L z4EilKhWP|tyZb9JqaCjB7VNsfeWsy}&{G<6{=+=tdh091O<#liH)Q%cT<2-4VF6#k zem?fn4OV?jtO(M1T!=;iFZQK>cGvY%dY|{P{Z&$xgjma|UijxmG9YGE=oYkVrL@v| z+$5h1yj;!19VMKaLA95~x{KOGaBLSmmG{kMT6m;_gY_ilufpd$ZXS}4q{hYHY%WFX zPu@z_exeW3^aL?Kp;DL7gfBjN9t!;OA^IOOG!P_w1^0(@?$9O^s)TBAYZ}~Q!l^(w zFo!wzV39LDrP#;E^(QtvlN=6B96N~>$y5lRSDqF`6e>3Pt22{{Yv&E4=_f*cYw%R6 z+I#L9&uSuujbE*8^BkiAVXyX_1Vx(Y-RIiJ;GJlfc!tOI#IX_xE6Fh?4XhV%T-*0K z;Pi11aVyDjABU4SvQX#}H4W(2gxMF!1vooC2+;C}5Z?Kx6vnTYONeu+r&s*35lt%H zgD%F8r7j10yw8s!w*JJP=@g!fNIgw%b1R2_Gw{K14UOG5)~u2;VZ2hoEY;y$ifb%%qIG#8_C;#XHI7jb3%Zx;0V(IqkL&Ux{@`V~N2noFw&f-{p z60;38WQ!}_DD69(}M21mv~c`PduKO z5$>ij+<%M$p`1g)IXUthbYnUIw6# z@pJuFrc3loYXncmQ^eW$bIrtm;%k6Q$$vlH0!fIg`P+e6Ni{_6@x<-mQY_ThfRlht zgM&aCy8xE>rOj|=A1^XsU%_tIp|6UQ901@7B02T*Lh`VOw}SekMljtS0!dcY9hci< z$y39AZi9jVq!CN@SplEIK=M`3;gxzdCj$DPEyVe%Z>+pK^r}Z>x*C$zV{Y8!3|ffy z8Q5Oj^N(XkGr-4{L$zrzb%x?zYZv^ny)^PwpGQHhmmrK5wk(L9OoiX()}=t-VC$6d z=|peK;|>~1Olh*o{@n-ujm|L^^(E634YbBV{jtVbJ4Mk8VUOoKki;6(TfQo66dSkwiCb9(XOuzo(FqSbuN<6@0nfT zc5|sHXF8D!!Krz%+`2{5jZy{z(X$4DZUGLQQ7I7D^FsMj6%oDik+Ij`@MBwNN_gmD z)iezRx<4^yT=Q9}XO{A^e9xcT%0XLlpoVoH zM^4T|XHdfzzSQNbM7gI539EwQpNCVmuMb&scu2TEIyF*orx#$>AQmQZ@WnXpLG1Km z77|O`I!FBFrz_vr9TEDOR0F9#>et-YC&n$(4YoAzqn5gUNTTxDuU{xe%Y}1-Z&@c#nIkQ*KtKAq&U$(nT)XmKt>eF zU=tJ2e`a1K=D4@q+KS589Rl%NWpG)}`W-XxS%MVfOGW^bZh?i4;9DLM4GU#fAlGaG zqRzV6K%Jv!p7w$raKz~JW9%{~ms&?qt(>uz|NUlnK=9@j+J~dS#ET zbIVccL^Y?41!SYZ*ay>AcbXpvE(8bWH;^4l^K;Hl;pa;FAk2<^C@d3tEE60FF9ls& zRp&$9u8Ezaax>MobrIiv&ViuFuC+Q@0Oc`VSfpS8|Zs~Xy|6p0=mUmU_xhK;L zq&r$uC7i^yAADXj*y}GJihqRIGL>jM9=`N_^^;TKbj}!qXe?^T4Ai1(4km^3BE=ix z`}a+eGj%YT@Vqa5gE;61mxG@bOic-k%)WRwSo`ZYm;DV@!;o5$U~-)*O?$D5ov`!1 z8SrX_Rtj2htjd^YlbV|gda@%+_r^g}j#jnuub8+v1qA@!@|K%}GU9FiR=@mbka5I$ zPPw+MfH;wMeOCCGT_Z$~A9^1fcYJ1of=DD+Mf|Y=(p@_Sds~NV`R@!C7Yt4~<#L>E zBR=eyp<_CWh zUeFODaBxj)9-w*=K-9yuk+qNgbXJMTpiWtk1MjQ}C003g)T&+Elx%1{j5Pi|F8y2w zwz2bg;^}OX{`C7JS@{8%=T*UM8g+}Psy_|BTUw&k)T3-|h{evi>gwyQ*n8Ud>mI_w z`Ry{WHx#mE6mYHw@n*0q*w)iPYYS}gYoH#;0?C8Xg>LEL3 zW~>sZ=DUy4rvdlAGAei}stnbTvLxv27p9-){pRxvk;GHgpR7QKx1PN7 zD;q@l&LS@r{)}ea0F(FOFJvqrzjbjSmtgZ*o)t%(1Q2C#$|pgG%``gP{|23nexruw zGizMjn*_arKL1ZPx|$n2gfC?51lBj)5{Oc~O2W3BnmAYu7LVWM@_Oki*R+jd>JOtq z$j?IasR<0g!*GGW@udym03s3+YG_?Y3CcQfZ_$XO^7{cVW$ZqDzCTLhZcn#aT(b?4iE zy~<2L>jSw9u}% zZFUd`-3if9bTE)vX1pTIyz$_CLPXuduyhH%TX5xeC2xZuk;rOlYIDN1q z-YmJ2{63`LCln?0iRjZlqo=SwyZ1!=Ih+P~z6JD35i9Q#8`|zc?O|{?091+S6=KMd zK*A0GW-L8K+z0g+w!A8wNvFg5VI3vIInP{gUD!wSKuMj=-8P5#Xw$q#c-O74#b_je@3ME(Un zB=&!?9_NB}BlikK*Lnk}%^T|1WT=AwGdb+B1x*{aUGQu&bvRxyA`eBk^MhUpu4HBy z6X#6eZ>H&{UxhN7uIOD|wsp(k?>{{C&Vy13c}F=mi`xJQm9;z)$95cg!Kpe@uu^XH3|Z)9VoF!V|Z;Xuk88Nc0gyA&y*bP9V%fZ zKBY%qh$Z=PKYDJ5_f*`Q5;eRsap?JiPT%YIg8F5|7SEUa>P9b~ON8=|-1#en{&d8Q zPe{MQFL^@Vk6+x&MqkZ$7t*KwSs}%DGfiDip@%-(R%nTJDb|Le0o1r^Eq||EkZ<7M zS+yd7p6$<0WM=S)|MA=jTP6=&heB_M&4U(1RJJHuXLf$W%)o1@fRLN$-=cwMXgA`v-?!_N8uFVzQ4*KaKg}cAZLEI4?Db z$m6E3#c^iG-qANJ2QEYX*Eln;{kGfrYl=@+s2T^nemIYYbA;6v$+1rgjNgUcPAN7#4~b9%o)Q|Tf)?A8EbwOZ-m22hn$$zB6A z9U$3tmkw(doz35vErscV80i-L`3Y?!!Kw2?63BKf8QkjsLZ~f1-Z65E_mEE*s|9WJ z4U)&{c!!5Ud{q<5j;r9WhFCAKPV))Nqjtbk?UZc+0}}*qq%rZ6`sD0b2o^49RsHK> zv)u!glm7K^z82LvA15W=t~*Sl@!UeZB#}4y*XzTSWx3ORjwF49AACN~zx^bkm@wVM zJni-n(Z6UumY0Cv*mFIJWkao_vK2VuyBDx7hP4gLh>3FfQKm#qJmD8 zWY(74H*JsHJtf1^buM0gl^I3O@u^t-UoPuu& zJrqK5aAf7+jz@(+sva%@bz%2~9D1H7;g)imIrAcl%bF`rs#oxWo{z?ibovGB0`V)| zA$h(?a9TYoIbYLUZgs8GWL)G!F2QQuE26CWUh9Dx8>~D!gyaFNcMtBb06U8F3Mc*r zz6K#)tu&m^zU3ClU%-1ey?Rtt5h=X6#@r(pQ75!fo)3d5^MU-n2tR(g|B>sfyU4k z`WufVDmIYTaULpI8wR9Z9~XazFKIL2pl~LV!^N`nfi3RCBf=6LjbwkPM&@Sbt zAM=t@;ehuM%K0eRVg&?3(Z?dbXno?r7R|9=iU= zhzPG3cYbogn--deEQd_%USfNR6{$sSVw^aF_LXy!qDU{4}TxYGlf$<+zQb)&9q>qB-!VEd@MM zbe@MfasEZMp-j+$IQ9koAB+lM3YjYaLaDDx@P;}uw=>g%pe=>mv2%F0JV@WVW-U|O z(%1pW2y?p@0}85cMn<=(kEpY@;eb(t)dx5hP}oF?wwzNOqO($Ci6jvw&Rc?Q@8!s2 z(V!PFM*@cCy9?!%ccEftXE+nU$!MucjxASqRJHG`0#L`D<{rL=+&ei^a_!1nz$V+i z()IA0hN)U!=&y?xhO?7;6y{uR62LtR$mo2lpmC~~?i!$T??{HvwP81dofpl-@oA!n zkdJ2GK{s?|c__4Dw|dl;aQWl*u6Dr>5rvE25uj;A_)zPxK!b&`HbrUOlVSp_VYGX? z#jVO?c*XlWh#QRc;V7ztt~jbHLfz1B3Zc|Niw!nk;>2aJcRZJ!!wn1T$aA92t3$NA zUb*>(i2CzG?mPv#l{}L8B8+l%Lt!z8eDHa*{bqn_6@V0(A zob1I^Daq$gQtOEZTG}k|*9A@a0L8@p?pL%dJEzPNxh*^>y+9dQwOGLwK1ewCCi@0F zLjNBATmHn~kbkFonEUtHekb}XZ8$G?BlXijzHsb8hRd-^iP-9i)TZ}7n>3_&6xw(E zvGIYqh&YFmAK$YQiSOLq)f^3N#&N#_0F8wZ=PGp%;3Q%pTV_lEW;AWNW+E;V7;{fx zH9m}E%0Ra>RapPQ864XOo9=-6suF?eBQIUm2Ogab0fK97zjrkWHjR0_`5p3mLNt23 zZb>cFOR9mKLC@z86I{JTwIv^tU!YnW4#Ca z64yOI3^Lsdns0LhnX~AWx1l`K*k&A;`wA}bSt2!dGzS_srDA;gpX(dSyBi=8hyr3H zLPK;01lp>GM6cwzMXzkFZl7gUrSwSjt8g-n8^?)roS*cGjy)+K_)(}|cK%MUv{SV- z{c@m89{AwWu^;|2Z%>N<#X^pryKw^4y&8#0-}?c;%OT?2$K{p!?!nMK@p5r|Q_L6O{+VqdBEJW?Cbs@}> zhX6`zn4EuhLeiDTP2P=x@#eF;`UsP`8TAqMy-h^XBe~)j|H3uZm0Wh#HkW;d5kvkE zEw~sPRGHf2)v?^4;t%;G^?qyWMCd`|a%S3db@6j3Cd-|_V#g3Zf24aNgl+hBzvM#N zR`ip+&%3lKKJb|j)zIE_nQ7jP1G%xnobpJCifE)tGig+Tw6L zmr#DIIlsxHj1wK_xw4?lXIxWjgGb=gNH)cAO$ybEuDdsxPMOVP+ty{eeTbG?#~54h z42~)y`^fFqIpB_*pKSFZ`Z(gLET$Ie*AdRxr2iu><#GiD&HHfr!fg>(_r_fGy7FUL z*@ve`3)1=DSAQy#d8L#1MHkI#Ww6Cv;cB=tdFQ^T%cIypguA8V%C!s);k$! zVW8d~z@6WUowIu;AzYuS{#JX;4;5ZK{O6a0MZlYP=daa&YDQgWy&fG(A*XI=`#HrcLml3%&}G9 zcMLZ`H$|?OzS*QX#0zhZENmm7gx2JtrY*5%8t}5!a^gjf*_uZ*^d_@Wboj#m`cuVG zXH~xqc*6Rh-5J@P$h4x~(jG ze89HeXr~Vw(DpSk=~6{Y&q4HVV%@#2wYvG6Cyiyjv@>~=hqA-Z5&*_NOkS{ai0E<# zAd@E&H*0|EDm}2|w2S;u^58TKdoMZyh*R*(P?CR)m6vJ;ix@|Zs@<;}sL(sk+V-(Y zh-u+pd+7ry-<@-*X*Y`=M;qRh-_8oAs#xwA z&ELQF8B)_|+${-OQY{@S>{=sWa)8kZ%hdvWb^;r0tM63sJbZN?pNoiS{_QO<{Eq71 z$$8?MF!4QlZ#3(pyCwL7C@`vD9nTj+S)|2!7}fRGOU;2OCca)OV~5?$QX4yv%FZZf$OAF%kg1D^{}- zv$!m212VJ5=SLDlDNj#p8^4g~fwyPYj-V?g2jiZ;@ee94{)sUT#d0K{MR?*OOsFBn z@i5yw5h>g}?)gk}eie~5GSV|qSGVVOOG*`ruFvjOE41U*_NpxctAgkDM#1lJ*xdG) zKR#@3uLQacqSm^-saNz6kP0N!Dl+aa8td_um!WpX3~Yn%Mrr~;XW_o{;)X1u+*r!{1%tYXa0{JpmMK{BM`0LH0hvae@4OG1Q@3(Ku=7Gn0X4~VpQR}nIAV0yibl(45 zAd?EJ58?O60+iggFq|BnOJW!xmYluNc)daHK)uU%9p9D9=P+3olsiw z0cz$Qf-ed99`@%bj*-GMjDxQ;H=TZtgB9Rs4)o#e`mOjNwiyGxW{zEUY&b@PtBuM- z9)A%~jmFfL^;Pr{zaeN#(+AR0sFr99N4epQv2)zBo5nb6vUiW*fWRz?ws>@Q%m@NT z4rNOZg7`HqTqBwWIq>u~7IM&_!SL)j=<3$n*LP;XBYWv9jpkS~2Yi)7$2)b+yg`r; zxKjLbtgrshv3lf60C%a;z=d)=1Gk>THx;4gndS<-4Nxa+Ak;L}Y=D=#(flyjClEIc zGX&C6vHaZTL*SFx_jwea1I#V(TS*q?9kc*(1*K+5>psB_^vq{MaqlSB{|4_39%-^v zx!Cr6l5O|fm4G-AhScw`M17;WG~oGg$Y9iPxHsn4I6d%7`}fk{x*z8AcnoV_U>NXF z`>_e4a7^A8zOpYkeQgBR7kzMFl@r%GWX6V}H{gAPbq4g3?o7bFq&Of0aOVKM2bDt_ z2>>zMet_X|lGunI39EtCM9o}NAF`M@0Q{H62AY8k-6SD*p=Ot$b}x20y&r%eAs)B| zV`fK9gy+B*4cMsS*yDe)Y@Y~4XMLc4yGaQodZ0I|CpQ~dP8)&U6v74sKxC&$IL%~i zk+%T4jjdI|TE6NP1@+~N8|#x5^jlNlZ{YKwUk2Nr2)srZo4ep*mZwc7Eg;f;z+Tyh zsve5uW{>KYYC>UbF%gYG1*4$V89n{qQs9#st<{iC$rUxa=ST<59JC1d0E?pr!RKL{ zW-Bm({a%^{ScEXpM*B-ou9AIS24q2~=Lv7fN<|Ioe)76Vzfu9MFZz{nI4&Ct|CTcs zV4V1@4daZG!RKMwopuR-7klwQ(AkuRbK6hJSF$kCwvsqxidszT=ZWxNeHMrwOX; zRt{Q>@k`nxqrx2HKXoaKM~)4lC!b|3zR9H~CZJm&GpPAxo<`RI@LAlA{&D;REmkl# zi$0n)8#T3bmxv37@YO?V4J|a4&lR~g&_4OnSdM$Ug@~zI0A2qMTN#Bp81cM+S~~DO zGZ%Cd)b~Z0;`PC5GfG}9KV2Y!b{s1H^TAR?_3=CxE%X2!Wn#_MOe?mvxGbDx8P#d zxR6wITsgLPr=GZ&Bjl%De~_#S<>yyFkxO=3&YaCZ4q@oBd2Ye3qO_aaFI@Q3k_Atc zPgl_OC-M0TtcKgJ^A%h&{euH@*I+D48Z3y3Fle?Yglpy#|o22GjeV{`kXL56k+uR zuINe!;sSvE|4-{ApAOiVSf^Z$48uAF`?Gj2VH#C%Yjb^>MJ}2^W*(=y#e^}8ZDhiL z;2_d~(n5VajhM{?2$?=of^y`j*Gng?5fXV-2jL?IY4Ec{KN_x`AjD(XEPZrpRJ=&j z5B>nOrw}+$Huh?g=y^-EXF0$4=s&+STwA^D!-dS^{xvI}=uExzWZON9L$_puKP?`? z_;Ifj6=Zoshk6FYW);A&TExXBIyomh+Ys-*0P5k;r`*p{2hR|OLBpDug@D*w_H&Sp zABpF&2=aI$%I*DXdhp?0(T3*cmXZw~MV$FiF1_&o=nsp=x%z?HD_cGN-NMUx=_eVr_0lCdmdmHN9-$*UqxV7K-EB13_LnxY$4>!kp53E=CcWz8M8L zj0+a+j{ODjzCBxe$HG}CN$bbwCu!e<&J?RRyShM9=K*b?>)_AGL38mQ0N%-@5%6Gm zqXNe;K-s9cnjq#)ycOgkAZcHYDaZP%`E!t3#!ZWF`OD1NfJ%dV&JgPN(f1pInV-=v z{yelz);^3j230-)1hO^cnFTO%+7d!#Mb8ZVh;x z>mK;hUWX6_7+b0UwMH5kO0B8nwKNUYeOr@#dYO8-;e?ck&BuGhp)Z|^$2r#Q0M`Au z{$Yj_xVy8lYy-bs1?E)XAt>m4CEnayO;q<)kuY?ZFo8ftU4P)RD0!^35sW01jVxSp zK)7G&#YP=W+VaN)fxK|0I3BGCr0$+wUquSdAA8?Vdifkq;dTBKd;}Pa4&x)VWZ1kt*=`SsZ%`11E)wOI1f9Uo2`GjT9wTOY0%@~ z+GW*s`xLYqM~h$hVNUE6n=W+V;=>}%WX_=U5%8EM5_hcMdMN4@Q9+w2C8nN_5!5M_ zmztWyK<=&(!Fjz$34h3067Wf|;oFHs*cHy8e}b=(*j^mVfw|_v*9LtS;0pkAa5G8| zU}UIPDWXPe)#}u7Y*1z7-SFfbiA2aGAbi|D>H0NMn?1xBtj%#R8$rJiwS5(y?C53b zxBp||Gx7Q2tCE55A6x?lbu7`Czl+B`$Ki~C-0t01+{dkTH@*GaV^KIPXipdS8ty@PkblU`7i;fR3+A8Tk}1tgz?=F>xzKdMu3|*;*x_B zh}$NRNgE!>v&g8BtTIp>@9CsDG-u3(DyC~<98J5Ngg(CXvCM~HEmB~NCj_6ma`Tr( z-;Tm#EXYI}Au|)|RhKLCUC0A7qHjlD2H2ep=;;L?I5G;s81WoTzzPNY_KR85l~R{F zy?&-v{o0W5EmdP=jP=~kc}EMuA+mnQ2g~F|-365?^xpJRNq2%One}72h|yFdowM@7iJ+!yMyXy>4*}M zo_BhLfxmm^MZ!;aFnV9O1wHKzV14x?lu;D_{Nz{%cJ7vk#w_T|-`iN!I{7Sd~ z5J#Pzk+M&$pssMOzNn8Y+lC4cph0O^55O9Rz}T^UT3eP?0BhKag4P2P(UU!)$1}E_ zEl}?5ia(sVa+$Q~82JcYC#$(763_ti&&wEyCxOB!BJAIriQZYPyj#=l%dTSaRHxW| zji_%`C0Q$tz?y|Zk3SV`eM(KQdH(Ab3H3v?=k9HuYrJ$njEP6(jU5$a$tWg(2zoHg z&>8@UI3o`k7p9smCT=eTVdF5*53J|i;*%p`tTFKQ4%qov&m?y2jb6qSN5*<2vBPiN zWK14IFTQZm6#7ig2d^Xj-;A=V1#VAdz3aJZ+tbvEzdSp>=LNNDnRR!m>RGn%_kF7D zl73tLJwDIibM~}>hnf0qRKiFAY#Ff6LM=j|GYc`M64q^Rlt9_fLTd9)Iy~`8X=JPU zX`j&@fU^T`fJhb@qX9~L&+T3hO=(TMA2SCf=0{!`YO2mH$aCL}l7|_pK2VhiO_y^m z1u*Y(Y`#Ne#D?thtpAlsNy9_w4?hKbc#oE~lMHkN(iGItL8%_To3GG8^#A&jh&5^i z58r^jWd_r~RI2H$yZ9A!6(+ZN<0^6p`Xn(`JXARBzoV6w2rSm49JT675Z`yE$zvXOm z_Ry_#>Nj2P)xKKJr-GqO8}yX}CpQ%T^guHvbZj;O)gWXHr1%FtQjr{7FT;W`;?gvf zpUX`<366)oH`Sik0NxHlO;wSm>hR?U2~lgOIR*sWLI%1|US&CYh2W1VifNDffUsyMWD*ki-DDppJXdc-V&Wz?Hk89l6FS{eL zjtRxFyn#ao4|>fuhT`#aUjbmKQbN24pjyupP?Ma#(ZD}OUN%}PxI2T`nTC6Z%9@1Q zJqPk8>&k|8nI6ty-Xa0S6q!~T8pff1U8l$ArBU$ZOuvSW(-{2YDbSM%^{hl6Ar}JG za%1a1^`6GJ4W9Ff%Pq}7xjZ+NBl@enwnKX7X&lfw*D6ym=`yso0#Q2@a9K&22euCo z11pY+f-&IvfLsWth|C=cQ9tuJZXZeyQwE9TVa%GcLz{({mv-LuMj4z#<(I|~mKqD$ z2Mo?EP&wParqgHoeWhYsZY3Ch-oVu{=pmaA8->Tx1M5P4o7I$UqO&V$n%Brg2GNB!0ZnW5X86#*19u}p z?Rv42^bkh;M1p@%fEDp{1AhXqRyj_uw5mc#*AGl(1qjvSkU-;I9)GjRIZC>j)pg@>ZUyVpt&>x zG7UD^v7|L|3ix*peh*VTXfF6dP$TQWsNiv$xteK|$oJ#!{e;(nO8<9PKtMW4&@Jg6 z+O5E~#Yuu5iHuFt|HU2Jqd35=Xd20?wN+K80o_UWN-)i7MkS-!8SF4~fP?=8@ThIM ze2C-dt)HYG5L{om8Ye0VIA24ENFoKD1D_wnv~Uj;5gXk`>sw2Q>E!@CveDD+GMec6 zxs|xEt`4(Owy%%GVX=OF8~rzG$_|VMe1L(zc|i2KI}I^T}|!AbZ& z9xK|$qNjbh;ky}?5}58nRjTrQ`iL)6adLejryb0+!`7Sk#WM6HgWDvPn|FfOECz;& zS+MWKeJW-f22Gxh{ndVcAaH^rR|I7D4TUmV5i<@wXfvrSD#g=IBNVy`o{pk_i9Eab zyk9CHsH+T{14#83NF7VujH1ilqXjO&pMZU^NL&2SBd0A8Y7=p;5$XU1V{wm9kN8rP z`*LOicL(o%{U;DKB=&IlmM&2NfQE4WFVHkmM1q}@_f0eGld2TlU^s`(gqnso+l#-$ zJ|#XIyk4KhQ;^LQdV`@z00NXp)#{(ZJ#rP6A0lTA_GT9}#{@CO5x+g~W+rtt`jb)N z=;@;*+9i*)L?&yp`^NrvjUy*rQq>N4?q@m9#n_(V9HGjP)g*6hiUE}{$rE@ntyRx} zw#q8W?}e9W$?Kk02tGa+{^Gd+K!p7LW?k{BYUy6;!%hY#X9*m7ezsh;+ezT#!8mp| z-+;1*jS5{54*wC?A~aBX-d6s!^JYw271#3Up$HJG`22?UI25YZG+1Tvz`B64=(dUj z^ehkgp(du8XYY4`{ea_ic)qp(Gy%7H{I*m#e^yh({qiiT%}jfv;h3*Z-Tvt7_rlC`=Zx4RicE#=N@_`!!Ne4DqLUjcm z>RS{zeI7nT0raYnAp|xEf%!60sDO<)U5MZM+*nHj8}DNY{28#gYtrFtBk6;6b>tY1 z;T#Y?Uyp!=!Lj#&M~7eTRa^c3K=+Vi-yQv8-oPES{{4;D$;taTRlkkxAe>=r*LdVu zM*(2_NC4RZQ3wF=8BF$8tyOM`r+=^Uv|@gwN?Xz$ddn;**_-4L{ddSGN4Y5r*bmU8rP#8EyuA9ZyY{;i~^_OC)|Whx1?*~{~>o7)YSp&pWaxH&K-LL14Nq5^_bx`_T{ahBq#`UaZ6-=i~pQ+CqTc+phI12%Kz%B!k z$Nq*49Czj#`b zolC%x9|b}AZoQ%*z+9sZ{%S~>@jz?W^|xLlvUI9ndWP%Q4)(3Do?sZf6p3SL(u+O@ z<8bVO@0@uSTdj1LU7n%$Ne>0b;I&yF4ewFN4Avg9nH#N$vsCu>64A|Zag|mpN;LPh zLQFcDdBh_cn(|~+PtUQ|`B9?`U0u7PJ;`lM)#(?SN9aH*DGEYIun&-mV^PnFV-^9= zwWo1BRH3;Wtq(NQJ}a54w zBEKXXcS`X-Y@Z*U%&tXi-Nr57Y5IAr!JRL*$WSO`na#)1|EBFtpqjY%_hDxyiwl7O zE(l~nt)h?xG>SkH)VJ1!t+k7F0b6^2rL7Cv<=QHmUb`zw*V~^JMeSbESj)Ayw`!0s zb^#{|2#O>F*w%%Zf#B8>c%SbiXz%}j-g83Fc@HP6&Sd7heAegld=l@M%38A0kzO-G zq}ST%G^44uTZ2xFY`Zhw4H}M)cn#50g5TRzl|G&T6TA?PBy=!IEgN(Ashx0NyCHms z$-?ZkeV8%Ko)Tdn<`1`bX1JW-C%^8Cun#fPn*MJGyPP)Q!%l^V*%>!=O*B==Lv;tP z71$j(O+ z@S)NV>r>{hP}S2v{PYV*kS^XiOlAjv`;V-;B#Vr}A~GK*4aW1(xihd15jr0fj<^z# zxw>hvSHL~y7OM!f^FNdmt=EcUIY8{&&(8b!!~8eptb&y1BS${4pz8*go#bEhw(o4f5~R=);v=LK>Ca zJGzCr$6a|J9GHpxQs)bRD|&NgWi2Q1;%TJTM~R2_1j=j^rp$YLTfy-IjKT+0V*BOm zz0dOUYgzlAI!a$XFpgj4iz@b>0=iKO+`sIRew~YORLf1N|xh6W~o2s3k z1<&y~&XFXXL!^9051(h~o~bJCaeDM8jE~OQff6TzVh1!vfU=Vp;XR%j;D`s`cZ;+p z_Lo1~PM`e+-(tc*jxob7#lD_e3Eq43Kbg8=Wx?@dB0$v;8#zlRCMCyny+>LCk~CJf z5xq`(!UOM1_!2ql+h@bi=szAM@lC&8|5-wgR@e?T2#2rO4voraQ20+Cq|FI^y%R+l z0dT1sGcGh<3(CD|87nO;jY)A=^+@mHO`^1f9CP`@Ke}d zjh33?OW7V&&54Zk*?+BohDE&y>l?vqcb{9fZ9b&k7UpHTwNRu@hLWT1CUJfADk0+- zzV`6jgI66qHY%`6NeR$FDU(NoMYkZaLRJa(gUFPonukiyN~R)V6`8}z;`z}%28*n; zMD7}Em2F7i_F`?^Vby+Bde-+eE5|v5IxO?f;5qf758a?SgD`KvPm$aO@#*qT6h$;T zq$2IcT39jwt2K7$H-VnAt=>yzn^A6O`ySCJm2HKu{$`fU$D~ChsI|89L-PWmrQZpnqCuPIA;e4)lE^LOMscfv0cw6ey z9eA&F*CnEFQosJs7)ZTjaP0`!5bD|qjGbW`(fwpT@&_<>Im92Xui7b}f=M6&e26v4 z*K~=^%sGxTJxorqu_TMsu3*;#w1(Oh9og`BYUm?hfxOww4>$9v?DNq$1L-|M*2Z+w z-J_b>2iw;vn%q>?&$_YX&} zPvYWdP%A6&?|dwJP>GC7aPBn61Pl9U$bRCJJTVHq8G*d}|y*Y7)yAVmaj?EzvF0ApAO zc}&*xB78R*^7urNR_iylAjS;zpc#EuTFk;*9lnM2TL3tr8O*E*g6jVJ4X34-AlZK( znd|daY2O9q{57;6QT`o4ErhL+#RDP|bQ!$Lhcnlj+fI0EuB^?+SxqFWN=_(*S2;7S zxyJO4WqZ^4R4$6(EdPqU6L311%U208QmZhRB86N!%*WCSwc~O`Wp$w_BSIsZ{$dYH zzcOLx{jOrACzjIY_8{~xOl&;~`U=X&kCjQjYNIuk zr(-?b)s{uUWtby~!Bi;g-ZWd+*i;?8xVNqAg8q-2of?aATS5c`I+GlsL4?r$8=LB; zlRQWWi4Oc7W#Iky{1^6VRThzPT0Hb@$m-$N?_G=wU9xtVRhdWnyl4H3^aqEV2B zb<1Hzlyoa847!;E;1>SR9m)crYw9w2rmFcl=Sg z6pw4_fcOwhkSX&%C@eUR6rW%^U%c*5oMvphe$%B^r_v;wtD_L(O>qnFCsi0%wtKGk z0>cO!iOO#>9GXK;c1e&$x~Yr43|j?G#ek_)E|^Nvl3d3X4L|xol&FbGWM{h2NTEb^ zr2!=qspptPUXkUsq1dPeQ+8{=elq|rEW+VTcu4!>TQ9W$N3?Q;K}W@F9^4+@Fl-{! z#mCQ=Ik1kREgzTFJBsxwA73^xD^>wW zSBzdGXX~HL60mu&2WK2jX)FqV`0(3dtBxOI6gCx08(C}wMa_9^!bzzb^<-_j_hL8o z#PC`|&wP+_#aGB=djc;-c-d@}rRE<1+J5gnxZOcQ4@c^XuThpH|<3hrT{bwoQ{U)f?{PX$q+3I2I-DnC)EbXERY(0O15jd=bt#00L#_N zVl?-($m$QjeI?qKlhfHeaa`xIC_bqVb;Yb`3=j3r8spj@rOxF4p`?yehqh92?cYca zcC8MK^#wx~;oT&;#H1z+xo^ZJ?pkw9VEMxY?|rUJ{*2tL^dNGwqHK>oHn(M?{7CEA z$coWcgU|DC>ZFBv*?wUxAIVSTzW8&`!h`S3I1}<7%qDBA+pzoWcwv4Rq_sTVltWUo z8t~So*$$CrCw1&DuBx-<#x~I}7rL3A!-!Km`y|l%t8c$)qwCUdt?hyMX7>u*cvV?M ze@R7C=YKE0hCBAc3`$)oz22E86<Io1IeD9bWs8Ev&X11WRmo zYOccCTL-E_5uSFCGE9PLgDm)%=u$G5Wcyyk_JzqwY1C7n*bkd?aZuTBQzMt4^-r|K z+vH7DqI1g8E8m00YDLyGeDnEMN;mbr%+~9j8w2sL*g_&ls_t;qmX;l)fzU%{@AMP=Q}UtB+Tfy@}bQ z)v}J!z+aGgy%FfW1B`0Hb8`0LormeQ8;{F2tWoo8jNFS<-ju{Wr|2HjcE#z2mw%Qa zg5;}~xtXSK7J)f$q{T)5Wc1WS2_45k@1_gI4`P474-VXWL}d8PHy`Vpf{iShwsI?V-8J5phn!LBZgj`mj&5fL9oUhsdSO-A>`clTr?WmqyGGZi z1*?9%!a`-pj7{~kWHk=%>ZX1>n8NwL}KF@qYH*9 zMshqJ#0MrW!n9h+YPflzQsC3({5Yt(Y?CLZdSb z5rkMiwOuWSWwI0_nQgM%ZOT3BX0%DCJPzbOZC9x??M^%S_Yyr%Jgi&${QCj)X${(( zpBBvu{n~@a2>paYy*j~hsP5C9{ zX+W(NY(n^MVK|QD)9%7J{*JX(T?C!jnt(d67+@gE?b)i(S{12udUj9;)0%# z@+0c(z2SI+f778it1OH7Swp9rBbul$T@qi9ihtPV>!#4Zb~m-e2;)Qa^)&MQAL~Rw z$qwS0?z1c>T;9UH>ZWEt2#eHC9D(*YpDT8HZw*j=5AT z6h^rXqa7I*2FrfmIjapgvj4Sld7>wVri!(M3=Y{-S8B!35zdCC`pE=v@k}I&E&qXU>pLKM4VdC1v2kBF|$Dn^Q zV*=J8!HoaCzDSz%w&VOw*CIGn2v-*fX9rYNwR`qwOz!rL36qw@FH^{0$;w`FX7Ich zzpL)Ci>p6=RJQs1;X6}4R!m&x%S9qKm~%WJ$QrDZrT?b9*MO-bd(Snz2Ku3Mw^U+B z23oG*s*!I%!o(DJ)ai^?@PGG0K|~z|$f8yqVb3t)pEj_7qawwC>ik=4W!ldJh@BP? zI{>n{KX#}RWU*n=VVNom9Ur?apBEKs4t&6p+4ZgzI%%~n{fHO8FON@7g%Q}{9aWcEE+m=_#x--TMmW7{UUB2mQ7EsvF#w##-g zwXI!X4O*%~$f;|$=&X8dB(4WM5JZ0*ApQ#S8iw3aXbRx7Bo0pZMX|tCzNj$gEF3fYUDK$5z}k?GWWo{c>#B zGk`vez`*8Qr$P-Ry|=7!u&i$J3+l5@XIL|KSJ#ETt%H|TP>X;!xJOik^;R>%SoZ;fxg_zafnY9!$EFd#g~YeUw1uvl0&+O8enMSyLD_v^AaSQa z4A?M@#6^g0ltY|z<->bRvYI= z@v5x06|@t0@t&ibtVj1JMWd0s!0{ODasTlTDJZg`5)f^f_jJz)9@c4suvD=n1D5{! zV$Rd;76C&-wZu?5P|BpVtc9Ecipz>GRb7|p(^_|U4yQ@gur&5K)<0sSq=qFMkIyd^ ziL^`jluOMYP+G)5Nj#a-q6plysZ4Ly6_lGI5(-+vBLi{f+acx#qPW>^;)?X!aRahz zg7dpu6&$;}2N25_I5tmKeMZ&>;fNw!#4gw#zhb0Jckro)AGth%H@PckTaT)v$M~YK zSykvgAoo<%Q@a%2k5Spyt3_$oycWH@aj=*F{~PuE98mU5M2AxQl4-hx?GNa=9eC4vtcl%I&t zFZ#%|>UcR#B%F~u17pEmvu=n~1YbU_WHbHQz9|>hCcZp9>89y;cJk;K2aCSA>&rvz z?544CFFnmYmlhs_@Sf>-^n*`v7O8Y$AkQX@OZdb4p2}daf!s|PmdQr}l-VuWjNyIRo=t40CF4Z_8JqZSA{{9{2={XVGYPMIu$b_e(0?t$bI5l4co zH6Uq;L4(3Nv$5st-;pgydQm__uGfaWRKz#>%2s2&^Yh4 zm@(Xk)Vv|~;g&PBGrDdR_X)Kl*;&L#bNA3eSu%s{!%$^OzuY5sHSyO|8bUr4xCTK# z32{eqPpc2%p6YNtW(d!tEXND~jq zVPi?^AnbdVnrO6rf}itt4%v{z(r3ED-}ZSsBdT}OB<; zVn({q;fADdIjQm6Px7GT_@ZCnB8ZY+SW1C%^ylZsTFa-d1yXV&YfJ>SR(QL@8}6VK zUT1`Zaktv>?7N~iW?{FQ;=w}J1^$->V#1gHKzG%F@)@l~;ZbNXn=Vd^2>Z>miJ2a; z^&4O6hD{ zP9JlV8TM*qpR;#4pTfate%wZ`+mJ=_$wVK{gbNE3WbTnd?rO)DeixQ>HJfA|lKODP z7o1mel2L$PGW^w{rA@3!w%fsZVd`WxvI?0!Tv2wGJp-@{^@;?125zNrK&&KnCdQZ8 zIf!i>XowdC4BTWyKpr5v{TfbJCTr&L8vt9c_8*!*^!yt}aO6z;o-+PT(A3w@6!v$WK>;SEOBv z*05_B)ULosBXits*tOgs?CpA_uT8p2Q_NFTUaS3zMp;_?J19fU>{38U{i>t#A<;l_ z&4QM?(jR3dojL;XR&nnbrytAINc}o*Y#4As-7rMX))8{;VPUhysQ}CGe3orkvCjLpHj-Bjhbd z5}b`At)6*fy%}^C{{L)%jwL-v$1ohTdS~^zxSk7opm3^tKTjf zh@Tf6hutLpNA~Ef??S(qz_ErbG7dz)4hNXL&DQOfKQc-kM@uNzm{Xt<^-TR1`Sf9!6Jj7Kk*7agRPS}}LLITlji3d;sjfiVHP9jK8m z=nL4;lpFn&)qP5~@+sT0OsX(-{yQs}?ki8LZJRepnNlNihRB$ufEODw55C=J1cxa> zH9n0{Li2*lG=c>k?wCmMU>x25Y&2h@=VZU4WwA=xXR^s?*v-Y%Ikj9_ku#*{L}k&8 zpC~7t_^mg_dNFJCS0l6HZK6~rrv$ZjOS2I3>aLm*`3rIj2j;R0MeDEi6J@d!5@4hH z&^sGcEW8fUCs`*&KAw}S_&fL!oU1j_Rp8p@VD%9rgB%-UW~KBRE%*Z>;DyeH%GvyF$E8C8X9Ct+7?ru&F2$knhRUZXjg*u=|4tU zY98NrP$yb>AW|Amt}AoUtVqGar1!I;)<^-(-82c4n3ya>RDKdvBrtL}X8JDuf8hi5I>(p_i z7ypxO#q$&Utn`V#YO3W$M3r-N;-=-yZ{scJ_Ah+n6YFR-le3cE_)I>oE4atr8;EQo z_%rxF6(pBJa;vZZS|l+`(RhHL3Car{weOe_`5+MD5Qm3`BUGzJ-HmgYc@4d4I4r_Z zaIw%!a~?kigx+4M4E!+-UgrUDSk@4IC2(Cx!=D72Py_(z6_t_O!xSvGJ&<UV+3Qc>}(dIi15Kkv|wgsIn3Rq;XT{% zIQKq|&4wK}r@JbVtO+KkO={oS77xUWhF2oy>a8w6R^11lKaic7gWrJ_$15pWDINNq z?LPL4SU&QP5w_M0QBJe8pR08*;S~y1Nd@OBoz(P)dQ4Ckq=|8_1mC(o^g{!9<8KV* zO&BY3ED<@wg}p?Z9#(s0-Qg=(UvY~^51>)F)^GMiIQyIgNtNX{gRwY~J5O(%TCu}2 zPe2qQ#+W78BWZ+}L@LSN8K=%<73!85W?S8tRIQ(Bq3j(qFm{B;v%>Xpw;jVt{RqIY zyhm}aR@tM>TUkD_fKY!tSNkDmLRwKi0R#@k%^Vq`#K@}EF>XFCsf#*2RC&6NI zYAkzp>4DGE`R_m)@3aH%o>IGMx@YK*N;P--SYkDr$2FZO4A3*LScqPJcOy};bmDbZu>9m$i= zu!lQ*uW$>)W>+X}AB$8}-8xR*zZX9phztzc0Dt9}%0~x~@5&{z_J+YoWDYRz^eQ8l zM(0(V=_2JDl`q(+Uui`HJ^$-?=Hk7cvZZ` z_q=?uW|jSh?9h^!2EEGiW~&TZk(-A?a%vYED$={|g!;ny0&zD(#eK`LAH!!@KbI+N zVb#>h2DW&MWyq!Wv{lD{X|;4Wn^w~o+S}Qi)3Q!k>zRw~?OZ3*9fq8<2_==@6ri~% zgcw+!FK}5EHXc#{vP2V!dUGiwasGFJy?~GKe7b*zY81k&o-~pc#Ekzd1n%L zf`Sp0MJ+4GSwcb-$NE96*8O^V2ZXPe$A5*6*mx+p{Q5uF&)1WR<`VMD790 zU*NwWbt$Rt87t02BUDwFNR5_>vQy|xul#1Rdu%)w`6hAQ8m{ca-3&pZpP?VRL_7lO z=Lbm!DhDAjO}mEiUh@Kfpj#NY?s9Uk;z+SB^|fhljpP@f+BKuIAa0U(1_kU=IwFCS zpw7qJ!q(Et@qD~|6#Kk`?0?iv#5nN6Rhev@7uV+q?q{fjvz-Z(fY8-=wP z>KF!aB!-ycqQL6QT_8`dYkP8qtvLtmy_Lz3M>zqV;DqIC4 z;Rh-&8op001ripdlvBVrsO{6r*A=TVZ2j>HfeTJ5DTtSU@X~AQw&pLMrq=6q_Ai;o zZF_uOl~l^GJAITZYwKXY#~qpW1>8oyH69Z+@GI;1gl2gsE0R3e@cBPZ~aml zHe+&dy#zSXLcLe`K!g)SxE_=wt3Xst zeJ0fQg?b;sV?HLjDb!;g6Z)bB?p>mzb&PIu^YWh6 zKGCb`Fp55Q7~bxk#=fIH)jN$Yh(QG~*EzpzDDnjnc4k+sKiV(PVQZC03!9nTIjB6J z!arNQjLdug^$lFFSN)Z7_)EtOyW=r1vr9Rp?GPH+Et-cSpI2u**Yt~g+%zI>8nSuS3Yr$a=<=1 zfD+z8%LLmnz)KIld$E_g=#god7FTOVgi}GCCF zFLPk3{P}_}nIH0~pI)2F7*}9SbA)(@;S18^T%>&tb&OIkjPxrRd;#|z8j)Pd47{-; zBAdZ0EsoTW&@z)=vU{?n^PO|`+amdq?)76TZmyUq)jYN~Yn-ESuv99gqs39&C@SurAAFa#+!1L_c*l7B*j)+Mgb(pL4X6w@I7jl!ZraQK-vRV+}e#ELD{u7Z}G7IPX8NQS^+GLMh zU*Eu`x~Vu>xz9^C+b*G|!%ZXewrZoCTMU1A5M=nts!xgkG6s*a_)U^O4ISx@n7{4e z$T_g>!)&cZ5e9l!zKT0-Xnsq3?b!G%Urv5r{;Yg+zR&oit}ow=)Az@>he+^y&%n?= zogVTw5@HvKAqm_b=$k=8D_4jcD!iA%u`sHrU5Kj0a7xktN|K)vLj&7Y((vfsC%L8> zSJG_%D5YaArd9k8yGEQf2xD7cWgJaVnw`Q;<21Y(d`^Bd^dsnt;XQ(XPY7fMeA57D zf9@t*{w|S;9N%rooIee7CqA;4D(9uF*@Fceu9Gh{up0KYf|;Np`Ja)f=pi z4A_MN--aPG0b?1B$EU$lfflR(QpD+I^CnyoKsy3|YT!IroH{ABsWA`vC)nJChndJG z8l{7ze31FPPSs!mDDKW%$}dI1Sv_MsBAp~YlES_<-ty}x+eA_P&1dw3W(4ej zv}Z~XCm^@L1a3iikFXdDGFF4OeS@6c`y~7N!iwMDjFEVDONYMG@FYK)Tl@BQ3_s)x zi49J_>mA4!l;Dv$&@HuTDkPvlTZK_^Qz|OHA(4;ukCr#Mw4OZiYs&m*ZB_r0Qsrh* z;_{1&TNXuGcifd=+dTBv`3#wacL;`+36qKvFT~j(xSG%SqzC^Yj{i+zyO>68+3lp# z%qNFL@{j`(EesdQfe{!k)gF}jv359wa5vHG0b^8eNS}QNJ_PC|=suiQ?H5)bI@0D8 zD@yW(Na5}1>Mx{f@MCcy?Rt_eUN7gOrNplc$o0T@hpImW%rj(*FvdyYZPKAWeW4JG zDJhocdvua*6S-H#IT~7_Vb*7R>=#bcju@^Ll>Y~*LV9B?r<2Sz%XQ+CO^__?dr|Cr zDTD4M>lby4g!7SbYJ)%sKrg8xnzV z+WVa3L$RKf{@uz}{6A&;*ep~Y+19a?nR<4ll4VxOe@7J)_dVz=HaU((1$5aBL-Kjx z@&Sg4ML=QK9Q=oWPZ=hwx!#!|ZIP$sf?<%A{ZC(#j#E%5h~vIs{49OIz~Ty9nap7t zek{9pEvF{)DfH;+Hl&jn=>I7PgvgUm^iAtGB5dSb9r_t8p|^{6W$=mYw;9~)RQWtQ zzBX!5rXWMBGCsz=g_ppCc+~SKlAh%<>1b`*S?KDLg}QWPwo7`{!O1dH+cPl z{Tq;}2>MxlYsTs;_ZLOcR{*ci?J>mzJA#^01jj|&4A>va96Xu+AF@;KCH{N2;R8MT zWKvr2mOds8AJJ#r?$MdT5P$J;wEdzt;xu3?Ph=goqWu zCY5is)t9lFZ5v|)qpR2HiIdVx)W}=}HKU*&Pxn#EMeH8@^q{)~=ShF?#s7QX1yrfl zghX$6@cM(d2F2I|qWeGHm>Gmyz4E_vM9v4|xm6h?RzdVBwqvMMF6ao1?_}dH;d=f& zzCmlE(WNYbF4O*B7lkTo^!tLQ-(=J8x~(J7Uupn(6@hySI`l&#AA#J{5}l_*mo)5C z4bC8oPfuE`;6gCBSUMKp%VBRJZEKc~isU-Q1}Mg41Uy5h6Y_t>nUok8Ri>QDoAfiA~tOx?s*Jgw#w=v`5m z!%YGiv0rKX$2AmWH>3ort^sq@=CBUPOW19wX-XT6^+EDU4T0%4tC6$oBLb-tqjK9^ z6l=9T+MfS&5yRZ~A&)HVh4WRD3HFiH)qK`(zd0^>y*drh|5z@j9@9Cj4By>S<$eBK z>{YT*NNz(|FQquFU#_KP>Lo4mImZ-_A?td|^XL<%I&Cge-{>|WeIghb$( zc3kv$J$CWYO6kxY71OOVnkHBqC&+K!XM1C4P)3@+8Nh}K?zQOz^A(4OWdM6E@OxF0 zhd4vO-{3K616eQqvVZm?q5qB$bH+Y=bwfbDi2_CnMpBB0c%83U++|`x#$o)J&Q4d! zuPS3~kNN166I7N~ANAFcy@{5t8fmvl!EQEt<})qnU`P=5BIb(3Ss;#)hZ7bXlK^Vn z{}1^_R+zwAL4!B}|0&aK#yTRd0M^SqQtOBF5uRm1g$AxMF`{ePTFCloNPWV_<2tF; zu#TGFhy^Xc(rrv`EcZsWnToOf?P!BM-kI~b?R7Ad3UR=bhGgQOj>CiGS9!sm0)Zqf zxr%IdFZCX^gF06{k$a6YnwZ=P>P>POg_YAxtk~TZzEl9_@S}wnUp$N~UVCul_pGFv zn2|xf_5NK?lXaTXC&eRZ_~9MAGk(-jH^DDhe5_C3M=uOBM)-6V@T}#e6Qy&q^R^{eW_*ah^Z!WF5Gmk9WAhU{@zn90l30}jVzrd|3*xvuY-fPfCK8u=5q69^bKU}>I5#C9u z1NZXr3Ru_L1>DuvmICpQpGQ1lV|r7Vw92d_X_gDpJ#yD@?)Au36WQuCZjN{xbnBgg z^Cc~P1LuQO2+D}0h%WK5nOJ(ccVR6S0*&FV{_OQplvg?|gOfgwEc(V|eifHYAFMwP z?Llf`12SB&>6FmFV%Tk0%tq{7qe@bcz^cz53NncLzHRJLuO^(>0h`EB`5-VAM9$rI z8Up9h@sl9#U?v?U25x6GKB(AF;$R}Fei;1i6ws4SEZghTZ~8gnghYd+#C?ArZ(>7< z1Mw#&T~)M6&Ys;Mmw#``7RNm2(|cCXJF@kAwcot7Y@aV{vDH2mD3FATdWnxN z*HYTy@R{<6y*Galna8Thq;Gp*FWnB{FfAaeaX>!<5(@wlYN7kz=q#-t$=2TZ;b=jW zb?4Mbxb8d{@dR9cch&m~F?K?vQ80!{Z<{`6;Ir~+Irj(*#M(MPC|P0RAEsJ-R9eK= z{EJB2id0G1e zIUDqUSf7S0Y;ULiIHWGymH~+H6&UJb6P_ALJk|+I9jLe`@Ew3D2SsS31rf{?B2O*U z8J;wx5qvJO+lbgFb@=e!QF6d5Z2ts|G3Cq`3KrPKD>2q~aNB8oW4tKX4b&kTP11-i zL`&V&RoYctGgNlHghg~H*qbPg@Qjo7D#YS$Il7WlOwJGVm($Mnj_3ZMmZa#|^=7Of zBk5a4P|@T=@QL;5{aRUY?-|mGy&LK{33Wl;ReQ)diGcedR*Oiu263OHzONyCGW?2- z#I2xnwRo%LeslEId&=mgd31r%@-HWIcAosZ(YDXi=-P>*>>o%xZh^3Gssuk#Sl_qy z4XjN8rc>iZI!7w{%;NzH6gWl|ztYx?#+s6?8Kmy;4(>b_Wm8t3)O9%kvzM0J64maSdVHQMlgE|z)Ml~mqnUAvRi z0_~Z&EC;_27M0-G{)Ko<)%$;ezkfiv{NS}!5;+>`-sxXo16h;vh+M_kl0AyJC>_sD z!vuV4TZW#)Y=$E4FfDtyPr18Px^q0&o)Bv*9&T%=4OFKqU&ohNv)E;a>)B$rq=W=X zh2G;gswNPAH<=8bZz`mI_4e?(!R?c4ouE4x4Ou5P;xQLJE%N9HL_rAW7$BrROy+8)upCD~>%$ zRq5SjV=NC)zB%-&2`o(BFX)_dI!>Eq2h9zdvj@hrYWhIpAj1A>s@gMx2xZbtGxW<3 z#F)=ly-)Hfq~8n4r({HQ31)+X!S-bu9n7oCM#VFqFiAT_D~63~Un$xk8P1Q-@|%_l zE;;EQDVrX!UnY~j6o0Zil2&&~!#7o&>o`{}T0hjuINP0~J}KP?mfU(V-fV|z366UJ zvmNTX6Z{#(5lDX;f?@m;KTBNtV1A-k-n9v1k4S{+>+rUGPn%TaBo%Q?(ommdi`Yl6 zmw!(s>WWLR#L~x<{@byYf#mgr{(Ra*{C*A|2!n-s`6PErj zkKB#rZ&?v{Ffpd$2!Ddr{zG)j4-+hNvzlvUkBS~QRorPitfA`?*-Q6ZFAP~DCpA|6 zYlq}aLcNfH-DxmuKM(>j{eCtTr@!YA@+jKc{nIE^(ruz1H(JL60iIowuju_d`^z)( zKT?P-3>(2_DHrMkNQ`I~u@6X%S0zGnx74Wcu5iu&Zt+>@b;siM?yML!LPX|FJ{EnC zXIRz`(`8eOn^sZfAXZvbK_6IY8Tw7tY&SK3mz;{fB*hv5rwkb{K}QSvG?;V4rqPLn z;$4tc5-7Vl0H&3OFUe}@%{5xTc+*hv@ENohD`jr}J`?geL8`koRt7WKx1o+zP}Y4o zkYn!2f~-TXgd8K-qW$^XM9nzGBis*kT@L|fwxI&FI?)#`Wl zD8_TY5Yuc63HI-Wv2$y`7}5q3YY$%gu1D5}e!sH=dpb@3fncNeuMIj$ah8FHE+##6 z(IT=Z7rhz4Yh>a{)Z7dVw9;?p;qNkDMuWCzHVrvbZ{!d5S(5aBoJiKI^d0UKC_A}1pG0?SuFGFbiFkiv zxT@lVU*(LKu3aj`scyjE!cEC!(~{ZZ;}IyjQdpYxTG{`~o|Sdlhn#zqrOvT4w#(Wb zPhT>!a#i^vjYeSsU4;ICf|V5<)y0b_5jKM%~Id7N1Ulud(ID%Ea0s?~2gYSwSEn$;Uyv>57sy_z-<8$qzY z;M0+PBkcFUzHu-Ku`}OIwRC$bUslm+TJ=g6ln&35wzg+TgP2I6d$RT2-S=A#Plvvub*~!+^qmhOfu`ta)r(V zQu9>`wkr}|3xNCJWF&xxLNYbN(`vtpTO(FTgTI|lIQK%8Q*+6_MV$}XZ-k%d#h^(Z zaI1(;hxVlqKtv)4KL{ue@D_;Vd&PoYrkq4Ki|f4&7_WN-%!a{CY(nNT-6ny*8}NK1 zs#|O8TC0WZS?^dOjzF|8`BMnqubF~lgOIu%P^_S;fa8Pfc_82$?YVy^&Iu(U7A{PL z3llpoFe!~`mOX>b=04HM!JWP~6;t%}Oyn*#b7+l${|AC`>YA=>Wnw>oyy zNmuR6!pf#0aHYYrCN4FhZNSnv5=2IhbK!YI29bNDZVB#@;9?4J22U?yJQA-o!a>@S z%WERi#7PhG)XI5uxgQD1o|6e^kE8P!!Xtt6DaL3z{8^IT1nz`nb#-&ypKK>VFNV54 zg7#vXj4*)R9GJZrT#q{kQpsV=GDYI_}h$V+LJfLSAw zH&l~9!4j>ZUX~@%KiOZUJXLi1FpZM!9&0hO#Shn3ijKu{^Qe`{Qrvvdc1a&{n&?&? zZ}n!#OCz*R~QyVUDFl9{!2w%U$2Bb}f#yJg{ta z?UIKkTh5C$tC;v7qAFzVOQo`c3`E`qd@4gZiOtDmQ%QHa;UrT* z!aVH)XBE|Xg?xlVb&WD=AK9>QcwcVcWK!;-u?&`(jOZ^V3j}xs-qjn3$LuAs6%@GC zjpcr%T9&1(Tjmmjb8Hm5Wvm(-wE z`82y(*^x$P)ILZTkka`6aY_%fg+5=wy)b=zQRv46V;%4RNj8VNZTqir51E%x4+{Dy zhe^#4`OP;%Pm!RexQ1|y2(dY-w0Rjz?V3jznog=jXV~_0lY#Pb>y*1+V!utXq$(NN z(qWNsuTuuoTh*Jx+vmyaVtHjA+c3vcTH9P`CTSTG^nVTSlUyFrm7fzRL4r3Je(ynWu?^tt4*lv1pIX~Ma3D^PobchpzIBp3 zxqs8LVvWClZqmqgg?ul9+zH%2$vfQg0lmEVs~x|hpbxk+NEP&3zM}R62_<|WwVL9U z$D~7!l*KVi&P=d0Y!MZy#KuSa<7j3*?t}0TygPuoMjVY`W!@)pokZu7Rr~KkLu)2(@biH41{+lQ0#rXGwpA{X`xTjQI<{!e!EM8WNf|Q;sXdFc&QrX-M{HHw7D* z5_-=fq6~bN2Ty&#=)qz(%h8X)i~tybK0%o-aLta#IX4er-xZO54JQrdkvNX{rl}aC z8-huOkm#vM!ZTm{x({ScsX4L8f_Z$1m+CsHldn@UkfE{h6L;I_cJ<~*zFea2jOebL zO?2=|K@sy~%b=|F( zILm@_lGe{ZW)G&g^=2-b*!TyTe>;--Ci{8!UEAAJKdWFmo4%3Hy&lbLD&88pJjFBfkXh8((oC6Q zTDGWPr)rUdnmqqBa#KFf{Qm1UZzv9ZqL8m70x&JgIAT4J5a>U~kxXIcI6uy#49R%^3Nq<*>1Kh{=a zvTs6(x@%ou4E~{X-_~&1mFUt1qh&JRt2gUeNz!+$)Frx)td07rv@{Y}3gQNDr|`+U z9uGtkgHE7lbw_!U5@z~HqxI%A`6~?zk}L?JbkU#?-2Jen~K$Xg}!8&y2T~;D>ZVTicK(E9Nh_v zZlL+c=7=49SnPPn@EMmCtf$#Y;_#%W0U3hJ!li~f8^Cms>j9rue|+v3 zmLAzyIw3B=B-J{^)g2x2p8cYqM0Q52)Lij6JQzYIQ)fb_i#E|}=RxrrdJR*#l-6jO zLgwhoe(t(mmq&!YE`oA=S3hSsh9~5k2(H7dfy5=35na?|_;d{E<3|8waAV!59ABAC zHDy}Vmsim(FHkFXrvQDP%D6kjz>pemBZ?Iq78(1aUzs>?IX&n>aM zuq?Jve4NUOxSN?f$+C@lFikDCd!3YuUZ)l<;9{tlmHMzR!kweQ{t?ZO;i!HYHV}KN zfb6aFReOkiPV&RB&jGTzrK$zpP3fGyfQgBFfo4%_TMCpg_7OI=_q#ac{nV0{b$CeZEE53l)Ed-7DI!FVuV7olf!on;WfJ8=@`@ zr{{n9z2m}{@x@mQNKhIz_`q=Gao5mzN|Dn@|11Kc3zW9Wj5Z#1MMO_QM+mVpYms~ zi*~s)xtFOGE5=$r)L(8#JWMJ2qG!DAP$^X+xu@y7vO4z`bW^Ti^2Sr9c*_uT#u<(e0K!aLI7Jl%DfvLLMO94z`1B@9j z@EhbH)$uDmAl@ce8_a3?o!~p5fxHV~!${aI?8pq(EKk(OD>YkxtaQKk%Khs{cA41| z8K|bHoft5I(O6AL>hyh4XXa;f5B2vjsMT-BMq}<2qo1FISQ&DE zA!5jE8)}a|qB;BNq#dF)N70Em+OkKy^2cF~BdGa1N6^MC1Q6ISQ;56@b$o-eTHx0Y z^%!vClIs@Ytp6Re21J#6TADk`*5R?!bIhxk_Zch==7?_&<eJ0xC^Hr=n zHreX)$xl9#3HfDPQ!3IbZ1xzYUvCgBY{=J=CD@{Y_!kuAEg!E*l(<3uo2QPB(eM4} zViLVGS>8RmdEsQslde<#`8E%w=#IiBlB3Tq_7!3yRH8pdpI5Q?p--wEb-=s`^_ho= zoFJ+HKg9qJ0Glh>4);i5{c@ZV`$;Q*#iz$lo3OR~DtQa`KfV+&uG|fTD25(=X$?P$ zf80Op)*QV*5T7`Q=*FNdB|-O~KaZ4QBQh0YBuU`e5zZtydB|u9A1K|vV~R`jrNd&F z#$FV>e;17^z<7cX6u2ZvotC*C_eOkd;ocgZ)M|UH7Parpx|^>jHAO_d`nSAS*Z0vy z*`7s!MD9-c+Bb@iw4{FZ(BaEz%UX*bwvN4_{Cv~{QKuKoEc@G$<9AkE-ZDZIT!Z^b zj5E|Z49>fNSq$|U!9D@bVL^GV)l5!4`>mq+zKFY84xFn0R zk1Qyg`Nz^R7W>ZeSzDT+yMvtL=|q=E5$Z6lFVmc%$Bec0y4t!D&_8|HQAcM)eb`Zu zTsytDzp=MAvq@-&0|0*?3Me)F7{K{uxz4u~oa|~#M!$SYTU;3WxCiu_A^qXCu)zcw z+0v^p8(D{ZDZkMJT4OpVOYD-jxK*Su(wv7LePBXdLnFG=6s55BMSiqw*b3@G9!srJ zW5fmp^Dn~Mzda}7%=EQ#e)P2>%Y;vAr&mT%F|IkAuPXZD1Icyb>DB%w)!Oc;OWBZu%Fhj^en$A z$2P*3!XzFU>3ieLImOYeJ&C<1fd7O1d2k!nahwWxb>ys!*0zM)G9RlRS=vkc*zl1} zJtHk`9r8a8+*>AFm!ea5gx7$(v51w6eP(v3!nVXm@02QRQ9k->DwF&A7Ji{>55d8Q zx(^F+e~4M_AvJo0w?5?(Vpb~1Hke0dAs_E`NX6!^Q?zR;dryq*oU1y_r?Fi4C{Ew2 zthGEk<3D;g-Qi2L`D7{Qe2M(X?Hiu;4atpunLdOR{ZMkRgfnUek^5n?wKXhveXvZi zu71|>DLDIJZ>ky_;!T*0$i)p+i?{JT(aK?Yh)ibdF_f1}myB|Hj@uST=|qnTwgL&`fCq%n6H06~oX6hbdCWRh zm9AG@@j4mR9)FQ2?c|h*m!6<@{94^t?b!@_*Qd|3_|W!UB)k<2;Xc%J^v~@;Fv9nf zSSNf-5?g{!=QISTZ-$oyjZP_Jxo5=(fJs2l5I}#}?@9c20&I8ktbq05^wx*R@+tD? z)nT3b%URNgsGGE=?6wVPNc&;{Hg@p(2NY`x+JO57+ZC%Th+9aMwJlHJ$NqM5c_Hm2 zd?!Y>M%B_g-MV)%xS)Pusg_5m_y%BdInNItMnrSPiny$&iHlLV2`0VEgsl5IgW}&YKsh3BLAXL%Ozm6*i z2WhAW-8(4Y3*6>E&KHZKEj_|>Sk)n za^n%b`0AS>Nb4xLeIkGf_K5vVU~L()9$g9YM{8MH$BC|O(Q4WE*H z2azdn2q_e7C*oQMv512YQEkLJk~ioBeXlbjzCjT#;uIqsNPz4d5qrgBe?`3^xjs#4 zkuDnCC|g1meIq{_8DpEEX38ap3W%Hu=wM8Vh)!eUK@u&1PP4z=I+P>RoBhKJH8Ez-aj=Ed8A*nVE6h9;g^dZJ&@MzEPDv z47u2$GRK&GZ%btkUm@jEdn)X}D>zJXifA*Si(WMCz{gBSl;FKwwL%dp9(Sw@?DUo4mv%;H=KJO z;yYLV`}h{O(jNt0C&z^sQ{3>Etk0QAT&2n9_tZu_AnKzOVfB6X19#Zw@RUlVAXGg< ze{JIL62BBll->ma?IZbAt(jqYXE3@Y&$BVht6Q|yu8C}`!S=k5P6o&L-UpPn!`JMs zi~sd8gKJQ*zfER+@;?-8_Y{lonsfbsK92!$;%}Bcr0G`heyuNJ&4hZtK|I4AlHVqe zr32XO{XXSdG@lT3;kl`1y~5k;psF3G?A6R`!#c-+#8$2j_ zU85||X3-ta)ntqU*KgQWKOyw%C%igDA0L9QBG(Y$7$&vNjg2y&9Sk40U0Q^ks79wO zNDkcZ=;B+cxY3E<2eyWsD?Ps~pidn_-CK}P37|XDBuV9QQ869xf<{~H_db#L^GjLh zJjRZ;#!IA{5QV}%$3?J|pn7m6sr2u^r>X-3&)XO>2I40!#5$ zl6M)=2m|7&?ZlO+9%YA*_AjUMQuC@u0FwCslJ@2S zO`YlgsOKahh-3j=*s_4FqCgT*6orJ?PODZ~)Xr#CK)c-9X{Qui`Ca{8 zzBZF^#2FtZc!Z0z{Wtt5jJ%3Z8k>~gG85_7g)10=4TRMV*FZ`|U)0Hf)XPki0fl8zt*7Lyn`{b5J@0l|XjVg-gI1Wc)_IYYm8 z7R~n&OvrL#cfwP9`*GER%P8@2_GGGh_$l~_hC{9F*hzL*^fN3DZYCb)#iA+a&SU7%#BP< z_?MSfP<=Vnw^UMvL^>mV2g9uD<}wW~LleXFU0&s2klpLc1dgNHjbDTUftgNtruZ{z zOhuWfu-X3S%Lmf$E!R-I*p5s4b zr018|r{H6sLvj@$<2onlO*Tm$Xt(Fn7au&=S(Qe)ZVpCPnH$#5V)cw-Bdn*Y#E3S!L?{i1r(WFI zyT|%~yvNs&-#tV}4~8r|pP@9Jz5U0<2RDT8-p*ANGtJXY_C24^qLVJ3PA{KxAw@@R z&L~~RMw(uIeTJ%R5^ac-Bj>wXGzv8yygpcfb$SF}YD_P-zjzFocWifjo*Y8$nF?>Z zrs3dWySFA`_L!s51J~tX^Q8XsK8VBVbusQr`kRwq?}zi)X`_mfs`V`7d&jIK@e}l6 zAao62<6bQ;0-Ad)N5m63IFsAS6$ix)+CqA6%`|oHr=iHjb_L)Mo=2 zY%ST^SI1DlTwVMi)n=BR@*D+!(U|ZHx{W&MmIJ@#O@8xh=;-?;ZR`xoTkopsivJ#A z>0YLCSM3vI&r*FRdp64KsdIL|xpc0T;zG_|%g?r~{-X-H*!SB*IMb%DsU*;bZouTP zz?@**e7-^~az!F@UPQHhY2MhAM0c#BONE)z5J@&CuXlX^pvt7E+$-s@Qf*z`=N*Q4 zxBjM6UVhO19TOJb9rNC4gCX8rw^-kg;A*=Wc#D?2VL{x!zo8raK00X-)4?``W*WW9}weU$9X*y;bz?6Qb`Y z4NNd^-tnYhT_6vh!N=Q1x_=+#V<-N&7{O=$rWeqB&37P#+l8iXN9*bI)OgiEdUZkN z9MMrkaMX>t9Cb^l>W5Ped9Z#KxG3{p^o7jdWC`whJ~W zdaV(A5d>EPTjzIGl!MaDaCh5NZ+CVi^xD_WO0{~tl!LyIo}TQIMrswhR2^WLzbGh2 z28wY@(0r0Fek$_E@pztOVgMqs#Z!Y)vDtE^BG281Qk5Z54n;D<(OGJz5-635G@VPu zfX3|=!Qc{iik(Erijpnoywgp3^$)!Z4@X&O`vh}N!Ebq}pyUQ@qyN+X6~>3eu@9N- zoOD?T3rI|?^^3?#R5st0xT`);*|U4mUy?kJ`7&i(Bt zQ<+-c9bmSQ!aF6?y+L7G$m(Q>Ev0(UaNJXkag%=2MqanUfjbhpgMOdcunwIH#+vmK zsV%gIu}>M&RQT>(h$=HbQ6#*4N11e76RNPC8{d`9kTu zmkW4bpV)N%m}0WThD1y+St>%Iv{~)mO*_2QLPLy25w8W@g2~#eVyAk;@M5&X=-lP; z6tt~Itb#M8rVjLiBT-n!IGs-KuX24~@OAFBdoN5Hxe*cY+j#ufNO$@YUjNn}A@liP z{t8uSr<@2Gmkruor=@_OGGk)coHvX=KE$OJY8&nzX6<*m-Ut8!2+)|yS-qloJhi(R zl*@0uN$hU2w~i41@xNj|bo`h|#-7e!)Oi|UYA}R z^GK%mg*q9=eT8Z_YFZ4HP}V4ir~77IU>ISWT(3_>-)VN8%9Q&9d0`^zJ0K$hc}TNy zI-dA#osmxCu+RKqYtG2mYY~ZY1Y`{I6QBnuX^~3ovP3D8adxTV8be(`Z^(`#V}bEl zR4&yIN^RHBwW;1CQCxe8gngJ!X*f)HvWu!O!4DoZn ztThvE#bJE!P2N0|u4U-4rqqcRdF~rj+n{FG&ueH~Sl!Q4hNjg^vy~G}-4e;?d2-Uh z_pzaL+^{V)yeqZihC-!~*Etxu$4dP$h*zcY>^8=VTN<9*pz182B6bCMUC7u-ehI12 zQErS6otKHfIc>qKm9+PIa|R<>#@^3Ja^3T27?{hvA-26PSI7hMI>sKsCCcmE%>6^- z=rZaFQ_w!4M8{$h16a#n=Wqh<-9LvTz3WjVm(H&P@dL>^jK?(y|2ft{6<7zce;F_j zV_!S+!A#k#^?%Q!rk=w@#I%19iFQJ6PMKu-4n_p1G!J$SaLpQbF6{v~t{O>ra7H~# z=HP6`M!PEcCXL+T;9cjjkS{{?~g^Qd(uN8%t$t6<=3h6lA-2 zP)RlI=&}ts4enaOP{`g%h2^@DqR%H-TeGQA%Z$7XJ^IUd7{p5O^!GVx zQ1CO5|E82XKiKfuT;%_inzEG?Cr2+vT5sq@e9hwE3_gwZ!>$HbgO@Iuq)_>k9ZZDz zqqCE!*`pu7&-#zbRYqdhWKE_U@^N&R#@6QX$Av$QDk5`zjj%l$g^FS2fm z6F8N1dxSIOsqTdB@g9Y%Og?Zwnw3ey)3h}5^i0A~ta(gjE0_g)_TA@h6w}Say{q_s zmm^)h<>X#()fyM0CRH5&e2nRvCQn^SBoh|jsh}hN<7hzq#MRr`rtuuJR8PtCh9BMB zC^^Z-S(+mC%ov4L@ucwf>m>$y8~Rc+2~S)lbU3}9WF+N(tzj?_t}7DHvINn$IdJ}F z1rxXS#{e=iC*ZS)-1+^;)xmJR#Y_@EAeiC*{m+QQILNgW+Jm$~ZdBbQ!4 zXQ}xo)ZGmSpP8P_+%;Ga6bo9?ilRLy1m50`Ss>DOr-;B&{+zp)t{2ychk0r$C*_ZP z;dlEM5X(Mo4th$=y`Z5WK|v5>8 z&wKgSH0!2Cwo+mKzMaz-ZZ8=NR}hhJSh$291g<9uX=)L_Dm8Nng;dUmj%$BXGYP-W z$>d--c>Hq`TyKFD{&?u@X;{y6e3`!^CII5mB;P{@3Fb&}W~-Q^F$||0P~GLHwNlCj)~A_$<-#rH z){y_5y85IeU(_N7+CfWLZ_sBR7AHtK>_g%fN>M~e&(8aEs8Bs4N*(|cH88CW6uLGrhJTrWDpI}xZ|)cml9c?oL&+F zA`jX-DOYslSr?u;NnA*&;s}VDS&wXyps;6mHsne=je@FCi>a{D@Ilf5s0ey85*y895)^m?Cl6cVezHFt= zi0RVbaBRWF>sA{ZiT};-6Kp~il`r&iTjk08F6@4lD!$oUj90Qf8`W0(Qo4oGWVuh$ zUz?ttzyQ(FxJdr_+GnXkuRs$$lx7M~`eO3lY&PD#KyWPy4@U*tNRF_W*xADz*|6TR zW1>X}Eqy-Q)a8>p6#u04IlZX{>KVN*r}y-9^QDZO-kio7TJP$WjTOXl_n~?U4G2(P zLCyclNkm&kt>`HTzYt{-biuHWnpw7@VZ@s(preAqAT9In1%6*5E-CQIZN2tyyHwTc zoYe@QO2T(jJ))=~^f31fru9nW-HWKo%wAH0XgMaEMD~FUywrlY{vYs?scU(pZb)2% z%`iNcU~o!-_ZaWNt~f;ciHuZO1wQA{lpySHI@adcLVRURS*P;NAA{#+4N`j|qdFS0#2)Q+s^laDaBL?>Gnm&ES*F?fXoeTekYdiFvwmcm7YluTpicUer>c z@$Tqclu_7(&Z$6Dbu2{9_~^Gzo`5C6K8g*Ae(R)X^Yo9>POYKN+j9^f7dkiSS!K1$ z>$Bl0^@DCf9G(2g&kd>130_{Zd@+^3G1jP7V$Sk-3MH5wL?M*ogeun33;urctP=s) z;k^^gnih;A>*K#qbRyMKd67V@E8UOW?4^lx)FiW-`l4ON1C0E=eyPI!M(<^YxqJ|@ z!Cq&S$skEBsib7#p+SjFb$hKH7;fMRa zJ#7)h(VtK)_BHa8)SZQZ?~vYt2)5*);F*6Cayu$k_lfIh6Z*LEaj4c>b1SKRbs;!} zFkFsUK)M@%gHINPyOc`%GmqIDJsEeq1f&U#=;w{GWg?HDOW7I<16~&79GO5IadgWGz z*~QexO29baekpvd6Z|UFo+XNAFOy!pPw4IQfUznto}lb3&<=rkDoyjJ-aG`x8Qa{g+6k64e&Q0#q$D@7}!UaU^p!J*#4~y3#rA2yhMx- zW`B=b$=lwI|B&D8EftW!$85YDUmFEISYnn)JpIcVM^u^PK$N@hibOJn)Yxb0r-s!z z9C@zMnxS>Sj%8ME(EBr}IPWu7UfvJK?c(LrSwl_ehw7WXXik%MVdC+0*3fdU7(^Vl z%iyFzDxHz&(IQ-dA#ax=)MNr)!%Q7?zy5d}m`Ej(-SEfK+L(8~8P6)qCDnpXEKtb{ zMo3YoyNs;4=l548ZqVHqoc*n4M#N{Eve7n?!vx*fdMmKz#E+50#Z8 z>&=#_*vMXL$ zPvzh2#T2EtZ<@;LTXrgF6dp+RLrON6p$tR!v1qsZeu3-AIAC4aR10muR68!go5cM2 z<7*jwE*#fWq4}hj+oBHR1IlYfH+xlhUU+DZG`B+WRim~{DOs*=o5*zCp1>(vu;-HW z63MkJbg*q>7+VDRYb26d*oiG-T8Xvcec2DlKK}LEugSyG72UaMD}^OqT)XdTg$5nq zcWZ^-{!T7OlHPMy}$T7~frpQpMY6u=XF@9)|} zgkzmQPgO8Lya1A7+KPoZNpr^Ig+s>`wD;!VIBO$AU0h|Q763ed(LEPu?CR$C1sVBi z>n3i{4n;AF@wXG$Op`05b>_NkcBW;Y_k|6^bhE)LF^6i}ms{2lIH?dg{cWbZsQN7D1rdY@DKg`YW5XL$lb_ zeeIqNX}F1?R_Gr=&B*G`xd1hciohX5-E32YL- zsQmU{2A5QD=`T!?mpA|Y>AxW-H+;XfynPp>?zP-Qyw(zY&!gac0KP9cbT83II6Eow zB-T(q=8T-E-i^|iyjmQ~!)Is9ACM=?i_DVIJ-r7vFmt-wseirg81HqWiHVoWx23(m zfiYk1={>Z8p*uyc-_8%e#v`4lBC>9`Y7dg$y!=>ZV55bDDCOp0CN`dQ$22^DWgV?e z(^ARN|AsKQJcs)v!mYRMJiI;)L#cLf%NRy;;fr*WT`_s$*r|W}ZA|~V z2YDNm{op?n{(hPxz4u}xu*bLj`-*N63vL^l64E3&)a}#Fw%%~<*mCLM5k{&td9TKY zb-3wUhNhzq!&Y|2P^_F&{B?O)YG{7nWtEw^HNzY}mg#k7xKB2e(?!p^KNaMJ6c5+t z+>74uhO)CPor#I>u$~&eq4W4|_lF zYoRV??4@2~%*OHqx#C$J$I~Suv?<1yMp@~Ua#3E6`hi7M#-J*5$@X!IE*mTpeGM}1ao3B8O<8&0 z6c!x1_;+7Gw$~ndF9=<;l9#>yeMaXCi@`=~zvWary&ifH{2mO~^JQ~0XVK@V2|bEsAZi}VwEfu#8v;D50Zx>V zl8rjRx)As896~r8$WxJ*RE`MC-);m4TaLRAH0O}&Nlusa8=r>?JPNW^`p5#@CyTYy`yQs3H@wr!xLU^5J4?J>7U!fG%SiPSN=yL1$RZC(sRe#vX?U~ z|CM`#xu=vTum*4F9PQ0scuiZWOju6iJz#*=m1`(T>cs+vzU+A6`R-KeX7A|@s&c78 zB3TZEA#ivzB`)HwHi)S?0o`#=_C@e|4fha4a3nClLHTII`XKnR-HWaYPJRZ)X6e** zj(F{d-xK`(_;tug_gFx-d`R+_Exc$}V%yYh`TfaRtu7P3F(dW>{^z}$4Fp|Qdc;HT|qsrcs z>wT9!xk>Ga6llE3B5j&xSPuqupF9`OrP?F&G5@4r6xKkfe2KIPB!Fa34!Ej^Y@J$a z{rTpZZY`Z86LvMZ#y}eNc(xj#{_lJ zh|OS~FFXbvLaT&p!|dN~$g;M*;#j$Es`Yq^{aaJaeax&W@o~xywPLUksY%Q3^%}+b z;_;?8@}16S*#b~sT)Dd+OoGT{(?dcaA+?|sJh;2&?5>SQ=0#G6@dW9QX4s$R#0Ga! z+F|(Fj1J??Ytieh3g*{Wcwid-2>*uH^H4ClK5*{m><_{|D14&G0O;Gr=k*)Y zI@SmcFIqxv4@X(&Hr$9PkuPDVStYgfx_Eha?$PFP?O}=KS(c(#z?@UP=++FYWIm<; z8gPgZaC5pdzycw;Sxi_ualhE_!&m_^#;|U=`6FWmpkyTPnY5aYXmRg|;Ze{SbLSmsN-u;f~q@Zj1@x{WYTw#%N zyCl*2b^tlUtf=1U)}Td6@0AQe7{VY>_jPiHu|| zhyAo}2pVJ?hEf=cxMM8YucWsdWNOxzX`KXxj_N+> z6H%+j>k!q=5{G_aR}Z9_Zqgs*(kT~}ZiirJshd7>zdV9fTF2@|m)k*MB*i$=nI|#`aSQac=f_0y8S9O{{6a!QbS(#5gd$Sa zW&M605Js7&s6RKw763@TEuPL6DXi49f~h}ViDy2GwA9T_19FV?=^^~5!0JpT{j~Y~ zNWS|F06Wal2sUz$Q}pR-YwR1eR`A@K1bLG6#>e!oSkvx-5v}xw=BUFRdc2Qe4hLm`CO$Kl|Vv577-w>04(9VAsb#p43H;~5XIm9zf3<)jmr(& zaT;_wW97Bf+Sp6;sb@c%Pfz{xDl&1r+`W}il~@2<1MAR2H&0{IWJy$sO#j*+3k0w!zv>|JU@d_!y*tdkM6l=zFM1`otl;Vy!>GHUz6WAE622IEcL&3%t`pqq=?wuiRCu9fjGe7-MB&B$0)Tjaz zIY$|KH}*h?Hl&8$`!v8@pNgt%;kOLF6nWFEtdJibjZGEjh9!h-Nwtb*?LpO58PO7y zGTO9XEYX(%ClYUcBxKj0H|Rz^g6m#v%wB!JwRWy>BWmG)@7F<9WPUKV7AkK(mY&V- zrh7f+elPvamVbnt`0x)Qz4u!~ZFKV_HXb2<}Rao2Gc(lFwTkA_hjhS zLZFjVC>6nn*+g+5D@c;=E7K_k^Ysd{sjq!JWCk5Ps}2c^xg3?Qr8_Ho8x-)ZMTeiNzI1-2L?%T~vpI zhVG+0i1ncHS2nF=^~YQ91Lt!~*qdSsR5zo3M=+qn`c+s;?M;(6hJG?l+k4~>LkjB~ ze-$5jh~4ZEY;MuE@t4|_3cE((zKn2nyI`|RyIIbL@*K**qLUuUhgtauIAvOHw0x-8L~d2Q_R8O5{@56kuUf*peX; zY;9h)C;4O3bUx6gdaW?+8}+(r8o4X42mt-pV_%Y+X3OQP1oOgc8+x@S2esmVmW_En z)pXXnU-V^;PV;@d(h`{!+nuvr5FO7$c=#B&I!IRMsPTG;LC{J_z@YK7z?KN#xG(b`=JAl+JCkcf?JpyI*nuh`KXvqjy1)zkuthKt)Pg>9n`3-4yQV}yon zI`=Sleo*%u@av}&ez$0RZ8$x0WgD0;UiOSsLofAX8TfN5ULT^I&BCFkY=atwwebkO ztx%+#U5P z$NswBe9x=L*{0A`O- zqzGMt4mF{e6y^(B@cJp;SoMJRRK;7#Ur%rMAC(@UnIrj6b ze-`eWOnnwxL25OZ@N%%0=M)xCp(IaHUsee9yQr_N4W0A$oPCIkt+R}duP*T%rrPNF zbunlQSjPx@-?ZqWm^~BV2E^xxVz$<*)90NFP1d+z_`fi0TkG#34;d5}z`e|+|2?&P zW*~EDRzGsQwUY$+!tWdKOO?kJj@*94ryCGzfeu``{v14--eAg@G_@tj= zsponW)(_+9%`q!I){ir&6<6ldssE;mo|g}wh1yxc$T2@BSw`0D(}+xh{pslKbc8N? zgL?BF@rCnLeAg^f*Joi3MOTLty` zCAjQ@ZFx}5E~-s%G)!?oV^mO;SNcF-G}ZlFNDgfP=|y0T_}*tDoo|0#LX7 zA*UY);X|@SqL;tD(4bc!n9z6GXt4u5WO_Q8bZu;*@h4N=$zt$f^Y(YUitt_2l#<9GI@KD_ND+4}**pxThy>2{>yVOIe_8RckK|0^bk$WuxsC>CMLW{{P?IK9`?dV@N- zwCPXQlvTp|z8<;Wgt@*-&&xHOzMabExx!K_j@cPwx#f~W=Sr6*17MVj;SS5M%3x&l zuv{UOsS;5|Y0FMrJMoAdh-X=!dNoXtHab-4oTd5%Cfo21> z_G@b4QaG_Z?gKpkWG+RTV%@h+XQOmVlge$ctgsJI8npa<;1+E3hQFT{;)!WrQ@I3< z8ulD^Z2wZQ=p_1rl+)3Zd!PKOaRvSNBXc8|1DlOxjYwTTVj%zI*S(xBd5Vo^`X7W4 z;^v{UyyzzVug4BXvJ=&B&t>GPx*DnE85)Q#ra#MM(CeM~Y1B;+o&!zqn}!!8`fG{g zZ~hIA1#DRVx&()B3A`t$KIm9W*oy((3sB^;)QJomYx=}FC~d1){IpVWfZ25JM%cFh ziBYG@6+`3YWrGHd6>Xd;Rd1o2nohOP8*fxuQaR1M5d-xtO zD8bphf&0FfI9gD7j+K5Jh`%3Eu^1H*AAxJD^SgP*_B}UHH|5@r{yva{%V&c~)_h|w zsh%>QJEHEidqI@54z!zsw$;xTcIOJ(KBBt369jFhZ)UOMlC5KA4#y(yWv+taASc{g z@DC~p)+%JZ2!gsAJIvcGmWp|7>a{{Npf*Xuol{S1@F4jnFO@tT z)})&B*^>De#z-|TX$-TQfaacpR~bqCWDI<8Dwjil6>1{S@S;etp>jS2@YyR?Y!J)%SDpethE_^S&X99iU@X{#jc94$* z_%nE{Ibwm3t`8CE+BQAxuJoCq$cnn9|M-2yj6DxdZd8AI^H%zTi2%PgA`)07k@Vk> z(oMsWb>MQNZl*G67npaZA^9ayxc@2^5W?0KJm$sk+asQHI>P;QhzoJ|}~hgCl)Uk)MmoAFCJTQ+W#@ zH@hD?K4@60vYh^FjC(Ad`HHcvolYKz>zT!eKjOcSuuAUQF1K!GDtf3Gg{jTznq*My za9SnXxPy}R#w&KZ7+6~kQJ}-}GZ>p`rQb&I`_7^ox?YG7%C7mx2c=J|n8Op6SL|D2 zjxV3Ula%CsASJR>i-z|N_J%`%% zmRN8vGAa-&J)8sIneYq*QPw?bHIeJci)-*cl2b<+qBuXKh2AxvY{BoQC7{2-br;=m zxNWt0<-30swpBbR(6mVEHda$;;0kQ{!%l`OR8w#CNE8){G0VxW{Na($C|ee|*w?!I z2=4I-zbx^~L*=97OujK)hP{1*zOeGdQ|9EC8-&S?=?SAHZ=qsLzKeMbeWE2zy>EVG zZ#1+u8wyv}OBG6!q@4-x_?l{Klr)(Q^T=PGW{k<~LYTxMBnHWI?hzd;7QxiKrq#QB zB#6E5%welaZ+d6rm=n@u>(c`bp(pn@m=YWh&ZIK8nNGhy@QCdJ)4nRxA;FrH=hYE6 zAGEx`<$m`|DCa{8V0eE7B|HCs^9+5@W7x%X>T!B~ddeLIJ99{BiG6lK#r|q^{GueF zss$O1D{WhNuZz0sol37&r-uqxho#gsta|=>4YiqCDB;GN{%Q4^N@aZBqe0Edz3glMdusnd@*X3V7lF?Ss_)P$EAOxHGKLhLp=|}? zJ0}OeQC(FxT;8_7_Bfb_^YyPsf~fH&wFZd!@^waHVGgCtBIohXL?s;ScTwM* z_#bh;u*}(Mi+T;`Lep}`+1*zyLHlI7JYk>2W8b|?Ay4I^5w`R6)%><*LD>xf-}zsp zrV2W*3JxBw_g7(#J^VUy4wh5pv)DU5hbEnwy*6AFI=!c7(^cAL+jw{?2}r zqr2Nx`O%!~-)#4S8Na*m;!`nhN$)Q!1!s^D8OGmc+=K5D9Bv5mhvegqe4Ta)dCjTp zQa1KKbz%Cc*3~8o5r5kik3^50kgW&E12<>)G2Pe&9+~56Xcx8h>XeSHy4bs_*tpqd z`$o}5;kIh3aKB*QT+5S|2Qwlp=bo8nUG!_c`#(s%MUZ>-Ue3|JV0^cLewaz{m?8M8 zsu}SR(c}KXhZ@G;Bk!()A8Ew(-PGe5noc2lDQ z{fcKEPCK*4K`u)wLBU=PYJ0GS-nFYqX2$!y7sR2cX1WTNGa#x zXpJf&^5a&<%&i;F;+zOv2~?#;;OdmkDViNsXPl6y@1GOJW9#mV))RF%l7YI1eidYHIMo%Xu2%vGf7_uB4yZeW5yhJIcLWU<;{90GmLGnA9$ zR|9$OnMSO~M0_RSHNxF@X5`Bf zk#1jSUnycu?Ykc$nK0mh6%TNc)>qyAJ;qqnv`O}^r$I`|V7KDI-B;~KmJ%?iqHUH{ z=tqLQBcBI4m3Dp&m6v8+JdZwqEylf>-WB2gm?{_K-S3`6q1hyo$-^y7(b+Y}3et0r zNA&Dy_;WZM&m zsPLNuQoZS{C|q)}Cl{!ok~n7N;wa`QCgP(8Mk47fr@kWVRgwqxfktsI_Cdf#s0!xZ zhi!ylxIGAlAO0}U;VSqKH9-*VIG$$cUd81jVB2OnVq^8DveIZ6_-o3($?I@Lno}(M z`%~4^wNzHVyZ`Fyz5G@K5RpW3Tul>Lau47&-Xf z8Y<@aZ$ zh1KRpPB(9>ocRi=@8R=mBzthA`(${of_cy5xF5(v{&S=X`F@bp<6w4WwY6BR;CN1{a7H8M2y)ro5H^DBqx+Sk|T=WDYvTKr4Wht z821XqW%lwla7y_`>o+mB6>S>Y);#vatGgF4VA~##p-&Vio6Lf8hKdn<0p{|tEZaS; z8{w8GYe4vcLzEA>J-zXk8K8wtx!Bv3-+RS+GXfm25I*+6<86h?C$Ew2iMNG^N1gU1 z$j?}*>sO5*{MW8!ew;|8rn|46@~;I`h**wwKR94(Gp}KT5xf-9Bcpk|lvtd%+*@Y_40;?-gFXh**a3Sp>|%CnC66HOv#7u_r@; z3trGt2vnQpI%$K0VHKusx!dDZmaSuq@^aDTgFlP(7EOVIOKoHzbBb9zi+37 z+fg_zZ~VodmX>cVkQh1~!fRPW8mo}LS&yEulCS!Dw#LOImNCzreo1BzZL)oOLtW;G zU$FtSEI3#)|UO5!T=eKap2T3n%T=Piwju%qRzx018>~=e_4AoeMzrE_>e_ykO2RYGSo6YM_ zeBS4+vWPtGMxe{JaAyga^0yyg9wVqjY;VGY%YiumC-Q`qya-@;R@?Bu{@UgU20EN%1tD$VHe?uHo)0rP|`bLcs{gLx&^L^fg}X^@_<& z2``#vksQRkbPbj6%2+7bs2!TiZZrA;w1G41U;mkDni3VfHOlsX{5Lbr3Hm*0Kvo3y z%n08T@IkXluNbmde;>pq&BwVwjM7N>ehF{y@6WFpLrW5*iBVSYY)CaV6nTK5&p-8Z zS>R<=!SN@5m{8EtoJ4D93cNSP;+fNAH#ym`teX?HWaKg^&@XK=j~mp|T3ZdR+#+`` zr&}er9Ku|UK-*9wmPH~8MB#UW)ncliw4YSEmr=2tPF0~Y=BUbKee_q!(qmM)t(lya zNBy;nlk3vjfOkMnflaT}z4}3Kubll2@dX@OhZpc;l~IrQl-2>vD*-wgRBSq$J*YxR zBXpaG6U_o-f{sH6xq-e2(+QodEA*-debo5)C*n|qhlaoJB!;FV9d>yW_LfJ2oQA^G z#Dq&+o$$08)>tpCoR)g-rdL>!!KQcy9pDO#7kKF-2~3)XoyPS2NsU_`^)TvF;Qs~W z4W{cms$ExVmT+nZekhh#I|ox80%vK3`KFpQA9@)DA(=VbbS@oQM3}CtrCs#OUAWFt z;zwMnolN50$@tPWuhE{Nz<4P*5@~EI5O1Wk_Ruat*Q2Jj8;u67eGK(Cz>>?R(>Pw% zF^`bS0LwmgJSh}dHut9JFMFl$JiYMMVLezoIhgu~JpY{Y+|1x#Kv4rH{2r{eq{%qt zAe6NsBvA1kl?yT%)TWkw1_xec4S$2atCOt`wZ*YbgB7&m>KrOR!~hx2?{~;ef$Bl`XjK)OJC90+k;r29IWzBs6zA${T#G^a+d zss?Hvnl!o0yMW4b)zG5s9fDm$7i+b4WYV{W>x zdte}zP1koG6OU0o%y&^|)+F;h5(Zvt;QgYgb@RfkPsBL0-OvXoXq_ z<=iB9*9u$5py^b;aAz3NMJp&Wb}hRJaAhc?|F2F8D5xCvNtA2i^Pk0X^rEfpb&(yn6WF zW(4og`|oX}PC~%mpF?6i!M&$;rX}rMu#aQ z%BNO#7_{5_QC)^M70^Kbhtk_6v%Yv)?bnMK8{rj=#rzO^W(h*bIMHANFI5Cibf??i z!zFrH=$d>M0a&ifBh{9Hzf6`-$8elav^+)E8C}Qd z)3YHaAoqD&Ad}=IM9Sac^toRbwif043{3wFhD+?&K~{io&OVgb!FTxLpHy{ubTC#x z;}+VdmL1P=<(tylySfD0&Li}46Mx@x2v0WQkp3Nxk3*U&f6XvI96#lDG25jD=cT3stgJt@hMVt#62J zi`-vOdnd7x9nTRu+m-A(HnJ`}Rq0!2*2C)1Hk`0>Mr=CU-?*f0a_*FKqPF5-*U=b6 z&qoLB6<#KZvDE-05z|dO>DI6noxcZhy~Qq0^t@`j>Wdu~-f&9LFioX^Oo83t|86<+ zh5E+i8<>xP&FSafx7YYBp#PHoK0?VyHF(cR6McU!C}_v&lKM{<$a`R34B}V}s?m)p z)!#=LYesC?$!9QE;@Bm^M9-MstM!8KuwJ}BYCod(D}VH=#Bg+-Zlv(|i}GhxN;0^r z4p|Piuue8alXjiJ_VIr1WIn!O7r-o5<``24v@6ZjyE@p4V=kz+i=W$-0%2=8dvuBU zt+2D?d_BW-N8)y=xVAT_Ot0+91ozKrcQ{=d8^yk;#$`tp5Z@%QzeHLpMU<$p%&qvN zc~KvXAw>LOUST7nqRx(rDqa!N$xbQo3B2N?1K+(6JOaH=kVDV)*X04f4ID#A^Eh@f zo9t;8HmekaT2Kq8ykv8pj$lr`$XE;X8?xQu-wB)rsm%Vxsn%s!8kMC%t-rgiV0e$# zf|p|CIPhUz5lpPt|DND@^a7t#6AT|_fqzf<`K#@e0voD{6SO|()aF`jIw-`tC&+i7 z97#WMT@}oHrR9_Iage&|+*^!*b7&PiWOlXdj#@`Hk-*P6nNdmnxez5f&%p||okqXS zGqTo*>b8iG!f?0{w(9-1hK^{#-ba|1B0Xblo%RrAuC=R)I;|wC~oSJObhm-pr8T{E&^(9<4&yCqbzmP;Ont zM&dwqEfT-qZ<=rF@<3oEg>ydBB-t@4#h_v1eB-b$QD@KROxq36!?q)feI;xp!|9p| z7EpP4R{JLE&G5*wu%mQ;sc`--%X7qOrIjz67BSRIp*JB&qCHokq{Qvv? zrevgF>%v;S)ISeUE#IR&>3aeBCmIrbKZH5v^Cg!u=8$@P!e#qFE9ew*C~a$xF50)m z{Gs~_?HIjW&Okf(7@WRL=b*bIEV08JVtyJe|t;vVzos#Fu#Z!CGOeUGliXS9{1 zo47N_8F-74zS$OTrp||?xh)5&(>yIyOPIpi8!5Wne)|L)Ssf;k z94!`IU^c{J(=m)B9j2RV=j$e6T8{5k>fpz_xw7W;1@dpjQS3&)yoFqx!|QVCCh$^$ z-B~#Jyc$2WYJoed5rfIC#V(C(c0VC<^W!q~+nS;7qb)EE_ij6l(xQdVk zJ13!g*Y0=|spt5;iI?MkTMltF5Qiv?&`WCZ@*J6lO{`p%E!$S{I@cG$CYHIgi%*L( z58Yb!=IAcZjL;jSkDeh4EZ@TU)ILL+pm*sD-cpiCLx5c?f^K7sQd+1s;Tn zY(xCdL$GUs8c>w$a7)rCRT&<1x1?QNmaeX_;e8nt_iAq7{)ikE?MhcixUZl8wrdk( znd`OMqR|Jh*u|Q_}uG_c@*A2+!$!)rk^C1M@!{;$adQSN~aeqcNZ@W+`hzM#$=>Lenp|hyg zA_CZ$VdkWqAo1koc2$qsPPNZbt;Qk~k--9ef;~yr9Cm^K!KK2h%DNCbl3hva6W|Zk zR*_hS-ydS+P1epn1=>5t>ow>a7ap%Em0P3TAZpM7Fo|j%5b*2yA_8TJs{Fje!R)=C z)u4RfG4VyY5^)!ZQ(_~NJ<8jeAz%e@fN6yO9x;v_@~n|OgT+jqli!G`4jYY#Kx9Y0 zvJQrpyo({bULJ$Yo~+Lt>CY!E<@Jxh=WvK78=9FIfg0t2vPbFw9f2%ep;4@3VU1&o zs#yf?h7gz}rab=$$%%R)asv22ndQ=W?4CN1js9*F?0L+A$iv5Ta96Gi@@=?vu@l0p zqeiLq={yCii)}K8l>FQQ05(HktdZD4p4EFYay=k${sZC2xm;UCe787!!FT(Ag*M?{ zruz6erxzW$6_cmUfAP*0?sD~H^jGicQ@H!C!Tm5xBt5;?Rf_f`kMn5kQn(*LGpTI1Ay^5+ zwM-AYWzg-otkp=f++E?eO>ro$senIY1Z!`Nn)YK~VIJA*VYS03JC6rkN$X4WO&!o|)xlt!>V%?FmKh*}aB?}2xZo#_&dh1? zad5|vMH*Dhfu-yN!*Z!Q7`yZj{GP7;Cm%zJUlOG&V_ZAO38Rxnf7Gihn`ov!5jA)l z&{>*`A{zFyBuv`shZTxb~FK=!E z44^6R#di=@kSAphfvShZbvDYO?y^!X->8! z7U0^YcL5ec386o~S+ z+UjXQ2pe82jb~5ZYMUZl>8CAjH+x+w4k6DdWX9V68)c#&$IH`q?b+k#dAz0+8NeQ(zp7(D5veRUFq@wMo*Yf2cxi{?f%EE zG^Z1Y6v=P*8+`0FxclYf8oWlBqp zT#AX_aQi)IwaoRiWIu#y>#EQka2cXrcr*4akyFG@{&yM zA&49j78M~I+E!Gup(sU?K<#3yEY?oz#$uNlwG~l2om#iFPCH#hvCd5AS4CsBt+k?2 z%S_v;60o)|1x^y&fgI4bsKf+x6@B_rVHXwOf)~CKWF&M%r=EJYuukt4vQ| z?MXbL4*3}CXr|7l01X&wgwD@Y6knduJV_QXZ7Kg4G1>HhEojk;|&`S2B$ zUp`65pgMr^FDQA`QT$ABa@KjgR>Zxt&a`z+#aZVZ!LzQ?^uDaJi1j)8WLas%W7YMW zGR!h%(>^_YsB6A?g-c7At;J{pH ze+iC&LW#10qc=?LcTf&NH2_5&j_V^U^Vbwpf$`kWR5gV-v7Igbr&)_M_xYCLh_ejl zPdI&)lA2se4JsHEd~Y&`CkbEEP)g$62)jr43nZzL_#wSQf@w$mjZFhWy3Kh#rVhnV z!ah^mqz%?4NO?B3B5@2_QA94h_X-b3W1tC25oYR~jKJV>fkgC7b0 zV6R>AC?MZ5w(23d_krg76m|7&-@+-JoCiU#_BWNZ)3O32Slj+RYKX6!-X`x+kj%JIj#H8DlKk|o^aK?zeqpSwjpRX}B(YF;h%Z|l z{`&AQb^hoE-%z35?>~dYSlBqfAHH)q?xm<1w_+-9b9v;7!%??mHwq;_+il| zM~)o`v>Yf0xQM@4=5o0t*e%uqWorM$jr%}51}jn8gk4l6M%V{A#zOe#NLtPUL`E}e z7#3)KJjmC{f#t`DQzZanN@|Iqp_};|{i>oasXN{*JbO83%^08Dy9xtGn|A-f8*|k7 z_wjYytDWY9dbmjJ36FlB))^HYI@v|`QkpFr)-kv=pbt z+uzqb6Z9`C-^8_xG2W9@QzVcf#P`@Cu~F++dQrPXdk#9cNHB~{pBpZeAXsIAq|uB2 zMMFNncsGBI&eUT|W)C4u9Yp485c%ZupIU+P4QN-@jhL%VK^2n9W17m$X*CPt9*AEwj5Sg2dI zt;plEvAwY**GHZX_W9Vbu`WrW{}Jz>`gHPu_F^W^be|m;ZKt-=wQy^D=@??M>_@5V zGK~sJBEMU7M<-DRf5ZlP6>ikK>=8)LA;0A%jwJF$0hM2~8YeI)6IBE1-2ZcK)QIbyy^bC?egybgPqKYA)Lf^;^Pr}uKuClM*;k{$mLy5t0Z|MHNN!h0_WhSBOi;Rw^k{-bbe`* zR6d&nPOVTUpV(YG(G7Y8Kog*AJ$CXlMG$1+2WVs`Y+=XfyGh~CE}b70)MwZZxSHKr>5`wrVrWeY(nDjBBe)*3!LWV!zH>gi z&!;F0fXM~K%^Q8!d~kr2qbHiUkD&_*-!o)}U)M0j1f+n_hoCKxZhmm%GpgoQvQHcS zsU;Mw~#sD~RKZM^9vHUDw-qI8Zl1 zZjN9EpX@SWSe`2^x_P#v-7N@QR{_;xu-2V1dIS?(bjskTs>_b1dxu%n*H#PWge@M* z{Rd9xe$=lA5w5kqJ(D1X1(X~hhbE}4&p5xoHS8Ck_a-%Eh{w}K9gQ+wxEKNnibRBI1BwlRA#0b)p&agpfdx5-Ve$N`2Z(S zgCskr8jKk^Cb4pU;g{Tg%2arNJ&v9>$z&dAGS5zgJt z&G>$Fsk+plF3l;;@fO1OHi7feTjVFVe^1sbvio0CpBDQ3)9AwyN2QVcDd2z>-$Rnt z^8x0^)bNguI`g|NQQ5t*S37S49as56{!^6V1@9Av-&_VR1@Rg1F}zJ#`Vey8jv*~A zZKB&g_LnSo%ViYPh+!nTh}wX;T3<54Cp3fKCA=XnTXxgK}NjUVp+@OOVifH&tbX za!{1%BuraN%sUZ2_GCMCl5)Bf=A60HMF~>a+V4qTE~F$No2o*Ni)uf zS?@m!fKx9PtocLKbrys376}e_1eTH>8704?-lNOIbm<0C;@}P}Eh3-s5u z?fK5Su>#{<)-hDNviXRWg3Ja(lPRWdaOb5SY9#I%d30Yl)r+hVxl!cS@!XBH z+J@0M)T`)}tGKt2ZXM7pIKn-PJ?3Y((%LYsATvW%SNu3NcSD3Dvn1K}Z;>P7gJfy5 zC#@_{X12ZE=6<0!o*kU{dP_-Lsz9v~Qw8V_w=3zlr+>ET)pF_WoK*97TOQDrj966+ zk?p&tir>LKVI2r2g2(;cPTRGh0Q$*<(V7#zIksE%c8wug+RRRtU$5<~t3DkS-OSFF zTV2-K6=qMA z(oPBKofkEnMz+tYQoJm3+*zHif4Bbj=UXJH3(lRGv`N*n4K6OA13qr|-LEChee};a;u`1qlN4^_IFB=a7~mr0U^_@DEX{RdyEdA@`0#`QDosdWHkV zUIMn+C;jiNKaD`t`jcEb&g}EgtY|-wEQie645Qn`Go8B#AsES%j2H5mWs(lX>^NV{B|ExCCB&^m#68@Fp}5y9KU8q zQL16ZvFT;M?j_G-(eJop5Pz?g#2*wPJEkg&_@(r==)9`~mbR@qAbQZsDIL3uZSVLW z<$iJy->g}ps2hT+JtDzyut<2R^?+0cy!J1pbETdnN+C^__HkZR?YlN`zSjY9cg(Os ze{`p%)S8;Wk2jQiR=m1^O1b!`~@e{)`6!nJ|n_BUtZW5?+J*U+Ei?O#>JcbE|($XzPk@-7|rfZ1VLca)h$ z{YyOJM4V-AX@2&+a9Q~{iy?vi@nQ4r7wiX%s96_0hljCW#~kpLW^@Q@T9n`T^d|H7 zVLnwaT@bNpvMWFpjYDiv?)U1AgC))O8+08vYwd0dl>gxtXG+)RE_H;x`0m zomjY#{hLT^UpHQ>xAoh7LB9;|m+#sGIVA2s;p8WENgnKnJW!9K$zN(%oyGN$_tWGW zz%9RF3g~YO$LjnFxdyeJsloTj*hBW=2Ng0+ez)s7GOMf(tS2^~p9FDKN8tmtn1QNBUy89dxdyTC-TgHPRPVyXm~fc~eJu zALgC`5y$TRs#CY6Bg_dqH(Cl4*hA6QZ`{MZF&nAceG|0wUaGJceDwD5t6QnP`;D$- zl<|yYo@i*jCXw~JL)Pot{;yZamh9R+fSEL**JK?Tz-wk9KM8r5q{B5b_}X2yK+@RT zC@NV|uDbJ79{cHtUE?IPg|k=sRtnO$WStmeu9>X5xLSdP&+HV*5n5IyJ0S7N<9g${ z)703K;%N2^pmq7+%EGyAuc{>VS_Qr^#z;G9-ingy`eZ;3yaujO@40D)%XPawYQe0PPcClwBAHG<9)9EX;*zYzR85{RxSmz%FTc@$HVGa#^KDfIiKEFG zBgwgIh&NopsUAh%Wd=YJ8$Ckp86+#^&BnE$1#x;BlcS#f@SEI2_nSXFv&f|tw@EN$-Zq>2)@+IGA|$@8eevG<>cektR0WOA@igNR{gZhqWVxT zX3kS(i;)#o-0uZ*gV*3)9Gig>RU*%~jJ5up^mjAa$g8VWbfL@=@yR**_2YkabazLa z)n@0RE!>PvU$;CjH!Fv+FMnOMS*dQ%BZ~$&`ZO8#cAtjx6(f9ofEOEs0E6x z$89fW*^4My)63;&o*HXBT$m7dohVz&_cutTr3`RNI#UuYz3QuNQCiNA$d4`RllS(d z{>wnAI&8x*c1Nmp`T8VV;~Z+k zE9}c;4;~H5>Vxx_LG$I|Fo*>n=l(F4n0OkY`4iw8BJYTAr+d+q<7^d{WO9XcQH@gY z_z}UPF!>6+5ARD?rT>xWcq8bpeggi?Jbx>-Ln%Da3;wF#T;Ff6N|ZB=k}XQI{d=@< z`fIoz^rG=Pg0E-MGQpFZX}h?vL9-YwH{jw)#T1|OPUoL!&y5b>U#!yf9Iu?MdBMtj zJBkyfcAUJ=c^M{qG&i_E{2VIUnC6~FCwy{7Q?|bH;}J|Pg<)=K zRQ&h!g(>VeMP%>pZ5zKfST5W0Y1F2|B-`O(g1Hxl+`~8X9H0XAeDRQ#KB{05^@P7v z`R)U{6Wx)wqRW>isN~#n$9A}6J;q;mEO?7#|Huu?KcNdUDB0(a*mjcI(ahisu?ZXI z0@O=u)5fVfZd|Kzl9t~IUimtsp+JbGE`6DG%(iacu7V!hipH3p^)c+<ky0$kSu2i;{&MNuByPqIkE8vcA1=K*${F~J zifx^NTC>|N#1;NlJ|KC*%q!8>Lv!GzJYzdV@C~F_3%SQhpX+ND(E9;Lzka`^lS-tT z1qks0^Fsu<(4P_9QnHi(zkSW+cF~5h)VLGzf;kt%(D?~l81zwh5Lpvy3U%&4V^kX6 zYZlh-nCIwP%5xfR5U2MO28;|OCNHwi2z_H6DQ)ZM^%>5|yJNVvCMOuQv39U&}6?T>c;W$EVrTzv&z1*SEiVl<&K_ zoR&`JHIiP?zv1@$AB!n}DfNACE!Yp#f-^@ZcypVPxG>p#{}A*x`fJHI8|vOyB+sa* zl4x^^G;?%CJoWgyrSf1twrX#1k4dXMruL!d;5y(m$X{5Oelt9Jfl?m5B>NRRuZ5cF>nwQF09mGMbi38)qel4oIj zR)9U5D22ZW=-VdHd%i4bKcw~kYhQTkThy9YyqC|-!B=#Z0G5gkp2zgi*F_U zQId%%`3c1hg@w>=Hp(4Kw_kEjkl$C_V5}2HYbOZiA-NT2Iko~!h}7c-GeCKwN_-Q{ zJ;bKE1ml`GU!HK=GJ?z_a{&1`nU^cd@F#I(eXO+3NJ5(e%FPT~i97nn6AXv*E}Y732xkal*1W_PZ^U>B&77dvD`7+YMy? zY(DE5OpVLuTH(q-^!YD9pnPEgBkYCj-(%RzlWg`3;kfezQ-ypsW@A?E;q{|%;y6{r z&Gw@-NOT^DDNJ9r4mnnVpl%=h3eT|CVHXU;cmlWJKbL z6Sh&1El4>&(R^$*HB)Q|8}xWkr|?)M37_#GY%3zD0Aw|Bl(c8t3Hid3{kh080S!*hj!$vOV2FlIFi!TW ztwZ7_aqJ7bOB4}wJxD|pO?0u-ZUA}Q9M;JI21$d z97yaLdJVr1{j~v@Tip3fciM!qxit#_Bfg&Rk1vNVTur{^00e9IvvD-Kx>+%4?LJ09 zp-b$!W21?+Y8p~74-M62ii@Q(_e`0k@~sFh2b=ff)U}&0pZlWzkJaC5|zH9 zZ1IIjG3+UP>JBPsoc_nb*KQKjC$o1R^G3_0OMy%e`K$cAgZ{4h3pVHrIE-s&He80sN2`*;tGY#0;Qx3@pA{L#4)AMqn&i{G2hX%UIi;zb=SknDsx8 zHL~H1%pm_O>vXoBj43j1w@Yt7=~Z~vge57-xtucypYv_iUI{*faKU1v(V$;=--phG z_ZmybPxBR@qS}sPUJEMwjaR&mwnlKg|LSkRfMBcTLz0*rC~GYTZA(q0AV zw!CV~^eZ?o^o7S6`6W3TMFE@I9+KgGE@l7oONHcIx2H|GANNRP!g>ssLsB2L2bvvm{I?f!ntQdq) z$93xycJA$1HluRy{Ny8%n_ge?X@TZnuN{A+Y;wX%>A7RE%$usYsXI)-4Ul=wup=%k zf?Nfo9uCJ8Mt!p}$4Q*j+!Z=+vMoZsYdadggvQYV0Tupq;B9c?OT(y_vwI<+8e+K;~3;vq(*iR>5xm{s*I#wyy*GJTP zGd|L3&C@JPX~kGJmbiPJaGw;!k5V86^d>2qTa31K_0--~akj3P1VwgQDMnmA(@bV8 zS7q~dgw{?>$tr13oTq@sbtR$Q*FiO>I@->+l(LYO2KXF5lqO#Snd(EHUv{*g1Pffj z)fzTpas8;hPUk|ZuFWS{BI?WG?fKr+|NO!{B2TxgcJpzuL?0Ab2l@?^%uy|sZpbU^ zxo^2?BkOHEmM3VDHbi|vy(_KC-MC7pX6#HE^BI4arCuIPJQzP`ew($p`3aG zkO5RnZm+=`TL$vszf!kc_=P=!0nIEU11F2GLf6_=$I^pl1?P1H;~-j5e26|+yfJDl z%c8{-6qIVYgNZBNA2pAq_QUIoVVid3_8OIS_{`*%MwIm^!Vt?0E|XnwI@6gt{Og0r zFv@wX3-L*a-w694>;;_y+6L@bB|g4e%MECD@CT`=N0*0!X8_&$wEDL5_9A-c&)v?u z#qXiVfDoXOVe=+`5&OYJ@31RG2L^3LS{C6ZCs>zj{TBn^T>0EG=1-HJb}<7M3(dxT zh7N-x;&4FItElA8a(0O$Lc_?=Tg_5;+jcm@nXXU$$#q<7*BVtBC(1h}ab#BLdJUd> z!I3}Uda#DXui>$Im`Pj1j1aimdRt4B%`KC>GV2G+<5gGdc0_iiurpFNB%YlII%&s8 z-!Mu4kCYDE1;2!T5rEin$0KI&@pW2d?o?cBFJ+&l41c3F1@XF^9js>km`!|+lit1G z?4u-GkEefnyynQl8m9F-@Snq3?&Cm5cQU%$zZy+X{t}Sf;7m50gNc9Q7DPP>lI;=P zjrQ6EXecYQdK7DrA2ndc^No(DMTlRLN2wTpaZ8@Ru}AO#+E7PbYo{1WG<23Nzr(NFMs#|AeT>lO?47>1{{oMgo6NWmo^N8)Yq*rGfArbHJ;(LzqV7hT3XiOt~@5Q z4mIn~o(dZy-Z6>ZhVAIP?_h6#Kk+Glgl`HTdmnEPkawZ>3KzQ?V_60%fRrTGF!Ye2 zAlbXvHDe4WPk0a!UAVw%JSEh{J8nlN6RSkGFiSUG9gpuV3B8(TcDSXIad(04o&0yq z5|H{H0$je&hZ|5Y_!Gqc>8|4EBa0M&A-N7xBIH?YM9%ASBl>=+UQx;%g-tS>{^8Gw zW=S{w60;a*voM7_LHE*m)M^=3Pkb`Wtwz5~aQ+%P3DgS($0@n%!V4p8GOqLL)<^Wc zh2>1`sKTCvav3}SNwbXm^QolWy5~>cjWySZT1=;pDR}VY_E*+^tOSVr~n) zB+U4$ynQ~98Au`7Nq=Wa|7B+`e~zotx8OB2&an{D6DGvalGObj4^t&|Tguq_v+UQK!sTzRVIyQr;Q^}sg<}=1;e=p6bUmLxhr09t z<$pjtP7m>T^eUdWndDNDpC=K5Q%rsko$hTUsd|hc2&**0BWdj4 zQ~U&a-gm77;(i7%!moLl$OELY@q@iu8szAgc2NWm-{DRs4zrw-6aRW6wc!Qp6x|4~ z{?bBtLfgAxzVm%@r>)c_na9mWCZ!t9OYmFsd0P|Y&cnzfp$qvkV1Ao*YcYh~hYFuz zBjy7+GWSnniTy{WJ2JEnJkMZ%_aSKS zsz$dbBHuu+K}-XUu-1u|8Ie(mt8pVW2%#rsX|z+2$4zt@XE!ckBjjvXboqDr+tuE2 zWz*aKxyGosCFRr8zm&-XL;9}e!UF@93G^KSui4-0=Y7FYuM$>OSWT6oU`FnN+MAl^ z9cOix%5WEzmzU?@-!?qYMq;o$@|6LV`xYk6uuBq2xm{^{zaG#0N=wS6X`<*Qbjf6S zU@*yXqIQ{mZ*2rQ8j(w2*iNHC(cv$^vNTCe;KP!0i%BCo^*Y+iTiCN1Bh5GM`E%FL z8_s=br;@i>!e1YJd5n~j(|WojL4BQYZ3Ne6VE5X0&IYnR^KG~X^yTutGG!c2l84V- z9ZF=is|dM07yU$}L)q-o_~TGLLM!eFOAcCa8z}Yaw2N7}H(R8;oUkx0qX?CBWB7fX zbDg0@XS{Jl&N;*OBQC(b6!3B!{0u^R?4r7bEy}~)-7$K6oX5*k4e?UJ?IT10eN4I3CRfbRGM;Z zF|2sVB7B)Rr{Fy;8B@;?Cy$^XVQuTWFd3oo&>mV-yRt1|_O;4<*Z@R?P0Z;-9T*7Mp zt4LUVZ|$oFWP34>f$$br92?!TK$5D-a?VzHG&c+^+9!bZrGTNqS;-xt!W>;WH%llB zPaSVP9bw!UcXma%i+)=*y!1zw-bg3xq}9GL>;WaFS5DwQK?f49hhH<;VzOpYBQMe8 z=S65ditaMxriJT8YI}#!%`_hMar!?CX28?l&tH6+ffz~#s}1=Zyt zzoURvdi<>|NjKciAP{wP96E+QPNdUFpsz2 zxSgw4WG}@u&c!WsJ($aEM{(hLrmV*B7WGv@c{=Iz%o_y$QywQc=@G0e$=fMw78pSW zkXPZ8O7hT|fJ0vcV?{5hP9*hSEhskd#CeT;7e2mZgIBn88s%>6)6Z3tPL1Zd zZu-T|{s&U`$NunmZGm2+bABTAsJq`|y(s$J5gM^MtW4TVuw*Ia%*=DK@n*GaONSCf z8tp6fffAeg(&_6m+u~QBEsQQ_-ump%Qg19oe$YHpmk!A!)8?QGE3!ZWQACK5dys=lYv`7!|MO){nO(T@h0&UF4jHU2?c0zF-rzBtkC6;|p(>smrS}x^=lKba54DjAZ$pt}_jy7WG=0mPXxfj{M zx(zI^L$?YQyfjVbrc$}_>?bihGfqEWqbcz$rnHkXX$%ZVv>r64z*@A#T0Yf%M=1q` z(w-1T5c3U3_rI4Wv`&>Hu}%a(lGp!Z(YKd47ybXd&|dCo9DpwvdJSLa?XOP49`d>V z|H0>m1z87A09~H9I6UE)0%7-L#1edOGT0Z(XZ6O+5c`^H@FV z0xsHfb1n9e$3}NoW%K$Vk3S|}gT*J+)?APOELGBpSp-YayKc3ci4hbD3dv^>dv!alvWA>Rkv0{Q z@=v69vRz?n7Pe4}tF*>=D?+K_!F*CIG~GIn)OqPal6 z_RHit(SOPoCSJVHMV}K5N#y=4MyB!JSsc)eGxYkCm?=1)POnytuf*H}&R0oh4XqN% zTU%N$1SkdZ0NA=GE!h`DP?0@{hrNzsG$ww`Vx~KN@&gQ$*$XN)gB%%5;Kr*d6e1Kt zlp%`x>}Z7?vPfztPYwWl8I+T>1B3&ozjD&&7aS$)ta&2XOO|H=!y`{+l_`k@&op$N zKMxQPJ9t41h@=djM)bo%^MZ8Er?x&rXfF$%nbcDnZ@ztGo30nlUiYC)yf2;Sge1CT z!Xf<+@R_h)1>!C@*ImFydumW}3z~FAhHWXPn$cT_ zAEcV&nGaqldx_poDdJs2?_(E8N7zq};<80aed|?8&Mx_yF@W{lP#KqXBo4TW|$gJXFJQ<*Bct0&b(W+$QAz4MajUHqtLnNI~GEOA{R;a zqS-rcDJ zh1=s8GXHL4`+nhfK5$`z)0Nbv3T;1Ka#qvE#HRBz*e~MPWeGC3hVT=SGn92s2Ld4~ zWw6Yh;OvMP2H;s;ky*c;_whWP)d)f}xckH}Zl!K8iO4=c5&d_jg*wSf$9Uz)RlG0; zvNzp%3LuW`jrD}y+W%n~^qodWW zNKDv#t>CJ5M)*4AH)oP3)i|-}#jpN55(CM1<{Y(yh~e32E(LQxg-S8sdkp*awH^eq zA`%2FBtbwP#)Q=G820Z=XDGCpAT4lX8#u`zZI>BR(eX@A>buM~1k?n?$Cn_L1HyggdEGsZOQZ)8<2YY@IchEqYrSm zdMQ`5-woDVPbUj2q=gIcJ_eH=6wJ+p~1c&fHI5q&;1&&g}@q z5U8-?9Bw!2OT7M>(DVR|1-8@qmIm?W8Z}$5Zc?h9jNEph9c-u4pKhvU==7X#I1(%0 z$h^tCd|kf5wce0y?>uKct$*{xQ^$o(-5DM^bzue@Z9OYca}~6Dx|l}D*0-m>=PdHL zyZ-Je@?fNPT}k@aA@_Q1+TkBNT{jhS)}^UC0=JE&_lguQM$H<>SOZaV^XGvUz&C!f zOUs;Wm+(9rh=Q|*|8?U$dvS8>T7CP~#Y}T~I{Clchhi$}*L&IZJ9sQA?}MBXK2(ey z>hCQ-&tM(E9hty6}`6I2@Q?Qskux1N9>cIW z6B!|dNDm-b-$%`#Q)>U&YpQx0=HRZbL3mpr@d3$!?oi4n%c^YAHBi7x+-7{M_n1t# zsB=eVxm=bd<-@`%?#VmxkNbPmi^x46Pn$sIUl89qyX}8dc$gcx#BGn1 zcPjlF5P9_ion0&%{q_Tv@HeT7Z{KKbQBVi;UNCY*0|HPu`k!Z(mbrVW_|u+~;{fR8(wJe|&e_=tvpgPd4(*j!oipJ(B6R40_buM_~ z+&`gJ)LySGE7^O(QwU5kotaDOjnmYuU@CKh>NId)3Mv=Vc2m$^oU6*}2EK+Ti|fC* z^zA_w$v^aW4?=#-{@)Q-59o73xc)2^){9`*iHLczC;h+Dd$z$c@cT>qY#{d+tRYop zlh2`-p!1{E)p~jsv>OPXu9Jydr~?FIfvCio_v?Ue+XDoC=^44fE%NF7#;zfY|5MZ1 zGRnmcvp8=Vx-Kj!Ra|m~Ju%|!BEKlK-uw*I0q)Umb^yt!(C6$Ud4T?Y4*0wYSAmK6 zv_Nv^`%ML829xq|0OLhNjn1fv5qKfr^$Z$DB%kvAc{!*~f}c`~DkMKI>vq+HB=(_N zbclO72F@g%j+1oQISTVG5y0b*OK^^JI?+SR|LY{ZT6(K%JBV~hYoU}~hB4X4=_i8z z#@3sdU&=7P>jn#6Xr~{2h-`4W57S9n2lU1e>14sfE1*cj2J>cHwrMYnCSNM zJ_Lw(H4hf(g6xLYcIWT#{Ri}#sYK7*uHs+AFyqyLMd(~`MVyzMPNSS4+OULCYJLgD z;IG5qFb~FxV(M0u8r);SuY$ho-6MUf|8_Nak7)-6!nyI=S`4L8Iq4jZLFq+^!Z^6p zFS=ZvEn3V4HQJ-dKU`y_^nS`j@3w|zpM5vlyh+^Ip`ZJ=;j~67_aub5qQ{*bD{TIf zF4#cJCky5C#KMpc*-9`%#Gh6{hcrWn^#88z?Oi&-!S?rD@EjhY8WZFYp%Ia0KxS|G zc&=n{+H-Co2vKW^rJJR6^0*nr*2upOH&1)zm3R?&(YVH zDtk3vHTjABlJtS~$z=u3UVrcHamX0K9THilTCivMDC`-fZ@LuA-yzk+#bWnbRIaGi zr5x3*6v#P!%M|>CUcJ1DC5fdd9Vx{G!xj4c-xH5n26C1{bEHG(;{VzYY)tT+kX{!# zHYt^4KqIF_98du!TqpX1ZPFO@~W^g;H4U^VoX{2u7?vnK{$xsVmd}t4m zmsjTgP3AO6e~I=^FXA2*i;Ia~XspUE7>7l_%pU;UWu_!X=U3MGY=9nQNMdzp*2ByN z(EN3lW+PFp0L}pnnU*h5MXqp3s)pg|9k*1g>rpn<4!=F=b@@-ilS)C8^x^--J_hBe zzp|H$yi+l9Lc~_kM8MS2qXwgWvLWVHmxt!%PDp-@j&>h9+IuGh!no7$>L}ulDM%Cg z8g~VzKPy(NxK$)B58<*xvJ6#;?sllk;QLYc?9DYcpH@81E>5)A+dWjgCaa)4l5q|# zKd&+~9w0rIWFM=xk=TS`CJ?RLt>9I0V{S+lH!ApF z8l=ynUB-PA6=f11+B*p%sDXb%$p_m>LEz%Bt2dXR4~Lw8)XjL==oL!{^k67Tkq<^p zn$X!UneJ@O=uBT5ss1s&^PF<}$E}k(Ta=tI8obAy$oa`hqZ@%M5V~$9;TG{?G<8UC zZyiVs6*{*(e!9PVhh9WtoA}pIF4!hskb}al2nx3|_&YkVbYql~QMaU;mCSz<1i$#* ze#e(yJNI*<;CAbCC*zJrDsNR6nfdqQF`NuN9!v$q)~U@*9R-|yvx{HFa6H55KF8%a zfr#QYal(Hh3ir<|K1;Hka}!y8lT&))&?VostXK6e{W<3$(UqTX2()3SpP??&U9~&d zLnd!KePxmKE{=jVFK^iBGFNHwawQt-fnSYKG`kd}j<0l@lIrAEQgfqDt1#hxkw}~nl!5Y-Qv9=ev?rK`|3RK(7(7KYGJtG^BtVKOy zF}c-wIktHM4qdgaHMW^jb248%OQ&`f9E}XL-uQu)0=}#o+(I7m!yH%KNH+isvL9U$ z)#&92z9)a?e(O{9;7`4B{ck)fQB!`hc`)O?7N3&A{o7+3xaAz%9xxx*Eqh5b-u&sOg74M}O(GI!&4ujatnxXv zNM__EmXypChEm8kBX5-Fu#CoI7nP)XrpJR>~T=P@IJo&f-fhQ*i8%Lnn3*i zhL&vcxSzw2D`-8JK{L&|6ze7yRJQLZ6mzr#Fu@zbpb=8&c{1iYO9lY z9f)y;5N|o?k_q%$v7~daZmx}?>`|I(w_m=|?G(uCrDZlu>BuM@qUn{Q8S`nWZyB+L zzuFdb8f#2IyZJHmr;_u#K@~XIWYQiBcezZM{pt1jz-3+$g#lpJ55uEjRAzOsRnb7l z&0)Gh&Pd1a%ST{DHLZ%_Vu+m$*^2?mIoVItuK0Wu0}s#ovqxnR zztbYHcXk}ifWX!LeJo{aHQC?&WPNeN&Sxo<87dFxk02x0GO~BLSM7>>!W-jz@^@Ve z`j#LALEI6EE7gcABkk0Q29Kw+h7UAt>ai23rq5Pyd@F(hhWDKtRKlHYG3*1w>!-BO ze{V&tzHmhEedfTC_>U2IE}>0feH@hh{lOiES+FMk6(>h|c;@mXRsY9PIWm4!5CEa-&fK1JQ^aaZ7$tR`bq8cLaXZZg6}2 z`Mog7j_c6u441#^^t}+<5A+Mr93ehL3aRDaa zs-gGY$9*Eq9m`D?U8L-^v#muF%%v0&!VMvxQX$jE2`?3Sk2KSm&)^4WUL)_}yk69- zQuJtgG^E)GoDDph(t%b)hhVO-M&N91F(S(t=C~e8&=lRl!4)_z`p=$;1@*YW*L zx2v`gc@593p?=Yur=OxCCvRz@YJ0ZCajR~nm(i@3X)Fue zzudIn#scUmILFU>PcO6HTkLihld{$c*ajZGb!IwMxV;EQ!YV9F*%UUk`ITWl&ao}bjUDbq z)cJRnn*~~-R-aslwpfL-40~!gcQA6uHLerr7mfUe!l#bCo^^AGy8}D%13+Wt7M25E@f-3Y8;lO-1P@R&jR_hJp8!ieP)A4K~Yu%R+~ zto+Z4|K7JMT56y55KnRp9Y*r=lZb64HMF&WWS@1=cssZBbOW4cxlwLCAXQkWe-|VD zn`-U-Jw=p!T+Nq{t9Gqmb$P`d{-c82;c)IF7GXd!+xZ}_5jh~zKV%`;e_@KLs2oFF zm2jm2DCHj?lys4#FxOV&?x+C~$trglb)?wfMdKU>!L~Zqt7O(8wQ(b?3zKBuZ7QH% z(=8gsE*19e!+`ovLi&^%2(M1)4ATR74POsx5Atk|#yXas>bHB-cVA-%-p7QyK#gd!OXA zv=Kd|RIgz1YRH&(3F*91h!J>Ar*JhS0{d5x8d7GAxA>?wI(>0*MbGl`a%%HDKZXy5 z_IuYr*5!Y*-}%I+YOgv(<`I!|rzNv|j2P%*gTY2QK7jgid(p5Z^@{jjoA$JHg54&)>&i0=!jxo8wc0W`;Vp1D zJuZG_27uB^3cvlMb=m4fuTpXNHA>Eg7g(6*SkZ-IVZlyj9CxFc!`RSf9lm)4MIxkK z2>%Jm1x(`CTq_nf4Zh#DR7q#b3jIU5hbRw5-}!jXibT@1uYd^a{(+VkJ81%~1wM2_lYsw8jCpo~(3_?r@lrwsNT^O15sAb@0$AO@k;qOl<&*kNoeb3ReQ%fWHlt>lUd&lfS^t zK8vC^d96C)dw?&qBA1@XVtcP=AVA ztprx2CCL|KSrbv=`;42aWbBmuOBwVYWBMGFErO(WVrKYPrFFt^Ud)pGOW|3o}^|c!>K}5Lhlv(fm+8 z4k`Q`^RTR&tYWr#b`(<(-V`a7oR2PySSRC9n>ZL!30-6Ur(YS>@q zkn>@BPnaQb3}?R?X}x)S689;!XV|*AejK+!bAr5WyQ(qAOB}X(44t@qui(|e$M4=; zM&hjc;mGzn=^`wI6hpCLeYN%uoffwM+!K=Tq*UxTS$~P0?1Y#9Dg-!>lKFXR}Fh-r?N0&erB3gXUsQh{drfp<61Se(Lv@Y!##v)a(>THz8hIHhX;CVM zAO)8MlOoR`4b~d^I8w;#pS3xi57yg$>^_CT^?zQ3fq>Hv}7u#}G< zFwc>?HWSv5@1xy*DxDIRazyy-2$^lZ&AuNYP{~MXvW+<=Xo<6S z9*Se#30BAPG*18Qd(!XiZ7qOt4=Mov0({9y2lU5rHo)!R_Be%F${>fy+ZJd3=P^|o zoughF@p;|LoOwoInXUZ()&@AY*P}nmc`;LvE;%dsuXHy6E@sPOQDV~wks`MI#jLMV z{zt4>OU>soc$-u`(Kc%75Q7HWlKAU+TM3NTD5)mxa;NB{m0@EAC>U)=0bK!j1qT> z4-d*B&I-V2WunnZLeHJ<#asxeR8V)u&`NuUG=cjYaXQj%*%$!k*T}8MzMkogwhq;e zfQBag!9?dzIymR#f~c2O)|!YX4c_HhrFG0}VtVp4RpWjtCh8%7f@-bQk}bhtGXm@+ znM|Kvi^)5Mik^qf`Zt8%dmL?fm>W)fDqhw^m{de5XW+bCkGA{#*X}* z$HJJK=|dRingeya%SXHAhgj|1V+CR4x1OuM@g=1*UyRI zN>++X?neX>b4IkY2tL@g1+fBq50k^K#Bpf7Qz3o8vYJIM?W!PCE3H$o)M4y^l4F(< zY!7vzQ*SbNpPq)XcNWK$pB0N-FF>D3@E-Fx>QFZW7$A^mI@6%mVH}SF)^a(@0 z#xlGptS}kYLu@RvP6Fi^0I25IQzbseCmPohAjAY7`tW{Hy5!)^%Q=Gd{kcAyGm|RF zL$%EtYuoz%nGW$%o>TLYLC-}`#k!DqE_|V7Vi7w9K&->Bg+adx)QQesrwEp)3D72D zr-|w4``+kR+4ntbot?jk;qQALzrG~q2vdqSjIkXk7H$}3optajtFL~mT$L@1;b}$uy%#!jO=aJYYzF;YiMJWz2ra&Nm@zKlfTP29TVN7O_^Bv+HWgehD z4_hXfEB^;|1T}A5?`OryXDRdmJ?^2p2p zilQBk?5HU^mXz%+I%<|$z#2vr1!fjv zh2}U52F28Y@AnKd*7v>d|N1k1*Y#Zm;{Y?W*7MxYef-_Oo8}!>_MK|F-&`w|*~|%a zKC=%`hLWIy8%Z`iYt9L8wRQie^(fgUUnsvx83UOS37#A^E=fzBWTx819EbpJki2(o z-u>mCBg0I{yRNT|6)zuIN_GzVs{RjpKbZKwn94eGmw(jz@S&?Fp57CJUTJ2@a1lvI zz3}BA$>=Ti<@{aD5vr%Jv$>QL7dgoZ7=Oxi$5=amLPemBId$>c^76Q}bNOBrR%h`( zJu;EnHe}T?JZVIX@||zrjU@>aKOI`VWE$F1t0JaO0lKwd-CVNP<$1?BH5rTKzGP)RkFH3SasPyFz z2+`BUvBdq|%)+@=%q-V{?XS)qQsqHoy0S_=LDSO7PAnLw_nOR}ILH@!zn(gi%+qrw z$wp)@BS*IXaNfc8n}_|PelDHqMbNA=w60b*JMk%Y^Jr)=ug+CTibj#_lXpld{6Mqf zm+X&cTIRnpsAq_>)VTSX-*%73Zq1nOvBICW#g+eCIgPBHOMdcBw(Nff(OdGRM=Ir6cea{{wAWAg{ zE`(j3OPcFpk`M1)jIbXGvrmhGwc}mo^+Nyp6)q4X-QirKGjpXjAWXWh(c#FLG30s63V7r7;A&KK^0Y13TU~mEX<$DfR(EB*f zfo`VDLh=&vNJ@xKUPSXIm=#ZRkhBj_e_~<8P$|m#;Cri zbcSqlEpyhmTnJZgd4To7glnhM>m^yW9?u$6q+OF`GA-R{xpx%$c2Cw*TYTt_yv>$PeVYX1<8%hC+;Q&wasbA2V zx!DSBhTFay`WELhuulil&-6Jt_ZW?zz++C&G7Yq=lAv?l>?naA9%2Ol2c`1Nk_+Vz2X`u3N^R(7U)q_~D?Fh07R1 zIl_H@5|ssoCZuGds0mpf0e6s555Yu1y>KChI!i2SGDdI7GE2D&2n<+q>LwxLhySxV z(uO$PviOtf$`&Qj-KXmQ16DPtoQ2Ql4EO;hQSifSQp8GTi}DdvOY68dWV_R$a%hAO zUkKby=OTK&SA^&AVbgFi%+nY+d_B43)5+G!X=E|H^F7$tfG_CtiS+URZ^@FyX)+^z| zQ(tTERpi_hA$qp>34T+u*WnJKv;XS)pOOPUzX1AMcB=Mhg z&1N)v2YlB3D9_(&8;wkBpK`=Kb}tNH!*Z?dovB zHX#q=vrY7T;jEO5v%Z{0CbhZQRGCiYt^rj_Ez)};45)Xm*loL6{geC(otikx+^D`x z)*qP2d)^K&?U5S_mX9<=e#@-Y$L^F=-EsVhGXoPs){*ai(a^Kv`wTiWF+?|8Xo0I5 zQZxdb@>*qQ+AU*}aP>datkIa91^L9T@1z66eccA-b$jYlkWeeqJI2AeOV{wH+2W&T zDsp@rN7Q#jE%v; z91KL7!(Ihu;=E3vo+40Vw>R3=ZoId*oBEMCBN;JiEn|AF3%kJD_Gd~+Pwbn{bE z)$2oFW4P?d0st*3_IR%BWLl(&KNk`1aUg4JNgl9AHqkU};aPLv|3dFa5gri?46R@QlZkQK3Ou zEb@(>82*gWsabz+1n;@vDcsc<#d|*Ww5Co?6g-J1BRaU)x1>woMykNii= zaIeN7u5SSpm8l+2ISH-~r}@}_KKioPhZphXJ1Y0m^Qe%Yls^#don%@4+7N4{EIl&n zoWqf1{V=5EX17;xXLSuG{hoyVzIRLw^kPLvPMRp*T2dd*C8}{yz7SAkGGu&QOg=Jfro%(Y7l{m}4POlJA3re8*okysDg1PZD4h;JT z3<}hXtjC6RbCVzAH9(>91C?=?n-lA{hNPxuOM|@0%}%`*{q!D>+>zW=gK_d&7)C}UwH$<+ww)c*J$nTd&!szuC>Rq~UJiR5yX zr)zq-kp1ti2q_*9@{Rk%RyZYYB*;+F@sPNuJk>QZb$BZ7-&P>YU%I~kcg5;AE1DLs7@S-omb3S~&i1tFrm~PsH-G!S76TGn*X{f!=eD&!F}lvMa1d!cjaQ z(&SOz)HJ3IqeqG;i_zrZj&m0$88ADyB6`mpUhfCWBIAAc+k+r>^aBqxdY%M7PlnxqA=i-vsb zG|_gc%{5A7ZI@i^)8(GDsmP@RR?9UOpf%(~jirRe7}i~t$aU7c)A zQ8Fc%Ym7je;!y*7QI;4oU*;H$9W3Cto$hw^*s7F7Thmh8!i;_igS2fuy)!sUl+s*F z1DGY~T$?P@s_Q4?O?0%hCrapyvHo^lwq2Do$i9726Ap~8MsdA&jtPm1n8YW88t;_X->L z$s+5k^DbLos?m(Lc*+ybdPhNkK49F36U*~4twm4XOMLS#Ap=^%Woy|pkFJY99;fl0 z3aRywb0Zy;5}zN7KpWB&O{+psRfYj)Y;;VTTInzK>Zt>+L(ci{bE}_XvgR(4q^S2~ zUmO}J>6IR3{jx<@R6Y(r%txmj4~h`S1US#UyzXkHd~LqRQYw3H`PR?3-Wbb!wja7K z%UXK%VGZAC)L+l*0$<&#o4@)VI)A#xEYwGMS`U(!7fn-qPX0N~+rO75>2=V3 zONn+9$sfwU`&obJgeYeFKW`|@at+H?=4(nd$%QXH38EKv^a0P|>&soIK8ZY{LQqs0 z`O{epSsa~IT9;g|S(rD?+#T1r?;*M}w4%KA&*?xvpGj}cNB39DVFpUjYgC?>PW6O< zeVDIgL$XLO*R8Krb}rQ0H+#PcX)IKU-u*8@CO@+dk$?Ax|7nh&!!rp-}q zdo=BY9fzgJFUQoLC_k#X$v@RvGdzp?U6eK^}C3=S`ai9z|tL!n$eIszG)y{OgT!9ER1YH_o{v)X~{VI?9I_YSTx_ywg5_? z61zG|lsX9!>`LjGp>|TDcPdoEchS-`zVzVHdz`YCr6lRb6ln#r;@q$dsNbg*#eCkRIM(Upf}SAUd`!#_Q$)>CX(%|meeRxT@)N>pAjm47r| z8pgN0_v&oJ6sAhcEbT^VBic@>i955g}1 zkNegq*3dZ7c+Yh4xlT6q?cpAk2S7qi&qyg77V9utY*U6b zL?|A8GV>?KTTG_jDrO24cu(|aQM~>5Ie$5_kd0z$qQ%Yavz05EhM}A-3pfr{DN`Y& zx0Gc}<4S5*VT}|(xrDg8+HL40CWcp-EM3tLF$o`E=9e%}d9(Z7n}b}{^~{M6-isK- zsnDmp$Gf{a@TX3uIoUS`xw(}-$Ey`*PBA97fSj9uU=-3o-IJD0EmnyW*hSs3l*jNR znnOvY^Zh8U>u$^>p*C&9AZegCAIZz?kUUt*@d9fcEhR`s*Ak*jK$|#*M#bR7FAvcu zA~14TrV?Lc)iFXz!Y8lXHJcpFw6<*}{#;xI%>&2b>n{iU?3!WD17^G+Cl!$E)pX>e zli4#Cj4)psw>GRnXA9S|i_wA;S+rvkOM2d!3>P@;&U^BovB#7+%N9$q7Vb3aRmv?R zKX@!r9Kq~z#vo?|d|z9pnO+mEL;s~2GRbZv1wVVg2i03GbEz(EkSEm=!DW@b@=qAG z<7r>jOLs`A!uecji1-GnJ!3~9{9M}2QGB|1S+RD`N95Xg>*=jam#Kj zo|kkrPa1EnFUFasydzVfH(yS|=A8HGO@*G>iP7Umlu|kFT3LE1SL87E40SiqPx|#| zJ887D9w62_OgP~d?wb1>dt$DQ0V@> z*-Xzgt^eKKcSw1^hx>g*_0(pnSD;BTdrHrolwEN; z&KAUuGDxCR(bb_9h+Z*3)iwbsYG=ra%nc*OcxJXY5od$SF8tZg@}H%Bljz4;CC&4y zT{Td1J44RbT@nhD(8G91Xn)2cEQ`x&4pV`2F5weah0do_KdF9G@t&5KuI1TCiIHz- z;6^hQ8%QndmxoMW|5#sTcLBYYw#*$A%Sz=ptpTIV6id+4t&&EHF6_@%qOGPowu%(^ z8eNx?(jU^#*_E-v24ii+SWaw?#G3}37k@tE z^I-7ePh-7MtNhr2J@)C=({yA6v9;~mmUhS$9`nXy*;68S4-(%YZxnzaa?7NOhN~}- zJ@ToZe4;Z}=sb3x-`X0vnmcd5m=W0uB%l;$@#JVMALqoIJ(m=FYxfyfrHKzP{e0Xa z=#`(e4g0NF5>ssyZNHL#GBc7QzqY<5v^Y23vW$^p^nxZ;idOG&Ni&$NJs)`m&1e7$ zZb-}GF-`fBlm-M}Bl&ZxQ~hELL!&VT(?U=_V7+;Bv(AT z+(BE-vm_9Y2(3eI>TjxqpOQPYUl<&j_}NN$5t9P@x|^Ppz6zUvEq2q{_QAa-bL@uP zz8j8vbKrAzR+`M|Uo5m=b{80sheA50y1U!j^o(Lt`Rv$AXxE!KFw z00B&hJc`gu&wI>wMjCFQ?lH)6xd>&ZGd;ATL(4iCL^>B$2w)#z=crGRmM<<0=Ss>L zgW=fAz!-v!aRSx+jrO5%Dv8?z8;F^2VwaxLj#kXNIp}eICbw}5vlJ8i^bFYWGxN@Y zPTB!+>sNsK5_I6$<&%#rbds(s7)kyeZW%Mr7%s`(`Hf%&lWqD%yS+`G0DRtBs3{(EjCE@)}SwZaiHr_SA ztjTHWi_MO}_aBW3F=o{22eKJIQxFS@`aQN34KczC%aq)gU zAQoe(2-$jC_S8A^X5CjPvo{8Vow6^Y7S2lLg+sP5=AX(K==QtbqcB{ z)UQ`CC!p^>iVsuXmYG9w0+cr{&#^EfT6**&k|bVRZ0)!>$|{hPV-3*=z@=%2*l?9K zLAL*YghzThmy?4-z9id{giX4#39kLe;H$z_>XOli zgA>9*Ob+^M<#k=pOt6qCh>tG?_d)$3nxA+OT#g{+2RTs}02PQFIU~sV5vB9r4hV;4lvei_H*ZykVZ=BN4?$)uOjuJeQ8EIK_sNmuM3ko~nlAXvJFh>Le2 z)U-{x=zac!`RUp#=PJHz+rAn>3;9*VeWY<`*vGk|_<7*ZM?(y{Z zFbz9Qz%?+Jv<-SRJp&X5KvcJ}8A2X|vW>u)+A#sgs6s(9WGe%+&=2?symzKA*QhYb z!0A0;MR^MTnjbMwCpz1Kmbj@lwGZGXX?S+&En!4f@DDn8Um6kiWHVVPcgfU&V)4*z4NM$Z^r+=rBmx);m$kb&`J5X`BHYL+w{M z^9%;>m1rbw?Mf=U4fdgEx5axwYv3lhlDX0fi|}@Wl*ikjmD|VU0bo8;V^!@ypIp1HBah)vLgRG$o{3$%%+VlX@kE)EtfFU| z2dwV`pPqMAfQ(GsiW$gS-!Jx{gXk5DnLI^x4|po5A3v7rTb!%o2E*TWpF)V&FcK}q z`DLJ^Nwo>>qT$rbmcnNOG4R-6X8rhezmJ2aue!(o8gnptqQL$=Ke_Mw z=YLI5_v7mazmPeW&TJZqubmjva4M_?5S~J2tuZoW{maJJ0l`vMb%$$f60NHv23arU z5&Q8YgFn76q3C|)Qn3Yv-ZrNF)2s2D!%WImRVHN#IQ~%&qWaM6<9X1NC1c9Zr$ydT zx&-W_2`_#zh(EF^@}0#;$yl4@9iO8r&Qq?E)GEE#$eWHg zWJ8eZQ5jh3)dcn|D0@BAr>8Ra{#S0Z&u5hz46ilXsFR8ejY@Fn4<@OoDsiGy^TlML zZ4Cc5d(jEPrSW8j4g6OngW6wlPb8b_1i`x4$n3XR#7l9Cun?M1rx-)%X5aNFFd~jM z#vY0}sXfQW=%J+&M0dxCueR?NO&z+pcQQtjFn?_}Gp91W2K6s61X;Z5JEWL0<+CpwBv(|m5ucI` z8lgb#JgT$4E^WL7xc!E5Ni8jHdGSW8#9V(wc(qxfFJ0<#RpTW0kSkF)P_D{=qqIZh2Wo!iH`yO!ix(!bJ3(`sv8Bq!#F&sx3RQtMp%UeVvBgs`gk z>i4AF!#g)mBJEQq{F;s?8vk6VKj$L`gU<=9=Y>0iThG88F~nAf2B1G|c(4C<5R@OV zPkx&Rb|h7Iay7r4)J4|KNgSk9>9#tu+qKH--OCw=vDTulI?fwT6h!52D(W-mE%pNbbJYDTjo_oG{Mqls(*1dTBy+`f-3!CX_J z&!5QLosO7Q5pkC^c*oJgBt|tMxB8n5?Xs@+{eo=l<=15k504DL{vgOnhe##vFbtV< zW>gn;wYym-3MjQKeO`lK^@RCk^LpmCcXJyTD)j8GdsNC%{Q0|9t{gMBt7FqJdu2Kw zH;H?kZF6(nWz3k2sSr*Gpzq@H@T?iN77^59yX~i1)7vg`8}Kv#ALjJ)VcN%UNv~Q+ zVQSSB_epaHa0O{5!S@90+}IHKTq?$m8{-<3OG{aGukREXq-apPqR@&N|Ni! zBDfAKC5nBO10hO7a+sqQsH{!sDl~J?i5-^&{%)zr!YT4%s>Qa>?Fa8Mj2AbM=FvzY z?w$-4)9-#-C%#Z=qVL;-Gd}z9LgGH{{(Thq5?90-J7(PCKc)w0D5|hfAoehB%G}2Q zWs1A?U1D#(9rMg*-%aayjBx_r=p5~8+MsN9C!U!Q&p%eGIC5RKP2lg(J1sl({SWK_ z3RYz*L<;+0cGJcboiqyXW(Y-B9ruLYU3Z8Ui>9H@1#HuV55YGrS3jF3{I*#x^j zW+mZ$Gw}7`sXnXLe);{@kQv7_vul){pVkyqV%hq#=B^@FCllGny;S8IfHO z0Y;s}h@7>rk%ec3Bd({Ixe79#?NWq{PtOOxE_gKjXJF^Q(Hl&2Lb@a~Cwq*H&~n_H zMT&YBV9Is!gD6<%DYu1khK0Wk730ad$F_l!7fjY7T<`Hq5X^xi*9jk8LHzn8s|(DJ z!ReFCtYJa;q*HjT1299MqE`YY=?m)o|= zfJTmt0=>1A1}^XN<({;c%vq6>WZ$}vMNakAvNC;hnQ{NJ{X}(VyGe@MEPPn3D&J;A z`uk(@t6scX#!Q*SY2&)?mg3ARW|Z6sqppY?;~Yo2JiSl+y0mgQ?X&Ldz58>lSr7VU zL4*A~gVcEtA`#Hx6U;$i>wU8++cI}j%+DBnWToo8l}!5FF;l-&TysrS$j7IXu6Cdmkh=)n^WGr# z|Nr8icgEwIss4BRWh z;iyI*TNVbyKG|fIJtR~O6kbR&pBFSlRlxjMH(cn7<1>CbxvlX?!nT(N0tLMH#T*8;Rs(zW@AUdUzb0^Bv}cEMM(F$g zae;Fk6cV&(BhBH|z(Rt%;%vPq9$uu`d&qA*6ENoRU@9V`=p>K^C zwOHBgKrb_3MCO$t%aM6%TBD3rmO2HiSx@4Gn6OLrU{09UzqO315>`L8tUAj4?m_Lg z(9_I#@uLTr2dKXgkdNkG#`WUxf;GD*WA?KV{Ul>ZLl*Vbv5#}k#`s~`PNapUYyGu zc;)ta&ivr(Ag-%-&oi?qKN8hZcl`;ur~A@ZK?$sPFt3@@oBQ*fFUFW;&SM`WGm<#% z^+ENA6A=Da8Knfkp?J0OX<FU-o%v%X}N$Dghj#)j4s#G68aAcWkXhaA)d z%U)L3Gez761XN%z(dXUgd+?u=9E$&;^N=R@-E;=zE$0K|vHQAaG-r<-MV1Bjieevi ztCW@_pQV6A_a9_B>T$Mi1M;MKl0oS$zz@@e75Je`Sk5$eAkJ)o_TG|d0{(<^Y#>u$tkA?T&}(+1Lb zWIr*E_1w|QbhTHD8IFM--Lf7%0CY(J?78v$s1d&b2A}r6LASk6>nl_a^Dv%Kk^hpC zw?}gIaZ>>rz_bgY+$1{lCMh%!(2o1K2=s>?#Eq(*n zJ79Big6TQyU7yOF>!bU=M@9Tm+C%2k&2)`&>Gf-C70i1#Wk7!HOCDJyv}Q;})_X9a zgHk-8{DXEy8k*AHa*azwwl?0LBPibF6f4cP72>Id=IR$I;Pe69#%epE!v7n5kuVaFXn{{HxL3;@#o?J|^JCs^8DD%6*p=a@S)b@D@lUR8pG%APTH~Pc%tR~amrm!#*DtrU$r+F zKg7RB6M}zDW>9)Na8`oRR{=YkfVHNv^7Ou!8Bw$T2(^<;Uw)e18lqt~z`BpxrreGS z#HZ69S%nC1&U7R@K?XxshjMu@Bq{Bk3p~qACaZ>09p54-FD4%?uxB*0T^_c3{%zUG z%%a=^>GZ4b>N+4hJ7^3{<>$e^r;>X6D%&cDQ=f|Z6Z$g?L8zaMUZRG_l!~{fB?(dQ zJle@7dG)3FIRldVbD61R`!Q1VYbP1`&@aQsj1Zl(&}$x+N0B9x7PwnH=$zqNDbH#X zJ%^alUnP&xGmBHCf#?_-Qd)mCOPxFZ|>Kl=)>YC_k^) zc2)Xj5-_@#mAvg&q2+~gPiKs_fxwquqQ9|9r<(juf zjY#%rys@5my1nAujapuQgM9IXh{)@_kBP6XQ ztR+rpLQn9%Ar`~1QP#=x$bo@(i#sy(?4*l7b-3ltLX;D&v|!-hWxi8d4D6XRvq%j{ zM@c{5jNG=&T&ipQx{N7)M#;CzxQU^u^HR|m7!t8tB^8&2y(Pm`48vz_@N zFegU(YY%M>w4!F|J_RfQQ2qE`OTQ~Pw7>>*^3HF95Jdku%%weaeN}vcv-@ojK}z5? z!Pn|~>z#eQHsG;+xIv#!Tc99Iz$tv+kz;QN_UW(smNs?=Dr6gC_+n1gu!qTI;@FL1 zvm?JWjMF4BFUUE~ft|8M-dLcj+Y*(tXLW2+NC7E+IhpqG`+J;xd3~Vp!Bfm@r&w2S zLh;svb98gXY?TYYiEP5Mg43e2cYfaQnPeXXBevVfz7VO6l7v@nbZMnu=@!B_e7MmJx4u&i$WU3)iz2k9(=Q%)znC$} zOd%I#uS)VwUp?2~By5beoN#C=28?jo4w0UaT3L?_PW54D%V9(bIXP|*yY}>9{<4RS zYk0K%HBYi)y6fcL(2iw^muIFNjIuV;Rtw*n!Uv;1KhZsxX8lcW>(1xTUy#|h4Ciej zAJbBnTGwr`JhzJS2^lr$o@7mRHAB#s zb^AQ{_`CZmKQpLLc)gcDok^GtX4t`e{b}LElz0cZ;;mboyiTxi8N>Kjxaw6|%1`F} zNZuyeGvvnyMkx^lR*eFI3N3IY%|v}YX*-y6ejx9`vqU}2x4*fR2ZY+LX~?xeghp^l zkF5TvFtJ*-V*bjLCJ=xx~O=xjO^?@1Ll@X6AksgubBIFRYJ`qlEzh*drhgs2OpTIYth3x;B!7 z&++^K)qNud?7g(c@Xl);yXTd~mIy-F^zr22KnusjTe&(p5F_rf(>T?IQxZ8g*&ZA&y%~;l?~`5bZ|o zm)zAAJ&EEQ3WeO?AG(w3G=(A})$-u+EdECS%d7P4+N2NC3dHSfQ#aVwT-@GO8*=%G zZJo)x;=!w=x>CWu&}uKYUaTfletDzZnrLN8cc-jERX|*_8k~W#${$~Rjw~*{jStSu zJsJddE3gMO!~5>|0B`iWeqPGPDVf!;bKJ#u*DV#Vno^F}3CUMSqH#TL+5bq>Cj2psyRh0JSY51Gpp9R>%TGow*RzII8lz|j{pJ2D!1@q+zvPR{Tq0yC?>oAOO~(h8VpjG&ufmyxLVUm zQ^(^P%fYjB>f%ksYz&Y=yTF&Wh?UY`19~8b*7W*%mi&IT&py!FWDu#d+iOAfn%{2q z^m*@OD0NloOGmL z;2wgHeKNCXeweOx5R@3`*EmY&@L6cA$(Br)GQ_V)!#qaKe+b^jDHFJMwQ#6lwD|>k zB-XIo>jd8Q1RU6_ZuTsISt0ZrSVVvGqN;g_;MXVxNHP2~=r%)wfd1iVryn3c*(zc&Or3DLLvjvnJxNl6mD|#y5wd~`#q&4r_1!3;h%}8N$&o3;W!>;+m*$h5!UHN`6xaYuq z2b1dt-j&wiabB7hqV0gq(~w1BQ~5=6tV4U)gM;`-oZZ#j%PdHIWDa#zUD{j(_Lz1U zN2gQ?X{PdYPEMcl6sG_Z@H1}-X+3QGh5e$fty(z)vuCH>KF2x1T-Or*X#3m?nV-|R zb~wIr&(Kmjn{TqFzs6)83T<@M4mP*SKS4K;n9W{80}|a%PY1zJdY` z86ivtPn(_(D?R7%x|o046M^5b3{-)9i@o2mYb5w?rRB-D_bBu8r|;^!uJL2Q-#-Zb z#FQyOX~=5_o71WRLy3B)yj`yLnkp1;Q6#M+=6JIiDmCLdsa9$$E*c&#GEB zN!MIF0g(;}ihjj}MmLx+&=sjaMe7#q@z9V(vBHHx7VUu{*xa0>pfqE4%@``~f-46f z2tF2KDtaBvh7{q8$$VYN(N6A5G9vNVnZN7r%Sm8USKf!7f%rGlCt@3RWoqh>TQQuM>h}af~Et?Setjh+{;;M9n!FkGCnjfu#Eb45!Sws`;{Ik|)1zFtb zXU=vQED!vWSbbE@F1jNs*0QGYxkB86FIR#%!-q>?j1Nf}{32l<(;d&h!Evv}71%=E z-4_^uUCGLSG7mHeZ~bG86eYc4=I*}S!DN+$G_@Ll(Va_bbnbbi@qX)=e4vL7n89S> z#?GPdPq`Vf?zz;CAfap|shTXy;kO3EYZgw$NYTRIMkz12Y$S1MAr{EAH#>_)2Ct`7 zFQ)QJemI;$QXI-Nu7MpRvZbqNq-dDdPVBdm~ zp(kM9XEapqoPi!kUxOOV{89zG1!%bXlsNv2;TpriL9eAPO?Fb~(0_3qHlj8u-{`RY z;}^g(V}^J#B%Marqc*39bGEUeS0lLMo)|0st-x?(t!I+&x4&b|a)Rlh0}hn>;}(i9 zXN@nQ?!Xqw)QS9OHsRQNZ@0uD*%g9{<~jbW82%rE@IKIPX!LM%>E~G5&y`k-9w(%_ zNG-Z(J>mF~0p@v{s#S*`$J$P3zbB}yU&zd*{Bks>HWl`)K*7%1nxek&GxJ7b<<+_# zvSlI;5|oe2rU!gm=4Mb~L21BzzFEgyQF;#rADLo2>mz-tQI#H7>&NpC*CV8Z;+ z{b{>izq4>50wlk__WA97-AmffP5q9cxGsv#C_st>CEPp2QquUGK=vyPhOZiUHAaJ} z`PT*E9|yJk0B+?Xw0d;_QBSe(jcCJg65KjeQ18E8t(izbcc54N594TUdK#3s^s>Swmmnmm?iw2Ga3eAs;{=I=`YTWdCZE>ahd z{z6urJT`EzJA%(6_MX?iu8)6Bvx31B1a$1dpmUGG-{{zV^2E$I!mtr zJtknh?C1@Nl%*}y77~xA%!VhW0%f&BwB2%LK-4wXNE11HE8O=Oh3PXO3$rCC7AFXg zkA)>9`?xqJ?tIAUSC!ey_ZP{=3mbcRwa`52;F&!#Z#HcK*5uu2r6w#7r7BmpDwNCCY@H6Du~&0)t0+_8f7tG|L%b?0Kx* z@OXCOjZ}eCyV2FcoE6Ni9pS98=PrR8;+gFY>GvdEr|Z3am<(cIaUy9LktT<*@_A28 z?_4ZiyFV9v7Qh?D2ydv&o41T3>M@qFXJRF-y6Qkyw2+NTS%?YhFmP^ziM8hS!}VRrG}Bm%`ZF|Lgj`*M2Hb!y^7)C5 zm@>~Y`Mz%8x5pnfMz>}VwW>XbcH}C(Ca;cGAird1oHp~_Dm8y*V;b3@vbMa#ZjXQQ z&L}Cy%lNO!7mxK-w)}Fx^Wl5??prUQx)D9})Gwv^E}fd^W>}INP6^9OKZ1|gV_!Q@ z!BxFgG)NlBbE)^3o6wi+2pgbrlH$SU1yUW^&V*)czr2u{AKD$t)xDXRTz&SzZH^TF zXw9IUL&Pvr9+*3n6U_Sh@4wG(-ob^z8#YASrclCkK_E$gYQLs90i#xKbR{nWnbBqE)+zYk6I2M zxxPMauCRKvWD;z}%@KEqE#wf>{5EAAzT|puAb+pA&E!4J%xL?{)x2S%rEOL`|NTVr zz|HrE?~Qvw_U2bB)(jSo;OhI$=!bj3oU+@PItRvy$khWSlzuZGT{eT`roZ(G=QeF% z$8p@uXGtA7%Wvdt?v6{GDhZU^&Gr?w?sshHLkr(L5YH=wP*=xgj(gnt5j|JFS)z1S z$5Q58p;9gUleUJwZ4Oi4(qGOaRj}U5FB#(`>rca&m0{b$Mvo?`=VGc`i_#-r(jQu8 z#{lRt5zF;^tfzo{{~M!1?7@`$2Xx1Wpc2+lKmKX!QK~0%{)S#B>d@s6=DCTetxOT@ zYhJrrSO6h8t~^Ch8`8eZtcA;PZs#zu`+-#RUoGKpDJKr)!$-e>={H?!@ew!>?D2Vf znda7^Vt8&Ur|XHbbU&_qQpkuB4}<*`{1d)=>aA@-9@Q#y(pWRenuIucMtCdZ`t^&N zIDVgCC8~RvwWqAhZ%q=v8>`JB%?CO`%)b9in;`Bcb2}1{%jTJ>NDZ+CEuF66O#UOn zYTS$ej09DmSVHgLFDJ}WxhCXS#W1pAa{0YKd>M1aMW?*QQvw0;A7E1UV1{?~3@~BJ zoJ@L;9O-)?K+eP_)hV-3s zoN`f8j^kcDxJkBDZqTzmve6r+o(?@9I$hFL=`8nRLP2+o(gkw%x+@vd%4B7=6P(9n zitv!W2Ey1N+-Itl1U%0$m3f7<9oHvm2D~n$&7@rccFYm;VfOs}QOsPTULdxE;Z*oI ziJ!I3J~nFohXchyr&i@UG|jWSpO(H2kf&T6aCIj=yy3NL$Y7Z(kD6 ztUh!svi;mkdk0w;r?Cfzi67mTx1e+~czn=@k(o<*d}u6@27ev&1_nJjP&c~#i&yL8 z&EJsGQOoP9Mv)E$iBqNZcjXh?&BgJ|!C@Be7u5!DXlS0n)DFUGw$u}Y0%&7~@7amn zF4b-qH&o%b{gs>lguS!`Q)daBw-0jrPS)hBK||m8@&>vUymGVf_Ys+CMVD>N3kz0R zy`~Lh4zp!u1f=(6xZZ!Anq$TUIW$uox04AIe zo|y!OtlMWRv*J(WMuYN`{IdTsm3)y| zIFz4QI%Qp((gtYE+=55RS`XoxAB~ZcFvVHT7YRbLaR^`S62u!^7us*#4%T_N4TF;g zfdflm)N0=!(wRxUds(^r0%j8j=f`AL1e3@6Gk%Q!+Je%5z4)5mdIXx_5>PB3jk!eL zJM0lriHL^d%dd~Bj&a|`XqHD$`sX52+j7J4ex`LmUCJ0eL5q^{P{fyGD(pZwA_c!Y zt;%kU6Z^M%_E3Kpe!C?P`%bY@il1m|$`o>i!s^!lJn*s$#&c#)|HF!*B)fi<3a}?| zgkeTgj}7W2k5+z>AGyDNSu`d{ThEH*ed#VHYeT||mI96PU*j!kFsybDns&doJ_B!!aLx9rKSDe0j6L9{x3mIKls# zkC!g%`(g2)vkIy!DfTg#bLM|-F0EhCyhsq`zrYy{N+$$lG?<*4e@#9QJ~xqR4n{Wo zpR?m=&@oDH{M=U=^smA0V04==cL$yy>Zd3Q6;6-W)&uK54la#`S8t}`Os3dUTzZxDIZ#ZREE|X65OV=PrGn~e ziccOAG;d?3`A_J#pnOn@SD-#9t!Yt=c(KMB`WCym?15V@ef5QbtKCo@>SQpE10~+B z!9*5~H$|e4825NfBQ55m3(mVnI3mK!CYYS2>p4(#dj;XGJr6JjVMyc< za8|W63n^hoYwIrEnidU~-3^>}b6P_yGvMUD!mCX)C-DsT>IVn!FvoLwlpQuV^7cJh zf{``K8;f-|)7KzZ!Hm$HcQrfI{JK|6rt6;a0d+rXYh2%jIAu)^I+%s$>KqOiXX{p3 z9+?-50Lb#OImYr-QJhw-vfAWmi#4^^OhB^uF-aR(W6S;b_1%63^c&StzIuD#Rb$}u zd^}@)-IxHz2a~Dk99an&YkBHsN|jBD`p*yFloV(EoA*pNXdxLeJ$Who4UM}R#$c>> z+rp04$PjRQLmd$`;P!+$BTF=V-B!kQD@P+NPcio=n|{amn1k1YmAixS+h}|bUfJB; zv^E56u3*!zKGxCyTU~0qa-04tdklja4u2nA96wB)PohdP#2Q)n z3#dkbjyKX4UCT@y3AWIPjrl@^_8KganC-tevEJqsjh=gvSkF~DP0yFwJm=sE%H9} zi_;J)u!ol5u_>83bwOhwdVQh3%F2Hr|3GUhbRT7U1+$58!>`8iU)qJ7{r8&n%5Hs) zMwv@z>TYAR1i{udO3FX5b78ENV^T8mW6d0i#q5_ch2p5JdjSZ_k3NllWirCv1AAB^bUqf3I=wG{4@Ye2(XWqv;IDMNl>* zV0#;b;1CJCW>L_*j+sH}-N5GrqpK;7o#v%{{;Y0!GDb!>my@;1odVC@@vNm5c_~a5 z1Q|)$DfUaw2%4!x$Bs;UT~uvEi|0zbIocgww~+bCa521&S=w^zcuciU>2c)u+$TLu zM^gs;f*lkm8;-BpLG*d_&bFz{r9Bn2x8ilASPW^3&`qWSDbbaNAv>jq%pD!%!{epT zT5b(Wu5yNHTxDcioHOhZkB)Z=LQeaZXuu{MngbaZhwv-nj@`$ee0f*WrFDndx}H-S z*~w3r-JOO)fIafhtleM0^9oMPag+~>Ib9%g*B8jZ9MJm^S=X(~H(0r&B>!&kj5mCZ zfo{UNbaTpvU*|Uro>zNu7`rk_A?vkGmE&k_Vlck89_+jQpFp`Zu2&l6F3NvsIFEUI zE+NDgu~_M{hq&9_A^LQ^@6q=oLB7;xENaD6K2S9JWk2xRbX|$Y?EoF@|M>s-bVrG% zC!$|oKjgaFDveixQ=)x4KOgd6Yfqv}P}m~!gamvt2-Dr|Xn1&E(LR^;{p%?PutxD| zLjNLku&Z@kOIQ1zKY0z);KRWl`R_TKDRH_1om9|q<5Hrs+AfeSgCzAHj@uNHeK5ge zkREh~s-0XB{goVlWdH-PvDgkGq^*By4GOG}0)JLnLDzux+W&lHVUwfSn?x6$@`iLK zl-dRRwPJjx+Fgte5=NgsTCk_<@B?Fyx&p;njJF04o=U_{g!a1!dF}sU59#!DkpJTi z!COx&x^j01{zX~Z=ukpI0OfNY_#ljVp4bvM7IO~Wn{O+P9scXO59_M{m&TEWI-M)x z6lEBZrT5fz=eRufNW06!_OR)ooWeJIPhDhs4^y#w zF@#-Zuw^cGb+s==Z-1}+{BiAi&Ey^jpouV8Lp;$wgXTuc=@O;Ezw^_2tXJ<7|8MA@ ztzqiz_OW?**D}f>^1D1xImVmuAq@g=eRWW{!LZg^{H>%b>!0+2T%VE9n1kdDo-~0y zjThEG4$Ne!m5c~87-r&Nw6FTVI2X5Nl3v4B+|chg(`1jS4&26KDIc`f^yaLnMPwUP z{@ZG_+cW7YLrOIum%jDxs~_RlUqQXbuY3Oce*FKdf_}67dr2{i{&Rp!RpSogkT#Ce zGq(QRgYTqAf^Iur>lWJ^x;_neC8v-0Nfiz`ZV+D!_bMv{E8hY7YmWRQU4v8U8Hkr7 zNwy#ddwRUG;)?&hr(#X|`(#-^J_CH34y9Hai{n93!=qdA@S{TAqb}oK;;MA9f3NJ1 z2Rxg^RcSff0L)}_<4=}k;qRF}%nt@vCY76|5BAE#2{6K+Nq8G6$m%3X8zRs!)*f$GZS0D<;_KrSN?(P#xVL`pQO_GKV5g< zH01{snaz_7@Ljy=15bsNkc&j*(QCn+SqI|NhWYM)5_Zb4@P0? ztJ40DAKfzj=Y_&w}~)yW;=r zbNXI`@a-c%8@kZvX$xnJ=LHRDNCFAu=-hCORH8N`UkTT!3Im-=aQ{AE%fC;(HlPRRLSYM4@yz-DwyeBi z(;JAoM+KZ@@^@mpI;8R)k7b@k-I$y5ld)r zo$6?%H^!?xw*kZBgcPM?5ZyQz-eJpa8&L7z{jk1T@;|p%@U8y0bDdNrCSY28mH4aH z&DuiqcL=O2`cH4O`E&)9Zy zYnYm$eCeX8S53^pB1aaTu`3)EN{QeGvsA|yqQ{-OBHIXcNDOptc<{Es`QadroR*#~c978@xY-SKA+kjuXqzdSh$l(*_8}nKbGJtf z5zc}r-eBeYN|WWU$Uz+$ z=MK59oe2)e!^#acLRvi8%CTh;{>pp*FI2OhxxAyASU0@XxR%X$XD#`)IruKnV|$X{AH2+i0J*z4ND zTQ}2%m}qGz>f~`^Q@WddX~2s*4S!_o&$MY~M1AL2l}8<8EsD5CF1;QGZ%%xURGh}Z z5FHqjZri8Nhn(yCS@iR=RSbdL(KB-!>sj?R1d`W(hoO>~>+^a)SB0E(!wTVE3^#PzA31hipk1y8(1D_8NE1y9Y? zF1J1Hxdviit7kL5!;Bnu=$p{T?O}E5v|C16+bGJRJ)4y|KADCg)#JFg*OIn>F1+i0 zb4$WJ%-Mt1MW2+>D=Vx>kianf#cUf-3e0a!lqJ_}d8aGf*z=PWfN7y$M)U_5MHZIWsT_%mTO| zFpFYJ!YmL73bR)|t^9?gMYXP&iq9Ld`=x<;c7Hu^uf5)5CHx35u`H~>4>N|rO}c-sP3 zQ|4|sUCn$~&@dW?BO$c&-a$zZ@poi<=rrwf$Oj+?OsGC0|0dvHWOZtVR&t80Q#Ib|{{cr|41!;uN%VkVWst*6sg>LT9k1a^4rk!FD3hs4sH`71&9dfTudz>s zM#h6n=CNXWP?cx5(t{Q2MNa9h2zQ~~$1(H!Vj&@w;#_c-JUxXSCJ- z8b@T@yDRMv(fd)_Jzx)p;(i-H3iIU_JQMN|2nSP zGKtw61U`dx?5^F%C$xkwBM~c|RSb1-s&l$=MfRSYBF>Qz?!fZO4>$39yG5-UyBYE% zdP0Fl?8=39m#2qAyGzM|4_D-9q;1m+(SvU|_-S(AlWCa*FPqRQsr8`XuYrcnX*N|; z$L^`%eX!UC=R8sUdTU$y0#P8(JPptCk%K@E}{~=?7-<9Z{M24ngZba`qUNk<6 zbQ=yo7wOE>@0`7&h0`>~c&MC1ViK-yQg$Yb)~oTSG#2|AO?H{TYb-wD%P)mo?}J}e zZHE248!mVS?une?hy^XR`!dJ_>>h^1<2IXqrXH^d|GZdg-%b5&5uN_mUb=A(on)J& zPm0OUE~?^&M_vm){z_=Lh1!;_U!Pg&K8}{W2ZHmQNhrioik*v`d0>C?A??tgds3zS z-hV!^gp3QagYXF+*EB%i*E3bG<{zfzRn(2)Hx?{k>a$`T0mN3+pNgG2=nX^R?z^@G&JYBnQG}e}! zAHt6ZJ<}%|A3$fD1uHgwoH~zPNF@#alhyM^^S=Xl8+Gv&zNTD&bw(IX)NUan9y?uiC?}Z>+K_8ah!i4i9H%H>E3lzJ<$!FmmMoXro zm}+EQ&x@FU6wB`HQ(8^xY5xPm523CFF*DEENl%vE>|It;M%8nE4EkytM@uVHC2}O5 zjzbLaSM*?HPD?iTGK{2enUHTPROq#QMUOC|7c~^>v$UgMGs&6Kg+okiVdzj*62?a_ zQv0jhm*1D5KgQitO&SB=lVFg=qe_i8WJS!P3@#<1iC+NsFq~Qp?fVwxj@oI7W~CaN zW{u4GiV9P_BOfMS^nZ>E$sA#05)2nozt{9L)*T_<0qfEk>>;{)TCsHu!=J*|rnG-b zA4A(elfi;~n@b`V4VQpC6op75ew@c&D7WyFoS6>6EJ~9E;7=&a9y)KW-FM$i4DPyz z0AXq&k%#{tJf3NAzmMjA_p&b?1z11y@?HQ8a?0A{c{8R^sIdnTu1a|V)pi8Sp!Jr8}$Ti z(|qiS*mp5obiPF~?#Hwux^v}=nlTgd#>#3KlV-#ojArZtrY9( z4IDMQl6Le`^IBt*?N^fj)AFz1srE`ZQsAE&@#Cf)3`9Py8j%J2NG>O_i^#ADtNs&p zhth&qT>9qp{ANzmIHM((`tn&>n0)iws?lKe3-Zm|UwtKJ-lp!7=i=U~kx34mel>iB zO)$AUiJ8aWc?7x2hlqqOZphyoPq8Y#&HrLoaKeLQB4 zJIrSrdiIv&lAQLxgl^RHx)Tw|L(e4sHFE7mv_s*V9aNQ=(^?#6xm-xMcBCZf`xi1F zsbkCoN0|N>^-RTedy*B}Y*e+=<)m8Q>9(8kRvp2PqgFxLe?qE51&sd6=jY#w*6U&_ z&rmM~OaIhucLics`|MsaJ|eRN@&Cb(Mb7D$lh32?1pg(f!BKN@sBWx2JUiswkSpA* ztCO+Pb3(WB_8gPP7{V9L-l;I^3M#b5{KaK99Mb0Gs@yej*1aYF@;wleY z3{>5A^P(jnmpgjVIM#o?$QyImHR-27uSwHBg9IUe53Q$e0XeD!tA+#a9t2Y_hm`!H z&3*sp`YrHB?6bQW1)UqSe9~Z>y6G(+6ZB{N5PG zl)zT`YJzqIf`Q{bpBWpA+x#BC$G3C2c18yFoZyldwii)S9$inZT*%%u-O$?8Oq6C7 z+TJMLN#0j6>B5M1$_tJ5vp3?|1+;h__xb40ff0?&HHJ zlsFDUPk9EI;eC~}TF)?dBL!JFYN<#6Nb~e3AB%ZD@E??!DtTdh#c)a<91E|B`GFJW zB{!SIzr||pwqJZ5Rk-*gk!*$@THyE{S|~tjkUBH+Z3(rCiV+nPI(?q_ z3{WdJ+q;%y+emsi9KTh(jc~b1#B469D=C$>+p-uzgjJQN?>urrHOzgYF%}>^NupbT zLUeKBHX!q;-4>_+_Q6m-=`?)kcZLs~!S`1@2*Kli#`!p&<-v35PTNIlEy%t}+mIrR zcvf;Vy=@$u)9avijb|cAO`!@*H|K_h)n*&^C&eb?{x>dC>&EVo_xj^5~WAW94L}R^Ej- znjB{lddqpn3SZPzECg@cWW#n*ic@WPrQ$AUw8ZYhvM;M-sQ(DimxkJpOYwmKiTP@$ z0ypA{SHahnSNXjX&oH5g?=xU*(Bf$x;^cAexy<8}*iKHiJps+t7YsHviVxH+ zL0U2CPMf=~T2OPANNF1+qUYNxO0A++0z;PUVcO23H=yU>U~3i^t3Bb1hxMlWiv`D` zE4$*OJFLpG;*SghjkeOm{$^>dMc-u8*zKDe# zBPxD#m&BIYbXH@i31v3vR@-$rFbr1PRJ)CCG*UmSv}ogzgeu);bS%A50H2RKD|p9C zalzAC3R4W{w~R5o@KZ4Gb3ijbEDkAG%1z3QG@XrSFZZ_HFR8D*DY2Z996mF3VzZ>D zcNL9V*SKCmG+5TQIPqXAbE1fOG7&3ujlU(9IO5cZ>!=Z*Vo%+4P&tQ2s8bsZMG*Eo zd5&j~d2}9qWa1kP+e&3DJ0D#4Efuw!dbleo$`Gr2LaJYOJE%;`IYPh3bi`3f@5OoU zzYM&}1O78||FgLNEHCv}QzgaJL9CURCaV5f;y)b~k=i_OZ)nOIX(8=xSvzS(w?$R5 z^i0?5bcXGZj`rO9^i^Mk%iBH~=aggb z^)P3E>1Ey0t-*NL?usCgQ{h&rdy-SmsFmo^*2n-pGnC-L-x7b}~wa}cURJ3=> z?47*e^KGG%+@*4~Euc$t?Z-H|$&4AOM>n>@tQeI`WHas+iTe=UvmU+faIav+D$l*H zqc2O3Fv%@tDYM&XmIf&{uzE062f`Lo=L_O?+ge1`IrZm#rlpfSagy(S zG5{>ZzkA0*YUIhauY1N~sSehR45mk=YcvQ=cC)wxd95H9%QM;vk_Qq`X z2kQB>Ta%ezqS$FcJEqBMa2ucPkRI&4@43G)CgSfQV`{{hT7aXY$c1zixPT955V~aT zuDCiUU>aQ%2+smGvf9$0t7}BUbGS~jv^tHv_ zNmA&fm`Cn7%$bQh+J)ws!i_TfT(e|>am_0{@kdliHYcfj`qod@zfdg=ju|5=E@7RN zW<#Y@S4N|EkY^vYWR7GXF~|QmO@wQeaD2M=9FhwU3C2TRK=VeY6yg@HBJVdPREYn2 zqp^djdT_HqBWm1t05Z7Ph~B$o4K!E-1+GSe#;#^lmM{iQb>kX4D@|HXF6iRdQ;6s` zD)B4Sd|)qWF9U(8QCq@MD4k>2uQ>JJgAYC88FyMLiTQExRd<4n+fx1iAZFo2FEM+X zE^<6g7dgY8ri&2r!)CjVE0@x_1xD4FY# z9z}RL$Ue5+g$CIo^35JgEvCdTb0Zd`D6gJsj!;rI?t~K;+8V0qk0mP%eH^Vj7Uh7| zP&Nzo9^R5pd}^exp_d+c$R!{=i%_K8ROL)YU|4S2=ZudN_0D0FsOwv}76)hexbnm> z2jMNPzVzA~rDaM^MwLtoW8~*!Q=Ajp0aZN8qX+hnoDnkOX5Mg+hqnkkv_1%a@07V$ zIyZp7f{&OZ}r}8Xayk7w90Md>j}Dk#B@2LNgqK4y~@(``P1@ zjNd&^$G*Q1_kY5OHR-S2t&!&#wkNFzOS^GJ_dbPgxBEZNVrbh4M^i-cJEeEZpwjLdqSAaw_a+`jMw#{&w|*iwL|PJv+&%XpbG& zGm~znqt{c1|G<5{HF&ASE+=w>EZ*+{p3#M5yaQ?J`=4ki3Qw8jjC4lohxq((afpcq zuBgr;$QjORWG`?mA)$5jc==}0vvEDHyXTylZSKDI&966AWz1_os4SyPL*mSItKPJG zlQoS0%tW4Kl5c#q=>#X5tOXh0uK|wFW3Qi1OC^3#a*ye_2l0b86bX|j3g(NN8~1Q6 zKkrctXNZ;UjL!ZQDgrFM=I}B_vp9xh;%tj!lP%#V$Fox{A1W69plW1Py}7EL?2jMB zifpJxN=LSwCl&~vE%!d-poiYf)jWYmcR^?nz_E2oQGA-FogghCSsLBeFajiHyw&U{Q z@TZk6A4tCv+NF&ZeH{?kd4PqDKpNqH^Jp4t76@iGiIEeXm5hzZmbZ=*eWZm?l;0j# zT)Qi>YNqsilUivyur&GFrM>0coP2P*1iSsmw|&eLDya#}i}Il|NL2C@0Zh{~;IPNp``R2B{`WES}* zi127*)ATG5rqB;n*moYE*cos6QQYHhIW6wtXO*=zSWj5+qq}VAfSbR* zEkZ1-yV)?mYFky@xv)Zfm3(LEb}*vTY%?!Bmn)`M?^Geg#g$mw&C z(@;LDSkTywJQ%N0!?Jcp*65)6?&u zW@;M6C^NlBDj6;`@Edc77dqFA^xwUVlFf4J418ndRPQuVtz?yJCL!ca7DY8R`&AYi8 zv2$g`tXrYEmHk`SBbv`aV0R^BiH8?9hvOg!fOqzF&tu4Q_jis9j2^tWJ%kp5l{{po zp_TF5=yhVIqp3>h1GC6n}3zZK7cmlPquc4P3#8#*z2$bwh>%c}Q;%|WLR z6)gvnKX?4V7y!|u=7{7FXo+r1YMgh~5nqM`zKn~QK0Jz!G`tW8{UxkdEBg~4Ken>8 z2BlWs|M2~qiMml3KYyp_<25yp{ICB(z!82hBF~7P^S}PHP2cm%_Y65{kGl1zzjyHkBR*t+2#__igorNSq?iakG zkKUmJT_EwO#UuHo`$Uhxzh$GYI~Y#ArwEyo&{bFOxLp%1>k3CjtM^lQ=C3-K2RN;| zAA^3)%4|&p$lewdcjfL1&C}mX9C38twZ^sacgFN7>B;Bs#`(^9AQ%ze zYdqKn{yt{`(Om}8YDf$VIofa{qEy={LG6H3LR@bQm8cma7|>^ImnNdR8`<{A^W?7B zpBDG)dfT^SyH2H$TB2&svDrwQKF1Na(A(}|ehnHKOIl4Jb6()ljcau;12dF7p9~__ zH;6V8K?vuU4v&1|9SEncFIm2Z^Q~F5pHBYi@~s&!YNZv41s}~~62(l{BN)=_ygOqd zbM$vzyyMsX82B|c|9|h9k2V6C&toG#Tn}vsV*6s*LmaF0m`yce7Y&=KjwT5V!s~#^ zMRY}|7S=Q$CT|plPBlJ<6IV!FBQ}!Cj1O=Io-BWg$Avvj0fjGk|p&TdHJUR#I(UK_SKFm-`IGv`B3@JzZd46!G`Px(Z$!s#UXhK}RxVxGo ziK_hc^%zPL>AVXmo})+&2eH=))*8{nlECXnY#Je~O@zjB;rlg3{GnRfy8X!gw_Uws z^{x=tx!oS#!9lJ6u$iOmXmD^92+@&HHwCQ#?8AgclvK;`*&sM$^Zv|52ck9Z<|eOpVjBVh=`-E zIhcF&d!LQdt)ddH)2F(gLMO}^PqyP z3t}E%|MU@e-KHBdx|KocKpC(NoFDP`dcy0w+RYR`WnX)qf6a~B%@fa%LP;x4>RCMJ zAPwuy3%Yh(mI*L9+XF$jEk+R9rRI&MIwxZPmVr*UJz1|6ilq%-I`Ollqmg`m-R?9G zn?ki{z$iEDFHtyWGv9DWdIgPO)d<9f6k3h6ak7Q6WT^D)m6t3ir#gg0Rld5C-+DbL zx1@gMvawh0Po5jXmzTd?6Qns7)%flP>bKSeF~eq>=qEzM#KRgV3XXlWOL|)bMu#Kg z3GkZCi>iR1v-i;ebU80i^z_vAcWfkYkI)67VVsfPs|NbEDMPK!K4GM8I{J|Rm#8zOU#t-B{&@F>g3IY<9DedA$)iLSU26lJ+7t z*M3I&A1LF@z0yN&yR@B@_0WPmO`!V_g zsYkm~jE9Wt_cI53s|`<0@9dr9^tjvaWM*94#g~@?!fCrC7)u z@~zWIziEHZhL?W#2c*A&_Mpe>rh^C4i(#Wn^Ofg{M8}i*sWj1im<2N!P{6>>rj3lTtCWdOWh{{?lVM7Rz z+h4)()*)NjQzLq^_8`gmoP#gozalBZSCC#tPYiB~(r3u5qu1A^mb>29t=J_g(@2B9 zXzwu3Pzt}JOxr#%aZLoP_=(#Hz>tQxRnux)#AlI@`@1XA4-ugDp{*v!FuCj?7J>*hMlVM5^Hz(c z%f!!Z7CZ}|EbIVMqn%FdJ#tU>SW)wp4M8gtoCU0$lH{6V-KefKtRuzxRK}GRB=#4IA`1f|vt1*^xK`sM2;FpcpAH-m- z6ZHzD$yq1s(F0Q5{xa&0`g;tkb=dcj+^pKe?=QSiM571JcA>e$9DZmHJCl<;#puC_ zO$;N!h)OeuRIcQxi6shL*<{2i41KBinRABM33)F+KugA>S<+g%pa8LGZu5z?;FXwL&hD7ETP68rlGEyZcOpKiRE!(Td;)7Yy-9RhcU)~)gjXHQCa+WR?JaEj4=+O z#_9kk?qBg058Q<{T1h%EFzk4JnP)${TcG18M)va<#m}|nu9LAo?6w^wmyg6-r56I_ zog*|$a?Xo?^#5AO5u(3&Xb9R*fiud$pHSeE82CpEhhr+LUgkf|W>faJI9gN;K9!QB zLa|+LvqDZZHHImeGD4(W&mqVe+4gT}vh5XXbu64mkLpP60pe2_7oq)y$BGb7apoAd zGP3ffS17)XdyC7@8$z0poau~Y<*7-A$eiY5p@4GYH&MMK?35NYGA&Frs`21zjp1nObNiV@e@Qs}5#`kfif0Jk7 zhQVGvw{~~n{^_)UbV;wg-1#i>7yXs7Bf3a!)fns_;k(xZ@UwaKnAE>=tyfpx&r1Ct zt8adR*n1>~0=&rG1TPZ3ABPkrj3F6qI0RPkekVk}6Ye~OSp{161}B(jkk|>X`fu*n zfZ2Nd=(>TM)2`SEph+p6tPwrdVPLJ;v05z$MeB8HmcdAqT z$>&#M067TlHY>PIH12khKIa1WC&4r9JJilo9&X<;QeAIbN_!|YN3Q|#wBH9QW`W;Y zo!H2Z`@H9D>RG?H*Joqxd~czrhzv+v|L1&+CB~;nysnDySCT*QD&lqL zJ4_HKzbvH=-mhPlRb)k&gG!JDhhoX-w{|4_VHxI3nFfmHk zE0v6y&dp@_@fDG;hv$~(io^L}sY&`0kC13R?>XK89aLY)M*qDY(~BZD-XljL=LXVt zUXMb-Y|76|Vwndf+Dc>0retSQ<s7+y6Yf#D5ZKNigltFQ`n7~3~8K#oYFQmGG zg$b!o*xJ=NhV8%pO(l=7foX_k_SqCwWG{(tY-#{;Zc+n)7{zXaUr+KG9tZD9kuxdF z!xc7xygVD?0Pr!NQ>`WwTV>Uvw2om^&p|FVFoJtG18o_DoXwY);rDp0EJlfXM?PPp zZtda;>}>zF#|0(KrcxR64#tVzzeIj}_KQ1F@KD83bNaOSitM^i6y-Wc>&@I)G@lAT z_IRvIQ4zkpQm$l%BAhb~)STS1uxSP}bhj1J`b!=;b;K*DVu|jynX2pTx9gEj2}}rY zjU?eUB$t`n;}GQ-)qIoqeG1W6>n_f(08TYVnD9}^jOjx|BDFC=mO5=SQGVF#sNEEg zP@G5U`Lt;d+i(AjM@hYWuQG6-Zdz($lm8pyeNI5O>=Mtq)*d8$9OleaWBA$Qbs6*@ zd-)TiLM#Wu$B%t|tZh;FrJ7IZ>;KMLTJ{VbCyFz0=SGR{Jwazu)?Aw=Nwf_+IGOGS z2h8zkFR#x86VlZ@C2q4IkucgmS+xcR9A-B)#k!zX2I-o zeh~xpN)>`}X-XM_j$7wbuZU!^>_h=;ZnFe>NrcZPPtyewhxXVH(3i+HTxn2-sW@D$ zpK@3(59M1#o2}D3TNU}uLnzcbH*Ho~4LzBEM8%(PAtqZQSu5@_0pg8xH#&!VS;~bO zIL7uv=-@~4Ry}xX=O$sVljZVcs;slu)ZCjehe^rn6hm3cp%y} z_fDwAe3jHzeonby8K0PgOZCTucgz!h3_qt?@B?g1*7LwlTN9`%WBPvcLY@F;7t4w%;vnm@bbkdoAyPJ8ch zs}!Nb$XxOYrK6eCOLUPekrtYXx-}*eO`DV7U&N2i63xn_mU0RSzxC2~D&aBy(vl}X z4Va1lWm_nd6Ldkbzy8u|jX2u<5Q?djzw6!@wUa4MiS5M^e5o;^q_elR`0Z!r>$$JJ z-ztCw`-*3IYxUL5Wt}FI`9ejKt zkUE*CjYLMJrIVgWgl;5+ZgOLFmZvAU$Lg9J=Ws6RWGVbT2&1!o1&63hM$0|96Ik)h z4b-J~nH2v0)TM{?H81KCT2&?)n;ggx9F_rI~V}G-+r!E=TzBL;e z#wFgYewtx_pTShHee0fJf9u)0+9>;;N3C3=BXsr@vAMd_Y6#5`J#ZoT4=s7}@T=Qa zmha^70aNOrt}-l2;_eF<-+YBR%=TXUmM(0r+QI$bl&@FP8Miwfo7An#g{_Qk=JtHP z8pTce>m3e}jkB1eUeBXI&0c*do$xp^??wKLD&LyzCVl{NttQ}WN9r5NwGRYvt?&H( z9KiYWUX#9cq5lsmAi7(BS}J*t(A3e6#3CfSj&`Z~I5)(*0g0exwS6;%VOrMOIn&|L z>fHAYuXf%yJV{n%JvY>mM=uYRZVB14j?M_}9r#Twy`5w@_s10D#C34$!)@(b`%I#H zk^1>50oW8?dYwgRgZL~LHv3Pno?c!!Pb3$Rto>WYBBW9&IX0mGp~y`WQ^{|zBrm@d z#qjU39h=VbmkLTM`H>9II?bY=#j;iWpPVRxF2%#n<9N>hD5>O@mZ}V2pZW*0C%Up`*BENinY6mB(-WB4`R-B@x#l@q zhIu!{l6Jwvq*;Nw1flHhC5haGu9qJ@^W0>5PstcM@$(RG+;MU`ln7EA5d~xL7t~Su zpGAZ5LGCT?uGNvTDe$EH+tsSkUOD+ORqm0Ry5@Zd5*!XHVAXwqwiUAI{ zm8BF9y!-S|RBm(K98_g;Z0SlGpo!~6%zQX_&vCtUonfBpKL(TU8sk*|9d}+nkwN$b znM10{e|m$B-urBSt*&LNmH2l!;#|5p_{ZAOwOsLXD$A(&d32rWXO$%0RGe&l!o{sW z5r=dHv8g|{-KIc_r_^{EMYbq1Sw9mU?hGBNN~fmE!uy4GSbpO6-tC+TM9?TgYm4!m z#rnXC;S$wP$4T5tO#F6x2lA}R)BG$I+sNY z3upy-H3&@|=t^}ecBTogOoT(?{5a-9gfosYPiJTIf>6Ul_AyOI>@1SAoNV&As}$=+ zMvLW_kKW0PBl}pf+c>h1uEVCxMkBp`G(oG{L+5c4-dm{JW^ddvZa#I=rk#_XMi%23$9EZjC4HZvLz_Cz@ShDUOe5}i9I&wY;ZDgB@sEIu4ABh4oIX`?wm}!Q(#YpY3Dw@w4DdntH_mtdA zW$!O^jBY?aosG%}r}$z(VkI(sNxgzfbmp8`TLB21qscGmy!FPlJO4p$-W2bAT=eZC z-5mC9YW*Q~Ty#}ftt&F62(RDcG-0I-6^_=0LCqmDS9hAp8r?khtz)s`FhNp2XJq=^o ze_+jTi9+U(Qf#X66E30noMl|pjLEei%)}L9Y`}Ac`jvD!XBJ%mFg~vg&}Cw6h<$RO z|Hm0|9%75v?!0FvD#91@=$vp9m|q&ixhemZGqFi_R;Wtqi>wT&Ecop+8fT zTqy+3J@2}ttTq>f<(a%OJ798XVx3&3>C8oa_O$1Oei-Ti5Mmm{YJ{8dU%u!i@T2RY-!TdCU5 zgC@NF^qN`6^Qd`Ozu0(eoaj`;M;+#lx1uUG1V4Z9@X|)bMA~t7=sss*TX~vMym|HV zwGsN$Ywr>j#<<~|9O1LIy7N=~@3Z;*2#>kb-zgG)Io?VD(vH7oBQsvl+{TOzy3jf; z(mi60U$ec}83T2cj&mj&X$$qUD!~}`tI2J*tXPur(+jG^CAM47FyUhzE9s)qS#!+) zS|eg^;tb8l+`V$Z5Qr|ml#Fj6EyFg&ihgCe>qJH~$Ape#t*6XreIhDb63SPD{ZUH+ z<9984d2AE3l`|Fcn}+1=|Y{9Zrr^6d%Vn zbZaXPFk=X?VAgVIl#abNnPfrV#sE4}PCL~3R&5;OZ zDOJekyP;H-$(HG6Q`NLQix%Gvx_*wF8(<3(9z|-2$ucQk7FC$PzZ5Gzlb_=e!E+aj z+D#E92DRWT`T#mPh%46_XA*9mxat7m*6b4m zllNznr2NrV#<&ChXCBvRa)>RGTW)1k=fe1lOlmPa<3^JN=)`K=-^Vus;Wfo%{=gj~ zHX->ULj#%QD5!;dDmh#XUTC~o|TNQN^ZZ}a0Iv%5bJI|xN;w)m@Bi$JblUO`z_c`--#p9Q^8 z$=uQu!wb*L?8vo=1*$C?YrniPR{!>%jQ|yHwa9B-L+Sd^9X^^$o;8g;i(o4HiSg&%--Ey0<^S9s z9LYVL`Pl0nIG@L&*!O}I#JmAjgH zvvgvaE4NWI4;h#w^DfW57<`0e-kn52b{2aaegp4V0*Zx<qMbbUd zvc;n{HlDb=4pEwnzD!`ki^obEyIdQnt*H|#9;wJr+)T&4_lvO4u{|`AK?j~)YpIK@ zTHNy;WtEke2Cd8IX^`{li64+&?poL-)<~IMMwthWecJcCSoU^Zuhm8mn+BRrY?|Vf zmRYl}W>b=Meec|JijoxbU{i*3mRqV(>o;H8KAxU&!2x8U<~b8xi`#_&dqNM91;pQj z8crfZTO2B6b)E54JzK^QH%jVHl*ZheIIJzY=2B2?9y@GRPkqT7S65Y)=i$@ z&Qb*-6RD%TrN(o-LOt#~P@7%`{~b@6EClqB{akM}7NV?pKV!*I^LKW#{Wr$HegYr0 zzVw9HKv9zNp^I$Q%8AS}ab@xkbGM^&;GSMsEepQcw)!L1@o^eE6MTFv2_<`L-$$?= z$heVI29vA0yiZb?Q781CBB=M&adn>JGc>!cr=&W%>wn@s~8;`=Ti_EzROp~;&S-S5b zQU}JYF*0GXOqk@_B91KxohHNKPc~ z+fmfo*48!{E?AyV;`GmKGV(*iF1)z+LAsIctEcjA0tN3eZtk?Mx%W`@ zH;1Wuy851Ss+!8{-@0UtQ#81m6;Z%>_xSBdjv~n;TV^TZ39;YiAqcR!qt4xz zTVMJitPzI!?8Bq{ux3lL07GggFAZ;L3WunL#-k0G4U{kkBWEW_F8PmM-n zxO(-mdz@qRsq|+?@#ph7t(*_yKE1%3O^LO1T+bNe@hw#1wGXKbZtj_}>>C_)B=^Qk zGWJgGNm@-HV;j-!(o%_TN9Z;XANXI`Ek0kkK3j+Xq^}$&y`lI0Led8 za?Sv$WP0Jq?>Mf8nfX#MpQGiXK}`}H2`{`yKWa(at0szBkEfu7$FuRM=FWqn8*a|& z54rF5XBeN!qpI@gH@BvI*RnB={RJ?+r9}VwFC6J2wD}Hdz)2l*I|_*s$nB651abb`bP&SD8J-N)0{6Hr$h%~F z+b7V67ain*kw*?uYSNMKG_PKZ5c>;&ghML54?f~c&b zl6flY+gVP9LrvKo!HFmOTh9FA;8X*#(wW3QgGAah@kY8(%nT_|4*yT%5-?y--8}dY z$+;&yXgNqeO(NRN-nw;bLBBvm(pex>69kA5LKSIWD?PAg*W1*{LZ?>Mc!vcVADXGGKRb8wZV&I zWwwU8kMuV#) zUSA=8JuEml*wNSY;u2Z40I}`pE=#zzJJOi}m#5e{UXN-AMsA_HE#YXB5iPR`aw0wx*2X;0BV ztE8eHdxOw?J9J{h3<@isF!KK}Q`yB9CCNwZG;b~rM}fgpp(^k{T7A`1-*zjPza zfJPu+3SIqlR@Fq9Z=<|@tvqYP;{XQHKK5<2Mpj!R&%c;kuld5G;(UD>2~b}Se@w4z&IODR_vd_)ocLE{tM{6k|Haz*E04X`?0u=&|KN}Z zX9amUM6V+{!;{d(1d$buO-+&rco!@d>305={_9Vm>n5_nwruvaGO(>Is95@nNhFs@ zCGF@g=@P#SjVHIBbeg>LGb_y<{u6hc=p;$_QUws3_R?HcVy^!>iT9d)A1w6Wv9)+a zpEyAB`GNqRWgfHwYJeI(KG-OQ@@~Rgwah+*WM#2&bq``AO>`c4pjNID7=a&3`l0Cv$a^i~Og9k({vF zSx)5I@}x_JmJ|EOA$*gcz>F5VCb*_q1O)1K9aG8qc6->d&UPJj=BnDv=Qi-|eOL2E zM@>R=2=`>)kjy=)R)RE3zQu4cWG-8GS;nJ0b+hpE%5%Y+v|Q7*x+Qag;id}ps@~@(VDX2;x8oFXZ(+q&k zmak{@ds7me7pDJmt+&;A{_wT4$wypg7q|-@mhENdl8^Kq3XYK23i6zPW8X*SnNQZ# z<Pz(OZiG$hGjEu~dRP>F>ED^_S3B4>Z9404xh9)I+ITTPLd$U#x@ui?XgHEA&N~ zSm9PQ>TZMSeEi98vMO8XSG3t(#gWKJooC;JKm}7yuPhD?>zn9IHn#Hq5+C=_I@XrR zN}mxI(Ho7lxw_T!9;)B991PBAYWwoDprBunLX=3_D~S!G)#CWN{OOuuiCfgrW=TfW ztnrEqwe}H+qv98spaPU=y`+PV>p4p!dl%YfU0z3LNdX39w>6;HUcqEZE3*LBW*QP7 zb*Yqi%Ov4r7{KKQ+O^>G-Rj=o)Y8NbnU zE-)2p6ZHg-FR8ZbLi*sh;9k)4d;0zZc;y>ny$S!_BxaFJsPW0vw7-xuR~wMt^0fX_ zayE3Ez~e)#R%@F%QLjf0Xa+lh`$FDu%TzZG+1X9=G(-Z%-&;&j4 zglZfP?bT~h!;v_(IpVcks<3>sESTSFY7yz$Fvd&#*adg4;BAzpZRl5;NW zwg{rDY}^6!wXZYouDm^j(o!XzVBNOz=+xFp?EV^S;;rc_*f?`x7-)I$IaPBlLyEGb z3VFx{n%7UAi3*z)`t&a1C->NwRV0@&!D_t%%z4d>VQS!a=kM>@s#*C#`@1gc`0(+W zwrW|gvH@=ZEEVFi+eIz9vHE*owhgs9RIBVaQE@S|{C=2KaH^FiIu|o%;+;ehUt;`| zzd_ilwl>OFhgzdfs`;zsNTGi=Hv!>zEX}(?YfK1_eXXA#wQ`E9+=wE)7~q!@lF) ze5+M&{lUQwmCDdamH5fLyf7epVhQv&LcfHzc-*$OxVo@U#h{Tk*~V-NX>=ckhT|Nn zf6S^4a`Z2zF4UyZCc%UX^*M*A@kzF?4zbhm=s?}>h)`F`>+QYW<7LyD-4at_BKrWh zt$3urls68^6N~6(OK7iY94Zk+Wi|)j3WR)o2-Avyppp6ntHLU!i_mWQ++8n0v zCh5`Z&UpR9Yo!|oUP<1z?{=@-q!|05PHa=i4L?NXjPk?~z(fBH&^=z!2d3*=>iEy1 zl+a`{3?Zpn@WiM5{gu!TUts6g{ERTpuI9%Z;fm8c+J0_UG@q-Owcv{7sV(yxZ3o?N z?^)1T6W+Ka%+w_Pncc7y!7g8peXVxU-%k0>-~JAooef`W6wU;Rk=6s#8hDzyC`6XH z^U(hXTo?UVh^Mh#v!OzzRcc=EmI;zcjV0Jj(R{`7b@0^gxHf?ybl4 zJdcA!rH&wr0|K~?--qlGg23hA*D(eKblD7%#QA_RG@Uvii_!Dn(9<7I?b^R%xr#3- z4}MLB9ys~DZ@LmuQQH)a!e|0U;G4^nW&Rtp-u2!W@cfY%b8#{@%k2r0b_uNPxobV>|oj^R0q%t=4boSR% z3X#J^Zwxua28+8+($hMEHN#^J8!x4FeM9Y++Fc?1$RUYc1^<<{e^4x6P%HN=%70- zlf0>MJ@p7TtS=S=YSXZ-~`Dv;-S*Rkf+0I;0AWAx;Ok~n1`Yx3ww ztki>3$KzVcVJoQI(M)Zmsx0L2Cv6C1=vU{M|5Z&-40&Pe>n&82eJ*FkRv!;f%M4`hzO^QCVqzx+G7m4!&I)ARd^AgN zVf>{(?{jp2;W>L>3t&%u&k6iIAcz*;vunN(-)dLddFmDFS^;(aZe^Y6PPzdZ+6=4+_@hoE6WytabNbZc_8Sk36VqM zZK>mQZ_m@s@$QGmUJ7hK()PX z^d9Xyi+AqnSN*q_{(R%`>zW)w7v8a>H+M6SW0jQ+uI%gRHJvuegl<_`cF9#nXg=+D zgpcGOy?8XGHYHd#TRf8TV>t4VBsDo*GZtzRhCSk+hmH~QH@pc((S!fX=)Jaf*I&8T zTXT`oNgOxeLqrG*@%RATh@{q#`0e+S^Ghj%mGm@s)mZCwsaW5iX}7JZr(Z2EdT_%Z zbHh1emEBA$O2uUYSF!rd;7?upjh|TuGBXd+3;zA;hK?fpywdXklYmTHC0EF{Rg@7=C;o8 z!@+cP@oWjC3TmHPbK;HpPfubuCfIEHC#l|CtVHyfN6x*MONF8eF!03@|I3W`lU@esL;Pw zAsXW5#%>LJUw9w2Izwb|nZA2OKgX5-Bxk`QbYZy6IT-J}+l_erQbJ>>`y(_)V*<3~ zE@xu3;Dwd+5i{$!$XTjvFBNURJ+xx&uJwj-&ty8|Dqq!q!}#rea*%RZ>#*ysaN0N;oW z%Ti)LRj(*Z7OayxDv`YM?qp{S`TYJRFF8fMWXxXP^=06)GcBOHcj){ClV;ZDV(c%k zj0wt^7Aih6J#<`Ky!5Bmc-I<%i?{dF40g|HUS#NZ3>9(JfY5oyhg4z}`_VY+$2@Uq z6#x9qfv|;|vd7jkhQ6ytz9l$z!MraY;I$J4D0J|V?RW; ze^i_0tz)8go5Z1M2;=>mBVGxQwvX=+`bXqHG1-?CO!-U9pZ-)5mx4`Ii`3Z^(Jpf-0IQRt;pK0mOuykrOJo8g+@PS@1cJ z78mm9!gVU*Bl7qKPu9+S6!#`;5sCFY3zP9`5x4N4GNyBlh`nOIkzw3;`#385G{9&F z+Le~zwxfl}>X3(vsoPPaTM_K&Ss@MFi7VSBktDMYrq)^f*2qslx4T1Ux(DV4$_qzu zY6H}9J`S9oYjteEc$c-h69FjRK0P6jv3dGrqV|Ve!{aFu4@aJk#NPI-j?`aefU_}3 zpHHy~lJ&b*mWa1aWhqzBp_iSLx)OpNu0{i(W#AKUMhkk+Yl<}mxw4w!EawZpb05(7 zQ5#8kXw6IaB2JPQl$*d_L7*X_NHn;a;^#QR=4)L&PflX1m-d{CoWgQlJ*QIG57X$} zlHm#LI?`!Sq85n{^QkN}yt{5Tavc3DPVy)*Dw?Fe80=rc*bOLG)4KQtwSwGJ;%SZ&pcHnyd8LWBCW4n-3N#R&phOI0Kg9BKuA_c}@J z^L*bwiQjeo>U9jnp0n3kd+jycYwfis4$KTGk$-#ZXl?VLaJNEJgj4gNQ9k&*+RV&K z)K!RU%YAp&bgq~CY6V}i;+`V)fHsACgiGh#wh+d1fXkc%-amRfPU=H7XcoP4l=j*a z)*fQJyKS9+?yLa&)>iS(sc+i5hND&X^sTb&Nk}LM@0b*oag0IE@8ExMW!Bl+vz>p) zn6J)hs&(<{62n%Tnl|mFSH%t{+WFXv&;TH@orL73xWAGlXrBfBpwgDwVa7eoXkYwjoF98{Tl%503ml zHtgtY=#!oH_vtPE*8Vs?`snNEM|*VL>*z=GJ<*!i=!t9>uPrzGPJ`Daj z{uZ(|uhwyYTEm3Z*>RkxWgSN!bxX5%O}>_0)dY{SdmPmc)NRL7S>Bzznq;EyWvW3Y9s3Wiypg-u2Ei1k+RPl z?*DRal~m^#w);vjn*FNOU7TbgmGgAkQn7(iz2PL2DTjT+INdINb3vu}Ks8V_Z?wI*!M-#K`MK10;%Ex)SK;!6JLQ~d9AO-+JL>x~ zqo|NKPT0xR*4~102X%!JosB!#n5(t%INnBG(cD^JTZdFNs+3KESmV-8{m*#%5BzS$ zngL6@^z0GhRit$JT-{r+dd7i*1!GpU7TPK#%k^9p9cD$F6%Oa(mg$HcKd+G;rDe#r~IC*Sj%wZ^Xrx=*No|n;s68GM^{Z?&zlLEZ3a# zcT=CcTRbZ=RP(I4x{%ptlIxEJs+&W%e9nYFt;x*KN<211x3Qn@7p{%8xuzF&tHdv% za1lREmS3N2a^27>8Yqa3Zyw6tKc!)bm4ngSW+ zSEmeWZQ|`pIsh?rv&~6odt~cn#COtYK?{ zHR@iUH zqBRe~Y-gHf9J}yo4l{jTe1P~Y6v`(kL)0?ernp+?K;2CMpsUeBx}u_PK08Z!#<|MF z82Y#T@)|c32Gz2@?wY%IrH5C}2!4jmmq?9_+{3$Vkd~;*#0DqR_$~#GbncWz26j;& zIPyn_*e;^hwf(IYtae+Ye#X6mDl#f(J2nl0qCUto zEQO2eaZdxzyAk;MVFPChwq&!xol9MHEmF-qO_Z_6LnQnxSn|%RJ#HeQ;fStTJo#lN zvO4LTGj;w?8ixbF-YsMYCNB~`JmAUH-KnWtsuxe@x@`nycw$paSw8mHp_Nofu$zCA zvmS4zS1y?WWcl=~vzIB~;*RUhQ#MbJHOBvjY)AsGc-vK#RWJNNwui<31TK3VbUNU*TA49267@KKk)uuL98L$2OHea*5Qn#@)f+PvY)4_c3}*H1^RQ zoYbZ?%&dB>Fx=($G>W`ly0yqxjC0v6a=bJ!pMBeG6Lz{Apbz?n^Pe{HoBGs9je!}p zrKlF39br@&YU*ly8y|=lQ-7|VU8-)QKmzp>qMbV33=cyb9h{+OsHb@Dj6$dOP(hps z$)aJ93)I^koxTctb07i2&XK9TQrku)8^zDwQ(ta;6zts7II^^L2WyrV6gphjJ1MT~ zJxAuM)x#6Iu%5zBqwmF%X3<8F_Y9pCuX1tGs(_nz^X=;`Xl!dA--`EUMcY2k zSXu}7qW4?#oql(*0AjJj#u!*us|6^NIe#Nj&;^Nxe`6~2&AGukd(ILg)KtM zL`s~B&<#;vr{{TQoAUdri`z~dK33aHZAvY3>C3A^r7d2dmVdp88OL+(@+r~mC95skZ;U1|Bux`^KDt~H+vuJ4tlP1uv7tU!fuPSKze4_*vuqykmdXVnPZNU%WfdLJ#c_WAcbu^u zuu$G=s0s^f(h2Z?R5jM?pKB)kq>gtoeewLuf#J8cBeb_Wy}~?qy$1ans+F;o#~dEf z8m%Im!TLrS`)Iy;8eklx);F&@b>|i%3-xP8Q=HTeYFKLiC9H5(_=Cz$e;9+4)sdk~ z)l0md`>JaS3b(B{F}ETn=Dk1K-_KJyK4u6^aTXBwxII364AZ)O;co(e~z8`k7vsV(0k~;@Hv72U= zb^s3c3m28u*4F7CkJ31Gj%$m{FE2Dq(V2X28wp+hY?!>;pnxPGd@36|#E z%y#KJ@gVcG%!5h3ixl-$=2^Q}M(trYU6ijW)FjJk+Rfa0RHpYDDx${MUhk$lHP%;#n%K6x=R9uE>e--tZBOT;p|NN`$*>h{9@ipv>#(qCNT4RsR zu+nCaELiSIu;(7=4vJrjXumFV=A1l3ARfL%n2-uIfrAOFV;|F{6&5+CA(JKA*Nh+J$;Pvyi0QIW;WsUg#FfKEf9K?2yyx#Bb=FUl8XxP8RBSUK3X5*4ETC;-pXPdhO)2F>GsXZEcu3 z4Cou0LN=jEmowmnUs%EbT`7(iUJ0O}G;# zx>Y++R2R>@do0jDMA4=yj$DBjpxRh6;kZ57ZY6AVVPH@X$*B&+c zX+mp!wTJ&^n$CxXN_Fjurn{AmE-i7%y7thHJ|&2jmvvrcx?8cx$)m+D(J0ndp^qd- zQ+4$Iv7}6>H@od&f_0t_Q!GRNUw|F{pG9tuR0r4|FIeuetKQPW^MwBg+o`d~S3}Q5 zs>$C^_O?s>$NY)H=EuYGQ(6qeWTIN*$enJ+TZ7xAI3M6)#cF|*XQh|_701e*AGch^ zu@-*XM)V_ac3EB@SiTz#?AUPD%HxD?;4iI(3wEppi|?O6x=tAOrl{<+K@X7E-P0(? z_Hy~v#s{S}e)&gTKJZ=jm;ZXFnYyeu>T7H2D*HFJv{pVe2}(OyPm`&p=84bhk?~E9 z+25^BdsNTFoMx`QWU~o3yik0EXd=JV8{%^h;?s~Vd?Rgu?(WS~?@Np_ku>rLfy~D* z?mK3O2UBs;MYfNrxNv@EQ`?}D5N$VkSji)8P)A(JNbT&B+uDfr?KK~2UC`zKrPlvx zsIF{bf&=w)B|DtG3UPuUEKF|5;)mDi-}t)LlL_-ZJh**d^T~)a2)@>Tm_`@8%Q(GmCh`%gyzwganAe;^fw?pnNa;SNYetLHK zikwZvnkRc8WJd8rYwB(}ALXO$fHro7A$eZgCW9Lr+tdufc^r=9`Qt{ku^#9%Pj%JN zGcK3+_F@4!Ce{>5`fAIp=juk|Y!};^U|oxM z>@e~Z5-^vQ(Ywa=2G4)zcrJ7t*IQd=*eZF5BjsaeW{g!@|esB0ZVP=SY-J!|G(;i&xSGbJ*W>m-Z z5r*)=eltXVOOePBvK^I6`Av>-AFXeXaACKl^>x|gvTwT2G8fYxZNsN8A~r;fFYo(2 zBHnYA+i({X&yN}CV!HlP^uBJRMOJWT4E01H912jmtt#JPD&dw5(HbAzM|$!uw*|%D>U&C8s4>{2(>Ht6nxyUsx zCUidpp4N!6Rjv;d_U$Fq`qgGTjuP@agy-t6guN7#+KHH~o`{}PciPe6F~$YGgbc|z zXaIlMJNayw%qY>88p;PQUB^u59I7+9s~zXxJy6!dc>48R{X|lD=`z)7T4j%F3~ikV z^F75!4!vvlJzRe=JI5*f3_Sqtyr-zbj-=9f+NT76`9>V&vU#!d8FarW8@_@U8z;Y5 z7Eb*|tF=aF9RE^X7;$BHW9d~dgHv-8v*Uoslzh%-$Ftj~#LLhhZ#?ttPH$`jIeZO& z6&dD;aESW21juY_ap6_)mkAqXh-a(YYjibDq1wNCGbP_KJ%{hd(J==VqpZ z>EOu$@zmACY5#2~clLYHT|GgkbgULNxUSNyiO#ruMab!;=fy`>gD!qtFWnSZ(Umhn z%8A#Ra;Fe^)C6;sgFFac3^yoZ+_p1GxCwq7)_!X8S3r7-myID z9&@v%OKgW15;9IQq4Q|!(@kfsB(%72fWPcZ9KH5=(|Cd2SDyEMS+6E%xlSQ>HO4j7 zH(#X&->ip_sm>QYP_xsMg_pk$V%G0uzReY+U48mH8~QoU7G^SQGoSF60{gP8gJKoY zZL6$t*iL11{0DL@q`S}+SfW>jl^s>QMLe1DU3Hzn>Bf>k^$#Dv7~1t$FQa77h(W=Q z3q#VGdGmuxuldUk%}j`4-=8H4<$Hek#iiMW5yvMA#_iyp?el6~7WaRReIQ5c?8c{~ zkKX$K=bi-n>k^`m{;sfnPIBqIrON1pM>Hq5IsGm06XH0nct<3M;&AY{;ViQ&00`}{ zi~Eo7ooo^v{p*{&r^=Ti*E_-Jk7SCN_1Q-D`3h6S^qK=3pY-=r*L}4)`sJ5$?Z6^- z;L=$3gWKJCzOG*__CHoyTOW>7(14A?uOhuq??$P9eFt*=gRY6(j4JhTr_MOT+GX#{ z3%`)7q5frJ&-mv4E-RMfgqJ20+^(|E(c;bJtG9j;*4EX8>zaLybYS_~_Ths5i$(j- z*W|vc(X*?T*rL}}*-5tZ&f?!|Xs;95W?$QHbx4PvgKrr_H8(;bl{@HT4M-)%#T&Ud z;?V)@v_Fl$G7LgryI6Dya_^AVn&j#)ZpGKe)-svTpZoXU;PlhRW@p!PyJM|uvj5x( zwi7ae!>OYOlFh)OhjB{{=vXic2J$K!H`yp(wIt)OdA#b;6SUH%2(~(S!m@K$7qE9S z^bdCo<@pXW#0!!;f7L!P*f6i6JucJ`%WDrb3}YtqH-F0q{!OMUqO5$2Y#?-en4^O)rT$!>fj4a#1VHT~Wd(qtUDHnp?cC2?6FI|1@Wk0nrE}XKB%;*bC zm+!4NvD;pFi&iH%9qspg*~iR_n8Nxmw*@esvkRg&oSor%ZE2p9NxZHtGJmY;f=ZoP zWSYZ2_Bq?C{ly)JESIfkLf(3%XQKz+3a~vBYVi>@@6e8P^1W@p)!{9NW#VD2#r00&8@Po1D;=A{U(#;rs!n=jZCey*l9n zW`2g_S3br5zvejl`kDVBMof8OGr2c^cRoO1(4@z|&-s<%i^}29gQ(nWL4f}o6 zGx6KbwM?zDTCa=nGKTFg*DXlYzO56?7~wQA{|e(YQ+>W%mo#x0J19(4v*S&}F}O~a zvoxM#A7>!sGP0+?e=2RGcPjC&UjFZjA0`TBHTg2tndf!tGMD7OmvuUYGyU__p_=LEp?`o}S_RF_$8425Hx6+1N>JvX&PbhuvV-{j0m|!QUsEbB>3pk2>KhYAi#a zgh;_Q*Zmh?^iV(h`a%!h;=fqWb&4+c%K0B&c2(DxT`6ng#cXKSn6L-C^zYk`c;Qf9 zY-LjwGu}g>bQ;e1`h42;6aV38XYVk~A&Y91cMj@B@7sy(F*S69-mp{O|A}6wij%KB zb7t16>Xm+>SF)>GypnhBavUyHMYN4<3os?$ee|r&8T*Crb~QD%TKu_hWeaTgb8Jx{2pwib?_Shi3SRK)<&VP9sgVw@g#S%*zxxjmwwaJS+FzP`amV zZ}}DRsdk^<>t(W=hguiOyc-X&VIf*?O&>TN%&yoCvrf<1SNVq14NXOZ?$}#$-`&o! z{)0q+=CdF1PBUCzo`zx->82oD2wR=@D8q%jO~PGro!;*;cCgmg9qALQc5?Hcsb>Z_ z{hVCO8_+Sp@B=emR@vIH@yON}{&L^KzD_jH~f4%WGK8DW>}6RY(Chc8vo7k>PB*w5a&Rt^-PUX%iwR-=>_(52sDAP8U z`*Qz~PDsk(IWKlvO{f-rZ{ZO%|RNC46VQu0x&@SX{J<_EeG$BbVa_ zWS348SbR|dpRp#9jv_7}1&6T~T|vMFq~UqhIeQXcM5~>YomWogRp)=T?`aJE(jBF% z^2`HSTep4s=Lg@93(oKSafJ0b-^R zj~_Amx*a?HUi4Sb_lpmwzSQf3Ke{w@3Ue5(aYs?RcJ70}Wb(^+UEN>^;FY&g^MQV^ z@0g!ilv-%W7K{?|;y%iWov9Oe7=|zh8XJ#axE;dI8x$W``@~iKLq)Gyhk|5G+~hVq z(y@b|5{_j&s_hLpte#=fy?jTM7kw=QoW(qQ)(e zGe2N&pBC31=_6_jYzyn~G5U54U7r$hIIyaVX<~B~`zX1uyj^N2Y1TKjY+&xJd&=J4 zwgd-hd`AweWlbJg9%TEPL{B`5=?3^CrgI!62=g({L{!&Qfy{|9+0b_FVXcn&U#2@w z^YuUe;{ZRMlh`P&!~bx-1M%+$W>J)1q0`oJ8&mv@OWOR5@9WO~BPadmCfZJiMNaI> z;r)yB3G5ivqd=28d$#*Qe2?&|-=FDI=HIA)>(<6;7>&TDT!E1)l{yZ-^%Ls?bHOuPbj9 zHaBbwm90-bbo%EutGFD@jXgmNr&ZWZ|?W)1)amOmvF0H=nE6T^Z%&cXrdt|#jy2;{j!@SOKC-gTC)O~_? zonT%+-1Di=%T=MX*iT+JOx(3O*5J+5_#JL9udVCcb&Q|7>v`?o7?-^n-)fKjg+oW$ z{ma_x%Nw*g&rJwjwAcQM^V69k?!<@Raq-fgJ;#GaL1?M)~8#*t$1bhOM~y zIBh|U+{g{x82pMO7TTwY?pF!f$8-G+3~)ite=DRjldw68*C7Bhn5<<&oF-~-H|blM zvc~d&Nqz>|-r97g%%p5S%a)k*?V%FwCezXOP*?3RlcKpiW@Cg)!zq2^K!}TrCEr|J zJg8ac>rO`jc_|jH&;9!WrP{xpFI6y&lz^l$+F9P znbJp(VqeHpn?tx##>XLlyJCw$V{OZ1RJ-Evl9m3x+Jg=HD-dZ1oI42}R;>B~wL|=P zHlFuezWj#HOZR;wI*S^fR^m`$fPP_3dHTkR$eV1%k|v>EAn)3&KX>a^jeCpLVV8W3N0H52$?C-g~e&&yILMm3WDKOpk%k6a4Ug zi#jdY5Pw#uMSr@kb)B4K+n;)<2gS-S;wOGYvk&vTN*)N#&hOl{g86);deOkbwzB|xiv**vyIM#$n}@U31jSK}CdGlO>$cx(k)`d?(`~2Ka?f}6)J$4@tKC%RM(2c1 zvz?t*dEagiW@?cSyZZN8=Aa)R^bt6{P-8bA2SlXU&BxcNGyLu~HNO;Thjpo}qocXYiim{;w_X!l!qcYBwFcKmX$yUG03vFbDWA zpJnu-_?w64AY5|T-OM_a}o6S0~#EFyC8`>Pqx7pnGj!zLquE zz@xf@INaOA+5U0q-gvs#j#_Xt-y3+-aPM2VmvE*l2q|1_AKo%|^$a~@1fGE-mAGfv zLB@Z*{}wz$>1sOx7QT0*_vh}lpYLxFzRW`ATzzaG*UY>6ZZzL~+)MrH2%EOuqF8aG z1|E(71>W0LYWw(Bd3$xQ?NIzHepBCoNf`GJvHj!Hy%TWnzshXC*D7z+Gh-$0rQYfk z!n)c12#dT;=|#_2g=bJsfSzFo84iAG|Ix!P)c<%2_Zp$^YVe$|pestU`#Mi)(#5G+ zc3dZb!X9FtI4r4E+M>`Z(m$CoI8a=un7ZxL527WEPvYE97mN)Qi}Xou?p09|g(z1t zIwv9jA#1XAuVE^!nG<&X;3J`#XL7k*u-fS%3ng`K`(CTZ{1y^UAmxe25J5}rI#m6jqA zi%Qd1ZCu}1%y_2lzkO;=kXWPqCgjY{ZutB;%>4O{?8xC^c-^$EM~kwhc-?gOpT`D) zus#a0qX&wegm||kb*3`)v+SSbpz9sX%a5S#W6)NM->J_C4l7{e0*tO5a`k;)Mf7Q} zil09TuhqHhW=TB_dCbUmZ-@7^f%TI?Am2kM4p#<>k)L;ScWad@waS%WteGCI&?r{) zK74AvE9*1mMsq{cb|UhdBH{Z61Xc!S zCWs}u38LJb3=o3Q(1w-X8uY_wPxigW>-{o$t^>b(G9M!1>LPLUQ^YI8m?wE;nhNv9%F=rr zm>wlzLuPx+PQD+cC`|mhz3%e+QqXs^<>ta5aiMbaqvi+ei1gW)>MxIzGU9=A4jw)9 zwuBLfB)RXOH$=kvDU_I;NzA(Pthjj2-bfl-W6%=Tm%0OCVHdKGkxeCC=Zg1!2haIEn z<$ty`cx5cw%P6Zeh0eku+JFFBxqJ^lfv+UcRjR@pPMr`4=}8}QeTY;{pFa-?6l)bp zX`{F$Aa0Si(4|aJB;@Aga0@tCn?W+djY;)@R8DCgb62K%W5tZ95kJK;?>|K4!EkLr zIf*S#!k6&H3Ri`g6^BWKr1t{Fj8Ej4sS~5<6^l0cN=F1aDr${q7 z^(J%^vJyNEVT+$yohmv%<%9-fkHvgbjoJasb?5A!u`Ztc;Djmq@J>R$JC73>ugEdr zsXQ?)R>E*Ub8=+Xme{kQRwVeJH=Jk(FF(d}w7Bx{KHamc2H+Trc)WlFnh@*FtuhdF zrq3OlLYx}oPI3bIm@<*b4p*w;B+8uT+#DkwfdAy`1fuaI(RdKoP+UZ#V|GZaOZS9C zeUDB;66-)e);CfrhN29kzr-xQ;kgR=6Vz`y^mW(^9M*7hbUy9J5eu0svvry|y281- z{QohE=IL_g>oOMTQWxqH7HK17Lb*)HpddBgc$2<%-18ds3vD0+D}k6*~Gsi}MFMkZuV+ zMKRVHT!-;q6k{F8X5|vztk4Y;GbS?LRaFq1nYywh_1U|_lIErOKe&2?eNW5dbT`if zQqZT8^vTpuJ`BR5n;mmJo7COPgB!n{4|S*7T9CJAU0?2p+=4ZI#n3!^K0CNN8VsMa zc~Lh==+u4}-j?#Pb~3Sc_~LG2p{r2nsMOYho=~kqHSEH-rxrjq$OcB@GYP!kl-;#X zsdbvczw=9U?XwQ-c*CC|+WKZPc`j10SRod6Q6wo9P+947$zF@Ki7PkektLT+^(Pm;;VI$pZ{Z3!z&>v4Q~kOHb>%J?XVts)YN)*X*`m<>OY ze1i+$mIQ&m)409^jk7@G{%pZOQ7k)f)Bi7QlYxpnqXwv_QnKkx$x zB!}pWwU{|sWYoW-ppP(dVi#^*&(ub7^aY=u0@`-tqV+fm^c80FKTpw?KH!a?Xkd5x zFilKNf0OSg9g~f|4pX!|PTCzYeXs>WXpC5iqi5Qxw@oUwV$O;Aaj;XfFP5x#WyK@6 z%C78iW4+T3$juJHoJ;zX??@Q$#Fa2l5>_5L`lH-QQiZ=bQkt8Z>kn@r0wg$KZsAjX zdz$8UFD~ocZpw~}zY|3Xk=T#)pZPBp{XI~Ae$%V#r57WF=5tM<0}8n`%7vR<9G)o zSwb1Fon5Z0eiM2bJs)@aXIcgF$fQ^aUzXVY7{muFve%(CLoi!e$MhFz+Pt%FgqLmWG88Jq*?>QQMU162`9*sO@$oCMI<$GjfTxPZ1Va8=>E z`Iy&D*;j?Nj`DIg^hR^F=*2sGbay>@ZLyB0GacSln~jGgP{N8slhUAb3!!`S76pl+ zgSQ@na=_>QQ#<-XC(k~yW}<}WIdxmMNeKm!H`A3bPyZNSiQ`&;U2+$ zI3y6i&IfA~K#LaFZhV))tplg8%C|GK*tMa4>@epWLq3}*dfC34x#Fd%=pC~(79AfVM%@mYn zPtp_=dZ?eWdm2l4|3zn?06)GwY3fLFa;C-{hb9A!15T2-L73kriGDluNn_y$OWssd?*L@<k?wlXPo^J^lrxUYcb9@oJ{glybE*JCGHu;uKQ4>EgsGfy&y;< zaU}oE73MHNED*KdA>%{kUK|RKCCl@~{Afty)K#k&V(G{d2mb;yA&*RqCz@bH z1H}jfTphs#iW#+e5fS$cXKBsO$GiO9#Eu5LbUgM70XQ@$$aBz?Jn(Uv;9WWE>gFIonPa4ONJaM$YlPlr80nd(Jud{yor_ zxN5#@ra?6&St9gG8Z3oB8W~1zb%GJDtwV}7Kn%b7{C?1P0@n=CM={gBY+jhk*sCd) zx#IolC*j{5ZO+~rQn2x?!70qpMgPX2DuLef;V{|F)qzG?eqI0bJv3*VdOFOq1W@q5 zps*Ewj^fxcnG=FkL@$;T?D}j(MzGu7=@)&!J57;u)=kr8^JmKgF815G8$&bIs{NgiuMjn7RR$_WkQIq4LJXDfPc*?M z!PoHqH^pH@(+zxQ#v%H}KWh&)hKg_*8rdfH#^;;RKIM<5Kkgmp@3_iNu}YvM2&z9W z%B@ubeKe;hd59X-mfmEAv}yY*F3)#mLRR?fy1ip4{jR@QhA(8Z`=8oA1d43M!9&~M zmNH(6(^loepTfc*htsky1|>lMUnuzZhoFn*dM#)hj=BDt^I<22Zb(j@#CYHTH=1|N z6t$@|`s+c3mBL@ynz6XvlxOnBp#jfDfiSRP>J{&C0SB@DQR22pN-Y2|I zm?B4^@>f93m=#_GN0axj6&9KrK+{%^rXJxWcd;nVvt9#?|6_JE$o(e}4~|AMMdWEK zH?Da*ki6K-hlsYGD{j`Dd0IT$ydo5O-%XJP(G&Q{~Qw_eFv3Sy-M#7g&nft-aJd*~XmVO_1iz{ZZ7sCEqN zaN^xwx4`%?Ccv!m)r_NYpq7ZQI`MW=ZotNOOuXWeqpEo>>PD9XbWf$R~a4 z4+I$jgz0$^3K4z=fjJ^^fa#UAIXHCVbcpwbzMzxV>kDoYQ7&zcl6ZY;`#kHIp*4GD zF0L+6tO2lTh@~q7rL9u2PU+^}4Y7bmwbk1TdYAFqeECpmQ9rR}^l_QbZwo-jiW7T| z?&wEr!P5i58{-@37F2~h6iL$hBqdB_0L%>!k0uAem&0BQE_?=_5j`(qBTsQL9OS>_ zzidBTFl89Ln)L1j*}%K$aSW4(5WUASLSE~VMt?Lq1;}eAhhq5ST@w_D54|rwgp7QH zXCKEHYq_;049Dv>^Zv_BqGHZ>D$Ih zVDF}R+!!aJux$_Y5e)RU0`j9k%LN#2!o3E=vkO-O4TW!qcj<4|K^Mgqem?^Z^Q>#9 zgEupjzte~3^U{m$zvTO+%;O-VYhyRZSxbxvcr0_^;pgZV2(O6;P-85)39@vLi`h~5 zob7#TL9|kHZ) zFo&MzHFQZ2{*dme18v)^Yp6qL{WFB-$mirulsI}p z=>bPxv1iR-peIl~Zv#(;cGi)>8Tq z&gv+VqTM0lB1J%;M46-DEL=M1>}6gvmwSRn;?qm>nkkJJOxTsFYj{udeQavQ^93C) z+`6$UnXn`PNm|8hE-#=~Zn?aD;b8bJS(j=~Wl@^T#F%yM;k5$GYE^C{>|e5G^ZLN<(ySOT5%hlS5-Z=n2zAqY#lgI71$`Mk z{DrZetNSsE6`U!7`kr%eHD^IoE5CeYK$Kb~=^WS((m9;{h&0RCZyunL=J-13oMV;$ zS9&_k7^_*kX@KVYGfH%$wuXdc*~svc#CyUqhS~3Rf`a6*&Ejk3FPD=N}?=;lM20xun@=*KR#g!V(5b3=7AQfA$ra^1CDVaO%vIe zSxjcTn_(b7PHvp34K)awcfQLX*E?+2@}xi6&R%~u1+%lbyo5l^DQf}T7MM1xU%<2Y z1*|Nq=l`Bq(@lXmYc<@}epnDISFb#AY8be?@{5DF*CA_>zHQH$(vqQYw-enxz2NOb zv5o2e^VmQDYA`REIToL@Y=Hia1w5x!@!mz~%_f6911H^qAwOXgQMS zA>^IRKa}7HpR5DlQ%GB=n6~XJ3p|mVXT~Q~K!W*%pKy3`0`hQL*njrilhrNua|1yQQc_3N<^KA*@r8`p8Uf~j7Y7epgF7P;l}tziW7EZ>9Z zjPI4TZK&8$o|d=RRp6O6w{Iqwtjh(%5O*kAEbz!XYKIWBA9aQ1@;h9+z$f!uMumwp z&=z~vBI6R{B$Mlmrp~Wai6j6fm;%Ijn!!1rE(QgN2RAK>7UwI*tn#`9*9oL<-cm3$ z00_wP6$NigIsrmCa1j6CnK*YFt(bfmEH79n1b5^rLUqD#qLwaeQK!6lxFQ zp*xf^STtuj#g3{~$6+TCL$174w747J6Y$r~exub&ia$mp&jgQI=$Sq?C>OEhT^M4* zcpVn0LC0GTfr!@%u4ZGclKgkYcfTROyD57~meHs7gT(x0FOLj1eBaE(RPS=Tbf!CR zP1_7r{>LxZCDE6|E}ZH2+nIj6c;So$b0oxikV_L4;D?DFGZkEgFfy-ql--oHo%KHK_08gIyuVg8g@`H&M zkZI#vVpqFT#51RXP{0tW?-oWcwbS_y}9i)AFguk|A7L&Z5dH2fMM8jXg`1hy-jQS6e~%LLJQG(I{2DERirHTZnd5n;U97nU4vxN9voH<-=!#oKOI*R< zImg!kX&2?e=#Rw;5{IS#6SFlVj`YXLU=DrEwnLY1neTa^FNUMfPuTvR_V+=8^}GA9 zqgt88vv`9Js|>M1;k#DK%yUf`hd6vlEJlc(_Aw$#o@dt9Ll?&4GyTA+KZlC>p0h7) z{~ZABl;dk!b77dPyXWRBrw#sCEsBi71QUeI!U1#~gRy(7u`cg<>&d=yKH#S83Y_M> zkew8wL;scqY|0=*D7&klag-AWwPJ+=X90>C83f+2;*c>Oz^qvDAS}@L;rJ&0T)G3o zrdV#q3)8k0+^28%9|h;&Q6DSaP9RI#fkV|pB=F&;u9`j}NU2lwL6*+y961DPGd2#p z(4bF*4@b2mT|nDp_@##IXDzitr6{lJLBb#=k=ix&%#Du=%y5ci)3=vm;I zIBoh9X{K5+X71Q{^RK^4g=SAxh<_a10#G1Q6-$#6h)FRgfT)!V@c^-DeR-0F2hsS> z%!A!Rr$76}EeUt|uY{+Y3-W)2BL#3cQleXTa)<*ZY7jj{!(J|5?shQF#QUN7~QNIA~2o$&~ zkWwOKJH(`ilp>`>m71I3;I0nB^V|{w{Gb1Ezk=$)s4XQb5w6z;C-C(icoOLaNe`l5 z(Kj5E#QiN%L?Kl1kP4~1gz7j_Q!ivxdRgfE8K1K``czJ5ne9A9FzPsvZ*~+ry7DM! z0xP&|ACS*xBv%yxPn1}MsSXnzq8;jyUoEIS01aG)>pq@egf%!8kbala$maJKXu9hu z1A;Ss#p_~XM||Jv==Uy?yralIxdW2G`>Bvw%jGg_Q@t*6h|Mwmsc`|w%gavhpo$3V z=SoBhlvJAPd2u>IgCsXZ1V|c@$})#34$)+rws}{vV!YHL5RwPUoI)%@9JYa(>BXQa z9PLv`G5Y3Tj4tj~*ib8+l)!7DS&#@_ToD&YCD1_Arbi*;oVc}MdNTRp-*1PN4%zH; zs$i%@op#{z_Icfyw9ify&F@CJj}xo8)W@eEQpPWxawgyzf+yf-<>H#jy$N1%dv&vBW5H#4U`16PP|1Y6>`< z#STvGNxrovajW;qHNd}Bs}632MMWq9d>*dBHjn$MJWZA!yKx;udx*t zLN-&;0nfL0lMi#em;Z4FXWTGX`L)Vf-W5OoPlwC93Fbs7UlJ}60w9i)sI-cyAAd;Q z!;u{u0&O|_;Gv61=lM)I&SlTUgZBFrQFt$o-Ewq~*`Jy7#k%RPP%PO*5`d-ew{uC#m8-8ugFED$^CW>{ z0aO{r4RKJ69`>2{^=lBJuOL4E!lxV72ichqi6*DI=-tm6^^SLRjwuch9n27rcDOHr z0pQFSO0mPBY}o^240m{i(>-?hSu zu)N^<-=KqHv@7^-8Te6(-~R_cV+V6c;rYgyjC>TcB-D_?ED0-oQWMO!r|FurbkBVc z4;00-BmD9!mpDuTB0$1}GzID?$SUxBlIDK;VHBllktTT`DQv}xhs_Vjc~)+TJ+t2Y zc^WK2MkTn2!Z~v5kIw^YisFuuP(%PFIG;Jf+;YL8mzpp&@9LEndfPx_3FzHS>#c*y z71RnJ50)A#TRD8ey8vS;c6rWMXUs69cBkJA?M_kz$+#1x@!Jw5UAs1k05AYkI#GZHrc=2;_qqTVU7kJ- z2F7;^s>Gl_sA4OpIa4GSQCK<=^KG^rw~k@lT3q+Qhkf7){r(&AglxxmupM6he?H*X z@vARJo!^$zz8FBU#l}KuJDMqikIPwEN5zd(W?}Vi7 z=zq7KeHTJGsuSN;V9u7fx?KaFrcq4e(j{8e$~|252x04okX-6L`*`We`N%0vg?T~2 z11b;!a6xd!eEeY$lt3Wn+L4TskVk8QYDpnKw-17jtt3PE&PvxY3$H9zE?8u?a<%-c z%v&Rp-ceqC2GTgE!~+G7Fma%24CnC5vU*(1b_L#l@F+qmP1;tU-_~^FNIUh81Ux%_ zYG*fs;J;em4dq~CR!uh%wg9KbUqKAZfd83*-0cPLJ7iDJgEp%@8I#@p>BL}O6As55 z;&84RQtarCaGe5AC_0#LMm{x<;^dwy4i1xub!nb|_5+4LXI?jDzG_;u%AiaPQ$b}& zMknM#Ui|Tj4g<~h^v*hrQ-kXTzB^%&m#g?W+qqlG8_kl!8O=R;!yjIaD$Gj>V?J>D zMSq%oB{6U|ICCnFf#=-o)x-k@bG@Vd# z1d>!v!4=_|#U(YN9^*!uZE8&`ctH6D9EIs1fZj;M&z}-q@_HPmb>`^?rWS1?;GsDU zcYyvPgTWO#NgeTE(nI28fU#q_;y>?0Yp{TP5)T~xc3w14*{o#?he!z^#_B_96dY;} zqIKxOt>1zgTEApRt?PG0cAs$O$w&OKNyd?P7d(Bnf<5?t-BGv*SYte=6Pv4v41}o z9U}Mnei;1Kl?6ln9OYAU0b-M`M==~SuKtwz%5YfD=~n-khJxDr;P+3U;qhD9vs9WF z>-%VyHF~K(xqaZsEOFsaN8EVB{^~lq;Pg*BgN$kLoBu<%21EiF0oIU3DJSowmBC~k z;A-8veF-ThI1r&{P7e#9BHN~03tZt69zR9-Y%T)?7f~GlCJLP}EnI+SE}Zu*EdauBDkbL*->p4Zeer={F*C9((b(xfW=X7wC#7s;S}w#f zC`5&i2OiP7*$X;`WDC3QN>Yb5EN0?D3xBK~#0-?Ez*I*5mt`oGJcvn-RF`%&%(;2bc_WwcX*Mn!2Yc{6a3 zRa9STj4d)~{qOEvl47`GuDMbGQKQ)OYD_m!|i9H#22bcRRz4Z$J`{sxV4 ze*(G0Gm(dz9)(Fn$pU$bkf~2drXcZz2J_r3uoKU^Pw6hj@}9W5iCK|0NQU9#^*U@SUs^%lm<#&~ya z9WPNEz*W_<(jX{>FsUo&u%Y^hd_=8s+Hz!`~%q zpx#dXEHsqZO2ZH>%grx*Y=L_?L@9`SZInm2{RFmSO5J-<#upAcmF*&myU_z%gKUsuDK!}D$-n&1wXFe@wcN8aB%esQY4x@w-=y} z6R5(cn0~5*M6L2@e{n#rzY%Lmx~M=yAJAZe zz9KoWos@cx6l;YZEjGYTh;QE}G&*L^wrmsNZ zH7O{`gLR-q5kyuEV|ra07es8?e{=_cf9x&rLJ6-Dizjy`vbeqhrT|OL(?G42Cx7k) z9eXe*l&6RU9kI6Z#JXl^PQp>}Lfbz$OPDw@Q=9+ z)>!O65cfv%oX|s_@fb#H;oa6QF`{b`hPW_ZC-YJb7L%0-@r*7DU zL5jmHpH+{_K#MbIi3cs-pry=KTGAW>Ia(YE1jb?ogW}V;LA=wpdUD`bUe@tbtD!=H zb$adCo{e3JsQFxNHg?^98XP#9TQIp$rWp z<11l+KayV#a4fKu_JCox9)aLk9z8gp z1R0POP&t^IfWQFjMr1QR|9bosym<=VID;NX@J4GZJ!w{Y@PY_QkuT)Im{8>|LD626 zIl-2a;394(N#X(7VZu4YF@VP!ka;E8)?6Of$Glk>Bv^U$xE?goIV=b{xHWAvkF4^H z(s6N+*bzBl+OCB_aa#cpaqtM6f{M6edIZ+rjw66N9l#V2YW%MtUFEOj)IN-lg+EQS zH&qN;yg&;N{Q1pR{#fVB5t}fBxC+cftQcBLJ56@xD0zK{*}<-Z1KbAWKh(#CeSqUd2jrZ*RI=QW&4nWLXFho5f#(YP<9fdwJh|LK z#QbDRm$bB6Il6T4kDCpPva94ND}CQZVy2aNjFN$R3``x>5T~f_>AcrD^11j5@_Cre zQ?KJ9dic_%j*RPXbiD@qH#ItPU!;KvIj0eD^T)Z${2Gd@*n4JBB97}$-qR3=a71+{8 zTlL(}u*Ps4f(JM2(r8%pE_Z||L0fV1;CQ8!CQ=87(Vwg)2hZrZ?9Vpv1i>Tw^SFCF zmMx?xY}-PDE$iB>uL`__7lSF{F zeV$q+c;=!%FT2I#>=`kw-}3F2w&>gtk@O86=jv2a^}Ml!zT00r|GrAAp;Yw?;=%e> zR%v&|8bzy>;6y4@dX)J9OmBi|CC?RuX}4QUQ+r0Z3(GK|VG2~h(Gb(^?W<#60qG9i zUqb`rAu&JJwePzrC2Eh(e63$Dj@%7LMwi5c)}5;R-2uX29Nxo z-@C_S-|ss2HHGztF!IxQjPSL&c=rZWgfcgms9f~);EQUYBaAz^#e{LG_4g{PqHfzf zx@~hCZ9JnB(&>}nSppvE^l#kbv4VY%5`h&FJX5x8v<2P)XZ(AAQxv(1viz^f&<9%% z98y?mJa`Bk+S>^_5hNhu>^5H7kEz?Auy1DDl0FlIIDh#vxIW~v3PT1)wxRNS+tqX0uR5Q zW86bt&z8@X%i!4s2Ki&E?ew|@()g{fTEt`!1LVx=cnuDQnj=(Q=(F0$r@nVPtb`^~ zzj12F&=R6{4b1j`t_HD;F?7cdo(b-Y6YlZY{(N9g5nMW|Va-JM&&J#Pcfxk@_-^SN z3Z1@(>+GfUfztP&PZ0K*t{|-Ps`~pl%~rotR?dui*6->g^ea(X;T&&7!ZSZ^aD6@6U5*noWSJ-UU74`KbCb@($Sr3 zQDpNAuz1085!tNe@zXqZ3(48C9Eyc7sv~lsm8|jAb;IePFhpmu=|z$&|031q-dL)C zfE+evp-Op-=y;+qqwX;;n5J~-nq~^A*I%5CCCKO*w}2cOiS5GVng-;9w-E@cX2w|x zmZ&v?+v|rzuvy^qZdY3paqy`3r*IJW1jH^Cw<@ohX80n0YGSRCQd zcSKen|IkXd8vl@b7!wnG)Vg<4Q8c7*9;_45qP_D0Q=C#6$&j_Ox!vbDct*b}W6xIG zdp6FVb-2aj#DZk-bt(Gt;7hJB*~Z-+a9-so{?_Z%mZ8pq?Dt?U0}ulm3v+dPlG>UJv|;jzoi+Nyl)o49hJ`l{k{$RL<{ z{?On(%5wCT9HKW!Ctb~Us8H$w5o2E>m9%PR)a~U4~MD-TfP?xH{XnZrMx^r`opV6)tT^2uv|dNG=(xj%e>y z_B{6LWw2C$-$^au#b`V~sF2 zUGF8AHIB_W$gw zhHu`o?CI}c9iP7;=T8exj0DC8b8GoPMKjd|Tg0#*!-~BA3gm! zt@fG*kU34WRq*G>&zoK>tmTm%u-^W!DM2Y1U}RCsXI4nZ*X#JOkvsX|#FZPz2C_pX;YfJ;5EwBINWpP`wQtfKG6jHxdw#5F{=o3a z5&9=f(u1@{iuRBWmcH;hyuVPoc%Xj|&643}DCcw~jyF`ERnDZ)|928s3-J3*o7Ljv z_N?l+#=c$ywiL40%oX*sujsh-qm%#D2kS)na2!v~+UGA z`j*yjNEXv+{Y54XkegM}%US7dgP%Dz*~2oDYaaXlHcRdASYEJvqF|yvDTZclBqx$j zAcF9C=S5%fvzccix@%`h>5haEb&yBpdR&0x|ZI39qmmpWotQ_Wup;*YzI(K8= zYy?w;pQZ1bxjW+a+@YBE)Gw9)8q9u*(LyZ;-m3f}f;R4A?X&rBtMOyu8%g`M+nA;? J%h%@b{s*Q*`hx%f literal 0 HcmV?d00001 diff --git a/flash0/font/ltn0.pgf b/flash0/font/ltn0.pgf new file mode 100644 index 0000000000000000000000000000000000000000..bf710feef03fbcfbc4427772971bd2ba423dddc6 GIT binary patch literal 67660 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 literal 0 HcmV?d00001 diff --git a/flash0/font/ltn1.pgf b/flash0/font/ltn1.pgf new file mode 100644 index 0000000000000000000000000000000000000000..7b9dede4846140bc9af4ab5a2d39ea396f87254b GIT binary patch literal 63504 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 E0nmc!vj6}9 literal 0 HcmV?d00001 diff --git a/flash0/font/ltn11.pgf b/flash0/font/ltn11.pgf new file mode 100644 index 0000000000000000000000000000000000000000..402bf6084c93efd18bf3cbba5eb94e9c674ebc8f GIT binary patch literal 54572 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 literal 0 HcmV?d00001 diff --git a/flash0/font/ltn12.pgf b/flash0/font/ltn12.pgf new file mode 100644 index 0000000000000000000000000000000000000000..092d5ef0418fcd7f3978c89adf998f257f35b4d2 GIT binary patch literal 58352 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 literal 0 HcmV?d00001 diff --git a/flash0/font/ltn13.pgf b/flash0/font/ltn13.pgf new file mode 100644 index 0000000000000000000000000000000000000000..89b28d366a8d8ae8030e4ed47dbdb6959cdab847 GIT binary patch literal 57660 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

rILM&YlM0AMbutQ$HTrN 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 SBr}+U2{{(Z6Yz2d-Twlp!?1k- literal 0 HcmV?d00001 diff --git a/flash0/font/ltn14.pgf b/flash0/font/ltn14.pgf new file mode 100644 index 0000000000000000000000000000000000000000..873afb3d05f3685074be14f958f9a9c3288842ab GIT binary patch literal 63388 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 Txu;nbe1{SY-T^V2Y{P#7`9$fz literal 0 HcmV?d00001 diff --git a/flash0/font/ltn15.pgf b/flash0/font/ltn15.pgf new file mode 100644 index 0000000000000000000000000000000000000000..c517fe05cd0d09011088a147d537894a7f631e3a GIT binary patch literal 62364 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 PccV%*fYj^qRI2|1JLlHc literal 0 HcmV?d00001 diff --git a/flash0/font/ltn2.pgf b/flash0/font/ltn2.pgf new file mode 100644 index 0000000000000000000000000000000000000000..9ee2763f85fdf5538b35f85ca900e545c16f7982 GIT binary patch literal 76692 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 literal 0 HcmV?d00001 diff --git a/flash0/font/ltn3.pgf b/flash0/font/ltn3.pgf new file mode 100644 index 0000000000000000000000000000000000000000..805c2863304b2fa433b7fc49967d7788c112b770 GIT binary patch literal 71900 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 a0!Jvl0Im=o;sm%w*!gT3DnyC-4F4aoSLv_- literal 0 HcmV?d00001 diff --git a/flash0/font/ltn4.pgf b/flash0/font/ltn4.pgf new file mode 100644 index 0000000000000000000000000000000000000000..12b075101d98d46b4972bb6b911a6980b68a6f2b GIT binary patch literal 78920 zcmeFa33wFM)-GJ#UEPHf=^^vf-5Cgwq&sQCOlBq(5<((Tfeerc4v=&vKmrMaAPR&* z1yKno9zm3VGb$v&IS$7o35tRPbOYjXg6gVHXdJNayQ(WVoOAyB-0%DE^F7afKsIlU zU3*-6t#_@xWtaz5lg5orQ8NsqLmC^yFr!rra~+QRBC#yXJcyf=7>kl7+&!bRro8U% zs=1cJ^0~FR`hWH(r|Q0n|Fbv#^t6SkL_Qe?8NK@Fx8qU`!;F$7=?Lz<#4^l)E0Scy zaViQp7UykRhIt1V!UQrbBYj!Wa`i|4uO3jn>hT2@`LF;fbs(>ldjC9#gGX@Q27Dgr z7o=IpYarfz7stbaBat$Y?#A^@V7`I{3f==O!u49D+mPy!<{%X#%|)7`;Oz?T#rLXk z+>5n%zZ&N&@I88W9@2ay%GdqC5?tR5r2G&*fxbcbq=N6_IXZs~zwr1VjYQ~D@Fec9#xdn*Ez-TH zmq&qHkse2){y}v?=g%Nfdk~Jpb;3u0yMUh{5q_%RV|b3vseK8l-xE?k2~Q{pkt3g% z1E0rr$~WOj1wT`8CZ4D3&nfsJa1YMu{>w=8T|#<~@Br=;QvDDf2U1(S38cEE@)Noh zoS|GlqTojgeh#F%S*qY)6np^rrMy!85>_bZ3xNl4PVaOeh2uW8A&t-X=sM23fb?xb zYR`{=)c%zB*O3V6Iw6hsuYh!)klKTg#@j!Y>)!z>UxZXY-vjCQc_cH=e+JU;{R*4~ zlzxXa&a_DMd>9l}FM1C?_^`aQx0c%N`NFcCWO9fF-y-5=iw+NcEeEL}kcAqI{1=qW8uqI2PE3 zM7S336Yc}%0V)5}kX}bBN1}Qor1z2DvbE?zVkajBPg!ElP>hFZ}72KfUMg?gc z(0!WYUjWi~_9D@IN^L{m|0_}`?!N=vj`SW9eV>r>a}?=al=~AP13V8TSwTqe3rN&n zKO)g@LXnW=s1f)%o(lo)!}SOtJs%0A=cAPKWFXb^ap);&NM9)UHSlJnfBp`gIOdge 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 literal 0 HcmV?d00001 diff --git a/flash0/font/ltn5.pgf b/flash0/font/ltn5.pgf new file mode 100644 index 0000000000000000000000000000000000000000..d12e9eccc3873da26f3159cff133e28536f90e6c GIT binary patch literal 76216 zcmeEv33L=y`fqi2br-Uwm+VV#NeD}lPB(--Nhg6QTS7<#R3Hf?ifma(*h#`7pdbOA z85mT;<|v{B+(jh;N5yd<4ekqcgS!q?S7&KtNxk1!T_Dc#{^$SRdFOx5J8-=DbyZh& z-TU3|e)}yMW`knlojEB=hG8^lIaY=lrC^vl@VPe{%d*S{d`XQl%WeFFGs~(!PT~ zXFCR%gX1PO!@LI!V}co$5x>rFxcMXhPd^Y{wRi%HewcyOTF_T&H~wwFhdulaczS>#`lEOFB5PKzPAH=qJK`{5Zp&d{mTLl!1;;5T(knTzoXrawnIi5?-VpT zUxxMu+B~!)XjN!mqSc_$`Ng;32|Rx(j$cJ1d;`ZTfRCfq(y@%)@%+{JOygSvq_!4~ z#zS~a#&>1>Bd(Lam$6yKR^UT)4UpC^^^b5KjvoP5;W-HC+^=(&V+AK}~ho{;E6_%V>?;s}svOXDZ> z$T(9z|Bj4jWc(6Hv{^0VUu1j;{iVJVeF;nDK7r==NBOTK96R?@l_!GUKj8I zpm+n|S@((e&2#r=e9fdhafI|zHDC85#%gvZfR z(5Rmd;8!xfj?Z*V^Fg>DzcUy}_YIM8C~yYOj{p*V35mWLXfy^V8ufb=8r?Tq#vEW1 z8sTQ#Pk0!Z3#9%}LwgOa1dZrMNcR(uH=^B-M&~8olJQL$58!u51`;1vq5XhyF9!C* z`K3Vm{pD!%Jt5skxDMYFZj_P6TZiLFU_FrTTZcw;+9V$n((i0W8-(i`fYi?|Xw*N# z8^@LSo{nigr1L=fO==_yh<~=B(e*pf=>DhWW1{J+XwS;Wg!EiO;&;L&GCn5b<1*4Z zpzle?KM$nm96}>~N^?Wc|0`NJzJCw68|?%dJ)e;Ja|-Q!jQbNH1N;t1vVxHA7tmJR;*U88x^r66f#4 zG2skgG;kg;2H0Q5;WAd>dLz!q0L?%;PiT^l9|T%(JQ)}Z%)|GDzXIcc0x%vJBV#14 zqhq?Ba5bl1-A&q=^tGIq&0 z7S|`^d^a2uJ`c13LuE{rag~hwWh6SJ;5wRDLcff3Jsr;lI)HD;Nc5)T_kja}pUC)` zj6cd)ir=O04*&-NlW?B!0U4=(sW|=y&m$Zw9~aA5CF7Ga62H)O&*Aq51Bp)wiC+kx zk&&*Wx1w(a2&7+I37sjn*gNi2>0VS54Z%!ghyp0dQQTz6UT(qFG8Xt;ak80Ak7=$ zA{ps^I(`>e2>c23A}o=QYh~OhBk?PJPxDSl_Y?kA#`k3Wn~bMqBzoM9>mqPWI9*1% ze=?5!GLjsjW4itx;6(I?@MjrWTt~+w=LpR*X3AJ5BaM%~Uje)qSSll(zYoXJGTtNO z3>oLjSR*6x8(mNQMA#4gng-mAW5R8~>A)29kC5&sr1>ITEF;NjI&PA2Hh!lV$IZYJ z;9J01z--`bU|(EEco&Y#fsX-~10MjAZ%BMV{^~K{W57i+62H8I<59rHXrvpwGU6jc z$B&@t(YDCPTV?!{j8(8<=(>6tSIf9w#sfgQpL{*Kj{HEv1n6GEg)%-Y<5n5TkD>ei zB;$7Z{B9Y^f1&&L$@nyou5Xf$56O5~#+T*qUy+e)b-JHyXF{@_2+7_jye=czq4c}s zWt;@0?;n)0Qa-;@J|?@2z9+kk?pr0}8u|QM86T4IVfp(<M9d{RD7b{d^OARm*xMb{sc&%Y=iza-@X+01=B_pj1Iwn3QJSyX989$Qo zQyD*(@tlkv8PCgjLB{W8B>$9t_mYflGPcXuA>(Bk$#13WyMa##gJd+w7$ReojL|Y0 zWi-iXk&*mN`kj6#@? zC;yIcj*PU<>6q3t;RYEu%D72JTF3M~tzSY~w}iA_32D6&J|QFdI&@6ym5|me;R`a- zx~1dSWh9@Aj^C8=n2hhp_;(q^!-2?3uG*ok>mt@Pq8jSiV+Yllab^G9oNgaM#e2NQfz|0-zVci8DEz1 zsEqCEz;(aMcq7(qW-N@AiDlxLc%~1N!1QJMG5whVOd^xSBr`T9g|RaZW*{?&No58j z5;>F^#tdghFe8~XCY{M(oJ=N@#bh(1n9)oQb0>2bGlm(JE@hT6%b69-N~V_C#q4JGFngJO%+t(Ym}i)0nf>sh4=~R& zFE9rYqdvqOW?p1oVqQj!_f_UK=5^)`<_Pm9^A__qbChXjT9{+ZapoQ7ugts5dx#gG zU_M~}#(c>9ojJ*zVpH0XZx@TY+tq?+n*i4CbCIvGHYW~ zSUc-r2eO0MRCX{sgdNHbV~4XN*pX}+o6csiPBxRxVzb#%>}WQJy_3C*9m9@g$Fbwt z32ZK#$L6z>*aEhYy_=oPPGP6A_ptY}_p#I18Eg@|h26@wum*FmIoup!jxLjj%>qjn=!Y#nw`5nUzs?3wQ3SU#04%?>n_+*Qzy~ z)_T`==kC=H^$2&&{=8-Pn)N~EtPSCrd)7W|=sW4zsmJy_v@tAY=85f@d)GZ0HMHu- z&yVe0-(YgC?iP`?Z^PEuyB_O%&+&Z^Kb|mg&s~4cdis$+4w(Al>@SW#y>S~Xz5n`O zQOjE0z;)vz20q~0m;chb2~k7JJ%8OgaD8sfh{fJ-PrtN2&y-QesP%(3OtfUL*TzqJ zc|(5eoek#Ej}3ZwQvA4WDP?C~ez+hZuhIFCKJ}5peg)4=e0tI=kK8?AN>lN>kEL#$ zoOIu772lnCW#bfE(SO~W|BEY>oxi*J*jgCj|Nh@QFsJ|HKf~4k_|@$%{;w!dclbZt zUjC2&@WsEJZlF2Mcv1Y|e>a2wa@UO$W?~9k` zfAi_duZC2d|Ldc%Q%-$7too;qUzqjTsk0-N2;ZLEJEiqp+KOM>FMjh`t2?7!q3#_w z)#b@tdq+re>F2KV*&B56x%;M`zA$=|IB?F_Cl2p@zrmdSNc0$A-I&M!&j^{2|9>(E zVNWIW8448)0hdc@mVf)zzq>qe&iS9e z%EVW;>b}^trqC+?f%3zCTY4X2(-imY3UASTnz^jr6y2>))*p)#)^=}Q-RyDH_u90E zXELC|S0|6wyt8W<$5wwi9=) z{-d+c=`m{@`#$dX_}`v)yzuRSUK`)9dinFDCpP-5&BZAb|8Cs-!9N^7_sn|fqYbH> zCM;NZE_`U>=Eq`xs2G0w)X{f*g=s4qzWeBEX@;k@t3a8Vxm-J7ZBHS)cYfiwq4_y4 z=2yg-@40L6r0s0qN5{T==Ji4LhsO_n{9|@VN$y9Fvv-eHOgi?l^X@{+TCUH z@4sDjE_&3RAHQ3(>+C|#^Y)U7JD*(q)A?l=cfQYcsB2#~UD>9%R6oz0aH6MgP5+X6 zwnyZw58LzjlD=miX|tYKGBEkkNwYrfHhAZwdt!fGk~w^9U1>tU@qc=}?|1huz4tHM zlK!%z-<;ehdOUM-%;Ft8z0YvV9;({&ao?;Rf9QJpNWbMrcIWJ0HRs^6rc=+C|MKI# zM~@!5|M`A%PxgPg;DwnZzIyI8{iRJKzE3{#PV$j)Lh{>-_#dLK`$a}GIe1F@A%u9cJGIhwQ*Ix3EcQ&|2RYyEEX2?g^ULJRHa`~t4 zbu7I&qsQkFog0%%r+l$+@V>KiioWW$_{38SP3LwG;jhq%QxehPQ`@R{8yh0?YtBvI=uSUx9Jj9U#EgDa{nnh!>e~cJHOfa z+JdH|55{(!eMDgU@sH3&YLg=Hdx~U>N6*e}i6ye=I8~TQt+NcY=v2C-?1BlgI%TAz zEbQ3_sHY=Jx9{FDJ5E<`DR}0?H+JOc6%megM~)qNFiyA2Qn3BS=kT5OSi!o-Hsu&B zEtZ0krIQC?(8&XX+w_^*d~0QKWyM6)An(<0zdRdN{7khf^5@oguS3lCoNupF7?Z`j zybp?м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 JUl+>G{{}ILsf7Rl literal 0 HcmV?d00001 diff --git a/flash0/font/ltn6.pgf b/flash0/font/ltn6.pgf new file mode 100644 index 0000000000000000000000000000000000000000..0f626ddff23fd9bc986f96efca91f07bd8a79fca GIT binary patch literal 88716 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 D2&*EF literal 0 HcmV?d00001 diff --git a/flash0/font/ltn7.pgf b/flash0/font/ltn7.pgf new file mode 100644 index 0000000000000000000000000000000000000000..ba9afda58c8761c3fc717dd26dee9f8348f91560 GIT binary patch literal 84860 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

6g zAIK%6#>vqfp02DMm)HZ7)gc_^OcOgxtDHg~i8M+sq3qjCyL~n9sfr88t%;7@z$qL; zc{St^av$*!$ssiJ;_8PGylUhS^4c`;d{d>39zo38)d`dds@A(G7Ed0Oq*Pdsxc+en zg{WJUA9c%$hJRMWL%zdHp6PRysJ&&XNEzM+CJNWu+@Za`xxhCt&E}qLa%Yac75#j1 z*VrG>FDt(12XY3R!yT6A1BI~t=FuxHrq}dppe{6{!wijK?3Awm(+w(C9NAuw6WLZq z1`BB}HL|HpuJW{OaHFeB4r6($&Vc!Kbi&dx3b{m}jJ z1Wl-G0pk@b79`vgeiHRq*|A@@TH=o}`-}#^but&Z+(zOppitpBId9dVd%XglNQR)^ zy$$DkEuL(Zx%e^aGBlq7eRzerf{LJ-bEXe}#OTEif4kcS$&!~o7qg={Wh%4{`ZB8aNNG5)OMS%SXWP)Il;J{i7y9u1~o#= zMOe)%*X+K%k2~%V1OsJEMTrZi0g7GxmgsQA8%3J#h+;urOvy=j04`&P7N+q45LH*v z=v8@cmHm}*tQZ-`85u|WP{pumUAI-678?6@*mQkr&^TzE8E^#uYw*&em15QQR%gK2 zO^{&m5RZvt8*0#)tXf+Pib})!f~fh~$cS|2j8M%PlGr#;Qg7T2f}jUr%mL(4j1cNL z3&$WCk%NK6>n?8UohyL`s5wP^oNKScipQaN!@T}g3~0Sit0216n(6iq#j#44o*pA3bmNOJtK`xC%$WBUh0+6~949yXb1?Sl$*@^Aj99yk zj4mo2fd+vH!@h&)aErbh@v^}!RFpTnrm6KJ&fhQVrIG-Fad^2%ttIl88eUwy8Xvw+ z`Us_@lEe7;8`*=d^1rfnUl`v9YJA>-(MK!B>Eml@&$kE1)>*@&2lJ}F)UvLm1R z!U&NltK0^nYPllx0}M`d>OnSlwApZnSM>uK8K0O3*3-L-GiD6*Ta!OX?Akk65}Fb? z%ieU^f8-0Wew_njl2A!FSiXp(BbntJx8K3&-1d{oO0ZK)Rg32c$ml{?DivJN>{xHo zEKNcMIgFmPsl}*MX0Z}8mhI9=Y9Yi1jB_*f;y_p2gJIiZ!!zJfdDz{OOgsEgw+-_S}37^}KW?&@)x zLmTtMFrKNe1hLNO8`bx2@4@W>pZjMa0ZI6@a?2r(J77_|`$yvpezk+DFcwTg}12zAp1k z!>`Xior1lZsm`l==$zB8K*MB5aia(-TDMY~BS0S%lQA?*veA===rO;dv1 z4@j3N8rRUVkf)brQDQ%p$f6h0?Z2WP_rN34*dCM}vrbtWQI_1v{$g$PF^zR#TRA;) zd(V5l0SZfvDUo9TNAbQF^I0GIot{{ZbX-^^@x;HA$Qq_{oMN$N3YuC5ho|zJn=xW! zQWz97!=M&2s1<5Zg@!vvZuID&xcOKjb@S;F)Ec!!L=jV^y^a(Y4!G1;JXw!QgFZ&r zfakjmYM$z%DG9;VQrBY3a^*xlNX@qvNbhRb4YE!#Zj(FarMAvCQlf+7BiDLQCZ9^S zrlwVc`O}L2&d9{*c;fZ(1k4P_$Z*EXa6%c)($7uyX&je zb|~S(R9A!1JEKBwsgbellc-)FK~epq`i)&P^;sxIB!V@GKjI4qXqHlCifV$4hM@r0 z>Uj3Julb7bYG{>lTrIwMQ9n$qVrNt;-$9G`4yJtDh>cI;kTYOId_%V`XJD-8Z^jRe zt%F~;sm!pY6ql>nxk{u`v=9IehsNDoU#c*9aB zH{IY>-ge9X_GdFK&c?cN$ml+%ToKpD`-Y}yuh)CMK|7^yH%`>j6X9IYc9Y>^Uq`7~ z3gw6oD*HrL#-kpI=PoD8Q{s{c4>)`outP4o>C1Q{a*OK9IJNRm6`#>?gC0Z6=cSf> z(Oi1`pQzb1j{gYHBb23+2R=+3+7KA4Pp2briA<+Qdrm&HhuvUJKGU?JC&y-8GxB-4 z=CFUkT@NCPZo-6Nw#?}g1wK>jqO+zBLzC3%U#x+O0HH;K%#lKCo&feTVDT@B-k%n< zeFYi#Pr7d8v!C~$OgU?#k5;KY7Dj@5-+}O5+k>52zS!6~f-|K}(sKJB)36e=ckafP zgESR}vLmv+OuQ(U`7ZRLj5g8W(x-{WvAjZZcKK8bl)xryS&iBa^To>X;uDI55rQA*>xU;XDscX|cb?xF?H$1=nZf~p`Dd1{=tb}1%yp^V_S2Txoc0xNZyQ-TASGjC}wJMhQJ zw$a0N6!CRd1%I=SK#0GtNIdbPfS5%IQ|Vt6lV86wqb6KQF<5~1r>n6#uCs46 zhJ&|y&seY=9IeW=hD`+*9}-EpW8V!pHlv}xC z8Ro7>U|Q+#x`L%paxIXWtYf0;V6G2RIKH=ec_&V`>f^Mqwq~`qxFvVsmdw(|M3)x3 zWR|wVfBL5O{^ac@?5c;SXxCGZ#h4IBZ%6m!r+XLM!ykz|VYVyS-hZUr{tLSccOMQa z#;(ykRP+w4V{{o6S2Z{7XkPqxfD@>|E?T1lw?fy&rcf;-K6mI|h>KOD2gEv7ExqSZc#LwEECC(4aN$g`LV}R<$5j^9p9#@gm3BwY z9|`FQ&sxl`Svb<|r3umgp6SJOiZ~y<@JdnZ#gSLHE`^S7*lf63*6x=7ZtXn252EAy zX`sEudUN-_W|$Ll*SzA?hZlZ5x`J)m3E7mc;jyfs<+?7}luNiXH~nQ!s_Z7eusc-% zzZJ5gpd{iQs4R#_`YlVmDT5?kj|MiI>NB5`~wa@2RcR&CfiDr1)ja;9iyOY(^j~%;gS+yG2i^ck} zQ-t_OR5Qdp0vd7nmV0Ibd5j9uc1U9$#Ryi06NC_wP$+#ap-s$O?^C&3`dlkmJ2c3a zJpmi(4F9(%xG60}hfW6y^k6229Ne#Pl4qX1$1X6d-GA~PL)rNvp(vUaaac%a5)a5E zQkqb;%aLEvovUD8;l*yqEJB$RFHNyWNhO_P1N@~j9tA{WgOjv$1U1-kG8p}Yo>Pnz9l_U6e~L85>$dCFRc?z0#yUiz7T-|BuLsVSEoo;47aO0z_n71jj^uy ztk#<9lokUeo!XuH%QUoDUM6EBU2ntz@>KHk#+0c9n6$S_>RBK{a8LLh!lHl|dUe;H z;~xLz@{%`lq;ktl-5l7aCuafq-Xr+Jh`V8 zi)4$`A2#bUI9V#oM6*xsqMVfh5XCQA0f-C)97^7y=$PPwSFi>>>3q=Mpe2cL*y0($ zWfM=?BbhxNYEb^(#r_>dJ%_`l#bXO)M8+%Wq}kY!HauzI!zrizfiXpxNQ1SlB73g) zhg1A@V*01w+n7dQ)I=dVxRDFHP+l83>+0EgQ~`+$P3cXEEV$WpXjHk3UobR? zl{r>)Z-VIZ-iq*tt;tm_>-gvhjHqwXxiwe(lzoXUrNk4A>!`jhx!80NSPZ`}bY$P} z`vfm3SB1WA7W~-L#D$Wip_dmKAIc3m{?m6;ydGTZf2gi=U!Xix)bi1*twZ>+AY#}; zyKwEqW{khDit8Uw<@VA~!c)Pe?y zcnpJBQd&<;F*oIaazF~O!Nxh*DI}1vrJS-+$Dr1yOr7)`(=$TcyxKwiK zOGT#tVnH#_p#H6w~zW%(!(RdyWN3)D(0lfp0jExL$CNRZgr zseede3_HA^9Dn>|>&V<-3|$~PQwy3xyMJdY8m{U^FnSLUO5oi8#J#uqtGAc>-x!bi zwpc{Z==x*7GKpR-Cehs(dj>RYqOS=#yXJ)E_w0ZlnmUOmE%WK#d>ernhLJ0SE;MGz z5?Bg)^PunW`MD5&1uvb{aHL|T@=K`K(rz4VIUM_mYB;WdFGUj-;7cfsV6Du@uKkCU zgQsw2_CG@a9adAPp7nB>M2R|uRUuCgr8(7!E{77hfaz5R!yey{!}#`B>ib0Z?U#Kr zHjl~hZ4R(m_B69?Rt3aV);E~VHTL<>U+mcb&`_2YKE7-hPvoZd{nLZr$3V6wlpN@t z+WB5rH4~7O$jNT88Fv_8N<3X+Gr9Lq>mE+BnY*?8Fdler?G?63%nqDo*@v=6b{XzJ zXYr5Sg82Bw;VR?IP_Q&0f$DRr$oC|I0-Om36Q%2^c8c)zmL;CltCvE`QLjIa9%3;o zc;>O9^7XPsfJ%$!gK8qhgVC7gINuQ}&0zShkG_O`tuiMM^Qothysi4xU~ikHWL^Z# z)@7l@z8Qr8<*DEOpjdg zi!;}Twl_zX`u|T;eq=F9&`DzP!Epjh;RvbhOSqs?uPm3~L-x(=4@SzKJ2*Q=u9<6; z7yP1zD<2T0!rb~RT|d1&(>b?(TGGo@onFkle>%zq^@Wl!Ty}Knln1s56$R&?KP-p; zBMQ|eFtK?TMYMnbiAYh`N|_9GzQgq0ak0CYKTo;aiXC~Wxn-c+)ZP2}uQg+rB;Jl- znRYODU+>tVg`Gz`uw0)KjMe5AUKflR4F9}yAP^o~44xO)wIP_8zc1*|cjWs!s2ysi zxs{mxYo_(Cvf9vAdu(H+CFz!EOVZVtAua0Zwsp`e zyeu>?IL&76qHmJD=i`299=@X_(ooRz`*3rN$66ZBx2~#0zZ-~o&216#xm#;Bm#4sI zzdKlAOBUi5L_CW9QR=HMA{ZAdft{e}a0^9WiBtfjjT~t6NQqda$0|Q)pxQzBth!2% z^d`Meb;2VZnjNJ*NE0dH)CdXzL=;OTeV+AdG~A_XkFILwWF;}|LK__UF5yfCZ7YXn zgyLk)rr9e);*OsDTE6ksW-&-_O7FfjXbkiPjBPxq#>(E0(m6ioy(Bo zXA3yS7tq^f3m;M6!3(ge_y>3ymnGN)(+f7vgbvT+CK^WLA$DFm2u`- z(-q!Zj|owdLV|L-0xunD@g?Sl(y@+nqKFGT@Zu*SrZ+}Is&{AEzCQb{^0Q5NjU`9o z-Y^~O|E~?%-#_+(Y1YV3?{X6UZzRI4rv7vWEP1R1^E=l03 z$(ofU@RCny+6+%9lGhO)`@?}}KXE^&0q*y|JGtjZ)7h+ngBv@`TJi#)(Yf1&HB+te zM5TXcR#!|o+n(R^R$nts#!T7^-|7D-vprmK^WfR*iAkHT3#_dUO>CL_;=AOcvJS7~F_&zEorv^=XTG7_uuJ*>4YU_y^GXSr%tyviK;7?)c*4pA@DhG$xhPDT5 zq1{4IZAN`==?FtK=nC6T%q7ZL=07<*l+jjUESwNg()v67Pt8MGZ`qo!t4CrVr+CW(q2*YGG_cftyrIsu^M5RGx~6;Z<|Y1vX<;-vS%q=ZSB>mw~h zK=0(&45$!LtR}|hl?ye_UZAR7X^d~AFT0HO|95@a7b~8Q>kh`YY^1ld6=Mx*Va>j@ zKlY7L+T5r#*Q0ck>oRF|1|uD^o8-tsMz<>FYRrun)xi+%N$JC>>Wxy5mBOfC808`+ zVUMZCTKqamRl+11m$#blMD=%JDNNURw(6hpZ)%ADzoGG5VaSyDQmU`23|3089OtH=V>3eXkv3oC%_dXzoN zK@mt)Qcq@{mo`mYx0G<0f0w?)05E7=2sC6Z6hJ7-7A3=#yH6KIibb9&wgOG?~fGbatD+Dt2kvk@F5(c65?liG;{|NHjX zo+rZx)Ayax=FA9AFejfa;{R!o;|%Og2Vv765P3f68mu0VgPHco#!{b_9scc=n&sxM z@M4PG<_Tw~bYT8fiMvgAdYd^M=)Ehg!ra{t|K+maVvwQRiwzGMCY__vO6x`mTBx2V zA(wJ~QgEu=ayqv|5zK{gsj|xJqtv$-i+6wZl?P@|6v9#RD-X_^$U{Oi^?PQ;Qv6d5 z4^@#xG$EpJm?g@(ki#k64y03)7=6&;qD}9gey5tRk$#6#Z?52s<$T&VE|(=9bhVYO zXxsCqoUu8ygBtW$R%M03YCM*gJ%L#2CVB10J#CEJV_ZKYa2#|d_?>?KQ<`+U+NxFt zwmSpiiojl{FPuH-F|X`Gp6ZNbc#qbGvzW9F;~m4P;W-<+tjA}CZi(FOPsr1vXqPML z3Hn{aZ7tsQEZ)JAjLoeXuL{9ZC5F?=i!4PNt^o;Y*+I{2nup=6EcvQ?m$iT!+50>54b=|NtQW0EhYMeB1u*m;Dfkv%=$QeoK8Mb;f z2`$X)X9mKl;Co-cr6XK%(_onJVo^t9-K21L?wm5eHUhf(qb z^8@FsH%2u60@_G|t^yAsl!)z$09ye0x!@AIiCQ}F1y&oF`#>B6@P7GOb`g6=Z0+?* z-kJuXzzG>?iQqE?FG~xFJjiI#aTJmJJ7Z;&=$+523{QKNMo6DG<3!U$n;B>Uysq13 zZqt5K2;nG);$B19z7K=n-q>Ro0gO2+7BZJy6560*Z7JuT|r6Otg2If=0#kycdX6>6?Yqsi4}Y3~xJm zZ`SJf&&At|uAmaV%l4{k%(uVDD-+lg*Y;0;Qg6M{(|-a33#vbR(y-}`@q~{!5f@5)yz~Ofu=j(zk zWgEB0aDUXO6gI&)#}vtDub{+<;}H`i+3uQ^8FC3Nq|FuqYteG~RZ4a{q>YFfx6b<@ zgo*F*)CtjopV$@hM_2@@N~-Yu8WfhwPrdy2vxLr~Y;GmKWdqB5N&h-dO!Fz3>J~TA~*7ZiOoAN>cTX2GRm$EG!v83~zDGRsU zign}X?!iI5pT}5PC!Cs3PN2il5YBwobE*#u&*{16N)?TzpsC7Zig4{tU%Y0c;+D^i zI;^>hMrz``Ny>~*+VM(981YwAOeqLR?6sx5N@k{3>PE`Xx!y}3n3Jw`a^=#8ce_5$ z^Y7A_yy&}hSMU~%3#VnRQOoWRYUV}Vd4cO3`Mxt#fqAv<<;m{jLCe5HX+cXzUk8bt zB|9~^j=izJ)I7f^lox48Q`Jo~6*B8)Z!|(tFo-eHs`r>=2}Jq9=M*W}$ZMSV4X#zZ z>Z8vwUGJ3Mkxih zy0YZaNrNJ}zAz9uv|sS;H*22ZMY%CU0Pg2_Vq&inTPJy4#lL93&^hI*zzticdFVhA zk+fQFRSX?>mzo3DdgkCht9wd@HGi;AdUhP|?O+0GEuWXhfZ5Xs47}d5xJ8VfAnpS;2X>7%Dpr8#;U1>NaqExvt&| zqbb#Z@BprYm(bj8 zI;ERe_3GwTLl>D>ZTZ4MIe$wO%0n6TuHvBJU8UE7>Z5g_%~#S8M;(*zQb~-RTR)Ym z4>tu@Vx15~*=9?{&={bIjY!g;YcI?b@R5H=ZhlZOMecqzX70po>V7`aj7+h)AT+Z% z4axbR%*8RODIHn%E^BH^FxlwQ4rXxVyNs){djDfqYGk^9Xk)O=Gm_+zC&J5vh<8-45VpJF1+!2biuJe z3sgaWY@sN+#dmRmv>wPWT*giXa+=NanUIc&UxM7VYxVqggM2CP>8gjML1AQDTKmzT z!S>D9OxauP_CP_hyXW66NziN|#F5#EDm@7_Q<5N z;0NK?FAH52xYRMQr1QN%!v-WP>kFbcDhzzp=8a1NX%p!#Z|si=rGyz$SXoWr&SOaF zNG$VSwCBZ9Fo;Tt#n@fcg}b9=BE4_D9&`dt6Qt3GTj*F=TqWt&XL+Z!G)lRD62SuGPH`J z#7YPLvP4cgJ3-2bHntl3Xh%u$2jG!lj9r^CFj~#|b%={UioS=WU3_=`kUjyJQxQIaWzyq(8lN zB+L@l#`p>EAi1Ug#I8BwmM`$~VNQ{GeBS-fCjFzcX@FWmta7qdpHFc2zq-e6Y1{Lj z#OaGoU~=7>2T=7lQ^yCdx6BO2g{}@XIs9RKVFsVes4%|JJs2_H+-?8QenAk-^XGKr z{J5FS&mHcz8EHOE(aOV{ZXw&Vo(J@J0nVW)e<4N|yhDoe)Z(vz@*@IBrCi-X2f1fo z1Q>8!f+*Sb%7dz@92-xy(NYn-iqj;;<0UUr86Li$aTizM4VY0(;x2Y=)X!SE&C(_? znH!kQLkz-uO`t&^ye(-sbvD>}w%^TDulI?C?b=uVpq;p;^FPDX@nUE#_E7`7$w_DJ zx5Jp&mfRw5_Rc1trnmclJ{vD&I&i;`Nru8sTw6yHoyAPFjlh~-{d^J1z;b~sEnv9Z zCGtuGK8tHg43Q`TluRzyrG(z>7s+e)!(T(Hx3u8^AT-+~4*@!RNjJ|ROCh0A<}$I6 z50N&MD|fKmt9g#o3dI?JL%MKW42OK`&WX-LbU$EvMsyywjrn0eHXrlnwA|u%cZl1^ zEdRp1z>&>8Y2l9Q8;VuJ(f?;l;xo_w?DO7_Hm3QoE#Ts5HdZwH21`uu*7{CmndlM! zT8AlnTE6c+{$PuWXS#@QRuwJ-_>UT8Ps6>u5ZR)>^+svH$XP-khE5xX!&wNkiFLJP^ zCw&)mfFgg*fv02|&8niWCv?i$Afp^3#ARf?<#xwvnJZ!!8VRsh@Xwa{a&6N0jm(#x zzn#Oh#cXBJ)m3myN8_7PqdJ1hM{tyK9^*Z@t6RB;?2+8g_rurAFK3P~v`5nY$D8fl zMv`2uOJ+QK3y*mfkNF$y9s%sIM^x!8yJvp%bzU#8-#veMJHrAJ{%$n6C5sp7pIpu) zsx*=$UfV^dzl;&+1P>ZubOH{Mtv~XACaCh_$M_^Ez2Ng{C*6tZ{;+vFuGbokQWKGyvBi2ke3?qfuQM>Pg-^ z(SMCN3o0ueo@D&D!}p9l$=mcrhfZXUgFpUS)&LOvujC$A+&LNM7G6b3k4n zy)Q7<2Lh$~dP~Hfp}Z=-@^=4E63&L3FwDAfN%vhrUXPz9qy@lBJ?2%?{N3{NW(YcN zApA(RJ+OTS8SpBUM;rQ@ZKiFn@~oaiEiTIP&U;mmVK@{mAE|;khCyf*fKN)S4}oNj zBmO+l`Xdw=QmIv~)xmLgP=Uf#5(n@pa>QtFQNYJI<~?wHY2NG@Nh zomky-uI|XY1~6!|!b+2D415kgkF|r8cC3)y?y=7$n_uT2kjmp#e^Gg))G3hgUm>W` zu!vHsT;r4yxRS&yjDlm{vfEUgx%qdOJ4UBx+`uZ0#;kkU$3k0K7FVoFj)0m{a_lX- zxa7EA#(1(-#&{p=H?JqpcFBzC!{zAYzQ~JdV2M5IA z0QM;hCcZ%f%%+4NUM^+z-F0-v_OO!kGpUqMOs9_e{^b)vHs34eP=@qQ>t!LL=NyB< z>z%~7Tn%dNtSL7}>t62OF~v61J2bLM^9@hcesky2&cW2xT~ADk4_G#q;@JE=Ii&16-mcOMCGseruvUk8=4ONu(_m}7VUI>;HG2tdpDKH8Y0=SkIXX`tkB zJb~l!p?Xg~Y)k87i@Vb@={lM9ubQiSc#F^P33o`4DM!^ zh+={aimo^doaHz}j(-_r)J{RHgQud)H`Zd9#Do~ezx>EsO z7;=g++@96^8U^K*G2F$N{HUT`7*!00!5@I-!yhJs%eOQh3(hgBxMlBxa~Ks?v0pTV z6Q1|~3Ylki8t#?q4-+RZnB%xVowq(N+-#_hq3afrlWW`QImscgQu_ekPo4 z$=8go;qWb;{VOS(-VnM&yqfA7JH+5xWZnv@I~Tr5MP0(Tb6aG?$n|($m@Z@^UUK1D zavg}~jIf1hUneEf+`{$j?Fw;12fLN7!Y>loMT>yTFk}UjV0-mbs7V+2O{}0V*8Tp- zJ4N1aeViljw{S9|F^q6Bs2A&{nxL4a$8m3{It{6glxZ|EDGS90!dv}iGH5BTM@Ox1 zq>+83Z=;C5i@K$QbjWy z9*+{XhNLKML6=53G5PXN`H^IQP@LJ3HMe!4g~YStkzLhb5$Ddz~xbQ*?9^)qt8ClY^vU z`M$oH;onSgEH%Ok;A(s@yjIf zHHTiCAptg0Cy^N1EZ} zx=RZAmN~(St_W+W%W;_?=%kq)*>v93;@wOCoa#;ZAS&LYNbR^yDT|Y4^TiY;l_11Z z-G8Y$Dk3>PA7NrZAOyXr#xXX0&!FBReS9(N8>{TZXHIBda8gF^SF>AfaGlbWmig0>UUW<^{IIvp z+&y@3Q5w}L~hULtOnfGK#y3*-WAVArGfid6+9 zfoU#SJz{qNt*1@Ua+Bb@rzePhM$m{Ik3Gn<#S9kDo^k+!uw;Gpil%=o?;3Hkzz!i_ zYA-Q7ekLdTfm(s!m)q6;u;trgj!^DDD+Lgnr8Ep#g|O7r9B#49cYX8~8ZU&dr3>f+ z42?>SE5|sy_r9f_$k;dJ4M-@H*FNm81iA&K9fx@&0+aQaq~${kyCtAy_v|DA1j~FU zVOZ!E&ik3Ya_0!HQAv3-;&=FIyDv}y0>3Ok_*ef>Q_i?u}eK1WM zKHOqm)opsGtw(GvjHTKl<-n31a=CR|1XEBmV!&dLq=at9g2khCm^!rIPPLXwMZJX< zQ9v%0sE(%FYz^KKt+Z??+UkhkhO!aRZD5PU!JoY=Zf`q838k!8^v>5@*?OZnVMstE z5~_p}n{r9OeP&^}HR$;FWkR84-lvSLk&L^BT(!~ef1{bgl!XU-)VDqu^bEWfuZduk zr`j2q<8ZeR&Xg7-N9g>l89Vxd4(;8N;Cy4>T|Y`Rb%on(?){~<8UsRoRtkpAxI|jo zK)4Y~uvBw}5?n3pZ0Uu!UoK|q+{$^7TBtG-`A6KGiJnXGcBsLq7LA2}5~uJeE5-9%O=K%{G#$u^U5q&1BsN zZM07|u8>a(O7JD7>1YzY;FHTsl#R9Emi+tD27ovKE8Qo7LcFrK*`K$JsJBNpWDML> zWkDf&yGGyD$7@fv%4bA-RI#nV|7a>z<@b9LBcmy-%kiCEjHrlebI&LEnWfUe6PNqM zKm|4_&;3C==s;zd7o0&lY)*9sziL`Pvt{$2JV9g0)|SAO;DxiWg6p%t?>~a>H*dO%P0n!f>IoxKMqC zth8K$hGA{+KCQ7n@;M)-BxW=1W%`}X{ zSGQdPlzdh2-@~rNoONC84>U$rcdV<<9647LtVZ|Pm%5*|t|*qcR1u&aGXJ@}D7 zH-lFWZMiW;fKdT7*DX`p2HLaC2NnsE_d+s5HAJd&% z+$^MRqH3V1hiHT_YJHUUlj9|vC?I&L*@~%+InGw*2)sXzN*-cdG$ljqe!`eJ*=KY0qSpscBI39zbD*E z%G0|Gc7l1y1IV9Hzv7XUFAlW+0Y4D}D$MHmPr>@7A|tO~j+R%K#_I_R|lAM%7hWMF}%GXmA)^|2X~ zg6;bUBh(rf>OCtwJ|i`!(j`#;MHR6^N@1rrc`uTks_WR|q+%y* zRMq@iQ4GaB{4|pCa${pTP;agg9yXE3G%GAag&h^jJ|!h73UQd?XPhs26Y^S~#XyTNZyZtk(OgzLI! zPaav_`Mcm!Od4NL_ig>2b|Sv>m*Lc4lPP&vi z%Wa)cKU?DQHcsL0N?V`~mr?-mv?#VJ&M3QHJ|xXMz3H1@dKIEL*2_yD=c>cFMY^|iTIUz>~X3KhHjYRZ|_9wEA~bb45sq!97T8=e-* znA}gWYFSYBSTnvpjF1g14M`{I2LZ@yrA+e zyY|Dz0|70XBq)3?{MTucmMXOTAos{RZZLJ(C}_F!kY7K+5Q`Km{X&1AXo@LUA44)&kfg_;XSN2R9X9sbJXZB`Ooi3DGei zLafIbqjRFUmKmCiP@Gh_jwmN6+L|gb2$zpwre^#qKteaZklL~I zqY)9P?5{64S_z_#a9iy&*Zq7ce#o-VKFSTp67ecq9rk^QQHgd-}X}JaJ#&vc6bGFLol$<21=dksqaeoY2z!QTLpoB%7 zZXx43gR;k7wnBkvEMz6-*gPy5R$PsQ_?_X#I&4NwBe9Al4(~#Bv+{ZHAfh&#oF~eA z1?Sh@2}Fo8_P~u)I(3CCzV8ECc{OFCBT8EOT#Pqh9J(v|;4OlYh3MN~#T1?H9 zr^hGQ&kWbw_ig*6TP(CvBlqNh64gTh&7z{)LYhd?W{Y9L$o}EI5aU!1r*b4B#urB- zrMVPGBDPC$JkHbdLQ6Sbx$Y1TtHh8cS~^+i;|NSLrT8UFSHbbXV?br_Qq#1Tp+{C+ zNEndc^nN0J6lARMty!nJyX!ajcg&~q_F$|{UkFlbYVdDdS=gmLO1dB z{(P7)DcoY69-QN#ALi|ZGwy+RX&o}1!-T&?rp@w*@38Ku!3QGEF*|7oj){^)A)Ekp zOE5H&7qkUfb(-#5;3F9;H5^s~?O*dA4|)Rm zz`<)W!+*SG$ojji!EG&yacNI7QmQn;d%8T{u;&>O>6RW&fc|T$0QIm9( z`onipk@SbZh9&e1zt&O``1V08s1|ZuN zZw|C?XA(~o0Gm}=+B?>83Z$UvopkRG zgs1xYeiqJZGnTCA3O^*_!rHn?B-~8FkIh+LpRakpJYDS?~ra%sgV z>8OB=ctAPMVv#Vd*-GH#KI!W=SFKSZwb_{(QHW*q87QCq-mj8BEl&Vj#XjG&C zEbQNBzOO>wL&cB3{KiWUO3W+XPT!S~@esyO(ygM9oxdjW8D>$%Z{=SHoEFEmlK4I_ z)*RxPa9siA^STW=9AY>(B?iG=T4k;_nDU!?tkXjWIf<;>;2?k{qLPCI24QBAxt_TU( z^#UzPb=S3(LiDk_TNEZ}+wDqW25W7tTV{gRT3eVoCszr{^!NQwBIx?;)f?P8`B_JevLV#t#|3!d$j-Yt)u5d-`N&R%_qQ%BSo5h z=K;LP=>izX0t8iu^4~7jlydhqG{6kP50+=uvEex za*x#C{wwo(%AAqtWh{W`(< zI2>tMEW8*M&KwuO|HPDHyp<<)(0Gap1|W5Jg3xfz3Y0GINa6&DQX+&ji4VZP&Abm8 z-#XiLk3HDeYVXjGWN<8ooD;JXTjJAVNsf;Gvl*7yUu_qsR1+b^Rf84SsQ_%W@MX#ac?DjJ^b=WGBt> zw8VWp-6Hekbk_&kGD~a!=_{hIYiGY}I}ECGp;d=tJ( z8yyAQ337cAADXN1A-5Q_s)n6{*QxokSMHJdvWh&m=M${@xWs~LzF2ln*N$ASedR7Q zCEyDaIj;rV2VQASBB*12>uS7$4U;tpLUcL5@cSk&_M} zg`GbSzNQ5&Z38=g;~Ti8Ytrz!N3<{Jj=CaNckCBpNw#bt6NFfr8xS7v8e0YI=7K=p zAz=h()g_8B8I8Og1aZuMfrTY?Ri_lG#lz2t99gI#fJpf%aIuVD$e*#K(#U8XVjvG= zX<8GIJ`#J4`-j7FWL(I&a0}euQ?w<2I@lg`dfgLMBZ^O)(JZONwGJqlza{LgOmQ za|w-5MVYpDzb81}PW3LN|A9~JH>u*`xNn%_jXq4&FHQs^k~^TwFWAp z>r!cq7Q}ZS?khHP;OHVqrO0J-6IuAy_r1aVjD&MIp3lt)``rmw>@WQX>p8>gsGII| z&5P=1OP$Vg_!L``FAo$r5)8v$9Nz=Vcb9q|T7ee`1W2ZnzLgGo9=AidBI` zxU+{5Dk+p`^Sr$xULwP+*ep^d0Wx3%KM+NY+Qg)Tfl)M_Jw3J3HpI6pT*OoR)Wkxmp7o243i}FNG1a z5HPCc*ycuL%wr%WHkuL((n^QXDbp~CZVk|a5>nM&;c7KfMO~7*@LDOyAaMh=fY?|p z_Pd6Cs3bG2s!!U`$RP<9F5JW}#!^ot<1Boq_w<$2l$0g%n4DA0-w#sbf5^I%`ZT@V z?P%-ou*dq#MM!Lh#>FOJmpfjCDbu3xZZR;lUd%5)kDjQ8Hxlz(C9!0eBl}W_-HK*G z$+PCF_9f(_!p6gJfv!{;$V4soH_o5Rz23&kz0Nt2{)yy-McqFST9#?%w%!hlHc^}j zFB`sJYzbT9Iq{n!6WpHoRiSK}PnlazT#XlDcwaL>$IYKPKgL)&K^+LbaBp>w<5?)0 z6)P;eF|Ncal@th4FjDdAq)jll$=Yz4OpCjx3h&*cH!7;%nQko+D3hYoiMe ziVX&OkSgN7ZH?jL$q5jJrozNFU-Tz^C#ziIR87ef4;TqqG?(MgIcYnI0Cr@VJYg)x zJ=(9fZ)~J_8V{x3^w2Zori3=^DZrkblhha}qErPNls_h`r6xCe2UV2v)E6r^ae3^D zKr{5yWL4_HV;5A1T~K3Fr9#uVdAw95=8TK1{=)0Q2y*U^r;5;&% z2H&)~+ZTf}KiAaVy#XTm-1Xu9!p1~tcqE0mA}gL5`;vQG&=R6}DMZun%tTUrsz=L+ zOqdz8|I7N0!p=xa{PxJv8RDh-qJgN{RorC&=p~e1D8;29A*!bzL@x7s&4WVX0Hjb3z6F#jDVc@AHOM%JrtFq+ewNoT zu;+Bap3f)Y%;W7kZ(z@FD(qQhWnj-nn7YoLSna{bNBeQAmJtZ*`L5V;ZCzbnyezRE zRb{UP zBBif<>q??oYL3W9!QfYHk!o46tr8YCm1w-o+A79mTGK5(iuTI*sO!C?=MQxyF3v2= z{u~NRBBwH9Qdu&r-y>Z6@M@_?95oI&WPjR(vvM*ThufezYhE2^;?41*$S!KrUcTN* z=Zi}mQ9(jwK`|L+Pg3b6nFFCKV|;KdsNHQiB)mivo@wM8q*S7U_#*b9N_Y#jC8jha z-(#sH1f_KC0-L$lC+C=J&-j>(T=G+V-0I-{^qYZ@Qpecg=OQW5w`>K6D*H~1SgtQ> z>lvig$KdMQ(w+hjjO&35L}5-y$dX!Yzskf!$HnL+sJA65+nXdDSV&dI=R#7^&yF zE1Kdy6|eYArl(DR#7n(h#tANYiI+NWgt+DQ2*3Tfm3h1^z{A z^f(kenROu>iS;5XA{TuxK6TFxG@4G{N$&l^iHjcS4qbQU)&fe<0FH4D5xt-^DV z0z#)wBA}xlq6AzE1;@qK)?!ylRHQsXh+-Fx^{VDS8Kxj5LLsb5o+=S)>f2Xw+$gOL zFI7z}zION{&GUU%5%+775%l{Em^nQ?or?|*a@D~>@1nqBxhztl^i<+6#Qa>ke2Kbr;lh=w1e2eHGw?OZR|@V2 z8@RETfVH@8E)hVU-(;F?vedN?t$l*)udv-T&w@#CPP9jlnU5UNw)$#zr-g_8(TFW) zg{j!|peC`%q-1*ir&_GME;h5*eOT9Lu)o2TQ_tRG4O(p6yXF4%03TSqZOeIuAj9u{XfoI8qc!Z!*p7 z&NJr@t$k9i=U7!0J#D%B3j^uYX8pOa7)ZmTpPUK( zk~6c@K(QJz!L=r9Rr}C~a?SeB9e-fh{E+oRVRkIX-}{m4bY`1#DCHl`qc=sD+baUk zYU0bxGf4sDW0|PKkcZ8qRtcWqJO+Qu*(mB{&>vo|@camxuxK{TH%;?@r*G|3^8HT7 zA#FjYR&H+78)i{gH#_#4?ln&t{$hG!c3?33tq`!<$!UrFz}t?uXOU)h^WgY;0>eoP z!Isy|H>(LH*%xG;@dGtEle(gpIqgrXQ~RmRlc!cP0!}7$x|+or|j?MDa*H~IQep8nW-T{PvK2TW=BFN%%KFPLJkD ze3G%>;d{2CeW>`7^=aRpU-0O=c1v7@W`NHS}rnEM)FYsIVJ`#YnwCPnHLBPi>>EaM< z><3cBKbC^aJAzzqmY_=D24vSNLxqA-pG1MpdB%od=l}#Yyh7q|=8-71)ITQDeYm!$ z8jG@y?{b}oly+$ysK)G4&VOV0<(jV1uVpU_k1UP8)o(izLS-G=pK3c0Ogmr3MivBAK+OJB^h-kK7x0i~M{0y(UyfQyn{FC*n!vFDewH z81Ty;h`UNI7#H#=cI?JlURJ)(QnI$Mb}t`S*gbRz#bl?oZ=0`wXLtY7N)mxG=E)5s z+bre22YVF3lFag8;lakz&k5xvt7CV?n#IXT9D%wV2*?@|%^>u|M$qw#78JyZ%(UT9B-WWILrs zEcOzagL&786hVH+VU1g1#}t<}r|F2Q7pdJR-yv^u;?~;efYW|^%zDG`ueIJ7OG5n| z!T_e+66rV38J*55eSVjJ?snzbbZm;GEC1AaZbWtXBKO zbNacgOf+Ei{BC|Y6Y}7 z`%hZYt=%6}gyKBwCERmr=2e_?F5r%qXteKSQ?wSljN)*0g{keLoF02BLT0n-UJ4Z> zXB#!ac<2#a;kBHiR|N>Yj{g)Q6?u5Y69qe8h1ao7u6W|zGw+ac@ad6v-+SZUtKc#! z9(m)`hbQFY?uyON7aUN~dBH;QsG=N@ERsSESa>4XsaS*RO_e3IHmR*MmH1ZsYloup zELYfeu6JzEPhSPe}>oq+-( zNnqbnTP6F*Z-5KXfXK$Fwhzu7HybAy5dT=bzSZv9q1x}s_d(b?Ck!~(M;xu%te*Q) zG9vcXh$NQK`eHZDCBqNQHTiw7A6qH2!!dR$sOboaE?dEN(F0rD1~l*XQZ@yys17xM zk{|VqWaE^tfRBDC-?zzWLHY#{b#f)9*ky@Qe5XK}lBp2MN-XB2%Slgsxe7Ij$F^bc z5I$6itE=M8iB<8fc-3X{f8^OhTDk2Mzt>oAZ^b#~ch-%g{^*&3pri03YOMXHrm59iM+w)Woe6-aCcty>MC(` z5lPK7V{kZjvarW;kX)1L-vZ*xvG)6n5AUR<+iIidF`pc{=wmWhd`#B;z|(<`363mP zUU6iZ8zWhwGsO(2ckr*b`lG)a)K1K^N-e9s@V^F~6PEcGXl1+fqNz5Opdl&_yiqo%-X z%g>KpY5l$zaJ(T4f8~|e$MjR$;h9f@v)+u-B&Q)(Xw859(Brnl8#=w6ZZdB*iA}PmNPAw6Ot7sl~OvYHBf=0pwcOh?3&5!mjl z9E!@A7MVTfS3~)UoY3K*ZCdy09<_0plkBOOAQ8(*JR^b!f<87A&JnPsisy%FJNUaT z!oL%QxFr&Cd)9t4>KfG9?>vcZuFBplQn9Z0W1DK@ljYM}>XWqYnmta@O=^H}NL1)Q4U6Sk;7V=}MLnh0vP9wWkgU zUu`EJ@m=xQcZ}Xop;oyyM0blHAF{p>Y}Dru=75-Z%%R?MSA>UWMtAodtd9N(zsa*T z)?iz;HOt~;_A4+sC=|3+6ag_>M>i}AZn~@M~RSAq)SvvVryl1 z?#4=}KAYj^%P|UdGu@!VMJ{R-nNf18=mZgkWGJU6DKzns(Q`cT7iGS0JmB2P{VzKG&0JWsX5+DH*fKCkp zsj=#f%A}Wg-O&7=s+a-l;uq9{B1`!xRm3Giu!|x>5~ftn)Fc^-q)ft#g4aqF2iOMqkoTHs?m)(#xF_9@m4;hOEf0<~D@|!Vq@3f;e7p^(G2r440eM`Nr#EWtT&hmLwqwELthS2%8He#8P5pE$P=| tyBys@HZ-F&?L=kLr0fg`=Me=8wxpDi66g!P2$&#-Mlu4UL$YWa{ssUu5;6b) literal 0 HcmV?d00001 diff --git a/flash0/font/ltn8.pgf b/flash0/font/ltn8.pgf new file mode 100644 index 0000000000000000000000000000000000000000..a07a1f718e8d1c00ce82e476986ad5ea3de3040a GIT binary patch literal 51432 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

qgKGdnN01o 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 Q^vLLK0Wc4%hX4Qo literal 0 HcmV?d00001 diff --git a/flash0/font/ltn9.pgf b/flash0/font/ltn9.pgf new file mode 100644 index 0000000000000000000000000000000000000000..11132d1a32e944944e72f20db038c4f93236f641 GIT binary patch literal 50116 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 R7sNf#{INr^_GKr>{x=Z0F>wF@ literal 0 HcmV?d00001 From c0e8fb1499194b623beca836b4fd318295186588 Mon Sep 17 00:00:00 2001 From: Henrik Rydgard Date: Wed, 27 Feb 2013 17:52:51 +0100 Subject: [PATCH 200/347] Revert turning on debug thing --- Common/LogManager.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Common/LogManager.cpp b/Common/LogManager.cpp index f47521917333..956a1ae2391d 100644 --- a/Common/LogManager.cpp +++ b/Common/LogManager.cpp @@ -27,8 +27,8 @@ #endif // Unfortunately this is quite slow. +#define LOG_MSC_OUTPUTDEBUG false // #define LOG_MSC_OUTPUTDEBUG true -#define LOG_MSC_OUTPUTDEBUG true void GenericLog(LogTypes::LOG_LEVELS level, LogTypes::LOG_TYPE type, const char *file, int line, const char* fmt, ...) From f750724deacb8b28ade0e699418bddd9eb599f6c Mon Sep 17 00:00:00 2001 From: Sacha Date: Thu, 28 Feb 2013 10:28:29 +1000 Subject: [PATCH 201/347] Fix iOS assets. Thanks rock88 --- ios/ViewController.mm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ios/ViewController.mm b/ios/ViewController.mm index da3699e19449..4b53a3e612e2 100644 --- a/ios/ViewController.mm +++ b/ios/ViewController.mm @@ -55,7 +55,7 @@ - (id)init self.touches = [[[NSMutableArray alloc] init] autorelease]; self.documentsPath = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) objectAtIndex:0]; - self.bundlePath = [[[NSBundle mainBundle] resourcePath] stringByAppendingString:@"/assets"]; + self.bundlePath = [[[NSBundle mainBundle] resourcePath] stringByAppendingString:@"/assets/"]; memset(&input_state, 0, sizeof(input_state)); From b4891fb7a735de0f07e263505387db9d6fe08d21 Mon Sep 17 00:00:00 2001 From: "Unknown W. Brackets" Date: Tue, 26 Feb 2013 07:57:58 -0800 Subject: [PATCH 202/347] Error checking in sceKernelAllocPartitionMemory(). Before, it was still returning a uid on fail, oops. --- Core/HLE/FunctionWrappers.h | 5 +++++ Core/HLE/sceKernelMemory.cpp | 43 +++++++++++++++++++++++++++--------- 2 files changed, 37 insertions(+), 11 deletions(-) diff --git a/Core/HLE/FunctionWrappers.h b/Core/HLE/FunctionWrappers.h index 85468754b8cf..e4e80b66311a 100644 --- a/Core/HLE/FunctionWrappers.h +++ b/Core/HLE/FunctionWrappers.h @@ -313,6 +313,11 @@ template void WrapI_IIII() { RETURN(retval); } +template void WrapI_ICIUU() { + int retval = func(PARAM(0), Memory::GetCharPointer(PARAM(1)), PARAM(2), PARAM(3), PARAM(4)); + RETURN(retval); +} + template void WrapI_IIU() { int retval = func(PARAM(0), PARAM(1), PARAM(2)); RETURN(retval); diff --git a/Core/HLE/sceKernelMemory.cpp b/Core/HLE/sceKernelMemory.cpp index b4d8f9d9d95a..da8676d66475 100644 --- a/Core/HLE/sceKernelMemory.cpp +++ b/Core/HLE/sceKernelMemory.cpp @@ -449,29 +449,50 @@ void sceKernelTotalFreeMemSize() RETURN(retVal); } -void sceKernelAllocPartitionMemory() +int sceKernelAllocPartitionMemory(int partition, const char *name, int type, u32 size, u32 addr) { - int partid = PARAM(0); - const char *name = Memory::GetCharPointer(PARAM(1)); - int type = PARAM(2); - u32 size = PARAM(3); - int addr = PARAM(4); //only if type includes ADDR + if (name == NULL) + { + WARN_LOG(HLE, "%08x=sceKernelAllocPartitionMemory(): invalid name", SCE_KERNEL_ERROR_ERROR); + return SCE_KERNEL_ERROR_ERROR; + } + if (size == 0) + { + WARN_LOG(HLE, "%08x=sceKernelAllocPartitionMemory(): invalid size %x", SCE_KERNEL_ERROR_MEMBLOCK_ALLOC_FAILED, size); + return SCE_KERNEL_ERROR_MEMBLOCK_ALLOC_FAILED; + } + if (partition < 1 || partition > 9 || partition == 7) + { + WARN_LOG(HLE, "%08x=sceKernelAllocPartitionMemory(): invalid partition %x", SCE_KERNEL_ERROR_ILLEGAL_ARGUMENT, partition); + return SCE_KERNEL_ERROR_ILLEGAL_ARGUMENT; + } + // We only support user right now. + if (partition != 2 && partition != 5 && partition != 6) + { + WARN_LOG(HLE, "%08x=sceKernelAllocPartitionMemory(): invalid partition %x", SCE_KERNEL_ERROR_ILLEGAL_PARTITION, partition); + return SCE_KERNEL_ERROR_ILLEGAL_PARTITION; + } + if (type < 0 || type > 4) + { + WARN_LOG(HLE, "%08x=sceKernelAllocPartitionMemory(): invalid type %x", SCE_KERNEL_ERROR_ILLEGAL_MEMBLOCKTYPE, type); + return SCE_KERNEL_ERROR_ILLEGAL_MEMBLOCKTYPE; + } - PartitionMemoryBlock *block = new PartitionMemoryBlock(&userMemory, size, type==1); + PartitionMemoryBlock *block = new PartitionMemoryBlock(&userMemory, size, type == 1 || type == 4); if (!block->IsValid()) { ERROR_LOG(HLE, "ARGH! sceKernelAllocPartitionMemory failed"); - RETURN(-1); + return SCE_KERNEL_ERROR_MEMBLOCK_ALLOC_FAILED; } SceUID uid = kernelObjects.Create(block); strncpy(block->name, name, 32); DEBUG_LOG(HLE,"%i = sceKernelAllocPartitionMemory(partition = %i, %s, type= %i, size= %i, addr= %08x)", - uid, partid,name,type,size,addr); + uid, partition, name, type, size, addr); if (type == 2) ERROR_LOG(HLE, "ARGH! sceKernelAllocPartitionMemory wants a specific address"); - RETURN(uid); //for now + return uid; } void sceKernelFreePartitionMemory() @@ -1135,7 +1156,7 @@ const HLEFunction SysMemUserForUser[] = { {0xA291F107,sceKernelMaxFreeMemSize,"sceKernelMaxFreeMemSize"}, {0xF919F628,sceKernelTotalFreeMemSize,"sceKernelTotalFreeMemSize"}, {0x3FC9AE6A,WrapU_V,"sceKernelDevkitVersion"}, - {0x237DBD4F,sceKernelAllocPartitionMemory,"sceKernelAllocPartitionMemory"}, //(int size) ? + {0x237DBD4F,WrapI_ICIUU,"sceKernelAllocPartitionMemory"}, //(int size) ? {0xB6D61D02,sceKernelFreePartitionMemory,"sceKernelFreePartitionMemory"}, //(void *ptr) ? {0x9D9A5BA1,sceKernelGetBlockHeadAddr,"sceKernelGetBlockHeadAddr"}, //(void *ptr) ? {0x13a5abef,sceKernelPrintf,"sceKernelPrintf 0x13a5abef"}, From 9eeb3d6ffda9997c8c8eae487574229b5dd0074b Mon Sep 17 00:00:00 2001 From: "Unknown W. Brackets" Date: Tue, 26 Feb 2013 08:09:40 -0800 Subject: [PATCH 203/347] Support the other allocation types. --- Core/HLE/sceKernelMemory.cpp | 22 ++++++++++++++++++---- 1 file changed, 18 insertions(+), 4 deletions(-) diff --git a/Core/HLE/sceKernelMemory.cpp b/Core/HLE/sceKernelMemory.cpp index da8676d66475..1b6243f6c592 100644 --- a/Core/HLE/sceKernelMemory.cpp +++ b/Core/HLE/sceKernelMemory.cpp @@ -390,6 +390,14 @@ void sceKernelReferFplStatus() ////////////////////////////////////////////////////////////////////////// //00:49:12 ector, well the partitions are 1 = kernel, 2 = user, 3 = me, 4 = kernel mirror :) +enum MemblockType +{ + PSP_SMEM_Low = 0, + PSP_SMEM_High = 1, + PSP_SMEM_Addr = 2, + PSP_SMEM_LowAligned = 3, + PSP_SMEM_HighAligned = 4, +}; class PartitionMemoryBlock : public KernelObject { @@ -404,14 +412,20 @@ class PartitionMemoryBlock : public KernelObject static u32 GetMissingErrorCode() { return SCE_KERNEL_ERROR_UNKNOWN_MPPID; } /// ???? int GetIDType() const { return PPSSPP_KERNEL_TMID_PMB; } - PartitionMemoryBlock(BlockAllocator *_alloc, u32 size, bool fromEnd) + PartitionMemoryBlock(BlockAllocator *_alloc, u32 size, MemblockType type, u32 alignment) { alloc = _alloc; // 0 is used for save states to wake up. if (size != 0) { - address = alloc->Alloc(size, fromEnd, "PMB"); + if (type == PSP_SMEM_Addr) + address = alloc->AllocAt(alignment, size, "PMB"); + // TODO: Check if size is upaligned? + else if (type == PSP_SMEM_LowAligned || type == PSP_SMEM_HighAligned) + address = alloc->AllocAligned(size, alignment, type == PSP_SMEM_HighAligned, "PMB"); + else + address = alloc->Alloc(size, type == PSP_SMEM_High, "PMB"); alloc->ListBlocks(); } } @@ -478,7 +492,7 @@ int sceKernelAllocPartitionMemory(int partition, const char *name, int type, u32 return SCE_KERNEL_ERROR_ILLEGAL_MEMBLOCKTYPE; } - PartitionMemoryBlock *block = new PartitionMemoryBlock(&userMemory, size, type == 1 || type == 4); + PartitionMemoryBlock *block = new PartitionMemoryBlock(&userMemory, size, (MemblockType)type, addr); if (!block->IsValid()) { ERROR_LOG(HLE, "ARGH! sceKernelAllocPartitionMemory failed"); @@ -740,7 +754,7 @@ KernelObject *__KernelMemoryVPLObject() KernelObject *__KernelMemoryPMBObject() { // TODO: We could theoretically handle kernelMemory too, but we don't support that now anyway. - return new PartitionMemoryBlock(&userMemory, 0, true); + return new PartitionMemoryBlock(&userMemory, 0, PSP_SMEM_Low, 0); } // VPL = variable length memory pool From d02879dbafc05b817095db063ae9ed3843e9bec2 Mon Sep 17 00:00:00 2001 From: "Unknown W. Brackets" Date: Wed, 27 Feb 2013 22:35:08 -0800 Subject: [PATCH 204/347] Fix PMB alignment and cleanup free/get. --- Core/HLE/sceKernel.h | 1 + Core/HLE/sceKernelMemory.cpp | 32 +++++++++++++++++++------------- 2 files changed, 20 insertions(+), 13 deletions(-) diff --git a/Core/HLE/sceKernel.h b/Core/HLE/sceKernel.h index 17911153d98e..65df209f356c 100644 --- a/Core/HLE/sceKernel.h +++ b/Core/HLE/sceKernel.h @@ -87,6 +87,7 @@ enum SCE_KERNEL_ERROR_ILLEGAL_CHUNK_ID = 0x800200de, SCE_KERNEL_ERROR_NOCHUNK = 0x800200df, SCE_KERNEL_ERROR_NO_FREECHUNK = 0x800200e0, + SCE_ERROR_KERNEL_ILLEGAL_ALIGNMENT_SIZE = 0x800200e4, SCE_KERNEL_ERROR_LINKERR = 0x8002012c, SCE_KERNEL_ERROR_ILLEGAL_OBJECT = 0x8002012d, SCE_KERNEL_ERROR_UNKNOWN_MODULE = 0x8002012e, diff --git a/Core/HLE/sceKernelMemory.cpp b/Core/HLE/sceKernelMemory.cpp index 1b6243f6c592..77c35dbd7fc6 100644 --- a/Core/HLE/sceKernelMemory.cpp +++ b/Core/HLE/sceKernelMemory.cpp @@ -409,7 +409,7 @@ class PartitionMemoryBlock : public KernelObject int sz = alloc->GetBlockSizeFromAddress(address); sprintf(ptr, "MemPart: %08x - %08x size: %08x", address, address + sz, sz); } - static u32 GetMissingErrorCode() { return SCE_KERNEL_ERROR_UNKNOWN_MPPID; } /// ???? + static u32 GetMissingErrorCode() { return SCE_KERNEL_ERROR_UNKNOWN_UID; } int GetIDType() const { return PPSSPP_KERNEL_TMID_PMB; } PartitionMemoryBlock(BlockAllocator *_alloc, u32 size, MemblockType type, u32 alignment) @@ -420,8 +420,10 @@ class PartitionMemoryBlock : public KernelObject if (size != 0) { if (type == PSP_SMEM_Addr) + { + alignment &= ~0xFF; address = alloc->AllocAt(alignment, size, "PMB"); - // TODO: Check if size is upaligned? + } else if (type == PSP_SMEM_LowAligned || type == PSP_SMEM_HighAligned) address = alloc->AllocAligned(size, alignment, type == PSP_SMEM_HighAligned, "PMB"); else @@ -431,7 +433,8 @@ class PartitionMemoryBlock : public KernelObject } ~PartitionMemoryBlock() { - alloc->Free(address); + if (address != (u32)-1) + alloc->Free(address); } bool IsValid() {return address != (u32)-1;} BlockAllocator *alloc; @@ -491,6 +494,12 @@ int sceKernelAllocPartitionMemory(int partition, const char *name, int type, u32 WARN_LOG(HLE, "%08x=sceKernelAllocPartitionMemory(): invalid type %x", SCE_KERNEL_ERROR_ILLEGAL_MEMBLOCKTYPE, type); return SCE_KERNEL_ERROR_ILLEGAL_MEMBLOCKTYPE; } + // Alignment is only allowed for powers of 2. + if ((type == 3 || type == 4) && ((addr & (addr - 1)) != 0 || addr == 0)) + { + WARN_LOG(HLE, "%08x=sceKernelAllocPartitionMemory(): invalid alignment %x", SCE_ERROR_KERNEL_ILLEGAL_ALIGNMENT_SIZE, addr); + return SCE_ERROR_KERNEL_ILLEGAL_ALIGNMENT_SIZE; + } PartitionMemoryBlock *block = new PartitionMemoryBlock(&userMemory, size, (MemblockType)type, addr); if (!block->IsValid()) @@ -509,29 +518,26 @@ int sceKernelAllocPartitionMemory(int partition, const char *name, int type, u32 return uid; } -void sceKernelFreePartitionMemory() +int sceKernelFreePartitionMemory(SceUID id) { - SceUID id = PARAM(0); DEBUG_LOG(HLE,"sceKernelFreePartitionMemory(%d)",id); - RETURN(kernelObjects.Destroy(id)); + return kernelObjects.Destroy(id); } -void sceKernelGetBlockHeadAddr() +u32 sceKernelGetBlockHeadAddr(SceUID id) { - SceUID id = PARAM(0); - u32 error; PartitionMemoryBlock *block = kernelObjects.Get(id, error); if (block) { DEBUG_LOG(HLE,"%08x = sceKernelGetBlockHeadAddr(%i)", block->address, id); - RETURN(block->address); + return block->address; } else { ERROR_LOG(HLE,"sceKernelGetBlockHeadAddr failed(%i)", id); - RETURN(error); + return 0; } } @@ -1171,8 +1177,8 @@ const HLEFunction SysMemUserForUser[] = { {0xF919F628,sceKernelTotalFreeMemSize,"sceKernelTotalFreeMemSize"}, {0x3FC9AE6A,WrapU_V,"sceKernelDevkitVersion"}, {0x237DBD4F,WrapI_ICIUU,"sceKernelAllocPartitionMemory"}, //(int size) ? - {0xB6D61D02,sceKernelFreePartitionMemory,"sceKernelFreePartitionMemory"}, //(void *ptr) ? - {0x9D9A5BA1,sceKernelGetBlockHeadAddr,"sceKernelGetBlockHeadAddr"}, //(void *ptr) ? + {0xB6D61D02,WrapI_I,"sceKernelFreePartitionMemory"}, //(void *ptr) ? + {0x9D9A5BA1,WrapU_I,"sceKernelGetBlockHeadAddr"}, //(void *ptr) ? {0x13a5abef,sceKernelPrintf,"sceKernelPrintf 0x13a5abef"}, {0x7591c7db,&WrapV_I,"sceKernelSetCompiledSdkVersion"}, {0x342061E5,&WrapV_I,"sceKernelSetCompiledSdkVersion370"}, From 4631fd7c6fdbb24412a4ae817792000d27b7180f Mon Sep 17 00:00:00 2001 From: "Unknown W. Brackets" Date: Wed, 27 Feb 2013 22:35:53 -0800 Subject: [PATCH 205/347] Keep track of the PMB name like other objects. --- Core/HLE/sceKernelMemory.cpp | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/Core/HLE/sceKernelMemory.cpp b/Core/HLE/sceKernelMemory.cpp index 77c35dbd7fc6..69e221234a99 100644 --- a/Core/HLE/sceKernelMemory.cpp +++ b/Core/HLE/sceKernelMemory.cpp @@ -412,9 +412,11 @@ class PartitionMemoryBlock : public KernelObject static u32 GetMissingErrorCode() { return SCE_KERNEL_ERROR_UNKNOWN_UID; } int GetIDType() const { return PPSSPP_KERNEL_TMID_PMB; } - PartitionMemoryBlock(BlockAllocator *_alloc, u32 size, MemblockType type, u32 alignment) + PartitionMemoryBlock(BlockAllocator *_alloc, const char *_name, u32 size, MemblockType type, u32 alignment) { alloc = _alloc; + strncpy(name, _name, 32); + name[31] = '\0'; // 0 is used for save states to wake up. if (size != 0) @@ -422,12 +424,12 @@ class PartitionMemoryBlock : public KernelObject if (type == PSP_SMEM_Addr) { alignment &= ~0xFF; - address = alloc->AllocAt(alignment, size, "PMB"); + address = alloc->AllocAt(alignment, size, name); } else if (type == PSP_SMEM_LowAligned || type == PSP_SMEM_HighAligned) - address = alloc->AllocAligned(size, alignment, type == PSP_SMEM_HighAligned, "PMB"); + address = alloc->AllocAligned(size, alignment, type == PSP_SMEM_HighAligned, name); else - address = alloc->Alloc(size, type == PSP_SMEM_High, "PMB"); + address = alloc->Alloc(size, type == PSP_SMEM_High, name); alloc->ListBlocks(); } } @@ -501,7 +503,7 @@ int sceKernelAllocPartitionMemory(int partition, const char *name, int type, u32 return SCE_ERROR_KERNEL_ILLEGAL_ALIGNMENT_SIZE; } - PartitionMemoryBlock *block = new PartitionMemoryBlock(&userMemory, size, (MemblockType)type, addr); + PartitionMemoryBlock *block = new PartitionMemoryBlock(&userMemory, name, size, (MemblockType)type, addr); if (!block->IsValid()) { ERROR_LOG(HLE, "ARGH! sceKernelAllocPartitionMemory failed"); @@ -760,7 +762,7 @@ KernelObject *__KernelMemoryVPLObject() KernelObject *__KernelMemoryPMBObject() { // TODO: We could theoretically handle kernelMemory too, but we don't support that now anyway. - return new PartitionMemoryBlock(&userMemory, 0, PSP_SMEM_Low, 0); + return new PartitionMemoryBlock(&userMemory, "", 0, PSP_SMEM_Low, 0); } // VPL = variable length memory pool From 3bde874bf86e41e3af13b45f651b39a01a591d3a Mon Sep 17 00:00:00 2001 From: "Unknown W. Brackets" Date: Wed, 27 Feb 2013 22:54:41 -0800 Subject: [PATCH 206/347] Test update. --- pspautotests | 2 +- test.py | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/pspautotests b/pspautotests index 24620b2ae15d..7211f79d7df7 160000 --- a/pspautotests +++ b/pspautotests @@ -1 +1 @@ -Subproject commit 24620b2ae15d640bdb74cb2f455152855629d2b0 +Subproject commit 7211f79d7df7dc8efc59d3d568a2cbd41772136c diff --git a/test.py b/test.py index f2f4abbe2b4d..d2836664b587 100755 --- a/test.py +++ b/test.py @@ -162,6 +162,7 @@ def target(): "io/iodrv/iodrv", "modules/loadexec/loader", "rtc/rtc", + "sysmem/partition", "sysmem/sysmem", "umd/io/umd_io", "umd/raw_access/raw_access", From eab7777ec33b471fd80b5a5541eb201c81e2ba2f Mon Sep 17 00:00:00 2001 From: "Unknown W. Brackets" Date: Wed, 27 Feb 2013 23:01:44 -0800 Subject: [PATCH 207/347] Clean up some magic numbers, oops. --- Core/HLE/sceKernelMemory.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Core/HLE/sceKernelMemory.cpp b/Core/HLE/sceKernelMemory.cpp index 69e221234a99..6d77dec45047 100644 --- a/Core/HLE/sceKernelMemory.cpp +++ b/Core/HLE/sceKernelMemory.cpp @@ -491,13 +491,13 @@ int sceKernelAllocPartitionMemory(int partition, const char *name, int type, u32 WARN_LOG(HLE, "%08x=sceKernelAllocPartitionMemory(): invalid partition %x", SCE_KERNEL_ERROR_ILLEGAL_PARTITION, partition); return SCE_KERNEL_ERROR_ILLEGAL_PARTITION; } - if (type < 0 || type > 4) + if (type < PSP_SMEM_Low || type > PSP_SMEM_HighAligned) { WARN_LOG(HLE, "%08x=sceKernelAllocPartitionMemory(): invalid type %x", SCE_KERNEL_ERROR_ILLEGAL_MEMBLOCKTYPE, type); return SCE_KERNEL_ERROR_ILLEGAL_MEMBLOCKTYPE; } // Alignment is only allowed for powers of 2. - if ((type == 3 || type == 4) && ((addr & (addr - 1)) != 0 || addr == 0)) + if ((type == PSP_SMEM_LowAligned || type == PSP_SMEM_HighAligned) && ((addr & (addr - 1)) != 0 || addr == 0)) { WARN_LOG(HLE, "%08x=sceKernelAllocPartitionMemory(): invalid alignment %x", SCE_ERROR_KERNEL_ILLEGAL_ALIGNMENT_SIZE, addr); return SCE_ERROR_KERNEL_ILLEGAL_ALIGNMENT_SIZE; From 1e3f5477c30fe0bbc58976e6a036e5475f45895a Mon Sep 17 00:00:00 2001 From: "Unknown W. Brackets" Date: Thu, 28 Feb 2013 00:19:07 -0800 Subject: [PATCH 208/347] Don't leak block on allocation failure. --- Core/HLE/sceKernelMemory.cpp | 1 + pspautotests | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/Core/HLE/sceKernelMemory.cpp b/Core/HLE/sceKernelMemory.cpp index 6d77dec45047..ab44bad4fcf2 100644 --- a/Core/HLE/sceKernelMemory.cpp +++ b/Core/HLE/sceKernelMemory.cpp @@ -506,6 +506,7 @@ int sceKernelAllocPartitionMemory(int partition, const char *name, int type, u32 PartitionMemoryBlock *block = new PartitionMemoryBlock(&userMemory, name, size, (MemblockType)type, addr); if (!block->IsValid()) { + delete block; ERROR_LOG(HLE, "ARGH! sceKernelAllocPartitionMemory failed"); return SCE_KERNEL_ERROR_MEMBLOCK_ALLOC_FAILED; } diff --git a/pspautotests b/pspautotests index 7211f79d7df7..a9c949b87dc6 160000 --- a/pspautotests +++ b/pspautotests @@ -1 +1 @@ -Subproject commit 7211f79d7df7dc8efc59d3d568a2cbd41772136c +Subproject commit a9c949b87dc69d4d6cde854b73455a170a2aaff4 From 33078d4a906bdd9a487ef5ee44cdeab0ca3a9fab Mon Sep 17 00:00:00 2001 From: "Unknown W. Brackets" Date: Thu, 28 Feb 2013 01:29:54 -0800 Subject: [PATCH 209/347] Buildfix for Mac/Linux/etc. --- CMakeLists.txt | 1 - 1 file changed, 1 deletion(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 960e9f6f0ba7..3bda4dda8af9 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -818,7 +818,6 @@ add_library(${CoreLibName} ${CoreLinkType} Core/Util/BlockAllocator.h Core/Util/PPGeDraw.cpp Core/Util/PPGeDraw.h - Core/Util/Pool.h Core/Util/ppge_atlas.cpp Core/Util/ppge_atlas.h $ From 61f5fb35bd8d7b8a67983ce5d446752c6b48ffb6 Mon Sep 17 00:00:00 2001 From: Sacha Date: Thu, 28 Feb 2013 19:46:07 +1000 Subject: [PATCH 210/347] ARMJIT: Implement cvt.w.s, cvt.s.w and trunc.w.s that are used heavily in Dragonball. May need to keep note of FCR to get correct rounding mode? Interpreter doesn't do this either. --- Common/ArmEmitter.cpp | 8 ++++++++ Common/ArmEmitter.h | 1 + Core/MIPS/ARM/ArmCompFPU.cpp | 22 ++++++++++++++++------ 3 files changed, 25 insertions(+), 6 deletions(-) diff --git a/Common/ArmEmitter.cpp b/Common/ArmEmitter.cpp index 1da5f05b603f..92c045b4a7d7 100644 --- a/Common/ArmEmitter.cpp +++ b/Common/ArmEmitter.cpp @@ -1032,4 +1032,12 @@ void ARMXEmitter::VMOV(ARMReg Dest, ARMReg Src) } } +void ARMXEmitter::VCVT(bool to_integer, bool is_signed, ARMReg Sd, ARMReg Sm) +{ + Sd = SubBase(Sd); + Sm = SubBase(Sm); + Write32(NO_COND | (0x1D << 23) | ((Sd & 0x1) << 22) | (0x7 << 19) | (to_integer << 18) | (is_signed << 16) \ + | ((Sd & 0x1E) << 11) | (0x2B << 6) | ((Sm & 0x1) << 5) | (Sm >> 1)); +} + } diff --git a/Common/ArmEmitter.h b/Common/ArmEmitter.h index 8813680f09d2..3edd824ec423 100644 --- a/Common/ArmEmitter.h +++ b/Common/ArmEmitter.h @@ -515,6 +515,7 @@ class ARMXEmitter void VMUL(ARMReg Vd, ARMReg Vn, ARMReg Vm); void VMOV(ARMReg Dest, ARMReg Src, bool high); void VMOV(ARMReg Dest, ARMReg Src); + void VCVT(bool to_integer, bool is_signed, ARMReg Sd, ARMReg Sm); void QuickCallFunction(ARMReg scratchreg, void *func); // Utility functions diff --git a/Core/MIPS/ARM/ArmCompFPU.cpp b/Core/MIPS/ARM/ArmCompFPU.cpp index 38fdf73629c9..800dc5abf7e7 100644 --- a/Core/MIPS/ARM/ArmCompFPU.cpp +++ b/Core/MIPS/ARM/ArmCompFPU.cpp @@ -161,22 +161,34 @@ void Jit::Comp_FPU2op(u32 op) switch (op & 0x3f) { - case 4: //F(fd) = sqrtf(F(fs)); break; //sqrt + case 4: //F(fd) = sqrtf(F(fs)); break; //sqrt fpr.MapDirtyIn(fd, fs); VSQRT(fpr.R(fd), fpr.R(fs)); break; - case 5: //F(fd) = fabsf(F(fs)); break; //abs + case 5: //F(fd) = fabsf(F(fs)); break; //abs fpr.MapDirtyIn(fd, fs); VABS(fpr.R(fd), fpr.R(fs)); break; - case 6: //F(fd) = F(fs); break; //mov + case 6: //F(fd) = F(fs); break; //mov fpr.MapDirtyIn(fd, fs); VMOV(fpr.R(fd), fpr.R(fs)); break; - case 7: //F(fd) = -F(fs); break; //neg + case 7: //F(fd) = -F(fs); break; //neg fpr.MapDirtyIn(fd, fs); VNEG(fpr.R(fd), fpr.R(fs)); break; + case 13: //FsI(fd) = Rto0(F(fs))); break; //trunc.w.s + fpr.MapDirtyIn(fd, fs); + VCVT(true, true, fpr.R(fd), fpr.R(fs)); + break; + case 32: //F(fd) = (float)FsI(fs); break; //cvt.s.w + fpr.MapDirtyIn(fd, fs); + VCVT(false, false, fpr.R(fd), fpr.R(fs)); + break; + case 36: //FsI(fd) = (int) F(fs); break; //cvt.w.s + fpr.MapDirtyIn(fd, fs); + VCVT(true, false, fpr.R(fd), fpr.R(fs)); + break; /* case 12: //FsI(fd) = (int)floorf(F(fs)+0.5f); break; //round.w.s @@ -190,8 +202,6 @@ void Jit::Comp_FPU2op(u32 op) case 14: //FsI(fd) = (int)ceilf (F(fs)); break; //ceil.w.s case 15: //FsI(fd) = (int)floorf(F(fs)); break; //floor.w.s - case 32: //F(fd) = (float)FsI(fs); break; //cvt.s.w - case 36: //FsI(fd) = (int) F(fs); break; //cvt.w.s */ default: DISABLE; From 2104ebeaae284a13e9ee2af59a08fb758d22060c Mon Sep 17 00:00:00 2001 From: "Unknown W. Brackets" Date: Thu, 28 Feb 2013 02:14:06 -0800 Subject: [PATCH 211/347] Fix typo in sceKernelAllocPartitionMemory(). It sets it in the consturctor and terminates it properly there. --- Core/HLE/sceKernelMemory.cpp | 1 - 1 file changed, 1 deletion(-) diff --git a/Core/HLE/sceKernelMemory.cpp b/Core/HLE/sceKernelMemory.cpp index ab44bad4fcf2..4614842f61f9 100644 --- a/Core/HLE/sceKernelMemory.cpp +++ b/Core/HLE/sceKernelMemory.cpp @@ -511,7 +511,6 @@ int sceKernelAllocPartitionMemory(int partition, const char *name, int type, u32 return SCE_KERNEL_ERROR_MEMBLOCK_ALLOC_FAILED; } SceUID uid = kernelObjects.Create(block); - strncpy(block->name, name, 32); DEBUG_LOG(HLE,"%i = sceKernelAllocPartitionMemory(partition = %i, %s, type= %i, size= %i, addr= %08x)", uid, partition, name, type, size, addr); From 4584d541cafcc1b7a666af4f26663a7315467451 Mon Sep 17 00:00:00 2001 From: raven02 Date: Thu, 28 Feb 2013 20:19:33 +0800 Subject: [PATCH 212/347] Add CAPS for OSK input --- Core/Dialog/PSPOskDialog.cpp | 31 ++++++++++++++++++++----------- 1 file changed, 20 insertions(+), 11 deletions(-) diff --git a/Core/Dialog/PSPOskDialog.cpp b/Core/Dialog/PSPOskDialog.cpp index be6ed1cbebcb..133aab142acb 100644 --- a/Core/Dialog/PSPOskDialog.cpp +++ b/Core/Dialog/PSPOskDialog.cpp @@ -26,9 +26,9 @@ const char oskKeys[NUMKEYROWS][KEYSPERROW + 1] = { {'1','2','3','4','5','6','7','8','9','0','-','+','\0'}, - {'Q','W','E','R','T','Y','U','I','O','P','[',']','\0'}, - {'A','S','D','F','G','H','J','K','L',';','@','~','\0'}, - {'Z','X','C','V','B','N','M',',','.','/','?','\\','\0'}, + {'q','w','e','r','t','t','u','i','o','p','[',']','\0'}, + {'a','s','d','f','g','h','j','k','l',';','@','~','\0'}, + {'z','x','c','v','b','n','m',',','.','/','?','\\','\0'}, }; @@ -167,15 +167,19 @@ int PSPOskDialog::Update() StartDraw(); RenderKeyboard(); - PPGeDrawImage(I_CROSS, 100, 220, 20, 20, 0, CalcFadedColor(0xFFFFFFFF)); - PPGeDrawText("Select", 130, 220, PPGE_ALIGN_LEFT, 0.5f, CalcFadedColor(0xFFFFFFFF)); + PPGeDrawImage(I_CROSS, 30, 220, 20, 20, 0, CalcFadedColor(0xFFFFFFFF)); + PPGeDrawText("Select", 60, 220, PPGE_ALIGN_LEFT, 0.5f, CalcFadedColor(0xFFFFFFFF)); - PPGeDrawImage(I_CIRCLE, 200, 220, 20, 20, 0, CalcFadedColor(0xFFFFFFFF)); - PPGeDrawText("Delete", 230, 220, PPGE_ALIGN_LEFT, 0.5f, CalcFadedColor(0xFFFFFFFF)); + PPGeDrawImage(I_CIRCLE, 130, 220, 20, 20, 0, CalcFadedColor(0xFFFFFFFF)); + PPGeDrawText("Delete", 160, 220, PPGE_ALIGN_LEFT, 0.5f, CalcFadedColor(0xFFFFFFFF)); - PPGeDrawImage(I_BUTTON, 290, 220, 50, 20, 0, CalcFadedColor(0xFFFFFFFF)); - PPGeDrawText("Start", 305, 220, PPGE_ALIGN_LEFT, 0.5f, CalcFadedColor(0xFFFFFFFF)); - PPGeDrawText("Finish", 350, 220, PPGE_ALIGN_LEFT, 0.5f, CalcFadedColor(0xFFFFFFFF)); + PPGeDrawImage(I_BUTTON, 230, 220, 50, 20, 0, CalcFadedColor(0xFFFFFFFF)); + PPGeDrawText("Start", 245, 220, PPGE_ALIGN_LEFT, 0.5f, CalcFadedColor(0xFFFFFFFF)); + PPGeDrawText("Finish", 290, 220, PPGE_ALIGN_LEFT, 0.5f, CalcFadedColor(0xFFFFFFFF)); + + PPGeDrawImage(I_BUTTON, 350, 220, 55, 20, 0, CalcFadedColor(0xFFFFFFFF)); + PPGeDrawText("Select", 365, 220, PPGE_ALIGN_LEFT, 0.5f, CalcFadedColor(0xFFFFFFFF)); + PPGeDrawText("Caps", 410, 220, PPGE_ALIGN_LEFT, 0.5f, CalcFadedColor(0xFFFFFFFF)); if (IsButtonPressed(CTRL_UP)) { @@ -203,7 +207,12 @@ int PSPOskDialog::Update() if (IsButtonPressed(CTRL_CROSS)) { if (inputChars.size() < limit) - inputChars += oskKeys[selectedRow][selectedExtra]; + inputChars += (oskKeys[selectedRow][selectedExtra]); + } + else if (IsButtonPressed(CTRL_SELECT)) + { + if (inputChars.size() < limit) + inputChars += toupper(oskKeys[selectedRow][selectedExtra]); } else if (IsButtonPressed(CTRL_CIRCLE)) { From 127ee5d30f28ea7af1141fa21f504ea592d73844 Mon Sep 17 00:00:00 2001 From: raven02 Date: Thu, 28 Feb 2013 22:36:57 +0800 Subject: [PATCH 213/347] Create flash0:/font/ if not exists --- Core/HLE/sceFont.cpp | 3 +++ 1 file changed, 3 insertions(+) diff --git a/Core/HLE/sceFont.cpp b/Core/HLE/sceFont.cpp index f9ccf1d3d8e7..dfd5eae35304 100644 --- a/Core/HLE/sceFont.cpp +++ b/Core/HLE/sceFont.cpp @@ -364,6 +364,9 @@ LoadedFont *GetLoadedFont(u32 handle, bool allowClosed) { void __LoadInternalFonts() { std::string fontPath = "flash0:/font/"; + if (!pspFileSystem.GetFileInfo(fontPath).exists) { + pspFileSystem.MkDir(fontPath); + } for (size_t i = 0; i < ARRAY_SIZE(fontRegistry); i++) { const FontRegistryEntry &entry = fontRegistry[i]; std::string fontFilename = fontPath + entry.fileName; From 50be9102e437777f922e828c3fb2a24faabc4abc Mon Sep 17 00:00:00 2001 From: raven02 Date: Thu, 28 Feb 2013 22:50:14 +0800 Subject: [PATCH 214/347] Fix crash when font sets not exists --- Core/HLE/sceFont.cpp | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/Core/HLE/sceFont.cpp b/Core/HLE/sceFont.cpp index dfd5eae35304..6e8a5b946000 100644 --- a/Core/HLE/sceFont.cpp +++ b/Core/HLE/sceFont.cpp @@ -712,6 +712,10 @@ int sceFontGetCharGlyphImage(u32 fontHandle, u32 charCode, u32 glyphImagePtr) { int buffer = Memory::Read_U32(glyphImagePtr+20); LoadedFont *font = GetLoadedFont(fontHandle, false); + if (!font) { + ERROR_LOG(HLE, "%08x is not a valid font handle!", fontHandle); + return 0; + } int altCharCode = font->GetFontLib()->GetAltCharCode(); font->GetFont()->GetPGF()->DrawCharacter(buffer, bytesPerLine, bufWidth, bufHeight, xPos64 >> 6, yPos64 >> 6, 0, 0, 8192, 8192, pixelFormat, charCode, altCharCode, FONT_PGF_CHARGLYPH); return 0; From e319e2a7c2b3676f733dd5459eaa81c7c8c5c8d1 Mon Sep 17 00:00:00 2001 From: raven02 Date: Thu, 28 Feb 2013 23:04:40 +0800 Subject: [PATCH 215/347] Minor fix --- Core/HLE/sceFont.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Core/HLE/sceFont.cpp b/Core/HLE/sceFont.cpp index 6e8a5b946000..84675a295fec 100644 --- a/Core/HLE/sceFont.cpp +++ b/Core/HLE/sceFont.cpp @@ -636,7 +636,7 @@ int sceFontGetFontInfo(u32 fontHandle, u32 fontInfoPtr) { if (!Memory::IsValidAddress(fontInfoPtr)) return 0; - LoadedFont * font = GetLoadedFont(fontHandle, true); + LoadedFont *font = GetLoadedFont(fontHandle, true); if (!font) return 0; PGF *pgf = font->GetFont()->GetPGF(); From 059abc0d6964eab2fac9340d4494f8ac1aae7e25 Mon Sep 17 00:00:00 2001 From: Sacha Date: Fri, 1 Mar 2013 01:10:07 +1000 Subject: [PATCH 216/347] ARMJIT: Add floor, ceil, round. Introducing a rounding mode for VCVT. The cvt and trunc are tested heavily. Floor, ceil, round aren't tested as much as there are very few games that use it. --- Common/ArmEmitter.cpp | 4 ++-- Common/ArmEmitter.h | 2 +- Core/MIPS/ARM/ArmCompFPU.cpp | 40 ++++++++++++++++++++---------------- 3 files changed, 25 insertions(+), 21 deletions(-) diff --git a/Common/ArmEmitter.cpp b/Common/ArmEmitter.cpp index 92c045b4a7d7..6fd3326b265e 100644 --- a/Common/ArmEmitter.cpp +++ b/Common/ArmEmitter.cpp @@ -1032,12 +1032,12 @@ void ARMXEmitter::VMOV(ARMReg Dest, ARMReg Src) } } -void ARMXEmitter::VCVT(bool to_integer, bool is_signed, ARMReg Sd, ARMReg Sm) +void ARMXEmitter::VCVT(bool to_integer, bool is_signed, bool round_to_zero, ARMReg Sd, ARMReg Sm) { Sd = SubBase(Sd); Sm = SubBase(Sm); Write32(NO_COND | (0x1D << 23) | ((Sd & 0x1) << 22) | (0x7 << 19) | (to_integer << 18) | (is_signed << 16) \ - | ((Sd & 0x1E) << 11) | (0x2B << 6) | ((Sm & 0x1) << 5) | (Sm >> 1)); + | ((Sd & 0x1E) << 11) | (round_to_zero << 7) | (0x29 << 6) | ((Sm & 0x1) << 5) | (Sm >> 1)); } } diff --git a/Common/ArmEmitter.h b/Common/ArmEmitter.h index 3edd824ec423..d236027280e4 100644 --- a/Common/ArmEmitter.h +++ b/Common/ArmEmitter.h @@ -515,7 +515,7 @@ class ARMXEmitter void VMUL(ARMReg Vd, ARMReg Vn, ARMReg Vm); void VMOV(ARMReg Dest, ARMReg Src, bool high); void VMOV(ARMReg Dest, ARMReg Src); - void VCVT(bool to_integer, bool is_signed, ARMReg Sd, ARMReg Sm); + void VCVT(bool to_integer, bool is_signed, bool round_to_zero, ARMReg Sd, ARMReg Sm); void QuickCallFunction(ARMReg scratchreg, void *func); // Utility functions diff --git a/Core/MIPS/ARM/ArmCompFPU.cpp b/Core/MIPS/ARM/ArmCompFPU.cpp index 800dc5abf7e7..a37400a458f9 100644 --- a/Core/MIPS/ARM/ArmCompFPU.cpp +++ b/Core/MIPS/ARM/ArmCompFPU.cpp @@ -177,32 +177,36 @@ void Jit::Comp_FPU2op(u32 op) fpr.MapDirtyIn(fd, fs); VNEG(fpr.R(fd), fpr.R(fs)); break; + case 12: //FsI(fd) = (int)floorf(F(fs)+0.5f); break; //round.w.s + fpr.MapDirtyIn(fd, fs); + VCVT(true, true, false, fpr.R(fd), fpr.R(fs)); + break; case 13: //FsI(fd) = Rto0(F(fs))); break; //trunc.w.s fpr.MapDirtyIn(fd, fs); - VCVT(true, true, fpr.R(fd), fpr.R(fs)); + VCVT(true, true, true, fpr.R(fd), fpr.R(fs)); break; - case 32: //F(fd) = (float)FsI(fs); break; //cvt.s.w + case 14: //FsI(fd) = (int)ceilf (F(fs)); break; //ceil.w.s fpr.MapDirtyIn(fd, fs); - VCVT(false, false, fpr.R(fd), fpr.R(fs)); + MOVI2R(R0, 0x3F000000); // 0.5f + VMOV(S0, R0); + VADD(S0,fpr.R(fs),S0); + VCVT(true, true, false, fpr.R(fd), S0); break; - case 36: //FsI(fd) = (int) F(fs); break; //cvt.w.s + case 15: //FsI(fd) = (int)floorf(F(fs)); break; //floor.w.s fpr.MapDirtyIn(fd, fs); - VCVT(true, false, fpr.R(fd), fpr.R(fs)); + MOVI2R(R0, 0x3F000000); // 0.5f + VMOV(S0, R0); + VSUB(S0,fpr.R(fs),S0); + VCVT(true, true, false, fpr.R(fd), S0); break; - /* - case 12: //FsI(fd) = (int)floorf(F(fs)+0.5f); break; //round.w.s - - case 13: //FsI(fd) = F(fs)>=0 ? (int)floorf(F(fs)) : (int)ceilf(F(fs)); break;//trunc.w.s - fpr.Lock(fs, fd); - fpr.StoreFromRegister(fd); - CVTTSS2SI(EAX, fpr.R(fs)); - MOV(32, fpr.R(fd), R(EAX)); - fpr.UnlockAll(); + case 32: //F(fd) = (float)FsI(fs); break; //cvt.s.w + fpr.MapDirtyIn(fd, fs); + VCVT(false, false, true, fpr.R(fd), fpr.R(fs)); + break; + case 36: //FsI(fd) = (int) F(fs); break; //cvt.w.s + fpr.MapDirtyIn(fd, fs); + VCVT(true, false, true, fpr.R(fd), fpr.R(fs)); break; - - case 14: //FsI(fd) = (int)ceilf (F(fs)); break; //ceil.w.s - case 15: //FsI(fd) = (int)floorf(F(fs)); break; //floor.w.s - */ default: DISABLE; } From 1ff163cd10d8cff4725b19156e292977af045dcc Mon Sep 17 00:00:00 2001 From: "Unknown W. Brackets" Date: Thu, 28 Feb 2013 07:58:23 -0800 Subject: [PATCH 217/347] Buildfix for Android/etc. --- Core/Dialog/PSPOskDialog.cpp | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/Core/Dialog/PSPOskDialog.cpp b/Core/Dialog/PSPOskDialog.cpp index 133aab142acb..9e2c45d46938 100644 --- a/Core/Dialog/PSPOskDialog.cpp +++ b/Core/Dialog/PSPOskDialog.cpp @@ -20,6 +20,10 @@ #include "../HLE/sceCtrl.h" #include "ChunkFile.h" +#ifndef _WIN32 +#include +#endif + #define NUMKEYROWS 4 #define KEYSPERROW 12 #define NUMBEROFVALIDCHARS (KEYSPERROW * NUMKEYROWS) From a44e7e6d526c5f49af67f71a3f81921b421365a2 Mon Sep 17 00:00:00 2001 From: "Unknown W. Brackets" Date: Thu, 28 Feb 2013 08:07:33 -0800 Subject: [PATCH 218/347] Buildfixes for Mac. --- Core/HLE/sceFont.cpp | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/Core/HLE/sceFont.cpp b/Core/HLE/sceFont.cpp index 84675a295fec..a3ff7af98198 100644 --- a/Core/HLE/sceFont.cpp +++ b/Core/HLE/sceFont.cpp @@ -2,6 +2,8 @@ #include "base/timeutil.h" +#include + #include "HLE.h" #include "../MIPS/MIPS.h" #include "ChunkFile.h" @@ -217,7 +219,7 @@ class FontLib { Memory::ReadStruct(paramPtr, ¶ms_); // We use the same strange scheme that JPCSP uses. - int allocSize = 4 + 4 * params_.numFonts; + u32 allocSize = 4 + 4 * params_.numFonts; PostAllocCallback *action = (PostAllocCallback*) __KernelCreateAction(actionPostAllocCallback); action->SetFontLib(this); u32 args[1] = { allocSize }; @@ -236,7 +238,7 @@ class FontLib { fontMap.erase(fonts_[i]); } } - u32 args[1] = { handle_ }; + u32 args[1] = { (u32)handle_ }; __KernelDirectMipsCall(params_.freeFuncAddr, 0, args, 1, false); handle_ = 0; fonts_.clear(); From 4bb3da754b7931de7713e2433a3c4c86528ac6b4 Mon Sep 17 00:00:00 2001 From: "Unknown W. Brackets" Date: Thu, 28 Feb 2013 08:12:48 -0800 Subject: [PATCH 219/347] Umd typo fix, ouch. --- Core/HLE/sceUmd.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Core/HLE/sceUmd.cpp b/Core/HLE/sceUmd.cpp index 7f2fa8720d7e..222fc8bb6698 100644 --- a/Core/HLE/sceUmd.cpp +++ b/Core/HLE/sceUmd.cpp @@ -273,7 +273,7 @@ void __UmdStatTimeout(u64 userdata, int cyclesLate) for (size_t i = 0; i < umdWaitingThreads.size(); ++i) { - if (umdWaitingThreads[i].threadID = threadID) + if (umdWaitingThreads[i].threadID == threadID) umdWaitingThreads.erase(umdWaitingThreads.begin() + i--); } } From 4ab5348a8a11264f594be32f4b6dde9421436883 Mon Sep 17 00:00:00 2001 From: "Unknown W. Brackets" Date: Thu, 28 Feb 2013 08:13:01 -0800 Subject: [PATCH 220/347] Oops, need to update these too. --- CMakeLists.txt | 2 ++ Qt/Core.pro | 2 ++ 2 files changed, 4 insertions(+) diff --git a/CMakeLists.txt b/CMakeLists.txt index 3bda4dda8af9..cfabb3510d2f 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -684,6 +684,8 @@ add_library(${CoreLibName} ${CoreLinkType} Core/FileSystems/ISOFileSystem.h Core/FileSystems/MetaFileSystem.cpp Core/FileSystems/MetaFileSystem.h + Core/Font/PGF.cpp + Core/Font/PGF.h Core/HLE/FunctionWrappers.h Core/HLE/HLE.cpp Core/HLE/HLE.h diff --git a/Qt/Core.pro b/Qt/Core.pro index bd22ca070af4..69f6bb9fc856 100755 --- a/Qt/Core.pro +++ b/Qt/Core.pro @@ -39,6 +39,7 @@ SOURCES += ../Core/CPU.cpp \ # Core ../Core/Dialog/*.cpp \ ../Core/ELF/*.cpp \ ../Core/FileSystems/*.cpp \ + ../Core/Font/*.cpp \ ../Core/HLE/*.cpp \ ../Core/HW/*.cpp \ ../Core/MIPS/*.cpp \ @@ -68,6 +69,7 @@ HEADERS += ../Core/CPU.h \ ../Core/Dialog/*.h \ ../Core/ELF/*.h \ ../Core/FileSystems/*.h \ + ../Core/Font/*.h \ ../Core/HLE/*.h \ ../Core/HW/*.h \ ../Core/MIPS/*.h \ From d3f7def3288436a7443399ef8aa4cc9f3f081517 Mon Sep 17 00:00:00 2001 From: Sacha Date: Fri, 1 Mar 2013 02:17:39 +1000 Subject: [PATCH 221/347] ARMJIT: min, max implementations. --- Core/MIPS/ARM/ArmCompALU.cpp | 42 ++++++++++++++++++++++++------------ 1 file changed, 28 insertions(+), 14 deletions(-) diff --git a/Core/MIPS/ARM/ArmCompALU.cpp b/Core/MIPS/ARM/ArmCompALU.cpp index cf2752a56fb6..8f2460ece95c 100644 --- a/Core/MIPS/ARM/ArmCompALU.cpp +++ b/Core/MIPS/ARM/ArmCompALU.cpp @@ -159,11 +159,11 @@ namespace MIPSComp switch (op & 63) { - //case 10: if (!R(rt)) R(rd) = R(rs); break; //movz - //case 11: if (R(rt)) R(rd) = R(rs); break; //movn + //case 10: if (!R(rt)) R(rd) = R(rs); break; //movz + //case 11: if (R(rt)) R(rd) = R(rs); break; //movn - // case 32: //R(rd) = R(rs) + R(rt); break; //add - case 33: //R(rd) = R(rs) + R(rt); break; //addu + // case 32: //R(rd) = R(rs) + R(rt); break; //add + case 33: //R(rd) = R(rs) + R(rt); break; //addu // Some optimized special cases if (rs == 0) { gpr.MapDirtyIn(rd, rt); @@ -176,25 +176,25 @@ namespace MIPSComp ADD(gpr.R(rd), gpr.R(rs), gpr.R(rt)); } break; - case 34: //R(rd) = R(rs) - R(rt); break; //sub + case 34: //R(rd) = R(rs) - R(rt); break; //sub case 35: gpr.MapDirtyInIn(rd, rs, rt); SUB(gpr.R(rd), gpr.R(rs), gpr.R(rt)); break; - case 36: //R(rd) = R(rs) & R(rt); break; //and + case 36: //R(rd) = R(rs) & R(rt); break; //and gpr.MapDirtyInIn(rd, rs, rt); AND(gpr.R(rd), gpr.R(rs), gpr.R(rt)); break; - case 37: //R(rd) = R(rs) | R(rt); break; //or + case 37: //R(rd) = R(rs) | R(rt); break; //or gpr.MapDirtyInIn(rd, rs, rt); ORR(gpr.R(rd), gpr.R(rs), gpr.R(rt)); break; - case 38: //R(rd) = R(rs) ^ R(rt); break; //xor/eor + case 38: //R(rd) = R(rs) ^ R(rt); break; //xor/eor gpr.MapDirtyInIn(rd, rs, rt); EOR(gpr.R(rd), gpr.R(rs), gpr.R(rt)); break; - case 39: // R(rd) = ~(R(rs) | R(rt)); //nor + case 39: // R(rd) = ~(R(rs) | R(rt)); break; //nor gpr.MapDirtyInIn(rd, rs, rt); ORR(gpr.R(rd), gpr.R(rs), gpr.R(rt)); MVN(gpr.R(rd), gpr.R(rd)); @@ -210,7 +210,7 @@ namespace MIPSComp SetCC(CC_AL); break; - case 43: //R(rd) = R(rs) < R(rt); break; //sltu + case 43: //R(rd) = R(rs) < R(rt); break; //sltu gpr.MapDirtyInIn(rd, rs, rt); CMP(gpr.R(rs), gpr.R(rt)); SetCC(CC_LO); @@ -220,11 +220,25 @@ namespace MIPSComp SetCC(CC_AL); break; - // case 44: R(rd) = (R(rs) > R(rt)) ? R(rs) : R(rt); break; //max - // CMP(a,b); CMOVLT(a,b) + case 44: //R(rd) = max(R(rs), R(rt); break; //max + gpr.MapDirtyInIn(rd, rs, rt); + CMP(gpr.R(rs), gpr.R(rt)); + SetCC(CC_GT); + MOV(gpr.R(rd), gpr.R(rs)); + SetCC(CC_LE); + MOV(gpr.R(rd), gpr.R(rt)); + SetCC(CC_AL); + break; - // case 45: R(rd) = (R(rs) < R(rt)) ? R(rs) : R(rt); break; //min - // CMP(a,b); CMOVGT(a,b) + case 45: //R(rd) = min(R(rs), R(rt)); break; //min + gpr.MapDirtyInIn(rd, rs, rt); + CMP(gpr.R(rs), gpr.R(rt)); + SetCC(CC_LT); + MOV(gpr.R(rd), gpr.R(rs)); + SetCC(CC_GE); + MOV(gpr.R(rd), gpr.R(rt)); + SetCC(CC_AL); + break; default: // gpr.UnlockAll(); From 128d18155867c3523f4c224f23ecacb8df368c37 Mon Sep 17 00:00:00 2001 From: "Unknown W. Brackets" Date: Thu, 28 Feb 2013 08:03:52 -0800 Subject: [PATCH 222/347] Fix crash in sceFontClose(). Still some other issues but Fieldrunners now plays again with tons of errors showing. --- Core/HLE/sceFont.cpp | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/Core/HLE/sceFont.cpp b/Core/HLE/sceFont.cpp index a3ff7af98198..6cc340c6341e 100644 --- a/Core/HLE/sceFont.cpp +++ b/Core/HLE/sceFont.cpp @@ -577,10 +577,16 @@ u32 sceFontOpenUserFile(u32 libHandle, const char *fileName, u32 mode, u32 error } int sceFontClose(u32 fontHandle) { - INFO_LOG(HLE, "sceFontClose(%x)", fontHandle); LoadedFont *font = GetLoadedFont(fontHandle, false); - FontLib *fontLib = font->GetFontLib(); - fontLib->CloseFont(font); + if (font) + { + INFO_LOG(HLE, "sceFontClose(%x)", fontHandle); + FontLib *fontLib = font->GetFontLib(); + if (fontLib) + fontLib->CloseFont(font); + } + else + ERROR_LOG(HLE, "sceFontClose(%x) - font not open?", fontHandle); return 0; } From 4249e0f6a853413d6071dd0b9f69403e562f55d7 Mon Sep 17 00:00:00 2001 From: "Unknown W. Brackets" Date: Thu, 28 Feb 2013 08:33:30 -0800 Subject: [PATCH 223/347] Fix shutdown crash when there are open fonts. --- Core/HLE/sceFont.cpp | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/Core/HLE/sceFont.cpp b/Core/HLE/sceFont.cpp index 6cc340c6341e..7125478ba82f 100644 --- a/Core/HLE/sceFont.cpp +++ b/Core/HLE/sceFont.cpp @@ -443,7 +443,9 @@ void __FontInit() { void __FontShutdown() { for (auto iter = fontMap.begin(); iter != fontMap.end(); iter++) { - iter->second->GetFontLib()->CloseFont(iter->second); + FontLib *fontLib = iter->second->GetFontLib(); + if (fontLib) + fontLib->CloseFont(iter->second); } fontMap.clear(); for (auto iter = fontLibMap.begin(); iter != fontLibMap.end(); iter++) { From 35a57be115b59ef3786a963b9dcd9748cd887503 Mon Sep 17 00:00:00 2001 From: Sacha Date: Thu, 28 Feb 2013 13:59:33 +1000 Subject: [PATCH 224/347] ARMJIT: Implement MADD, MADDU. Do bitrev if it takes an immediate. Fix a bug where MULTU was being passed through to the interpreter. --- Common/ArmEmitter.cpp | 10 ++++++++++ Common/ArmEmitter.h | 3 +++ Core/MIPS/ARM/ArmCompALU.cpp | 38 ++++++++++++++++++++++++++++++------ 3 files changed, 45 insertions(+), 6 deletions(-) diff --git a/Common/ArmEmitter.cpp b/Common/ArmEmitter.cpp index 6e24f2692da4..5f536845373d 100644 --- a/Common/ArmEmitter.cpp +++ b/Common/ArmEmitter.cpp @@ -498,6 +498,16 @@ void ARMXEmitter::SMULL(ARMReg destLo, ARMReg destHi, ARMReg rm, ARMReg rn) Write4OpMultiply(0xC, destLo, destHi, rn, rm); } +void ARMXEmitter::UMLAL(ARMReg destLo, ARMReg destHi, ARMReg rm, ARMReg rn) +{ + Write4OpMultiply(0xA, destLo, destHi, rn, rm); +} + +void ARMXEmitter::SMLAL(ARMReg destLo, ARMReg destHi, ARMReg rm, ARMReg rn) +{ + Write4OpMultiply(0xE, destLo, destHi, rn, rm); +} + void ARMXEmitter::SXTB (ARMReg dest, ARMReg op2) { Write32(condition | (0x6AF << 16) | (dest << 12) | (7 << 4) | op2); diff --git a/Common/ArmEmitter.h b/Common/ArmEmitter.h index 8aa466dc571d..8f933251cd7b 100644 --- a/Common/ArmEmitter.h +++ b/Common/ArmEmitter.h @@ -457,6 +457,9 @@ class ARMXEmitter void UMULL(ARMReg destLo, ARMReg destHi, ARMReg rn, ARMReg rm); void SMULL(ARMReg destLo, ARMReg destHi, ARMReg rn, ARMReg rm); + void UMLAL(ARMReg destLo, ARMReg destHi, ARMReg rn, ARMReg rm); + void SMLAL(ARMReg destLo, ARMReg destHi, ARMReg rn, ARMReg rm); + void SXTB(ARMReg dest, ARMReg op2); void SXTH(ARMReg dest, ARMReg op2, u8 rotation = 0); void SXTAH(ARMReg dest, ARMReg src, ARMReg op2, u8 rotation = 0); diff --git a/Core/MIPS/ARM/ArmCompALU.cpp b/Core/MIPS/ARM/ArmCompALU.cpp index 8f2460ece95c..af07188be2f4 100644 --- a/Core/MIPS/ARM/ArmCompALU.cpp +++ b/Core/MIPS/ARM/ArmCompALU.cpp @@ -306,29 +306,44 @@ namespace MIPSComp void Jit::Comp_Allegrex(u32 op) { - DISABLE int rt = _RT; int rd = _RD; switch ((op >> 6) & 31) { + /* case 16: // seb // R(rd) = (u32)(s32)(s8)(u8)R(rt); - /* gpr.Lock(rd, rt); gpr.BindToRegister(rd, true, true); MOV(32, R(EAX), gpr.R(rt)); // work around the byte-register addressing problem MOVSX(32, 8, gpr.RX(rd), R(EAX)); - gpr.UnlockAll();*/ + gpr.UnlockAll(); break; case 24: // seh - /* gpr.Lock(rd, rt); gpr.BindToRegister(rd, true, true); MOVSX(32, 16, gpr.RX(rd), gpr.R(rt)); - gpr.UnlockAll();*/ + gpr.UnlockAll(); break; - + */ case 20: //bitrev + if (gpr.IsImm(rt)) + { + // http://graphics.stanford.edu/~seander/bithacks.html#ReverseParallel + u32 v = gpr.GetImm(rt); + // swap odd and even bits + v = ((v >> 1) & 0x55555555) | ((v & 0x55555555) << 1); + // swap consecutive pairs + v = ((v >> 2) & 0x33333333) | ((v & 0x33333333) << 2); + // swap nibbles ... + v = ((v >> 4) & 0x0F0F0F0F) | ((v & 0x0F0F0F0F) << 4); + // swap bytes + v = ((v >> 8) & 0x00FF00FF) | ((v & 0x00FF00FF) << 8); + // swap 2-byte long pairs + v = ( v >> 16 ) | ( v << 16); + gpr.SetImm(rd,v); + break; + } default: Comp_Generic(op); return; @@ -372,6 +387,17 @@ namespace MIPSComp case 25: //multu (2nd) lo,hi = unsigned mul (rs * rt) gpr.MapDirtyDirtyInIn(MIPSREG_LO, MIPSREG_HI, rs, rt); UMULL(gpr.R(MIPSREG_LO), gpr.R(MIPSREG_HI), gpr.R(rs), gpr.R(rt)); + break; + + case 28: //madd + gpr.MapDirtyDirtyInIn(MIPSREG_LO, MIPSREG_HI, rs, rt); + SMLAL(gpr.R(MIPSREG_LO), gpr.R(MIPSREG_HI), gpr.R(rs), gpr.R(rt)); + break; + + case 29: //maddu + gpr.MapDirtyDirtyInIn(MIPSREG_LO, MIPSREG_HI, rs, rt); + UMLAL(gpr.R(MIPSREG_LO), gpr.R(MIPSREG_HI), gpr.R(rs), gpr.R(rt)); + break; default: DISABLE; From 28575d467200c752ba20d65d5f0d7c92527d7536 Mon Sep 17 00:00:00 2001 From: Henrik Rydgard Date: Thu, 28 Feb 2013 23:44:40 +0100 Subject: [PATCH 225/347] Fix the avoidLoad flag in the arm regalloc --- Core/MIPS/ARM/ArmCompALU.cpp | 4 ++-- Core/MIPS/ARM/ArmRegCache.cpp | 16 ++++++++-------- 2 files changed, 10 insertions(+), 10 deletions(-) diff --git a/Core/MIPS/ARM/ArmCompALU.cpp b/Core/MIPS/ARM/ArmCompALU.cpp index af07188be2f4..a089b852c8c3 100644 --- a/Core/MIPS/ARM/ArmCompALU.cpp +++ b/Core/MIPS/ARM/ArmCompALU.cpp @@ -390,12 +390,12 @@ namespace MIPSComp break; case 28: //madd - gpr.MapDirtyDirtyInIn(MIPSREG_LO, MIPSREG_HI, rs, rt); + gpr.MapDirtyDirtyInIn(MIPSREG_LO, MIPSREG_HI, rs, rt, false); SMLAL(gpr.R(MIPSREG_LO), gpr.R(MIPSREG_HI), gpr.R(rs), gpr.R(rt)); break; case 29: //maddu - gpr.MapDirtyDirtyInIn(MIPSREG_LO, MIPSREG_HI, rs, rt); + gpr.MapDirtyDirtyInIn(MIPSREG_LO, MIPSREG_HI, rs, rt, false); UMLAL(gpr.R(MIPSREG_LO), gpr.R(MIPSREG_HI), gpr.R(rs), gpr.R(rt)); break; diff --git a/Core/MIPS/ARM/ArmRegCache.cpp b/Core/MIPS/ARM/ArmRegCache.cpp index 6463e1349cd5..de826ef1226f 100644 --- a/Core/MIPS/ARM/ArmRegCache.cpp +++ b/Core/MIPS/ARM/ArmRegCache.cpp @@ -135,16 +135,16 @@ void ArmRegCache::MapInIn(MIPSReg rd, MIPSReg rs) { void ArmRegCache::MapDirtyIn(MIPSReg rd, MIPSReg rs, bool avoidLoad) { SpillLock(rd, rs); - bool overlap = avoidLoad && rd == rs; - MapReg(rd, MAP_DIRTY | (overlap ? 0 : MAP_NOINIT)); + bool load = !avoidLoad || rd == rs; + MapReg(rd, MAP_DIRTY | (load ? 0 : MAP_NOINIT)); MapReg(rs); ReleaseSpillLocks(); } void ArmRegCache::MapDirtyInIn(MIPSReg rd, MIPSReg rs, MIPSReg rt, bool avoidLoad) { SpillLock(rd, rs, rt); - bool overlap = avoidLoad && (rd == rs || rd == rt); - MapReg(rd, MAP_DIRTY | (overlap ? 0 : MAP_NOINIT)); + bool load = !avoidLoad || (rd == rs || rd == rt); + MapReg(rd, MAP_DIRTY | (load ? 0 : MAP_NOINIT)); MapReg(rt); MapReg(rs); ReleaseSpillLocks(); @@ -152,10 +152,10 @@ void ArmRegCache::MapDirtyInIn(MIPSReg rd, MIPSReg rs, MIPSReg rt, bool avoidLoa void ArmRegCache::MapDirtyDirtyInIn(MIPSReg rd1, MIPSReg rd2, MIPSReg rs, MIPSReg rt, bool avoidLoad) { SpillLock(rd1, rd2, rs, rt); - bool overlap1 = avoidLoad && (rd1 == rs || rd1 == rt); - bool overlap2 = avoidLoad && (rd2 == rs || rd2 == rt); - MapReg(rd1, MAP_DIRTY | (overlap1 ? 0 : MAP_NOINIT)); - MapReg(rd2, MAP_DIRTY | (overlap2 ? 0 : MAP_NOINIT)); + bool load1 = !avoidLoad || (rd1 == rs || rd1 == rt); + bool load2 = !avoidLoad || (rd2 == rs || rd2 == rt); + MapReg(rd1, MAP_DIRTY | (load1 ? 0 : MAP_NOINIT)); + MapReg(rd2, MAP_DIRTY | (load2 ? 0 : MAP_NOINIT)); MapReg(rt); MapReg(rs); ReleaseSpillLocks(); From 6d3c89e3543aa36cc10cb4de6581bba1bac30a7d Mon Sep 17 00:00:00 2001 From: Sacha Date: Fri, 1 Mar 2013 13:45:22 +1000 Subject: [PATCH 226/347] Fix up VCVT function to recognise the difference in encoding for to_int and to_float. There is no 'round to zero' option for to_float. cvt.s.w and cvt.w.s should be unsigned. --- Common/ArmEmitter.cpp | 9 ++++++--- Common/ArmEmitter.h | 2 +- Core/MIPS/ARM/ArmCompFPU.cpp | 12 ++++++------ 3 files changed, 13 insertions(+), 10 deletions(-) diff --git a/Common/ArmEmitter.cpp b/Common/ArmEmitter.cpp index 6fd3326b265e..a0dde6a80e5d 100644 --- a/Common/ArmEmitter.cpp +++ b/Common/ArmEmitter.cpp @@ -1032,12 +1032,15 @@ void ARMXEmitter::VMOV(ARMReg Dest, ARMReg Src) } } -void ARMXEmitter::VCVT(bool to_integer, bool is_signed, bool round_to_zero, ARMReg Sd, ARMReg Sm) +void ARMXEmitter::VCVT(ARMReg Sd, ARMReg Sm, bool to_integer, bool is_signed, bool round_to_zero = false) { + bool op = to_integer ? round_to_zero : is_signed; + bool op2 = to_integer ? is_signed : 0; Sd = SubBase(Sd); Sm = SubBase(Sm); - Write32(NO_COND | (0x1D << 23) | ((Sd & 0x1) << 22) | (0x7 << 19) | (to_integer << 18) | (is_signed << 16) \ - | ((Sd & 0x1E) << 11) | (round_to_zero << 7) | (0x29 << 6) | ((Sm & 0x1) << 5) | (Sm >> 1)); + + Write32(NO_COND | (0x1D << 23) | ((Sd & 0x1) << 22) | (0x7 << 19) | (to_integer << 18) | (op2 << 16) \ + | ((Sd & 0x1E) << 11) | (op << 7) | (0x29 << 6) | ((Sm & 0x1) << 5) | (Sm >> 1)); } } diff --git a/Common/ArmEmitter.h b/Common/ArmEmitter.h index d236027280e4..112c83c381b7 100644 --- a/Common/ArmEmitter.h +++ b/Common/ArmEmitter.h @@ -515,7 +515,7 @@ class ARMXEmitter void VMUL(ARMReg Vd, ARMReg Vn, ARMReg Vm); void VMOV(ARMReg Dest, ARMReg Src, bool high); void VMOV(ARMReg Dest, ARMReg Src); - void VCVT(bool to_integer, bool is_signed, bool round_to_zero, ARMReg Sd, ARMReg Sm); + void VCVT(ARMReg Sd, ARMReg Sm, bool to_integer, bool is_signed, bool round_to_zero); void QuickCallFunction(ARMReg scratchreg, void *func); // Utility functions diff --git a/Core/MIPS/ARM/ArmCompFPU.cpp b/Core/MIPS/ARM/ArmCompFPU.cpp index a37400a458f9..cae0a129dda7 100644 --- a/Core/MIPS/ARM/ArmCompFPU.cpp +++ b/Core/MIPS/ARM/ArmCompFPU.cpp @@ -179,33 +179,33 @@ void Jit::Comp_FPU2op(u32 op) break; case 12: //FsI(fd) = (int)floorf(F(fs)+0.5f); break; //round.w.s fpr.MapDirtyIn(fd, fs); - VCVT(true, true, false, fpr.R(fd), fpr.R(fs)); + VCVT(fpr.R(fd), fpr.R(fs), true, true, false); break; case 13: //FsI(fd) = Rto0(F(fs))); break; //trunc.w.s fpr.MapDirtyIn(fd, fs); - VCVT(true, true, true, fpr.R(fd), fpr.R(fs)); + VCVT(fpr.R(fd), fpr.R(fs), true, true, true); break; case 14: //FsI(fd) = (int)ceilf (F(fs)); break; //ceil.w.s fpr.MapDirtyIn(fd, fs); MOVI2R(R0, 0x3F000000); // 0.5f VMOV(S0, R0); VADD(S0,fpr.R(fs),S0); - VCVT(true, true, false, fpr.R(fd), S0); + VCVT(fpr.R(fd), S0, true, true, false); break; case 15: //FsI(fd) = (int)floorf(F(fs)); break; //floor.w.s fpr.MapDirtyIn(fd, fs); MOVI2R(R0, 0x3F000000); // 0.5f VMOV(S0, R0); VSUB(S0,fpr.R(fs),S0); - VCVT(true, true, false, fpr.R(fd), S0); + VCVT(fpr.R(fd), S0, true, true, false); break; case 32: //F(fd) = (float)FsI(fs); break; //cvt.s.w fpr.MapDirtyIn(fd, fs); - VCVT(false, false, true, fpr.R(fd), fpr.R(fs)); + VCVT(fpr.R(fd), fpr.R(fs), false, false); break; case 36: //FsI(fd) = (int) F(fs); break; //cvt.w.s fpr.MapDirtyIn(fd, fs); - VCVT(true, false, true, fpr.R(fd), fpr.R(fs)); + VCVT(fpr.R(fd), fpr.R(fs), true, false, true); break; default: DISABLE; From 26ebdb4f11e8ed733443a70c7f9aa23dcf791f2a Mon Sep 17 00:00:00 2001 From: Sacha Date: Fri, 1 Mar 2013 15:41:45 +1000 Subject: [PATCH 227/347] Improve VCMP instruction with option for E. Add comment to le JIT about how the VCMP crashes on ARM11, with commented code. --- Common/ArmEmitter.cpp | 14 +++++++------- Common/ArmEmitter.h | 6 +++--- Core/MIPS/ARM/ArmCompFPU.cpp | 11 ++++++++++- 3 files changed, 20 insertions(+), 11 deletions(-) diff --git a/Common/ArmEmitter.cpp b/Common/ArmEmitter.cpp index a0dde6a80e5d..48f8b4a9bcc6 100644 --- a/Common/ArmEmitter.cpp +++ b/Common/ArmEmitter.cpp @@ -713,7 +713,7 @@ void ARMXEmitter::VSTR(ARMReg Src, ARMReg Base, u16 offset) | ((Src & 0xF) << 12) | (11 << 8) | (offset >> 2)); } } -void ARMXEmitter::VCMP(ARMReg Vd, ARMReg Vm) +void ARMXEmitter::VCMP(ARMReg Vd, ARMReg Vm, bool E) { _assert_msg_(DYNA_REC, Vd < Q0, "Passed invalid Vd to VCMP"); bool single_reg = Vd < D0; @@ -724,15 +724,15 @@ void ARMXEmitter::VCMP(ARMReg Vd, ARMReg Vm) if (single_reg) { Write32(NO_COND | (0x1D << 23) | ((Vd & 0x1) << 22) | (0x34 << 16) | ((Vd & 0x1E) << 11) \ - | (0x2B << 6) | ((Vm & 0x1) << 5) | (Vm >> 1)); + | (E << 7) | (0x29 << 6) | ((Vm & 0x1) << 5) | (Vm >> 1)); } else { Write32(NO_COND | (0x1D << 23) | ((Vd & 0x10) << 18) | (0x34 << 16) | ((Vd & 0xF) << 12) \ - | (0x2F << 6) | ((Vm & 0x10) << 1) | (Vm & 0xF)); + | (E << 7) | (0x2C << 6) | ((Vm & 0x10) << 1) | (Vm & 0xF)); } } -void ARMXEmitter::VCMP(ARMReg Vd) +void ARMXEmitter::VCMP(ARMReg Vd, bool E) { _assert_msg_(DYNA_REC, Vd < Q0, "Passed invalid Vd to VCMP"); bool single_reg = Vd < D0; @@ -742,12 +742,12 @@ void ARMXEmitter::VCMP(ARMReg Vd) if (single_reg) { Write32(NO_COND | (0x1D << 23) | ((Vd & 0x1) << 22) | (0x35 << 16) | ((Vd & 0x1E) << 11) \ - | (0x2B << 6)); + | (E << 7) | (0x29 << 6)); } else { Write32(NO_COND | (0x1D << 23) | ((Vd & 0x10) << 18) | (0x35 << 16) | ((Vd & 0xF) << 12) \ - | (0x2F << 6)); + | (E << 7) | (0x2C << 6)); } } void ARMXEmitter::VDIV(ARMReg Vd, ARMReg Vn, ARMReg Vm) @@ -1032,7 +1032,7 @@ void ARMXEmitter::VMOV(ARMReg Dest, ARMReg Src) } } -void ARMXEmitter::VCVT(ARMReg Sd, ARMReg Sm, bool to_integer, bool is_signed, bool round_to_zero = false) +void ARMXEmitter::VCVT(ARMReg Sd, ARMReg Sm, bool to_integer, bool is_signed, bool round_to_zero) { bool op = to_integer ? round_to_zero : is_signed; bool op2 = to_integer ? is_signed : 0; diff --git a/Common/ArmEmitter.h b/Common/ArmEmitter.h index 112c83c381b7..f137cbcd78ea 100644 --- a/Common/ArmEmitter.h +++ b/Common/ArmEmitter.h @@ -501,9 +501,9 @@ class ARMXEmitter // VFP Only void VLDR(ARMReg Dest, ARMReg Base, u16 offset); void VSTR(ARMReg Src, ARMReg Base, u16 offset); - void VCMP(ARMReg Vd, ARMReg Vm); + void VCMP(ARMReg Vd, ARMReg Vm, bool E); // Compares against zero - void VCMP(ARMReg Vd); + void VCMP(ARMReg Vd, bool E); void VDIV(ARMReg Vd, ARMReg Vn, ARMReg Vm); void VSQRT(ARMReg Vd, ARMReg Vm); @@ -515,7 +515,7 @@ class ARMXEmitter void VMUL(ARMReg Vd, ARMReg Vn, ARMReg Vm); void VMOV(ARMReg Dest, ARMReg Src, bool high); void VMOV(ARMReg Dest, ARMReg Src); - void VCVT(ARMReg Sd, ARMReg Sm, bool to_integer, bool is_signed, bool round_to_zero); + void VCVT(ARMReg Sd, ARMReg Sm, bool to_integer, bool is_signed, bool round_to_zero = false); void QuickCallFunction(ARMReg scratchreg, void *func); // Utility functions diff --git a/Core/MIPS/ARM/ArmCompFPU.cpp b/Core/MIPS/ARM/ArmCompFPU.cpp index cae0a129dda7..ff199a4a1ef0 100644 --- a/Core/MIPS/ARM/ArmCompFPU.cpp +++ b/Core/MIPS/ARM/ArmCompFPU.cpp @@ -138,7 +138,16 @@ void Jit::Comp_FPUComp(u32 op) { case 6: //ole case 14: //le - // CompFPComp(fs, ft, CMPLESS); + // This VCMP crashes on ARM11 with an exception. + /* + fpr.MapInIn(fpr.R(fs), fpr.R(ft)); + VCMP(fpr.R(fs), fpr.R(ft)); + MOVI2R(R0, (u32)¤tMIPS->fpcond); + SetCC(CC_LT); + // TODO: Should set R0 to 0 or 1 + VSTR(fpr.R(fs), R0, 0); + SetCC(CC_AL); + */ break; case 7: //ule From 0ca7b2a7948af5b4211eec79b3e808f125f06ff5 Mon Sep 17 00:00:00 2001 From: Sacha Date: Fri, 1 Mar 2013 16:55:10 +1000 Subject: [PATCH 228/347] The cvt.s.w has to be signed (as it was before). Also, implement f,sf but untested so it is left commented out. --- Core/MIPS/ARM/ArmCompFPU.cpp | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/Core/MIPS/ARM/ArmCompFPU.cpp b/Core/MIPS/ARM/ArmCompFPU.cpp index ff199a4a1ef0..040b695187bc 100644 --- a/Core/MIPS/ARM/ArmCompFPU.cpp +++ b/Core/MIPS/ARM/ArmCompFPU.cpp @@ -108,7 +108,8 @@ void Jit::Comp_FPUComp(u32 op) { switch (op & 0xf) { case 0: //f case 8: //sf - // MOV(32, M((void *) ¤tMIPS->fpcond), Imm32(0)); + /*MOVI2R(R0, (u32)¤tMIPS->fpcond); + MOV(R0, Operand2(0));*/ break; case 1: //un @@ -210,7 +211,7 @@ void Jit::Comp_FPU2op(u32 op) break; case 32: //F(fd) = (float)FsI(fs); break; //cvt.s.w fpr.MapDirtyIn(fd, fs); - VCVT(fpr.R(fd), fpr.R(fs), false, false); + VCVT(fpr.R(fd), fpr.R(fs), false, true); break; case 36: //FsI(fd) = (int) F(fs); break; //cvt.w.s fpr.MapDirtyIn(fd, fs); From b32411c9e090560c945235bbbe5f51dc52cd361e Mon Sep 17 00:00:00 2001 From: sum2012 Date: Sat, 2 Mar 2013 00:48:20 +0800 Subject: [PATCH 229/347] Add more support of patchers --- Core/PSPLoaders.cpp | 23 +++++++++++++++++++++++ 1 file changed, 23 insertions(+) diff --git a/Core/PSPLoaders.cpp b/Core/PSPLoaders.cpp index e1beb4cadef5..2e582d22d145 100644 --- a/Core/PSPLoaders.cpp +++ b/Core/PSPLoaders.cpp @@ -93,6 +93,29 @@ bool Load_PSP_ISO(const char *filename, std::string *error_string) if (pspFileSystem.GetFileInfo("disc0:/PSP_GAME/SYSDIR/EBOOT.DAT").exists) { bootpath = "disc0:/PSP_GAME/SYSDIR/EBOOT.DAT"; } + // bypass more patchers + if (pspFileSystem.GetFileInfo("disc0:/PSP_GAME/SYSDIR/EBOOT.BI").exists) { + bootpath = "disc0:/PSP_GAME/SYSDIR/EBOOT.BI"; + } + if (pspFileSystem.GetFileInfo("disc0:/PSP_GAME/SYSDIR/EBOOT.LLD").exists) { + bootpath = "disc0:/PSP_GAME/SYSDIR/EBOOT.LLD"; + } + if (pspFileSystem.GetFileInfo("disc0:/PSP_GAME/SYSDIR/OLD_EBOOT.BIN").exists) { + bootpath = "disc0:/PSP_GAME/SYSDIR/OLD_EBOOT.BIN"; + } + if (pspFileSystem.GetFileInfo("disc0:/PSP_GAME/SYSDIR/EBOOT.123").exists) { + bootpath = "disc0:/PSP_GAME/SYSDIR/EBOOT.123"; + } + if (pspFileSystem.GetFileInfo("disc0:/PSP_GAME/SYSDIR/EBOOT_LRC_CH.BIN").exists) { + bootpath = "disc0:/PSP_GAME/SYSDIR/EBOOT_LRC_CH.BIN"; + } + if (pspFileSystem.GetFileInfo("disc0:/PSP_GAME/SYSDIR/BOOT0.OLD").exists) { + bootpath = "disc0:/PSP_GAME/SYSDIR/BOOT0.OLD"; + } + if (pspFileSystem.GetFileInfo("disc0:/PSP_GAME/SYSDIR/BOOT1.OLD").exists) { + bootpath = "disc0:/PSP_GAME/SYSDIR/BOOT1.OLD"; + } + bool hasEncrypted = false; u32 fd; if ((fd = pspFileSystem.OpenFile(bootpath, FILEACCESS_READ)) != 0) From 7969b2e6abb2a81544cc924bb9900bbaaa4c0e2d Mon Sep 17 00:00:00 2001 From: "Unknown W. Brackets" Date: Fri, 1 Mar 2013 16:28:20 -0800 Subject: [PATCH 230/347] Temporary Android crashfix. --- android/jni/ArmEmitterTest.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/android/jni/ArmEmitterTest.cpp b/android/jni/ArmEmitterTest.cpp index c9b5591a4e71..66a74ba67196 100644 --- a/android/jni/ArmEmitterTest.cpp +++ b/android/jni/ArmEmitterTest.cpp @@ -59,7 +59,8 @@ extern void DisassembleArm(const u8 *data, int size); void ArmEmitterTest() { - // return; + // Disabled for now. + return; ILOG("Running ARM emitter test!"); TestCode gen; gen.ReserveCodeSpace(0x1000); From a0d96d26c8bd4fd8c057cad059baa3587e756365 Mon Sep 17 00:00:00 2001 From: "Unknown W. Brackets" Date: Fri, 1 Mar 2013 16:36:18 -0800 Subject: [PATCH 231/347] Mac/Linux buildfix. --- android/jni/NativeApp.cpp | 2 ++ 1 file changed, 2 insertions(+) diff --git a/android/jni/NativeApp.cpp b/android/jni/NativeApp.cpp index 4d16aaa78781..a1b75a26945e 100644 --- a/android/jni/NativeApp.cpp +++ b/android/jni/NativeApp.cpp @@ -154,7 +154,9 @@ void NativeGetAppInfo(std::string *app_dir_name, std::string *app_nice_name, boo *app_dir_name = "ppsspp"; *landscape = true; +#if defined(ARM) ArmEmitterTest(); +#endif } void NativeInit(int argc, const char *argv[], const char *savegame_directory, const char *external_directory, const char *installID) From 6c23e1b6d58f4ea34d716a8d419f665c2e20fc8e Mon Sep 17 00:00:00 2001 From: Sacha Date: Sat, 2 Mar 2013 11:34:03 +1000 Subject: [PATCH 232/347] Use flags instead of bools for VCVT. Fix up some spacing. Only Android has ArmEmitterTest. --- Common/ArmEmitter.cpp | 8 ++++---- Common/ArmEmitter.h | 10 ++++++++-- Core/MIPS/ARM/ArmCompFPU.cpp | 28 ++++++++++++++-------------- android/jni/NativeApp.cpp | 2 +- 4 files changed, 27 insertions(+), 21 deletions(-) diff --git a/Common/ArmEmitter.cpp b/Common/ArmEmitter.cpp index badfbdb8bfc0..68d66f2d3b65 100644 --- a/Common/ArmEmitter.cpp +++ b/Common/ArmEmitter.cpp @@ -1085,14 +1085,14 @@ void ARMXEmitter::VMOV(ARMReg Dest, ARMReg Src) } } -void ARMXEmitter::VCVT(ARMReg Sd, ARMReg Sm, bool to_integer, bool is_signed, bool round_to_zero) +void ARMXEmitter::VCVT(ARMReg Sd, ARMReg Sm, int flags) { - bool op = to_integer ? round_to_zero : is_signed; - bool op2 = to_integer ? is_signed : 0; + bool op = (flags & TO_INT) ? (flags & ROUND_TO_ZERO) : (flags & IS_SIGNED); + bool op2 = (flags & TO_INT) ? (flags & IS_SIGNED) : 0; Sd = SubBase(Sd); Sm = SubBase(Sm); - Write32(NO_COND | (0x1D << 23) | ((Sd & 0x1) << 22) | (0x7 << 19) | (to_integer << 18) | (op2 << 16) \ + Write32(NO_COND | (0x1D << 23) | ((Sd & 0x1) << 22) | (0x7 << 19) | ((flags & TO_INT) << 18) | (op2 << 16) \ | ((Sd & 0x1E) << 11) | (op << 7) | (0x29 << 6) | ((Sm & 0x1) << 5) | (Sm >> 1)); } diff --git a/Common/ArmEmitter.h b/Common/ArmEmitter.h index 64e0c744ea10..7a45c9c8dba5 100644 --- a/Common/ArmEmitter.h +++ b/Common/ArmEmitter.h @@ -32,6 +32,12 @@ #undef _LR #undef _PC +// VCVT flags +#define TO_FLOAT 0 +#define TO_INT 1 << 0 +#define IS_SIGNED 1 << 1 +#define ROUND_TO_ZERO 1 << 2 + namespace ArmGen { enum ARMReg @@ -466,7 +472,7 @@ class ARMXEmitter // Using just MSR here messes with our defines on the PPC side of stuff (when this code was in dolphin...) // Just need to put an underscore here, bit annoying. void _MSR (bool nzcvq, bool g, Operand2 op2); - void _MSR (bool nzcvq, bool g, ARMReg src ); + void _MSR (bool nzcvq, bool g, ARMReg src); void MRS (ARMReg dest); // Memory load/store operations @@ -528,7 +534,7 @@ class ARMXEmitter void VMUL(ARMReg Vd, ARMReg Vn, ARMReg Vm); void VMOV(ARMReg Dest, ARMReg Src, bool high); void VMOV(ARMReg Dest, ARMReg Src); - void VCVT(ARMReg Sd, ARMReg Sm, bool to_integer, bool is_signed, bool round_to_zero = false); + void VCVT(ARMReg Sd, ARMReg Sm, int flags); void QuickCallFunction(ARMReg scratchreg, void *func); // Utility functions diff --git a/Core/MIPS/ARM/ArmCompFPU.cpp b/Core/MIPS/ARM/ArmCompFPU.cpp index 040b695187bc..907be0da1c4e 100644 --- a/Core/MIPS/ARM/ArmCompFPU.cpp +++ b/Core/MIPS/ARM/ArmCompFPU.cpp @@ -19,14 +19,14 @@ #include "ArmJit.h" #include "ArmRegCache.h" -#define _RS ((op>>21) & 0x1F) -#define _RT ((op>>16) & 0x1F) -#define _RD ((op>>11) & 0x1F) -#define _FS ((op>>11) & 0x1F) -#define _FT ((op>>16) & 0x1F) -#define _FD ((op>>6 ) & 0x1F) -#define _POS ((op>>6 ) & 0x1F) -#define _SIZE ((op>>11 ) & 0x1F) +#define _RS ((op>>21) & 0x1F) +#define _RT ((op>>16) & 0x1F) +#define _RD ((op>>11) & 0x1F) +#define _FS ((op>>11) & 0x1F) +#define _FT ((op>>16) & 0x1F) +#define _FD ((op>>6 ) & 0x1F) +#define _POS ((op>>6 ) & 0x1F) +#define _SIZE ((op>>11) & 0x1F) #define DISABLE Comp_Generic(op); return; #define CONDITIONAL_DISABLE ; @@ -189,33 +189,33 @@ void Jit::Comp_FPU2op(u32 op) break; case 12: //FsI(fd) = (int)floorf(F(fs)+0.5f); break; //round.w.s fpr.MapDirtyIn(fd, fs); - VCVT(fpr.R(fd), fpr.R(fs), true, true, false); + VCVT(fpr.R(fd), fpr.R(fs), TO_INT | IS_SIGNED); break; case 13: //FsI(fd) = Rto0(F(fs))); break; //trunc.w.s fpr.MapDirtyIn(fd, fs); - VCVT(fpr.R(fd), fpr.R(fs), true, true, true); + VCVT(fpr.R(fd), fpr.R(fs), TO_INT | IS_SIGNED | ROUND_TO_ZERO); break; case 14: //FsI(fd) = (int)ceilf (F(fs)); break; //ceil.w.s fpr.MapDirtyIn(fd, fs); MOVI2R(R0, 0x3F000000); // 0.5f VMOV(S0, R0); VADD(S0,fpr.R(fs),S0); - VCVT(fpr.R(fd), S0, true, true, false); + VCVT(fpr.R(fd), S0, TO_INT | IS_SIGNED); break; case 15: //FsI(fd) = (int)floorf(F(fs)); break; //floor.w.s fpr.MapDirtyIn(fd, fs); MOVI2R(R0, 0x3F000000); // 0.5f VMOV(S0, R0); VSUB(S0,fpr.R(fs),S0); - VCVT(fpr.R(fd), S0, true, true, false); + VCVT(fpr.R(fd), S0, TO_INT | IS_SIGNED); break; case 32: //F(fd) = (float)FsI(fs); break; //cvt.s.w fpr.MapDirtyIn(fd, fs); - VCVT(fpr.R(fd), fpr.R(fs), false, true); + VCVT(fpr.R(fd), fpr.R(fs), TO_FLOAT | IS_SIGNED); break; case 36: //FsI(fd) = (int) F(fs); break; //cvt.w.s fpr.MapDirtyIn(fd, fs); - VCVT(fpr.R(fd), fpr.R(fs), true, false, true); + VCVT(fpr.R(fd), fpr.R(fs), TO_INT | ROUND_TO_ZERO); break; default: DISABLE; diff --git a/android/jni/NativeApp.cpp b/android/jni/NativeApp.cpp index a1b75a26945e..8e9e017baa64 100644 --- a/android/jni/NativeApp.cpp +++ b/android/jni/NativeApp.cpp @@ -154,7 +154,7 @@ void NativeGetAppInfo(std::string *app_dir_name, std::string *app_nice_name, boo *app_dir_name = "ppsspp"; *landscape = true; -#if defined(ARM) +#if defined(ANDROID) ArmEmitterTest(); #endif } From 0a3bf01a9bffced87faa510c643a4b6e45ce735a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marcin=20Miko=C5=82ajczyk?= Date: Fri, 1 Mar 2013 15:55:58 +0100 Subject: [PATCH 233/347] VTimer implementation --- Core/HLE/sceKernel.cpp | 1 + Core/HLE/sceKernelVTimer.cpp | 388 +++++++++++++++++++++++++---------- Core/HLE/sceKernelVTimer.h | 1 + 3 files changed, 286 insertions(+), 104 deletions(-) diff --git a/Core/HLE/sceKernel.cpp b/Core/HLE/sceKernel.cpp index 3b31b7fbe349..61a819dca540 100644 --- a/Core/HLE/sceKernel.cpp +++ b/Core/HLE/sceKernel.cpp @@ -88,6 +88,7 @@ void __KernelInit() __KernelMemoryInit(); __KernelThreadingInit(); __KernelAlarmInit(); + __KernelVTimerInit(); __KernelEventFlagInit(); __KernelMbxInit(); __KernelMutexInit(); diff --git a/Core/HLE/sceKernelVTimer.cpp b/Core/HLE/sceKernelVTimer.cpp index 45ea5ecb3cff..5e05d5954283 100644 --- a/Core/HLE/sceKernelVTimer.cpp +++ b/Core/HLE/sceKernelVTimer.cpp @@ -15,24 +15,26 @@ // Official git repository and contact information can be found at // https://github.com/hrydgard/ppsspp and http://www.ppsspp.org/. +#include "Core/CoreTiming.h" #include "sceKernel.h" -#include "sceKernelThread.h" +#include "sceKernelInterrupt.h" +#include "sceKernelMemory.h" #include "sceKernelVTimer.h" #include "HLE.h" #include "ChunkFile.h" -// Using ERROR_LOG liberally when this is in development. When done, -// should be changed to DEBUG_LOG wherever applicable. +static int vtimerTimer = -1; +static std::list vtimers; struct NativeVTimer { SceSize size; char name[KERNELOBJECT_MAX_NAME_LENGTH+1]; - int running; - SceKernelSysClock basetime; - SceKernelSysClock curtime; - SceKernelSysClock scheduletime; + int active; + u64 base; + u64 current; + u64 schedule; u32 handlerAddr; - u32 argument; + u32 commonAddr; }; struct VTimer : public KernelObject { @@ -47,194 +49,372 @@ struct VTimer : public KernelObject { } NativeVTimer nvt; + u32 memoryPtr; }; KernelObject *__KernelVTimerObject() { return new VTimer; } -u32 sceKernelCreateVTimer(const char *name, u32 optParamAddr) { - ERROR_LOG(HLE,"FAKE sceKernelCreateVTimer(%s, %08x)", name, optParamAddr); +u64 __getVTimerRunningTime(VTimer *vt) { + if (!vt->nvt.active) + return 0; - VTimer *vt = new VTimer(); + return cyclesToUs(CoreTiming::GetTicks()) - vt->nvt.base; +} - SceUID uid = kernelObjects.Create(vt); - memset(&vt->nvt, 0, sizeof(vt->nvt)); - if (name) - strncpy(vt->nvt.name, name, 32); - vt->nvt.running = 1; - return uid; //TODO: return timer ID +u64 __getVTimerTime(VTimer* vt) { + return vt->nvt.current + __getVTimerRunningTime(vt); } -u32 sceKernelDeleteVTimer(u32 uid) { - ERROR_LOG(HLE,"FAKE sceKernelDeleteVTimer(%i)", uid); +void __cancelVTimer(SceUID id) { + u32 error; + VTimer *vt = kernelObjects.Get(id, error); + + if (error) + return; + + CoreTiming::UnscheduleEvent(vtimerTimer, id); + vt->nvt.schedule = 0; + vt->nvt.handlerAddr = 0; + vt->nvt.commonAddr = 0; +} + +void __KernelScheduleVTimer(VTimer *vt, u64 schedule) { + CoreTiming::UnscheduleEvent(vtimerTimer, vt->GetUID()); + + vt->nvt.schedule = schedule; + + if (vt->nvt.active == 1) + // this delay makes the test pass, not sure if it's right + CoreTiming::ScheduleEvent(usToCycles(vt->nvt.schedule + 372), vtimerTimer, vt->GetUID()); +} + +void __rescheduleVTimer(SceUID id, u32 delay) { + u32 error; + VTimer *vt = kernelObjects.Get(id, error); + + if (error) + return; + + if (delay < 0) + delay = 100; + + vt->nvt.schedule += delay; + + __KernelScheduleVTimer(vt, vt->nvt.schedule); +} + +class VTimerIntrHandler : public IntrHandler +{ +public: + VTimerIntrHandler() : IntrHandler(PSP_SYSTIMER1_INTR) {} + + virtual bool run(PendingInterrupt &pend) { + u32 error; + SceUID vtimerID = vtimers.front(); + + VTimer *vtimer = kernelObjects.Get(vtimerID, error); + + if (error) + return false; + + if (vtimer->memoryPtr == 0) { + u32 size = 16; + vtimer->memoryPtr = kernelMemory.Alloc(size, true, std::string("VTimer").c_str()); + } + + Memory::Write_U64(vtimer->nvt.schedule, vtimer->memoryPtr); + Memory::Write_U64(__getVTimerTime(vtimer), vtimer->memoryPtr + 8); + + currentMIPS->pc = vtimer->nvt.handlerAddr; + currentMIPS->r[MIPS_REG_A0] = vtimer->GetUID(); + currentMIPS->r[MIPS_REG_A1] = vtimer->memoryPtr; + currentMIPS->r[MIPS_REG_A2] = vtimer->memoryPtr + 8; + currentMIPS->r[MIPS_REG_A3] = vtimer->nvt.commonAddr; + + return true; + } + + virtual void handleResult(PendingInterrupt &pend) { + int result = currentMIPS->r[MIPS_REG_V0]; + + int vtimerID = vtimers.front(); + vtimers.pop_front(); + + if (result == 0) + __cancelVTimer(vtimerID); + else + __rescheduleVTimer(vtimerID, result); + } +}; + +void __KernelTriggerVTimer(u64 userdata, int cyclesLate) { + SceUID uid = (SceUID) userdata; u32 error; VTimer *vt = kernelObjects.Get(uid, error); - if (!vt) { - return error; + if (vt) { + vtimers.push_back(uid); + __TriggerInterrupt(PSP_INTR_IMMEDIATE, PSP_SYSTIMER1_INTR); } - // TODO: Deschedule events here. Might share code with Stop. +} - return kernelObjects.Destroy(uid); +void __KernelVTimerInit() { + vtimers.clear(); + __RegisterIntrHandler(PSP_SYSTIMER1_INTR, new VTimerIntrHandler()); + vtimerTimer = CoreTiming::RegisterEvent("VTimer", __KernelTriggerVTimer); } -u32 sceKernelStartVTimer(u32 uid) { - ERROR_LOG(HLE,"FAKE sceKernelStartVTimer(%i)", uid); +u32 sceKernelCreateVTimer(const char *name, u32 optParamAddr) { + DEBUG_LOG(HLE, "sceKernelCreateVTimer(%s, %08x)", name, optParamAddr); + + VTimer *vtimer = new VTimer; + SceUID id = kernelObjects.Create(vtimer); + + memset(&vtimer->nvt, 0, sizeof(NativeVTimer)); + vtimer->nvt.size = sizeof(NativeVTimer); + strncpy(vtimer->nvt.name, name, KERNELOBJECT_MAX_NAME_LENGTH); + vtimer->nvt.name[KERNELOBJECT_MAX_NAME_LENGTH] = '\0'; + + vtimers.push_back(id); + + return id; +} + +u32 sceKernelDeleteVTimer(u32 uid) { + DEBUG_LOG(HLE, "sceKernelDeleteVTimer(%08x)", uid); u32 error; - VTimer *vt = kernelObjects.Get(uid, error); - if (!vt) { + VTimer* vt = kernelObjects.Get(uid, error); + + if (error) { + WARN_LOG(HLE, "%08x=sceKernelDeleteVTimer(%08x)", error, uid); return error; } - if (vt->nvt.running) { - // Already running - return 1; - } else { - vt->nvt.running = 1; - // TODO: Schedule events etc. - return 0; + + for (std::list::iterator it = vtimers.begin(); it != vtimers.end(); ++it) { + if (*it == vt->GetUID()) { + vtimers.erase(it); + break; + } } + + if (vt->memoryPtr != 0) + kernelMemory.Free(vt->memoryPtr); + + return kernelObjects.Destroy(uid); } -u32 sceKernelStopVTimer(u32 uid) { - ERROR_LOG(HLE,"FAKE sceKernelStartVTimer(%i)", uid); +u32 sceKernelGetVTimerBase(u32 uid, u32 baseClockAddr) { + DEBUG_LOG(HLE, "sceKernelGetVTimerBase(%08x, %08x)", uid, baseClockAddr); + u32 error; VTimer *vt = kernelObjects.Get(uid, error); - if (!vt) { + + if (error) { + WARN_LOG(HLE, "%08x=sceKernelGetVTimerBase(%08x, %08x)", error, uid, baseClockAddr); return error; } - if (vt->nvt.running) { - // Already running - return 0; - } else { - vt->nvt.running = 0; - // TODO: Deschedule events etc. - return 1; - } + + if (Memory::IsValidAddress(baseClockAddr)) + Memory::Write_U64(vt->nvt.base, baseClockAddr); + + return 0; } -u32 sceKernelSetVTimerHandler(u32 uid, u32 scheduleAddr, u32 handlerFuncAddr, u32 commonAddr) { - ERROR_LOG(HLE,"UNIMPL sceKernelSetVTimerHandler(%i, %08x, %08x, %08x)", - uid, scheduleAddr, handlerFuncAddr, commonAddr); +u64 sceKernelGetVTimerBaseWide(u32 uid) { + DEBUG_LOG(HLE, "sceKernelGetVTimerBaseWide(%08x)", uid); + u32 error; VTimer *vt = kernelObjects.Get(uid, error); - if (!vt) { + + if (error) { + WARN_LOG(HLE, "%08x=sceKernelGetVTimerBaseWide(%08x)", error, uid); return error; } - // TODO - return 0; + + return vt->nvt.base; } -u32 sceKernelSetVTimerHandlerWide(u32 uid, u64 schedule, u32 handlerFuncAddr, u32 commonAddr) { - ERROR_LOG(HLE,"UNIMPL sceKernelSetVTimerHandlerWide(%i, %llu, %08x, %08x)", - uid, schedule, handlerFuncAddr, commonAddr); +u32 sceKernelGetVTimerTime(u32 uid, u32 timeClockAddr) { + DEBUG_LOG(HLE, "sceKernelGetVTimerTime(%08x, %08x)", uid, timeClockAddr); + u32 error; VTimer *vt = kernelObjects.Get(uid, error); - if (!vt) { + + if (error) { + WARN_LOG(HLE, "%08x=sceKernelGetVTimerTime(%08x, %08x)", uid, timeClockAddr); return error; } - // TODO + + u64 time = __getVTimerTime(vt); + if (Memory::IsValidAddress(timeClockAddr)) + Memory::Write_U64(time, timeClockAddr); + return 0; } -u32 sceKernelCancelVTimerHandler(u32 uid) { - ERROR_LOG(HLE,"UNIMPL sceKernelCancelVTimerHandler(%i)", uid); +u64 sceKernelGetVTimerTimeWide(u32 uid) { + DEBUG_LOG(HLE, "sceKernelGetVTimerTimeWide(%08x)", uid); + u32 error; VTimer *vt = kernelObjects.Get(uid, error); - if (!vt) { + + if (error) { + WARN_LOG(HLE, "%08x=sceKernelGetVTimerTimeWide(%08x)", error, uid); return error; } - // TODO - return 0; + + u64 time = __getVTimerTime(vt); + return time; } -u32 sceKernelReferVTimerStatus(u32 uid, u32 statusAddr) { - ERROR_LOG(HLE,"sceKernelReferVTimerStatus(%i, %08x)", uid, statusAddr); +void __setVTimer(VTimer *vt, u64 time) { + vt->nvt.current = time - __getVTimerRunningTime(vt); +} + +u32 sceKernelSetVTimerTime(u32 uid, u32 timeClockAddr) { + DEBUG_LOG(HLE, "sceKernelSetVTimerTime(%08x, %08x)", uid, timeClockAddr); + u32 error; VTimer *vt = kernelObjects.Get(uid, error); - if (!vt) { + + if (error) { + WARN_LOG(HLE, "%08x=sceKernelSetVTimerTime(%08x, %08x)", uid, timeClockAddr); return error; } - // TODO: possibly update time values here? - Memory::WriteStruct(statusAddr, &vt->nvt); + + u64 time = Memory::Read_U64(timeClockAddr); + __setVTimer(vt, time); + return 0; } -u32 sceKernelGetVTimerBase(u32 uid, u32 baseClockAddr) { - ERROR_LOG(HLE,"sceKernelGetVTimerBase(%i, %08x)", uid, baseClockAddr); +u32 sceKernelSetVTimerTimeWide(u32 uid, u64 timeClock) { + DEBUG_LOG(HLE, "sceKernelSetVTimerTimeWide(%08x, %llu", uid, timeClock); + u32 error; VTimer *vt = kernelObjects.Get(uid, error); - if (!vt) { + + if (error) { + WARN_LOG(HLE, "%08x=sceKernelSetVTimerTimeWide(%08x, %llu)", uid, timeClock); return error; } - Memory::WriteStruct(baseClockAddr, &vt->nvt.basetime); + + __setVTimer(vt, timeClock); return 0; } -u64 sceKernelGetVTimerBaseWide(u32 uid) { - ERROR_LOG(HLE,"sceKernelGetVTimerWide(%i)", uid); +void __startVTimer(VTimer *vt) { + vt->nvt.active = 1; + vt->nvt.base = cyclesToUs(CoreTiming::GetTicks()); + + if (vt->nvt.schedule != 0 && vt->nvt.handlerAddr != 0) + __KernelScheduleVTimer(vt, vt->nvt.schedule); +} + +u32 sceKernelStartVTimer(u32 uid) { + DEBUG_LOG(HLE, "sceKernelStartVTimer(%08x)", uid); + u32 error; VTimer *vt = kernelObjects.Get(uid, error); - if (!vt) { - return error; + + if (vt) { + if (vt->nvt.active) + return 1; + + __startVTimer(vt); + return 0; } - // TODO: probably update the timer somehow? - u64 t = vt->nvt.curtime.lo; - t |= (u64)(vt->nvt.curtime.hi) << 32; - return t; } -u32 sceKernelGetVTimerTime(u32 uid, u32 timeClockAddr) { - ERROR_LOG(HLE,"sceKernelGetVTimerTime(%i, %08x)", uid, timeClockAddr); +void __stopVTimer(VTimer *vt) { + vt->nvt.current += __getVTimerRunningTime(vt); + vt->nvt.active = 0; +} + +u32 sceKernelStopVTimer(u32 uid) { + DEBUG_LOG(HLE, "sceKernelStopVTimer(%08x)", uid); + u32 error; VTimer *vt = kernelObjects.Get(uid, error); - if (!vt) { - return error; + + if (vt) { + if (vt->nvt.active == 0) + return 0; + + __stopVTimer(vt); + return 1; } - // TODO: probably update the timer somehow? - Memory::WriteStruct(timeClockAddr, &vt->nvt.curtime); - return 0; } -u64 sceKernelGetVTimerTimeWide(u32 uid) { - ERROR_LOG(HLE,"sceKernelGetVTimerTimeWide(%i)", uid); +u32 sceKernelSetVTimerHandler(u32 uid, u32 scheduleAddr, u32 handlerFuncAddr, u32 commonAddr) { + DEBUG_LOG(HLE, "sceKernelSetVTimerHandler(%08x, %08x, %08x, %08x)", uid, scheduleAddr, handlerFuncAddr, commonAddr); + u32 error; VTimer *vt = kernelObjects.Get(uid, error); - if (!vt) { + + if (error) { + WARN_LOG(HLE, "%08x=sceKernelSetVTimerHandler(%08x, %08x, %08x, %08x)", uid, scheduleAddr, handlerFuncAddr, commonAddr); return error; } - // TODO: probably update the timer somehow? - u64 t = vt->nvt.curtime.lo; - t |= (u64)(vt->nvt.curtime.hi) << 32; - return t; + + u64 schedule = Memory::Read_U64(scheduleAddr); + vt->nvt.handlerAddr = handlerFuncAddr; + vt->nvt.commonAddr = commonAddr; + + __KernelScheduleVTimer(vt, schedule); + + return 0; } -u32 sceKernelSetVTimerTime(u32 uid, u32 timeClockAddr) { - ERROR_LOG(HLE,"sceKernelSetVTimerTime(%i, %08x)", uid, timeClockAddr); +u32 sceKernelSetVTimerHandlerWide(u32 uid, u64 schedule, u32 handlerFuncAddr, u32 commonAddr) { + DEBUG_LOG(HLE, "sceKernelSetVTimerHandlerWide(%08x, %llu, %08x, %08x)", uid, schedule, handlerFuncAddr, commonAddr); + u32 error; VTimer *vt = kernelObjects.Get(uid, error); - if (!vt) { + + if (error) { + WARN_LOG(HLE, "%08x=sceKernelSetVTimerHandlerWide(%08x, %llu, %08x, %08x)", uid, schedule, handlerFuncAddr, commonAddr); return error; } - Memory::ReadStruct(timeClockAddr, &vt->nvt.curtime); + + vt->nvt.handlerAddr = handlerFuncAddr; + vt->nvt.commonAddr = commonAddr; + + __KernelScheduleVTimer(vt, schedule); + return 0; } -u32 sceKernelSetVTimerTimeWide(u32 uid, u64 timeClock) { - ERROR_LOG(HLE,"sceKernelSetVTimerTime(%i, %llu)", uid, timeClock); +u32 sceKernelCancelVTimerHandler(u32 uid) { + DEBUG_LOG(HLE, "sceKernelCancelVTimerHandler(%08x)", uid); + + //__cancelVTimer checks if uid is valid + __cancelVTimer(uid); + + return 0; +} + +u32 sceKernelReferVTimerStatus(u32 uid, u32 statusAddr) { + DEBUG_LOG(HLE, "sceKernelReferVTimerStatus(%08x, %08x)", uid, statusAddr); + u32 error; VTimer *vt = kernelObjects.Get(uid, error); - if (!vt) { + + if (error) { + WARN_LOG(HLE, "%08x=sceKernelReferVTimerStatus(%08x, %08x)", uid, statusAddr); return error; } - vt->nvt.curtime.lo = timeClock & 0xFFFFFFFF; - vt->nvt.curtime.hi = timeClock >> 32; + + if (Memory::IsValidAddress(statusAddr)) + Memory::WriteStruct(statusAddr, &vt->nvt); + return 0; } // Not sure why this is exposed... -void _sceKernelReturnFromTimerHandler() -{ +void _sceKernelReturnFromTimerHandler() { ERROR_LOG(HLE,"_sceKernelReturnFromTimerHandler - should not be called!"); -} +} \ No newline at end of file diff --git a/Core/HLE/sceKernelVTimer.h b/Core/HLE/sceKernelVTimer.h index 9cde7913e517..2104fe9ddd71 100644 --- a/Core/HLE/sceKernelVTimer.h +++ b/Core/HLE/sceKernelVTimer.h @@ -35,4 +35,5 @@ u32 sceKernelSetVTimerTimeWide(u32 uid, u64 timeClock); // TODO void _sceKernelReturnFromTimerHandler(); +void __KernelVTimerInit(); KernelObject *__KernelVTimerObject(); From 6c0da111b54d4591e3e10d47e92640cf2710c259 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marcin=20Miko=C5=82ajczyk?= Date: Sat, 2 Mar 2013 14:32:31 +0100 Subject: [PATCH 234/347] Fake real pll and bus frequencies --- Core/HLE/scePower.cpp | 21 +++++++++++++-------- 1 file changed, 13 insertions(+), 8 deletions(-) diff --git a/Core/HLE/scePower.cpp b/Core/HLE/scePower.cpp index 625aab9720e7..2ef95e5a3f63 100644 --- a/Core/HLE/scePower.cpp +++ b/Core/HLE/scePower.cpp @@ -43,6 +43,10 @@ const int numberOfCBPowerSlotsPrivate = 32; static bool volatileMemLocked; static int powerCbSlots[numberOfCBPowerSlots]; +// this should belong here on in CoreTiming? +static int pllFreq = 222; +static int busFreq = 111; + void __PowerInit() { memset(powerCbSlots, 0, sizeof(powerCbSlots)); volatileMemLocked = false; @@ -213,9 +217,11 @@ int sceKernelVolatileMemLock(int type, int paddr, int psize) { } -void scePowerSetClockFrequency(u32 cpufreq, u32 busfreq, u32 gpufreq) { +void scePowerSetClockFrequency(u32 pllfreq, u32 cpufreq, u32 busfreq) { CoreTiming::SetClockFrequencyMHz(cpufreq); - INFO_LOG(HLE,"scePowerSetClockFrequency(%i,%i,%i)", cpufreq, busfreq, gpufreq); + pllFreq = pllfreq; + busFreq = busfreq; + INFO_LOG(HLE,"scePowerSetClockFrequency(%i,%i,%i)", pllfreq, cpufreq, busfreq); } u32 scePowerSetCpuClockFrequency(u32 cpufreq) { @@ -225,6 +231,7 @@ u32 scePowerSetCpuClockFrequency(u32 cpufreq) { } u32 scePowerSetBusClockFrequency(u32 busfreq) { + busFreq = busfreq; DEBUG_LOG(HLE,"scePowerSetBusClockFrequency(%i)", busfreq); return 0; } @@ -236,15 +243,13 @@ u32 scePowerGetCpuClockFrequencyInt() { } u32 scePowerGetPllClockFrequencyInt() { - int freq = CoreTiming::GetClockFrequencyMHz() / 2; - INFO_LOG(HLE,"%i=scePowerGetPllClockFrequencyInt()", freq); - return freq; + INFO_LOG(HLE,"%i=scePowerGetPllClockFrequencyInt()", pllFreq); + return pllFreq; } u32 scePowerGetBusClockFrequencyInt() { - int freq = CoreTiming::GetClockFrequencyMHz() / 2; - INFO_LOG(HLE,"%i=scePowerGetBusClockFrequencyInt()", freq); - return freq; + INFO_LOG(HLE,"%i=scePowerGetBusClockFrequencyInt()", busFreq); + return busFreq; } // a85880d0, unknown name From 49d987552c316c3e24fad8350f0378fb7031311d Mon Sep 17 00:00:00 2001 From: raven02 Date: Sat, 2 Mar 2013 23:36:11 +0800 Subject: [PATCH 235/347] Wrap sceDisplaySetFramebuf --- Core/HLE/sceDisplay.cpp | 14 ++++---------- 1 file changed, 4 insertions(+), 10 deletions(-) diff --git a/Core/HLE/sceDisplay.cpp b/Core/HLE/sceDisplay.cpp index 152b322fed4b..6c196838e305 100644 --- a/Core/HLE/sceDisplay.cpp +++ b/Core/HLE/sceDisplay.cpp @@ -455,14 +455,9 @@ u32 sceDisplaySetMode(u32 unknown, u32 xres, u32 yres) { return 0; } -u32 sceDisplaySetFramebuf() { - u32 topaddr = PARAM(0); - int linesize = PARAM(1); - int pixelformat = PARAM(2); - int sync = PARAM(3); - +u32 sceDisplaySetFramebuf(u32 topaddr, int linesize, int pixelformat, int sync) { FrameBufferState fbstate; - DEBUG_LOG(HLE,"sceDisplaySetFramebuf(topaddr=%08x,linesize=%d,pixelsize=%d,sync=%d)",topaddr,linesize,pixelformat,sync); + DEBUG_LOG(HLE,"sceDisplaySetFramebuf(topaddr=%08x,linesize=%d,pixelsize=%d,sync=%d)", topaddr, linesize, pixelformat, sync); if (topaddr == 0) { DEBUG_LOG(HLE,"- screen off"); } else { @@ -502,8 +497,7 @@ bool __DisplayGetFramebuf(u8 **topaddr, u32 *linesize, u32 *pixelFormat, int mod u32 sceDisplayGetFramebuf(u32 topaddrPtr, u32 linesizePtr, u32 pixelFormatPtr, int mode) { const FrameBufferState &fbState = mode == 1 ? latchedFramebuf : framebuf; - DEBUG_LOG(HLE,"sceDisplayGetFramebuf(*%08x = %08x, *%08x = %08x, *%08x = %08x, %i)", - topaddrPtr, fbState.topaddr, linesizePtr, fbState.pspFramebufLinesize, pixelFormatPtr, fbState.pspFramebufFormat, mode); + DEBUG_LOG(HLE,"sceDisplayGetFramebuf(*%08x = %08x, *%08x = %08x, *%08x = %08x, %i)", topaddrPtr, fbState.topaddr, linesizePtr, fbState.pspFramebufLinesize, pixelFormatPtr, fbState.pspFramebufFormat, mode); if (Memory::IsValidAddress(topaddrPtr)) Memory::Write_U32(fbState.topaddr, topaddrPtr); @@ -599,7 +593,7 @@ float sceDisplayGetFramePerSec() { const HLEFunction sceDisplay[] = { {0x0E20F177,WrapU_UUU, "sceDisplaySetMode"}, - {0x289D82FE,WrapU_V, "sceDisplaySetFramebuf"}, + {0x289D82FE,WrapU_UIII, "sceDisplaySetFramebuf"}, {0xEEDA2E54,WrapU_UUUI,"sceDisplayGetFrameBuf"}, {0x36CDFADE,WrapU_V, "sceDisplayWaitVblank"}, {0x984C27E7,WrapU_V, "sceDisplayWaitVblankStart"}, From faa837ad157a6f144d419049f9c007b4d3c318a4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marcin=20Miko=C5=82ajczyk?= Date: Sat, 2 Mar 2013 17:16:46 +0100 Subject: [PATCH 236/347] Implement DoState in VTimer --- Core/HLE/sceKernel.cpp | 1 + Core/HLE/sceKernelVTimer.cpp | 17 ++++++++++++++--- Core/HLE/sceKernelVTimer.h | 1 + 3 files changed, 16 insertions(+), 3 deletions(-) diff --git a/Core/HLE/sceKernel.cpp b/Core/HLE/sceKernel.cpp index 61a819dca540..586735bd63b3 100644 --- a/Core/HLE/sceKernel.cpp +++ b/Core/HLE/sceKernel.cpp @@ -165,6 +165,7 @@ void __KernelDoState(PointerWrap &p) __KernelMemoryDoState(p); __KernelThreadingDoState(p); __KernelAlarmDoState(p); + __KernelVTimerDoState(p); __KernelEventFlagDoState(p); __KernelMbxDoState(p); __KernelModuleDoState(p); diff --git a/Core/HLE/sceKernelVTimer.cpp b/Core/HLE/sceKernelVTimer.cpp index 5e05d5954283..4cb68c4305a4 100644 --- a/Core/HLE/sceKernelVTimer.cpp +++ b/Core/HLE/sceKernelVTimer.cpp @@ -45,6 +45,7 @@ struct VTimer : public KernelObject { virtual void DoState(PointerWrap &p) { p.Do(nvt); + p.Do(memoryPtr); p.DoMarker("VTimer"); } @@ -121,7 +122,7 @@ class VTimerIntrHandler : public IntrHandler if (vtimer->memoryPtr == 0) { u32 size = 16; - vtimer->memoryPtr = kernelMemory.Alloc(size, true, std::string("VTimer").c_str()); + vtimer->memoryPtr = kernelMemory.Alloc(size, true, "VTimer"); } Memory::Write_U64(vtimer->nvt.schedule, vtimer->memoryPtr); @@ -160,6 +161,13 @@ void __KernelTriggerVTimer(u64 userdata, int cyclesLate) { } } +void __KernelVTimerDoState(PointerWrap &p) { + p.Do(vtimerTimer); + p.Do(vtimers); + CoreTiming::RestoreRegisterEvent(vtimerTimer, "VTimer", __KernelTriggerVTimer); + p.DoMarker("sceKernelVTimer"); +} + void __KernelVTimerInit() { vtimers.clear(); __RegisterIntrHandler(PSP_SYSTIMER1_INTR, new VTimerIntrHandler()); @@ -168,6 +176,8 @@ void __KernelVTimerInit() { u32 sceKernelCreateVTimer(const char *name, u32 optParamAddr) { DEBUG_LOG(HLE, "sceKernelCreateVTimer(%s, %08x)", name, optParamAddr); + if (optParamAddr != 0) + WARN_LOG(HLE, "sceKernelCreateVTimer: unsupported options parameter %08x", optParamAddr); VTimer *vtimer = new VTimer; SceUID id = kernelObjects.Create(vtimer); @@ -176,8 +186,7 @@ u32 sceKernelCreateVTimer(const char *name, u32 optParamAddr) { vtimer->nvt.size = sizeof(NativeVTimer); strncpy(vtimer->nvt.name, name, KERNELOBJECT_MAX_NAME_LENGTH); vtimer->nvt.name[KERNELOBJECT_MAX_NAME_LENGTH] = '\0'; - - vtimers.push_back(id); + vtimer->memoryPtr = 0; return id; } @@ -327,6 +336,8 @@ u32 sceKernelStartVTimer(u32 uid) { __startVTimer(vt); return 0; } + + return error; } void __stopVTimer(VTimer *vt) { diff --git a/Core/HLE/sceKernelVTimer.h b/Core/HLE/sceKernelVTimer.h index 2104fe9ddd71..9153af3c062c 100644 --- a/Core/HLE/sceKernelVTimer.h +++ b/Core/HLE/sceKernelVTimer.h @@ -36,4 +36,5 @@ u32 sceKernelSetVTimerTimeWide(u32 uid, u64 timeClock); void _sceKernelReturnFromTimerHandler(); void __KernelVTimerInit(); +void __KernelVTimerDoState(PointerWrap &p); KernelObject *__KernelVTimerObject(); From 57dfd2fe906460b21c2091a90d68085a5b6c48c7 Mon Sep 17 00:00:00 2001 From: raven02 Date: Sun, 3 Mar 2013 00:25:41 +0800 Subject: [PATCH 237/347] add clear() for all channel release --- Core/HLE/sceAudio.cpp | 3 +++ 1 file changed, 3 insertions(+) diff --git a/Core/HLE/sceAudio.cpp b/Core/HLE/sceAudio.cpp index 0d7e1eedc86f..888db3ef0582 100644 --- a/Core/HLE/sceAudio.cpp +++ b/Core/HLE/sceAudio.cpp @@ -184,6 +184,7 @@ u32 sceAudioChRelease(u32 chan) { return SCE_ERROR_AUDIO_CHANNEL_NOT_RESERVED; } DEBUG_LOG(HLE, "sceAudioChRelease(%i)", chan); + chans[chan].clear(); chans[chan].reserved = false; return 1; } @@ -271,6 +272,7 @@ u32 sceAudioOutput2GetRestSample(){ u32 sceAudioOutput2Release(){ DEBUG_LOG(HLE,"sceAudioOutput2Release()"); + chans[0].clear(); chans[0].reserved = false; return 0; } @@ -302,6 +304,7 @@ u32 sceAudioSRCChReserve(u32 sampleCount, u32 freq, u32 format) { u32 sceAudioSRCChRelease() { DEBUG_LOG(HLE, "sceAudioSRCChRelease()"); + chans[src].clear(); chans[src].reserved = false; return 0; } From e70957f907d06439cc40a8bb60da3e28a0954980 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Henrik=20Rydg=C3=A5rd?= Date: Sat, 2 Mar 2013 17:47:37 +0100 Subject: [PATCH 238/347] Android/GL UI: Allow accessing the main Settings from in-game. Note: All options may not take effect immediately. --- android/jni/MenuScreens.cpp | 13 +++++++++---- native | 2 +- 2 files changed, 10 insertions(+), 5 deletions(-) diff --git a/android/jni/MenuScreens.cpp b/android/jni/MenuScreens.cpp index a85866758827..f937860ad3fb 100644 --- a/android/jni/MenuScreens.cpp +++ b/android/jni/MenuScreens.cpp @@ -196,7 +196,7 @@ void MenuScreen::render() { } if (UIButton(GEN_ID, vlinear, w, "Settings", ALIGN_RIGHT)) { - screenManager()->switchScreen(new SettingsScreen()); + screenManager()->push(new SettingsScreen(), 0); UIReset(); } @@ -273,13 +273,18 @@ void InGameMenuScreen::render() { if (UIButton(GEN_ID, vlinear, LARGE_BUTTON_WIDTH, "Continue", ALIGN_RIGHT)) { screenManager()->finishDialog(this, DR_CANCEL); } + if (UIButton(GEN_ID, vlinear, LARGE_BUTTON_WIDTH, "Settings", ALIGN_RIGHT)) { + screenManager()->push(new SettingsScreen(), 0); + } if (UIButton(GEN_ID, vlinear, LARGE_BUTTON_WIDTH, "Return to Menu", ALIGN_RIGHT)) { screenManager()->finishDialog(this, DR_OK); } - + + /* if (UIButton(GEN_ID, Pos(dp_xres - 10, dp_yres - 10), LARGE_BUTTON_WIDTH*2, "Debug: Dump Next Frame", ALIGN_BOTTOMRIGHT)) { gpu->DumpNextFrame(); } + */ DrawWatermark(); UIEnd(); @@ -291,7 +296,7 @@ void InGameMenuScreen::render() { void SettingsScreen::update(InputState &input) { if (input.pad_buttons_down & PAD_BUTTON_BACK) { g_Config.Save(); - screenManager()->switchScreen(new MenuScreen()); + screenManager()->finishDialog(this, DR_OK); } } @@ -331,7 +336,7 @@ void SettingsScreen::render() { // UICheckBox(GEN_ID, x, y += stride, "Draw raw framebuffer (for some homebrew)", ALIGN_TOPLEFT, &g_Config.bDisplayFramebuffer); if (UIButton(GEN_ID, Pos(dp_xres - 10, dp_yres-10), LARGE_BUTTON_WIDTH, "Back", ALIGN_RIGHT | ALIGN_BOTTOM)) { - screenManager()->switchScreen(new MenuScreen()); + screenManager()->finishDialog(this, DR_OK); } UIEnd(); diff --git a/native b/native index 3f6353af5afe..3c1566b9a755 160000 --- a/native +++ b/native @@ -1 +1 @@ -Subproject commit 3f6353af5afe1542a50c33eb0bb554ea25653258 +Subproject commit 3c1566b9a7559708dfd7d1413f723da51299e5c4 From aef53708ddb3a91ca204b60e20b53b290f455d46 Mon Sep 17 00:00:00 2001 From: raven02 Date: Sun, 3 Mar 2013 02:08:10 +0800 Subject: [PATCH 239/347] Fake real cpu frequencies as well --- Core/HLE/scePower.cpp | 19 ++++++++++--------- 1 file changed, 10 insertions(+), 9 deletions(-) diff --git a/Core/HLE/scePower.cpp b/Core/HLE/scePower.cpp index 2ef95e5a3f63..6dc5f9e721a8 100644 --- a/Core/HLE/scePower.cpp +++ b/Core/HLE/scePower.cpp @@ -45,6 +45,7 @@ static int powerCbSlots[numberOfCBPowerSlots]; // this should belong here on in CoreTiming? static int pllFreq = 222; +static int cpuFreq = 222; static int busFreq = 111; void __PowerInit() { @@ -217,15 +218,16 @@ int sceKernelVolatileMemLock(int type, int paddr, int psize) { } -void scePowerSetClockFrequency(u32 pllfreq, u32 cpufreq, u32 busfreq) { - CoreTiming::SetClockFrequencyMHz(cpufreq); +u32 scePowerSetClockFrequency(u32 pllfreq, u32 cpufreq, u32 busfreq) { pllFreq = pllfreq; busFreq = busfreq; + cpuFreq = cpufreq; INFO_LOG(HLE,"scePowerSetClockFrequency(%i,%i,%i)", pllfreq, cpufreq, busfreq); + return 0; } u32 scePowerSetCpuClockFrequency(u32 cpufreq) { - CoreTiming::SetClockFrequencyMHz(cpufreq); + cpuFreq = cpufreq; DEBUG_LOG(HLE,"scePowerSetCpuClockFrequency(%i)", cpufreq); return 0; } @@ -237,9 +239,8 @@ u32 scePowerSetBusClockFrequency(u32 busfreq) { } u32 scePowerGetCpuClockFrequencyInt() { - int freq = CoreTiming::GetClockFrequencyMHz(); - DEBUG_LOG(HLE,"%i=scePowerGetCpuClockFrequencyInt()", freq); - return freq; + DEBUG_LOG(HLE,"%i=scePowerGetCpuClockFrequencyInt()", cpuFreq); + return cpuFreq; } u32 scePowerGetPllClockFrequencyInt() { @@ -302,11 +303,11 @@ static const HLEFunction scePower[] = { {0xBD681969,WrapU_V,"scePowerGetBusClockFrequencyInt"}, {0xB1A52C83,0,"scePowerGetCpuClockFrequencyFloat"}, {0x9BADB3EB,0,"scePowerGetBusClockFrequencyFloat"}, - {0x737486F2,WrapV_UUU,"scePowerSetClockFrequency"}, + {0x737486F2,WrapU_UUU,"scePowerSetClockFrequency"}, {0x34f9c463,WrapU_V,"scePowerGetPllClockFrequencyInt"}, {0xea382a27,0,"scePowerGetPllClockFrequencyFloat"}, - {0xebd177d6,WrapV_UUU,"scePower_driver_EBD177D6"}, //TODO: used in a few places, jpcsp says is the same as scePowerSetClockFrequency - {0x469989ad,WrapV_UUU,"scePower_469989ad"}, // This is also the same as SetClockFrequency + {0xebd177d6,WrapU_UUU,"scePower_driver_EBD177D6"}, //TODO: used in a few places, jpcsp says is the same as scePowerSetClockFrequency + {0x469989ad,WrapU_UUU,"scePower_469989ad"}, // This is also the same as SetClockFrequency {0xa85880d0,WrapU_V,"scePower_a85880d0_IsPSPNonFat"}, }; From f5581caccc837df86539e4b72868016fcf2a2c28 Mon Sep 17 00:00:00 2001 From: Henrik Rydgard Date: Sat, 2 Mar 2013 19:09:24 +0100 Subject: [PATCH 240/347] Some work on ARMJIT FPU compares, still not quite working. --- Common/ArmEmitter.cpp | 5 +++++ Common/ArmEmitter.h | 2 ++ Core/MIPS/ARM/ArmCompFPU.cpp | 33 ++++++++++++++++++++++----------- 3 files changed, 29 insertions(+), 11 deletions(-) diff --git a/Common/ArmEmitter.cpp b/Common/ArmEmitter.cpp index 68d66f2d3b65..f8bdc1722ba6 100644 --- a/Common/ArmEmitter.cpp +++ b/Common/ArmEmitter.cpp @@ -803,6 +803,11 @@ void ARMXEmitter::VCMP(ARMReg Vd, bool E) | (E << 7) | (0x2C << 6)); } } + +void ARMXEmitter::VMRS_APSR() { + Write32(0xEEF10A10 | (15 << 12)); +} + void ARMXEmitter::VDIV(ARMReg Vd, ARMReg Vn, ARMReg Vm) { _assert_msg_(DYNA_REC, Vd < Q0, "Pased invalid dest register to VSQRT"); diff --git a/Common/ArmEmitter.h b/Common/ArmEmitter.h index 7a45c9c8dba5..518beac60f2c 100644 --- a/Common/ArmEmitter.h +++ b/Common/ArmEmitter.h @@ -536,6 +536,8 @@ class ARMXEmitter void VMOV(ARMReg Dest, ARMReg Src); void VCVT(ARMReg Sd, ARMReg Sm, int flags); + void VMRS_APSR(); + void QuickCallFunction(ARMReg scratchreg, void *func); // Utility functions void MOVI2R(ARMReg reg, u32 val, bool optimize = true); diff --git a/Core/MIPS/ARM/ArmCompFPU.cpp b/Core/MIPS/ARM/ArmCompFPU.cpp index 907be0da1c4e..d9fdd01a78f1 100644 --- a/Core/MIPS/ARM/ArmCompFPU.cpp +++ b/Core/MIPS/ARM/ArmCompFPU.cpp @@ -101,59 +101,70 @@ void Jit::Comp_FPULS(u32 op) } void Jit::Comp_FPUComp(u32 op) { - DISABLE; int fs = _FS; int ft = _FT; + // See http://infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.dui0204j/Chdhcfbc.html + // for the flags after VCMP. + // Also, need to copy the flags from FPSCR to the APSR through VMRS. + switch (op & 0xf) { case 0: //f case 8: //sf - /*MOVI2R(R0, (u32)¤tMIPS->fpcond); - MOV(R0, Operand2(0));*/ + MOVI2R(R0, 0); + STR(CTXREG, R0, offsetof(MIPSState, fpcond)); break; case 1: //un case 9: //ngle // CompFPComp(fs, ft, CMPUNORDSS); + DISABLE; break; case 2: //eq case 10: //seq // CompFPComp(fs, ft, CMPEQSS); + DISABLE; break; case 3: //ueq case 11: //ngl // CompFPComp(fs, ft, CMPEQSS, true); + DISABLE; break; case 4: //olt case 12: //lt // CompFPComp(fs, ft, CMPLTSS); + DISABLE; break; case 5: //ult case 13: //nge // CompFPComp(ft, fs, CMPNLESS); + DISABLE; break; case 6: //ole case 14: //le - // This VCMP crashes on ARM11 with an exception. - /* - fpr.MapInIn(fpr.R(fs), fpr.R(ft)); + DISABLE; + // ?? This VCMP crashes on ARM11 with an exception. + // Also, this doesn't actually work correctly yet. I'm not sure why. + fpr.MapInIn(fs, ft); VCMP(fpr.R(fs), fpr.R(ft)); - MOVI2R(R0, (u32)¤tMIPS->fpcond); - SetCC(CC_LT); - // TODO: Should set R0 to 0 or 1 - VSTR(fpr.R(fs), R0, 0); + VMRS_APSR(); // Move FP flags from FPSCR to APSR (regular flags). + SetCC(CC_GT); + MOVI2R(R0, 0); + SetCC(CC_LE); + MOVI2R(R0, 1); SetCC(CC_AL); - */ + STR(CTXREG, R0, offsetof(MIPSState, fpcond)); break; case 7: //ule case 15: //ngt // CompFPComp(ft, fs, CMPNLTSS); + DISABLE; break; default: From 6bafb7075af534ddceb18f37dab403608d7734ae Mon Sep 17 00:00:00 2001 From: raven02 Date: Sun, 3 Mar 2013 02:19:26 +0800 Subject: [PATCH 241/347] Revert cpufreq :) --- Core/HLE/scePower.cpp | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/Core/HLE/scePower.cpp b/Core/HLE/scePower.cpp index 6dc5f9e721a8..4659fded8e56 100644 --- a/Core/HLE/scePower.cpp +++ b/Core/HLE/scePower.cpp @@ -45,7 +45,6 @@ static int powerCbSlots[numberOfCBPowerSlots]; // this should belong here on in CoreTiming? static int pllFreq = 222; -static int cpuFreq = 222; static int busFreq = 111; void __PowerInit() { @@ -219,15 +218,15 @@ int sceKernelVolatileMemLock(int type, int paddr, int psize) { u32 scePowerSetClockFrequency(u32 pllfreq, u32 cpufreq, u32 busfreq) { + CoreTiming::SetClockFrequencyMHz(cpufreq); pllFreq = pllfreq; busFreq = busfreq; - cpuFreq = cpufreq; INFO_LOG(HLE,"scePowerSetClockFrequency(%i,%i,%i)", pllfreq, cpufreq, busfreq); return 0; } u32 scePowerSetCpuClockFrequency(u32 cpufreq) { - cpuFreq = cpufreq; + CoreTiming::SetClockFrequencyMHz(cpufreq); DEBUG_LOG(HLE,"scePowerSetCpuClockFrequency(%i)", cpufreq); return 0; } @@ -239,8 +238,9 @@ u32 scePowerSetBusClockFrequency(u32 busfreq) { } u32 scePowerGetCpuClockFrequencyInt() { - DEBUG_LOG(HLE,"%i=scePowerGetCpuClockFrequencyInt()", cpuFreq); - return cpuFreq; + int freq = CoreTiming::GetClockFrequencyMHz(); + DEBUG_LOG(HLE,"%i=scePowerGetCpuClockFrequencyInt()", freq); + return freq; } u32 scePowerGetPllClockFrequencyInt() { From 96a22063e312c9264b6275ec15133a9c8e41d19a Mon Sep 17 00:00:00 2001 From: "Unknown W. Brackets" Date: Sat, 2 Mar 2013 01:31:37 -0800 Subject: [PATCH 242/347] Add custom step for Windows for git-version.c. --- .gitignore | 1 + Core/Core.vcxproj | 18 +++++++++++ Core/Core.vcxproj.filters | 1 + Windows/git-version-gen.cmd | 61 +++++++++++++++++++++++++++++++++++++ 4 files changed, 81 insertions(+) create mode 100644 Windows/git-version-gen.cmd diff --git a/.gitignore b/.gitignore index 86e02e32ae31..e0896a6bcb5a 100644 --- a/.gitignore +++ b/.gitignore @@ -37,6 +37,7 @@ gen libs obj build*/ +/git-version.c .pspsh.hist __testoutput.txt diff --git a/Core/Core.vcxproj b/Core/Core.vcxproj index c744df54b3a1..33fef44d5979 100644 --- a/Core/Core.vcxproj +++ b/Core/Core.vcxproj @@ -74,6 +74,10 @@ true + + ../Windows/git-version-gen.cmd + Updating git-version.c + @@ -87,6 +91,10 @@ true + + ../Windows/git-version-gen.cmd + Updating git-version.c + @@ -104,6 +112,11 @@ true true + + + ../Windows/git-version-gen.cmd + Updating git-version.c + @@ -120,11 +133,16 @@ true true + + ../Windows/git-version-gen.cmd + Updating git-version.c + + diff --git a/Core/Core.vcxproj.filters b/Core/Core.vcxproj.filters index 04d25d780a24..02fd2be57105 100644 --- a/Core/Core.vcxproj.filters +++ b/Core/Core.vcxproj.filters @@ -382,6 +382,7 @@ Font + diff --git a/Windows/git-version-gen.cmd b/Windows/git-version-gen.cmd new file mode 100644 index 000000000000..110e30f34379 --- /dev/null +++ b/Windows/git-version-gen.cmd @@ -0,0 +1,61 @@ +@echo off +rem // Copyright (c) 2012- PPSSPP Project. + +rem // This program is free software: you can redistribute it and/or modify +rem // it under the terms of the GNU General Public License as published by +rem // the Free Software Foundation, version 2.0 or later versions. + +rem // This program is distributed in the hope that it will be useful, +rem // but WITHOUT ANY WARRANTY; without even the implied warranty of +rem // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +rem // GNU General Public License 2.0 for more details. + +rem // A copy of the GPL 2.0 should have been included with the program. +rem // If not, see http://www.gnu.org/licenses/ + +rem // Official git repository and contact information can be found at +rem // https://github.com/hrydgard/ppsspp and http://www.ppsspp.org/. + +setlocal + +set GIT_VERSION_FILE=%~p0..\git-version.c +if "%GIT%" == "" ( + set GIT=git +) + +if exist "%GIT_VERSION_FILE%" ( + rem // Skip updating the file if PPSSPP_GIT_VERSION_NO_UPDATE is 1. + findstr /B /C:"#define PPSSPP_GIT_VERSION_NO_UPDATE 1" "%GIT_VERSION_FILE%" > NUL + if not errorlevel 1 ( + goto done + ) +) + +"%GIT%" describe --always > NUL 2> NUL +if errorlevel 1 ( + echo Unable to update git-version.c, %GIT% not on path. + + echo // This is a generated file. > "%GIT_VERSION_FILE%" + echo. >> "%GIT_VERSION_FILE%" + echo const char *PPSSPP_GIT_VERSION = "unknown"; >> "%GIT_VERSION_FILE%" + goto done +) + +for /F %%I IN ('"%GIT%" describe --always') do set GIT_VERSION=%%I + +rem // Don't modify the file if it already has the current version. +if exist "%GIT_VERSION_FILE%" ( + findstr /C:"%GIT_VERSION%" "%GIT_VERSION_FILE%" > NUL + if not errorlevel 1 ( + goto done + ) +) + +echo // This is a generated file. > "%GIT_VERSION_FILE%" +echo. >> "%GIT_VERSION_FILE%" +echo const char *PPSSPP_GIT_VERSION = "%GIT_VERSION%"; >> "%GIT_VERSION_FILE%" +echo. >> "%GIT_VERSION_FILE%" +echo // If you don't want this file to update/recompile, change to 1. >> "%GIT_VERSION_FILE%" +echo #define PPSSPP_GIT_VERSION_NO_UPDATE 0 >> "%GIT_VERSION_FILE%" + +:done From 4694d4f1a3f91b8720ade38c76431c7c8a96d761 Mon Sep 17 00:00:00 2001 From: "Unknown W. Brackets" Date: Sat, 2 Mar 2013 11:01:08 -0800 Subject: [PATCH 243/347] Add git-version.c generation to CMake. --- CMakeLists.txt | 14 +++++++++++++- git-version.cmake | 42 ++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 55 insertions(+), 1 deletion(-) create mode 100644 git-version.cmake diff --git a/CMakeLists.txt b/CMakeLists.txt index cfabb3510d2f..dd4d055df78e 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -823,11 +823,23 @@ add_library(${CoreLibName} ${CoreLinkType} Core/Util/ppge_atlas.cpp Core/Util/ppge_atlas.h $ - Globals.h) + Globals.h + git-version.c) target_link_libraries(${CoreLibName} Common native kirk cityhash ${GLEW_LIBRARIES} ${OPENGL_LIBRARIES}) setup_target_project(${CoreLibName} Core) +# Generate git-version.c at build time. +add_custom_target(GitVersion ALL + DEPENDS something_that_never_exists) +add_custom_command(OUTPUT something_that_never_exists + COMMAND ${CMAKE_COMMAND} -DSOURCE_DIR=${CMAKE_CURRENT_SOURCE_DIR} + -P ${CMAKE_CURRENT_SOURCE_DIR}/git-version.cmake) + +set_source_files_properties(${CMAKE_CURRENT_SOURCE_DIR}/git-version.c + PROPERTIES GENERATED TRUE) +add_dependencies(${CoreLibName} GitVersion) + add_library(GPU OBJECT GPU/GLES/DisplayListInterpreter.cpp GPU/GLES/DisplayListInterpreter.h diff --git a/git-version.cmake b/git-version.cmake new file mode 100644 index 000000000000..eca9a4de3310 --- /dev/null +++ b/git-version.cmake @@ -0,0 +1,42 @@ +set(GIT_VERSION_FILE "${SOURCE_DIR}/git-version.c") +set(GIT_VERSION "unknown") +set(GIT_VERSION_UPDATE "1") + +find_package(Git) +if(GIT_FOUND) + execute_process(COMMAND ${GIT_EXECUTABLE} describe --always + RESULT_VARIABLE exit_code + OUTPUT_VARIABLE GIT_VERSION) + if(NOT ${exit_code} EQUAL 0) + message(WARNING "git describe failed, unable to include version.") + endif() + string(STRIP ${GIT_VERSION} GIT_VERSION) +else() + message(WARNING "git not found, unable to include version.") +endif() + +if(EXISTS ${GIT_VERSION_FILE}) + # Don't update if marked not to update. + file(STRINGS ${GIT_VERSION_FILE} match + REGEX "PPSSPP_GIT_VERSION_NO_UPDATE = 1") + if(NOT $[match} EQUAL "") + set(GIT_VERSION_UPDATE "0") + endif() + + # Don't update if it's already the same. + file(STRINGS ${GIT_VERSION_FILE} match + REGEX "${GIT_VERSION}") + if(NOT $[match} EQUAL "") + set(GIT_VERSION_UPDATE "0") + endif() +endif() + +set(code_string "// This is a generated file.\n\n" + "const char *PPSSPP_GIT_VERSION = \"${GIT_VERSION}\"\;\n\n" + "// If you don't want this file to update/recompile, change to 1.\n" + "#define PPSSPP_GIT_VERSION_NO_UPDATE 0\n") + +message(WARNING "UPDATE: ${GIT_VERSION_FILE}") +if ("${GIT_VERSION_UPDATE}" EQUAL "1") + file(WRITE ${GIT_VERSION_FILE} ${code_string}) +endif() \ No newline at end of file From a2aa5fe23eeba8fdd6b25dd3d6b1f0761dcebd2f Mon Sep 17 00:00:00 2001 From: "Unknown W. Brackets" Date: Sat, 2 Mar 2013 11:19:14 -0800 Subject: [PATCH 244/347] Fix iOS / debug ARM build. --- .gitignore | 3 +++ Core/MIPS/ARM/ArmCompVFPU.cpp | 4 ++-- Core/MIPS/ARM/ArmJit.h | 8 ++++---- 3 files changed, 9 insertions(+), 6 deletions(-) diff --git a/.gitignore b/.gitignore index e0896a6bcb5a..e01eb254a11e 100644 --- a/.gitignore +++ b/.gitignore @@ -23,6 +23,9 @@ Release Windows/x64 Windows/ipch +# For Mac +.DS_Store + # For ppsspp.ini, etc. *.ini diff --git a/Core/MIPS/ARM/ArmCompVFPU.cpp b/Core/MIPS/ARM/ArmCompVFPU.cpp index 19cb4b6bbc4b..a9da1e75fa4c 100644 --- a/Core/MIPS/ARM/ArmCompVFPU.cpp +++ b/Core/MIPS/ARM/ArmCompVFPU.cpp @@ -120,7 +120,7 @@ namespace MIPSComp } void Jit::GetVectorRegsPrefixD(u8 *regs, VectorSize sz, int vectorReg) { - _assert_(js.prefixDFlag & JitState::PREFIX_KNOWN); + _assert_(js.prefixDFlag & ArmJitState::PREFIX_KNOWN); GetVectorRegs(regs, sz, vectorReg); if (js.prefixD == 0) @@ -136,7 +136,7 @@ namespace MIPSComp } void Jit::ApplyPrefixD(const u8 *vregs, VectorSize sz) { - _assert_(js.prefixDFlag & JitState::PREFIX_KNOWN); + _assert_(js.prefixDFlag & ArmJitState::PREFIX_KNOWN); if (!js.prefixD) return; int n = GetNumVectorElements(sz); diff --git a/Core/MIPS/ARM/ArmJit.h b/Core/MIPS/ARM/ArmJit.h index 358e6a83d164..8d9f4046c1bc 100644 --- a/Core/MIPS/ARM/ArmJit.h +++ b/Core/MIPS/ARM/ArmJit.h @@ -107,11 +107,11 @@ struct ArmJitState } } u8 VfpuWriteMask() const { - _assert_(prefixDFlag & JitState::PREFIX_KNOWN); + _assert_(prefixDFlag & PREFIX_KNOWN); return (prefixD >> 8) & 0xF; } bool VfpuWriteMask(int i) const { - _assert_(prefixDFlag & JitState::PREFIX_KNOWN); + _assert_(prefixDFlag & PREFIX_KNOWN); return (prefixD >> (8 + i)) & 1; } }; @@ -224,12 +224,12 @@ class Jit : public ArmGen::ARMXCodeBlock void ApplyPrefixST(u8 *vregs, u32 prefix, VectorSize sz); void ApplyPrefixD(const u8 *vregs, VectorSize sz); void GetVectorRegsPrefixS(u8 *regs, VectorSize sz, int vectorReg) { - _assert_(js.prefixSFlag & JitState::PREFIX_KNOWN); + _assert_(js.prefixSFlag & ArmJitState::PREFIX_KNOWN); GetVectorRegs(regs, sz, vectorReg); ApplyPrefixST(regs, js.prefixS, sz); } void GetVectorRegsPrefixT(u8 *regs, VectorSize sz, int vectorReg) { - _assert_(js.prefixTFlag & JitState::PREFIX_KNOWN); + _assert_(js.prefixTFlag & ArmJitState::PREFIX_KNOWN); GetVectorRegs(regs, sz, vectorReg); ApplyPrefixST(regs, js.prefixT, sz); } From 9170d157ff5cebf95a11f25f5636d0ad657cc7b5 Mon Sep 17 00:00:00 2001 From: "Unknown W. Brackets" Date: Sat, 2 Mar 2013 11:19:40 -0800 Subject: [PATCH 245/347] Force libc++ on Mac, needed for Xcode 4.6 at least. --- CMakeLists.txt | 1 + 1 file changed, 1 insertion(+) diff --git a/CMakeLists.txt b/CMakeLists.txt index dd4d055df78e..d7e02f23f380 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -136,6 +136,7 @@ if(NOT MSVC) set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -stdlib=libstdc++") elseif(APPLE) set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -stdlib=libc++") + set(CMAKE_XCODE_ATTRIBUTE_CLANG_CXX_LIBRARY "libc++") endif() if(CMAKE_COMPILER_IS_GNUCXX AND CMAKE_CXX_COMPILER_VERSION VERSION_LESS 4.7.0) set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++0x") From d2020372d1f33338dce441e8930f067473c6a429 Mon Sep 17 00:00:00 2001 From: "Unknown W. Brackets" Date: Sat, 2 Mar 2013 11:27:31 -0800 Subject: [PATCH 246/347] Fix small warning. --- Core/HLE/sceKernelVTimer.cpp | 2 ++ 1 file changed, 2 insertions(+) diff --git a/Core/HLE/sceKernelVTimer.cpp b/Core/HLE/sceKernelVTimer.cpp index 4cb68c4305a4..eedd35e5fb2f 100644 --- a/Core/HLE/sceKernelVTimer.cpp +++ b/Core/HLE/sceKernelVTimer.cpp @@ -358,6 +358,8 @@ u32 sceKernelStopVTimer(u32 uid) { __stopVTimer(vt); return 1; } + + return error; } u32 sceKernelSetVTimerHandler(u32 uid, u32 scheduleAddr, u32 handlerFuncAddr, u32 commonAddr) { From fc48fdbd97e43f3bf09633ed52a4bc6c859c2ac4 Mon Sep 17 00:00:00 2001 From: "Unknown W. Brackets" Date: Sat, 2 Mar 2013 12:03:06 -0800 Subject: [PATCH 247/347] Add git-version.c generation for Qt. --- Qt/Core.pro | 8 +++++++ Qt/git-version-gen.sh | 52 +++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 60 insertions(+) create mode 100755 Qt/git-version-gen.sh diff --git a/Qt/Core.pro b/Qt/Core.pro index 69f6bb9fc856..feb0bfcda91f 100755 --- a/Qt/Core.pro +++ b/Qt/Core.pro @@ -4,6 +4,14 @@ TARGET = Core TEMPLATE = lib CONFIG += staticlib +version.target = ../git-version.c +version.commands = $$PWD/git-version-gen.sh +version.depends = ../.git + +QMAKE_EXTRA_TARGETS += version +PRE_TARGETDEPS += ../git-version.c +SOURCES += ../git-version.c + include(Settings.pri) INCLUDEPATH += ../native ../Core/MIPS ../ diff --git a/Qt/git-version-gen.sh b/Qt/git-version-gen.sh new file mode 100755 index 000000000000..1f0e259fb90b --- /dev/null +++ b/Qt/git-version-gen.sh @@ -0,0 +1,52 @@ +#!/bin/bash +## Copyright (c) 2012- PPSSPP Project. + +## This program is free software: you can redistribute it and/or modify +## it under the terms of the GNU General Public License as published by +## the Free Software Foundation, version 2.0 or later versions. + +## This program is distributed in the hope that it will be useful, +## but WITHOUT ANY WARRANTY; without even the implied warranty of +## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +## GNU General Public License 2.0 for more details. + +## A copy of the GPL 2.0 should have been included with the program. +## If not, see http://www.gnu.org/licenses/ + +## Official git repository and contact information can be found at +## https://github.com/hrydgard/ppsspp and http://www.ppsspp.org/. + +GIT_VERSION_FILE=$(dirname $0)/../git-version.c + +if [ -e "$GIT_VERSION_FILE" ]; then + # Skip updating the file if PPSSPP_GIT_VERSION_NO_UPDATE is 1. + results=$(grep '^#define PPSSPP_GIT_VERSION_NO_UPDATE 1' "$GIT_VERSION_FILE") + if [ "$results" != "" ]; then + exit 0 + fi +fi + +GIT_VERSION=$(git describe --always) +if [ "$GIT_VERSION" == "" ]; then + echo "Unable to update git-version.c, git not on path." 1>&2 + + echo "// This is a generated file." > "$GIT_VERSION_FILE" + echo >> "$GIT_VERSION_FILE" + echo 'const char *PPSSPP_GIT_VERSION = "unknown";' >> "$GIT_VERSION_FILE" + exit 0 +fi + +# Don't modify the file if it already has the current version. +if [ -e "$GIT_VERSION_FILE" ]; then + results=$(grep "$GIT_VERSION" "$GIT_VERSION_FILE") + if [ "$results" != "" ]; then + exit 0 + fi +fi + +echo "// This is a generated file." > "$GIT_VERSION_FILE" +echo >> "$GIT_VERSION_FILE" +echo 'const char *PPSSPP_GIT_VERSION = "'"$GIT_VERSION"'";' >> "$GIT_VERSION_FILE" +echo >> "$GIT_VERSION_FILE" +echo "// If you don't want this file to update/recompile, change to 1." >> "$GIT_VERSION_FILE" +echo "#define PPSSPP_GIT_VERSION_NO_UPDATE 0" >> "$GIT_VERSION_FILE" From aadc7db33dfa9f85250b166ccfd548d5cdb31c56 Mon Sep 17 00:00:00 2001 From: "Unknown W. Brackets" Date: Sat, 2 Mar 2013 12:41:39 -0800 Subject: [PATCH 248/347] And the Android cmake file as well. --- Core/CMakeLists.txt | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/Core/CMakeLists.txt b/Core/CMakeLists.txt index 3bbd94a38439..6592c9a63c09 100644 --- a/Core/CMakeLists.txt +++ b/Core/CMakeLists.txt @@ -85,6 +85,7 @@ set(SRCS PSPMixer.cpp System.cpp Core.cpp + ../git-version.cpp ) if(ARM) @@ -115,6 +116,17 @@ add_library(core STATIC ${SRCS}) target_link_libraries(core general common) target_link_libraries(core general base) +# Generate git-version.cpp at build time. +add_custom_target(GitVersion ALL + DEPENDS something_that_never_exists) +add_custom_command(OUTPUT something_that_never_exists + COMMAND ${CMAKE_COMMAND} -DSOURCE_DIR=${CMAKE_CURRENT_SOURCE_DIR}/.. + -P ${CMAKE_CURRENT_SOURCE_DIR}/../git-version.cmake) + +set_source_files_properties(${CMAKE_CURRENT_SOURCE_DIR}/../git-version.cpp + PROPERTIES GENERATED TRUE) +add_dependencies(core GitVersion) + if(UNIX) add_definitions(-fPIC) add_definitions(-std=gnu++0x) From 35fe2b4a631ef9385fccb10982de192ebb6a9916 Mon Sep 17 00:00:00 2001 From: "Unknown W. Brackets" Date: Sat, 2 Mar 2013 12:31:11 -0800 Subject: [PATCH 249/347] Actually use the git version. Also switch to cpp, duh. --- CMakeLists.txt | 6 +++--- Core/Config.h | 3 +-- Core/Core.vcxproj | 10 +++++----- Core/Core.vcxproj.filters | 2 +- Qt/Core.pro | 6 +++--- Qt/QtHost.cpp | 2 +- Qt/git-version-gen.sh | 4 ++-- Qt/mainwindow.cpp | 2 +- Windows/WindowsHost.cpp | 4 +--- Windows/WndMainWindow.cpp | 11 +++++------ Windows/git-version-gen.cmd | 4 ++-- android/jni/MenuScreens.cpp | 11 ++++++++--- git-version.cmake | 2 +- 13 files changed, 34 insertions(+), 33 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index d7e02f23f380..b3dbfd8d2d82 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -825,19 +825,19 @@ add_library(${CoreLibName} ${CoreLinkType} Core/Util/ppge_atlas.h $ Globals.h - git-version.c) + git-version.cpp) target_link_libraries(${CoreLibName} Common native kirk cityhash ${GLEW_LIBRARIES} ${OPENGL_LIBRARIES}) setup_target_project(${CoreLibName} Core) -# Generate git-version.c at build time. +# Generate git-version.cpp at build time. add_custom_target(GitVersion ALL DEPENDS something_that_never_exists) add_custom_command(OUTPUT something_that_never_exists COMMAND ${CMAKE_COMMAND} -DSOURCE_DIR=${CMAKE_CURRENT_SOURCE_DIR} -P ${CMAKE_CURRENT_SOURCE_DIR}/git-version.cmake) -set_source_files_properties(${CMAKE_CURRENT_SOURCE_DIR}/git-version.c +set_source_files_properties(${CMAKE_CURRENT_SOURCE_DIR}/git-version.cpp PROPERTIES GENERATED TRUE) add_dependencies(${CoreLibName} GitVersion) diff --git a/Core/Config.h b/Core/Config.h index e3d4139a19fb..8468158d4643 100644 --- a/Core/Config.h +++ b/Core/Config.h @@ -20,8 +20,7 @@ #include #include -#define PPSSPP_VERSION_STR "0.6.1" - +extern const char *PPSSPP_GIT_VERSION; struct SState { diff --git a/Core/Core.vcxproj b/Core/Core.vcxproj index 33fef44d5979..7b4f9b0247a6 100644 --- a/Core/Core.vcxproj +++ b/Core/Core.vcxproj @@ -76,7 +76,7 @@ ../Windows/git-version-gen.cmd - Updating git-version.c + Updating git-version.cpp @@ -93,7 +93,7 @@ ../Windows/git-version-gen.cmd - Updating git-version.c + Updating git-version.cpp @@ -115,7 +115,7 @@ ../Windows/git-version-gen.cmd - Updating git-version.c + Updating git-version.cpp @@ -135,14 +135,14 @@ ../Windows/git-version-gen.cmd - Updating git-version.c + Updating git-version.cpp - + diff --git a/Core/Core.vcxproj.filters b/Core/Core.vcxproj.filters index 02fd2be57105..fd4a7beda09b 100644 --- a/Core/Core.vcxproj.filters +++ b/Core/Core.vcxproj.filters @@ -382,7 +382,7 @@ Font - + diff --git a/Qt/Core.pro b/Qt/Core.pro index feb0bfcda91f..f2060f8f2453 100755 --- a/Qt/Core.pro +++ b/Qt/Core.pro @@ -4,13 +4,13 @@ TARGET = Core TEMPLATE = lib CONFIG += staticlib -version.target = ../git-version.c +version.target = ../git-version.cpp version.commands = $$PWD/git-version-gen.sh version.depends = ../.git QMAKE_EXTRA_TARGETS += version -PRE_TARGETDEPS += ../git-version.c -SOURCES += ../git-version.c +PRE_TARGETDEPS += ../git-version.cpp +SOURCES += ../git-version.cpp include(Settings.pri) diff --git a/Qt/QtHost.cpp b/Qt/QtHost.cpp index 4295edf12663..a5f04cb81806 100644 --- a/Qt/QtHost.cpp +++ b/Qt/QtHost.cpp @@ -43,7 +43,7 @@ void QtHost::ShutdownGL() void QtHost::SetWindowTitle(const char *message) { - QString title = "PPSSPP " + QString(PPSSPP_VERSION_STR) + " - " + QString::fromUtf8(message); + QString title = "PPSSPP " + QString(PPSSPP_GIT_VERSION) + " - " + QString::fromUtf8(message); mainWindow->setWindowTitle(title); } diff --git a/Qt/git-version-gen.sh b/Qt/git-version-gen.sh index 1f0e259fb90b..d441c38379a3 100755 --- a/Qt/git-version-gen.sh +++ b/Qt/git-version-gen.sh @@ -16,7 +16,7 @@ ## Official git repository and contact information can be found at ## https://github.com/hrydgard/ppsspp and http://www.ppsspp.org/. -GIT_VERSION_FILE=$(dirname $0)/../git-version.c +GIT_VERSION_FILE=$(dirname $0)/../git-version.cpp if [ -e "$GIT_VERSION_FILE" ]; then # Skip updating the file if PPSSPP_GIT_VERSION_NO_UPDATE is 1. @@ -28,7 +28,7 @@ fi GIT_VERSION=$(git describe --always) if [ "$GIT_VERSION" == "" ]; then - echo "Unable to update git-version.c, git not on path." 1>&2 + echo "Unable to update git-version.cpp, git not on path." 1>&2 echo "// This is a generated file." > "$GIT_VERSION_FILE" echo >> "$GIT_VERSION_FILE" diff --git a/Qt/mainwindow.cpp b/Qt/mainwindow.cpp index 498aaf4f4151..eaec0249aa9c 100644 --- a/Qt/mainwindow.cpp +++ b/Qt/mainwindow.cpp @@ -884,7 +884,7 @@ void MainWindow::SetZoom(float zoom) { void MainWindow::SetGameTitle(QString text) { - QString title = "PPSSPP " + QString(PPSSPP_VERSION_STR); + QString title = "PPSSPP " + QString(PPSSPP_GIT_VERSION); if (text != "") title += QString(" - %1").arg(text); diff --git a/Windows/WindowsHost.cpp b/Windows/WindowsHost.cpp index cef4e558e6d8..7f17e86137b4 100644 --- a/Windows/WindowsHost.cpp +++ b/Windows/WindowsHost.cpp @@ -38,9 +38,7 @@ void WindowsHost::ShutdownGL() void WindowsHost::SetWindowTitle(const char *message) { - // Really need a better way to deal with versions. - std::string title = "PPSSPP " PPSSPP_VERSION_STR " - "; - title += message; + std::string title = std::string("PPSSPP ") + PPSSPP_GIT_VERSION + " - " + message; int size = MultiByteToWideChar(CP_UTF8, 0, message, (int) title.size(), NULL, 0); if (size > 0) diff --git a/Windows/WndMainWindow.cpp b/Windows/WndMainWindow.cpp index 57208e38729d..998b21bdb2f2 100644 --- a/Windows/WndMainWindow.cpp +++ b/Windows/WndMainWindow.cpp @@ -844,14 +844,13 @@ namespace MainWindow void SetPlaying(const char *text) { + char temp[256]; if (text == 0) - SetWindowText(hwndMain, "PPSSPP " PPSSPP_VERSION_STR); + snprintf(temp, 256, "PPSSPP %s", PPSSPP_GIT_VERSION); else - { - char temp[256]; - sprintf(temp, "%s - %s", text, "PPSSPP " PPSSPP_VERSION_STR); - SetWindowText(hwndMain,temp); - } + snprintf(temp, 256, "%s - PPSSPP %s", text, PPSSPP_GIT_VERSION); + temp[255] = '\0'; + SetWindowText(hwndMain, temp); } void SaveStateActionFinished(bool result, void *userdata) diff --git a/Windows/git-version-gen.cmd b/Windows/git-version-gen.cmd index 110e30f34379..b5d21bf5123f 100644 --- a/Windows/git-version-gen.cmd +++ b/Windows/git-version-gen.cmd @@ -18,7 +18,7 @@ rem // https://github.com/hrydgard/ppsspp and http://www.ppsspp.org/. setlocal -set GIT_VERSION_FILE=%~p0..\git-version.c +set GIT_VERSION_FILE=%~p0..\git-version.cpp if "%GIT%" == "" ( set GIT=git ) @@ -33,7 +33,7 @@ if exist "%GIT_VERSION_FILE%" ( "%GIT%" describe --always > NUL 2> NUL if errorlevel 1 ( - echo Unable to update git-version.c, %GIT% not on path. + echo Unable to update git-version.cpp, %GIT% not on path. echo // This is a generated file. > "%GIT_VERSION_FILE%" echo. >> "%GIT_VERSION_FILE%" diff --git a/android/jni/MenuScreens.cpp b/android/jni/MenuScreens.cpp index f937860ad3fb..e9efc4583442 100644 --- a/android/jni/MenuScreens.cpp +++ b/android/jni/MenuScreens.cpp @@ -168,7 +168,7 @@ void MenuScreen::render() { ui_draw2d.DrawTextShadow(UBUNTU48, "PPSSPP", dp_xres + xoff - w/2, 80, 0xFFFFFFFF, ALIGN_HCENTER | ALIGN_BOTTOM); ui_draw2d.SetFontScale(0.7f, 0.7f); - ui_draw2d.DrawTextShadow(UBUNTU24, PPSSPP_VERSION_STR, dp_xres + xoff, 80, 0xFFFFFFFF, ALIGN_RIGHT | ALIGN_BOTTOM); + ui_draw2d.DrawTextShadow(UBUNTU24, PPSSPP_GIT_VERSION, dp_xres + xoff, 80, 0xFFFFFFFF, ALIGN_RIGHT | ALIGN_BOTTOM); ui_draw2d.SetFontScale(1.0f, 1.0f); VLinear vlinear(dp_xres + xoff, 95, 20); @@ -444,9 +444,9 @@ void CreditsScreen::update(InputState &input_state) { frames_++; } -static const char *credits[] = +static char *credits[] = { - "PPSSPP " PPSSPP_VERSION_STR, + "PPSSPP", "", "", "A fast and portable PSP emulator", @@ -506,6 +506,11 @@ static const char *credits[] = }; void CreditsScreen::render() { + // TODO: This is kinda ugly, done on every frame... + char temp[256]; + snprinf(temp, 256, "PPSSPP %s", PPSSPP_GIT_VERSION); + credits[0] = temp; + UIShader_Prepare(); UIBegin(); DrawBackground(1.0f); diff --git a/git-version.cmake b/git-version.cmake index eca9a4de3310..d55f76ae5c73 100644 --- a/git-version.cmake +++ b/git-version.cmake @@ -1,4 +1,4 @@ -set(GIT_VERSION_FILE "${SOURCE_DIR}/git-version.c") +set(GIT_VERSION_FILE "${SOURCE_DIR}/git-version.cpp") set(GIT_VERSION "unknown") set(GIT_VERSION_UPDATE "1") From 0783e3b0f5316939634ed8c67e2c72fb9a2cd9bf Mon Sep 17 00:00:00 2001 From: "Unknown W. Brackets" Date: Sat, 2 Mar 2013 12:34:41 -0800 Subject: [PATCH 250/347] Note the PPSSPP version in the log. Fixes #807. --- Core/System.cpp | 3 +++ 1 file changed, 3 insertions(+) diff --git a/Core/System.cpp b/Core/System.cpp index 11fa6032a622..8a0581b7bf0e 100644 --- a/Core/System.cpp +++ b/Core/System.cpp @@ -32,6 +32,7 @@ #include "HLE/sceKernel.h" #include "HLE/sceKernelMemory.h" #include "HLE/sceAudio.h" +#include "Config.h" #include "Core.h" #include "CoreTiming.h" #include "CoreParameter.h" @@ -47,6 +48,8 @@ static PSPMixer *mixer; bool PSP_Init(const CoreParameter &coreParam, std::string *error_string) { + INFO_LOG(HLE, "PPSSPP %s", PPSSPP_GIT_VERSION); + coreParameter = coreParam; currentCPU = &mipsr4k; numCPUs = 1; From 7e853b759e85e5d21b8ce7c39e46b8d82d285e33 Mon Sep 17 00:00:00 2001 From: raven02 Date: Sun, 3 Mar 2013 04:44:35 +0800 Subject: [PATCH 251/347] Fix Issue #767 - Screen halt when showFPS/Debug disabled --- Core/HLE/sceDisplay.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/Core/HLE/sceDisplay.cpp b/Core/HLE/sceDisplay.cpp index 6c196838e305..04077d6fd562 100644 --- a/Core/HLE/sceDisplay.cpp +++ b/Core/HLE/sceDisplay.cpp @@ -394,6 +394,7 @@ void hleEnterVblank(u64 userdata, int cyclesLate) { // to blit the framebuffer, in order to support half-framerate games that otherwise wouldn't have // anything to draw here. gstate_c.skipDrawReason &= ~SKIPDRAW_SKIPFRAME; + glstate.colorMask.set(true,true,true,true); bool throttle, skipFrame, skipFlip; From 2d5783eb7f3d5ee1eb2b89b51a68f17926768cf4 Mon Sep 17 00:00:00 2001 From: Sacha Date: Sun, 3 Mar 2013 06:45:21 +1000 Subject: [PATCH 252/347] ARMJIT: Compare functions are now jitted. --- Core/MIPS/ARM/ArmCompFPU.cpp | 103 ++++++++++++++++------------------- 1 file changed, 47 insertions(+), 56 deletions(-) diff --git a/Core/MIPS/ARM/ArmCompFPU.cpp b/Core/MIPS/ARM/ArmCompFPU.cpp index d9fdd01a78f1..afe690dfc062 100644 --- a/Core/MIPS/ARM/ArmCompFPU.cpp +++ b/Core/MIPS/ARM/ArmCompFPU.cpp @@ -101,75 +101,66 @@ void Jit::Comp_FPULS(u32 op) } void Jit::Comp_FPUComp(u32 op) { - int fs = _FS; - int ft = _FT; - - // See http://infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.dui0204j/Chdhcfbc.html - // for the flags after VCMP. - // Also, need to copy the flags from FPSCR to the APSR through VMRS. - - switch (op & 0xf) { - case 0: //f - case 8: //sf + int opc = op & 0xF; + if (opc > 8) opc -= 8; // alias + if (opc == 0)//f, sf (signalling false) + { MOVI2R(R0, 0); STR(CTXREG, R0, offsetof(MIPSState, fpcond)); - break; + return; + } - case 1: //un - case 9: //ngle - // CompFPComp(fs, ft, CMPUNORDSS); - DISABLE; + int fs = _FS; + int ft = _FT; + fpr.MapInIn(fs, ft); + VCMP(fpr.R(fs), fpr.R(ft), false); + VMRS_APSR(); // Move FP flags from FPSCR to APSR (regular flags). + switch(opc) + { + case 1: // un, ngle (unordered) + SetCC(CC_VS); + MOVI2R(R0, 1); + SetCC(CC_VC); break; - - case 2: //eq - case 10: //seq - // CompFPComp(fs, ft, CMPEQSS); - DISABLE; + case 2: // eq, seq (equal, ordered) + SetCC(CC_EQ); + MOVI2R(R0, 1); + SetCC(CC_NEQ); break; - - case 3: //ueq - case 11: //ngl - // CompFPComp(fs, ft, CMPEQSS, true); - DISABLE; + case 3: // ueq, ngl (equal, unordered) + SetCC(CC_EQ); + MOVI2R(R0, 1); + SetCC(CC_NEQ); + MOVI2R(R0, 0); + SetCC(CC_VC); break; - - case 4: //olt - case 12: //lt - // CompFPComp(fs, ft, CMPLTSS); - DISABLE; + case 4: // olt, lt (less than, ordered) + SetCC(CC_LO); + MOVI2R(R0, 1); + SetCC(CC_HS); break; - - case 5: //ult - case 13: //nge - // CompFPComp(ft, fs, CMPNLESS); - DISABLE; + case 5: // ult, nge (less than, unordered) + SetCC(CC_LT); + MOVI2R(R0, 1); + SetCC(CC_GE); break; - - case 6: //ole - case 14: //le - DISABLE; - // ?? This VCMP crashes on ARM11 with an exception. - // Also, this doesn't actually work correctly yet. I'm not sure why. - fpr.MapInIn(fs, ft); - VCMP(fpr.R(fs), fpr.R(ft)); - VMRS_APSR(); // Move FP flags from FPSCR to APSR (regular flags). - SetCC(CC_GT); - MOVI2R(R0, 0); - SetCC(CC_LE); + case 6: // ole, le (less equal, ordered) + SetCC(CC_LS); MOVI2R(R0, 1); - SetCC(CC_AL); - STR(CTXREG, R0, offsetof(MIPSState, fpcond)); + SetCC(CC_HI); break; - - case 7: //ule - case 15: //ngt - // CompFPComp(ft, fs, CMPNLTSS); - DISABLE; + case 7: // ule, ngt (less equal, unordered) + SetCC(CC_LE); + MOVI2R(R0, 1); + SetCC(CC_GT); break; - default: - DISABLE; + Comp_Generic(op); + return; } + MOVI2R(R0, 0); + SetCC(CC_AL); + STR(CTXREG, R0, offsetof(MIPSState, fpcond)); } void Jit::Comp_FPU2op(u32 op) From cf69a590c50219b9b693d88d614a77b2a19dc3a8 Mon Sep 17 00:00:00 2001 From: "Unknown W. Brackets" Date: Sat, 2 Mar 2013 12:47:33 -0800 Subject: [PATCH 253/347] Revise .gitignore, changed this filename. --- .gitignore | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.gitignore b/.gitignore index e01eb254a11e..3f4019915c31 100644 --- a/.gitignore +++ b/.gitignore @@ -40,7 +40,7 @@ gen libs obj build*/ -/git-version.c +/git-version.cpp .pspsh.hist __testoutput.txt From f8d7c024e5dddec2ad3f50133a6ac58e5f79d679 Mon Sep 17 00:00:00 2001 From: Sacha Date: Sun, 3 Mar 2013 06:53:39 +1000 Subject: [PATCH 254/347] Fix for 'sf' --- Core/MIPS/ARM/ArmCompFPU.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Core/MIPS/ARM/ArmCompFPU.cpp b/Core/MIPS/ARM/ArmCompFPU.cpp index afe690dfc062..5dba0b6ce013 100644 --- a/Core/MIPS/ARM/ArmCompFPU.cpp +++ b/Core/MIPS/ARM/ArmCompFPU.cpp @@ -102,7 +102,7 @@ void Jit::Comp_FPULS(u32 op) void Jit::Comp_FPUComp(u32 op) { int opc = op & 0xF; - if (opc > 8) opc -= 8; // alias + if (opc >= 8) opc -= 8; // alias if (opc == 0)//f, sf (signalling false) { MOVI2R(R0, 0); From f2b3d6fb50c064ea11176076acf24dcdcca9eabc Mon Sep 17 00:00:00 2001 From: "Unknown W. Brackets" Date: Sat, 2 Mar 2013 13:17:04 -0800 Subject: [PATCH 255/347] Buildfix, should be in GLES. --- Core/HLE/sceDisplay.cpp | 1 - GPU/GLES/DisplayListInterpreter.cpp | 1 + 2 files changed, 1 insertion(+), 1 deletion(-) diff --git a/Core/HLE/sceDisplay.cpp b/Core/HLE/sceDisplay.cpp index 04077d6fd562..6c196838e305 100644 --- a/Core/HLE/sceDisplay.cpp +++ b/Core/HLE/sceDisplay.cpp @@ -394,7 +394,6 @@ void hleEnterVblank(u64 userdata, int cyclesLate) { // to blit the framebuffer, in order to support half-framerate games that otherwise wouldn't have // anything to draw here. gstate_c.skipDrawReason &= ~SKIPDRAW_SKIPFRAME; - glstate.colorMask.set(true,true,true,true); bool throttle, skipFrame, skipFlip; diff --git a/GPU/GLES/DisplayListInterpreter.cpp b/GPU/GLES/DisplayListInterpreter.cpp index e5e68a72553f..8b4b568cf22c 100644 --- a/GPU/GLES/DisplayListInterpreter.cpp +++ b/GPU/GLES/DisplayListInterpreter.cpp @@ -252,6 +252,7 @@ void GLES_GPU::SetDisplayFramebuffer(u32 framebuf, u32 stride, int format) { } void GLES_GPU::CopyDisplayToOutput() { + glstate.colorMask.set(true, true, true, true); transformDraw_.Flush(); if (!g_Config.bBufferedRendering) return; From a71b32a393bfc95487d2336d28f58b742c0c5905 Mon Sep 17 00:00:00 2001 From: "Unknown W. Brackets" Date: Sat, 2 Mar 2013 13:18:43 -0800 Subject: [PATCH 256/347] Arg, buildfix. --- android/jni/MenuScreens.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/android/jni/MenuScreens.cpp b/android/jni/MenuScreens.cpp index e9efc4583442..2a5ce024bbc9 100644 --- a/android/jni/MenuScreens.cpp +++ b/android/jni/MenuScreens.cpp @@ -508,7 +508,7 @@ static char *credits[] = void CreditsScreen::render() { // TODO: This is kinda ugly, done on every frame... char temp[256]; - snprinf(temp, 256, "PPSSPP %s", PPSSPP_GIT_VERSION); + snprintf(temp, 256, "PPSSPP %s", PPSSPP_GIT_VERSION); credits[0] = temp; UIShader_Prepare(); From 48118895c3933ff33f46e968c0d04b22f81a0a54 Mon Sep 17 00:00:00 2001 From: "Unknown W. Brackets" Date: Sat, 2 Mar 2013 14:27:46 -0800 Subject: [PATCH 257/347] Android buildfix. --- android/jni/Android.mk | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/android/jni/Android.mk b/android/jni/Android.mk index 236dcdb4cd23..13bdd318bc95 100644 --- a/android/jni/Android.mk +++ b/android/jni/Android.mk @@ -187,7 +187,8 @@ LOCAL_SRC_FILES := \ $(SRC)/Core/MIPS/ARM/ArmRegCacheFPU.cpp \ $(SRC)/Core/Util/BlockAllocator.cpp \ $(SRC)/Core/Util/ppge_atlas.cpp \ - $(SRC)/Core/Util/PPGeDraw.cpp + $(SRC)/Core/Util/PPGeDraw.cpp \ + $(SRC)/git-version.cpp include $(BUILD_SHARED_LIBRARY) From 26f2301ae415a8fdf71d05408ee3fa3aee4d6dd0 Mon Sep 17 00:00:00 2001 From: "Unknown W. Brackets" Date: Sat, 2 Mar 2013 15:33:07 -0800 Subject: [PATCH 258/347] Adnroid buildfix, we have too many makefiles. --- android/git-version-gen.sh | 52 ++++++++++++++++++++++++++++++++++++++ android/jni/Android.mk | 3 +++ 2 files changed, 55 insertions(+) create mode 100755 android/git-version-gen.sh diff --git a/android/git-version-gen.sh b/android/git-version-gen.sh new file mode 100755 index 000000000000..d441c38379a3 --- /dev/null +++ b/android/git-version-gen.sh @@ -0,0 +1,52 @@ +#!/bin/bash +## Copyright (c) 2012- PPSSPP Project. + +## This program is free software: you can redistribute it and/or modify +## it under the terms of the GNU General Public License as published by +## the Free Software Foundation, version 2.0 or later versions. + +## This program is distributed in the hope that it will be useful, +## but WITHOUT ANY WARRANTY; without even the implied warranty of +## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +## GNU General Public License 2.0 for more details. + +## A copy of the GPL 2.0 should have been included with the program. +## If not, see http://www.gnu.org/licenses/ + +## Official git repository and contact information can be found at +## https://github.com/hrydgard/ppsspp and http://www.ppsspp.org/. + +GIT_VERSION_FILE=$(dirname $0)/../git-version.cpp + +if [ -e "$GIT_VERSION_FILE" ]; then + # Skip updating the file if PPSSPP_GIT_VERSION_NO_UPDATE is 1. + results=$(grep '^#define PPSSPP_GIT_VERSION_NO_UPDATE 1' "$GIT_VERSION_FILE") + if [ "$results" != "" ]; then + exit 0 + fi +fi + +GIT_VERSION=$(git describe --always) +if [ "$GIT_VERSION" == "" ]; then + echo "Unable to update git-version.cpp, git not on path." 1>&2 + + echo "// This is a generated file." > "$GIT_VERSION_FILE" + echo >> "$GIT_VERSION_FILE" + echo 'const char *PPSSPP_GIT_VERSION = "unknown";' >> "$GIT_VERSION_FILE" + exit 0 +fi + +# Don't modify the file if it already has the current version. +if [ -e "$GIT_VERSION_FILE" ]; then + results=$(grep "$GIT_VERSION" "$GIT_VERSION_FILE") + if [ "$results" != "" ]; then + exit 0 + fi +fi + +echo "// This is a generated file." > "$GIT_VERSION_FILE" +echo >> "$GIT_VERSION_FILE" +echo 'const char *PPSSPP_GIT_VERSION = "'"$GIT_VERSION"'";' >> "$GIT_VERSION_FILE" +echo >> "$GIT_VERSION_FILE" +echo "// If you don't want this file to update/recompile, change to 1." >> "$GIT_VERSION_FILE" +echo "#define PPSSPP_GIT_VERSION_NO_UPDATE 0" >> "$GIT_VERSION_FILE" diff --git a/android/jni/Android.mk b/android/jni/Android.mk index 13bdd318bc95..b9683dbd6d5c 100644 --- a/android/jni/Android.mk +++ b/android/jni/Android.mk @@ -195,3 +195,6 @@ include $(BUILD_SHARED_LIBRARY) $(call import-module,libzip) $(call import-module,native) + +jni/$(SRC)/git-version.cpp: + ./git-version-gen.sh From e87276cbada94ef321febcb042c04bb8498f0636 Mon Sep 17 00:00:00 2001 From: "Unknown W. Brackets" Date: Sat, 2 Mar 2013 13:39:06 -0800 Subject: [PATCH 259/347] Fix some minor warnings. --- Core/Font/PGF.cpp | 8 ++++---- native | 2 +- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/Core/Font/PGF.cpp b/Core/Font/PGF.cpp index 2fd2c4140b42..b0b44378180b 100644 --- a/Core/Font/PGF.cpp +++ b/Core/Font/PGF.cpp @@ -68,7 +68,7 @@ void PGF::DoState(PointerWrap &p) { void PGF::ReadPtr(const u8 *ptr, size_t dataSize) { const u8 *const startPtr = ptr; - INFO_LOG(HLE, "Reading %i bytes of PGF header", sizeof(header)); + INFO_LOG(HLE, "Reading %d bytes of PGF header", sizeof(header)); memcpy(&header, ptr, sizeof(header)); ptr += sizeof(header); @@ -183,9 +183,9 @@ void PGF::ReadPtr(const u8 *ptr, size_t dataSize) { // And shadow glyphs. for (size_t i = 0; i < shadowGlyphs.size(); i++) { size_t shadowId = glyphs[i].shadowID; - if (shadowId >= 0 && shadowId < shadowMap.size()) { + if (shadowId < shadowMap.size()) { size_t charId = shadowMap[shadowId]; - if (charId >= 0 && charId < glyphs.size()) { + if (charId < glyphs.size()) { // TODO: check for pre existing shadow glyph GetGlyph(fontData, charPointers[charId] * 4 * 8 /* ??? */, FONT_PGF_SHADOWGLYPH, shadowGlyphs[i]); } @@ -211,7 +211,7 @@ bool PGF::GetCharInfo(int charCode, PGFCharInfo *charInfo) { // Character not in font, return zeroed charInfo as on real PSP. return false; } - memset(charInfo, 0, sizeof(charInfo)); + memset(charInfo, 0, sizeof(*charInfo)); charInfo->bitmapWidth = glyph.w; charInfo->bitmapHeight = glyph.h; diff --git a/native b/native index 3c1566b9a755..f26d95dba1ab 160000 --- a/native +++ b/native @@ -1 +1 @@ -Subproject commit 3c1566b9a7559708dfd7d1413f723da51299e5c4 +Subproject commit f26d95dba1abc7d3936b929ab01aafff40555c93 From a3f93ed203bb021496ff9fd08eddb38a3351f497 Mon Sep 17 00:00:00 2001 From: "Unknown W. Brackets" Date: Sat, 2 Mar 2013 13:50:38 -0800 Subject: [PATCH 260/347] Fix some printf size warnings, signed warnings. --- Core/Font/PGF.cpp | 2 +- Core/HLE/sceFont.cpp | 4 ++-- Core/HLE/sceIo.cpp | 2 +- Core/HLE/sceKernelVTimer.cpp | 12 ++++++------ Core/HLE/sceUmd.cpp | 6 +++--- Core/MIPS/MIPSIntVFPU.cpp | 1 + Core/Util/PPGeDraw.cpp | 2 +- android/jni/MenuScreens.cpp | 4 ++-- 8 files changed, 17 insertions(+), 16 deletions(-) diff --git a/Core/Font/PGF.cpp b/Core/Font/PGF.cpp index b0b44378180b..635d1021f087 100644 --- a/Core/Font/PGF.cpp +++ b/Core/Font/PGF.cpp @@ -68,7 +68,7 @@ void PGF::DoState(PointerWrap &p) { void PGF::ReadPtr(const u8 *ptr, size_t dataSize) { const u8 *const startPtr = ptr; - INFO_LOG(HLE, "Reading %d bytes of PGF header", sizeof(header)); + INFO_LOG(HLE, "Reading %d bytes of PGF header", (int)sizeof(header)); memcpy(&header, ptr, sizeof(header)); ptr += sizeof(header); diff --git a/Core/HLE/sceFont.cpp b/Core/HLE/sceFont.cpp index 7125478ba82f..8afcdee819e8 100644 --- a/Core/HLE/sceFont.cpp +++ b/Core/HLE/sceFont.cpp @@ -158,7 +158,7 @@ class Font { class LoadedFont { public: LoadedFont(Font *font, FontLib *fontLib, u32 handle) - : font_(font), fontLib_(fontLib), handle_(handle) {} + : fontLib_(fontLib), font_(font), handle_(handle) {} Font *GetFont() { return font_; } FontLib *GetFontLib() { return fontLib_; } @@ -501,7 +501,7 @@ u32 sceFontOpen(u32 libHandle, u32 index, u32 mode, u32 errorCodePtr) { } FontLib *fontLib = GetFontLib(libHandle); - if (index < 0 || index >= internalFonts.size()) { + if (index >= internalFonts.size()) { Memory::Write_U32(ERROR_FONT_INVALID_PARAMETER, errorCodePtr); return 0; } diff --git a/Core/HLE/sceIo.cpp b/Core/HLE/sceIo.cpp index d1003f5db130..45d71596a6f7 100644 --- a/Core/HLE/sceIo.cpp +++ b/Core/HLE/sceIo.cpp @@ -270,7 +270,7 @@ u32 sceIoAssign(u32 alias_addr, u32 physical_addr, u32 filesystem_addr, int mode perm = "IOASSIGN_RDONLY"; break; default: - perm = "unhandled " + mode; + perm = "unhandled"; break; } DEBUG_LOG(HLE, "sceIoAssign(%s, %s, %s, %s, %08x, %i)", alias.c_str(), physical_dev.c_str(), filesystem_dev.c_str(), perm.c_str(), arg_addr, argSize); diff --git a/Core/HLE/sceKernelVTimer.cpp b/Core/HLE/sceKernelVTimer.cpp index eedd35e5fb2f..0f7e24f34c21 100644 --- a/Core/HLE/sceKernelVTimer.cpp +++ b/Core/HLE/sceKernelVTimer.cpp @@ -253,7 +253,7 @@ u32 sceKernelGetVTimerTime(u32 uid, u32 timeClockAddr) { VTimer *vt = kernelObjects.Get(uid, error); if (error) { - WARN_LOG(HLE, "%08x=sceKernelGetVTimerTime(%08x, %08x)", uid, timeClockAddr); + WARN_LOG(HLE, "%08x=sceKernelGetVTimerTime(%08x, %08x)", error, uid, timeClockAddr); return error; } @@ -290,7 +290,7 @@ u32 sceKernelSetVTimerTime(u32 uid, u32 timeClockAddr) { VTimer *vt = kernelObjects.Get(uid, error); if (error) { - WARN_LOG(HLE, "%08x=sceKernelSetVTimerTime(%08x, %08x)", uid, timeClockAddr); + WARN_LOG(HLE, "%08x=sceKernelSetVTimerTime(%08x, %08x)", error, uid, timeClockAddr); return error; } @@ -307,7 +307,7 @@ u32 sceKernelSetVTimerTimeWide(u32 uid, u64 timeClock) { VTimer *vt = kernelObjects.Get(uid, error); if (error) { - WARN_LOG(HLE, "%08x=sceKernelSetVTimerTimeWide(%08x, %llu)", uid, timeClock); + WARN_LOG(HLE, "%08x=sceKernelSetVTimerTimeWide(%08x, %llu)", error, uid, timeClock); return error; } @@ -369,7 +369,7 @@ u32 sceKernelSetVTimerHandler(u32 uid, u32 scheduleAddr, u32 handlerFuncAddr, u3 VTimer *vt = kernelObjects.Get(uid, error); if (error) { - WARN_LOG(HLE, "%08x=sceKernelSetVTimerHandler(%08x, %08x, %08x, %08x)", uid, scheduleAddr, handlerFuncAddr, commonAddr); + WARN_LOG(HLE, "%08x=sceKernelSetVTimerHandler(%08x, %08x, %08x, %08x)", error, uid, scheduleAddr, handlerFuncAddr, commonAddr); return error; } @@ -389,7 +389,7 @@ u32 sceKernelSetVTimerHandlerWide(u32 uid, u64 schedule, u32 handlerFuncAddr, u3 VTimer *vt = kernelObjects.Get(uid, error); if (error) { - WARN_LOG(HLE, "%08x=sceKernelSetVTimerHandlerWide(%08x, %llu, %08x, %08x)", uid, schedule, handlerFuncAddr, commonAddr); + WARN_LOG(HLE, "%08x=sceKernelSetVTimerHandlerWide(%08x, %llu, %08x, %08x)", error, uid, schedule, handlerFuncAddr, commonAddr); return error; } @@ -417,7 +417,7 @@ u32 sceKernelReferVTimerStatus(u32 uid, u32 statusAddr) { VTimer *vt = kernelObjects.Get(uid, error); if (error) { - WARN_LOG(HLE, "%08x=sceKernelReferVTimerStatus(%08x, %08x)", uid, statusAddr); + WARN_LOG(HLE, "%08x=sceKernelReferVTimerStatus(%08x, %08x)", error, uid, statusAddr); return error; } diff --git a/Core/HLE/sceUmd.cpp b/Core/HLE/sceUmd.cpp index 222fc8bb6698..b54947382d23 100644 --- a/Core/HLE/sceUmd.cpp +++ b/Core/HLE/sceUmd.cpp @@ -236,9 +236,9 @@ u32 sceUmdRegisterUMDCallBack(u32 cbId) return retVal; } -u32 sceUmdUnRegisterUMDCallBack(u32 cbId) +int sceUmdUnRegisterUMDCallBack(int cbId) { - u32 retVal; + int retVal; if (cbId != driveCBId) retVal = PSP_ERROR_UMD_INVALID_PARAM; @@ -387,7 +387,7 @@ const HLEFunction sceUmdUser[] = {0x20628E6F,&WrapU_V,"sceUmdGetErrorStat"}, {0x340B7686,WrapU_U,"sceUmdGetDiscInfo"}, {0xAEE7404D,&WrapU_U,"sceUmdRegisterUMDCallBack"}, - {0xBD2BDE07,&WrapU_U,"sceUmdUnRegisterUMDCallBack"}, + {0xBD2BDE07,&WrapI_I,"sceUmdUnRegisterUMDCallBack"}, {0x87533940,WrapU_V,"sceUmdReplaceProhibit"}, {0x87533940,WrapU_V,"sceUmdReplacePermit"}, }; diff --git a/Core/MIPS/MIPSIntVFPU.cpp b/Core/MIPS/MIPSIntVFPU.cpp index 3e80912b1c4d..b65cfcb4ebcc 100644 --- a/Core/MIPS/MIPSIntVFPU.cpp +++ b/Core/MIPS/MIPSIntVFPU.cpp @@ -926,6 +926,7 @@ namespace MIPSInt break; default: _dbg_assert_msg_(CPU,0,"Trying to interpret instruction that can't be interpreted"); + oz = V_Single; break; } ApplyPrefixD((float*)d,oz); diff --git a/Core/Util/PPGeDraw.cpp b/Core/Util/PPGeDraw.cpp index 4a77375ac212..fe84cd713487 100644 --- a/Core/Util/PPGeDraw.cpp +++ b/Core/Util/PPGeDraw.cpp @@ -100,7 +100,7 @@ static void EndVertexDataAndDraw(int prim) { static u32 __PPGeDoAlloc(u32 &size, bool fromTop, const char *name) { u32 ptr = kernelMemory.Alloc(size, fromTop, name); // Didn't get it. - if (ptr == -1) + if (ptr == (u32)-1) return 0; return ptr; } diff --git a/android/jni/MenuScreens.cpp b/android/jni/MenuScreens.cpp index 2a5ce024bbc9..808be54ede87 100644 --- a/android/jni/MenuScreens.cpp +++ b/android/jni/MenuScreens.cpp @@ -444,7 +444,7 @@ void CreditsScreen::update(InputState &input_state) { frames_++; } -static char *credits[] = +const static char *credits[] = { "PPSSPP", "", @@ -509,7 +509,7 @@ void CreditsScreen::render() { // TODO: This is kinda ugly, done on every frame... char temp[256]; snprintf(temp, 256, "PPSSPP %s", PPSSPP_GIT_VERSION); - credits[0] = temp; + credits[0] = (const char *)temp; UIShader_Prepare(); UIBegin(); From 62ab4b7f51056cca84aee5e8d6ac59023919527c Mon Sep 17 00:00:00 2001 From: "Unknown W. Brackets" Date: Sat, 2 Mar 2013 14:58:58 -0800 Subject: [PATCH 261/347] More signed compare warnings. --- Core/HLE/sceCtrl.cpp | 2 +- Core/HLE/sceKernel.cpp | 2 +- Core/HLE/sceKernelInterrupt.cpp | 8 ++++---- Core/HLE/sceKernelInterrupt.h | 4 ++-- Core/HLE/sceKernelMemory.cpp | 2 +- Core/HLE/sceKernelModule.cpp | 8 ++++---- Core/HLE/sceKernelThread.cpp | 35 ++++++++++++++++----------------- Core/HLE/sceKernelThread.h | 2 +- 8 files changed, 31 insertions(+), 32 deletions(-) diff --git a/Core/HLE/sceCtrl.cpp b/Core/HLE/sceCtrl.cpp index 348bdce8d2c9..b79c9733dbcb 100644 --- a/Core/HLE/sceCtrl.cpp +++ b/Core/HLE/sceCtrl.cpp @@ -280,7 +280,7 @@ void __CtrlInit() ctrlCurrent.analog[0] = 128; ctrlCurrent.analog[1] = 128; - for (int i = 0; i < NUM_CTRL_BUFFERS; i++) + for (u32 i = 0; i < NUM_CTRL_BUFFERS; i++) memcpy(&ctrlBufs[i], &ctrlCurrent, sizeof(_ctrl_data)); } diff --git a/Core/HLE/sceKernel.cpp b/Core/HLE/sceKernel.cpp index 586735bd63b3..89f0cf39b245 100644 --- a/Core/HLE/sceKernel.cpp +++ b/Core/HLE/sceKernel.cpp @@ -602,7 +602,7 @@ const HLEFunction ThreadManForUser[] = {0x82826f70,sceKernelSleepThreadCB,"sceKernelSleepThreadCB"}, {0xF475845D,&WrapI_IUU,"sceKernelStartThread"}, {0x9944f31f,sceKernelSuspendThread,"sceKernelSuspendThread"}, - {0x616403ba,WrapI_U,"sceKernelTerminateThread"}, + {0x616403ba,WrapI_I,"sceKernelTerminateThread"}, {0x383f7bcc,WrapI_I,"sceKernelTerminateDeleteThread"}, {0x840E8133,WrapI_IU,"sceKernelWaitThreadEndCB"}, {0xd13bde95,sceKernelCheckThreadStack,"sceKernelCheckThreadStack"}, diff --git a/Core/HLE/sceKernelInterrupt.cpp b/Core/HLE/sceKernelInterrupt.cpp index 299a67b40ad5..b0196b75d901 100644 --- a/Core/HLE/sceKernelInterrupt.cpp +++ b/Core/HLE/sceKernelInterrupt.cpp @@ -411,7 +411,7 @@ SubIntrHandler *__RegisterSubIntrHandler(u32 intrNumber, u32 subIntrNumber, u32 return subIntrHandler; } -u32 __ReleaseSubIntrHandler(u32 intrNumber, u32 subIntrNumber) +int __ReleaseSubIntrHandler(int intrNumber, int subIntrNumber) { if (!intrHandlers[intrNumber]->has(subIntrNumber)) return -1; @@ -446,9 +446,9 @@ u32 sceKernelRegisterSubIntrHandler(u32 intrNumber, u32 subIntrNumber, u32 handl return error; } -u32 sceKernelReleaseSubIntrHandler(u32 intrNumber, u32 subIntrNumber) +int sceKernelReleaseSubIntrHandler(int intrNumber, int subIntrNumber) { - DEBUG_LOG(HLE,"sceKernelReleaseSubIntrHandler(%i, %i)", PARAM(0), PARAM(1)); + DEBUG_LOG(HLE, "sceKernelReleaseSubIntrHandler(%i, %i)", intrNumber, subIntrNumber); if (intrNumber >= PSP_NUMBER_INTERRUPTS) return -1; @@ -567,7 +567,7 @@ void Register_Kernel_Library() const HLEFunction InterruptManager[] = { {0xCA04A2B9, WrapU_UUUU, "sceKernelRegisterSubIntrHandler"}, - {0xD61E6961, WrapU_UU, "sceKernelReleaseSubIntrHandler"}, + {0xD61E6961, WrapI_II, "sceKernelReleaseSubIntrHandler"}, {0xFB8E22EC, WrapU_UU, "sceKernelEnableSubIntr"}, {0x8A389411, WrapU_UU, "sceKernelDisableSubIntr"}, {0x5CB5A78B, 0, "sceKernelSuspendSubIntr"}, diff --git a/Core/HLE/sceKernelInterrupt.h b/Core/HLE/sceKernelInterrupt.h index b1e27ab125ad..7c0ef381ce57 100644 --- a/Core/HLE/sceKernelInterrupt.h +++ b/Core/HLE/sceKernelInterrupt.h @@ -139,10 +139,10 @@ void __KernelReturnFromInterrupt(); void __RegisterIntrHandler(u32 intrNumber, IntrHandler* handler); SubIntrHandler *__RegisterSubIntrHandler(u32 intrNumber, u32 subIntrNumber, u32 &error); -u32 __ReleaseSubIntrHandler(u32 intrNumber, u32 subIntrNumber); +int __ReleaseSubIntrHandler(int intrNumber, int subIntrNumber); u32 sceKernelRegisterSubIntrHandler(u32 intrNumber, u32 subIntrNumber, u32 handler, u32 handlerArg); -u32 sceKernelReleaseSubIntrHandler(u32 intrNumber, u32 subIntrNumber); +int sceKernelReleaseSubIntrHandler(int intrNumber, int subIntrNumber); u32 sceKernelEnableSubIntr(u32 intrNumber, u32 subIntrNumber); void Register_Kernel_Library(); diff --git a/Core/HLE/sceKernelMemory.cpp b/Core/HLE/sceKernelMemory.cpp index 4614842f61f9..60149b6cfeb1 100644 --- a/Core/HLE/sceKernelMemory.cpp +++ b/Core/HLE/sceKernelMemory.cpp @@ -886,7 +886,7 @@ SceUID sceKernelCreateVpl(const char *name, int partition, u32 attr, u32 vplSize // We ignore the upalign to 256 and do it ourselves by 8. u32 allocSize = vplSize; u32 memBlockPtr = userMemory.Alloc(allocSize, (attr & PSP_VPL_ATTR_HIGHMEM) != 0, "VPL"); - if (memBlockPtr == -1) + if (memBlockPtr == (u32)-1) { ERROR_LOG(HLE, "sceKernelCreateVpl: Failed to allocate %i bytes of pool data", vplSize); return SCE_KERNEL_ERROR_NO_MEMORY; diff --git a/Core/HLE/sceKernelModule.cpp b/Core/HLE/sceKernelModule.cpp index 294b789a528d..1846d22f4af0 100644 --- a/Core/HLE/sceKernelModule.cpp +++ b/Core/HLE/sceKernelModule.cpp @@ -644,7 +644,7 @@ Module *__KernelLoadModule(u8 *fileptr, SceKernelLMOption *options, std::string void __KernelStartModule(Module *m, int args, const char *argp, SceKernelSMOption *options) { - if (m->nm.module_start_func != 0 && m->nm.module_start_func != -1) + if (m->nm.module_start_func != 0 && m->nm.module_start_func != (u32)-1) { if (m->nm.module_start_func != m->nm.entry_addr) WARN_LOG(LOADER, "Main module has start func (%08x) different from entry (%08x)?", m->nm.module_start_func, m->nm.entry_addr); @@ -837,9 +837,9 @@ void sceKernelStartModule(u32 moduleId, u32 argsize, u32 argAddr, u32 returnValu moduleId,argsize,argAddr,returnValueAddr,optionAddr); u32 entryAddr = module->nm.entry_addr; - if (entryAddr == -1 || entryAddr == module->memoryBlockAddr - 1) { + if (entryAddr == (u32)-1 || entryAddr == module->memoryBlockAddr - 1) { // TODO: Do these always take effect, or do they not override optionAddr? - if (module->nm.module_start_func != 0 && module->nm.module_start_func != -1) { + if (module->nm.module_start_func != 0 && module->nm.module_start_func != (u32)-1) { entryAddr = module->nm.module_start_func; priority = module->nm.module_start_thread_priority; attr = module->nm.module_start_thread_attr; @@ -924,7 +924,7 @@ u32 sceKernelLoadModuleByID(u32 id, u32 flags, u32 lmoptionPtr) { u32 error; u32 handle = __IoGetFileHandleFromId(id, error); - if (handle == -1) { + if (handle == (u32)-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 aa093cc09c21..7643cb65c3b3 100644 --- a/Core/HLE/sceKernelThread.cpp +++ b/Core/HLE/sceKernelThread.cpp @@ -155,22 +155,21 @@ struct ThreadWaitInfo { class MipsCallManager { public: MipsCallManager() : idGen_(0) {} - int add(MipsCall *call) { - int id = genId(); + u32 add(MipsCall *call) { + u32 id = genId(); calls_.insert(std::pair(id, call)); return id; } - MipsCall *get(int id) { + MipsCall *get(u32 id) { return calls_[id]; } - MipsCall *pop(int id) { + MipsCall *pop(u32 id) { MipsCall *temp = calls_[id]; calls_.erase(id); return temp; } void clear() { - std::map::iterator it, end; - for (it = calls_.begin(), end = calls_.end(); it != end; ++it) { + for (auto it = calls_.begin(), end = calls_.end(); it != end; ++it) { delete it->second; } calls_.clear(); @@ -204,10 +203,10 @@ class MipsCallManager { } private: - int genId() { return ++idGen_; } - std::map calls_; + u32 genId() { return ++idGen_; } + std::map calls_; std::vector types_; - int idGen_; + u32 idGen_; }; class ActionAfterMipsCall : public Action @@ -425,7 +424,7 @@ class Thread : public KernelObject std::set registeredCallbacks[THREAD_CALLBACK_NUM_TYPES]; std::list readyCallbacks[THREAD_CALLBACK_NUM_TYPES]; - std::list pendingMipsCalls; + std::list pendingMipsCalls; u32 stackBlock; }; @@ -492,7 +491,7 @@ struct ThreadList } }; -void __KernelExecuteMipsCallOnCurrentThread(int callId, bool reschedAfter); +void __KernelExecuteMipsCallOnCurrentThread(u32 callId, bool reschedAfter); Thread *__KernelCreateThread(SceUID &id, SceUID moduleID, const char *name, u32 entryPoint, u32 priority, int stacksize, u32 attr); @@ -1757,7 +1756,7 @@ int sceKernelTerminateDeleteThread(int threadno) } } -int sceKernelTerminateThread(u32 threadID) +int sceKernelTerminateThread(SceUID threadID) { if (threadID != currentThread) { @@ -2256,7 +2255,7 @@ void Thread::setReturnValue(u32 retval) { if (this->GetUID() == currentThread) { if (g_inCbCount) { - int callId = this->currentCallbackId; + u32 callId = this->currentCallbackId; MipsCall *call = mipsCalls.get(callId); if (call) { call->setReturnValue(retval); @@ -2342,7 +2341,7 @@ ThreadWaitInfo Thread::getWaitInfo() void __KernelSwitchContext(Thread *target, const char *reason) { u32 oldPC = 0; - u32 oldUID = 0; + SceUID oldUID = 0; const char *oldName = "(none)"; Thread *cur = __GetCurrentThread(); @@ -2448,7 +2447,7 @@ void __KernelCallAddress(Thread *thread, u32 entryPoint, Action *afterAction, co call->tag = "callAddress"; call->cbId = cbId; - int callId = mipsCalls.add(call); + u32 callId = mipsCalls.add(call); bool called = false; if (!thread || thread == __GetCurrentThread()) { @@ -2475,7 +2474,7 @@ void __KernelDirectMipsCall(u32 entryPoint, Action *afterAction, u32 args[], int __KernelCallAddress(__GetCurrentThread(), entryPoint, afterAction, args, numargs, reschedAfter, 0); } -void __KernelExecuteMipsCallOnCurrentThread(int callId, bool reschedAfter) +void __KernelExecuteMipsCallOnCurrentThread(u32 callId, bool reschedAfter) { Thread *cur = __GetCurrentThread(); if (cur == NULL) @@ -2524,7 +2523,7 @@ void __KernelReturnFromMipsCall() return; } - int callId = cur->currentCallbackId; + u32 callId = cur->currentCallbackId; if (currentMIPS->r[MIPS_REG_CALL_ID] != callId) WARN_LOG(HLE, "__KernelReturnFromMipsCall(): s0 is %08x != %08x", currentMIPS->r[MIPS_REG_CALL_ID], callId); @@ -2576,7 +2575,7 @@ bool __KernelExecutePendingMipsCalls(bool reschedAfter) if (__CanExecuteCallbackNow(thread)) { // Pop off the first pending mips call - int callId = thread->pendingMipsCalls.front(); + u32 callId = thread->pendingMipsCalls.front(); thread->pendingMipsCalls.pop_front(); __KernelExecuteMipsCallOnCurrentThread(callId, reschedAfter); return true; diff --git a/Core/HLE/sceKernelThread.h b/Core/HLE/sceKernelThread.h index 1415f2bf005f..228b14816bd8 100644 --- a/Core/HLE/sceKernelThread.h +++ b/Core/HLE/sceKernelThread.h @@ -53,7 +53,7 @@ void sceKernelResumeThread(); void sceKernelWakeupThread(); void sceKernelCancelWakeupThread(); int sceKernelTerminateDeleteThread(int threadno); -int sceKernelTerminateThread(u32 threadID); +int sceKernelTerminateThread(SceUID threadID); int sceKernelWaitThreadEndCB(SceUID threadID, u32 timeoutPtr); void sceKernelGetThreadExitStatus(); u32 sceKernelGetThreadmanIdType(u32); From 6ca4f2f5086de003670080e425dcd81c398d269d Mon Sep 17 00:00:00 2001 From: "Unknown W. Brackets" Date: Sat, 2 Mar 2013 16:15:13 -0800 Subject: [PATCH 262/347] Support builds outside the git dir. Oops. --- git-version.cmake | 1 + 1 file changed, 1 insertion(+) diff --git a/git-version.cmake b/git-version.cmake index d55f76ae5c73..f26cf9554276 100644 --- a/git-version.cmake +++ b/git-version.cmake @@ -5,6 +5,7 @@ set(GIT_VERSION_UPDATE "1") find_package(Git) if(GIT_FOUND) execute_process(COMMAND ${GIT_EXECUTABLE} describe --always + WORKING_DIRECTORY ${SOURCE_DIR} RESULT_VARIABLE exit_code OUTPUT_VARIABLE GIT_VERSION) if(NOT ${exit_code} EQUAL 0) From 0f93b75eaf1b1217c64ba2ab35195f5cbe5c4101 Mon Sep 17 00:00:00 2001 From: rasyid-irsyadi Date: Sun, 3 Mar 2013 10:57:06 +0700 Subject: [PATCH 263/347] id_id translation for Bahasa Indonesia. id_id translation for Bahasa Indonesia. --- Qt/languages/ppsspp_id.ts | 1013 +++++++++++++++++++++++++++++++++++++ 1 file changed, 1013 insertions(+) create mode 100644 Qt/languages/ppsspp_id.ts diff --git a/Qt/languages/ppsspp_id.ts b/Qt/languages/ppsspp_id.ts new file mode 100644 index 000000000000..3d574d02b131 --- /dev/null +++ b/Qt/languages/ppsspp_id.ts @@ -0,0 +1,1013 @@ + + + + + Controls + + + Controls + Controls window title + + + + + CtrlDisAsmView + + + Copy &address + + + + + Copy instruction (&hex) + + + + + Copy instruction (&disasm) + + + + + &Run to here + + + + + &Set Next Statement + + + + + &Toggle breakpoint + + + + + &Follow branch + + + + + Go to in &Memory View + + + + + &Rename function... + + + + + New function name + + + + + New function name: + + + + + CtrlMemView + + + Go to in &disasm + + + + + &Copy value + + + + + Dump... + + + + + CtrlRegisterList + + + Go to in &memory view + + + + + Go to in &disasm + + + + + &Copy value + + + + + C&hange... + + + + + Set new value + + + + + Set new value: + + + + + Debugger_Disasm + + + Disassembler + Window title + + + + + Ctr: + + + + + &Go to + + + + + &PC + + + + + &LR + + + + + Show VFPU + + + + + Regs + + + + + Funcs + + + + + &Go + + + + + Stop + + + + + Step &Into + + + + + Step &Over + + + + + S&kip + + + + + Next &HLE + + + + + Breakpoints + + + + + Address + + + + + Clear All + + + + + Callstack + + + + + Display Lists + + + + + + Id + + + + + + Status + + + + + Start Address + + + + + Current Address + + + + + Run + + + + + Step + + + + + Threads + + + + + Name + + + + + Current PC + + + + + Entry point + + + + + Remove breakpoint + + + + + Go to entry point + + + + + Running + + + + + Wait + + + + + Suspend + + + + + Show code + + + + + Debugger_Memory + + + Dialog + + + + + Goto: + + + + + Mode + + + + + Normal + + + + + Symbols + + + + + Memory Viewer - %1 + + + + + Debugger_VFPU + + + VFPU + + + + + Float + + + + + HalfFloat + + + + + Hex + + + + + Bytes + + + + + Shorts + + + + + Ints + + + + + GamePadDialog + + + Gamepad Configuration + + + + + GamePad List + + + + + Refresh + + + + + Select + + + + + Gamepad Values : + + + + + TextLabel + + + + + Assign Gamepad input + + + + + to PSP button/axis + + + + + Assign + + + + + Press buttons on your gamePad to verify mapping : + + + + + + <b>No gamepad</b> + + + + + <b>Unknown gamepad</b> + + + + + Buttons + Tombol + + + + + Button %1 + + + + + Axes + + + + + %1 Neg + + + + + Axes %1 Neg + + + + + %1 Pos + + + + + Axes %1 Pos + + + + + Hats + + + + + <b>Current gamepad: %1</b> + + + + + MainWindow + + + PPSSPP + + + + + &File + + + + + &Emulation + + + + + Debu&g + + + + + &Options + + + + + G3D + + + + + HLE + + + + + Default + + + + + Lo&g Levels + + + + + &Language + + + + + &Video + + + + + &Anisotropic filtering + + + + + &Zoom + + + + + Co&ntrols + + + + + &Core + + + + + &Help + + + + + &Open... + + + + + &Close + + + + + - + + + + + Quickload state + + + + + F4 + + + + + Quicksave state + + + + + F2 + + + + + &Load State File... + + + + + &Save State File... + + + + + E&xit + + + + + &Run + + + + + F7 + + + + + &Pause + + + + + F8 + + + + + R&eset + + + + + &Interpreter + + + + + &Slightly Faster Interpreter + + + + + &Dynarec + + + + + Load &Map File... + + + + + &Save Map File... + + + + + &Reset Symbol Table + + + + + &Disassembly + + + + + Ctrl+D + + + + + &Log Console + + + + + Ctrl+L + + + + + Memory &View... + + + + + Ctrl+M + + + + + &Keyboard + + + + + &Toggle fullscreen + + + + + Show &debug statistics + + + + + I&gnore illegal reads/writes + + + + + &Gamepad + + + + + Run on loa&d + + + + + Show &FPS counter + + + + + S&tretch to display + + + + + &Sound emulation + + + + + F12 + + + + + &Buffered Rendering + + + + + F5 + + + + + &Hardware Transform + + + + + F6 + + + + + &Linear Filtering + + + + + &Wireframe (experimental) + + + + + &Display Raw Framebuffer + + + + + Screen &1x + + + + + Ctrl+1 + + + + + Screen &2x + + + + + Ctrl+2 + + + + + Screen &3x + + + + + Ctrl+3 + + + + + Screen &4x + + + + + Ctrl+4 + + + + + &Fast Memory (dynarec, unstable) + + + + + &Go to http://www.ppsspp.org/ + + + + + &About PPSSPP... + + + + + &Use VBO + + + + + + + Debug + + + + + + + Warning + Peringatan + + + + + + Error + Galat + + + + + + Info + Informasi + + + + D&ump next frame to log + + + + + &Vertex Cache + + + + + Memory View Texture... + + + + + Simple 2xAA + + + + + Off + Mati + + + + 2x + + + + + 4x + + + + + 8x + + + + + 16x + + + + + No translations + Tak ada terjemahan + + + + gamepadMapping + + + Cross + Silang + + + + Circle + Bundar + + + + Square + Kotak + + + + Triangle + Segitiga + + + + Left Trigger + Trigger Kiri + + + + Right Trigger + Trigger Kanan + + + + Start + Start + + + + Select + Select + + + + Up + Atas + + + + Down + Bawah + + + + Left + Kiri + + + + Right + Kanan + + + + Home + Beranda + + + + Stick left + Stick kiri + + + + Stick right + Stick kanan + + + + Stick up + Stick atas + + + + Stick bottom +Β Β Β Β Β Β Β Β Stick bottom + + + From 8044ee24e0258e5f84897a87e18f3ecfa9877a3c Mon Sep 17 00:00:00 2001 From: rasyid-irsyadi Date: Sun, 3 Mar 2013 11:12:22 +0700 Subject: [PATCH 264/347] Update ppsspp_id.ts --- Qt/languages/ppsspp_id.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Qt/languages/ppsspp_id.ts b/Qt/languages/ppsspp_id.ts index 3d574d02b131..41806c00f274 100644 --- a/Qt/languages/ppsspp_id.ts +++ b/Qt/languages/ppsspp_id.ts @@ -1007,7 +1007,7 @@ Stick bottom -Β Β Β Β Β Β Β Β Stick bottom +Β Β Β Β Β Β Β Β Stick bawah From b862841dd4705f3a52ad6d0be99575c6b26d3541 Mon Sep 17 00:00:00 2001 From: raven02 Date: Sun, 3 Mar 2013 15:05:50 +0800 Subject: [PATCH 265/347] Put PPGeDraw into CalculateFPS() and add enableColorDoubling alias --- Core/HLE/sceDisplay.cpp | 36 ++++++++++++++-------------- Core/HLE/sceIo.cpp | 2 +- GPU/GLES/FragmentShaderGenerator.cpp | 8 ++++--- 3 files changed, 24 insertions(+), 22 deletions(-) diff --git a/Core/HLE/sceDisplay.cpp b/Core/HLE/sceDisplay.cpp index 6c196838e305..03f882daf73a 100644 --- a/Core/HLE/sceDisplay.cpp +++ b/Core/HLE/sceDisplay.cpp @@ -189,7 +189,7 @@ void __DisplayFireVblank() { } } -float calculateFPS() +void CalculateFPS() { static double highestFps = 0.0; static int lastFpsFrame = 0; @@ -208,7 +208,22 @@ float calculateFPS() lastFpsFrame = gpuStats.numFrames; lastFpsTime = now; } - return fps; + + char stats[50]; + sprintf(stats, "%0.1f", fps); + + #ifdef USING_GLES2 + float zoom = 0.7f; /// g_Config.iWindowZoom; + float soff = 0.7f; + #else + float zoom = 0.5f; /// g_Config.iWindowZoom; + float soff = 0.5f; + #endif + PPGeBegin(); + PPGeDrawText(stats, 476 + soff, 4 + soff, PPGE_ALIGN_RIGHT, zoom, 0xCC000000); + PPGeDrawText(stats, 476 + -soff, 4 -soff, PPGE_ALIGN_RIGHT, zoom, 0xCC000000); + PPGeDrawText(stats, 476, 4, PPGE_ALIGN_RIGHT, zoom, 0xFF30FF30); + PPGeEnd(); } void DebugStats() @@ -371,22 +386,7 @@ void hleEnterVblank(u64 userdata, int cyclesLate) { } if (g_Config.bShowFPSCounter) { - char stats[50]; - - sprintf(stats, "%0.1f", calculateFPS()); - - #ifdef USING_GLES2 - float zoom = 0.7f; /// g_Config.iWindowZoom; - float soff = 0.7f; - #else - float zoom = 0.5f; /// g_Config.iWindowZoom; - float soff = 0.5f; - #endif - PPGeBegin(); - PPGeDrawText(stats, 476 + soff, 4 + soff, PPGE_ALIGN_RIGHT, zoom, 0xCC000000); - PPGeDrawText(stats, 476 + -soff, 4 -soff, PPGE_ALIGN_RIGHT, zoom, 0xCC000000); - PPGeDrawText(stats, 476, 4, PPGE_ALIGN_RIGHT, zoom, 0xFF30FF30); - PPGeEnd(); + CalculateFPS(); } // Draw screen overlays before blitting. Saves and restores the Ge context. diff --git a/Core/HLE/sceIo.cpp b/Core/HLE/sceIo.cpp index d1003f5db130..8279430fef8d 100644 --- a/Core/HLE/sceIo.cpp +++ b/Core/HLE/sceIo.cpp @@ -209,7 +209,7 @@ void __IoInit() { _splitpath_s(path_buffer, drive, dir, file, ext ); // Mount a couple of filesystems - sprintf(memstickpath, "%s%sMemStick\\", drive, dir); + sprintf(memstickpath, "%s%smemstick\\", drive, dir); sprintf(flash0path, "%s%sflash0\\", drive, dir); #else diff --git a/GPU/GLES/FragmentShaderGenerator.cpp b/GPU/GLES/FragmentShaderGenerator.cpp index 3394acc5e2f0..24777ca920bd 100644 --- a/GPU/GLES/FragmentShaderGenerator.cpp +++ b/GPU/GLES/FragmentShaderGenerator.cpp @@ -88,6 +88,7 @@ void GenerateFragmentShader(char *buffer) bool enableFog = gstate.isFogEnabled() && !gstate.isModeThrough() && !gstate.isModeClear(); bool enableAlphaTest = (gstate.alphaTestEnable & 1) && !gstate.isModeClear(); bool enableColorTest = (gstate.colorTestEnable & 1) && !gstate.isModeClear(); + bool enableColorDoubling = gstate.texfunc & 0x10000; if (doTexture) @@ -170,8 +171,8 @@ void GenerateFragmentShader(char *buffer) // No texture mapping WRITE(p, " vec4 v = v_color0 %s;\n", secondary); } - // Color doubling - if (gstate.texfunc & 0x10000) { + + if (enableColorDoubling) { WRITE(p, " v = v * 2.0;\n"); } @@ -191,7 +192,8 @@ void GenerateFragmentShader(char *buffer) int colorTestMask = gstate.colormask; if (colorTestFuncs[colorTestFunc][0] != '#') WRITE(p, "if (!(v.rgb %s (u_alphacolorref.rgb & u_colormask.rgb)) discard;\n", colorTestFuncs[colorTestFunc]); - }*/ + }*/ + if (enableFog) { WRITE(p, " float fogCoef = clamp(v_fogdepth, 0.0, 1.0);\n"); WRITE(p, " gl_FragColor = mix(vec4(u_fogcolor, v.a), v, fogCoef);\n"); From f27cc58f4b89ff14252b8995414b634f1f8982e9 Mon Sep 17 00:00:00 2001 From: oioitff Date: Sun, 3 Mar 2013 17:11:05 +0800 Subject: [PATCH 266/347] use module_start_func instead of entry_addr if entry_addr is 0 , this fixes Dissidia Final Fantasy 012. Maybe this is not a good fix. --- Core/HLE/sceKernelModule.cpp | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/Core/HLE/sceKernelModule.cpp b/Core/HLE/sceKernelModule.cpp index 1846d22f4af0..97822c5a63e5 100644 --- a/Core/HLE/sceKernelModule.cpp +++ b/Core/HLE/sceKernelModule.cpp @@ -559,6 +559,10 @@ Module *__KernelLoadELFFromPtr(const u8 *ptr, u32 loadAddress, std::string *erro } module->nm.entry_addr = reader.GetEntryPoint(); + + // use module_start_func instead of entry_addr if entry_addr is 0 + if (module->nm.entry_addr == 0) + module->nm.entry_addr = module->nm.module_start_func; if (newptr) { From 7d08dfac70ecf887d5adaded582ce5534a32fc22 Mon Sep 17 00:00:00 2001 From: oioitff Date: Sun, 3 Mar 2013 17:14:12 +0800 Subject: [PATCH 267/347] break after find optimum font --- Core/HLE/sceFont.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/Core/HLE/sceFont.cpp b/Core/HLE/sceFont.cpp index 8afcdee819e8..92887830d6ae 100644 --- a/Core/HLE/sceFont.cpp +++ b/Core/HLE/sceFont.cpp @@ -607,6 +607,7 @@ int sceFontFindOptimumFont(u32 libHandlePtr, u32 fontStylePtr, u32 errorCodePtr) for (size_t i = 0; i < internalFonts.size(); i++) { if (internalFonts[i]->MatchesStyle(requestedStyle, true)) { optimumFont = GetOptimumFont(requestedStyle, optimumFont, internalFonts[i]); + break; } } if (optimumFont) { From 9d49a24924900d09a1677ee30e76bd432f88b46c Mon Sep 17 00:00:00 2001 From: oioitff Date: Sun, 3 Mar 2013 17:22:50 +0800 Subject: [PATCH 268/347] use vector instead of Memory read/write , becasue Memory read/write works incorrectly here... --- Core/HLE/sceFont.cpp | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/Core/HLE/sceFont.cpp b/Core/HLE/sceFont.cpp index 92887830d6ae..c863302e0420 100644 --- a/Core/HLE/sceFont.cpp +++ b/Core/HLE/sceFont.cpp @@ -242,14 +242,16 @@ class FontLib { __KernelDirectMipsCall(params_.freeFuncAddr, 0, args, 1, false); handle_ = 0; fonts_.clear(); + isfontopen_.clear(); } void AllocDone(u32 allocatedAddr) { handle_ = allocatedAddr; fonts_.resize(params_.numFonts); + isfontopen_.resize(params_.numFonts); for (size_t i = 0; i < fonts_.size(); i++) { u32 addr = allocatedAddr + 4 + i * 4; - Memory::Write_U32(FONT_IS_CLOSED, addr); + isfontopen_[i] = 0; fonts_[i] = addr; } } @@ -274,7 +276,7 @@ class FontLib { LoadedFont *OpenFont(Font *font) { int freeFontIndex = -1; for (size_t i = 0; i < fonts_.size(); i++) { - if (Memory::Read_U32(fonts_[i]) == FONT_IS_CLOSED) { + if (isfontopen_[i] == 0) { freeFontIndex = (int)i; break; } @@ -284,14 +286,14 @@ class FontLib { return 0; } LoadedFont *loadedFont = new LoadedFont(font, this, fonts_[freeFontIndex]); - Memory::Write_U32(FONT_IS_OPEN, fonts_[freeFontIndex]); + isfontopen_[freeFontIndex] = 1; return loadedFont; } void CloseFont(LoadedFont *font) { for (size_t i = 0; i < fonts_.size(); i++) { if (fonts_[i] == font->Handle()) { - Memory::Write_U32(FONT_IS_CLOSED, font->Handle()); + isfontopen_[i] = 0; } } @@ -316,6 +318,7 @@ class FontLib { private: std::vector fonts_; + std::vector isfontopen_; FontNewLibParams params_; float fontHRes_; From d647816d10492b0fd5e397a6e43493354f82c974 Mon Sep 17 00:00:00 2001 From: "Unknown W. Brackets" Date: Fri, 1 Mar 2013 10:34:49 -0800 Subject: [PATCH 269/347] Add CONDITIONAL_DISABLE to all armjit funcs. --- Core/MIPS/ARM/ArmCompALU.cpp | 15 ++++++++++++--- Core/MIPS/ARM/ArmCompFPU.cpp | 8 ++++++-- Core/MIPS/ARM/ArmCompVFPU.cpp | 24 ++++++++++++++++++++++-- 3 files changed, 40 insertions(+), 7 deletions(-) diff --git a/Core/MIPS/ARM/ArmCompALU.cpp b/Core/MIPS/ARM/ArmCompALU.cpp index f9b8c599f04b..6208f305c5b7 100644 --- a/Core/MIPS/ARM/ArmCompALU.cpp +++ b/Core/MIPS/ARM/ArmCompALU.cpp @@ -28,7 +28,12 @@ using namespace MIPSAnalyst; #define _POS ((op>>6 ) & 0x1F) #define _SIZE ((op>>11 ) & 0x1F) -#define DISABLE Comp_Generic(op); return; +// All functions should have CONDITIONAL_DISABLE, so we can narrow things down to a file quickly. +// Currently known non working ones should have DISABLE. + +//#define CONDITIONAL_DISABLE { Comp_Generic(op); return; } +#define CONDITIONAL_DISABLE ; +#define DISABLE { Comp_Generic(op); return; } namespace MIPSComp { @@ -55,6 +60,7 @@ namespace MIPSComp void Jit::Comp_IType(u32 op) { + CONDITIONAL_DISABLE; s32 simm = (s32)(s16)(op & 0xFFFF); // sign extension u32 uimm = op & 0xFFFF; u32 suimm = (u32)(s32)simm; @@ -153,6 +159,7 @@ namespace MIPSComp void Jit::Comp_RType3(u32 op) { + CONDITIONAL_DISABLE; int rt = _RT; int rs = _RS; int rd = _RD; @@ -282,6 +289,7 @@ namespace MIPSComp */ void Jit::Comp_ShiftType(u32 op) { + CONDITIONAL_DISABLE; int rs = _RS; int fd = _FD; // WARNIGN : ROTR @@ -297,7 +305,6 @@ namespace MIPSComp default: Comp_Generic(op); - //_dbg_assert_msg_(CPU,0,"Trying to interpret instruction that can't be interpreted"); break; } } @@ -310,6 +317,7 @@ namespace MIPSComp void Jit::Comp_Allegrex(u32 op) { + CONDITIONAL_DISABLE; int rt = _RT; int rd = _RD; switch ((op >> 6) & 31) @@ -348,6 +356,7 @@ namespace MIPSComp gpr.SetImm(rd,v); break; } + // Intentional fall-through. default: Comp_Generic(op); return; @@ -356,7 +365,7 @@ namespace MIPSComp void Jit::Comp_MulDivType(u32 op) { - // DISABLE; + CONDITIONAL_DISABLE; int rt = _RT; int rs = _RS; int rd = _RD; diff --git a/Core/MIPS/ARM/ArmCompFPU.cpp b/Core/MIPS/ARM/ArmCompFPU.cpp index 5dba0b6ce013..3d030543b575 100644 --- a/Core/MIPS/ARM/ArmCompFPU.cpp +++ b/Core/MIPS/ARM/ArmCompFPU.cpp @@ -28,8 +28,12 @@ #define _POS ((op>>6 ) & 0x1F) #define _SIZE ((op>>11) & 0x1F) -#define DISABLE Comp_Generic(op); return; -#define CONDITIONAL_DISABLE ; +// All functions should have CONDITIONAL_DISABLE, so we can narrow things down to a file quickly. +// Currently known non working ones should have DISABLE. + +//#define CONDITIONAL_DISABLE { Comp_Generic(op); return; } +#define CONDITIONAL_DISABLE ; +#define DISABLE { Comp_Generic(op); return; } namespace MIPSComp { diff --git a/Core/MIPS/ARM/ArmCompVFPU.cpp b/Core/MIPS/ARM/ArmCompVFPU.cpp index a9da1e75fa4c..5e8ccca87365 100644 --- a/Core/MIPS/ARM/ArmCompVFPU.cpp +++ b/Core/MIPS/ARM/ArmCompVFPU.cpp @@ -1,3 +1,20 @@ +// Copyright (c) 2012- PPSSPP Project. + +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, version 2.0 or later versions. + +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License 2.0 for more details. + +// A copy of the GPL 2.0 should have been included with the program. +// If not, see http://www.gnu.org/licenses/ + +// Official git repository and contact information can be found at +// https://github.com/hrydgard/ppsspp and http://www.ppsspp.org/. + #include "../../MemMap.h" #include "../MIPSAnalyst.h" @@ -14,9 +31,12 @@ #define _POS ((op>>6 ) & 0x1F) #define _SIZE ((op>>11 ) & 0x1F) -// #define CONDITIONAL_DISABLE Comp_Generic(op); return; +// All functions should have CONDITIONAL_DISABLE, so we can narrow things down to a file quickly. +// Currently known non working ones should have DISABLE. + +// #define CONDITIONAL_DISABLE { fpr.ReleaseSpillLocks(); Comp_Generic(op); return; } #define CONDITIONAL_DISABLE ; -#define DISABLE {fpr.ReleaseSpillLocks(); Comp_Generic(op); return;} +#define DISABLE { fpr.ReleaseSpillLocks(); Comp_Generic(op); return; } namespace MIPSComp { From ab05149dbf2249f2ee61d082678ef42b5dd62c18 Mon Sep 17 00:00:00 2001 From: "Unknown W. Brackets" Date: Sun, 3 Mar 2013 01:44:33 -0800 Subject: [PATCH 270/347] Add a few more CONDITIONAL_DISABLEs. --- Core/MIPS/ARM/ArmCompFPU.cpp | 1 + Core/MIPS/ARM/ArmCompLoadStore.cpp | 8 +++++++- 2 files changed, 8 insertions(+), 1 deletion(-) diff --git a/Core/MIPS/ARM/ArmCompFPU.cpp b/Core/MIPS/ARM/ArmCompFPU.cpp index 3d030543b575..15e581ac8e44 100644 --- a/Core/MIPS/ARM/ArmCompFPU.cpp +++ b/Core/MIPS/ARM/ArmCompFPU.cpp @@ -105,6 +105,7 @@ void Jit::Comp_FPULS(u32 op) } void Jit::Comp_FPUComp(u32 op) { + CONDITIONAL_DISABLE; int opc = op & 0xF; if (opc >= 8) opc -= 8; // alias if (opc == 0)//f, sf (signalling false) diff --git a/Core/MIPS/ARM/ArmCompLoadStore.cpp b/Core/MIPS/ARM/ArmCompLoadStore.cpp index 94d75f7f54ac..692a78da669d 100644 --- a/Core/MIPS/ARM/ArmCompLoadStore.cpp +++ b/Core/MIPS/ARM/ArmCompLoadStore.cpp @@ -52,7 +52,12 @@ #define _POS ((op>>6 ) & 0x1F) #define _SIZE ((op>>11 ) & 0x1F) -#define DISABLE Comp_Generic(op); return; +// All functions should have CONDITIONAL_DISABLE, so we can narrow things down to a file quickly. +// Currently known non working ones should have DISABLE. + +// #define CONDITIONAL_DISABLE { Comp_Generic(op); return; } +#define CONDITIONAL_DISABLE ; +#define DISABLE { Comp_Generic(op); return; } namespace MIPSComp { @@ -83,6 +88,7 @@ namespace MIPSComp void Jit::Comp_ITypeMem(u32 op) { + CONDITIONAL_DISABLE; int offset = (signed short)(op&0xFFFF); bool load = false; int rt = _RT; From b781c8deb549c19528bf5b40ac53e241f78aa466 Mon Sep 17 00:00:00 2001 From: Henrik Rydgard Date: Sat, 2 Mar 2013 21:47:11 +0100 Subject: [PATCH 271/347] Delete unused ARM emitter function. --- Common/ArmEmitter.cpp | 9 +-------- Common/ArmEmitter.h | 4 ++-- 2 files changed, 3 insertions(+), 10 deletions(-) diff --git a/Common/ArmEmitter.cpp b/Common/ArmEmitter.cpp index f8bdc1722ba6..35b034d13ea3 100644 --- a/Common/ArmEmitter.cpp +++ b/Common/ArmEmitter.cpp @@ -134,14 +134,7 @@ void ARMXEmitter::MOVI2R(ARMReg reg, u32 val, bool optimize) } } } -// Moves IMM to memory location -void ARMXEmitter::ARMABI_MOVI2M(Operand2 op, Operand2 val) -{ - // This moves imm to a memory location - MOVW(R14, val); MOVT(R14, val, true); - MOVW(R12, op); MOVT(R12, op, true); - STR(R12, R14); // R10 is what we want to store -} + void ARMXEmitter::QuickCallFunction(ARMReg reg, void *func) { MOVI2R(reg, (u32)(func)); BL(reg); diff --git a/Common/ArmEmitter.h b/Common/ArmEmitter.h index 518beac60f2c..1b32de141f8a 100644 --- a/Common/ArmEmitter.h +++ b/Common/ArmEmitter.h @@ -539,9 +539,9 @@ class ARMXEmitter void VMRS_APSR(); void QuickCallFunction(ARMReg scratchreg, void *func); - // Utility functions + + // Wrapper around MOVT/MOVW with fallbacks. void MOVI2R(ARMReg reg, u32 val, bool optimize = true); - void ARMABI_MOVI2M(Operand2 op, Operand2 val); }; // class ARMXEmitter From ee00f231a386ccb739dd53c1f4ff66a5123779d3 Mon Sep 17 00:00:00 2001 From: "Unknown W. Brackets" Date: Sun, 3 Mar 2013 01:56:12 -0800 Subject: [PATCH 272/347] ARM buildfix with cmake. --- CMakeLists.txt | 2 ++ 1 file changed, 2 insertions(+) diff --git a/CMakeLists.txt b/CMakeLists.txt index b3dbfd8d2d82..32c240c8523e 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -619,6 +619,8 @@ if(ARM) Core/MIPS/ARM/ArmJitCache.h Core/MIPS/ARM/ArmRegCache.cpp Core/MIPS/ARM/ArmRegCache.h + Core/MIPS/ARM/ArmRegCacheFPU.cpp + Core/MIPS/ARM/ArmRegCacheFPU.h ext/disarm.cpp) elseif(X86) set(CoreExtra ${CoreExtra} From 020e505e748dbc02a85cc2716b0fd0c0f99b0b70 Mon Sep 17 00:00:00 2001 From: Henrik Rydgard Date: Sun, 3 Mar 2013 10:57:00 +0100 Subject: [PATCH 273/347] Make the gitversion script work automatically with msysgit without setting global PATH. --- Windows/git-version-gen.cmd | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/Windows/git-version-gen.cmd b/Windows/git-version-gen.cmd index b5d21bf5123f..cd8e4949534a 100644 --- a/Windows/git-version-gen.cmd +++ b/Windows/git-version-gen.cmd @@ -23,6 +23,17 @@ if "%GIT%" == "" ( set GIT=git ) +"%GIT%" describe > NUL 2> NUL +if errorlevel 1 ( + echo Git not on path, trying default Msysgit paths + set GIT=C:\Program Files ^(x86^)\Git\bin\git.exe + "%GIT%" describe > NUL 2> NUL + if errorlevel 1 ( + set GIT=C:\Program Files\Git\bin\git.exe + ) +) +goto done + if exist "%GIT_VERSION_FILE%" ( rem // Skip updating the file if PPSSPP_GIT_VERSION_NO_UPDATE is 1. findstr /B /C:"#define PPSSPP_GIT_VERSION_NO_UPDATE 1" "%GIT_VERSION_FILE%" > NUL @@ -33,7 +44,7 @@ if exist "%GIT_VERSION_FILE%" ( "%GIT%" describe --always > NUL 2> NUL if errorlevel 1 ( - echo Unable to update git-version.cpp, %GIT% not on path. + echo Unable to update git-version.cpp, git not found. echo // This is a generated file. > "%GIT_VERSION_FILE%" echo. >> "%GIT_VERSION_FILE%" From 66e4c4d8249d2f9cb39b5663ad201e2ff3e7d7d2 Mon Sep 17 00:00:00 2001 From: "Unknown W. Brackets" Date: Sun, 3 Mar 2013 02:16:01 -0800 Subject: [PATCH 274/347] Fix git-version-gen without git on path. --- Windows/git-version-gen.cmd | 17 ++++++++--------- 1 file changed, 8 insertions(+), 9 deletions(-) diff --git a/Windows/git-version-gen.cmd b/Windows/git-version-gen.cmd index cd8e4949534a..a203a5297682 100644 --- a/Windows/git-version-gen.cmd +++ b/Windows/git-version-gen.cmd @@ -16,23 +16,22 @@ rem // If not, see http://www.gnu.org/licenses/ rem // Official git repository and contact information can be found at rem // https://github.com/hrydgard/ppsspp and http://www.ppsspp.org/. -setlocal +setlocal ENABLEDELAYEDEXPANSION set GIT_VERSION_FILE=%~p0..\git-version.cpp if "%GIT%" == "" ( - set GIT=git + set GIT="git" ) -"%GIT%" describe > NUL 2> NUL +%GIT% describe > NUL 2> NUL if errorlevel 1 ( echo Git not on path, trying default Msysgit paths - set GIT=C:\Program Files ^(x86^)\Git\bin\git.exe - "%GIT%" describe > NUL 2> NUL + set GIT="%ProgramFiles(x86)%\Git\bin\git.exe" + !GIT! describe > NUL 2> NUL if errorlevel 1 ( - set GIT=C:\Program Files\Git\bin\git.exe + set GIT="%ProgramFiles%\Git\bin\git.exe" ) ) -goto done if exist "%GIT_VERSION_FILE%" ( rem // Skip updating the file if PPSSPP_GIT_VERSION_NO_UPDATE is 1. @@ -42,7 +41,7 @@ if exist "%GIT_VERSION_FILE%" ( ) ) -"%GIT%" describe --always > NUL 2> NUL +%GIT% describe --always > NUL 2> NUL if errorlevel 1 ( echo Unable to update git-version.cpp, git not found. @@ -52,7 +51,7 @@ if errorlevel 1 ( goto done ) -for /F %%I IN ('"%GIT%" describe --always') do set GIT_VERSION=%%I +for /F %%I IN ('%GIT% describe --always') do set GIT_VERSION=%%I rem // Don't modify the file if it already has the current version. if exist "%GIT_VERSION_FILE%" ( From fe16a70ea7cde75b510c4202032aa0a7546087f6 Mon Sep 17 00:00:00 2001 From: "Unknown W. Brackets" Date: Sun, 3 Mar 2013 02:18:24 -0800 Subject: [PATCH 275/347] Add some instructions if it still doesn't work. --- Windows/git-version-gen.cmd | 1 + 1 file changed, 1 insertion(+) diff --git a/Windows/git-version-gen.cmd b/Windows/git-version-gen.cmd index a203a5297682..4266721514e7 100644 --- a/Windows/git-version-gen.cmd +++ b/Windows/git-version-gen.cmd @@ -44,6 +44,7 @@ if exist "%GIT_VERSION_FILE%" ( %GIT% describe --always > NUL 2> NUL if errorlevel 1 ( echo Unable to update git-version.cpp, git not found. + echo If you don't want to add it to your path, set the GIT environment variable. echo // This is a generated file. > "%GIT_VERSION_FILE%" echo. >> "%GIT_VERSION_FILE%" From 214a460eb9104787f72eeb498a2164dfc6260d90 Mon Sep 17 00:00:00 2001 From: "Unknown W. Brackets" Date: Sun, 3 Mar 2013 02:21:34 -0800 Subject: [PATCH 276/347] Fix GIT env having quotes in it. --- Windows/git-version-gen.cmd | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Windows/git-version-gen.cmd b/Windows/git-version-gen.cmd index 4266721514e7..553407fb9dfc 100644 --- a/Windows/git-version-gen.cmd +++ b/Windows/git-version-gen.cmd @@ -19,7 +19,7 @@ rem // https://github.com/hrydgard/ppsspp and http://www.ppsspp.org/. setlocal ENABLEDELAYEDEXPANSION set GIT_VERSION_FILE=%~p0..\git-version.cpp -if "%GIT%" == "" ( +if not defined GIT ( set GIT="git" ) From 06bd58454b2aba8c039a3985b29998006691b7c8 Mon Sep 17 00:00:00 2001 From: Darth1701 Date: Sun, 3 Mar 2013 12:39:37 +0100 Subject: [PATCH 277/347] Stub out sceDisplayIsForeground --- Core/HLE/sceDisplay.cpp | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/Core/HLE/sceDisplay.cpp b/Core/HLE/sceDisplay.cpp index 03f882daf73a..17084d43c3b2 100644 --- a/Core/HLE/sceDisplay.cpp +++ b/Core/HLE/sceDisplay.cpp @@ -591,6 +591,11 @@ float sceDisplayGetFramePerSec() { return fps; // (9MHz * 1)/(525 * 286) } +u32 sceDisplayIsForeground() { + ERROR_LOG(HLE,"UNIMPL sceDisplayIsForeground()"); + return 1; // return value according to JPCSP comment +} + const HLEFunction sceDisplay[] = { {0x0E20F177,WrapU_UUU, "sceDisplaySetMode"}, {0x289D82FE,WrapU_UIII, "sceDisplaySetFramebuf"}, @@ -610,7 +615,7 @@ const HLEFunction sceDisplay[] = { {0x7ED59BC4,0,"sceDisplaySetHoldMode"}, {0xA544C486,0,"sceDisplaySetResumeMode"}, {0xBF79F646,0,"sceDisplayGetResumeMode"}, - {0xB4F378FA,0,"sceDisplayIsForeground"}, + {0xB4F378FA,WrapU_V,"sceDisplayIsForeground"}, {0x31C4BAA8,0,"sceDisplayGetBrightness"}, {0x4D4E10EC,sceDisplayIsVblank,"sceDisplayIsVblank"}, {0x21038913,0,"sceDisplayIsVsync"}, From bc156173928cdbd6296d29f855359e6475967e4d Mon Sep 17 00:00:00 2001 From: Henrik Rydgard Date: Sun, 3 Mar 2013 13:00:21 +0100 Subject: [PATCH 278/347] Make un-buffered rendering much smarter, removing flicker. This turns it into a very viable option for many games. You do lose some FX but it can as a result even be used as a workaround for the massive glow in Wipeout... --- Common/ArmEmitter.cpp | 4 +- Core/HLE/sceDisplay.cpp | 33 ++++++---- Core/MIPS/ARM/ArmJitCache.cpp | 2 +- GPU/GLES/DisplayListInterpreter.cpp | 23 +++++-- GPU/GLES/DisplayListInterpreter.h | 1 + GPU/GLES/FragmentShaderGenerator.cpp | 2 +- GPU/GLES/Framebuffer.cpp | 97 +++++++++++++++++++--------- GPU/GLES/Framebuffer.h | 8 ++- GPU/GLES/ShaderManager.cpp | 3 +- GPU/GLES/TextureCache.cpp | 14 +++- GPU/GPUCommon.h | 1 + GPU/GPUInterface.h | 1 + GPU/GPUState.h | 2 + Windows/PPSSPP.vcxproj | 1 + Windows/PPSSPP.vcxproj.filters | 1 + Windows/WndMainWindow.cpp | 11 ++-- android/jni/MenuScreens.cpp | 11 ++-- 17 files changed, 150 insertions(+), 65 deletions(-) diff --git a/Common/ArmEmitter.cpp b/Common/ArmEmitter.cpp index 35b034d13ea3..9e4ba7abefcf 100644 --- a/Common/ArmEmitter.cpp +++ b/Common/ArmEmitter.cpp @@ -1085,8 +1085,8 @@ void ARMXEmitter::VMOV(ARMReg Dest, ARMReg Src) void ARMXEmitter::VCVT(ARMReg Sd, ARMReg Sm, int flags) { - bool op = (flags & TO_INT) ? (flags & ROUND_TO_ZERO) : (flags & IS_SIGNED); - bool op2 = (flags & TO_INT) ? (flags & IS_SIGNED) : 0; + int op = ((flags & TO_INT) ? (flags & ROUND_TO_ZERO) : (flags & IS_SIGNED)) ? 1 : 0; + int op2 = ((flags & TO_INT) ? (flags & IS_SIGNED) : 0) ? 1 : 0; Sd = SubBase(Sd); Sm = SubBase(Sm); diff --git a/Core/HLE/sceDisplay.cpp b/Core/HLE/sceDisplay.cpp index 17084d43c3b2..1e037fd5bc6d 100644 --- a/Core/HLE/sceDisplay.cpp +++ b/Core/HLE/sceDisplay.cpp @@ -210,7 +210,7 @@ void CalculateFPS() } char stats[50]; - sprintf(stats, "%0.1f", fps); + sprintf(stats, "VPS: %0.1f", fps); #ifdef USING_GLES2 float zoom = 0.7f; /// g_Config.iWindowZoom; @@ -285,13 +285,12 @@ void DebugStats() } // Let's collect all the throttling and frameskipping logic here. -void DoFrameTiming(bool &throttle, bool &skipFrame, bool &skipFlip) { +void DoFrameTiming(bool &throttle, bool &skipFrame) { #ifdef _WIN32 throttle = !GetAsyncKeyState(VK_TAB); #else - throttle = false; + throttle = true; #endif - skipFlip = false; skipFrame = false; if (PSP_CoreParameter().headLess) throttle = false; @@ -311,7 +310,6 @@ void DoFrameTiming(bool &throttle, bool &skipFrame, bool &skipFlip) { if (curFrameTime > nextFrameTime && doFrameSkip) { // Argh, we are falling behind! Let's skip a frame and see if we catch up. skipFrame = true; - skipFlip = true; INFO_LOG(HLE,"FRAMESKIP %i", numSkippedFrames); } @@ -339,10 +337,10 @@ void DoFrameTiming(bool &throttle, bool &skipFrame, bool &skipFlip) { nextFrameTime = nextFrameTime + 1.0 / 60.0; } - // Max 6 skipped frames in a row - 10 fps is really the bare minimum for playability. - if (numSkippedFrames >= 4) { + // Max 4 skipped frames in a row - 15 fps is really the bare minimum for playability. + // We check for 3 here so it's 3 skipped frames, 1 non skipped, 3 skipped, etc. + if (numSkippedFrames >= 3) { skipFrame = false; - skipFlip = false; } } @@ -389,17 +387,23 @@ void hleEnterVblank(u64 userdata, int cyclesLate) { CalculateFPS(); } + bool skipFlip = false; + + // This frame was skipped, so no need to flip. + if (gstate_c.skipDrawReason & SKIPDRAW_SKIPFRAME) { + skipFlip = true; + } + // Draw screen overlays before blitting. Saves and restores the Ge context. // Yeah, this has to be the right moment to end the frame. Give the graphics backend opportunity // to blit the framebuffer, in order to support half-framerate games that otherwise wouldn't have // anything to draw here. gstate_c.skipDrawReason &= ~SKIPDRAW_SKIPFRAME; - bool throttle, skipFrame, skipFlip; + bool throttle, skipFrame; - DoFrameTiming(throttle, skipFrame, skipFlip); + DoFrameTiming(throttle, skipFrame); - // Setting CORE_NEXTFRAME causes a swap. if (skipFrame) { gstate_c.skipDrawReason |= SKIPDRAW_SKIPFRAME; numSkippedFrames++; @@ -408,11 +412,11 @@ void hleEnterVblank(u64 userdata, int cyclesLate) { } if (!skipFlip) { - // Might've just quit / been paused. - if (coreState == CORE_RUNNING) { + // Setting CORE_NEXTFRAME causes a swap. + // Check first though, might've just quit / been paused. + if (coreState == CORE_RUNNING && gpu->FramebufferDirty()) { coreState = CORE_NEXTFRAME; } - CoreTiming::ScheduleEvent(0 - cyclesLate, afterFlipEvent, 0); gpu->CopyDisplayToOutput(); } @@ -420,6 +424,7 @@ void hleEnterVblank(u64 userdata, int cyclesLate) { // Returning here with coreState == CORE_NEXTFRAME causes a buffer flip to happen (next frame). // Right after, we regain control for a little bit in hleAfterFlip. I think that's a great // place to do housekeeping. + CoreTiming::ScheduleEvent(0 - cyclesLate, afterFlipEvent, 0); } void hleAfterFlip(u64 userdata, int cyclesLate) diff --git a/Core/MIPS/ARM/ArmJitCache.cpp b/Core/MIPS/ARM/ArmJitCache.cpp index 62ec8fc49692..57c86e9c45a1 100644 --- a/Core/MIPS/ARM/ArmJitCache.cpp +++ b/Core/MIPS/ARM/ArmJitCache.cpp @@ -355,7 +355,7 @@ void ArmJitBlockCache::DestroyBlock(int block_num, bool invalidate) // checkedEntry is the only "linked" entrance so it's enough to overwrite that. ARMXEmitter emit((u8 *)b.checkedEntry); emit.MOVI2R(R0, b.originalAddress); - emit.STR(R10, R0, offsetof(MIPSState, pc)); + emit.STR(CTXREG, R0, offsetof(MIPSState, pc)); emit.B(MIPSComp::jit->dispatcher); emit.FlushIcache(); } diff --git a/GPU/GLES/DisplayListInterpreter.cpp b/GPU/GLES/DisplayListInterpreter.cpp index 8b4b568cf22c..4e4582a15a7b 100644 --- a/GPU/GLES/DisplayListInterpreter.cpp +++ b/GPU/GLES/DisplayListInterpreter.cpp @@ -251,15 +251,23 @@ void GLES_GPU::SetDisplayFramebuffer(u32 framebuf, u32 stride, int format) { framebufferManager_.SetDisplayFramebuffer(framebuf, stride, format); } +bool GLES_GPU::FramebufferDirty() { + if (!g_Config.bBufferedRendering) { + VirtualFramebuffer *vfb = framebufferManager_.GetDisplayFBO(); + if (vfb) + return vfb->dirtyAfterDisplay; + } + return true; +} + void GLES_GPU::CopyDisplayToOutput() { glstate.colorMask.set(true, true, true, true); transformDraw_.Flush(); - if (!g_Config.bBufferedRendering) - return; EndDebugDraw(); framebufferManager_.CopyDisplayToOutput(); + framebufferManager_.EndFrame(); shaderManager_->DirtyShader(); shaderManager_->DirtyUniform(DIRTY_ALL); @@ -313,10 +321,16 @@ void GLES_GPU::ExecuteOp(u32 op, u32 diff) { case GE_CMD_PRIM: { - if (gstate_c.skipDrawReason) - return; + // This drives all drawing. All other state we just buffer up, then we apply it only + // when it's time to draw. As most PSP games set state redundantly ALL THE TIME, this is a huge optimization. + + // This also make skipping drawing very effective. + if (gstate_c.skipDrawReason & SKIPDRAW_SKIPFRAME) + return; framebufferManager_.SetRenderFrameBuffer(); + if (gstate_c.skipDrawReason & SKIPDRAW_NON_DISPLAYED_FB) + return; u32 count = data & 0xFFFF; u32 type = data >> 16; @@ -650,6 +664,7 @@ void GLES_GPU::ExecuteOp(u32 op, u32 diff) { { // TODO: Here we should check if the transfer overlaps a framebuffer or any textures, // and take appropriate action. This is a block transfer between RAM and VRAM, or vice versa. + // Can we skip this on SkipDraw? DoBlockTransfer(); break; } diff --git a/GPU/GLES/DisplayListInterpreter.h b/GPU/GLES/DisplayListInterpreter.h index 048aab400b84..9b30cab7b59e 100644 --- a/GPU/GLES/DisplayListInterpreter.h +++ b/GPU/GLES/DisplayListInterpreter.h @@ -63,6 +63,7 @@ class GLES_GPU : public GPUCommon { return textureCache_.DecodeTexture(dest, state); } + virtual bool FramebufferDirty(); std::vector GetFramebufferList(); diff --git a/GPU/GLES/FragmentShaderGenerator.cpp b/GPU/GLES/FragmentShaderGenerator.cpp index 24777ca920bd..321ae0b0c066 100644 --- a/GPU/GLES/FragmentShaderGenerator.cpp +++ b/GPU/GLES/FragmentShaderGenerator.cpp @@ -88,7 +88,7 @@ void GenerateFragmentShader(char *buffer) bool enableFog = gstate.isFogEnabled() && !gstate.isModeThrough() && !gstate.isModeClear(); bool enableAlphaTest = (gstate.alphaTestEnable & 1) && !gstate.isModeClear(); bool enableColorTest = (gstate.colorTestEnable & 1) && !gstate.isModeClear(); - bool enableColorDoubling = gstate.texfunc & 0x10000; + bool enableColorDoubling = (gstate.texfunc & 0x10000) != 0; if (doTexture) diff --git a/GPU/GLES/Framebuffer.cpp b/GPU/GLES/Framebuffer.cpp index 8b4f9d5a096f..d2f7e931dd1b 100644 --- a/GPU/GLES/Framebuffer.cpp +++ b/GPU/GLES/Framebuffer.cpp @@ -266,8 +266,6 @@ void GetViewportDimensions(int *w, int *h) { } void FramebufferManager::SetRenderFrameBuffer() { - if (!g_Config.bBufferedRendering) - return; // Get parameters u32 fb_address = (gstate.fbptr & 0xFFE000) | ((gstate.fbwidth & 0xFF0000) << 8); int fb_stride = gstate.fbwidth & 0x3C0; @@ -328,6 +326,7 @@ void FramebufferManager::SetRenderFrameBuffer() { vfb->renderHeight = (u16)(drawing_height * renderHeightFactor); vfb->format = fmt; vfb->usageFlags = FB_USAGE_RENDERTARGET; + vfb->dirtyAfterDisplay = true; switch (fmt) { case GE_FORMAT_4444: vfb->colorDepth = FBO_4444; break; @@ -344,13 +343,26 @@ void FramebufferManager::SetRenderFrameBuffer() { // vfb->colorDepth = FBO_8888; //#endif - vfb->fbo = fbo_create(vfb->renderWidth, vfb->renderHeight, 1, true, vfb->colorDepth); + if (g_Config.bBufferedRendering) + { + vfb->fbo = fbo_create(vfb->renderWidth, vfb->renderHeight, 1, true, vfb->colorDepth); + } + else + vfb->fbo = 0; + textureCache_->NotifyFramebuffer(vfb->fb_address, vfb); vfb->last_frame_used = gpuStats.numFrames; vfbs_.push_back(vfb); - fbo_bind_as_render_target(vfb->fbo); + if (g_Config.bBufferedRendering) { + fbo_bind_as_render_target(vfb->fbo); + } else { + fbo_unbind(); + // Let's ignore rendering to targets that have not (yet) been displayed. + gstate_c.skipDrawReason |= SKIPDRAW_NON_DISPLAYED_FB; + } + glEnable(GL_DITHER); glstate.viewport.set(0, 0, vfb->renderWidth, vfb->renderHeight); currentRenderVfb_ = vfb; @@ -359,21 +371,39 @@ void FramebufferManager::SetRenderFrameBuffer() { glClearColor(0,0,0,1); glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT); INFO_LOG(HLE, "Creating FBO for %08x : %i x %i x %i", vfb->fb_address, vfb->width, vfb->height, vfb->format); - return; - } - if (vfb != currentRenderVfb_) { + // We already have it! + } else if (vfb != currentRenderVfb_) { // Use it as a render target. DEBUG_LOG(HLE, "Switching render target to FBO for %08x", vfb->fb_address); + vfb->usageFlags |= FB_USAGE_RENDERTARGET; gstate_c.textureChanged = true; if (vfb->last_frame_used != gpuStats.numFrames) { // Android optimization //glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT); } vfb->last_frame_used = gpuStats.numFrames; - - fbo_bind_as_render_target(vfb->fbo); - + vfb->dirtyAfterDisplay = true; + + if (g_Config.bBufferedRendering && vfb->fbo) { + fbo_bind_as_render_target(vfb->fbo); + } else { + fbo_unbind(); + + // Let's ignore rendering to targets that have not (yet) been displayed. + if (vfb->usageFlags & FB_USAGE_DISPLAYED_FRAMEBUFFER) + gstate_c.skipDrawReason &= ~SKIPDRAW_NON_DISPLAYED_FB; + else + gstate_c.skipDrawReason |= SKIPDRAW_NON_DISPLAYED_FB; + + /* + if (drawing_width == 480 && drawing_height == 272) { + gstate_c.skipDrawReason &= ~SKIPDRAW_SKIPNONFB; + // OK! + } else { + gstate_c.skipDrawReason |= ~SKIPDRAW_SKIPNONFB; + }*/ + } textureCache_->NotifyFramebuffer(vfb->fb_address, vfb); #ifdef USING_GLES2 @@ -394,7 +424,6 @@ void FramebufferManager::SetRenderFrameBuffer() { } } - void FramebufferManager::CopyDisplayToOutput() { fbo_unbind(); @@ -409,22 +438,31 @@ void FramebufferManager::CopyDisplayToOutput() { return; } + vfb->usageFlags |= FB_USAGE_DISPLAYED_FRAMEBUFFER; + vfb->dirtyAfterDisplay = false; + prevPrevDisplayFramebuf_ = prevDisplayFramebuf_; prevDisplayFramebuf_ = displayFramebuf_; displayFramebuf_ = vfb; - glstate.viewport.set(0, 0, PSP_CoreParameter().pixelWidth, PSP_CoreParameter().pixelHeight); - currentRenderVfb_ = 0; - DEBUG_LOG(HLE, "Displaying FBO %08x", vfb->fb_address); - glstate.blend.disable(); - glstate.cullFace.disable(); - glstate.depthTest.disable(); - glstate.scissorTest.disable(); - glstate.stencilTest.disable(); + if (vfb->fbo) { + glstate.viewport.set(0, 0, PSP_CoreParameter().pixelWidth, PSP_CoreParameter().pixelHeight); + DEBUG_LOG(HLE, "Displaying FBO %08x", vfb->fb_address); + glstate.blend.disable(); + glstate.cullFace.disable(); + glstate.depthTest.disable(); + glstate.scissorTest.disable(); + glstate.stencilTest.disable(); + + fbo_bind_color_as_texture(vfb->fbo, 0); - fbo_bind_color_as_texture(vfb->fbo, 0); + // These are in the output display coordinates + float x, y, w, h; + CenterRect(&x, &y, &w, &h, 480.0f, 272.0f, (float)PSP_CoreParameter().pixelWidth, (float)PSP_CoreParameter().pixelHeight); + DrawActiveTexture(x, y, w, h, true); + } if (resized_) { glstate.depthWrite.set(GL_TRUE); @@ -432,11 +470,9 @@ void FramebufferManager::CopyDisplayToOutput() { glClearColor(0,0,0,1); glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT); } - // These are in the output display coordinates - float x, y, w, h; - CenterRect(&x, &y, &w, &h, 480.0f, 272.0f, (float)PSP_CoreParameter().pixelWidth, (float)PSP_CoreParameter().pixelHeight); - DrawActiveTexture(x, y, w, h, true); +} +void FramebufferManager::EndFrame() { if (resized_) { DestroyAllFBOs(); glstate.viewport.set(0, 0, PSP_CoreParameter().pixelWidth, PSP_CoreParameter().pixelHeight); @@ -472,8 +508,7 @@ void FramebufferManager::SetDisplayFramebuffer(u32 framebuf, u32 stride, int for } } -std::vector FramebufferManager::GetFramebufferList() -{ +std::vector FramebufferManager::GetFramebufferList() { std::vector list; for (auto iter = vfbs_.begin(); iter != vfbs_.end(); ++iter) { @@ -501,8 +536,11 @@ void FramebufferManager::DecimateFBOs() { } if ((*iter)->last_frame_used + FBO_OLD_AGE < gpuStats.numFrames) { INFO_LOG(HLE, "Destroying FBO for %08x (%i x %i x %i)", vfb->fb_address, vfb->width, vfb->height, vfb->format) - textureCache_->NotifyFramebufferDestroyed(vfb->fb_address, vfb); - fbo_destroy(vfb->fbo); + if (vfb->fbo) { + textureCache_->NotifyFramebufferDestroyed(vfb->fb_address, vfb); + fbo_destroy(vfb->fbo); + vfb->fbo = 0; + } delete vfb; vfbs_.erase(iter++); } @@ -515,7 +553,8 @@ void FramebufferManager::DestroyAllFBOs() { for (auto iter = vfbs_.begin(); iter != vfbs_.end(); ++iter) { VirtualFramebuffer *vfb = *iter; textureCache_->NotifyFramebufferDestroyed(vfb->fb_address, vfb); - fbo_destroy(vfb->fbo); + if (vfb->fbo) + fbo_destroy(vfb->fbo); delete vfb; } vfbs_.clear(); diff --git a/GPU/GLES/Framebuffer.h b/GPU/GLES/Framebuffer.h index c40fcc7c24aa..842294373fe2 100644 --- a/GPU/GLES/Framebuffer.h +++ b/GPU/GLES/Framebuffer.h @@ -39,8 +39,9 @@ enum PspDisplayPixelFormat { }; enum { - FB_USAGE_RENDERTARGET = 1, - FB_USAGE_TEXTURE = 2, + FB_USAGE_DISPLAYED_FRAMEBUFFER = 1, + FB_USAGE_RENDERTARGET = 2, + FB_USAGE_TEXTURE = 4, }; @@ -63,6 +64,8 @@ struct VirtualFramebuffer { int format; // virtual, right now they are all RGBA8888 FBOColorDepth colorDepth; FBO *fbo; + + bool dirtyAfterDisplay; }; @@ -82,6 +85,7 @@ class FramebufferManager { void DecimateFBOs(); void BeginFrame(); + void EndFrame(); void Resized(); void CopyDisplayToOutput(); void SetRenderFrameBuffer(); // Uses parameters computed from gstate diff --git a/GPU/GLES/ShaderManager.cpp b/GPU/GLES/ShaderManager.cpp index ac789f572670..4675f960f831 100644 --- a/GPU/GLES/ShaderManager.cpp +++ b/GPU/GLES/ShaderManager.cpp @@ -376,8 +376,7 @@ void ShaderManager::DirtyShader() } -LinkedShader *ShaderManager::ApplyShader(int prim) -{ +LinkedShader *ShaderManager::ApplyShader(int prim) { if (globalDirty) { if (lastShader) lastShader->dirtyUniforms |= globalDirty; diff --git a/GPU/GLES/TextureCache.cpp b/GPU/GLES/TextureCache.cpp index cd1a4b6b52a4..8b4d202e2da5 100644 --- a/GPU/GLES/TextureCache.cpp +++ b/GPU/GLES/TextureCache.cpp @@ -138,7 +138,7 @@ void TextureCache::NotifyFramebuffer(u32 address, VirtualFramebuffer *framebuffe if (entry) { DEBUG_LOG(HLE, "Render to texture detected at %08x!", address); if (!entry->framebuffer) - entry->framebuffer= framebuffer; + entry->framebuffer = framebuffer; // TODO: Delete the original non-fbo texture too. } } @@ -695,12 +695,22 @@ void TextureCache::SetTexture() { TexCache::iterator iter = cache.find(cachekey); TexCacheEntry *entry = NULL; gstate_c.flipTexture = false; + gstate_c.skipDrawReason &= ~SKIPDRAW_BAD_FB_TEXTURE; if (iter != cache.end()) { entry = &iter->second; // Check for FBO - slow! if (entry->framebuffer) { - fbo_bind_color_as_texture(entry->framebuffer->fbo, 0); + entry->framebuffer->usageFlags |= FB_USAGE_TEXTURE; + if (entry->framebuffer->fbo) + { + fbo_bind_color_as_texture(entry->framebuffer->fbo, 0); + } + else { + glBindTexture(GL_TEXTURE_2D, 0); + gstate_c.skipDrawReason |= SKIPDRAW_BAD_FB_TEXTURE; + } + UpdateSamplingParams(*entry, false); // This isn't right. diff --git a/GPU/GPUCommon.h b/GPU/GPUCommon.h index 8feb9cb5699e..88aa151a8d70 100644 --- a/GPU/GPUCommon.h +++ b/GPU/GPUCommon.h @@ -23,6 +23,7 @@ class GPUCommon : public GPUInterface virtual u32 EnqueueList(u32 listpc, u32 stall, int subIntrBase, bool head); virtual int listStatus(int listid); virtual void DoState(PointerWrap &p); + virtual bool FramebufferDirty() { return true; } protected: typedef std::deque DisplayListQueue; diff --git a/GPU/GPUInterface.h b/GPU/GPUInterface.h index 4edb5de1c5b8..f558e3ceb8f2 100644 --- a/GPU/GPUInterface.h +++ b/GPU/GPUInterface.h @@ -102,6 +102,7 @@ class GPUInterface // Called by the window system if the window size changed. This will be reflected in PSPCoreParam.pixel*. virtual void Resized() = 0; + virtual bool FramebufferDirty() = 0; // Debugging virtual void DumpNextFrame() = 0; diff --git a/GPU/GPUState.h b/GPU/GPUState.h index 7ddb5853c0c1..853a05b4e891 100644 --- a/GPU/GPUState.h +++ b/GPU/GPUState.h @@ -229,6 +229,8 @@ struct GPUgstate enum SkipDrawReasonFlags { SKIPDRAW_SKIPFRAME = 1, + SKIPDRAW_NON_DISPLAYED_FB = 2, // Skip drawing to FBO:s that have not been displayed. + SKIPDRAW_BAD_FB_TEXTURE = 4, }; // The rest is cached simplified/converted data for fast access. diff --git a/Windows/PPSSPP.vcxproj b/Windows/PPSSPP.vcxproj index 019fde5bccd0..04c498d664bf 100644 --- a/Windows/PPSSPP.vcxproj +++ b/Windows/PPSSPP.vcxproj @@ -339,6 +339,7 @@ + diff --git a/Windows/PPSSPP.vcxproj.filters b/Windows/PPSSPP.vcxproj.filters index 6c0a8b3408a6..7456a22f8a87 100644 --- a/Windows/PPSSPP.vcxproj.filters +++ b/Windows/PPSSPP.vcxproj.filters @@ -215,6 +215,7 @@ Windows + diff --git a/Windows/WndMainWindow.cpp b/Windows/WndMainWindow.cpp index 998b21bdb2f2..b6b769f6559a 100644 --- a/Windows/WndMainWindow.cpp +++ b/Windows/WndMainWindow.cpp @@ -401,6 +401,8 @@ namespace MainWindow case ID_OPTIONS_BUFFEREDRENDERING: g_Config.bBufferedRendering = !g_Config.bBufferedRendering; UpdateMenus(); + if (gpu) + gpu->Resized(); // easy way to force a clear... break; case ID_OPTIONS_SHOWDEBUGSTATISTICS: @@ -416,7 +418,8 @@ namespace MainWindow case ID_OPTIONS_STRETCHDISPLAY: g_Config.bStretchToDisplay = !g_Config.bStretchToDisplay; UpdateMenus(); - gpu->Resized(); // easy way to force a clear... + if (gpu) + gpu->Resized(); // easy way to force a clear... break; case ID_OPTIONS_FRAMESKIP: @@ -443,12 +446,12 @@ namespace MainWindow break; case ID_DEBUG_DUMPNEXTFRAME: - gpu->DumpNextFrame(); + if (gpu) + gpu->DumpNextFrame(); break; case ID_DEBUG_LOADMAPFILE: - if (W32Util::BrowseForFileName(true, hWnd, "Load .MAP",0,"Maps\0*.map\0All files\0*.*\0\0","map",fn)) - { + if (W32Util::BrowseForFileName(true, hWnd, "Load .MAP",0,"Maps\0*.map\0All files\0*.*\0\0","map",fn)) { symbolMap.LoadSymbolMap(fn.c_str()); // HLE_PatchFunctions(); for (int i=0; iResized(); + } if (g_Config.bBufferedRendering) { bool doubleRes = g_Config.iWindowZoom == 2; - UICheckBox(GEN_ID, x + 50, y += stride, "2x Render Resolution", ALIGN_TOPLEFT, &doubleRes); + if (UICheckBox(GEN_ID, x + 50, y += stride, "2x Render Resolution", ALIGN_TOPLEFT, &doubleRes)) { + gpu->Resized(); + } g_Config.iWindowZoom = doubleRes ? 2 : 1; } UICheckBox(GEN_ID, x, y += stride, "Hardware Transform", ALIGN_TOPLEFT, &g_Config.bHardwareTransform); @@ -444,8 +448,7 @@ void CreditsScreen::update(InputState &input_state) { frames_++; } -const static char *credits[] = -{ +static const char * credits[] = { "PPSSPP", "", "", From 4474adee1d636cc13b71d47ce9bf5d4bd9796602 Mon Sep 17 00:00:00 2001 From: Henrik Rydgard Date: Sun, 3 Mar 2013 13:21:06 +0100 Subject: [PATCH 279/347] Fix frameskip + unbuffered --- Core/HLE/sceDisplay.cpp | 2 +- GPU/GLES/DisplayListInterpreter.cpp | 4 +--- 2 files changed, 2 insertions(+), 4 deletions(-) diff --git a/Core/HLE/sceDisplay.cpp b/Core/HLE/sceDisplay.cpp index 1e037fd5bc6d..d55365ba3dba 100644 --- a/Core/HLE/sceDisplay.cpp +++ b/Core/HLE/sceDisplay.cpp @@ -310,7 +310,7 @@ void DoFrameTiming(bool &throttle, bool &skipFrame) { if (curFrameTime > nextFrameTime && doFrameSkip) { // Argh, we are falling behind! Let's skip a frame and see if we catch up. skipFrame = true; - INFO_LOG(HLE,"FRAMESKIP %i", numSkippedFrames); + // INFO_LOG(HLE,"FRAMESKIP %i", numSkippedFrames); } if (curFrameTime < nextFrameTime && throttle) diff --git a/GPU/GLES/DisplayListInterpreter.cpp b/GPU/GLES/DisplayListInterpreter.cpp index 4e4582a15a7b..cbbaca510da8 100644 --- a/GPU/GLES/DisplayListInterpreter.cpp +++ b/GPU/GLES/DisplayListInterpreter.cpp @@ -326,10 +326,8 @@ void GLES_GPU::ExecuteOp(u32 op, u32 diff) { // This also make skipping drawing very effective. - if (gstate_c.skipDrawReason & SKIPDRAW_SKIPFRAME) - return; framebufferManager_.SetRenderFrameBuffer(); - if (gstate_c.skipDrawReason & SKIPDRAW_NON_DISPLAYED_FB) + if (gstate_c.skipDrawReason & (SKIPDRAW_SKIPFRAME | SKIPDRAW_NON_DISPLAYED_FB)) return; u32 count = data & 0xFFFF; From 1b1252b9ed1a6ec037208eafa148dfa784a6c609 Mon Sep 17 00:00:00 2001 From: Henrik Rydgard Date: Sun, 3 Mar 2013 13:30:29 +0100 Subject: [PATCH 280/347] Fix crashes in android when setting buffered rendering before starting the game. --- android/jni/MenuScreens.cpp | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/android/jni/MenuScreens.cpp b/android/jni/MenuScreens.cpp index d64dfcf6806e..a69a5b88ec89 100644 --- a/android/jni/MenuScreens.cpp +++ b/android/jni/MenuScreens.cpp @@ -315,12 +315,14 @@ void SettingsScreen::render() { int stride = 40; UICheckBox(GEN_ID, x, y += stride, "Sound Emulation", ALIGN_TOPLEFT, &g_Config.bEnableSound); if (UICheckBox(GEN_ID, x, y += stride, "Buffered Rendering", ALIGN_TOPLEFT, &g_Config.bBufferedRendering)) { - gpu->Resized(); + if (gpu) + gpu->Resized(); } if (g_Config.bBufferedRendering) { bool doubleRes = g_Config.iWindowZoom == 2; if (UICheckBox(GEN_ID, x + 50, y += stride, "2x Render Resolution", ALIGN_TOPLEFT, &doubleRes)) { - gpu->Resized(); + if (gpu) + gpu->Resized(); } g_Config.iWindowZoom = doubleRes ? 2 : 1; } From f72f471370186481fe230133d975e19681f06751 Mon Sep 17 00:00:00 2001 From: Henrik Rydgard Date: Sun, 3 Mar 2013 14:29:03 +0100 Subject: [PATCH 281/347] Hack around font problem that caused Dissidia to crash with fastmem (calling the supplied alloc fails). --- Core/HLE/sceFont.cpp | 25 +++++++++++++++++++------ 1 file changed, 19 insertions(+), 6 deletions(-) diff --git a/Core/HLE/sceFont.cpp b/Core/HLE/sceFont.cpp index c863302e0420..a87e0094e9ce 100644 --- a/Core/HLE/sceFont.cpp +++ b/Core/HLE/sceFont.cpp @@ -217,13 +217,23 @@ class FontLib { public: FontLib(u32 paramPtr) : fontHRes_(128.0f), fontVRes_(128.0f) { Memory::ReadStruct(paramPtr, ¶ms_); - + fakeAlloc_ = 0x13370; // We use the same strange scheme that JPCSP uses. u32 allocSize = 4 + 4 * params_.numFonts; PostAllocCallback *action = (PostAllocCallback*) __KernelCreateAction(actionPostAllocCallback); action->SetFontLib(this); - u32 args[1] = { allocSize }; - __KernelDirectMipsCall(params_.allocFuncAddr, action, args, 1, false); + + if (false) { + // This fails in dissidia. The function at 088ff320 (params_.allocFuncAddr) calls some malloc function, the second one returns 0 which causes + // bad stores later. So we just ignore this with if (false) and fake it. + u32 args[1] = { allocSize }; + __KernelDirectMipsCall(params_.allocFuncAddr, action, args, 1, false); + } else { + AllocDone(fakeAlloc_); + fakeAlloc_ += allocSize; + fontLibMap[handle()] = this; + INFO_LOG(HLE, "Leaving PostAllocCallback::run"); + } } void Close() { @@ -232,7 +242,7 @@ class FontLib { void Done() { for (size_t i = 0; i < fonts_.size(); i++) { - if (Memory::Read_U32(fonts_[i]) == FONT_IS_OPEN) { + if (isfontopen_[i] == FONT_IS_OPEN) { fontMap[fonts_[i]]->Close(); delete fontMap[fonts_[i]]; fontMap.erase(fonts_[i]); @@ -326,6 +336,8 @@ class FontLib { int fileFontHandle_; int handle_; int altCharCode_; + + u32 fakeAlloc_; DISALLOW_COPY_AND_ASSIGN(FontLib); }; @@ -479,8 +491,9 @@ u32 sceFontNewLib(u32 paramPtr, u32 errorCodePtr) { FontLib *newLib = new FontLib(paramPtr); // The game should never see this value, the return value is replaced - // by the action. - return 0xDEADDEAD; + // by the action. Except if we disable the alloc, in this case we return + // the handle correctly here. + return newLib->handle(); } return 0; From 3c640a0f1e0b2f38fd2d65a9f1074d39ebc82449 Mon Sep 17 00:00:00 2001 From: Henrik Rydgard Date: Sun, 3 Mar 2013 15:29:13 +0100 Subject: [PATCH 282/347] armjit: seb and seh instructions --- Core/MIPS/ARM/ArmCompALU.cpp | 62 ++++++++++++++++++++++++++++-------- 1 file changed, 48 insertions(+), 14 deletions(-) diff --git a/Core/MIPS/ARM/ArmCompALU.cpp b/Core/MIPS/ARM/ArmCompALU.cpp index 6208f305c5b7..9becffea3207 100644 --- a/Core/MIPS/ARM/ArmCompALU.cpp +++ b/Core/MIPS/ARM/ArmCompALU.cpp @@ -311,8 +311,34 @@ namespace MIPSComp void Jit::Comp_Special3(u32 op) { - // ext, ins - DISABLE; + CONDITIONAL_DISABLE; + int rs = _RS; + int rt = _RT; + int pos = _POS; + + int size = _SIZE + 1; + u32 mask = 0xFFFFFFFFUL >> (32 - size); + + // Don't change $zr. + if (rt == 0) + return; + + switch (op & 0x3f) + { + case 0x0: //ext + if (gpr.IsImm(rs)) + { + gpr.SetImm(rt, (gpr.GetImm(rs) >> pos) & mask); + return; + } + DISABLE; + // TODO. There's an NEON ARM instruction for this, VEXT - worth using? + break; + + case 0x4: //ins + DISABLE; + break; + } } void Jit::Comp_Allegrex(u32 op) @@ -320,24 +346,32 @@ namespace MIPSComp CONDITIONAL_DISABLE; int rt = _RT; int rd = _RD; + // Don't change $zr. + if (rd == 0) + return; + switch ((op >> 6) & 31) { - /* case 16: // seb // R(rd) = (u32)(s32)(s8)(u8)R(rt); - gpr.Lock(rd, rt); - gpr.BindToRegister(rd, true, true); - MOV(32, R(EAX), gpr.R(rt)); // work around the byte-register addressing problem - MOVSX(32, 8, gpr.RX(rd), R(EAX)); - gpr.UnlockAll(); + if (gpr.IsImm(rt)) + { + gpr.SetImm(rd, (s32)(s8)(u8)gpr.GetImm(rt)); + return; + } + gpr.MapDirtyIn(rd, rt); + SXTB(gpr.R(rd), gpr.R(rt)); break; case 24: // seh - gpr.Lock(rd, rt); - gpr.BindToRegister(rd, true, true); - MOVSX(32, 16, gpr.RX(rd), gpr.R(rt)); - gpr.UnlockAll(); + if (gpr.IsImm(rt)) + { + gpr.SetImm(rd, (s32)(s16)(u16)gpr.GetImm(rt)); + return; + } + gpr.MapDirtyIn(rd, rt); + SXTH(gpr.R(rd), gpr.R(rt)); break; - */ + case 20: //bitrev if (gpr.IsImm(rt)) { @@ -353,7 +387,7 @@ namespace MIPSComp v = ((v >> 8) & 0x00FF00FF) | ((v & 0x00FF00FF) << 8); // swap 2-byte long pairs v = ( v >> 16 ) | ( v << 16); - gpr.SetImm(rd,v); + gpr.SetImm(rd, v); break; } // Intentional fall-through. From bfe8752a183bcd363ea7a968fe67590ab79b349f Mon Sep 17 00:00:00 2001 From: sum2012 Date: Sun, 3 Mar 2013 23:04:36 +0800 Subject: [PATCH 283/347] Add Ini for use Media Engine Better to solve blackscreen and flash issue. --- Core/Config.cpp | 2 ++ Core/Config.h | 1 + Core/HLE/sceMpeg.cpp | 5 +++++ 3 files changed, 8 insertions(+) diff --git a/Core/Config.cpp b/Core/Config.cpp index e01790a52f9d..415b559d99a3 100644 --- a/Core/Config.cpp +++ b/Core/Config.cpp @@ -70,6 +70,7 @@ void CConfig::Load(const char *iniFileName) graphics->Get("SSAA", &SSAntiAliasing, 0); graphics->Get("VBO", &bUseVBO, false); graphics->Get("FrameSkip", &iFrameSkip, 0); + graphics->Get("UseMediaEngine", &bUseMediaEngine, false); #ifdef USING_GLES2 graphics->Get("AnisotropyLevel", &iAnisotropyLevel, 0); #else @@ -134,6 +135,7 @@ void CConfig::Save() graphics->Set("SSAA", SSAntiAliasing); graphics->Set("VBO", bUseVBO); graphics->Set("FrameSkip", iFrameSkip); + graphics->Set("UseMediaEngine", bUseMediaEngine); graphics->Set("AnisotropyLevel", iAnisotropyLevel); graphics->Set("VertexCache", bVertexCache); graphics->Set("FullScreen", bFullScreen); diff --git a/Core/Config.h b/Core/Config.h index 8468158d4643..64410e4ca35d 100644 --- a/Core/Config.h +++ b/Core/Config.h @@ -59,6 +59,7 @@ struct CConfig bool bUseVBO; bool bStretchToDisplay; int iFrameSkip; // 0 = off; 1 = auto; (future: 2 = skip every 2nd frame; 3 = skip every 3rd frame etc). + bool bUseMediaEngine; int iWindowZoom; // for Windows bool SSAntiAliasing; //for Windows, too diff --git a/Core/HLE/sceMpeg.cpp b/Core/HLE/sceMpeg.cpp index c1afe5c0feb6..18911d68a643 100644 --- a/Core/HLE/sceMpeg.cpp +++ b/Core/HLE/sceMpeg.cpp @@ -23,6 +23,7 @@ #include "sceKernelThread.h" #include "HLE.h" #include "../HW/MediaEngine.h" +#include "../../Core/Config.h" static bool useMediaEngine; @@ -519,6 +520,10 @@ int sceMpegAvcDecodeMode(u32 mpeg, u32 modeAddr) int sceMpegQueryStreamOffset(u32 mpeg, u32 bufferAddr, u32 offsetAddr) { + if (g_Config.bUseMediaEngine == false){ + WARN_LOG(HLE, "Media Engine disabled"); + return -1; + } MpegContext *ctx = getMpegCtx(mpeg); if (!ctx) { WARN_LOG(HLE, "sceMpegQueryStreamOffset(%08x, %08x, %08x): bad mpeg handle", mpeg, bufferAddr, offsetAddr); From 650c02c3a569df9d95eb1bc55954f8bcaf19d483 Mon Sep 17 00:00:00 2001 From: Henrik Rydgard Date: Sun, 3 Mar 2013 16:40:58 +0100 Subject: [PATCH 284/347] Some more armjit work (ext, ins) and VFPU prefix clamps (not enabled) --- Common/ArmEmitter.cpp | 21 +++++++++++++ Common/ArmEmitter.h | 4 +++ Common/Common.h | 6 ++++ Core/MIPS/ARM/ArmCompALU.cpp | 25 +++++++++++++--- Core/MIPS/ARM/ArmCompVFPU.cpp | 56 ++++++++++++++++++++++------------- Core/MIPS/ARM/ArmJit.h | 3 +- Core/MIPS/MIPSIntVFPU.cpp | 4 +-- 7 files changed, 91 insertions(+), 28 deletions(-) diff --git a/Common/ArmEmitter.cpp b/Common/ArmEmitter.cpp index 9e4ba7abefcf..5aef06fce808 100644 --- a/Common/ArmEmitter.cpp +++ b/Common/ArmEmitter.cpp @@ -83,6 +83,14 @@ bool TryMakeOperand2_AllowNegation(s32 imm, Operand2 &op2, bool *negated) } } +void ARMXEmitter::MOVI2F(ARMReg dest, float val, ARMReg tempReg) +{ + union {float f; u32 u;} conv; + conv.f = val; + MOVI2R(tempReg, conv.u); + VMOV(dest, R0); +} + void ARMXEmitter::MOVI2R(ARMReg reg, u32 val, bool optimize) { Operand2 op2; @@ -501,10 +509,23 @@ void ARMXEmitter::SMLAL(ARMReg destLo, ARMReg destHi, ARMReg rm, ARMReg rn) Write4OpMultiply(0xE, destLo, destHi, rn, rm); } +void ARMXEmitter::UBFX(ARMReg dest, ARMReg rn, u8 lsb, u8 width) +{ + Write32(condition | (0x7E0 << 16) | ((width - 1) << 16) | (dest << 12) | (lsb << 7) | (5 << 4) | rn); +} + +void ARMXEmitter::BFI(ARMReg rd, ARMReg rn, u8 lsb, u8 width) +{ + u32 msb = (lsb + width - 1); + if (msb > 31) msb = 31; + Write32(condition | (0x7C0 << 16) | (msb << 16) | (rd << 12) | (lsb << 7) | (1 << 4) | rn); +} + void ARMXEmitter::SXTB (ARMReg dest, ARMReg op2) { Write32(condition | (0x6AF << 16) | (dest << 12) | (7 << 4) | op2); } + void ARMXEmitter::SXTH (ARMReg dest, ARMReg op2, u8 rotation) { SXTAH(dest, (ARMReg)15, op2, rotation); diff --git a/Common/ArmEmitter.h b/Common/ArmEmitter.h index 1b32de141f8a..bfc4c23d9755 100644 --- a/Common/ArmEmitter.h +++ b/Common/ArmEmitter.h @@ -469,6 +469,9 @@ class ARMXEmitter void SXTB(ARMReg dest, ARMReg op2); void SXTH(ARMReg dest, ARMReg op2, u8 rotation = 0); void SXTAH(ARMReg dest, ARMReg src, ARMReg op2, u8 rotation = 0); + void BFI(ARMReg rd, ARMReg rn, u8 lsb, u8 width); + void UBFX(ARMReg dest, ARMReg op2, u8 lsb, u8 width); + // Using just MSR here messes with our defines on the PPC side of stuff (when this code was in dolphin...) // Just need to put an underscore here, bit annoying. void _MSR (bool nzcvq, bool g, Operand2 op2); @@ -542,6 +545,7 @@ class ARMXEmitter // Wrapper around MOVT/MOVW with fallbacks. void MOVI2R(ARMReg reg, u32 val, bool optimize = true); + void MOVI2F(ARMReg dest, float val, ARMReg tempReg); }; // class ARMXEmitter diff --git a/Common/Common.h b/Common/Common.h index d87443e3f918..16b0fd342f2e 100644 --- a/Common/Common.h +++ b/Common/Common.h @@ -25,6 +25,10 @@ #include #include +#ifdef _MSC_VER +#pragma warning (disable:4100) +#endif + #if defined(ARM) #define _M_ARM32 #endif @@ -77,7 +81,9 @@ class NonCopyable #error needs at least version 1000 of MSC #endif +#ifndef NOMINMAX #define NOMINMAX +#endif // Memory leak checks #define CHECK_HEAP_INTEGRITY() diff --git a/Core/MIPS/ARM/ArmCompALU.cpp b/Core/MIPS/ARM/ArmCompALU.cpp index 9becffea3207..129b17e00d08 100644 --- a/Core/MIPS/ARM/ArmCompALU.cpp +++ b/Core/MIPS/ARM/ArmCompALU.cpp @@ -16,6 +16,7 @@ // https://github.com/hrydgard/ppsspp and http://www.ppsspp.org/. #include "ArmJit.h" +#include "Common/CPUDetect.h" using namespace MIPSAnalyst; #define _RS ((op>>21) & 0x1F) @@ -312,10 +313,15 @@ namespace MIPSComp void Jit::Comp_Special3(u32 op) { CONDITIONAL_DISABLE; + + if (!cpu_info.bArmV7) { + DISABLE; + } + int rs = _RS; int rt = _RT; - int pos = _POS; + int pos = _POS; int size = _SIZE + 1; u32 mask = 0xFFFFFFFFUL >> (32 - size); @@ -331,12 +337,23 @@ namespace MIPSComp gpr.SetImm(rt, (gpr.GetImm(rs) >> pos) & mask); return; } - DISABLE; - // TODO. There's an NEON ARM instruction for this, VEXT - worth using? + // TODO: Make fallback for when UBFX isn't available + gpr.MapDirtyIn(rt, rs, false); + UBFX(gpr.R(rt), gpr.R(rs), pos, size); break; case 0x4: //ins - DISABLE; + if (gpr.IsImm(rs) && gpr.IsImm(rt)) + { + u32 sourcemask = mask >> pos; + u32 destmask = ~(sourcemask << pos); + u32 inserted = (gpr.GetImm(rs) & sourcemask) << pos; + gpr.SetImm(rt, (gpr.GetImm(rt) & destmask) | inserted); + return; + } + gpr.MapDirtyIn(rt, rs, false); + // TODO: Make fallback for when BFI isn't available + BFI(gpr.R(rt), gpr.R(rs), pos, size); break; } } diff --git a/Core/MIPS/ARM/ArmCompVFPU.cpp b/Core/MIPS/ARM/ArmCompVFPU.cpp index 5e8ccca87365..34ff98aec0b9 100644 --- a/Core/MIPS/ARM/ArmCompVFPU.cpp +++ b/Core/MIPS/ARM/ArmCompVFPU.cpp @@ -126,8 +126,8 @@ namespace MIPSComp VMOV(fpr.V(vregs[i]), fpr.V(origV[regnum])); } } else { - MOVI2R(R0, (u32)(constantArray[regnum + (abs<<2)])); - VMOV(fpr.V(vregs[i]), R0); + // TODO: There is VMOV s, imm on ARM, that can generate some of these constants. Not 1/3 or 1/6 though. + MOVI2F(fpr.V(vregs[i]), constantArray[regnum + (abs<<2)], R0); } // TODO: This can be integrated into the VABS / VMOV above, and also the constants. @@ -147,8 +147,7 @@ namespace MIPSComp return; int n = GetNumVectorElements(sz); - for (int i = 0; i < n; i++) - { + for (int i = 0; i < n; i++) { // Hopefully this is rare, we'll just write it into a reg we drop. if (js.VfpuWriteMask(i)) regs[i] = fpr.GetTempV(); @@ -160,26 +159,45 @@ namespace MIPSComp if (!js.prefixD) return; int n = GetNumVectorElements(sz); - for (int i = 0; i < n; i++) - { + for (int i = 0; i < n; i++) { if (js.VfpuWriteMask(i)) continue; int sat = (js.prefixD >> (i * 2)) & 3; - if (sat == 1) - { + if (sat == 1) { fpr.MapRegV(vregs[i], MAP_DIRTY); // ARGH this is a pain - no MIN/MAX in non-NEON VFP! - // TODO - - //MAXSS(fpr.VX(vregs[i]), M((void *)&zero)); - //MINSS(fpr.VX(vregs[i]), M((void *)&one)); - } - else if (sat == 3) - { + // NEON does have min/max though so this should only be a fallback. + MOVI2F(S0, 0.0, R0); + MOVI2F(S1, 1.0, R0); + VCMP(fpr.V(vregs[i]), S1); + VMRS_APSR(); + SetCC(CC_GE); + VMOV(fpr.V(vregs[i]), S1); + FixupBranch skip = B(); + SetCC(CC_AL); + VCMP(fpr.V(vregs[i]), S0); + VMRS_APSR(); + SetCC(CC_LE); + VMOV(fpr.V(vregs[i]), S0); + SetCC(CC_AL); + SetJumpTarget(skip); + } else if (sat == 3) { fpr.MapRegV(vregs[i], MAP_DIRTY); - //MAXSS(fpr.VX(vregs[i]), M((void *)&minus_one)); - //MINSS(fpr.VX(vregs[i]), M((void *)&one)); + MOVI2F(S0, -1.0, R0); + MOVI2F(S1, 1.0, R0); + VCMP(fpr.V(vregs[i]), S1); + VMRS_APSR(); + SetCC(CC_GE); + VMOV(fpr.V(vregs[i]), S1); + FixupBranch skip = B(); + SetCC(CC_AL); + VCMP(fpr.V(vregs[i]), S0); + VMRS_APSR(); + SetCC(CC_LE); + VMOV(fpr.V(vregs[i]), S0); + SetCC(CC_AL); + SetJumpTarget(skip); } } } @@ -299,8 +317,7 @@ namespace MIPSComp VMUL(S0, fpr.V(sregs[0]), fpr.V(tregs[0])); int n = GetNumVectorElements(sz); - for (int i = 1; i < n; i++) - { + for (int i = 1; i < n; i++) { // sum += s[i]*t[i]; VMUL(S1, fpr.V(sregs[i]), fpr.V(tregs[i])); VADD(S0, S0, S1); @@ -506,7 +523,6 @@ namespace MIPSComp void Jit::Comp_Mftv(u32 op) { - // DISABLE; CONDITIONAL_DISABLE; int imm = op & 0xFF; diff --git a/Core/MIPS/ARM/ArmJit.h b/Core/MIPS/ARM/ArmJit.h index 8d9f4046c1bc..20f49028cd39 100644 --- a/Core/MIPS/ARM/ArmJit.h +++ b/Core/MIPS/ARM/ArmJit.h @@ -235,8 +235,7 @@ class Jit : public ArmGen::ARMXCodeBlock } void GetVectorRegsPrefixD(u8 *regs, VectorSize sz, int vectorReg); - - /* + /* void CompImmLogic(u32 op, void (ARMXEmitter::*arith)(int, const OpArg &, const OpArg &)); void CompTriArith(u32 op, void (ARMXEmitter::*arith)(int, const OpArg &, const OpArg &)); void CompShiftImm(u32 op, void (ARMXEmitter::*shift)(int, OpArg, OpArg)); diff --git a/Core/MIPS/MIPSIntVFPU.cpp b/Core/MIPS/MIPSIntVFPU.cpp index b65cfcb4ebcc..e6242b7d7c35 100644 --- a/Core/MIPS/MIPSIntVFPU.cpp +++ b/Core/MIPS/MIPSIntVFPU.cpp @@ -1605,11 +1605,11 @@ namespace MIPSInt // negative NAN seems different? TODO switch ((op >> 23) & 3) { case 2: // vmin - for (int i = 0; i < GetNumVectorElements(sz); i++) + for (int i = 0; i < numElements; i++) d[i] = isnan(t[i]) ? s[i] : (isnan(s[i]) ? t[i] : std::min(s[i], t[i])); break; case 3: // vmax - for (int i = 0; i < GetNumVectorElements(sz); i++) + for (int i = 0; i < numElements; i++) d[i] = isnan(t[i]) ? t[i] : (isnan(s[i]) ? s[i] : std::max(s[i], t[i])); break; default: From 1e3a00ee9de389887a08471f41cfd2aa72c38afb Mon Sep 17 00:00:00 2001 From: Henrik Rydgard Date: Sun, 3 Mar 2013 20:56:22 +0100 Subject: [PATCH 285/347] armjit: implement vzero, vone. Use vmla for dot product. --- Common/ArmEmitter.cpp | 26 +++++++++++++++++++++++- Common/ArmEmitter.h | 1 + Core/MIPS/ARM/ArmCompVFPU.cpp | 38 ++++++++++++++++++++++++++++++++--- Core/MIPS/x86/CompVFPU.cpp | 19 ++++++++++++++---- 4 files changed, 76 insertions(+), 8 deletions(-) diff --git a/Common/ArmEmitter.cpp b/Common/ArmEmitter.cpp index 5aef06fce808..8ff585a99bbf 100644 --- a/Common/ArmEmitter.cpp +++ b/Common/ArmEmitter.cpp @@ -88,7 +88,7 @@ void ARMXEmitter::MOVI2F(ARMReg dest, float val, ARMReg tempReg) union {float f; u32 u;} conv; conv.f = val; MOVI2R(tempReg, conv.u); - VMOV(dest, R0); + VMOV(dest, tempReg); } void ARMXEmitter::MOVI2R(ARMReg reg, u32 val, bool optimize) @@ -972,6 +972,30 @@ void ARMXEmitter::VMUL(ARMReg Vd, ARMReg Vn, ARMReg Vm) } } +void ARMXEmitter::VMLA(ARMReg Vd, ARMReg Vn, ARMReg Vm) +{ + _assert_msg_(DYNA_REC, Vd >= S0, "Passed invalid dest register to VADD"); + _assert_msg_(DYNA_REC, Vn >= S0, "Passed invalid Vn to VADD"); + _assert_msg_(DYNA_REC, Vm >= S0, "Passed invalid Vm to VADD"); + bool single_reg = Vd < D0; + bool double_reg = Vd < Q0; + + Vd = SubBase(Vd); + Vn = SubBase(Vn); + Vm = SubBase(Vm); + + if (single_reg) + { + Write32(NO_COND | (0x1C << 23) | ((Vd & 0x1) << 22) | (0x0 << 20) \ + | ((Vn & 0x1E) << 15) | ((Vd & 0x1E) << 11) | (0x5 << 9) \ + | ((Vn & 0x1) << 7) | ((Vm & 0x1) << 5) | (Vm >> 1)); + } + else + { + _assert_msg_(DYNA_REC, false, "VMLA: Please implement!"); + } +} + void ARMXEmitter::VABS(ARMReg Vd, ARMReg Vm) { bool single_reg = Vd < D0; diff --git a/Common/ArmEmitter.h b/Common/ArmEmitter.h index bfc4c23d9755..8d55b568e987 100644 --- a/Common/ArmEmitter.h +++ b/Common/ArmEmitter.h @@ -535,6 +535,7 @@ class ARMXEmitter void VABS(ARMReg Vd, ARMReg Vm); void VNEG(ARMReg Vd, ARMReg Vm); void VMUL(ARMReg Vd, ARMReg Vn, ARMReg Vm); + void VMLA(ARMReg Vd, ARMReg Vn, ARMReg Vm); void VMOV(ARMReg Dest, ARMReg Src, bool high); void VMOV(ARMReg Dest, ARMReg Src); void VCVT(ARMReg Sd, ARMReg Sm, int flags); diff --git a/Core/MIPS/ARM/ArmCompVFPU.cpp b/Core/MIPS/ARM/ArmCompVFPU.cpp index 34ff98aec0b9..303aee6874fe 100644 --- a/Core/MIPS/ARM/ArmCompVFPU.cpp +++ b/Core/MIPS/ARM/ArmCompVFPU.cpp @@ -287,7 +287,40 @@ namespace MIPSComp void Jit::Comp_VVectorInit(u32 op) { - DISABLE; + CONDITIONAL_DISABLE; + + // WARNING: No prefix support! + if (js.MayHavePrefix()) { + Comp_Generic(op); + js.EatPrefix(); + return; + } + + switch ((op >> 16) & 0xF) + { + case 6: // v=zeros; break; //vzero + MOVI2F(S0, 0.0f, R0); + break; + case 7: // v=ones; break; //vone + MOVI2F(S0, 1.0f, R0); + break; + default: + DISABLE; + break; + } + + VectorSize sz = GetVecSize(op); + int n = GetNumVectorElements(sz); + + u8 dregs[4]; + GetVectorRegsPrefixD(dregs, sz, _VD); + fpr.MapRegsV(dregs, sz, MAP_NOINIT | MAP_DIRTY); + + for (int i = 0; i < n; ++i) + VMOV(fpr.V(dregs[i]), S0); + + ApplyPrefixD(dregs, sz); + fpr.ReleaseSpillLocks(); } void Jit::Comp_VDot(u32 op) @@ -319,8 +352,7 @@ namespace MIPSComp int n = GetNumVectorElements(sz); for (int i = 1; i < n; i++) { // sum += s[i]*t[i]; - VMUL(S1, fpr.V(sregs[i]), fpr.V(tregs[i])); - VADD(S0, S0, S1); + VMLA(S0, fpr.V(sregs[i]), fpr.V(tregs[i])); } fpr.ReleaseSpillLocks(); diff --git a/Core/MIPS/x86/CompVFPU.cpp b/Core/MIPS/x86/CompVFPU.cpp index 095471bebda0..699b2b9730c8 100644 --- a/Core/MIPS/x86/CompVFPU.cpp +++ b/Core/MIPS/x86/CompVFPU.cpp @@ -342,22 +342,33 @@ void Jit::Comp_VVectorInit(u32 op) { if (js.HasUnknownPrefix()) DISABLE; + switch ((op >> 16) & 0xF) + { + case 6: // v=zeros; break; //vzero + MOVSS(XMM0, M((void *) &zero)); + break; + case 7: // v=ones; break; //vone + MOVSS(XMM0, M((void *) &one)); + break; + default: + DISABLE; + break; + } + VectorSize sz = GetVecSize(op); int n = GetNumVectorElements(sz); - u8 dregs[4]; GetVectorRegsPrefixD(dregs, sz, _VD); fpr.MapRegsV(dregs, sz, MAP_NOINIT | MAP_DIRTY); - for (int i = 0; i < n; ++i) { switch ((op >> 16) & 0xF) { case 6: // v=zeros; break; //vzero - MOVSS(fpr.VX(dregs[i]), M((void *) &zero)); + MOVSS(fpr.VX(dregs[i]), R(XMM0)); break; case 7: // v=ones; break; //vone - MOVSS(fpr.VX(dregs[i]), M((void *) &one)); + MOVSS(fpr.VX(dregs[i]), R(XMM0)); break; default: DISABLE; From 1cddc86e056e377434f64bde71651b7b9f699ad9 Mon Sep 17 00:00:00 2001 From: Henrik Rydgard Date: Sun, 3 Mar 2013 22:26:20 +0100 Subject: [PATCH 286/347] armjit: Temporarily disable ext/ins as they appear to have broken Persona 3 somehow. --- Common/ArmEmitter.cpp | 6 +++--- Core/MIPS/ARM/ArmCompALU.cpp | 3 ++- 2 files changed, 5 insertions(+), 4 deletions(-) diff --git a/Common/ArmEmitter.cpp b/Common/ArmEmitter.cpp index 8ff585a99bbf..1824472526bd 100644 --- a/Common/ArmEmitter.cpp +++ b/Common/ArmEmitter.cpp @@ -974,9 +974,9 @@ void ARMXEmitter::VMUL(ARMReg Vd, ARMReg Vn, ARMReg Vm) void ARMXEmitter::VMLA(ARMReg Vd, ARMReg Vn, ARMReg Vm) { - _assert_msg_(DYNA_REC, Vd >= S0, "Passed invalid dest register to VADD"); - _assert_msg_(DYNA_REC, Vn >= S0, "Passed invalid Vn to VADD"); - _assert_msg_(DYNA_REC, Vm >= S0, "Passed invalid Vm to VADD"); + _assert_msg_(DYNA_REC, Vd >= S0, "Passed invalid dest register to VMLA"); + _assert_msg_(DYNA_REC, Vn >= S0, "Passed invalid Vn to VMLA"); + _assert_msg_(DYNA_REC, Vm >= S0, "Passed invalid Vm to VMLA"); bool single_reg = Vd < D0; bool double_reg = Vd < Q0; diff --git a/Core/MIPS/ARM/ArmCompALU.cpp b/Core/MIPS/ARM/ArmCompALU.cpp index 129b17e00d08..6579aaa73ada 100644 --- a/Core/MIPS/ARM/ArmCompALU.cpp +++ b/Core/MIPS/ARM/ArmCompALU.cpp @@ -314,8 +314,9 @@ namespace MIPSComp { CONDITIONAL_DISABLE; + DISABLE; + if (!cpu_info.bArmV7) { - DISABLE; } int rs = _RS; From 7dc75d87b5bb3de58495018ae2796694da2884c3 Mon Sep 17 00:00:00 2001 From: Henrik Rydgard Date: Sun, 3 Mar 2013 23:17:21 +0100 Subject: [PATCH 287/347] armjit: Re-enable ext/ins, safer implementation. arm7 path disabled for now. --- Common/ArmEmitter.cpp | 27 ++++++++++++++++++++++ Common/ArmEmitter.h | 5 ++++ Core/MIPS/ARM/ArmCompALU.cpp | 45 ++++++++++++++++++++++++++++-------- 3 files changed, 67 insertions(+), 10 deletions(-) diff --git a/Common/ArmEmitter.cpp b/Common/ArmEmitter.cpp index 1824472526bd..3316f51f7b1e 100644 --- a/Common/ArmEmitter.cpp +++ b/Common/ArmEmitter.cpp @@ -91,6 +91,33 @@ void ARMXEmitter::MOVI2F(ARMReg dest, float val, ARMReg tempReg) VMOV(dest, tempReg); } +void ARMXEmitter::ANDI2R(ARMReg rd, ARMReg rs, u32 val, ARMReg scratch) +{ + Operand2 op2; + bool inverse; + if (TryMakeOperand2_AllowInverse(val, op2, &inverse)) { + if (!inverse) { + AND(rd, rs, op2); + } else { + BIC(rd, rs, op2); + } + } else { + MOVI2R(scratch, val); + AND(rd, rs, scratch); + } +} + +void ARMXEmitter::ORI2R(ARMReg rd, ARMReg rs, u32 val, ARMReg scratch) +{ + Operand2 op2; + if (TryMakeOperand2(val, op2)) { + ORR(rd, rs, op2); + } else { + MOVI2R(scratch, val); + AND(rd, rs, scratch); + } +} + void ARMXEmitter::MOVI2R(ARMReg reg, u32 val, bool optimize) { Operand2 op2; diff --git a/Common/ArmEmitter.h b/Common/ArmEmitter.h index 8d55b568e987..7629fc16e2ae 100644 --- a/Common/ArmEmitter.h +++ b/Common/ArmEmitter.h @@ -547,6 +547,11 @@ class ARMXEmitter // Wrapper around MOVT/MOVW with fallbacks. void MOVI2R(ARMReg reg, u32 val, bool optimize = true); void MOVI2F(ARMReg dest, float val, ARMReg tempReg); + + void ANDI2R(ARMReg rd, ARMReg rs, u32 val, ARMReg scratch); + void ORI2R(ARMReg rd, ARMReg rs, u32 val, ARMReg scratch); + + }; // class ARMXEmitter diff --git a/Core/MIPS/ARM/ArmCompALU.cpp b/Core/MIPS/ARM/ArmCompALU.cpp index 6579aaa73ada..cf92036606af 100644 --- a/Core/MIPS/ARM/ArmCompALU.cpp +++ b/Core/MIPS/ARM/ArmCompALU.cpp @@ -314,9 +314,10 @@ namespace MIPSComp { CONDITIONAL_DISABLE; - DISABLE; + bool useUBFXandBFI = false; if (!cpu_info.bArmV7) { + // useUBFXandBFI = true; } int rs = _RS; @@ -338,23 +339,47 @@ namespace MIPSComp gpr.SetImm(rt, (gpr.GetImm(rs) >> pos) & mask); return; } - // TODO: Make fallback for when UBFX isn't available + gpr.MapDirtyIn(rt, rs, false); - UBFX(gpr.R(rt), gpr.R(rs), pos, size); + if (useUBFXandBFI) { + UBFX(gpr.R(rt), gpr.R(rs), pos, size); + } else { + MOV(gpr.R(rt), Operand2(pos, ST_LSR, gpr.R(rs))); + ANDI2R(gpr.R(rt), gpr.R(rt), mask, R0); + } break; case 0x4: //ins - if (gpr.IsImm(rs) && gpr.IsImm(rt)) { u32 sourcemask = mask >> pos; u32 destmask = ~(sourcemask << pos); - u32 inserted = (gpr.GetImm(rs) & sourcemask) << pos; - gpr.SetImm(rt, (gpr.GetImm(rt) & destmask) | inserted); - return; + if (gpr.IsImm(rs)) + { + u32 inserted = (gpr.GetImm(rs) & sourcemask) << pos; + if (gpr.IsImm(rt)) + { + gpr.SetImm(rt, (gpr.GetImm(rt) & destmask) | inserted); + return; + } + + gpr.MapReg(rt); + ANDI2R(gpr.R(rt), gpr.R(rt), destmask, R0); + ORI2R(gpr.R(rt), gpr.R(rt), inserted, R0); + } + else + { + if (useUBFXandBFI) { + gpr.MapDirtyIn(rt, rs, false); + BFI(gpr.R(rt), gpr.R(rs), pos, size); + } else { + gpr.MapDirtyIn(rt, rs, false); + ANDI2R(R0, gpr.R(rs), sourcemask, R1); + MOV(R0, Operand2(pos, ST_LSL, gpr.R(rs))); + ANDI2R(gpr.R(rt), gpr.R(rt), destmask, R1); + ORR(gpr.R(rt), gpr.R(rt), R0); + } + } } - gpr.MapDirtyIn(rt, rs, false); - // TODO: Make fallback for when BFI isn't available - BFI(gpr.R(rt), gpr.R(rs), pos, size); break; } } From fcfea6343ac5e2b4b52d00c116a87d5d416bfb0e Mon Sep 17 00:00:00 2001 From: Henrik Rydgard Date: Sun, 3 Mar 2013 23:57:29 +0100 Subject: [PATCH 288/347] Add some lowp annotations to the vertex shader --- GPU/GLES/VertexShaderGenerator.cpp | 41 +++++++++++++++++------------- 1 file changed, 24 insertions(+), 17 deletions(-) diff --git a/GPU/GLES/VertexShaderGenerator.cpp b/GPU/GLES/VertexShaderGenerator.cpp index bddcd1ab19d5..ed2f74d26630 100644 --- a/GPU/GLES/VertexShaderGenerator.cpp +++ b/GPU/GLES/VertexShaderGenerator.cpp @@ -133,6 +133,13 @@ void GenerateVertexShader(int prim, char *buffer) { WRITE(p, "precision highp float;\n"); #elif !defined(FORCE_OPENGL_2_0) WRITE(p, "#version 110\n"); + // Remove lowp/mediump in non-mobile implementations + WRITE(p, "#define lowp\n"); + WRITE(p, "#define mediump\n"); +#else + // Need to remove lowp/mediump for Mac + WRITE(p, "#define lowp\n"); + WRITE(p, "#define mediump\n"); #endif int lmode = (gstate.lmode & 1) && (gstate.lightingEnable & 1); @@ -169,13 +176,13 @@ void GenerateVertexShader(int prim, char *buffer) { if (doTexture) WRITE(p, "attribute vec2 a_texcoord;\n"); if (hasColor) { - WRITE(p, "attribute vec4 a_color0;\n"); + WRITE(p, "attribute lowp vec4 a_color0;\n"); if (lmode && !hwXForm) // only software transform supplies color1 as vertex data - WRITE(p, "attribute vec3 a_color1;\n"); + WRITE(p, "attribute lowp vec3 a_color1;\n"); } if (hwXForm && hasNormal) - WRITE(p, "attribute vec3 a_normal;\n"); + WRITE(p, "attribute mediump vec3 a_normal;\n"); if (gstate.isModeThrough()) { WRITE(p, "uniform mat4 u_proj_through;\n"); @@ -185,7 +192,7 @@ void GenerateVertexShader(int prim, char *buffer) { } if (hwXForm || !hasColor) - WRITE(p, "uniform vec4 u_matambientalpha;\n"); // matambient + matalpha + WRITE(p, "uniform lowp vec4 u_matambientalpha;\n"); // matambient + matalpha if (enableFog) { WRITE(p, "uniform vec2 u_fogcoef;\n"); @@ -206,12 +213,12 @@ void GenerateVertexShader(int prim, char *buffer) { } } if (gstate.lightingEnable & 1) { - WRITE(p, "uniform vec4 u_ambient;\n"); + WRITE(p, "uniform lowp vec4 u_ambient;\n"); if ((gstate.materialupdate & 2) == 0) - WRITE(p, "uniform vec3 u_matdiffuse;\n"); + WRITE(p, "uniform lowp vec3 u_matdiffuse;\n"); // if ((gstate.materialupdate & 4) == 0) - WRITE(p, "uniform vec4 u_matspecular;\n"); // Specular coef is contained in alpha - WRITE(p, "uniform vec3 u_matemissive;\n"); + WRITE(p, "uniform lowp vec4 u_matspecular;\n"); // Specular coef is contained in alpha + WRITE(p, "uniform lowp vec3 u_matemissive;\n"); } for (int i = 0; i < 4; i++) { if (doLight[i] != LIGHT_OFF) { @@ -222,15 +229,15 @@ void GenerateVertexShader(int prim, char *buffer) { } if (doLight[i] == LIGHT_FULL) { // These are needed for the full thing - WRITE(p, "uniform vec3 u_lightambient%i;\n", i); - WRITE(p, "uniform vec3 u_lightdiffuse%i;\n", i); - WRITE(p, "uniform vec3 u_lightspecular%i;\n", i); + WRITE(p, "uniform lowp vec3 u_lightambient%i;\n", i); + WRITE(p, "uniform lowp vec3 u_lightdiffuse%i;\n", i); + WRITE(p, "uniform lowp vec3 u_lightspecular%i;\n", i); } } } - WRITE(p, "varying vec4 v_color0;\n"); - if (lmode) WRITE(p, "varying vec3 v_color1;\n"); + WRITE(p, "varying lowp vec4 v_color0;\n"); + if (lmode) WRITE(p, "varying lowp vec3 v_color1;\n"); if (doTexture) WRITE(p, "varying vec2 v_texcoord;\n"); if (enableFog) WRITE(p, "varying float v_fogdepth;\n"); @@ -290,9 +297,9 @@ void GenerateVertexShader(int prim, char *buffer) { // Step 2: Color/Lighting if (hasColor) { - WRITE(p, " vec3 unlitColor = a_color0.rgb;\n"); + WRITE(p, " lowp vec3 unlitColor = a_color0.rgb;\n"); } else { - WRITE(p, " vec3 unlitColor = vec3(1.0, 1.0, 1.0);\n"); + WRITE(p, " lowp vec3 unlitColor = vec3(1.0, 1.0, 1.0);\n"); } // TODO: Declare variables for dots for shade mapping if needed. @@ -301,8 +308,8 @@ void GenerateVertexShader(int prim, char *buffer) { const char *specular = (gstate.materialupdate & 4) ? "unlitColor" : "u_matspecular.rgb"; if (gstate.lightingEnable & 1) { - WRITE(p, " vec4 lightSum0 = u_ambient * %s + vec4(u_matemissive, 0.0);\n", ambient); - WRITE(p, " vec3 lightSum1 = vec3(0.0);\n"); + WRITE(p, " lowp vec4 lightSum0 = u_ambient * %s + vec4(u_matemissive, 0.0);\n", ambient); + WRITE(p, " lowp vec3 lightSum1 = vec3(0.0);\n"); } // Calculate lights if needed. If shade mapping is enabled, lights may need to be From 165cfe53a389a6941b59efb4b8b72c85297e79d6 Mon Sep 17 00:00:00 2001 From: Henrik Rydgard Date: Mon, 4 Mar 2013 00:06:33 +0100 Subject: [PATCH 289/347] Quick ins bugfix --- Core/MIPS/ARM/ArmCompALU.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Core/MIPS/ARM/ArmCompALU.cpp b/Core/MIPS/ARM/ArmCompALU.cpp index cf92036606af..1a2dba5e62c4 100644 --- a/Core/MIPS/ARM/ArmCompALU.cpp +++ b/Core/MIPS/ARM/ArmCompALU.cpp @@ -362,7 +362,7 @@ namespace MIPSComp return; } - gpr.MapReg(rt); + gpr.MapReg(rt, MAP_DIRTY); ANDI2R(gpr.R(rt), gpr.R(rt), destmask, R0); ORI2R(gpr.R(rt), gpr.R(rt), inserted, R0); } From affcdfabd5fa406c75e03e9c97e70611105cb5e7 Mon Sep 17 00:00:00 2001 From: "Unknown W. Brackets" Date: Sun, 3 Mar 2013 15:42:16 -0800 Subject: [PATCH 290/347] Reference fontlibs indirectly for savestates. Well, not pretty, but much easier to savestate. --- Core/HLE/sceFont.cpp | 56 ++++++++++++++++++++++++++++++-------------- 1 file changed, 39 insertions(+), 17 deletions(-) diff --git a/Core/HLE/sceFont.cpp b/Core/HLE/sceFont.cpp index a87e0094e9ce..7f396abd962c 100644 --- a/Core/HLE/sceFont.cpp +++ b/Core/HLE/sceFont.cpp @@ -3,6 +3,9 @@ #include "base/timeutil.h" #include +#include +#include +#include #include "HLE.h" #include "../MIPS/MIPS.h" @@ -185,43 +188,49 @@ static std::vector internalFonts; // However, these we must save - but we could take a shortcut // for LoadedFonts that point to internal fonts. static std::map fontMap; -static std::map fontLibMap; +static std::map fontLibMap; +// We keep this list to avoid ptr references, even before alloc is called. +static std::vector fontLibList; class PostAllocCallback : public Action { public: PostAllocCallback() {} static Action *Create() { return new PostAllocCallback(); } - void DoState(PointerWrap &p) { /*TODO*/ p.DoMarker("PostAllocCallback"); } + void DoState(PointerWrap &p) { p.Do(fontLibID_); p.DoMarker("PostAllocCallback"); } void run(MipsCall &call); - void SetFontLib(FontLib *fontLib) { fontLib_ = fontLib; } + void SetFontLib(u32 fontLibID) { fontLibID_ = fontLibID; } private: - FontLib *fontLib_; + u32 fontLibID_; }; class PostOpenCallback : public Action { public: PostOpenCallback() {} static Action *Create() { return new PostOpenCallback(); } - void DoState(PointerWrap &p) { /*TODO*/ p.DoMarker("PostOpenCallback"); } + void DoState(PointerWrap &p) { p.Do(fontLibID_); p.DoMarker("PostOpenCallback"); } void run(MipsCall &call); - void SetFontLib(FontLib *fontLib) { fontLib_ = fontLib; } + void SetFontLib(u32 fontLibID) { fontLibID_ = fontLibID; } private: - FontLib *fontLib_; + u32 fontLibID_; }; // A "fontLib" is a container of loaded fonts. // One can open either "internal" fonts or custom fonts into a fontlib. class FontLib { public: + FontLib() { + // For save states only. + } + FontLib(u32 paramPtr) : fontHRes_(128.0f), fontVRes_(128.0f) { Memory::ReadStruct(paramPtr, ¶ms_); fakeAlloc_ = 0x13370; // We use the same strange scheme that JPCSP uses. u32 allocSize = 4 + 4 * params_.numFonts; PostAllocCallback *action = (PostAllocCallback*) __KernelCreateAction(actionPostAllocCallback); - action->SetFontLib(this); + action->SetFontLib(GetListID()); if (false) { // This fails in dissidia. The function at 088ff320 (params_.allocFuncAddr) calls some malloc function, the second one returns 0 which causes @@ -231,11 +240,15 @@ class FontLib { } else { AllocDone(fakeAlloc_); fakeAlloc_ += allocSize; - fontLibMap[handle()] = this; + fontLibMap[handle()] = GetListID(); INFO_LOG(HLE, "Leaving PostAllocCallback::run"); } } + u32 GetListID() { + return (u32)(std::find(fontLibList.begin(), fontLibList.end(), this) - fontLibList.begin()); + } + void Close() { __KernelDirectMipsCall(params_.closeFuncAddr, 0, 0, 0, false); } @@ -312,12 +325,15 @@ class FontLib { void DoState(PointerWrap &p) { p.Do(fonts_); + p.Do(isfontopen_); p.Do(params_); p.Do(fontHRes_); p.Do(fontVRes_); p.Do(fileFontHandle_); p.Do(handle_); p.Do(altCharCode_); + p.Do(fakeAlloc_); + p.DoMarker("FontLib"); } void SetFileFontHandle(u32 handle) { @@ -345,19 +361,21 @@ class FontLib { void PostAllocCallback::run(MipsCall &call) { INFO_LOG(HLE, "Entering PostAllocCallback::run"); u32 v0 = currentMIPS->r[0]; - fontLib_->AllocDone(call.savedV0); - fontLibMap[fontLib_->handle()] = fontLib_; - call.setReturnValue(fontLib_->handle()); + FontLib *fontLib = fontLibList[fontLibID_]; + fontLib->AllocDone(call.savedV0); + fontLibMap[fontLib->handle()] = fontLibID_; + call.setReturnValue(fontLib->handle()); INFO_LOG(HLE, "Leaving PostAllocCallback::run"); } void PostOpenCallback::run(MipsCall &call) { - fontLib_->SetFileFontHandle(call.savedV0); + FontLib *fontLib = fontLibList[fontLibID_]; + fontLib->SetFileFontHandle(call.savedV0); } FontLib *GetFontLib(u32 handle) { if (fontLibMap.find(handle) != fontLibMap.end()) { - return fontLibMap[handle]; + return fontLibList[fontLibMap[handle]]; } else { ERROR_LOG(HLE, "No fontlib with handle %08x", handle); return 0; @@ -463,9 +481,10 @@ void __FontShutdown() { fontLib->CloseFont(iter->second); } fontMap.clear(); - for (auto iter = fontLibMap.begin(); iter != fontLibMap.end(); iter++) { - delete iter->second; + for (auto iter = fontLibList.begin(); iter != fontLibList.end(); iter++) { + delete *iter; } + fontLibList.clear(); fontLibMap.clear(); for (auto iter = internalFonts.begin(); iter != internalFonts.end(); ++iter) { delete *iter; @@ -474,7 +493,9 @@ void __FontShutdown() { } void __FontDoState(PointerWrap &p) { - // TODO: Needs much work. + p.Do(fontLibList); + p.Do(fontLibMap); + // TODO: p.Do(fontMap); p.Do(actionPostAllocCallback); __KernelRestoreActionType(actionPostAllocCallback, PostAllocCallback::Create); @@ -490,6 +511,7 @@ u32 sceFontNewLib(u32 paramPtr, u32 errorCodePtr) { Memory::Write_U32(0, errorCodePtr); FontLib *newLib = new FontLib(paramPtr); + fontLibList.push_back(newLib); // The game should never see this value, the return value is replaced // by the action. Except if we disable the alloc, in this case we return // the handle correctly here. From 2d5f6475796e893e6b511617ce4f67be9393d718 Mon Sep 17 00:00:00 2001 From: "Unknown W. Brackets" Date: Sun, 3 Mar 2013 15:57:05 -0800 Subject: [PATCH 291/347] And savestate the rest of fonts. --- Core/HLE/sceFont.cpp | 75 ++++++++++++++++++++++++++++++++------------ 1 file changed, 55 insertions(+), 20 deletions(-) diff --git a/Core/HLE/sceFont.cpp b/Core/HLE/sceFont.cpp index 7f396abd962c..9c027745b930 100644 --- a/Core/HLE/sceFont.cpp +++ b/Core/HLE/sceFont.cpp @@ -110,12 +110,28 @@ static const FontRegistryEntry fontRegistry[] = { static const float pointDPI = 72.f; +class LoadedFont; class FontLib; +class Font; +int GetInternalFontIndex(Font *font); + +// These should not need to be state saved. +static std::vector internalFonts; +// However, these we must save - but we could take a shortcut +// for LoadedFonts that point to internal fonts. +static std::map fontMap; +static std::map fontLibMap; +// We keep this list to avoid ptr references, even before alloc is called. +static std::vector fontLibList; // TODO: Merge this class with PGF? That'd make it harder to support .bwfon // fonts though, unless that's added directly to PGF. class Font { public: + // For savestates only. + Font() { + } + Font(const u8 *data, size_t dataSize) { pgf_.ReadPtr(data, dataSize); style_.fontH = pgf_.header.hSize / 64.0f; @@ -152,6 +168,12 @@ class Font { PGF *GetPGF() { return &pgf_; } + void DoState(PointerWrap &p) { + p.Do(pgf_); + p.Do(style_); + p.DoMarker("Font"); + } + private: PGF pgf_; PGFFontStyle style_; @@ -160,38 +182,51 @@ class Font { class LoadedFont { public: - LoadedFont(Font *font, FontLib *fontLib, u32 handle) - : fontLib_(fontLib), font_(font), handle_(handle) {} + // For savestates only. + LoadedFont() { + } + + LoadedFont(Font *font, u32 fontLibID, u32 handle) + : fontLibID_(fontLibID), font_(font), handle_(handle) {} Font *GetFont() { return font_; } - FontLib *GetFontLib() { return fontLib_; } + FontLib *GetFontLib() { return fontLibList[fontLibID_]; } u32 Handle() const { return handle_; } - bool IsOpen() const { return fontLib_ != 0; } + bool IsOpen() const { return fontLibID_ != (u32)-1; } void Close() { - fontLib_ = 0; + fontLibID_ = (u32)-1; // We keep the rest around until deleted, as some queries are allowed // on closed fonts (which is rather strange). } + void DoState(PointerWrap &p) { + int numInternalFonts = (int)internalFonts.size(); + p.Do(numInternalFonts); + if (numInternalFonts != (int)internalFonts.size()) { + ERROR_LOG(HLE, "Unable to load state: different internal font count."); + return; + } + + p.Do(fontLibID_); + int internalFont = GetInternalFontIndex(font_); + p.Do(internalFont); + if (internalFont == -1) { + p.Do(font_); + } else if (p.mode == p.MODE_READ) { + font_ = internalFonts[internalFont]; + } + p.Do(handle_); + p.DoMarker("LoadedFont"); + } + private: - FontLib *fontLib_; + u32 fontLibID_; Font *font_; u32 handle_; DISALLOW_COPY_AND_ASSIGN(LoadedFont); }; -class FontLib; - -// These should not need to be state saved. -static std::vector internalFonts; -// However, these we must save - but we could take a shortcut -// for LoadedFonts that point to internal fonts. -static std::map fontMap; -static std::map fontLibMap; -// We keep this list to avoid ptr references, even before alloc is called. -static std::vector fontLibList; - class PostAllocCallback : public Action { public: PostAllocCallback() {} @@ -308,7 +343,7 @@ class FontLib { ERROR_LOG(HLE, "Too many fonts opened in FontLib"); return 0; } - LoadedFont *loadedFont = new LoadedFont(font, this, fonts_[freeFontIndex]); + LoadedFont *loadedFont = new LoadedFont(font, GetListID(), fonts_[freeFontIndex]); isfontopen_[freeFontIndex] = 1; return loadedFont; } @@ -465,7 +500,7 @@ int GetInternalFontIndex(Font *font) { if (internalFonts[i] == font) return i; } - return 0; + return -1; } void __FontInit() { @@ -495,7 +530,7 @@ void __FontShutdown() { void __FontDoState(PointerWrap &p) { p.Do(fontLibList); p.Do(fontLibMap); - // TODO: p.Do(fontMap); + p.Do(fontMap); p.Do(actionPostAllocCallback); __KernelRestoreActionType(actionPostAllocCallback, PostAllocCallback::Create); From e6375fe84d678a74393b70cc720a11cfbdf89c96 Mon Sep 17 00:00:00 2001 From: "Unknown W. Brackets" Date: Sun, 3 Mar 2013 16:05:05 -0800 Subject: [PATCH 292/347] Fix initialization problems in sceIo. These were making savestates unstable. --- Core/HLE/sceIo.cpp | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/Core/HLE/sceIo.cpp b/Core/HLE/sceIo.cpp index 38afc9c2f835..9ea49f0056fb 100644 --- a/Core/HLE/sceIo.cpp +++ b/Core/HLE/sceIo.cpp @@ -133,7 +133,7 @@ struct dirent { class FileNode : public KernelObject { public: - FileNode() : callbackID(0), callbackArg(0), asyncResult(0), closePending(false), pendingAsyncResult(false), sectorBlockMode(false) {} + FileNode() : callbackID(0), callbackArg(0), asyncResult(0), pendingAsyncResult(false), sectorBlockMode(false), closePending(false), npdrm(0), pgdInfo(NULL) {} ~FileNode() { pspFileSystem.CloseFile(handle); } @@ -156,6 +156,9 @@ class FileNode : public KernelObject { p.Do(closePending); p.Do(info); p.Do(openMode); + + // TODO: Savestate PGD files? + p.DoMarker("File"); } @@ -603,8 +606,6 @@ u32 sceIoOpen(const char* filename, int flags, int mode) { access |= FILEACCESS_APPEND; if (flags & O_CREAT) access |= FILEACCESS_CREATE; - if (flags & O_NPDRM) - PSPFileInfo info = pspFileSystem.GetFileInfo(filename); u32 h = pspFileSystem.OpenFile(filename, (FileAccess) access); @@ -620,7 +621,7 @@ u32 sceIoOpen(const char* filename, int flags, int mode) { f->handle = h; f->fullpath = filename; f->asyncResult = id; - f->info = pspFileSystem.GetFileInfo(filename); + f->info = info; f->openMode = access; f->npdrm = (flags & O_NPDRM)? true: false; From 255cbec57c78b8684445f3d32d961c4eb54ea152 Mon Sep 17 00:00:00 2001 From: "Unknown W. Brackets" Date: Fri, 1 Mar 2013 08:14:38 -0800 Subject: [PATCH 293/347] Fix alignment in block allocator. --- Core/Util/BlockAllocator.cpp | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/Core/Util/BlockAllocator.cpp b/Core/Util/BlockAllocator.cpp index abd5bf9cf16a..dbd6edc19e36 100644 --- a/Core/Util/BlockAllocator.cpp +++ b/Core/Util/BlockAllocator.cpp @@ -67,6 +67,8 @@ u32 BlockAllocator::AllocAligned(u32 &size, u32 grain, bool fromTop, const char { BlockAllocator::Block &b = *iter; u32 offset = b.start % grain; + if (offset != 0) + offset = grain - offset; u32 needed = offset + size; if (b.taken == false && b.size >= needed) { @@ -94,7 +96,7 @@ u32 BlockAllocator::AllocAligned(u32 &size, u32 grain, bool fromTop, const char { std::list::reverse_iterator hey = iter; BlockAllocator::Block &b = *((++hey).base()); //yes, confusing syntax. reverse_iterators are confusing - u32 offset = b.start % grain; + u32 offset = (b.start + b.size - size) % grain; u32 needed = offset + size; if (b.taken == false && b.size >= needed) { @@ -102,7 +104,7 @@ u32 BlockAllocator::AllocAligned(u32 &size, u32 grain, bool fromTop, const char { b.taken = true; b.SetTag(tag); - return b.start + offset; + return b.start; } else { @@ -111,7 +113,7 @@ u32 BlockAllocator::AllocAligned(u32 &size, u32 grain, bool fromTop, const char b.start += b.size - needed; b.size = needed; b.SetTag(tag); - return b.start + offset; + return b.start; } } } From 20bb472b662c264c452ab4eb977e61d0d457bd47 Mon Sep 17 00:00:00 2001 From: "Unknown W. Brackets" Date: Fri, 1 Mar 2013 08:36:35 -0800 Subject: [PATCH 294/347] Simplify reverse_iterator usage in block alloc. --- Core/Util/BlockAllocator.cpp | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/Core/Util/BlockAllocator.cpp b/Core/Util/BlockAllocator.cpp index dbd6edc19e36..666fd3e213c8 100644 --- a/Core/Util/BlockAllocator.cpp +++ b/Core/Util/BlockAllocator.cpp @@ -65,7 +65,7 @@ u32 BlockAllocator::AllocAligned(u32 &size, u32 grain, bool fromTop, const char //Allocate from bottom of mem for (std::list::iterator iter = blocks.begin(); iter != blocks.end(); iter++) { - BlockAllocator::Block &b = *iter; + Block &b = *iter; u32 offset = b.start % grain; if (offset != 0) offset = grain - offset; @@ -94,8 +94,7 @@ u32 BlockAllocator::AllocAligned(u32 &size, u32 grain, bool fromTop, const char // Allocate from top of mem. for (std::list::reverse_iterator iter = blocks.rbegin(); iter != blocks.rend(); ++iter) { - std::list::reverse_iterator hey = iter; - BlockAllocator::Block &b = *((++hey).base()); //yes, confusing syntax. reverse_iterators are confusing + Block &b = *iter; u32 offset = (b.start + b.size - size) % grain; u32 needed = offset + size; if (b.taken == false && b.size >= needed) @@ -108,7 +107,8 @@ u32 BlockAllocator::AllocAligned(u32 &size, u32 grain, bool fromTop, const char } else { - blocks.insert(hey.base(), Block(b.start, b.size - needed, false)); + std::list::iterator pos = iter.base(); + blocks.insert(--pos, Block(b.start, b.size - needed, false)); b.taken = true; b.start += b.size - needed; b.size = needed; From bdfe24a86b2aa19028438b4eda77779ad7e115b7 Mon Sep 17 00:00:00 2001 From: Sacha Date: Mon, 4 Mar 2013 04:35:10 +1000 Subject: [PATCH 295/347] ARMv6 literal pool method. --- Common/ArmEmitter.cpp | 50 ++++++++++++++++++++++++++-------------- Common/ArmEmitter.h | 18 ++++++++++++++- Core/MIPS/ARM/ArmJit.cpp | 1 + 3 files changed, 51 insertions(+), 18 deletions(-) diff --git a/Common/ArmEmitter.cpp b/Common/ArmEmitter.cpp index 3316f51f7b1e..9d4254e66622 100644 --- a/Common/ArmEmitter.cpp +++ b/Common/ArmEmitter.cpp @@ -118,6 +118,36 @@ void ARMXEmitter::ORI2R(ARMReg rd, ARMReg rs, u32 val, ARMReg scratch) } } +void ARMXEmitter::FlushLitPool() +{ + for(std::vector::iterator it = currentLitPool.begin(); it != currentLitPool.end(); ++it) { + LiteralPool item = *it; + // Write the constant to Literal Pool + Write32(item.val); + s32 offset = (s32)code - (s32)item.ldr_address; + // Backpatch the LDR + code -= offset; + LDRLIT(item.reg, abs(offset - 8), offset - 8 > 0); + code += offset - 4; + } + // TODO: Save a copy of previous pools in case they are still in range. + currentLitPool.clear(); + pool_size = 0; +} + +void ARMXEmitter::AddNewLit(ArmGen::ARMReg reg, u32 val) +{ + // TODO: Look up current constants, + // return that value instead of generating a new one. + int index = pool_size++; + currentLitPool.push_back(); + currentLitPool[index].i = pool_size; + currentLitPool[index].val = val; + currentLitPool[index].reg = reg; + currentLitPool[index].ldr_address = (u32)code; + Write32(0); // To be backpatched later +} + void ARMXEmitter::MOVI2R(ARMReg reg, u32 val, bool optimize) { Operand2 op2; @@ -149,23 +179,7 @@ void ARMXEmitter::MOVI2R(ARMReg reg, u32 val, bool optimize) MOVT(reg, val, true); } else { // ARMv6 - fallback sequence. - // TODO: Optimize further. Can for example choose negation etc. - // Literal pools is another way to do this but much more complicated - // so I can't really be bothered for an outdated CPU architecture like ARMv6. - bool first = true; - int shift = 16; - for (int i = 0; i < 4; i++) { - if (val & 0xFF) { - if (first) { - MOV(reg, Operand2((u8)val, (u8)(shift & 0xF))); - first = false; - } else { - ORR(reg, reg, Operand2((u8)val, (u8)(shift & 0xF))); - } - } - shift -= 4; - val >>= 8; - } + AddNewLit(reg, val); } } } @@ -667,6 +681,8 @@ void ARMXEmitter::LDRSB(ARMReg dest, ARMReg base, ARMReg offset, bool Index, boo { Write32(condition | (0x01 << 20) | (Index << 24) | (Add << 23) | (base << 16) | (dest << 12) | (0xD << 4) | offset); } +void ARMXEmitter::LDRLIT (ARMReg dest, u32 offset, bool Add) { Write32(condition | 0x05 << 24 | Add << 23 | 0x1F << 16 | dest << 12 | offset);} + void ARMXEmitter::WriteRegStoreOp(u32 op, ARMReg dest, bool WriteBack, u16 RegList) { Write32(condition | (op << 20) | (WriteBack << 21) | (dest << 16) | RegList); diff --git a/Common/ArmEmitter.h b/Common/ArmEmitter.h index 7629fc16e2ae..8fdc6c5d8135 100644 --- a/Common/ArmEmitter.h +++ b/Common/ArmEmitter.h @@ -25,6 +25,7 @@ #if defined(__SYMBIAN32__) || defined(PANDORA) #include #endif +#include #undef _IP #undef R0 @@ -333,6 +334,14 @@ struct FixupBranch int type; //0 = B 1 = BL }; +struct LiteralPool +{ + int i; + u32 ldr_address; + u32 val; + ArmGen::ARMReg reg; +}; + typedef const u8* JumpTarget; class ARMXEmitter @@ -342,6 +351,8 @@ class ARMXEmitter u8 *code, *startcode; u8 *lastCacheFlushEnd; u32 condition; + int pool_size; + std::vector currentLitPool; void WriteStoreOp(u32 op, ARMReg dest, ARMReg src, Operand2 op2); void WriteRegStoreOp(u32 op, ARMReg dest, bool WriteBack, u16 RegList); @@ -359,7 +370,7 @@ class ARMXEmitter inline void Write32(u32 value) {*(u32*)code = value; code+=4;} public: - ARMXEmitter() : code(0), startcode(0), lastCacheFlushEnd(0) { + ARMXEmitter() : code(0), startcode(0), lastCacheFlushEnd(0), pool_size(0) { condition = CC_AL << 28; } ARMXEmitter(u8 *code_ptr) { @@ -367,6 +378,7 @@ class ARMXEmitter lastCacheFlushEnd = code_ptr; startcode = code_ptr; condition = CC_AL << 28; + pool_size = 0; } virtual ~ARMXEmitter() {} @@ -379,6 +391,9 @@ class ARMXEmitter void FlushIcacheSection(u8 *start, u8 *end); u8 *GetWritableCodePtr(); + void FlushLitPool(); + void AddNewLit(ArmGen::ARMReg reg, u32 val); + void SetCC(CCFlags cond = CC_AL); // Special purpose instructions @@ -490,6 +505,7 @@ class ARMXEmitter void LDRSH(ARMReg dest, ARMReg base, ARMReg offset, bool Index, bool Add); void LDRB (ARMReg dest, ARMReg base, ARMReg offset, bool Index, bool Add); void LDRSB(ARMReg dest, ARMReg base, ARMReg offset, bool Index, bool Add); + void LDRLIT(ARMReg dest, u32 offset, bool Add); void STR (ARMReg dest, ARMReg src, Operand2 op2 = 0); void STRH (ARMReg dest, ARMReg src, Operand2 op2 = 0); diff --git a/Core/MIPS/ARM/ArmJit.cpp b/Core/MIPS/ARM/ArmJit.cpp index 7901f91aba7c..fa82aeadd50c 100644 --- a/Core/MIPS/ARM/ArmJit.cpp +++ b/Core/MIPS/ARM/ArmJit.cpp @@ -219,6 +219,7 @@ const u8 *Jit::DoJit(u32 em_address, ArmJitBlock *b) js.compilerPC += 4; numInstructions++; } + FlushLitPool(); #ifdef LOGASM if (logBlocks > 0 && dontLogBlocks == 0) { for (u32 cpc = em_address; cpc != js.compilerPC + 4; cpc += 4) { From f2bdea74bee37e3d2c32798a3e8cf2f5c7c1fd09 Mon Sep 17 00:00:00 2001 From: "Unknown W. Brackets" Date: Sun, 3 Mar 2013 20:20:49 -0800 Subject: [PATCH 296/347] Don't align size to grain for PMB. --- Core/HLE/sceKernelMemory.cpp | 2 +- Core/Util/BlockAllocator.cpp | 8 +++++--- Core/Util/BlockAllocator.h | 2 +- 3 files changed, 7 insertions(+), 5 deletions(-) diff --git a/Core/HLE/sceKernelMemory.cpp b/Core/HLE/sceKernelMemory.cpp index 60149b6cfeb1..16b5ac3bcb78 100644 --- a/Core/HLE/sceKernelMemory.cpp +++ b/Core/HLE/sceKernelMemory.cpp @@ -427,7 +427,7 @@ class PartitionMemoryBlock : public KernelObject address = alloc->AllocAt(alignment, size, name); } else if (type == PSP_SMEM_LowAligned || type == PSP_SMEM_HighAligned) - address = alloc->AllocAligned(size, alignment, type == PSP_SMEM_HighAligned, name); + address = alloc->AllocAligned(size, 0x100, alignment, type == PSP_SMEM_HighAligned, name); else address = alloc->Alloc(size, type == PSP_SMEM_High, name); alloc->ListBlocks(); diff --git a/Core/Util/BlockAllocator.cpp b/Core/Util/BlockAllocator.cpp index 666fd3e213c8..24809fe1be76 100644 --- a/Core/Util/BlockAllocator.cpp +++ b/Core/Util/BlockAllocator.cpp @@ -45,7 +45,7 @@ void BlockAllocator::Shutdown() blocks.clear(); } -u32 BlockAllocator::AllocAligned(u32 &size, u32 grain, bool fromTop, const char *tag) +u32 BlockAllocator::AllocAligned(u32 &size, u32 sizeGrain, u32 grain, bool fromTop, const char *tag) { // Sanity check if (size == 0 || size > rangeSize_) { @@ -56,9 +56,11 @@ u32 BlockAllocator::AllocAligned(u32 &size, u32 grain, bool fromTop, const char // It could be off step, but the grain should generally be a power of 2. if (grain < grain_) grain = grain_; + if (sizeGrain < grain_) + sizeGrain = grain_; // upalign size to grain - size = (size + grain - 1) & ~(grain - 1); + size = (size + sizeGrain - 1) & ~(sizeGrain - 1); if (!fromTop) { @@ -128,7 +130,7 @@ u32 BlockAllocator::AllocAligned(u32 &size, u32 grain, bool fromTop, const char u32 BlockAllocator::Alloc(u32 &size, bool fromTop, const char *tag) { // We want to make sure it's aligned in case AllocAt() was used. - return AllocAligned(size, grain_, fromTop, tag); + return AllocAligned(size, grain_, grain_, fromTop, tag); } u32 BlockAllocator::AllocAt(u32 position, u32 size, const char *tag) diff --git a/Core/Util/BlockAllocator.h b/Core/Util/BlockAllocator.h index b385fedcb91d..a4354b6dbb9a 100644 --- a/Core/Util/BlockAllocator.h +++ b/Core/Util/BlockAllocator.h @@ -40,7 +40,7 @@ class BlockAllocator // WARNING: size can be modified upwards! u32 Alloc(u32 &size, bool fromTop = false, const char *tag = 0); - u32 AllocAligned(u32 &size, u32 grain, bool fromTop = false, const char *tag = 0); + u32 AllocAligned(u32 &size, u32 sizeGrain, u32 grain, bool fromTop = false, const char *tag = 0); u32 AllocAt(u32 position, u32 size, const char *tag = 0); bool Free(u32 position); From 9633239f18d3598cb35fd6620450d6a139c78fd9 Mon Sep 17 00:00:00 2001 From: Sacha Date: Mon, 4 Mar 2013 13:49:58 +1000 Subject: [PATCH 297/347] Update for lit pools. Works in some games now thanks to [Unknown]. --- Common/ArmEmitter.cpp | 54 +++++++++++++--------------------------- Common/ArmEmitter.h | 9 +++---- Core/MIPS/ARM/ArmAsm.cpp | 1 + 3 files changed, 21 insertions(+), 43 deletions(-) diff --git a/Common/ArmEmitter.cpp b/Common/ArmEmitter.cpp index 9d4254e66622..ba4a0995a109 100644 --- a/Common/ArmEmitter.cpp +++ b/Common/ArmEmitter.cpp @@ -123,63 +123,43 @@ void ARMXEmitter::FlushLitPool() for(std::vector::iterator it = currentLitPool.begin(); it != currentLitPool.end(); ++it) { LiteralPool item = *it; // Write the constant to Literal Pool + s32 offset = (s32)code - (s32)item.ldr_address - 8; Write32(item.val); - s32 offset = (s32)code - (s32)item.ldr_address; // Backpatch the LDR - code -= offset; - LDRLIT(item.reg, abs(offset - 8), offset - 8 > 0); - code += offset - 4; + *(u32*)item.ldr_address |= (offset >= 0) << 23 | abs(offset); } // TODO: Save a copy of previous pools in case they are still in range. currentLitPool.clear(); - pool_size = 0; } -void ARMXEmitter::AddNewLit(ArmGen::ARMReg reg, u32 val) +void ARMXEmitter::AddNewLit(u32 val) { // TODO: Look up current constants, // return that value instead of generating a new one. - int index = pool_size++; - currentLitPool.push_back(); - currentLitPool[index].i = pool_size; - currentLitPool[index].val = val; - currentLitPool[index].reg = reg; - currentLitPool[index].ldr_address = (u32)code; - Write32(0); // To be backpatched later + LiteralPool pool_item; + pool_item.i = currentLitPool.size(); + pool_item.val = val; + pool_item.ldr_address = code; + currentLitPool.push_back(pool_item); } -void ARMXEmitter::MOVI2R(ARMReg reg, u32 val, bool optimize) +void ARMXEmitter::MOVI2R(ARMReg reg, u32 val) { Operand2 op2; bool inverse; - if (!optimize) - { - // Only used in backpatch atm - // Only support ARMv7 right now - if (cpu_info.bArmV7) { - MOVW(reg, val & 0xFFFF); - MOVT(reg, val, true); - } - else - { - // ARMv6 version won't use backpatch for now - // Run again with optimizations - MOVI2R(reg, val); - } - } else if (TryMakeOperand2_AllowInverse(val, op2, &inverse)) { - if (!inverse) - MOV(reg, op2); - else - MVN(reg, op2); + if (TryMakeOperand2_AllowInverse(val, op2, &inverse)) { + inverse ? MVN(reg, op2) : MOV(reg, op2); } else { - if (cpu_info.bArmV7) { - // ARMv7 - can use MOVT/MOVW, best choice + if (cpu_info.bArmV7) + { + // Wse MOVW+MOVT for ARMv7+ MOVW(reg, val & 0xFFFF); if(val & 0xFFFF0000) MOVT(reg, val, true); } else { - // ARMv6 - fallback sequence. - AddNewLit(reg, val); + // Use literal pool for ARMv6. + AddNewLit(val); + LDRLIT(reg, 0, 0); // To be backpatched later } } } diff --git a/Common/ArmEmitter.h b/Common/ArmEmitter.h index 8fdc6c5d8135..e78b856ee5f1 100644 --- a/Common/ArmEmitter.h +++ b/Common/ArmEmitter.h @@ -337,9 +337,8 @@ struct FixupBranch struct LiteralPool { int i; - u32 ldr_address; + u8* ldr_address; u32 val; - ArmGen::ARMReg reg; }; typedef const u8* JumpTarget; @@ -351,7 +350,6 @@ class ARMXEmitter u8 *code, *startcode; u8 *lastCacheFlushEnd; u32 condition; - int pool_size; std::vector currentLitPool; void WriteStoreOp(u32 op, ARMReg dest, ARMReg src, Operand2 op2); @@ -370,7 +368,7 @@ class ARMXEmitter inline void Write32(u32 value) {*(u32*)code = value; code+=4;} public: - ARMXEmitter() : code(0), startcode(0), lastCacheFlushEnd(0), pool_size(0) { + ARMXEmitter() : code(0), startcode(0), lastCacheFlushEnd(0) { condition = CC_AL << 28; } ARMXEmitter(u8 *code_ptr) { @@ -378,7 +376,6 @@ class ARMXEmitter lastCacheFlushEnd = code_ptr; startcode = code_ptr; condition = CC_AL << 28; - pool_size = 0; } virtual ~ARMXEmitter() {} @@ -392,7 +389,7 @@ class ARMXEmitter u8 *GetWritableCodePtr(); void FlushLitPool(); - void AddNewLit(ArmGen::ARMReg reg, u32 val); + void AddNewLit(u32 val); void SetCC(CCFlags cond = CC_AL); diff --git a/Core/MIPS/ARM/ArmAsm.cpp b/Core/MIPS/ARM/ArmAsm.cpp index 5153865d0f72..1e46e6d67acc 100644 --- a/Core/MIPS/ARM/ArmAsm.cpp +++ b/Core/MIPS/ARM/ArmAsm.cpp @@ -198,6 +198,7 @@ void Jit::GenerateFixedCode() // Don't forget to zap the instruction cache! FlushIcache(); + FlushLitPool(); } } // namespace From 0fc6b6087486721aaf1241c04e72f6b8c5bfda34 Mon Sep 17 00:00:00 2001 From: Sacha Date: Mon, 4 Mar 2013 14:36:23 +1000 Subject: [PATCH 298/347] Fix Lit Pools for cases where offset goes out of range. For example: Zero no Kiseki has a block that is 7K large. --- Common/ArmEmitter.cpp | 13 ++++++++++--- Common/ArmEmitter.h | 1 + Core/MIPS/ARM/ArmAsm.cpp | 2 +- Core/MIPS/ARM/ArmJit.cpp | 13 ++++++++++++- 4 files changed, 24 insertions(+), 5 deletions(-) diff --git a/Common/ArmEmitter.cpp b/Common/ArmEmitter.cpp index ba4a0995a109..88fc99529f15 100644 --- a/Common/ArmEmitter.cpp +++ b/Common/ArmEmitter.cpp @@ -143,16 +143,23 @@ void ARMXEmitter::AddNewLit(u32 val) currentLitPool.push_back(pool_item); } -void ARMXEmitter::MOVI2R(ARMReg reg, u32 val) +void ARMXEmitter::MOVI2R(ARMReg reg, u32 val, bool optimize) { Operand2 op2; bool inverse; - if (TryMakeOperand2_AllowInverse(val, op2, &inverse)) { + + if (cpu_info.bArmV7 && !optimize) + { + // For backpatching on ARMv7 + MOVW(reg, val & 0xFFFF); + MOVT(reg, val, true); + } + else if (TryMakeOperand2_AllowInverse(val, op2, &inverse)) { inverse ? MVN(reg, op2) : MOV(reg, op2); } else { if (cpu_info.bArmV7) { - // Wse MOVW+MOVT for ARMv7+ + // Use MOVW+MOVT for ARMv7+ MOVW(reg, val & 0xFFFF); if(val & 0xFFFF0000) MOVT(reg, val, true); diff --git a/Common/ArmEmitter.h b/Common/ArmEmitter.h index e78b856ee5f1..db79c787c884 100644 --- a/Common/ArmEmitter.h +++ b/Common/ArmEmitter.h @@ -391,6 +391,7 @@ class ARMXEmitter void FlushLitPool(); void AddNewLit(u32 val); + CCFlags GetCC() { return CCFlags(condition >> 28); } void SetCC(CCFlags cond = CC_AL); // Special purpose instructions diff --git a/Core/MIPS/ARM/ArmAsm.cpp b/Core/MIPS/ARM/ArmAsm.cpp index 1e46e6d67acc..2ec66f05be40 100644 --- a/Core/MIPS/ARM/ArmAsm.cpp +++ b/Core/MIPS/ARM/ArmAsm.cpp @@ -197,8 +197,8 @@ void Jit::GenerateFixedCode() // INFO_LOG(HLE, "END OF THE DISASM ========================"); // Don't forget to zap the instruction cache! - FlushIcache(); FlushLitPool(); + FlushIcache(); } } // namespace diff --git a/Core/MIPS/ARM/ArmJit.cpp b/Core/MIPS/ARM/ArmJit.cpp index fa82aeadd50c..8cb068b92a97 100644 --- a/Core/MIPS/ARM/ArmJit.cpp +++ b/Core/MIPS/ARM/ArmJit.cpp @@ -25,6 +25,7 @@ #include "ArmRegCache.h" #include "ArmJit.h" +#include "CPUDetect.h" #include "../../../ext/disarm.h" @@ -218,6 +219,16 @@ const u8 *Jit::DoJit(u32 em_address, ArmJitBlock *b) js.compilerPC += 4; numInstructions++; + if (!cpu_info.bArmV7 && GetCodePtr() - b->checkedEntry >= 4088) + { + // We need to prematurely flush as we are out of range + CCFlags old_cc = GetCC(); + SetCC(CC_AL); + FixupBranch skip = B(); + FlushLitPool(); + SetJumpTarget(skip); + SetCC(old_cc); + } } FlushLitPool(); #ifdef LOGASM @@ -346,7 +357,7 @@ void Jit::Comp_DoNothing(u32 op) { } #define _FS ((op>>11) & 0x1F) #define _FT ((op>>16) & 0x1F) #define _FD ((op>>6) & 0x1F) -#define _POS ((op>>6) & 0x1F) +#define _POS((op>>6) & 0x1F) #define _SIZE ((op>>11) & 0x1F) //memory regions: From f4a0709286e2a0861a438df1dea427f31402e5f7 Mon Sep 17 00:00:00 2001 From: "Unknown W. Brackets" Date: Sun, 3 Mar 2013 22:05:23 -0800 Subject: [PATCH 299/347] Correct the startSector read by sceIoDread(). --- Core/FileSystems/ISOFileSystem.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Core/FileSystems/ISOFileSystem.cpp b/Core/FileSystems/ISOFileSystem.cpp index 0a91212a6470..09de15ea4dad 100644 --- a/Core/FileSystems/ISOFileSystem.cpp +++ b/Core/FileSystems/ISOFileSystem.cpp @@ -559,7 +559,7 @@ std::vector ISOFileSystem::GetDirListing(std::string path) x.size = e->size; x.type = e->isDirectory ? FILETYPE_DIRECTORY : FILETYPE_NORMAL; x.isOnSectorSystem = true; - x.startSector = entry->startingPosition/2048; + x.startSector = e->startingPosition/2048; myVector.push_back(x); } return myVector; From c30dbc38845749a01ac491342812a522fbb2927b Mon Sep 17 00:00:00 2001 From: "Unknown W. Brackets" Date: Sun, 3 Mar 2013 22:53:34 -0800 Subject: [PATCH 300/347] Fix Qt build on Windows hosts. --- Qt/Core.pro | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/Qt/Core.pro b/Qt/Core.pro index f2060f8f2453..933fee5fb87a 100755 --- a/Qt/Core.pro +++ b/Qt/Core.pro @@ -5,7 +5,8 @@ TEMPLATE = lib CONFIG += staticlib version.target = ../git-version.cpp -version.commands = $$PWD/git-version-gen.sh +contains(QMAKE_HOST.os, "Windows") { version.commands = $$PWD/../Windows/git-version-gen.cmd } +else { version.commands = $$PWD/git-version-gen.sh } version.depends = ../.git QMAKE_EXTRA_TARGETS += version From 8d38596cc9725f3022ca9efdf966bafe2b8ede26 Mon Sep 17 00:00:00 2001 From: "Unknown W. Brackets" Date: Fri, 1 Mar 2013 08:51:01 -0800 Subject: [PATCH 301/347] Add config setting for api reporting. For now, will be disabled in some cases, but I want people to be able to set to "" so that it will always be disabled. --- Core/Config.cpp | 4 ++++ Core/Config.h | 1 + 2 files changed, 5 insertions(+) diff --git a/Core/Config.cpp b/Core/Config.cpp index e01790a52f9d..bd67dd157a78 100644 --- a/Core/Config.cpp +++ b/Core/Config.cpp @@ -54,6 +54,8 @@ void CConfig::Load(const char *iniFileName) general->Get("IgnoreBadMemAccess", &bIgnoreBadMemAccess, true); general->Get("CurrentDirectory", ¤tDirectory, ""); general->Get("ShowDebuggerOnLoad", &bShowDebuggerOnLoad, false); + // "default" means let emulator decide, "" means disable. + general->Get("ReportHost", &sReportHost, "default"); IniFile::Section *cpu = iniFile.GetOrCreateSection("CPU"); cpu->Get("Jit", &bJit, true); @@ -120,6 +122,8 @@ void CConfig::Save() general->Set("IgnoreBadMemAccess", bIgnoreBadMemAccess); general->Set("CurrentDirectory", currentDirectory); general->Set("ShowDebuggerOnLoad", bShowDebuggerOnLoad); + general->Set("ReportHost", sReportHost); + IniFile::Section *cpu = iniFile.GetOrCreateSection("CPU"); cpu->Set("Jit", bJit); cpu->Set("FastMemory", bFastMemory); diff --git a/Core/Config.h b/Core/Config.h index 8468158d4643..87109618f0ea 100644 --- a/Core/Config.h +++ b/Core/Config.h @@ -49,6 +49,7 @@ struct CConfig bool bIgnoreBadMemAccess; bool bFastMemory; bool bJit; + std::string sReportHost; // GFX bool bDisplayFramebuffer; From 2589a02934b49ab409777f8730545b28d1735bf8 Mon Sep 17 00:00:00 2001 From: "Unknown W. Brackets" Date: Fri, 1 Mar 2013 08:58:05 -0800 Subject: [PATCH 302/347] Add basic server reporting interface, needs work. --- CMakeLists.txt | 2 + Core/Core.vcxproj | 2 + Core/Core.vcxproj.filters | 6 ++ Core/Reporting.cpp | 120 ++++++++++++++++++++++++++++++++++++++ Core/Reporting.h | 23 ++++++++ Qt/Core.pro | 2 + android/jni/Android.mk | 1 + 7 files changed, 156 insertions(+) create mode 100644 Core/Reporting.cpp create mode 100644 Core/Reporting.h diff --git a/CMakeLists.txt b/CMakeLists.txt index 32c240c8523e..de75f76c41aa 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -815,6 +815,8 @@ add_library(${CoreLibName} ${CoreLinkType} Core/PSPLoaders.h Core/PSPMixer.cpp Core/PSPMixer.h + Core/Reporting.cpp + Core/Reporting.h Core/SaveState.cpp Core/SaveState.h Core/System.cpp diff --git a/Core/Core.vcxproj b/Core/Core.vcxproj index 7b4f9b0247a6..80a43f7c8cd0 100644 --- a/Core/Core.vcxproj +++ b/Core/Core.vcxproj @@ -295,6 +295,7 @@ + @@ -429,6 +430,7 @@ + diff --git a/Core/Core.vcxproj.filters b/Core/Core.vcxproj.filters index fd4a7beda09b..1a71c8cb4f84 100644 --- a/Core/Core.vcxproj.filters +++ b/Core/Core.vcxproj.filters @@ -383,6 +383,9 @@ Font + + Core + @@ -704,6 +707,9 @@ Font + + Core + diff --git a/Core/Reporting.cpp b/Core/Reporting.cpp new file mode 100644 index 000000000000..31c6e777db20 --- /dev/null +++ b/Core/Reporting.cpp @@ -0,0 +1,120 @@ +// Copyright (c) 2012- PPSSPP Project. + +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, version 2.0 or later versions. + +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License 2.0 for more details. + +// A copy of the GPL 2.0 should have been included with the program. +// If not, see http://www.gnu.org/licenses/ + +// Official git repository and contact information can be found at +// https://github.com/hrydgard/ppsspp and http://www.ppsspp.org/. + +#include "Core/Config.h" +#include "Core/System.h" + +#include "net/http_client.h" +#include "net/resolve.h" +#include "base/buffer.h" + +#include +#include + +namespace Reporting +{ + const int DEFAULT_PORT = 80; + + static size_t ServerHostnameLength() + { + if (g_Config.sReportHost.empty()) + return g_Config.sReportHost.npos; + + // IPv6 literal? + if (g_Config.sReportHost[0] == '[') + { + size_t length = g_Config.sReportHost.find("]:"); + if (length != g_Config.sReportHost.npos) + ++length; + return length; + } + else + return g_Config.sReportHost.find(':'); + } + + static std::string lastHostname; + static const char *ServerHostname() + { + if (g_Config.sReportHost.empty()) + return NULL; + // Disabled by default for now. + if (g_Config.sReportHost.compare("default") == 0) + return NULL; + + size_t length = ServerHostnameLength(); + if (length == g_Config.sReportHost.npos) + return g_Config.sReportHost.c_str(); + + lastHostname = g_Config.sReportHost.substr(0, length); + return lastHostname.c_str(); + } + + static int ServerPort() + { + if (g_Config.sReportHost.empty()) + return 0; + // Disabled by default for now. + if (g_Config.sReportHost.compare("default") == 0) + return 0; + + size_t offset = ServerHostnameLength(); + if (offset == g_Config.sReportHost.npos) + return DEFAULT_PORT; + + // Skip the colon. + std::string port = g_Config.sReportHost.substr(offset + 1); + return atoi(port.c_str()); + } + + void ReportMessage(const char *message, ...) + { + if (g_Config.sReportHost.empty()) + return; + // Disabled by default for now. + if (g_Config.sReportHost.compare("default") == 0) + return; + + // TODO: Use a thread, enable on non-Windows. +#ifdef _MSC_VER + char temp[32768]; + char *tempPos = &temp[0]; + + // TODO: application/x-www-urlencoded? Need to escape. + tempPos += sprintf(tempPos, "version=%s&game=%s_%s&message=", + PPSSPP_GIT_VERSION, + g_paramSFO.GetValueString("DISC_ID").c_str(), + g_paramSFO.GetValueString("DISC_VERSION").c_str()); + + va_list args; + va_start(args, message); + vsprintf(tempPos, message, args); + va_end(args); + + Buffer output; + http::Client http; + net::Init(); + if (http.Resolve(ServerHostname(), ServerPort())) + { + http.Connect(); + http.POST("/report/message", temp, &output); + http.Disconnect(); + } + net::Shutdown(); +#endif + } + +} \ No newline at end of file diff --git a/Core/Reporting.h b/Core/Reporting.h new file mode 100644 index 000000000000..52de51a38572 --- /dev/null +++ b/Core/Reporting.h @@ -0,0 +1,23 @@ +// Copyright (c) 2012- PPSSPP Project. + +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, version 2.0 or later versions. + +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License 2.0 for more details. + +// A copy of the GPL 2.0 should have been included with the program. +// If not, see http://www.gnu.org/licenses/ + +// Official git repository and contact information can be found at +// https://github.com/hrydgard/ppsspp and http://www.ppsspp.org/. + +#include "Common/CommonTypes.h" + +namespace Reporting +{ + void ReportMessage(const char *message, ...); +} \ No newline at end of file diff --git a/Qt/Core.pro b/Qt/Core.pro index 933fee5fb87a..aa21dee9c01f 100755 --- a/Qt/Core.pro +++ b/Qt/Core.pro @@ -42,6 +42,7 @@ SOURCES += ../Core/CPU.cpp \ # Core ../Core/MemMapFunctions.cpp \ ../Core/PSPLoaders.cpp \ ../Core/PSPMixer.cpp \ + ../Core/Reporting.cpp \ ../Core/SaveState.cpp \ ../Core/System.cpp \ ../Core/Debugger/*.cpp \ @@ -72,6 +73,7 @@ HEADERS += ../Core/CPU.h \ ../Core/MemMap.h \ ../Core/PSPLoaders.h \ ../Core/PSPMixer.h \ + ../Core/Reporting.h \ ../Core/SaveState.h \ ../Core/System.h \ ../Core/Debugger/*.h \ diff --git a/android/jni/Android.mk b/android/jni/Android.mk index b9683dbd6d5c..2ee383b6d77d 100644 --- a/android/jni/Android.mk +++ b/android/jni/Android.mk @@ -105,6 +105,7 @@ LOCAL_SRC_FILES := \ $(SRC)/Core/PSPLoaders.cpp \ $(SRC)/Core/MemMap.cpp \ $(SRC)/Core/MemMapFunctions.cpp \ + $(SRC)/Core/Reporting.cpp \ $(SRC)/Core/SaveState.cpp \ $(SRC)/Core/System.cpp \ $(SRC)/Core/PSPMixer.cpp \ From 5e81b662d519df7b5f3de8720dbe4ff7e880ab52 Mon Sep 17 00:00:00 2001 From: "Unknown W. Brackets" Date: Fri, 1 Mar 2013 09:51:10 -0800 Subject: [PATCH 303/347] Cleanup, add notes for server reporting. --- Core/Reporting.cpp | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/Core/Reporting.cpp b/Core/Reporting.cpp index 31c6e777db20..001c63bf45c6 100644 --- a/Core/Reporting.cpp +++ b/Core/Reporting.cpp @@ -90,18 +90,20 @@ namespace Reporting // TODO: Use a thread, enable on non-Windows. #ifdef _MSC_VER - char temp[32768]; + const int MESSAGE_BUFFER_SIZE = 32768; + char temp[MESSAGE_BUFFER_SIZE]; char *tempPos = &temp[0]; - // TODO: application/x-www-urlencoded? Need to escape. + // TODO: Need to escape these values. tempPos += sprintf(tempPos, "version=%s&game=%s_%s&message=", PPSSPP_GIT_VERSION, g_paramSFO.GetValueString("DISC_ID").c_str(), g_paramSFO.GetValueString("DISC_VERSION").c_str()); + // TODO: And escape this, plus it can't be done on thread. va_list args; va_start(args, message); - vsprintf(tempPos, message, args); + vsnprintf(tempPos, temp + MESSAGE_BUFFER_SIZE - tempPos, message, args); va_end(args); Buffer output; @@ -110,7 +112,7 @@ namespace Reporting if (http.Resolve(ServerHostname(), ServerPort())) { http.Connect(); - http.POST("/report/message", temp, &output); + http.POST("/report/message", temp, "application/x-www-urlencoded", &output); http.Disconnect(); } net::Shutdown(); From a0851fb25ec82ae6b674c890bae2945a354c0d82 Mon Sep 17 00:00:00 2001 From: "Unknown W. Brackets" Date: Fri, 1 Mar 2013 12:56:51 -0800 Subject: [PATCH 304/347] Add a simple spam protection limit to reporting. And some small refactor. --- Core/Reporting.cpp | 48 ++++++++++++++++++++++++++++++++++------------ 1 file changed, 36 insertions(+), 12 deletions(-) diff --git a/Core/Reporting.cpp b/Core/Reporting.cpp index 001c63bf45c6..ed0322d4bddd 100644 --- a/Core/Reporting.cpp +++ b/Core/Reporting.cpp @@ -28,6 +28,12 @@ namespace Reporting { const int DEFAULT_PORT = 80; + const int SPAM_LIMIT = 100; + + // Internal limiter on number of requests per instance. + static u32 spamProtectionCount = 0; + // Temporarily stores a reference to the hostname. + static std::string lastHostname; static size_t ServerHostnameLength() { @@ -46,7 +52,6 @@ namespace Reporting return g_Config.sReportHost.find(':'); } - static std::string lastHostname; static const char *ServerHostname() { if (g_Config.sReportHost.empty()) @@ -80,9 +85,37 @@ namespace Reporting return atoi(port.c_str()); } + // Should only be called once per request. + bool CheckSpamLimited() + { + return ++spamProtectionCount >= SPAM_LIMIT; + } + + bool SendReportRequest(const char *uri, const std::string &data, Buffer *output = NULL) + { + bool result = false; + http::Client http; + Buffer theVoid; + + if (output == NULL) + output = &theVoid; + + net::Init(); + if (http.Resolve(ServerHostname(), ServerPort())) + { + http.Connect(); + http.POST("/report/message", data, "application/x-www-urlencoded", output); + http.Disconnect(); + result = true; + } + net::Shutdown(); + + return result; + } + void ReportMessage(const char *message, ...) { - if (g_Config.sReportHost.empty()) + if (g_Config.sReportHost.empty() || CheckSpamLimited()) return; // Disabled by default for now. if (g_Config.sReportHost.compare("default") == 0) @@ -106,16 +139,7 @@ namespace Reporting vsnprintf(tempPos, temp + MESSAGE_BUFFER_SIZE - tempPos, message, args); va_end(args); - Buffer output; - http::Client http; - net::Init(); - if (http.Resolve(ServerHostname(), ServerPort())) - { - http.Connect(); - http.POST("/report/message", temp, "application/x-www-urlencoded", &output); - http.Disconnect(); - } - net::Shutdown(); + SendReportRequest("/report/message", temp); #endif } From cbbbd2d59530994a90d3f2e7d2345923cbcea7d2 Mon Sep 17 00:00:00 2001 From: "Unknown W. Brackets" Date: Fri, 1 Mar 2013 22:34:02 -0800 Subject: [PATCH 305/347] Send server reports on a separate thread. Well, maybe could be more efficient, but mostly worried about latency not thread creation. --- Core/Reporting.cpp | 68 ++++++++++++++++++++++++++++++++++++++-------- 1 file changed, 57 insertions(+), 11 deletions(-) diff --git a/Core/Reporting.cpp b/Core/Reporting.cpp index ed0322d4bddd..cbc660394282 100644 --- a/Core/Reporting.cpp +++ b/Core/Reporting.cpp @@ -25,16 +25,35 @@ #include #include +// TODO: Probably this works on non-Windows/Qt too. +#ifdef _MSC_VER +#include "Common/StdThread.h" +#endif + namespace Reporting { const int DEFAULT_PORT = 80; const int SPAM_LIMIT = 100; + const int PAYLOAD_BUFFER_SIZE = 100; // Internal limiter on number of requests per instance. static u32 spamProtectionCount = 0; // Temporarily stores a reference to the hostname. static std::string lastHostname; + enum RequestType + { + MESSAGE, + }; + + struct Payload + { + RequestType type; + std::string data; + }; + static Payload payloadBuffer[PAYLOAD_BUFFER_SIZE]; + static int payloadBufferPos = 0; + static size_t ServerHostnameLength() { if (g_Config.sReportHost.empty()) @@ -113,6 +132,34 @@ namespace Reporting return result; } + int Process(int pos) + { + Payload &payload = payloadBuffer[pos]; + + const int PARAM_BUFFER_SIZE = 4096; + char temp[PARAM_BUFFER_SIZE]; + + // TODO: Need to escape these values, add more. + snprintf(temp, PARAM_BUFFER_SIZE - 1, "version=%s&game=%s_%s", + PPSSPP_GIT_VERSION, + g_paramSFO.GetValueString("DISC_ID").c_str(), + g_paramSFO.GetValueString("DISC_VERSION").c_str()); + + std::string data; + switch (payload.type) + { + case MESSAGE: + // TODO: Escape. + data = std::string(temp) + "&message=" + payload.data; + payload.data.clear(); + + SendReportRequest("/report/message", data); + break; + } + + return 0; + } + void ReportMessage(const char *message, ...) { if (g_Config.sReportHost.empty() || CheckSpamLimited()) @@ -121,25 +168,24 @@ namespace Reporting if (g_Config.sReportHost.compare("default") == 0) return; - // TODO: Use a thread, enable on non-Windows. + // TODO: Enable on non-Windows. #ifdef _MSC_VER const int MESSAGE_BUFFER_SIZE = 32768; char temp[MESSAGE_BUFFER_SIZE]; - char *tempPos = &temp[0]; - - // TODO: Need to escape these values. - tempPos += sprintf(tempPos, "version=%s&game=%s_%s&message=", - PPSSPP_GIT_VERSION, - g_paramSFO.GetValueString("DISC_ID").c_str(), - g_paramSFO.GetValueString("DISC_VERSION").c_str()); - // TODO: And escape this, plus it can't be done on thread. va_list args; va_start(args, message); - vsnprintf(tempPos, temp + MESSAGE_BUFFER_SIZE - tempPos, message, args); + vsnprintf(temp, MESSAGE_BUFFER_SIZE - 1, message, args); + temp[MESSAGE_BUFFER_SIZE - 1] = '\0'; va_end(args); - SendReportRequest("/report/message", temp); + int pos = payloadBufferPos++ % PAYLOAD_BUFFER_SIZE; + Payload &payload = payloadBuffer[pos]; + payload.type = MESSAGE; + payload.data = temp; + + std::thread th(Process, pos); + th.detach(); #endif } From 78d320d576a4ab68a59f086b91a754bb71666da2 Mon Sep 17 00:00:00 2001 From: "Unknown W. Brackets" Date: Fri, 1 Mar 2013 23:11:34 -0800 Subject: [PATCH 306/347] Enable on non-Windows, works on Linux anyway. --- Core/Reporting.cpp | 12 +++--------- 1 file changed, 3 insertions(+), 9 deletions(-) diff --git a/Core/Reporting.cpp b/Core/Reporting.cpp index cbc660394282..691bfe844d04 100644 --- a/Core/Reporting.cpp +++ b/Core/Reporting.cpp @@ -15,6 +15,7 @@ // Official git repository and contact information can be found at // https://github.com/hrydgard/ppsspp and http://www.ppsspp.org/. +#include "Common/StdThread.h" #include "Core/Config.h" #include "Core/System.h" @@ -24,16 +25,12 @@ #include #include - -// TODO: Probably this works on non-Windows/Qt too. -#ifdef _MSC_VER -#include "Common/StdThread.h" -#endif +#include namespace Reporting { const int DEFAULT_PORT = 80; - const int SPAM_LIMIT = 100; + const u32 SPAM_LIMIT = 100; const int PAYLOAD_BUFFER_SIZE = 100; // Internal limiter on number of requests per instance. @@ -168,8 +165,6 @@ namespace Reporting if (g_Config.sReportHost.compare("default") == 0) return; - // TODO: Enable on non-Windows. -#ifdef _MSC_VER const int MESSAGE_BUFFER_SIZE = 32768; char temp[MESSAGE_BUFFER_SIZE]; @@ -186,7 +181,6 @@ namespace Reporting std::thread th(Process, pos); th.detach(); -#endif } } \ No newline at end of file From cb4c7f0eb617f166f6bb2ea5bdb7ef40c55d450f Mon Sep 17 00:00:00 2001 From: "Unknown W. Brackets" Date: Fri, 1 Mar 2013 23:14:00 -0800 Subject: [PATCH 307/347] Add some basic reporting hooks. --- Core/HLE/HLE.cpp | 2 ++ Core/HLE/sceSas.cpp | 2 ++ 2 files changed, 4 insertions(+) diff --git a/Core/HLE/HLE.cpp b/Core/HLE/HLE.cpp index cc9e98ca6a5d..faeea8ead483 100644 --- a/Core/HLE/HLE.cpp +++ b/Core/HLE/HLE.cpp @@ -21,6 +21,7 @@ #include #include "../MemMap.h" #include "../Config.h" +#include "Core/Reporting.h" #include "HLETables.h" #include "../System.h" @@ -164,6 +165,7 @@ u32 GetSyscallOp(const char *moduleName, u32 nib) else { INFO_LOG(HLE, "Syscall (%s, %08x) unknown", moduleName, nib); + Reporting::ReportMessage("Unknown syscall in known module: %s 0x%08x", moduleName, nib); return (0x0003FFCC | (modindex<<18)); // invalid syscall } } diff --git a/Core/HLE/sceSas.cpp b/Core/HLE/sceSas.cpp index 16f3fec15d8e..f92b9cbe81ee 100644 --- a/Core/HLE/sceSas.cpp +++ b/Core/HLE/sceSas.cpp @@ -28,6 +28,7 @@ #include "HLE.h" #include "../MIPS/MIPS.h" #include "../HW/SasAudio.h" +#include "Core/Reporting.h" #include "sceSas.h" #include "sceKernel.h" @@ -143,6 +144,7 @@ u32 sceSasSetVoice(u32 core, int voiceNum, u32 vagAddr, int size, int loop) { u32 sceSasSetVoicePCM(u32 core, int voiceNum, u32 pcmAddr, int size, int loop) { INFO_LOG(HLE,"PLEASE REPORT issue #505 sceSasSetVoicePCM(%08x, %i, %08x, %i, %i)", core, voiceNum, pcmAddr, size, loop); + Reporting::ReportMessage("sceSasSetVoicePCM(%x, %i)", core, voiceNum); if (voiceNum >= PSP_SAS_VOICES_MAX || voiceNum < 0) { WARN_LOG(HLE, "%s: invalid voicenum %d", __FUNCTION__, voiceNum); From d9608bd6088313fda7e22a9c8464eb26cc86b521 Mon Sep 17 00:00:00 2001 From: "Unknown W. Brackets" Date: Sun, 3 Mar 2013 23:36:24 -0800 Subject: [PATCH 308/347] Report the format string as a separate param. This way it can have a "class" of messages more easily. --- Core/Reporting.cpp | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/Core/Reporting.cpp b/Core/Reporting.cpp index 691bfe844d04..a64528c61e5c 100644 --- a/Core/Reporting.cpp +++ b/Core/Reporting.cpp @@ -46,7 +46,8 @@ namespace Reporting struct Payload { RequestType type; - std::string data; + std::string string1; + std::string string2; }; static Payload payloadBuffer[PAYLOAD_BUFFER_SIZE]; static int payloadBufferPos = 0; @@ -147,8 +148,9 @@ namespace Reporting { case MESSAGE: // TODO: Escape. - data = std::string(temp) + "&message=" + payload.data; - payload.data.clear(); + data = std::string(temp) + "&message=" + payload.string1 + "&value=" + payload.string2; + payload.string1.clear(); + payload.string2.clear(); SendReportRequest("/report/message", data); break; @@ -177,7 +179,8 @@ namespace Reporting int pos = payloadBufferPos++ % PAYLOAD_BUFFER_SIZE; Payload &payload = payloadBuffer[pos]; payload.type = MESSAGE; - payload.data = temp; + payload.string1 = message; + payload.string2 = temp; std::thread th(Process, pos); th.detach(); From ac1209204ceab688fc3e84ffaca26e66a6f21633 Mon Sep 17 00:00:00 2001 From: "Unknown W. Brackets" Date: Sun, 3 Mar 2013 23:46:37 -0800 Subject: [PATCH 309/347] Add some reporting for CPU related stuff. --- Core/MIPS/ARM/ArmCompVFPU.cpp | 2 ++ Core/MIPS/MIPSInt.cpp | 3 +++ Core/MIPS/MIPSIntVFPU.cpp | 6 ++++++ Core/MIPS/x86/CompVFPU.cpp | 2 ++ 4 files changed, 13 insertions(+) diff --git a/Core/MIPS/ARM/ArmCompVFPU.cpp b/Core/MIPS/ARM/ArmCompVFPU.cpp index 303aee6874fe..1dbeac7a6d68 100644 --- a/Core/MIPS/ARM/ArmCompVFPU.cpp +++ b/Core/MIPS/ARM/ArmCompVFPU.cpp @@ -17,6 +17,7 @@ #include "../../MemMap.h" #include "../MIPSAnalyst.h" +#include "Core/Reporting.h" #include "ArmJit.h" #include "ArmRegCache.h" @@ -117,6 +118,7 @@ namespace MIPSComp // TODO: But some ops seem to use const 0 instead? if (regnum >= n) { ERROR_LOG(CPU, "Invalid VFPU swizzle: %08x / %d", prefix, sz); + Reporting::ReportMessage("Invalid VFPU swizzle: %08x / %d", prefix, sz); regnum = 0; } diff --git a/Core/MIPS/MIPSInt.cpp b/Core/MIPS/MIPSInt.cpp index 098908ddcfb3..5310a95cb91a 100644 --- a/Core/MIPS/MIPSInt.cpp +++ b/Core/MIPS/MIPSInt.cpp @@ -23,6 +23,7 @@ #include "MIPS.h" #include "MIPSInt.h" #include "MIPSTables.h" +#include "Core/Reporting.h" #include "../HLE/HLE.h" #include "../System.h" @@ -186,6 +187,7 @@ namespace MIPSInt void Int_Break(u32 op) { + Reporting::ReportMessage("BREAK instruction hit"); ERROR_LOG(CPU, "BREAK!"); Core_UpdateState(CORE_STEPPING); PC += 4; @@ -960,6 +962,7 @@ namespace MIPSInt { case 0: if (!reported) { + Reporting::ReportMessage("INTERRUPT instruction hit"); WARN_LOG(CPU,"Disable/Enable Interrupt CPU instruction"); reported = 1; } diff --git a/Core/MIPS/MIPSIntVFPU.cpp b/Core/MIPS/MIPSIntVFPU.cpp index e6242b7d7c35..1955ccb43c07 100644 --- a/Core/MIPS/MIPSIntVFPU.cpp +++ b/Core/MIPS/MIPSIntVFPU.cpp @@ -36,6 +36,7 @@ // sv.s #include "../Core.h" +#include "Core/Reporting.h" #include @@ -142,6 +143,7 @@ void ApplyPrefixST(float *v, u32 data, VectorSize size) if (regnum >= n) { ERROR_LOG(CPU, "Invalid VFPU swizzle: %08x / %d", data, size); + Reporting::ReportMessage("Invalid VFPU swizzle: %08x / %d", data, size); regnum = 0; } @@ -1822,22 +1824,26 @@ namespace MIPSInt void Int_Vlgb(u32 op) { // S & D valid + Reporting::ReportMessage("vlgb not implemented"); _dbg_assert_msg_(CPU,0,"vlgb not implemented"); } void Int_Vwbn(u32 op) { // S & D valid + Reporting::ReportMessage("vwbn not implemented"); _dbg_assert_msg_(CPU,0,"vwbn not implemented"); } void Int_Vsbn(u32 op) { + Reporting::ReportMessage("vsbn not implemented"); _dbg_assert_msg_(CPU,0,"vsbn not implemented"); } void Int_Vsbz(u32 op) { + Reporting::ReportMessage("vsbz not implemented"); _dbg_assert_msg_(CPU,0,"vsbz not implemented"); } } diff --git a/Core/MIPS/x86/CompVFPU.cpp b/Core/MIPS/x86/CompVFPU.cpp index 699b2b9730c8..86417d2b0b11 100644 --- a/Core/MIPS/x86/CompVFPU.cpp +++ b/Core/MIPS/x86/CompVFPU.cpp @@ -18,6 +18,7 @@ #include "../../MemMap.h" #include "../../Config.h" #include "../MIPSAnalyst.h" +#include "Core/Reporting.h" #include "Jit.h" #include "../MIPSVFPUUtils.h" @@ -105,6 +106,7 @@ void Jit::ApplyPrefixST(u8 *vregs, u32 prefix, VectorSize sz) { // TODO: But some ops seem to use const 0 instead? if (regnum >= n) { ERROR_LOG(CPU, "Invalid VFPU swizzle: %08x / %d", prefix, sz); + Reporting::ReportMessage("Invalid VFPU swizzle: %08x / %d", prefix, sz); regnum = 0; } MOVSS(fpr.VX(vregs[i]), fpr.V(origV[regnum])); From 6f22d6960e2ddd2a194dbcc5d56ac9c17440985d Mon Sep 17 00:00:00 2001 From: "Unknown W. Brackets" Date: Sun, 3 Mar 2013 23:50:39 -0800 Subject: [PATCH 310/347] Add some reporting for not yet done dialogs. --- Core/Dialog/PSPMsgDialog.cpp | 2 ++ Core/Dialog/PSPSaveDialog.cpp | 2 ++ 2 files changed, 4 insertions(+) diff --git a/Core/Dialog/PSPMsgDialog.cpp b/Core/Dialog/PSPMsgDialog.cpp index 23473a6fdaf6..993fdb4b8a50 100644 --- a/Core/Dialog/PSPMsgDialog.cpp +++ b/Core/Dialog/PSPMsgDialog.cpp @@ -19,6 +19,7 @@ #include "../Util/PPGeDraw.h" #include "../HLE/sceCtrl.h" #include "../Core/MemMap.h" +#include "Core/Reporting.h" #include "ChunkFile.h" PSPMsgDialog::PSPMsgDialog() @@ -53,6 +54,7 @@ int PSPMsgDialog::Init(unsigned int paramAddr) if(optionsNotCoded) { ERROR_LOG(HLE,"PSPMsgDialog options not coded : 0x%08x",optionsNotCoded); + Reporting::ReportMessage("PSPMsgDialog options not coded: 0x%08x", optionsNotCoded); } flag = 0; diff --git a/Core/Dialog/PSPSaveDialog.cpp b/Core/Dialog/PSPSaveDialog.cpp index ecb032d694ec..2849d3a59224 100644 --- a/Core/Dialog/PSPSaveDialog.cpp +++ b/Core/Dialog/PSPSaveDialog.cpp @@ -20,6 +20,7 @@ #include "../HLE/sceCtrl.h" #include "../Core/MemMap.h" #include "../Config.h" +#include "Core/Reporting.h" PSPSaveDialog::PSPSaveDialog() : PSPDialog() @@ -98,6 +99,7 @@ int PSPSaveDialog::Init(int paramAddr) default: { ERROR_LOG(HLE, "Load/Save function %d not coded. Title: %s Save: %s File: %s", param.GetPspParam()->mode, param.GetGameName(param.GetPspParam()).c_str(), param.GetGameName(param.GetPspParam()).c_str(), param.GetFileName(param.GetPspParam()).c_str()); + Reporting::ReportMessage("Load/Save function %d not coded. Title: %s Save: %s File: %s", param.GetPspParam()->mode, param.GetGameName(param.GetPspParam()).c_str(), param.GetGameName(param.GetPspParam()).c_str(), param.GetFileName(param.GetPspParam()).c_str()); param.GetPspParam()->result = 0; status = SCE_UTILITY_STATUS_INITIALIZE; display = DS_NONE; From f4bde1a263346d80add96fdff902c83072f608e0 Mon Sep 17 00:00:00 2001 From: "Unknown W. Brackets" Date: Mon, 4 Mar 2013 00:09:37 -0800 Subject: [PATCH 311/347] Android / iOS buildfix. --- Core/MIPS/ARM/ArmJit.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Core/MIPS/ARM/ArmJit.cpp b/Core/MIPS/ARM/ArmJit.cpp index 8cb068b92a97..2984a5637aea 100644 --- a/Core/MIPS/ARM/ArmJit.cpp +++ b/Core/MIPS/ARM/ArmJit.cpp @@ -357,7 +357,7 @@ void Jit::Comp_DoNothing(u32 op) { } #define _FS ((op>>11) & 0x1F) #define _FT ((op>>16) & 0x1F) #define _FD ((op>>6) & 0x1F) -#define _POS((op>>6) & 0x1F) +#define _POS ((op>>6) & 0x1F) #define _SIZE ((op>>11) & 0x1F) //memory regions: From bce3295950ea1610580a19fe375931d0c704ec5c Mon Sep 17 00:00:00 2001 From: Sacha Date: Mon, 4 Mar 2013 22:09:45 +1000 Subject: [PATCH 312/347] Fix graphical issues. DISABLE INS instruction for now. Fix OR (it was doing AND). --- Common/ArmEmitter.cpp | 2 +- Core/MIPS/ARM/ArmCompALU.cpp | 3 ++- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/Common/ArmEmitter.cpp b/Common/ArmEmitter.cpp index 88fc99529f15..d67347a1b2a9 100644 --- a/Common/ArmEmitter.cpp +++ b/Common/ArmEmitter.cpp @@ -114,7 +114,7 @@ void ARMXEmitter::ORI2R(ARMReg rd, ARMReg rs, u32 val, ARMReg scratch) ORR(rd, rs, op2); } else { MOVI2R(scratch, val); - AND(rd, rs, scratch); + ORR(rd, rs, scratch); } } diff --git a/Core/MIPS/ARM/ArmCompALU.cpp b/Core/MIPS/ARM/ArmCompALU.cpp index 1a2dba5e62c4..be06014050e5 100644 --- a/Core/MIPS/ARM/ArmCompALU.cpp +++ b/Core/MIPS/ARM/ArmCompALU.cpp @@ -351,6 +351,7 @@ namespace MIPSComp case 0x4: //ins { + DISABLE; u32 sourcemask = mask >> pos; u32 destmask = ~(sourcemask << pos); if (gpr.IsImm(rs)) @@ -374,7 +375,7 @@ namespace MIPSComp } else { gpr.MapDirtyIn(rt, rs, false); ANDI2R(R0, gpr.R(rs), sourcemask, R1); - MOV(R0, Operand2(pos, ST_LSL, gpr.R(rs))); + MOV(R0, Operand2(pos, ST_LSL, R0)); ANDI2R(gpr.R(rt), gpr.R(rt), destmask, R1); ORR(gpr.R(rt), gpr.R(rt), R0); } From d6fb8b3872fb349165de43b27677fd0470edcc23 Mon Sep 17 00:00:00 2001 From: Sacha Date: Mon, 4 Mar 2013 23:29:51 +1000 Subject: [PATCH 313/347] Deploy fonts from assets folder on Symbian. Should be copied from flash0 or from your PSP. --- Qt/PPSSPP.pro | 2 +- android/jni/NativeApp.cpp | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/Qt/PPSSPP.pro b/Qt/PPSSPP.pro index 64c09839d296..da0a91f56d68 100755 --- a/Qt/PPSSPP.pro +++ b/Qt/PPSSPP.pro @@ -61,7 +61,7 @@ mobile_platform { # Packaging symbian { deploy.pkg_prerules = "$${LITERAL_HASH}{\"PPSSPP\"}, (0xE0095B1D), 0, 6, 1, TYPE=SA" "%{\"Qtness\"}" ":\"Qtness\"" - assets.sources = ../android/assets/ui_atlas.zim ../assets/ppge_atlas.zim + assets.sources = ../android/assets/ui_atlas.zim ../assets/ppge_atlas.zim ../assets/flash assets.path = E:/PPSSPP DEPLOYMENT += deploy assets ICON = ../assets/icon.svg diff --git a/android/jni/NativeApp.cpp b/android/jni/NativeApp.cpp index 8e9e017baa64..857c6cbddb68 100644 --- a/android/jni/NativeApp.cpp +++ b/android/jni/NativeApp.cpp @@ -104,7 +104,7 @@ class NativeHost : public Host virtual void ShutdownGL() {} virtual void InitSound(PMixer *mixer); - virtual void UpdateSound() {}; + virtual void UpdateSound() {} virtual void ShutdownSound(); // this is sent from EMU thread! Make sure that Host handles it properly! From 47db8612ca3bcced96159d73b787238e50ee3b1b Mon Sep 17 00:00:00 2001 From: sum2012 Date: Mon, 4 Mar 2013 22:39:42 +0800 Subject: [PATCH 314/347] Change default to true --- Core/Config.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Core/Config.cpp b/Core/Config.cpp index 415b559d99a3..8c93ea31c5b7 100644 --- a/Core/Config.cpp +++ b/Core/Config.cpp @@ -70,7 +70,7 @@ void CConfig::Load(const char *iniFileName) graphics->Get("SSAA", &SSAntiAliasing, 0); graphics->Get("VBO", &bUseVBO, false); graphics->Get("FrameSkip", &iFrameSkip, 0); - graphics->Get("UseMediaEngine", &bUseMediaEngine, false); + graphics->Get("UseMediaEngine", &bUseMediaEngine, true); #ifdef USING_GLES2 graphics->Get("AnisotropyLevel", &iAnisotropyLevel, 0); #else From 20fe29a05dc72ca1d5355648e4ada27a6736f5f5 Mon Sep 17 00:00:00 2001 From: Sacha Date: Tue, 5 Mar 2013 01:09:35 +1000 Subject: [PATCH 315/347] Automatically generate translations in Qt. --- Qt/PPSSPP.pro | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git a/Qt/PPSSPP.pro b/Qt/PPSSPP.pro index da0a91f56d68..935912f4215f 100755 --- a/Qt/PPSSPP.pro +++ b/Qt/PPSSPP.pro @@ -29,8 +29,6 @@ linux:!mobile_platform { } } -TRANSLATIONS = $$files(languages/ppsspp_*.ts) - # Main SOURCES += ../native/base/QtMain.cpp HEADERS += ../native/base/QtMain.h @@ -58,6 +56,17 @@ mobile_platform { INCLUDEPATH += ../Qt } +# Translations +TRANSLATIONS = $$files(languages/ppsspp_*.ts) + +lang.name = lrelease ${QMAKE_FILE_IN} +lang.input = TRANSLATIONS +lang.output = ${QMAKE_FILE_PATH}/${QMAKE_FILE_BASE}.qm +lang.commands = $$[QT_INSTALL_BINS]/lrelease ${QMAKE_FILE_IN} +lang.CONFIG = no_link +QMAKE_EXTRA_COMPILERS += lang +PRE_TARGETDEPS += compiler_lang_make_all + # Packaging symbian { deploy.pkg_prerules = "$${LITERAL_HASH}{\"PPSSPP\"}, (0xE0095B1D), 0, 6, 1, TYPE=SA" "%{\"Qtness\"}" ":\"Qtness\"" From 1089a31a456ac66cc78cd1c2107d571be342d98e Mon Sep 17 00:00:00 2001 From: Sacha Date: Tue, 5 Mar 2013 02:58:51 +1000 Subject: [PATCH 316/347] Armjit: add reverse bit instruction. --- Common/ArmEmitter.cpp | 8 ++++++-- Common/ArmEmitter.h | 1 + Core/MIPS/ARM/ArmCompALU.cpp | 26 ++++++++++++++------------ 3 files changed, 21 insertions(+), 14 deletions(-) diff --git a/Common/ArmEmitter.cpp b/Common/ArmEmitter.cpp index d67347a1b2a9..8aa6a47a7347 100644 --- a/Common/ArmEmitter.cpp +++ b/Common/ArmEmitter.cpp @@ -564,9 +564,13 @@ void ARMXEmitter::SXTAH(ARMReg dest, ARMReg src, ARMReg op2, u8 rotation) // information Write32(condition | (0x6B << 20) | (src << 16) | (dest << 12) | (rotation << 10) | (7 << 4) | op2); } -void ARMXEmitter::REV (ARMReg dest, ARMReg src ) +void ARMXEmitter::RBIT(ARMReg dest, ARMReg src) { - Write32(condition | (107 << 20) | (15 << 16) | (dest << 12) | (243 << 4) | src); + Write32(condition | (0x6F << 20) | (0xF << 16) | (dest << 12) | (0xF3 << 4) | src); +} +void ARMXEmitter::REV (ARMReg dest, ARMReg src) +{ + Write32(condition | (0x6B << 20) | (0xF << 16) | (dest << 12) | (0xF3 << 4) | src); } void ARMXEmitter::REV16(ARMReg dest, ARMReg src) { diff --git a/Common/ArmEmitter.h b/Common/ArmEmitter.h index db79c787c884..cf55c46cf3ae 100644 --- a/Common/ArmEmitter.h +++ b/Common/ArmEmitter.h @@ -446,6 +446,7 @@ class ARMXEmitter void LSLS(ARMReg dest, ARMReg src, ARMReg op2); void SBC (ARMReg dest, ARMReg src, Operand2 op2); void SBCS(ARMReg dest, ARMReg src, Operand2 op2); + void RBIT(ARMReg dest, ARMReg src); void REV (ARMReg dest, ARMReg src); void REV16 (ARMReg dest, ARMReg src); void RSC (ARMReg dest, ARMReg src, Operand2 op2); diff --git a/Core/MIPS/ARM/ArmCompALU.cpp b/Core/MIPS/ARM/ArmCompALU.cpp index be06014050e5..0a7b4c602f21 100644 --- a/Core/MIPS/ARM/ArmCompALU.cpp +++ b/Core/MIPS/ARM/ArmCompALU.cpp @@ -421,20 +421,22 @@ namespace MIPSComp { // http://graphics.stanford.edu/~seander/bithacks.html#ReverseParallel u32 v = gpr.GetImm(rt); - // swap odd and even bits - v = ((v >> 1) & 0x55555555) | ((v & 0x55555555) << 1); - // swap consecutive pairs - v = ((v >> 2) & 0x33333333) | ((v & 0x33333333) << 2); - // swap nibbles ... - v = ((v >> 4) & 0x0F0F0F0F) | ((v & 0x0F0F0F0F) << 4); - // swap bytes - v = ((v >> 8) & 0x00FF00FF) | ((v & 0x00FF00FF) << 8); - // swap 2-byte long pairs - v = ( v >> 16 ) | ( v << 16); + v = ((v >> 1) & 0x55555555) | ((v & 0x55555555) << 1); // odd<->even + v = ((v >> 2) & 0x33333333) | ((v & 0x33333333) << 2); // pair<->pair + v = ((v >> 4) & 0x0F0F0F0F) | ((v & 0x0F0F0F0F) << 4); // nibb<->nibb + v = ((v >> 8) & 0x00FF00FF) | ((v & 0x00FF00FF) << 8); // byte<->byte + v = ( v >> 16 ) | ( v << 16); // hword<->hword gpr.SetImm(rd, v); - break; + return; } - // Intentional fall-through. + + if (cpu_info.bArmV7) { + gpr.MapDirtyIn(rd, rt); + RBIT(rd, rt); + } else { + Comp_Generic(op); + } + break; default: Comp_Generic(op); return; From d5feb4d3ff8f814603d5d88fabf29901cad32960 Mon Sep 17 00:00:00 2001 From: Sacha Date: Tue, 5 Mar 2013 03:13:33 +1000 Subject: [PATCH 317/347] Quick build fix --- Core/MIPS/ARM/ArmCompALU.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Core/MIPS/ARM/ArmCompALU.cpp b/Core/MIPS/ARM/ArmCompALU.cpp index 0a7b4c602f21..2bf6a9a99956 100644 --- a/Core/MIPS/ARM/ArmCompALU.cpp +++ b/Core/MIPS/ARM/ArmCompALU.cpp @@ -432,7 +432,7 @@ namespace MIPSComp if (cpu_info.bArmV7) { gpr.MapDirtyIn(rd, rt); - RBIT(rd, rt); + RBIT(gpr.R(rd), gpr.R(rt)); } else { Comp_Generic(op); } From bf23c6f5e1eb978108490e1dfe0e6a80ebe9ae22 Mon Sep 17 00:00:00 2001 From: Henrik Rydgard Date: Mon, 4 Mar 2013 19:52:10 +0100 Subject: [PATCH 318/347] Turn down sceGeContinue and sceGeBreak log level. We know them and they're mostly used by our own debug overlay. --- Core/HLE/sceGe.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Core/HLE/sceGe.cpp b/Core/HLE/sceGe.cpp index 11ea18c71100..43bdbccf5af0 100644 --- a/Core/HLE/sceGe.cpp +++ b/Core/HLE/sceGe.cpp @@ -220,7 +220,7 @@ u32 sceGeDrawSync(u32 mode) int sceGeContinue() { - ERROR_LOG(HLE, "UNIMPL sceGeContinue"); + DEBUG_LOG(HLE, "UNIMPL sceGeContinue"); // no arguments return 0; } @@ -228,7 +228,7 @@ int sceGeContinue() int sceGeBreak(u32 mode) { //mode => 0 : current dlist 1: all drawing - ERROR_LOG(HLE, "UNIMPL sceGeBreak(mode=%d)", mode); + DEBUG_LOG(HLE, "UNIMPL sceGeBreak(mode=%d)", mode); return 0; } From d4603136f06ef9febdbf3015df0f4198d72ce407 Mon Sep 17 00:00:00 2001 From: Henrik Rydgard Date: Mon, 4 Mar 2013 22:15:39 +0100 Subject: [PATCH 319/347] Minor stuff: Fake-implement sceKernelReferThreadProfiler, make sure GPU frame dump logging gets output by not sending it to G3D. --- Core/HLE/sceKernel.cpp | 20 +++++++++++++------- Core/Util/PPGeDraw.cpp | 4 ++++ GPU/GLES/DisplayListInterpreter.cpp | 2 +- GPU/GPUCommon.cpp | 2 +- 4 files changed, 19 insertions(+), 9 deletions(-) diff --git a/Core/HLE/sceKernel.cpp b/Core/HLE/sceKernel.cpp index 89f0cf39b245..117e5a8c0742 100644 --- a/Core/HLE/sceKernel.cpp +++ b/Core/HLE/sceKernel.cpp @@ -524,20 +524,26 @@ struct SystemStatus { SceUInt perfcounter3; }; -u32 sceKernelReferSystemStatus(u32 statusPtr) -{ +int sceKernelReferSystemStatus(u32 statusPtr) { DEBUG_LOG(HLE, "sceKernelReferSystemStatus(%08x)", statusPtr); if (Memory::IsValidAddress(statusPtr)) { SystemStatus status; memset(&status, 0, sizeof(SystemStatus)); status.size = sizeof(SystemStatus); + // TODO: Fill in the struct! Memory::WriteStruct(statusPtr, &status); } return 0; } -u32 sceKernelReferGlobalProfiler(u32 statusPtr) { - DEBUG_LOG(HLE, "sceKernelReferGlobalProfiler(%08x)", statusPtr); +int sceKernelReferThreadProfiler(u32 statusPtr) { + ERROR_LOG(HLE, "UNIMPL sceKernelReferThreadProfiler(%08x)", statusPtr); + // Ignore for now + return 0; +} + +int sceKernelReferGlobalProfiler(u32 statusPtr) { + DEBUG_LOG(HLE, "UNIMPL sceKernelReferGlobalProfiler(%08x)", statusPtr); // Ignore for now return 0; } @@ -615,9 +621,9 @@ const HLEFunction ThreadManForUser[] = {0xdb738f35,WrapI_U,"sceKernelGetSystemTime"}, {0x369ed59d,WrapU_V,"sceKernelGetSystemTimeLow"}, - {0x8218B4DD,&WrapU_U,"sceKernelReferGlobalProfiler"}, - {0x627E6F3A,&WrapU_U,"sceKernelReferSystemStatus"}, - {0x64D4540E,0,"sceKernelReferThreadProfiler"}, + {0x8218B4DD,WrapI_U,"sceKernelReferGlobalProfiler"}, + {0x627E6F3A,WrapI_U,"sceKernelReferSystemStatus"}, + {0x64D4540E,WrapI_U,"sceKernelReferThreadProfiler"}, //Fifa Street 2 uses alarms {0x6652b8ca,WrapI_UUU,"sceKernelSetAlarm"}, diff --git a/Core/Util/PPGeDraw.cpp b/Core/Util/PPGeDraw.cpp index fe84cd713487..c920d73018cb 100644 --- a/Core/Util/PPGeDraw.cpp +++ b/Core/Util/PPGeDraw.cpp @@ -199,15 +199,19 @@ void PPGeBegin() dataWritePtr = dataPtr; // Set up the correct states for UI drawing + WriteCmd(GE_CMD_OFFSETADDR, 0); WriteCmd(GE_CMD_ALPHABLENDENABLE, 1); WriteCmd(GE_CMD_BLENDMODE, 2 | (3 << 4)); WriteCmd(GE_CMD_ALPHATESTENABLE, 0); WriteCmd(GE_CMD_COLORTESTENABLE, 0); WriteCmd(GE_CMD_ZTESTENABLE, 0); + WriteCmd(GE_CMD_LIGHTINGENABLE, 0); WriteCmd(GE_CMD_FOGENABLE, 0); WriteCmd(GE_CMD_STENCILTESTENABLE, 0); WriteCmd(GE_CMD_CULLFACEENABLE, 0); WriteCmd(GE_CMD_CLEARMODE, 0); // Normal mode + WriteCmd(GE_CMD_MASKRGB, 0); + WriteCmd(GE_CMD_MASKALPHA, 0); PPGeSetDefaultTexture(); diff --git a/GPU/GLES/DisplayListInterpreter.cpp b/GPU/GLES/DisplayListInterpreter.cpp index cbbaca510da8..7a6e6545f9eb 100644 --- a/GPU/GLES/DisplayListInterpreter.cpp +++ b/GPU/GLES/DisplayListInterpreter.cpp @@ -296,7 +296,7 @@ void GLES_GPU::PreExecuteOp(u32 op, u32 diff) { if (flushBeforeCommand_[cmd] == 1 || (diff && flushBeforeCommand_[cmd] == 2)) { if (dumpThisFrame_) { - NOTICE_LOG(G3D, "================ FLUSH ================"); + NOTICE_LOG(HLE, "================ FLUSH ================"); } transformDraw_.Flush(); } diff --git a/GPU/GPUCommon.cpp b/GPU/GPUCommon.cpp index 8d710972ff5f..5c5f98b38b6d 100644 --- a/GPU/GPUCommon.cpp +++ b/GPU/GPUCommon.cpp @@ -107,7 +107,7 @@ bool GPUCommon::InterpretList(DisplayList &list) if (dumpThisFrame_) { char temp[256]; GeDisassembleOp(list.pc, op, prev, temp); - NOTICE_LOG(G3D, "%s", temp); + NOTICE_LOG(HLE, "%s", temp); } gstate.cmdmem[cmd] = op; // crashes if I try to put the whole op there?? From cd584df82167002ef72b8231fa6e54c4183d4f1b Mon Sep 17 00:00:00 2001 From: "Unknown W. Brackets" Date: Mon, 4 Mar 2013 14:02:15 -0800 Subject: [PATCH 320/347] Fix git-version-gen.cmd when git.cmd is used. --- Windows/git-version-gen.cmd | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/Windows/git-version-gen.cmd b/Windows/git-version-gen.cmd index 553407fb9dfc..eaa42ba57dd2 100644 --- a/Windows/git-version-gen.cmd +++ b/Windows/git-version-gen.cmd @@ -22,12 +22,11 @@ set GIT_VERSION_FILE=%~p0..\git-version.cpp if not defined GIT ( set GIT="git" ) - -%GIT% describe > NUL 2> NUL +call %GIT% describe > NUL 2> NUL if errorlevel 1 ( echo Git not on path, trying default Msysgit paths set GIT="%ProgramFiles(x86)%\Git\bin\git.exe" - !GIT! describe > NUL 2> NUL + call !GIT! describe > NUL 2> NUL if errorlevel 1 ( set GIT="%ProgramFiles%\Git\bin\git.exe" ) @@ -41,7 +40,7 @@ if exist "%GIT_VERSION_FILE%" ( ) ) -%GIT% describe --always > NUL 2> NUL +call %GIT% describe --always > NUL 2> NUL if errorlevel 1 ( echo Unable to update git-version.cpp, git not found. echo If you don't want to add it to your path, set the GIT environment variable. @@ -52,7 +51,7 @@ if errorlevel 1 ( goto done ) -for /F %%I IN ('%GIT% describe --always') do set GIT_VERSION=%%I +for /F %%I IN ('call %GIT% describe --always') do set GIT_VERSION=%%I rem // Don't modify the file if it already has the current version. if exist "%GIT_VERSION_FILE%" ( From 6e537fc18cd2ec52d4e58bbaaf81dae22a6cf7ee Mon Sep 17 00:00:00 2001 From: Thiago Kenji Okada Date: Mon, 4 Mar 2013 19:11:50 -0300 Subject: [PATCH 321/347] Add Portuguese (Brazillian) translation. --- Qt/languages/ppsspp_pt-br.ts | 1013 ++++++++++++++++++++++++++++++++++ 1 file changed, 1013 insertions(+) create mode 100644 Qt/languages/ppsspp_pt-br.ts diff --git a/Qt/languages/ppsspp_pt-br.ts b/Qt/languages/ppsspp_pt-br.ts new file mode 100644 index 000000000000..6176bbfb0cb7 --- /dev/null +++ b/Qt/languages/ppsspp_pt-br.ts @@ -0,0 +1,1013 @@ + + + + + Controls + + + Controls + Controls window title + Controles + + + + CtrlDisAsmView + + + Copy &address + Copiar &endereΓ§o + + + + Copy instruction (&hex) + Copiar instrução (&hex) + + + + Copy instruction (&disasm) + Copiar instrução (&disam) + + + + &Run to here + &Rodar aqui + + + + &Set Next Statement + + + + + &Toggle breakpoint + &Ativar breakpoint + + + + &Follow branch + &Seguir caminho + + + + Go to in &Memory View + VΓ΅ para o Visualizador de &MemΓ³ria + + + + &Rename function... + &Renomear função... + + + + New function name + Novo nome de função + + + + New function name: + Novo nome de função: + + + + CtrlMemView + + + Go to in &disasm + VΓ΅ para &disasm + + + + &Copy value + &Copiar valor + + + + Dump... + Despejar... + + + + CtrlRegisterList + + + Go to in &memory view + VΓ΅ para o visualizador de &memΓ³ria + + + + Go to in &disasm + VΓ΅ para o &disasm + + + + &Copy value + &Copiar valor + + + + C&hange... + &Trocar... + + + + Set new value + Setar novo valor + + + + Set new value: + Setar novo valor: + + + + Debugger_Disasm + + + Disassembler + Window title + + + + + Ctr: + + + + + &Go to + &VΓ΅ para + + + + &PC + + + + + &LR + + + + + Show VFPU + Mostrar VFPU + + + + Regs + + + + + Funcs + + + + + &Go + &Ir + + + + Stop + Parar + + + + Step &Into + + + + + Step &Over + + + + + S&kip + P&ular + + + + Next &HLE + PrΓ³ximo &HLE + + + + Breakpoints + + + + + Address + EndereΓ§os + + + + Clear All + Limpar Tudo + + + + Callstack + + + + + Display Lists + Mostrar Listas + + + + + Id + + + + + + Status + Estado + + + + Start Address + EndereΓ§o inicial + + + + Current Address + EndereΓ§o atual + + + + Run + Rodar + + + + Step + Passo + + + + Threads + + + + + Name + Nome + + + + Current PC + PC corrente + + + + Entry point + Ponto de entrada + + + + Remove breakpoint + Remover breakpoint + + + + Go to entry point + Ir para ponto de entrada + + + + Running + Rodando + + + + Wait + Esperando + + + + Suspend + Suspenso + + + + Show code + Mostrar cΓ³digo + + + + Debugger_Memory + + + Dialog + DiΓ΅logo + + + + Goto: + VΓ΅ para: + + + + Mode + Modo + + + + Normal + + + + + Symbols + SΓ­mbolos + + + + Memory Viewer - %1 + Visualizador de MemΓ³ria - %1 + + + + Debugger_VFPU + + + VFPU + + + + + Float + + + + + HalfFloat + + + + + Hex + + + + + Bytes + + + + + Shorts + + + + + Ints + + + + + GamePadDialog + + + Gamepad Configuration + Configuração do Gamepad + + + + GamePad List + Lista de Gamepads + + + + Refresh + Atualizar + + + + Select + Selecionar + + + + Gamepad Values : + Valores de Gamepad : + + + + TextLabel + + + + + Assign Gamepad input + Atribuir entrada do Gamepad + + + + to PSP button/axis + para o botΓ£o/eixo do PSP + + + + Assign + Atribuir + + + + Press buttons on your gamePad to verify mapping : + Pressione botΓµes no seu Gamepad para verificar o mapeamento : + + + + + <b>No gamepad</b> + Sem Gamepad + + + + <b>Unknown gamepad</b> + Gamepad desconhecido + + + + Buttons + BotΓµes + + + + + Button %1 + BotΓµes %1 + + + + Axes + Eixos + + + + %1 Neg + + + + + Axes %1 Neg + Eixos %1 Neg + + + + %1 Pos + + + + + Axes %1 Pos + Eixos %1 Pos + + + + Hats + + + + + <b>Current gamepad: %1</b> + <b>Gamepad atual: %1</b> + + + + MainWindow + + + PPSSPP + + + + + &File + &Arquivo + + + + &Emulation + &Emulação + + + + Debu&g + + + + + &Options + &Opções + + + + G3D + + + + + HLE + + + + + Default + PadrΓ£o + + + + Lo&g Levels + NΓ­vel de Lo&g + + + + &Language + &Linguagem + + + + &Video + &VΓ­deo + + + + &Anisotropic filtering + Filtragem &AnisotrΓ³pica + + + + &Zoom + + + + + Co&ntrols + Co&ntroles + + + + &Core + &NΓΊcleo + + + + &Help + Aj&uda + + + + &Open... + &Abrir... + + + + &Close + &Fechar + + + + - + + + + + Quickload state + Carregar estado rΓ΅pido + + + + F4 + + + + + Quicksave state + Salvar estado rΓ΅pido + + + + F2 + + + + + &Load State File... + &Carregar estado do arquivo... + + + + &Save State File... + &Salvar estado do arquivo... + + + + E&xit + Sai&r + + + + &Run + &Rodar + + + + F7 + + + + + &Pause + &Pausar + + + + F8 + + + + + R&eset + R&esetar + + + + &Interpreter + &Interpretador + + + + &Slightly Faster Interpreter + Interpretador um &pouco mais rΓ΅pido + + + + &Dynarec + Recompilador &dinΓΆmico + + + + Load &Map File... + Carregar &mapa no arquivo... + + + + &Save Map File... + &Salvar mapa no arquivo... + + + + &Reset Symbol Table + &Reiniciar tabela de sΓ­mbolos + + + + &Disassembly + + + + + Ctrl+D + L + + + + &Log Console + Console de &Logs + + + + Ctrl+L + L + + + + Memory &View... + &Visualizador de MemΓ³ria... + + + + Ctrl+M + + + + + &Keyboard + &Teclado + + + + &Toggle fullscreen + Tela &cheia + + + + Show &debug statistics + Mostrar estatΓ­sticas de &debug + + + + I&gnore illegal reads/writes + I&gnorar leituras/escritas ilegais + + + + &Gamepad + + + + + Run on loa&d + Rodar ao &carregar + + + + Show &FPS counter + Mostrar contador de &FPS + + + + S&tretch to display + Es&ticar tela + + + + &Sound emulation + Emular &som + + + + F12 + + + + + &Buffered Rendering + Renderização com &buffer + + + + F5 + + + + + &Hardware Transform + Transformação em &Hardware + + + + F6 + + + + + &Linear Filtering + Filtragem &Linear + + + + &Wireframe (experimental) + &Wireframe (experimental) + + + + &Display Raw Framebuffer + Mostrar framebuffer &bruto + + + + Screen &1x + &1x Tela' + + + + Ctrl+1 + + + + + Screen &2x + &2x Tela + + + + Ctrl+2 + + + + + Screen &3x + &3x Tela + + + + Ctrl+3 + + + + + Screen &4x + &4x Tela + + + + Ctrl+4 + + + + + &Fast Memory (dynarec, unstable) + MemΓ³ria &rΓ΅pida (recompilador dinΓΆmico, instΓ΅vel) + + + + &Go to http://www.ppsspp.org/ + &Ir para http://www.ppsspp.org/ + + + + &About PPSSPP... + &Sobre o PPSSPP... + + + + &Use VBO + &Usar VBO + + + + + + Debug + + + + + + + Warning + Atenção + + + + + + Error + Erro + + + + + + Info + Informação + + + + D&ump next frame to log + D&espejar o prΓ³ximo frame no log + + + + &Vertex Cache + Cache do &Vertex + + + + Memory View Texture... + Ver texturas na memΓ³ria... + + + + Simple 2xAA + Simples 2xAA + + + + Off + Desligar + + + + 2x + + + + + 4x + + + + + 8x + + + + + 16x + + + + + No translations + Sem tradução + + + + gamepadMapping + + + Cross + X + + + + Circle + CΓ­rculo + + + + Square + Quadrado + + + + Triangle + TriΓΆngulo + + + + Left Trigger + Gatilho Esquerdo + + + + Right Trigger + Gatilho Direito + + + + Start + + + + + Select + + + + + Up + Cima + + + + Down + Baixo + + + + Left + Esquerda + + + + Right + Direita + + + + Home + + + + + Stick left + AnalΓ³gico Esquerda + + + + Stick right + AnalΓ³gico Direita + + + + Stick up + AnalΓ³gico Cima + + + + Stick bottom + AnalΓ³gico Baixo + + + From f406ad701c06c040174718ea8405402b35637d8b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marcin=20Miko=C5=82ajczyk?= Date: Mon, 4 Mar 2013 23:39:59 +0100 Subject: [PATCH 322/347] Fix sceKernelReferThreadProfiler types, implement scePowerGetPllClockFreqFloat --- Core/HLE/sceKernel.cpp | 38 ++++++++++++++++++++++++++++++++++---- Core/HLE/scePower.cpp | 7 ++++++- 2 files changed, 40 insertions(+), 5 deletions(-) diff --git a/Core/HLE/sceKernel.cpp b/Core/HLE/sceKernel.cpp index 117e5a8c0742..72d86b295286 100644 --- a/Core/HLE/sceKernel.cpp +++ b/Core/HLE/sceKernel.cpp @@ -536,9 +536,39 @@ int sceKernelReferSystemStatus(u32 statusPtr) { return 0; } -int sceKernelReferThreadProfiler(u32 statusPtr) { - ERROR_LOG(HLE, "UNIMPL sceKernelReferThreadProfiler(%08x)", statusPtr); - // Ignore for now +struct DebugProfilerRegs { + u32 enable; + u32 systemck; + u32 cpuck; + u32 internal; + u32 memory; + u32 copz; + u32 vfpu; + u32 sleep; + u32 bus_access; + u32 uncached_load; + u32 uncached_store; + u32 cached_load; + u32 cached_store; + u32 i_miss; + u32 d_miss; + u32 d_writeback; + u32 cop0_inst; + u32 fpu_inst; + u32 vfpu_inst; + u32 local_bus; +}; + +u32 sceKernelReferThreadProfiler() { + ERROR_LOG(HLE, "FAKE sceKernelReferThreadProfiler()"); + + u32 size = sizeof(DebugProfilerRegs); + u32 ptr = kernelMemory.Alloc(size, true); + if (ptr) { + Memory::Memset(ptr, (u8)0, sizeof(DebugProfilerRegs)); + return ptr; + } + return 0; } @@ -623,7 +653,7 @@ const HLEFunction ThreadManForUser[] = {0x8218B4DD,WrapI_U,"sceKernelReferGlobalProfiler"}, {0x627E6F3A,WrapI_U,"sceKernelReferSystemStatus"}, - {0x64D4540E,WrapI_U,"sceKernelReferThreadProfiler"}, + {0x64D4540E,WrapU_V,"sceKernelReferThreadProfiler"}, //Fifa Street 2 uses alarms {0x6652b8ca,WrapI_UUU,"sceKernelSetAlarm"}, diff --git a/Core/HLE/scePower.cpp b/Core/HLE/scePower.cpp index 4659fded8e56..1061004bc131 100644 --- a/Core/HLE/scePower.cpp +++ b/Core/HLE/scePower.cpp @@ -248,6 +248,11 @@ u32 scePowerGetPllClockFrequencyInt() { return pllFreq; } +float scePowerGetPllClockFrequencyFloat() { + INFO_LOG(HLE, "%f=scePowerGetPllClockFrequencyFloat()", (float)pllFreq); + return (float) pllFreq; +} + u32 scePowerGetBusClockFrequencyInt() { INFO_LOG(HLE,"%i=scePowerGetBusClockFrequencyInt()", busFreq); return busFreq; @@ -305,7 +310,7 @@ static const HLEFunction scePower[] = { {0x9BADB3EB,0,"scePowerGetBusClockFrequencyFloat"}, {0x737486F2,WrapU_UUU,"scePowerSetClockFrequency"}, {0x34f9c463,WrapU_V,"scePowerGetPllClockFrequencyInt"}, - {0xea382a27,0,"scePowerGetPllClockFrequencyFloat"}, + {0xea382a27,WrapF_V,"scePowerGetPllClockFrequencyFloat"}, {0xebd177d6,WrapU_UUU,"scePower_driver_EBD177D6"}, //TODO: used in a few places, jpcsp says is the same as scePowerSetClockFrequency {0x469989ad,WrapU_UUU,"scePower_469989ad"}, // This is also the same as SetClockFrequency {0xa85880d0,WrapU_V,"scePower_a85880d0_IsPSPNonFat"}, From 062c975b469ba944f99a94d0a705a803de757378 Mon Sep 17 00:00:00 2001 From: Henrik Rydgard Date: Mon, 4 Mar 2013 23:25:44 +0100 Subject: [PATCH 323/347] Ignore cache function 24. --- Core/MIPS/MIPSInt.cpp | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/Core/MIPS/MIPSInt.cpp b/Core/MIPS/MIPSInt.cpp index 5310a95cb91a..8d423db81f3a 100644 --- a/Core/MIPS/MIPSInt.cpp +++ b/Core/MIPS/MIPSInt.cpp @@ -150,6 +150,10 @@ namespace MIPSInt // It appears that a cache line is 0x40 (64) bytes. switch (func) { + case 24: + // "Create Dirty Exclusive" - for avoiding a cacheline fill before writing to it. + // Will cause garbage on the real machine so we just ignore it, the app will overwrite the cacheline. + break; case 25: // Hit Invalidate - zaps the line if present in cache. Should not writeback???? scary. // No need to do anything. break; From 3714eebbbef1483b7f291dac2f42677644799971 Mon Sep 17 00:00:00 2001 From: Henrik Rydgard Date: Mon, 4 Mar 2013 23:34:17 +0100 Subject: [PATCH 324/347] Actually register scePspNpDrm_user --- Core/Core.vcxproj | 2 ++ Core/Core.vcxproj.filters | 6 ++++ Core/HLE/HLETables.cpp | 1 + Core/HLE/sceKernel.cpp | 1 + Core/HLE/scePspNpDrm_user.cpp | 2 ++ Core/MIPS/ARM/ArmCompVFPU.cpp | 61 +++++++++++++++++++++-------------- 6 files changed, 48 insertions(+), 25 deletions(-) diff --git a/Core/Core.vcxproj b/Core/Core.vcxproj index 80a43f7c8cd0..e12e1fe1069f 100644 --- a/Core/Core.vcxproj +++ b/Core/Core.vcxproj @@ -197,6 +197,7 @@ + @@ -367,6 +368,7 @@ + diff --git a/Core/Core.vcxproj.filters b/Core/Core.vcxproj.filters index 1a71c8cb4f84..a063ba33d9bc 100644 --- a/Core/Core.vcxproj.filters +++ b/Core/Core.vcxproj.filters @@ -386,6 +386,9 @@ Core + + HLE\Libraries + @@ -710,6 +713,9 @@ Core + + HLE\Libraries + diff --git a/Core/HLE/HLETables.cpp b/Core/HLE/HLETables.cpp index bd2302fa58c1..1086f2a5d577 100644 --- a/Core/HLE/HLETables.cpp +++ b/Core/HLE/HLETables.cpp @@ -247,6 +247,7 @@ void RegisterAllModules() { Register_sceVaudio(); Register_sceUsb(); Register_sceChnnlsv(); + Register_sceNpDrm(); for (int i = 0; i < numModules; i++) { diff --git a/Core/HLE/sceKernel.cpp b/Core/HLE/sceKernel.cpp index 72d86b295286..0a8edba0be83 100644 --- a/Core/HLE/sceKernel.cpp +++ b/Core/HLE/sceKernel.cpp @@ -109,6 +109,7 @@ void __KernelInit() __ImposeInit(); __UsbInit(); __FontInit(); + SaveState::Init(); // Must be after IO, as it may create a directory // "Internal" PSP libraries diff --git a/Core/HLE/scePspNpDrm_user.cpp b/Core/HLE/scePspNpDrm_user.cpp index f47f4e56a0c7..a9086911a4a1 100644 --- a/Core/HLE/scePspNpDrm_user.cpp +++ b/Core/HLE/scePspNpDrm_user.cpp @@ -65,4 +65,6 @@ const HLEFunction sceNpDrm[] = void Register_sceNpDrm() { RegisterModule("sceNpDrm", ARRAY_SIZE(sceNpDrm), sceNpDrm); + RegisterModule("scePspNpDrm_user", ARRAY_SIZE(sceNpDrm), sceNpDrm); } + \ No newline at end of file diff --git a/Core/MIPS/ARM/ArmCompVFPU.cpp b/Core/MIPS/ARM/ArmCompVFPU.cpp index 1dbeac7a6d68..8a0dc74d26a2 100644 --- a/Core/MIPS/ARM/ArmCompVFPU.cpp +++ b/Core/MIPS/ARM/ArmCompVFPU.cpp @@ -41,7 +41,6 @@ namespace MIPSComp { - // Vector regs can overlap in all sorts of swizzled ways. // This does allow a single overlap in sregs[i]. bool IsOverlapSafeAllowS(int dreg, int di, int sn, u8 sregs[], int tn = 0, u8 tregs[] = NULL) @@ -370,8 +369,8 @@ namespace MIPSComp void Jit::Comp_VecDo3(u32 op) { - DISABLE; // Still buggy - + CONDITIONAL_DISABLE; + DISABLE; // WARNING: No prefix support! if (js.MayHavePrefix()) { @@ -383,12 +382,6 @@ namespace MIPSComp int vd = _VD; int vs = _VS; int vt = _VT; - VectorSize sz = GetVecSize(op); - - u8 sregs[4], tregs[4], dregs[4]; - GetVectorRegs(sregs, sz, vs); - GetVectorRegs(tregs, sz, vt); - GetVectorRegs(dregs, sz, vd); void (ARMXEmitter::*triop)(ARMReg, ARMReg, ARMReg) = NULL; switch (op >> 26) @@ -417,30 +410,48 @@ namespace MIPSComp break; } - if (triop == NULL) - { - Comp_Generic(op); - js.EatPrefix(); - return; + if (!triop) { + DISABLE; } + VectorSize sz = GetVecSize(op); int n = GetNumVectorElements(sz); - fpr.MapRegsV(sregs, sz, 0); - fpr.MapRegsV(tregs, sz, 0); - for (int i = 0; i < n; ++i) { - fpr.MapReg(TEMP0 + i); - (this->*triop)(fpr.R(TEMP0 + i), fpr.V(sregs[i]), fpr.V(tregs[i])); - fpr.ReleaseSpillLock(sregs[i]); - fpr.ReleaseSpillLock(tregs[i]); + u8 sregs[4], tregs[4], dregs[4]; + GetVectorRegsPrefixS(sregs, sz, _VS); + GetVectorRegsPrefixT(tregs, sz, _VT); + GetVectorRegsPrefixD(dregs, sz, _VD); + + MIPSReg tempregs[4]; + for (int i = 0; i < n; i++) { + if (!IsOverlapSafeAllowS(dregs[i], i, n, sregs, n, tregs)) { + tempregs[i] = fpr.GetTempV(); + } else { + fpr.MapRegV(dregs[i], (dregs[i] == sregs[i] || dregs[i] == tregs[i] ? 0 : MAP_NOINIT) | MAP_DIRTY); + tempregs[i] = dregs[i]; + } } - fpr.MapRegsV(dregs, sz, MAP_DIRTY | MAP_NOINIT); - // TODO: Can avoid this when no overlap + for (int i = 0; i < n; i++) { - VMOV(fpr.V(dregs[i]), fpr.R(TEMP0 + i)); + fpr.SpillLockV(sregs[i]); + fpr.SpillLockV(tregs[i]); + fpr.MapRegV(sregs[i]); + fpr.MapRegV(tregs[i]); + fpr.MapRegV(tempregs[i]); + (this->*triop)(fpr.V(tempregs[i]), fpr.V(sregs[i]), fpr.V(tregs[i])); + fpr.ReleaseSpillLockV(sregs[i]); + fpr.ReleaseSpillLockV(tregs[i]); } - fpr.ReleaseSpillLocks(); + fpr.MapRegsV(dregs, sz, MAP_DIRTY); + for (int i = 0; i < n; i++) { + if (dregs[i] != tempregs[i]) + VMOV(fpr.V(dregs[i]), fpr.V(tempregs[i])); + } + ApplyPrefixD(dregs, sz); + + fpr.ReleaseSpillLocks(); + js.EatPrefix(); } From 600b89e843f5748ab72ac8ea2e11bc380e453e96 Mon Sep 17 00:00:00 2001 From: "Unknown W. Brackets" Date: Mon, 4 Mar 2013 14:50:04 -0800 Subject: [PATCH 325/347] Update native with Windows XP crashfix. Fixes #861. --- native | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/native b/native index f26d95dba1ab..4ee889c0255f 160000 --- a/native +++ b/native @@ -1 +1 @@ -Subproject commit f26d95dba1abc7d3936b929ab01aafff40555c93 +Subproject commit 4ee889c0255f0dbd9066c7a624cc03b625ec48fe From e7226a9716976ec5e5012705bf052bfcafab03ad Mon Sep 17 00:00:00 2001 From: Henrik Rydgard Date: Tue, 5 Mar 2013 00:20:11 +0100 Subject: [PATCH 326/347] Approximately rollback the last change to sceKernelReferThreadProfiler --- Core/HLE/sceKernel.cpp | 19 ++++++++++--------- 1 file changed, 10 insertions(+), 9 deletions(-) diff --git a/Core/HLE/sceKernel.cpp b/Core/HLE/sceKernel.cpp index 0a8edba0be83..06fe0bf0e837 100644 --- a/Core/HLE/sceKernel.cpp +++ b/Core/HLE/sceKernel.cpp @@ -560,16 +560,17 @@ struct DebugProfilerRegs { u32 local_bus; }; -u32 sceKernelReferThreadProfiler() { +u32 sceKernelReferThreadProfiler(u32 statusPtr) { ERROR_LOG(HLE, "FAKE sceKernelReferThreadProfiler()"); - u32 size = sizeof(DebugProfilerRegs); - u32 ptr = kernelMemory.Alloc(size, true); - if (ptr) { - Memory::Memset(ptr, (u8)0, sizeof(DebugProfilerRegs)); - return ptr; - } - + // Can we confirm that the struct above is the right struct? + // If so, re-enable this code. + //DebugProfilerRegs regs; + //memset(®s, 0, sizeof(regs)); + // TODO: fill the struct. + //if (Memory::IsValidAddress(statusPtr)) { + // Memory::WriteStruct(statusPtr, ®s); + //} return 0; } @@ -654,7 +655,7 @@ const HLEFunction ThreadManForUser[] = {0x8218B4DD,WrapI_U,"sceKernelReferGlobalProfiler"}, {0x627E6F3A,WrapI_U,"sceKernelReferSystemStatus"}, - {0x64D4540E,WrapU_V,"sceKernelReferThreadProfiler"}, + {0x64D4540E,WrapU_U,"sceKernelReferThreadProfiler"}, //Fifa Street 2 uses alarms {0x6652b8ca,WrapI_UUU,"sceKernelSetAlarm"}, From 53c501c3d07c1bbed23ab79c529a015e9d116a4f Mon Sep 17 00:00:00 2001 From: "Unknown W. Brackets" Date: Mon, 4 Mar 2013 16:11:52 -0800 Subject: [PATCH 327/347] Buildfix, sorry. --- native | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/native b/native index 4ee889c0255f..dff0ac566954 160000 --- a/native +++ b/native @@ -1 +1 @@ -Subproject commit 4ee889c0255f0dbd9066c7a624cc03b625ec48fe +Subproject commit dff0ac566954bfa18f0a972839a03bea737b821b From 5ce82bc028d6194ec3e99bc06f5b7d2a713c5e35 Mon Sep 17 00:00:00 2001 From: sum2012 Date: Tue, 5 Mar 2013 08:39:32 +0800 Subject: [PATCH 328/347] IMPL Some Mpeg ref https://github.com/hrydgard/ppsspp/issues/508 please help to check whether I IMPL correctly --- Core/HLE/sceMpeg.cpp | 30 ++++++++++++++++++++++++++++++ 1 file changed, 30 insertions(+) diff --git a/Core/HLE/sceMpeg.cpp b/Core/HLE/sceMpeg.cpp index 18911d68a643..f60258c73691 100644 --- a/Core/HLE/sceMpeg.cpp +++ b/Core/HLE/sceMpeg.cpp @@ -77,6 +77,7 @@ static const int MPEG_HEADER_BUFFER_MINIMUM_SIZE = 2048; static const int NUM_ES_BUFFERS = 2; static const int PSP_ERROR_MPEG_NO_DATA = 0x80618001; +static const int PSP_ERROR_MPEG_INVALID_VALUE = 0x806101fe; static const int TPSM_PIXEL_STORAGE_MODE_16BIT_BGR5650 = 0X00; static const int TPSM_PIXEL_STORAGE_MODE_32BIT_ABGR8888 = 0X03; @@ -1324,6 +1325,31 @@ u32 sceMpegQueryUserdataEsSize(u32 mpeg, u32 esSizeAddr, u32 outSizeAddr) return -1; } +u32 sceMpegAvcResourceGetAvcDecTopAddr(u32 mpeg) +{ + ERROR_LOG(HLE, "UNIMPL sceMpegAvcResourceGetAvcDecTopAddr(%08x)", mpeg); + return 0x12345678; +} + +u32 sceMpegAvcResourceFinish(u32 mpeg) +{ + return 0; +} + +u32 sceMpegAvcResourceGetAvcEsBuf(u32 mpeg) +{ + ERROR_LOG(HLE, "UNIMPL sceMpegAvcResourceGetAvcEsBuf(%08x)", mpeg); + return 0; +} + +u32 sceMpegAvcResourceInit(u32 mpeg) +{ + ERROR_LOG(HLE, "UNIMPL sceMpegAvcResourceInit(%08x)", mpeg); + if (mpeg != 1) { + return ERROR_MPEG_INVALID_VALUE; + } + return 0; +} /* MP3 */ int sceMp3Decode(u32 mp3, u32 outPcmPtr) @@ -1695,6 +1721,10 @@ const HLEFunction sceMpeg[] = {0xC02CF6B5,WrapI_UUU,"sceMpegQueryPcmEsSize"}, {0xC45C99CC,WrapU_UUU,"sceMpegQueryUserdataEsSize"}, {0x234586AE,WrapU_UUI,"sceMpegChangeGetAvcAuMode"}, + {0x63B9536A,WrapU_U,"sceMpegAvcResourceGetAvcDecTopAddr"}, + {0x8160a2fe,WrapU_U,"sceMpegAvcResourceFinish"}, + {0xaf26bb01,WrapU_U,"sceMpegAvcResourceGetAvcEsBuf"}, + {0xfcbdb5ad,WrapU_U,"sceMpegAvcResourceInit"}, }; const HLEFunction sceMp3[] = From fd50dc3a9d539de110a80e9d6b928c4d11bad6aa Mon Sep 17 00:00:00 2001 From: sum2012 Date: Tue, 5 Mar 2013 09:12:47 +0800 Subject: [PATCH 329/347] Add a comment that it's just a random address --- Core/HLE/sceMpeg.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/Core/HLE/sceMpeg.cpp b/Core/HLE/sceMpeg.cpp index f60258c73691..a48f88d051db 100644 --- a/Core/HLE/sceMpeg.cpp +++ b/Core/HLE/sceMpeg.cpp @@ -1328,6 +1328,7 @@ u32 sceMpegQueryUserdataEsSize(u32 mpeg, u32 esSizeAddr, u32 outSizeAddr) u32 sceMpegAvcResourceGetAvcDecTopAddr(u32 mpeg) { ERROR_LOG(HLE, "UNIMPL sceMpegAvcResourceGetAvcDecTopAddr(%08x)", mpeg); +// it's just a random address return 0x12345678; } From a79713b8c403937e5374c06be43ca4c7d6244d8a Mon Sep 17 00:00:00 2001 From: sum2012 Date: Tue, 5 Mar 2013 09:18:21 +0800 Subject: [PATCH 330/347] Add a debug log for sceMpegAvcResourceFinish --- Core/HLE/sceMpeg.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/Core/HLE/sceMpeg.cpp b/Core/HLE/sceMpeg.cpp index a48f88d051db..127fce7f60ab 100644 --- a/Core/HLE/sceMpeg.cpp +++ b/Core/HLE/sceMpeg.cpp @@ -1334,6 +1334,7 @@ u32 sceMpegAvcResourceGetAvcDecTopAddr(u32 mpeg) u32 sceMpegAvcResourceFinish(u32 mpeg) { + DEBUG_LOG(HLE,"sceMpegAvcResourceFinish(%08x)", mpeg); return 0; } From 03841486e16f86d7ccd323c374cc96b428e4aef6 Mon Sep 17 00:00:00 2001 From: sum2012 Date: Tue, 5 Mar 2013 10:01:45 +0800 Subject: [PATCH 331/347] Handle ringbufferAddr =0 in sceMpegCreate --- Core/HLE/sceMpeg.cpp | 2 ++ 1 file changed, 2 insertions(+) diff --git a/Core/HLE/sceMpeg.cpp b/Core/HLE/sceMpeg.cpp index 127fce7f60ab..06ee24633bfd 100644 --- a/Core/HLE/sceMpeg.cpp +++ b/Core/HLE/sceMpeg.cpp @@ -429,6 +429,7 @@ u32 sceMpegCreate(u32 mpegAddr, u32 dataPtr, u32 size, u32 ringbufferAddr, u32 f } SceMpegRingBuffer ringbuffer; + if(ringbufferAddr != 0){ Memory::ReadStruct(ringbufferAddr, &ringbuffer); if (ringbuffer.packetSize == 0) { ringbuffer.packetsFree = 0; @@ -437,6 +438,7 @@ u32 sceMpegCreate(u32 mpegAddr, u32 dataPtr, u32 size, u32 ringbufferAddr, u32 f } ringbuffer.mpeg = mpegAddr; Memory::WriteStruct(ringbufferAddr, &ringbuffer); + } // Generate, and write mpeg handle into mpeg data, for some reason int mpegHandle = dataPtr + 0x30; From 10ad797c6d86980f500202e5aa1cab8c3eacda2c Mon Sep 17 00:00:00 2001 From: Sacha Date: Tue, 5 Mar 2013 13:16:08 +1000 Subject: [PATCH 332/347] Armjit stubs. Add a double encoding for VCVT. Implement integer divide (but not working yet). Stubs for msub/msubu. Don't detect vfpv3 on Symbian. --- Common/ArmCPUDetect.cpp | 3 ++- Common/ArmEmitter.cpp | 17 ++++++++---- Common/ArmEmitter.h | 2 +- Core/MIPS/ARM/ArmCompALU.cpp | 50 ++++++++++++++++++++++++++++++++++++ 4 files changed, 65 insertions(+), 7 deletions(-) diff --git a/Common/ArmCPUDetect.cpp b/Common/ArmCPUDetect.cpp index afaf6b777bc4..e7d76c205c29 100644 --- a/Common/ArmCPUDetect.cpp +++ b/Common/ArmCPUDetect.cpp @@ -155,11 +155,12 @@ void CPUInfo::Detect() #ifdef __SYMBIAN32__ bThumbEE = false; bNEON = false; + bVFPv3 = false; #else bThumbEE = true; bNEON = true; -#endif bVFPv3 = true; +#endif bTLS = true; bVFPv4 = false; bIDIVa = false; diff --git a/Common/ArmEmitter.cpp b/Common/ArmEmitter.cpp index 8aa6a47a7347..67f7414e9967 100644 --- a/Common/ArmEmitter.cpp +++ b/Common/ArmEmitter.cpp @@ -1162,15 +1162,22 @@ void ARMXEmitter::VMOV(ARMReg Dest, ARMReg Src) } } -void ARMXEmitter::VCVT(ARMReg Sd, ARMReg Sm, int flags) +void ARMXEmitter::VCVT(ARMReg Dest, ARMReg Source, int flags) { + bool single_reg = (Dest < D0) && (Source < D0); int op = ((flags & TO_INT) ? (flags & ROUND_TO_ZERO) : (flags & IS_SIGNED)) ? 1 : 0; int op2 = ((flags & TO_INT) ? (flags & IS_SIGNED) : 0) ? 1 : 0; - Sd = SubBase(Sd); - Sm = SubBase(Sm); + Dest = SubBase(Dest); + Source = SubBase(Source); - Write32(NO_COND | (0x1D << 23) | ((Sd & 0x1) << 22) | (0x7 << 19) | ((flags & TO_INT) << 18) | (op2 << 16) \ - | ((Sd & 0x1E) << 11) | (op << 7) | (0x29 << 6) | ((Sm & 0x1) << 5) | (Sm >> 1)); + if (single_reg) + { + Write32(NO_COND | (0x1D << 23) | ((Dest & 0x1) << 22) | (0x7 << 19) | ((flags & TO_INT) << 18) | (op2 << 16) \ + | ((Dest & 0x1E) << 11) | (op << 7) | (0x29 << 6) | ((Source & 0x1) << 5) | (Source >> 1)); + } else { + Write32(NO_COND | (0x1D << 23) | ((Dest & 0x10) << 18) | (0x7 << 19) | ((flags & TO_INT) << 18) | (op2 << 16) \ + | ((Dest & 0xF) << 12) | (1 << 8) | (op << 7) | (0x29 << 6) | ((Source & 0x10) << 1) | (Source & 0xF)); + } } } diff --git a/Common/ArmEmitter.h b/Common/ArmEmitter.h index cf55c46cf3ae..3c6a94d8dc6b 100644 --- a/Common/ArmEmitter.h +++ b/Common/ArmEmitter.h @@ -553,7 +553,7 @@ class ARMXEmitter void VMLA(ARMReg Vd, ARMReg Vn, ARMReg Vm); void VMOV(ARMReg Dest, ARMReg Src, bool high); void VMOV(ARMReg Dest, ARMReg Src); - void VCVT(ARMReg Sd, ARMReg Sm, int flags); + void VCVT(ARMReg Dest, ARMReg Src, int flags); void VMRS_APSR(); diff --git a/Core/MIPS/ARM/ArmCompALU.cpp b/Core/MIPS/ARM/ArmCompALU.cpp index 2bf6a9a99956..23c2843a0cb2 100644 --- a/Core/MIPS/ARM/ArmCompALU.cpp +++ b/Core/MIPS/ARM/ArmCompALU.cpp @@ -482,6 +482,46 @@ namespace MIPSComp UMULL(gpr.R(MIPSREG_LO), gpr.R(MIPSREG_HI), gpr.R(rs), gpr.R(rt)); break; + case 26: //div + DISABLE; + gpr.MapDirtyDirtyInIn(MIPSREG_LO, MIPSREG_HI, rs, rt); + if (cpu_info.bIDIVa) + { + SDIV(gpr.R(MIPSREG_LO), gpr.R(rs), gpr.R(rt)); + MUL(gpr.R(rt), gpr.R(rt), gpr.R(MIPSREG_LO)); + SUB(gpr.R(MIPSREG_HI), gpr.R(rs), Operand2(gpr.R(rt))); + } else { + VMOV(S0, gpr.R(rs)); + VMOV(S1, gpr.R(rt)); + VCVT(D0, S0, TO_FLOAT | IS_SIGNED); + VCVT(D1, S1, TO_FLOAT | IS_SIGNED); + VDIV(D0, D0, D1); + VCVT(gpr.R(MIPSREG_LO), D0, TO_INT | IS_SIGNED); + MUL(gpr.R(rt), gpr.R(rt), gpr.R(MIPSREG_LO)); + SUB(gpr.R(MIPSREG_HI), gpr.R(rs), Operand2(gpr.R(rt))); + } + break; + + case 27: //divu + DISABLE; + gpr.MapDirtyDirtyInIn(MIPSREG_LO, MIPSREG_HI, rs, rt); + if (cpu_info.bIDIVa) + { + UDIV(gpr.R(MIPSREG_LO), gpr.R(rs), gpr.R(rt)); + MUL(gpr.R(rt), gpr.R(rt), gpr.R(MIPSREG_LO)); + SUB(gpr.R(MIPSREG_HI), gpr.R(rs), Operand2(gpr.R(rt))); + } else { + VMOV(S0, gpr.R(rs)); + VMOV(S1, gpr.R(rt)); + VCVT(D0, S0, TO_FLOAT); + VCVT(D1, S1, TO_FLOAT); + VDIV(D0, D0, D1); + VCVT(gpr.R(MIPSREG_LO), D0, TO_INT); + MUL(gpr.R(rt), gpr.R(rt), gpr.R(MIPSREG_LO)); + SUB(gpr.R(MIPSREG_HI), gpr.R(rs), Operand2(gpr.R(rt))); + } + break; + case 28: //madd gpr.MapDirtyDirtyInIn(MIPSREG_LO, MIPSREG_HI, rs, rt, false); SMLAL(gpr.R(MIPSREG_LO), gpr.R(MIPSREG_HI), gpr.R(rs), gpr.R(rt)); @@ -492,6 +532,16 @@ namespace MIPSComp UMLAL(gpr.R(MIPSREG_LO), gpr.R(MIPSREG_HI), gpr.R(rs), gpr.R(rt)); break; + case 46: // msub + DISABLE; + gpr.MapDirtyDirtyInIn(MIPSREG_LO, MIPSREG_HI, rs, rt, false); + break; + + case 47: // msubu + DISABLE; + gpr.MapDirtyDirtyInIn(MIPSREG_LO, MIPSREG_HI, rs, rt, false); + break; + default: DISABLE; } From 4a56ebd0a07330dec40e9c3c6897ad432dd28f6f Mon Sep 17 00:00:00 2001 From: Sacha Date: Tue, 5 Mar 2013 13:52:03 +1000 Subject: [PATCH 333/347] Armjit: Add sllv, srlv, srav instructions (reg shift). --- Core/MIPS/ARM/ArmCompALU.cpp | 40 ++++++++++++++++-------------------- Core/MIPS/ARM/ArmJit.h | 1 + 2 files changed, 19 insertions(+), 22 deletions(-) diff --git a/Core/MIPS/ARM/ArmCompALU.cpp b/Core/MIPS/ARM/ArmCompALU.cpp index 23c2843a0cb2..33b41bda6073 100644 --- a/Core/MIPS/ARM/ArmCompALU.cpp +++ b/Core/MIPS/ARM/ArmCompALU.cpp @@ -269,40 +269,36 @@ namespace MIPSComp MOV(gpr.R(rd), Operand2(sa, shiftType, gpr.R(rt))); } - // "over-shifts" work the same as on x86 - only bottom 5 bits are used to get the shift value - /* - void Jit::CompShiftVar(u32 op, void (XEmitter::*shift)(int, OpArg, OpArg)) + void Jit::CompShiftVar(u32 op, ArmGen::ShiftType shiftType) { int rd = _RD; int rt = _RT; int rs = _RS; - gpr.FlushLockX(ECX); - gpr.Lock(rd, rt, rs); - gpr.BindToRegister(rd, true, true); - if (rd != rt) - MOV(32, gpr.R(rd), gpr.R(rt)); - MOV(32, R(ECX), gpr.R(rs)); // Only ECX can be used for variable shifts. - AND(32, R(ECX), Imm32(0x1f)); - (this->*shift)(32, gpr.R(rd), R(ECX)); - gpr.UnlockAll(); - gpr.UnlockAllX(); + if (gpr.IsImm(rs)) + { + int sa = gpr.GetImm(rs); + MOV(gpr.R(rd), Operand2(sa, shiftType, gpr.R(rt))); + return; + } + gpr.MapDirtyInIn(rd, rs, rt); + AND(R0, gpr.R(rs), Operand2(0x1F)); + MOV(gpr.R(rd), Operand2(gpr.R(rt), shiftType, R0)); } -*/ + void Jit::Comp_ShiftType(u32 op) { CONDITIONAL_DISABLE; int rs = _RS; int fd = _FD; - // WARNIGN : ROTR + // WARNING : ROTR switch (op & 0x3f) { - case 0: CompShiftImm(op, ST_LSL); break; - case 2: CompShiftImm(op, rs == 1 ? ST_ROR : ST_LSR); break; // srl - case 3: CompShiftImm(op, ST_ASR); break; // sra - - // case 4: CompShiftVar(op, &XEmitter::SHL); break; // R(rd) = R(rt) << R(rs); break; //sllv - // case 6: CompShiftVar(op, fd == 1 ? &XEmitter::ROR : &XEmitter::SHR); break; // R(rd) = R(rt) >> R(rs); break; //srlv - // case 7: CompShiftVar(op, &XEmitter::SAR); break; // R(rd) = ((s32)R(rt)) >> R(rs); break; //srav + case 0: CompShiftImm(op, ST_LSL); break; //sll + case 2: CompShiftImm(op, rs == 1 ? ST_ROR : ST_LSR); break; //srl + case 3: CompShiftImm(op, ST_ASR); break; //sra + case 4: CompShiftVar(op, ST_LSL); break; //sllv + case 6: CompShiftVar(op, rs == 1 ? ST_ROR : ST_LSR); break; //srlv + case 7: CompShiftVar(op, ST_ASR); break; //srav default: Comp_Generic(op); diff --git a/Core/MIPS/ARM/ArmJit.h b/Core/MIPS/ARM/ArmJit.h index 20f49028cd39..c9467dd46d9d 100644 --- a/Core/MIPS/ARM/ArmJit.h +++ b/Core/MIPS/ARM/ArmJit.h @@ -218,6 +218,7 @@ class Jit : public ArmGen::ARMXCodeBlock // Utilities to reduce duplicated code void CompImmLogic(int rs, int rt, u32 uimm, void (ARMXEmitter::*arith)(ARMReg dst, ARMReg src, Operand2 op2), u32 (*eval)(u32 a, u32 b)); void CompShiftImm(u32 op, ArmGen::ShiftType shiftType); + void CompShiftVar(u32 op, ArmGen::ShiftType shiftType); void LogBlockNumber(); From 4641cf376ffc61cde4bcdcbf4821c452bbd85933 Mon Sep 17 00:00:00 2001 From: Sacha Date: Tue, 5 Mar 2013 14:16:35 +1000 Subject: [PATCH 334/347] Armjit: Implement CLZ instruction. Disable reg shifts for now (breaks Wipeout Pure). --- Common/ArmEmitter.cpp | 5 +++++ Common/ArmEmitter.h | 1 + Core/MIPS/ARM/ArmCompALU.cpp | 24 ++++++++++++++++++++++-- 3 files changed, 28 insertions(+), 2 deletions(-) diff --git a/Common/ArmEmitter.cpp b/Common/ArmEmitter.cpp index 67f7414e9967..152f84259d43 100644 --- a/Common/ArmEmitter.cpp +++ b/Common/ArmEmitter.cpp @@ -542,6 +542,11 @@ void ARMXEmitter::UBFX(ARMReg dest, ARMReg rn, u8 lsb, u8 width) Write32(condition | (0x7E0 << 16) | ((width - 1) << 16) | (dest << 12) | (lsb << 7) | (5 << 4) | rn); } +void ARMXEmitter::CLZ(ARMReg rd, ARMReg rm) +{ + Write32(condition | (0x16F << 16) | (rd << 12) | (0xF1 << 4) | rm); +} + void ARMXEmitter::BFI(ARMReg rd, ARMReg rn, u8 lsb, u8 width) { u32 msb = (lsb + width - 1); diff --git a/Common/ArmEmitter.h b/Common/ArmEmitter.h index 3c6a94d8dc6b..a49a91104c6e 100644 --- a/Common/ArmEmitter.h +++ b/Common/ArmEmitter.h @@ -485,6 +485,7 @@ class ARMXEmitter void SXTAH(ARMReg dest, ARMReg src, ARMReg op2, u8 rotation = 0); void BFI(ARMReg rd, ARMReg rn, u8 lsb, u8 width); void UBFX(ARMReg dest, ARMReg op2, u8 lsb, u8 width); + void CLZ(ARMReg rd, ARMReg rm); // Using just MSR here messes with our defines on the PPC side of stuff (when this code was in dolphin...) // Just need to put an underscore here, bit annoying. diff --git a/Core/MIPS/ARM/ArmCompALU.cpp b/Core/MIPS/ARM/ArmCompALU.cpp index 33b41bda6073..154b215e3ef2 100644 --- a/Core/MIPS/ARM/ArmCompALU.cpp +++ b/Core/MIPS/ARM/ArmCompALU.cpp @@ -155,8 +155,26 @@ namespace MIPSComp void Jit::Comp_RType2(u32 op) { - DISABLE; - } + CONDITIONAL_DISABLE; + int rs = _RS; + int rd = _RD; + + // Don't change $zr. + if (rd == 0) + return; + + switch (op & 63) + { + case 22: //clz + gpr.MapDirtyIn(rd, rs); + CLZ(gpr.R(rd), gpr.R(rs)); + break; + case 23: //clo + DISABLE; + break; + default: + DISABLE; + } void Jit::Comp_RType3(u32 op) { @@ -271,6 +289,8 @@ namespace MIPSComp void Jit::CompShiftVar(u32 op, ArmGen::ShiftType shiftType) { + // Breaks Wipeout Pure + DISABLE; int rd = _RD; int rt = _RT; int rs = _RS; From 60b84e71d5dfa89e584895d58e10e851737607c1 Mon Sep 17 00:00:00 2001 From: Sacha Date: Tue, 5 Mar 2013 14:55:33 +1000 Subject: [PATCH 335/347] Armjit: Re-enable reg shifts. Thanks [Unknown] for finding the issue. --- Core/MIPS/ARM/ArmCompALU.cpp | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/Core/MIPS/ARM/ArmCompALU.cpp b/Core/MIPS/ARM/ArmCompALU.cpp index 154b215e3ef2..e15c7957b298 100644 --- a/Core/MIPS/ARM/ArmCompALU.cpp +++ b/Core/MIPS/ARM/ArmCompALU.cpp @@ -289,14 +289,13 @@ namespace MIPSComp void Jit::CompShiftVar(u32 op, ArmGen::ShiftType shiftType) { - // Breaks Wipeout Pure - DISABLE; int rd = _RD; int rt = _RT; int rs = _RS; if (gpr.IsImm(rs)) { - int sa = gpr.GetImm(rs); + gpr.MapDirtyIn(rd, rt); + int sa = gpr.GetImm(rs) & 0x1F; MOV(gpr.R(rd), Operand2(sa, shiftType, gpr.R(rt))); return; } From 65a83d70c799d4f23acb0103b4ea73b905d03e64 Mon Sep 17 00:00:00 2001 From: Sacha Date: Tue, 5 Mar 2013 15:14:22 +1000 Subject: [PATCH 336/347] Armjit: Implement clo as well. Fix up the reg usage in div/divu comment. --- Core/MIPS/ARM/ArmCompALU.cpp | 20 +++++++++++--------- 1 file changed, 11 insertions(+), 9 deletions(-) diff --git a/Core/MIPS/ARM/ArmCompALU.cpp b/Core/MIPS/ARM/ArmCompALU.cpp index e15c7957b298..3086f8a16dc1 100644 --- a/Core/MIPS/ARM/ArmCompALU.cpp +++ b/Core/MIPS/ARM/ArmCompALU.cpp @@ -170,7 +170,9 @@ namespace MIPSComp CLZ(gpr.R(rd), gpr.R(rs)); break; case 23: //clo - DISABLE; + gpr.MapDirtyIn(rd, rs); + RSB(R0, gpr.R(rs), Operand2(0)); + CLZ(gpr.R(rd), R0) break; default: DISABLE; @@ -503,8 +505,8 @@ namespace MIPSComp if (cpu_info.bIDIVa) { SDIV(gpr.R(MIPSREG_LO), gpr.R(rs), gpr.R(rt)); - MUL(gpr.R(rt), gpr.R(rt), gpr.R(MIPSREG_LO)); - SUB(gpr.R(MIPSREG_HI), gpr.R(rs), Operand2(gpr.R(rt))); + MUL(R0, gpr.R(rt), gpr.R(MIPSREG_LO)); + SUB(gpr.R(MIPSREG_HI), gpr.R(rs), Operand2(R0)); } else { VMOV(S0, gpr.R(rs)); VMOV(S1, gpr.R(rt)); @@ -512,8 +514,8 @@ namespace MIPSComp VCVT(D1, S1, TO_FLOAT | IS_SIGNED); VDIV(D0, D0, D1); VCVT(gpr.R(MIPSREG_LO), D0, TO_INT | IS_SIGNED); - MUL(gpr.R(rt), gpr.R(rt), gpr.R(MIPSREG_LO)); - SUB(gpr.R(MIPSREG_HI), gpr.R(rs), Operand2(gpr.R(rt))); + MUL(R0, gpr.R(rt), gpr.R(MIPSREG_LO)); + SUB(gpr.R(MIPSREG_HI), gpr.R(rs), Operand2(R0)); } break; @@ -523,8 +525,8 @@ namespace MIPSComp if (cpu_info.bIDIVa) { UDIV(gpr.R(MIPSREG_LO), gpr.R(rs), gpr.R(rt)); - MUL(gpr.R(rt), gpr.R(rt), gpr.R(MIPSREG_LO)); - SUB(gpr.R(MIPSREG_HI), gpr.R(rs), Operand2(gpr.R(rt))); + MUL(R0, gpr.R(rt), gpr.R(MIPSREG_LO)); + SUB(gpr.R(MIPSREG_HI), gpr.R(rs), Operand2(R0)); } else { VMOV(S0, gpr.R(rs)); VMOV(S1, gpr.R(rt)); @@ -532,8 +534,8 @@ namespace MIPSComp VCVT(D1, S1, TO_FLOAT); VDIV(D0, D0, D1); VCVT(gpr.R(MIPSREG_LO), D0, TO_INT); - MUL(gpr.R(rt), gpr.R(rt), gpr.R(MIPSREG_LO)); - SUB(gpr.R(MIPSREG_HI), gpr.R(rs), Operand2(gpr.R(rt))); + MUL(R0, gpr.R(rt), gpr.R(MIPSREG_LO)); + SUB(gpr.R(MIPSREG_HI), gpr.R(rs), Operand2(R0)); } break; From 33c6df55db6ef0d6f8308160aa8bf5504cf50a48 Mon Sep 17 00:00:00 2001 From: Sacha Date: Tue, 5 Mar 2013 15:20:14 +1000 Subject: [PATCH 337/347] Build fix --- Core/MIPS/ARM/ArmCompALU.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/Core/MIPS/ARM/ArmCompALU.cpp b/Core/MIPS/ARM/ArmCompALU.cpp index 3086f8a16dc1..4edfd676408d 100644 --- a/Core/MIPS/ARM/ArmCompALU.cpp +++ b/Core/MIPS/ARM/ArmCompALU.cpp @@ -172,10 +172,11 @@ namespace MIPSComp case 23: //clo gpr.MapDirtyIn(rd, rs); RSB(R0, gpr.R(rs), Operand2(0)); - CLZ(gpr.R(rd), R0) + CLZ(gpr.R(rd), R0); break; default: DISABLE; + } } void Jit::Comp_RType3(u32 op) From 2364fdfeb9dae90c01f0e0322e9c9a27d4d00967 Mon Sep 17 00:00:00 2001 From: Klimis Ioannidis Date: Tue, 5 Mar 2013 10:30:29 +0200 Subject: [PATCH 338/347] Add Greek translation to Qt4 UI All basic UI is fully translated, though I left some terms that have no direct translation in Greek untouched. (Won't affect the end-user) --- Qt/languages/ppsspp_gr.ts | 1013 +++++++++++++++++++++++++++++++++++++ 1 file changed, 1013 insertions(+) create mode 100644 Qt/languages/ppsspp_gr.ts diff --git a/Qt/languages/ppsspp_gr.ts b/Qt/languages/ppsspp_gr.ts new file mode 100644 index 000000000000..e90b6f6e91b3 --- /dev/null +++ b/Qt/languages/ppsspp_gr.ts @@ -0,0 +1,1013 @@ + + + + + Controls + + + Controls + Controls window title + Τίτλος παραθύρου χειρισμών + + + + CtrlDisAsmView + + + Copy &address + Αντιγραφή &address + + + + Copy instruction (&hex) + Αντιγραφή οδηγίας (&hex) + + + + Copy instruction (&disasm) + Αντιγραφή οδηγίας (&disasm) + + + + &Run to here + &Τρέξιμο ως εδώ + + + + &Set Next Statement + &Ορισμός Επόμενη Κατάστασης + + + + &Toggle breakpoint + + + + + &Follow branch + &Ακολούθηση κλάδου + + + + Go to in &Memory View + Μετάβαση σε &Προβολέα Μνήμης + + + + &Rename function... + &Μετονομασία λειτουργίας... + + + + New function name + Νέο όνομα λειτουργίας + + + + New function name: + Νέο όνομα λειτουργίας: + + + + CtrlMemView + + + Go to in &disasm + Μετάβαση σε &disasm + + + + &Copy value + &Αντιγραφή τιμής + + + + Dump... + Αποτύπωση... + + + + CtrlRegisterList + + + Go to in &memory view + Μετάβαση σε &προβολής μνήμης + + + + Go to in &disasm + Μετάβαση σε &disasm + + + + &Copy value + &Αντιγραφή τιμής + + + + C&hange... + Α&λλαγή... + + + + Set new value + Ορισμός νέας τιμής + + + + Set new value: + Ορισμός νέας τιμής: + + + + Debugger_Disasm + + + Disassembler + Window title + Τίτλος παραθύρου + + + + Ctr: + + + + + &Go to + &Μετάβαση σε + + + + &PC + + + + + &LR + + + + + Show VFPU + Εμφάνιση VFPU + + + + Regs + + + + + Funcs + + + + + &Go + &Ξεκίνημα + + + + Stop + Σταμάτημα + + + + Step &Into + Μεταπήδηση &σε + + + + Step &Over + Μεταπήδηση &Πάνω από + + + + S&kip + Α&γνόηση + + + + Next &HLE + Επόμενο &ΕΥΕ (HLE) + + + + Breakpoints + + + + + Address + Διεύθυνση + + + + Clear All + Εκκαθάριση Όλων + + + + Callstack + + + + + Display Lists + Λίστες Απεικόνισης + + + + + Id + + + + + + Status + Κατάσταση + + + + Start Address + Αρχική Διεύθυνση + + + + Current Address + Τρέχουσα Διεύθυνση + + + + Run + Εκκίνηση + + + + Step + Βήμα + + + + Threads + Νήματα + + + + Name + Όνομα + + + + Current PC + Τρέχον PC + + + + Entry point + Σημείο έναρξης + + + + Remove breakpoint + Αφαίρεση σημείου διακοπής + + + + Go to entry point + Μετάβαση στο σημείο εισόδου + + + + Running + Σε λειτουργία + + + + Wait + Αναμονή + + + + Suspend + Αναστολή + + + + Show code + Εμφάνιση κώδικα + + + + Debugger_Memory + + + Dialog + Διάλογος + + + + Goto: + Μετάβαση σε: + + + + Mode + Λειτουργία + + + + Normal + Κανονικό + + + + Symbols + Σύμβολα + + + + Memory Viewer - %1 + Προβολέας Μνήμης - %1 + + + + Debugger_VFPU + + + VFPU + + + + + Float + + + + + HalfFloat + + + + + Hex + Δεκαεξαδικό + + + + Bytes + + + + + Shorts + + + + + Ints + + + + + GamePadDialog + + + Gamepad Configuration + Διαμόρφωση Χειριστηρίου + + + + GamePad List + Λίστα Χειριστηρίων + + + + Refresh + Ανανέωση + + + + Select + Επιλογή + + + + Gamepad Values : + Τιμές Χειριστηρίου : + + + + TextLabel + + + + + Assign Gamepad input + Εκχώρηση εισόδου χειριστηρίου + + + + to PSP button/axis + στο κουμί/άξονα PSP + + + + Assign + Εκχώρηση + + + + Press buttons on your gamePad to verify mapping : + Πατήστε τα κουμπιά στο χειριστήριο σας για να επιβεβαιώσετε την αντιστοίχιση: + + + + + <b>No gamepad</b> + <b>Κανένα χειριστήριο</b> + + + + <b>Unknown gamepad</b> + <b>Άγνωστο χειριστήριο</b> + + + + Buttons + Πλήκτρα + + + + + Button %1 + Πλήκτρο %1 + + + + Axes + Άξονες + + + + %1 Neg + %1 Αρν. + + + + Axes %1 Neg + Άξονες %1 Αρν. + + + + %1 Pos + %1 Θετ. + + + + Axes %1 Pos + Άξονες %1 Θετ. + + + + Hats + Μοχλοί + + + + <b>Current gamepad: %1</b> + <b>Τρέχον χειριστήριο: %1</b> + + + + MainWindow + + + PPSSPP + + + + + &File + &Αρχείο + + + + &Emulation + &Εξομοίωση + + + + Debu&g + Αποσφαλμάτωσ&η + + + + &Options + &Επιλογές + + + + G3D + + + + + HLE + ΕΥΕ(HLE) + + + + Default + Προεπιλογή + + + + Lo&g Levels + Επ&ίπεδα Καταγραφικού + + + + &Language + &Γλώσσα + + + + &Video + &Βίντεο + + + + &Anisotropic filtering + &Ανισοτροπικό φιτράρισμα + + + + &Zoom + &Μεγένθυση + + + + Co&ntrols + Χε&ιριστήρια + + + + &Core + &Πυρήνας + + + + &Help + &Βοήθεια + + + + &Open... + &Άνοιγμα... + + + + &Close + &Κλείσιμο + + + + - + + + + + Quickload state + Γρήγορη Φόρτωση + + + + F4 + + + + + Quicksave state + Γρήγορη Αποθήκευση + + + + F2 + + + + + &Load State File... + &Φόρτωση Σημείου Αποθήκευσης... + + + + &Save State File... + &Αποθήκευση Σημείου Αποθήκευσης... + + + + E&xit + Έ&ξοδος + + + + &Run + &Εκκίνηση + + + + F7 + + + + + &Pause + &Παύση + + + + F8 + + + + + R&eset + Ε&πανεκκίνηση + + + + &Interpreter + + + + + &Slightly Faster Interpreter + &Ελαφρώς Γρηγορότερος Interpreter + + + + &Dynarec + + + + + Load &Map File... + Φόρτωση &Αρχείου Χάρτη... + + + + &Save Map File... + &Αποθήκευση Αρχείου Χάρτη... + + + + &Reset Symbol Table + &Επαναφορά Πίνακα Συμβόλων + + + + &Disassembly + &Αποσυναρμολόγηση + + + + Ctrl+D + + + + + &Log Console + &Κονσόλα Καταγραφέα + + + + Ctrl+L + + + + + Memory &View... + Εμφάνιση &Μνήμης... + + + + Ctrl+M + + + + + &Keyboard + &Πληκτρολόγιο + + + + &Toggle fullscreen + &Μετάβαση σε πλήρη οθόνη + + + + Show &debug statistics + Εμφάνιση &στατιστικών αποσφαλμάτωσης + + + + I&gnore illegal reads/writes + Α&γνόηση αθέμιτων αναγνώσεων + + + + &Gamepad + &Χειριστήριο + + + + Run on loa&d + Εκκίνηση στην έναρξ&η< + + + + Show &FPS counter + Εμφάνιση μετρητή &FPS + + + + S&tretch to display + Ε&πέκταση στην οθόνη + + + + &Sound emulation + &Εξομοίωση ήχου + + + + F12 + + + + + &Buffered Rendering + &Buffered Απεικόνιση + + + + F5 + + + + + &Hardware Transform + Hardware Μετασχηματισμός + + + + F6 + + + + + &Linear Filtering + Γραμμικό φιλτράρισμα + + + + &Wireframe (experimental) + Γράφημα Πλέγματος + + + + &Display Raw Framebuffer + &Εμφάνιση Ακατέργαστου Framebuffer + + + + Screen &1x + Οθόνη &1x + + + + Ctrl+1 + + + + + Screen &2x + Οθόνη &2x + + + + Ctrl+2 + + + + + Screen &3x + Οθόνη &3x + + + + Ctrl+3 + + + + + Screen &4x + Οθόνη &4x + + + + Ctrl+4 + + + + + &Fast Memory (dynarec, unstable) + &Γρήγορη Μνήμη (dynarec, ασταθής) + + + + &Go to http://www.ppsspp.org/ + &Μετάβαση σε http://www.ppsspp.org/ + + + + &About PPSSPP... + &Περί του PPSSPP... + + + + &Use VBO + &Χρήση VBO + + + + + + Debug + Αποσφαλμάτωση + + + + + + Warning + Προειδοποίηση + + + + + + Error + Σφάλμα + + + + + + Info + Πληροφορίες + + + + D&ump next frame to log + Ε&ξαγωγή επόμενου καρέ στον καταγραφέα + + + + &Vertex Cache + &Προσορηνή Μνήμη Κορυφών + + + + Memory View Texture... + Προβολή Μνήμης Υφών... + + + + Simple 2xAA + Απλό 2xAA + + + + Off + + + + + 2x + + + + + 4x + + + + + 8x + + + + + 16x + + + + + No translations + Καμία Μετάφραση + + + + gamepadMapping + + + Cross + Χί + + + + Circle + Κύκλος + + + + Square + Τετράγωνο + + + + Triangle + Τρίγωνο + + + + Left Trigger + Αριστερή σκανδάλη + + + + Right Trigger + Δεξιά σκανδάλη + + + + Start + + + + + Select + + + + + Up + Πάνω + + + + Down + Κάτω + + + + Left + Αριστερά + + + + Right + Δεξιά + + + + Home + + + + + Stick left + Αναλογικό αριστερά + + + + Stick right + Αναλογικό δεξιά + + + + Stick up + Αναλογικό πάνω + + + + Stick bottom + Αναλογικό κάτω + + + From 4b45af36301fcb47e937fe9c89259a090dadfdce Mon Sep 17 00:00:00 2001 From: sum2012 Date: Tue, 5 Mar 2013 21:05:25 +0800 Subject: [PATCH 339/347] Remove PSP_ERROR_MPEG_INVALID_VALUE in scempeg.cpp --- Core/HLE/sceMpeg.cpp | 1 - 1 file changed, 1 deletion(-) diff --git a/Core/HLE/sceMpeg.cpp b/Core/HLE/sceMpeg.cpp index 06ee24633bfd..5c383dc20d8c 100644 --- a/Core/HLE/sceMpeg.cpp +++ b/Core/HLE/sceMpeg.cpp @@ -77,7 +77,6 @@ static const int MPEG_HEADER_BUFFER_MINIMUM_SIZE = 2048; static const int NUM_ES_BUFFERS = 2; static const int PSP_ERROR_MPEG_NO_DATA = 0x80618001; -static const int PSP_ERROR_MPEG_INVALID_VALUE = 0x806101fe; static const int TPSM_PIXEL_STORAGE_MODE_16BIT_BGR5650 = 0X00; static const int TPSM_PIXEL_STORAGE_MODE_32BIT_ABGR8888 = 0X03; From 866bdb303980a17ed906009f797ea204f0057670 Mon Sep 17 00:00:00 2001 From: raven02 Date: Tue, 5 Mar 2013 21:31:13 +0800 Subject: [PATCH 340/347] Implement sceDisplayGetMode & wrap *Hcount* --- Core/HLE/sceDisplay.cpp | 65 +++++++++++++++++++++++++++++++---------- 1 file changed, 49 insertions(+), 16 deletions(-) diff --git a/Core/HLE/sceDisplay.cpp b/Core/HLE/sceDisplay.cpp index d55365ba3dba..a61de017d939 100644 --- a/Core/HLE/sceDisplay.cpp +++ b/Core/HLE/sceDisplay.cpp @@ -88,6 +88,9 @@ static int vCount; static int isVblank; static int numSkippedFrames; static bool hasSetMode; +static int mode; +static int width; +static int height; // Don't include this in the state, time increases regardless of state. static double curFrameTime; static double nextFrameTime; @@ -115,6 +118,9 @@ void hleAfterFlip(u64 userdata, int cyclesLate); void __DisplayInit() { gpuStats.reset(); hasSetMode = false; + mode = 0; + width = 480; + height = 272; numSkippedFrames = 0; framebufIsLatched = false; framebuf.topaddr = 0x04000000; @@ -145,6 +151,9 @@ void __DisplayDoState(PointerWrap &p) { p.Do(vCount); p.Do(isVblank); p.Do(hasSetMode); + p.Do(mode); + p.Do(width); + p.Do(height); WaitVBlankInfo wvi(0); p.Do(vblankWaitingThreads, wvi); @@ -272,8 +281,13 @@ void DebugStats() gpuStats.numShaders ); - float zoom = 0.3f; /// g_Config.iWindowZoom; - float soff = 0.3f; + #ifdef USING_GLES2 + float zoom = 0.5f; /// g_Config.iWindowZoom; + float soff = 0.5f; + #else + float zoom = 0.3f; /// g_Config.iWindowZoom; + float soff = 0.3f; + #endif PPGeBegin(); PPGeDrawText(stats, soff, soff, 0, zoom, 0xCC000000); PPGeDrawText(stats, -soff, -soff, 0, zoom, 0xCC000000); @@ -448,15 +462,17 @@ void sceDisplayIsVblank() { RETURN(isVblank); } -u32 sceDisplaySetMode(u32 unknown, u32 xres, u32 yres) { - DEBUG_LOG(HLE,"sceDisplaySetMode(%d,%d,%d)",unknown,xres,yres); +u32 sceDisplaySetMode(int displayMode, int displayWidth, int displayHeight) { + DEBUG_LOG(HLE,"sceDisplaySetMode(%i, %i, %i)", displayMode, displayWidth, displayHeight); host->BeginFrame(); if (!hasSetMode) { gpu->InitClear(); hasSetMode = true; } - + mode = displayMode; + width = displayWidth; + height = displayHeight; return 0; } @@ -579,15 +595,21 @@ u32 sceDisplayGetVcount() { return vCount; } -void sceDisplayGetCurrentHcount() { - RETURN(hCount++); +u32 sceDisplayGetCurrentHcount() { + ERROR_LOG(HLE,"sceDisplayGetCurrentHcount()"); + return hCount++; } -void sceDisplayGetAccumulatedHcount() { +u32 sceDisplayAdjustAccumulatedHcount() { + ERROR_LOG(HLE,"UNIMPL sceDisplayAdjustAccumulatedHcount()"); + return 0; +} + +u32 sceDisplayGetAccumulatedHcount() { // Just do an estimate u32 accumHCount = CoreTiming::GetTicks() / (CoreTiming::GetClockFrequencyMHz() * 1000000 / 60 / 272); DEBUG_LOG(HLE,"%i=sceDisplayGetAccumulatedHcount()", accumHCount); - RETURN(accumHCount); + return accumHCount; } float sceDisplayGetFramePerSec() { @@ -597,12 +619,23 @@ float sceDisplayGetFramePerSec() { } u32 sceDisplayIsForeground() { - ERROR_LOG(HLE,"UNIMPL sceDisplayIsForeground()"); - return 1; // return value according to JPCSP comment + ERROR_LOG(HLE,"UNIMPL sceDisplayIsForeground()"); + return 1; // return value according to JPCSP comment +} + +u32 sceDisplayGetMode(u32 modeAddr, u32 widthAddr, u32 heightAddr) { + DEBUG_LOG(HLE,"sceDisplayGetMode()", modeAddr, widthAddr, heightAddr); + if (Memory::IsValidAddress(modeAddr)) + Memory::Write_U32(mode, modeAddr); + if (Memory::IsValidAddress(widthAddr)) + Memory::Write_U32(width, widthAddr); + if (Memory::IsValidAddress(heightAddr)) + Memory::Write_U32(height, heightAddr); + return 0; } const HLEFunction sceDisplay[] = { - {0x0E20F177,WrapU_UUU, "sceDisplaySetMode"}, + {0x0E20F177,WrapU_III, "sceDisplaySetMode"}, {0x289D82FE,WrapU_UIII, "sceDisplaySetFramebuf"}, {0xEEDA2E54,WrapU_UUUI,"sceDisplayGetFrameBuf"}, {0x36CDFADE,WrapU_V, "sceDisplayWaitVblank"}, @@ -612,11 +645,11 @@ const HLEFunction sceDisplay[] = { {0x46F186C3,WrapU_V, "sceDisplayWaitVblankStartCB"}, {0x77ed8b3a,WrapU_I,"sceDisplayWaitVblankStartMultiCB"}, {0xdba6c4c4,WrapF_V,"sceDisplayGetFramePerSec"}, - {0x773dd3a3,sceDisplayGetCurrentHcount,"sceDisplayGetCurrentHcount"}, - {0x210eab3a,sceDisplayGetAccumulatedHcount,"sceDisplayGetAccumulatedHcount"}, - {0xA83EF139,0,"sceDisplayAdjustAccumulatedHcount"}, + {0x773dd3a3,WrapU_V,"sceDisplayGetCurrentHcount"}, + {0x210eab3a,WrapU_V,"sceDisplayGetAccumulatedHcount"}, + {0xA83EF139,WrapU_V,"sceDisplayAdjustAccumulatedHcount"}, {0x9C6EAAD7,WrapU_V,"sceDisplayGetVcount"}, - {0xDEA197D4,0,"sceDisplayGetMode"}, + {0xDEA197D4,WrapU_UUU,"sceDisplayGetMode"}, {0x7ED59BC4,0,"sceDisplaySetHoldMode"}, {0xA544C486,0,"sceDisplaySetResumeMode"}, {0xBF79F646,0,"sceDisplayGetResumeMode"}, From 0d5d735d3412784352315c4edfc12c54e8e215f6 Mon Sep 17 00:00:00 2001 From: raven02 Date: Tue, 5 Mar 2013 21:34:22 +0800 Subject: [PATCH 341/347] Wrap sceDisplayIsVblank as well --- Core/HLE/sceDisplay.cpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/Core/HLE/sceDisplay.cpp b/Core/HLE/sceDisplay.cpp index a61de017d939..8fc50a142c69 100644 --- a/Core/HLE/sceDisplay.cpp +++ b/Core/HLE/sceDisplay.cpp @@ -457,9 +457,9 @@ void hleLeaveVblank(u64 userdata, int cyclesLate) { CoreTiming::ScheduleEvent(msToCycles(frameMs - vblankMs) - cyclesLate, enterVblankEvent, userdata); } -void sceDisplayIsVblank() { +u32 sceDisplayIsVblank() { DEBUG_LOG(HLE,"%i=sceDisplayIsVblank()",isVblank); - RETURN(isVblank); + return isVblank; } u32 sceDisplaySetMode(int displayMode, int displayWidth, int displayHeight) { @@ -655,7 +655,7 @@ const HLEFunction sceDisplay[] = { {0xBF79F646,0,"sceDisplayGetResumeMode"}, {0xB4F378FA,WrapU_V,"sceDisplayIsForeground"}, {0x31C4BAA8,0,"sceDisplayGetBrightness"}, - {0x4D4E10EC,sceDisplayIsVblank,"sceDisplayIsVblank"}, + {0x4D4E10EC,WrapU_V,"sceDisplayIsVblank"}, {0x21038913,0,"sceDisplayIsVsync"}, }; From 4290700a1248e9612fcf63f4aa9d5bbc24d9e528 Mon Sep 17 00:00:00 2001 From: raven02 Date: Tue, 5 Mar 2013 22:43:04 +0800 Subject: [PATCH 342/347] OSK typo --- Core/Dialog/PSPOskDialog.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Core/Dialog/PSPOskDialog.cpp b/Core/Dialog/PSPOskDialog.cpp index 9e2c45d46938..7933c3579ae0 100644 --- a/Core/Dialog/PSPOskDialog.cpp +++ b/Core/Dialog/PSPOskDialog.cpp @@ -30,7 +30,7 @@ const char oskKeys[NUMKEYROWS][KEYSPERROW + 1] = { {'1','2','3','4','5','6','7','8','9','0','-','+','\0'}, - {'q','w','e','r','t','t','u','i','o','p','[',']','\0'}, + {'q','w','e','r','t','y','u','i','o','p','[',']','\0'}, {'a','s','d','f','g','h','j','k','l',';','@','~','\0'}, {'z','x','c','v','b','n','m',',','.','/','?','\\','\0'}, }; From 4da104618fb5d08849d61eaddf4465991d10991b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marcin=20Miko=C5=82ajczyk?= Date: Tue, 5 Mar 2013 16:01:25 +0100 Subject: [PATCH 343/347] Compile Portuguese (Brazilian) and Indonesian translations --- Qt/resources.qrc | 2 ++ 1 file changed, 2 insertions(+) diff --git a/Qt/resources.qrc b/Qt/resources.qrc index 1eee7d4c455c..b2e67dd43d82 100644 --- a/Qt/resources.qrc +++ b/Qt/resources.qrc @@ -24,5 +24,7 @@ languages/ppsspp_pl.qm languages/ppsspp_de.qm languages/ppsspp_tc.qm + languages/ppsspp_pt-br.qm + languages/ppsspp_id.qm From 9152d2f2bbc121335a0ad566c58a732bedd668d9 Mon Sep 17 00:00:00 2001 From: Sacha Date: Wed, 6 Mar 2013 00:36:27 +1000 Subject: [PATCH 344/347] Armjit: Optimise swl+swr and lwl+lwr cases that can be combined to a single sw or lw. Add shift flags to STR/LDR. Add EatInstruction to ArmJit. --- Common/ArmEmitter.cpp | 8 ++-- Common/ArmEmitter.h | 4 +- Core/MIPS/ARM/ArmCompALU.cpp | 2 +- Core/MIPS/ARM/ArmCompLoadStore.cpp | 65 ++++++++++++------------------ Core/MIPS/ARM/ArmJit.cpp | 10 +++++ Core/MIPS/ARM/ArmJit.h | 1 + 6 files changed, 44 insertions(+), 46 deletions(-) diff --git a/Common/ArmEmitter.cpp b/Common/ArmEmitter.cpp index 152f84259d43..70a91e2efaf6 100644 --- a/Common/ArmEmitter.cpp +++ b/Common/ArmEmitter.cpp @@ -609,9 +609,9 @@ void ARMXEmitter::STRH (ARMReg dest, ARMReg src, Operand2 op) Write32(condition | (0x04 << 20) | (src << 16) | (dest << 12) | ((Imm >> 4) << 8) | (0xB << 4) | (Imm & 0x0F)); } void ARMXEmitter::STRB (ARMReg dest, ARMReg src, Operand2 op) { WriteStoreOp(0x44, dest, src, op);} -void ARMXEmitter::STR (ARMReg dest, ARMReg base, ARMReg offset, bool Index, bool Add) +void ARMXEmitter::STR (ARMReg dest, ARMReg base, ARMReg offset, bool Index, bool Add, int shift, ShiftType type) { - Write32(condition | (0x60 << 20) | (Index << 24) | (Add << 23) | (dest << 16) | (base << 12) | offset); + Write32(condition | (0x60 << 20) | (Index << 24) | (Add << 23) | (dest << 16) | (base << 12) | (shift << 7) | (type << 5) | offset); } void ARMXEmitter::STRH (ARMReg dest, ARMReg base, ARMReg offset, bool Index, bool Add) { @@ -657,9 +657,9 @@ void ARMXEmitter::LDRSB(ARMReg dest, ARMReg src, Operand2 op) Write32(condition | (0x05 << 20) | (src << 16) | (dest << 12) | ((Imm >> 4) << 8) | (0xD << 4) | (Imm & 0x0F)); } -void ARMXEmitter::LDR (ARMReg dest, ARMReg base, ARMReg offset, bool Index, bool Add) +void ARMXEmitter::LDR (ARMReg dest, ARMReg base, ARMReg offset, bool Index, bool Add, int shift, ShiftType type) { - Write32(condition | (0x61 << 20) | (Index << 24) | (Add << 23) | (base << 16) | (dest << 12) | offset); + Write32(condition | (0x61 << 20) | (Index << 24) | (Add << 23) | (base << 16) | (dest << 12) | (shift << 7) | (type << 5) | offset); } void ARMXEmitter::LDRH (ARMReg dest, ARMReg base, ARMReg offset, bool Index, bool Add) { diff --git a/Common/ArmEmitter.h b/Common/ArmEmitter.h index a49a91104c6e..8f2b4e03bb4c 100644 --- a/Common/ArmEmitter.h +++ b/Common/ArmEmitter.h @@ -500,7 +500,7 @@ class ARMXEmitter void LDRB (ARMReg dest, ARMReg src, Operand2 op2 = 0); void LDRSB(ARMReg dest, ARMReg src, Operand2 op2 = 0); // Offset adds to the base register in LDR - void LDR (ARMReg dest, ARMReg base, ARMReg offset, bool Index, bool Add); + void LDR (ARMReg dest, ARMReg base, ARMReg offset, bool Index, bool Add, int shift = 0, ShiftType type = ST_LSL); void LDRH (ARMReg dest, ARMReg base, ARMReg offset, bool Index, bool Add); void LDRSH(ARMReg dest, ARMReg base, ARMReg offset, bool Index, bool Add); void LDRB (ARMReg dest, ARMReg base, ARMReg offset, bool Index, bool Add); @@ -511,7 +511,7 @@ class ARMXEmitter void STRH (ARMReg dest, ARMReg src, Operand2 op2 = 0); void STRB (ARMReg dest, ARMReg src, Operand2 op2 = 0); // Offset adds on to the destination register in STR - void STR (ARMReg dest, ARMReg base, ARMReg offset, bool Index, bool Add); + void STR (ARMReg dest, ARMReg base, ARMReg offset, bool Index, bool Add, int shift = 0, ShiftType type = ST_LSL); void STRH (ARMReg dest, ARMReg base, ARMReg offset, bool Index, bool Add); void STRB (ARMReg dest, ARMReg base, ARMReg offset, bool Index, bool Add); diff --git a/Core/MIPS/ARM/ArmCompALU.cpp b/Core/MIPS/ARM/ArmCompALU.cpp index 4edfd676408d..b0020a1a9a46 100644 --- a/Core/MIPS/ARM/ArmCompALU.cpp +++ b/Core/MIPS/ARM/ArmCompALU.cpp @@ -177,7 +177,7 @@ namespace MIPSComp default: DISABLE; } - } + } void Jit::Comp_RType3(u32 op) { diff --git a/Core/MIPS/ARM/ArmCompLoadStore.cpp b/Core/MIPS/ARM/ArmCompLoadStore.cpp index 692a78da669d..4dbb32de9b28 100644 --- a/Core/MIPS/ARM/ArmCompLoadStore.cpp +++ b/Core/MIPS/ARM/ArmCompLoadStore.cpp @@ -98,6 +98,32 @@ namespace MIPSComp // Don't load anything into $zr return; } + + // Optimisation: Combine to single unaligned load/store + switch(o) + { + case 34: //lwl + case 38: //lwr + load = true; + case 42: //swl + case 46: //swr + { + int left = (o == 34 || o == 42) ? 1 : -1; + u32 nextOp = Memory::Read_Instruction(js.compilerPC + 4); + // Find a matching shift in opposite direction with opposite offset. + u32 desiredOp = ((op + left* (4 << 26)) & 0xFFFF0000) + (offset - left*3); + if (!js.inDelaySlot && nextOp == desiredOp) + { + EatInstruction(nextOp); + nextOp = ((load ? 35 : 43) << 26) | (nextOp & 0x3FFFFFF); //lw, sw + Comp_ITypeMem(nextOp); + return; + } + } + default: + break; + } + switch (o) { case 32: //lb @@ -138,45 +164,6 @@ namespace MIPSComp return; } break; - /* - case 34: //lwl - { - Crash(); - //u32 shift = (addr & 3) << 3; - //u32 mem = ReadMem32(addr & 0xfffffffc); - //R(rt) = ( u32(R(rt)) & (0x00ffffff >> shift) ) | ( mem << (24 - shift) ); - } - break; - - case 38: //lwr - { - Crash(); - //u32 shift = (addr & 3) << 3; - //u32 mem = ReadMem32(addr & 0xfffffffc); - - //R(rt) = ( u32(rt) & (0xffffff00 << (24 - shift)) ) | ( mem >> shift ); - } - break; - - case 42: //swl - { - Crash(); - //u32 shift = (addr & 3) << 3; - //u32 mem = ReadMem32(addr & 0xfffffffc); - //WriteMem32((addr & 0xfffffffc), ( ( u32(R(rt)) >> (24 - shift) ) ) | - // ( mem & (0xffffff00 << shift) )); - } - break; - case 46: //swr - { - Crash(); - // u32 shift = (addr & 3) << 3; - // u32 mem = ReadMem32(addr & 0xfffffffc); -// -// WriteMem32((addr & 0xfffffffc), ( ( u32(R(rt)) << shift ) | -// (mem & (0x00ffffff >> (24 - shift)) ) ) ); - } - break;*/ default: Comp_Generic(op); return ; diff --git a/Core/MIPS/ARM/ArmJit.cpp b/Core/MIPS/ARM/ArmJit.cpp index 2984a5637aea..ae80235f825b 100644 --- a/Core/MIPS/ARM/ArmJit.cpp +++ b/Core/MIPS/ARM/ArmJit.cpp @@ -124,6 +124,16 @@ void Jit::CompileAt(u32 addr) MIPSCompileOp(op); } +void Jit::EatInstruction(u32 op) +{ + u32 info = MIPSGetInfo(op); + _dbg_assert_msg_(JIT, !(info & DELAYSLOT), "Never eat a branch op."); + _dbg_assert_msg_(JIT, !js.inDelaySlot, "Never eat an instruction inside a delayslot."); + + js.compilerPC += 4; + js.downcountAmount += MIPSGetInstructionCycleEstimate(op); +} + void Jit::CompileDelaySlot(int flags) { // preserve flag around the delay slot! Maybe this is not always necessary on ARM where diff --git a/Core/MIPS/ARM/ArmJit.h b/Core/MIPS/ARM/ArmJit.h index c9467dd46d9d..0d8618c507ef 100644 --- a/Core/MIPS/ARM/ArmJit.h +++ b/Core/MIPS/ARM/ArmJit.h @@ -147,6 +147,7 @@ class Jit : public ArmGen::ARMXCodeBlock void CompileDelaySlot(int flags); void CompileAt(u32 addr); + void EatInstruction(u32 op); void Comp_RunBlock(u32 op); // Ops From 7e67de33348c9f905705c705be1f6ccf0e639a76 Mon Sep 17 00:00:00 2001 From: Sacha Date: Wed, 6 Mar 2013 02:11:25 +1000 Subject: [PATCH 345/347] Armjit: Implement lwl, lwr, swl, swr in ARM JIT. lwr is currently disabled as it isn't working. --- Common/ArmEmitter.cpp | 1 + Common/ArmEmitter.h | 1 + Core/MIPS/ARM/ArmCompLoadStore.cpp | 37 +++++++++++++++++++++++++++++- 3 files changed, 38 insertions(+), 1 deletion(-) diff --git a/Common/ArmEmitter.cpp b/Common/ArmEmitter.cpp index 70a91e2efaf6..301224dc5c6f 100644 --- a/Common/ArmEmitter.cpp +++ b/Common/ArmEmitter.cpp @@ -504,6 +504,7 @@ void ARMXEmitter::LSL (ARMReg dest, ARMReg src, Operand2 op2) { WriteShiftedData void ARMXEmitter::LSLS(ARMReg dest, ARMReg src, Operand2 op2) { WriteShiftedDataOp(0, true, dest, src, op2);} void ARMXEmitter::LSL (ARMReg dest, ARMReg src, ARMReg op2) { WriteShiftedDataOp(1, false, dest, src, op2);} void ARMXEmitter::LSLS(ARMReg dest, ARMReg src, ARMReg op2) { WriteShiftedDataOp(1, true, dest, src, op2);} +void ARMXEmitter::LSR (ARMReg dest, ARMReg src, Operand2 op2) { WriteShiftedDataOp(3, false, dest, src, op2);} void ARMXEmitter::MUL (ARMReg dest, ARMReg src, ARMReg op2) { Write32(condition | (dest << 16) | (src << 8) | (9 << 4) | op2); diff --git a/Common/ArmEmitter.h b/Common/ArmEmitter.h index 8f2b4e03bb4c..4f5e2574a401 100644 --- a/Common/ArmEmitter.h +++ b/Common/ArmEmitter.h @@ -444,6 +444,7 @@ class ARMXEmitter void LSL (ARMReg dest, ARMReg src, ARMReg op2); void LSLS(ARMReg dest, ARMReg src, Operand2 op2); void LSLS(ARMReg dest, ARMReg src, ARMReg op2); + void LSR (ARMReg dest, ARMReg src, Operand2 op2); void SBC (ARMReg dest, ARMReg src, Operand2 op2); void SBCS(ARMReg dest, ARMReg src, Operand2 op2); void RBIT(ARMReg dest, ARMReg src); diff --git a/Core/MIPS/ARM/ArmCompLoadStore.cpp b/Core/MIPS/ARM/ArmCompLoadStore.cpp index 4dbb32de9b28..2f7e92c84dc8 100644 --- a/Core/MIPS/ARM/ArmCompLoadStore.cpp +++ b/Core/MIPS/ARM/ArmCompLoadStore.cpp @@ -90,7 +90,7 @@ namespace MIPSComp { CONDITIONAL_DISABLE; int offset = (signed short)(op&0xFFFF); - bool load = false; + bool shifter = false, load = false; int rt = _RT; int rs = _RS; int o = op>>26; @@ -119,6 +119,7 @@ namespace MIPSComp Comp_ITypeMem(nextOp); return; } + shifter = true; } default: break; @@ -128,14 +129,25 @@ namespace MIPSComp { case 32: //lb case 33: //lh + case 34: //lwl case 35: //lw case 36: //lbu case 37: //lhu + case 38: //lwr load = true; case 40: //sb case 41: //sh + case 42: //swl case 43: //sw + case 46: //swr if (g_Config.bFastMemory) { + int shift = 0; + if (o == 38) DISABLE; // Crashes, so disable for now. + if (shifter) + { + shift = (offset & 3) << 3; + offset &= 0xfffffffc; + } if (gpr.IsImm(rs)) { // We can compute the full address at compile time. Kickass. u32 addr = (offset + gpr.GetImm(rs)) & 0x3FFFFFFF; @@ -149,12 +161,35 @@ namespace MIPSComp switch (o) { // Load + case 34: + AND(gpr.R(rt), gpr.R(rt), 0x00ffffff >> shift); + LDR(R0, R11, R0, true, true, 24 - shift, ST_LSL); + ORR(gpr.R(rt), gpr.R(rt), R0); + break; + case 38: + AND(gpr.R(rt), gpr.R(rt), 0xffffff00 << (24 - shift)); + // Current this shifted LDR crashes, so it has been disabled + LDR(R0, R11, R0, true, true, shift, ST_LSR); + ORR(gpr.R(rt), gpr.R(rt), R0); + break; case 35: LDR (gpr.R(rt), R11, R0, true, true); break; case 37: LDRH (gpr.R(rt), R11, R0, true, true); break; case 33: LDRSH(gpr.R(rt), R11, R0, true, true); break; case 36: LDRB (gpr.R(rt), R11, R0, true, true); break; case 32: LDRSB(gpr.R(rt), R11, R0, true, true); break; // Store + case 42: + LSR(gpr.R(rt), gpr.R(rt), 24-shift); + STR(R0, gpr.R(rt), R11, true, true); + AND(R0, R0, 0xffffff00 << shift); + ORR(R0, R0, gpr.R(rt)); + break; + case 46: + LSL(gpr.R(rt), gpr.R(rt), shift); + STR(R0, gpr.R(rt), R11, true, true); + AND(R0, R0, 0x00ffffff >> (24 - shift)); + ORR(R0, R0, gpr.R(rt)); + break; case 43: STR (R0, gpr.R(rt), R11, true, true); break; case 41: STRH (R0, gpr.R(rt), R11, true, true); break; case 40: STRB (R0, gpr.R(rt), R11, true, true); break; From 5a134243a7009b99cb87f8d988b0d9898bfd0f30 Mon Sep 17 00:00:00 2001 From: Sacha Date: Wed, 6 Mar 2013 03:28:28 +1000 Subject: [PATCH 346/347] Armjit: Fix lwl, lwr and enable again. Thanks Sonic. --- Common/ArmEmitter.cpp | 16 ++++++++++++---- Common/ArmEmitter.h | 6 ++++-- Core/MIPS/ARM/ArmCompLoadStore.cpp | 10 ++++------ 3 files changed, 20 insertions(+), 12 deletions(-) diff --git a/Common/ArmEmitter.cpp b/Common/ArmEmitter.cpp index 301224dc5c6f..1f58aefd02ba 100644 --- a/Common/ArmEmitter.cpp +++ b/Common/ArmEmitter.cpp @@ -610,9 +610,13 @@ void ARMXEmitter::STRH (ARMReg dest, ARMReg src, Operand2 op) Write32(condition | (0x04 << 20) | (src << 16) | (dest << 12) | ((Imm >> 4) << 8) | (0xB << 4) | (Imm & 0x0F)); } void ARMXEmitter::STRB (ARMReg dest, ARMReg src, Operand2 op) { WriteStoreOp(0x44, dest, src, op);} -void ARMXEmitter::STR (ARMReg dest, ARMReg base, ARMReg offset, bool Index, bool Add, int shift, ShiftType type) +void ARMXEmitter::STR (ARMReg dest, ARMReg base, Operand2 op2, bool Index, bool Add) { - Write32(condition | (0x60 << 20) | (Index << 24) | (Add << 23) | (dest << 16) | (base << 12) | (shift << 7) | (type << 5) | offset); + Write32(condition | (0x60 << 20) | (Index << 24) | (Add << 23) | (dest << 16) | (base << 12) | op2.IMMSR()); +} +void ARMXEmitter::STR (ARMReg dest, ARMReg base, ARMReg offset, bool Index, bool Add) +{ + Write32(condition | (0x60 << 20) | (Index << 24) | (Add << 23) | (dest << 16) | (base << 12) | offset); } void ARMXEmitter::STRH (ARMReg dest, ARMReg base, ARMReg offset, bool Index, bool Add) { @@ -658,9 +662,13 @@ void ARMXEmitter::LDRSB(ARMReg dest, ARMReg src, Operand2 op) Write32(condition | (0x05 << 20) | (src << 16) | (dest << 12) | ((Imm >> 4) << 8) | (0xD << 4) | (Imm & 0x0F)); } -void ARMXEmitter::LDR (ARMReg dest, ARMReg base, ARMReg offset, bool Index, bool Add, int shift, ShiftType type) +void ARMXEmitter::LDR (ARMReg dest, ARMReg base, Operand2 op2, bool Index, bool Add) +{ + Write32(condition | (0x61 << 20) | (Index << 24) | (Add << 23) | (base << 16) | (dest << 12) | op2.IMMSR()); +} +void ARMXEmitter::LDR (ARMReg dest, ARMReg base, ARMReg offset, bool Index, bool Add) { - Write32(condition | (0x61 << 20) | (Index << 24) | (Add << 23) | (base << 16) | (dest << 12) | (shift << 7) | (type << 5) | offset); + Write32(condition | (0x61 << 20) | (Index << 24) | (Add << 23) | (base << 16) | (dest << 12) | offset); } void ARMXEmitter::LDRH (ARMReg dest, ARMReg base, ARMReg offset, bool Index, bool Add) { diff --git a/Common/ArmEmitter.h b/Common/ArmEmitter.h index 4f5e2574a401..feab20eb86cd 100644 --- a/Common/ArmEmitter.h +++ b/Common/ArmEmitter.h @@ -501,7 +501,8 @@ class ARMXEmitter void LDRB (ARMReg dest, ARMReg src, Operand2 op2 = 0); void LDRSB(ARMReg dest, ARMReg src, Operand2 op2 = 0); // Offset adds to the base register in LDR - void LDR (ARMReg dest, ARMReg base, ARMReg offset, bool Index, bool Add, int shift = 0, ShiftType type = ST_LSL); + void LDR (ARMReg dest, ARMReg base, Operand2 op2, bool Index, bool Add); + void LDR (ARMReg dest, ARMReg base, ARMReg offset, bool Index, bool Add); void LDRH (ARMReg dest, ARMReg base, ARMReg offset, bool Index, bool Add); void LDRSH(ARMReg dest, ARMReg base, ARMReg offset, bool Index, bool Add); void LDRB (ARMReg dest, ARMReg base, ARMReg offset, bool Index, bool Add); @@ -512,7 +513,8 @@ class ARMXEmitter void STRH (ARMReg dest, ARMReg src, Operand2 op2 = 0); void STRB (ARMReg dest, ARMReg src, Operand2 op2 = 0); // Offset adds on to the destination register in STR - void STR (ARMReg dest, ARMReg base, ARMReg offset, bool Index, bool Add, int shift = 0, ShiftType type = ST_LSL); + void STR (ARMReg dest, ARMReg base, Operand2 op2, bool Index, bool Add); + void STR (ARMReg dest, ARMReg base, ARMReg offset, bool Index, bool Add); void STRH (ARMReg dest, ARMReg base, ARMReg offset, bool Index, bool Add); void STRB (ARMReg dest, ARMReg base, ARMReg offset, bool Index, bool Add); diff --git a/Core/MIPS/ARM/ArmCompLoadStore.cpp b/Core/MIPS/ARM/ArmCompLoadStore.cpp index 2f7e92c84dc8..37e153fcc1fc 100644 --- a/Core/MIPS/ARM/ArmCompLoadStore.cpp +++ b/Core/MIPS/ARM/ArmCompLoadStore.cpp @@ -142,7 +142,6 @@ namespace MIPSComp case 46: //swr if (g_Config.bFastMemory) { int shift = 0; - if (o == 38) DISABLE; // Crashes, so disable for now. if (shifter) { shift = (offset & 3) << 3; @@ -163,14 +162,13 @@ namespace MIPSComp // Load case 34: AND(gpr.R(rt), gpr.R(rt), 0x00ffffff >> shift); - LDR(R0, R11, R0, true, true, 24 - shift, ST_LSL); - ORR(gpr.R(rt), gpr.R(rt), R0); + LDR(R0, R11, R0, true, true); + ORR(gpr.R(rt), gpr.R(rt), Operand2(24 - shift, ST_LSL, R0)); break; case 38: AND(gpr.R(rt), gpr.R(rt), 0xffffff00 << (24 - shift)); - // Current this shifted LDR crashes, so it has been disabled - LDR(R0, R11, R0, true, true, shift, ST_LSR); - ORR(gpr.R(rt), gpr.R(rt), R0); + LDR(R0, R11, R0, true, true); + ORR(gpr.R(rt), gpr.R(rt), Operand2(shift, ST_LSR, R0)); break; case 35: LDR (gpr.R(rt), R11, R0, true, true); break; case 37: LDRH (gpr.R(rt), R11, R0, true, true); break; From 1b0efd2c4453ff0dbb9f516564f2a71c294aa194 Mon Sep 17 00:00:00 2001 From: Chris Date: Tue, 5 Mar 2013 18:43:17 +0100 Subject: [PATCH 347/347] Add French translation to Qt4 UI Almost full translation of the UI (missing some too scientific words or expressions, but as almost all the untranslated words are in the debuging menu, it won't affect the user who just wants to play) --- Qt/languages/ppsspp_fr.ts | 189 +++++++++++++++++++------------------- 1 file changed, 95 insertions(+), 94 deletions(-) diff --git a/Qt/languages/ppsspp_fr.ts b/Qt/languages/ppsspp_fr.ts index ce5006357e81..093fd8597558 100644 --- a/Qt/languages/ppsspp_fr.ts +++ b/Qt/languages/ppsspp_fr.ts @@ -7,7 +7,7 @@ Controls Controls window title - + ContrΓ΄les @@ -376,22 +376,22 @@ Gamepad Configuration - + Configuration du pad GamePad List - + Liste des controlleurs de jeu Refresh - + RafraΓ®chir Select - + SΓ©lectionner @@ -406,22 +406,22 @@ Assign Gamepad input - + Assigner la touche du pad to PSP button/axis - + au boutton PSP Assign - + Assigner Press buttons on your gamePad to verify mapping : - + VΓ©rifier les contrΓ΄les en appuyant sur les bouttons du pad : @@ -511,12 +511,12 @@ G3D - + G3D HLE - + HLE @@ -526,37 +526,37 @@ Lo&g Levels - + Op&tions du journal &Language - + &Langue &Video - + &Video &Anisotropic filtering - + &Filtrage anisotrope &Zoom - + &Zoom Co&ntrols - + Co&ntrΓ΄les &Core - + &Emulation @@ -576,37 +576,37 @@ - - + - Quickload state - + Chargement rapide F4 - + F4 Quicksave state - + Sauvegarde rapide F2 - + F2 &Load State File... - + &Charger... &Save State File... - + &Sauvegarder... @@ -616,42 +616,43 @@ &Run - + &DΓ©marrer F7 - + F7 &Pause - + &Pause F8 - + F8 R&eset - + R&eset &Interpreter - + &Interpreteur &Slightly Faster Interpreter - + Could delete the "un peu" which means slightly but takes a lot of space + &Interpreteur un peu plus rapide &Dynarec - + &DRC @@ -676,17 +677,17 @@ Ctrl+D - + Ctrl+D &Log Console - + &Journal d'Γ©vΓ©nements Ctrl+L - + Ctrl+L @@ -696,87 +697,87 @@ Ctrl+M - + Ctrl+M &Keyboard - + &Clavier &Toggle fullscreen - + &Plein Γ©cran Show &debug statistics - + Afficher &les statistiques de dΓ©bogage I&gnore illegal reads/writes - + I&gnorer les Γ©critures/lectures illΓ©gales &Gamepad - + &Pad Run on loa&d - + Lancer au cha&rgement Show &FPS counter - + Afficher &les FPS S&tretch to display - + A&dapter Γ  l'Γ©cran &Sound emulation - + &Son F12 - + F12 &Buffered Rendering - + &Rendu Tampon F5 - + F5 &Hardware Transform - + &Hardware Transform F6 - + F6 &Linear Filtering - + &Filtrage LinΓ©aire &Wireframe (experimental) - + &Rendu en fil de fer (expΓ©rimental) @@ -786,90 +787,90 @@ Screen &1x - + &1x Ctrl+1 - + Ctrl+1 Screen &2x - + &2x Ctrl+2 - + Ctrl+2 Screen &3x - + &3x Ctrl+3 - + Ctrl+3 Screen &4x - + &4x Ctrl+4 - + Ctrl+4 &Fast Memory (dynarec, unstable) - + &MΓ©moire Rapide (DRC, instable) &Go to http://www.ppsspp.org/ - + &Aller Γ  http://www.ppsspp.org/ &About PPSSPP... - + &A propos de PPSSPP... &Use VBO - + &Utiliser les VBO Debug - + DΓ©bogage Warning - + Avertissement Error - + Erreur Info - + Informations @@ -879,7 +880,7 @@ &Vertex Cache - + &Cache du Vertex @@ -889,37 +890,37 @@ Simple 2xAA - + 2x AA Off - + Off 2x - + 2x 4x - + 4x 8x - + 8x 16x - + 16x No translations - + Pas de traductions @@ -927,87 +928,87 @@ Cross - + Croix Circle - + Rond Square - + CarrΓ© Triangle - + Triangle Left Trigger - + Boutton L Right Trigger - + Boutton R Start - + Start Select - + Select Up - + Haut Down - + Bas Left - + Gauche Right - + Droite Home - + Accueil Stick left - + Stick : Gauche Stick right - + Stick : Droite Stick up - + Stick : Haut Stick bottom - + Stick : Bas

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∨c+@-k2FEL4JN&9w*4$Yr zeb(ZB8#-9SF3pg(c-XmyQ(2hX@*h(NbcjgVz&rMP?e)i_>RH@BN~EyKg7A<7VwAm& zW+)isTEe{0*QRP`*4R{bC6V9B(z|-T_fk!m8-0!HkO|TL(NbmWeX3ERcT5t- znDeCbseqT9ncNGWNwtC5B4m^nPiHe*(}e`{)?F8z7sZ?W%0D(uB>DUe`s6stV0R&% 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