diff --git a/Utilities/BEType.h b/Utilities/BEType.h index 37d04f517a..dbb289208e 100644 --- a/Utilities/BEType.h +++ b/Utilities/BEType.h @@ -556,7 +556,6 @@ private: return m_data; } -public: type ToLE() const { return se_t::from_be(m_data); @@ -572,6 +571,7 @@ public: m_data = se_t::to_be(value); } +public: static be_t MakeFromLE(const type& value) { stype data = se_t::to_be(value); diff --git a/Utilities/StrFmt.h b/Utilities/StrFmt.h index c89f08e1d9..8e9c2bfb5a 100644 --- a/Utilities/StrFmt.h +++ b/Utilities/StrFmt.h @@ -656,9 +656,12 @@ namespace fmt enum of any appropriate type in this list External specializations (can be found in another headers): - vm::ps3::ptr (vm_ptr.h) (of appropriate address type, writing .addr() for printing can be avoided) + vm::ps3::ptr (vm_ptr.h) (with appropriate address type, using .addr() can be avoided) vm::ps3::bptr (vm_ptr.h) vm::psv::ptr (vm_ptr.h) + vm::ps3::ref (vm_ref.h) + vm::ps3::bref (vm_ref.h) + vm::psv::ref (vm_ref.h) Supported formatting: %d - decimal; only basic std::to_string() functionality diff --git a/Utilities/Thread.cpp b/Utilities/Thread.cpp index 209ab5c01b..1af3f5da95 100644 --- a/Utilities/Thread.cpp +++ b/Utilities/Thread.cpp @@ -184,7 +184,7 @@ void decode_x64_reg_op(const u8* code, x64_op_t& decoded_op, x64_reg_t& decoded_ } default: { - throw fmt::Format("decode_x64_reg_op(%.16llX): unsupported opcode found (0x%.2X, 0x%.2X, 0x%.2X)", code - decoded_size, op1, code[0], code[1]); + throw fmt::Format("decode_x64_reg_op(%.16llXh): unsupported opcode found (0x%.2X, 0x%.2X, 0x%.2X)", code - decoded_size, op1, code[0], code[1]); } } } @@ -198,7 +198,7 @@ void _se_translator(unsigned int u, EXCEPTION_POINTERS* pExp) if (u == EXCEPTION_ACCESS_VIOLATION && addr64 < 0x100000000ull) { const u32 addr = (u32)addr64; - if (addr >= RAW_SPU_BASE_ADDR && (addr % RAW_SPU_OFFSET) >= RAW_SPU_PROB_OFFSET) // RawSPU MMIO registers + if (addr - RAW_SPU_BASE_ADDR < (6 * RAW_SPU_OFFSET) && (addr % RAW_SPU_OFFSET) >= RAW_SPU_PROB_OFFSET) // RawSPU MMIO registers { // one x64 instruction is manually decoded and interpreted x64_op_t op; @@ -265,15 +265,7 @@ void _se_translator(unsigned int u, EXCEPTION_POINTERS* pExp) // it's dangerous because destructors won't be executed } // TODO: allow recovering from a page fault as a feature of PS3 virtual memory - if (CPUThread* t = GetCurrentCPUThread()) - { - throw fmt::Format("Access violation %s location 0x%x (is_alive=%d, last_syscall=0x%llx (%s))", is_writing ? "writing" : "reading", (u32)addr, - t->IsAlive() ? 1 : 0, t->m_last_syscall, SysCalls::GetHLEFuncName((u32)t->m_last_syscall).c_str()); - } - else - { - throw fmt::Format("Access violation %s location 0x%x", is_writing ? "writing" : "reading", (u32)addr); - } + throw fmt::Format("Access violation %s location 0x%x", is_writing ? "writing" : "reading", addr); } // else some fatal error (should crash) @@ -296,7 +288,7 @@ void signal_handler(int sig, siginfo_t* info, void* uct) if (addr64 < 0x100000000ull) { const u32 addr = (u32)addr64; - if (addr >= RAW_SPU_BASE_ADDR && (addr % RAW_SPU_OFFSET) >= RAW_SPU_PROB_OFFSET) // RawSPU MMIO registers + if (addr - RAW_SPU_BASE_ADDR < (6 * RAW_SPU_OFFSET) && (addr % RAW_SPU_OFFSET) >= RAW_SPU_PROB_OFFSET) // RawSPU MMIO registers { // one x64 instruction is manually decoded and interpreted x64_op_t op; @@ -363,15 +355,7 @@ void signal_handler(int sig, siginfo_t* info, void* uct) } // TODO: allow recovering from a page fault as a feature of PS3 virtual memory - if (CPUThread* t = GetCurrentCPUThread()) - { - throw fmt::Format("Access violation %s location 0x%x (is_alive=%d, last_syscall=0x%llx (%s))", /*is_writing ? "writing" : "reading"*/ "at", (u32)addr, - t->IsAlive() ? 1 : 0, t->m_last_syscall, SysCalls::GetHLEFuncName((u32)t->m_last_syscall).c_str()); - } - else - { - throw fmt::Format("Access violation %s location 0x%x", /*is_writing ? "writing" : "reading"*/ "at", (u32)addr); - } + throw fmt::Format("Access violation %s location 0x%x", /*is_writing ? "writing" : "reading"*/ "at", addr); } // else some fatal error diff --git a/rpcs3/Emu/Audio/AudioDumper.h b/rpcs3/Emu/Audio/AudioDumper.h index ebf0f1db25..b9734eea24 100644 --- a/rpcs3/Emu/Audio/AudioDumper.h +++ b/rpcs3/Emu/Audio/AudioDumper.h @@ -67,5 +67,5 @@ public: void WriteHeader(); size_t WriteData(const void* buffer, size_t size); void Finalize(); - const u8 GetCh() const { return (u8)m_header.FMT.NumChannels; } + const u16 GetCh() const { return m_header.FMT.NumChannels; } }; diff --git a/rpcs3/Emu/CPU/CPUThread.cpp b/rpcs3/Emu/CPU/CPUThread.cpp index a4bcf1b3ef..826a593806 100644 --- a/rpcs3/Emu/CPU/CPUThread.cpp +++ b/rpcs3/Emu/CPU/CPUThread.cpp @@ -310,12 +310,14 @@ void CPUThread::Task() } catch (const std::string& e) { - LOG_ERROR(GENERAL, "Exception: %s", e.c_str()); + LOG_ERROR(GENERAL, "Exception: %s (is_alive=%d, m_last_syscall=0x%llx (%s))", e, IsAlive(), m_last_syscall, SysCalls::GetHLEFuncName((u32)m_last_syscall)); + LOG_NOTICE(GENERAL, RegsToString()); Emu.Pause(); } catch (const char* e) { - LOG_ERROR(GENERAL, "Exception: %s", e); + LOG_ERROR(GENERAL, "Exception: %s (is_alive=%d, m_last_syscall=0x%llx (%s))", e, IsAlive(), m_last_syscall, SysCalls::GetHLEFuncName((u32)m_last_syscall)); + LOG_NOTICE(GENERAL, RegsToString()); Emu.Pause(); } diff --git a/rpcs3/Emu/Cell/PPUInterpreter.h b/rpcs3/Emu/Cell/PPUInterpreter.h index aa9bba0244..ba6ad22b1e 100644 --- a/rpcs3/Emu/Cell/PPUInterpreter.h +++ b/rpcs3/Emu/Cell/PPUInterpreter.h @@ -17,8 +17,6 @@ #define _rotl64(x,r) (((u64)(x) << (r)) | ((u64)(x) >> (64 - (r)))) #endif -#define UNIMPLEMENTED() UNK(__FUNCTION__) - #if 0//def _DEBUG #define HLE_CALL_DEBUG #endif @@ -98,7 +96,7 @@ private: void NULL_OP() { - UNK("null"); + throw "Null operation"; } void NOP() @@ -168,8 +166,7 @@ private: case 0x117: return CPU.SPRG[n - 0x110]; } - UNK(fmt::Format("ReadSPR error: Unknown SPR 0x%x!", n)); - return CPU.XER.XER; + throw fmt::Format("ReadSPR(0x%x) error: unknown SPR (0x%x)", spr, n); } void WriteSPR(u32 spr, u64 value) @@ -190,8 +187,8 @@ private: case 0x106: case 0x107: CPU.USPRG[n - 0x100] = value; return; - case 0x10C: UNK("WriteSPR: Write to time-based SPR. Report this to a developer!"); return; - case 0x10D: UNK("WriteSPR: Write to time-based SPR upper. Report this to a developer!"); return; + case 0x10C: throw fmt::Format("WriteSPR(0x10C, 0x%llx): Write to time-based SPR", value); + case 0x10D: throw fmt::Format("WriteSPR(0x10D, 0x%llx): Write to time-based SPR", value); case 0x110: case 0x111: @@ -203,8 +200,7 @@ private: case 0x117: CPU.SPRG[n - 0x110] = value; return; } - UNK(fmt::Format("WriteSPR error: Unknown SPR 0x%x!", n)); - return; + throw fmt::Format("WriteSPR(0x%x, 0x%llx) error: unknown SPR (0x%x)", spr, value, n); } void TDI(u32 to, u32 ra, s32 simm16) @@ -217,7 +213,7 @@ private: ((u64)a < (u64)simm16 && (to & 0x2)) || ((u64)a > (u64)simm16 && (to & 0x1)) ) { - UNK(fmt::Format("Trap! (tdi 0x%x, r%d, 0x%x)", to, ra, simm16)); + throw fmt::Format("Trap! (tdi 0x%x, r%d, 0x%x)", to, ra, simm16); } } @@ -231,7 +227,7 @@ private: ((u32)a < (u32)simm16 && (to & 0x2)) || ((u32)a > (u32)simm16 && (to & 0x1)) ) { - UNK(fmt::Format("Trap! (twi 0x%x, r%d, 0x%x)", to, ra, simm16)); + throw fmt::Format("Trap! (twi 0x%x, r%d, 0x%x)", to, ra, simm16); } } @@ -2169,7 +2165,7 @@ private: switch (lev) { case 0x0: SysCall(); break; - case 0x1: UNK("HyperCall LV1"); break; + case 0x1: throw "SC(): HyperCall LV1"; case 0x2: Emu.GetSFuncManager().StaticExecute(CPU, (u32)CPU.GPR[11]); if (Ini.HLELogging.GetValue()) @@ -2179,7 +2175,7 @@ private: } break; case 0x3: CPU.FastStop(); break; - default: UNK(fmt::Format("Unknown sc: 0x%x", lev)); break; + default: throw fmt::Format("SC(): unknown level (0x%x)", lev); } } void B(s32 ll, u32 aa, u32 lk) @@ -2343,7 +2339,7 @@ private: ((u32)a < (u32)b && (to & 0x2)) || ((u32)a > (u32)b && (to & 0x1)) ) { - UNK(fmt::Format("Trap! (tw 0x%x, r%d, r%d)", to, ra, rb)); + throw fmt::Format("Trap! (tw 0x%x, r%d, r%d)", to, ra, rb); } } void LVSL(u32 vd, u32 ra, u32 rb) @@ -2376,13 +2372,7 @@ private: void LVEBX(u32 vd, u32 ra, u32 rb) { const u64 addr = ra ? CPU.GPR[ra] + CPU.GPR[rb] : CPU.GPR[rb]; - if ((u32)addr != addr) - { - LOG_ERROR(PPU, "%s(): invalid address (0x%llx)", __FUNCTION__, addr); - Emu.Pause(); - return; - } - CPU.VPR[vd]._u8[15 - (addr & 0xf)] = vm::read8((u32)addr); + CPU.VPR[vd]._u8[15 - (addr & 0xf)] = vm::read8(vm::cast(addr)); // check LVEWX comments } void SUBFC(u32 rd, u32 ra, u32 rb, u32 oe, bool rc) @@ -2391,7 +2381,7 @@ private: const u64 RB = CPU.GPR[rb]; CPU.GPR[rd] = ~RA + RB + 1; CPU.XER.CA = CPU.IsCarry(~RA, RB, 1); - if(oe) UNK("subfco"); + if(oe) throw "SUBFC(): subfco"; if(rc) CPU.UpdateCR0(CPU.GPR[rd]); } void ADDC(u32 rd, u32 ra, u32 rb, u32 oe, bool rc) @@ -2400,7 +2390,7 @@ private: const s64 RB = CPU.GPR[rb]; CPU.GPR[rd] = RA + RB; CPU.XER.CA = CPU.IsCarry(RA, RB); - if(oe) UNK("addco"); + if(oe) throw "ADDC(): addco"; if(rc) CPU.UpdateCR0(CPU.GPR[rd]); } void MULHDU(u32 rd, u32 ra, u32 rb, bool rc) @@ -2448,36 +2438,18 @@ private: void LWARX(u32 rd, u32 ra, u32 rb) { CPU.R_ADDR = ra ? CPU.GPR[ra] + CPU.GPR[rb] : CPU.GPR[rb]; - if ((u32)CPU.R_ADDR != CPU.R_ADDR) - { - LOG_ERROR(PPU, "%s(): invalid address (0x%llx)", __FUNCTION__, CPU.R_ADDR); - Emu.Pause(); - return; - } - CPU.R_VALUE = vm::get_ref((u32)CPU.R_ADDR); + CPU.R_VALUE = vm::get_ref(vm::cast(CPU.R_ADDR)); CPU.GPR[rd] = re32((u32)CPU.R_VALUE); } void LDX(u32 rd, u32 ra, u32 rb) { const u64 addr = ra ? CPU.GPR[ra] + CPU.GPR[rb] : CPU.GPR[rb]; - if ((u32)addr != addr) - { - LOG_ERROR(PPU, "%s(): invalid address (0x%llx)", __FUNCTION__, addr); - Emu.Pause(); - return; - } - CPU.GPR[rd] = vm::read64((u32)addr); + CPU.GPR[rd] = vm::read64(vm::cast(addr)); } void LWZX(u32 rd, u32 ra, u32 rb) { const u64 addr = ra ? CPU.GPR[ra] + CPU.GPR[rb] : CPU.GPR[rb]; - if ((u32)addr != addr) - { - LOG_ERROR(PPU, "%s(): invalid address (0x%llx)", __FUNCTION__, addr); - Emu.Pause(); - return; - } - CPU.GPR[rd] = vm::read32((u32)addr); + CPU.GPR[rd] = vm::read32(vm::cast(addr)); } void SLW(u32 ra, u32 rs, u32 rb, bool rc) { @@ -2549,31 +2521,19 @@ private: void LVEHX(u32 vd, u32 ra, u32 rb) { const u64 addr = (ra ? CPU.GPR[ra] + CPU.GPR[rb] : CPU.GPR[rb]) & ~1ULL; - if ((u32)addr != addr) - { - LOG_ERROR(PPU, "%s(): invalid address (0x%llx)", __FUNCTION__, addr); - Emu.Pause(); - return; - } - CPU.VPR[vd]._u16[7 - ((addr >> 1) & 0x7)] = vm::read16((u32)addr); + CPU.VPR[vd]._u16[7 - ((addr >> 1) & 0x7)] = vm::read16(vm::cast(addr)); // check LVEWX comments } void SUBF(u32 rd, u32 ra, u32 rb, u32 oe, bool rc) { CPU.GPR[rd] = CPU.GPR[rb] - CPU.GPR[ra]; - if(oe) UNK("subfo"); + if(oe) throw "SUBF(): subfo"; if(rc) CPU.UpdateCR0(CPU.GPR[rd]); } void LDUX(u32 rd, u32 ra, u32 rb) { const u64 addr = CPU.GPR[ra] + CPU.GPR[rb]; - if ((u32)addr != addr) - { - LOG_ERROR(PPU, "%s(): invalid address (0x%llx)", __FUNCTION__, addr); - Emu.Pause(); - return; - } - CPU.GPR[rd] = vm::read64((u32)addr); + CPU.GPR[rd] = vm::read64(vm::cast(addr)); CPU.GPR[ra] = addr; } void DCBST(u32 ra, u32 rb) @@ -2582,13 +2542,7 @@ private: void LWZUX(u32 rd, u32 ra, u32 rb) { const u64 addr = CPU.GPR[ra] + CPU.GPR[rb]; - if ((u32)addr != addr) - { - LOG_ERROR(PPU, "%s(): invalid address (0x%llx)", __FUNCTION__, addr); - Emu.Pause(); - return; - } - CPU.GPR[rd] = vm::read32((u32)addr); + CPU.GPR[rd] = vm::read32(vm::cast(addr)); CPU.GPR[ra] = addr; } void CNTLZD(u32 ra, u32 rs, bool rc) @@ -2609,18 +2563,12 @@ private: } void TD(u32 to, u32 ra, u32 rb) { - UNK("td"); + throw "TD()"; } void LVEWX(u32 vd, u32 ra, u32 rb) { const u64 addr = (ra ? CPU.GPR[ra] + CPU.GPR[rb] : CPU.GPR[rb]) & ~3ULL; - if ((u32)addr != addr) - { - LOG_ERROR(PPU, "%s(): invalid address (0x%llx)", __FUNCTION__, addr); - Emu.Pause(); - return; - } - CPU.VPR[vd]._u32[3 - ((addr >> 2) & 0x3)] = vm::read32((u32)addr); + CPU.VPR[vd]._u32[3 - ((addr >> 2) & 0x3)] = vm::read32(vm::cast(addr)); // It's not very good idea to implement it using read128(), // because it can theoretically read RawSPU 32-bit MMIO register (read128() will fail) //CPU.VPR[vd] = vm::read128((ra ? CPU.GPR[ra] + CPU.GPR[rb] : CPU.GPR[rb]) & ~0xfULL); @@ -2640,13 +2588,7 @@ private: void LDARX(u32 rd, u32 ra, u32 rb) { CPU.R_ADDR = ra ? CPU.GPR[ra] + CPU.GPR[rb] : CPU.GPR[rb]; - if ((u32)CPU.R_ADDR != CPU.R_ADDR) - { - LOG_ERROR(PPU, "%s(): invalid address (0x%llx)", __FUNCTION__, CPU.R_ADDR); - Emu.Pause(); - return; - } - CPU.R_VALUE = vm::get_ref((u32)CPU.R_ADDR); + CPU.R_VALUE = vm::get_ref(vm::cast(CPU.R_ADDR)); CPU.GPR[rd] = re64(CPU.R_VALUE); } void DCBF(u32 ra, u32 rb) @@ -2655,13 +2597,7 @@ private: void LBZX(u32 rd, u32 ra, u32 rb) { const u64 addr = ra ? CPU.GPR[ra] + CPU.GPR[rb] : CPU.GPR[rb]; - if ((u32)addr != addr) - { - LOG_ERROR(PPU, "%s(): invalid address (0x%llx)", __FUNCTION__, addr); - Emu.Pause(); - return; - } - CPU.GPR[rd] = vm::read8((u32)addr); + CPU.GPR[rd] = vm::read8(vm::cast(addr)); } void LVX(u32 vd, u32 ra, u32 rb) { @@ -2670,7 +2606,7 @@ private: void NEG(u32 rd, u32 ra, u32 oe, bool rc) { CPU.GPR[rd] = 0-CPU.GPR[ra]; - if(oe) UNK("nego"); + if(oe) throw "NEG(): nego"; if(rc) CPU.UpdateCR0(CPU.GPR[rd]); } void LBZUX(u32 rd, u32 ra, u32 rb) @@ -2678,13 +2614,7 @@ private: //if(ra == 0 || ra == rd) throw "Bad instruction [LBZUX]"; const u64 addr = CPU.GPR[ra] + CPU.GPR[rb]; - if ((u32)addr != addr) - { - LOG_ERROR(PPU, "%s(): invalid address (0x%llx)", __FUNCTION__, addr); - Emu.Pause(); - return; - } - CPU.GPR[rd] = vm::read8((u32)addr); + CPU.GPR[rd] = vm::read8(vm::cast(addr)); CPU.GPR[ra] = addr; } void NOR(u32 ra, u32 rs, u32 rb, bool rc) @@ -2695,14 +2625,8 @@ private: void STVEBX(u32 vs, u32 ra, u32 rb) { const u64 addr = ra ? CPU.GPR[ra] + CPU.GPR[rb] : CPU.GPR[rb]; - if ((u32)addr != addr) - { - LOG_ERROR(PPU, "%s(): invalid address (0x%llx)", __FUNCTION__, addr); - Emu.Pause(); - return; - } const u8 eb = addr & 0xf; - vm::write8((u32)addr, CPU.VPR[vs]._u8[15 - eb]); + vm::write8(vm::cast(addr), CPU.VPR[vs]._u8[15 - eb]); } void SUBFE(u32 rd, u32 ra, u32 rb, u32 oe, bool rc) { @@ -2711,7 +2635,7 @@ private: CPU.GPR[rd] = ~RA + RB + CPU.XER.CA; CPU.XER.CA = CPU.IsCarry(~RA, RB, CPU.XER.CA); if(rc) CPU.UpdateCR0(CPU.GPR[rd]); - if(oe) UNK("subfeo"); + if(oe) throw "SUBFE(): subfeo"; } void ADDE(u32 rd, u32 ra, u32 rb, u32 oe, bool rc) { @@ -2736,7 +2660,7 @@ private: CPU.XER.CA = CPU.IsCarry(RA, RB); } if(rc) CPU.UpdateCR0(CPU.GPR[rd]); - if(oe) UNK("addeo"); + if(oe) throw "ADDE(): addeo"; } void MTOCRF(u32 l, u32 crm, u32 rs) { @@ -2774,27 +2698,15 @@ private: void STDX(u32 rs, u32 ra, u32 rb) { const u64 addr = ra ? CPU.GPR[ra] + CPU.GPR[rb] : CPU.GPR[rb]; - if ((u32)addr != addr) - { - LOG_ERROR(PPU, "%s(): invalid address (0x%llx)", __FUNCTION__, addr); - Emu.Pause(); - return; - } - vm::write64((u32)addr, CPU.GPR[rs]); + vm::write64(vm::cast(addr), CPU.GPR[rs]); } void STWCX_(u32 rs, u32 ra, u32 rb) { const u64 addr = ra ? CPU.GPR[ra] + CPU.GPR[rb] : CPU.GPR[rb]; - if ((u32)addr != addr) - { - LOG_ERROR(PPU, "%s(): invalid address (0x%llx)", __FUNCTION__, addr); - Emu.Pause(); - return; - } if (CPU.R_ADDR == addr) { - CPU.SetCR_EQ(0, InterlockedCompareExchange(vm::get_ptr((u32)CPU.R_ADDR), re32((u32)CPU.GPR[rs]), (u32)CPU.R_VALUE) == (u32)CPU.R_VALUE); + CPU.SetCR_EQ(0, InterlockedCompareExchange(vm::get_ptr(vm::cast(CPU.R_ADDR)), re32((u32)CPU.GPR[rs]), (u32)CPU.R_VALUE) == (u32)CPU.R_VALUE); CPU.R_ADDR = 0; } else @@ -2805,61 +2717,31 @@ private: void STWX(u32 rs, u32 ra, u32 rb) { const u64 addr = ra ? CPU.GPR[ra] + CPU.GPR[rb] : CPU.GPR[rb]; - if ((u32)addr != addr) - { - LOG_ERROR(PPU, "%s(): invalid address (0x%llx)", __FUNCTION__, addr); - Emu.Pause(); - return; - } - vm::write32((u32)addr, (u32)CPU.GPR[rs]); + vm::write32(vm::cast(addr), (u32)CPU.GPR[rs]); } void STVEHX(u32 vs, u32 ra, u32 rb) { const u64 addr = (ra ? CPU.GPR[ra] + CPU.GPR[rb] : CPU.GPR[rb]) & ~1ULL; - if ((u32)addr != addr) - { - LOG_ERROR(PPU, "%s(): invalid address (0x%llx)", __FUNCTION__, addr); - Emu.Pause(); - return; - } const u8 eb = (addr & 0xf) >> 1; - vm::write16((u32)addr, CPU.VPR[vs]._u16[7 - eb]); + vm::write16(vm::cast(addr), CPU.VPR[vs]._u16[7 - eb]); } void STDUX(u32 rs, u32 ra, u32 rb) { const u64 addr = CPU.GPR[ra] + CPU.GPR[rb]; - if ((u32)addr != addr) - { - LOG_ERROR(PPU, "%s(): invalid address (0x%llx)", __FUNCTION__, addr); - Emu.Pause(); - return; - } - vm::write64((u32)addr, CPU.GPR[rs]); + vm::write64(vm::cast(addr), CPU.GPR[rs]); CPU.GPR[ra] = addr; } void STWUX(u32 rs, u32 ra, u32 rb) { const u64 addr = CPU.GPR[ra] + CPU.GPR[rb]; - if ((u32)addr != addr) - { - LOG_ERROR(PPU, "%s(): invalid address (0x%llx)", __FUNCTION__, addr); - Emu.Pause(); - return; - } - vm::write32((u32)addr, (u32)CPU.GPR[rs]); + vm::write32(vm::cast(addr), (u32)CPU.GPR[rs]); CPU.GPR[ra] = addr; } void STVEWX(u32 vs, u32 ra, u32 rb) { const u64 addr = (ra ? CPU.GPR[ra] + CPU.GPR[rb] : CPU.GPR[rb]) & ~3ULL; - if ((u32)addr != addr) - { - LOG_ERROR(PPU, "%s(): invalid address (0x%llx)", __FUNCTION__, addr); - Emu.Pause(); - return; - } const u8 eb = (addr & 0xf) >> 2; - vm::write32((u32)addr, CPU.VPR[vs]._u32[3 - eb]); + vm::write32(vm::cast(addr), CPU.VPR[vs]._u32[3 - eb]); } void ADDZE(u32 rd, u32 ra, u32 oe, bool rc) { @@ -2880,16 +2762,10 @@ private: void STDCX_(u32 rs, u32 ra, u32 rb) { const u64 addr = ra ? CPU.GPR[ra] + CPU.GPR[rb] : CPU.GPR[rb]; - if ((u32)addr != addr) - { - LOG_ERROR(PPU, "%s(): invalid address (0x%llx)", __FUNCTION__, addr); - Emu.Pause(); - return; - } if (CPU.R_ADDR == addr) { - CPU.SetCR_EQ(0, InterlockedCompareExchange(vm::get_ptr((u32)CPU.R_ADDR), re64(CPU.GPR[rs]), CPU.R_VALUE) == CPU.R_VALUE); + CPU.SetCR_EQ(0, InterlockedCompareExchange(vm::get_ptr(vm::cast(CPU.R_ADDR)), re64(CPU.GPR[rs]), CPU.R_VALUE) == CPU.R_VALUE); CPU.R_ADDR = 0; } else @@ -2900,13 +2776,7 @@ private: void STBX(u32 rs, u32 ra, u32 rb) { const u64 addr = ra ? CPU.GPR[ra] + CPU.GPR[rb] : CPU.GPR[rb]; - if ((u32)addr != addr) - { - LOG_ERROR(PPU, "%s(): invalid address (0x%llx)", __FUNCTION__, addr); - Emu.Pause(); - return; - } - vm::write8((u32)addr, (u8)CPU.GPR[rs]); + vm::write8(vm::cast(addr), (u8)CPU.GPR[rs]); } void STVX(u32 vs, u32 ra, u32 rb) { @@ -2924,7 +2794,7 @@ private: { CPU.GPR[rd] = (s64)((s64)CPU.GPR[ra] * (s64)CPU.GPR[rb]); if(rc) CPU.UpdateCR0(CPU.GPR[rd]); - if(oe) UNK("mulldo"); + if(oe) throw "MULLD(): mulldo"; } void ADDME(u32 rd, u32 ra, u32 oe, bool rc) { @@ -2932,14 +2802,14 @@ private: CPU.GPR[rd] = RA + CPU.XER.CA - 1; CPU.XER.CA |= RA != 0; - if(oe) UNK("addmeo"); + if(oe) throw "ADDME(): addmeo"; if(rc) CPU.UpdateCR0(CPU.GPR[rd]); } void MULLW(u32 rd, u32 ra, u32 rb, u32 oe, bool rc) { CPU.GPR[rd] = (s64)((s64)(s32)CPU.GPR[ra] * (s64)(s32)CPU.GPR[rb]); if(rc) CPU.UpdateCR0(CPU.GPR[rd]); - if(oe) UNK("mullwo"); + if(oe) throw "MULLW(): mullwo"; } void DCBTST(u32 ra, u32 rb, u32 th) { @@ -2947,13 +2817,7 @@ private: void STBUX(u32 rs, u32 ra, u32 rb) { const u64 addr = CPU.GPR[ra] + CPU.GPR[rb]; - if ((u32)addr != addr) - { - LOG_ERROR(PPU, "%s(): invalid address (0x%llx)", __FUNCTION__, addr); - Emu.Pause(); - return; - } - vm::write8((u32)addr, (u8)CPU.GPR[rs]); + vm::write8(vm::cast(addr), (u8)CPU.GPR[rs]); CPU.GPR[ra] = addr; } void ADD(u32 rd, u32 ra, u32 rb, u32 oe, bool rc) @@ -2961,7 +2825,7 @@ private: const u64 RA = CPU.GPR[ra]; const u64 RB = CPU.GPR[rb]; CPU.GPR[rd] = RA + RB; - if(oe) UNK("addo"); + if(oe) throw "ADD(): addo"; if(rc) CPU.UpdateCR0(CPU.GPR[rd]); } void DCBT(u32 ra, u32 rb, u32 th) @@ -2970,13 +2834,7 @@ private: void LHZX(u32 rd, u32 ra, u32 rb) { const u64 addr = ra ? CPU.GPR[ra] + CPU.GPR[rb] : CPU.GPR[rb]; - if ((u32)addr != addr) - { - LOG_ERROR(PPU, "%s(): invalid address (0x%llx)", __FUNCTION__, addr); - Emu.Pause(); - return; - } - CPU.GPR[rd] = vm::read16((u32)addr); + CPU.GPR[rd] = vm::read16(vm::cast(addr)); } void EQV(u32 ra, u32 rs, u32 rb, bool rc) { @@ -2987,24 +2845,12 @@ private: { //HACK! const u64 addr = ra ? CPU.GPR[ra] + CPU.GPR[rb] : CPU.GPR[rb]; - if ((u32)addr != addr) - { - LOG_ERROR(PPU, "%s(): invalid address (0x%llx)", __FUNCTION__, addr); - Emu.Pause(); - return; - } - CPU.GPR[rd] = vm::read32((u32)addr); + CPU.GPR[rd] = vm::read32(vm::cast(addr)); } void LHZUX(u32 rd, u32 ra, u32 rb) { const u64 addr = ra ? CPU.GPR[ra] + CPU.GPR[rb] : CPU.GPR[rb]; - if ((u32)addr != addr) - { - LOG_ERROR(PPU, "%s(): invalid address (0x%llx)", __FUNCTION__, addr); - Emu.Pause(); - return; - } - CPU.GPR[rd] = vm::read16((u32)addr); + CPU.GPR[rd] = vm::read16(vm::cast(addr)); CPU.GPR[ra] = addr; } void XOR(u32 ra, u32 rs, u32 rb, bool rc) @@ -3019,13 +2865,7 @@ private: void LWAX(u32 rd, u32 ra, u32 rb) { const u64 addr = ra ? CPU.GPR[ra] + CPU.GPR[rb] : CPU.GPR[rb]; - if ((u32)addr != addr) - { - LOG_ERROR(PPU, "%s(): invalid address (0x%llx)", __FUNCTION__, addr); - Emu.Pause(); - return; - } - CPU.GPR[rd] = (s64)(s32)vm::read32((u32)addr); + CPU.GPR[rd] = (s64)(s32)vm::read32(vm::cast(addr)); } void DST(u32 ra, u32 rb, u32 strm, u32 t) { @@ -3033,13 +2873,7 @@ private: void LHAX(u32 rd, u32 ra, u32 rb) { const u64 addr = ra ? CPU.GPR[ra] + CPU.GPR[rb] : CPU.GPR[rb]; - if ((u32)addr != addr) - { - LOG_ERROR(PPU, "%s(): invalid address (0x%llx)", __FUNCTION__, addr); - Emu.Pause(); - return; - } - CPU.GPR[rd] = (s64)(s16)vm::read16((u32)addr); + CPU.GPR[rd] = (s64)(s16)vm::read16(vm::cast(addr)); } void LVXL(u32 vd, u32 ra, u32 rb) { @@ -3054,19 +2888,13 @@ private: { case 0x10C: CPU.GPR[rd] = CPU.TB; break; case 0x10D: CPU.GPR[rd] = CPU.TBH; break; - default: UNK(fmt::Format("mftb r%d, %d", rd, spr)); break; + default: throw fmt::Format("mftb r%d, %d", rd, spr); } } void LWAUX(u32 rd, u32 ra, u32 rb) { const u64 addr = ra ? CPU.GPR[ra] + CPU.GPR[rb] : CPU.GPR[rb]; - if ((u32)addr != addr) - { - LOG_ERROR(PPU, "%s(): invalid address (0x%llx)", __FUNCTION__, addr); - Emu.Pause(); - return; - } - CPU.GPR[rd] = (s64)(s32)vm::read32((u32)addr); + CPU.GPR[rd] = (s64)(s32)vm::read32(vm::cast(addr)); CPU.GPR[ra] = addr; } void DSTST(u32 ra, u32 rb, u32 strm, u32 t) @@ -3075,25 +2903,13 @@ private: void LHAUX(u32 rd, u32 ra, u32 rb) { const u64 addr = ra ? CPU.GPR[ra] + CPU.GPR[rb] : CPU.GPR[rb]; - if ((u32)addr != addr) - { - LOG_ERROR(PPU, "%s(): invalid address (0x%llx)", __FUNCTION__, addr); - Emu.Pause(); - return; - } - CPU.GPR[rd] = (s64)(s16)vm::read16((u32)addr); + CPU.GPR[rd] = (s64)(s16)vm::read16(vm::cast(addr)); CPU.GPR[ra] = addr; } void STHX(u32 rs, u32 ra, u32 rb) { const u64 addr = ra ? CPU.GPR[ra] + CPU.GPR[rb] : CPU.GPR[rb]; - if ((u32)addr != addr) - { - LOG_ERROR(PPU, "%s(): invalid address (0x%llx)", __FUNCTION__, addr); - Emu.Pause(); - return; - } - vm::write16((u32)addr, (u16)CPU.GPR[rs]); + vm::write16(vm::cast(addr), (u16)CPU.GPR[rs]); } void ORC(u32 ra, u32 rs, u32 rb, bool rc) { @@ -3104,24 +2920,12 @@ private: { //HACK! const u64 addr = ra ? CPU.GPR[ra] + CPU.GPR[rb] : CPU.GPR[rb]; - if ((u32)addr != addr) - { - LOG_ERROR(PPU, "%s(): invalid address (0x%llx)", __FUNCTION__, addr); - Emu.Pause(); - return; - } - vm::write32((u32)addr, (u32)CPU.GPR[rs]); + vm::write32(vm::cast(addr), (u32)CPU.GPR[rs]); } void STHUX(u32 rs, u32 ra, u32 rb) { const u64 addr = CPU.GPR[ra] + CPU.GPR[rb]; - if ((u32)addr != addr) - { - LOG_ERROR(PPU, "%s(): invalid address (0x%llx)", __FUNCTION__, addr); - Emu.Pause(); - return; - } - vm::write16((u32)addr, (u16)CPU.GPR[rs]); + vm::write16(vm::cast(addr), (u16)CPU.GPR[rs]); CPU.GPR[ra] = addr; } void OR(u32 ra, u32 rs, u32 rb, bool rc) @@ -3136,7 +2940,7 @@ private: if(RB == 0) { - if(oe) UNK("divduo"); + if(oe) throw "DIVDU(): divduo"; CPU.GPR[rd] = 0; } else @@ -3153,7 +2957,7 @@ private: if(RB == 0) { - if(oe) UNK("divwuo"); + if(oe) throw "DIVWU(): divwuo"; CPU.GPR[rd] = 0; } else @@ -3187,7 +2991,7 @@ private: if (RB == 0 || ((u64)RA == (1ULL << 63) && RB == -1)) { - if(oe) UNK("divdo"); + if(oe) throw "DIVD(): divdo"; CPU.GPR[rd] = /*(((u64)RA & (1ULL << 63)) && RB == 0) ? -1 :*/ 0; } else @@ -3204,7 +3008,7 @@ private: if (RB == 0 || ((u32)RA == (1 << 31) && RB == -1)) { - if(oe) UNK("divwo"); + if(oe) throw "DIVW(): divwo"; CPU.GPR[rd] = /*(((u32)RA & (1 << 31)) && RB == 0) ? -1 :*/ 0; } else @@ -3217,53 +3021,29 @@ private: void LVLX(u32 vd, u32 ra, u32 rb) { const u64 addr = ra ? CPU.GPR[ra] + CPU.GPR[rb] : CPU.GPR[rb]; - if ((u32)addr != addr) - { - LOG_ERROR(PPU, "%s(): invalid address (0x%llx)", __FUNCTION__, addr); - Emu.Pause(); - return; - } const u32 eb = addr & 0xf; CPU.VPR[vd].clear(); - for (u32 i = 0; i < 16u - eb; ++i) CPU.VPR[vd]._u8[15 - i] = vm::read8((u32)addr + i); + for (u32 i = 0; i < 16u - eb; ++i) CPU.VPR[vd]._u8[15 - i] = vm::read8(vm::cast(addr + i)); } void LDBRX(u32 rd, u32 ra, u32 rb) { const u64 addr = ra ? CPU.GPR[ra] + CPU.GPR[rb] : CPU.GPR[rb]; - if ((u32)addr != addr) - { - LOG_ERROR(PPU, "%s(): invalid address (0x%llx)", __FUNCTION__, addr); - Emu.Pause(); - return; - } - CPU.GPR[rd] = vm::get_ref((u32)addr); + CPU.GPR[rd] = vm::get_ref(vm::cast(addr)); } void LSWX(u32 rd, u32 ra, u32 rb) { - UNK("lswx"); + throw "LSWX()"; } void LWBRX(u32 rd, u32 ra, u32 rb) { const u64 addr = ra ? CPU.GPR[ra] + CPU.GPR[rb] : CPU.GPR[rb]; - if ((u32)addr != addr) - { - LOG_ERROR(PPU, "%s(): invalid address (0x%llx)", __FUNCTION__, addr); - Emu.Pause(); - return; - } - CPU.GPR[rd] = vm::get_ref((u32)addr); + CPU.GPR[rd] = vm::get_ref(vm::cast(addr)); } void LFSX(u32 frd, u32 ra, u32 rb) { const u64 addr = ra ? CPU.GPR[ra] + CPU.GPR[rb] : CPU.GPR[rb]; - if ((u32)addr != addr) - { - LOG_ERROR(PPU, "%s(): invalid address (0x%llx)", __FUNCTION__, addr); - Emu.Pause(); - return; - } - CPU.FPR[frd] = vm::get_ref>((u32)addr).ToLE(); + CPU.FPR[frd] = vm::get_ref>(vm::cast(addr)).value(); } void SRW(u32 ra, u32 rs, u32 rb, bool rc) { @@ -3286,26 +3066,14 @@ private: void LVRX(u32 vd, u32 ra, u32 rb) { const u64 addr = ra ? CPU.GPR[ra] + CPU.GPR[rb] : CPU.GPR[rb]; - if ((u32)addr != addr) - { - LOG_ERROR(PPU, "%s(): invalid address (0x%llx)", __FUNCTION__, addr); - Emu.Pause(); - return; - } const u8 eb = addr & 0xf; CPU.VPR[vd].clear(); - for (u32 i = 16 - eb; i < 16; ++i) CPU.VPR[vd]._u8[15 - i] = vm::read8((u32)addr + i - 16); + for (u32 i = 16 - eb; i < 16; ++i) CPU.VPR[vd]._u8[15 - i] = vm::read8(vm::cast(addr + i - 16)); } void LSWI(u32 rd, u32 ra, u32 nb) { u64 addr = ra ? CPU.GPR[ra] : 0; - if ((u32)addr != addr) - { - LOG_ERROR(PPU, "%s(): invalid address (0x%llx)", __FUNCTION__, addr); - Emu.Pause(); - return; - } u64 N = nb ? nb : 32; u8 reg = rd; @@ -3313,7 +3081,7 @@ private: { if (N > 3) { - CPU.GPR[reg] = vm::read32((u32)addr); + CPU.GPR[reg] = vm::read32(vm::cast(addr)); addr += 4; N -= 4; } @@ -3324,7 +3092,7 @@ private: while (N > 0) { N = N - 1; - buf |= vm::read8((u32)addr) << (i * 8); + buf |= vm::read8(vm::cast(addr)) << (i * 8); addr++; i--; } @@ -3336,14 +3104,7 @@ private: void LFSUX(u32 frd, u32 ra, u32 rb) { const u64 addr = CPU.GPR[ra] + CPU.GPR[rb]; - if ((u32)addr != addr) - { - LOG_ERROR(PPU, "%s(): invalid address (0x%llx)", __FUNCTION__, addr); - Emu.Pause(); - return; - } - (u64&)CPU.FPR[frd] = vm::read32((u32)addr); - CPU.FPR[frd] = (float&)CPU.FPR[frd]; + CPU.FPR[frd] = vm::get_ref>(vm::cast(addr)).value(); CPU.GPR[ra] = addr; } void SYNC(u32 l) @@ -3353,99 +3114,51 @@ private: void LFDX(u32 frd, u32 ra, u32 rb) { const u64 addr = ra ? CPU.GPR[ra] + CPU.GPR[rb] : CPU.GPR[rb]; - if ((u32)addr != addr) - { - LOG_ERROR(PPU, "%s(): invalid address (0x%llx)", __FUNCTION__, addr); - Emu.Pause(); - return; - } - (u64&)CPU.FPR[frd] = vm::read64((u32)addr); + CPU.FPR[frd] = vm::get_ref>(vm::cast(addr)).value(); } void LFDUX(u32 frd, u32 ra, u32 rb) { const u64 addr = CPU.GPR[ra] + CPU.GPR[rb]; - if ((u32)addr != addr) - { - LOG_ERROR(PPU, "%s(): invalid address (0x%llx)", __FUNCTION__, addr); - Emu.Pause(); - return; - } - (u64&)CPU.FPR[frd] = vm::read64((u32)addr); + CPU.FPR[frd] = vm::get_ref>(vm::cast(addr)).value(); CPU.GPR[ra] = addr; } void STVLX(u32 vs, u32 ra, u32 rb) { const u64 addr = ra ? CPU.GPR[ra] + CPU.GPR[rb] : CPU.GPR[rb]; - if ((u32)addr != addr) - { - LOG_ERROR(PPU, "%s(): invalid address (0x%llx)", __FUNCTION__, addr); - Emu.Pause(); - return; - } const u32 eb = addr & 0xf; - for (u32 i = 0; i < 16u - eb; ++i) vm::write8((u32)addr + i, CPU.VPR[vs]._u8[15 - i]); + for (u32 i = 0; i < 16u - eb; ++i) vm::write8(vm::cast(addr + i), CPU.VPR[vs]._u8[15 - i]); } void STSWX(u32 rs, u32 ra, u32 rb) { - UNK("stwsx"); + throw "STSWX()"; } void STWBRX(u32 rs, u32 ra, u32 rb) { const u64 addr = ra ? CPU.GPR[ra] + CPU.GPR[rb] : CPU.GPR[rb]; - if ((u32)addr != addr) - { - LOG_ERROR(PPU, "%s(): invalid address (0x%llx)", __FUNCTION__, addr); - Emu.Pause(); - return; - } - vm::get_ref((u32)addr) = (u32)CPU.GPR[rs]; + vm::get_ref(vm::cast(addr)) = (u32)CPU.GPR[rs]; } void STFSX(u32 frs, u32 ra, u32 rb) { const u64 addr = ra ? CPU.GPR[ra] + CPU.GPR[rb] : CPU.GPR[rb]; - if ((u32)addr != addr) - { - LOG_ERROR(PPU, "%s(): invalid address (0x%llx)", __FUNCTION__, addr); - Emu.Pause(); - return; - } - vm::write32((u32)addr, CPU.FPR[frs].To32()); + vm::get_ref>(vm::cast(addr)) = (float)CPU.FPR[frs]; } void STVRX(u32 vs, u32 ra, u32 rb) { const u64 addr = ra ? CPU.GPR[ra] + CPU.GPR[rb] : CPU.GPR[rb]; - if ((u32)addr != addr) - { - LOG_ERROR(PPU, "%s(): invalid address (0x%llx)", __FUNCTION__, addr); - Emu.Pause(); - return; - } const u8 eb = addr & 0xf; - for (u32 i = 16 - eb; i < 16; ++i) vm::write8((u32)addr + i - 16, CPU.VPR[vs]._u8[15 - i]); + for (u32 i = 16 - eb; i < 16; ++i) vm::write8(vm::cast(addr + i - 16), CPU.VPR[vs]._u8[15 - i]); } void STFSUX(u32 frs, u32 ra, u32 rb) { const u64 addr = CPU.GPR[ra] + CPU.GPR[rb]; - if ((u32)addr != addr) - { - LOG_ERROR(PPU, "%s(): invalid address (0x%llx)", __FUNCTION__, addr); - Emu.Pause(); - return; - } - vm::write32((u32)addr, CPU.FPR[frs].To32()); + vm::get_ref>(vm::cast(addr)) = (float)CPU.FPR[frs]; CPU.GPR[ra] = addr; } void STSWI(u32 rd, u32 ra, u32 nb) { u64 addr = ra ? CPU.GPR[ra] : 0; - if ((u32)addr != addr) - { - LOG_ERROR(PPU, "%s(): invalid address (0x%llx)", __FUNCTION__, addr); - Emu.Pause(); - return; - } u64 N = nb ? nb : 32; u8 reg = rd; @@ -3453,7 +3166,7 @@ private: { if (N > 3) { - vm::write32((u32)addr, (u32)CPU.GPR[reg]); + vm::write32(vm::cast(addr), (u32)CPU.GPR[reg]); addr += 4; N -= 4; } @@ -3463,7 +3176,7 @@ private: while (N > 0) { N = N - 1; - vm::write8((u32)addr, (0xFF000000 & buf) >> 24); + vm::write8(vm::cast(addr), (0xFF000000 & buf) >> 24); buf <<= 8; addr++; } @@ -3474,50 +3187,26 @@ private: void STFDX(u32 frs, u32 ra, u32 rb) { const u64 addr = ra ? CPU.GPR[ra] + CPU.GPR[rb] : CPU.GPR[rb]; - if ((u32)addr != addr) - { - LOG_ERROR(PPU, "%s(): invalid address (0x%llx)", __FUNCTION__, addr); - Emu.Pause(); - return; - } - vm::write64((u32)addr, (u64&)CPU.FPR[frs]); + vm::get_ref>(vm::cast(addr)) = CPU.FPR[frs]; } void STFDUX(u32 frs, u32 ra, u32 rb) { const u64 addr = CPU.GPR[ra] + CPU.GPR[rb]; - if ((u32)addr != addr) - { - LOG_ERROR(PPU, "%s(): invalid address (0x%llx)", __FUNCTION__, addr); - Emu.Pause(); - return; - } - vm::write64((u32)addr, (u64&)CPU.FPR[frs]); + vm::get_ref>(vm::cast(addr)) = CPU.FPR[frs]; CPU.GPR[ra] = addr; } void LVLXL(u32 vd, u32 ra, u32 rb) { const u64 addr = ra ? CPU.GPR[ra] + CPU.GPR[rb] : CPU.GPR[rb]; - if ((u32)addr != addr) - { - LOG_ERROR(PPU, "%s(): invalid address (0x%llx)", __FUNCTION__, addr); - Emu.Pause(); - return; - } const u32 eb = addr & 0xf; CPU.VPR[vd].clear(); - for (u32 i = 0; i < 16u - eb; ++i) CPU.VPR[vd]._u8[15 - i] = vm::read8((u32)addr + i); + for (u32 i = 0; i < 16u - eb; ++i) CPU.VPR[vd]._u8[15 - i] = vm::read8(vm::cast(addr + i)); } void LHBRX(u32 rd, u32 ra, u32 rb) { const u64 addr = ra ? CPU.GPR[ra] + CPU.GPR[rb] : CPU.GPR[rb]; - if ((u32)addr != addr) - { - LOG_ERROR(PPU, "%s(): invalid address (0x%llx)", __FUNCTION__, addr); - Emu.Pause(); - return; - } - CPU.GPR[rd] = vm::get_ref((u32)addr); + CPU.GPR[rd] = vm::get_ref(vm::cast(addr)); } void SRAW(u32 ra, u32 rs, u32 rb, bool rc) { @@ -3556,16 +3245,10 @@ private: void LVRXL(u32 vd, u32 ra, u32 rb) { const u64 addr = ra ? CPU.GPR[ra] + CPU.GPR[rb] : CPU.GPR[rb]; - if ((u32)addr != addr) - { - LOG_ERROR(PPU, "%s(): invalid address (0x%llx)", __FUNCTION__, addr); - Emu.Pause(); - return; - } const u8 eb = addr & 0xf; CPU.VPR[vd].clear(); - for (u32 i = 16 - eb; i < 16; ++i) CPU.VPR[vd]._u8[15 - i] = vm::read8((u32)addr + i - 16); + for (u32 i = 16 - eb; i < 16; ++i) CPU.VPR[vd]._u8[15 - i] = vm::read8(vm::cast(addr + i - 16)); } void DSS(u32 strm, u32 a) { @@ -3597,26 +3280,14 @@ private: void STVLXL(u32 vs, u32 ra, u32 rb) { const u64 addr = ra ? CPU.GPR[ra] + CPU.GPR[rb] : CPU.GPR[rb]; - if ((u32)addr != addr) - { - LOG_ERROR(PPU, "%s(): invalid address (0x%llx)", __FUNCTION__, addr); - Emu.Pause(); - return; - } const u32 eb = addr & 0xf; - for (u32 i = 0; i < 16u - eb; ++i) vm::write8((u32)addr + i, CPU.VPR[vs]._u8[15 - i]); + for (u32 i = 0; i < 16u - eb; ++i) vm::write8(vm::cast(addr + i), CPU.VPR[vs]._u8[15 - i]); } void STHBRX(u32 rs, u32 ra, u32 rb) { const u64 addr = ra ? CPU.GPR[ra] + CPU.GPR[rb] : CPU.GPR[rb]; - if ((u32)addr != addr) - { - LOG_ERROR(PPU, "%s(): invalid address (0x%llx)", __FUNCTION__, addr); - Emu.Pause(); - return; - } - vm::get_ref((u32)addr) = (u16)CPU.GPR[rs]; + vm::get_ref(vm::cast(addr)) = (u16)CPU.GPR[rs]; } void EXTSH(u32 ra, u32 rs, bool rc) { @@ -3626,15 +3297,9 @@ private: void STVRXL(u32 vs, u32 ra, u32 rb) { const u64 addr = ra ? CPU.GPR[ra] + CPU.GPR[rb] : CPU.GPR[rb]; - if ((u32)addr != addr) - { - LOG_ERROR(PPU, "%s(): invalid address (0x%llx)", __FUNCTION__, addr); - Emu.Pause(); - return; - } const u8 eb = addr & 0xf; - for (u32 i = 16 - eb; i < 16; ++i) vm::write8((u32)addr + i - 16, CPU.VPR[vs]._u8[15 - i]); + for (u32 i = 16 - eb; i < 16; ++i) vm::write8(vm::cast(addr + i - 16), CPU.VPR[vs]._u8[15 - i]); } void EXTSB(u32 ra, u32 rs, bool rc) { @@ -3644,13 +3309,7 @@ private: void STFIWX(u32 frs, u32 ra, u32 rb) { const u64 addr = ra ? CPU.GPR[ra] + CPU.GPR[rb] : CPU.GPR[rb]; - if ((u32)addr != addr) - { - LOG_ERROR(PPU, "%s(): invalid address (0x%llx)", __FUNCTION__, addr); - Emu.Pause(); - return; - } - vm::write32((u32)addr, (u32&)CPU.FPR[frs]); + vm::write32(vm::cast(addr), (u32&)CPU.FPR[frs]); } void EXTSW(u32 ra, u32 rs, bool rc) { @@ -3664,334 +3323,164 @@ private: void DCBZ(u32 ra, u32 rb) { const u64 addr = ra ? CPU.GPR[ra] + CPU.GPR[rb] : CPU.GPR[rb]; - if ((u32)addr != addr) - { - LOG_ERROR(PPU, "%s(): invalid address (0x%llx)", __FUNCTION__, addr); - Emu.Pause(); - return; - } - auto const cache_line = vm::get_ptr((u32)addr & ~127); + auto const cache_line = vm::get_ptr(vm::cast(addr) & ~127); if (cache_line) memset(cache_line, 0, 128); } void LWZ(u32 rd, u32 ra, s32 d) { const u64 addr = ra ? CPU.GPR[ra] + d : d; - if ((u32)addr != addr) - { - LOG_ERROR(PPU, "%s(): invalid address (0x%llx)", __FUNCTION__, addr); - Emu.Pause(); - return; - } - CPU.GPR[rd] = vm::read32((u32)addr); + CPU.GPR[rd] = vm::read32(vm::cast(addr)); } void LWZU(u32 rd, u32 ra, s32 d) { const u64 addr = CPU.GPR[ra] + d; - if ((u32)addr != addr) - { - LOG_ERROR(PPU, "%s(): invalid address (0x%llx)", __FUNCTION__, addr); - Emu.Pause(); - return; - } - CPU.GPR[rd] = vm::read32((u32)addr); + CPU.GPR[rd] = vm::read32(vm::cast(addr)); CPU.GPR[ra] = addr; } void LBZ(u32 rd, u32 ra, s32 d) { const u64 addr = ra ? CPU.GPR[ra] + d : d; - if ((u32)addr != addr) - { - LOG_ERROR(PPU, "%s(): invalid address (0x%llx)", __FUNCTION__, addr); - Emu.Pause(); - return; - } - CPU.GPR[rd] = vm::read8((u32)addr); + CPU.GPR[rd] = vm::read8(vm::cast(addr)); } void LBZU(u32 rd, u32 ra, s32 d) { const u64 addr = CPU.GPR[ra] + d; - if ((u32)addr != addr) - { - LOG_ERROR(PPU, "%s(): invalid address (0x%llx)", __FUNCTION__, addr); - Emu.Pause(); - return; - } - CPU.GPR[rd] = vm::read8((u32)addr); + CPU.GPR[rd] = vm::read8(vm::cast(addr)); CPU.GPR[ra] = addr; } void STW(u32 rs, u32 ra, s32 d) { const u64 addr = ra ? CPU.GPR[ra] + d : d; - if ((u32)addr != addr) - { - LOG_ERROR(PPU, "%s(): invalid address (0x%llx)", __FUNCTION__, addr); - Emu.Pause(); - return; - } - vm::write32((u32)addr, (u32)CPU.GPR[rs]); + vm::write32(vm::cast(addr), (u32)CPU.GPR[rs]); } void STWU(u32 rs, u32 ra, s32 d) { const u64 addr = CPU.GPR[ra] + d; - if ((u32)addr != addr) - { - LOG_ERROR(PPU, "%s(): invalid address (0x%llx)", __FUNCTION__, addr); - Emu.Pause(); - return; - } - vm::write32((u32)addr, (u32)CPU.GPR[rs]); + vm::write32(vm::cast(addr), (u32)CPU.GPR[rs]); CPU.GPR[ra] = addr; } void STB(u32 rs, u32 ra, s32 d) { const u64 addr = ra ? CPU.GPR[ra] + d : d; - if ((u32)addr != addr) - { - LOG_ERROR(PPU, "%s(): invalid address (0x%llx)", __FUNCTION__, addr); - Emu.Pause(); - return; - } - vm::write8((u32)addr, (u8)CPU.GPR[rs]); + vm::write8(vm::cast(addr), (u8)CPU.GPR[rs]); } void STBU(u32 rs, u32 ra, s32 d) { const u64 addr = CPU.GPR[ra] + d; - if ((u32)addr != addr) - { - LOG_ERROR(PPU, "%s(): invalid address (0x%llx)", __FUNCTION__, addr); - Emu.Pause(); - return; - } - vm::write8((u32)addr, (u8)CPU.GPR[rs]); + vm::write8(vm::cast(addr), (u8)CPU.GPR[rs]); CPU.GPR[ra] = addr; } void LHZ(u32 rd, u32 ra, s32 d) { const u64 addr = ra ? CPU.GPR[ra] + d : d; - if ((u32)addr != addr) - { - LOG_ERROR(PPU, "%s(): invalid address (0x%llx)", __FUNCTION__, addr); - Emu.Pause(); - return; - } - CPU.GPR[rd] = vm::read16((u32)addr); + CPU.GPR[rd] = vm::read16(vm::cast(addr)); } void LHZU(u32 rd, u32 ra, s32 d) { const u64 addr = CPU.GPR[ra] + d; - if ((u32)addr != addr) - { - LOG_ERROR(PPU, "%s(): invalid address (0x%llx)", __FUNCTION__, addr); - Emu.Pause(); - return; - } - CPU.GPR[rd] = vm::read16((u32)addr); + CPU.GPR[rd] = vm::read16(vm::cast(addr)); CPU.GPR[ra] = addr; } void LHA(u32 rd, u32 ra, s32 d) { const u64 addr = ra ? CPU.GPR[ra] + d : d; - if ((u32)addr != addr) - { - LOG_ERROR(PPU, "%s(): invalid address (0x%llx)", __FUNCTION__, addr); - Emu.Pause(); - return; - } - CPU.GPR[rd] = (s64)(s16)vm::read16((u32)addr); + CPU.GPR[rd] = (s64)(s16)vm::read16(vm::cast(addr)); } void LHAU(u32 rd, u32 ra, s32 d) { const u64 addr = CPU.GPR[ra] + d; - if ((u32)addr != addr) - { - LOG_ERROR(PPU, "%s(): invalid address (0x%llx)", __FUNCTION__, addr); - Emu.Pause(); - return; - } - CPU.GPR[rd] = (s64)(s16)vm::read16((u32)addr); + CPU.GPR[rd] = (s64)(s16)vm::read16(vm::cast(addr)); CPU.GPR[ra] = addr; } void STH(u32 rs, u32 ra, s32 d) { const u64 addr = ra ? CPU.GPR[ra] + d : d; - if ((u32)addr != addr) - { - LOG_ERROR(PPU, "%s(): invalid address (0x%llx)", __FUNCTION__, addr); - Emu.Pause(); - return; - } - vm::write16((u32)addr, (u16)CPU.GPR[rs]); + vm::write16(vm::cast(addr), (u16)CPU.GPR[rs]); } void STHU(u32 rs, u32 ra, s32 d) { const u64 addr = CPU.GPR[ra] + d; - if ((u32)addr != addr) - { - LOG_ERROR(PPU, "%s(): invalid address (0x%llx)", __FUNCTION__, addr); - Emu.Pause(); - return; - } - vm::write16((u32)addr, (u16)CPU.GPR[rs]); + vm::write16(vm::cast(addr), (u16)CPU.GPR[rs]); CPU.GPR[ra] = addr; } void LMW(u32 rd, u32 ra, s32 d) { u64 addr = ra ? CPU.GPR[ra] + d : d; - if ((u32)addr != addr) - { - LOG_ERROR(PPU, "%s(): invalid address (0x%llx)", __FUNCTION__, addr); - Emu.Pause(); - return; - } for(u32 i=rd; i<32; ++i, addr += 4) { - CPU.GPR[i] = vm::read32((u32)addr); + CPU.GPR[i] = vm::read32(vm::cast(addr)); } } void STMW(u32 rs, u32 ra, s32 d) { u64 addr = ra ? CPU.GPR[ra] + d : d; - if ((u32)addr != addr) - { - LOG_ERROR(PPU, "%s(): invalid address (0x%llx)", __FUNCTION__, addr); - Emu.Pause(); - return; - } for(u32 i=rs; i<32; ++i, addr += 4) { - vm::write32((u32)addr, (u32)CPU.GPR[i]); + vm::write32(vm::cast(addr), (u32)CPU.GPR[i]); } } void LFS(u32 frd, u32 ra, s32 d) { const u64 addr = ra ? CPU.GPR[ra] + d : d; - if ((u32)addr != addr) - { - LOG_ERROR(PPU, "%s(): invalid address (0x%llx)", __FUNCTION__, addr); - Emu.Pause(); - return; - } - const u32 v = vm::read32((u32)addr); - CPU.FPR[frd] = (float&)v; + CPU.FPR[frd] = vm::get_ref>(vm::cast(addr)).value(); } void LFSU(u32 frd, u32 ra, s32 ds) { const u64 addr = CPU.GPR[ra] + ds; - if ((u32)addr != addr) - { - LOG_ERROR(PPU, "%s(): invalid address (0x%llx)", __FUNCTION__, addr); - Emu.Pause(); - return; - } - const u32 v = vm::read32((u32)addr); - CPU.FPR[frd] = (float&)v; + CPU.FPR[frd] = vm::get_ref>(vm::cast(addr)).value(); CPU.GPR[ra] = addr; } void LFD(u32 frd, u32 ra, s32 d) { const u64 addr = ra ? CPU.GPR[ra] + d : d; - if ((u32)addr != addr) - { - LOG_ERROR(PPU, "%s(): invalid address (0x%llx)", __FUNCTION__, addr); - Emu.Pause(); - return; - } - (u64&)CPU.FPR[frd] = vm::read64((u32)addr); + CPU.FPR[frd] = vm::get_ref>(vm::cast(addr)).value(); } void LFDU(u32 frd, u32 ra, s32 ds) { const u64 addr = CPU.GPR[ra] + ds; - if ((u32)addr != addr) - { - LOG_ERROR(PPU, "%s(): invalid address (0x%llx)", __FUNCTION__, addr); - Emu.Pause(); - return; - } - (u64&)CPU.FPR[frd] = vm::read64((u32)addr); + CPU.FPR[frd] = vm::get_ref>(vm::cast(addr)).value(); CPU.GPR[ra] = addr; } void STFS(u32 frs, u32 ra, s32 d) { const u64 addr = ra ? CPU.GPR[ra] + d : d; - if ((u32)addr != addr) - { - LOG_ERROR(PPU, "%s(): invalid address (0x%llx)", __FUNCTION__, addr); - Emu.Pause(); - return; - } - vm::write32((u32)addr, CPU.FPR[frs].To32()); + vm::get_ref>(vm::cast(addr)) = (float)CPU.FPR[frs]; } void STFSU(u32 frs, u32 ra, s32 d) { const u64 addr = CPU.GPR[ra] + d; - if ((u32)addr != addr) - { - LOG_ERROR(PPU, "%s(): invalid address (0x%llx)", __FUNCTION__, addr); - Emu.Pause(); - return; - } - vm::write32((u32)addr, CPU.FPR[frs].To32()); + vm::get_ref>(vm::cast(addr)) = (float)CPU.FPR[frs]; CPU.GPR[ra] = addr; } void STFD(u32 frs, u32 ra, s32 d) { const u64 addr = ra ? CPU.GPR[ra] + d : d; - if ((u32)addr != addr) - { - LOG_ERROR(PPU, "%s(): invalid address (0x%llx)", __FUNCTION__, addr); - Emu.Pause(); - return; - } - vm::write64((u32)addr, (u64&)CPU.FPR[frs]); + vm::get_ref>(vm::cast(addr)) = CPU.FPR[frs]; } void STFDU(u32 frs, u32 ra, s32 d) { const u64 addr = CPU.GPR[ra] + d; - if ((u32)addr != addr) - { - LOG_ERROR(PPU, "%s(): invalid address (0x%llx)", __FUNCTION__, addr); - Emu.Pause(); - return; - } - vm::write64((u32)addr, (u64&)CPU.FPR[frs]); + vm::get_ref>(vm::cast(addr)) = CPU.FPR[frs]; CPU.GPR[ra] = addr; } void LD(u32 rd, u32 ra, s32 ds) { const u64 addr = ra ? CPU.GPR[ra] + ds : ds; - if ((u32)addr != addr) - { - LOG_ERROR(PPU, "%s(): invalid address (0x%llx)", __FUNCTION__, addr); - Emu.Pause(); - return; - } - CPU.GPR[rd] = vm::read64((u32)addr); + CPU.GPR[rd] = vm::read64(vm::cast(addr)); } void LDU(u32 rd, u32 ra, s32 ds) { //if(ra == 0 || rt == ra) return; const u64 addr = CPU.GPR[ra] + ds; - if ((u32)addr != addr) - { - LOG_ERROR(PPU, "%s(): invalid address (0x%llx)", __FUNCTION__, addr); - Emu.Pause(); - return; - } - CPU.GPR[rd] = vm::read64((u32)addr); + CPU.GPR[rd] = vm::read64(vm::cast(addr)); CPU.GPR[ra] = addr; } void LWA(u32 rd, u32 ra, s32 ds) { const u64 addr = ra ? CPU.GPR[ra] + ds : ds; - if ((u32)addr != addr) - { - LOG_ERROR(PPU, "%s(): invalid address (0x%llx)", __FUNCTION__, addr); - Emu.Pause(); - return; - } - CPU.GPR[rd] = (s64)(s32)vm::read32((u32)addr); + CPU.GPR[rd] = (s64)(s32)vm::read32(vm::cast(addr)); } void FDIVS(u32 frd, u32 fra, u32 frb, bool rc) { @@ -4031,25 +3520,25 @@ private: } CPU.FPSCR.FPRF = CPU.FPR[frd].GetType(); - if(rc) UNK("fdivs.");//CPU.UpdateCR1(CPU.FPR[frd]); + if(rc) throw "FDIVS(): fdivs.";//CPU.UpdateCR1(CPU.FPR[frd]); } void FSUBS(u32 frd, u32 fra, u32 frb, bool rc) { CPU.FPR[frd] = static_cast(CPU.FPR[fra] - CPU.FPR[frb]); CPU.FPSCR.FPRF = CPU.FPR[frd].GetType(); - if(rc) UNK("fsubs.");//CPU.UpdateCR1(CPU.FPR[frd]); + if(rc) throw "FSUBS(): fsubs.";//CPU.UpdateCR1(CPU.FPR[frd]); } void FADDS(u32 frd, u32 fra, u32 frb, bool rc) { CPU.FPR[frd] = static_cast(CPU.FPR[fra] + CPU.FPR[frb]); CPU.FPSCR.FPRF = CPU.FPR[frd].GetType(); - if(rc) UNK("fadds.");//CPU.UpdateCR1(CPU.FPR[frd]); + if(rc) throw "FADDS(): fadds.";//CPU.UpdateCR1(CPU.FPR[frd]); } void FSQRTS(u32 frd, u32 frb, bool rc) { CPU.FPR[frd] = static_cast(sqrt(CPU.FPR[frb])); CPU.FPSCR.FPRF = CPU.FPR[frd].GetType(); - if(rc) UNK("fsqrts.");//CPU.UpdateCR1(CPU.FPR[frd]); + if(rc) throw "FSQRTS(): fsqrts.";//CPU.UpdateCR1(CPU.FPR[frd]); } void FRES(u32 frd, u32 frb, bool rc) { @@ -4058,7 +3547,7 @@ private: CPU.SetFPSCRException(FPSCR_ZX); } CPU.FPR[frd] = static_cast(1.0 / CPU.FPR[frb]); - if(rc) UNK("fres.");//CPU.UpdateCR1(CPU.FPR[frd]); + if(rc) throw "FRES(): fres.";//CPU.UpdateCR1(CPU.FPR[frd]); } void FMULS(u32 frd, u32 fra, u32 frc, bool rc) { @@ -4066,54 +3555,42 @@ private: CPU.FPSCR.FI = 0; CPU.FPSCR.FR = 0; CPU.FPSCR.FPRF = CPU.FPR[frd].GetType(); - if(rc) UNK("fmuls.");//CPU.UpdateCR1(CPU.FPR[frd]); + if(rc) throw "FMULS(): fmuls.";//CPU.UpdateCR1(CPU.FPR[frd]); } void FMADDS(u32 frd, u32 fra, u32 frc, u32 frb, bool rc) { CPU.FPR[frd] = static_cast(CPU.FPR[fra] * CPU.FPR[frc] + CPU.FPR[frb]); CPU.FPSCR.FPRF = CPU.FPR[frd].GetType(); - if(rc) UNK("fmadds.");//CPU.UpdateCR1(CPU.FPR[frd]); + if(rc) throw "FMADDS(): fmadds.";//CPU.UpdateCR1(CPU.FPR[frd]); } void FMSUBS(u32 frd, u32 fra, u32 frc, u32 frb, bool rc) { CPU.FPR[frd] = static_cast(CPU.FPR[fra] * CPU.FPR[frc] - CPU.FPR[frb]); CPU.FPSCR.FPRF = CPU.FPR[frd].GetType(); - if(rc) UNK("fmsubs.");//CPU.UpdateCR1(CPU.FPR[frd]); + if(rc) throw "FMSUBS(): fmsubs.";//CPU.UpdateCR1(CPU.FPR[frd]); } void FNMSUBS(u32 frd, u32 fra, u32 frc, u32 frb, bool rc) { CPU.FPR[frd] = static_cast(-(CPU.FPR[fra] * CPU.FPR[frc] - CPU.FPR[frb])); CPU.FPSCR.FPRF = CPU.FPR[frd].GetType(); - if(rc) UNK("fnmsubs.");////CPU.UpdateCR1(CPU.FPR[frd]); + if(rc) throw "FNMSUBS(): fnmsubs.";////CPU.UpdateCR1(CPU.FPR[frd]); } void FNMADDS(u32 frd, u32 fra, u32 frc, u32 frb, bool rc) { CPU.FPR[frd] = static_cast(-(CPU.FPR[fra] * CPU.FPR[frc] + CPU.FPR[frb])); CPU.FPSCR.FPRF = CPU.FPR[frd].GetType(); - if(rc) UNK("fnmadds.");//CPU.UpdateCR1(CPU.FPR[frd]); + if(rc) throw "FNMADDS(): fnmadds.";//CPU.UpdateCR1(CPU.FPR[frd]); } void STD(u32 rs, u32 ra, s32 d) { const u64 addr = ra ? CPU.GPR[ra] + d : d; - if ((u32)addr != addr) - { - LOG_ERROR(PPU, "%s(): invalid address (0x%llx)", __FUNCTION__, addr); - Emu.Pause(); - return; - } - vm::write64((u32)addr, CPU.GPR[rs]); + vm::write64(vm::cast(addr), CPU.GPR[rs]); } void STDU(u32 rs, u32 ra, s32 ds) { //if(ra == 0 || rs == ra) return; const u64 addr = CPU.GPR[ra] + ds; - if ((u32)addr != addr) - { - LOG_ERROR(PPU, "%s(): invalid address (0x%llx)", __FUNCTION__, addr); - Emu.Pause(); - return; - } - vm::write64((u32)addr, CPU.GPR[rs]); + vm::write64(vm::cast(addr), CPU.GPR[rs]); CPU.GPR[ra] = addr; } void MTFSB1(u32 crbd, bool rc) @@ -4122,7 +3599,7 @@ private: if ((crbd == 29) && !CPU.FPSCR.NI) LOG_WARNING(PPU, "Non-IEEE mode enabled"); CPU.FPSCR.FPSCR |= mask; - if(rc) UNIMPLEMENTED(); + if(rc) throw "MTFSB1(): mtfsb1."; } void MCRFS(u32 crbd, u32 crbs) { @@ -4155,7 +3632,7 @@ private: if ((crbd == 29) && !CPU.FPSCR.NI) LOG_WARNING(PPU, "Non-IEEE mode disabled"); CPU.FPSCR.FPSCR &= ~mask; - if(rc) UNIMPLEMENTED(); + if(rc) throw "MTFSB0(): mtfsb0."; } void MTFSFI(u32 crfd, u32 i, bool rc) { @@ -4173,12 +3650,12 @@ private: LOG_WARNING(PPU, "Non-IEEE mode enabled"); } - if(rc) UNIMPLEMENTED(); + if(rc) throw "MTFSFI(): mtfsfi."; } void MFFS(u32 frd, bool rc) { (u64&)CPU.FPR[frd] = CPU.FPSCR.FPSCR; - if(rc) UNIMPLEMENTED(); + if(rc) throw "MFFS(): mffs."; } void MTFSF(u32 flm, u32 frb, bool rc) { @@ -4197,7 +3674,7 @@ private: else LOG_WARNING(PPU, "Non-IEEE mode enabled"); } - if(rc) UNK("mtfsf."); + if(rc) throw "MTFSF(): mtfsf."; } void FCMPU(u32 crfd, u32 fra, u32 frb) { @@ -4285,7 +3762,7 @@ private: } (u64&)CPU.FPR[frd] = r; - if(rc) UNK("fctiw."); + if(rc) throw "FCTIW(): fctiw."; } void FCTIWZ(u32 frd, u32 frb, bool rc) { @@ -4323,7 +3800,7 @@ private: } (u64&)CPU.FPR[frd] = (u64)value; - if(rc) UNK("fctiwz."); + if(rc) throw "FCTIWZ(): fctiwz."; } void FDIV(u32 frd, u32 fra, u32 frb, bool rc) { @@ -4366,30 +3843,30 @@ private: CPU.FPR[frd] = res; CPU.FPSCR.FPRF = CPU.FPR[frd].GetType(); - if(rc) UNK("fdiv.");//CPU.UpdateCR1(CPU.FPR[frd]); + if(rc) throw "FDIV(): fdiv.";//CPU.UpdateCR1(CPU.FPR[frd]); } void FSUB(u32 frd, u32 fra, u32 frb, bool rc) { CPU.FPR[frd] = CPU.FPR[fra] - CPU.FPR[frb]; CPU.FPSCR.FPRF = CPU.FPR[frd].GetType(); - if(rc) UNK("fsub.");//CPU.UpdateCR1(CPU.FPR[frd]); + if(rc) throw "FSUB(): fsub.";//CPU.UpdateCR1(CPU.FPR[frd]); } void FADD(u32 frd, u32 fra, u32 frb, bool rc) { CPU.FPR[frd] = CPU.FPR[fra] + CPU.FPR[frb]; CPU.FPSCR.FPRF = CPU.FPR[frd].GetType(); - if(rc) UNK("fadd.");//CPU.UpdateCR1(CPU.FPR[frd]); + if(rc) throw "FASS(): fadd.";//CPU.UpdateCR1(CPU.FPR[frd]); } void FSQRT(u32 frd, u32 frb, bool rc) { CPU.FPR[frd] = sqrt(CPU.FPR[frb]); CPU.FPSCR.FPRF = CPU.FPR[frd].GetType(); - if(rc) UNK("fsqrt.");//CPU.UpdateCR1(CPU.FPR[frd]); + if(rc) throw "FSQRT(): fsqrt.";//CPU.UpdateCR1(CPU.FPR[frd]); } void FSEL(u32 frd, u32 fra, u32 frc, u32 frb, bool rc) { CPU.FPR[frd] = CPU.FPR[fra] >= 0.0 ? CPU.FPR[frc] : CPU.FPR[frb]; - if(rc) UNK("fsel.");//CPU.UpdateCR1(CPU.FPR[frd]); + if(rc) throw "FSEL(): fsel.";//CPU.UpdateCR1(CPU.FPR[frd]); } void FMUL(u32 frd, u32 fra, u32 frc, bool rc) { @@ -4412,7 +3889,7 @@ private: CPU.FPSCR.FPRF = CPU.FPR[frd].GetType(); } - if(rc) UNK("fmul.");//CPU.UpdateCR1(CPU.FPR[frd]); + if(rc) throw "FMUL(): fmul.";//CPU.UpdateCR1(CPU.FPR[frd]); } void FRSQRTE(u32 frd, u32 frb, bool rc) { @@ -4421,31 +3898,31 @@ private: CPU.SetFPSCRException(FPSCR_ZX); } CPU.FPR[frd] = 1.0 / sqrt(CPU.FPR[frb]); - if(rc) UNK("frsqrte.");//CPU.UpdateCR1(CPU.FPR[frd]); + if(rc) throw "FRSQRTE(): frsqrte.";//CPU.UpdateCR1(CPU.FPR[frd]); } void FMSUB(u32 frd, u32 fra, u32 frc, u32 frb, bool rc) { CPU.FPR[frd] = CPU.FPR[fra] * CPU.FPR[frc] - CPU.FPR[frb]; CPU.FPSCR.FPRF = CPU.FPR[frd].GetType(); - if(rc) UNK("fmsub.");//CPU.UpdateCR1(CPU.FPR[frd]); + if(rc) throw "FMSUB(): fmsub.";//CPU.UpdateCR1(CPU.FPR[frd]); } void FMADD(u32 frd, u32 fra, u32 frc, u32 frb, bool rc) { CPU.FPR[frd] = CPU.FPR[fra] * CPU.FPR[frc] + CPU.FPR[frb]; CPU.FPSCR.FPRF = CPU.FPR[frd].GetType(); - if(rc) UNK("fmadd.");//CPU.UpdateCR1(CPU.FPR[frd]); + if(rc) throw "FMADD(): fmadd.";//CPU.UpdateCR1(CPU.FPR[frd]); } void FNMSUB(u32 frd, u32 fra, u32 frc, u32 frb, bool rc) { CPU.FPR[frd] = -(CPU.FPR[fra] * CPU.FPR[frc] - CPU.FPR[frb]); CPU.FPSCR.FPRF = CPU.FPR[frd].GetType(); - if(rc) UNK("fnmsub.");//CPU.UpdateCR1(CPU.FPR[frd]); + if(rc) throw "FNMSUB(): fnmsub.";//CPU.UpdateCR1(CPU.FPR[frd]); } void FNMADD(u32 frd, u32 fra, u32 frc, u32 frb, bool rc) { CPU.FPR[frd] = -(CPU.FPR[fra] * CPU.FPR[frc] + CPU.FPR[frb]); CPU.FPSCR.FPRF = CPU.FPR[frd].GetType(); - if(rc) UNK("fnmadd.");//CPU.UpdateCR1(CPU.FPR[frd]); + if(rc) throw "FNMADD(): fnmadd.";//CPU.UpdateCR1(CPU.FPR[frd]); } void FCMPO(u32 crfd, u32 fra, u32 frb) { @@ -4472,22 +3949,22 @@ private: void FNEG(u32 frd, u32 frb, bool rc) { CPU.FPR[frd] = -CPU.FPR[frb]; - if(rc) UNK("fneg.");//CPU.UpdateCR1(CPU.FPR[frd]); + if(rc) throw "FNEG(): fneg.";//CPU.UpdateCR1(CPU.FPR[frd]); } void FMR(u32 frd, u32 frb, bool rc) { CPU.FPR[frd] = CPU.FPR[frb]; - if(rc) UNK("fmr.");//CPU.UpdateCR1(CPU.FPR[frd]); + if(rc) throw "FMR(): fmr.";//CPU.UpdateCR1(CPU.FPR[frd]); } void FNABS(u32 frd, u32 frb, bool rc) { CPU.FPR[frd] = -fabs(CPU.FPR[frb]); - if(rc) UNK("fnabs.");//CPU.UpdateCR1(CPU.FPR[frd]); + if(rc) throw "FNABS(): fnabs.";//CPU.UpdateCR1(CPU.FPR[frd]); } void FABS(u32 frd, u32 frb, bool rc) { CPU.FPR[frd] = fabs(CPU.FPR[frb]); - if(rc) UNK("fabs.");//CPU.UpdateCR1(CPU.FPR[frd]); + if(rc) throw "FABS(): fabs.";//CPU.UpdateCR1(CPU.FPR[frd]); } void FCTID(u32 frd, u32 frb, bool rc) { @@ -4546,7 +4023,7 @@ private: } (u64&)CPU.FPR[frd] = r; - if(rc) UNK("fctid."); + if(rc) throw "FCTID(): fctid."; } void FCTIDZ(u32 frd, u32 frb, bool rc) { @@ -4584,7 +4061,7 @@ private: } (u64&)CPU.FPR[frd] = r; - if(rc) UNK("fctidz."); + if(rc) throw "FCTIDZ(): fctidz."; } void FCFID(u32 frd, u32 frb, bool rc) { @@ -4606,41 +4083,11 @@ private: CPU.FPR[frd] = bf; CPU.FPSCR.FPRF = CPU.FPR[frd].GetType(); - if(rc) UNK("fcfid.");//CPU.UpdateCR1(CPU.FPR[frd]); + if(rc) throw "FCFID(): fcfid.";//CPU.UpdateCR1(CPU.FPR[frd]); } void UNK(const u32 code, const u32 opcode, const u32 gcode) { - UNK(fmt::Format("Unknown/Illegal opcode! (0x%08x : 0x%x : 0x%x)", code, opcode, gcode)); - } - - void UNK(const std::string& err, bool pause = true) - { - LOG_ERROR(PPU, "%s #pc: 0x%x", err.c_str(), CPU.PC); - - if(!pause) return; - - Emu.Pause(); - - for(uint i=0; i<32; ++i) LOG_NOTICE(PPU, "r%d = 0x%llx", i, CPU.GPR[i]); - for(uint i=0; i<32; ++i) LOG_NOTICE(PPU, "f%d = %llf", i, CPU.FPR[i]._double); - for(uint i=0; i<32; ++i) LOG_NOTICE(PPU, "v%d = 0x%s [%s]", i, CPU.VPR[i].to_hex().c_str(), CPU.VPR[i].to_xyzw().c_str()); - LOG_NOTICE(PPU, "CR = 0x%08x", CPU.CR.CR); - LOG_NOTICE(PPU, "LR = 0x%llx", CPU.LR); - LOG_NOTICE(PPU, "CTR = 0x%llx", CPU.CTR); - LOG_NOTICE(PPU, "XER = 0x%llx [CA=%lld | OV=%lld | SO=%lld]", CPU.XER.XER, fmt::by_value(CPU.XER.CA), fmt::by_value(CPU.XER.OV), fmt::by_value(CPU.XER.SO)); - LOG_NOTICE(PPU, "FPSCR = 0x%x " - "[RN=%d | NI=%d | XE=%d | ZE=%d | UE=%d | OE=%d | VE=%d | " - "VXCVI=%d | VXSQRT=%d | VXSOFT=%d | FPRF=%d | " - "FI=%d | FR=%d | VXVC=%d | VXIMZ=%d | " - "VXZDZ=%d | VXIDI=%d | VXISI=%d | VXSNAN=%d | " - "XX=%d | ZX=%d | UX=%d | OX=%d | VX=%d | FEX=%d | FX=%d]", - CPU.FPSCR.FPSCR, - fmt::by_value(CPU.FPSCR.RN), - fmt::by_value(CPU.FPSCR.NI), fmt::by_value(CPU.FPSCR.XE), fmt::by_value(CPU.FPSCR.ZE), fmt::by_value(CPU.FPSCR.UE), fmt::by_value(CPU.FPSCR.OE), fmt::by_value(CPU.FPSCR.VE), - fmt::by_value(CPU.FPSCR.VXCVI), fmt::by_value(CPU.FPSCR.VXSQRT), fmt::by_value(CPU.FPSCR.VXSOFT), fmt::by_value(CPU.FPSCR.FPRF), - fmt::by_value(CPU.FPSCR.FI), fmt::by_value(CPU.FPSCR.FR), fmt::by_value(CPU.FPSCR.VXVC), fmt::by_value(CPU.FPSCR.VXIMZ), - fmt::by_value(CPU.FPSCR.VXZDZ), fmt::by_value(CPU.FPSCR.VXIDI), fmt::by_value(CPU.FPSCR.VXISI), fmt::by_value(CPU.FPSCR.VXSNAN), - fmt::by_value(CPU.FPSCR.XX), fmt::by_value(CPU.FPSCR.ZX), fmt::by_value(CPU.FPSCR.UX), fmt::by_value(CPU.FPSCR.OX), fmt::by_value(CPU.FPSCR.VX), fmt::by_value(CPU.FPSCR.FEX), fmt::by_value(CPU.FPSCR.FX)); + throw fmt::Format("Unknown/Illegal opcode! (0x%08x : 0x%x : 0x%x)", code, opcode, gcode); } }; diff --git a/rpcs3/Emu/Cell/PPUThread.cpp b/rpcs3/Emu/Cell/PPUThread.cpp index ccd6b0ff42..f84095e683 100644 --- a/rpcs3/Emu/Cell/PPUThread.cpp +++ b/rpcs3/Emu/Cell/PPUThread.cpp @@ -189,7 +189,7 @@ int FPRdouble::Cmp(PPCdouble a, PPCdouble b) u64 PPUThread::GetStackArg(s32 i) { - return vm::read64(GPR[1] + 0x70 + 0x8 * (i - 9)); + return vm::read64(vm::cast(GPR[1] + 0x70 + 0x8 * (i - 9))); } u64 PPUThread::FastCall2(u32 addr, u32 rtoc) diff --git a/rpcs3/Emu/Memory/vm.h b/rpcs3/Emu/Memory/vm.h index d548cda8fa..317dbc0a81 100644 --- a/rpcs3/Emu/Memory/vm.h +++ b/rpcs3/Emu/Memory/vm.h @@ -40,6 +40,56 @@ namespace vm return *get_ptr(addr); } + template + struct cast_ptr + { + static_assert(std::is_same::value, "Unsupported vm::cast() type"); + + __forceinline static u32 cast(const T& addr, const char* func) + { + return 0; + } + }; + + template<> + struct cast_ptr + { + __forceinline static u32 cast(const u32 addr, const char* func) + { + return addr; + } + }; + + template<> + struct cast_ptr + { + __forceinline static u32 cast(const u64 addr, const char* func) + { + const u32 res = (u32)addr; + if (res != addr) + { + throw fmt::Format("%s(): invalid address 0x%llx", func, addr); + } + + return res; + } + }; + + template + struct cast_ptr> + { + __forceinline static u32 cast(const be_t& addr, const char* func) + { + return cast_ptr::cast(addr.value(), func); + } + }; + + template + __forceinline static u32 cast(const T& addr, const char* func = "vm::cast") + { + return cast_ptr::cast(addr, func); + } + namespace ps3 { void init(); diff --git a/rpcs3/Emu/Memory/vm_ptr.h b/rpcs3/Emu/Memory/vm_ptr.h index 8433588d79..122753b0ee 100644 --- a/rpcs3/Emu/Memory/vm_ptr.h +++ b/rpcs3/Emu/Memory/vm_ptr.h @@ -11,49 +11,50 @@ namespace vm public: typedef typename std::remove_cv::type type; + static const u32 address_size = (u32)sizeof(AT); _ptr_base operator++ (int) { AT result = m_addr; - m_addr += sizeof(AT); + m_addr += address_size; return make(result); } _ptr_base& operator++ () { - m_addr += sizeof(AT); + m_addr += address_size; return *this; } _ptr_base operator-- (int) { AT result = m_addr; - m_addr -= sizeof(AT); + m_addr -= address_size; return make(result); } _ptr_base& operator-- () { - m_addr -= sizeof(AT); + m_addr -= address_size; return *this; } _ptr_base& operator += (AT count) { - m_addr += count * sizeof(AT); + m_addr += count * address_size; return *this; } _ptr_base& operator -= (AT count) { - m_addr -= count * sizeof(AT); + m_addr -= count * address_size; return *this; } - _ptr_base operator + (typename remove_be_t::type count) const { return make(m_addr + count * sizeof(AT)); } - _ptr_base operator + (typename to_be_t::type count) const { return make(m_addr + count * sizeof(AT)); } - _ptr_base operator - (typename remove_be_t::type count) const { return make(m_addr - count * sizeof(AT)); } - _ptr_base operator - (typename to_be_t::type count) const { return make(m_addr - count * sizeof(AT)); } + _ptr_base operator + (typename remove_be_t::type count) const { return make(m_addr + count * address_size); } + _ptr_base operator + (typename to_be_t::type count) const { return make(m_addr + count * address_size); } + _ptr_base operator - (typename remove_be_t::type count) const { return make(m_addr - count * address_size); } + _ptr_base operator - (typename to_be_t::type count) const { return make(m_addr - count * address_size); } __forceinline bool operator <(const _ptr_base& right) const { return m_addr < right.m_addr; } __forceinline bool operator <=(const _ptr_base& right) const { return m_addr <= right.m_addr; } @@ -67,12 +68,12 @@ namespace vm __forceinline _ptr_base::value, typename to_be_t::type, AT>>& operator *() const { - return vm::get_ref<_ptr_base::value, typename to_be_t::type, AT>>>((u32)m_addr); + return vm::get_ref<_ptr_base::value, typename to_be_t::type, AT>>>(vm::cast(m_addr)); } __forceinline _ptr_base::value, typename to_be_t::type, AT>>& operator [](AT index) const { - return vm::get_ref<_ptr_base::value, typename to_be_t::type, AT>>>((u32)(m_addr + sizeof(AT)* index)); + return vm::get_ref<_ptr_base::value, typename to_be_t::type, AT>>>(vm::cast(m_addr + sizeof(AT)* index)); } //typedef typename invert_be_t::type AT2; @@ -109,68 +110,69 @@ namespace vm public: typedef typename std::remove_cv::type type; + static const u32 data_size = (u32)sizeof(T); __forceinline T* const operator -> () const { - return vm::get_ptr((u32)m_addr); + return vm::get_ptr(vm::cast(m_addr)); } _ptr_base operator++ (int) { AT result = m_addr; - m_addr += sizeof(T); + m_addr += data_size; return make(result); } _ptr_base& operator++ () { - m_addr += sizeof(T); + m_addr += data_size; return *this; } _ptr_base operator-- (int) { AT result = m_addr; - m_addr -= sizeof(T); + m_addr -= data_size; return make(result); } _ptr_base& operator-- () { - m_addr -= sizeof(T); + m_addr -= data_size; return *this; } _ptr_base& operator += (AT count) { - m_addr += count * sizeof(T); + m_addr += count * data_size; return *this; } _ptr_base& operator -= (AT count) { - m_addr -= count * sizeof(T); + m_addr -= count * data_size; return *this; } - _ptr_base operator + (typename remove_be_t::type count) const { return make(m_addr + count * sizeof(T)); } - _ptr_base operator + (typename to_be_t::type count) const { return make(m_addr + count * sizeof(T)); } - _ptr_base operator - (typename remove_be_t::type count) const { return make(m_addr - count * sizeof(T)); } - _ptr_base operator - (typename to_be_t::type count) const { return make(m_addr - count * sizeof(T)); } + _ptr_base operator + (typename remove_be_t::type count) const { return make(m_addr + count * data_size); } + _ptr_base operator + (typename to_be_t::type count) const { return make(m_addr + count * data_size); } + _ptr_base operator - (typename remove_be_t::type count) const { return make(m_addr - count * data_size); } + _ptr_base operator - (typename to_be_t::type count) const { return make(m_addr - count * data_size); } __forceinline T& operator *() const { - return vm::get_ref((u32)m_addr); + return vm::get_ref(vm::cast(m_addr)); } __forceinline T& operator [](typename remove_be_t::type index) const { - return vm::get_ref((u32)(m_addr + sizeof(T) * index)); + return vm::get_ref(vm::cast(m_addr + data_size * index)); } __forceinline T& operator [](typename to_be_t::forced_type index) const { - return vm::get_ref((u32)(m_addr + sizeof(T)* index)); + return vm::get_ref(vm::cast(m_addr + data_size * index)); } __forceinline bool operator <(const _ptr_base& right) const { return m_addr < right.m_addr; } @@ -224,7 +226,7 @@ namespace vm T* get_ptr() const { - return vm::get_ptr((u32)m_addr); + return vm::get_ptr(vm::cast(m_addr)); } static _ptr_base make(AT addr) @@ -253,7 +255,7 @@ namespace vm void* get_ptr() const { - return vm::get_ptr((u32)m_addr); + return vm::get_ptr(vm::cast(m_addr)); } explicit operator void*() const @@ -313,7 +315,7 @@ namespace vm const void* get_ptr() const { - return vm::get_ptr((u32)m_addr); + return vm::get_ptr(vm::cast(m_addr)); } explicit operator const void*() const diff --git a/rpcs3/Emu/RSX/RSXThread.cpp b/rpcs3/Emu/RSX/RSXThread.cpp index d2b2066698..28333b1e59 100644 --- a/rpcs3/Emu/RSX/RSXThread.cpp +++ b/rpcs3/Emu/RSX/RSXThread.cpp @@ -10,7 +10,7 @@ #include "Emu/SysCalls/CB_FUNC.h" #include "Emu/SysCalls/lv2/sys_time.h" -#define ARGS(x) (x >= count ? OutOfArgsCount(x, cmd, count, args.addr()) : args[x].ToLE()) +#define ARGS(x) (x >= count ? OutOfArgsCount(x, cmd, count, args.addr()) : args[x].value()) #define CMD_DEBUG 0 u32 methodRegisters[0xffff]; diff --git a/rpcs3/Emu/SysCalls/CB_FUNC.h b/rpcs3/Emu/SysCalls/CB_FUNC.h index 78b82961dc..129fd5c109 100644 --- a/rpcs3/Emu/SysCalls/CB_FUNC.h +++ b/rpcs3/Emu/SysCalls/CB_FUNC.h @@ -165,8 +165,9 @@ namespace vm template __forceinline RT _ptr_base::operator()(CPUThread& CPU, T... args) const { - const u32 pc = vm::get_ref>((u32)m_addr); - const u32 rtoc = vm::get_ref>((u32)m_addr + 4); + auto data = vm::get_ptr>(vm::cast(m_addr)); + const u32 pc = data[0]; + const u32 rtoc = data[1]; assert(CPU.GetType() == CPU_THREAD_PPU); return cb_detail::_func_caller::call(static_cast(CPU), pc, rtoc, args...); diff --git a/rpcs3/Emu/SysCalls/Modules/cellAdec.cpp b/rpcs3/Emu/SysCalls/Modules/cellAdec.cpp index 8e91455acf..fe7c74d1a7 100644 --- a/rpcs3/Emu/SysCalls/Modules/cellAdec.cpp +++ b/rpcs3/Emu/SysCalls/Modules/cellAdec.cpp @@ -617,7 +617,7 @@ int cellAdecStartSeq(u32 handle, u32 param_addr) { auto param = vm::ptr::make(param_addr); - cellAdec->Todo("*** CellAdecParamMP3: bw_pcm=%d", param->bw_pcm.ToLE()); + cellAdec->Todo("*** CellAdecParamMP3: bw_pcm=%d", param->bw_pcm); break; } default: diff --git a/rpcs3/Emu/SysCalls/Modules/cellDmux.cpp b/rpcs3/Emu/SysCalls/Modules/cellDmux.cpp index ac2bd1368e..ff4cc079df 100644 --- a/rpcs3/Emu/SysCalls/Modules/cellDmux.cpp +++ b/rpcs3/Emu/SysCalls/Modules/cellDmux.cpp @@ -356,7 +356,7 @@ u32 dmuxOpen(Demuxer* dmux_ptr) continue; } - switch (code.ToLE()) + switch (code.value()) { case PACK_START_CODE: { @@ -387,9 +387,9 @@ u32 dmuxOpen(Demuxer* dmux_ptr) stream.skip(4); stream.get(len); - if (!stream.check(len.ToLE())) + if (!stream.check(len)) { - DMUX_ERROR("End of stream (PADDING_STREAM, len=%d)", len.ToLE()); + DMUX_ERROR("End of stream (PADDING_STREAM, len=%d)", len); } stream.skip(len); break; @@ -404,11 +404,11 @@ u32 dmuxOpen(Demuxer* dmux_ptr) stream.skip(4); stream.get(len); - cellDmux->Notice("PRIVATE_STREAM_2 (%d)", len.ToLE()); + cellDmux->Notice("PRIVATE_STREAM_2 (%d)", len); - if (!stream.check(len.ToLE())) + if (!stream.check(len)) { - DMUX_ERROR("End of stream (PRIVATE_STREAM_2, len=%d)", len.ToLE()); + DMUX_ERROR("End of stream (PRIVATE_STREAM_2, len=%d)", len); } stream.skip(len); break; @@ -426,20 +426,20 @@ u32 dmuxOpen(Demuxer* dmux_ptr) stream.skip(4); stream.get(len); - if (!stream.check(len.ToLE())) + if (!stream.check(len)) { - DMUX_ERROR("End of stream (PRIVATE_STREAM_1, len=%d)", len.ToLE()); + DMUX_ERROR("End of stream (PRIVATE_STREAM_1, len=%d)", len); } const PesHeader pes(stream); if (!pes.is_ok) { - DMUX_ERROR("PesHeader error (PRIVATE_STREAM_1, len=%d)", len.ToLE()); + DMUX_ERROR("PesHeader error (PRIVATE_STREAM_1, len=%d)", len); } if (len < pes.size + 4) { - DMUX_ERROR("End of block (PRIVATE_STREAM_1, PesHeader + fid_minor, len=%d)", len.ToLE()); + DMUX_ERROR("End of block (PRIVATE_STREAM_1, PesHeader + fid_minor, len=%d)", len); } len -= pes.size + 4; @@ -462,7 +462,7 @@ u32 dmuxOpen(Demuxer* dmux_ptr) if (len < 3 || !stream.check(3)) { - DMUX_ERROR("End of block (ATX, unknown header, len=%d)", len.ToLE()); + DMUX_ERROR("End of block (ATX, unknown header, len=%d)", len); } len -= 3; stream.skip(3); @@ -484,7 +484,7 @@ u32 dmuxOpen(Demuxer* dmux_ptr) if (data[0] != 0x0f || data[1] != 0xd0) { - DMUX_ERROR("ATX: 0x0fd0 header not found (ats=0x%llx)", ((be_t*)data)->ToLE()); + DMUX_ERROR("ATX: 0x0fd0 header not found (ats=0x%llx)", *(be_t*)data); } u32 frame_size = ((((u32)data[2] & 0x3) << 8) | (u32)data[3]) * 8 + 8; @@ -495,7 +495,7 @@ u32 dmuxOpen(Demuxer* dmux_ptr) es.push_au(frame_size + 8, es.last_dts, es.last_pts, stream.userdata, false /* TODO: set correct value */, 0); - //cellDmux->Notice("ATX AU pushed (ats=0x%llx, frame_size=%d)", ((be_t*)data)->ToLE(), frame_size); + //cellDmux->Notice("ATX AU pushed (ats=0x%llx, frame_size=%d)", *(be_t*)data, frame_size); auto esMsg = vm::ptr::make(dmux.memAddr + (cb_add ^= 16)); esMsg->msgType = CELL_DMUX_ES_MSG_TYPE_AU_FOUND; @@ -505,7 +505,7 @@ u32 dmuxOpen(Demuxer* dmux_ptr) } else { - cellDmux->Notice("PRIVATE_STREAM_1 (len=%d, fid_minor=0x%x)", len.ToLE(), fid_minor); + cellDmux->Notice("PRIVATE_STREAM_1 (len=%d, fid_minor=0x%x)", len, fid_minor); stream.skip(len); } break; @@ -521,29 +521,29 @@ u32 dmuxOpen(Demuxer* dmux_ptr) if (!stream.check(6)) { - DMUX_ERROR("End of stream (video, code=0x%x)", code.ToLE()); + DMUX_ERROR("End of stream (video, code=0x%x)", code); } stream.skip(4); stream.get(len); - if (!stream.check(len.ToLE())) + if (!stream.check(len)) { - DMUX_ERROR("End of stream (video, code=0x%x, len=%d)", code.ToLE(), len.ToLE()); + DMUX_ERROR("End of stream (video, code=0x%x, len=%d)", code, len); } const PesHeader pes(stream); if (!pes.is_ok) { - DMUX_ERROR("PesHeader error (video, code=0x%x, len=%d)", code.ToLE(), len.ToLE()); + DMUX_ERROR("PesHeader error (video, code=0x%x, len=%d)", code, len); } if (len < pes.size + 3) { - DMUX_ERROR("End of block (video, code=0x%x, PesHeader)", code.ToLE()); + DMUX_ERROR("End of block (video, code=0x%x, PesHeader)", code); } len -= pes.size + 3; - const u32 ch = code.ToLE() % 16; + const u32 ch = code % 16; if (esAVC[ch]) { ElementaryStream& es = *esAVC[ch]; @@ -576,13 +576,13 @@ u32 dmuxOpen(Demuxer* dmux_ptr) } // reconstruction of MPEG2-PS stream for vdec module - const u32 size = (u32)len.ToLE() + pes.size + 9; + const u32 size = len + pes.size + 9; stream = backup; es.push(stream, size); } else { - cellDmux->Notice("Video stream (code=0x%x, len=%d)", code.ToLE(), len.ToLE()); + cellDmux->Notice("Video stream (code=0x%x, len=%d)", code, len); stream.skip(len); } break; @@ -590,9 +590,9 @@ u32 dmuxOpen(Demuxer* dmux_ptr) default: { - if ((code.ToLE() & PACKET_START_CODE_MASK) == PACKET_START_CODE_PREFIX) + if ((code & PACKET_START_CODE_MASK) == PACKET_START_CODE_PREFIX) { - DMUX_ERROR("Unknown code found (0x%x)", code.ToLE()); + DMUX_ERROR("Unknown code found (0x%x)", code); } // search @@ -1000,7 +1000,7 @@ int cellDmuxEnableEs(u32 demuxerHandle, vm::ptr esFil *esHandle = id; cellDmux->Warning("*** New ES(dmux=%d, addr=0x%x, size=0x%x, filter(0x%x, 0x%x, 0x%x, 0x%x), cb=0x%x(arg=0x%x), spec=0x%x): id = %d", - demuxerHandle, es->memAddr, es->memSize, es->fidMajor, es->fidMinor, es->sup1, es->sup2, esCb->cbEsMsgFunc.addr().ToLE(), es->cbArg, es->spec, id); + demuxerHandle, es->memAddr, es->memSize, es->fidMajor, es->fidMinor, es->sup1, es->sup2, esCb->cbEsMsgFunc, es->cbArg, es->spec, id); DemuxerTask task(dmuxEnableEs); task.es.es = id; diff --git a/rpcs3/Emu/SysCalls/Modules/cellFont.cpp b/rpcs3/Emu/SysCalls/Modules/cellFont.cpp index e4435ff8ed..69199e2f2c 100644 --- a/rpcs3/Emu/SysCalls/Modules/cellFont.cpp +++ b/rpcs3/Emu/SysCalls/Modules/cellFont.cpp @@ -20,7 +20,7 @@ int cellFontInitializeWithRevision(u64 revisionFlags, vm::ptr co if (config->FileCache.size < 24) return CELL_FONT_ERROR_INVALID_PARAMETER; if (config->flags != 0) - cellFont->Warning("cellFontInitializeWithRevision: Unknown flags (0x%x)", config->flags.ToLE()); + cellFont->Warning("cellFontInitializeWithRevision: Unknown flags (0x%x)", config->flags); s_fontInternalInstance->m_buffer_addr = config->FileCache.buffer_addr; s_fontInternalInstance->m_buffer_size = config->FileCache.size; @@ -168,12 +168,12 @@ int cellFontOpenFontset(PPUThread& CPU, vm::ptr library, vm::pt case CELL_FONT_TYPE_SEURAT_CAPIE_MARU_GOTHIC_YG_DFHEI5_RSANS2_SET: case CELL_FONT_TYPE_SEURAT_CAPIE_MARU_GOTHIC_YG_DFHEI5_VAGR2_SET: case CELL_FONT_TYPE_SEURAT_CAPIE_MARU_GOTHIC_VAGR2_SET: - cellFont->Warning("cellFontOpenFontset: fontType->type = %d not supported yet. RD-R-LATIN.TTF will be used instead.", fontType->type.ToLE()); + cellFont->Warning("cellFontOpenFontset: fontType->type = %d not supported yet. RD-R-LATIN.TTF will be used instead.", fontType->type); file = "/dev_flash/data/font/SCE-PS3-RD-R-LATIN.TTF"; break; default: - cellFont->Warning("cellFontOpenFontset: fontType->type = %d not supported.", fontType->type.ToLE()); + cellFont->Warning("cellFontOpenFontset: fontType->type = %d not supported.", fontType->type); return CELL_FONT_ERROR_NO_SUPPORT_FONTSET; } diff --git a/rpcs3/Emu/SysCalls/Modules/cellGame.cpp b/rpcs3/Emu/SysCalls/Modules/cellGame.cpp index 3b4131c14c..1b8351b1d3 100644 --- a/rpcs3/Emu/SysCalls/Modules/cellGame.cpp +++ b/rpcs3/Emu/SysCalls/Modules/cellGame.cpp @@ -272,7 +272,7 @@ int cellGameDataCheckCreate2(PPUThread& CPU, u32 version, vm::ptr di if (cbSet->setParam) { // TODO: write PARAM.SFO from cbSet - cellGame->Todo("cellGameDataCheckCreate(2)(): writing PARAM.SFO parameters (addr=0x%x)", cbSet->setParam.addr().ToLE()); + cellGame->Todo("cellGameDataCheckCreate(2)(): writing PARAM.SFO parameters (addr=0x%x)", cbSet->setParam); } switch ((s32)cbResult->result) diff --git a/rpcs3/Emu/SysCalls/Modules/cellGifDec.cpp b/rpcs3/Emu/SysCalls/Modules/cellGifDec.cpp index d2a3474834..6fafce19a5 100644 --- a/rpcs3/Emu/SysCalls/Modules/cellGifDec.cpp +++ b/rpcs3/Emu/SysCalls/Modules/cellGifDec.cpp @@ -33,14 +33,14 @@ int cellGifDecOpen(u32 mainHandle, vm::ptr subHandle, vm::ptrsrcSelect.data()) { case se32(CELL_GIFDEC_BUFFER): - current_subHandle->fileSize = src->streamSize.ToLE(); + current_subHandle->fileSize = src->streamSize; break; case se32(CELL_GIFDEC_FILE): // Get file descriptor vm::var> fd; int ret = cellFsOpen(vm::ptr::make(src->fileName.addr()), 0, fd, vm::ptr::make(0), 0); - current_subHandle->fd = fd->ToLE(); + current_subHandle->fd = fd.value(); if (ret != CELL_OK) return CELL_GIFDEC_ERROR_OPEN_FILE; // Get size of file diff --git a/rpcs3/Emu/SysCalls/Modules/cellJpgDec.cpp b/rpcs3/Emu/SysCalls/Modules/cellJpgDec.cpp index c397bc4785..1601720601 100644 --- a/rpcs3/Emu/SysCalls/Modules/cellJpgDec.cpp +++ b/rpcs3/Emu/SysCalls/Modules/cellJpgDec.cpp @@ -39,14 +39,14 @@ int cellJpgDecOpen(u32 mainHandle, vm::ptr subHandle, vm::ptrsrcSelect.data()) { case se32(CELL_JPGDEC_BUFFER): - current_subHandle->fileSize = src->streamSize.ToLE(); + current_subHandle->fileSize = src->streamSize; break; case se32(CELL_JPGDEC_FILE): // Get file descriptor vm::var> fd; int ret = cellFsOpen(vm::ptr::make(src->fileName.addr()), 0, fd, vm::ptr::make(0), 0); - current_subHandle->fd = fd->ToLE(); + current_subHandle->fd = fd.value(); if (ret != CELL_OK) return CELL_JPGDEC_ERROR_OPEN_FILE; // Get size of file @@ -261,7 +261,7 @@ int cellJpgDecDecodeData(u32 mainHandle, u32 subHandle, vm::ptr data, vm::pt case CELL_JPG_UPSAMPLE_ONLY: case CELL_JPG_GRAYSCALE_TO_ALPHA_RGBA: case CELL_JPG_GRAYSCALE_TO_ALPHA_ARGB: - cellJpgDec->Error("cellJpgDecDecodeData: Unsupported color space (%d)", current_outParam.outputColorSpace.ToLE()); + cellJpgDec->Error("cellJpgDecDecodeData: Unsupported color space (%d)", current_outParam.outputColorSpace); break; default: diff --git a/rpcs3/Emu/SysCalls/Modules/cellPngDec.cpp b/rpcs3/Emu/SysCalls/Modules/cellPngDec.cpp index 670d2c04ec..bbd9c24c75 100644 --- a/rpcs3/Emu/SysCalls/Modules/cellPngDec.cpp +++ b/rpcs3/Emu/SysCalls/Modules/cellPngDec.cpp @@ -80,14 +80,14 @@ s64 pngDecOpen( switch (src->srcSelect.data()) { case se32(CELL_PNGDEC_BUFFER): - stream->fileSize = src->streamSize.ToLE(); + stream->fileSize = src->streamSize; break; case se32(CELL_PNGDEC_FILE): // Get file descriptor vm::var> fd; int ret = cellFsOpen(vm::ptr::make(src->fileName.addr()), 0, fd, vm::ptr::make(0), 0); - stream->fd = fd->ToLE(); + stream->fd = fd.value(); if (ret != CELL_OK) return CELL_PNGDEC_ERROR_OPEN_FILE; // Get size of file @@ -223,7 +223,7 @@ s64 pngDecSetParameter( current_outParam.outputComponents = 4; break; default: - cellPngDec->Error("pngDecSetParameter: Unsupported color space (%d)", current_outParam.outputColorSpace.ToLE()); + cellPngDec->Error("pngDecSetParameter: Unsupported color space (%d)", current_outParam.outputColorSpace); return CELL_PNGDEC_ERROR_ARG; } @@ -352,11 +352,11 @@ s64 pngDecodeData( case se32(CELL_PNGDEC_GRAYSCALE): case se32(CELL_PNGDEC_PALETTE): case se32(CELL_PNGDEC_GRAYSCALE_ALPHA): - cellPngDec->Error("pngDecodeData: Unsupported color space (%d)", current_outParam.outputColorSpace.ToLE()); + cellPngDec->Error("pngDecodeData: Unsupported color space (%d)", current_outParam.outputColorSpace); break; default: - cellPngDec->Error("pngDecodeData: Unsupported color space (%d)", current_outParam.outputColorSpace.ToLE()); + cellPngDec->Error("pngDecodeData: Unsupported color space (%d)", current_outParam.outputColorSpace); return CELL_PNGDEC_ERROR_ARG; } diff --git a/rpcs3/Emu/SysCalls/Modules/cellResc.cpp b/rpcs3/Emu/SysCalls/Modules/cellResc.cpp index c6329e366d..7cf2717bea 100644 --- a/rpcs3/Emu/SysCalls/Modules/cellResc.cpp +++ b/rpcs3/Emu/SysCalls/Modules/cellResc.cpp @@ -970,11 +970,11 @@ int cellRescSetSrc(s32 idx, vm::ptr src) return CELL_RESC_ERROR_BAD_ARGUMENT; } - cellResc->Log(" *** format=0x%x", src->format.ToLE()); - cellResc->Log(" *** pitch=%d", src->pitch.ToLE()); - cellResc->Log(" *** width=%d", src->width.ToLE()); - cellResc->Log(" *** height=%d", src->height.ToLE()); - cellResc->Log(" *** offset=0x%x", src->offset.ToLE()); + cellResc->Log(" *** format=0x%x", src->format); + cellResc->Log(" *** pitch=%d", src->pitch); + cellResc->Log(" *** width=%d", src->width); + cellResc->Log(" *** height=%d", src->height); + cellResc->Log(" *** offset=0x%x", src->offset); s_rescInternalInstance->m_rescSrc[idx] = *src; @@ -1054,7 +1054,7 @@ int cellRescSetBufferAddress(vm::ptr colorBuffers, vm::ptr vertexArray for (int i=0; im_dstOffsets[i] = dstOffset->ToLE() + i * s_rescInternalInstance->m_dstBufInterval; + s_rescInternalInstance->m_dstOffsets[i] = dstOffset.value() + i * s_rescInternalInstance->m_dstBufInterval; } for (int i=0; i pTime, vm::ptr pTick) { cellRtc->Log("cellRtcGetTick(pTime=0x%x, pTick=0x%x)", pTime.addr(), pTick.addr()); - rDateTime datetime = rDateTime(pTime->day, (rDateTime::Month)pTime->month.ToLE(), pTime->year, pTime->hour, pTime->minute, pTime->second, (pTime->microsecond / 1000)); + rDateTime datetime = rDateTime(pTime->day, (rDateTime::Month)pTime->month.value(), pTime->year, pTime->hour, pTime->minute, pTime->second, (pTime->microsecond / 1000)); pTick->tick = datetime.GetTicks(); return CELL_OK; @@ -315,7 +315,7 @@ int cellRtcGetDosTime(vm::ptr pDateTime, vm::ptr puiDosTim cellRtc->Log("cellRtcGetDosTime(pDateTime=0x%x, puiDosTime=0x%x)", pDateTime.addr(), puiDosTime.addr()); // Convert to DOS time. - rDateTime date_time = rDateTime(pDateTime->day, (rDateTime::Month)pDateTime->month.ToLE(), pDateTime->year, pDateTime->hour, pDateTime->minute, pDateTime->second, (pDateTime->microsecond / 1000)); + rDateTime date_time = rDateTime(pDateTime->day, (rDateTime::Month)pDateTime->month.value(), pDateTime->year, pDateTime->hour, pDateTime->minute, pDateTime->second, (pDateTime->microsecond / 1000)); *puiDosTime = date_time.GetAsDOS(); return CELL_OK; @@ -326,7 +326,7 @@ int cellRtcGetTime_t(vm::ptr pDateTime, vm::ptr piTime) cellRtc->Log("cellRtcGetTime_t(pDateTime=0x%x, piTime=0x%x)", pDateTime.addr(), piTime.addr()); // Convert to POSIX time_t. - rDateTime date_time = rDateTime(pDateTime->day, (rDateTime::Month)pDateTime->month.ToLE(), pDateTime->year, pDateTime->hour, pDateTime->minute, pDateTime->second, (pDateTime->microsecond / 1000)); + rDateTime date_time = rDateTime(pDateTime->day, (rDateTime::Month)pDateTime->month.value(), pDateTime->year, pDateTime->hour, pDateTime->minute, pDateTime->second, (pDateTime->microsecond / 1000)); *piTime = convertToUNIXTime(date_time.GetSecond(rDateTime::TZ::UTC), date_time.GetMinute(rDateTime::TZ::UTC), date_time.GetHour(rDateTime::TZ::UTC), date_time.GetDay(rDateTime::TZ::UTC), date_time.GetYear(rDateTime::TZ::UTC)); @@ -338,7 +338,7 @@ int cellRtcGetWin32FileTime(vm::ptr pDateTime, vm::ptr pul cellRtc->Log("cellRtcGetWin32FileTime(pDateTime=0x%x, pulWin32FileTime=0x%x)", pDateTime.addr(), pulWin32FileTime.addr()); // Convert to WIN32 FILETIME. - rDateTime date_time = rDateTime(pDateTime->day, (rDateTime::Month)pDateTime->month.ToLE(), pDateTime->year, pDateTime->hour, pDateTime->minute, pDateTime->second, (pDateTime->microsecond / 1000)); + rDateTime date_time = rDateTime(pDateTime->day, (rDateTime::Month)pDateTime->month.value(), pDateTime->year, pDateTime->hour, pDateTime->minute, pDateTime->second, (pDateTime->microsecond / 1000)); *pulWin32FileTime = convertToWin32FILETIME(date_time.GetSecond(rDateTime::TZ::UTC), date_time.GetMinute(rDateTime::TZ::UTC), date_time.GetHour(rDateTime::TZ::UTC), date_time.GetDay(rDateTime::TZ::UTC), date_time.GetYear(rDateTime::TZ::UTC)); diff --git a/rpcs3/Emu/SysCalls/Modules/cellSail.cpp b/rpcs3/Emu/SysCalls/Modules/cellSail.cpp index 14ceef7548..1e4cdc6741 100644 --- a/rpcs3/Emu/SysCalls/Modules/cellSail.cpp +++ b/rpcs3/Emu/SysCalls/Modules/cellSail.cpp @@ -107,7 +107,7 @@ int cellSailDescriptorCreateDatabase(vm::ptr pSelf, vm::ptr< break; } default: - cellSail->Error("Unhandled stream type: %d", pSelf->streamType.ToLE()); + cellSail->Error("Unhandled stream type: %d", pSelf->streamType); } return CELL_OK; diff --git a/rpcs3/Emu/SysCalls/Modules/cellSpurs.cpp b/rpcs3/Emu/SysCalls/Modules/cellSpurs.cpp index 8cea4ad56a..3ee777b0e2 100644 --- a/rpcs3/Emu/SysCalls/Modules/cellSpurs.cpp +++ b/rpcs3/Emu/SysCalls/Modules/cellSpurs.cpp @@ -32,7 +32,7 @@ s64 spursCreateLv2EventQueue(vm::ptr spurs, u32& queue_id, vm::ptr> queue; s32 res = cb_call, vm::ptr, vm::ptr, s32, u32>(GetCurrentPPUThread(), libsre + 0xB14C, libsre_rtoc, spurs, queue, port, size, vm::read32(libsre_rtoc - 0x7E2C)); - queue_id = queue->ToLE(); + queue_id = queue; return res; #endif @@ -763,7 +763,7 @@ s64 cellSpursInitializeWithAttribute(vm::ptr spurs, vm::ptrm.nSpus, attr->m.spuPriority, attr->m.ppuPriority, - attr->m.flags.ToLE() | (attr->m.exitIfNoWork ? SAF_EXIT_IF_NO_WORK : 0), + attr->m.flags | (attr->m.exitIfNoWork ? SAF_EXIT_IF_NO_WORK : 0), attr->m.prefix, attr->m.prefixSize, attr->m.container, @@ -799,7 +799,7 @@ s64 cellSpursInitializeWithAttribute2(vm::ptr spurs, vm::ptrm.nSpus, attr->m.spuPriority, attr->m.ppuPriority, - attr->m.flags.ToLE() | (attr->m.exitIfNoWork ? SAF_EXIT_IF_NO_WORK : 0) | SAF_SECOND_VERSION, + attr->m.flags | (attr->m.exitIfNoWork ? SAF_EXIT_IF_NO_WORK : 0) | SAF_SECOND_VERSION, attr->m.prefix, attr->m.prefixSize, attr->m.container, @@ -851,7 +851,7 @@ s64 cellSpursAttributeSetMemoryContainerForSpuThread(vm::ptr return CELL_SPURS_CORE_ERROR_ALIGN; } - if (attr->m.flags.ToLE() & SAF_SPU_TGT_EXCLUSIVE_NON_CONTEXT) + if (attr->m.flags & SAF_SPU_TGT_EXCLUSIVE_NON_CONTEXT) { return CELL_SPURS_CORE_ERROR_STAT; } @@ -925,7 +925,7 @@ s64 cellSpursAttributeSetSpuThreadGroupType(vm::ptr attr, s3 if (type == SYS_SPU_THREAD_GROUP_TYPE_EXCLUSIVE_NON_CONTEXT) { - if (attr->m.flags.ToLE() & SAF_SPU_MEMORY_CONTAINER_SET) + if (attr->m.flags & SAF_SPU_MEMORY_CONTAINER_SET) { return CELL_SPURS_CORE_ERROR_STAT; } @@ -976,7 +976,7 @@ s64 cellSpursAttributeEnableSystemWorkload(vm::ptr attr, vm: { return CELL_SPURS_CORE_ERROR_PERM; } - if (attr->m.flags.ToLE() & SAF_SYSTEM_WORKLOAD_ENABLED) + if (attr->m.flags & SAF_SYSTEM_WORKLOAD_ENABLED) { return CELL_SPURS_CORE_ERROR_BUSY; } @@ -1442,7 +1442,7 @@ s32 spursAddWorkload( CellSpurs::_sub_str3& wkl = wnum <= 15 ? spurs->m.wklG1[wnum] : spurs->m.wklG2[wnum & 0xf]; spurs->m.wklMskB.atomic_op_sync([spurs, &wkl, wnum, &res_wkl](be_t& v) { - const u32 mask = v.ToLE() & ~(0x80000000u >> wnum); + const u32 mask = v & ~(0x80000000u >> wnum); res_wkl = 0; for (u32 i = 0, m = 0x80000000, k = 0; i < 32; i++, m >>= 1) @@ -1685,7 +1685,7 @@ s64 _cellSpursWorkloadFlagReceiver(vm::ptr spurs, u32 wid, u32 is_set { return CELL_SPURS_POLICY_MODULE_ERROR_INVAL; } - if ((spurs->m.wklMskA.read_relaxed().ToLE() & (0x80000000u >> wid)) == 0) + if ((spurs->m.wklMskA.read_relaxed() & (0x80000000u >> wid)) == 0) { return CELL_SPURS_POLICY_MODULE_ERROR_SRCH; } @@ -1797,7 +1797,7 @@ s64 cellSpursReadyCountStore(vm::ptr spurs, u32 wid, u32 value) { return CELL_SPURS_POLICY_MODULE_ERROR_INVAL; } - if ((spurs->m.wklMskA.read_relaxed().ToLE() & (0x80000000u >> wid)) == 0) + if ((spurs->m.wklMskA.read_relaxed() & (0x80000000u >> wid)) == 0) { return CELL_SPURS_POLICY_MODULE_ERROR_SRCH; } diff --git a/rpcs3/Emu/SysCalls/Modules/cellSync.cpp b/rpcs3/Emu/SysCalls/Modules/cellSync.cpp index 444813aaa5..6f3e3ac82f 100644 --- a/rpcs3/Emu/SysCalls/Modules/cellSync.cpp +++ b/rpcs3/Emu/SysCalls/Modules/cellSync.cpp @@ -940,7 +940,7 @@ s32 syncLFQueueInitialize(vm::ptr queue, vm::ptr buffer, u3 { return CELL_SYNC_ERROR_STAT; } - old_value = old.ToLE(); + old_value = old; } else { @@ -1314,7 +1314,7 @@ s32 _cellSyncLFQueuePushBody(PPUThread& CPU, vm::ptr queue, vm: #ifdef PRX_DEBUG_XXX res = cb_call, u32, u32, u64>(CPU, libsre + 0x24B0, libsre_rtoc, queue, position_v.addr(), isBlocking, 0); - position = position_v->ToLE(); + position = position_v.value(); #else res = syncLFQueueGetPushPointer(queue, position, isBlocking, 0); #endif @@ -1324,7 +1324,7 @@ s32 _cellSyncLFQueuePushBody(PPUThread& CPU, vm::ptr queue, vm: #ifdef PRX_DEBUG res = cb_call, u32, u32, u64>(CPU, libsre + 0x3050, libsre_rtoc, queue, position_v.addr(), isBlocking, 0); - position = position_v->ToLE(); + position = position_v.value(); #else res = syncLFQueueGetPushPointer2(queue, position, isBlocking, 0); #endif @@ -1347,9 +1347,10 @@ s32 _cellSyncLFQueuePushBody(PPUThread& CPU, vm::ptr queue, vm: } } - s32 depth = (u32)queue->m_depth; - s32 size = (u32)queue->m_size; - memcpy(vm::get_ptr((u64)(queue->m_buffer.addr() & ~1ull) + size * (position >= depth ? position - depth : position)), buffer.get_ptr(), size); + const s32 depth = (u32)queue->m_depth; + const s32 size = (u32)queue->m_size; + const u32 addr = vm::cast((queue->m_buffer.addr() & ~1ull) + size * (position >= depth ? position - depth : position)); + memcpy(vm::get_ptr(addr), buffer.get_ptr(), size); s32 res; if (queue->m_direction != CELL_SYNC_QUEUE_ANY2ANY) @@ -1689,7 +1690,7 @@ s32 _cellSyncLFQueuePopBody(PPUThread& CPU, vm::ptr queue, vm:: #ifdef PRX_DEBUG_XXX res = cb_call, u32, u32, u64, u64>(CPU, libsre + 0x2A90, libsre_rtoc, queue, position_v.addr(), isBlocking, 0, 0); - position = position_v->ToLE(); + position = position_v.value(); #else res = syncLFQueueGetPopPointer(queue, position, isBlocking, 0, 0); #endif @@ -1699,7 +1700,7 @@ s32 _cellSyncLFQueuePopBody(PPUThread& CPU, vm::ptr queue, vm:: #ifdef PRX_DEBUG res = cb_call, u32, u32, u64>(CPU, libsre + 0x39AC, libsre_rtoc, queue, position_v.addr(), isBlocking, 0); - position = position_v->ToLE(); + position = position_v.value(); #else res = syncLFQueueGetPopPointer2(queue, position, isBlocking, 0); #endif @@ -1722,9 +1723,10 @@ s32 _cellSyncLFQueuePopBody(PPUThread& CPU, vm::ptr queue, vm:: } } - s32 depth = (u32)queue->m_depth; - s32 size = (u32)queue->m_size; - memcpy(buffer.get_ptr(), vm::get_ptr((u64)(queue->m_buffer.addr() & ~1ull) + size * (position >= depth ? position - depth : position)), size); + const s32 depth = (u32)queue->m_depth; + const s32 size = (u32)queue->m_size; + const u32 addr = vm::cast((queue->m_buffer.addr() & ~1) + size * (position >= depth ? position - depth : position)); + memcpy(buffer.get_ptr(), vm::get_ptr(addr), size); s32 res; if (queue->m_direction != CELL_SYNC_QUEUE_ANY2ANY) diff --git a/rpcs3/Emu/SysCalls/Modules/cellSysutil.cpp b/rpcs3/Emu/SysCalls/Modules/cellSysutil.cpp index ca3108aac1..8ad6d0c650 100644 --- a/rpcs3/Emu/SysCalls/Modules/cellSysutil.cpp +++ b/rpcs3/Emu/SysCalls/Modules/cellSysutil.cpp @@ -285,8 +285,7 @@ int cellVideoOutGetNumberOfDevice(u32 videoOut) int cellVideoOutGetResolutionAvailability(u32 videoOut, u32 resolutionId, u32 aspect, u32 option) { - cellSysutil->Warning("cellVideoOutGetResolutionAvailability(videoOut=%d, resolutionId=0x%x, option_addr=0x%x, aspect=%d, option=%d)", - videoOut, resolutionId, aspect, option); + cellSysutil->Warning("cellVideoOutGetResolutionAvailability(videoOut=%d, resolutionId=0x%x, aspect=%d, option=%d)", videoOut, resolutionId, aspect, option); if (!Ini.GS3DTV.GetValue() && (resolutionId == CELL_VIDEO_OUT_RESOLUTION_720_3D_FRAME_PACKING || resolutionId == CELL_VIDEO_OUT_RESOLUTION_1024x720_3D_FRAME_PACKING || resolutionId == CELL_VIDEO_OUT_RESOLUTION_960x720_3D_FRAME_PACKING || resolutionId == CELL_VIDEO_OUT_RESOLUTION_800x720_3D_FRAME_PACKING || @@ -311,7 +310,7 @@ struct sys_callback void sysutilSendSystemCommand(u64 status, u64 param) { - // TODO: check it and find the source of the return value (not sure that void becomes CELL_OK) + // TODO: check it and find the source of the return value (void isn't equal to CELL_OK) for (auto& cb : g_sys_callback) { if (cb.func) @@ -748,8 +747,8 @@ int cellHddGameCheck(u32 version, vm::ptr dirName, u32 errDialog, vm funcStat(result, get, set); - if (result->result.ToLE() != CELL_HDDGAME_CBRESULT_OK && - result->result.ToLE() != CELL_HDDGAME_CBRESULT_OK_CANCEL) { + if (result->result != CELL_HDDGAME_CBRESULT_OK && + result->result != CELL_HDDGAME_CBRESULT_OK_CANCEL) { return CELL_HDDGAME_ERROR_CBRESULT; } diff --git a/rpcs3/Emu/SysCalls/lv2/cellFs.cpp b/rpcs3/Emu/SysCalls/lv2/cellFs.cpp index a6a2c04be4..3fb8bf1db7 100644 --- a/rpcs3/Emu/SysCalls/lv2/cellFs.cpp +++ b/rpcs3/Emu/SysCalls/lv2/cellFs.cpp @@ -945,7 +945,7 @@ void fsAioRead(u32 fd, vm::ptr aio, int xid, vm::ptr aio, vm::ref id, vm::ptr xaio, int error, int xid, u64 size)> func) +int cellFsAioRead(vm::ptr aio, vm::ptr id, vm::ptr xaio, int error, int xid, u64 size)> func) { sys_fs->Warning("cellFsAioRead(aio=0x%x, id=0x%x, func=0x%x)", aio, id, func); @@ -964,7 +964,7 @@ int cellFsAioRead(vm::ptr aio, vm::ref id, vm::ptrAppend(wxString::Format("%dx%d", ResolutionTable[i].width.ToLE(), ResolutionTable[i].height.ToLE())); + cbox_gs_resolution->Append(wxString::Format("%dx%d", ResolutionTable[i].width.value(), ResolutionTable[i].height.value())); } cbox_gs_aspect->Append("4:3"); diff --git a/rpcs3/Loader/ELF64.cpp b/rpcs3/Loader/ELF64.cpp index c22e582141..706aee8000 100644 --- a/rpcs3/Loader/ELF64.cpp +++ b/rpcs3/Loader/ELF64.cpp @@ -47,7 +47,7 @@ namespace loader if (m_ehdr.e_machine != MACHINE_PPC64 && m_ehdr.e_machine != MACHINE_SPU) { - LOG_ERROR(LOADER, "Unknown elf64 machine type: 0x%x", m_ehdr.e_machine.ToLE()); + LOG_ERROR(LOADER, "Unknown elf64 machine type: 0x%x", m_ehdr.e_machine); return bad_version; } @@ -399,7 +399,7 @@ namespace loader { for (auto &phdr : m_phdrs) { - switch (phdr.p_type.ToLE()) + switch (phdr.p_type.value()) { case 0x00000001: //LOAD if (phdr.p_memsz) @@ -442,12 +442,12 @@ namespace loader { sys_process_param_info& info = Emu.GetInfo().GetProcParam(); /* - LOG_NOTICE(LOADER, "*** sdk version: 0x%x", info.sdk_version.ToLE()); - LOG_NOTICE(LOADER, "*** primary prio: %d", info.primary_prio.ToLE()); - LOG_NOTICE(LOADER, "*** primary stacksize: 0x%x", info.primary_stacksize.ToLE()); - LOG_NOTICE(LOADER, "*** malloc pagesize: 0x%x", info.malloc_pagesize.ToLE()); - LOG_NOTICE(LOADER, "*** ppc seg: 0x%x", info.ppc_seg.ToLE()); - //LOG_NOTICE(LOADER, "*** crash dump param addr: 0x%x", info.crash_dump_param_addr.ToLE()); + LOG_NOTICE(LOADER, "*** sdk version: 0x%x", info.sdk_version); + LOG_NOTICE(LOADER, "*** primary prio: %d", info.primary_prio); + LOG_NOTICE(LOADER, "*** primary stacksize: 0x%x", info.primary_stacksize); + LOG_NOTICE(LOADER, "*** malloc pagesize: 0x%x", info.malloc_pagesize); + LOG_NOTICE(LOADER, "*** ppc seg: 0x%x", info.ppc_seg); + //LOG_NOTICE(LOADER, "*** crash dump param addr: 0x%x", info.crash_dump_param_addr); */ info = proc_param.info; @@ -463,7 +463,7 @@ namespace loader if (proc_prx_param.magic != 0x1b434cec) { - LOG_ERROR(LOADER, "Bad magic! (0x%x)", proc_prx_param.magic.ToLE()); + LOG_ERROR(LOADER, "Bad magic! (0x%x)", proc_prx_param.magic); break; }