diff --git a/rpcs3/Emu/Cell/PPUInstrTable.h b/rpcs3/Emu/Cell/PPUInstrTable.h index 62e19e0138..41c010eba5 100644 --- a/rpcs3/Emu/Cell/PPUInstrTable.h +++ b/rpcs3/Emu/Cell/PPUInstrTable.h @@ -666,6 +666,9 @@ namespace PPU_instr static auto BCTR = std::bind(BCCTR, 0x10 | 0x04, 0, 0, 0); static auto BCTRL = std::bind(BCCTR, 0x10 | 0x04, 0, 0, 1); static auto MTCTR = std::bind(MTSPR, (0x1 << 5) | 0x8, std::placeholders::_1); + + static inline u32 BNE(s32 imm) { return BC(4, 30, imm, 0, 0); } + static inline u32 BEQ(s32 imm) { return BC(12, 30, imm, 0, 0); } } diff --git a/rpcs3/Emu/Cell/SPUThread.h b/rpcs3/Emu/Cell/SPUThread.h index da9ec3e025..af3c9c8064 100644 --- a/rpcs3/Emu/Cell/SPUThread.h +++ b/rpcs3/Emu/Cell/SPUThread.h @@ -115,8 +115,6 @@ enum struct g_imm_table_struct { - //u16 cntb_table[65536]; - __m128i fsmb_table[65536]; __m128i fsmh_table[256]; __m128i fsm_table[16]; @@ -127,20 +125,8 @@ struct g_imm_table_struct g_imm_table_struct() { - /*static_assert(offsetof(g_imm_table_struct, cntb_table) == 0, "offsetof(cntb_table) != 0"); - for (u32 i = 0; i < sizeof(cntb_table) / sizeof(cntb_table[0]); i++) - { - u32 cnt_low = 0, cnt_high = 0; - for (u32 j = 0; j < 8; j++) - { - cnt_low += (i >> j) & 1; - cnt_high += (i >> (j + 8)) & 1; - } - cntb_table[i] = (cnt_high << 8) | cnt_low; - }*/ for (u32 i = 0; i < sizeof(fsm_table) / sizeof(fsm_table[0]); i++) { - for (u32 j = 0; j < 4; j++) mmToU32Ptr(fsm_table[i])[j] = (i & (1 << j)) ? ~0 : 0; } for (u32 i = 0; i < sizeof(fsmh_table) / sizeof(fsmh_table[0]); i++) diff --git a/rpcs3/Emu/SysCalls/Modules.cpp b/rpcs3/Emu/SysCalls/Modules.cpp index f839ead3fa..c4786371ba 100644 --- a/rpcs3/Emu/SysCalls/Modules.cpp +++ b/rpcs3/Emu/SysCalls/Modules.cpp @@ -30,7 +30,7 @@ u32 add_ppu_func_sub(StaticFunc func) return func.index; } -u32 add_ppu_func_sub(const char group[8], const u64 ops[], const char* name, Module* module, ppu_func_caller func) +u32 add_ppu_func_sub(const char group[8], const SearchPatternEntry ops[], const size_t count, const char* name, Module* module, ppu_func_caller func) { char group_name[9] = {}; @@ -45,13 +45,14 @@ u32 add_ppu_func_sub(const char group[8], const u64 ops[], const char* name, Mod sf.group = *(u64*)group_name; sf.found = 0; - // TODO: check for self-inclusions, use CRC - for (u32 i = 0; ops[i]; i++) + for (u32 i = 0; i < count; i++) { - SFuncOp op; - op.mask = re32((u32)(ops[i] >> 32)); - op.crc = re32((u32)(ops[i])); - if (op.mask) op.crc &= op.mask; + SearchPatternEntry op; + op.type = ops[i].type; + op.data = re32(ops[i].data); + op.mask = re32(ops[i].mask); + op.num = ops[i].num; + assert(!op.mask || (op.data & ~op.mask) == 0); sf.ops.push_back(op); } @@ -173,90 +174,155 @@ u32 get_function_id(const char* name) return (u32&)output[0]; } -void hook_ppu_funcs(u32* base, u32 size) +void hook_ppu_func(vm::ptr base, u32 pos, u32 size) { - size /= 4; + using namespace PPU_instr; + + for (auto& sub : g_ppu_func_subs) + { + bool found = true; + + for (u32 k = pos, x = 0; x + 1 <= sub.ops.size(); k++, x++) + { + if (k >= size) + { + found = false; + break; + } + + // skip NOP + if (base[k].data() == se32(0x60000000)) + { + x--; + continue; + } + + const u32 data = sub.ops[x].data; + const u32 mask = sub.ops[x].mask; + + const bool match = (base[k].data() & mask) == data; + + switch (sub.ops[x].type) + { + case SPET_MASKED_OPCODE: + { + // masked pattern + if (!match) + { + found = false; + } + + break; + } + case SPET_OPTIONAL_MASKED_OPCODE: + { + // optional masked pattern + if (!match) + { + k--; + } + + break; + } + case SPET_LABEL: + { + const auto addr = (base + k--).addr(); + const auto lnum = data; + const auto label = sub.labels.find(lnum); + + if (label == sub.labels.end()) // register the label + { + sub.labels[lnum] = addr; + } + else if (label->second != addr) // or check registered label + { + found = false; + } + + break; + } + case SPET_BRANCH_TO_LABEL: + { + if (!match) + { + found = false; + break; + } + + const auto addr = (base[k].data() & se32(2) ? 0 : (base + k).addr()) + ((s32)base[k] << cntlz32(mask) >> (cntlz32(mask) + 2)); + const auto lnum = sub.ops[x].num; + const auto label = sub.labels.find(lnum); + + if (label == sub.labels.end()) // register the label + { + sub.labels[lnum] = addr; + } + else if (label->second != addr) // or check registered label + { + found = false; + } + + break; + } + //case SPET_BRANCH_TO_FUNC: + //{ + // if (!match) + // { + // found = false; + // break; + // } + + // const auto addr = (base[k].data() & se32(2) ? 0 : (base + k).addr()) + ((s32)base[k] << cntlz32(mask) >> (cntlz32(mask) + 2)); + // const auto nid = sub.ops[x].num; + // // TODO: recursive call + //} + default: + { + LOG_ERROR(LOADER, "Unknown search pattern type (%d)", sub.ops[x].type); + assert(0); + return; + } + } + + if (!found) + { + break; + } + } + + if (found) + { + LOG_NOTICE(LOADER, "Function '%s' hooked (addr=0x%x)", sub.name, (base + pos).addr()); + sub.found++; + base[pos] = HACK(sub.index | EIF_PERFORM_BLR); + } + + if (sub.labels.size()) + { + sub.labels.clear(); + } + } +} + +void hook_ppu_funcs(vm::ptr base, u32 size) +{ + using namespace PPU_instr; if (!Ini.HLEHookStFunc.GetValue()) + { return; + } // TODO: optimize search for (u32 i = 0; i < size; i++) { - for (u32 j = 0; j < g_ppu_func_subs.size(); j++) + // skip NOP + if (base[i].data() == se32(0x60000000)) { - if ((base[i] & g_ppu_func_subs[j].ops[0].mask) == g_ppu_func_subs[j].ops[0].crc) - { - bool found = true; - u32 can_skip = 0; - for (u32 k = i, x = 0; x + 1 <= g_ppu_func_subs[j].ops.size(); k++, x++) - { - if (k >= size) - { - found = false; - break; - } - - // skip NOP - if (base[k] == se32(0x60000000)) - { - x--; - continue; - } - - const u32 mask = g_ppu_func_subs[j].ops[x].mask; - const u32 crc = g_ppu_func_subs[j].ops[x].crc; - - if (!mask) - { - // TODO: define syntax - if (crc < 4) // skip various number of instructions that don't match next pattern entry - { - can_skip += crc; - k--; // process this position again - } - else if (base[k] != crc) // skippable pattern ("optional" instruction), no mask allowed - { - k--; - if (can_skip) // cannot define this behaviour properly - { - LOG_WARNING(LOADER, "hook_ppu_funcs(): can_skip = %d (unchanged)", can_skip); - } - } - else - { - if (can_skip) // cannot define this behaviour properly - { - LOG_WARNING(LOADER, "hook_ppu_funcs(): can_skip = %d (set to 0)", can_skip); - can_skip = 0; - } - } - } - else if ((base[k] & mask) != crc) // masked pattern - { - if (can_skip) - { - can_skip--; - } - else - { - found = false; - break; - } - } - else - { - can_skip = 0; - } - } - if (found) - { - LOG_NOTICE(LOADER, "Function '%s' hooked (addr=0x%x)", g_ppu_func_subs[j].name, vm::get_addr(base + i * 4)); - g_ppu_func_subs[j].found++; - base[i] = re32(0x04000000 | g_ppu_func_subs[j].index | EIF_PERFORM_BLR); // hack - } - } + continue; } + + hook_ppu_func(base, i, size); } // check function groups diff --git a/rpcs3/Emu/SysCalls/Modules.h b/rpcs3/Emu/SysCalls/Modules.h index f6a06c4827..ba8cffa9aa 100644 --- a/rpcs3/Emu/SysCalls/Modules.h +++ b/rpcs3/Emu/SysCalls/Modules.h @@ -43,19 +43,31 @@ struct ModuleFunc } }; -struct SFuncOp +enum : u32 { - u32 crc; + SPET_MASKED_OPCODE, + SPET_OPTIONAL_MASKED_OPCODE, + SPET_LABEL, + SPET_BRANCH_TO_LABEL, + SPET_BRANCH_TO_FUNC, +}; + +struct SearchPatternEntry +{ + u32 type; + u32 data; u32 mask; + u32 num; // supplement info }; struct StaticFunc { u32 index; const char* name; - std::vector ops; + std::vector ops; u64 group; u32 found; + std::unordered_map labels; }; class Module : public LogBase @@ -138,9 +150,9 @@ void clear_ppu_functions(); u32 get_function_id(const char* name); u32 add_ppu_func_sub(StaticFunc sf); -u32 add_ppu_func_sub(const char group[8], const u64 ops[], const char* name, Module* module, ppu_func_caller func); +u32 add_ppu_func_sub(const char group[8], const SearchPatternEntry ops[], size_t count, const char* name, Module* module, ppu_func_caller func); -void hook_ppu_funcs(u32* base, u32 size); +void hook_ppu_funcs(vm::ptr base, u32 size); #define REG_FUNC(module, name) add_ppu_func(ModuleFunc(get_function_id(#name), 0, &module, bind_func(name))) #define REG_FUNC_FH(module, name) add_ppu_func(ModuleFunc(get_function_id(#name), MFF_FORCED_HLE, &module, bind_func(name))) @@ -148,9 +160,13 @@ void hook_ppu_funcs(u32* base, u32 size); #define REG_UNNAMED(module, nid) add_ppu_func(ModuleFunc(0x##nid, 0, &module, bind_func(_nid_##nid))) #define REG_SUB(module, group, name, ...) \ - static const u64 name ## _table[] = {__VA_ARGS__ , 0}; \ - if (name ## _table[0]) add_ppu_func_sub(group, name ## _table, #name, &module, bind_func(name)) + const SearchPatternEntry name##_table[] = {__VA_ARGS__}; \ + add_ppu_func_sub(group, name##_table, sizeof(name##_table) / sizeof(SearchPatternEntry), #name, &module, bind_func(name)) -#define op_mask(op) []() -> u64 { s32 XXX = 0; u64 _op = (op); XXX = -1; return ((op) ^ ~_op) << 32 | _op; }() +#define se_op(op) []() { SearchPatternEntry res = { SPET_MASKED_OPCODE }; s32 XXX = 0; res.data = (op); XXX = -1; res.mask = (op) ^ ~res.data; return res; }() +#define se_opt(op) []() { SearchPatternEntry res = { SPET_OPTIONAL_MASKED_OPCODE }; s32 XXX = 0; res.data = (op); XXX = -1; res.mask = (op) ^ ~res.data; return res; }() +#define se_label(label) { SPET_LABEL, (label) } +#define se_lbr(op, label) []() { SearchPatternEntry res = { SPET_BRANCH_TO_LABEL, 0, 0, (label) }; s32 XXX = 0; res.data = (op); XXX = -1; res.mask = (op) ^ ~res.data; return res; }() +#define se_call(op, name) []() { SearchPatternEntry res = { SPET_BRANCH_TO_FUNC, 0, 0, get_function_id(#name) }; s32 XXX = 0; res.data = (op); XXX = -1; res.mask = (op) ^ ~res.data; return res; }() #define UNIMPLEMENTED_FUNC(module) module.Error("%s", __FUNCTION__) diff --git a/rpcs3/Emu/SysCalls/Modules/libmixer.cpp b/rpcs3/Emu/SysCalls/Modules/libmixer.cpp index d2d705477d..920e4f087e 100644 --- a/rpcs3/Emu/SysCalls/Modules/libmixer.cpp +++ b/rpcs3/Emu/SysCalls/Modules/libmixer.cpp @@ -643,568 +643,572 @@ Module libmixer("libmixer", []() using namespace PPU_instr; REG_SUB(libmixer, "surmxAAN", cellAANAddData, - 0xffffffff7c691b78, - 0xffffffff7c0802a6, - 0xfffffffff821ff91, - 0xfffffffff8010080, - 0xffffffff7c802378, - 0xffffffff7caa2b78, - 0xffffffff81690000, - 0xffffffff7c050378, - 0xffffffff7cc43378, - 0x78630020, // clrldi r3,r3,32 - 0xffffffff7d465378, - 0xffffffff812b0030, - 0xffffffff80090000, - 0xfffffffff8410028, - 0xffffffff7c0903a6, - 0xffffffff80490004, - 0xffffffff4e800421, - 0xffffffffe8410028, - 0xffffffffe8010080, - 0xffffffff7c6307b4, - 0xffffffff7c0803a6, - 0xffffffff38210070, - 0xffffffff4e800020 + { SPET_MASKED_OPCODE, 0x7c691b78, 0xffffffff }, + { SPET_MASKED_OPCODE, 0x7c0802a6, 0xffffffff }, + { SPET_MASKED_OPCODE, 0xf821ff91, 0xffffffff }, + { SPET_MASKED_OPCODE, 0xf8010080, 0xffffffff }, + { SPET_MASKED_OPCODE, 0x7c802378, 0xffffffff }, + { SPET_MASKED_OPCODE, 0x7caa2b78, 0xffffffff }, + { SPET_MASKED_OPCODE, 0x81690000, 0xffffffff }, + { SPET_MASKED_OPCODE, 0x7c050378, 0xffffffff }, + { SPET_MASKED_OPCODE, 0x7cc43378, 0xffffffff }, + { SPET_OPTIONAL_MASKED_OPCODE, 0x78630020, 0xffffffff }, // clrldi r3,r3,32 + { SPET_MASKED_OPCODE, 0x7d465378, 0xffffffff }, + { SPET_MASKED_OPCODE, 0x812b0030, 0xffffffff }, + { SPET_MASKED_OPCODE, 0x80090000, 0xffffffff }, + { SPET_MASKED_OPCODE, 0xf8410028, 0xffffffff }, + { SPET_MASKED_OPCODE, 0x7c0903a6, 0xffffffff }, + { SPET_MASKED_OPCODE, 0x80490004, 0xffffffff }, + { SPET_MASKED_OPCODE, 0x4e800421, 0xffffffff }, + { SPET_MASKED_OPCODE, 0xe8410028, 0xffffffff }, + { SPET_MASKED_OPCODE, 0xe8010080, 0xffffffff }, + { SPET_MASKED_OPCODE, 0x7c6307b4, 0xffffffff }, + { SPET_MASKED_OPCODE, 0x7c0803a6, 0xffffffff }, + { SPET_MASKED_OPCODE, 0x38210070, 0xffffffff }, + { SPET_MASKED_OPCODE, 0x4e800020, 0xffffffff }, ); REG_SUB(libmixer, "surmxAAN", cellAANConnect, - 0xfffffffff821ff71, - 0xffffffff7c0802a6, - 0xffffffff2f830000, - 0xfffffffff80100a0, - 0xffffffff3c008031, - 0xffffffff7c691b78, - 0xffffffff7c8a2378, - 0xffffffff60000003, - 0xffffff00409e0018, // bne - 0xffffffff7c0307b4, - 0xffffffffe80100a0, - 0xffffffff38210090, - 0xffffffff7c0803a6, - 0xffffffff4e800020, - 0xffffffff2f850000, - 0xffffffff78630020, - 0xffffffff38810070, - 0xffffff00419effe0, // beq - 0xffffffff81690000, - 0xffffffff38000001, - 0xffffffff91210074, - 0xffffffff90a10070, - 0xffffffff90c10078, - 0xffffffff9141007c, - 0xffffffff812b0018, // difference - 0xffffffff90010080, - 0xffffffff80090000, - 0xfffffffff8410028, - 0xffffffff7c0903a6, - 0xffffffff80490004, - 0xffffffff4e800421, - 0xffffffffe8410028, - 0xffffffff7c601b78, - 0xffffffff7c0307b4, - 0xffffffffe80100a0, - 0xffffffff38210090, - 0xffffffff7c0803a6, - 0xffffffff4e800020 + { SPET_MASKED_OPCODE, 0xf821ff71, 0xffffffff }, + { SPET_MASKED_OPCODE, 0x7c0802a6, 0xffffffff }, + { SPET_MASKED_OPCODE, 0x2f830000, 0xffffffff }, + { SPET_MASKED_OPCODE, 0xf80100a0, 0xffffffff }, + { SPET_MASKED_OPCODE, 0x3c008031, 0xffffffff }, + { SPET_MASKED_OPCODE, 0x7c691b78, 0xffffffff }, + { SPET_MASKED_OPCODE, 0x7c8a2378, 0xffffffff }, + { SPET_MASKED_OPCODE, 0x60000003, 0xffffffff }, + se_lbr(BNE(XXX), 0x24), + se_label(0x24), + { SPET_MASKED_OPCODE, 0x7c0307b4, 0xffffffff }, + { SPET_MASKED_OPCODE, 0xe80100a0, 0xffffffff }, + { SPET_MASKED_OPCODE, 0x38210090, 0xffffffff }, + { SPET_MASKED_OPCODE, 0x7c0803a6, 0xffffffff }, + { SPET_MASKED_OPCODE, 0x4e800020, 0xffffffff }, + se_label(0x38), + { SPET_MASKED_OPCODE, 0x2f850000, 0xffffffff }, + { SPET_MASKED_OPCODE, 0x78630020, 0xffffffff }, + { SPET_MASKED_OPCODE, 0x38810070, 0xffffffff }, + se_lbr(BEQ(XXX), 0x38), + { SPET_MASKED_OPCODE, 0x81690000, 0xffffffff }, + { SPET_MASKED_OPCODE, 0x38000001, 0xffffffff }, + { SPET_MASKED_OPCODE, 0x91210074, 0xffffffff }, + { SPET_MASKED_OPCODE, 0x90a10070, 0xffffffff }, + { SPET_MASKED_OPCODE, 0x90c10078, 0xffffffff }, + { SPET_MASKED_OPCODE, 0x9141007c, 0xffffffff }, + { SPET_MASKED_OPCODE, 0x812b0018, 0xffffffff }, // + { SPET_MASKED_OPCODE, 0x90010080, 0xffffffff }, + { SPET_MASKED_OPCODE, 0x80090000, 0xffffffff }, + { SPET_MASKED_OPCODE, 0xf8410028, 0xffffffff }, + { SPET_MASKED_OPCODE, 0x7c0903a6, 0xffffffff }, + { SPET_MASKED_OPCODE, 0x80490004, 0xffffffff }, + { SPET_MASKED_OPCODE, 0x4e800421, 0xffffffff }, + { SPET_MASKED_OPCODE, 0xe8410028, 0xffffffff }, + { SPET_MASKED_OPCODE, 0x7c601b78, 0xffffffff }, + { SPET_MASKED_OPCODE, 0x7c0307b4, 0xffffffff }, + { SPET_MASKED_OPCODE, 0xe80100a0, 0xffffffff }, + { SPET_MASKED_OPCODE, 0x38210090, 0xffffffff }, + { SPET_MASKED_OPCODE, 0x7c0803a6, 0xffffffff }, + { SPET_MASKED_OPCODE, 0x4e800020, 0xffffffff }, ); REG_SUB(libmixer, "surmxAAN", cellAANDisconnect, - 0xfffffffff821ff71, - 0xffffffff7c0802a6, - 0xffffffff2f830000, - 0xfffffffff80100a0, - 0xffffffff3c008031, - 0xffffffff7c691b78, - 0xffffffff7c8a2378, - 0xffffffff60000003, - 0xffffff00409e0018, // bne - 0xffffffff7c0307b4, - 0xffffffffe80100a0, - 0xffffffff38210090, - 0xffffffff7c0803a6, - 0xffffffff4e800020, - 0xffffffff2f850000, - 0xffffffff78630020, - 0xffffffff38810070, - 0xffffff00419effe0, // beq - 0xffffffff81690000, - 0xffffffff38000001, - 0xffffffff91210074, - 0xffffffff90a10070, - 0xffffffff90c10078, - 0xffffffff9141007c, - 0xffffffff812b001c, // difference - 0xffffffff90010080, - 0xffffffff80090000, - 0xfffffffff8410028, - 0xffffffff7c0903a6, - 0xffffffff80490004, - 0xffffffff4e800421, - 0xffffffffe8410028, - 0xffffffff7c601b78, - 0xffffffff7c0307b4, - 0xffffffffe80100a0, - 0xffffffff38210090, - 0xffffffff7c0803a6, - 0xffffffff4e800020 + { SPET_MASKED_OPCODE, 0xf821ff71, 0xffffffff }, + { SPET_MASKED_OPCODE, 0x7c0802a6, 0xffffffff }, + { SPET_MASKED_OPCODE, 0x2f830000, 0xffffffff }, + { SPET_MASKED_OPCODE, 0xf80100a0, 0xffffffff }, + { SPET_MASKED_OPCODE, 0x3c008031, 0xffffffff }, + { SPET_MASKED_OPCODE, 0x7c691b78, 0xffffffff }, + { SPET_MASKED_OPCODE, 0x7c8a2378, 0xffffffff }, + { SPET_MASKED_OPCODE, 0x60000003, 0xffffffff }, + se_lbr(BNE(XXX), 0x24), + se_label(0x24), + { SPET_MASKED_OPCODE, 0x7c0307b4, 0xffffffff }, + { SPET_MASKED_OPCODE, 0xe80100a0, 0xffffffff }, + { SPET_MASKED_OPCODE, 0x38210090, 0xffffffff }, + { SPET_MASKED_OPCODE, 0x7c0803a6, 0xffffffff }, + { SPET_MASKED_OPCODE, 0x4e800020, 0xffffffff }, + se_label(0x38), + { SPET_MASKED_OPCODE, 0x2f850000, 0xffffffff }, + { SPET_MASKED_OPCODE, 0x78630020, 0xffffffff }, + { SPET_MASKED_OPCODE, 0x38810070, 0xffffffff }, + se_lbr(BEQ(XXX), 0x38), + { SPET_MASKED_OPCODE, 0x81690000, 0xffffffff }, + { SPET_MASKED_OPCODE, 0x38000001, 0xffffffff }, + { SPET_MASKED_OPCODE, 0x91210074, 0xffffffff }, + { SPET_MASKED_OPCODE, 0x90a10070, 0xffffffff }, + { SPET_MASKED_OPCODE, 0x90c10078, 0xffffffff }, + { SPET_MASKED_OPCODE, 0x9141007c, 0xffffffff }, + { SPET_MASKED_OPCODE, 0x812b001c, 0xffffffff }, // + { SPET_MASKED_OPCODE, 0x90010080, 0xffffffff }, + { SPET_MASKED_OPCODE, 0x80090000, 0xffffffff }, + { SPET_MASKED_OPCODE, 0xf8410028, 0xffffffff }, + { SPET_MASKED_OPCODE, 0x7c0903a6, 0xffffffff }, + { SPET_MASKED_OPCODE, 0x80490004, 0xffffffff }, + { SPET_MASKED_OPCODE, 0x4e800421, 0xffffffff }, + { SPET_MASKED_OPCODE, 0xe8410028, 0xffffffff }, + { SPET_MASKED_OPCODE, 0x7c601b78, 0xffffffff }, + { SPET_MASKED_OPCODE, 0x7c0307b4, 0xffffffff }, + { SPET_MASKED_OPCODE, 0xe80100a0, 0xffffffff }, + { SPET_MASKED_OPCODE, 0x38210090, 0xffffffff }, + { SPET_MASKED_OPCODE, 0x7c0803a6, 0xffffffff }, + { SPET_MASKED_OPCODE, 0x4e800020, 0xffffffff } ); REG_SUB(libmixer, "surmixer", cellSurMixerCreate, - 0xffffffff2f830000, - 0xffffffff7c0802a6, - 0xfffffffff821ff51, - 0xfffffffffbc100a0, - 0xfffffffffb210078, - 0xfffffffffb410080, - 0xfffffffffb610088, - 0xfffffffffb810090, - 0xfffffffffba10098, - 0xfffffffffbe100a8, - 0xfffffffff80100c0, - 0xffffffff7c7e1b78, - 0xf000000040000000, // bne - 0xffffffff3fe08031, - 0xffffffff63ff0003, - 0xffffffffe80100c0, - 0xffffffff7fe307b4, - 0xffffffffeb210078, - 0xffffffffeb410080, - 0xffffffff7c0803a6, - 0xffffffffeb610088, - 0xffffffffeb810090, - 0xffffffffeba10098, - 0xffffffffebc100a0, - 0xffffffffebe100a8, - 0xffffffff382100b0 + { SPET_MASKED_OPCODE, 0x2f830000, 0xffffffff }, + { SPET_MASKED_OPCODE, 0x7c0802a6, 0xffffffff }, + { SPET_MASKED_OPCODE, 0xf821ff51, 0xffffffff }, + { SPET_MASKED_OPCODE, 0xfbc100a0, 0xffffffff }, + { SPET_MASKED_OPCODE, 0xfb210078, 0xffffffff }, + { SPET_MASKED_OPCODE, 0xfb410080, 0xffffffff }, + { SPET_MASKED_OPCODE, 0xfb610088, 0xffffffff }, + { SPET_MASKED_OPCODE, 0xfb810090, 0xffffffff }, + { SPET_MASKED_OPCODE, 0xfba10098, 0xffffffff }, + { SPET_MASKED_OPCODE, 0xfbe100a8, 0xffffffff }, + { SPET_MASKED_OPCODE, 0xf80100c0, 0xffffffff }, + { SPET_MASKED_OPCODE, 0x7c7e1b78, 0xffffffff }, + { SPET_MASKED_OPCODE, 0x40000000, 0xf0000000 }, // bne + { SPET_MASKED_OPCODE, 0x3fe08031, 0xffffffff }, + { SPET_MASKED_OPCODE, 0x63ff0003, 0xffffffff }, + { SPET_MASKED_OPCODE, 0xe80100c0, 0xffffffff }, + { SPET_MASKED_OPCODE, 0x7fe307b4, 0xffffffff }, + { SPET_MASKED_OPCODE, 0xeb210078, 0xffffffff }, + { SPET_MASKED_OPCODE, 0xeb410080, 0xffffffff }, + { SPET_MASKED_OPCODE, 0x7c0803a6, 0xffffffff }, + { SPET_MASKED_OPCODE, 0xeb610088, 0xffffffff }, + { SPET_MASKED_OPCODE, 0xeb810090, 0xffffffff }, + { SPET_MASKED_OPCODE, 0xeba10098, 0xffffffff }, + { SPET_MASKED_OPCODE, 0xebc100a0, 0xffffffff }, + { SPET_MASKED_OPCODE, 0xebe100a8, 0xffffffff }, + { SPET_MASKED_OPCODE, 0x382100b0, 0xffffffff } ); REG_SUB(libmixer, "surmixer", cellSurMixerGetAANHandle, - op_mask(LWZ(10, 2, XXX)), - 0xffffffff3d607fce, - 0xffffffff616bfffe, - 0xffffffff812a0018, - 0xffffffff7d2afe70, - 0xffffffff91230000, - 0xffffffff7d404a78, - 0xffffffff7c005050, - 0xffffffff7c00fe70, - 0xffffffff7c035838, - 0xffffffff3c638031, - 0xffffffff38630002, - 0xffffffff7c6307b4, - 0xffffffff4e800020 + se_op(LWZ(r10, r2, XXX)), + { SPET_MASKED_OPCODE, 0x3d607fce, 0xffffffff }, + { SPET_MASKED_OPCODE, 0x616bfffe, 0xffffffff }, + { SPET_MASKED_OPCODE, 0x812a0018, 0xffffffff }, + { SPET_MASKED_OPCODE, 0x7d2afe70, 0xffffffff }, + { SPET_MASKED_OPCODE, 0x91230000, 0xffffffff }, + { SPET_MASKED_OPCODE, 0x7d404a78, 0xffffffff }, + { SPET_MASKED_OPCODE, 0x7c005050, 0xffffffff }, + { SPET_MASKED_OPCODE, 0x7c00fe70, 0xffffffff }, + { SPET_MASKED_OPCODE, 0x7c035838, 0xffffffff }, + { SPET_MASKED_OPCODE, 0x3c638031, 0xffffffff }, + { SPET_MASKED_OPCODE, 0x38630002, 0xffffffff }, + { SPET_MASKED_OPCODE, 0x7c6307b4, 0xffffffff }, + { SPET_MASKED_OPCODE, 0x4e800020, 0xffffffff } ); REG_SUB(libmixer, "surmixer", cellSurMixerChStripGetAANPortNo, - op_mask(LWZ(9, 2, XXX)), - 0xffffffff7c661b78, - 0xffffffff3c608031, - 0xffffffff78c60020, - 0xffffffff78840020, - 0xffffffff60630002, - 0xffffffff80090018, - 0xffffffff78a50020, - 0xffffffff2f800000, - 0xffffffff4d9e0020, - 0xffffffff78030020, - 0xf000000040000000 // b + se_op(LWZ(r9, r2, XXX)), + { SPET_MASKED_OPCODE, 0x7c661b78, 0xffffffff }, + { SPET_MASKED_OPCODE, 0x3c608031, 0xffffffff }, + { SPET_MASKED_OPCODE, 0x78c60020, 0xffffffff }, + { SPET_MASKED_OPCODE, 0x78840020, 0xffffffff }, + { SPET_MASKED_OPCODE, 0x60630002, 0xffffffff }, + { SPET_MASKED_OPCODE, 0x80090018, 0xffffffff }, + { SPET_MASKED_OPCODE, 0x78a50020, 0xffffffff }, + { SPET_MASKED_OPCODE, 0x2f800000, 0xffffffff }, + { SPET_MASKED_OPCODE, 0x4d9e0020, 0xffffffff }, + { SPET_MASKED_OPCODE, 0x78030020, 0xffffffff }, + { SPET_MASKED_OPCODE, 0x40000000, 0xf0000000 } // b ); REG_SUB(libmixer, "surmixer", cellSurMixerSetNotifyCallback, - op_mask(LWZ(10, 2, XXX)), - 0xffffffff7c0802a6, - 0xfffffffff821ff81, - 0xfffffffff8010090, - 0xffffffff7c6b1b78, - 0xffffffff3c608031, - 0xffffffff812a0018, - 0xffffffff7c882378, - 0xffffffff60630003, - 0xffffffff2f890000, - 0xffffffff2f0b0000, - 0xffffff00409e0020, // bne - 0xffffffff3c608031, - 0xffffffff60630002, - 0xffffffffe8010090, - 0xffffffff7c6307b4, - 0xffffffff38210080, - 0xffffffff7c0803a6, - 0xffffffff4e800020, - 0xffffff00419affec, // beq - op_mask(LWZ(0, 10, XXX)), - 0xffffffff79290020, - 0xffffffff38810070, - 0xffffffff2f800000, - 0xffffffff7d234b78 + se_op(LWZ(r10, r2, XXX)), + { SPET_MASKED_OPCODE, 0x7c0802a6, 0xffffffff }, + { SPET_MASKED_OPCODE, 0xf821ff81, 0xffffffff }, + { SPET_MASKED_OPCODE, 0xf8010090, 0xffffffff }, + { SPET_MASKED_OPCODE, 0x7c6b1b78, 0xffffffff }, + { SPET_MASKED_OPCODE, 0x3c608031, 0xffffffff }, + { SPET_MASKED_OPCODE, 0x812a0018, 0xffffffff }, + { SPET_MASKED_OPCODE, 0x7c882378, 0xffffffff }, + { SPET_MASKED_OPCODE, 0x60630003, 0xffffffff }, + { SPET_MASKED_OPCODE, 0x2f890000, 0xffffffff }, + { SPET_MASKED_OPCODE, 0x2f0b0000, 0xffffffff }, + { SPET_MASKED_OPCODE, 0x409e0000, 0xffffff00 }, // bne + { SPET_MASKED_OPCODE, 0x3c608031, 0xffffffff }, + { SPET_MASKED_OPCODE, 0x60630002, 0xffffffff }, + { SPET_MASKED_OPCODE, 0xe8010090, 0xffffffff }, + { SPET_MASKED_OPCODE, 0x7c6307b4, 0xffffffff }, + { SPET_MASKED_OPCODE, 0x38210080, 0xffffffff }, + { SPET_MASKED_OPCODE, 0x7c0803a6, 0xffffffff }, + { SPET_MASKED_OPCODE, 0x4e800020, 0xffffffff }, + { SPET_MASKED_OPCODE, 0x419aff00, 0xffffff00 }, // beq + se_op(LWZ(r0, r10, XXX)), + { SPET_MASKED_OPCODE, 0x79290020, 0xffffffff }, + { SPET_MASKED_OPCODE, 0x38810070, 0xffffffff }, + { SPET_MASKED_OPCODE, 0x2f800000, 0xffffffff }, + { SPET_MASKED_OPCODE, 0x7d234b78, 0xffffffff } ); REG_SUB(libmixer, "surmixer", cellSurMixerRemoveNotifyCallback, - op_mask(LWZ(11, 2, XXX)), - 0xffffffff7c0802a6, - 0xfffffffff821ff81, - 0xfffffffff8010090, - 0xffffffff7c6a1b78, - 0xffffffff3d208031, - 0xffffffff806b0018, - 0xffffffff61290002, // ori - 0xffffffff2f830000, - 0xffff0000409e0018, // bne - 0xffffffffe8010090, - 0xffffffff7d2307b4, - 0xffffffff38210080, - 0xffffffff7c0803a6, - 0xffffffff4e800020 + se_op(LWZ(r11, r2, XXX)), + { SPET_MASKED_OPCODE, 0x7c0802a6, 0xffffffff }, + { SPET_MASKED_OPCODE, 0xf821ff81, 0xffffffff }, + { SPET_MASKED_OPCODE, 0xf8010090, 0xffffffff }, + { SPET_MASKED_OPCODE, 0x7c6a1b78, 0xffffffff }, + { SPET_MASKED_OPCODE, 0x3d208031, 0xffffffff }, + { SPET_MASKED_OPCODE, 0x806b0018, 0xffffffff }, + { SPET_MASKED_OPCODE, 0x61290002, 0xffffffff }, // ori + { SPET_MASKED_OPCODE, 0x2f830000, 0xffffffff }, + { SPET_MASKED_OPCODE, 0x409e0000, 0xffff0000 }, // bne + { SPET_MASKED_OPCODE, 0xe8010090, 0xffffffff }, + { SPET_MASKED_OPCODE, 0x7d2307b4, 0xffffffff }, + { SPET_MASKED_OPCODE, 0x38210080, 0xffffffff }, + { SPET_MASKED_OPCODE, 0x7c0803a6, 0xffffffff }, + { SPET_MASKED_OPCODE, 0x4e800020, 0xffffffff } ); REG_SUB(libmixer, "surmixer", cellSurMixerStart, - 0xfffffffff821ff71, - 0xffffffff7c0802a6, - 0xfffffffffbc10080, - op_mask(LWZ(30, 2, XXX)), - 0xfffffffff80100a0, - 0xfffffffffba10078, - 0xfffffffffbe10088, - 0xffffffff801e0018, - 0xffffffff2f800000, - 0xf0000000409e002c, // bne - 0xffffffff3fe08031, - 0xffffffff63ff0002, - 0xffffffffe80100a0, - 0xffffffff7fe307b4, - 0xffffffffeba10078, - 0xffffffffebc10080, - 0xffffffff7c0803a6, - 0xffffffffebe10088, - 0xffffffff38210090, - 0xffffffff4e800020 + { SPET_MASKED_OPCODE, 0xf821ff71, 0xffffffff }, + { SPET_MASKED_OPCODE, 0x7c0802a6, 0xffffffff }, + { SPET_MASKED_OPCODE, 0xfbc10080, 0xffffffff }, + se_op(LWZ(r30, r2, XXX)), + { SPET_MASKED_OPCODE, 0xf80100a0, 0xffffffff }, + { SPET_MASKED_OPCODE, 0xfba10078, 0xffffffff }, + { SPET_MASKED_OPCODE, 0xfbe10088, 0xffffffff }, + { SPET_MASKED_OPCODE, 0x801e0018, 0xffffffff }, + { SPET_MASKED_OPCODE, 0x2f800000, 0xffffffff }, + { SPET_MASKED_OPCODE, 0x40000000, 0xf0000000 }, // bne + { SPET_MASKED_OPCODE, 0x3fe08031, 0xffffffff }, + { SPET_MASKED_OPCODE, 0x63ff0002, 0xffffffff }, + { SPET_MASKED_OPCODE, 0xe80100a0, 0xffffffff }, + { SPET_MASKED_OPCODE, 0x7fe307b4, 0xffffffff }, + { SPET_MASKED_OPCODE, 0xeba10078, 0xffffffff }, + { SPET_MASKED_OPCODE, 0xebc10080, 0xffffffff }, + { SPET_MASKED_OPCODE, 0x7c0803a6, 0xffffffff }, + { SPET_MASKED_OPCODE, 0xebe10088, 0xffffffff }, + { SPET_MASKED_OPCODE, 0x38210090, 0xffffffff }, + { SPET_MASKED_OPCODE, 0x4e800020, 0xffffffff } ); REG_SUB(libmixer, "surmixer", cellSurMixerSetParameter, - 0xfffffffff821ff81, - 0xffffffff7c0802a6, - 0xfffffffffbc10070, - 0xfffffffffc000890, - op_mask(LWZ(30, 2, XXX)), - 0xffffffff3d208031, - 0xfffffffff8010090, - 0xfffffffffbe10078, - 0xffffffff61290002, - 0xffffffff7c7f1b78, - 0xffffffff801e0018, - 0xffffffff2f800000, - 0xffff0000409e0020, // bne - 0xffffffffe8010090, - 0xffffffff7d2307b4, - 0xffffffffebc10070, - 0xffffffffebe10078, - 0xffffffff7c0803a6, - 0xffffffff38210080, - 0xffffffff4e800020, - 0xffffffff801e001c, - 0xffffffff2b03001f, - 0xffffffff2f800000, - 0xffff0000419cffd8, // blt - 0xffffffff2b83002b, - 0xffff000040990008, // ble - 0xffff0000409d0054 // ble + { SPET_MASKED_OPCODE, 0xf821ff81, 0xffffffff }, + { SPET_MASKED_OPCODE, 0x7c0802a6, 0xffffffff }, + { SPET_MASKED_OPCODE, 0xfbc10070, 0xffffffff }, + { SPET_MASKED_OPCODE, 0xfc000890, 0xffffffff }, + se_op(LWZ(r30, r2, XXX)), + { SPET_MASKED_OPCODE, 0x3d208031, 0xffffffff }, + { SPET_MASKED_OPCODE, 0xf8010090, 0xffffffff }, + { SPET_MASKED_OPCODE, 0xfbe10078, 0xffffffff }, + { SPET_MASKED_OPCODE, 0x61290002, 0xffffffff }, + { SPET_MASKED_OPCODE, 0x7c7f1b78, 0xffffffff }, + { SPET_MASKED_OPCODE, 0x801e0018, 0xffffffff }, + { SPET_MASKED_OPCODE, 0x2f800000, 0xffffffff }, + { SPET_MASKED_OPCODE, 0x409e0000, 0xffff0000 }, // bne + { SPET_MASKED_OPCODE, 0xe8010090, 0xffffffff }, + { SPET_MASKED_OPCODE, 0x7d2307b4, 0xffffffff }, + { SPET_MASKED_OPCODE, 0xebc10070, 0xffffffff }, + { SPET_MASKED_OPCODE, 0xebe10078, 0xffffffff }, + { SPET_MASKED_OPCODE, 0x7c0803a6, 0xffffffff }, + { SPET_MASKED_OPCODE, 0x38210080, 0xffffffff }, + { SPET_MASKED_OPCODE, 0x4e800020, 0xffffffff }, + { SPET_MASKED_OPCODE, 0x801e001c, 0xffffffff }, + { SPET_MASKED_OPCODE, 0x2b03001f, 0xffffffff }, + { SPET_MASKED_OPCODE, 0x2f800000, 0xffffffff }, + { SPET_MASKED_OPCODE, 0x419c0000, 0xffff0000 }, // blt + { SPET_MASKED_OPCODE, 0x2b83002b, 0xffffffff }, + { SPET_MASKED_OPCODE, 0x40990000, 0xffff0000 }, // ble + { SPET_MASKED_OPCODE, 0x409d0000, 0xffff0000 }, // ble ); REG_SUB(libmixer, "surmixer", cellSurMixerFinalize, - 0xfffffffff821ff91, - 0xffffffff7c0802a6, - 0xfffffffff8010080, - 0xffffff004bfffde1, // bl - 0xffffffffe8010080, - 0xffffffff38600000, - 0xffffffff38210070, - 0xffffffff7c0803a6, - 0xffffffff4e800020, - 0xfffffffff821ff71, - 0xffffffff7c0802a6, - 0xfffffffffba10078, - 0xf000000083a28250, // lwz - 0xfffffffff80100a0, - 0xffffffff817d0018, - 0xffffffff7d635b78, - 0xffffffff812b0000, - 0xffffffff81490000, - 0xffffffff800a0000, - 0xfffffffff8410028, - 0xffffffff7c0903a6, - 0xffffffff804a0004, - 0xffffffff4e800421 + { SPET_MASKED_OPCODE, 0xf821ff91, 0xffffffff }, + { SPET_MASKED_OPCODE, 0x7c0802a6, 0xffffffff }, + { SPET_MASKED_OPCODE, 0xf8010080, 0xffffffff }, + { SPET_MASKED_OPCODE, 0x4bfffd00, 0xffffff00 }, // bl + { SPET_MASKED_OPCODE, 0xe8010080, 0xffffffff }, + { SPET_MASKED_OPCODE, 0x38600000, 0xffffffff }, + { SPET_MASKED_OPCODE, 0x38210070, 0xffffffff }, + { SPET_MASKED_OPCODE, 0x7c0803a6, 0xffffffff }, + { SPET_MASKED_OPCODE, 0x4e800020, 0xffffffff }, + { SPET_MASKED_OPCODE, 0xf821ff71, 0xffffffff }, + { SPET_MASKED_OPCODE, 0x7c0802a6, 0xffffffff }, + { SPET_MASKED_OPCODE, 0xfba10078, 0xffffffff }, + { SPET_MASKED_OPCODE, 0x80000000, 0xf0000000 }, // lwz + { SPET_MASKED_OPCODE, 0xf80100a0, 0xffffffff }, + { SPET_MASKED_OPCODE, 0x817d0018, 0xffffffff }, + { SPET_MASKED_OPCODE, 0x7d635b78, 0xffffffff }, + { SPET_MASKED_OPCODE, 0x812b0000, 0xffffffff }, + { SPET_MASKED_OPCODE, 0x81490000, 0xffffffff }, + { SPET_MASKED_OPCODE, 0x800a0000, 0xffffffff }, + { SPET_MASKED_OPCODE, 0xf8410028, 0xffffffff }, + { SPET_MASKED_OPCODE, 0x7c0903a6, 0xffffffff }, + { SPET_MASKED_OPCODE, 0x804a0004, 0xffffffff }, + { SPET_MASKED_OPCODE, 0x4e800421, 0xffffffff } ); REG_SUB(libmixer, "surmixer", cellSurMixerSurBusAddData, - op_mask(LWZ(10, 2, XXX)), - 0xffffffff7c0802a6, - 0xfffffffff821ff91, - 0xfffffffff8010080, - 0xffffffff7c601b78, - 0xffffffff3d208031, - 0xffffffff806a0018, - 0xffffffff7c8b2378, - 0xffffffff7cc73378, - 0xffffffff2f830000, - 0xffffffff61290002, - 0xffff0000409e0018, // bne - 0xffffffffe8010080, - 0xffffffff7d2307b4, - 0xffffffff38210070, - 0xffffffff7c0803a6, - 0xffffffff4e800020, - 0xffffffff78a40020, - 0xffffffff78050020, - 0xffffffff800a001c, - 0xffffffff78680020, - 0xffffffff2f800000, - 0xffffffff7d034378, - 0xffffffff79660020, - 0xffffffff78e70020, - 0xffff0000419cffcc // blt + se_op(LWZ(r10, r2, XXX)), + { SPET_MASKED_OPCODE, 0x7c0802a6, 0xffffffff }, + { SPET_MASKED_OPCODE, 0xf821ff91, 0xffffffff }, + { SPET_MASKED_OPCODE, 0xf8010080, 0xffffffff }, + { SPET_MASKED_OPCODE, 0x7c601b78, 0xffffffff }, + { SPET_MASKED_OPCODE, 0x3d208031, 0xffffffff }, + { SPET_MASKED_OPCODE, 0x806a0018, 0xffffffff }, + { SPET_MASKED_OPCODE, 0x7c8b2378, 0xffffffff }, + { SPET_MASKED_OPCODE, 0x7cc73378, 0xffffffff }, + { SPET_MASKED_OPCODE, 0x2f830000, 0xffffffff }, + { SPET_MASKED_OPCODE, 0x61290002, 0xffffffff }, + { SPET_MASKED_OPCODE, 0x409e0000, 0xffff0000 }, // bne + { SPET_MASKED_OPCODE, 0xe8010080, 0xffffffff }, + { SPET_MASKED_OPCODE, 0x7d2307b4, 0xffffffff }, + { SPET_MASKED_OPCODE, 0x38210070, 0xffffffff }, + { SPET_MASKED_OPCODE, 0x7c0803a6, 0xffffffff }, + { SPET_MASKED_OPCODE, 0x4e800020, 0xffffffff }, + { SPET_MASKED_OPCODE, 0x78a40020, 0xffffffff }, + { SPET_MASKED_OPCODE, 0x78050020, 0xffffffff }, + { SPET_MASKED_OPCODE, 0x800a001c, 0xffffffff }, + { SPET_MASKED_OPCODE, 0x78680020, 0xffffffff }, + { SPET_MASKED_OPCODE, 0x2f800000, 0xffffffff }, + { SPET_MASKED_OPCODE, 0x7d034378, 0xffffffff }, + { SPET_MASKED_OPCODE, 0x79660020, 0xffffffff }, + { SPET_MASKED_OPCODE, 0x78e70020, 0xffffffff }, + { SPET_MASKED_OPCODE, 0x419c0000, 0xffff0000 } // blt ); REG_SUB(libmixer, "surmixer", cellSurMixerChStripSetParameter, - op_mask(LWZ(8, 2, XXX)), - 0xffffffff7c6b1b78, - 0xffffffff3c608031, - 0xffffffff7c8a2378, - 0xffffffff7ca62b78, - 0xffffffff60630002, - 0xffffffff81280018, - 0xffffffff2f890000, - 0xffff00004d9e0020, // beqlr - 0xffffffff8008001c, - 0xffffffff79640020, - 0xffffffff79450020, - 0xffffffff2f800000, - 0xffffffff78c60020, - 0xffffffff4d9c0020, - 0xffffffff79230020, - 0xf000000048000000 // b + se_op(LWZ(r8, r2, XXX)), + { SPET_MASKED_OPCODE, 0x7c6b1b78, 0xffffffff }, + { SPET_MASKED_OPCODE, 0x3c608031, 0xffffffff }, + { SPET_MASKED_OPCODE, 0x7c8a2378, 0xffffffff }, + { SPET_MASKED_OPCODE, 0x7ca62b78, 0xffffffff }, + { SPET_MASKED_OPCODE, 0x60630002, 0xffffffff }, + { SPET_MASKED_OPCODE, 0x81280018, 0xffffffff }, + { SPET_MASKED_OPCODE, 0x2f890000, 0xffffffff }, + { SPET_MASKED_OPCODE, 0x4d9e0000, 0xffff0000 }, // beqlr + { SPET_MASKED_OPCODE, 0x8008001c, 0xffffffff }, + { SPET_MASKED_OPCODE, 0x79640020, 0xffffffff }, + { SPET_MASKED_OPCODE, 0x79450020, 0xffffffff }, + { SPET_MASKED_OPCODE, 0x2f800000, 0xffffffff }, + { SPET_MASKED_OPCODE, 0x78c60020, 0xffffffff }, + { SPET_MASKED_OPCODE, 0x4d9c0020, 0xffffffff }, + { SPET_MASKED_OPCODE, 0x79230020, 0xffffffff }, + { SPET_MASKED_OPCODE, 0x40000000, 0xf0000000 } // b ); REG_SUB(libmixer, "surmixer", cellSurMixerPause, - op_mask(LWZ(10, 2, XXX)), - 0xffffffff7c0802a6, - 0xfffffffff821ff81, - 0xfffffffff8010090, - 0xffffffff3d208031, - 0xfffffffffbe10078, - 0xffffffff800a0018, - 0xffffffff7c7f1b78, - 0xfffffffffbc10070, - 0xffffffff2f800000, - 0xffffffff61290002, - 0xffff0000409e0020, // bne - 0xffffffffe8010090, - 0xffffffff7d2307b4, - 0xffffffffebc10070, - 0xffffffffebe10078, - 0xffffffff7c0803a6, - 0xffffffff38210080, - 0xffffffff4e800020, - 0xffffffff800a001c, - 0xffffffff2b030002, - 0xffffffff2f800000 + se_op(LWZ(r10, r2, XXX)), + { SPET_MASKED_OPCODE, 0x7c0802a6, 0xffffffff }, + { SPET_MASKED_OPCODE, 0xf821ff81, 0xffffffff }, + { SPET_MASKED_OPCODE, 0xf8010090, 0xffffffff }, + { SPET_MASKED_OPCODE, 0x3d208031, 0xffffffff }, + { SPET_MASKED_OPCODE, 0xfbe10078, 0xffffffff }, + { SPET_MASKED_OPCODE, 0x800a0018, 0xffffffff }, + { SPET_MASKED_OPCODE, 0x7c7f1b78, 0xffffffff }, + { SPET_MASKED_OPCODE, 0xfbc10070, 0xffffffff }, + { SPET_MASKED_OPCODE, 0x2f800000, 0xffffffff }, + { SPET_MASKED_OPCODE, 0x61290002, 0xffffffff }, + { SPET_MASKED_OPCODE, 0x409e0000, 0xffff0000 }, // bne + { SPET_MASKED_OPCODE, 0xe8010090, 0xffffffff }, + { SPET_MASKED_OPCODE, 0x7d2307b4, 0xffffffff }, + { SPET_MASKED_OPCODE, 0xebc10070, 0xffffffff }, + { SPET_MASKED_OPCODE, 0xebe10078, 0xffffffff }, + { SPET_MASKED_OPCODE, 0x7c0803a6, 0xffffffff }, + { SPET_MASKED_OPCODE, 0x38210080, 0xffffffff }, + { SPET_MASKED_OPCODE, 0x4e800020, 0xffffffff }, + { SPET_MASKED_OPCODE, 0x800a001c, 0xffffffff }, + { SPET_MASKED_OPCODE, 0x2b030002, 0xffffffff }, + { SPET_MASKED_OPCODE, 0x2f800000, 0xffffffff } ); REG_SUB(libmixer, "surmixer", cellSurMixerGetCurrentBlockTag, - op_mask(LWZ(11, 2, XXX)), - 0xffffffff3d208031, - 0xffffffff61290002, - 0xffffffff880b0020, - 0xffffffff2f800000, - 0xffff0000419e0010, // beq - 0xffffffffe80b0028, - 0xffffffff39200000, - 0xfffffffff8030000, - 0xffffffff7d2307b4, - 0xffffffff4e800020 + se_op(LWZ(r11, r2, XXX)), + { SPET_MASKED_OPCODE, 0x3d208031, 0xffffffff }, + { SPET_MASKED_OPCODE, 0x61290002, 0xffffffff }, + { SPET_MASKED_OPCODE, 0x880b0020, 0xffffffff }, + { SPET_MASKED_OPCODE, 0x2f800000, 0xffffffff }, + { SPET_MASKED_OPCODE, 0x419e0000, 0xffff0000 }, // beq + { SPET_MASKED_OPCODE, 0xe80b0028, 0xffffffff }, + { SPET_MASKED_OPCODE, 0x39200000, 0xffffffff }, + { SPET_MASKED_OPCODE, 0xf8030000, 0xffffffff }, + { SPET_MASKED_OPCODE, 0x7d2307b4, 0xffffffff }, + { SPET_MASKED_OPCODE, 0x4e800020, 0xffffffff } ); REG_SUB(libmixer, "surmixer", cellSurMixerGetTimestamp, - op_mask(LWZ(11, 2, XXX)), - 0xffffffff7c0802a6, - 0xfffffffff821ff91, - 0xfffffffff8010080, - 0xffffffff7c852378, - 0xffffffff3d208031, - 0xffffffff880b0020, - 0xffffffff7c641b78, - 0xffffffff78a50020, - 0xffffffff2f800000, - 0xffffffff61290002, - 0xffff000040de0018, // bne- - 0xffffffffe8010080, - 0xffffffff7d2307b4, - 0xffffffff38210070, - 0xffffffff7c0803a6, - 0xffffffff4e800020, - 0xffffffff806b04d8, - 0xf000000048000001 // bl + se_op(LWZ(r11, r2, XXX)), + { SPET_MASKED_OPCODE, 0x7c0802a6, 0xffffffff }, + { SPET_MASKED_OPCODE, 0xf821ff91, 0xffffffff }, + { SPET_MASKED_OPCODE, 0xf8010080, 0xffffffff }, + { SPET_MASKED_OPCODE, 0x7c852378, 0xffffffff }, + { SPET_MASKED_OPCODE, 0x3d208031, 0xffffffff }, + { SPET_MASKED_OPCODE, 0x880b0020, 0xffffffff }, + { SPET_MASKED_OPCODE, 0x7c641b78, 0xffffffff }, + { SPET_MASKED_OPCODE, 0x78a50020, 0xffffffff }, + { SPET_MASKED_OPCODE, 0x2f800000, 0xffffffff }, + { SPET_MASKED_OPCODE, 0x61290002, 0xffffffff }, + { SPET_MASKED_OPCODE, 0x40de0000, 0xffff0000 }, // bne- + { SPET_MASKED_OPCODE, 0xe8010080, 0xffffffff }, + { SPET_MASKED_OPCODE, 0x7d2307b4, 0xffffffff }, + { SPET_MASKED_OPCODE, 0x38210070, 0xffffffff }, + { SPET_MASKED_OPCODE, 0x7c0803a6, 0xffffffff }, + { SPET_MASKED_OPCODE, 0x4e800020, 0xffffffff }, + { SPET_MASKED_OPCODE, 0x806b04d8, 0xffffffff }, + { SPET_MASKED_OPCODE, 0x40000000, 0xf0000000 } // bl ); REG_SUB(libmixer, "surmixer", cellSurMixerBeep, - op_mask(LWZ(9, 2, XXX)), - 0xffffffff7c641b78, - 0xffffffff80690018, - 0xffffffff2f830000, - 0xffff00004d9e0020, // beqlr - 0xffffffff8009001c, - 0xffffffff78630020, - 0xffffffff78840020, - 0xffffffff2f800000, - 0xffffffff4d9c0020, - 0xf000000048000000 // b + se_op(LWZ(r9, r2, XXX)), + { SPET_MASKED_OPCODE, 0x7c641b78, 0xffffffff }, + { SPET_MASKED_OPCODE, 0x80690018, 0xffffffff }, + { SPET_MASKED_OPCODE, 0x2f830000, 0xffffffff }, + { SPET_MASKED_OPCODE, 0x4d9e0000, 0xffff0000 }, // beqlr + { SPET_MASKED_OPCODE, 0x8009001c, 0xffffffff }, + { SPET_MASKED_OPCODE, 0x78630020, 0xffffffff }, + { SPET_MASKED_OPCODE, 0x78840020, 0xffffffff }, + { SPET_MASKED_OPCODE, 0x2f800000, 0xffffffff }, + { SPET_MASKED_OPCODE, 0x4d9c0020, 0xffffffff }, + { SPET_MASKED_OPCODE, 0x40000000, 0xf0000000 } // b ); REG_SUB(libmixer, "surmxSSP", cellSSPlayerCreate, - 0xfffffffff821ff51, - 0xffffffff7c0802a6, - 0xffffffff2f840000, - 0xfffffffff80100c0, - 0xffffffff3c008031, - 0xfffffffffb210078, - 0xfffffffffb410080, - 0xfffffffffb610088, - 0xfffffffffb810090, - 0xfffffffffba10098, - 0xfffffffffbc100a0, - 0xfffffffffbe100a8, - 0xffffffff7c9a2378, - 0xffffffff7c791b78, - 0xffffffff60000003, - 0xffff0000419e0068, // beq - 0xff00000083620000, // lwz - 0xffffffff3b800000, - 0xffffffff381b0064, - 0xffffffff901b0018, - 0xffffffff5780103a, - 0xffffffff38800010, - 0xffffffff7c0007b4, - 0xffffffff38a01c70, - 0xffffffff7fc0da14, - 0xffffffff38c00000, - 0xffffffff83be0024, - 0xffffffff2f9d0000, - 0xffffffff7ba30020, - 0xffff000041de00c0, // beq- - 0xf000000048000001 // bl + { SPET_MASKED_OPCODE, 0xf821ff51, 0xffffffff }, + { SPET_MASKED_OPCODE, 0x7c0802a6, 0xffffffff }, + { SPET_MASKED_OPCODE, 0x2f840000, 0xffffffff }, + { SPET_MASKED_OPCODE, 0xf80100c0, 0xffffffff }, + { SPET_MASKED_OPCODE, 0x3c008031, 0xffffffff }, + { SPET_MASKED_OPCODE, 0xfb210078, 0xffffffff }, + { SPET_MASKED_OPCODE, 0xfb410080, 0xffffffff }, + { SPET_MASKED_OPCODE, 0xfb610088, 0xffffffff }, + { SPET_MASKED_OPCODE, 0xfb810090, 0xffffffff }, + { SPET_MASKED_OPCODE, 0xfba10098, 0xffffffff }, + { SPET_MASKED_OPCODE, 0xfbc100a0, 0xffffffff }, + { SPET_MASKED_OPCODE, 0xfbe100a8, 0xffffffff }, + { SPET_MASKED_OPCODE, 0x7c9a2378, 0xffffffff }, + { SPET_MASKED_OPCODE, 0x7c791b78, 0xffffffff }, + { SPET_MASKED_OPCODE, 0x60000003, 0xffffffff }, + { SPET_MASKED_OPCODE, 0x419e0000, 0xffff0000 }, // beq + { SPET_MASKED_OPCODE, 0x83000000, 0xff000000 }, // lwz + { SPET_MASKED_OPCODE, 0x3b800000, 0xffffffff }, + { SPET_MASKED_OPCODE, 0x381b0064, 0xffffffff }, + { SPET_MASKED_OPCODE, 0x901b0018, 0xffffffff }, + { SPET_MASKED_OPCODE, 0x5780103a, 0xffffffff }, + { SPET_MASKED_OPCODE, 0x38800010, 0xffffffff }, + { SPET_MASKED_OPCODE, 0x7c0007b4, 0xffffffff }, + { SPET_MASKED_OPCODE, 0x38a01c70, 0xffffffff }, + { SPET_MASKED_OPCODE, 0x7fc0da14, 0xffffffff }, + { SPET_MASKED_OPCODE, 0x38c00000, 0xffffffff }, + { SPET_MASKED_OPCODE, 0x83be0024, 0xffffffff }, + { SPET_MASKED_OPCODE, 0x2f9d0000, 0xffffffff }, + { SPET_MASKED_OPCODE, 0x7ba30020, 0xffffffff }, + { SPET_MASKED_OPCODE, 0x41de0000, 0xffff0000 }, // beq- + { SPET_MASKED_OPCODE, 0x40000000, 0xf0000000 } // bl ); REG_SUB(libmixer, "surmxSSP", cellSSPlayerRemove, - 0xffffffff7c641b78, - 0xffffffff7c0802a6, - 0xffffffff3c608031, - 0xffffffff2f840000, - 0xfffffffff821ff51, - 0xfffffffffb010070, - 0xfffffffffb210078, - 0xfffffffffb410080, - 0xfffffffffb610088, - 0xfffffffffb810090, - 0xfffffffffba10098, - 0xfffffffffbc100a0, - 0xfffffffffbe100a8, - 0xfffffffff80100c0, - 0xffffffff60630003, - 0xffff0000419e0074, // beq - 0xffffffff81240000, - 0xffffffff78830020, - 0xffffffff83440004, - 0xffffffff83240008, - 0xffffffff7b5b0020, - 0xffffffff81690000, - 0xffffffff800b0000, - 0xfffffffff8410028, - 0xffffffff7c0903a6, - 0xffffffff804b0004, - 0xffffffff4e800421 + { SPET_MASKED_OPCODE, 0x7c641b78, 0xffffffff }, + { SPET_MASKED_OPCODE, 0x7c0802a6, 0xffffffff }, + { SPET_MASKED_OPCODE, 0x3c608031, 0xffffffff }, + { SPET_MASKED_OPCODE, 0x2f840000, 0xffffffff }, + { SPET_MASKED_OPCODE, 0xf821ff51, 0xffffffff }, + { SPET_MASKED_OPCODE, 0xfb010070, 0xffffffff }, + { SPET_MASKED_OPCODE, 0xfb210078, 0xffffffff }, + { SPET_MASKED_OPCODE, 0xfb410080, 0xffffffff }, + { SPET_MASKED_OPCODE, 0xfb610088, 0xffffffff }, + { SPET_MASKED_OPCODE, 0xfb810090, 0xffffffff }, + { SPET_MASKED_OPCODE, 0xfba10098, 0xffffffff }, + { SPET_MASKED_OPCODE, 0xfbc100a0, 0xffffffff }, + { SPET_MASKED_OPCODE, 0xfbe100a8, 0xffffffff }, + { SPET_MASKED_OPCODE, 0xf80100c0, 0xffffffff }, + { SPET_MASKED_OPCODE, 0x60630003, 0xffffffff }, + { SPET_MASKED_OPCODE, 0x419e0000, 0xffff0000 }, // beq + { SPET_MASKED_OPCODE, 0x81240000, 0xffffffff }, + { SPET_MASKED_OPCODE, 0x78830020, 0xffffffff }, + { SPET_MASKED_OPCODE, 0x83440004, 0xffffffff }, + { SPET_MASKED_OPCODE, 0x83240008, 0xffffffff }, + { SPET_MASKED_OPCODE, 0x7b5b0020, 0xffffffff }, + { SPET_MASKED_OPCODE, 0x81690000, 0xffffffff }, + { SPET_MASKED_OPCODE, 0x800b0000, 0xffffffff }, + { SPET_MASKED_OPCODE, 0xf8410028, 0xffffffff }, + { SPET_MASKED_OPCODE, 0x7c0903a6, 0xffffffff }, + { SPET_MASKED_OPCODE, 0x804b0004, 0xffffffff }, + { SPET_MASKED_OPCODE, 0x4e800421, 0xffffffff } ); REG_SUB(libmixer, "surmxSSP", cellSSPlayerSetWave, - 0xffffffff7c601b78, - 0xffffffff78840020, - 0xffffffff2f800000, - 0xffffffff3c608031, - 0xffffffff78a50020, - 0xffff0000419e000c, // beq - 0xffffffff78030020, - 0xf000000048000000, // b - 0xffffffff60630003, - 0xffffffff4e800020 + { SPET_MASKED_OPCODE, 0x7c601b78, 0xffffffff }, + { SPET_MASKED_OPCODE, 0x78840020, 0xffffffff }, + { SPET_MASKED_OPCODE, 0x2f800000, 0xffffffff }, + { SPET_MASKED_OPCODE, 0x3c608031, 0xffffffff }, + { SPET_MASKED_OPCODE, 0x78a50020, 0xffffffff }, + { SPET_MASKED_OPCODE, 0x419e0000, 0xffff0000 }, // beq + { SPET_MASKED_OPCODE, 0x78030020, 0xffffffff }, + { SPET_MASKED_OPCODE, 0x40000000, 0xf0000000 }, // b + { SPET_MASKED_OPCODE, 0x60630003, 0xffffffff }, + { SPET_MASKED_OPCODE, 0x4e800020, 0xffffffff } ); REG_SUB(libmixer, "surmxSSP", cellSSPlayerPlay, - 0xffffffff7c601b78, - 0xffffffff3c608031, - 0xffffffff2f800000, - 0xffffffff60630003, - 0xffffffff78840020, - 0xffffffff4d9e0020, - 0xffffffff78030020, - 0xf000000048000000, // b - 0xfffffffff821ff81, // next func - 0xffffffff7c0802a6, - 0xfffffffffbe10078, - 0xffffffff7c7f1b78, - 0xff00000081620028, // lwz - 0xfffffffff8010090, - 0xffffffff39400000, - 0xffffffff38630010 + { SPET_MASKED_OPCODE, 0x7c601b78, 0xffffffff }, + { SPET_MASKED_OPCODE, 0x3c608031, 0xffffffff }, + { SPET_MASKED_OPCODE, 0x2f800000, 0xffffffff }, + { SPET_MASKED_OPCODE, 0x60630003, 0xffffffff }, + { SPET_MASKED_OPCODE, 0x78840020, 0xffffffff }, + { SPET_MASKED_OPCODE, 0x4d9e0020, 0xffffffff }, + { SPET_MASKED_OPCODE, 0x78030020, 0xffffffff }, + { SPET_MASKED_OPCODE, 0x40000000, 0xf0000000 }, // b + { SPET_MASKED_OPCODE, 0xf821ff81, 0xffffffff }, // next func + { SPET_MASKED_OPCODE, 0x7c0802a6, 0xffffffff }, + { SPET_MASKED_OPCODE, 0xfbe10078, 0xffffffff }, + { SPET_MASKED_OPCODE, 0x7c7f1b78, 0xffffffff }, + { SPET_MASKED_OPCODE, 0x81000000, 0xff000000 }, // lwz + { SPET_MASKED_OPCODE, 0xf8010090, 0xffffffff }, + { SPET_MASKED_OPCODE, 0x39400000, 0xffffffff }, + { SPET_MASKED_OPCODE, 0x38630010, 0xffffffff } ); REG_SUB(libmixer, "surmxSSP", cellSSPlayerStop, - 0xfffffffff821ff91, - 0xffffffff7c0802a6, - 0xffffffff2f830000, - 0xfffffffff8010080, - 0xffffffff3c008031, - 0xffffffff78630020, - 0xffffffff60000003, - 0xffff0000419e0010, // beq - 0xffffffff78840020, - 0xf000000048000001, // bl - 0xffffffff38000000, - 0xffffffff7c0307b4, - 0xffffffffe8010080, - 0xffffffff38210070, - 0xffffffff7c0803a6, - 0xffffffff4e800020 + { SPET_MASKED_OPCODE, 0xf821ff91, 0xffffffff }, + { SPET_MASKED_OPCODE, 0x7c0802a6, 0xffffffff }, + { SPET_MASKED_OPCODE, 0x2f830000, 0xffffffff }, + { SPET_MASKED_OPCODE, 0xf8010080, 0xffffffff }, + { SPET_MASKED_OPCODE, 0x3c008031, 0xffffffff }, + { SPET_MASKED_OPCODE, 0x78630020, 0xffffffff }, + { SPET_MASKED_OPCODE, 0x60000003, 0xffffffff }, + { SPET_MASKED_OPCODE, 0x419e0000, 0xffff0000 }, // beq + { SPET_MASKED_OPCODE, 0x78840020, 0xffffffff }, + { SPET_MASKED_OPCODE, 0x40000000, 0xf0000000 }, // bl + { SPET_MASKED_OPCODE, 0x38000000, 0xffffffff }, + { SPET_MASKED_OPCODE, 0x7c0307b4, 0xffffffff }, + { SPET_MASKED_OPCODE, 0xe8010080, 0xffffffff }, + { SPET_MASKED_OPCODE, 0x38210070, 0xffffffff }, + { SPET_MASKED_OPCODE, 0x7c0803a6, 0xffffffff }, + { SPET_MASKED_OPCODE, 0x4e800020, 0xffffffff } ); REG_SUB(libmixer, "surmxSSP", cellSSPlayerSetParam, - 0xffffffff7c601b78, - 0xffffffff3c608031, - 0xffffffff2f800000, - 0xffffffff60630003, - 0xffffffff78840020, - 0xffffffff4d9e0020, - 0xffffffff78030020, - 0xf000000048000000, // b - 0xfffffffff821ff71, // next func - 0xffffffff7c0802a6, - 0xffffffff3d608031, - 0xfffffffff80100a0, - 0xffffffff80030068, - 0xffffffff616b0002, - 0xfffffffffbc10080, - 0xffffffff2f800000 + { SPET_MASKED_OPCODE, 0x7c601b78, 0xffffffff }, + { SPET_MASKED_OPCODE, 0x3c608031, 0xffffffff }, + { SPET_MASKED_OPCODE, 0x2f800000, 0xffffffff }, + { SPET_MASKED_OPCODE, 0x60630003, 0xffffffff }, + { SPET_MASKED_OPCODE, 0x78840020, 0xffffffff }, + { SPET_MASKED_OPCODE, 0x4d9e0020, 0xffffffff }, + { SPET_MASKED_OPCODE, 0x78030020, 0xffffffff }, + { SPET_MASKED_OPCODE, 0x40000000, 0xf0000000 }, // b + { SPET_MASKED_OPCODE, 0xf821ff71, 0xffffffff }, // next func + { SPET_MASKED_OPCODE, 0x7c0802a6, 0xffffffff }, + { SPET_MASKED_OPCODE, 0x3d608031, 0xffffffff }, + { SPET_MASKED_OPCODE, 0xf80100a0, 0xffffffff }, + { SPET_MASKED_OPCODE, 0x80030068, 0xffffffff }, + { SPET_MASKED_OPCODE, 0x616b0002, 0xffffffff }, + { SPET_MASKED_OPCODE, 0xfbc10080, 0xffffffff }, + { SPET_MASKED_OPCODE, 0x2f800000, 0xffffffff } ); REG_SUB(libmixer, "surmxSSP", cellSSPlayerGetState, - 0xffffffff7c601b78, - 0xffffffff3c608031, - 0xffffffff2f800000, - 0xffffffff60630003, - 0xffffffff4d9e0020, - 0xffffffff78030020, - 0xf000000048000000 // b + { SPET_MASKED_OPCODE, 0x7c601b78, 0xffffffff }, + { SPET_MASKED_OPCODE, 0x3c608031, 0xffffffff }, + { SPET_MASKED_OPCODE, 0x2f800000, 0xffffffff }, + { SPET_MASKED_OPCODE, 0x60630003, 0xffffffff }, + { SPET_MASKED_OPCODE, 0x4d9e0020, 0xffffffff }, + { SPET_MASKED_OPCODE, 0x78030020, 0xffffffff }, + { SPET_MASKED_OPCODE, 0x40000000, 0xf0000000 } // b ); - REG_SUB(libmixer, "surmxUti", cellSurMixerUtilGetLevelFromDB, 0); - REG_SUB(libmixer, "surmxUti", cellSurMixerUtilGetLevelFromDBIndex, 0); - REG_SUB(libmixer, "surmxUti", cellSurMixerUtilNoteToRatio, 0); + //REG_SUB(libmixer, "surmxUti", cellSurMixerUtilGetLevelFromDB); + //REG_SUB(libmixer, "surmxUti", cellSurMixerUtilGetLevelFromDBIndex); + //REG_SUB(libmixer, "surmxUti", cellSurMixerUtilNoteToRatio); }); diff --git a/rpcs3/Loader/ELF64.cpp b/rpcs3/Loader/ELF64.cpp index 77cd91dbed..cdf1a4223f 100644 --- a/rpcs3/Loader/ELF64.cpp +++ b/rpcs3/Loader/ELF64.cpp @@ -576,7 +576,7 @@ namespace loader { m_stream->Seek(handler::get_stream_offset() + phdr.p_offset); m_stream->Read(phdr.p_vaddr.get_ptr(), phdr.p_filesz); - hook_ppu_funcs((u32*)phdr.p_vaddr.get_ptr(), vm::cast(phdr.p_filesz)); + hook_ppu_funcs(vm::ptr::make(phdr.p_vaddr.addr()), vm::cast(phdr.p_filesz) / 4); } } break;