idk
This commit is contained in:
@@ -98,10 +98,10 @@ struct Mem {
|
|||||||
template <typename T>
|
template <typename T>
|
||||||
void BackupWrite(u32, T);
|
void BackupWrite(u32, T);
|
||||||
|
|
||||||
FORCE_INLINE void DumpRDRAM() const {
|
FORCE_INLINE void DumpRDRAM(u32 start = 0, u32 size = RDRAM_SIZE) const {
|
||||||
std::vector<u8> temp{};
|
std::vector<u8> temp{};
|
||||||
temp.resize(RDRAM_SIZE);
|
temp.resize(size);
|
||||||
std::ranges::copy(mmio.rdp.rdram, temp.begin());
|
std::copy(mmio.rdp.rdram.begin() + start, mmio.rdp.rdram.begin() + size - 1, temp.begin());
|
||||||
ircolib::SwapBuffer<u32>(temp);
|
ircolib::SwapBuffer<u32>(temp);
|
||||||
ircolib::WriteFileBinary(temp, "rdram.bin");
|
ircolib::WriteFileBinary(temp, "rdram.bin");
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -423,9 +423,9 @@ auto PI::Read(u32 addr) const -> u32 {
|
|||||||
case 0x04600010:
|
case 0x04600010:
|
||||||
{
|
{
|
||||||
u32 value = 0;
|
u32 value = 0;
|
||||||
value |= (dmaBusy << 0); // Is PI DMA active? No, because it's instant
|
value |= (dmaBusy << 0); // Is PI DMA active?
|
||||||
value |= (ioBusy << 1); // Is PI IO busy? No, because it's instant
|
value |= (ioBusy << 1); // Is PI IO busy?
|
||||||
value |= (0 << 2); // PI IO error?
|
value |= (0 << 2); // PI DMA error?
|
||||||
value |= (mem.mmio.mi.intr.pi << 3); // PI interrupt?
|
value |= (mem.mmio.mi.intr.pi << 3); // PI interrupt?
|
||||||
return value;
|
return value;
|
||||||
}
|
}
|
||||||
@@ -503,13 +503,10 @@ void PI::DMA<false>() {
|
|||||||
const s32 len = rdLen + 1;
|
const s32 len = rdLen + 1;
|
||||||
trace("PI DMA from RDRAM to CARTRIDGE (size: {} B, {:08X} to {:08X})", len, dramAddr, cartAddr);
|
trace("PI DMA from RDRAM to CARTRIDGE (size: {} B, {:08X} to {:08X})", len, dramAddr, cartAddr);
|
||||||
|
|
||||||
if (mem.saveType == SAVE_FLASH_1m && cartAddr >= SREGION_PI_SRAM && cartAddr < (CART_REGION_START_2_2 + 1_mb)) {
|
|
||||||
cartAddr = SREGION_PI_SRAM | ((cartAddr & (1_mb-1)) << 1);
|
|
||||||
}
|
|
||||||
|
|
||||||
for (int i = 0; i < len; i++) {
|
for (int i = 0; i < len; i++) {
|
||||||
BusWrite<u8, true>(cartAddr + i, mem.mmio.rdp.ReadRDRAM<u8>(dramAddr + i));
|
BusWrite<u8, true>(cartAddr + i, mem.mmio.rdp.ReadRDRAM<u8>(dramAddr + i));
|
||||||
}
|
}
|
||||||
|
|
||||||
dramAddr += len;
|
dramAddr += len;
|
||||||
dramAddr = (dramAddr + 7) & ~7;
|
dramAddr = (dramAddr + 7) & ~7;
|
||||||
cartAddr += len;
|
cartAddr += len;
|
||||||
@@ -517,7 +514,10 @@ void PI::DMA<false>() {
|
|||||||
cartAddr += 1;
|
cartAddr += 1;
|
||||||
|
|
||||||
dmaBusy = true;
|
dmaBusy = true;
|
||||||
Scheduler::GetInstance().EnqueueRelative(AccessTiming(GetDomain(cartAddr), rdLen), PI_DMA_COMPLETE);
|
|
||||||
|
u64 completo = AccessTiming(GetDomain(cartAddr), len);
|
||||||
|
trace("Will complete in {} cycles", completo);
|
||||||
|
Scheduler::GetInstance().EnqueueRelative(completo, PI_DMA_COMPLETE);
|
||||||
}
|
}
|
||||||
|
|
||||||
// cart -> rdram
|
// cart -> rdram
|
||||||
@@ -541,7 +541,9 @@ void PI::DMA<true>() {
|
|||||||
cartAddr += 1;
|
cartAddr += 1;
|
||||||
|
|
||||||
dmaBusy = true;
|
dmaBusy = true;
|
||||||
Scheduler::GetInstance().EnqueueRelative(AccessTiming(GetDomain(cartAddr), len), PI_DMA_COMPLETE);
|
u64 completo = AccessTiming(GetDomain(cartAddr), len);
|
||||||
|
trace("Will complete in {} cycles", completo);
|
||||||
|
Scheduler::GetInstance().EnqueueRelative(completo, PI_DMA_COMPLETE);
|
||||||
}
|
}
|
||||||
|
|
||||||
void PI::Write(u32 addr, u32 val) {
|
void PI::Write(u32 addr, u32 val) {
|
||||||
@@ -555,16 +557,12 @@ void PI::Write(u32 addr, u32 val) {
|
|||||||
cartAddr = val & 0xFFFFFFFE;
|
cartAddr = val & 0xFFFFFFFE;
|
||||||
break;
|
break;
|
||||||
case 0x04600008:
|
case 0x04600008:
|
||||||
{
|
rdLen = val & 0x00FFFFFF;
|
||||||
rdLen = val & 0x00FFFFFF;
|
DMA<false>();
|
||||||
DMA<false>();
|
|
||||||
}
|
|
||||||
break;
|
break;
|
||||||
case 0x0460000C:
|
case 0x0460000C:
|
||||||
{
|
wrLen = val & 0x00FFFFFF;
|
||||||
wrLen = val & 0x00FFFFFF;
|
DMA<true>();
|
||||||
DMA<true>();
|
|
||||||
}
|
|
||||||
break;
|
break;
|
||||||
case 0x04600010:
|
case 0x04600010:
|
||||||
if (val & 2) {
|
if (val & 2) {
|
||||||
|
|||||||
Reference in New Issue
Block a user