Recompiled code blocks are no longer allowed to cross pages.

Recompiling of blocks is aborted if the code page becomes dirty.
Fixes Windows 98 setup.
This commit is contained in:
TomW 2014-12-06 16:35:45 +00:00
commit 00f6271ec8

View file

@ -1296,6 +1296,8 @@ inrecomp=0;
} }
else if (!abrt) else if (!abrt)
{ {
uint32_t start_page = pc >> 12;
// pclog("Hash %08x %i\n", codeblock_hash_pc[HASH(cs + pc)], codeblock_page_dirty[(cs + pc) >> 12]); // pclog("Hash %08x %i\n", codeblock_hash_pc[HASH(cs + pc)], codeblock_page_dirty[(cs + pc) >> 12]);
cpu_block_end = 0; cpu_block_end = 0;
@ -1339,6 +1341,9 @@ inrecomp=0;
if (((cs + pc) >> 12) != pccache) if (((cs + pc) >> 12) != pccache)
CPU_BLOCK_END(); CPU_BLOCK_END();
if ((pc >> 12) != start_page)
CPU_BLOCK_END();
pc++; pc++;
/* if (opcode == 0xf2 || opcode == 0xf3 || ((opcode & ~7) == 0xd8)*/ /* if (opcode == 0xf2 || opcode == 0xf3 || ((opcode & ~7) == 0xd8)*/
// codegen_set_op32(); // codegen_set_op32();
@ -1352,6 +1357,11 @@ inrecomp=0;
if (((cs + pc) >> 12) != pccache) if (((cs + pc) >> 12) != pccache)
CPU_BLOCK_END(); CPU_BLOCK_END();
if (codeblock_page_dirty[phys_addr >> 12])
CPU_BLOCK_END();
//pclog("cpu_block_end=%d %p\n", cpu_block_end, (void *)&cpu_block_end); //pclog("cpu_block_end=%d %p\n", cpu_block_end, (void *)&cpu_block_end);
/* if (ssegs) /* if (ssegs)
{ {
@ -1361,7 +1371,7 @@ inrecomp=0;
codegen_generate_seg_restore(); codegen_generate_seg_restore();
}*/ }*/
//codegen_check_abrt(); //codegen_check_abrt();
if (abrt) if (abrt || codeblock_page_dirty[phys_addr >> 12])
{ {
codegen_block_remove(); codegen_block_remove();
CPU_BLOCK_END(); CPU_BLOCK_END();
@ -1372,7 +1382,7 @@ inrecomp=0;
insc++; insc++;
} }
if (!abrt) if (!abrt && !codeblock_page_dirty[phys_addr >> 12])
codegen_block_end(); codegen_block_end();
// output &= ~2; // output &= ~2;
} }