diff options
| author | ptitSeb <sebastien.chev@gmail.com> | 2021-03-26 15:43:38 +0100 |
|---|---|---|
| committer | ptitSeb <sebastien.chev@gmail.com> | 2021-03-26 15:43:38 +0100 |
| commit | 451cfa521bb8961ad12108bad4395b9548c38ecc (patch) | |
| tree | e4ab0cc2aee65258257d5bb4bf5f7849d13d40a7 /src | |
| parent | 6d02f7f8979e4b5611969f6922016dc44714d748 (diff) | |
| download | box64-451cfa521bb8961ad12108bad4395b9548c38ecc.tar.gz box64-451cfa521bb8961ad12108bad4395b9548c38ecc.zip | |
Added DC opcodes
Diffstat (limited to 'src')
| -rwxr-xr-x | src/emu/x64run.c | 9 | ||||
| -rwxr-xr-x | src/emu/x64run_private.h | 1 | ||||
| -rw-r--r-- | src/emu/x64rundc.c | 146 |
3 files changed, 155 insertions, 1 deletions
diff --git a/src/emu/x64run.c b/src/emu/x64run.c index 629bfe71..b23375fe 100755 --- a/src/emu/x64run.c +++ b/src/emu/x64run.c @@ -1085,7 +1085,14 @@ x64emurun: if(emu->quit) goto fini; break; - + case 0xDC: /* x87 opcodes */ + if(RunDC(emu, rex)) { + unimp = 1; + goto fini; + } + if(emu->quit) + goto fini; + break; case 0xDD: /* x87 opcodes */ if(RunDD(emu, rex)) { unimp = 1; diff --git a/src/emu/x64run_private.h b/src/emu/x64run_private.h index e2608c81..e3b3bbea 100755 --- a/src/emu/x64run_private.h +++ b/src/emu/x64run_private.h @@ -109,6 +109,7 @@ int RunD8(x64emu_t *emu, rex_t rex); int RunD9(x64emu_t *emu, rex_t rex); int RunDA(x64emu_t *emu, rex_t rex); int RunDB(x64emu_t *emu, rex_t rex); +int RunDC(x64emu_t *emu, rex_t rex); int RunDD(x64emu_t *emu, rex_t rex); int RunDF(x64emu_t *emu, rex_t rex); int RunF0(x64emu_t *emu, rex_t rex); diff --git a/src/emu/x64rundc.c b/src/emu/x64rundc.c new file mode 100644 index 00000000..da5b0fd9 --- /dev/null +++ b/src/emu/x64rundc.c @@ -0,0 +1,146 @@ +#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 "modrm.h" + +int RunDC(x64emu_t *emu, rex_t rex) +{ + uint8_t nextop; + reg64_t *oped; + + nextop = F8; + switch(nextop) { + case 0xC0: + case 0xC1: + case 0xC2: + case 0xC3: + case 0xC4: + case 0xC5: + case 0xC6: + case 0xC7: /* FADD */ + ST(nextop&7).d += ST0.d; + break; + case 0xC8: + case 0xC9: + case 0xCA: + case 0xCB: + case 0xCC: + case 0xCD: + case 0xCE: + case 0xCF: /* FMUL */ + ST(nextop&7).d *= ST0.d; + break; + case 0xD0: + case 0xD1: + case 0xD2: + case 0xD3: + case 0xD4: + case 0xD5: + case 0xD6: + case 0xD7: /* FCOM */ + fpu_fcom(emu, ST(nextop&7).d); + break; + case 0xD8: + case 0xD9: + case 0xDA: + case 0xDB: + case 0xDC: + case 0xDD: + case 0xDE: + case 0xDF: /* FCOMP */ + fpu_fcom(emu, ST(nextop&7).d); // TODO: is this ok? + fpu_do_pop(emu); + break; + case 0xE0: + case 0xE1: + case 0xE2: + case 0xE3: + case 0xE4: + case 0xE5: + case 0xE6: + case 0xE7: /* FSUBR */ + ST(nextop&7).d = ST0.d -ST(nextop&7).d; + break; + case 0xE8: + case 0xE9: + case 0xEA: + case 0xEB: + case 0xEC: + case 0xED: + case 0xEE: + case 0xEF: /* FSUB */ + ST(nextop&7).d -= ST0.d; + break; + case 0xF0: + case 0xF1: + case 0xF2: + case 0xF3: + case 0xF4: + case 0xF5: + case 0xF6: + case 0xF7: /* FDIVR */ + ST(nextop&7).d = ST0.d / ST(nextop&7).d; + break; + case 0xF8: + case 0xF9: + case 0xFA: + case 0xFB: + case 0xFC: + case 0xFD: + case 0xFE: + case 0xFF: /* FDIV */ + ST(nextop&7).d /= ST0.d; + break; + default: + GETED(0); + switch((nextop>>3)&7) { + case 0: /* FADD ST0, double */ + ST0.d += *(double*)ED; + break; + case 1: /* FMUL ST0, double */ + ST0.d *= *(double*)ED; + break; + case 2: /* FCOM ST0, double */ + fpu_fcom(emu, *(double*)ED); + break; + case 3: /* FCOMP ST0, double */ + fpu_fcom(emu, *(double*)ED); + fpu_do_pop(emu); + break; + case 4: /* FSUB ST0, double */ + ST0.d -= *(double*)ED; + break; + case 5: /* FSUBR ST0, double */ + ST0.d = *(double*)ED - ST0.d; + break; + case 6: /* FDIV ST0, double */ + ST0.d /= *(double*)ED; + break; + case 7: /* FDIVR ST0, double */ + ST0.d = *(double*)ED / ST0.d; + break; + default: + return 1; + } + } + return 0; +} \ No newline at end of file |