diff --git a/core/hw/sh4/dyna/driver.cpp b/core/hw/sh4/dyna/driver.cpp index 8f66a4258..56e66724e 100644 --- a/core/hw/sh4/dyna/driver.cpp +++ b/core/hw/sh4/dyna/driver.cpp @@ -167,12 +167,12 @@ SmcCheckEnum DoCheck(u32 pc) // Full Check everything case FullCheck: - return FastCheck; + return FullCheck; default: die("Unhandled settings.dynarec.SmcCheckLevel"); + return FullCheck; } - } void AnalyseBlock(RuntimeBlockInfo* blk); diff --git a/core/rec-ARM/rec_arm.cpp b/core/rec-ARM/rec_arm.cpp index 78f8f9249..933ff19d2 100644 --- a/core/rec-ARM/rec_arm.cpp +++ b/core/rec-ARM/rec_arm.cpp @@ -2121,11 +2121,14 @@ void ngen_Compile(RuntimeBlockInfo* block, SmcCheckEnum smc_checks, bool reset, case FastCheck: { MOV32(r0,block->addr); u32* ptr=(u32*)GetMemPtr(block->addr,4); - MOV32(r2,(u32)ptr); - LDR(r2,r2,0); - MOV32(r1,*ptr); - CMP(r1,r2); - JUMP((u32)ngen_blockcheckfail, CC_NE); + if (ptr != NULL) + { + MOV32(r2,(u32)ptr); + LDR(r2,r2,0); + MOV32(r1,*ptr); + CMP(r1,r2); + JUMP((u32)ngen_blockcheckfail, CC_NE); + } } break; @@ -2139,24 +2142,30 @@ void ngen_Compile(RuntimeBlockInfo* block, SmcCheckEnum smc_checks, bool reset, if (sz > 2) { u32* ptr=(u32*)GetMemPtr(addr,4); - MOV32(r2,(u32)ptr); - LDR(r2,r2,0); - MOV32(r1,*ptr); - CMP(r1,r2); + if (ptr != NULL) + { + MOV32(r2,(u32)ptr); + LDR(r2,r2,0); + MOV32(r1,*ptr); + CMP(r1,r2); - JUMP((u32)ngen_blockcheckfail, CC_NE); + JUMP((u32)ngen_blockcheckfail, CC_NE); + } addr += 4; sz -= 4; } else { u16* ptr = (u16 *)GetMemPtr(addr, 2); - MOV32(r2, (u32)ptr); - LDRH(r2, r2, 0, AL); - MOVW(r1, *ptr, AL); - CMP(r1, r2); + if (ptr != NULL) + { + MOV32(r2, (u32)ptr); + LDRH(r2, r2, 0, AL); + MOVW(r1, *ptr, AL); + CMP(r1, r2); - JUMP((u32)ngen_blockcheckfail, CC_NE); + JUMP((u32)ngen_blockcheckfail, CC_NE); + } addr += 2; sz -= 2; } diff --git a/core/rec-x64/rec_x64.cpp b/core/rec-x64/rec_x64.cpp index f3a23bdc3..b80df57ee 100644 --- a/core/rec-x64/rec_x64.cpp +++ b/core/rec-x64/rec_x64.cpp @@ -1108,12 +1108,12 @@ private: s32 sz=block->sh4_code_size; u32 sa=block->addr; - mov(call_regs[0], block->addr); - - while (sz > 0) + void* ptr = (void*)GetMemPtr(sa, sz > 8 ? 8 : sz); + if (ptr) { - void* ptr = (void*)GetMemPtr(sa, sz > 8 ? 8 : sz); - if (ptr) + mov(call_regs[0], block->addr); + + while (sz > 0) { mov(rax, reinterpret_cast(ptr)); @@ -1136,8 +1136,9 @@ private: sa += 2; } jne(reinterpret_cast(&ngen_blockcheckfail)); + ptr = (void*)GetMemPtr(sa, sz > 8 ? 8 : sz); } - } + } } break;