mmmmm
This commit is contained in:
@@ -312,8 +312,12 @@ void Mem::Write<u8>(u32 paddr, u32 val) {
|
|||||||
}
|
}
|
||||||
if (ircolib::IsInsideRange(paddr, DMEM_REGION_START, RSP_MEM_REGION_END)) {
|
if (ircolib::IsInsideRange(paddr, DMEM_REGION_START, RSP_MEM_REGION_END)) {
|
||||||
val = val << (8 * (3 - (paddr & 3)));
|
val = val << (8 * (3 - (paddr & 3)));
|
||||||
auto &dest = paddr & 0x1000 ? mmio.rsp.imem : mmio.rsp.dmem;
|
bool is_imem = paddr & 0x1000;
|
||||||
|
auto &dest = is_imem ? mmio.rsp.imem : mmio.rsp.dmem;
|
||||||
paddr = (paddr & 0xFFF) & ~3;
|
paddr = (paddr & 0xFFF) & ~3;
|
||||||
|
if (is_imem) {
|
||||||
|
mmio.rsp.cachedState.EvictCachedBlock(paddr);
|
||||||
|
}
|
||||||
ircolib::WriteAccess<u32>(dest, paddr, val);
|
ircolib::WriteAccess<u32>(dest, paddr, val);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@@ -361,8 +365,12 @@ void Mem::Write<u16>(u32 paddr, u32 val) {
|
|||||||
}
|
}
|
||||||
if (ircolib::IsInsideRange(paddr, DMEM_REGION_START, RSP_MEM_REGION_END)) {
|
if (ircolib::IsInsideRange(paddr, DMEM_REGION_START, RSP_MEM_REGION_END)) {
|
||||||
val = val << (16 * !(paddr & 2));
|
val = val << (16 * !(paddr & 2));
|
||||||
auto &dest = paddr & 0x1000 ? mmio.rsp.imem : mmio.rsp.dmem;
|
bool is_imem = paddr & 0x1000;
|
||||||
|
auto &dest = is_imem ? mmio.rsp.imem : mmio.rsp.dmem;
|
||||||
paddr = (paddr & 0xFFF) & ~3;
|
paddr = (paddr & 0xFFF) & ~3;
|
||||||
|
if (is_imem) {
|
||||||
|
mmio.rsp.cachedState.EvictCachedBlock(paddr);
|
||||||
|
}
|
||||||
ircolib::WriteAccess<u32>(dest, paddr, val);
|
ircolib::WriteAccess<u32>(dest, paddr, val);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@@ -409,7 +417,11 @@ void Mem::Write<u32>(const u32 paddr, const u32 val) {
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
if (ircolib::IsInsideRange(paddr, DMEM_REGION_START, RSP_MEM_REGION_END)) {
|
if (ircolib::IsInsideRange(paddr, DMEM_REGION_START, RSP_MEM_REGION_END)) {
|
||||||
auto &dest = paddr & 0x1000 ? mmio.rsp.imem : mmio.rsp.dmem;
|
bool is_imem = paddr & 0x1000;
|
||||||
|
auto &dest = is_imem ? mmio.rsp.imem : mmio.rsp.dmem;
|
||||||
|
if (is_imem) {
|
||||||
|
mmio.rsp.cachedState.EvictCachedBlock(paddr & 0xfff);
|
||||||
|
}
|
||||||
ircolib::WriteAccess<u32>(dest, paddr & 0xfff, val);
|
ircolib::WriteAccess<u32>(dest, paddr & 0xfff, val);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@@ -455,7 +467,11 @@ void Mem::Write(const u32 paddr, u64 val) {
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
if (ircolib::IsInsideRange(paddr, DMEM_REGION_START, RSP_MEM_REGION_END)) {
|
if (ircolib::IsInsideRange(paddr, DMEM_REGION_START, RSP_MEM_REGION_END)) {
|
||||||
auto &dest = paddr & 0x1000 ? mmio.rsp.imem : mmio.rsp.dmem;
|
bool is_imem = paddr & 0x1000;
|
||||||
|
auto &dest = is_imem ? mmio.rsp.imem : mmio.rsp.dmem;
|
||||||
|
if (is_imem) {
|
||||||
|
mmio.rsp.cachedState.EvictCachedBlock(paddr & 0xfff);
|
||||||
|
}
|
||||||
val >>= 32;
|
val >>= 32;
|
||||||
ircolib::WriteAccess<u32>(dest, paddr & 0xfff, val);
|
ircolib::WriteAccess<u32>(dest, paddr & 0xfff, val);
|
||||||
return;
|
return;
|
||||||
|
|||||||
@@ -177,6 +177,10 @@ void RSP::DMA<false>() {
|
|||||||
auto &dst = spDMASPAddr.bank ? imem : dmem;
|
auto &dst = spDMASPAddr.bank ? imem : dmem;
|
||||||
|
|
||||||
u32 mem_address = spDMASPAddr.address & 0xFF8;
|
u32 mem_address = spDMASPAddr.address & 0xFF8;
|
||||||
|
if (spDMASPAddr.bank) {
|
||||||
|
cachedState.EvictCachedBlock(mem_address);
|
||||||
|
}
|
||||||
|
|
||||||
u32 dram_address = spDMADRAMAddr.address & 0xFFFFF8;
|
u32 dram_address = spDMADRAMAddr.address & 0xFFFFF8;
|
||||||
trace("SP DMA from RDRAM to RSP (size: {} B, {:08X} to {:08X})", length, dram_address, mem_address);
|
trace("SP DMA from RDRAM to RSP (size: {} B, {:08X} to {:08X})", length, dram_address, mem_address);
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user