// 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; } }
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; }
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; }