/* * Project 64 - A Nintendo 64 emulator. * * (c) Copyright 2001 zilmar (zilmar@emulation64.com) and * Jabo (jabo@emulation64.com). * * pj64 homepage: www.pj64.net * * Permission to use, copy, modify and distribute Project64 in both binary and * source form, for non-commercial purposes, is hereby granted without fee, * providing that this license information and copyright notice appear with * all copies and any derived work. * * This software is provided 'as-is', without any express or implied * warranty. In no event shall the authors be held liable for any damages * arising from the use of this software. * * Project64 is freeware for PERSONAL USE only. Commercial users should * seek permission of the copyright holders first. Commercial use includes * charging money for Project64 or software derived from Project64. * * The copyright holders request that bug fixes and improvements to the code * should be forwarded to them so if they want them. * */ #include #include "main.h" #include "cpu.h" #include "usf.h" #include "memory.h" #include "cpu_hle.h" #include "usf_internal.h" #include void (* R4300i_Opcode[64])(usf_state_t *); void (* R4300i_Special[64])(usf_state_t *); void (* R4300i_Regimm[32])(usf_state_t *); void (* R4300i_CoP0[32])(usf_state_t *); void (* R4300i_CoP0_Function[64])(usf_state_t *); void (* R4300i_CoP1[32])(usf_state_t *); void (* R4300i_CoP1_BC[32])(usf_state_t *); void (* R4300i_CoP1_S[64])(usf_state_t *); void (* R4300i_CoP1_D[64])(usf_state_t *); void (* R4300i_CoP1_W[64])(usf_state_t *); void (* R4300i_CoP1_L[64])(usf_state_t *); void R4300i_opcode_SPECIAL (usf_state_t * state) { R4300i_Special[ state->Opcode.u.e.funct ](state); } void R4300i_opcode_REGIMM (usf_state_t * state) { R4300i_Regimm[ state->Opcode.u.b.rt ](state); } void R4300i_opcode_COP0 (usf_state_t * state) { R4300i_CoP0[ state->Opcode.u.b.rs ](state); } void R4300i_opcode_COP0_CO (usf_state_t * state) { R4300i_CoP0_Function[ state->Opcode.u.e.funct ](state); } void R4300i_opcode_COP1 (usf_state_t * state) { R4300i_CoP1[ state->Opcode.u.f.fmt ](state); } void R4300i_opcode_COP1_BC (usf_state_t * state) { R4300i_CoP1_BC[ state->Opcode.u.f.ft ](state); } void R4300i_opcode_COP1_S (usf_state_t * state) { // controlfp(RoundingModel); R4300i_CoP1_S[ state->Opcode.u.e.funct ](state); } void R4300i_opcode_COP1_D (usf_state_t * state) { // controlfp(RoundingModel); R4300i_CoP1_D[ state->Opcode.u.e.funct ](state); } void R4300i_opcode_COP1_W (usf_state_t * state) { R4300i_CoP1_W[ state->Opcode.u.e.funct ](state); } void R4300i_opcode_COP1_L (usf_state_t * state) { R4300i_CoP1_L[ state->Opcode.u.e.funct ](state); } void BuildInterpreter (usf_state_t * state) { (void)state; R4300i_Opcode[ 0] = R4300i_opcode_SPECIAL; R4300i_Opcode[ 1] = R4300i_opcode_REGIMM; R4300i_Opcode[ 2] = r4300i_J; R4300i_Opcode[ 3] = r4300i_JAL; R4300i_Opcode[ 4] = r4300i_BEQ; R4300i_Opcode[ 5] = r4300i_BNE; R4300i_Opcode[ 6] = r4300i_BLEZ; R4300i_Opcode[ 7] = r4300i_BGTZ; R4300i_Opcode[ 8] = r4300i_ADDI; R4300i_Opcode[ 9] = r4300i_ADDIU; R4300i_Opcode[10] = r4300i_SLTI; R4300i_Opcode[11] = r4300i_SLTIU; R4300i_Opcode[12] = r4300i_ANDI; R4300i_Opcode[13] = r4300i_ORI; R4300i_Opcode[14] = r4300i_XORI; R4300i_Opcode[15] = r4300i_LUI; R4300i_Opcode[16] = R4300i_opcode_COP0; R4300i_Opcode[17] = R4300i_opcode_COP1; R4300i_Opcode[18] = R4300i_UnknownOpcode; R4300i_Opcode[19] = R4300i_UnknownOpcode; R4300i_Opcode[20] = r4300i_BEQL; R4300i_Opcode[21] = r4300i_BNEL; R4300i_Opcode[22] = r4300i_BLEZL; R4300i_Opcode[23] = r4300i_BGTZL; R4300i_Opcode[24] = R4300i_UnknownOpcode; R4300i_Opcode[25] = r4300i_DADDIU; R4300i_Opcode[26] = r4300i_LDL; R4300i_Opcode[27] = r4300i_LDR; R4300i_Opcode[28] = R4300i_UnknownOpcode; R4300i_Opcode[29] = R4300i_UnknownOpcode; R4300i_Opcode[30] = R4300i_UnknownOpcode; R4300i_Opcode[31] = R4300i_UnknownOpcode; R4300i_Opcode[32] = r4300i_LB; R4300i_Opcode[33] = r4300i_LH; R4300i_Opcode[34] = r4300i_LWL; R4300i_Opcode[35] = r4300i_LW; R4300i_Opcode[36] = r4300i_LBU; R4300i_Opcode[37] = r4300i_LHU; R4300i_Opcode[38] = r4300i_LWR; R4300i_Opcode[39] = r4300i_LWU; R4300i_Opcode[40] = r4300i_SB; R4300i_Opcode[41] = r4300i_SH; R4300i_Opcode[42] = r4300i_SWL; R4300i_Opcode[43] = r4300i_SW; R4300i_Opcode[44] = r4300i_SDL; R4300i_Opcode[45] = r4300i_SDR; R4300i_Opcode[46] = r4300i_SWR; R4300i_Opcode[47] = r4300i_CACHE; R4300i_Opcode[48] = r4300i_LL; R4300i_Opcode[49] = r4300i_LWC1; R4300i_Opcode[50] = R4300i_UnknownOpcode; R4300i_Opcode[51] = R4300i_UnknownOpcode; R4300i_Opcode[52] = R4300i_UnknownOpcode; R4300i_Opcode[53] = r4300i_LDC1; R4300i_Opcode[54] = R4300i_UnknownOpcode; R4300i_Opcode[55] = r4300i_LD; R4300i_Opcode[56] = r4300i_SC; R4300i_Opcode[57] = r4300i_SWC1; R4300i_Opcode[58] = R4300i_UnknownOpcode; R4300i_Opcode[59] = R4300i_UnknownOpcode; R4300i_Opcode[60] = R4300i_UnknownOpcode; R4300i_Opcode[61] = r4300i_SDC1; R4300i_Opcode[62] = R4300i_UnknownOpcode; R4300i_Opcode[63] = r4300i_SD; R4300i_Special[ 0] = r4300i_SPECIAL_SLL; R4300i_Special[ 1] = R4300i_UnknownOpcode; R4300i_Special[ 2] = r4300i_SPECIAL_SRL; R4300i_Special[ 3] = r4300i_SPECIAL_SRA; R4300i_Special[ 4] = r4300i_SPECIAL_SLLV; R4300i_Special[ 5] = R4300i_UnknownOpcode; R4300i_Special[ 6] = r4300i_SPECIAL_SRLV; R4300i_Special[ 7] = r4300i_SPECIAL_SRAV; R4300i_Special[ 8] = r4300i_SPECIAL_JR; R4300i_Special[ 9] = r4300i_SPECIAL_JALR; R4300i_Special[10] = R4300i_UnknownOpcode; R4300i_Special[11] = R4300i_UnknownOpcode; R4300i_Special[12] = r4300i_SPECIAL_SYSCALL; R4300i_Special[13] = r4300i_SPECIAL_BREAK; R4300i_Special[14] = R4300i_UnknownOpcode; R4300i_Special[15] = r4300i_SPECIAL_SYNC; R4300i_Special[16] = r4300i_SPECIAL_MFHI; R4300i_Special[17] = r4300i_SPECIAL_MTHI; R4300i_Special[18] = r4300i_SPECIAL_MFLO; R4300i_Special[19] = r4300i_SPECIAL_MTLO; R4300i_Special[20] = r4300i_SPECIAL_DSLLV; R4300i_Special[21] = R4300i_UnknownOpcode; R4300i_Special[22] = r4300i_SPECIAL_DSRLV; R4300i_Special[23] = r4300i_SPECIAL_DSRAV; R4300i_Special[24] = r4300i_SPECIAL_MULT; R4300i_Special[25] = r4300i_SPECIAL_MULTU; R4300i_Special[26] = r4300i_SPECIAL_DIV; R4300i_Special[27] = r4300i_SPECIAL_DIVU; R4300i_Special[28] = r4300i_SPECIAL_DMULT; R4300i_Special[29] = r4300i_SPECIAL_DMULTU; R4300i_Special[30] = r4300i_SPECIAL_DDIV; R4300i_Special[31] = r4300i_SPECIAL_DDIVU; R4300i_Special[32] = r4300i_SPECIAL_ADD; R4300i_Special[33] = r4300i_SPECIAL_ADDU; R4300i_Special[34] = r4300i_SPECIAL_SUB; R4300i_Special[35] = r4300i_SPECIAL_SUBU; R4300i_Special[36] = r4300i_SPECIAL_AND; R4300i_Special[37] = r4300i_SPECIAL_OR; R4300i_Special[38] = r4300i_SPECIAL_XOR; R4300i_Special[39] = r4300i_SPECIAL_NOR; R4300i_Special[40] = R4300i_UnknownOpcode; R4300i_Special[41] = R4300i_UnknownOpcode; R4300i_Special[42] = r4300i_SPECIAL_SLT; R4300i_Special[43] = r4300i_SPECIAL_SLTU; R4300i_Special[44] = r4300i_SPECIAL_DADD; R4300i_Special[45] = r4300i_SPECIAL_DADDU; R4300i_Special[46] = r4300i_SPECIAL_DSUB; R4300i_Special[47] = r4300i_SPECIAL_DSUBU; R4300i_Special[48] = R4300i_UnknownOpcode; R4300i_Special[49] = R4300i_UnknownOpcode; R4300i_Special[50] = R4300i_UnknownOpcode; R4300i_Special[51] = R4300i_UnknownOpcode; R4300i_Special[52] = r4300i_SPECIAL_TEQ; R4300i_Special[53] = R4300i_UnknownOpcode; R4300i_Special[54] = R4300i_UnknownOpcode; R4300i_Special[55] = R4300i_UnknownOpcode; R4300i_Special[56] = r4300i_SPECIAL_DSLL; R4300i_Special[57] = R4300i_UnknownOpcode; R4300i_Special[58] = r4300i_SPECIAL_DSRL; R4300i_Special[59] = r4300i_SPECIAL_DSRA; R4300i_Special[60] = r4300i_SPECIAL_DSLL32; R4300i_Special[61] = R4300i_UnknownOpcode; R4300i_Special[62] = r4300i_SPECIAL_DSRL32; R4300i_Special[63] = r4300i_SPECIAL_DSRA32; R4300i_Regimm[ 0] = r4300i_REGIMM_BLTZ; R4300i_Regimm[ 1] = r4300i_REGIMM_BGEZ; R4300i_Regimm[ 2] = r4300i_REGIMM_BLTZL; R4300i_Regimm[ 3] = r4300i_REGIMM_BGEZL; R4300i_Regimm[ 4] = R4300i_UnknownOpcode; R4300i_Regimm[ 5] = R4300i_UnknownOpcode; R4300i_Regimm[ 6] = R4300i_UnknownOpcode; R4300i_Regimm[ 7] = R4300i_UnknownOpcode; R4300i_Regimm[ 8] = R4300i_UnknownOpcode; R4300i_Regimm[ 9] = R4300i_UnknownOpcode; R4300i_Regimm[10] = R4300i_UnknownOpcode; R4300i_Regimm[11] = R4300i_UnknownOpcode; R4300i_Regimm[12] = R4300i_UnknownOpcode; R4300i_Regimm[13] = R4300i_UnknownOpcode; R4300i_Regimm[14] = R4300i_UnknownOpcode; R4300i_Regimm[15] = R4300i_UnknownOpcode; R4300i_Regimm[16] = r4300i_REGIMM_BLTZAL; R4300i_Regimm[17] = r4300i_REGIMM_BGEZAL; R4300i_Regimm[18] = R4300i_UnknownOpcode; R4300i_Regimm[19] = R4300i_UnknownOpcode; R4300i_Regimm[20] = R4300i_UnknownOpcode; R4300i_Regimm[21] = R4300i_UnknownOpcode; R4300i_Regimm[22] = R4300i_UnknownOpcode; R4300i_Regimm[23] = R4300i_UnknownOpcode; R4300i_Regimm[24] = R4300i_UnknownOpcode; R4300i_Regimm[25] = R4300i_UnknownOpcode; R4300i_Regimm[26] = R4300i_UnknownOpcode; R4300i_Regimm[27] = R4300i_UnknownOpcode; R4300i_Regimm[28] = R4300i_UnknownOpcode; R4300i_Regimm[29] = R4300i_UnknownOpcode; R4300i_Regimm[30] = R4300i_UnknownOpcode; R4300i_Regimm[31] = R4300i_UnknownOpcode; R4300i_CoP0[ 0] = r4300i_COP0_MF; R4300i_CoP0[ 1] = R4300i_UnknownOpcode; R4300i_CoP0[ 2] = R4300i_UnknownOpcode; R4300i_CoP0[ 3] = R4300i_UnknownOpcode; R4300i_CoP0[ 4] = r4300i_COP0_MT; R4300i_CoP0[ 5] = R4300i_UnknownOpcode; R4300i_CoP0[ 6] = R4300i_UnknownOpcode; R4300i_CoP0[ 7] = R4300i_UnknownOpcode; R4300i_CoP0[ 8] = R4300i_UnknownOpcode; R4300i_CoP0[ 9] = R4300i_UnknownOpcode; R4300i_CoP0[10] = R4300i_UnknownOpcode; R4300i_CoP0[11] = R4300i_UnknownOpcode; R4300i_CoP0[12] = R4300i_UnknownOpcode; R4300i_CoP0[13] = R4300i_UnknownOpcode; R4300i_CoP0[14] = R4300i_UnknownOpcode; R4300i_CoP0[15] = R4300i_UnknownOpcode; R4300i_CoP0[16] = R4300i_opcode_COP0_CO; R4300i_CoP0[17] = R4300i_opcode_COP0_CO; R4300i_CoP0[18] = R4300i_opcode_COP0_CO; R4300i_CoP0[19] = R4300i_opcode_COP0_CO; R4300i_CoP0[20] = R4300i_opcode_COP0_CO; R4300i_CoP0[21] = R4300i_opcode_COP0_CO; R4300i_CoP0[22] = R4300i_opcode_COP0_CO; R4300i_CoP0[23] = R4300i_opcode_COP0_CO; R4300i_CoP0[24] = R4300i_opcode_COP0_CO; R4300i_CoP0[25] = R4300i_opcode_COP0_CO; R4300i_CoP0[26] = R4300i_opcode_COP0_CO; R4300i_CoP0[27] = R4300i_opcode_COP0_CO; R4300i_CoP0[28] = R4300i_opcode_COP0_CO; R4300i_CoP0[29] = R4300i_opcode_COP0_CO; R4300i_CoP0[30] = R4300i_opcode_COP0_CO; R4300i_CoP0[31] = R4300i_opcode_COP0_CO; R4300i_CoP0_Function[ 0] = R4300i_UnknownOpcode; R4300i_CoP0_Function[ 1] = r4300i_COP0_CO_TLBR; R4300i_CoP0_Function[ 2] = r4300i_COP0_CO_TLBWI; R4300i_CoP0_Function[ 3] = R4300i_UnknownOpcode; R4300i_CoP0_Function[ 4] = R4300i_UnknownOpcode; R4300i_CoP0_Function[ 5] = R4300i_UnknownOpcode; R4300i_CoP0_Function[ 6] = r4300i_COP0_CO_TLBWR; R4300i_CoP0_Function[ 7] = R4300i_UnknownOpcode; R4300i_CoP0_Function[ 8] = r4300i_COP0_CO_TLBP; R4300i_CoP0_Function[ 9] = R4300i_UnknownOpcode; R4300i_CoP0_Function[10] = R4300i_UnknownOpcode; R4300i_CoP0_Function[11] = R4300i_UnknownOpcode; R4300i_CoP0_Function[12] = R4300i_UnknownOpcode; R4300i_CoP0_Function[13] = R4300i_UnknownOpcode; R4300i_CoP0_Function[14] = R4300i_UnknownOpcode; R4300i_CoP0_Function[15] = R4300i_UnknownOpcode; R4300i_CoP0_Function[16] = R4300i_UnknownOpcode; R4300i_CoP0_Function[17] = R4300i_UnknownOpcode; R4300i_CoP0_Function[18] = R4300i_UnknownOpcode; R4300i_CoP0_Function[19] = R4300i_UnknownOpcode; R4300i_CoP0_Function[20] = R4300i_UnknownOpcode; R4300i_CoP0_Function[21] = R4300i_UnknownOpcode; R4300i_CoP0_Function[22] = R4300i_UnknownOpcode; R4300i_CoP0_Function[23] = R4300i_UnknownOpcode; R4300i_CoP0_Function[24] = r4300i_COP0_CO_ERET; R4300i_CoP0_Function[25] = R4300i_UnknownOpcode; R4300i_CoP0_Function[26] = R4300i_UnknownOpcode; R4300i_CoP0_Function[27] = R4300i_UnknownOpcode; R4300i_CoP0_Function[28] = R4300i_UnknownOpcode; R4300i_CoP0_Function[29] = R4300i_UnknownOpcode; R4300i_CoP0_Function[30] = R4300i_UnknownOpcode; R4300i_CoP0_Function[31] = R4300i_UnknownOpcode; R4300i_CoP0_Function[32] = R4300i_UnknownOpcode; R4300i_CoP0_Function[33] = R4300i_UnknownOpcode; R4300i_CoP0_Function[34] = R4300i_UnknownOpcode; R4300i_CoP0_Function[35] = R4300i_UnknownOpcode; R4300i_CoP0_Function[36] = R4300i_UnknownOpcode; R4300i_CoP0_Function[37] = R4300i_UnknownOpcode; R4300i_CoP0_Function[38] = R4300i_UnknownOpcode; R4300i_CoP0_Function[39] = R4300i_UnknownOpcode; R4300i_CoP0_Function[40] = R4300i_UnknownOpcode; R4300i_CoP0_Function[41] = R4300i_UnknownOpcode; R4300i_CoP0_Function[42] = R4300i_UnknownOpcode; R4300i_CoP0_Function[43] = R4300i_UnknownOpcode; R4300i_CoP0_Function[44] = R4300i_UnknownOpcode; R4300i_CoP0_Function[45] = R4300i_UnknownOpcode; R4300i_CoP0_Function[46] = R4300i_UnknownOpcode; R4300i_CoP0_Function[47] = R4300i_UnknownOpcode; R4300i_CoP0_Function[48] = R4300i_UnknownOpcode; R4300i_CoP0_Function[49] = R4300i_UnknownOpcode; R4300i_CoP0_Function[50] = R4300i_UnknownOpcode; R4300i_CoP0_Function[51] = R4300i_UnknownOpcode; R4300i_CoP0_Function[52] = R4300i_UnknownOpcode; R4300i_CoP0_Function[53] = R4300i_UnknownOpcode; R4300i_CoP0_Function[54] = R4300i_UnknownOpcode; R4300i_CoP0_Function[55] = R4300i_UnknownOpcode; R4300i_CoP0_Function[56] = R4300i_UnknownOpcode; R4300i_CoP0_Function[57] = R4300i_UnknownOpcode; R4300i_CoP0_Function[58] = R4300i_UnknownOpcode; R4300i_CoP0_Function[59] = R4300i_UnknownOpcode; R4300i_CoP0_Function[60] = R4300i_UnknownOpcode; R4300i_CoP0_Function[61] = R4300i_UnknownOpcode; R4300i_CoP0_Function[62] = R4300i_UnknownOpcode; R4300i_CoP0_Function[63] = R4300i_UnknownOpcode; R4300i_CoP1[ 0] = r4300i_COP1_MF; R4300i_CoP1[ 1] = r4300i_COP1_DMF; R4300i_CoP1[ 2] = r4300i_COP1_CF; R4300i_CoP1[ 3] = R4300i_UnknownOpcode; R4300i_CoP1[ 4] = r4300i_COP1_MT; R4300i_CoP1[ 5] = r4300i_COP1_DMT; R4300i_CoP1[ 6] = r4300i_COP1_CT; R4300i_CoP1[ 7] = R4300i_UnknownOpcode; R4300i_CoP1[ 8] = R4300i_opcode_COP1_BC; R4300i_CoP1[ 9] = R4300i_UnknownOpcode; R4300i_CoP1[10] = R4300i_UnknownOpcode; R4300i_CoP1[11] = R4300i_UnknownOpcode; R4300i_CoP1[12] = R4300i_UnknownOpcode; R4300i_CoP1[13] = R4300i_UnknownOpcode; R4300i_CoP1[14] = R4300i_UnknownOpcode; R4300i_CoP1[15] = R4300i_UnknownOpcode; R4300i_CoP1[16] = R4300i_opcode_COP1_S; R4300i_CoP1[17] = R4300i_opcode_COP1_D; R4300i_CoP1[18] = R4300i_UnknownOpcode; R4300i_CoP1[19] = R4300i_UnknownOpcode; R4300i_CoP1[20] = R4300i_opcode_COP1_W; R4300i_CoP1[21] = R4300i_opcode_COP1_L; R4300i_CoP1[22] = R4300i_UnknownOpcode; R4300i_CoP1[23] = R4300i_UnknownOpcode; R4300i_CoP1[24] = R4300i_UnknownOpcode; R4300i_CoP1[25] = R4300i_UnknownOpcode; R4300i_CoP1[26] = R4300i_UnknownOpcode; R4300i_CoP1[27] = R4300i_UnknownOpcode; R4300i_CoP1[28] = R4300i_UnknownOpcode; R4300i_CoP1[29] = R4300i_UnknownOpcode; R4300i_CoP1[30] = R4300i_UnknownOpcode; R4300i_CoP1[31] = R4300i_UnknownOpcode; R4300i_CoP1_BC[ 0] = r4300i_COP1_BCF; R4300i_CoP1_BC[ 1] = r4300i_COP1_BCT; R4300i_CoP1_BC[ 2] = r4300i_COP1_BCFL; R4300i_CoP1_BC[ 3] = r4300i_COP1_BCTL; R4300i_CoP1_BC[ 4] = R4300i_UnknownOpcode; R4300i_CoP1_BC[ 5] = R4300i_UnknownOpcode; R4300i_CoP1_BC[ 6] = R4300i_UnknownOpcode; R4300i_CoP1_BC[ 7] = R4300i_UnknownOpcode; R4300i_CoP1_BC[ 8] = R4300i_UnknownOpcode; R4300i_CoP1_BC[ 9] = R4300i_UnknownOpcode; R4300i_CoP1_BC[10] = R4300i_UnknownOpcode; R4300i_CoP1_BC[11] = R4300i_UnknownOpcode; R4300i_CoP1_BC[12] = R4300i_UnknownOpcode; R4300i_CoP1_BC[13] = R4300i_UnknownOpcode; R4300i_CoP1_BC[14] = R4300i_UnknownOpcode; R4300i_CoP1_BC[15] = R4300i_UnknownOpcode; R4300i_CoP1_BC[16] = R4300i_UnknownOpcode; R4300i_CoP1_BC[17] = R4300i_UnknownOpcode; R4300i_CoP1_BC[18] = R4300i_UnknownOpcode; R4300i_CoP1_BC[19] = R4300i_UnknownOpcode; R4300i_CoP1_BC[20] = R4300i_UnknownOpcode; R4300i_CoP1_BC[21] = R4300i_UnknownOpcode; R4300i_CoP1_BC[22] = R4300i_UnknownOpcode; R4300i_CoP1_BC[23] = R4300i_UnknownOpcode; R4300i_CoP1_BC[24] = R4300i_UnknownOpcode; R4300i_CoP1_BC[25] = R4300i_UnknownOpcode; R4300i_CoP1_BC[26] = R4300i_UnknownOpcode; R4300i_CoP1_BC[27] = R4300i_UnknownOpcode; R4300i_CoP1_BC[28] = R4300i_UnknownOpcode; R4300i_CoP1_BC[29] = R4300i_UnknownOpcode; R4300i_CoP1_BC[30] = R4300i_UnknownOpcode; R4300i_CoP1_BC[31] = R4300i_UnknownOpcode; R4300i_CoP1_S[ 0] = r4300i_COP1_S_ADD; R4300i_CoP1_S[ 1] = r4300i_COP1_S_SUB; R4300i_CoP1_S[ 2] = r4300i_COP1_S_MUL; R4300i_CoP1_S[ 3] = r4300i_COP1_S_DIV; R4300i_CoP1_S[ 4] = r4300i_COP1_S_SQRT; R4300i_CoP1_S[ 5] = r4300i_COP1_S_ABS; R4300i_CoP1_S[ 6] = r4300i_COP1_S_MOV; R4300i_CoP1_S[ 7] = r4300i_COP1_S_NEG; R4300i_CoP1_S[ 8] = R4300i_UnknownOpcode; R4300i_CoP1_S[ 9] = r4300i_COP1_S_TRUNC_L; R4300i_CoP1_S[10] = r4300i_COP1_S_CEIL_L; //added by Witten R4300i_CoP1_S[11] = r4300i_COP1_S_FLOOR_L; //added by Witten R4300i_CoP1_S[12] = r4300i_COP1_S_ROUND_W; R4300i_CoP1_S[13] = r4300i_COP1_S_TRUNC_W; R4300i_CoP1_S[14] = r4300i_COP1_S_CEIL_W; //added by Witten R4300i_CoP1_S[15] = r4300i_COP1_S_FLOOR_W; R4300i_CoP1_S[16] = R4300i_UnknownOpcode; R4300i_CoP1_S[17] = R4300i_UnknownOpcode; R4300i_CoP1_S[18] = R4300i_UnknownOpcode; R4300i_CoP1_S[19] = R4300i_UnknownOpcode; R4300i_CoP1_S[20] = R4300i_UnknownOpcode; R4300i_CoP1_S[21] = R4300i_UnknownOpcode; R4300i_CoP1_S[22] = R4300i_UnknownOpcode; R4300i_CoP1_S[23] = R4300i_UnknownOpcode; R4300i_CoP1_S[24] = R4300i_UnknownOpcode; R4300i_CoP1_S[25] = R4300i_UnknownOpcode; R4300i_CoP1_S[26] = R4300i_UnknownOpcode; R4300i_CoP1_S[27] = R4300i_UnknownOpcode; R4300i_CoP1_S[28] = R4300i_UnknownOpcode; R4300i_CoP1_S[29] = R4300i_UnknownOpcode; R4300i_CoP1_S[30] = R4300i_UnknownOpcode; R4300i_CoP1_S[31] = R4300i_UnknownOpcode; R4300i_CoP1_S[32] = R4300i_UnknownOpcode; R4300i_CoP1_S[33] = r4300i_COP1_S_CVT_D; R4300i_CoP1_S[34] = R4300i_UnknownOpcode; R4300i_CoP1_S[35] = R4300i_UnknownOpcode; R4300i_CoP1_S[36] = r4300i_COP1_S_CVT_W; R4300i_CoP1_S[37] = r4300i_COP1_S_CVT_L; R4300i_CoP1_S[38] = R4300i_UnknownOpcode; R4300i_CoP1_S[39] = R4300i_UnknownOpcode; R4300i_CoP1_S[40] = R4300i_UnknownOpcode; R4300i_CoP1_S[41] = R4300i_UnknownOpcode; R4300i_CoP1_S[42] = R4300i_UnknownOpcode; R4300i_CoP1_S[43] = R4300i_UnknownOpcode; R4300i_CoP1_S[44] = R4300i_UnknownOpcode; R4300i_CoP1_S[45] = R4300i_UnknownOpcode; R4300i_CoP1_S[46] = R4300i_UnknownOpcode; R4300i_CoP1_S[47] = R4300i_UnknownOpcode; R4300i_CoP1_S[48] = r4300i_COP1_S_CMP; R4300i_CoP1_S[49] = r4300i_COP1_S_CMP; R4300i_CoP1_S[50] = r4300i_COP1_S_CMP; R4300i_CoP1_S[51] = r4300i_COP1_S_CMP; R4300i_CoP1_S[52] = r4300i_COP1_S_CMP; R4300i_CoP1_S[53] = r4300i_COP1_S_CMP; R4300i_CoP1_S[54] = r4300i_COP1_S_CMP; R4300i_CoP1_S[55] = r4300i_COP1_S_CMP; R4300i_CoP1_S[56] = r4300i_COP1_S_CMP; R4300i_CoP1_S[57] = r4300i_COP1_S_CMP; R4300i_CoP1_S[58] = r4300i_COP1_S_CMP; R4300i_CoP1_S[59] = r4300i_COP1_S_CMP; R4300i_CoP1_S[60] = r4300i_COP1_S_CMP; R4300i_CoP1_S[61] = r4300i_COP1_S_CMP; R4300i_CoP1_S[62] = r4300i_COP1_S_CMP; R4300i_CoP1_S[63] = r4300i_COP1_S_CMP; R4300i_CoP1_D[ 0] = r4300i_COP1_D_ADD; R4300i_CoP1_D[ 1] = r4300i_COP1_D_SUB; R4300i_CoP1_D[ 2] = r4300i_COP1_D_MUL; R4300i_CoP1_D[ 3] = r4300i_COP1_D_DIV; R4300i_CoP1_D[ 4] = r4300i_COP1_D_SQRT; R4300i_CoP1_D[ 5] = r4300i_COP1_D_ABS; R4300i_CoP1_D[ 6] = r4300i_COP1_D_MOV; R4300i_CoP1_D[ 7] = r4300i_COP1_D_NEG; R4300i_CoP1_D[ 8] = R4300i_UnknownOpcode; R4300i_CoP1_D[ 9] = r4300i_COP1_D_TRUNC_L; //added by Witten R4300i_CoP1_D[10] = r4300i_COP1_D_CEIL_L; //added by Witten R4300i_CoP1_D[11] = r4300i_COP1_D_FLOOR_L; //added by Witten R4300i_CoP1_D[12] = r4300i_COP1_D_ROUND_W; R4300i_CoP1_D[13] = r4300i_COP1_D_TRUNC_W; R4300i_CoP1_D[14] = r4300i_COP1_D_CEIL_W; //added by Witten R4300i_CoP1_D[15] = r4300i_COP1_D_FLOOR_W; //added by Witten R4300i_CoP1_D[16] = R4300i_UnknownOpcode; R4300i_CoP1_D[17] = R4300i_UnknownOpcode; R4300i_CoP1_D[18] = R4300i_UnknownOpcode; R4300i_CoP1_D[19] = R4300i_UnknownOpcode; R4300i_CoP1_D[20] = R4300i_UnknownOpcode; R4300i_CoP1_D[21] = R4300i_UnknownOpcode; R4300i_CoP1_D[22] = R4300i_UnknownOpcode; R4300i_CoP1_D[23] = R4300i_UnknownOpcode; R4300i_CoP1_D[24] = R4300i_UnknownOpcode; R4300i_CoP1_D[25] = R4300i_UnknownOpcode; R4300i_CoP1_D[26] = R4300i_UnknownOpcode; R4300i_CoP1_D[27] = R4300i_UnknownOpcode; R4300i_CoP1_D[28] = R4300i_UnknownOpcode; R4300i_CoP1_D[29] = R4300i_UnknownOpcode; R4300i_CoP1_D[30] = R4300i_UnknownOpcode; R4300i_CoP1_D[31] = R4300i_UnknownOpcode; R4300i_CoP1_D[32] = r4300i_COP1_D_CVT_S; R4300i_CoP1_D[33] = R4300i_UnknownOpcode; R4300i_CoP1_D[34] = R4300i_UnknownOpcode; R4300i_CoP1_D[35] = R4300i_UnknownOpcode; R4300i_CoP1_D[36] = r4300i_COP1_D_CVT_W; R4300i_CoP1_D[37] = r4300i_COP1_D_CVT_L; R4300i_CoP1_D[38] = R4300i_UnknownOpcode; R4300i_CoP1_D[39] = R4300i_UnknownOpcode; R4300i_CoP1_D[40] = R4300i_UnknownOpcode; R4300i_CoP1_D[41] = R4300i_UnknownOpcode; R4300i_CoP1_D[42] = R4300i_UnknownOpcode; R4300i_CoP1_D[43] = R4300i_UnknownOpcode; R4300i_CoP1_D[44] = R4300i_UnknownOpcode; R4300i_CoP1_D[45] = R4300i_UnknownOpcode; R4300i_CoP1_D[46] = R4300i_UnknownOpcode; R4300i_CoP1_D[47] = R4300i_UnknownOpcode; R4300i_CoP1_D[48] = r4300i_COP1_D_CMP; R4300i_CoP1_D[49] = r4300i_COP1_D_CMP; R4300i_CoP1_D[50] = r4300i_COP1_D_CMP; R4300i_CoP1_D[51] = r4300i_COP1_D_CMP; R4300i_CoP1_D[52] = r4300i_COP1_D_CMP; R4300i_CoP1_D[53] = r4300i_COP1_D_CMP; R4300i_CoP1_D[54] = r4300i_COP1_D_CMP; R4300i_CoP1_D[55] = r4300i_COP1_D_CMP; R4300i_CoP1_D[56] = r4300i_COP1_D_CMP; R4300i_CoP1_D[57] = r4300i_COP1_D_CMP; R4300i_CoP1_D[58] = r4300i_COP1_D_CMP; R4300i_CoP1_D[59] = r4300i_COP1_D_CMP; R4300i_CoP1_D[60] = r4300i_COP1_D_CMP; R4300i_CoP1_D[61] = r4300i_COP1_D_CMP; R4300i_CoP1_D[62] = r4300i_COP1_D_CMP; R4300i_CoP1_D[63] = r4300i_COP1_D_CMP; R4300i_CoP1_W[ 0] = R4300i_UnknownOpcode; R4300i_CoP1_W[ 1] = R4300i_UnknownOpcode; R4300i_CoP1_W[ 2] = R4300i_UnknownOpcode; R4300i_CoP1_W[ 3] = R4300i_UnknownOpcode; R4300i_CoP1_W[ 4] = R4300i_UnknownOpcode; R4300i_CoP1_W[ 5] = R4300i_UnknownOpcode; R4300i_CoP1_W[ 6] = R4300i_UnknownOpcode; R4300i_CoP1_W[ 7] = R4300i_UnknownOpcode; R4300i_CoP1_W[ 8] = R4300i_UnknownOpcode; R4300i_CoP1_W[ 9] = R4300i_UnknownOpcode; R4300i_CoP1_W[10] = R4300i_UnknownOpcode; R4300i_CoP1_W[11] = R4300i_UnknownOpcode; R4300i_CoP1_W[12] = R4300i_UnknownOpcode; R4300i_CoP1_W[13] = R4300i_UnknownOpcode; R4300i_CoP1_W[14] = R4300i_UnknownOpcode; R4300i_CoP1_W[15] = R4300i_UnknownOpcode; R4300i_CoP1_W[16] = R4300i_UnknownOpcode; R4300i_CoP1_W[17] = R4300i_UnknownOpcode; R4300i_CoP1_W[18] = R4300i_UnknownOpcode; R4300i_CoP1_W[19] = R4300i_UnknownOpcode; R4300i_CoP1_W[20] = R4300i_UnknownOpcode; R4300i_CoP1_W[21] = R4300i_UnknownOpcode; R4300i_CoP1_W[22] = R4300i_UnknownOpcode; R4300i_CoP1_W[23] = R4300i_UnknownOpcode; R4300i_CoP1_W[24] = R4300i_UnknownOpcode; R4300i_CoP1_W[25] = R4300i_UnknownOpcode; R4300i_CoP1_W[26] = R4300i_UnknownOpcode; R4300i_CoP1_W[27] = R4300i_UnknownOpcode; R4300i_CoP1_W[28] = R4300i_UnknownOpcode; R4300i_CoP1_W[29] = R4300i_UnknownOpcode; R4300i_CoP1_W[30] = R4300i_UnknownOpcode; R4300i_CoP1_W[31] = R4300i_UnknownOpcode; R4300i_CoP1_W[32] = r4300i_COP1_W_CVT_S; R4300i_CoP1_W[33] = r4300i_COP1_W_CVT_D; R4300i_CoP1_W[34] = R4300i_UnknownOpcode; R4300i_CoP1_W[35] = R4300i_UnknownOpcode; R4300i_CoP1_W[36] = R4300i_UnknownOpcode; R4300i_CoP1_W[37] = R4300i_UnknownOpcode; R4300i_CoP1_W[38] = R4300i_UnknownOpcode; R4300i_CoP1_W[39] = R4300i_UnknownOpcode; R4300i_CoP1_W[40] = R4300i_UnknownOpcode; R4300i_CoP1_W[41] = R4300i_UnknownOpcode; R4300i_CoP1_W[42] = R4300i_UnknownOpcode; R4300i_CoP1_W[43] = R4300i_UnknownOpcode; R4300i_CoP1_W[44] = R4300i_UnknownOpcode; R4300i_CoP1_W[45] = R4300i_UnknownOpcode; R4300i_CoP1_W[46] = R4300i_UnknownOpcode; R4300i_CoP1_W[47] = R4300i_UnknownOpcode; R4300i_CoP1_W[48] = R4300i_UnknownOpcode; R4300i_CoP1_W[49] = R4300i_UnknownOpcode; R4300i_CoP1_W[50] = R4300i_UnknownOpcode; R4300i_CoP1_W[51] = R4300i_UnknownOpcode; R4300i_CoP1_W[52] = R4300i_UnknownOpcode; R4300i_CoP1_W[53] = R4300i_UnknownOpcode; R4300i_CoP1_W[54] = R4300i_UnknownOpcode; R4300i_CoP1_W[55] = R4300i_UnknownOpcode; R4300i_CoP1_W[56] = R4300i_UnknownOpcode; R4300i_CoP1_W[57] = R4300i_UnknownOpcode; R4300i_CoP1_W[58] = R4300i_UnknownOpcode; R4300i_CoP1_W[59] = R4300i_UnknownOpcode; R4300i_CoP1_W[60] = R4300i_UnknownOpcode; R4300i_CoP1_W[61] = R4300i_UnknownOpcode; R4300i_CoP1_W[62] = R4300i_UnknownOpcode; R4300i_CoP1_W[63] = R4300i_UnknownOpcode; R4300i_CoP1_L[ 0] = R4300i_UnknownOpcode; R4300i_CoP1_L[ 1] = R4300i_UnknownOpcode; R4300i_CoP1_L[ 2] = R4300i_UnknownOpcode; R4300i_CoP1_L[ 3] = R4300i_UnknownOpcode; R4300i_CoP1_L[ 4] = R4300i_UnknownOpcode; R4300i_CoP1_L[ 5] = R4300i_UnknownOpcode; R4300i_CoP1_L[ 6] = R4300i_UnknownOpcode; R4300i_CoP1_L[ 7] = R4300i_UnknownOpcode; R4300i_CoP1_L[ 8] = R4300i_UnknownOpcode; R4300i_CoP1_L[ 9] = R4300i_UnknownOpcode; R4300i_CoP1_L[10] = R4300i_UnknownOpcode; R4300i_CoP1_L[11] = R4300i_UnknownOpcode; R4300i_CoP1_L[12] = R4300i_UnknownOpcode; R4300i_CoP1_L[13] = R4300i_UnknownOpcode; R4300i_CoP1_L[14] = R4300i_UnknownOpcode; R4300i_CoP1_L[15] = R4300i_UnknownOpcode; R4300i_CoP1_L[16] = R4300i_UnknownOpcode; R4300i_CoP1_L[17] = R4300i_UnknownOpcode; R4300i_CoP1_L[18] = R4300i_UnknownOpcode; R4300i_CoP1_L[19] = R4300i_UnknownOpcode; R4300i_CoP1_L[20] = R4300i_UnknownOpcode; R4300i_CoP1_L[21] = R4300i_UnknownOpcode; R4300i_CoP1_L[22] = R4300i_UnknownOpcode; R4300i_CoP1_L[23] = R4300i_UnknownOpcode; R4300i_CoP1_L[24] = R4300i_UnknownOpcode; R4300i_CoP1_L[25] = R4300i_UnknownOpcode; R4300i_CoP1_L[26] = R4300i_UnknownOpcode; R4300i_CoP1_L[27] = R4300i_UnknownOpcode; R4300i_CoP1_L[28] = R4300i_UnknownOpcode; R4300i_CoP1_L[29] = R4300i_UnknownOpcode; R4300i_CoP1_L[30] = R4300i_UnknownOpcode; R4300i_CoP1_L[31] = R4300i_UnknownOpcode; R4300i_CoP1_L[32] = r4300i_COP1_L_CVT_S; R4300i_CoP1_L[33] = r4300i_COP1_L_CVT_D; R4300i_CoP1_L[34] = R4300i_UnknownOpcode; R4300i_CoP1_L[35] = R4300i_UnknownOpcode; R4300i_CoP1_L[36] = R4300i_UnknownOpcode; R4300i_CoP1_L[37] = R4300i_UnknownOpcode; R4300i_CoP1_L[38] = R4300i_UnknownOpcode; R4300i_CoP1_L[39] = R4300i_UnknownOpcode; R4300i_CoP1_L[40] = R4300i_UnknownOpcode; R4300i_CoP1_L[41] = R4300i_UnknownOpcode; R4300i_CoP1_L[42] = R4300i_UnknownOpcode; R4300i_CoP1_L[43] = R4300i_UnknownOpcode; R4300i_CoP1_L[44] = R4300i_UnknownOpcode; R4300i_CoP1_L[45] = R4300i_UnknownOpcode; R4300i_CoP1_L[46] = R4300i_UnknownOpcode; R4300i_CoP1_L[47] = R4300i_UnknownOpcode; R4300i_CoP1_L[48] = R4300i_UnknownOpcode; R4300i_CoP1_L[49] = R4300i_UnknownOpcode; R4300i_CoP1_L[50] = R4300i_UnknownOpcode; R4300i_CoP1_L[51] = R4300i_UnknownOpcode; R4300i_CoP1_L[52] = R4300i_UnknownOpcode; R4300i_CoP1_L[53] = R4300i_UnknownOpcode; R4300i_CoP1_L[54] = R4300i_UnknownOpcode; R4300i_CoP1_L[55] = R4300i_UnknownOpcode; R4300i_CoP1_L[56] = R4300i_UnknownOpcode; R4300i_CoP1_L[57] = R4300i_UnknownOpcode; R4300i_CoP1_L[58] = R4300i_UnknownOpcode; R4300i_CoP1_L[59] = R4300i_UnknownOpcode; R4300i_CoP1_L[60] = R4300i_UnknownOpcode; R4300i_CoP1_L[61] = R4300i_UnknownOpcode; R4300i_CoP1_L[62] = R4300i_UnknownOpcode; R4300i_CoP1_L[63] = R4300i_UnknownOpcode; } void RunFunction(usf_state_t * state, uint32_t address) { uint32_t oldPC = state->PROGRAM_COUNTER, oldRA = state->GPR[31].UW[0], la = state->NextInstruction; int callStack = 0; state->NextInstruction = NORMAL; state->PROGRAM_COUNTER = address; while( (state->PROGRAM_COUNTER != oldRA) || callStack) { if(state->PROGRAM_COUNTER == address) callStack++; ExecuteInterpreterOpCode(state); if(state->PROGRAM_COUNTER == oldRA) callStack--; } state->PROGRAM_COUNTER = oldPC; state->GPR[31].UW[0] = oldRA; state->NextInstruction = la; } #ifdef DEBUG_INFO #include "debugger/dbg_decoder.h" #endif void ExecuteInterpreterOpCode (usf_state_t * state) { if (*state->WaitMode) state->Timers->Timer = -1; if (!r4300i_LW_VAddr(state, state->PROGRAM_COUNTER, &state->Opcode.u.Hex)) { DoTLBMiss(state, state->NextInstruction == JUMP,state->PROGRAM_COUNTER); state->NextInstruction = NORMAL; return; } #ifdef DEBUG_INFO { char opcode[256]; char arguments[256]; r4300_decode_op(state->Opcode.u.Hex, opcode, arguments, state->PROGRAM_COUNTER); fprintf(state->debug_log, "%08x: %-16s %s\n", state->PROGRAM_COUNTER, opcode, arguments); } #endif COUNT_REGISTER += state->ROM_PARAMS.countperop; state->Timers->Timer -= 2; RANDOM_REGISTER -= 1; if ((int32_t)RANDOM_REGISTER < (int32_t)WIRED_REGISTER) { RANDOM_REGISTER = 31; } R4300i_Opcode[ state->Opcode.u.b.op ](state); if (state->GPR[0].DW != 0) { state->GPR[0].DW = 0; } switch (state->NextInstruction) { case NORMAL: state->PROGRAM_COUNTER += 4; break; case DELAY_SLOT: state->NextInstruction = JUMP; state->PROGRAM_COUNTER += 4; break; case JUMP: if ( #ifdef DEBUG_INFO 0 && #endif state->cpu_hle_entry_count && DoCPUHLE(state, state->JumpToLocation)) { state->PROGRAM_COUNTER = state->GPR[31].UW[0]; state->NextInstruction = NORMAL; } else { state->PROGRAM_COUNTER = state->JumpToLocation; state->NextInstruction = NORMAL; } if ((int32_t)state->Timers->Timer < 0) { TimerDone(state); } if (state->CPU_Action->DoSomething) { DoSomething(state); } } } void StartInterpreterCPU (usf_state_t * state) { const int safety_count_max = 20000000; int safety_count = safety_count_max; size_t last_sample_buffer_count = state->sample_buffer_count; state->NextInstruction = NORMAL; while(state->cpu_running) { ExecuteInterpreterOpCode(state); if (!--safety_count) { if (last_sample_buffer_count == state->sample_buffer_count) { DisplayError( state, "Emulator core is not generating any samples after 20 million instructions" ); break; } else { safety_count = safety_count_max; last_sample_buffer_count = state->sample_buffer_count; } } } state->cpu_stopped = 1; } void TestInterpreterJump (usf_state_t * state, uint32_t PC, uint32_t TargetPC, int32_t Reg1, int32_t Reg2) { if (PC != TargetPC) { return; } if (DelaySlotEffectsCompare(state,PC,Reg1,Reg2)) { return; } InPermLoop(state); }