예제 #1
0
// Note: Dma addresses are guaranteed to be aligned to 16 bytes (128 bits)
__fi tDMA_TAG *SPRdmaGetAddr(u32 addr, bool write)
{
	// if (addr & 0xf) { DMA_LOG("*PCSX2*: DMA address not 128bit aligned: %8.8x", addr); }

	//For some reason Getaway references SPR Memory from itself using SPR0, oh well, let it i guess...
	if((addr & 0x70000000) == 0x70000000)
	{
		return (tDMA_TAG*)&eeMem->Scratch[addr & 0x3ff0];
	}

	// FIXME: Why??? DMA uses physical addresses
	addr &= 0x1ffffff0;

	if (addr < Ps2MemSize::Base)
	{
		return (tDMA_TAG*)&eeMem->Main[addr];
	}
	else if (addr < 0x10000000)
	{
		return (tDMA_TAG*)(write ? eeMem->ZeroWrite : eeMem->ZeroRead);
	}
	else if ((addr >= 0x11004000) && (addr < 0x11010000))
	{
		//Access for VU Memory
		return (tDMA_TAG*)vtlb_GetPhyPtr(addr & 0x1FFFFFF0);
	}
	else
	{
		Console.Error( "*PCSX2*: DMA error: %8.8x", addr);
		return NULL;
	}
}
예제 #2
0
bool R3000DebugInterface::isValidAddress(u32 addr)
{
	if (addr >= 0x10000000 && addr < 0x10010000)
		return true;
	if (addr >= 0x12000000 && addr < 0x12001100)
		return true;
	if (addr >= 0x70000000 && addr < 0x70004000)
		return true;

	return !(addr & 0x40000000) && vtlb_GetPhyPtr(addr & 0x1FFFFFFF) != NULL;
}
예제 #3
0
bool R5900DebugInterface::isValidAddress(u32 addr)
{
	u32 lopart = addr & 0xfFFffFF;

	// get rid of ee ram mirrors
	switch (addr >> 28)
	{
	case 0:
	case 2:
		// case 3: throw exception (not mapped ?)
		// [ 0000_8000 - 01FF_FFFF ] RAM
		// [ 2000_8000 - 21FF_FFFF ] RAM MIRROR
		// [ 3000_8000 - 31FF_FFFF ] RAM MIRROR
		if (lopart >= 0x80000 && lopart <= 0x1ffFFff)
			return !!vtlb_GetPhyPtr(lopart);
		break;
	case 1:
		// [ 1000_0000 - 1000_CFFF ] EE register
		if (lopart <= 0xcfff)
			return true;

		// [ 1100_0000 - 1100_FFFF ] VU mem
		if (lopart >= 0x1000000 && lopart <= 0x100FFff)
			return true;

		// [ 1200_0000 - 1200_FFFF ] GS regs
		if (lopart >= 0x2000000 && lopart <= 0x20010ff)
			return true;

		// [ 1E00_0000 - 1FFF_FFFF ] ROM
		// if (lopart >= 0xe000000)
		// 	return true; throw exception (not mapped ?)
		break;
	case 7:
		// [ 7000_0000 - 7000_3FFF ] Scratchpad
		if (lopart <= 0x3fff)
			return true;
		break;
	case 8:
	case 9:
	case 0xA:
	case 0xB:
		// [ 8000_0000 - BFFF_FFFF ] kernel
		// return true;
		break;
	case 0xF:
		// [ 8000_0000 - BFFF_FFFF ] IOP or kernel stack
		if (lopart >= 0xfff8000)
			return true;
		break;
	}

	return false;
}