Exemplo n.º 1
0
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");
}
Exemplo n.º 2
0
/**
 * @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];
	}
}
Exemplo n.º 3
0
void FASTCALL ppc_exec_opc()
{
	uint32 mainopc = PPC_OPC_MAIN(gCPU.current_opc);
	ppc_opc_table_main[mainopc]();
}