diff options
| author | ptitSeb <sebastien.chev@gmail.com> | 2023-06-26 17:45:56 +0200 |
|---|---|---|
| committer | ptitSeb <sebastien.chev@gmail.com> | 2023-06-26 17:45:56 +0200 |
| commit | ad5328e6c76dde1d4ea8ff0c00a4776d364cdec2 (patch) | |
| tree | 3ac13bce57abe24e3aa7a4a6c9bbcaa08ce5bd63 /src | |
| parent | 7e514ce4bd3a255ef7555f4867659e9c41d0719b (diff) | |
| download | box64-ad5328e6c76dde1d4ea8ff0c00a4776d364cdec2.tar.gz box64-ad5328e6c76dde1d4ea8ff0c00a4776d364cdec2.zip | |
[32BITS] Added 66 60/61 opcodes (for #865)
Diffstat (limited to 'src')
| -rw-r--r-- | src/emu/x64run66.c | 74 |
1 files changed, 52 insertions, 22 deletions
diff --git a/src/emu/x64run66.c b/src/emu/x64run66.c index a782a56f..a5144852 100644 --- a/src/emu/x64run66.c +++ b/src/emu/x64run66.c @@ -144,28 +144,58 @@ uintptr_t Run66(x64emu_t *emu, rex_t rex, int rep, uintptr_t addr) cmp16(emu, R_AX, F16); break; - case 0x40: - case 0x41: - case 0x42: - case 0x43: - case 0x44: - case 0x45: - case 0x46: - case 0x47: /* INC Reg (32bits only) */ - tmp8u = opcode&7; - emu->regs[tmp8u].word[0] = inc16(emu, emu->regs[tmp8u].word[0]); - break; - case 0x48: - case 0x49: - case 0x4A: - case 0x4B: - case 0x4C: - case 0x4D: - case 0x4E: - case 0x4F: /* DEC Reg (32bits only) */ - tmp8u = opcode&7; - emu->regs[tmp8u].word[0] = dec16(emu, emu->regs[tmp8u].word[0]); - break; + case 0x40: + case 0x41: + case 0x42: + case 0x43: + case 0x44: + case 0x45: + case 0x46: + case 0x47: /* INC Reg (32bits only) */ + tmp8u = opcode&7; + emu->regs[tmp8u].word[0] = inc16(emu, emu->regs[tmp8u].word[0]); + break; + case 0x48: + case 0x49: + case 0x4A: + case 0x4B: + case 0x4C: + case 0x4D: + case 0x4E: + case 0x4F: /* DEC Reg (32bits only) */ + tmp8u = opcode&7; + emu->regs[tmp8u].word[0] = dec16(emu, emu->regs[tmp8u].word[0]); + break; + + case 0x60: /* PUSHA */ + if(rex.is32bits) { + tmp16u = R_SP; + Push16(emu, R_AX); + Push16(emu, R_CX); + Push16(emu, R_DX); + Push16(emu, R_BX); + Push16(emu, tmp16u); + Push16(emu, R_BP); + Push16(emu, R_SI); + Push16(emu, R_DI); + } else { + return 0; + } + break; + case 0x61: /* POPA */ + if(rex.is32bits) { + R_DI = Pop16(emu); + R_SI = Pop16(emu); + R_BP = Pop16(emu); + R_ESP+=2; // POP ESP + R_BX = Pop16(emu); + R_DX = Pop16(emu); + R_CX = Pop16(emu); + R_AX = Pop16(emu); + } else { + return 0; + } + break; case 0x64: /* FS: */ #ifdef TEST_INTERPRETER |