diff options
| author | ptitSeb <sebastien.chev@gmail.com> | 2023-07-23 12:38:05 +0200 |
|---|---|---|
| committer | ptitSeb <sebastien.chev@gmail.com> | 2023-07-23 12:38:05 +0200 |
| commit | 1d5a88a3198c59c5ad27e5ecdcb2f8ef4f712264 (patch) | |
| tree | 261982a25ff8b79da54ed98c30cd5ba8e9e419b9 /src | |
| parent | 392575ba040a4a2f7f2ea947b56b6c73a15baa3f (diff) | |
| download | box64-1d5a88a3198c59c5ad27e5ecdcb2f8ef4f712264.tar.gz box64-1d5a88a3198c59c5ad27e5ecdcb2f8ef4f712264.zip | |
[32BITS] added D6 undocumented opcode
Diffstat (limited to 'src')
| -rw-r--r-- | src/dynarec/dynarec_native_pass.c | 14 | ||||
| -rw-r--r-- | src/emu/x64run.c | 9 |
2 files changed, 21 insertions, 2 deletions
diff --git a/src/dynarec/dynarec_native_pass.c b/src/dynarec/dynarec_native_pass.c index 8ce3540b..3e947e61 100644 --- a/src/dynarec/dynarec_native_pass.c +++ b/src/dynarec/dynarec_native_pass.c @@ -183,7 +183,7 @@ uintptr_t native_pass(dynarec_native_t* dyn, uintptr_t addr, int alternate, int dyn->forward_size = 0; dyn->forward_ninst = 0; ok = 1; // in case it was 0 - } else if ((dyn->forward_to < addr) || !ok) { + } else if ((dyn->forward_to < addr) || ok<=0) { // something when wrong! rollback if(box64_dynarec_dump) dynarec_log(LOG_NONE, "Could not forward extend block for %d bytes %p -> %p\n", dyn->forward_to-dyn->forward, (void*)dyn->forward, (void*)dyn->forward_to); ok = 0; @@ -213,7 +213,7 @@ uintptr_t native_pass(dynarec_native_t* dyn, uintptr_t addr, int alternate, int } if(box64_dynarec_dump) dynarec_log(LOG_NONE, "Extend block %p, %p -> %p (ninst=%d, jump from %d)\n", dyn, (void*)addr, (void*)next, ninst, reset_n); } else if(next && (next-addr)<box64_dynarec_forward && (getProtection(next)&PROT_READ)/*box64_dynarec_bigblock>=stopblock*/) { - if(!((box64_dynarec_bigblock<stopblock) && !isJumpTableDefault64((void*)next))) { + if(!((box64_dynarec_bigblock<stopblock) && !isJumpTableDefault64((void*)next)) && !dyn->forward) { dyn->forward = addr; dyn->forward_to = next; dyn->forward_size = dyn->size; @@ -235,6 +235,16 @@ uintptr_t native_pass(dynarec_native_t* dyn, uintptr_t addr, int alternate, int dyn->insts[ninst].x64.need_after |= X_PEND; ++ninst; } + if(dyn->forward) { + // stopping too soon + dyn->size = dyn->forward_size; + ninst = dyn->forward_ninst+1; + addr = dyn->forward; + dyn->forward = 0; + dyn->forward_to = 0; + dyn->forward_size = 0; + dyn->forward_ninst = 0; + } #endif } ++ninst; diff --git a/src/emu/x64run.c b/src/emu/x64run.c index 56496f7a..c0e38a8b 100644 --- a/src/emu/x64run.c +++ b/src/emu/x64run.c @@ -1472,6 +1472,15 @@ x64emurun: } break; + case 0xD6: /* SALC */ + if(rex.is32bits) { + CHECK_FLAGS(emu); + R_AL = ACCESS_FLAG(F_CF)?0xff:0x00; + } else { + unimp = 1; + goto fini; + }; + break; case 0xD7: /* XLAT */ R_AL = *(uint8_t*)(R_RBX + R_AL); break; |