void ROMUCode::BootUCode() { u32 ector_crc = HashEctor( (u8*)HLEMemory_Get_Pointer(m_current_ucode.m_ram_address), m_current_ucode.m_length); #if defined(_DEBUG) || defined(DEBUGFAST) std::string ucode_dump_path = StringFromFormat( "%sDSP_UC_%08X.bin", File::GetUserPath(D_DUMPDSP_IDX).c_str(), ector_crc); File::IOFile fp(ucode_dump_path, "wb"); if (fp) { fp.WriteArray((u8*)HLEMemory_Get_Pointer(m_current_ucode.m_ram_address), m_current_ucode.m_length); } #endif DEBUG_LOG(DSPHLE, "CurrentUCode SOURCE Addr: 0x%08x", m_current_ucode.m_ram_address); DEBUG_LOG(DSPHLE, "CurrentUCode Length: 0x%08x", m_current_ucode.m_length); DEBUG_LOG(DSPHLE, "CurrentUCode DEST Addr: 0x%08x", m_current_ucode.m_imem_address); DEBUG_LOG(DSPHLE, "CurrentUCode DMEM Length: 0x%08x", m_current_ucode.m_dmem_length); DEBUG_LOG(DSPHLE, "CurrentUCode init_vector: 0x%08x", m_current_ucode.m_start_pc); DEBUG_LOG(DSPHLE, "CurrentUCode CRC: 0x%08x", ector_crc); DEBUG_LOG(DSPHLE, "BootTask - done"); m_dsphle->SetUCode(ector_crc); }
void CodeLoaded(const u8 *ptr, int size) { g_dsp.iram_crc = HashEctor(ptr, size); #if defined(_DEBUG) || defined(DEBUGFAST) DumpDSPCode(ptr, size, g_dsp.iram_crc); #endif DSPSymbols::Clear(); // Auto load text file - if none just disassemble. NOTICE_LOG(DSPLLE, "g_dsp.iram_crc: %08x", g_dsp.iram_crc); DSPSymbols::Clear(); bool success = false; switch (g_dsp.iram_crc) { case 0x86840740: success = DSPSymbols::ReadAnnotatedAssembly("../../docs/DSP/DSP_UC_Zelda.txt"); break; case 0x42f64ac4: success = DSPSymbols::ReadAnnotatedAssembly("../../docs/DSP/DSP_UC_Luigi.txt"); break; case 0x07f88145: success = DSPSymbols::ReadAnnotatedAssembly("../../docs/DSP/DSP_UC_AX_07F88145.txt"); break; case 0x3ad3b7ac: success = DSPSymbols::ReadAnnotatedAssembly("../../docs/DSP/DSP_UC_AX_3AD3B7AC.txt"); break; case 0x3daf59b9: success = DSPSymbols::ReadAnnotatedAssembly("../../docs/DSP/DSP_UC_AX_3DAF59B9.txt"); break; case 0x4e8a8b21: success = DSPSymbols::ReadAnnotatedAssembly("../../docs/DSP/DSP_UC_AX_4E8A8B21.txt"); break; case 0xe2136399: success = DSPSymbols::ReadAnnotatedAssembly("../../docs/DSP/DSP_UC_AX_E2136399.txt"); break; case 0xdd7e72d5: success = DSPSymbols::ReadAnnotatedAssembly("../../docs/DSP/DSP_UC_GBA.txt"); break; case 0x347112BA: success = DSPSymbols::ReadAnnotatedAssembly("../../docs/DSP/DSP_UC_AXWii.txt"); break; case 0xD643001F: success = DSPSymbols::ReadAnnotatedAssembly("../../docs/DSP/DSP_UC_SuperMarioGalaxy.txt"); break; default: success = false; break; } if (!success) { DSPSymbols::AutoDisassembly(0x0, 0x1000); } // Always add the ROM. DSPSymbols::AutoDisassembly(0x8000, 0x9000); UpdateDebugger(); if (g_dsp_jit) g_dsp_jit->ClearIRAM(); DSPAnalyzer::Analyze(); }
void IUCode::PrepareBootUCode(u32 mail) { switch (m_NextUCode_steps) { case 0: m_NextUCode.mram_dest_addr = mail; break; case 1: m_NextUCode.mram_size = mail & 0xffff; break; case 2: m_NextUCode.mram_dram_addr = mail & 0xffff; break; case 3: m_NextUCode.iram_mram_addr = mail; break; case 4: m_NextUCode.iram_size = mail & 0xffff; break; case 5: m_NextUCode.iram_dest = mail & 0xffff; break; case 6: m_NextUCode.iram_startpc = mail & 0xffff; break; case 7: m_NextUCode.dram_mram_addr = mail; break; case 8: m_NextUCode.dram_size = mail & 0xffff; break; case 9: m_NextUCode.dram_dest = mail & 0xffff; break; } m_NextUCode_steps++; if (m_NextUCode_steps == 10) { m_NextUCode_steps = 0; m_NeedsResumeMail = true; m_UploadSetupInProgress = false; u32 ector_crc = HashEctor( (u8*)HLEMemory_Get_Pointer(m_NextUCode.iram_mram_addr), m_NextUCode.iram_size); #if defined(_DEBUG) || defined(DEBUGFAST) char binFile[MAX_PATH]; sprintf(binFile, "%sDSP_UC_%08X.bin", File::GetUserPath(D_DUMPDSP_IDX).c_str(), ector_crc); File::IOFile pFile(binFile, "wb"); if (pFile) pFile.WriteArray((u8*)Memory::GetPointer(m_NextUCode.iram_mram_addr), m_NextUCode.iram_size); #endif DEBUG_LOG(DSPHLE, "PrepareBootUCode 0x%08x", ector_crc); DEBUG_LOG(DSPHLE, "DRAM -> MRAM: src %04x dst %08x size %04x", m_NextUCode.mram_dram_addr, m_NextUCode.mram_dest_addr, m_NextUCode.mram_size); DEBUG_LOG(DSPHLE, "MRAM -> IRAM: src %08x dst %04x size %04x startpc %04x", m_NextUCode.iram_mram_addr, m_NextUCode.iram_dest, m_NextUCode.iram_size, m_NextUCode.iram_startpc); DEBUG_LOG(DSPHLE, "MRAM -> DRAM: src %08x dst %04x size %04x", m_NextUCode.dram_mram_addr, m_NextUCode.dram_dest, m_NextUCode.dram_size); if (m_NextUCode.mram_size) { WARN_LOG(DSPHLE, "Trying to boot new ucode with dram download - not implemented"); } if (m_NextUCode.dram_size) { WARN_LOG(DSPHLE, "Trying to boot new ucode with dram upload - not implemented"); } m_DSPHLE->SwapUCode(ector_crc); } }
void UCodeInterface::PrepareBootUCode(u32 mail) { switch (m_next_ucode_steps) { case 0: m_next_ucode.mram_dest_addr = mail; break; case 1: m_next_ucode.mram_size = mail & 0xffff; break; case 2: m_next_ucode.mram_dram_addr = mail & 0xffff; break; case 3: m_next_ucode.iram_mram_addr = mail; break; case 4: m_next_ucode.iram_size = mail & 0xffff; break; case 5: m_next_ucode.iram_dest = mail & 0xffff; break; case 6: m_next_ucode.iram_startpc = mail & 0xffff; break; case 7: m_next_ucode.dram_mram_addr = mail; break; case 8: m_next_ucode.dram_size = mail & 0xffff; break; case 9: m_next_ucode.dram_dest = mail & 0xffff; break; } m_next_ucode_steps++; if (m_next_ucode_steps == 10) { m_next_ucode_steps = 0; m_needs_resume_mail = true; m_upload_setup_in_progress = false; u32 ector_crc = HashEctor( (u8*)HLEMemory_Get_Pointer(m_next_ucode.iram_mram_addr), m_next_ucode.iram_size); #if defined(_DEBUG) || defined(DEBUGFAST) std::string ucode_dump_path = StringFromFormat( "%sDSP_UC_%08X.bin", File::GetUserPath(D_DUMPDSP_IDX).c_str(), ector_crc); File::IOFile fp(ucode_dump_path, "wb"); if (fp) { fp.WriteArray((u8*)Memory::GetPointer(m_next_ucode.iram_mram_addr), m_next_ucode.iram_size); } #endif DEBUG_LOG(DSPHLE, "PrepareBootUCode 0x%08x", ector_crc); DEBUG_LOG(DSPHLE, "DRAM -> MRAM: src %04x dst %08x size %04x", m_next_ucode.mram_dram_addr, m_next_ucode.mram_dest_addr, m_next_ucode.mram_size); DEBUG_LOG(DSPHLE, "MRAM -> IRAM: src %08x dst %04x size %04x startpc %04x", m_next_ucode.iram_mram_addr, m_next_ucode.iram_dest, m_next_ucode.iram_size, m_next_ucode.iram_startpc); DEBUG_LOG(DSPHLE, "MRAM -> DRAM: src %08x dst %04x size %04x", m_next_ucode.dram_mram_addr, m_next_ucode.dram_dest, m_next_ucode.dram_size); if (m_next_ucode.mram_size) { WARN_LOG(DSPHLE, "Trying to boot new ucode with dram download - not implemented"); } if (m_next_ucode.dram_size) { WARN_LOG(DSPHLE, "Trying to boot new ucode with dram upload - not implemented"); } m_dsphle->SwapUCode(ector_crc); } }