void CN64Disk::UnallocateDiskImage() { m_DiskFile.Close(); if (m_DiskImageBase) { ProtectMemory(m_DiskImage, m_DiskFileSize, MEM_READWRITE); delete[] m_DiskImageBase; m_DiskImageBase = NULL; } m_DiskImage = NULL; }
void CDMA::PI_DMA_READ() { // PI_STATUS_REG |= PI_STATUS_DMA_BUSY; uint32_t PI_RD_LEN_REG = ((g_Reg->PI_RD_LEN_REG) & 0x00FFFFFFul) + 1; if ((PI_RD_LEN_REG & 1) != 0) { PI_RD_LEN_REG += 1; } if (g_Reg->PI_DRAM_ADDR_REG + PI_RD_LEN_REG > g_MMU->RdramSize()) { if (bHaveDebugger()) { g_Notify->DisplayError(stdstr_f("PI_DMA_READ not in Memory: %08X", g_Reg->PI_DRAM_ADDR_REG + PI_RD_LEN_REG).c_str()); } g_Reg->PI_STATUS_REG &= ~PI_STATUS_DMA_BUSY; g_Reg->MI_INTR_REG |= MI_INTR_PI; g_Reg->CheckInterrupts(); return; } //Write ROM Area (for 64DD Convert) if (g_Reg->PI_CART_ADDR_REG >= 0x10000000 && g_Reg->PI_CART_ADDR_REG <= 0x1FBFFFFF && g_Settings->LoadBool(Game_AllowROMWrites)) { uint32_t i; uint8_t * ROM = g_Rom->GetRomAddress(); uint8_t * RDRAM = g_MMU->Rdram(); ProtectMemory(ROM, g_Rom->GetRomSize(), MEM_READWRITE); g_Reg->PI_CART_ADDR_REG -= 0x10000000; if (g_Reg->PI_CART_ADDR_REG + PI_RD_LEN_REG < g_Rom->GetRomSize()) { for (i = 0; i < PI_RD_LEN_REG; i++) { *(ROM + ((g_Reg->PI_CART_ADDR_REG + i) ^ 3)) = *(RDRAM + ((g_Reg->PI_DRAM_ADDR_REG + i) ^ 3)); } } else { uint32_t Len; Len = g_Rom->GetRomSize() - g_Reg->PI_CART_ADDR_REG; for (i = 0; i < Len; i++) { *(ROM + ((g_Reg->PI_CART_ADDR_REG + i) ^ 3)) = *(RDRAM + ((g_Reg->PI_DRAM_ADDR_REG + i) ^ 3)); } } g_Reg->PI_CART_ADDR_REG += 0x10000000; if (!g_System->DmaUsed()) { g_System->SetDmaUsed(true); OnFirstDMA(); } if (g_Recompiler && g_System->bSMM_PIDMA()) { g_Recompiler->ClearRecompCode_Phys(g_Reg->PI_DRAM_ADDR_REG, g_Reg->PI_WR_LEN_REG, CRecompiler::Remove_DMA); } ProtectMemory(ROM, g_Rom->GetRomSize(), MEM_READONLY); g_Reg->PI_STATUS_REG &= ~PI_STATUS_DMA_BUSY; g_Reg->MI_INTR_REG |= MI_INTR_PI; g_Reg->CheckInterrupts(); return; } if (g_Reg->PI_CART_ADDR_REG >= 0x08000000 && g_Reg->PI_CART_ADDR_REG <= 0x08010000) { if (g_System->m_SaveUsing == SaveChip_Auto) { g_System->m_SaveUsing = SaveChip_Sram; } if (g_System->m_SaveUsing == SaveChip_Sram) { m_Sram.DmaToSram( g_MMU->Rdram() + g_Reg->PI_DRAM_ADDR_REG, g_Reg->PI_CART_ADDR_REG - 0x08000000, PI_RD_LEN_REG ); g_Reg->PI_STATUS_REG &= ~PI_STATUS_DMA_BUSY; g_Reg->MI_INTR_REG |= MI_INTR_PI; g_Reg->CheckInterrupts(); return; } if (g_System->m_SaveUsing == SaveChip_FlashRam) { m_FlashRam.DmaToFlashram( g_MMU->Rdram() + g_Reg->PI_DRAM_ADDR_REG, g_Reg->PI_CART_ADDR_REG - 0x08000000, PI_RD_LEN_REG ); g_Reg->PI_STATUS_REG &= ~PI_STATUS_DMA_BUSY; g_Reg->MI_INTR_REG |= MI_INTR_PI; g_Reg->CheckInterrupts(); return; } } if (g_System->m_SaveUsing == SaveChip_FlashRam) { g_Notify->DisplayError(stdstr_f("**** FLashRam DMA Read address %08X *****", g_Reg->PI_CART_ADDR_REG).c_str()); g_Reg->PI_STATUS_REG &= ~PI_STATUS_DMA_BUSY; g_Reg->MI_INTR_REG |= MI_INTR_PI; g_Reg->CheckInterrupts(); return; } if (bHaveDebugger()) { g_Notify->DisplayError(stdstr_f("PI_DMA_READ where are you dmaing to ? : %08X", g_Reg->PI_CART_ADDR_REG).c_str()); } g_Reg->PI_STATUS_REG &= ~PI_STATUS_DMA_BUSY; g_Reg->MI_INTR_REG |= MI_INTR_PI; g_Reg->CheckInterrupts(); return; }
~scoped_unprotect() { if(bUnprotected) ProtectMemory(this->addr.get(), this->size, this->dwOldProtect); }
bool CN64Disk::AllocateAndLoadDiskImage(const char * FileLoc) { WriteTrace(TraceN64System, TraceDebug, "Trying to open %s", FileLoc); if (!m_DiskFile.Open(FileLoc, CFileBase::modeRead)) { WriteTrace(TraceN64System, TraceError, "Failed to open %s", FileLoc); return false; } //Read the first 4 bytes and make sure it is a valid disk image uint8_t Test[4]; m_DiskFile.SeekToBegin(); if (m_DiskFile.Read(Test, sizeof(Test)) != sizeof(Test)) { m_DiskFile.Close(); WriteTrace(TraceN64System, TraceError, "Failed to read ident bytes"); return false; } if (!IsValidDiskImage(Test)) { m_DiskFile.Close(); WriteTrace(TraceN64System, TraceError, "invalid image file %X %X %X %X", Test[0], Test[1], Test[2], Test[3]); return false; } uint32_t DiskFileSize = m_DiskFile.GetLength(); WriteTrace(TraceN64System, TraceDebug, "Successfully Opened, size: 0x%X", DiskFileSize); //Check Disk File Format if (DiskFileSize == MameFormatSize) { //If Disk is MAME Format (size is constant, it should be the same for every file), then continue WriteTrace(TraceN64System, TraceDebug, "Disk File is MAME Format"); if (!AllocateDiskImage(DiskFileSize)) { m_DiskFile.Close(); return false; } //Load the n64 disk to the allocated memory g_Notify->DisplayMessage(5, MSG_LOADING); m_DiskFile.SeekToBegin(); uint32_t count, TotalRead = 0; for (count = 0; count < (int)DiskFileSize; count += ReadFromRomSection) { uint32_t dwToRead = DiskFileSize - count; if (dwToRead > ReadFromRomSection) { dwToRead = ReadFromRomSection; } if (m_DiskFile.Read(&m_DiskImage[count], dwToRead) != dwToRead) { m_DiskFile.Close(); SetError(MSG_FAIL_IMAGE); WriteTrace(TraceN64System, TraceError, "Failed to read file (TotalRead: 0x%X)", TotalRead); return false; } TotalRead += dwToRead; //Show Message of how much % wise of the rom has been loaded g_Notify->DisplayMessage(0, stdstr_f("%s: %.2f%c", GS(MSG_LOADED), ((float)TotalRead / (float)DiskFileSize) * 100.0f, '%').c_str()); } if (DiskFileSize != TotalRead) { m_DiskFile.Close(); SetError(MSG_FAIL_IMAGE); WriteTrace(TraceN64System, TraceError, "Expected to read: 0x%X, read: 0x%X", TotalRead, DiskFileSize); return false; } } else if (DiskFileSize == SDKFormatSize) { //If Disk is SDK format (made with SDK based dumpers like LuigiBlood's, or Nintendo's, size is also constant) //We need to convert it. g_Notify->DisplayMessage(5, MSG_LOADING); //Allocate supported size if (!AllocateDiskImage(MameFormatSize)) { m_DiskFile.Close(); return false; } ConvertDiskFormat(); } else { //Else the disk file is invalid m_DiskFile.Close(); WriteTrace(TraceN64System, TraceError, "Disk File is invalid, unexpected size"); return false; } g_Notify->DisplayMessage(5, MSG_BYTESWAP); ByteSwapDisk(); ProtectMemory(m_DiskImage, m_DiskFileSize, MEM_READWRITE); return true; }