Implement bswap in x86emu.
Yes, this is a 486+ instruction and thus not strictly legal in vm86 mode, but enough BIOSes use it (looking at you VIA) that we might as well implement it.
This commit is contained in:
parent
b55fbca4f0
commit
c8d066a151
|
@ -40,6 +40,12 @@
|
||||||
|
|
||||||
#include "x86emu/x86emui.h"
|
#include "x86emu/x86emui.h"
|
||||||
|
|
||||||
|
#undef bswap_32
|
||||||
|
#define bswap_32(x) (((x & 0xff000000) >> 24) | \
|
||||||
|
((x & 0x00ff0000) >> 8) | \
|
||||||
|
((x & 0x0000ff00) << 8) | \
|
||||||
|
((x & 0x000000ff) << 24))
|
||||||
|
|
||||||
/*----------------------------- Implementation ----------------------------*/
|
/*----------------------------- Implementation ----------------------------*/
|
||||||
|
|
||||||
/****************************************************************************
|
/****************************************************************************
|
||||||
|
@ -2571,6 +2577,47 @@ static void x86emuOp2_movsx_word_R_RM(u8 X86EMU_UNUSED(op2))
|
||||||
END_OF_INSTR();
|
END_OF_INSTR();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Handles opcodes 0xc8-0xcf */
|
||||||
|
static void x86emuOp2_bswap(u8 X86EMU_UNUSED(op2))
|
||||||
|
{
|
||||||
|
START_OF_INSTR();
|
||||||
|
DECODE_PRINTF("BSWAP\n");
|
||||||
|
TRACE_AND_STEP();
|
||||||
|
|
||||||
|
switch (op2) {
|
||||||
|
case 0xc8:
|
||||||
|
M.x86.R_EAX = bswap_32(M.x86.R_EAX);
|
||||||
|
break;
|
||||||
|
case 0xc9:
|
||||||
|
M.x86.R_ECX = bswap_32(M.x86.R_ECX);
|
||||||
|
break;
|
||||||
|
case 0xca:
|
||||||
|
M.x86.R_EDX = bswap_32(M.x86.R_EDX);
|
||||||
|
break;
|
||||||
|
case 0xcb:
|
||||||
|
M.x86.R_EBX = bswap_32(M.x86.R_EBX);
|
||||||
|
break;
|
||||||
|
case 0xcc:
|
||||||
|
M.x86.R_ESP = bswap_32(M.x86.R_ESP);
|
||||||
|
break;
|
||||||
|
case 0xcd:
|
||||||
|
M.x86.R_EBP = bswap_32(M.x86.R_EBP);
|
||||||
|
break;
|
||||||
|
case 0xce:
|
||||||
|
M.x86.R_ESI = bswap_32(M.x86.R_ESI);
|
||||||
|
break;
|
||||||
|
case 0xcf:
|
||||||
|
M.x86.R_EDI = bswap_32(M.x86.R_EDI);
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
/* can't happen */
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
DECODE_CLEAR_SEGOVR();
|
||||||
|
END_OF_INSTR();
|
||||||
|
}
|
||||||
|
|
||||||
/***************************************************************************
|
/***************************************************************************
|
||||||
* Double byte operation code table:
|
* Double byte operation code table:
|
||||||
**************************************************************************/
|
**************************************************************************/
|
||||||
|
@ -2788,14 +2835,14 @@ void (*x86emu_optab2[256])(u8) =
|
||||||
/* 0xc5 */ x86emuOp2_illegal_op,
|
/* 0xc5 */ x86emuOp2_illegal_op,
|
||||||
/* 0xc6 */ x86emuOp2_illegal_op,
|
/* 0xc6 */ x86emuOp2_illegal_op,
|
||||||
/* 0xc7 */ x86emuOp2_illegal_op,
|
/* 0xc7 */ x86emuOp2_illegal_op,
|
||||||
/* 0xc8 */ x86emuOp2_illegal_op, /* TODO: bswap */
|
/* 0xc8 */ x86emuOp2_bswap,
|
||||||
/* 0xc9 */ x86emuOp2_illegal_op, /* TODO: bswap */
|
/* 0xc9 */ x86emuOp2_bswap,
|
||||||
/* 0xca */ x86emuOp2_illegal_op, /* TODO: bswap */
|
/* 0xca */ x86emuOp2_bswap,
|
||||||
/* 0xcb */ x86emuOp2_illegal_op, /* TODO: bswap */
|
/* 0xcb */ x86emuOp2_bswap,
|
||||||
/* 0xcc */ x86emuOp2_illegal_op, /* TODO: bswap */
|
/* 0xcc */ x86emuOp2_bswap,
|
||||||
/* 0xcd */ x86emuOp2_illegal_op, /* TODO: bswap */
|
/* 0xcd */ x86emuOp2_bswap,
|
||||||
/* 0xce */ x86emuOp2_illegal_op, /* TODO: bswap */
|
/* 0xce */ x86emuOp2_bswap,
|
||||||
/* 0xcf */ x86emuOp2_illegal_op, /* TODO: bswap */
|
/* 0xcf */ x86emuOp2_bswap,
|
||||||
|
|
||||||
/* 0xd0 */ x86emuOp2_illegal_op,
|
/* 0xd0 */ x86emuOp2_illegal_op,
|
||||||
/* 0xd1 */ x86emuOp2_illegal_op,
|
/* 0xd1 */ x86emuOp2_illegal_op,
|
||||||
|
|
Loading…
Reference in New Issue