| 311 | // |
| 312 | //***************************************************************************** |
| 313 | void DMA_PI_CopyFromRDRAM() |
| 314 | { |
| 315 | u32 mem_address {Memory_PI_GetRegister(PI_DRAM_ADDR_REG) & 0xFFFFFFFF}; |
| 316 | u32 cart_address {Memory_PI_GetRegister(PI_CART_ADDR_REG) & 0xFFFFFFFF}; |
| 317 | u32 pi_length_reg {(Memory_PI_GetRegister(PI_RD_LEN_REG) & 0xFFFFFFFF) + 1}; |
| 318 | |
| 319 | #ifdef DAEDALUS_PROFILER |
| 320 | DPF(DEBUG_MEMORY_PI, "PI: Copying %d bytes of data from 0x%08x to 0x%08x", pi_length_reg, mem_address, cart_address ); |
| 321 | #endif |
| 322 | /* |
| 323 | if(pi_length_reg & 0x1) |
| 324 | { |
| 325 | DBGConsole_Msg(0, "PI Copy RDRAM to CART %db from %08X to %08X", pi_length_reg, cart_address|0xA0000000, mem_address); |
| 326 | DBGConsole_Msg(0, "Warning, PI DMA, odd length"); |
| 327 | |
| 328 | // Tonic Trouble triggers this ! |
| 329 | |
| 330 | pi_length_reg ++; |
| 331 | } |
| 332 | */ |
| 333 | |
| 334 | // Only care for DOM2/ADDR2 |
| 335 | if(IsFlashDomAddr(cart_address)) |
| 336 | { |
| 337 | u8 * p_dst( (u8 *)g_pMemoryBuffers[MEM_SAVE] ); |
| 338 | u32 dst_size( MemoryRegionSizes[MEM_SAVE] ); |
| 339 | cart_address -= PI_DOM2_ADDR2; |
| 340 | |
| 341 | #ifdef DAEDALUS_DEBUG_CONSOLE |
| 342 | DBGConsole_Msg(0, "[YWriting to Cart domain 2/addr2 0x%08x]", cart_address); |
| 343 | #endif |
| 344 | |
| 345 | if (g_ROM.settings.SaveType != SAVE_TYPE_FLASH) |
| 346 | DMA_HandleTransfer( p_dst, cart_address, dst_size, g_pu8RamBase, mem_address, gRamSize, pi_length_reg ); |
| 347 | else |
| 348 | DMA_FLASH_CopyFromDRAM(mem_address, pi_length_reg); |
| 349 | |
| 350 | Save_MarkSaveDirty(); |
| 351 | } |
| 352 | #ifdef DAEDALUS_DEBUG_CONSOLE |
| 353 | else |
| 354 | { |
| 355 | DBGConsole_Msg(0, "[YUnknown PI Address 0x%08x]", cart_address); |
| 356 | } |
| 357 | #endif |
| 358 | Memory_PI_ClrRegisterBits(PI_STATUS_REG, PI_STATUS_DMA_BUSY); |
| 359 | Memory_MI_SetRegisterBits(MI_INTR_REG, MI_INTR_PI); |
| 360 | R4300_Interrupt_UpdateCause3(); |
| 361 | } |
nothing calls this directly
no test coverage detected