diff options
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; |