diff options
| author | ptitSeb <sebastien.chev@gmail.com> | 2021-04-11 19:27:10 +0200 |
|---|---|---|
| committer | ptitSeb <sebastien.chev@gmail.com> | 2021-04-11 19:27:10 +0200 |
| commit | d9967d7ea5d76a7009c2b5ba927989705744bab6 (patch) | |
| tree | 149d8352878aa0d7da9c376fdb93e24a30b0af05 /src | |
| parent | d42031293d83f296863d2b2c03432748ab58eb60 (diff) | |
| download | box64-d9967d7ea5d76a7009c2b5ba927989705744bab6.tar.gz box64-d9967d7ea5d76a7009c2b5ba927989705744bab6.zip | |
Added A0/A2 opcodes ([DYNAREC] too)
Diffstat (limited to 'src')
| -rwxr-xr-x | src/dynarec/dynarec_arm64_00.c | 14 | ||||
| -rwxr-xr-x | src/emu/x64run.c | 7 | ||||
| -rw-r--r-- | src/emu/x64runf0.c | 17 |
3 files changed, 32 insertions, 6 deletions
diff --git a/src/dynarec/dynarec_arm64_00.c b/src/dynarec/dynarec_arm64_00.c index 783db2c3..88d4f8f9 100755 --- a/src/dynarec/dynarec_arm64_00.c +++ b/src/dynarec/dynarec_arm64_00.c @@ -1017,13 +1017,25 @@ uintptr_t dynarec64_00(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int nin SET_DFNONE(x1); break; + case 0xA0: + INST_NAME("MOV AL,Ob"); + u64 = F64; + MOV64x(x1, u64); + LDRB_U12(x2, x1, 0); + BFIx(xRAX, x2, 0, 8); + break; case 0xA1: INST_NAME("MOV EAX,Od"); u64 = F64; MOV64x(x1, u64); LDRxw_U12(xRAX, x1, 0); break; - + case 0xA2: + INST_NAME("MOV Ob,AL"); + u64 = F64; + MOV64x(x1, u64); + STRB_U12(xRAX, x1, 0); + break; case 0xA3: INST_NAME("MOV Od,EAX"); u64 = F64; diff --git a/src/emu/x64run.c b/src/emu/x64run.c index c0b7fea5..471aa8f2 100755 --- a/src/emu/x64run.c +++ b/src/emu/x64run.c @@ -539,13 +539,18 @@ x64emurun: RESET_FLAGS(emu); break; + case 0xA0: /* MOV AL,Ob */ + R_AL = *(uint8_t*)F64; + break; case 0xA1: /* MOV EAX,Od */ if(rex.w) R_RAX = *(uint64_t*)F64; else R_EAX = *(uint32_t*)F64; break; - + case 0xA2: /* MOV Ob,AL */ + *(uint8_t*)F64 = R_AL; + break; case 0xA3: /* MOV Od,EAX */ if(rex.w) *(uint64_t*)F64 = R_RAX; diff --git a/src/emu/x64runf0.c b/src/emu/x64runf0.c index 9ce3d01e..883b35ac 100644 --- a/src/emu/x64runf0.c +++ b/src/emu/x64runf0.c @@ -392,10 +392,19 @@ int RunF0(x64emu_t *emu, rex_t rex) } while(arm64_lock_write_dd(ED, tmp64u2)); GD->q[0] = tmp64u; } else { - do { - tmp32u = arm64_lock_read_d(ED); - tmp32u2 = add32(emu, tmp32u, GD->dword[0]); - } while(arm64_lock_write_d(ED, tmp32u2)); + if(((uintptr_t)ED)&3) { + do { + tmp32u = ED->dword[0] & ~0xff; + tmp32u |= arm64_lock_read_b(ED); + tmp32u2 = add32(emu, tmp32u, GD->dword[0]); + } while(arm64_lock_write_b(ED, tmp32u2&0xff)); + ED->dword[0] = tmp32u2; + } else { + do { + tmp32u = arm64_lock_read_d(ED); + tmp32u2 = add32(emu, tmp32u, GD->dword[0]); + } while(arm64_lock_write_d(ED, tmp32u2)); + } GD->q[0] = tmp32u; if(MODREG) ED->dword[1] = 0; |