void SI_DMA_READ (usf_state_t * state) { if ((int32_t)SI_DRAM_ADDR_REG > (int32_t)state->RdramSize) { return; } PifRamRead(state); SI_DRAM_ADDR_REG &= 0xFFFFFFF8; if ((int32_t)SI_DRAM_ADDR_REG < 0) { int32_t count, RdramPos; RdramPos = (int32_t)SI_DRAM_ADDR_REG; for (count = 0; count < 0x40; count++, RdramPos++) { if (RdramPos < 0) { continue; } state->N64MEM[RdramPos ^3] = state->PIF_Ram[count]; } } else { int32_t count, RdramPos; RdramPos = (uint32_t)SI_DRAM_ADDR_REG; for (count = 0; count < 0x40; count++, RdramPos++) { if (RdramPos < 0) { continue; } state->N64MEM[RdramPos ^3] = state->PIF_Ram[count]; } } MI_INTR_REG |= MI_INTR_SI; SI_STATUS_REG |= SI_STATUS_INTERRUPT; CheckInterrupts(state); }
void SI_DMA_READ (void) { BYTE * PifRamPos = &PIF_Ram[0]; if ((int)SI_DRAM_ADDR_REG > (int)RdramSize) { #ifndef EXTERNAL_RELEASE DisplayError("SI DMA\nSI_DRAM_ADDR_REG not in RDRam space"); #endif return; } PifRamRead(); SI_DRAM_ADDR_REG &= 0xFFFFFFF8; if ((int)SI_DRAM_ADDR_REG < 0) { int count, RdramPos; RdramPos = (int)SI_DRAM_ADDR_REG; for (count = 0; count < 0x40; count++, RdramPos++) { if (RdramPos < 0) { continue; } N64MEM[RdramPos ^3] = PIF_Ram[count]; } } else { _asm { mov edi, dword ptr [RegSI] mov edi, dword ptr [edi] add edi, N64MEM mov ecx, PifRamPos mov edx, 0 memcpyloop: mov eax, dword ptr [ecx + edx] bswap eax mov dword ptr [edi + edx],eax mov eax, dword ptr [ecx + edx + 4] bswap eax mov dword ptr [edi + edx + 4],eax mov eax, dword ptr [ecx + edx + 8] bswap eax mov dword ptr [edi + edx + 8],eax mov eax, dword ptr [ecx + edx + 12] bswap eax mov dword ptr [edi + edx + 12],eax add edx, 16 cmp edx, 64 jb memcpyloop } } #if (!defined(EXTERNAL_RELEASE)) if (LogOptions.LogPRDMAMemStores) { int count; char HexData[100], AsciiData[100], Addon[20]; LogMessage("\tData DMAed to RDRAM:"); LogMessage("\t--------------------"); for (count = 0; count < 16; count ++ ) { if ((count % 4) == 0) { sprintf(HexData,"\0"); sprintf(AsciiData,"\0"); } sprintf(Addon,"%02X %02X %02X %02X", PIF_Ram[(count << 2) + 0], PIF_Ram[(count << 2) + 1], PIF_Ram[(count << 2) + 2], PIF_Ram[(count << 2) + 3] ); strcat(HexData,Addon); if (((count + 1) % 4) != 0) { sprintf(Addon,"-"); strcat(HexData,Addon); } sprintf(Addon,"%c%c%c%c", PIF_Ram[(count << 2) + 0], PIF_Ram[(count << 2) + 1], PIF_Ram[(count << 2) + 2], PIF_Ram[(count << 2) + 3] ); strcat(AsciiData,Addon); if (((count + 1) % 4) == 0) { LogMessage("\t%s %s",HexData, AsciiData); } } LogMessage(""); } #endif if (DelaySI) { ChangeTimer(SiTimer,0x900); } else { MI_INTR_REG |= MI_INTR_SI; SI_STATUS_REG |= SI_STATUS_INTERRUPT; CheckInterrupts(); } }