diff options
| author | ptitSeb <sebastien.chev@gmail.com> | 2021-03-06 11:53:13 +0100 |
|---|---|---|
| committer | ptitSeb <sebastien.chev@gmail.com> | 2021-03-06 11:53:13 +0100 |
| commit | 943eb97f06d5da96e8592dc9edc486c11c09ae67 (patch) | |
| tree | fe67811306f78170bcdb28d66ad36feaa611a585 | |
| parent | a26ae4c7ef65429bf7d831c6650671cae1a348b2 (diff) | |
| download | box64-943eb97f06d5da96e8592dc9edc486c11c09ae67.tar.gz box64-943eb97f06d5da96e8592dc9edc486c11c09ae67.zip | |
Added REX 0F 90..9F SETcc opcode
| -rw-r--r-- | src/emu/modrm.h | 66 | ||||
| -rwxr-xr-x | src/emu/x64run.c | 1 | ||||
| -rw-r--r-- | src/emu/x64run0f.c | 8 |
3 files changed, 58 insertions, 17 deletions
diff --git a/src/emu/modrm.h b/src/emu/modrm.h index 78dbddb3..d5479a1d 100644 --- a/src/emu/modrm.h +++ b/src/emu/modrm.h @@ -30,100 +30,132 @@ #define EX opex #define GX opgx -#define GOCOND(BASE, PREFIX, CONDITIONAL) \ +#define GOCOND(BASE, PREFIX, COND, NOTCOND) \ case BASE+0x0: \ PREFIX \ if(ACCESS_FLAG(F_OF)) { \ - CONDITIONAL \ + COND \ + } else { \ + NOTCOND \ } \ break; \ case BASE+0x1: \ PREFIX \ if(!ACCESS_FLAG(F_OF)) { \ - CONDITIONAL \ + COND \ + } else { \ + NOTCOND \ } \ break; \ case BASE+0x2: \ PREFIX \ if(ACCESS_FLAG(F_CF)) { \ - CONDITIONAL \ + COND \ + } else { \ + NOTCOND \ } \ break; \ case BASE+0x3: \ PREFIX \ if(!ACCESS_FLAG(F_CF)) { \ - CONDITIONAL \ + COND \ + } else { \ + NOTCOND \ } \ break; \ case BASE+0x4: \ PREFIX \ if(ACCESS_FLAG(F_ZF)) { \ - CONDITIONAL \ + COND \ + } else { \ + NOTCOND \ } \ break; \ case BASE+0x5: \ PREFIX \ if(!ACCESS_FLAG(F_ZF)) { \ - CONDITIONAL \ + COND \ + } else { \ + NOTCOND \ } \ break; \ case BASE+0x6: \ PREFIX \ if((ACCESS_FLAG(F_ZF) || ACCESS_FLAG(F_CF))) { \ - CONDITIONAL \ + COND \ + } else { \ + NOTCOND \ } \ break; \ case BASE+0x7: \ PREFIX \ if(!(ACCESS_FLAG(F_ZF) || ACCESS_FLAG(F_CF))) { \ - CONDITIONAL \ + COND \ + } else { \ + NOTCOND \ } \ break; \ case BASE+0x8: \ PREFIX \ if(ACCESS_FLAG(F_SF)) { \ - CONDITIONAL \ + COND \ + } else { \ + NOTCOND \ } \ break; \ case BASE+0x9: \ PREFIX \ if(!ACCESS_FLAG(F_SF)) { \ - CONDITIONAL \ + COND \ + } else { \ + NOTCOND \ } \ break; \ case BASE+0xA: \ PREFIX \ if(ACCESS_FLAG(F_PF)) { \ - CONDITIONAL \ + COND \ + } else { \ + NOTCOND \ } \ break; \ case BASE+0xB: \ PREFIX \ if(!ACCESS_FLAG(F_PF)) { \ - CONDITIONAL \ + COND \ + } else { \ + NOTCOND \ } \ break; \ case BASE+0xC: \ PREFIX \ if(ACCESS_FLAG(F_SF) != ACCESS_FLAG(F_OF)) {\ - CONDITIONAL \ + COND \ + } else { \ + NOTCOND \ } \ break; \ case BASE+0xD: \ PREFIX \ if(ACCESS_FLAG(F_SF) == ACCESS_FLAG(F_OF)) {\ - CONDITIONAL \ + COND \ + } else { \ + NOTCOND \ } \ break; \ case BASE+0xE: \ PREFIX \ if(ACCESS_FLAG(F_ZF) || (ACCESS_FLAG(F_SF) != ACCESS_FLAG(F_OF))) {\ - CONDITIONAL \ + COND \ + } else { \ + NOTCOND \ } \ break; \ case BASE+0xF: \ PREFIX \ if(!ACCESS_FLAG(F_ZF) && (ACCESS_FLAG(F_SF) == ACCESS_FLAG(F_OF))) {\ - CONDITIONAL \ + COND \ + } else { \ + NOTCOND \ } \ break; diff --git a/src/emu/x64run.c b/src/emu/x64run.c index 03d40a1d..d54849fa 100755 --- a/src/emu/x64run.c +++ b/src/emu/x64run.c @@ -257,6 +257,7 @@ x64emurun: GOCOND(0x70 , tmp8s = F8S; CHECK_FLAGS(emu); , R_RIP += tmp8s; + , ) /* Jxx Ib */ case 0x80: /* GRP Eb,Ib */ diff --git a/src/emu/x64run0f.c b/src/emu/x64run0f.c index 80f612f7..50867d5a 100644 --- a/src/emu/x64run0f.c +++ b/src/emu/x64run0f.c @@ -64,12 +64,20 @@ int Run0F(x64emu_t *emu, rex_t rex) GETGD; CHECK_FLAGS(emu); , if(rex.w) {GD->q[0] = ED->q[0]; } else {GD->dword[0] = ED->dword[0];} + , ) /* 0x40 -> 0x4F CMOVxx Gd,Ed */ // conditional move, no sign GOCOND(0x80 , tmp32s = F32S; CHECK_FLAGS(emu); , R_RIP += tmp32s; + , ) /* 0x80 -> 0x8F Jxx */ + GOCOND(0x90 + , nextop = F8; CHECK_FLAGS(emu); + GETEB; + , EB->byte[0]=1; + , EB->byte[0]=0; + ) /* 0x90 -> 0x9F SETxx Eb */ case 0xA2: /* CPUID */ tmp32u = R_EAX; |