diff options
| author | ptitSeb <sebastien.chev@gmail.com> | 2021-06-02 14:51:06 +0200 |
|---|---|---|
| committer | ptitSeb <sebastien.chev@gmail.com> | 2021-06-02 14:51:06 +0200 |
| commit | 2f1cc844fdd9b2c6d6fd5dafcf590afe99f99736 (patch) | |
| tree | 1a3c0bec6b735b474d41c8b6dcaad1c09cdcbbd6 /src | |
| parent | 543af50ff80af8f041e2b53568659b30043e8613 (diff) | |
| download | box64-2f1cc844fdd9b2c6d6fd5dafcf590afe99f99736.tar.gz box64-2f1cc844fdd9b2c6d6fd5dafcf590afe99f99736.zip | |
Added 66 A1/A3 opcodes ([DYNAREC] too)
Diffstat (limited to 'src')
| -rwxr-xr-x | src/dynarec/dynarec_arm64_66.c | 17 | ||||
| -rw-r--r-- | src/emu/x64run66.c | 14 |
2 files changed, 31 insertions, 0 deletions
diff --git a/src/dynarec/dynarec_arm64_66.c b/src/dynarec/dynarec_arm64_66.c index 8237fe3c..ac78b267 100755 --- a/src/dynarec/dynarec_arm64_66.c +++ b/src/dynarec/dynarec_arm64_66.c @@ -29,6 +29,7 @@ uintptr_t dynarec64_66(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int nin uint8_t nextop, u8; int16_t i16; uint16_t u16; + uint64_t u64; int32_t i32; int64_t j64; uint8_t gd, ed; @@ -36,6 +37,7 @@ uintptr_t dynarec64_66(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int nin int64_t fixedaddress; MAYUSE(u8); MAYUSE(u16); + MAYUSE(u64); MAYUSE(j64); while((opcode==0x2E) || (opcode==0x66)) // ignoring CS: or multiple 0x66 @@ -456,6 +458,21 @@ uintptr_t dynarec64_66(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int nin INST_NAME("NOP"); break; + case 0xA1: + INST_NAME("MOV EAX,Od"); + u64 = F64; + MOV64x(x1, u64); + LDRH_U12(x2, x1, 0); + BFIx(xRAX, x2, 0, 16); + break; + + case 0xA3: + INST_NAME("MOV Od,EAX"); + u64 = F64; + MOV64x(x1, u64); + STRH_U12(xRAX, x1, 0); + break; + case 0xA5: if(rep) { INST_NAME("REP MOVSW"); diff --git a/src/emu/x64run66.c b/src/emu/x64run66.c index 0e1f4bac..067c47da 100644 --- a/src/emu/x64run66.c +++ b/src/emu/x64run66.c @@ -246,6 +246,20 @@ int Run66(x64emu_t *emu, rex_t rex, int rep) R_DX=((R_AX & 0x8000)?0xFFFF:0x0000); break; + case 0xA1: /* MOV EAX,Od */ + if(rex.w) + R_RAX = *(uint64_t*)F64; + else + R_AX = *(uint16_t*)F64; + break; + + case 0xA3: /* MOV Od,EAX */ + if(rex.w) + *(uint64_t*)F64 = R_RAX; + else + *(uint16_t*)F64 = R_AX; + break; + case 0xA5: /* (REP) MOVSW */ tmp8s = ACCESS_FLAG(F_DF)?-1:+1; tmp64u = (rep)?R_RCX:1L; |