diff options
| author | ptitSeb <sebastien.chev@gmail.com> | 2021-03-11 17:47:14 +0100 |
|---|---|---|
| committer | ptitSeb <sebastien.chev@gmail.com> | 2021-03-11 17:47:14 +0100 |
| commit | f08b88cce5794d35fe3dbe9e8d45dfab6c575f72 (patch) | |
| tree | a8e0ed05c86a86be5af4173eb2e4f401d840573c /src | |
| parent | 5a244911cc9e6066962b75fbbf7ba310d79af524 (diff) | |
| download | box64-f08b88cce5794d35fe3dbe9e8d45dfab6c575f72.tar.gz box64-f08b88cce5794d35fe3dbe9e8d45dfab6c575f72.zip | |
Added 67 E0..E3 opcodes
Diffstat (limited to 'src')
| -rwxr-xr-x | src/emu/x64run.c | 9 | ||||
| -rw-r--r-- | src/emu/x64run67.c | 76 | ||||
| -rwxr-xr-x | src/emu/x64run_private.h | 2 |
3 files changed, 85 insertions, 2 deletions
diff --git a/src/emu/x64run.c b/src/emu/x64run.c index 32778044..741846d5 100755 --- a/src/emu/x64run.c +++ b/src/emu/x64run.c @@ -254,7 +254,14 @@ x64emurun: if(emu->quit) goto fini; break; - + case 0x67: /* reduce EASize prefix */ + if(Run67(emu, rex)) { + unimp = 1; + goto fini; + } + if(emu->quit) + goto fini; + break; case 0x68: /* Push Id */ Push(emu, F32S64); break; diff --git a/src/emu/x64run67.c b/src/emu/x64run67.c new file mode 100644 index 00000000..afa1ca05 --- /dev/null +++ b/src/emu/x64run67.c @@ -0,0 +1,76 @@ +#define _GNU_SOURCE +#include <stdint.h> +#include <stdio.h> +#include <stdlib.h> +#include <math.h> +#include <string.h> +#include <signal.h> +#include <sys/types.h> +#include <unistd.h> + +#include "debug.h" +#include "box64stack.h" +#include "x64emu.h" +#include "x64run.h" +#include "x64emu_private.h" +#include "x64run_private.h" +#include "x64primop.h" +#include "x64trace.h" +#include "x87emu_private.h" +#include "box64context.h" +#include "bridge.h" +//#include "signals.h" +#ifdef DYNAREC +#include "../dynarec/arm_lock_helper.h" +#endif + +#include "modrm.h" + +int Run67(x64emu_t *emu, rex_t rex) +{ + uint8_t opcode; + uint8_t nextop; + int8_t tmp8s; + + opcode = F8; + + // REX prefix before the F0 are ignored + rex.rex = 0; + while(opcode>=0x40 && opcode<=0x4f) { + rex.rex = opcode; + opcode = F8; + } + + switch(opcode) { + + case 0xE0: /* LOOPNZ */ + CHECK_FLAGS(emu); + tmp8s = F8S; + --R_ECX; // don't update flags + if(R_ECX && !ACCESS_FLAG(F_ZF)) + R_RIP += tmp8s; + break; + case 0xE1: /* LOOPZ */ + CHECK_FLAGS(emu); + tmp8s = F8S; + --R_ECX; // don't update flags + if(R_ECX && ACCESS_FLAG(F_ZF)) + R_RIP += tmp8s; + break; + case 0xE2: /* LOOP */ + tmp8s = F8S; + --R_ECX; // don't update flags + if(R_ECX) + R_RIP += tmp8s; + break; + case 0xE3: /* JECXZ Ib */ + tmp8s = F8S; + if(!R_ECX) + R_RIP += tmp8s; + break; + + default: + return 1; + } + return 0; +} \ No newline at end of file diff --git a/src/emu/x64run_private.h b/src/emu/x64run_private.h index e33d7386..7eb9a194 100755 --- a/src/emu/x64run_private.h +++ b/src/emu/x64run_private.h @@ -100,7 +100,7 @@ int Run64(x64emu_t *emu, rex_t rex); int Run66(x64emu_t *emu, rex_t rex); int Run660F(x64emu_t *emu, rex_t rex); int Run6664(x64emu_t *emu, rex_t rex); -//int Run67(x64emu_t *emu, rex_t rex); +int Run67(x64emu_t *emu, rex_t rex); int RunD8(x64emu_t *emu, rex_t rex); int RunD9(x64emu_t *emu, rex_t rex); int RunDB(x64emu_t *emu, rex_t rex); |