idk
This commit is contained in:
@@ -98,10 +98,10 @@ struct Mem {
|
||||
template <typename 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{};
|
||||
temp.resize(RDRAM_SIZE);
|
||||
std::ranges::copy(mmio.rdp.rdram, temp.begin());
|
||||
temp.resize(size);
|
||||
std::copy(mmio.rdp.rdram.begin() + start, mmio.rdp.rdram.begin() + size - 1, temp.begin());
|
||||
ircolib::SwapBuffer<u32>(temp);
|
||||
ircolib::WriteFileBinary(temp, "rdram.bin");
|
||||
}
|
||||
|
||||
@@ -423,9 +423,9 @@ auto PI::Read(u32 addr) const -> u32 {
|
||||
case 0x04600010:
|
||||
{
|
||||
u32 value = 0;
|
||||
value |= (dmaBusy << 0); // Is PI DMA active? No, because it's instant
|
||||
value |= (ioBusy << 1); // Is PI IO busy? No, because it's instant
|
||||
value |= (0 << 2); // PI IO error?
|
||||
value |= (dmaBusy << 0); // Is PI DMA active?
|
||||
value |= (ioBusy << 1); // Is PI IO busy?
|
||||
value |= (0 << 2); // PI DMA error?
|
||||
value |= (mem.mmio.mi.intr.pi << 3); // PI interrupt?
|
||||
return value;
|
||||
}
|
||||
@@ -503,13 +503,10 @@ void PI::DMA<false>() {
|
||||
const s32 len = rdLen + 1;
|
||||
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++) {
|
||||
BusWrite<u8, true>(cartAddr + i, mem.mmio.rdp.ReadRDRAM<u8>(dramAddr + i));
|
||||
}
|
||||
|
||||
dramAddr += len;
|
||||
dramAddr = (dramAddr + 7) & ~7;
|
||||
cartAddr += len;
|
||||
@@ -517,7 +514,10 @@ void PI::DMA<false>() {
|
||||
cartAddr += 1;
|
||||
|
||||
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
|
||||
@@ -541,7 +541,9 @@ void PI::DMA<true>() {
|
||||
cartAddr += 1;
|
||||
|
||||
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) {
|
||||
@@ -555,16 +557,12 @@ void PI::Write(u32 addr, u32 val) {
|
||||
cartAddr = val & 0xFFFFFFFE;
|
||||
break;
|
||||
case 0x04600008:
|
||||
{
|
||||
rdLen = val & 0x00FFFFFF;
|
||||
DMA<false>();
|
||||
}
|
||||
rdLen = val & 0x00FFFFFF;
|
||||
DMA<false>();
|
||||
break;
|
||||
case 0x0460000C:
|
||||
{
|
||||
wrLen = val & 0x00FFFFFF;
|
||||
DMA<true>();
|
||||
}
|
||||
wrLen = val & 0x00FFFFFF;
|
||||
DMA<true>();
|
||||
break;
|
||||
case 0x04600010:
|
||||
if (val & 2) {
|
||||
|
||||
Reference in New Issue
Block a user