diff options
| author | ptitSeb <sebastien.chev@gmail.com> | 2021-04-01 17:44:44 +0200 |
|---|---|---|
| committer | ptitSeb <sebastien.chev@gmail.com> | 2021-04-01 17:44:44 +0200 |
| commit | 9f5e12992af8ef876a49b2519601c10c41779438 (patch) | |
| tree | 3e5c509caba18b84ee4ec2f0bf5dfb0a9482f28c | |
| parent | eede8e1e8db76cb3ef9d89766135e1bbdbfe2da6 (diff) | |
| download | box64-9f5e12992af8ef876a49b2519601c10c41779438.tar.gz box64-9f5e12992af8ef876a49b2519601c10c41779438.zip | |
Added F0 FF opcodes
| -rw-r--r-- | src/emu/x64runf0.c | 61 |
1 files changed, 61 insertions, 0 deletions
diff --git a/src/emu/x64runf0.c b/src/emu/x64runf0.c index 04338d61..2dac7129 100644 --- a/src/emu/x64runf0.c +++ b/src/emu/x64runf0.c @@ -435,6 +435,67 @@ int RunF0(x64emu_t *emu, rex_t rex) #endif break; + case 0xFF: /* GRP 5 Ed */ + nextop = F8; + GETED(0); + switch((nextop>>3)&7) { + case 0: /* INC Ed */ +#ifdef DYNAREC + if(rex.w) + do { + tmp64u = arm64_lock_read_dd(ED); + } while(arm64_lock_write_dd(ED, inc64(emu, tmp64u))); + else { + do { + tmp32u = arm64_lock_read_d(ED); + } while(arm64_lock_write_d(ED, inc32(emu, tmp32u))); + if(MODREG) ED->dword[1] = 0; + } +#else + pthread_mutex_lock(&emu->context->mutex_lock); + if(rex.w) { + ED->q[0] = inc64(emu, ED->q[0]); + } else { + if(MODREG) + ED->q[0] = inc32(emu, ED->dword[0]); + else + ED->dword[0] = inc32(emu, ED->dword[0]); + } + pthread_mutex_unlock(&emu->context->mutex_lock); +#endif + break; + case 1: /* DEC Ed */ +#ifdef DYNAREC + if(rex.w) + do { + tmp64u = arm64_lock_read_dd(ED); + } while(arm64_lock_write_dd(ED, dec64(emu, tmp64u))); + else { + do { + tmp32u = arm64_lock_read_d(ED); + } while(arm64_lock_write_d(ED, dec32(emu, tmp32u))); + if(MODREG) ED->dword[1] = 0; + } +#else + pthread_mutex_lock(&emu->context->mutex_lock); + if(rex.w) { + ED->q[0] = dec64(emu, ED->q[0]); + } else { + if(MODREG) + ED->q[0] = dec32(emu, ED->dword[0]); + else + ED->dword[0] = dec32(emu, ED->dword[0]); + } + pthread_mutex_unlock(&emu->context->mutex_lock); +#endif + break; + default: + printf_log(LOG_NONE, "Illegal Opcode 0xF0 0xFF 0x%02X 0x%02X\n", nextop, PK(0)); + emu->quit=1; + emu->error |= ERR_ILLEGAL; + break; + } + break; default: return 1; } |