diff --git a/Core/MIPS/MIPSAnalyst.cpp b/Core/MIPS/MIPSAnalyst.cpp index 6e88bbf63f..71d1d7c831 100644 --- a/Core/MIPS/MIPSAnalyst.cpp +++ b/Core/MIPS/MIPSAnalyst.cpp @@ -983,7 +983,8 @@ skip: // We assume the furthest jumpback is within the func. u32 furthestJumpbackAddr = INVALIDTARGET; - for (u32 ahead = fromAddr; ahead < fromAddr + MAX_AHEAD_SCAN; ahead += 4) { + const u32 scanEnd = fromAddr + Memory::ValidSize(fromAddr, MAX_AHEAD_SCAN); + for (u32 ahead = fromAddr; ahead < scanEnd; ahead += 4) { MIPSOpcode aheadOp = Memory::Read_Instruction(ahead, true); u32 target = GetBranchTargetNoRA(ahead, aheadOp); if (target == INVALIDTARGET && ((aheadOp & 0xFC000000) == 0x08000000)) { diff --git a/Core/MemMap.h b/Core/MemMap.h index 465802fb32..b9afe2ea35 100644 --- a/Core/MemMap.h +++ b/Core/MemMap.h @@ -313,13 +313,13 @@ inline bool IsValidAddress(const u32 address) { inline u32 ValidSize(const u32 address, const u32 requested_size) { u32 max_size; if ((address & 0x3E000000) == 0x08000000) { - max_size = 0x08000000 + g_MemorySize - (address & 0x3E000000); + max_size = 0x08000000 + g_MemorySize - (address & 0x3FFFFFFF); } else if ((address & 0x3F800000) == 0x04000000) { - max_size = 0x04800000 - (address & 0x3F800000); + max_size = 0x04800000 - (address & 0x3FFFFFFF); } else if ((address & 0xBFFF0000) == 0x00010000) { - max_size = 0x00014000 - (address & 0xBFFF0000); + max_size = 0x00014000 - (address & 0xBFFFFFFF); } else if ((address & 0x3F000000) >= 0x08000000 && (address & 0x3F000000) < 0x08000000 + g_MemorySize) { - max_size = 0x08000000 + g_MemorySize - (address & 0x3F000000); + max_size = 0x08000000 + g_MemorySize - (address & 0x3FFFFFFF); } else { max_size = 0; } diff --git a/Core/System.cpp b/Core/System.cpp index 96d6ae5f8a..f46eaa915d 100644 --- a/Core/System.cpp +++ b/Core/System.cpp @@ -122,7 +122,8 @@ void UpdateUIState(GlobalUIState newState) { // Never leave the EXIT state. if (globalUIState != newState && globalUIState != UISTATE_EXIT) { globalUIState = newState; - host->UpdateDisassembly(); + if (host) + host->UpdateDisassembly(); const char *state = nullptr; switch (globalUIState) { case UISTATE_EXIT: state = "exit"; break; diff --git a/Windows/Debugger/Debugger_MemoryDlg.cpp b/Windows/Debugger/Debugger_MemoryDlg.cpp index 6532c6a6f1..b11c53425f 100644 --- a/Windows/Debugger/Debugger_MemoryDlg.cpp +++ b/Windows/Debugger/Debugger_MemoryDlg.cpp @@ -131,9 +131,8 @@ void CMemoryDlg::searchBoxRedraw(std::vector results) { } -void CMemoryDlg::NotifyMapLoaded() -{ - if (m_hDlg) +void CMemoryDlg::NotifyMapLoaded() { + if (m_hDlg && g_symbolMap) g_symbolMap->FillSymbolListBox(symListHdl, ST_DATA); Update(); } diff --git a/Windows/EmuThread.cpp b/Windows/EmuThread.cpp index a0a8a359fa..0e373989c4 100644 --- a/Windows/EmuThread.cpp +++ b/Windows/EmuThread.cpp @@ -263,6 +263,9 @@ void MainThreadFunc() { if (!Core_IsActive()) UpdateUIState(UISTATE_MENU); Core_Run(g_graphicsContext); + if (coreState == CORE_BOOT_ERROR) { + break; + } } } Core_Stop(); diff --git a/unittest/UnitTest.cpp b/unittest/UnitTest.cpp index 65447c27f0..1e0310991b 100644 --- a/unittest/UnitTest.cpp +++ b/unittest/UnitTest.cpp @@ -567,6 +567,8 @@ static bool TestMemMap() { EXPECT_EQ_HEX(Memory::ValidSize(base, 0x40000001), range.size); EXPECT_EQ_HEX(Memory::ValidSize(base, 0x20000001), range.size); EXPECT_EQ_HEX(Memory::ValidSize(base, 0x10000001), range.size); + + EXPECT_EQ_HEX(Memory::ValidSize(base + range.size - 0x10, 0x20000001), 0x10); } } @@ -607,6 +609,7 @@ TestItem availableTests[] = { TEST_ITEM(ParseLBN), TEST_ITEM(QuickTexHash), TEST_ITEM(CLZ), + TEST_ITEM(MemMap), TEST_ITEM(ShaderGenerators), };