Esempio n. 1
0
void  r4300i_SH (void) {
	s32 Address =  GPR[Opcode.base].UW[0] + (short)Opcode.offset;
	if ((Address & 1) != 0) { ADDRESS_ERROR_EXCEPTION(Address,FALSE); }
	if (!r4300i_SH_VAddr(Address,GPR[Opcode.rt].UHW[0])) {
		//DisplayError("SH TLB: %X",Address);
	}
}
Esempio n. 2
0
void  r4300i_LD (void) {
	s32 Address =  GPR[Opcode.base].UW[0] + (short)Opcode.offset;
	if ((Address & 7) != 0) { ADDRESS_ERROR_EXCEPTION(Address,TRUE); }
	if (!r4300i_LD_VAddr(Address,&GPR[Opcode.rt].UDW)) {
		//DisplayError("LD TLB: %X",Address);
	}
}
Esempio n. 3
0
void r4300i_LL (void)
{
    uint32_t Address =  GPR[Opcode.base].UW[0] + (int16_t)Opcode.offset;
    uintptr_t ll = 0;
    if ((Address & 3) != 0)
    {
        ADDRESS_ERROR_EXCEPTION(Address,1);
    }

    if (Opcode.rt == 0)
    {
        return;
    }

    if (!r4300i_LW_VAddr(Address,&GPR[Opcode.rt].UW[0]))
    {
        //if (ShowTLBMisses) {
        DisplayError("LW TLB: %X",Address);
        //}
        TLB_READ_EXCEPTION(Address);
    }
    else
    {
        GPR[Opcode.rt].DW = GPR[Opcode.rt].W[0];
    }
    LLBit = 1;
    LLAddr = Address;
    ll = LLAddr;
    TranslateVaddr(&ll);
    LLAddr = ll;

}
void _fastcall r4300i_SD (void) {
	DWORD Address =  GPR[Opcode.base].UW[0] + (short)Opcode.offset;	
	if ((Address & 7) != 0) { ADDRESS_ERROR_EXCEPTION(Address,FALSE); }
	if (!r4300i_SD_VAddr(Address,GPR[Opcode.rt].UDW)) {
		DisplayError("SD TLB: %X",Address);
	}
}
Esempio n. 5
0
void R4300iOp32::LW()
{
    DWORD Address =  _GPR[m_Opcode.base].UW[0] + (short)m_Opcode.offset;
    if ((Address & 3) != 0)
    {
        ADDRESS_ERROR_EXCEPTION(Address, true);
    }

    if (LogOptions.GenerateLog)
    {
        Log_LW((*_PROGRAM_COUNTER),Address);
    }

    if (!g_MMU->LW_VAddr(Address,_GPR[m_Opcode.rt].UW[0]))
    {
        if (bShowTLBMisses())
        {
            g_Notify->DisplayError(stdstr_f(__FUNCTION__ " TLB: %X", Address).ToUTF16().c_str());
        }
        TLB_READ_EXCEPTION(Address);
    }
    else
    {
        _GPR[m_Opcode.rt].W[0] = _GPR[m_Opcode.rt].W[0];
    }
}
Esempio n. 6
0
void _fastcall r4300i_SH (void) {
	DWORD Address =  GPR[Opcode.base].UW[0] + (short)Opcode.offset;	
	if ((Address & 1) != 0) { ADDRESS_ERROR_EXCEPTION(Address,FALSE); }
	if (!r4300i_SH_VAddr(Address,GPR[Opcode.rt].UHW[0])) {
#ifndef EXTERNAL_RELEASE
		DisplayError("SH TLB: %X",Address);
#endif
	}
}
void _fastcall r4300i_SDC1 (void) {
	DWORD Address =  GPR[Opcode.base].UW[0] + (short)Opcode.offset;

	TEST_COP1_USABLE_EXCEPTION
	if ((Address & 7) != 0) { ADDRESS_ERROR_EXCEPTION(Address,FALSE); }
	if (!r4300i_SD_VAddr(Address,*(__int64 *)FPRDoubleLocation[Opcode.ft])) {
		DisplayError("SDC1 TLB: %X",Address);
	}
}
Esempio n. 8
0
void  r4300i_SWC1 (void) {
	s32 Address =  GPR[Opcode.base].UW[0] + (short)Opcode.offset;
	TEST_COP1_USABLE_EXCEPTION
	if ((Address & 3) != 0) { ADDRESS_ERROR_EXCEPTION(Address,FALSE); }

	if (!r4300i_SW_VAddr(Address,*(s32 *)FPRFloatLocation[Opcode.ft])) {
		//DisplayError("SWC1 TLB: %X",Address);
	}
}
Esempio n. 9
0
void  r4300i_LDC1 (void) {
	s32 Address =  GPR[Opcode.base].UW[0] + (short)Opcode.offset;

	TEST_COP1_USABLE_EXCEPTION
	if ((Address & 7) != 0) { ADDRESS_ERROR_EXCEPTION(Address,TRUE); }
	if (!r4300i_LD_VAddr(Address,&*(u64 *)FPRDoubleLocation[Opcode.ft])) {
		//DisplayError("LD TLB: %X",Address);
	}
}
Esempio n. 10
0
void _fastcall r4300i_SWC1 (void) {
	DWORD Address =  GPR[Opcode.base].UW[0] + (short)Opcode.offset;
	TEST_COP1_USABLE_EXCEPTION
	if ((Address & 3) != 0) { ADDRESS_ERROR_EXCEPTION(Address,FALSE); }

	if (!r4300i_SW_VAddr(Address,*(DWORD *)FPRFloatLocation[Opcode.ft])) {
#ifndef EXTERNAL_RELEASE
		DisplayError("SWC1 TLB: %X",Address);
#endif
	}
}
Esempio n. 11
0
void _fastcall r4300i_LDC1 (void) {
	DWORD Address =  GPR[Opcode.base].UW[0] + (short)Opcode.offset;

	TEST_COP1_USABLE_EXCEPTION
	if ((Address & 7) != 0) { ADDRESS_ERROR_EXCEPTION(Address,TRUE); }
	if (!r4300i_LD_VAddr(Address,&*(unsigned __int64 *)FPRDoubleLocation[Opcode.ft])) {
#ifndef EXTERNAL_RELEASE
		DisplayError("LD TLB: %X",Address);
#endif
	}
}
Esempio n. 12
0
void r4300i_SD (void)
{
    uint32_t Address =  GPR[Opcode.base].UW[0] + (int16_t)Opcode.offset;
    if ((Address & 7) != 0)
    {
        ADDRESS_ERROR_EXCEPTION(Address,0);
    }
    if (!r4300i_SD_VAddr(Address,GPR[Opcode.rt].UDW))
    {
    }
}
void _fastcall r4300i_LWC1 (void) {
	DWORD Address =  GPR[Opcode.base].UW[0] + (DWORD)((short)Opcode.offset);
	TEST_COP1_USABLE_EXCEPTION
	if ((Address & 3) != 0) { ADDRESS_ERROR_EXCEPTION(Address,TRUE); }
	if (!r4300i_LW_VAddr(Address,&*(DWORD *)FPRFloatLocation[Opcode.ft])) {
		if (ShowTLBMisses) {
			DisplayError("LWC1 TLB: %X",Address);
		}
		TLB_READ_EXCEPTION(Address);
	}
}
Esempio n. 14
0
void r4300i_SW (void)
{
    uint32_t Address =  GPR[Opcode.base].UW[0] + (int16_t)Opcode.offset;
    if ((Address & 3) != 0)
    {
        ADDRESS_ERROR_EXCEPTION(Address,0);
    }
    if (!r4300i_SW_VAddr(Address,GPR[Opcode.rt].UW[0]))
    {
        DisplayError("SW TLB: %X",Address);
    }
}
void _fastcall r4300i_LHU (void) {
	DWORD Address =  GPR[Opcode.base].UW[0] + (short)Opcode.offset;	
	if ((Address & 1) != 0) { ADDRESS_ERROR_EXCEPTION(Address,TRUE); }
	if (!r4300i_LH_VAddr(Address,&GPR[Opcode.rt].UHW[0])) {
		if (ShowTLBMisses) {
			DisplayError("LHU TLB: %X",Address);
		}
		TLB_READ_EXCEPTION(Address);
	} else {
		GPR[Opcode.rt].UDW = GPR[Opcode.rt].UHW[0];
	}
}
Esempio n. 16
0
void r4300i_SDC1 (void)
{
    uint32_t Address =  GPR[Opcode.base].UW[0] + (int16_t)Opcode.offset;

    TEST_COP1_USABLE_EXCEPTION
    if ((Address & 7) != 0)
    {
        ADDRESS_ERROR_EXCEPTION(Address,0);
    }
    if (!r4300i_SD_VAddr(Address,*(int64_t *)FPRDoubleLocation[Opcode.ft]))
    {
    }
}
void _fastcall r4300i_SC (void) {
	DWORD Address =  GPR[Opcode.base].UW[0] + (short)Opcode.offset;	
	if ((Address & 3) != 0) { ADDRESS_ERROR_EXCEPTION(Address,FALSE); }
#if (!defined(EXTERNAL_RELEASE))
	Log_SW(PROGRAM_COUNTER,Address,GPR[Opcode.rt].UW[0]);
#endif
	if (LLBit == 1) {
		if (!r4300i_SW_VAddr(Address,GPR[Opcode.rt].UW[0])) {
			DisplayError("SW TLB: %X",Address);
		}
	}
	GPR[Opcode.rt].UW[0] = LLBit;
}
Esempio n. 18
0
void _fastcall r4300i_LD (void) {
	DWORD Address =  GPR[Opcode.base].UW[0] + (short)Opcode.offset;	
	if ((Address & 7) != 0) { ADDRESS_ERROR_EXCEPTION(Address,TRUE); }
	if (!r4300i_LD_VAddr(Address,&GPR[Opcode.rt].UDW)) {
#ifndef EXTERNAL_RELEASE
		DisplayError("LD TLB: %X",Address);
#endif
	}
#ifdef Interpreter_StackTest
	if (Opcode.rt == 29) {
		StackValue = GPR[Opcode.rt].W[0];
	}
#endif
}
void _fastcall r4300i_SW (void) {
	DWORD Address =  GPR[Opcode.base].UW[0] + (short)Opcode.offset;	
	if ((Address & 3) != 0) { ADDRESS_ERROR_EXCEPTION(Address,FALSE); }
#if (!defined(EXTERNAL_RELEASE))
	Log_SW(PROGRAM_COUNTER,Address,GPR[Opcode.rt].UW[0]);
#endif
	if (!r4300i_SW_VAddr(Address,GPR[Opcode.rt].UW[0])) {
		DisplayError("SW TLB: %X",Address);
	}
	//TranslateVaddr(&Address);
	//if (Address == 0x00090AA0) {
	//	LogMessage("%X: Write %X to %X",PROGRAM_COUNTER,GPR[Opcode.rt].UW[0],GPR[Opcode.base].UW[0] + (short)Opcode.offset);
	//}
}
Esempio n. 20
0
void  r4300i_LWU (void) {
	s32 Address =  GPR[Opcode.base].UW[0] + (short)Opcode.offset;
	if ((Address & 3) != 0) { ADDRESS_ERROR_EXCEPTION(Address,TRUE); }
	if (Opcode.rt == 0) { return; }

	if (!r4300i_LW_VAddr(Address,&GPR[Opcode.rt].UW[0])) {
		if (ShowTLBMisses) {
			//DisplayError("LWU TLB: %X",Address);
		}
		TLB_READ_EXCEPTION(Address);
	} else {
		GPR[Opcode.rt].UDW = GPR[Opcode.rt].UW[0];
	}
}
Esempio n. 21
0
void r4300i_LWC1 (void)
{
    uint32_t Address =  GPR[Opcode.base].UW[0] + (uint32_t)((int16_t)Opcode.offset);
    TEST_COP1_USABLE_EXCEPTION
    if ((Address & 3) != 0)
    {
        ADDRESS_ERROR_EXCEPTION(Address,1);
    }
    if (!r4300i_LW_VAddr(Address,&*(uint32_t *)FPRFloatLocation[Opcode.ft]))
    {
        //if (ShowTLBMisses) {
        DisplayError("LWC1 TLB: %X",Address);
        //}
        TLB_READ_EXCEPTION(Address);
    }
}
void _fastcall r4300i_LL (void) {
	DWORD Address =  GPR[Opcode.base].UW[0] + (short)Opcode.offset;	
	if ((Address & 3) != 0) { ADDRESS_ERROR_EXCEPTION(Address,TRUE); }

	if (Opcode.rt == 0) { return; }

	if (!r4300i_LW_VAddr(Address,&GPR[Opcode.rt].UW[0])) {
		if (ShowTLBMisses) {
			DisplayError("LW TLB: %X",Address);
		}
		TLB_READ_EXCEPTION(Address);
	} else {
		GPR[Opcode.rt].DW = GPR[Opcode.rt].W[0];
	}
	LLBit = 1;
	LLAddr = Address;
	TranslateVaddr(&LLAddr);
}
Esempio n. 23
0
void r4300i_LHU (void)
{
    uint32_t Address =  GPR[Opcode.base].UW[0] + (int16_t)Opcode.offset;
    if ((Address & 1) != 0)
    {
        ADDRESS_ERROR_EXCEPTION(Address,1);
    }
    if (!r4300i_LH_VAddr(Address,&GPR[Opcode.rt].UHW[0]))
    {
        //if (ShowTLBMisses) {
        DisplayError("LHU TLB: %X",Address);
        //}
        TLB_READ_EXCEPTION(Address);
    }
    else
    {
        GPR[Opcode.rt].UDW = GPR[Opcode.rt].UHW[0];
    }
}
Esempio n. 24
0
void R4300iOp32::LHU()
{
    DWORD Address =  _GPR[m_Opcode.base].UW[0] + (short)m_Opcode.offset;
    if ((Address & 1) != 0)
    {
        ADDRESS_ERROR_EXCEPTION(Address, true);
    }
    if (!g_MMU->LH_VAddr(Address,_GPR[m_Opcode.rt].UHW[0]))
    {
        if (bShowTLBMisses())
        {
            g_Notify->DisplayError(stdstr_f(__FUNCTION__ " TLB: %X", Address).ToUTF16().c_str());
        }
        TLB_READ_EXCEPTION(Address);
    }
    else
    {
        _GPR[m_Opcode.rt].UW[0] = _GPR[m_Opcode.rt].UHW[0];
    }
}
void R4300iOp32::LWU()
{
	DWORD Address =  _GPR[m_Opcode.base].UW[0] + (short)m_Opcode.offset;	
	if ((Address & 3) != 0)
	{
		ADDRESS_ERROR_EXCEPTION(Address, true);
	}

	if (!g_MMU->LW_VAddr(Address,_GPR[m_Opcode.rt].UW[0]))
	{
		if (bShowTLBMisses())
		{
			g_Notify->DisplayError(L"LWU TLB: %X",Address);
		}
		TLB_READ_EXCEPTION(Address);
	}
	else
	{
		_GPR[m_Opcode.rt].UW[0] = _GPR[m_Opcode.rt].UW[0];
	}
}
void _fastcall r4300i_LW (void) {
	DWORD Address =  GPR[Opcode.base].UW[0] + (short)Opcode.offset;	
	if ((Address & 3) != 0) { ADDRESS_ERROR_EXCEPTION(Address,TRUE); }

#if (!defined(EXTERNAL_RELEASE))
	Log_LW(PROGRAM_COUNTER,Address);
#endif
	if (Opcode.rt == 0) { return; }

	if (!r4300i_LW_VAddr(Address,&GPR[Opcode.rt].UW[0])) {
		if (ShowTLBMisses) {
			DisplayError("LW TLB: %X",Address);
		}
		TLB_READ_EXCEPTION(Address);
	} else {
		GPR[Opcode.rt].DW = GPR[Opcode.rt].W[0];
		//TranslateVaddr(&Address);
		//if (Address == 0x00090AA0) {
		//	LogMessage("%X: Read %X from %X",PROGRAM_COUNTER,GPR[Opcode.rt].UW[0],GPR[Opcode.base].UW[0] + (short)Opcode.offset);
		//}
	}
}