static void ppc_opc_invalid() { #if 0 if (gCPU.pc == gPromOSIEntry && gCPU.current_opc == PROM_MAGIC_OPCODE) { call_prom_osi(); return; } if (gCPU.current_opc == 0x00333301) { // memset(r3, r4, r5) uint32 dest = gCPU.gpr[3]; uint32 c = gCPU.gpr[4]; uint32 size = gCPU.gpr[5]; if (dest & 0xfff) { byte *dst; ppc_direct_effective_memory_handle(dest, dst); uint32 a = 4096 - (dest & 0xfff); memset(dst, c, a); size -= a; dest += a; } while (size >= 4096) { byte *dst; ppc_direct_effective_memory_handle(dest, dst); memset(dst, c, 4096); dest += 4096; size -= 4096; } if (size) { byte *dst; ppc_direct_effective_memory_handle(dest, dst); memset(dst, c, size); } gCPU.pc = gCPU.npc; return; } if (gCPU.current_opc == 0x00333302) { // memcpy uint32 dest = gCPU.gpr[3]; uint32 src = gCPU.gpr[4]; uint32 size = gCPU.gpr[5]; byte *d, *s; ppc_direct_effective_memory_handle(dest, d); ppc_direct_effective_memory_handle(src, s); while (size--) { if (!(dest & 0xfff)) ppc_direct_effective_memory_handle(dest, d); if (!(src & 0xfff)) ppc_direct_effective_memory_handle(src, s); *d = *s; src++; dest++; d++; s++; } gCPU.pc = gCPU.npc; return; } #endif ht_printf("[PPC/DEC] Bad opcode: %08x (%u:%u) PC=%08x\n", gCPU.current_opc, PPC_OPC_MAIN(gCPU.current_opc), PPC_OPC_EXT(gCPU.current_opc), gCPU.pc); SINGLESTEP("unknown instruction\n"); }
/** * @brief The main API of decode! * * @param opc * * @return */ ppc_opc_func_t* ppc_get_opc_func(uint32_t opc) { uint32 mainopc = PPC_OPC_MAIN(opc); if(mainopc == 31) return ppc_opc_group_2(opc); else if(mainopc == 19) return ppc_opc_group_1(opc); else if(mainopc == 59) return ppc_opc_group_f1(opc); else if(mainopc == 63) return ppc_opc_group_f2(opc); else{ debug(DEBUG_DEC, "In %s,mainopc=%d\n", __FUNCTION__, mainopc); return ppc_opc_table_main[mainopc]; } }
void FASTCALL ppc_exec_opc() { uint32 mainopc = PPC_OPC_MAIN(gCPU.current_opc); ppc_opc_table_main[mainopc](); }