예제 #1
0
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 += 2;
	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); }
	}
}
예제 #2
0
EXPORT void CALL DebugDecodeOp(unsigned int instruction, char *op, char *args, int pc)
{
#ifdef DBG
    r4300_decode_op(instruction, op, args, pc);
#else
    DebugMessage(M64MSG_ERROR, "Bug: DebugDecodeOp() called, but Debugger not supported in Core library");
#endif
}
예제 #3
0
static void
disasm_list_get_value (GtkTreeModel *tree_model,
                       GtkTreeIter  *iter,
                       gint          column,
                       GValue       *value)
{
  char opcode[64];
  char args[128];
  uint32 instr;
  long laddr;

  g_return_if_fail (DISASM_IS_LIST (tree_model));
  g_return_if_fail (iter != NULL);
  g_return_if_fail (column < 3);

  g_value_init (value, disasm_list_get_column_type(tree_model,column));

  if(((long)iter->user_data2)==-1)
    switch(column)
    {
    case 0:
      sprintf(opcode, "%08lX", (long)iter->user_data);
      g_value_set_string(value, opcode);
      break;
    case 1:
    case 2:
      if((get_memory_flags((uint32)(long)iter->user_data) & MEM_FLAG_READABLE) != 0)
    {
      instr = read_memory_32((uint32)(long)iter->user_data);
      r4300_decode_op( instr, opcode, args, (long)iter->user_data );
    }
      else
    {
      strcpy( opcode, "X+X+X+X");
      sprintf( args, "UNREADABLE (%d)",get_memory_type((uint32)(long)iter->user_data));
    }
      if(column==1)
    g_value_set_string(value, opcode);
      else
    g_value_set_string(value, args);

      break;
    default:
      g_value_set_string(value, "xxx");
    }
  else
    switch(column)
    {
    case 0:
      laddr = (long) get_recompiled_addr((uint32)(long) iter->user_data, (int)(long) iter->user_data2);
      if (sizeof(void *) == 4)
        sprintf(opcode, "[%08lX]", laddr);
      else
        sprintf(opcode, "[%016lX]", laddr);
      g_value_set_string(value, opcode);
      break;
    case 1:
      g_value_set_string(value, (char *)get_recompiled_opcode((uint32)(long) iter->user_data, (uint32)(long) iter->user_data2));
      break;
    case 2:
      g_value_set_string(value, (char *)get_recompiled_args((uint32)(long) iter->user_data, (uint32)(long) iter->user_data2));
      break;
    }
}